initial commit

This commit is contained in:
Tzu-Mao Li
2020-09-03 22:30:30 -04:00
commit 413a3e5cee
148 changed files with 138536 additions and 0 deletions

10
.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
build
apps/results
apps/files
apps/__pycache__
compile_commands.json
.vimrc
diffvg.egg-info
dist
__pycache__
.DS_Store

6
.gitmodules vendored Normal file
View File

@@ -0,0 +1,6 @@
[submodule "pybind11"]
path = pybind11
url = https://github.com/pybind/pybind11
[submodule "thrust"]
path = thrust
url = https://github.com/thrust/thrust.git

140
CMakeLists.txt Normal file
View File

@@ -0,0 +1,140 @@
cmake_minimum_required(VERSION 3.12)
project(diffvg VERSION 0.0.1 DESCRIPTION "Differentiable Vector Graphics")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(WIN32)
find_package(Python 3.6 COMPONENTS Development REQUIRED)
else()
find_package(Python 3.7 COMPONENTS Development REQUIRED)
endif()
add_subdirectory(pybind11)
option(DIFFVG_CUDA "Build diffvg with GPU code path?" ON)
if(DIFFVG_CUDA)
message(STATUS "Build with CUDA support")
find_package(CUDA 10 REQUIRED)
set(CMAKE_CUDA_STANDARD 11)
if(NOT WIN32)
# Hack: for some reason the line above doesn't work on some Linux systems.
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11")
#set(CUDA_NVCC_FLAGS_DEBUG "-g -G")
endif()
else()
message(STATUS "Build without CUDA support")
find_package(Thrust REQUIRED)
endif()
# include_directories(${CMAKE_SOURCE_DIR}/pybind11/include)
include_directories(${PYTHON_INCLUDE_PATH})
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(pybind11/include)
if(DIFFVG_CUDA)
link_directories(${CUDA_LIBRARIES})
else()
include_directories(${THRUST_INCLUDE_DIR})
endif()
if(NOT MSVC)
# These compile definitions are not meaningful for MSVC
add_compile_options(-Wall -g -O3 -fvisibility=hidden -Wno-unknown-pragmas)
else()
add_compile_options(/Wall /Zi)
add_link_options(/DEBUG)
endif()
if(NOT DIFFVG_CUDA)
add_compile_options("-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CPP")
endif()
set(SRCS atomic.h
color.h
cdf.h
cuda_utils.h
diffvg.h
edge_query.h
filter.h
matrix.h
parallel.h
pcg.h
ptr.h
sample_boundary.h
scene.h
shape.h
solve.h
vector.h
within_distance.h
winding_number.h
atomic.cpp
color.cpp
diffvg.cpp
parallel.cpp
scene.cpp
shape.cpp)
if(DIFFVG_CUDA)
add_compile_definitions(COMPILE_WITH_CUDA)
set_source_files_properties(
diffvg.cpp
scene.cpp
PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ)
cuda_add_library(diffvg MODULE ${SRCS})
else()
add_library(diffvg MODULE ${SRCS})
endif()
if(APPLE)
# The "-undefined dynamic_lookup" is a hack for systems with
# multiple Python installed. If we link a particular Python version
# here, and we import it with a different Python version later.
# likely a segmentation fault.
# The solution for Linux Mac OS machines, as mentioned in
# https://github.com/pybind/pybind11/blob/master/tools/pybind11Tools.cmake
# is to not link against Python library at all and resolve the symbols
# at compile time.
set(DYNAMIC_LOOKUP "-undefined dynamic_lookup")
endif()
target_link_libraries(diffvg ${DYNAMIC_LOOKUP})
if(WIN32)
# See: https://pybind11.readthedocs.io/en/master/compiling.html#advanced-interface-library-target
target_link_libraries(diffvg pybind11::module)
set_target_properties(diffvg PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
SUFFIX "${PYTHON_MODULE_EXTENSION}")
endif()
set_target_properties(diffvg PROPERTIES SKIP_BUILD_RPATH FALSE)
set_target_properties(diffvg PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE)
if(UNIX AND NOT APPLE)
set_target_properties(diffvg PROPERTIES INSTALL_RPATH "$ORIGIN")
elseif(APPLE)
set_target_properties(diffvg PROPERTIES INSTALL_RPATH "@loader_path")
endif()
set_property(TARGET diffvg PROPERTY CXX_STANDARD 11)
set_target_properties(diffvg PROPERTIES PREFIX "")
# Still enable assertion in release mode
string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string( REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string( REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string( REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string( REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string( REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string( REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
if(NOT WIN32)
find_package(TensorFlow)
if(TensorFlow_FOUND)
add_subdirectory(pydiffvg_tensorflow/custom_ops)
else()
message(INFO " Building without TensorFlow support (not found)")
endif()
endif()

115
README.md Normal file
View File

@@ -0,0 +1,115 @@
# diffvg
Differentiable Rasterizer for Vector Graphics
https://people.csail.mit.edu/tzumao/diffvg
diffvg is a differentiable rasterizer for 2D vector graphics. See the webpage for more info.
![teaser](https://user-images.githubusercontent.com/951021/92184822-2a0bc500-ee20-11ea-81a6-f26af2d120f4.jpg)
![circle](https://user-images.githubusercontent.com/951021/63556018-0b2ddf80-c4f8-11e9-849c-b4ecfcb9a865.gif)
![ellipse](https://user-images.githubusercontent.com/951021/63556021-0ec16680-c4f8-11e9-8fc6-8b34de45b8be.gif)
![rect](https://user-images.githubusercontent.com/951021/63556028-12ed8400-c4f8-11e9-8072-81702c9193e1.gif)
![polygon](https://user-images.githubusercontent.com/951021/63980999-1e99f700-ca72-11e9-9786-1cba14d2d862.gif)
![curve](https://user-images.githubusercontent.com/951021/64042667-3d9e9480-cb17-11e9-88d8-2f7b9da8b8ab.gif)
![path](https://user-images.githubusercontent.com/951021/64070625-7a52b480-cc19-11e9-9380-eac02f56f693.gif)
![gradient](https://user-images.githubusercontent.com/951021/64898668-da475300-d63c-11e9-917a-825b94be0710.gif)
![circle_outline](https://user-images.githubusercontent.com/951021/65125594-84f7a280-d9aa-11e9-8bc4-669fd2eff2f4.gif)
![ellipse_transform](https://user-images.githubusercontent.com/951021/67149013-06b54700-f25b-11e9-91eb-a61171c6d4a4.gif)
# Install
```
git submodule update --init --recursive
conda install pytorch torchvision -c pytorch
conda install numpy
conda install scikit-image
pip install svgwrite
pip install svgpathtools
pip install cssutils
pip install numba
pip install torch-tools
pip install visdom
python setup.py install
```
# Building in debug mode
```
python setup.py build --debug install
```
# Run
```
cd apps
```
Optimizing a single circle to a target.
```
python single_circle.py
```
Finite difference comparison.
```
finite_difference_comp.py [-h] [--size_scale SIZE_SCALE]
[--clamping_factor CLAMPING_FACTOR]
[--use_prefiltering USE_PREFILTERING]
svg_file
```
e.g.,
```
python finite_difference_comp.py imgs/tiger.svg
```
Interactive editor
```
python svg_brush.py
```
Painterly rendering
```
painterly_rendering.py [-h] [--num_paths NUM_PATHS]
[--max_width MAX_WIDTH] [--use_lpips_loss]
[--num_iter NUM_ITER] [--use_blob]
target
```
e.g.,
```
python painterly_rendering.py imgs/fallingwater.jpg --num_paths 2048 --max_width 4.0 --use_lpips_loss
```
Image vectorization
```
python refine_svg.py [-h] [--use_lpips_loss] [--num_iter NUM_ITER] svg target
```
e.g.,
```
python refine_svg.py imgs/flower.svg imgs/flower.jpg
```
Seam carving
```
python seam_carving.py [-h] [--svg SVG] [--optim_steps OPTIM_STEPS]
```
e.g.,
```
python seam_carving.py imgs/hokusai.svg
```
Vector variational autoencoder & vector GAN:
For the GAN models, see `apps/generative_models/train_gan.py`. Generate samples from a pretrained using `apps/generative_models/eval_gan.py`.
For the VAE models, see `apps/generative_models/mnist_vae.py`.
If you use diffvg in your academic work, please cite
```
@article{Li:2020:DVG,
title = {Differentiable Vector Graphics Rasterization for Editing and Learning},
author = {Li, Tzu-Mao and Luk\'{a}\v{c}, Michal and Gharbi Micha\"{e}l and Jonathan Ragan-Kelley},
journal = {ACM Trans. Graph. (Proc. SIGGRAPH Asia)},
volume = {39},
number = {6},
pages = {193:1--193:15},
year = {2020}
}
```

67
aabb.h Normal file
View File

@@ -0,0 +1,67 @@
#pragma once
#include "diffvg.h"
#include "cuda_utils.h"
#include "vector.h"
#include "matrix.h"
struct AABB {
DEVICE
inline AABB(const Vector2f &p_min = Vector2f{infinity<float>(), infinity<float>()},
const Vector2f &p_max = Vector2f{-infinity<float>(), -infinity<float>()})
: p_min(p_min), p_max(p_max) {}
Vector2f p_min, p_max;
};
DEVICE
inline
AABB merge(const AABB &box, const Vector2f &p) {
return AABB{Vector2f{min(p.x, box.p_min.x), min(p.y, box.p_min.y)},
Vector2f{max(p.x, box.p_max.x), max(p.y, box.p_max.y)}};
}
DEVICE
inline
AABB merge(const AABB &box0, const AABB &box1) {
return AABB{Vector2f{min(box0.p_min.x, box1.p_min.x), min(box0.p_min.y, box1.p_min.y)},
Vector2f{max(box0.p_max.x, box1.p_max.x), max(box0.p_max.y, box1.p_max.y)}};
}
DEVICE
inline
bool inside(const AABB &box, const Vector2f &p) {
return p.x >= box.p_min.x && p.x <= box.p_max.x &&
p.y >= box.p_min.y && p.y <= box.p_max.y;
}
DEVICE
inline
bool inside(const AABB &box, const Vector2f &p, float radius) {
return p.x >= box.p_min.x - radius && p.x <= box.p_max.x + radius &&
p.y >= box.p_min.y - radius && p.y <= box.p_max.y + radius;
}
DEVICE
inline
AABB enlarge(const AABB &box, float width) {
return AABB{Vector2f{box.p_min.x - width, box.p_min.y - width},
Vector2f{box.p_max.x + width, box.p_max.y + width}};
}
DEVICE
inline
AABB transform(const Matrix3x3f &xform, const AABB &box) {
auto ret = AABB();
ret = merge(ret, xform_pt(xform, Vector2f{box.p_min.x, box.p_min.y}));
ret = merge(ret, xform_pt(xform, Vector2f{box.p_min.x, box.p_max.y}));
ret = merge(ret, xform_pt(xform, Vector2f{box.p_max.x, box.p_min.y}));
ret = merge(ret, xform_pt(xform, Vector2f{box.p_max.x, box.p_max.y}));
return ret;
}
DEVICE
inline
bool within_distance(const AABB &box, const Vector2f &pt, float r) {
return pt.x >= box.p_min.x - r && pt.x <= box.p_max.x + r &&
pt.y >= box.p_min.y - r && pt.y <= box.p_max.y + r;
}

3
apps/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
mnist
data/sketchrnn_cat.npz
data

10
apps/Makefile Normal file
View File

@@ -0,0 +1,10 @@
SEAM_IMAGES=seaside2 sunset2 hokusai cat ice_cream
SEAM_OUT=results/seam_carving
SEAM_RESULTS=$(addsuffix /out.mp4,$(addprefix $(SEAM_OUT)/,$(SEAM_IMAGES)))
all: $(SEAM_RESULTS)
echo $(SEAM_RESULTS)
$(SEAM_OUT)/%/out.mp4: imgs/seamcarving/%.svg
python seam_carving.py --svg $^

85
apps/curve_subdivision.py Normal file
View File

@@ -0,0 +1,85 @@
import svgpathtools
import numpy as np
import math
def split_cubic(c, t):
c0, c1 = svgpathtools.split_bezier(c, t)
return svgpathtools.CubicBezier(c0[0], c0[1], c0[2], c0[3]), svgpathtools.CubicBezier(c1[0], c1[1], c1[2], c1[3])
def cubic_to_quadratic(curve):
# Best L2 approximation
m = (-curve.start + 3 * curve.control1 + 3 * curve.control2 - curve.end) / 4.0
return svgpathtools.QuadraticBezier(curve.start, m, curve.end)
def convert_and_write_svg(cubic, filename):
cubic_path = svgpathtools.Path(cubic)
cubic_ctrl = svgpathtools.Path(svgpathtools.Line(cubic.start, cubic.control1),
svgpathtools.Line(cubic.control1, cubic.control2),
svgpathtools.Line(cubic.control2, cubic.end))
cubic_color = (50, 50, 200)
cubic_ctrl_color = (150, 150, 150)
r = 4.0
paths = [cubic_path, cubic_ctrl]
colors = [cubic_color, cubic_ctrl_color]
dots = [cubic_path[0].start, cubic_path[0].control1, cubic_path[0].control2, cubic_path[0].end]
ncols = ['green', 'green', 'green', 'green']
nradii = [r, r, r, r]
stroke_widths = [3.0, 1.5]
def add_quadratic(q):
paths.append(q)
q_ctrl = svgpathtools.Path(svgpathtools.Line(q.start, q.control),
svgpathtools.Line(q.control, q.end))
paths.append(q_ctrl)
colors.append((200, 50, 50)) # q_color
colors.append((150, 150, 150)) # q_ctrl_color
dots.append(q.start)
dots.append(q.control)
dots.append(q.end)
ncols.append('purple')
ncols.append('purple')
ncols.append('purple')
nradii.append(r)
nradii.append(r)
nradii.append(r)
stroke_widths.append(3.0)
stroke_widths.append(1.5)
prec = 1.0
queue = [cubic]
num_quadratics = 0
while len(queue) > 0:
c = queue[-1]
queue = queue[:-1]
# Criteria for conversion
# http://caffeineowl.com/graphics/2d/vectorial/cubic2quad01.html
p = c.end - 3 * c.control2 + 3 * c.control1 - c.start
d = math.sqrt(p.real * p.real + p.imag * p.imag) * math.sqrt(3.0) / 36
t = math.pow(1.0 / d, 1.0 / 3.0)
if t < 1.0:
c0, c1 = split_cubic(c, 0.5)
queue.append(c0)
queue.append(c1)
else:
quadratic = cubic_to_quadratic(c)
print(quadratic)
add_quadratic(quadratic)
num_quadratics += 1
print('num_quadratics:', num_quadratics)
svgpathtools.wsvg(paths,
colors = colors,
stroke_widths = stroke_widths,
nodes = dots,
node_colors = ncols,
node_radii = nradii,
filename = filename)
convert_and_write_svg(svgpathtools.CubicBezier(100+200j, 426+50j, 50+50j, 300+200j),
'results/curve_subdivision/subdiv_curve0.svg')
convert_and_write_svg(svgpathtools.CubicBezier(100+200j, 427+50j, 50+50j, 300+200j),
'results/curve_subdivision/subdiv_curve1.svg')

View File

@@ -0,0 +1,197 @@
# python finite_difference_comp.py imgs/tiger.svg
# python finite_difference_comp.py --use_prefiltering True imgs/tiger.svg
# python finite_difference_comp.py imgs/boston.svg
# python finite_difference_comp.py --use_prefiltering True imgs/boston.svg
# python finite_difference_comp.py imgs/contour.svg
# python finite_difference_comp.py --use_prefiltering True imgs/contour.svg
# python finite_difference_comp.py --size_scale 0.5 --clamping_factor 0.05 imgs/hawaii.svg
# python finite_difference_comp.py --size_scale 0.5 --clamping_factor 0.05 --use_prefiltering True imgs/hawaii.svg
# python finite_difference_comp.py imgs/mcseem2.svg
# python finite_difference_comp.py --use_prefiltering True imgs/mcseem2.svg
# python finite_difference_comp.py imgs/reschart.svg
# python finite_difference_comp.py --use_prefiltering True imgs/reschart.svg
import pydiffvg
import diffvg
from matplotlib import cm
import matplotlib.pyplot as plt
import argparse
import torch
pydiffvg.set_print_timing(True)
#pydiffvg.set_use_gpu(False)
def normalize(x, min_, max_):
range = max(abs(min_), abs(max_))
return (x + range) / (2 * range)
def main(args):
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(args.svg_file)
w = int(canvas_width * args.size_scale)
h = int(canvas_height * args.size_scale)
print(w, h)
curve_counts = 0
for s in shapes:
if isinstance(s, pydiffvg.Circle):
curve_counts += 1
elif isinstance(s, pydiffvg.Ellipse):
curve_counts += 1
elif isinstance(s, pydiffvg.Path):
curve_counts += len(s.num_control_points)
elif isinstance(s, pydiffvg.Polygon):
curve_counts += len(s.points) - 1
if s.is_closed:
curve_counts += 1
elif isinstance(s, pydiffvg.Rect):
curve_counts += 1
print('curve_counts:', curve_counts)
pfilter = pydiffvg.PixelFilter(type = diffvg.FilterType.box,
radius = torch.tensor(0.5))
use_prefiltering = args.use_prefiltering
print('use_prefiltering:', use_prefiltering)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
num_samples_x = args.num_spp
num_samples_y = args.num_spp
if (use_prefiltering):
num_samples_x = 1
num_samples_y = 1
render = pydiffvg.RenderFunction.apply
img = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/finite_difference_comp/img.png', gamma=1.0)
epsilon = 0.1
def perturb_scene(axis, epsilon):
for s in shapes:
if isinstance(s, pydiffvg.Circle):
s.center[axis] += epsilon
elif isinstance(s, pydiffvg.Ellipse):
s.center[axis] += epsilon
elif isinstance(s, pydiffvg.Path):
s.points[:, axis] += epsilon
elif isinstance(s, pydiffvg.Polygon):
s.points[:, axis] += epsilon
elif isinstance(s, pydiffvg.Rect):
s.p_min[axis] += epsilon
s.p_max[axis] += epsilon
for s in shape_groups:
if isinstance(s.fill_color, pydiffvg.LinearGradient):
s.fill_color.begin[axis] += epsilon
s.fill_color.end[axis] += epsilon
perturb_scene(0, epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
render = pydiffvg.RenderFunction.apply
img0 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
perturb_scene(0, -2 * epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
img1 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
x_diff = (img0 - img1) / (2 * epsilon)
x_diff = x_diff.sum(axis = 2)
x_diff_max = x_diff.max() * args.clamping_factor
x_diff_min = x_diff.min() * args.clamping_factor
print(x_diff.max())
print(x_diff.min())
x_diff = cm.viridis(normalize(x_diff, x_diff_min, x_diff_max).cpu().numpy())
pydiffvg.imwrite(x_diff, 'results/finite_difference_comp/finite_x_diff.png', gamma=1.0)
perturb_scene(0, epsilon)
perturb_scene(1, epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
render = pydiffvg.RenderFunction.apply
img0 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
perturb_scene(1, -2 * epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
img1 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
y_diff = (img0 - img1) / (2 * epsilon)
y_diff = y_diff.sum(axis = 2)
y_diff_max = y_diff.max() * args.clamping_factor
y_diff_min = y_diff.min() * args.clamping_factor
y_diff = cm.viridis(normalize(y_diff, y_diff_min, y_diff_max).cpu().numpy())
pydiffvg.imwrite(y_diff, 'results/finite_difference_comp/finite_y_diff.png', gamma=1.0)
perturb_scene(1, epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
render_grad = pydiffvg.RenderFunction.render_grad
img_grad = render_grad(torch.ones(h, w, 4, device = pydiffvg.get_device()),
w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None, # background_image
*scene_args)
print(img_grad[:, :, 0].max())
print(img_grad[:, :, 0].min())
x_diff = cm.viridis(normalize(img_grad[:, :, 0], x_diff_min, x_diff_max).cpu().numpy())
y_diff = cm.viridis(normalize(img_grad[:, :, 1], y_diff_min, y_diff_max).cpu().numpy())
pydiffvg.imwrite(x_diff, 'results/finite_difference_comp/ours_x_diff.png', gamma=1.0)
pydiffvg.imwrite(y_diff, 'results/finite_difference_comp/ours_y_diff.png', gamma=1.0)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("svg_file", help="source SVG path")
parser.add_argument("--size_scale", type=float, default=1.0)
parser.add_argument("--clamping_factor", type=float, default=0.1)
parser.add_argument("--num_spp", type=int, default=4)
parser.add_argument("--use_prefiltering", type=bool, default=False)
args = parser.parse_args()
main(args)

93
apps/gaussian_blur.py Normal file
View File

@@ -0,0 +1,93 @@
"""
"""
import os
import pydiffvg
import torch as th
import scipy.ndimage.filters as F
def render(canvas_width, canvas_height, shapes, shape_groups):
_render = pydiffvg.RenderFunction.apply
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = _render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
return img
def main():
pydiffvg.set_device(th.device('cuda:1'))
# Load SVG
svg = os.path.join("imgs", "peppers.svg")
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(svg)
# Save initial state
ref = render(canvas_width, canvas_height, shapes, shape_groups)
pydiffvg.imwrite(ref.cpu(), 'results/gaussian_blur/init.png', gamma=2.2)
target = F.gaussian_filter(ref.cpu().numpy(), [10, 10, 0])
target = th.from_numpy(target).to(ref.device)
pydiffvg.imwrite(target.cpu(), 'results/gaussian_blur/target.png', gamma=2.2)
# Collect variables to optimize
points_vars = []
width_vars = []
for path in shapes:
path.points.requires_grad = True
points_vars.append(path.points)
path.stroke_width.requires_grad = True
width_vars.append(path.stroke_width)
color_vars = []
for group in shape_groups:
# do not optimize alpha
group.fill_color[..., :3].requires_grad = True
color_vars.append(group.fill_color)
# Optimize
points_optim = th.optim.Adam(points_vars, lr=1.0)
width_optim = th.optim.Adam(width_vars, lr=1.0)
color_optim = th.optim.Adam(color_vars, lr=0.01)
for t in range(20):
print('\niteration:', t)
points_optim.zero_grad()
width_optim.zero_grad()
color_optim.zero_grad()
# Forward pass: render the image.
img = render(canvas_width, canvas_height, shapes, shape_groups)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/gaussian_blur/iter_{}.png'.format(t), gamma=2.2)
loss = (img - target)[..., :3].pow(2).mean()
print('alpha:', img[..., 3].mean().item())
print('render loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Take a gradient descent step.
points_optim.step()
width_optim.step()
color_optim.step()
for group in shape_groups:
group.fill_color.data.clamp_(0.0, 1.0)
# Final render
img = render(canvas_width, canvas_height, shapes, shape_groups)
pydiffvg.imwrite(img.cpu(), 'results/gaussian_blur/final.png', gamma=2.2)
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/gaussian_blur/iter_%d.png", "-vb", "20M",
"results/gaussian_blur/out.mp4"])
if __name__ == "__main__":
main()

1
apps/generative_models/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.gdb_history

View File

@@ -0,0 +1,5 @@
# Usage
For the GAN models, see `train_gan.py`. Generate samples from a pretrained using `eval_gan.py`
For the VAE models, see `mnist_vae.py`.

View File

View File

@@ -0,0 +1,229 @@
import os
import time
import torch as th
import numpy as np
import torchvision.datasets as dset
import torchvision.transforms as transforms
import imageio
import ttools
import rendering
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
DATA = os.path.join(BASE_DIR, "data")
LOG = ttools.get_logger(__name__)
class QuickDrawImageDataset(th.utils.data.Dataset):
BASE_DATA_URL = \
"https://console.cloud.google.com/storage/browser/_details/quickdraw_dataset/full/numpy_bitmap/cat.npy"
"""
Args:
spatial_limit(int): maximum spatial extent in pixels.
"""
def __init__(self, imsize, train=True):
super(QuickDrawImageDataset, self).__init__()
file = os.path.join(DATA, "cat.npy")
self.imsize = imsize
if not os.path.exists(file):
msg = "Dataset file %s does not exist, please download"
" it from %s" % (file, QuickDrawImageDataset.BASE_DATA_URL)
LOG.error(msg)
raise RuntimeError(msg)
self.data = np.load(file, allow_pickle=True, encoding="latin1")
def __len__(self):
return self.data.shape[0]
def __getitem__(self, idx):
im = np.reshape(self.data[idx], (1, 1, 28, 28))
im = th.from_numpy(im).float() / 255.0
im = th.nn.functional.interpolate(im, size=(self.imsize, self.imsize))
# Bring it to [-1, 1]
im = th.clamp(im, 0, 1)
im -= 0.5
im /= 0.5
return im.squeeze(0)
class QuickDrawDataset(th.utils.data.Dataset):
BASE_DATA_URL = \
"https://storage.cloud.google.com/quickdraw_dataset/sketchrnn"
"""
Args:
spatial_limit(int): maximum spatial extent in pixels.
"""
def __init__(self, dataset, mode="train",
max_seq_length=250,
spatial_limit=1000):
super(QuickDrawDataset, self).__init__()
file = os.path.join(DATA, "sketchrnn_"+dataset)
remote = os.path.join(QuickDrawDataset.BASE_DATA_URL, dataset)
self.max_seq_length = max_seq_length
self.spatial_limit = spatial_limit
if mode not in ["train", "test", "valid"]:
return ValueError("Only allowed data mode are 'train' and 'test',"
" 'valid'.")
if not os.path.exists(file):
msg = "Dataset file %s does not exist, please download"
" it from %s" % (file, remote)
LOG.error(msg)
raise RuntimeError(msg)
data = np.load(file, allow_pickle=True, encoding="latin1")[mode]
data = self.purify(data)
data = self.normalize(data)
# Length of longest sequence in the dataset
self.nmax = max([len(seq) for seq in data])
self.sketches = data
def __repr__(self):
return "Dataset with %d sequences of max length %d" % \
(len(self.sketches), self.nmax)
def __len__(self):
return len(self.sketches)
def __getitem__(self, idx):
"""Return the idx-th stroke in 5-D format, padded to length (Nmax+2).
The first and last element of the sequence are fixed to "start-" and
"end-of-sequence" token.
dx, dy, + 3 numbers for one-hot encoding of state:
1 0 0: pen touching paper till next point
0 1 0: pen lifted from paper after current point
0 0 1: drawing has ended, next points (including current will not be
drawn)
"""
sample_data = self.sketches[idx]
# Allow two extra slots for start/end of sequence tokens
sample = np.zeros((self.nmax+2, 5), dtype=np.float32)
n = sample_data.shape[0]
# normalize dx, dy
deltas = sample_data[:, :2]
# Absolute coordinates
positions = deltas[..., :2].cumsum(0)
maxi = np.abs(positions).max() + 1e-8
deltas = deltas / (1.1 * maxi) # leave some margin on edges
# fill in dx, dy coordinates
sample[1:n+1, :2] = deltas
# on paper indicator: 0 means touching paper in the 3d format, flip it
sample[1:n+1, 2] = 1 - sample_data[:, 2]
# off-paper indicator, complement of previous flag
sample[1:n+1, 3] = 1 - sample[1:n+1, 2]
# fill with end of sequence tokens for the remainder
sample[n+1:, 4] = 1
# Start of sequence token
sample[0] = [0, 0, 1, 0, 0]
return sample
def purify(self, strokes):
"""removes to small or too long sequences + removes large gaps"""
data = []
for seq in strokes:
if seq.shape[0] <= self.max_seq_length:
# and seq.shape[0] > 10:
# Limit large spatial gaps
seq = np.minimum(seq, self.spatial_limit)
seq = np.maximum(seq, -self.spatial_limit)
seq = np.array(seq, dtype=np.float32)
data.append(seq)
return data
def calculate_normalizing_scale_factor(self, strokes):
"""Calculate the normalizing factor explained in appendix of
sketch-rnn."""
data = []
for i, stroke_i in enumerate(strokes):
for j, pt in enumerate(strokes[i]):
data.append(pt[0])
data.append(pt[1])
data = np.array(data)
return np.std(data)
def normalize(self, strokes):
"""Normalize entire dataset (delta_x, delta_y) by the scaling
factor."""
data = []
scale_factor = self.calculate_normalizing_scale_factor(strokes)
for seq in strokes:
seq[:, 0:2] /= scale_factor
data.append(seq)
return data
class FixedLengthQuickDrawDataset(QuickDrawDataset):
"""A variant of the QuickDraw dataset where the strokes are represented as
a fixed-length sequence of triplets (dx, dy, opacity), where opacity = 0, 1.
"""
def __init__(self, *args, canvas_size=64, **kwargs):
super(FixedLengthQuickDrawDataset, self).__init__(*args, **kwargs)
self.canvas_size = canvas_size
def __getitem__(self, idx):
sample = super(FixedLengthQuickDrawDataset, self).__getitem__(idx)
# We construct a stroke opacity variable from the pen down state, dx, dy remain unchanged
strokes = sample[:, :3]
im = np.zeros((1, 1))
# render image
# start = time.time()
im = rendering.opacityStroke2diffvg(
th.from_numpy(strokes).unsqueeze(0), canvas_size=self.canvas_size,
relative=True, debug=False)
im = im.squeeze(0).numpy()
# elapsed = (time.time() - start)*1000
# print("item %d pipeline gt rendering took %.2fms" % (idx, elapsed))
return strokes, im
class MNISTDataset(th.utils.data.Dataset):
def __init__(self, imsize, train=True):
super(MNISTDataset, self).__init__()
self.mnist = dset.MNIST(root=os.path.join(DATA, "mnist"),
train=train,
download=True,
transform=transforms.Compose([
transforms.Resize((imsize, imsize)),
transforms.ToTensor(),
]))
def __len__(self):
return len(self.mnist)
def __getitem__(self, idx):
im, label = self.mnist[idx]
# make sure data uses [0, 1] range
im -= im.min()
im /= im.max() + 1e-8
# Bring it to [-1, 1]
im -= 0.5
im /= 0.5
return im

View File

@@ -0,0 +1,182 @@
"""Evaluate a pretrained GAN model.
Usage:
`python eval_gan.py <path/to/model/folder>`, e.g.
`../results/quickdraw_gan_vector_bezier_fc_wgan`.
"""
import os
import argparse
import torch as th
import numpy as np
import ttools
import imageio
from subprocess import call
import pydiffvg
import models
LOG = ttools.get_logger(__name__)
def postprocess(im, invert=False):
im = th.clamp((im + 1.0) / 2.0, 0, 1)
if invert:
im = (1.0 - im)
im = ttools.tensor2image(im)
return im
def imsave(im, path):
os.makedirs(os.path.dirname(path), exist_ok=True)
imageio.imwrite(path, im)
def save_scene(scn, path):
os.makedirs(os.path.dirname(path), exist_ok=True)
pydiffvg.save_svg(path, *scn, use_gamma=False)
def run(args):
th.manual_seed(0)
np.random.seed(0)
meta = ttools.Checkpointer.load_meta(args.model, "vect_g_")
if meta is None:
LOG.warning("Could not load metadata at %s, aborting.", args.model)
return
LOG.info("Loaded model %s with metadata:\n %s", args.model, meta)
if args.output_dir is None:
outdir = os.path.join(args.model, "eval")
else:
outdir = args.output_dir
os.makedirs(outdir, exist_ok=True)
model_params = meta["model_params"]
if args.imsize is not None:
LOG.info("Overriding output image size to: %dx%d", args.imsize,
args.imsize)
old_size = model_params["imsize"]
scale = args.imsize * 1.0 / old_size
model_params["imsize"] = args.imsize
model_params["stroke_width"] = [w*scale for w in
model_params["stroke_width"]]
LOG.info("Overriding width to: %s", model_params["stroke_width"])
# task = meta["task"]
generator = meta["generator"]
if generator == "fc":
model = models.VectorGenerator(**model_params)
elif generator == "bezier_fc":
model = models.BezierVectorGenerator(**model_params)
elif generator in ["rnn"]:
model = models.RNNVectorGenerator(**model_params)
elif generator in ["chain_rnn"]:
model = models.ChainRNNVectorGenerator(**model_params)
else:
raise NotImplementedError()
model.eval()
device = "cpu"
if th.cuda.is_available():
device = "cuda"
model.to(device)
checkpointer = ttools.Checkpointer(
args.model, model, meta=meta, prefix="vect_g_")
checkpointer.load_latest()
LOG.info("Computing latent space interpolation")
for i in range(args.nsamples):
z0 = model.sample_z(1)
z1 = model.sample_z(1)
# interpolation
alpha = th.linspace(0, 1, args.nsteps).view(args.nsteps, 1).to(device)
alpha_video = th.linspace(0, 1, args.nframes).view(args.nframes, 1)
alpha_video = alpha_video.to(device)
length = [args.nsteps, args.nframes]
for idx, a in enumerate([alpha, alpha_video]):
_z0 = z0.repeat(length[idx], 1).to(device)
_z1 = z1.repeat(length[idx], 1).to(device)
batch = _z0*(1-a) + _z1*a
out = model(batch)
if idx == 0: # image viz
n, c, h, w = out.shape
out = out.permute(1, 2, 0, 3)
out = out.contiguous().view(1, c, h, w*n)
out = postprocess(out, invert=args.invert)
imsave(out, os.path.join(outdir,
"latent_interp", "%03d.png" % i))
scenes = model.get_vector(batch)
for scn_idx, scn in enumerate(scenes):
save_scene(scn, os.path.join(outdir, "latent_interp_svg",
"%03d" % i, "%03d.svg" %
scn_idx))
else: # video viz
anim_root = os.path.join(outdir,
"latent_interp_video", "%03d" % i)
LOG.info("Rendering animation %d", i)
for frame_idx, frame in enumerate(out):
LOG.info("frame %d", frame_idx)
frame = frame.unsqueeze(0)
frame = postprocess(frame, invert=args.invert)
imsave(frame, os.path.join(anim_root,
"frame%04d.png" % frame_idx))
call(["ffmpeg", "-framerate", "30", "-i",
os.path.join(anim_root, "frame%04d.png"), "-vb", "20M",
os.path.join(outdir,
"latent_interp_video", "%03d.mp4" % i)])
LOG.info(" saved %d", i)
LOG.info("Sampling latent space")
for i in range(args.nsamples):
n = 8
bs = n*n
z = model.sample_z(bs).to(device)
out = model(z)
_, c, h, w = out.shape
out = out.view(n, n, c, h, w).permute(2, 0, 3, 1, 4)
out = out.contiguous().view(1, c, h*n, w*n)
out = postprocess(out)
imsave(out, os.path.join(outdir, "samples_%03d.png" % i))
LOG.info(" saved %d", i)
LOG.info("output images saved to %s", outdir)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("model")
parser.add_argument("--output_dir", help="output directory for "
" the samples. Defaults to the model's path")
parser.add_argument("--nsamples", default=16, type=int,
help="number of output to compute")
parser.add_argument("--imsize", type=int,
help="if provided, override the raster output "
"resolution")
parser.add_argument("--nsteps", default=9, type=int, help="number of "
"interpolation steps for the interpolation")
parser.add_argument("--nframes", default=120, type=int, help="number of "
"frames for the interpolation video")
parser.add_argument("--invert", default=False, action="store_true",
help="if True, render black on white rather than the"
" opposite")
args = parser.parse_args()
pydiffvg.set_use_gpu(False)
ttools.set_logger(False)
run(args)

View File

@@ -0,0 +1,99 @@
"""Losses for the generative models and baselines."""
import torch as th
import numpy as np
import ttools.modules.image_operators as imops
class KLDivergence(th.nn.Module):
"""
Args:
min_value(float): the loss is clipped so that value below this
number don't affect the optimization.
"""
def __init__(self, min_value=0.2):
super(KLDivergence, self).__init__()
self.min_value = min_value
def forward(self, mu, log_sigma):
loss = -0.5 * (1.0 + log_sigma - mu.pow(2) - log_sigma.exp())
loss = loss.mean()
loss = th.max(loss, self.min_value*th.ones_like(loss))
return loss
class MultiscaleMSELoss(th.nn.Module):
def __init__(self, channels=3):
super(MultiscaleMSELoss, self).__init__()
self.blur = imops.GaussianBlur(1, channels=channels)
def forward(self, im, target):
bs, c, h, w = im.shape
num_levels = max(int(np.ceil(np.log2(h))) - 2, 1)
losses = []
for lvl in range(num_levels):
loss = th.nn.functional.mse_loss(im, target)
losses.append(loss)
im = th.nn.functional.interpolate(self.blur(im),
scale_factor=0.5,
mode="nearest")
target = th.nn.functional.interpolate(self.blur(target),
scale_factor=0.5,
mode="nearest")
losses = th.stack(losses)
return losses.sum()
def gaussian_pdfs(dx, dy, params):
"""Returns the pdf at (dx, dy) for each Gaussian in the mixture.
"""
dx = dx.unsqueeze(-1) # replicate dx, dy to evaluate all pdfs at once
dy = dy.unsqueeze(-1)
mu_x = params[..., 0]
mu_y = params[..., 1]
sigma_x = params[..., 2].exp()
sigma_y = params[..., 3].exp()
rho_xy = th.tanh(params[..., 4])
x = ((dx-mu_x) / sigma_x).pow(2)
y = ((dy-mu_y) / sigma_y).pow(2)
xy = (dx-mu_x)*(dy-mu_y) / (sigma_x * sigma_y)
arg = x + y - 2.0*rho_xy*xy
pdf = th.exp(-arg / (2*(1.0 - rho_xy.pow(2))))
norm = 2.0 * np.pi * sigma_x * sigma_y * (1.0 - rho_xy.pow(2)).sqrt()
return pdf / norm
class GaussianMixtureReconstructionLoss(th.nn.Module):
"""
Args:
"""
def __init__(self, eps=1e-5):
super(GaussianMixtureReconstructionLoss, self).__init__()
self.eps = eps
def forward(self, pen_logits, mixture_logits, gaussian_params, targets):
dx = targets[..., 0]
dy = targets[..., 1]
pen_state = targets[..., 2:].argmax(-1) # target index
# Likelihood loss on the stroke position
# No need to predict accurate pen position for end-of-sequence tokens
valid_stroke = (targets[..., -1] != 1.0).float()
mixture_weights = th.nn.functional.softmax(mixture_logits, -1)
pdfs = gaussian_pdfs(dx, dy, gaussian_params)
position_loss = - th.log(self.eps + (pdfs * mixture_weights).sum(-1))
# by actual non-empty count
position_loss = (position_loss*valid_stroke).sum() / valid_stroke.sum()
# Classification loss for the stroke mode
pen_loss = th.nn.functional.cross_entropy(pen_logits.view(-1, 3),
pen_state.view(-1))
return position_loss + pen_loss

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,484 @@
"""Collection of generative models."""
import torch as th
import ttools
import rendering
import modules
LOG = ttools.get_logger(__name__)
class BaseModel(th.nn.Module):
def sample_z(self, bs, device="cpu"):
return th.randn(bs, self.zdim).to(device)
class BaseVectorModel(BaseModel):
def get_vector(self, z):
_, scenes = self._forward(z)
return scenes
def _forward(self, x):
raise NotImplementedError()
def forward(self, z):
# Only return the raster
return self._forward(z)[0]
class BezierVectorGenerator(BaseVectorModel):
NUM_SEGMENTS = 2
def __init__(self, num_strokes=4,
zdim=128, width=32, imsize=32,
color_output=False,
stroke_width=None):
super(BezierVectorGenerator, self).__init__()
if stroke_width is None:
self.stroke_width = (0.5, 3.0)
LOG.warning("Setting default stroke with %s", self.stroke_width)
else:
self.stroke_width = stroke_width
self.imsize = imsize
self.num_strokes = num_strokes
self.zdim = zdim
self.trunk = th.nn.Sequential(
th.nn.Linear(zdim, width),
th.nn.SELU(inplace=True),
th.nn.Linear(width, 2*width),
th.nn.SELU(inplace=True),
th.nn.Linear(2*width, 4*width),
th.nn.SELU(inplace=True),
th.nn.Linear(4*width, 8*width),
th.nn.SELU(inplace=True),
)
# 4 points bezier with n_segments -> 3*n_segments + 1 points
self.point_predictor = th.nn.Sequential(
th.nn.Linear(8*width,
2*self.num_strokes*(
BezierVectorGenerator.NUM_SEGMENTS*3 + 1)),
th.nn.Tanh() # bound spatial extent
)
self.width_predictor = th.nn.Sequential(
th.nn.Linear(8*width, self.num_strokes),
th.nn.Sigmoid()
)
self.alpha_predictor = th.nn.Sequential(
th.nn.Linear(8*width, self.num_strokes),
th.nn.Sigmoid()
)
self.color_predictor = None
if color_output:
self.color_predictor = th.nn.Sequential(
th.nn.Linear(8*width, 3*self.num_strokes),
th.nn.Sigmoid()
)
def _forward(self, z):
bs = z.shape[0]
feats = self.trunk(z)
all_points = self.point_predictor(feats)
all_alphas = self.alpha_predictor(feats)
if self.color_predictor:
all_colors = self.color_predictor(feats)
all_colors = all_colors.view(bs, self.num_strokes, 3)
else:
all_colors = None
all_widths = self.width_predictor(feats)
min_width = self.stroke_width[0]
max_width = self.stroke_width[1]
all_widths = (max_width - min_width) * all_widths + min_width
all_points = all_points.view(
bs, self.num_strokes, BezierVectorGenerator.NUM_SEGMENTS*3+1, 2)
output, scenes = rendering.bezier_render(all_points, all_widths, all_alphas,
colors=all_colors,
canvas_size=self.imsize)
# map to [-1, 1]
output = output*2.0 - 1.0
return output, scenes
class VectorGenerator(BaseVectorModel):
def __init__(self, num_strokes=4,
zdim=128, width=32, imsize=32,
color_output=False,
stroke_width=None):
super(VectorGenerator, self).__init__()
if stroke_width is None:
self.stroke_width = (0.5, 3.0)
LOG.warning("Setting default stroke with %s", self.stroke_width)
else:
self.stroke_width = stroke_width
self.imsize = imsize
self.num_strokes = num_strokes
self.zdim = zdim
self.trunk = th.nn.Sequential(
th.nn.Linear(zdim, width),
th.nn.SELU(inplace=True),
th.nn.Linear(width, 2*width),
th.nn.SELU(inplace=True),
th.nn.Linear(2*width, 4*width),
th.nn.SELU(inplace=True),
th.nn.Linear(4*width, 8*width),
th.nn.SELU(inplace=True),
)
# straight lines so n_segments -> n_segments - 1 points
self.point_predictor = th.nn.Sequential(
th.nn.Linear(8*width, 2*(self.num_strokes*2)),
th.nn.Tanh() # bound spatial extent
)
self.width_predictor = th.nn.Sequential(
th.nn.Linear(8*width, self.num_strokes),
th.nn.Sigmoid()
)
self.alpha_predictor = th.nn.Sequential(
th.nn.Linear(8*width, self.num_strokes),
th.nn.Sigmoid()
)
self.color_predictor = None
if color_output:
self.color_predictor = th.nn.Sequential(
th.nn.Linear(8*width, 3*self.num_strokes),
th.nn.Sigmoid()
)
def _forward(self, z):
bs = z.shape[0]
feats = self.trunk(z)
all_points = self.point_predictor(feats)
all_alphas = self.alpha_predictor(feats)
if self.color_predictor:
all_colors = self.color_predictor(feats)
all_colors = all_colors.view(bs, self.num_strokes, 3)
else:
all_colors = None
all_widths = self.width_predictor(feats)
min_width = self.stroke_width[0]
max_width = self.stroke_width[1]
all_widths = (max_width - min_width) * all_widths + min_width
all_points = all_points.view(bs, self.num_strokes, 2, 2)
output, scenes = rendering.line_render(all_points, all_widths, all_alphas,
colors=all_colors,
canvas_size=self.imsize)
# map to [-1, 1]
output = output*2.0 - 1.0
return output, scenes
class RNNVectorGenerator(BaseVectorModel):
def __init__(self, num_strokes=64,
zdim=128, width=32, imsize=32,
hidden_size=512, dropout=0.9,
color_output=False,
num_layers=3, stroke_width=None):
super(RNNVectorGenerator, self).__init__()
if stroke_width is None:
self.stroke_width = (0.5, 3.0)
LOG.warning("Setting default stroke with %s", self.stroke_width)
else:
self.stroke_width = stroke_width
self.num_layers = num_layers
self.imsize = imsize
self.num_strokes = num_strokes
self.hidden_size = hidden_size
self.zdim = zdim
self.hidden_cell_predictor = th.nn.Linear(
zdim, 2*hidden_size*num_layers)
self.lstm = th.nn.LSTM(
zdim, hidden_size,
num_layers=self.num_layers, dropout=dropout,
batch_first=True)
# straight lines so n_segments -> n_segments - 1 points
self.point_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 2*2), # 2 points, (x,y)
th.nn.Tanh() # bound spatial extent
)
self.width_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 1),
th.nn.Sigmoid()
)
self.alpha_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 1),
th.nn.Sigmoid()
)
def _forward(self, z, hidden_and_cell=None):
steps = self.num_strokes
# z is passed at each step, duplicate it
bs = z.shape[0]
expanded_z = z.unsqueeze(1).repeat(1, steps, 1)
# First step in the RNN
if hidden_and_cell is None:
# Initialize from latent vector
hidden_and_cell = self.hidden_cell_predictor(th.tanh(z))
hidden = hidden_and_cell[:, :self.hidden_size*self.num_layers]
hidden = hidden.view(-1, self.num_layers, self.hidden_size)
hidden = hidden.permute(1, 0, 2).contiguous()
cell = hidden_and_cell[:, self.hidden_size*self.num_layers:]
cell = cell.view(-1, self.num_layers, self.hidden_size)
cell = cell.permute(1, 0, 2).contiguous()
hidden_and_cell = (hidden, cell)
feats, hidden_and_cell = self.lstm(expanded_z, hidden_and_cell)
hidden, cell = hidden_and_cell
feats = feats.reshape(bs*steps, self.hidden_size)
all_points = self.point_predictor(feats).view(bs, steps, 2, 2)
all_alphas = self.alpha_predictor(feats).view(bs, steps)
all_widths = self.width_predictor(feats).view(bs, steps)
min_width = self.stroke_width[0]
max_width = self.stroke_width[1]
all_widths = (max_width - min_width) * all_widths + min_width
output, scenes = rendering.line_render(all_points, all_widths, all_alphas,
canvas_size=self.imsize)
# map to [-1, 1]
output = output*2.0 - 1.0
return output, scenes
class ChainRNNVectorGenerator(BaseVectorModel):
"""Strokes form a single long chain."""
def __init__(self, num_strokes=64,
zdim=128, width=32, imsize=32,
hidden_size=512, dropout=0.9,
color_output=False,
num_layers=3, stroke_width=None):
super(ChainRNNVectorGenerator, self).__init__()
if stroke_width is None:
self.stroke_width = (0.5, 3.0)
LOG.warning("Setting default stroke with %s", self.stroke_width)
else:
self.stroke_width = stroke_width
self.num_layers = num_layers
self.imsize = imsize
self.num_strokes = num_strokes
self.hidden_size = hidden_size
self.zdim = zdim
self.hidden_cell_predictor = th.nn.Linear(
zdim, 2*hidden_size*num_layers)
self.lstm = th.nn.LSTM(
zdim, hidden_size,
num_layers=self.num_layers, dropout=dropout,
batch_first=True)
# straight lines so n_segments -> n_segments - 1 points
self.point_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 2), # 1 point, (x,y)
th.nn.Tanh() # bound spatial extent
)
self.width_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 1),
th.nn.Sigmoid()
)
self.alpha_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 1),
th.nn.Sigmoid()
)
def _forward(self, z, hidden_and_cell=None):
steps = self.num_strokes
# z is passed at each step, duplicate it
bs = z.shape[0]
expanded_z = z.unsqueeze(1).repeat(1, steps, 1)
# First step in the RNN
if hidden_and_cell is None:
# Initialize from latent vector
hidden_and_cell = self.hidden_cell_predictor(th.tanh(z))
hidden = hidden_and_cell[:, :self.hidden_size*self.num_layers]
hidden = hidden.view(-1, self.num_layers, self.hidden_size)
hidden = hidden.permute(1, 0, 2).contiguous()
cell = hidden_and_cell[:, self.hidden_size*self.num_layers:]
cell = cell.view(-1, self.num_layers, self.hidden_size)
cell = cell.permute(1, 0, 2).contiguous()
hidden_and_cell = (hidden, cell)
feats, hidden_and_cell = self.lstm(expanded_z, hidden_and_cell)
hidden, cell = hidden_and_cell
feats = feats.reshape(bs*steps, self.hidden_size)
# Construct the chain
end_points = self.point_predictor(feats).view(bs, steps, 1, 2)
start_points = th.cat([
# first point is canvas center
th.zeros(bs, 1, 1, 2, device=feats.device),
end_points[:, 1:, :, :]], 1)
all_points = th.cat([start_points, end_points], 2)
all_alphas = self.alpha_predictor(feats).view(bs, steps)
all_widths = self.width_predictor(feats).view(bs, steps)
min_width = self.stroke_width[0]
max_width = self.stroke_width[1]
all_widths = (max_width - min_width) * all_widths + min_width
output, scenes = rendering.line_render(all_points, all_widths, all_alphas,
canvas_size=self.imsize)
# map to [-1, 1]
output = output*2.0 - 1.0
return output, scenes
class Generator(BaseModel):
def __init__(self, width=64, imsize=32, zdim=128,
stroke_width=None,
color_output=False,
num_strokes=4):
super(Generator, self).__init__()
assert imsize == 32
self.imsize = imsize
self.zdim = zdim
num_in_chans = self.zdim // (2*2)
num_out_chans = 3 if color_output else 1
self.net = th.nn.Sequential(
th.nn.ConvTranspose2d(num_in_chans, width*8, 4, padding=1,
stride=2),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(width*8, width*8, 3, padding=1),
th.nn.BatchNorm2d(width*8),
th.nn.LeakyReLU(0.2, inplace=True),
# 4x4
th.nn.ConvTranspose2d(8*width, 4*width, 4, padding=1, stride=2),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(4*width, 4*width, 3, padding=1),
th.nn.BatchNorm2d(width*4),
th.nn.LeakyReLU(0.2, inplace=True),
# 8x8
th.nn.ConvTranspose2d(4*width, 2*width, 4, padding=1, stride=2),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(2*width, 2*width, 3, padding=1),
th.nn.BatchNorm2d(width*2),
th.nn.LeakyReLU(0.2, inplace=True),
# 16x16
th.nn.ConvTranspose2d(2*width, width, 4, padding=1, stride=2),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(width, width, 3, padding=1),
th.nn.BatchNorm2d(width),
th.nn.LeakyReLU(0.2, inplace=True),
# 32x32
th.nn.Conv2d(width, width, 3, padding=1),
th.nn.BatchNorm2d(width),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(width, width, 3, padding=1),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(width, num_out_chans, 1),
th.nn.Tanh(),
)
def forward(self, z):
bs = z.shape[0]
num_in_chans = self.zdim // (2*2)
raster = self.net(z.view(bs, num_in_chans, 2, 2))
return raster
class Discriminator(th.nn.Module):
def __init__(self, conditional=False, width=64, color_output=False):
super(Discriminator, self).__init__()
self.conditional = conditional
sn = th.nn.utils.spectral_norm
num_chan_in = 3 if color_output else 1
self.net = th.nn.Sequential(
th.nn.Conv2d(num_chan_in, width, 3, padding=1),
th.nn.LeakyReLU(0.2, inplace=True),
th.nn.Conv2d(width, 2*width, 4, padding=1, stride=2),
th.nn.LeakyReLU(0.2, inplace=True),
# 16x16
sn(th.nn.Conv2d(2*width, 2*width, 3, padding=1)),
th.nn.LeakyReLU(0.2, inplace=True),
sn(th.nn.Conv2d(2*width, 4*width, 4, padding=1, stride=2)),
th.nn.LeakyReLU(0.2, inplace=True),
# 8x8
sn(th.nn.Conv2d(4*width, 4*width, 3, padding=1)),
th.nn.LeakyReLU(0.2, inplace=True),
sn(th.nn.Conv2d(4*width, width*4, 4, padding=1, stride=2)),
th.nn.LeakyReLU(0.2, inplace=True),
# 4x4
sn(th.nn.Conv2d(4*width, 4*width, 3, padding=1)),
th.nn.LeakyReLU(0.2, inplace=True),
sn(th.nn.Conv2d(4*width, width*4, 4, padding=1, stride=2)),
th.nn.LeakyReLU(0.2, inplace=True),
# 2x2
modules.Flatten(),
th.nn.Linear(width*4*2*2, 1),
)
def forward(self, x):
out = self.net(x)
return out

View File

@@ -0,0 +1,11 @@
"""Helper modules to build our networks."""
import torch as th
class Flatten(th.nn.Module):
def __init__(self):
super(Flatten, self).__init__()
def forward(self, x):
bs = x.shape[0]
return x.view(bs, -1)

View File

@@ -0,0 +1,307 @@
import os
import torch as th
import torch.multiprocessing as mp
import threading as mt
import numpy as np
import random
import ttools
import pydiffvg
import time
def render(canvas_width, canvas_height, shapes, shape_groups, samples=2,
seed=None):
if seed is None:
seed = random.randint(0, 1000000)
_render = pydiffvg.RenderFunction.apply
scene_args = pydiffvg.RenderFunction.serialize_scene(
canvas_width, canvas_height, shapes, shape_groups)
img = _render(canvas_width, canvas_height, samples, samples,
seed, # seed
None, # background image
*scene_args)
return img
def opacityStroke2diffvg(strokes, canvas_size=128, debug=False, relative=True,
force_cpu=True):
dev = strokes.device
if force_cpu:
strokes = strokes.to("cpu")
# pydiffvg.set_use_gpu(False)
# if strokes.is_cuda:
# pydiffvg.set_use_gpu(True)
"""Rasterize strokes given in (dx, dy, opacity) sequence format."""
bs, nsegs, dims = strokes.shape
out = []
start = time.time()
for batch_idx, stroke in enumerate(strokes):
if relative: # Absolute coordinates
all_points = stroke[..., :2].cumsum(0)
else:
all_points = stroke[..., :2]
all_opacities = stroke[..., 2]
# Transform from [-1, 1] to canvas coordinates
# Make sure points are in canvas
all_points = 0.5*(all_points + 1.0) * canvas_size
# all_points = th.clamp(0.5*(all_points + 1.0), 0, 1) * canvas_size
# Avoid overlapping points
eps = 1e-4
all_points = all_points + eps*th.randn_like(all_points)
shapes = []
shape_groups = []
for start_idx in range(0, nsegs-1):
points = all_points[start_idx:start_idx+2].contiguous().float()
opacity = all_opacities[start_idx]
num_ctrl_pts = th.zeros(points.shape[0] - 1, dtype=th.int32)
width = th.ones(1)
path = pydiffvg.Path(
num_control_points=num_ctrl_pts, points=points,
stroke_width=width, is_closed=False)
shapes.append(path)
color = th.cat([th.ones(3, device=opacity.device),
opacity.unsqueeze(0)], 0)
path_group = pydiffvg.ShapeGroup(
shape_ids=th.tensor([len(shapes) - 1]),
fill_color=None,
stroke_color=color)
shape_groups.append(path_group)
# Rasterize only if there are shapes
if shapes:
inner_start = time.time()
out.append(render(canvas_size, canvas_size, shapes, shape_groups,
samples=4))
if debug:
inner_elapsed = time.time() - inner_start
print("diffvg call took %.2fms" % inner_elapsed)
else:
out.append(th.zeros(canvas_size, canvas_size, 4,
device=strokes.device))
if debug:
elapsed = (time.time() - start)*1000
print("rendering took %.2fms" % elapsed)
images = th.stack(out, 0).permute(0, 3, 1, 2).contiguous()
# Return data on the same device as input
return images.to(dev)
def stroke2diffvg(strokes, canvas_size=128):
"""Rasterize strokes given some sequential data."""
bs, nsegs, dims = strokes.shape
out = []
for stroke_idx, stroke in enumerate(strokes):
end_of_stroke = stroke[:, 4] == 1
last = end_of_stroke.cpu().numpy().argmax()
stroke = stroke[:last+1, :]
# stroke = stroke[~end_of_stroke]
# TODO: stop at the first end of stroke
# import ipdb; ipdb.set_trace()
split_idx = stroke[:, 3].nonzero().squeeze(1)
# Absolute coordinates
all_points = stroke[..., :2].cumsum(0)
# Transform to canvas coordinates
all_points[..., 0] += 0.5
all_points[..., 0] *= canvas_size
all_points[..., 1] += 0.5
all_points[..., 1] *= canvas_size
# Make sure points are in canvas
all_points[..., :2] = th.clamp(all_points[..., :2], 0, canvas_size)
shape_groups = []
shapes = []
start_idx = 0
for count, end_idx in enumerate(split_idx):
points = all_points[start_idx:end_idx+1].contiguous().float()
if points.shape[0] <= 2: # we need at least 2 points for a line
continue
num_ctrl_pts = th.zeros(points.shape[0] - 1, dtype=th.int32)
width = th.ones(1)
path = pydiffvg.Path(
num_control_points=num_ctrl_pts, points=points,
stroke_width=width, is_closed=False)
start_idx = end_idx+1
shapes.append(path)
color = th.ones(4, 1)
path_group = pydiffvg.ShapeGroup(
shape_ids=th.tensor([len(shapes) - 1]),
fill_color=None,
stroke_color=color)
shape_groups.append(path_group)
# Rasterize
if shapes:
# draw only if there are shapes
out.append(render(canvas_size, canvas_size, shapes, shape_groups, samples=2))
else:
out.append(th.zeros(canvas_size, canvas_size, 4,
device=strokes.device))
return th.stack(out, 0).permute(0, 3, 1, 2)[:, :3].contiguous()
def line_render(all_points, all_widths, all_alphas, force_cpu=True,
canvas_size=32, colors=None):
dev = all_points.device
if force_cpu:
all_points = all_points.to("cpu")
all_widths = all_widths.to("cpu")
all_alphas = all_alphas.to("cpu")
if colors is not None:
colors = colors.to("cpu")
all_points = 0.5*(all_points + 1.0) * canvas_size
eps = 1e-4
all_points = all_points + eps*th.randn_like(all_points)
bs, num_segments, _, _ = all_points.shape
n_out = 3 if colors is not None else 1
output = th.zeros(bs, n_out, canvas_size, canvas_size,
device=all_points.device)
scenes = []
for k in range(bs):
shapes = []
shape_groups = []
for p in range(num_segments):
points = all_points[k, p].contiguous().cpu()
num_ctrl_pts = th.zeros(1, dtype=th.int32)
width = all_widths[k, p].cpu()
alpha = all_alphas[k, p].cpu()
if colors is not None:
color = colors[k, p]
else:
color = th.ones(3, device=alpha.device)
color = th.cat([color, alpha.view(1,)])
path = pydiffvg.Path(
num_control_points=num_ctrl_pts, points=points,
stroke_width=width, is_closed=False)
shapes.append(path)
path_group = pydiffvg.ShapeGroup(
shape_ids=th.tensor([len(shapes) - 1]),
fill_color=None,
stroke_color=color)
shape_groups.append(path_group)
# Rasterize
scenes.append((canvas_size, canvas_size, shapes, shape_groups))
raster = render(canvas_size, canvas_size, shapes, shape_groups,
samples=2)
raster = raster.permute(2, 0, 1).view(4, canvas_size, canvas_size)
alpha = raster[3:4]
if colors is not None: # color output
image = raster[:3]
alpha = alpha.repeat(3, 1, 1)
else:
image = raster[:1]
# alpha compositing
image = image*alpha
output[k] = image
output = output.to(dev)
return output, scenes
def bezier_render(all_points, all_widths, all_alphas, force_cpu=True,
canvas_size=32, colors=None):
dev = all_points.device
if force_cpu:
all_points = all_points.to("cpu")
all_widths = all_widths.to("cpu")
all_alphas = all_alphas.to("cpu")
if colors is not None:
colors = colors.to("cpu")
all_points = 0.5*(all_points + 1.0) * canvas_size
eps = 1e-4
all_points = all_points + eps*th.randn_like(all_points)
bs, num_strokes, num_pts, _ = all_points.shape
num_segments = (num_pts - 1) // 3
n_out = 3 if colors is not None else 1
output = th.zeros(bs, n_out, canvas_size, canvas_size,
device=all_points.device)
scenes = []
for k in range(bs):
shapes = []
shape_groups = []
for p in range(num_strokes):
points = all_points[k, p].contiguous().cpu()
# bezier
num_ctrl_pts = th.zeros(num_segments, dtype=th.int32) + 2
width = all_widths[k, p].cpu()
alpha = all_alphas[k, p].cpu()
if colors is not None:
color = colors[k, p]
else:
color = th.ones(3, device=alpha.device)
color = th.cat([color, alpha.view(1,)])
path = pydiffvg.Path(
num_control_points=num_ctrl_pts, points=points,
stroke_width=width, is_closed=False)
shapes.append(path)
path_group = pydiffvg.ShapeGroup(
shape_ids=th.tensor([len(shapes) - 1]),
fill_color=None,
stroke_color=color)
shape_groups.append(path_group)
# Rasterize
scenes.append((canvas_size, canvas_size, shapes, shape_groups))
raster = render(canvas_size, canvas_size, shapes, shape_groups,
samples=2)
raster = raster.permute(2, 0, 1).view(4, canvas_size, canvas_size)
alpha = raster[3:4]
if colors is not None: # color output
image = raster[:3]
alpha = alpha.repeat(3, 1, 1)
else:
image = raster[:1]
# alpha compositing
image = image*alpha
output[k] = image
output = output.to(dev)
return output, scenes

View File

@@ -0,0 +1,461 @@
#!/bin/env python
"""Train a Sketch-RNN."""
import argparse
from enum import Enum
import os
import wget
import numpy as np
import torch as th
from torch.utils.data import DataLoader
import torchvision.datasets as dset
import torchvision.transforms as transforms
import ttools
import ttools.interfaces
from ttools.modules import networks
import pydiffvg
import rendering
import losses
import data
LOG = ttools.get_logger(__name__)
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
OUTPUT = os.path.join(BASE_DIR, "results", "sketch_rnn_diffvg")
OUTPUT_BASELINE = os.path.join(BASE_DIR, "results", "sketch_rnn")
class SketchRNN(th.nn.Module):
class Encoder(th.nn.Module):
def __init__(self, hidden_size=512, dropout=0.9, zdim=128,
num_layers=1):
super(SketchRNN.Encoder, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.zdim = zdim
self.lstm = th.nn.LSTM(5, hidden_size, num_layers=self.num_layers,
dropout=dropout, bidirectional=True,
batch_first=True)
# bidirectional model -> *2
self.mu_predictor = th.nn.Linear(2*hidden_size, zdim)
self.sigma_predictor = th.nn.Linear(2*hidden_size, zdim)
def forward(self, sequences, hidden_and_cell=None):
bs = sequences.shape[0]
if hidden_and_cell is None:
hidden = th.zeros(self.num_layers*2, bs, self.hidden_size).to(
sequences.device)
cell = th.zeros(self.num_layers*2, bs, self.hidden_size).to(
sequences.device)
hidden_and_cell = (hidden, cell)
out, hidden_and_cell = self.lstm(sequences, hidden_and_cell)
hidden = hidden_and_cell[0]
# Concat the forward/backward states
fc_input = th.cat([hidden[0], hidden[1]], 1)
# VAE params
mu = self.mu_predictor(fc_input)
log_sigma = self.sigma_predictor(fc_input)
# Sample a latent vector
sigma = th.exp(log_sigma/2.0)
z0 = th.randn(self.zdim, device=mu.device)
z = mu + sigma*z0
# KL divergence needs mu/sigma
return z, mu, log_sigma
class Decoder(th.nn.Module):
"""
The decoder outputs a sequence where each time step models (dx, dy) as
a mixture of `num_gaussians` 2D Gaussians and the state triplet is a
categorical distribution.
The model outputs at each time step:
- 5 parameters for each Gaussian: mu_x, mu_y, sigma_x, sigma_y,
rho_xy
- 1 logit for each Gaussian (the mixture weight)
- 3 logits for the state triplet probabilities
"""
def __init__(self, hidden_size=512, dropout=0.9, zdim=128,
num_layers=1, num_gaussians=20):
super(SketchRNN.Decoder, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.zdim = zdim
self.num_gaussians = num_gaussians
# Maps the latent vector to an initial cell/hidden vector
self.hidden_cell_predictor = th.nn.Linear(zdim, 2*hidden_size)
self.lstm = th.nn.LSTM(
5 + zdim, hidden_size,
num_layers=self.num_layers, dropout=dropout,
batch_first=True)
self.parameters_predictor = th.nn.Linear(
hidden_size, num_gaussians + 5*num_gaussians + 3)
def forward(self, inputs, z, hidden_and_cell=None):
# Every step in the sequence takes the latent vector as input so we
# replicate it here
expanded_z = z.unsqueeze(1).repeat(1, inputs.shape[1], 1)
inputs = th.cat([inputs, expanded_z], 2)
bs, steps = inputs.shape[:2]
if hidden_and_cell is None:
# Initialize from latent vector
hidden_and_cell = self.hidden_cell_predictor(th.tanh(z))
hidden = hidden_and_cell[:, :self.hidden_size]
hidden = hidden.unsqueeze(0).contiguous()
cell = hidden_and_cell[:, self.hidden_size:]
cell = cell.unsqueeze(0).contiguous()
hidden_and_cell = (hidden, cell)
outputs, hidden_and_cell = self.lstm(inputs, hidden_and_cell)
hidden, cell = hidden_and_cell
# if self.training:
# At train time we want parameters for each time step
outputs = outputs.reshape(bs*steps, self.hidden_size)
params = self.parameters_predictor(outputs).view(bs, steps, -1)
pen_logits = params[..., -3:]
gaussian_params = params[..., :-3]
mixture_logits = gaussian_params[..., :self.num_gaussians]
gaussian_params = gaussian_params[..., self.num_gaussians:].view(
bs, steps, self.num_gaussians, -1)
return pen_logits, mixture_logits, gaussian_params, hidden_and_cell
def __init__(self, zdim=128, num_gaussians=20, encoder_dim=256,
decoder_dim=512):
super(SketchRNN, self).__init__()
self.encoder = SketchRNN.Encoder(zdim=zdim, hidden_size=encoder_dim)
self.decoder = SketchRNN.Decoder(zdim=zdim, hidden_size=decoder_dim,
num_gaussians=num_gaussians)
def forward(self, sequences):
# Encode the sequences as latent vectors
# We skip the first time step since it is the same for all sequences:
# (0, 0, 1, 0, 0)
z, mu, log_sigma = self.encoder(sequences[:, 1:])
# Decode the latent vector into a model sequence
# Do not process the last time step (it is an end-of-sequence token)
pen_logits, mixture_logits, gaussian_params, hidden_and_cell = \
self.decoder(sequences[:, :-1], z)
return {
"pen_logits": pen_logits,
"mixture_logits": mixture_logits,
"gaussian_params": gaussian_params,
"z": z,
"mu": mu,
"log_sigma": log_sigma,
"hidden_and_cell": hidden_and_cell,
}
def sample(self, sequences, temperature=1.0):
# Compute a latent vector conditionned based on a real sequence
z, _, _ = self.encoder(sequences[:, 1:])
start_of_seq = sequences[:, :1]
max_steps = sequences.shape[1] - 1 # last step is an end-of-seq token
output_sequences = th.zeros_like(sequences)
output_sequences[:, 0] = start_of_seq.squeeze(1)
current_input = start_of_seq
hidden_and_cell = None
for step in range(max_steps):
pen_logits, mixture_logits, gaussian_params, hidden_and_cell = \
self.decoder(current_input, z, hidden_and_cell=hidden_and_cell)
# Pen and displacement state for the next step
next_state = th.zeros_like(current_input)
# Adjust temperature to control randomness
mixture_logits = mixture_logits*temperature
pen_logits = pen_logits*temperature
# Select one of 3 pen states
pen_distrib = \
th.distributions.categorical.Categorical(logits=pen_logits)
pen_state = pen_distrib.sample()
# One-hot encoding of the state
next_state[:, :, 2:].scatter_(2, pen_state.unsqueeze(-1),
th.ones_like(next_state[:, :, 2:]))
# Select one of the Gaussians from the mixture
mixture_distrib = \
th.distributions.categorical.Categorical(logits=mixture_logits)
mixture_idx = mixture_distrib.sample()
# select the Gaussian parameter
mixture_idx = mixture_idx.unsqueeze(-1).unsqueeze(-1)
mixture_idx = mixture_idx.repeat(1, 1, 1, 5)
params = th.gather(gaussian_params, 2, mixture_idx).squeeze(2)
# Sample a Gaussian from the corresponding Gaussian
mu = params[..., :2]
sigma_x = params[..., 2].exp()
sigma_y = params[..., 3].exp()
rho_xy = th.tanh(params[..., 4])
cov = th.zeros(params.shape[0], params.shape[1], 2, 2,
device=params.device)
cov[..., 0, 0] = sigma_x.pow(2)*temperature
cov[..., 1, 1] = sigma_x.pow(2)*temperature
cov[..., 1, 0] = sigma_x*sigma_y*rho_xy*temperature
point_distrib = \
th.distributions.multivariate_normal.MultivariateNormal(
mu, scale_tril=cov)
point = point_distrib.sample()
next_state[:, :, :2] = point
# Commit step to output
output_sequences[:, step + 1] = next_state.squeeze(1)
# Prepare next recurrent step
current_input = next_state
return output_sequences
class SketchRNNCallback(ttools.callbacks.ImageDisplayCallback):
"""Simple callback that visualize images."""
def visualized_image(self, batch, step_data, is_val=False):
if not is_val:
# No need to render training data
return None
with th.no_grad():
# only display the first n drawings
n = 8
batch = batch[:n]
out_im = rendering.stroke2diffvg(step_data["sample"][:n])
im = rendering.stroke2diffvg(batch)
im = th.cat([im, out_im], 2)
return im
def caption(self, batch, step_data, is_val=False):
if is_val:
return "top: truth, bottom: sample"
else:
return "top: truth, bottom: sample"
class Interface(ttools.ModelInterface):
def __init__(self, model, lr=1e-3, lr_decay=0.9999,
kl_weight=0.5, kl_min_weight=0.01, kl_decay=0.99995,
device="cpu", grad_clip=1.0, sampling_temperature=0.4):
super(Interface, self).__init__()
self.grad_clip = grad_clip
self.sampling_temperature = sampling_temperature
self.model = model
self.device = device
self.model.to(self.device)
self.enc_opt = th.optim.Adam(self.model.encoder.parameters(), lr=lr)
self.dec_opt = th.optim.Adam(self.model.decoder.parameters(), lr=lr)
self.kl_weight = kl_weight
self.kl_min_weight = kl_min_weight
self.kl_decay = kl_decay
self.kl_loss = losses.KLDivergence()
self.schedulers = [
th.optim.lr_scheduler.ExponentialLR(self.enc_opt, lr_decay),
th.optim.lr_scheduler.ExponentialLR(self.dec_opt, lr_decay),
]
self.reconstruction_loss = losses.GaussianMixtureReconstructionLoss()
def optimizers(self):
return [self.enc_opt, self.dec_opt]
def training_step(self, batch):
batch = batch.to(self.device)
out = self.model(batch)
kl_loss = self.kl_loss(
out["mu"], out["log_sigma"])
# The target to predict is the next sequence step
targets = batch[:, 1:].to(self.device)
# Scale the KL divergence weight
try:
state = self.enc_opt.state_dict()["param_groups"][0]["params"][0]
optim_step = self.enc_opt.state_dict()["state"][state]["step"]
except KeyError:
optim_step = 0 # no step taken yet
kl_scaling = 1.0 - (1.0 -
self.kl_min_weight)*(self.kl_decay**optim_step)
kl_weight = self.kl_weight * kl_scaling
reconstruction_loss = self.reconstruction_loss(
out["pen_logits"], out["mixture_logits"],
out["gaussian_params"], targets)
loss = kl_loss*self.kl_weight + reconstruction_loss
self.enc_opt.zero_grad()
self.dec_opt.zero_grad()
loss.backward()
# clip gradients
enc_nrm = th.nn.utils.clip_grad_norm_(
self.model.encoder.parameters(), self.grad_clip)
dec_nrm = th.nn.utils.clip_grad_norm_(
self.model.decoder.parameters(), self.grad_clip)
if enc_nrm > self.grad_clip:
LOG.debug("Clipped encoder gradient (%.5f) to %.2f",
enc_nrm, self.grad_clip)
if dec_nrm > self.grad_clip:
LOG.debug("Clipped decoder gradient (%.5f) to %.2f",
dec_nrm, self.grad_clip)
self.enc_opt.step()
self.dec_opt.step()
return {
"loss": loss.item(),
"kl_loss": kl_loss.item(),
"kl_weight": kl_weight,
"recons_loss": reconstruction_loss.item(),
"lr": self.enc_opt.param_groups[0]["lr"],
}
def init_validation(self):
return dict(sample=None)
def validation_step(self, batch, running_data):
# Switch to eval mode for dropout, batchnorm, etc
self.model.eval()
with th.no_grad():
sample = self.model.sample(
batch.to(self.device), temperature=self.sampling_temperature)
running_data["sample"] = sample
self.model.train()
return running_data
def train(args):
th.manual_seed(0)
np.random.seed(0)
dataset = data.QuickDrawDataset(args.dataset)
dataloader = DataLoader(
dataset, batch_size=args.bs, num_workers=4, shuffle=True,
pin_memory=False)
val_dataset = [s for idx, s in enumerate(dataset) if idx < 8]
val_dataloader = DataLoader(
val_dataset, batch_size=8, num_workers=4, shuffle=False,
pin_memory=False)
model_params = {
"zdim": args.zdim,
"num_gaussians": args.num_gaussians,
"encoder_dim": args.encoder_dim,
"decoder_dim": args.decoder_dim,
}
model = SketchRNN(**model_params)
model.train()
device = "cpu"
if th.cuda.is_available():
device = "cuda"
LOG.info("Using CUDA")
interface = Interface(model, lr=args.lr, lr_decay=args.lr_decay,
kl_decay=args.kl_decay, kl_weight=args.kl_weight,
sampling_temperature=args.sampling_temperature,
device=device)
chkpt = OUTPUT_BASELINE
env_name = "sketch_rnn"
# Resume from checkpoint, if any
checkpointer = ttools.Checkpointer(
chkpt, model, meta=model_params,
optimizers=interface.optimizers(),
schedulers=interface.schedulers)
extras, meta = checkpointer.load_latest()
epoch = extras["epoch"] if extras and "epoch" in extras.keys() else 0
if meta is not None and meta != model_params:
LOG.info("Checkpoint's metaparams differ "
"from CLI, aborting: %s and %s", meta, model_params)
trainer = ttools.Trainer(interface)
# Add callbacks
losses = ["loss", "kl_loss", "recons_loss"]
training_debug = ["lr", "kl_weight"]
trainer.add_callback(ttools.callbacks.ProgressBarCallback(
keys=losses, val_keys=None))
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=losses, val_keys=None, env=env_name, port=args.port))
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=training_debug, smoothing=0, val_keys=None, env=env_name,
port=args.port))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer, max_files=2, interval=600, max_epochs=10))
trainer.add_callback(
ttools.callbacks.LRSchedulerCallback(interface.schedulers))
trainer.add_callback(SketchRNNCallback(
env=env_name, win="samples", port=args.port, frequency=args.freq))
# Start training
trainer.train(dataloader, starting_epoch=epoch,
val_dataloader=val_dataloader,
num_epochs=args.num_epochs)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--dataset", default="cat.npz")
# Training params
parser.add_argument("--bs", type=int, default=100)
parser.add_argument("--num_epochs", type=int, default=10000)
parser.add_argument("--lr", type=float, default=1e-4)
parser.add_argument("--lr_decay", type=float, default=0.9999)
parser.add_argument("--kl_weight", type=float, default=0.5)
parser.add_argument("--kl_decay", type=float, default=0.99995)
# Model configuration
parser.add_argument("--zdim", type=int, default=128)
parser.add_argument("--num_gaussians", type=int, default=20)
parser.add_argument("--encoder_dim", type=int, default=256)
parser.add_argument("--decoder_dim", type=int, default=512)
parser.add_argument("--sampling_temperature", type=float, default=0.4,
help="controls sampling randomness. "
"0.0: deterministic, 1.0: unchanged")
# Viz params
parser.add_argument("--freq", type=int, default=100)
parser.add_argument("--port", type=int, default=5000)
args = parser.parse_args()
pydiffvg.set_use_gpu(th.cuda.is_available())
train(args)

View File

@@ -0,0 +1,524 @@
#!/bin/env python
"""Train a Sketch-VAE."""
import argparse
from enum import Enum
import os
import wget
import time
import numpy as np
import torch as th
from torch.utils.data import DataLoader
import torchvision.datasets as dset
import torchvision.transforms as transforms
import ttools
import ttools.interfaces
from ttools.modules import networks
import rendering
import losses
import modules
import data
import pydiffvg
LOG = ttools.get_logger(__name__)
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
OUTPUT = os.path.join(BASE_DIR, "results")
class SketchVAE(th.nn.Module):
class ImageEncoder(th.nn.Module):
def __init__(self, image_size=64, width=64, zdim=128):
super(SketchVAE.ImageEncoder, self).__init__()
self.zdim = zdim
self.net = th.nn.Sequential(
th.nn.Conv2d(4, width, 5, padding=2),
th.nn.InstanceNorm2d(width),
th.nn.ReLU(inplace=True),
# 64x64
th.nn.Conv2d(width, width, 5, padding=2),
th.nn.InstanceNorm2d(width),
th.nn.ReLU( inplace=True),
# 64x64
th.nn.Conv2d(width, 2*width, 5, stride=1, padding=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 32x32
th.nn.Conv2d(2*width, 2*width, 5, stride=2, padding=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 16x16
th.nn.Conv2d(2*width, 2*width, 5, stride=2, padding=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 16x16
th.nn.Conv2d(2*width, 2*width, 5, stride=2, padding=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 8x8
th.nn.Conv2d(2*width, 2*width, 5, stride=2, padding=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 4x4
modules.Flatten(),
th.nn.Linear(4*4*2*width, 2*zdim)
)
def forward(self, images):
features = self.net(images)
# VAE params
mu = features[:, :self.zdim]
log_sigma = features[:, self.zdim:]
# Sample a latent vector
sigma = th.exp(log_sigma/2.0)
z0 = th.randn(self.zdim, device=mu.device)
z = mu + sigma*z0
# KL divergence needs mu/sigma
return z, mu, log_sigma
class ImageDecoder(th.nn.Module):
""""""
def __init__(self, zdim=128, image_size=64, width=64):
super(SketchVAE.ImageDecoder, self).__init__()
self.zdim = zdim
self.width = width
self.embedding = th.nn.Linear(zdim, 4*4*2*width)
self.net = th.nn.Sequential(
th.nn.ConvTranspose2d(2*width, 2*width, 4, padding=1, stride=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 8x8
th.nn.ConvTranspose2d(2*width, 2*width, 4, padding=1, stride=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 16x16
th.nn.ConvTranspose2d(2*width, 2*width, 4, padding=1, stride=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 16x16
th.nn.Conv2d(2*width, 2*width, 5, padding=2, stride=1),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 16x16
th.nn.ConvTranspose2d(2*width, 2*width, 4, padding=1, stride=2),
th.nn.InstanceNorm2d(2*width),
th.nn.ReLU( inplace=True),
# 32x32
th.nn.Conv2d(2*width, width, 5, padding=2, stride=1),
th.nn.InstanceNorm2d(width),
th.nn.ReLU( inplace=True),
# 32x32
th.nn.ConvTranspose2d(width, width, 5, padding=2, stride=1),
th.nn.InstanceNorm2d(width),
th.nn.ReLU( inplace=True),
# 64x64
th.nn.Conv2d(width, width, 5, padding=2, stride=1),
th.nn.InstanceNorm2d(width),
th.nn.ReLU( inplace=True),
# 64x64
th.nn.Conv2d(width, 4, 5, padding=2, stride=1),
)
def forward(self, z):
bs = z.shape[0]
im = self.embedding(z).view(bs, 2*self.width, 4, 4)
out = self.net(im)
return out
class SketchDecoder(th.nn.Module):
"""
The decoder outputs a sequence where each time step models (dx, dy,
opacity).
"""
def __init__(self, sequence_length, hidden_size=512, dropout=0.9,
zdim=128, num_layers=3):
super(SketchVAE.SketchDecoder, self).__init__()
self.sequence_length = sequence_length
self.hidden_size = hidden_size
self.num_layers = num_layers
self.zdim = zdim
# Maps the latent vector to an initial cell/hidden vector
self.hidden_cell_predictor = th.nn.Linear(zdim, 2*hidden_size*num_layers)
self.lstm = th.nn.LSTM(
zdim, hidden_size,
num_layers=self.num_layers, dropout=dropout,
batch_first=True)
self.dxdy_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 2),
th.nn.Tanh(),
)
self.opacity_predictor = th.nn.Sequential(
th.nn.Linear(hidden_size, 1),
th.nn.Sigmoid(),
)
def forward(self, z, hidden_and_cell=None):
# Every step in the sequence takes the latent vector as input so we
# replicate it here
bs = z.shape[0]
steps = self.sequence_length - 1 # no need to predict the start of sequence
expanded_z = z.unsqueeze(1).repeat(1, steps, 1)
if hidden_and_cell is None:
# Initialize from latent vector
hidden_and_cell = self.hidden_cell_predictor(
th.tanh(z))
hidden = hidden_and_cell[:, :self.hidden_size*self.num_layers]
hidden = hidden.view(-1, self.num_layers, self.hidden_size)
hidden = hidden.permute(1, 0, 2).contiguous()
# hidden = hidden.unsqueeze(1).contiguous()
cell = hidden_and_cell[:, self.hidden_size*self.num_layers:]
cell = cell.view(-1, self.num_layers, self.hidden_size)
cell = cell.permute(1, 0, 2).contiguous()
# cell = cell.unsqueeze(1).contiguous()
hidden_and_cell = (hidden, cell)
outputs, hidden_and_cell = self.lstm(expanded_z, hidden_and_cell)
hidden, cell = hidden_and_cell
dxdy = self.dxdy_predictor(
outputs.reshape(bs*steps, self.hidden_size)).view(bs, steps, -1)
opacity = self.opacity_predictor(
outputs.reshape(bs*steps, self.hidden_size)).view(bs, steps, -1)
strokes = th.cat([dxdy, opacity], -1)
return strokes
def __init__(self, sequence_length, zdim=128, image_size=64):
super(SketchVAE, self).__init__()
self.im_encoder = SketchVAE.ImageEncoder(
zdim=zdim, image_size=image_size)
self.im_decoder = SketchVAE.ImageDecoder(
zdim=zdim, image_size=image_size)
self.sketch_decoder = SketchVAE.SketchDecoder(
sequence_length, zdim=zdim)
def forward(self, images):
# Encode the images as latent vectors
z, mu, log_sigma = self.im_encoder(images)
decoded_im = self.im_decoder(z)
decoded_sketch = self.sketch_decoder(z)
return {
"decoded_im": decoded_im,
"decoded_sketch": decoded_sketch,
"z": z,
"mu": mu,
"log_sigma": log_sigma,
}
class SketchVAECallback(ttools.callbacks.ImageDisplayCallback):
"""Simple callback that visualize images."""
def visualized_image(self, batch, step_data, is_val=False):
if is_val:
return None
# only display the first n drawings
n = 8
gt = step_data["gt_image"][:n].detach()
vae_im = step_data["vae_image"][:n].detach()
sketch_im = step_data["sketch_image"][:n].detach()
rendering = th.cat([gt, vae_im, sketch_im], 2)
rendering = th.clamp(rendering, 0, 1)
alpha = rendering[:, 3:4]
rendering = rendering[:, :3] * alpha
return rendering
def caption(self, batch, step_data, is_val=False):
if is_val:
return ""
else:
return "top: truth, middle: vae sample, output: rnn-output"
class Interface(ttools.ModelInterface):
def __init__(self, model, lr=1e-4, lr_decay=0.9999,
kl_weight=0.5, kl_min_weight=0.01, kl_decay=0.99995,
raster_resolution=64, absolute_coords=False,
device="cpu", grad_clip=1.0):
super(Interface, self).__init__()
self.grad_clip = grad_clip
self.raster_resolution = raster_resolution
self.absolute_coords = absolute_coords
self.model = model
self.device = device
self.model.to(self.device)
self.im_enc_opt = th.optim.Adam(
self.model.im_encoder.parameters(), lr=lr)
self.im_dec_opt = th.optim.Adam(
self.model.im_decoder.parameters(), lr=lr)
self.sketch_dec_opt = th.optim.Adam(
self.model.sketch_decoder.parameters(), lr=lr)
self.kl_weight = kl_weight
self.kl_min_weight = kl_min_weight
self.kl_decay = kl_decay
self.kl_loss = losses.KLDivergence()
self.schedulers = [
th.optim.lr_scheduler.ExponentialLR(self.im_enc_opt, lr_decay),
th.optim.lr_scheduler.ExponentialLR(self.im_dec_opt, lr_decay),
th.optim.lr_scheduler.ExponentialLR(self.sketch_dec_opt, lr_decay),
]
# include loss on alpha
self.im_loss = losses.MultiscaleMSELoss(channels=4).to(self.device)
def optimizers(self):
return [self.im_enc_opt, self.im_dec_opt, self.sketch_dec_opt]
def kl_scaling(self):
# Scale the KL divergence weight
try:
state = self.im_enc_opt.state_dict()["param_groups"][0]["params"][0]
optim_step = self.im_enc_opt.state_dict()["state"][state]["step"]
except KeyError:
optim_step = 0 # no step taken yet
kl_scaling = 1.0 - (1.0 -
self.kl_min_weight)*(self.kl_decay**optim_step)
return kl_scaling
def training_step(self, batch):
gt_strokes, gt_im = batch
gt_strokes = gt_strokes.to(self.device)
gt_im = gt_im.to(self.device)
out = self.model(gt_im)
kl_loss = self.kl_loss(
out["mu"], out["log_sigma"])
kl_weight = self.kl_weight * self.kl_scaling()
# add start of sequence
sos = gt_strokes[:, :1]
sketch = th.cat([sos, out["decoded_sketch"]], 1)
vae_im = out["decoded_im"]
# start = time.time()
sketch_im = rendering.opacityStroke2diffvg(
sketch, canvas_size=self.raster_resolution, debug=False,
force_cpu=True, relative=not self.absolute_coords)
# elapsed = (time.time() - start)*1000
# print("out rendering took %.2fms" % elapsed)
vae_im_loss = self.im_loss(vae_im, gt_im)
sketch_im_loss = self.im_loss(sketch_im, gt_im)
# vae_im_loss = th.nn.functional.mse_loss(vae_im, gt_im)
# sketch_im_loss = th.nn.functional.mse_loss(sketch_im, gt_im)
loss = vae_im_loss + kl_loss*kl_weight + sketch_im_loss
self.im_enc_opt.zero_grad()
self.im_dec_opt.zero_grad()
self.sketch_dec_opt.zero_grad()
loss.backward()
# clip gradients
enc_nrm = th.nn.utils.clip_grad_norm_(
self.model.im_encoder.parameters(), self.grad_clip)
dec_nrm = th.nn.utils.clip_grad_norm_(
self.model.im_decoder.parameters(), self.grad_clip)
sketch_dec_nrm = th.nn.utils.clip_grad_norm_(
self.model.sketch_decoder.parameters(), self.grad_clip)
if enc_nrm > self.grad_clip:
LOG.debug("Clipped encoder gradient (%.5f) to %.2f",
enc_nrm, self.grad_clip)
if dec_nrm > self.grad_clip:
LOG.debug("Clipped decoder gradient (%.5f) to %.2f",
dec_nrm, self.grad_clip)
if sketch_dec_nrm > self.grad_clip:
LOG.debug("Clipped sketch decoder gradient (%.5f) to %.2f",
sketch_dec_nrm, self.grad_clip)
self.im_enc_opt.step()
self.im_dec_opt.step()
self.sketch_dec_opt.step()
return {
"vae_image": vae_im,
"sketch_image": sketch_im,
"gt_image": gt_im,
"loss": loss.item(),
"vae_im_loss": vae_im_loss.item(),
"sketch_im_loss": sketch_im_loss.item(),
"kl_loss": kl_loss.item(),
"kl_weight": kl_weight,
"lr": self.im_enc_opt.param_groups[0]["lr"],
}
def init_validation(self):
return dict(sample=None)
def validation_step(self, batch, running_data):
# Switch to eval mode for dropout, batchnorm, etc
# self.model.eval()
# with th.no_grad():
# # sample = self.model.sample(
# # batch.to(self.device), temperature=self.sampling_temperature)
# # running_data["sample"] = sample
# self.model.train()
return running_data
def train(args):
th.manual_seed(0)
np.random.seed(0)
dataset = data.FixedLengthQuickDrawDataset(
args.dataset, max_seq_length=args.sequence_length,
canvas_size=args.raster_resolution)
dataloader = DataLoader(
dataset, batch_size=args.bs, num_workers=args.workers, shuffle=True)
# val_dataset = [s for idx, s in enumerate(dataset) if idx < 8]
# val_dataloader = DataLoader(
# val_dataset, batch_size=8, num_workers=4, shuffle=False)
val_dataloader = None
model_params = {
"zdim": args.zdim,
"sequence_length": args.sequence_length,
"image_size": args.raster_resolution,
# "encoder_dim": args.encoder_dim,
# "decoder_dim": args.decoder_dim,
}
model = SketchVAE(**model_params)
model.train()
LOG.info("Model parameters:\n%s", model_params)
device = "cpu"
if th.cuda.is_available():
device = "cuda"
LOG.info("Using CUDA")
interface = Interface(model, raster_resolution=args.raster_resolution,
lr=args.lr, lr_decay=args.lr_decay,
kl_decay=args.kl_decay, kl_weight=args.kl_weight,
absolute_coords=args.absolute_coordinates,
device=device)
env_name = "sketch_vae"
if args.custom_name is not None:
env_name += "_" + args.custom_name
if args.absolute_coordinates:
env_name += "_abs_coords"
chkpt = os.path.join(OUTPUT, env_name)
# Resume from checkpoint, if any
checkpointer = ttools.Checkpointer(
chkpt, model, meta=model_params,
optimizers=interface.optimizers(),
schedulers=interface.schedulers)
extras, meta = checkpointer.load_latest()
epoch = extras["epoch"] if extras and "epoch" in extras.keys() else 0
if meta is not None and meta != model_params:
LOG.info("Checkpoint's metaparams differ "
"from CLI, aborting: %s and %s", meta, model_params)
trainer = ttools.Trainer(interface)
# Add callbacks
losses = ["loss", "kl_loss", "vae_im_loss", "sketch_im_loss"]
training_debug = ["lr", "kl_weight"]
trainer.add_callback(ttools.callbacks.ProgressBarCallback(
keys=losses, val_keys=None))
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=losses, val_keys=None, env=env_name, port=args.port))
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=training_debug, smoothing=0, val_keys=None, env=env_name,
port=args.port))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer, max_files=2, interval=600, max_epochs=10))
trainer.add_callback(
ttools.callbacks.LRSchedulerCallback(interface.schedulers))
trainer.add_callback(SketchVAECallback(
env=env_name, win="samples", port=args.port, frequency=args.freq))
# Start training
trainer.train(dataloader, starting_epoch=epoch,
val_dataloader=val_dataloader,
num_epochs=args.num_epochs)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--dataset", default="cat.npz")
parser.add_argument("--absolute_coordinates", action="store_true",
default=False)
parser.add_argument("--custom_name")
# Training params
parser.add_argument("--bs", type=int, default=1)
parser.add_argument("--workers", type=int, default=0)
parser.add_argument("--num_epochs", type=int, default=10000)
parser.add_argument("--lr", type=float, default=1e-4)
parser.add_argument("--lr_decay", type=float, default=0.9999)
parser.add_argument("--kl_weight", type=float, default=0.5)
parser.add_argument("--kl_decay", type=float, default=0.99995)
# Model configuration
parser.add_argument("--zdim", type=int, default=128)
parser.add_argument("--sequence_length", type=int, default=50)
parser.add_argument("--raster_resolution", type=int, default=64)
# parser.add_argument("--encoder_dim", type=int, default=256)
# parser.add_argument("--decoder_dim", type=int, default=512)
# Viz params
parser.add_argument("--freq", type=int, default=10)
parser.add_argument("--port", type=int, default=5000)
args = parser.parse_args()
pydiffvg.set_use_gpu(False)
train(args)

View File

@@ -0,0 +1,489 @@
#!/bin/env python
"""Train a GAN.
Usage:
* Train a MNIST model:
`python train_gan.py`
* Train a Quickdraw model:
`python train_gan.py --task quickdraw`
"""
import argparse
import os
import numpy as np
import torch as th
from torch.utils.data import DataLoader
import ttools
import ttools.interfaces
import losses
import data
import models
import pydiffvg
LOG = ttools.get_logger(__name__)
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
OUTPUT = os.path.join(BASE_DIR, "results")
class Callback(ttools.callbacks.ImageDisplayCallback):
"""Simple callback that visualize images."""
def visualized_image(self, batch, step_data, is_val=False):
if is_val:
return
gen = step_data["gen_image"][:16].detach()
ref = step_data["gt_image"][:16].detach()
# tensor to visualize, concatenate images
vizdata = th.cat([ref, gen], 2)
vector = step_data["vector_image"]
if vector is not None:
vector = vector[:16].detach()
vizdata = th.cat([vizdata, vector], 2)
vizdata = (vizdata + 1.0 ) * 0.5
viz = th.clamp(vizdata, 0, 1)
return viz
def caption(self, batch, step_data, is_val=False):
if step_data["vector_image"] is not None:
s = "top: real, middle: raster, bottom: vector"
else:
s = "top: real, bottom: fake"
return s
class Interface(ttools.ModelInterface):
def __init__(self, generator, vect_generator,
discriminator, vect_discriminator,
lr=1e-4, lr_decay=0.9999,
gradient_penalty=10,
wgan_gp=False,
raster_resolution=32, device="cpu", grad_clip=1.0):
super(Interface, self).__init__()
self.wgan_gp = wgan_gp
self.w_gradient_penalty = gradient_penalty
self.n_critic = 1
if self.wgan_gp:
self.n_critic = 5
self.grad_clip = grad_clip
self.raster_resolution = raster_resolution
self.gen = generator
self.vect_gen = vect_generator
self.discrim = discriminator
self.vect_discrim = vect_discriminator
self.device = device
self.gen.to(self.device)
self.discrim.to(self.device)
beta1 = 0.5
beta2 = 0.9
self.gen_opt = th.optim.Adam(
self.gen.parameters(), lr=lr, betas=(beta1, beta2))
self.discrim_opt = th.optim.Adam(
self.discrim.parameters(), lr=lr, betas=(beta1, beta2))
self.schedulers = [
th.optim.lr_scheduler.ExponentialLR(self.gen_opt, lr_decay),
th.optim.lr_scheduler.ExponentialLR(self.discrim_opt, lr_decay),
]
self.optimizers = [self.gen_opt, self.discrim_opt]
if self.vect_gen is not None:
assert self.vect_discrim is not None
self.vect_gen.to(self.device)
self.vect_discrim.to(self.device)
self.vect_gen_opt = th.optim.Adam(
self.vect_gen.parameters(), lr=lr, betas=(beta1, beta2))
self.vect_discrim_opt = th.optim.Adam(
self.vect_discrim.parameters(), lr=lr, betas=(beta1, beta2))
self.schedulers += [
th.optim.lr_scheduler.ExponentialLR(self.vect_gen_opt,
lr_decay),
th.optim.lr_scheduler.ExponentialLR(self.vect_discrim_opt,
lr_decay),
]
self.optimizers += [self.vect_gen_opt, self.vect_discrim_opt]
# include loss on alpha
self.im_loss = losses.MultiscaleMSELoss(channels=4).to(self.device)
self.iter = 0
self.cross_entropy = th.nn.BCEWithLogitsLoss()
self.mse = th.nn.MSELoss()
def _gradient_penalty(self, discrim, fake, real):
bs = real.size(0)
epsilon = th.rand(bs, 1, 1, 1, device=real.device)
epsilon = epsilon.expand_as(real)
interpolation = epsilon * real.data + (1 - epsilon) * fake.data
interpolation = th.autograd.Variable(interpolation, requires_grad=True)
interpolation_logits = discrim(interpolation)
grad_outputs = th.ones(interpolation_logits.size(), device=real.device)
gradients = th.autograd.grad(outputs=interpolation_logits,
inputs=interpolation,
grad_outputs=grad_outputs,
create_graph=True, retain_graph=True)[0]
gradients = gradients.view(bs, -1)
gradients_norm = th.sqrt(th.sum(gradients ** 2, dim=1) + 1e-12)
# [Tanh-Tung 2019] https://openreview.net/pdf?id=ByxPYjC5KQ
return self.w_gradient_penalty * ((gradients_norm - 0) ** 2).mean()
# return self.w_gradient_penalty * ((gradients_norm - 1) ** 2).mean()
def _discriminator_step(self, discrim, opt, fake, real):
"""Try to classify fake as 0 and real as 1."""
opt.zero_grad()
# no backprop to gen
fake = fake.detach()
fake_pred = discrim(fake)
real_pred = discrim(real)
if self.wgan_gp:
gradient_penalty = self._gradient_penalty(discrim, fake, real)
loss_d = fake_pred.mean() - real_pred.mean() + gradient_penalty
gradient_penalty = gradient_penalty.item()
else:
fake_loss = self.cross_entropy(fake_pred, th.zeros_like(fake_pred))
real_loss = self.cross_entropy(real_pred, th.ones_like(real_pred))
# fake_loss = self.mse(fake_pred, th.zeros_like(fake_pred))
# real_loss = self.mse(real_pred, th.ones_like(real_pred))
loss_d = 0.5*(fake_loss + real_loss)
gradient_penalty = None
loss_d.backward()
nrm = th.nn.utils.clip_grad_norm_(
discrim.parameters(), self.grad_clip)
if nrm > self.grad_clip:
LOG.debug("Clipped discriminator gradient (%.5f) to %.2f",
nrm, self.grad_clip)
opt.step()
return loss_d.item(), gradient_penalty
def _generator_step(self, gen, discrim, opt, fake):
"""Try to classify fake as 1."""
opt.zero_grad()
fake_pred = discrim(fake)
if self.wgan_gp:
loss_g = -fake_pred.mean()
else:
loss_g = self.cross_entropy(fake_pred, th.ones_like(fake_pred))
# loss_g = self.mse(fake_pred, th.ones_like(fake_pred))
loss_g.backward()
# clip gradients
nrm = th.nn.utils.clip_grad_norm_(
gen.parameters(), self.grad_clip)
if nrm > self.grad_clip:
LOG.debug("Clipped generator gradient (%.5f) to %.2f",
nrm, self.grad_clip)
opt.step()
return loss_g.item()
def training_step(self, batch):
im = batch
im = im.to(self.device)
z = self.gen.sample_z(im.shape[0], device=self.device)
generated = self.gen(z)
vect_generated = None
if self.vect_gen is not None:
vect_generated = self.vect_gen(z)
loss_g = None
loss_d = None
loss_g_vect = None
loss_d_vect = None
gp = None
gp_vect = None
if self.iter < self.n_critic: # Discriminator update
self.iter += 1
loss_d, gp = self._discriminator_step(
self.discrim, self.discrim_opt, generated, im)
if vect_generated is not None:
loss_d_vect, gp_vect = self._discriminator_step(
self.vect_discrim, self.vect_discrim_opt, vect_generated, im)
else: # Generator update
self.iter = 0
loss_g = self._generator_step(
self.gen, self.discrim, self.gen_opt, generated)
if vect_generated is not None:
loss_g_vect = self._generator_step(
self.vect_gen, self.vect_discrim, self.vect_gen_opt, vect_generated)
return {
"loss_g": loss_g,
"loss_d": loss_d,
"loss_g_vect": loss_g_vect,
"loss_d_vect": loss_d_vect,
"gp": gp,
"gp_vect": gp_vect,
"gt_image": im,
"gen_image": generated,
"vector_image": vect_generated,
"lr": self.gen_opt.param_groups[0]["lr"],
}
def init_validation(self):
return dict(sample=None)
def validation_step(self, batch, running_data):
# Switch to eval mode for dropout, batchnorm, etc
self.model.eval()
return running_data
def train(args):
th.manual_seed(0)
np.random.seed(0)
color_output = False
if args.task == "mnist":
dataset = data.MNISTDataset(args.raster_resolution, train=True)
elif args.task == "quickdraw":
dataset = data.QuickDrawImageDataset(
args.raster_resolution, train=True)
else:
raise NotImplementedError()
dataloader = DataLoader(
dataset, batch_size=args.bs, num_workers=args.workers, shuffle=True)
val_dataloader = None
model_params = {
"zdim": args.zdim,
"num_strokes": args.num_strokes,
"imsize": args.raster_resolution,
"stroke_width": args.stroke_width,
"color_output": color_output,
}
gen = models.Generator(**model_params)
gen.train()
discrim = models.Discriminator(color_output=color_output)
discrim.train()
if args.raster_only:
vect_gen = None
vect_discrim = None
else:
if args.generator == "fc":
vect_gen = models.VectorGenerator(**model_params)
elif args.generator == "bezier_fc":
vect_gen = models.BezierVectorGenerator(**model_params)
elif args.generator in ["rnn"]:
vect_gen = models.RNNVectorGenerator(**model_params)
elif args.generator in ["chain_rnn"]:
vect_gen = models.ChainRNNVectorGenerator(**model_params)
else:
raise NotImplementedError()
vect_gen.train()
vect_discrim = models.Discriminator(color_output=color_output)
vect_discrim.train()
LOG.info("Model parameters:\n%s", model_params)
device = "cpu"
if th.cuda.is_available():
device = "cuda"
LOG.info("Using CUDA")
interface = Interface(gen, vect_gen, discrim, vect_discrim,
raster_resolution=args.raster_resolution, lr=args.lr,
wgan_gp=args.wgan_gp,
lr_decay=args.lr_decay, device=device)
env_name = args.task + "_gan"
if args.raster_only:
env_name += "_raster"
else:
env_name += "_vector"
env_name += "_" + args.generator
if args.wgan_gp:
env_name += "_wgan"
chkpt = os.path.join(OUTPUT, env_name)
meta = {
"model_params": model_params,
"task": args.task,
"generator": args.generator,
}
checkpointer = ttools.Checkpointer(
chkpt, gen, meta=meta,
optimizers=interface.optimizers,
schedulers=interface.schedulers,
prefix="g_")
checkpointer_d = ttools.Checkpointer(
chkpt, discrim,
prefix="d_")
# Resume from checkpoint, if any
extras, _ = checkpointer.load_latest()
checkpointer_d.load_latest()
if not args.raster_only:
checkpointer_vect = ttools.Checkpointer(
chkpt, vect_gen, meta=meta,
optimizers=interface.optimizers,
schedulers=interface.schedulers,
prefix="vect_g_")
checkpointer_d_vect = ttools.Checkpointer(
chkpt, vect_discrim,
prefix="vect_d_")
extras, _ = checkpointer_vect.load_latest()
checkpointer_d_vect.load_latest()
epoch = extras["epoch"] if extras and "epoch" in extras.keys() else 0
# if meta is not None and meta["model_parameters"] != model_params:
# LOG.info("Checkpoint's metaparams differ "
# "from CLI, aborting: %s and %s", meta, model_params)
trainer = ttools.Trainer(interface)
# Add callbacks
losses = ["loss_g", "loss_d", "loss_g_vect", "loss_d_vect", "gp",
"gp_vect"]
training_debug = ["lr"]
trainer.add_callback(Callback(
env=env_name, win="samples", port=args.port, frequency=args.freq))
trainer.add_callback(ttools.callbacks.ProgressBarCallback(
keys=losses, val_keys=None))
trainer.add_callback(ttools.callbacks.MultiPlotCallback(
keys=losses, val_keys=None, env=env_name, port=args.port,
server=args.server, base_url=args.base_url,
win="losses", frequency=args.freq))
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=training_debug, smoothing=0, val_keys=None, env=env_name,
server=args.server, base_url=args.base_url,
port=args.port))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer, max_files=2, interval=600, max_epochs=10))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer_d, max_files=2, interval=600, max_epochs=10))
if not args.raster_only:
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer_vect, max_files=2, interval=600, max_epochs=10))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(
checkpointer_d_vect, max_files=2, interval=600, max_epochs=10))
trainer.add_callback(
ttools.callbacks.LRSchedulerCallback(interface.schedulers))
# Start training
trainer.train(dataloader, starting_epoch=epoch,
val_dataloader=val_dataloader,
num_epochs=args.num_epochs)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--task",
default="mnist",
choices=["mnist", "quickdraw"])
parser.add_argument("--generator",
default="bezier_fc",
choices=["bezier_fc", "fc", "rnn", "chain_rnn"],
help="model to use as generator")
parser.add_argument("--raster_only", action="store_true", default=False,
help="if true only train the raster baseline")
parser.add_argument("--standard_gan", dest="wgan_gp", action="store_false",
default=True,
help="if true, use regular GAN instead of WGAN")
# Training params
parser.add_argument("--bs", type=int, default=4, help="batch size")
parser.add_argument("--workers", type=int, default=4,
help="number of dataloader threads")
parser.add_argument("--num_epochs", type=int, default=200,
help="number of epochs to train for")
parser.add_argument("--lr", type=float, default=1e-4,
help="learning rate")
parser.add_argument("--lr_decay", type=float, default=0.9999,
help="exponential learning rate decay rate")
# Model configuration
parser.add_argument("--zdim", type=int, default=32,
help="latent space dimension")
parser.add_argument("--stroke_width", type=float, nargs=2,
default=(0.5, 1.5),
help="min and max stroke width")
parser.add_argument("--num_strokes", type=int, default=16,
help="number of strokes to generate")
parser.add_argument("--raster_resolution", type=int, default=32,
help="raster canvas resolution on each side")
# Viz params
parser.add_argument("--freq", type=int, default=10,
help="visualization frequency")
parser.add_argument("--port", type=int, default=8097,
help="visdom port")
parser.add_argument("--server", default=None,
help="visdom server if not local.")
parser.add_argument("--base_url", default="", help="visdom entrypoint URL")
args = parser.parse_args()
pydiffvg.set_use_gpu(False)
ttools.set_logger(False)
train(args)

226
apps/geometry.py Normal file
View File

@@ -0,0 +1,226 @@
import math
import torch
class GeometryLoss:
def __init__(self, pathObj, xyalign=True, parallel=True, smooth_node=True):
self.pathObj=pathObj
self.pathId=pathObj.id
self.get_segments(pathObj)
if xyalign:
self.make_hor_ver_constraints(pathObj)
self.xyalign=xyalign
self.parallel=parallel
self.smooth_node=smooth_node
if parallel:
self.make_parallel_constraints(pathObj)
if smooth_node:
self.make_smoothness_constraints(pathObj)
def make_smoothness_constraints(self,pathObj):
self.smooth_nodes=[]
for idx, node in enumerate(self.iterate_nodes()):
sm, t0, t1=self.node_smoothness(node,pathObj)
if abs(sm)<1e-2:
self.smooth_nodes.append((node,((t0.norm()/self.segment_approx_length(node[0],pathObj)).item(),(t1.norm()/self.segment_approx_length(node[1],pathObj)).item())))
#print("Node {} is smooth (smoothness {})".format(idx,sm))
else:
#print("Node {} is not smooth (smoothness {})".format(idx, sm))
pass
def node_smoothness(self,node,pathObj):
t0=self.tangent_out(node[0],pathObj)
t1=self.tangent_in(node[1],pathObj)
t1rot=torch.stack((-t1[1],t1[0]))
smoothness=t0.dot(t1rot)/(t0.norm()*t1.norm())
return smoothness, t0, t1
def segment_approx_length(self,segment,pathObj):
if segment[0]==0:
#line
idxs=self.segList[segment[0]][segment[1]]
#should have a pair of indices now
length=(pathObj.points[idxs[1],:]-pathObj.points[idxs[0],:]).norm()
return length
elif segment[0]==1:
#quadric
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
length = (pathObj.points[idxs[1],:] - pathObj.points[idxs[0],:]).norm()+(pathObj.points[idxs[2],:] - pathObj.points[idxs[1],:]).norm()
return length
elif segment[0]==2:
#cubic
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
length = (pathObj.points[idxs[1],:] - pathObj.points[idxs[0],:]).norm()+(pathObj.points[idxs[2],:] - pathObj.points[idxs[1],:]).norm()+(pathObj.points[idxs[3],:] - pathObj.points[idxs[2],:]).norm()
return length
def tangent_in(self, segment,pathObj):
if segment[0]==0:
#line
idxs=self.segList[segment[0]][segment[1]]
#should have a pair of indices now
tangent=(pathObj.points[idxs[1],:]-pathObj.points[idxs[0],:])/2
return tangent
elif segment[0]==1:
#quadric
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
tangent = (pathObj.points[idxs[1],:] - pathObj.points[idxs[0],:])
return tangent
elif segment[0]==2:
#cubic
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
tangent = (pathObj.points[idxs[1],:] - pathObj.points[idxs[0],:])
return tangent
assert(False)
def tangent_out(self, segment, pathObj):
if segment[0] == 0:
# line
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
tangent = (pathObj.points[idxs[0],:] - pathObj.points[idxs[1],:]) / 2
return tangent
elif segment[0] == 1:
# quadric
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
tangent = (pathObj.points[idxs[1],:] - pathObj.points[idxs[2],:])
return tangent
elif segment[0] == 2:
# cubic
idxs = self.segList[segment[0]][segment[1]]
# should have a pair of indices now
tangent = (pathObj.points[idxs[2],:] - pathObj.points[idxs[3],:])
return tangent
assert (False)
def get_segments(self, pathObj):
self.segments=[]
self.lines = []
self.quadrics=[]
self.cubics=[]
self.segList =(self.lines,self.quadrics,self.cubics)
idx=0
total_points=pathObj.points.shape[0]
for ncp in pathObj.num_control_points.numpy():
if ncp==0:
self.segments.append((0,len(self.lines)))
self.lines.append((idx, (idx + 1) % total_points))
idx+=1
elif ncp==1:
self.segments.append((1, len(self.quadrics)))
self.quadrics.append((idx, (idx + 1), (idx+2) % total_points))
idx+=ncp+1
elif ncp==2:
self.segments.append((2, len(self.cubics)))
self.cubics.append((idx, (idx + 1), (idx+2), (idx + 3) % total_points))
idx += ncp + 1
def iterate_nodes(self):
for prev, next in zip([self.segments[-1]]+self.segments[:-1],self.segments):
yield (prev, next)
def make_hor_ver_constraints(self, pathObj):
self.horizontals=[]
self.verticals=[]
for idx, line in enumerate(self.lines):
startPt=pathObj.points[line[0],:]
endPt=pathObj.points[line[1],:]
dif=endPt-startPt
if abs(dif[0])<1e-6:
#is horizontal
self.horizontals.append(idx)
if abs(dif[1])<1e-6:
#is vertical
self.verticals.append(idx)
def make_parallel_constraints(self,pathObj):
slopes=[]
for lidx, line in enumerate(self.lines):
startPt = pathObj.points[line[0], :]
endPt = pathObj.points[line[1], :]
dif = endPt - startPt
slope=math.atan2(dif[1],dif[0])
if slope<0:
slope+=math.pi
minidx=-1
for idx, s in enumerate(slopes):
if abs(s[0]-slope)<1e-3:
minidx=idx
break
if minidx>=0:
slopes[minidx][1].append(lidx)
else:
slopes.append((slope,[lidx]))
self.parallel_groups=[sgroup[1] for sgroup in slopes if len(sgroup[1])>1 and (not self.xyalign or (sgroup[0]>1e-3 and abs(sgroup[0]-(math.pi/2))>1e-3))]
def make_line_diff(self,pathObj,lidx):
line = self.lines[lidx]
startPt = pathObj.points[line[0], :]
endPt = pathObj.points[line[1], :]
dif = endPt - startPt
return dif
def calc_hor_ver_loss(self,loss,pathObj):
for lidx in self.horizontals:
dif = self.make_line_diff(pathObj,lidx)
loss+=dif[0].pow(2)
for lidx in self.verticals:
dif = self.make_line_diff(pathObj,lidx)
loss += dif[1].pow(2)
def calc_parallel_loss(self,loss,pathObj):
for group in self.parallel_groups:
diffs=[self.make_line_diff(pathObj,lidx) for lidx in group]
difmat=torch.stack(diffs,1)
lengths=difmat.pow(2).sum(dim=0).sqrt()
difmat=difmat/lengths
difmat=torch.cat((difmat,torch.zeros(1,difmat.shape[1])))
rotmat=difmat[:,list(range(1,difmat.shape[1]))+[0]]
cross=difmat.cross(rotmat)
ploss=cross.pow(2).sum()*lengths.sum()*10
loss+=ploss
def calc_smoothness_loss(self,loss,pathObj):
for node, tlengths in self.smooth_nodes:
sl,t0,t1=self.node_smoothness(node,pathObj)
#add smoothness loss
loss+=sl.pow(2)*t0.norm().sqrt()*t1.norm().sqrt()
tl=((t0.norm()/self.segment_approx_length(node[0],pathObj))-tlengths[0]).pow(2)+((t1.norm()/self.segment_approx_length(node[1],pathObj))-tlengths[1]).pow(2)
loss+=tl*10
def compute(self, pathObj):
if pathObj.id != self.pathId:
raise ValueError("Path ID {} does not match construction-time ID {}".format(pathObj.id,self.pathId))
loss=torch.tensor(0.)
if self.xyalign:
self.calc_hor_ver_loss(loss,pathObj)
if self.parallel:
self.calc_parallel_loss(loss, pathObj)
if self.smooth_node:
self.calc_smoothness_loss(loss,pathObj)
#print(loss.item())
return loss

45
apps/image_compare.py Normal file
View File

@@ -0,0 +1,45 @@
import argparse
import skimage.io
import numpy as np
from matplotlib import cm
import math
from skimage.metrics import structural_similarity as ssim
def normalize(x, min_, max_):
return (x - min_) / (max_ - min_)
def main(args):
img1 = skimage.img_as_float(skimage.io.imread(args.img1)).astype(np.float32)
img2 = skimage.img_as_float(skimage.io.imread(args.img2)).astype(np.float32)
ref = skimage.img_as_float(skimage.io.imread(args.ref)).astype(np.float32)
img1 = img1[:, :, :3]
img2 = img2[:, :, :3]
ref = ref[:, :, :3]
diff1 = np.sum(np.abs(img1 - ref), axis = 2)
diff2 = np.sum(np.abs(img2 - ref), axis = 2)
min_ = min(np.min(diff1), np.min(diff2))
max_ = max(np.max(diff1), np.max(diff2)) * 0.5
diff1 = cm.viridis(normalize(diff1, min_, max_))
diff2 = cm.viridis(normalize(diff2, min_, max_))
# MSE
print('MSE img1:', np.mean(np.power(img1 - ref, 2.0)))
print('MSE img2:', np.mean(np.power(img2 - ref, 2.0)))
# PSNR
print('PSNR img1:', 20 * math.log10(1.0 / math.sqrt(np.mean(np.power(img1 - ref, 2.0)))))
print('PSNR img2:', 20 * math.log10(1.0 / math.sqrt(np.mean(np.power(img2 - ref, 2.0)))))
# SSIM
print('SSIM img1:', ssim(img1, ref, multichannel=True))
print('SSIM img2:', ssim(img2, ref, multichannel=True))
skimage.io.imsave('diff1.png', (diff1 * 255).astype(np.uint8))
skimage.io.imsave('diff2.png', (diff2 * 255).astype(np.uint8))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("img1", help="img1")
parser.add_argument("img2", help="img2")
parser.add_argument("ref", help="ref")
args = parser.parse_args()
main(args)

BIN
apps/imgs/baboon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 KiB

8694
apps/imgs/baboon.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 852 KiB

1936
apps/imgs/boston.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.6 MiB

12
apps/imgs/circle.svg Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?>
<svg
viewBox="0 0 256 256"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1">
<circle cx="128" cy="128" r="60" fill="rgb(74,151,74)"/>
</svg>

After

Width:  |  Height:  |  Size: 403 B

53256
apps/imgs/contour.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 8.0 MiB

View File

@@ -0,0 +1,247 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="450" height="450" id="svg4204" sodipodi:version="0.32" inkscape:version="0.45.1" version="1.0" sodipodi:docbase="C:\briantemp" sodipodi:docname="eleven_below_single.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-filename="C:\briantemp\eleven_below375.png" inkscape:export-xdpi="75" inkscape:export-ydpi="75">
<defs id="defs4206"/>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.5355556" inkscape:cx="225.00001" inkscape:cy="225.00001" inkscape:document-units="px" inkscape:current-layer="layer1" width="5in" height="5in" units="in" borderlayer="true" inkscape:window-width="901" inkscape:window-height="871" inkscape:window-x="349" inkscape:window-y="62"/>
<metadata id="metadata4209">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1">
<rect style="opacity: 0.98; fill: rgb(38, 41, 41); fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 2.48918; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="rect5485" width="455.72485" y="-2.7029696" x="-2.16484" height="455.72485"/>
<path style="opacity: 1; fill: rgb(82, 85, 82); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 274.79281,-33.24459 C 207.79845,-32.312266 127.49204,-30.926239 61.563433,-28.705492 C 55.490502,-16.21861 49.484206,-4.7721335 51.746001,15.237527 C 54.003564,35.209925 47.162993,72.021513 52.592945,103.0358 C 59.217479,140.87305 78.876613,135.97295 88.096119,189.63971 C 92.095338,212.91924 103.64813,241.48384 126.01071,275.72296 C 136.07168,292.70209 145.65371,326.606 153.78714,339.39597 C 170.90569,366.31534 222.58914,377.43193 256.27953,356.40252 C 273.94718,344.66841 297.60666,345.32118 314.62785,332.35001 C 329.52444,322.63662 347.5677,318.61945 364.80043,322.62664 C 389.60228,318.88927 404.55706,303.27275 415.88588,284.23658 C 430.10406,257.21431 428.54941,221.10342 435.86077,192.16558 C 448.49895,142.14451 473.44627,131.06251 466.25512,77.142831 C 466.01967,51.089836 475.15437,-8.5057813 474.62739,-34.566966 C 408.01583,-34.126183 341.40431,-33.685373 274.79281,-33.24459 z " id="path5487" sodipodi:nodetypes="ccssscsccccsccc"/>
<path style="opacity: 0.774725; fill: rgb(158, 167, 169); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5489" sodipodi:nodetypes="cssssccs" d="M 147.92524,222.36511 C 136.64408,269.76777 152.40281,293.39674 170.09747,317.27166 C 184.49069,336.69201 204.31909,333.73715 220.43449,327.8862 C 238.2209,321.42862 236.40713,290.44012 252.19476,276.06223 C 265.33177,264.09819 278.7923,287.53088 296.53927,270.44276 C 305.58586,261.73204 308.47455,239.25395 306.42143,229.19724 L 154.51697,206.13111 C 154.51697,206.13111 149.65176,215.11024 147.92524,222.36511 z "/>
<path style="opacity: 1; fill: rgb(0, 0, 0); fill-opacity: 0.282051; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 271.73611,238.71072 L 409.20101,265.77641 C 415.47631,267.01197 418.69357,262.49033 418.72857,259.36744 L 421.74564,-9.7737205 L 408.38792,-7.1822085 L 404.93258,253.69545 L 246.85232,227.77201 C 252.76676,231.18022 262.86785,236.96463 271.73611,238.71072 z " id="path5491" sodipodi:nodetypes="cssccccs"/>
<path style="opacity: 0.98; fill: rgb(141, 79, 52); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 106.38171,-8.2103906 L 110.64629,206.55922 L 409.434,258.85975 L 411.58947,-8.5140455 L 106.38171,-8.2103906 z " sodipodi:nodetypes="ccccc" id="path5493"/>
<path style="opacity: 1; fill: rgb(59, 46, 40); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5495" sodipodi:nodetypes="ccccccsc" d="M 229.8243,207.72421 L 392.82133,234.01408 L 396.32664,-7.8525452 L 412.97687,-6.9762293 L 409.87477,259.76086 L 333.59429,245.5018 C 289.17185,238.59114 269.1057,225.07498 249.5724,222.14143 C 236.40417,220.1638 231.14859,216.96234 229.8243,207.72421 z "/>
<path style="opacity: 1; fill: rgb(74, 52, 43); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5497" sodipodi:nodetypes="ccccccc" d="M 176.1448,197.92315 C 175.36148,202.22728 171.64671,206.29067 162.2616,205.68142 C 144.20672,204.09484 122.51871,202.12381 110.40373,207.31475 L 106.32046,-9.5081005 L 120.61197,-8.2830996 L 131.22853,188.12324 L 176.1448,197.92315 z "/>
<path style="fill: rgb(229, 238, 251); fill-opacity: 1; fill-rule: evenodd; stroke: rgb(231, 196, 141); stroke-width: 2.48918px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 120.24277,-7.3717346 L 122.71555,190.27487 L 392.20243,236.42435 L 395.10615,-8.2095686 L 120.24277,-7.3717346 z " sodipodi:nodetypes="ccccc" id="path5499"/>
<g transform="matrix(2.48918, 0, 0, 2.48918, -696.455, -157.004)" id="g5501" style="fill: rgb(202, 219, 233); fill-opacity: 1; display: inline;">
<path style="opacity: 0.99; fill: rgb(202, 219, 233); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" id="path5503" d="M 375.9353,86.229728 C 375.1963,86.081928 373.86216,81.088388 372.01522,80.349611 C 368.9777,79.134601 366.32251,77.210683 363.39106,76.233531 C 360.71593,75.341821 360.01465,72.389287 357.51094,71.137432 C 354.10982,69.436872 349.52858,70.9126 345.94672,69.569402 C 343.33559,68.590228 342.06468,68.197375 338.89058,68.197375 C 338.10657,68.197375 337.32255,68.197375 336.53853,68.197375 C 334.53614,68.197375 335.67253,70.846628 337.12655,71.137432 C 339.496,71.611322 340.68869,71.290821 342.81066,72.705463 C 344.92214,74.113116 347.11362,74.170931 349.27878,75.253512 C 350.40369,75.815966 353.25167,75.46712 354.37488,75.841524 C 355.53122,76.226971 358.84603,78.940641 359.66698,79.7616 C 361.27866,81.373271 363.73647,82.067049 365.15509,83.485668 C 366.86807,85.198648 367.58412,86.072218 369.46717,87.013738 C 371.32896,87.944638 373.50063,87.993758 375.54329,87.993758 C 376.13804,87.993758 375.95807,86.320818 375.9353,86.229728 z "/>
<path style="opacity: 0.99; fill: rgb(202, 219, 233); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" id="path5505" d="M 437.17772,134.20944 C 435.96905,134.69291 436.79841,131.8562 436.10847,130.75229 C 434.56987,128.29053 432.87308,124.03585 431.79638,121.3441 C 431.66572,121.01743 431.53505,120.69076 431.40438,120.36409 C 430.48847,118.07431 428.2878,116.48036 425.91627,115.46399 C 421.47248,113.55951 418.25691,109.62147 414.54805,106.83982 C 414.28671,106.64382 414.02537,106.44782 413.76403,106.25181 C 410.88742,104.09435 406.97791,102.43974 403.76784,101.15571 C 399.26049,99.35277 395.86063,97.810236 391.02759,96.843629 C 388.66778,96.371666 385.71484,93.810733 383.77545,94.295579 C 378.49287,95.616225 377.30733,95.68121 377.30733,89.787492 C 377.30733,88.278834 375.08402,86.707135 374.75928,85.0834 C 374.51101,83.842041 380.51786,83.496751 381.2274,83.319366 C 381.57569,83.232294 389.2567,84.96004 390.24358,85.0834 C 395.16333,85.698369 400.5684,85.0834 405.53187,85.0834 C 410.64208,85.0834 413.92624,85.743053 418.46813,86.651431 C 420.72945,87.103696 422.26804,88.042418 424.54424,88.611469 C 428.17561,89.519311 433.30944,90.320532 435.91246,92.923552 C 436.25099,93.262081 437.00313,93.569629 437.69286,93.832232 L 437.54996,102.61328 C 436.48977,101.9671 434.94407,100.96552 434.14843,100.5677 C 430.93113,98.959052 427.10914,98.81209 423.95623,97.235636 C 421.76639,96.140715 419.3009,96.279996 417.2921,95.275598 C 415.25721,94.258153 412.0191,94.643361 409.84396,94.099575 C 408.20454,93.689722 406.64896,93.31556 405.13987,93.31556 C 403.18129,93.31556 399.66503,93.700934 399.65176,93.707568 C 398.44705,94.309923 402.17112,94.673243 403.37583,95.275598 C 404.81628,95.99582 406.90431,96.647728 408.47193,97.039632 C 413.04662,98.183304 418.07329,101.5461 422.1922,103.89977 C 429.24212,107.92829 426.72592,107.36994 432.18839,111.73992 C 434.17625,113.33021 435.89874,114.59318 437.32816,116.5567" sodipodi:nodetypes="csssssssssssssssssccsssssssssss"/>
</g>
<g id="g5507" transform="matrix(2.48918, 0, 0, 2.48918, -696.455, -156.442)" style="fill: rgb(172, 195, 213); fill-opacity: 1; display: inline;">
<path id="path5509" sodipodi:nodetypes="ccccc" d="M 366.65049,143.01487 L 376.74352,144.57777 L 378.36509,143.51616 L 368.65848,141.96468 L 366.65049,143.01487 z " style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;"/>
<path id="path5511" sodipodi:nodetypes="ccccc" d="M 366.6151,55.021895 L 376.65273,53.416911 L 378.29851,51.779093 L 368.65428,53.31924 L 366.6151,55.021895 z " style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<g id="g5513" style="fill: rgb(172, 195, 213); fill-opacity: 1;">
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64948,140.50079 C 366.64948,140.50079 374.77754,141.66914 376.43538,141.92586 C 376.63136,141.95621 376.74355,141.97056 376.74756,141.96657 C 376.76012,141.95407 378.36149,140.89679 378.36311,140.89518 C 378.36316,140.89513 378.36189,140.89489 378.35933,140.89448 C 378.16709,140.86376 370.56536,139.73676 368.96506,139.48098 C 368.76853,139.44956 368.65555,139.4343 368.65116,139.43797 C 368.63557,139.45098 366.64948,140.50079 366.64948,140.50079 C 366.64948,140.50079 366.64948,140.50079 366.64948,140.50079" id="path5515"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64847,137.9867 C 366.64847,137.9867 374.83269,139.07349 376.44178,139.32266 C 376.63199,139.35211 376.74358,139.36335 376.75161,139.35537 C 376.77672,139.33038 378.35789,138.27743 378.36113,138.2742 C 378.36123,138.2741 378.36003,138.27384 378.35754,138.27344 C 378.17096,138.24362 370.50916,137.19507 368.95592,136.94681 C 368.76517,136.91632 368.65261,136.90392 368.64383,136.91125 C 368.61266,136.93729 366.64847,137.9867 366.64847,137.9867 C 366.64847,137.9867 366.64847,137.9867 366.64847,137.9867" id="path5517"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64746,135.47261 C 366.64746,135.47261 374.88784,136.47784 376.44817,136.71945 C 376.63261,136.74801 376.74362,136.75614 376.75565,136.74417 C 376.79332,136.70668 378.35428,135.65806 378.35915,135.65322 C 378.3593,135.65306 378.35816,135.65279 378.35576,135.6524 C 378.17482,135.62348 370.45295,134.65338 368.94678,134.41264 C 368.76181,134.38307 368.64968,134.37355 368.63651,134.38454 C 368.58975,134.42359 366.64746,135.47261 366.64746,135.47261 C 366.64746,135.47261 366.64746,135.47261 366.64746,135.47261" id="path5519"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64645,132.95853 C 366.64645,132.95853 374.943,133.88218 376.45456,134.11625 C 376.63324,134.14392 376.74365,134.14893 376.75969,134.13296 C 376.80992,134.08298 378.35068,133.03869 378.35716,133.03224 C 378.35737,133.03203 378.3563,133.03174 378.35397,133.03136 C 378.17869,133.00335 370.39674,132.11169 368.93764,131.87847 C 368.75845,131.84983 368.64675,131.84317 368.62919,131.85783 C 368.56684,131.90989 366.64645,132.95853 366.64645,132.95853 C 366.64645,132.95853 366.64645,132.95853 366.64645,132.95853" id="path5521"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64543,130.44445 C 366.64543,130.44445 374.99815,131.28653 376.46095,131.51304 C 376.63387,131.53982 376.74368,131.54172 376.76374,131.52176 C 376.82652,131.45928 378.34708,130.41932 378.35518,130.41126 C 378.35544,130.411 378.35444,130.41068 378.35218,130.41032 C 378.18255,130.38321 370.34053,129.57 368.9285,129.3443 C 368.75509,129.31658 368.64382,129.31279 368.62187,129.33112 C 368.54393,129.39619 366.64543,130.44445 366.64543,130.44445 C 366.64543,130.44445 366.64543,130.44445 366.64543,130.44445" id="path5523"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64442,127.93036 C 366.64442,127.93036 375.0533,128.69087 376.46735,128.90984 C 376.6345,128.93572 376.74371,128.93451 376.76778,128.91056 C 376.84312,128.83559 378.34348,127.79996 378.3532,127.79028 C 378.35352,127.78997 378.35257,127.78963 378.35039,127.78928 C 378.18642,127.76307 370.28432,127.0283 368.91936,126.81013 C 368.75173,126.78334 368.64088,126.78241 368.61454,126.8044 C 368.52102,126.8825 366.64442,127.93036 366.64442,127.93036 C 366.64442,127.93036 366.64442,127.93036 366.64442,127.93036" id="path5525"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64341,125.41628 C 366.64341,125.41628 375.10845,126.09522 376.47374,126.30663 C 376.63513,126.33163 376.74375,126.3273 376.77182,126.29936 C 376.85972,126.21189 378.33988,125.18059 378.35122,125.1693 C 378.35159,125.16893 378.35071,125.16858 378.3486,125.16824 C 378.19028,125.14293 370.22811,124.48661 368.91022,124.27596 C 368.74837,124.25009 368.63795,124.25203 368.60722,124.27769 C 368.49811,124.3688 366.64341,125.41628 366.64341,125.41628 C 366.64341,125.41628 366.64341,125.41628 366.64341,125.41628" id="path5527"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.6424,122.90219 C 366.6424,122.90219 375.16361,123.49957 376.48013,123.70343 C 376.63576,123.72753 376.74378,123.72009 376.77587,123.68816 C 376.87632,123.58819 378.33627,122.56122 378.34924,122.54832 C 378.34966,122.5479 378.34884,122.54752 378.34681,122.5472 C 378.19415,122.5228 370.17191,121.94492 368.90108,121.74179 C 368.74501,121.71685 368.63502,121.72165 368.5999,121.75098 C 368.47519,121.8551 366.6424,122.90219 366.6424,122.90219 C 366.6424,122.90219 366.6424,122.90219 366.6424,122.90219" id="path5529"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64139,120.38811 C 366.64139,120.38811 375.21876,120.90391 376.48652,121.10023 C 376.63639,121.12343 376.74381,121.11288 376.77991,121.07696 C 376.89292,120.9645 378.33267,119.94185 378.34726,119.92734 C 378.34773,119.92687 378.34698,119.92647 378.34502,119.92616 C 378.19801,119.90266 370.1157,119.40323 368.89194,119.20763 C 368.74165,119.1836 368.63208,119.19128 368.59258,119.22426 C 368.45228,119.3414 366.64139,120.38811 366.64139,120.38811 C 366.64139,120.38811 366.64139,120.38811 366.64139,120.38811" id="path5531"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.64038,117.87402 C 366.64038,117.87402 375.27391,118.30826 376.49292,118.49702 C 376.63701,118.51933 376.74384,118.50567 376.78395,118.46576 C 376.90952,118.3408 378.32907,117.32249 378.34528,117.30636 C 378.3458,117.30584 378.34512,117.30542 378.34323,117.30512 C 378.20188,117.28252 370.05949,116.86154 368.8828,116.67346 C 368.73829,116.65036 368.62915,116.6609 368.58525,116.69755 C 368.42937,116.82771 366.64038,117.87402 366.64038,117.87402 C 366.64038,117.87402 366.64038,117.87402 366.64038,117.87402" id="path5533"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63937,115.35993 C 366.63937,115.35993 375.32906,115.71261 376.49931,115.89382 C 376.63764,115.91524 376.74387,115.89847 376.788,115.85456 C 376.92612,115.7171 378.32547,114.70312 378.3433,114.68538 C 378.34387,114.6848 378.34325,114.68436 378.34144,114.68408 C 378.20574,114.66239 370.00328,114.31985 368.87366,114.13929 C 368.73493,114.11712 368.62622,114.13052 368.57793,114.17084 C 368.40646,114.31401 366.63937,115.35993 366.63937,115.35993 C 366.63937,115.35993 366.63937,115.35993 366.63937,115.35993" id="path5535"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63836,112.84585 C 366.63836,112.84585 375.38422,113.11695 376.5057,113.29061 C 376.63827,113.31114 376.74391,113.29126 376.79204,113.24335 C 376.94272,113.0934 378.32186,112.08375 378.34131,112.0644 C 378.34194,112.06377 378.34139,112.06331 378.33966,112.06303 C 378.20961,112.04225 369.94707,111.77815 368.86451,111.60512 C 368.73157,111.58387 368.62329,111.60014 368.57061,111.64412 C 368.38355,111.80031 366.63836,112.84585 366.63836,112.84585 C 366.63836,112.84585 366.63836,112.84585 366.63836,112.84585" id="path5537"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63735,110.33177 C 366.63735,110.33177 375.43937,110.5213 376.51209,110.68741 C 376.6389,110.70704 376.74394,110.68405 376.79608,110.63215 C 376.95932,110.46971 378.31826,109.46438 378.33933,109.44342 C 378.34001,109.44274 378.33952,109.44226 378.33787,109.44199 C 378.21348,109.42211 369.89086,109.23646 368.85537,109.07095 C 368.72821,109.05063 368.62035,109.06976 368.56329,109.11741 C 368.36064,109.28661 366.63735,110.33177 366.63735,110.33177 C 366.63735,110.33177 366.63735,110.33177 366.63735,110.33177" id="path5539"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63633,107.81768 C 366.63633,107.81768 375.49452,107.92564 376.51849,108.0842 C 376.63953,108.10295 376.74397,108.07684 376.80013,108.02095 C 376.97592,107.84601 378.31466,106.84502 378.33735,106.82243 C 378.33808,106.82171 378.33766,106.82121 378.33608,106.82095 C 378.21734,106.80197 369.83466,106.69477 368.84623,106.53678 C 368.72485,106.51738 368.61742,106.53939 368.55596,106.5907 C 368.33773,106.77292 366.63633,107.81768 366.63633,107.81768 C 366.63633,107.81768 366.63633,107.81768 366.63633,107.81768" id="path5541"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63532,105.3036 C 366.63532,105.3036 375.54968,105.32999 376.52488,105.481 C 376.64016,105.49885 376.744,105.46963 376.80417,105.40975 C 376.99252,105.22231 378.31106,104.22565 378.33537,104.20145 C 378.33615,104.20067 378.33579,104.20015 378.33429,104.19991 C 378.22121,104.18184 369.77845,104.15308 368.83709,104.00261 C 368.72149,103.98414 368.61449,104.00901 368.54864,104.06399 C 368.31482,104.25922 366.63532,105.3036 366.63532,105.3036 C 366.63532,105.3036 366.63532,105.3036 366.63532,105.3036" id="path5543"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63431,102.78951 C 366.63431,102.78951 375.60483,102.73434 376.53127,102.87779 C 376.64079,102.89475 376.74404,102.86242 376.80821,102.79855 C 377.00912,102.59861 378.30746,101.60628 378.33339,101.58047 C 378.33422,101.57964 378.33393,101.5791 378.3325,101.57887 C 378.22507,101.5617 369.72224,101.61139 368.82795,101.46845 C 368.71813,101.45089 368.61155,101.47863 368.54132,101.53727 C 368.29191,101.74552 366.63431,102.78951 366.63431,102.78951 C 366.63431,102.78951 366.63431,102.78951 366.63431,102.78951" id="path5545"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.6333,100.27543 C 366.6333,100.27543 375.65998,100.13868 376.53766,100.27459 C 376.64141,100.29066 376.74407,100.25521 376.81226,100.18735 C 377.02572,99.974918 378.30385,98.986913 378.33141,98.959494 C 378.3323,98.958609 378.33207,98.958046 378.33071,98.95783 C 378.22894,98.941562 369.66603,99.069694 368.81881,98.934276 C 368.71477,98.917646 368.60862,98.948251 368.534,99.01056 C 368.269,99.231825 366.6333,100.27543 366.6333,100.27543 C 366.6333,100.27543 366.6333,100.27543 366.6333,100.27543" id="path5547"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63229,97.76134 C 366.63229,97.76134 375.71513,97.543028 376.54406,97.671386 C 376.64204,97.686559 376.7441,97.647999 376.8163,97.576147 C 377.04232,97.35122 378.30025,96.367546 378.32943,96.338513 C 378.33037,96.337577 378.3302,96.336993 378.32892,96.336789 C 378.2328,96.321425 369.60982,96.528002 368.80967,96.400108 C 368.71141,96.384401 368.60569,96.417873 368.52667,96.483847 C 368.24609,96.718128 366.63229,97.76134 366.63229,97.76134 C 366.63229,97.76134 366.63229,97.76134 366.63229,97.76134" id="path5549"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63128,95.247255 C 366.63128,95.247255 375.77029,94.947374 376.55045,95.068182 C 376.64267,95.082462 376.74413,95.040789 376.82034,94.964946 C 377.05892,94.727523 378.29665,93.748178 378.32744,93.717533 C 378.32844,93.716544 378.32834,93.715941 378.32713,93.715748 C 378.23667,93.701288 369.55361,93.98631 368.80053,93.865939 C 368.70805,93.851157 368.60276,93.887495 368.51935,93.957134 C 368.22318,94.204431 366.63128,95.247255 366.63128,95.247255 C 366.63128,95.247255 366.63128,95.247255 366.63128,95.247255" id="path5551"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.63027,92.73317 C 366.63027,92.73317 375.82544,92.35172 376.55684,92.464977 C 376.6433,92.478365 376.74416,92.43358 376.82439,92.353745 C 377.07552,92.103826 378.29305,91.128811 378.32546,91.096552 C 378.32651,91.095512 378.32647,91.094888 378.32534,91.094707 C 378.24053,91.081151 369.49741,91.444618 368.79139,91.33177 C 368.70469,91.317912 368.59982,91.357116 368.51203,91.430421 C 368.20027,91.690733 366.63027,92.73317 366.63027,92.73317 C 366.63027,92.73317 366.63027,92.73317 366.63027,92.73317" id="path5553"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62926,90.219085 C 366.62926,90.219085 375.88059,89.756066 376.56323,89.861773 C 376.64393,89.874268 376.7442,89.82637 376.82843,89.742543 C 377.09212,89.480129 378.28945,88.509443 378.32348,88.475572 C 378.32458,88.474479 378.32461,88.473835 378.32355,88.473666 C 378.2444,88.461014 369.4412,88.902926 368.78225,88.797602 C 368.70133,88.784667 368.59689,88.826738 368.50471,88.903708 C 368.17736,89.177036 366.62926,90.219085 366.62926,90.219085 C 366.62926,90.219085 366.62926,90.219085 366.62926,90.219085" id="path5555"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62824,87.705 C 366.62824,87.705 375.93574,87.160412 376.56963,87.258568 C 376.64456,87.270171 376.74423,87.219161 376.83248,87.131342 C 377.10872,86.856432 378.28584,85.890076 378.3215,85.854592 C 378.32265,85.853447 378.32274,85.852782 378.32177,85.852625 C 378.24826,85.840877 369.38499,86.361234 368.77311,86.263433 C 368.69797,86.251422 368.59396,86.29636 368.49738,86.376995 C 368.15445,86.663339 366.62824,87.705 366.62824,87.705 C 366.62824,87.705 366.62824,87.705 366.62824,87.705" id="path5557"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62723,85.190915 C 366.62723,85.190915 375.9909,84.564758 376.57602,84.655364 C 376.64519,84.666074 376.74426,84.611951 376.83652,84.520141 C 377.12532,84.232734 378.28224,83.270709 378.31952,83.233611 C 378.32072,83.232415 378.32088,83.231729 378.31998,83.231584 C 378.25213,83.220739 369.32878,83.819543 368.76397,83.729264 C 368.6946,83.718178 368.59102,83.765982 368.49006,83.850282 C 368.13153,84.149641 366.62723,85.190915 366.62723,85.190915 C 366.62723,85.190915 366.62723,85.190915 366.62723,85.190915" id="path5559"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62622,82.67683 C 366.62622,82.67683 376.04605,81.969104 376.58241,82.05216 C 376.64582,82.061977 376.74429,82.004742 376.84056,81.908939 C 377.14192,81.609037 378.27864,80.651341 378.31754,80.612631 C 378.31879,80.611382 378.31902,80.610676 378.31819,80.610543 C 378.25599,80.600602 369.27257,81.277851 368.75483,81.195096 C 368.69124,81.184933 368.58809,81.235604 368.48274,81.323569 C 368.10862,81.635944 366.62622,82.67683 366.62622,82.67683 C 366.62622,82.67683 366.62622,82.67683 366.62622,82.67683" id="path5561"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62521,80.162745 C 366.62521,80.162745 376.1012,79.37345 376.5888,79.448955 C 376.64644,79.457881 376.74433,79.397532 376.84461,79.297738 C 377.15852,78.98534 378.27504,78.031974 378.31556,77.991651 C 378.31686,77.99035 378.31715,77.989623 378.3164,77.989502 C 378.25986,77.980465 369.21636,78.736159 368.74569,78.660927 C 368.68788,78.651688 368.58516,78.705226 368.47542,78.796856 C 368.08571,79.122247 366.62521,80.162745 366.62521,80.162745 C 366.62521,80.162745 366.62521,80.162745 366.62521,80.162745" id="path5563"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.6242,77.64866 C 366.6242,77.64866 376.15636,76.777796 376.5952,76.845751 C 376.64707,76.853784 376.74436,76.790323 376.84865,76.686537 C 377.17512,76.361643 378.27144,75.412606 378.31357,75.37067 C 378.31493,75.369317 378.31529,75.36857 378.31461,75.368461 C 378.26372,75.360328 369.16016,76.194467 368.73655,76.126758 C 368.68452,76.118443 368.58222,76.174847 368.46809,76.270143 C 368.0628,76.608549 366.6242,77.64866 366.6242,77.64866 C 366.6242,77.64866 366.6242,77.64866 366.6242,77.64866" id="path5565"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62319,75.134575 C 366.62319,75.134575 376.21151,74.182142 376.60159,74.242546 C 376.6477,74.249687 376.74439,74.183113 376.85269,74.075336 C 377.19172,73.737946 378.26783,72.793239 378.31159,72.74969 C 378.31301,72.748285 378.31342,72.747517 378.31282,72.74742 C 378.26759,72.740191 369.10395,73.652775 368.72741,73.59259 C 368.68116,73.585198 368.57929,73.644469 368.46077,73.74343 C 368.03989,74.094852 366.62319,75.134575 366.62319,75.134575 C 366.62319,75.134575 366.62319,75.134575 366.62319,75.134575" id="path5567"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62218,72.62049 C 366.62218,72.62049 376.26666,71.586488 376.60798,71.639342 C 376.64833,71.64559 376.74442,71.575904 376.85674,71.464134 C 377.20832,71.114249 378.26423,70.173871 378.30961,70.128709 C 378.31108,70.127253 378.31156,70.126464 378.31103,70.12638 C 378.27145,70.120053 369.04774,71.111083 368.71826,71.058421 C 368.6778,71.051954 368.57636,71.114091 368.45345,71.216717 C 368.01698,71.581155 366.62218,72.62049 366.62218,72.62049 C 366.62218,72.62049 366.62218,72.62049 366.62218,72.62049" id="path5569"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62117,70.106405 C 366.62117,70.106405 376.32181,68.990835 376.61437,69.036137 C 376.64896,69.041493 376.74445,68.968694 376.86078,68.852933 C 377.22492,68.490551 378.26063,67.554504 378.30763,67.507729 C 378.30915,67.50622 378.3097,67.505411 378.30924,67.505339 C 378.27532,67.499916 368.99153,68.569391 368.70912,68.524252 C 368.67444,68.518709 368.57343,68.583713 368.44613,68.690004 C 367.99407,69.067457 366.62117,70.106405 366.62117,70.106405 C 366.62117,70.106405 366.62117,70.106405 366.62117,70.106405" id="path5571"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.62016,67.59232 C 366.62016,67.59232 376.37697,66.395181 376.62077,66.432933 C 376.64959,66.437396 376.74449,66.361485 376.86482,66.241732 C 377.24152,65.866854 378.25703,64.935136 378.30565,64.886749 C 378.30722,64.885188 378.30783,64.884358 378.30745,64.884298 C 378.27918,64.879779 368.93532,66.027699 368.69998,65.990083 C 368.67108,65.985464 368.57049,66.053335 368.4388,66.163291 C 367.97116,66.55376 366.62016,67.59232 366.62016,67.59232 C 366.62016,67.59232 366.62016,67.59232 366.62016,67.59232" id="path5573"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.61914,65.078235 C 366.61914,65.078235 376.43212,63.799527 376.62716,63.829729 C 376.65022,63.833299 376.74452,63.754275 376.86887,63.63053 C 377.25812,63.243157 378.25342,62.315769 378.30367,62.265768 C 378.30529,62.264155 378.30597,62.263305 378.30567,62.263257 C 378.28305,62.259642 368.87911,63.486008 368.69084,63.455915 C 368.66772,63.452219 368.56756,63.522956 368.43148,63.636578 C 367.94825,64.040063 366.61914,65.078235 366.61914,65.078235 C 366.61914,65.078235 366.61914,65.078235 366.61914,65.078235" id="path5575"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.61813,62.56415 C 366.61813,62.56415 376.48727,61.203873 376.63355,61.226524 C 376.65084,61.229202 376.74455,61.147066 376.87291,61.019329 C 377.27472,60.61946 378.24982,59.696401 378.30169,59.644788 C 378.30336,59.643123 378.3041,59.642252 378.30388,59.642216 C 378.28691,59.639505 368.82291,60.944316 368.6817,60.921746 C 368.66436,60.918974 368.56463,60.992578 368.42416,61.109865 C 367.92534,61.526365 366.61813,62.56415 366.61813,62.56415 C 366.61813,62.56415 366.61813,62.56415 366.61813,62.56415" id="path5577"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.61712,60.050065 C 366.61712,60.050065 376.54242,58.608219 376.63994,58.62332 C 376.65147,58.625105 376.74458,58.539856 376.87695,58.408128 C 377.29132,57.995763 378.24622,57.077034 378.29971,57.023808 C 378.30143,57.022091 378.30224,57.021199 378.30209,57.021175 C 378.29078,57.019367 368.7667,58.402624 368.67256,58.387577 C 368.661,58.38573 368.56169,58.4622 368.41684,58.583153 C 367.90243,59.012668 366.61712,60.050065 366.61712,60.050065 C 366.61712,60.050065 366.61712,60.050065 366.61712,60.050065" id="path5579"/>
<path style="opacity: 0.99; fill: rgb(172, 195, 213); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 366.61611,57.53598 C 366.61611,57.53598 376.59758,56.012565 376.64634,56.020115 C 376.6521,56.021008 376.74462,55.932647 376.881,55.796927 C 377.30792,55.372065 378.24262,54.457666 378.29772,54.402827 C 378.2995,54.401058 378.30037,54.400146 378.3003,54.400134 C 378.29464,54.39923 368.71049,55.860932 368.66342,55.853409 C 368.65764,55.852485 368.55876,55.931822 368.40951,56.05644 C 367.87952,56.498971 366.61611,57.53598 366.61611,57.53598 C 366.61611,57.53598 366.61611,57.53598 366.61611,57.53598" id="path5581"/>
</g>
</g>
<g style="fill: rgb(147, 164, 178); fill-opacity: 1; display: inline;" id="g5583" transform="matrix(2.50742, 0, 0, 2.48918, -702.471, -157.004)">
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.80873,61.830771 L 331.48174,59.792412 L 336.08386,58.941393 L 336.67075,59.877455 L 425.37403,45.10437 C 429.69538,44.37895 433.13051,43.002544 436.79895,42.498523 L 436.71396,44.951621 L 329.80873,61.830771 z " sodipodi:nodetypes="cccccccc" id="path5585"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" id="path5587" sodipodi:nodetypes="cccccccc" d="M 330.80089,138.29359 L 332.44029,136.78055 L 336.94996,137.3746 L 337.52507,138.49495 L 424.44648,151.57466 C 428.68104,152.20614 432.04717,151.90838 435.64191,152.55624 L 435.55863,154.98265 L 330.80089,138.29359 z "/>
<g style="fill: rgb(147, 164, 178); fill-opacity: 1;" id="g5589">
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.77254,136.10894 C 330.77254,136.10894 332.39348,134.60455 332.40651,134.58868 C 332.41039,134.58396 332.53794,134.59736 332.74577,134.62474 C 333.7681,134.75941 336.88326,135.14141 336.91457,135.13562 C 336.9212,135.13439 336.99698,135.27345 337.08906,135.45284 C 337.25391,135.77397 337.49289,136.23634 337.4977,136.24402 C 337.49946,136.24682 337.56267,136.25807 337.68333,136.27622 C 342.01512,136.92806 424.35195,148.55281 424.46861,148.53338 C 424.52021,148.54016 424.57028,148.54705 424.61875,148.55407 C 428.78336,149.11934 432.11288,148.80685 435.66447,149.41326 C 435.66796,149.41273 435.66666,149.55215 435.6629,149.76334 C 435.64035,150.42042 435.59264,151.8099 435.59198,151.82916 C 435.59177,151.83506 435.48272,151.82155 435.27202,151.78799 C 429.04212,150.7955 330.77254,136.10894 330.77254,136.10894 C 330.77254,136.10894 330.77254,136.10894 330.77254,136.10894" id="path5591"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.7442,133.92429 C 330.7442,133.92429 332.34667,132.42855 332.37272,132.39682 C 332.38048,132.38736 332.50688,132.39721 332.70859,132.42379 C 333.70086,132.5545 336.81656,132.90822 336.87917,132.89664 C 336.89243,132.89419 336.97012,133.02839 337.0595,133.2025 C 337.2195,133.51419 337.46071,133.97773 337.47033,133.99308 C 337.47385,133.99869 337.53644,134.01158 337.65355,134.0292 C 341.85793,134.66187 424.25742,145.53096 424.49074,145.4921 C 424.5438,145.49819 424.59392,145.50462 424.64097,145.51143 C 428.80593,146.03945 432.13602,145.69764 435.68703,146.27028 C 435.69402,146.26921 435.69635,146.40401 435.69631,146.60849 C 435.67442,147.24625 435.62666,148.63715 435.62532,148.67567 C 435.62492,148.68746 435.51894,148.67832 435.31443,148.64574 C 429.26777,147.68244 330.7442,133.92429 330.7442,133.92429 C 330.7442,133.92429 330.7442,133.92429 330.7442,133.92429" id="path5593"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.71585,131.73963 C 330.71585,131.73963 332.29986,130.25256 332.33894,130.20495 C 332.35058,130.19077 332.47581,130.19707 332.67142,130.22284 C 333.63361,130.34958 336.74987,130.67503 336.84378,130.65766 C 336.86367,130.65398 336.94326,130.78333 337.02993,130.95216 C 337.18508,131.25441 337.42852,131.71911 337.44296,131.74215 C 337.44824,131.75056 337.51021,131.76509 337.62377,131.78218 C 341.70075,132.39567 424.16289,142.50911 424.51287,142.45082 C 424.56739,142.45621 424.61756,142.46219 424.66318,142.46879 C 428.82851,142.95956 432.15916,142.58844 435.7096,143.1273 C 435.72007,143.1257 435.72605,143.25587 435.72973,143.45364 C 435.7085,144.07207 435.66067,145.46441 435.65867,145.52218 C 435.65806,145.53987 435.55515,145.53509 435.35684,145.5035 C 429.49341,144.56939 330.71585,131.73963 330.71585,131.73963 C 330.71585,131.73963 330.71585,131.73963 330.71585,131.73963" id="path5595"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.6875,129.55498 C 330.6875,129.55498 332.25305,128.07656 332.30515,128.01308 C 332.32067,127.99417 332.44475,127.99692 332.63424,128.02188 C 333.56636,128.14467 336.68317,128.44184 336.80838,128.41868 C 336.83491,128.41378 336.91641,128.53827 337.00037,128.70183 C 337.15067,128.99463 337.39634,129.4605 337.4156,129.49121 C 337.42263,129.50243 337.48397,129.5186 337.59399,129.53516 C 341.54356,130.12948 424.06836,139.48726 424.53501,139.40954 C 424.59097,139.41424 424.6412,139.41976 424.68539,139.42615 C 428.85108,139.87968 432.18231,139.47923 435.73216,139.98432 C 435.74613,139.98218 435.75574,140.10773 435.76314,140.2988 C 435.74258,140.8979 435.69469,142.29166 435.69202,142.36869 C 435.6912,142.39227 435.59136,142.39185 435.39925,142.36125 C 429.71905,141.45633 330.6875,129.55498 330.6875,129.55498 C 330.6875,129.55498 330.6875,129.55498 330.6875,129.55498" id="path5597"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.65915,127.37033 C 330.65915,127.37033 332.20624,125.90056 332.27137,125.82121 C 332.29077,125.79758 332.41368,125.79678 332.59706,125.82093 C 333.49912,125.93976 336.61647,126.20864 336.77299,126.1797 C 336.80614,126.17357 336.88955,126.29321 336.9708,126.45149 C 337.11626,126.73485 337.36416,127.20189 337.38823,127.24028 C 337.39702,127.2543 337.45774,127.27211 337.5642,127.28813 C 341.38637,127.86328 423.97383,136.4654 424.55714,136.36826 C 424.61456,136.37226 424.66484,136.37733 424.70761,136.38351 C 428.87365,136.79979 432.20545,136.37003 435.75472,136.84134 C 435.77218,136.83867 435.78544,136.95959 435.79655,137.14395 C 435.77665,137.72373 435.7287,139.11891 435.72537,139.2152 C 435.72434,139.24468 435.62758,139.24862 435.44166,139.219 C 429.94469,138.34328 330.65915,127.37033 330.65915,127.37033 C 330.65915,127.37033 330.65915,127.37033 330.65915,127.37033" id="path5599"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.63081,125.18568 C 330.63081,125.18568 332.15943,123.72456 332.23759,123.62935 C 332.26086,123.60099 332.38262,123.59663 332.55989,123.61998 C 333.43187,123.73485 336.54977,123.97545 336.73759,123.94072 C 336.77738,123.93337 336.86269,124.04815 336.94124,124.20115 C 337.08184,124.47506 337.33198,124.94328 337.36086,124.98935 C 337.37141,125.00618 337.43151,125.02562 337.53442,125.04111 C 341.22918,125.59709 423.8793,133.44355 424.57927,133.32698 C 424.63815,133.33029 424.68848,133.33489 424.72982,133.34088 C 428.89623,133.71991 432.22859,133.26082 435.77728,133.69836 C 435.79824,133.69515 435.81513,133.81145 435.82997,133.9891 C 435.81073,134.54955 435.76272,135.94616 435.75871,136.06171 C 435.75749,136.09709 435.66379,136.10539 435.48407,136.07676 C 430.17034,135.23022 330.63081,125.18568 330.63081,125.18568 C 330.63081,125.18568 330.63081,125.18568 330.63081,125.18568" id="path5601"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.60246,123.00103 C 330.60246,123.00103 332.11263,121.54857 332.2038,121.43748 C 332.23096,121.40439 332.35155,121.39649 332.52271,121.41903 C 333.36463,121.52994 336.48308,121.74226 336.7022,121.70174 C 336.74861,121.69316 336.83584,121.80309 336.91167,121.95082 C 337.04743,122.21528 337.29979,122.68467 337.33349,122.73841 C 337.3458,122.75805 337.40527,122.77914 337.50464,122.79409 C 341.072,123.33089 423.78477,130.4217 424.6014,130.2857 C 424.66174,130.28831 424.71212,130.29246 424.75204,130.29824 C 428.9188,130.64002 432.25173,130.15162 435.79985,130.55539 C 435.82429,130.55164 435.84482,130.66331 435.86338,130.83425 C 435.84481,131.37538 435.79673,132.77342 435.79206,132.90823 C 435.79063,132.94949 435.7,132.96215 435.52648,132.93451 C 430.39598,132.11717 330.60246,123.00103 330.60246,123.00103 C 330.60246,123.00103 330.60246,123.00103 330.60246,123.00103" id="path5603"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.57411,120.81637 C 330.57411,120.81637 332.06582,119.37257 332.17002,119.24561 C 332.20105,119.2078 332.32049,119.19634 332.48553,119.21808 C 333.29738,119.32503 336.41638,119.50907 336.6668,119.46276 C 336.71985,119.45295 336.80898,119.55802 336.88211,119.70048 C 337.01302,119.9555 337.26761,120.42606 337.30612,120.48748 C 337.32019,120.50992 337.37904,120.53265 337.47486,120.54707 C 340.91481,121.0647 423.69024,127.39985 424.62353,127.24442 C 424.68533,127.24633 424.73576,127.25003 424.77425,127.2556 C 428.94137,127.56013 432.27488,127.04241 435.82241,127.41241 C 435.85034,127.40812 435.87452,127.51517 435.89679,127.67941 C 435.87888,128.20121 435.83074,129.60067 435.82541,129.75474 C 435.82377,129.8019 435.73621,129.81892 435.56889,129.79227 C 430.62162,129.00411 330.57411,120.81637 330.57411,120.81637 C 330.57411,120.81637 330.57411,120.81637 330.57411,120.81637" id="path5605"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.54576,118.63172 C 330.54576,118.63172 332.01901,117.19657 332.13623,117.05375 C 332.17115,117.01121 332.28942,116.9962 332.44835,117.01713 C 333.23013,117.12011 336.34968,117.27588 336.63141,117.22378 C 336.69109,117.21275 336.78213,117.31296 336.85254,117.45014 C 336.97861,117.69572 337.23543,118.16744 337.27875,118.23654 C 337.29458,118.26179 337.35281,118.28616 337.44508,118.30004 C 340.75762,118.79851 423.59571,124.378 424.64566,124.20314 C 424.70892,124.20436 424.7594,124.2076 424.79646,124.21296 C 428.96394,124.48025 432.29802,123.93321 435.84497,124.26943 C 435.8764,124.26461 435.90421,124.36703 435.93021,124.52456 C 435.91296,125.02703 435.86476,126.42792 435.85875,126.60125 C 435.85692,126.65431 435.77243,126.67569 435.6113,126.65002 C 430.84726,125.89106 330.54576,118.63172 330.54576,118.63172 C 330.54576,118.63172 330.54576,118.63172 330.54576,118.63172" id="path5607"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.51742,116.44707 C 330.51742,116.44707 331.9722,115.02057 332.10245,114.86188 C 332.14124,114.81461 332.25836,114.79605 332.41118,114.81618 C 333.16289,114.9152 336.28298,115.04269 336.59601,114.9848 C 336.66232,114.97254 336.75527,115.0679 336.82298,115.19981 C 336.94419,115.43594 337.20325,115.90883 337.25139,115.98561 C 337.26897,116.01366 337.32657,116.03967 337.41529,116.05302 C 340.60043,116.53231 423.50118,121.35615 424.66779,121.16186 C 424.7325,121.16238 424.78304,121.16517 424.81868,121.17032 C 428.98652,121.40036 432.32116,120.82401 435.86753,121.12645 C 435.90245,121.12109 435.9339,121.21889 435.96362,121.36971 C 435.94704,121.85286 435.89877,123.25517 435.8921,123.44776 C 435.89006,123.50671 435.80864,123.53245 435.65371,123.50777 C 431.0729,122.778 330.51742,116.44707 330.51742,116.44707 C 330.51742,116.44707 330.51742,116.44707 330.51742,116.44707" id="path5609"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.48907,114.26242 C 330.48907,114.26242 331.92539,112.84458 332.06866,112.67001 C 332.11134,112.61802 332.22729,112.5959 332.374,112.61523 C 333.09564,112.71029 336.21629,112.8095 336.56062,112.74582 C 336.63356,112.73234 336.72841,112.82284 336.79341,112.94947 C 336.90978,113.17616 337.17107,113.65022 337.22402,113.73468 C 337.24336,113.76553 337.30034,113.79318 337.38551,113.806 C 340.44325,114.26612 423.40666,118.3343 424.68992,118.12057 C 424.75609,118.12041 424.80668,118.12273 424.84089,118.12768 C 429.00909,118.32048 432.3443,117.7148 435.8901,117.98347 C 435.92851,117.97758 435.9636,118.07075 435.99703,118.21486 C 435.98111,118.67869 435.93279,120.08243 435.92545,120.29427 C 435.9232,120.35912 435.84485,120.38922 435.69612,120.36553 C 431.29855,119.66494 330.48907,114.26242 330.48907,114.26242 C 330.48907,114.26242 330.48907,114.26242 330.48907,114.26242" id="path5611"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.46072,112.07777 C 330.46072,112.07777 331.87858,110.66858 332.03488,110.47814 C 332.08143,110.42142 332.19623,110.39576 332.33682,110.41428 C 333.0284,110.50538 336.14959,110.57631 336.52522,110.50685 C 336.6048,110.49213 336.70156,110.57778 336.76385,110.69913 C 336.87537,110.91637 337.13888,111.39161 337.19665,111.48374 C 337.21775,111.5174 337.27411,111.54669 337.35573,111.55897 C 340.28606,111.99992 423.31213,115.31245 424.71206,115.07929 C 424.77968,115.07843 424.83032,115.0803 424.86311,115.08505 C 429.03166,115.24059 432.36745,114.6056 435.91266,114.84049 C 435.95456,114.83406 435.99329,114.92261 436.03045,115.06002 C 436.01519,115.50451 435.9668,116.90968 435.95879,117.14078 C 435.95634,117.21152 435.88107,117.24599 435.73853,117.22328 C 431.52419,116.55189 330.46072,112.07777 330.46072,112.07777 C 330.46072,112.07777 330.46072,112.07777 330.46072,112.07777" id="path5613"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.43237,109.89311 C 330.43237,109.89311 331.83177,108.49258 332.0011,108.28628 C 332.05153,108.22483 332.16517,108.19561 332.29964,108.21333 C 332.96115,108.30047 336.08289,108.34312 336.48983,108.26787 C 336.57603,108.25192 336.6747,108.33272 336.73428,108.4488 C 336.84095,108.65659 337.1067,109.133 337.16928,109.23281 C 337.19214,109.26927 337.24788,109.3002 337.32595,109.31195 C 340.12887,109.73373 423.2176,112.29059 424.73419,112.03801 C 424.80327,112.03646 424.85396,112.03787 424.88532,112.04241 C 429.05424,112.1607 432.39059,111.49639 435.93522,111.69751 C 435.98062,111.69055 436.02299,111.77447 436.06386,111.90517 C 436.04927,112.33034 436.00082,113.73693 435.99214,113.98729 C 435.98949,114.06393 435.91728,114.10275 435.78094,114.08103 C 431.74983,113.43883 330.43237,109.89311 330.43237,109.89311 C 330.43237,109.89311 330.43237,109.89311 330.43237,109.89311" id="path5615"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.40403,107.70846 C 330.40403,107.70846 331.78496,106.31658 331.96731,106.09441 C 332.02163,106.02824 332.1341,105.99547 332.26247,106.01238 C 332.8939,106.09556 336.01619,106.10993 336.45443,106.02889 C 336.54727,106.01172 336.64784,106.08766 336.70472,106.19846 C 336.80654,106.39681 337.07452,106.87438 337.14191,106.98187 C 337.16653,107.02114 337.22164,107.05372 337.29617,107.06493 C 339.97169,107.46753 423.12307,109.26874 424.75632,108.99673 C 424.82686,108.99448 424.8776,108.99544 424.90754,108.99977 C 429.07681,109.08082 432.41373,108.38719 435.95778,108.55453 C 436.00667,108.54703 436.05268,108.62632 436.09727,108.75032 C 436.08334,109.15617 436.03483,110.56418 436.02549,110.8338 C 436.02263,110.91634 435.95349,110.95952 435.82335,110.93879 C 431.97547,110.32578 330.40403,107.70846 330.40403,107.70846 C 330.40403,107.70846 330.40403,107.70846 330.40403,107.70846" id="path5617"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.37568,105.52381 C 330.37568,105.52381 331.73815,104.14059 331.93353,103.90254 C 331.99172,103.83164 332.10304,103.79532 332.22529,103.81143 C 332.82666,103.89064 335.94949,103.87673 336.41904,103.78991 C 336.51851,103.77151 336.62099,103.8426 336.67515,103.94812 C 336.77213,104.13703 337.04234,104.61577 337.11454,104.73094 C 337.14092,104.77301 337.19541,104.80723 337.26639,104.81791 C 339.8145,105.20134 423.02854,106.24689 424.77845,105.95545 C 424.85045,105.95251 424.90124,105.95301 424.92975,105.95713 C 429.09938,106.00093 432.43687,105.27798 435.98035,105.41155 C 436.03273,105.40352 436.08237,105.47818 436.13069,105.59547 C 436.11742,105.98199 436.06884,107.39144 436.05884,107.68031 C 436.05577,107.76874 435.9897,107.81629 435.86576,107.79654 C 432.20112,107.21272 330.37568,105.52381 330.37568,105.52381 C 330.37568,105.52381 330.37568,105.52381 330.37568,105.52381" id="path5619"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.34733,103.33916 C 330.34733,103.33916 331.69134,101.96459 331.89974,101.71068 C 331.96182,101.63505 332.07197,101.59518 332.18811,101.61048 C 332.75941,101.68573 335.8828,101.64354 336.38365,101.55093 C 336.48974,101.53131 336.59413,101.59754 336.64559,101.69779 C 336.73771,101.87725 337.01015,102.35716 337.08718,102.48001 C 337.11531,102.52489 337.16918,102.56074 337.2366,102.57088 C 339.65731,102.93515 422.93401,103.22504 424.80058,102.91417 C 424.87403,102.91053 424.92488,102.91057 424.95196,102.91449 C 429.12196,102.92105 432.46002,102.16878 436.00291,102.26857 C 436.05878,102.26 436.11207,102.33004 436.1641,102.44063 C 436.1515,102.80782 436.10286,104.21869 436.09218,104.52682 C 436.08892,104.62115 436.02592,104.67305 435.90817,104.6543 C 432.42676,104.09967 330.34733,103.33916 330.34733,103.33916 C 330.34733,103.33916 330.34733,103.33916 330.34733,103.33916" id="path5621"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.31898,101.15451 C 330.31898,101.15451 331.64453,99.78859 331.86596,99.518808 C 331.93191,99.438455 332.04091,99.395032 332.15093,99.409525 C 332.69217,99.480821 335.8161,99.410352 336.34825,99.311947 C 336.46098,99.291102 336.56727,99.352481 336.61603,99.447451 C 336.7033,99.617465 336.97797,100.09855 337.05981,100.22907 C 337.0897,100.27676 337.14294,100.31425 337.20682,100.32386 C 339.50012,100.66895 422.83948,100.20319 424.82271,99.872892 C 424.89762,99.868556 424.94851,99.868143 424.97418,99.871856 C 429.14453,99.84116 432.48316,99.059573 436.02547,99.125594 C 436.08483,99.116485 436.14176,99.181904 436.19751,99.285779 C 436.18557,99.633645 436.13687,101.04594 436.12553,101.37333 C 436.12206,101.47356 436.06213,101.52982 435.95058,101.51205 C 432.6524,100.98661 330.31898,101.15451 330.31898,101.15451 C 330.31898,101.15451 330.31898,101.15451 330.31898,101.15451" id="path5623"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.29064,98.969855 C 330.29064,98.969855 331.59772,97.612593 331.83218,97.326941 C 331.90201,97.241861 332.00984,97.194886 332.11376,97.208575 C 332.62492,97.275909 335.7494,97.177161 336.31286,97.072968 C 336.43222,97.050896 336.54042,97.10742 336.58646,97.197114 C 336.66889,97.357683 336.94579,97.839937 337.03244,97.978138 C 337.0641,98.028628 337.11671,98.067761 337.17704,98.076839 C 339.34294,98.402758 422.74495,97.181339 424.84484,96.831611 C 424.92121,96.826581 424.97215,96.825711 424.99639,96.829218 C 429.1671,96.761274 432.5063,95.950368 436.04803,95.982615 C 436.11089,95.97297 436.17146,96.033764 436.23093,96.130931 C 436.21965,96.459472 436.17089,97.873193 436.15888,98.219845 C 436.1552,98.325962 436.09834,98.386588 435.99299,98.369804 C 432.87804,97.873559 330.29064,98.969855 330.29064,98.969855 C 330.29064,98.969855 330.29064,98.969855 330.29064,98.969855" id="path5625"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.26229,96.785203 C 330.26229,96.785203 331.55091,95.436595 331.79839,95.135074 C 331.8721,95.045267 331.97878,94.994741 332.07658,95.007624 C 332.55768,95.070998 335.6827,94.94397 336.27746,94.833988 C 336.40345,94.81069 336.51356,94.86236 336.5569,94.946778 C 336.63447,95.097901 336.91361,95.581325 337.00507,95.727204 C 337.03849,95.780499 337.09048,95.821272 337.14726,95.829817 C 339.18575,96.136563 422.65042,94.159487 424.86698,93.790331 C 424.9448,93.784606 424.99579,93.783279 425.01861,93.78658 C 429.18967,93.681388 432.52944,92.841164 436.0706,92.839635 C 436.13694,92.829455 436.20115,92.885624 436.26434,92.976084 C 436.25373,93.285298 436.2049,94.700446 436.19222,95.066355 C 436.18834,95.178369 436.13456,95.243355 436.0354,95.227558 C 433.10368,94.760504 330.26229,96.785203 330.26229,96.785203 C 330.26229,96.785203 330.26229,96.785203 330.26229,96.785203" id="path5627"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.23394,94.600551 C 330.23394,94.600551 331.50411,93.260598 331.76461,92.943207 C 331.8422,92.848673 331.94771,92.794595 332.0394,92.806673 C 332.49043,92.866086 335.61601,92.710779 336.24207,92.595008 C 336.37469,92.570484 336.48671,92.6173 336.52733,92.696441 C 336.60006,92.83812 336.88143,93.322713 336.9777,93.47627 C 337.01288,93.53237 337.06424,93.574784 337.11748,93.582794 C 339.02856,93.870369 422.55589,91.137636 424.88911,90.749051 C 424.96839,90.74263 425.01943,90.740848 425.04082,90.743942 C 429.21225,90.601502 432.55259,89.731959 436.09316,89.696656 C 436.163,89.68594 436.23084,89.737484 436.29775,89.821236 C 436.2878,90.111125 436.23892,91.527698 436.22557,91.912866 C 436.22149,92.030775 436.17077,92.100121 436.07781,92.085312 C 433.32933,91.647448 330.23394,94.600551 330.23394,94.600551 C 330.23394,94.600551 330.23394,94.600551 330.23394,94.600551" id="path5629"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.20559,92.415899 C 330.20559,92.415899 331.4573,91.0846 331.73082,90.751339 C 331.81229,90.652079 331.91665,90.594449 332.00222,90.605722 C 332.42318,90.661174 335.54931,90.477588 336.20667,90.356029 C 336.34592,90.330278 336.45985,90.372239 336.49777,90.446105 C 336.56565,90.578338 336.84924,91.064101 336.95033,91.225336 C 336.98727,91.284241 337.03801,91.328295 337.0877,91.335771 C 338.87137,91.604175 422.46136,88.115785 424.91124,87.70777 C 424.99197,87.700655 425.04307,87.698416 425.06303,87.701304 C 429.23482,87.521616 432.57573,86.622754 436.11572,86.553677 C 436.18905,86.542425 436.26054,86.589344 436.33116,86.666389 C 436.32188,86.936951 436.27293,88.35495 436.25892,88.759377 C 436.25463,88.883181 436.20698,88.956888 436.12022,88.943066 C 433.55497,88.534393 330.20559,92.415899 330.20559,92.415899 C 330.20559,92.415899 330.20559,92.415899 330.20559,92.415899" id="path5631"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.17725,90.231247 C 330.17725,90.231247 331.41049,88.908602 331.69704,88.559472 C 331.78239,88.455486 331.88558,88.394304 331.96505,88.404772 C 332.35594,88.456263 335.48261,88.244397 336.17128,88.117049 C 336.31716,88.090073 336.43299,88.127179 336.4682,88.195768 C 336.53123,88.318556 336.81706,88.80549 336.92297,88.974402 C 336.96166,89.036112 337.01178,89.081807 337.05791,89.088749 C 338.71419,89.337981 422.36683,85.093934 424.93337,84.66649 C 425.01556,84.65868 425.06671,84.655984 425.08525,84.658665 C 429.25739,84.441731 432.59887,83.51355 436.13828,83.410698 C 436.21511,83.39891 436.29023,83.441203 436.36458,83.511541 C 436.35596,83.762778 436.30694,85.182203 436.29227,85.605888 C 436.28777,85.735587 436.24319,85.813655 436.16263,85.80082 C 433.78061,85.421338 330.17725,90.231247 330.17725,90.231247 C 330.17725,90.231247 330.17725,90.231247 330.17725,90.231247" id="path5633"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.1489,88.046595 C 330.1489,88.046595 331.36368,86.732605 331.66326,86.367605 C 331.75248,86.258892 331.85452,86.194158 331.92787,86.203821 C 332.28869,86.251351 335.41591,86.011206 336.13588,85.87807 C 336.2884,85.849867 336.40614,85.882118 336.43864,85.945431 C 336.49682,86.058774 336.78488,86.546878 336.8956,86.723468 C 336.93605,86.787983 336.98555,86.835318 337.02813,86.841726 C 338.557,87.071786 422.2723,82.072083 424.9555,81.625209 C 425.03915,81.616704 425.09035,81.613552 425.10746,81.616027 C 429.27997,81.361845 432.62202,80.404345 436.16084,80.267719 C 436.24116,80.255395 436.31992,80.293063 436.39799,80.356694 C 436.39003,80.588604 436.34096,82.009455 436.32561,82.452399 C 436.32091,82.587993 436.27941,82.670421 436.20504,82.658574 C 434.00625,82.308283 330.1489,88.046595 330.1489,88.046595 C 330.1489,88.046595 330.1489,88.046595 330.1489,88.046595" id="path5635"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.12055,85.861943 C 330.12055,85.861943 331.31687,84.556607 331.62947,84.175738 C 331.72258,84.062298 331.82345,83.994013 331.89069,84.00287 C 332.22145,84.04644 335.34922,83.778015 336.10049,83.63909 C 336.25963,83.609661 336.37928,83.637058 336.40907,83.695095 C 336.46241,83.798993 336.7527,84.288266 336.86823,84.472534 C 336.91044,84.539854 336.95931,84.588829 336.99835,84.594704 C 338.39981,84.805592 422.17777,79.050231 424.97763,78.583929 C 425.06274,78.574729 425.11399,78.57112 425.12968,78.573389 C 429.30254,78.281959 432.64516,77.29514 436.18341,77.124739 C 436.26721,77.11188 436.34962,77.144923 436.4314,77.201846 C 436.42411,77.414431 436.37497,78.836708 436.35896,79.298909 C 436.35406,79.4404 436.31562,79.527188 436.24745,79.516328 C 434.2319,79.195228 330.12055,85.861943 330.12055,85.861943 C 330.12055,85.861943 330.12055,85.861943 330.12055,85.861943" id="path5637"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.0922,83.677291 C 330.0922,83.677291 331.27006,82.38061 331.59569,81.983871 C 331.69267,81.865704 331.79239,81.793867 331.85351,81.801919 C 332.1542,81.841528 335.28252,81.544824 336.06509,81.40011 C 336.23087,81.369455 336.35242,81.391997 336.37951,81.444758 C 336.42799,81.539211 336.72051,82.029654 336.84086,82.2216 C 336.88483,82.291725 336.93308,82.342341 336.96857,82.347681 C 338.24262,82.539398 422.08324,76.02838 424.99976,75.542648 C 425.08633,75.532754 425.13763,75.528688 425.15189,75.530751 C 429.32511,75.202073 432.6683,74.185936 436.20597,73.98176 C 436.29327,73.968365 436.37931,73.996783 436.46482,74.046998 C 436.45818,74.240257 436.40899,75.66396 436.39231,76.14542 C 436.3872,76.292806 436.35183,76.383955 436.28986,76.374082 C 434.45754,76.082173 330.0922,83.677291 330.0922,83.677291 C 330.0922,83.677291 330.0922,83.677291 330.0922,83.677291" id="path5639"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.06386,81.492639 C 330.06386,81.492639 331.22325,80.204612 331.5619,79.792004 C 331.66277,79.66911 331.76132,79.593722 331.81634,79.600969 C 332.08695,79.636616 335.21582,79.311632 336.0297,79.161131 C 336.20211,79.129249 336.32557,79.146937 336.34994,79.194422 C 336.39358,79.279429 336.68833,79.771042 336.81349,79.970666 C 336.85922,80.043596 336.90685,80.095852 336.93879,80.100658 C 338.08544,80.273203 421.98871,73.006529 425.0219,72.501368 C 425.10992,72.490778 425.16127,72.486257 425.1741,72.488113 C 429.34769,72.122187 432.69144,71.076731 436.22853,70.838781 C 436.31932,70.82485 436.40901,70.848643 436.49823,70.892151 C 436.49226,71.066084 436.443,72.491212 436.42565,72.991931 C 436.42034,73.145212 436.38804,73.240721 436.33227,73.231836 C 434.68318,72.969117 330.06386,81.492639 330.06386,81.492639 C 330.06386,81.492639 330.06386,81.492639 330.06386,81.492639" id="path5641"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.03551,79.307987 C 330.03551,79.307987 331.17644,78.028614 331.52812,77.600136 C 331.63287,77.472516 331.73026,77.393576 331.77916,77.400018 C 332.01971,77.431705 335.14912,77.078441 335.9943,76.922151 C 336.17334,76.889044 336.29871,76.901877 336.32038,76.944085 C 336.35917,77.019647 336.65615,77.51243 336.78612,77.719732 C 336.83361,77.795467 336.88061,77.849364 336.909,77.853636 C 337.92825,78.007009 421.89418,69.984678 425.04403,69.460087 C 425.1335,69.448803 425.18491,69.443825 425.19632,69.445475 C 429.37026,69.042301 432.71459,67.967527 436.25109,67.695802 C 436.34538,67.681335 436.4387,67.700503 436.53164,67.737303 C 436.52634,67.891911 436.47702,69.318465 436.459,69.838442 C 436.45349,69.997618 436.42426,70.097488 436.37468,70.08959 C 434.90882,69.856062 330.03551,79.307987 330.03551,79.307987 C 330.03551,79.307987 330.03551,79.307987 330.03551,79.307987" id="path5643"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 330.00716,77.123335 C 330.00716,77.123335 331.12963,75.852617 331.49434,75.408269 C 331.60296,75.275922 331.69919,75.193431 331.74198,75.199067 C 331.95246,75.226793 335.08242,74.84525 335.95891,74.683172 C 336.14458,74.648838 336.27185,74.656816 336.29081,74.693749 C 336.32475,74.759865 336.62397,75.253819 336.75876,75.468799 C 336.808,75.547338 336.85438,75.602875 336.87922,75.606613 C 337.77106,75.740815 421.79965,66.962827 425.06616,66.418807 C 425.15709,66.406828 425.20855,66.401393 425.21853,66.402837 C 429.39283,65.962415 432.73773,64.858322 436.27366,64.552823 C 436.37143,64.53782 436.46839,64.552362 436.56506,64.582456 C 436.56041,64.717737 436.51103,66.145717 436.49235,66.684953 C 436.48663,66.850025 436.46047,66.954254 436.41709,66.947344 C 435.13446,66.743007 330.00716,77.123335 330.00716,77.123335 C 330.00716,77.123335 330.00716,77.123335 330.00716,77.123335" id="path5645"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.97881,74.938683 C 329.97881,74.938683 331.08282,73.676619 331.46055,73.216402 C 331.57306,73.079329 331.66813,72.993285 331.7048,72.998116 C 331.88522,73.021882 335.01573,72.612059 335.92352,72.444192 C 336.11582,72.408632 336.245,72.411756 336.26125,72.443412 C 336.29034,72.500084 336.59179,72.995207 336.73139,73.217865 C 336.78239,73.299209 336.82815,73.356387 336.84944,73.359591 C 337.61387,73.474621 421.70512,63.940976 425.08829,63.377526 C 425.18068,63.364852 425.23219,63.358961 425.24075,63.360199 C 429.4154,62.882529 432.76087,61.749117 436.29622,61.409843 C 436.39749,61.394305 436.49809,61.404222 436.59847,61.427608 C 436.59449,61.543564 436.54504,62.97297 436.5257,63.531463 C 436.51977,63.702431 436.49668,63.811021 436.4595,63.805097 C 435.36011,63.629952 329.97881,74.938683 329.97881,74.938683 C 329.97881,74.938683 329.97881,74.938683 329.97881,74.938683" id="path5647"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.95047,72.754031 C 329.95047,72.754031 331.03601,71.500621 331.42677,71.024535 C 331.54315,70.882735 331.63706,70.79314 331.66763,70.797166 C 331.81797,70.81697 334.94903,70.378868 335.88812,70.205213 C 336.08705,70.168426 336.21814,70.166695 336.23168,70.193076 C 336.25593,70.240302 336.5596,70.736595 336.70402,70.966931 C 336.75678,71.05108 336.80191,71.109898 336.81966,71.112568 C 337.45669,71.208426 421.61059,60.919124 425.11042,60.336246 C 425.20427,60.322877 425.25583,60.316529 425.26296,60.317561 C 429.43798,59.802643 432.78401,58.639913 436.31878,58.266864 C 436.42354,58.25079 436.52778,58.256082 436.63188,58.272761 C 436.62857,58.36939 436.57906,59.800222 436.55904,60.377974 C 436.55291,60.554837 436.5329,60.667788 436.50191,60.662851 C 435.58575,60.516897 329.95047,72.754031 329.95047,72.754031 C 329.95047,72.754031 329.95047,72.754031 329.95047,72.754031" id="path5649"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.92212,70.569379 C 329.92212,70.569379 330.9892,69.324624 331.39298,68.832668 C 331.51325,68.686141 331.606,68.592994 331.63045,68.596215 C 331.75072,68.612058 334.88233,68.145677 335.85273,67.966233 C 336.05829,67.92822 336.19129,67.921635 336.20212,67.942739 C 336.22151,67.98052 336.52742,68.477983 336.67665,68.715997 C 336.73117,68.802951 336.77568,68.863409 336.78988,68.865545 C 337.2995,68.942232 421.51606,57.897273 425.13255,57.294965 C 425.22786,57.280902 425.27947,57.274097 425.28517,57.274922 C 429.46055,56.722757 432.80716,55.530708 436.34134,55.123885 C 436.4496,55.107275 436.55748,55.107942 436.6653,55.117913 C 436.66264,55.195217 436.61307,56.627474 436.59239,57.224485 C 436.58606,57.407243 436.56911,57.524554 436.54432,57.520605 C 435.81139,57.403842 329.92212,70.569379 329.92212,70.569379 C 329.92212,70.569379 329.92212,70.569379 329.92212,70.569379" id="path5651"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.89377,68.384727 C 329.89377,68.384727 330.94239,67.148626 331.3592,66.640801 C 331.48334,66.489547 331.57493,66.392849 331.59327,66.395264 C 331.68348,66.407147 334.81563,65.912486 335.81733,65.727253 C 336.02953,65.688015 336.16443,65.676574 336.17255,65.692403 C 336.1871,65.720738 336.49524,66.219371 336.64928,66.465063 C 336.70556,66.554822 336.74945,66.616921 336.7601,66.618523 C 337.14231,66.676038 421.42154,54.875422 425.15468,54.253685 C 425.25145,54.238926 425.30311,54.231666 425.30739,54.232284 C 429.48312,53.642871 432.8303,52.421504 436.36391,51.980906 C 436.47565,51.96376 436.58717,51.959802 436.69871,51.963066 C 436.69672,52.021043 436.64709,53.454727 436.62574,54.070996 C 436.6192,54.25965 436.60532,54.381321 436.58673,54.378359 C 436.03703,54.290786 329.89377,68.384727 329.89377,68.384727 C 329.89377,68.384727 329.89377,68.384727 329.89377,68.384727" id="path5653"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.86542,66.200075 C 329.86542,66.200075 330.89558,64.972629 331.32541,64.448933 C 331.45344,64.292953 331.54387,64.192703 331.55609,64.194313 C 331.61623,64.202235 334.74894,63.679295 335.78194,63.488274 C 336.00076,63.447809 336.13757,63.431514 336.14299,63.442066 C 336.15269,63.460957 336.46306,63.960759 336.62191,64.214129 C 336.67995,64.306693 336.72322,64.370432 336.73031,64.3715 C 336.98512,64.409844 421.32701,51.853571 425.17681,51.212404 C 425.27503,51.196951 425.32675,51.189234 425.3296,51.189646 C 429.5057,50.562985 432.85344,49.312299 436.38647,48.837927 C 436.5017,48.820245 436.61686,48.811661 436.73212,48.808218 C 436.7308,48.84687 436.6811,50.281979 436.65908,50.917507 C 436.65234,51.112056 436.64153,51.238088 436.62914,51.236113 C 436.26268,51.177731 329.86542,66.200075 329.86542,66.200075 C 329.86542,66.200075 329.86542,66.200075 329.86542,66.200075" id="path5655"/>
<path style="fill: rgb(147, 164, 178); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-opacity: 1;" d="M 329.83708,64.015423 C 329.83708,64.015423 330.84878,62.796631 331.29163,62.257066 C 331.42353,62.096359 331.5128,61.992558 331.51892,61.993363 C 331.54899,61.997324 334.68224,61.446104 335.74654,61.249294 C 335.972,61.207603 336.11072,61.186453 336.11342,61.19173 C 336.11827,61.201175 336.43087,61.702148 336.59455,61.963195 C 336.65434,62.058564 336.69698,62.123944 336.70053,62.124478 C 336.82794,62.143649 421.23248,48.83172 425.19895,48.171124 C 425.29862,48.154976 425.35039,48.146802 425.35182,48.147008 C 429.52827,47.483099 432.87658,46.203094 436.40903,45.694947 C 436.52776,45.67673 436.64656,45.663521 436.76554,45.653371 C 436.76487,45.672696 436.71512,47.109232 436.69243,47.764017 C 436.68549,47.964462 436.67775,48.094854 436.67155,48.093867 C 436.48832,48.064676 329.83708,64.015423 329.83708,64.015423 C 329.83708,64.015423 329.83708,64.015423 329.83708,64.015423" id="path5657"/>
</g>
</g>
<path style="opacity: 1; fill: rgb(162, 132, 118); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5659" sodipodi:nodetypes="cscc" d="M 398.07932,252.417 C 397.66634,248.27707 383.37129,242.56658 378.80009,241.90106 C 281.08531,227.67449 199.3464,212.61127 116.77789,206.84791 L 398.07932,252.417 z "/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(119, 82, 25); stroke-width: 1.25455; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5661" sodipodi:nodetypes="ccc" d="M 121.42863,-5.4247966 L 123.87862,189.34826 L 391.33425,234.67282"/>
<path style="opacity: 1; fill: rgb(125, 97, 84); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5663" sodipodi:nodetypes="cccc" d="M 408.59522,13.179323 L 405.72327,244.53002 C 399.7628,241.5045 400.71703,229.55417 399.73637,219.99282 C 397.96964,176.83613 405.28789,77.348587 408.59522,13.179323 z "/>
<path style="opacity: 1; fill: rgb(164, 133, 119); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5665" sodipodi:nodetypes="cccc" d="M 110.41866,-6.856873 L 113.36428,202.5856 C 116.5702,199.84658 115.98211,189.02789 116.45506,180.37199 C 117.151,141.30211 114.0992,24.694352 110.41866,-6.856873 z "/>
<path style="fill: rgb(20, 18, 15); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 17.638311,459.61659 L 20.962563,449.64381 L 62.183389,430.36311 L 87.447762,456.29234 L 84.788345,460.94629 L 17.638311,459.61659 z " id="path4194"/>
<path style="fill: rgb(80, 63, 42); fill-opacity: 1; fill-rule: evenodd; stroke: rgb(129, 106, 77); stroke-width: 2.48918px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" id="path5667" sodipodi:nodetypes="ccccccc" d="M -4.7140917,247.71573 L 91.364365,234.89044 L 93.117023,246.28271 L 89.611707,251.54069 L 93.117023,420.67204 L -2.961434,449.83194 L -4.7140917,247.71573 z "/>
<path sodipodi:nodetypes="cccc" id="path5669" d="M 107.9974,423.14687 L 108.76784,247.48518 L 93.358922,250.56697 L 94.129373,424.68774" style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 2.49914; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5671" d="M 5.6199701,268.31852 L 77.643423,257.42148 L 77.643423,261.7252 L 11.174703,271.28906 L 5.6199701,268.31852 z " style="fill: rgb(52, 42, 26); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="csscccc" id="path5673" d="M -3.2390525,267.73119 C 1.8034821,277.43987 15.821482,286.31227 21.856702,292.13416 C 26.663188,296.77073 22.229583,318.29426 28.52069,322.39189 C 38.047038,328.59674 59.199284,339.96919 74.283725,324.74282 L 78.720467,421.60593 L -0.63546773,445.48976 L -3.2390525,267.73119 z " style="opacity: 1; fill: rgb(60, 49, 31); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5675" d="M -3.7506546,427.18932 C 23.539339,421.21387 26.63267,424.06453 58.892542,414.75633 L 56.979754,418.10368 L -5.6634157,436.27499 L -3.7506546,427.18932 z " style="opacity: 0.908046; fill: rgb(33, 26, 17); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccsscccccccc" id="path5677" d="M -5.283891,343.20973 L 7.7259675,338.72375 L 9.6387295,353.06953 C 18.530733,344.68866 27.998434,346.33647 35.318894,348.75038 C 41.798932,350.88716 35.516561,367.51753 37.709853,372.34976 C 40.303979,378.06507 53.387392,375.43916 66.543613,384.15202 L 57.936147,393.71587 C 47.293179,396.70774 36.588103,404.54369 16.333407,412.36537 L 8.2616885,415.56984 L 55.352054,405.25331 L 57.366772,408.2703 L -8.0543998,426.71115 L -5.283891,343.20973 z " style="fill: rgb(42, 34, 21); fill-opacity: 0.756579; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccc" id="path5679" d="M 64.630827,435.79679 L 14.898843,455.88088 L -13.314514,456.35908 L -9.9671615,443.92605 L 64.630827,422.4074 L 64.630827,435.79679 z " style="fill: rgb(0, 0, 0); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<g style="fill: rgb(100, 87, 59); fill-opacity: 0.888158; display: inline;" id="g5681" transform="matrix(2.48918, 0, 0, 2.48918, -701.433, -754.407)">
<path style="fill: rgb(100, 87, 59); fill-opacity: 0.888158; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;" d="M 306.60473,473.15589 L 306.41262,470.46637 L 279.32536,478.34281 L 279.70957,479.11124 L 301.99413,473.348 L 278.94114,480.07178 L 279.32536,481.22443 L 306.60473,473.15589 z " id="path5683"/>
<path style="fill: rgb(100, 87, 59); fill-opacity: 0.888158; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;" d="M 279.14646,473.91111 L 305.06786,467.00842 L 305.06786,467.96897 L 278.57013,475.25587 L 279.14646,473.91111 z " id="path5685" sodipodi:nodetypes="ccccc"/>
<path style="fill: rgb(100, 87, 59); fill-opacity: 0.888158; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;" d="M 278.74903,473.11625 L 303.7231,466.4321 L 303.83594,464.8556 L 278.33839,471.89755 L 278.74903,473.11625 z " id="path5687" sodipodi:nodetypes="ccccc"/>
</g>
<path sodipodi:nodetypes="ccccc" id="path5689" d="M 13.271066,398.22704 L 11.358304,403.00896 L 58.760938,391.17636 L 59.14009,387.35084 L 13.271066,398.22704 z " style="fill: rgb(85, 67, 46); fill-opacity: 0.703947; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<g style="display: inline;" id="g5691" transform="matrix(2.48918, 0, 0, 2.48918, -701.433, -754.407)">
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 387.60884,427.95813 L 371.78395,461.12824" id="path5693" sodipodi:nodetypes="cc"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 325.48891,434.68853 L 386.77342,462.54513" id="path5695"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 318.98903,404.66531 L 301.28681,407.13941 C 298.34467,408.72127 299.41178,412.26793 302.52488,413.02025 C 303.60538,413.02025 303.85611,412.61757 304.6915,411.78218 L 305.63105,410.30686" id="path5697" sodipodi:nodetypes="ccccc"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 301.96556,413.58792 L 303.04318,485.06539" id="path5699" sodipodi:nodetypes="cc"/>
<path sodipodi:nodetypes="cc" style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 387.68539,419.02393 L 325.17939,402.80821" id="path5701"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 325.79842,408.07001 L 387.70197,428.18866" id="path5703"/>
</g>
<path sodipodi:nodetypes="ccccc" id="path5705" d="M 81.251741,253.04236 L 48.06928,257.78272 L 53.863025,258.13388 L 79.144923,254.62249 L 81.251741,253.04236 z " style="fill: rgb(126, 126, 112); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccccccccccc" id="path5707" d="M 80.261345,366.13385 L 55.732749,371.26826 L 55.594824,384.88941 L 52.838827,388.96681 L 52.425323,415.29317 L 55.270184,417.89899 L 55.454658,425.763 L 52.033178,428.84534 L 51.879844,435.00601 L 78.180962,453.8573 L 246.67773,454.73513 L 245.90727,416.21283 L 193.51694,435.47396 L 80.261345,366.13385 z " style="fill: rgb(16, 13, 12); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5709" d="M 262.52998,396.19082 L 148.17211,344.25834 L 146.71021,344.75548 L 262.35441,397.24424 L 262.52998,396.19082 z " style="fill: rgb(117, 117, 104); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" style="opacity: 1; fill: rgb(40, 36, 29); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 51.053262,348.81313 L 112.39626,336.54452 L 261.37211,405.77446 L 191.91548,435.03774 L 51.053262,348.81313 z " id="path5711"/>
<path style="fill: rgb(130, 90, 68); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" id="path5713" sodipodi:nodetypes="ccsccccc" d="M 105.20493,350.35154 C 122.73151,362.32805 130.27469,356.93736 143.20037,368.91387 C 144.63686,371.17717 146.76269,375.55062 149.94493,378.21488 C 155.81109,383.12612 175.02508,381.43408 207.00049,398.76384 C 216.75557,404.31391 230.52903,408.94843 238.82306,414.49852 L 260.49579,406.65079 L 108.89093,336.54452 L 105.20493,350.35154 z "/>
<path id="path5715" d="M 57.768626,349.55953 L 58.006119,353.83406 L 134.94742,402.51606 L 143.9714,386.13039 L 137.32215,374.96918 L 57.768626,349.55953 z " style="fill: rgb(24, 21, 17); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccccccccc" id="path5717" d="M 74.671016,285.11274 L 73.942358,296.25054 L 57.918425,300.55066 L 58.749488,349.96597 L 71.258449,357.48446 L 101.06338,373.06787 C 113.11157,376.76988 125.26706,379.61331 138.38166,374.78389 L 139.14571,369.49606 C 139.31175,368.0961 139.11443,366.33281 138.2002,363.85259 C 146.51014,359.14824 151.73314,349.85094 151.95462,340.47014 C 146.95851,335.45959 140.58026,333.2132 133.42212,332.52668 L 133.14134,312.45332 L 74.671016,285.11274 z " style="fill: rgb(21, 18, 15); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5719" d="M 153.11374,258.20836 L 265.32008,287.50505 L 263.29946,288.27757 L 146.86641,258.20836 L 153.11374,258.20836 z " style="fill: rgb(148, 156, 160); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 1; fill: rgb(141, 97, 74); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 48.424287,273.44889 L 191.26584,336.54452 L 263.12477,314.63631 L 109.76725,264.6856 L 48.424287,273.44889 z " id="path5721"/>
<path sodipodi:nodetypes="ccccccccc" style="opacity: 0.774725; fill: rgb(222, 247, 251); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 145.69677,276.95421 L 143.94406,292.7281 L 131.04184,290.52153 C 133.65538,297.31974 129.32451,303.7853 128.73821,309.2157 L 186.17174,334.91834 C 190.17439,322.8707 176.77448,321.17323 182.50255,314.63631 L 193.01851,302.36771 C 183.97606,296.51162 183.99025,291.90981 169.35764,284.84116 L 145.69677,276.95421 z " id="path5723"/>
<path style="opacity: 1; fill: rgb(160, 160, 171); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 126.7366,308.94627 L 139.64811,314.85494 C 145.06241,294.0417 165.18953,293.52506 191.84135,304.13182 L 189.54354,298.98907 C 187.79708,295.82086 181.97949,290.31081 173.56826,285.42106 L 153.65387,279.95006 L 130.01918,288.26598 C 132.4971,296.2647 128.18212,302.77847 126.7366,308.94627 z " id="path4240" sodipodi:nodetypes="cccccccc"/>
<path sodipodi:nodetypes="cccccccc" id="path5727" d="M 169.89329,409.03699 C 168.67252,409.64738 164.09461,412.08893 164.09461,412.08893 L 158.90633,416.36162 L 170.50368,423.38106 C 176.37514,423.99129 181.38213,425.81174 189.42565,423.38106 C 201.01463,426.21094 207.2121,421.72375 212.31514,415.75127 C 212.88765,412.59759 210.834,409.44393 208.65284,406.29025 L 169.89329,409.03699 z " style="fill: rgb(24, 21, 17); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="csccccccs" id="path5729" d="M 156.53554,379.35641 C 161.30305,363.08823 212.53697,353.00416 218.98797,374.47597 C 220.16145,378.38181 213.94972,387.54034 208.15542,392.329 L 210.24135,396.12128 C 212.96347,398.71323 210.37543,401.83148 209.76221,405.64836 C 195.40355,418.78228 172.60226,414.8936 169.63312,408.50836 C 170.14527,403.19278 166.70989,403.92347 166.08507,399.4688 C 166.10627,397.18082 167.37528,395.49066 168.8627,394.64033 C 161.71799,390.18024 155.43371,383.11621 156.53554,379.35641 z " style="fill: rgb(21, 18, 15); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 1; fill: rgb(24, 21, 17); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5731" sodipodi:nodetypes="ccccccc" d="M 49.955707,348.03051 L 49.955707,353.28848 L 193.00904,442.79107 L 260.80396,412.96664 L 258.17498,405.95601 L 191.25639,434.90409 L 49.955707,348.03051 z "/>
<path style="opacity: 1; fill: rgb(24, 21, 17); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5735" sodipodi:nodetypes="ccccccc" d="M 48.626931,273.71725 L 48.424287,279.58319 L 193.01851,344.4315 L 263.12477,320.77063 L 262.20965,314.40267 L 191.26584,336.54452 L 48.626931,273.71725 z "/>
<path sodipodi:nodetypes="ccccc" id="path5737" d="M 262.61419,309.75102 L 151.12812,273.40832 L 148.84572,274.11059 L 262.43863,310.80443 L 262.61419,309.75102 z " style="fill: rgb(148, 156, 160); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 1; fill: rgb(0, 0, 0); fill-opacity: 0.382979; stroke: none; stroke-width: 0.6; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 175.17928,306.63736 C 171.12337,308.25666 168.21021,314.84605 171.34334,317.45949 C 176.93249,322.12155 195.75466,326.09753 209.44098,323.74338 C 215.85923,322.63941 221.93244,319.14216 224.14871,314.91873 L 204.00543,305.80439 L 175.17928,306.63736 z " id="path5739" sodipodi:nodetypes="cssccc"/>
<path style="fill: rgb(22, 20, 16); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" id="path5741" sodipodi:nodetypes="csccccccccssccs" d="M 192.26329,290.79232 C 193.29268,267.76756 178.15797,250.80951 178.07508,234.37588 C 178.02532,224.50202 182.71482,217.43513 190.37034,215.84992 C 189.7235,206.26949 188.24622,202.20997 181.79725,197.42577 C 181.37812,192.54011 188.31659,188.04618 193.52984,187.21314 L 193.66415,160.27058 L 204.77663,161.16272 L 204.57078,186.99896 C 211.14483,187.46484 215.15583,192.22776 216.72899,196.32812 C 211.73225,201.24261 207.80707,206.78263 207.9833,215.75195 C 215.00959,217.39307 222.47083,224.49299 222.42812,233.79088 C 222.33741,253.46783 205.36632,268.46712 206.9426,290.66258 C 207.66276,300.77565 230.21846,302.37535 226.17448,314.01823 C 212.37583,324.16096 186.85298,324.16022 172.87038,314.08461 C 169.31308,302.97377 191.90536,298.79785 192.26329,290.79232 z "/>
<g id="g5743" transform="matrix(2.48918, 0, 0, 2.48918, -1298.45, -752.866)" style="fill: rgb(42, 43, 36); fill-opacity: 1; display: inline;">
<path sodipodi:nodetypes="ccccc" id="path5745" d="M 600.93115,324.90588 L 600.94692,321.9697 L 602.26499,321.93183 L 602.27732,324.91907 L 600.93115,324.90588 z " style="opacity: 1; fill: rgb(42, 43, 36); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;"/>
<path transform="translate(0.156619, -0.391547)" d="M 602.66973 321.77393 A 1.2137969 1.2137969 0 1 1 600.24214,321.77393 A 1.2137969 1.2137969 0 1 1 602.66973 321.77393 z" sodipodi:ry="1.2137969" sodipodi:rx="1.2137969" sodipodi:cy="321.77393" sodipodi:cx="601.45593" id="path5747" style="opacity: 1; fill: rgb(42, 43, 36); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" sodipodi:type="arc"/>
</g>
<path sodipodi:nodetypes="ccccc" id="path5749" d="M -7.576203,247.86722 L 84.714915,239.25976 L 81.367562,244.04168 L -11.879925,254.56193 L -7.576203,247.86722 z " style="fill: rgb(42, 34, 21); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccc" style="opacity: 1; fill: rgb(111, 88, 59); fill-opacity: 1; stroke: none; stroke-width: 0.704; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M -6.4329221,243.51877 L 90.497283,233.82727 L -1.9328791,216.55061 L -6.4329221,243.51877 z " id="path5751"/>
<path sodipodi:nodetypes="cccccccc" id="path5753" d="M 78.020235,241.17251 L -10.92353,250.25819 L -12.836294,247.38906 L 48.850485,240.69435 L -13.314465,245.47627 L -15.705448,243.5635 L 81.367562,234.95601 L 78.020235,241.17251 z " style="fill: rgb(155, 132, 93); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccccc" id="path5755" d="M 178.921,367.73852 C 191.54703,365.01344 204.07993,360.38959 217.45311,372.89492 C 214.79531,379.38052 204.66536,383.01593 189.74501,384.82402 L 192.21398,381.84024 C 197.1211,380.99969 203.44863,379.02286 206.02489,377.41923 C 212.3608,374.87702 210.60069,372.27125 203.6061,372.53251 C 202.60641,370.81854 201.06277,368.6416 201.70182,366.84119 C 195.78924,365.42289 187.1419,366.79856 178.921,367.73852 z " style="fill: rgb(36, 35, 30); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path id="path5757" d="M 99.266869,267.82001 L 76.628185,258.51228 L 80.268265,197.9995 L 99.179449,196.29293 L 102.48804,199.76356 L 99.266869,267.82001 z " style="opacity: 1; fill: rgb(99, 123, 141); fill-opacity: 1; fill-rule: evenodd; stroke: rgb(113, 135, 152); stroke-width: 1.99135; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" sodipodi:nodetypes="cccccc"/>
<path id="path5759" d="M 75.71117,257.691 C 79.482878,251.57643 91.918058,249.92205 103.09876,251.83389 L 102.14637,266.41059 L 75.71117,257.691 z " style="opacity: 1; fill: rgb(191, 205, 210); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" sodipodi:nodetypes="cccc"/>
<path id="path5761" d="M 83.590376,202.86242 C 83.392811,208.79227 82.472461,214.30618 85.138299,216.37071 L 102.75954,223.16735 L 102.36769,213.34434 C 97.989368,213.37383 93.636988,213.20049 88.632762,211.03291 C 86.999361,210.32541 85.271173,206.69245 83.590376,202.86242 z " style="opacity: 1; fill: rgb(191, 205, 210); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" sodipodi:nodetypes="ccccsc"/>
<path style="fill: rgb(0, 0, 0); fill-opacity: 0.375886; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 76.703682,270.06015 C 68.570082,273.91881 70.497829,277.66051 74.497521,279.98788 C 85.603677,286.45036 101.86071,293.24993 114.94376,296.53406 C 126.84286,299.7101 145.45601,296.83764 150.49562,285.68902 L 103.17759,269.69246 L 76.703682,270.06015 z " id="path5763" sodipodi:nodetypes="cscccc"/>
<path id="path5765" d="M 74.49879,269.42254 L 75.433925,257.52101 L 100.1399,265.86022 L 102.77034,204.14858 L 127.85064,198.11542 L 146.46463,205.10161 L 153.44684,280.21175 C 153.36263,292.90837 133.15043,296.84446 120.9946,293.89849 L 75.805485,275.7977 L 74.49879,269.42254 z " style="opacity: 1; fill: rgb(83, 81, 78); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" sodipodi:nodetypes="cccccccccc"/>
<path style="opacity: 1; fill: rgb(163, 153, 154); fill-opacity: 1; stroke: none; stroke-width: 0.6; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 124.99724,210.38694 L 125.16454,258.09838 L 119.87331,264.21477 L 120.04643,285.39596 L 92.021111,277.73766 L 97.328121,282.272 L 119.2754,289.82975 C 133.25661,294.6443 152.9501,288.62827 153.43067,278.936 L 141.85799,204.1253 L 124.99724,210.38694 z " id="path5767" sodipodi:nodetypes="ccccccsccc"/>
<path sodipodi:nodetypes="ccccccccccc" id="path5769" d="M 28.851602,232.36345 L 38.282614,233.25408 L 43.894151,230.20493 L 46.838753,230.30946 L 50.069562,228.90404 L 50.354424,208.99076 L 45.039822,208.07223 L 44.458024,193.29199 L 36.375327,193.35161 L 28.122247,195.45051 L 28.851602,232.36345 z " style="fill: rgb(29, 27, 15); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccccc" id="path5771" d="M 27.773039,194.85293 L 35.701159,193.34309 L 45.077059,193.40549 L 39.124729,195.00519 L 39.119899,229.92 L 36.711219,230.61308 L 36.037023,195.70299 L 27.773039,194.85293 z " style="opacity: 1; fill: rgb(75, 73, 59); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccc" id="path5773" d="M -4.2600399,228.04936 C 4.1040332,226.17841 22.949229,224.51967 31.61106,228.42944 C 25.141453,234.82177 15.297809,236.8806 -3.1460822,237.19678 L -4.2600399,228.04936 z " style="fill: rgb(128, 131, 132); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccc" id="path5775" d="M 6.027748,231.60883 L -4.1000605,230.68605 L -4.2738549,212.67094 L 8.0351733,210.9219 L 19.402817,212.01529 L 16.925931,225.81981 L 6.027748,231.60883 z " style="fill: rgb(152, 144, 117); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccccc" id="path5777" d="M 21.320558,230.78081 L 19.907001,212.03786 L 7.854284,210.93026 L 14.768136,212.83999 L 13.192532,219.02676 L 10.012006,212.67323 L 4.0043418,213.62627 L 4.7866419,231.99044 L 21.320558,230.78081 z " style="fill: rgb(194, 185, 135); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="fill: rgb(22, 20, 16); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 192.23357,284.98478 C 191.21066,286.10939 191.54582,287.0465 192.35549,287.92488 C 191.74487,288.36143 191.7733,289.93162 192.17261,290.51495 L 207.04915,290.37495 C 207.86874,289.99198 207.55528,288.18385 206.98819,287.50488 C 207.50724,287.00023 207.643,285.65696 206.98817,284.84479 L 192.23357,284.98478 z " id="path5779" sodipodi:nodetypes="ccccccc"/>
<path style="fill: rgb(22, 20, 16); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-opacity: 1; display: inline;" d="M 182.05881,194.87017 L 216.11729,194.69773 C 217.12043,194.69265 217.9272,196.1065 216.72085,196.68087 L 181.80016,197.37066 C 180.64472,196.83223 180.81622,194.87647 182.05881,194.87017 z " id="path5781" sodipodi:nodetypes="csccs"/>
<path style="fill: rgb(77, 80, 69); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 213.20237,192.16728 L 204.10054,193.6301 C 202.90863,191.8964 201.44586,189.40424 201.9876,188.10396 C 199.87468,188.38292 196.78658,189.0461 194.18606,188.10396 C 192.79901,191.04042 194.29844,192.90636 193.53593,195.09286 L 183.78399,193.79261 C 185.56102,190.73856 188.7338,188.5613 194.51112,187.29131 C 196.95731,188.16432 200.64703,187.28815 203.28788,186.96625 C 206.99511,187.76567 212.39275,189.387 213.20237,192.16728 z " id="path5783" sodipodi:nodetypes="ccccccccc"/>
<path style="fill: rgb(22, 20, 16); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-opacity: 1; display: inline;" d="M 178.4209,234.84893 L 193.79282,234.87412 L 222.55277,234.92124 C 223.83231,234.92332 223.48714,238.7439 222.1155,238.74565 L 178.52211,238.80131 C 177.3557,238.80279 177.09502,234.84677 178.4209,234.84893 z " id="path5785" sodipodi:nodetypes="ccssss"/>
<path style="opacity: 1; fill: rgb(215, 221, 234); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 203.10236,173.06417 L 203.13987,187.33182 C 207.70831,187.21031 211.02727,190.00086 213.07785,192.05768 C 211.07884,192.66571 207.34889,193.07324 204.83311,192.88806 L 206.4652,194.26287 C 209.15065,194.02607 211.72269,193.675 213.97701,193.00704 L 214.61141,194.20665 C 212.58452,195.14847 208.70469,195.78146 204.08867,196.29177 L 205.45342,197.71745 C 210.27637,197.14815 213.58711,196.57886 216.25116,196.00956 L 210.76107,202.36714 L 205.21012,203.38484 L 203.74686,214.89926 C 212.01478,217.53085 213.47859,221.86109 208.81256,223.1791 C 209.00645,225.38889 210.42473,231.10433 211.14003,233.76513 C 213.41752,233.73701 215.73454,232.98436 218.05901,232.16541 C 218.65426,231.9557 218.51569,232.7485 217.95625,233.04612 C 214.99275,234.62256 208.45156,236.42134 203.4622,236.8637 C 202.97277,236.90708 202.8618,238.3408 203.4622,238.32651 C 208.2411,238.21287 212.76075,236.97524 215.78946,236.10925 C 213.07273,237.36399 206.95681,239.46801 201.78294,239.64413 C 201.35291,239.98323 201.35383,240.69437 201.78294,241.05859 C 209.37788,240.74812 217.92108,239.45775 223.3132,237.49664 C 223.39511,236.6893 223.68426,234.94232 222.41445,234.91598 C 222.43066,234.58293 222.44071,234.21767 222.4422,233.79795 C 222.47514,224.50001 215.00017,217.39246 207.97383,215.75138 C 207.79761,206.78206 211.55998,201.70226 216.55669,196.78777 C 218.21901,196.47034 217.35587,194.34755 215.89972,194.50186 C 213.97155,190.84786 210.2844,187.37652 204.55121,186.97021 L 204.70678,173.12415 L 203.10236,173.06417 z " id="path5787" sodipodi:nodetypes="cccccccccccccccsssscccccscccccc"/>
<path style="opacity: 1; fill: rgb(153, 143, 130); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5789" sodipodi:nodetypes="ccccc" d="M 129.92281,160.88 C 134.17264,176.96858 267.27865,179.51922 271.01175,163.64645 L 263.63453,56.677128 C 257.65208,48.956582 145.11465,48.784878 137.34134,57.72318 L 129.92281,160.88 z "/>
<path style="opacity: 1; fill: rgb(224, 230, 237); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5791" sodipodi:nodetypes="cssssscccc" d="M 239.42706,55.035362 C 239.8791,58.988257 234.13037,64.557752 233.07444,70.370315 C 232.00363,76.264897 234.37159,80.951653 235.7038,86.818305 C 236.92661,92.203327 236.76667,98.737499 235.7038,103.418 C 234.53121,108.58159 233.87678,113.20914 231.51542,118.17335 C 227.04365,127.57424 222.59628,133.35346 218.49792,142.90953 C 214.84109,151.43612 216.89218,162.6532 220.62025,170.68459 C 245.9652,170.33436 263.67598,168.91451 270.88487,162.76482 L 263.85391,57.793301 C 260.46869,55.22825 250.66089,54.329256 239.42706,55.035362 z "/>
<path style="opacity: 1; fill: rgb(87, 95, 83); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 185.81579,236.42438 C 185.7594,236.62107 185.85643,236.88458 185.87677,237.11466 C 191.40768,238.26895 197.60968,238.95343 204.05651,238.31971 L 203.93454,238.26662 L 203.50769,237.25771 L 203.71575,236.91097 C 197.55977,237.1545 191.59806,237.0187 185.81579,236.42438 z " id="path5793" sodipodi:nodetypes="ccccccc"/>
<path style="opacity: 1; fill: rgb(77, 80, 69); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 205.57334,239.02269 C 196.55783,240.24871 188.98544,239.98331 181.44931,237.88064 L 182.83626,239.33694 C 188.54087,240.91491 195.79487,241.63306 203.16379,241.17685 L 205.57334,239.02269 z " id="path5795" sodipodi:nodetypes="ccccc"/>
<path style="opacity: 1; fill: rgb(77, 80, 69); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 204.11743,200.80683 L 206.5839,202.77727 L 208.66834,200.85538 L 213.86939,199.01897 L 215.00709,198.04379 C 205.07742,200.90535 194.75922,201.13803 183.96341,198.36885 C 186.24706,199.54025 189.10484,201.65739 190.52171,204.99574 C 191.863,204.29089 193.53397,202.51092 193.55283,200.80685 L 204.11743,200.80683 z " id="path5797" sodipodi:nodetypes="ccccccccc"/>
<path style="opacity: 1; fill: rgb(77, 80, 69); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 183.46037,219.4343 C 182.74703,225.90659 192.74104,227.2832 200.74543,227.17312 C 209.17146,227.05722 217.38051,225.0527 215.70683,219.64231 C 213.44463,217.83094 211.09736,216.24637 208.28668,215.8976 C 210.19076,220.08181 189.23901,221.50086 189.42423,216.10561 C 187.17443,216.66836 185.15576,217.76268 183.46037,219.4343 z " id="path5799" sodipodi:nodetypes="cscccc"/>
<path style="fill: rgb(77, 80, 69); fill-opacity: 0.557377; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 173.6342,308.208 C 172.95259,307.75009 172.17874,309.37712 172.84579,309.80925 C 187.30379,319.17531 215.76323,317.31893 226.47608,309.58352 C 226.99728,309.20718 226.41009,307.58533 225.76063,308.01699 C 214.06414,315.79073 186.94787,317.15185 173.6342,308.208 z " id="path5801" sodipodi:nodetypes="cssss"/>
<path style="fill: rgb(77, 80, 69); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 174.1763,307.06847 C 174.1763,307.06847 177.09762,309.19808 178.01492,308.95605 C 178.96534,308.70532 179.51069,306.82987 180.53558,306.69378 C 186.95688,305.84121 206.14133,308.97176 212.49633,311.94521 C 216.07359,309.52171 219.77363,307.00175 222.70417,304.79381 C 217.89848,300.80067 210.04249,298.06498 207.03984,292.37697 C 207.38315,295.86198 208.65432,298.23356 210.09631,300.40016 L 203.60134,293.52314 C 203.7089,295.49819 203.42735,297.18137 202.64619,298.48989 C 200.00441,296.39018 192.20435,297.06217 193.24747,302.7272 C 188.1345,300.85299 188.13435,300.1842 191.23317,293.46413 C 186.73559,298.62978 176.95547,302.6407 174.1763,307.06847 z " id="path5803" sodipodi:nodetypes="cssccccccccc"/>
<path style="fill: rgb(77, 80, 69); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 198.87771,286.35699 C 200.49344,287.31879 206.4395,286.48456 206.97649,285.20711 C 204.70727,285.90053 202.097,286.27288 198.87771,286.35699 z " id="path5805" sodipodi:nodetypes="ccc"/>
<g transform="matrix(2.48918, 0, 0, 2.48918, -1298.84, -754.407)" id="g5807" style="fill: rgb(215, 221, 234); fill-opacity: 1; display: inline;">
<path sodipodi:nodetypes="ccccccc" id="path5809" d="M 603.66528,421.3078 C 606.71595,424.98309 607.75464,424.40255 608.52031,426.12935 C 608.46377,426.90216 607.98477,427.62216 607.21448,428.30575 C 604.16934,426.67995 603.28126,426.71321 602.6273,426.12935 L 602.54761,425.49055 C 604.54434,425.17156 604.78226,423.77232 603.63179,423.14937 L 603.66528,421.3078 z " style="fill: rgb(215, 221, 234); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;"/>
<path sodipodi:nodetypes="ccscc" id="path5811" d="M 599.81473,425.25879 L 599.94867,426.12936 C 596.95551,425.14186 594.47193,425.487 594.52442,424.79003 C 594.55481,424.38646 594.92569,423.72948 595.86373,423.38375 C 596.53792,424.24788 598.19247,424.96662 599.81473,425.25879 z " style="fill: rgb(215, 221, 234); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;"/>
<path sodipodi:nodetypes="ccc" id="path5813" d="M 603.6318,429.47766 C 604.53443,430.25472 610.21758,429.21398 610.62974,427.93744 C 608.84454,428.59107 606.21536,429.26703 603.6318,429.47766 z " style="fill: rgb(215, 221, 234); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1;"/>
<path sodipodi:nodetypes="ccc" id="path5815" d="M 601.75757,419.36416 C 602.40667,419.75055 604.79543,419.41541 605.01116,418.90221 C 604.09953,419.18078 603.05088,419.33037 601.75757,419.36416 z " style="fill: rgb(215, 221, 234); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccc" id="path5817" d="M 603.14075,418.02444 C 603.31671,418.33145 604.45589,418.068 604.56767,417.77296 C 604.21308,417.89261 603.61502,417.9916 603.14075,418.02444 z " style="fill: rgb(215, 221, 234); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
</g>
<path style="opacity: 1; fill: rgb(116, 101, 82); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 137.65956,57.262209 C 146.85292,50.570243 213.16669,48.80036 253.0927,53.307198 L 220.22897,53.237202 C 188.75751,52.031219 148.10894,53.776333 137.46,59.564279 L 137.65956,57.262209 z " id="path5819" sodipodi:nodetypes="ccccc"/>
<path style="opacity: 1; fill: rgb(224, 226, 237); fill-opacity: 0.349727; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 131.11077,157.80538 L 138.04477,60.729216 C 144.75648,56.751777 168.23055,54.83568 183.88634,54.950855 C 181.90204,57.150669 177.35452,59.713954 175.02623,61.499668 C 171.17078,65.229333 168.03651,69.567505 165.39565,74.212019 C 164.12464,76.754096 161.68309,79.045339 160.00255,81.146033 C 156.68039,85.38028 154.37387,89.566711 152.68331,94.628835 C 150.94718,98.549098 150.21564,102.80676 149.21631,106.95596 C 148.4195,110.1432 147.18149,113.27778 146.51975,116.58652 C 144.70979,121.43025 143.40534,126.1195 142.66746,131.22501 C 141.79702,134.70674 140.44469,137.80474 139.58568,141.24081 C 136.78328,146.98632 134.56378,151.63984 131.11077,157.80538 z " id="path5821" sodipodi:nodetypes="cccccccccccc"/>
<path style="fill: rgb(116, 101, 82); fill-opacity: 0.737705; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 133.62992,164.76783 C 132.59409,163.78483 132.76562,162.8782 133.1903,162.641 C 133.93698,162.22399 134.91404,161.70081 136.40501,162.39057 C 152.27058,169.7154 180.83189,171.45828 218.17062,171.42811 C 222.85446,171.42433 232.07394,171.7128 239.33091,171.533 C 239.66339,172.42045 239.81882,173.24761 236.42292,173.32563 C 193.28388,176.46875 153.66284,173.44729 133.62992,164.76783 z " id="path5823" sodipodi:nodetypes="csssccc"/>
<path sodipodi:nodetypes="ccsccccccc" id="path5825" d="M 135.39781,210.83139 C 135.57534,233.52664 137.37656,249.20475 138.77967,269.4489 C 138.59054,273.58901 136.19778,277.88738 133.74623,278.80464 C 130.13028,280.15756 122.03748,280.30007 117.17816,279.09869 L 118.88505,281.83034 C 125.07467,283.55111 132.80635,282.64632 139.50999,280.91776 L 139.49566,283.6732 C 145.36317,283.24784 150.54866,280.21161 153.26483,274.57191 L 146.30834,205.11513 L 135.39781,210.83139 z " style="opacity: 1; fill: rgb(233, 235, 238); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 1; fill: rgb(242, 242, 242); fill-opacity: 1; stroke: none; stroke-width: 2.9; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 82.175153,199.28961 C 71.682257,196.25554 92.904248,192.56955 104.51336,194.63584 L 126.34027,198.52081 C 128.92914,198.2778 131.50991,198.23789 133.28744,198.38769 C 137.72225,198.76144 141.82213,200.406 145.05645,202.94889 C 152.68023,208.94296 130.55844,213.27999 120.80162,210.45873 L 82.175153,199.28961 z " id="path5827" sodipodi:nodetypes="cscssss"/>
<path style="fill: rgb(110, 110, 110); fill-opacity: 0.765027; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 108.93445,201.84922 L 102.88452,203.71073 L 103.11721,203.71073 L 86.828951,199.05693 L 86.828951,196.26467 L 86.828951,196.03198 L 108.93445,201.84922 z " id="path5829" sodipodi:nodetypes="ccccccc"/>
<path style="opacity: 1; fill: rgb(236, 236, 236); fill-opacity: 1; stroke: rgb(195, 195, 195); stroke-width: 1.49351; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 129.12298,199.63278 L 130.06344,204.65939" id="path5831" sodipodi:nodetypes="cc"/>
<path style="opacity: 1; fill: rgb(236, 236, 236); fill-opacity: 1; stroke: rgb(195, 195, 195); stroke-width: 1.49351; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 132.51927,199.93265 L 133.3857,204.11403" id="path5833"/>
<path style="opacity: 1; fill: rgb(236, 236, 236); fill-opacity: 1; stroke: rgb(195, 195, 195); stroke-width: 1.49351; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 135.88899,200.48296 L 136.36298,202.29603" id="path5835" sodipodi:nodetypes="cc"/>
<path style="opacity: 1; fill: rgb(236, 236, 236); fill-opacity: 1; stroke: rgb(195, 195, 195); stroke-width: 1.49351; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 126.09243,200.84168 L 126.56395,203.26708" id="path5837" sodipodi:nodetypes="cc"/>
<path style="opacity: 1; fill: rgb(135, 147, 182); fill-opacity: 1; stroke: none; stroke-width: 0.6; stroke-linecap: round; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 117.67546,203.98474 C 119.80003,207.98149 131.23819,209.30179 143.64959,206.45861 L 139.51736,207.88293 C 132.2298,210.5536 117.30367,208.4068 117.67546,203.98474 z " id="path5839" sodipodi:nodetypes="cccc"/>
<g style="display: inline;" id="g5841" transform="matrix(2.48918, 0, 0, 2.48918, -701.433, -754.407)">
<path sodipodi:nodetypes="ccccc" style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 386.83501,464.24179 L 387.8741,418.97261 L 379.59608,421.94326 L 380.27355,421.68879 L 378.81187,480.44852" id="path5843"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 359.84537,437.92081 L 359.46132,487.0343" id="path5845" sodipodi:nodetypes="cc"/>
<path style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 380.37159,462.80562 L 359.62873,471.31995" id="path5847" sodipodi:nodetypes="cc"/>
<path sodipodi:nodetypes="csccc" style="opacity: 1; fill: none; fill-opacity: 1; stroke: rgb(0, 0, 0); stroke-width: 1.004; stroke-linejoin: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" d="M 380.45282,424.27956 L 361.3069,429.97628 C 360.09003,430.33835 358.07571,432.28489 358.04605,434.36255 C 357.84483,437.44343 360.66039,439.27155 363.69546,436.64983 L 365.38806,434.47711" id="path5849"/>
</g>
<path sodipodi:nodetypes="cccssccsscccccc" style="opacity: 1; fill: rgb(28, 34, 42); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5851" d="M 239.04141,454.22923 C 238.88377,451.75219 242.16921,442.18064 248.64239,425.69995 C 255.32953,412.7224 262.08964,395.80341 268.68564,386.20818 C 272.35373,378.86565 284.50295,368.23388 284.50295,359.83734 C 284.50295,354.02657 285.66785,350.3896 287.66285,346.39615 C 289.35035,343.01829 290.6217,340.4734 292.40267,336.90829 C 295.29894,328.18842 298.76833,319.57963 301.17263,316.57489 C 309.18795,306.501 322.30507,300.74733 325.83689,299.91569 C 330.75601,298.7574 336.68044,296.58482 342.17092,296.58482 C 346.67117,296.58482 354.85652,298.3135 359.6296,298.3135 C 369.56835,294.63006 377.7786,294.02569 388.48957,294.07116 C 401.57465,291.72544 423.10799,296.7148 436.26614,295.15659 C 451.9017,291.35734 465.81185,292.88601 478.83624,302.11939 L 478.83624,453.92549 L 239.04141,454.22923 z "/>
<rect y="359.26825" x="391.06491" height="102.49209" width="78.276924" id="rect5853" style="fill: rgb(0, 0, 0); fill-opacity: 1; stroke: none; stroke-width: 0.5; stroke-linecap: round; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccsccsscsscccccsssssssssssssssscc" style="opacity: 0.98; fill: rgb(100, 118, 143); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5855" d="M 235.17373,454.79939 C 240.8327,437.60974 247.63569,422.24939 255.66853,406.1698 C 253.45084,402.93749 282.99991,338.22004 287.66285,339.28026 C 287.12595,334.9867 295.0251,320.51148 298.63432,318.59837 C 298.21435,315.93502 302.31363,309.21489 305.04222,307.65398 C 307.56495,302.23536 317.05,298.19537 319.17355,299.43949 C 320.42308,296.9651 326.11807,294.48816 330.76039,294.17123 C 337.1383,293.73582 356.30512,296.80091 359.85723,297.28363 C 364.50469,314.60529 350.52579,337.04863 339.28259,345.5271 C 332.96608,341.15005 332.55238,329.85002 332.06886,328.77334 C 331.72376,328.00484 333.84175,317.12988 332.59565,316.49627 C 331.60841,315.99429 331.35482,320.82602 329.83628,322.72204 C 328.56009,314.81248 324.51372,303.60331 324.29208,303.57574 C 323.23978,303.4448 322.19255,311.44165 318.73095,313.49696 C 317.80641,314.04588 320.81674,318.31836 320.15705,321.91501 C 319.03388,320.04329 315.02859,323.13045 314.08444,321.76297 C 312.70332,322.00601 311.50802,323.78844 310.60969,323.50547 C 311.49803,326.90218 318.49777,335.59186 324.177,344.78991 C 316.08314,337.72225 311.65131,331.89912 302.72638,318.66784 C 302.79924,321.34752 305.45391,325.43055 305.36803,327.65382 C 305.31553,329.01241 302.65831,331.4488 302.24717,335.78248 C 301.9353,339.07002 294.66644,334.30864 294.10492,336.29632 C 293.61911,338.01604 296.24211,341.70895 296.41683,344.26206 C 296.52508,345.84398 288.17754,342.93195 287.1938,346.48622 C 286.64305,348.47619 296.33371,351.86586 295.06787,353.47967 C 293.67758,355.25215 293.16325,359.14589 291.0343,365.78988 C 289.36824,370.98923 267.25497,401.64043 264.93278,404.81571 C 263.96168,406.14356 259.97542,404.5063 261.23093,405.80558 C 263.27678,407.92285 270.52785,416.39078 268.28176,415.57732 C 265.67808,414.63431 259.48867,409.0352 260.31222,410.86686 C 260.66022,411.64087 264.32774,414.46788 268.14247,417.56029 C 272.66834,421.2292 260.94148,417.77648 260.58414,419.20717 C 259.22102,424.6645 262.84524,428.85612 260.43683,433.67707 C 259.26086,436.03109 246.28429,435.16123 247.25781,437.68641 C 248.1028,439.8782 261.91303,438.87095 261.72253,440.8694 C 261.3861,444.39898 252.94952,446.2845 251.03897,454.05824 L 235.17373,454.79939 z "/>
<path sodipodi:nodetypes="ccccccccccccccc" id="path5857" d="M 330.72156,294.16061 C 326.28012,294.46381 320.86084,296.9106 319.30716,299.27425 L 319.44246,300.28215 C 317.48181,301.30866 315.15885,302.51183 313.89236,305.27386 L 317.02748,306.47456 L 322.16499,301.16143 C 321.35746,303.10423 320.13729,304.84072 320.68704,307.46217 C 316.85232,312.03938 314.03079,319.73978 314.77524,320.99709 C 316.33198,320.87104 317.38878,313.45957 321.64078,308.14195 C 322.13172,305.54737 322.918,303.65397 324.12996,301.78039 L 328.05294,296.76814 L 329.27057,299.4704 C 335.21513,297.2559 344.35742,299.5625 352.19076,300.07241 L 355.61339,296.64978 C 349.06263,295.68376 336.09045,293.79407 330.72156,294.16061 z " style="fill: rgb(210, 217, 225); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccsccccscc" style="opacity: 1; fill: rgb(0, 0, 0); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="path5859" d="M 372.48782,293.29161 C 368.33001,294.77259 359.71788,300.03858 356.33759,303.3519 C 342.50721,312.02703 340.34646,327.93517 336.71126,336.76088 C 333.974,343.40657 333.87359,358.17919 334.20104,364.43388 C 326.4275,386.30901 306.86625,419.5029 299.81755,453.67643 C 315.90875,462.63601 343.84156,457.46504 367.9594,457.75996 C 382.41294,424.75234 402.98121,355.98337 420.37826,297.37545 C 416.84939,293.84355 414.87032,296.09656 410.39835,293.85864 C 406.39521,291.85532 396.60694,287.74591 391.93007,287.74591 C 386.28341,288.70608 378.23402,292.14274 372.48782,293.29161 z "/>
<path sodipodi:nodetypes="csscccccccccscccccccccccc" id="path5861" d="M 339.52884,329.61678 C 340.8662,323.13493 342.88077,319.57679 345.75092,314.01892 C 349.64599,306.47633 355.18798,298.23225 358.34772,296.02346 C 361.10372,294.09688 367.46542,293.38414 372.02428,292.06447 C 378.02777,288.32793 383.43232,286.68755 388.58011,285.946 C 396.0195,285.95175 402.42777,290.01415 412.33409,292.42437 C 406.05638,295.42575 400.96004,299.07221 395.1061,303.34488 C 397.31082,300.50764 400.6609,296.6349 404.77599,295.30366 C 396.40692,299.4934 389.72215,303.39054 384.26118,308.26037 C 387.2247,303.23042 392.72367,300.01147 398.65755,297.10319 C 391.99051,297.22187 383.99849,302.56465 376.75072,310.13555 C 381.99067,303.00454 386.21998,295.71382 395.97713,291.50569 C 394.14479,290.34997 392.23829,289.90342 390.01973,290.98473 C 377.19912,297.23327 364.03642,323.98319 354.47416,368.71674 C 353.39442,371.71599 352.95892,370.52793 351.87919,373.52717 C 358.68291,341.46431 362.42669,329.85492 368.42517,308.26037 C 367.30438,308.65481 366.50567,310.01557 365.54591,311.85946 C 366.01251,306.73814 369.08685,303.28425 371.62656,299.82142 C 360.38534,307.90389 355.56048,322.60556 347.75914,342.6884 C 350.0353,333.7252 351.98933,326.85568 354.74864,318.69774 C 350.45099,323.97037 347.4833,333.79467 344.31127,346.41074 C 341.38298,350.91532 338.90624,358.12937 336.39329,365.12601 C 338.89762,354.10002 340.91101,342.4603 345.0311,333.45401 C 346.23461,326.11261 347.48568,318.78075 350.78965,311.85946 C 345.66526,317.08683 342.68998,323.37167 339.52884,329.61678 z " style="opacity: 1; fill: rgb(51, 60, 69); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 1; fill: rgb(24, 12, 19); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" d="M 435.54131,285.32339 C 451.40339,284.0198 459.16787,284.20457 468.45725,288.05357 C 475.27552,324.10382 466.79752,340.94421 462.70066,347.73699 C 429.35031,378.01025 411.6529,443.48193 399.23123,451.3531 C 377.04779,458.08691 332.29632,469.41892 312.2195,460.34679 C 308.59545,458.53319 324.21639,429.4902 325.63357,426.0151 C 345.00359,372.68972 365.7097,339.77031 387.19939,319.51384 C 392.84263,312.67554 401.22072,302.87041 405.69801,298.80387 C 415.92669,290.67216 422.09176,287.08438 435.54131,285.32339 z " sodipodi:nodetypes="ccccccccc" id="path5863"/>
<path sodipodi:nodetypes="ccccccccccccccccc" id="path5865" d="M 316.8755,299.37232 C 313.24514,300.0325 307.03431,303.35962 305.05188,307.61774 C 302.32328,309.17866 298.17561,315.92232 298.59561,318.5857 C 294.98639,320.49881 287.09078,334.98343 287.62765,339.27702 C 283.284,338.28941 257.39646,394.31916 255.65723,404.61804 L 259.51759,403.48475 L 275.64846,370.08065 L 279.14888,371.09188 L 284.67175,346.43342 L 289.7279,341.37727 L 299.84021,320.21923 C 301.23491,320.53966 302.13398,319.45674 302.59428,318.3977 L 303.53676,319.69811 L 307.8522,316.1743 L 308.86343,311.19594 C 308.7046,314.45976 309.42871,316.25207 310.34138,317.73004 C 310.45469,310.37197 311.41107,303.51973 316.8755,299.37232 z " style="fill: rgb(210, 217, 225); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccsscsscscccssc" d="M 327.43422,418.86 C 326.54884,420.68404 322.81813,430.83737 322.7165,434.49604 C 345.81907,382.51954 352.73526,353.75987 385.82139,324.76363 C 380.15653,333.42862 377.02915,336.54925 374.24835,342.03022 C 371.72314,347.00743 366.88541,364.82917 363.37428,370.97227 C 356.26144,383.41683 359.41877,386.07881 354.39406,397.42871 C 360.0669,389.63595 366.97781,382.02048 371.25445,374.68043 C 374.69067,368.78276 379.33282,358.12558 380.81331,353.55385 C 383.07443,346.57159 384.36882,340.22137 386.00283,330.43698 C 390.44886,327.354 395.4906,323.33197 398.05118,319.79359 C 402.82587,313.19568 402.28308,305.55426 410.06324,297.41292 C 425.09398,296.9106 431.42776,293.82564 452.99455,285.61857 L 453.73409,280.97262 C 446.95483,280.97424 439.49044,281.43153 432.70831,282.78796 C 404.2729,288.47504 408.4792,296.78663 387.41815,316.75558 C 356.23836,346.31857 345.55704,376.09173 327.43422,418.86 z " style="fill: rgb(112, 39, 64); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" id="path5867"/>
<path sodipodi:nodetypes="cscsc" id="path5869" d="M 381.45221,344.13775 C 378.76593,349.76326 372.26202,361.63971 371.67022,362.70887 C 371.07966,363.77575 364.38936,374.64839 361.12859,386.43587 C 364.81028,381.55057 371.72827,372.39992 372.27531,371.50008 C 372.9759,370.34761 380.34955,349.86923 381.45221,344.13775 z " style="fill: rgb(24, 12, 19); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="csccc" id="path5871" d="M 369.6273,359.83087 C 370.50705,353.6027 372.95106,347.16971 376.04058,342.00148 C 378.5299,337.83733 381.25053,333.646 384.09848,329.54865 C 383.2836,334.87247 377.59263,342.90107 376.04374,346.00481 C 374.00234,349.86642 371.78348,353.54648 369.6273,359.83087 z " style="fill: rgb(24, 12, 19); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccc" id="path5873" d="M 368.58312,337.98796 C 380.37849,321.97071 400.30855,305.01018 409.95279,296.04817 C 402.30943,305.32458 401.99841,317.52115 384.12631,331.61253 L 388.5869,325.68514 C 393.90971,320.55474 397.5556,312.70008 402.33187,306.20941 C 395.94627,312.73676 384.25846,320.11525 368.58312,337.98796 z " style="fill: rgb(196, 109, 139); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path id="path5875" d="M 384.40057,328.49919 C 385.03121,327.86853 401.42782,307.43586 401.42782,307.43586 L 397.51786,314.49902 L 384.40057,328.49919 z " style="fill: rgb(24, 12, 19); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path id="path5877" d="M 411.89642,296.8411 L 419.0857,290.91311 L 448.72573,284.10222 L 420.22086,292.30051 L 411.89642,296.8411 z " style="fill: rgb(24, 12, 19); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path id="path5879" d="M 411.64417,295.39063 L 418.83344,289.46265 L 448.47348,282.65174 L 419.96861,290.85004 L 411.64417,295.39063 z " style="fill: rgb(196, 109, 139); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="csscsscc" id="path5881" d="M 453.42108,316.08752 C 446.85107,317.21381 437.69858,317.58756 431.61121,319.84819 C 426.41727,321.77703 408.25942,335.09906 405.14346,339.5582 C 402.66091,343.11088 398.71665,354.38446 396.83951,361.89302 C 399.65522,355.32304 405.89583,345.00746 407.95918,342.37391 C 411.23908,338.18763 429.75072,326.90009 434.42692,324.91645 C 440.81215,322.20788 448.31781,322.28845 455.26324,320.97447 L 453.42108,316.08752 z " style="fill: rgb(49, 21, 34); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cscscc" id="path5883" d="M 453.57381,325.47962 C 443.2495,329.98476 428.02435,334.3829 422.41003,338.99505 C 411.11837,348.27111 405.11484,364.5115 402.00322,377.46063 C 409.48634,362.96843 418.08952,349.93807 429.22501,340.28361 C 433.7089,336.39607 444.00036,333.17591 453.01066,328.85848 L 453.57381,325.47962 z " style="fill: rgb(49, 21, 34); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccc" id="path5885" d="M 415.91003,378.606 C 427.27645,356.99248 441.48904,342.99695 454.13693,337.30562 L 453.01066,341.81077 C 442.70953,346.72995 436.94619,353.91807 432.71842,361.87394 C 438.24035,355.20616 446.11761,350.42265 454.13693,345.75278 L 454.20378,352.70138 C 443.30395,357.60673 428.12225,366.68523 415.91003,378.606 z " style="fill: rgb(49, 21, 34); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5887" d="M 57.531157,300.40257 L 58.310943,350.40686 L 70.116884,354.34297 L 69.404828,306.61029 L 57.531157,300.40257 z " style="fill: rgb(51, 42, 25); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5889" d="M 74.560621,312.98772 L 85.009435,318.61849 L 85.088491,360.13261 L 75.668606,356.84158 L 74.560621,312.98772 z " style="fill: rgb(36, 35, 30); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccccc" id="path5891" d="M 104.31338,336.73597 L 106.45065,338.16082 L 102.88855,340.29807 C 104.2986,344.56265 110.23574,344.94686 115.94956,345.52248 C 113.18072,349.35669 109.55234,352.27974 100.5138,352.4092 C 97.875642,348.082 98.95958,344.49923 99.32644,340.77302 C 99.651123,337.64382 102.18122,336.50529 104.31338,336.73597 z " style="fill: rgb(36, 35, 30); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5893" d="M 54.976485,390.74852 L 81.528289,410.47056 L 81.826792,424.15133 L 55.777802,403.86208 L 54.976485,390.74852 z " style="fill: rgb(42, 41, 35); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5895" d="M 87.185901,407.81622 L 117.00243,429.84119 L 118.2232,420.96752 L 87.796298,399.27081 L 87.185901,407.81622 z " style="fill: rgb(42, 41, 35); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5897" d="M 87.796298,412.69932 L 88.101496,417.5824 L 115.12262,438.4328 L 114.81744,432.63414 L 87.796298,412.69932 z " style="fill: rgb(31, 30, 26); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5899" d="M 58.064888,383.15515 L 58.064888,376.90783 L 71.452057,385.83259 L 71.005795,391.6337 L 58.064888,383.15515 z " style="fill: rgb(34, 34, 29); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5901" d="M 264.19429,286.92709 L 242.59938,294.65214 L 244.53063,295.35442 L 265.24772,287.98051 L 264.19429,286.92709 z " style="fill: rgb(148, 156, 160); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="cccccc" id="path5903" d="M 243.12608,301.14816 L 197.1271,314.66696 C 194.49745,316.13003 192.73584,317.59311 191.5089,319.05618 C 193.06692,317.57698 195.17484,316.20776 199.05836,315.19367 L 243.12608,302.37714 L 243.12608,301.14816 z " style="fill: rgb(148, 156, 160); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccc" id="path5905" d="M 45.260189,267.79014 C 47.78061,270.67321 50.585196,272.56177 54.038612,272.17934 C 46.567383,273.72036 45.343028,269.97912 45.260189,267.79014 z " style="fill: rgb(126, 126, 112); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5907" d="M 243.86329,396.60106 L 197.19786,416.05337 L 210.3001,411.62741 L 241.84153,398.06475 L 243.86329,396.60106 z " style="fill: rgb(87, 87, 77); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path sodipodi:nodetypes="ccccc" id="path5909" d="M 11.558759,357.35361 L 9.1397224,374.25934 L 5.803597,268.6323 L 9.3064977,270.86286 L 11.558759,357.35361 z " style="fill: rgb(96, 83, 56); fill-opacity: 0.796053; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="fill: rgb(167, 169, 169); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M -3.2857248,230.2759 C 15.796118,231.0768 26.846592,227.19154 31.61106,228.42944 C 27.577291,233.04053 10.426081,234.20876 -2.6588989,233.63431 L -3.2857248,230.2759 z " id="path5911" sodipodi:nodetypes="cccc"/>
<path sodipodi:nodetypes="csscc" id="path5913" d="M 78.273833,243.41024 C 82.598662,242.03754 85.092773,240.25281 87.832814,240.99317 C 91.126176,241.88303 89.235642,232.81273 87.807548,232.83053 L 77.170056,232.96318 C 77.273432,238.24785 78.874772,237.99033 78.273833,243.41024 z " style="fill: rgb(125, 129, 136); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;"/>
<path style="opacity: 0.908046; fill: rgb(16, 8, 13); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 366.30041,456.47905 C 377.00645,451.25075 389.53458,452.00433 397.70811,437.24185 C 400.30427,432.55283 400.18531,413.87725 400.84888,407.40456 C 401.8744,397.40116 421.12137,381.43024 424.40463,377.95986 C 432.4876,369.41618 441.85514,361.97064 457.7753,359.11525 C 447.87603,370.54134 439.07218,379.96364 435.90076,385.66078 C 432.24046,392.23621 423.69136,422.93025 420.87129,441.95301 C 420.11554,447.05088 414.41726,452.34 395.74511,458.44202 L 366.30041,456.47905 z " id="path4196" sodipodi:nodetypes="cssscsscc"/>
<path style="fill: rgb(12, 9, 7); fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 1px; stroke-linecap: butt; stroke-linejoin: miter; stroke-opacity: 1; display: inline;" d="M 83.414467,460.08299 L 50.978214,435.44389 L 50.416952,429.55975 L 55.247855,425.45745 L 55.116103,418.54016 L 58.600684,423.80294 L 62.204124,426.50512 L 61.517184,430.4902 L 59.419576,429.29965 L 53.564547,430.82455 L 85.334198,454.48916 L 94.583251,457.27598 L 83.414467,460.08299 z " id="path4202" sodipodi:nodetypes="ccccccccccccc"/>
<rect style="opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="rect5953" width="58.028622" y="-41.37466" x="452.65378" height="522.25763" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
<rect style="opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="rect5955" width="58.028622" transform="matrix(0, -1, 1, 0, 0, 0)" y="-24.294004" x="2.4990089" height="522.25763"/>
<rect style="opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="rect5957" width="58.028622" transform="matrix(0, -1, 1, 0, 0, 0)" y="-22.498981" x="-510.14624" height="522.25763"/>
<rect style="opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke: none; stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; display: inline;" id="rect5959" width="58.028622" y="-34.301971" x="-61.456482" height="522.25763"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 136 KiB

BIN
apps/imgs/fallingwater.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

3457
apps/imgs/fallingwater.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 342 KiB

BIN
apps/imgs/flower.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

3771
apps/imgs/flower.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 384 KiB

1151
apps/imgs/hawaii.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
apps/imgs/hokusai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 126 KiB

BIN
apps/imgs/kitty.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

3676
apps/imgs/kitty.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 378 KiB

711
apps/imgs/linux.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 51 KiB

997
apps/imgs/male-face1.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 483 KiB

2191
apps/imgs/mcseem2.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 211 KiB

25
apps/imgs/note_small.svg Normal file
View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
height="300"
width="300"
xml:space="preserve"
viewBox="0 0 300 300"
y="0px"
x="0px"
id="Layer_1"
version="1.1"><metadata
id="metadata11"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs9" /><g
style="fill:#000000"
transform="matrix(0.15201827,0,0,0.15201827,3.9675452,19.914682)"
id="g3"><path
style="fill:#000000"
id="path5"
d="m 1508.16,210.56 c -9.69,-8.31 -22.48,-12.01 -35.14,-10.04 L 619.9,331.77 c -21.34,3.29 -37.08,21.65 -37.08,43.24 l 0,864.44 c -31.27,-20.93 -68.89,-33.2 -109.38,-33.2 -108.73,0 -196.87,88.14 -196.87,196.87 0,108.73 88.14,196.88 196.87,196.88 108.73,0 196.87,-88.14 196.87,-196.87 l 0,-817.24 765.62,-117.79 0,640.1 c -31.27,-20.94 -68.89,-33.2 -109.38,-33.2 -108.73,0 -196.87,88.14 -196.87,196.87 0,108.73 88.14,196.88 196.87,196.88 108.73,0 196.87,-88.14 196.87,-196.88 l 0,-1028.12 c 0.01,-12.75 -5.56,-24.88 -15.26,-33.19 z" /></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
apps/imgs/peppers.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 187 KiB

BIN
apps/imgs/peppers.tiff Normal file

Binary file not shown.

761
apps/imgs/reschart.svg Normal file
View File

@@ -0,0 +1,761 @@
<?xml version="1.0" standalone="no"?>
<svg
viewBox="0 0 1132 691"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1">
<defs>
</defs>
<g transform="scale(1,-1) translate(-1,-691) ">
<path id="path0" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 6.29297,685.312 L 1127.56,685.312 1127.56,5 6.29297,5 "/>
<path id="path1" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 62.9844,628.621 L 1070.88,628.621 1070.88,61.691 62.9844,61.691 "/>
<path id="path2" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 785.195,656.969 L 802.203,656.969 793.699,628.621 785.195,656.969 "/>
<path id="path3" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 34.6367,61.691 L 34.6367,78.699 62.9844,70.1949 34.6367,61.691 "/>
<path id="path4" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 34.6406,611.609 L 34.6406,628.621 62.9844,620.113 34.6406,611.609 "/>
<path id="path5" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 331.652,656.969 L 348.66,656.969 340.156,628.621 331.652,656.969 "/>
<path id="path6" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 802.203,33.344 L 785.195,33.344 793.699,61.691 802.203,33.344 "/>
<path id="path7" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 348.66,33.344 L 331.652,33.344 340.156,61.691 348.66,33.344 "/>
<path id="path8" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 1099.22,61.691 L 1099.22,78.699 1070.88,70.1949 1099.22,61.691 "/>
<path id="path9" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 1099.22,611.609 L 1099.22,628.621 1070.88,620.113 1099.22,611.609 "/>
<path id="path10" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 91.332,61.691 L 91.332,78.699 62.9844,70.1949 91.332,61.691 "/>
<path id="path11" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 91.3281,611.609 L 91.3281,628.617 62.9844,620.113 91.3281,611.609 "/>
<path id="path12" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1042.53,61.691 L 1042.53,78.699 1070.88,70.1949 1042.53,61.691 "/>
<path id="path13" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1042.53,611.609 L 1042.53,628.617 1070.88,620.113 1042.53,611.609 "/>
<path id="path14" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 802.203,600.273 L 785.195,600.273 793.699,628.621 802.203,600.273 "/>
<path id="path15" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 348.66,600.273 L 331.652,600.273 340.156,628.621 348.66,600.273 "/>
<path id="path16" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 785.195,90.039 L 802.203,90.039 793.699,61.691 785.195,90.039 "/>
<path id="path17" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 331.652,90.039 L 348.66,90.039 340.156,61.691 331.652,90.039 "/>
<path id="path18" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 180.48,656.969 L 197.488,656.969 188.984,628.621 180.48,656.969 "/>
<path id="path19" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 197.488,33.344 L 180.48,33.344 188.984,61.691 197.488,33.344 "/>
<path id="path20" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 558.426,656.969 L 575.434,656.969 566.93,628.621 558.426,656.969 "/>
<path id="path21" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 575.434,33.344 L 558.426,33.344 566.93,61.691 575.434,33.344 "/>
<path id="path22" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 936.367,656.969 L 953.379,656.969 944.875,628.621 936.367,656.969 "/>
<path id="path23" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 953.379,33.344 L 936.367,33.344 944.871,61.691 953.379,33.344 "/>
<path id="path24" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 34.6406,336.652 L 34.6406,353.66 62.9844,345.156 34.6406,336.652 "/>
<path id="path25" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 1099.22,336.652 L 1099.22,353.66 1070.87,345.156 1099.22,336.652 "/>
<path id="path26" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 427.93,22.008 L 705.93,22.008 705.93,5 427.93,5 "/>
<path id="path27" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 538.582,373.504 L 595.273,373.504 595.273,316.808 538.582,316.808 "/>
<path id="path28" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 566.93,367.012 C 554.859,367.012 545.074,357.226 545.074,345.156 545.074,339.121 547.52,333.656 551.477,329.703 L 551.102,329.328 549.773,328 C 545.383,332.391 542.664,338.457 542.664,345.156 542.664,358.558 553.531,369.422 566.93,369.422 573.633,369.422 579.699,366.707 584.09,362.316 L 582.387,360.609 C 578.43,364.566 572.965,367.012 566.93,367.012 "/>
<path id="path29" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 551.477,329.703 L 551.102,329.324 551.477,329.703 "/>
<path id="path30" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 582.383,360.609 L 584.09,362.312 582.383,360.609 "/>
<path id="path31" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 566.93,361.625 C 557.836,361.625 550.461,354.254 550.461,345.156 550.461,340.609 552.305,336.492 555.285,333.512 L 554.996,333.223 553.297,331.527 C 549.812,335.016 547.652,339.836 547.652,345.156 547.652,355.801 556.281,364.43 566.93,364.43 572.254,364.43 577.07,362.273 580.559,358.785 L 578.574,356.801 C 575.594,359.781 571.477,361.625 566.93,361.625 "/>
<path id="path32" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 555.285,333.512 L 554.996,333.223 555.285,333.512 "/>
<path id="path33" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 578.574,356.801 L 580.559,358.785 578.574,356.801 "/>
<path id="path34" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 573.906,352.133 C 572.121,353.918 569.652,355.019 566.93,355.019 561.48,355.019 557.062,350.605 557.062,345.156 557.062,342.434 558.168,339.965 559.953,338.18 L 558.336,336.562 557.469,335.695 C 555.047,338.117 553.551,341.461 553.551,345.156 553.551,352.547 559.539,358.535 566.93,358.535 570.625,358.535 573.969,357.039 576.391,354.617 L 574.363,352.59 573.906,352.133 "/>
<path id="path35" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 574.363,352.59 L 576.391,354.617 574.363,352.59 "/>
<path id="path36" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 557.469,335.695 L 558.336,336.562 557.469,335.695 "/>
<path id="path37" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 561.262,345.156 C 561.262,348.289 563.801,350.828 566.93,350.828 568.496,350.828 569.914,350.191 570.938,349.168 L 566.93,345.156 562.922,341.148 C 561.895,342.176 561.262,343.59 561.262,345.156 "/>
<path id="path38" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 562.922,341.148 L 566.93,345.156 562.922,341.148 "/>
<path id="path39" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 585.25,363.476 C 589.938,358.785 592.84,352.312 592.84,345.156 592.84,330.848 581.238,319.246 566.93,319.246 559.773,319.246 553.297,322.148 548.609,326.836 L 548.988,327.215 C 553.582,322.625 559.922,319.785 566.93,319.785 580.941,319.785 592.301,331.144 592.301,345.156 592.301,352.16 589.461,358.504 584.867,363.094 L 585.25,363.476 "/>
<path id="path40" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 584.488,362.715 C 588.98,358.223 591.762,352.012 591.762,345.156 591.762,331.441 580.645,320.324 566.93,320.324 560.07,320.324 553.863,323.101 549.371,327.598 L 549.77,327.996 C 554.16,323.605 560.223,320.891 566.922,320.891 580.328,320.891 591.188,331.754 591.188,345.156 591.188,351.855 588.473,357.918 584.086,362.308 L 584.488,362.715 "/>
<path id="path41" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 583.688,361.91 C 587.977,357.625 590.629,351.699 590.629,345.156 590.629,332.066 580.02,321.457 566.93,321.457 560.383,321.457 554.461,324.109 550.172,328.398 L 550.594,328.82 C 554.773,324.641 560.547,322.055 566.926,322.055 579.688,322.055 590.031,332.398 590.031,345.156 590.031,351.535 587.445,357.312 583.266,361.492 L 583.684,361.91 "/>
<path id="path42" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 582.844,361.07 C 586.918,356.996 589.438,351.371 589.438,345.156 589.438,332.726 579.359,322.648 566.93,322.648 560.715,322.648 555.086,325.168 551.016,329.242 L 551.457,329.68 C 555.414,325.723 560.887,323.273 566.93,323.273 579.016,323.273 588.812,333.07 588.812,345.156 588.812,351.199 586.363,356.668 582.406,360.629 L 582.844,361.07 "/>
<path id="path43" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 581.941,360.168 C 585.785,356.324 588.16,351.019 588.16,345.156 588.16,333.43 578.656,323.926 566.93,323.926 561.066,323.926 555.758,326.301 551.918,330.144 L 552.379,330.605 C 556.102,326.883 561.246,324.578 566.93,324.578 578.297,324.578 587.512,333.793 587.512,345.156 587.512,350.84 585.207,355.984 581.484,359.707 L 581.945,360.168 "/>
<path id="path44" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 581.02,359.246 C 584.629,355.641 586.855,350.66 586.855,345.156 586.855,334.152 577.938,325.226 566.93,325.226 561.426,325.226 556.445,327.457 552.84,331.062 L 553.34,331.566 C 556.816,328.09 561.621,325.937 566.93,325.937 577.547,325.937 586.148,334.543 586.148,345.156 586.148,350.465 583.996,355.269 580.52,358.746 L 581.02,359.246 "/>
<path id="path45" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 580.02,358.242 C 583.367,354.894 585.441,350.269 585.441,345.156 585.441,334.934 577.152,326.644 566.93,326.644 561.816,326.644 557.191,328.719 553.84,332.066 L 554.363,332.59 C 557.578,329.371 562.02,327.383 566.93,327.383 576.746,327.383 584.703,335.34 584.703,345.156 584.703,350.062 582.715,354.508 579.496,357.723 L 580.02,358.242 "/>
<path id="path46" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 555.484,333.711 C 558.414,330.781 562.461,328.969 566.93,328.969 575.867,328.969 583.117,336.219 583.117,345.156 583.117,349.625 581.305,353.672 578.375,356.601 L 578.957,357.18 C 582.035,354.105 583.938,349.851 583.938,345.156 583.938,335.762 576.324,328.148 566.93,328.148 562.234,328.148 557.98,330.051 554.902,333.129 L 555.547,333.711 "/>
<path id="path47" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 577.773,356 C 580.547,353.223 582.266,349.391 582.266,345.156 582.266,336.687 575.398,329.82 566.93,329.82 562.695,329.82 558.859,331.535 556.086,334.312 L 556.707,334.934 C 559.324,332.316 562.938,330.699 566.93,330.699 574.914,330.699 581.387,337.172 581.387,345.156 581.387,349.148 579.77,352.762 577.152,355.379 L 577.773,356 "/>
<path id="path48" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 576.488,354.719 C 578.938,352.269 580.449,348.891 580.449,345.156 580.449,337.687 574.398,331.637 566.93,331.637 563.195,331.637 559.816,333.148 557.367,335.594 L 558.07,336.297 C 560.336,334.027 563.469,332.629 566.93,332.629 573.852,332.629 579.457,338.238 579.457,345.156 579.457,348.617 578.055,351.75 575.789,354.016 L 576.488,354.719 "/>
<path id="path49" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 575.027,353.254 C 577.102,351.18 578.383,348.316 578.383,345.156 578.383,338.832 573.254,333.703 566.93,333.703 563.766,333.703 560.902,334.984 558.832,337.058 L 559.652,337.879 C 561.516,336.019 564.086,334.867 566.93,334.867 572.613,334.867 577.219,339.473 577.219,345.156 577.219,347.996 576.066,350.57 574.203,352.434 L 575.023,353.254 "/>
<path id="path50" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 573.281,351.512 C 574.91,349.883 575.914,347.637 575.914,345.156 575.914,340.191 571.891,336.172 566.93,336.172 564.445,336.172 562.199,337.176 560.574,338.801 L 561.637,339.863 C 562.992,338.508 564.863,337.672 566.93,337.672 571.062,337.672 574.41,341.019 574.41,345.152 574.41,347.219 573.574,349.09 572.223,350.445 L 573.285,351.508 "/>
<path id="path51" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 572.598,345.156 C 572.598,342.023 570.062,339.488 566.93,339.488 565.363,339.488 563.945,340.121 562.922,341.148 L 570.938,349.164 C 571.965,348.141 572.598,346.723 572.598,345.156 "/>
<path id="path52" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 311.812,61.691 L 311.812,78.699 283.465,70.1949 311.812,61.691 "/>
<path id="path53" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 311.812,611.613 L 311.812,628.621 283.465,620.117 311.812,611.613 "/>
<path id="path54" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 217.332,61.691 L 217.332,78.699 188.988,70.1949 217.332,61.691 "/>
<path id="path55" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 217.332,611.613 L 217.332,628.621 188.984,620.117 217.332,611.613 "/>
<path id="path56" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 170.078,61.691 L 170.078,78.699 141.734,70.1949 170.078,61.691 "/>
<path id="path57" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 170.078,611.613 L 170.078,628.621 141.734,620.117 170.078,611.613 "/>
<path id="path58" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,61.691 L 822.047,78.699 850.395,70.1949 822.047,61.691 "/>
<path id="path59" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,611.613 L 822.047,628.621 850.395,620.117 822.047,611.613 "/>
<path id="path60" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 916.523,61.691 L 916.523,78.699 944.871,70.1949 916.523,61.691 "/>
<path id="path61" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 916.523,611.613 L 916.523,628.621 944.871,620.117 916.523,611.613 "/>
<path id="path62" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 963.777,61.691 L 963.777,78.699 992.125,70.1949 963.777,61.691 "/>
<path id="path63" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 963.777,611.613 L 963.777,628.621 992.125,620.117 963.777,611.613 "/>
<path id="path64" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 183.316,95.707 L 188.988,95.707 188.988,61.691 183.316,61.691 "/>
<path id="path65" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 136.062,95.707 L 141.734,95.707 141.734,61.691 136.062,61.691 "/>
<path id="path66" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 277.797,95.707 L 283.465,95.707 283.465,61.691 277.797,61.691 "/>
<path id="path67" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 136.062,628.621 L 141.734,628.621 141.734,594.605 136.062,594.605 "/>
<path id="path68" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 183.316,628.621 L 188.984,628.621 188.984,594.605 183.316,594.605 "/>
<path id="path69" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 277.797,628.621 L 283.465,628.621 283.465,594.605 277.797,594.605 "/>
<path id="path70" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,628.621 L 856.062,628.621 856.062,594.605 850.395,594.605 "/>
<path id="path71" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 944.875,628.621 L 950.543,628.621 950.543,594.605 944.875,594.605 "/>
<path id="path72" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 992.125,628.621 L 997.793,628.621 997.793,594.605 992.125,594.605 "/>
<path id="path73" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,95.707 L 856.062,95.707 856.062,61.691 850.395,61.691 "/>
<path id="path74" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 944.871,95.707 L 950.539,95.707 950.539,61.691 944.871,61.691 "/>
<path id="path75" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 992.125,95.707 L 997.793,95.707 997.793,61.691 992.125,61.691 "/>
<path id="path76" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 90.7109,288.465 L 79.3711,401.848 107.719,401.848 112.547,353.574 224.809,364.805 221.105,401.851 249.449,401.851 260.789,288.465 232.441,288.465 227.617,336.738 115.352,325.512 119.059,288.465 90.7109,288.465 "/>
<path id="path77" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 884.41,288.465 L 873.07,401.851 901.418,401.851 906.246,353.578 1018.51,364.805 1014.8,401.851 1043.15,401.851 1054.49,288.465 1026.14,288.465 1021.32,336.738 909.055,325.512 912.758,288.465 884.41,288.465 "/>
<path id="path78" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 311.812,571.93 L 325.984,571.93 325.984,560.59 311.812,560.59 "/>
<path id="path79" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 325.984,577.598 L 340.156,577.598 340.156,554.918 325.984,554.918 "/>
<path id="path80" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 807.875,135.394 L 822.047,135.394 822.047,124.055 807.875,124.055 "/>
<path id="path81" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,141.062 L 807.875,141.062 807.875,118.383 793.699,118.383 "/>
<path id="path82" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 561.262,124.055 L 589.605,124.055 572.598,294.133 544.254,294.133 561.262,124.055 "/>
<path id="path83" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 481.891,444.367 L 481.891,416.019 651.969,433.027 651.969,461.379 481.891,444.367 "/>
<path id="path84" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 119.055,146.73 L 76.5352,143.894 79.3711,101.375 121.891,104.211 119.055,146.73 "/>
<path id="path85" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 119.055,588.937 L 76.5352,586.101 79.3711,543.582 121.891,546.418 119.055,588.937 "/>
<path id="path86" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,146.73 L 1011.97,143.894 1014.8,101.375 1057.32,104.211 1054.49,146.73 "/>
<path id="path87" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,588.937 L 1011.97,586.101 1014.8,543.582 1057.32,546.418 1054.49,588.937 "/>
<path id="path88" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 257.953,177.91 L 215.434,175.078 218.27,132.558 260.789,135.391 257.953,177.91 "/>
<path id="path89" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 257.953,557.754 L 215.434,554.922 218.27,512.398 260.789,515.234 257.953,557.758 "/>
<path id="path90" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 912.758,177.91 L 870.234,175.078 873.07,132.558 915.59,135.391 912.758,177.91 "/>
<path id="path91" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 912.758,557.754 L 870.234,554.922 873.07,512.398 915.59,515.234 912.758,557.758 "/>
<path id="path92" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 737.008,231.769 L 779.527,274.289 737.008,316.808 694.488,274.289 737.008,231.769 "/>
<path id="path93" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,228.934 L 856.062,228.934 856.062,206.258 850.395,206.258 "/>
<path id="path94" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,257.281 L 853.23,257.281 853.23,234.605 850.395,234.605 "/>
<path id="path95" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,285.629 L 852.293,285.629 852.293,262.953 850.395,262.953 "/>
<path id="path96" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,484.055 L 850.961,484.055 850.961,461.375 850.395,461.375 "/>
<path id="path97" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,455.707 L 851.02,455.707 851.02,433.027 850.395,433.027 "/>
<path id="path98" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,427.359 L 851.102,427.359 851.102,404.684 850.395,404.684 "/>
<path id="path99" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,399.016 L 851.215,399.016 851.215,376.336 850.395,376.336 "/>
<path id="path100" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,370.668 L 851.328,370.668 851.328,347.992 850.395,347.992 "/>
<path id="path101" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,342.32 L 851.527,342.32 851.527,319.644 850.395,319.644 "/>
<path id="path102" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 850.395,313.976 L 851.812,313.976 851.812,291.297 850.395,291.297 "/>
<path id="path103" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 428.031,84.3669 L 450.707,84.3669 450.707,78.699 428.031,78.699 "/>
<path id="path104" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 456.379,81.535 L 479.055,81.535 479.055,78.699 456.379,78.699 "/>
<path id="path105" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 484.727,80.598 L 507.402,80.598 507.402,78.699 484.727,78.699 "/>
<path id="path106" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 683.148,79.266 L 705.828,79.266 705.828,78.699 683.148,78.699 "/>
<path id="path107" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 654.805,79.324 L 677.48,79.324 677.48,78.699 654.805,78.699 "/>
<path id="path108" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 626.457,79.41 L 649.133,79.41 649.133,78.699 626.457,78.699 "/>
<path id="path109" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 598.109,79.5229 L 620.789,79.5229 620.789,78.699 598.109,78.699 "/>
<path id="path110" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 569.766,79.637 L 592.441,79.637 592.441,78.699 569.766,78.699 "/>
<path id="path111" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 541.418,79.836 L 564.094,79.836 564.094,78.699 541.418,78.699 "/>
<path id="path112" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 513.07,80.1169 L 535.746,80.1169 535.746,78.699 513.07,78.699 "/>
<path id="path113" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 496.066,622.949 L 581.102,622.949 581.102,594.605 496.066,594.605 "/>
<path id="path114" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 609.449,622.949 L 637.797,622.949 637.797,594.605 609.449,594.605 "/>
<path id="path115" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 581.102,622.949 L 609.449,622.949 609.449,594.605 581.102,594.605 "/>
<path id="path116" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 496.062,622.949 L 498.898,622.949 498.898,620.117 496.062,620.117 "/>
<path id="path117" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 498.898,620.117 L 501.734,620.117 501.734,617.281 498.898,617.281 "/>
<path id="path118" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 501.734,617.281 L 504.566,617.281 504.566,614.449 501.734,614.449 "/>
<path id="path119" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 501.734,622.949 L 504.566,622.949 504.566,620.117 501.734,620.117 "/>
<path id="path120" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 496.062,617.281 L 498.898,617.281 498.898,614.449 496.062,614.449 "/>
<path id="path121" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 504.566,620.117 L 507.402,620.117 507.402,617.281 504.566,617.281 "/>
<path id="path122" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 498.898,614.449 L 501.734,614.449 501.734,611.613 498.898,611.613 "/>
<path id="path123" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 504.566,614.449 L 507.402,614.449 507.402,611.613 504.566,611.613 "/>
<path id="path124" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 496.062,611.613 L 498.898,611.613 498.898,608.777 496.062,608.777 "/>
<path id="path125" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 498.898,608.777 L 501.734,608.777 501.734,605.945 498.898,605.945 "/>
<path id="path126" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 501.734,605.945 L 504.566,605.945 504.566,603.109 501.734,603.109 "/>
<path id="path127" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 501.734,611.613 L 504.566,611.613 504.566,608.777 501.734,608.777 "/>
<path id="path128" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 496.062,605.945 L 498.898,605.945 498.898,603.109 496.062,603.109 "/>
<path id="path129" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 504.566,608.777 L 507.402,608.777 507.402,605.945 504.566,605.945 "/>
<path id="path130" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 498.898,603.109 L 501.734,603.109 501.734,600.273 498.898,600.273 "/>
<path id="path131" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 504.566,603.109 L 507.402,603.109 507.402,600.273 504.566,600.273 "/>
<path id="path132" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 507.402,622.949 L 510.238,622.949 510.238,620.117 507.402,620.117 "/>
<path id="path133" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 510.238,620.117 L 513.074,620.117 513.074,617.281 510.238,617.281 "/>
<path id="path134" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 513.074,617.281 L 515.906,617.281 515.906,614.449 513.074,614.449 "/>
<path id="path135" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 513.074,622.949 L 515.906,622.949 515.906,620.117 513.074,620.117 "/>
<path id="path136" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 507.402,617.281 L 510.238,617.281 510.238,614.449 507.402,614.449 "/>
<path id="path137" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 515.906,620.117 L 518.742,620.117 518.742,617.281 515.906,617.281 "/>
<path id="path138" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 510.238,614.449 L 513.074,614.449 513.074,611.613 510.238,611.613 "/>
<path id="path139" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 515.906,614.449 L 518.742,614.449 518.742,611.613 515.906,611.613 "/>
<path id="path140" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 507.402,611.613 L 510.238,611.613 510.238,608.777 507.402,608.777 "/>
<path id="path141" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 510.238,608.777 L 513.074,608.777 513.074,605.945 510.238,605.945 "/>
<path id="path142" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 513.074,605.945 L 515.906,605.945 515.906,603.109 513.074,603.109 "/>
<path id="path143" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 513.074,611.613 L 515.906,611.613 515.906,608.777 513.074,608.777 "/>
<path id="path144" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 507.402,605.945 L 510.238,605.945 510.238,603.109 507.402,603.109 "/>
<path id="path145" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 515.906,608.777 L 518.742,608.777 518.742,605.945 515.906,605.945 "/>
<path id="path146" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 510.238,603.109 L 513.074,603.109 513.074,600.273 510.238,600.273 "/>
<path id="path147" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 515.906,603.109 L 518.742,603.109 518.742,600.273 515.906,600.273 "/>
<path id="path148" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 518.742,617.281 L 521.578,617.281 521.578,614.449 518.742,614.449 "/>
<path id="path149" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 518.742,622.949 L 521.578,622.949 521.578,620.117 518.742,620.117 "/>
<path id="path150" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 521.578,620.117 L 524.414,620.117 524.414,617.281 521.578,617.281 "/>
<path id="path151" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 521.578,614.449 L 524.414,614.449 524.414,611.613 521.578,611.613 "/>
<path id="path152" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 518.742,605.945 L 521.578,605.945 521.578,603.109 518.742,603.109 "/>
<path id="path153" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 518.742,611.613 L 521.578,611.613 521.578,608.777 518.742,608.777 "/>
<path id="path154" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 521.578,608.777 L 524.414,608.777 524.414,605.945 521.578,605.945 "/>
<path id="path155" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 521.578,603.109 L 524.414,603.109 524.414,600.273 521.578,600.273 "/>
<path id="path156" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 501.734,600.273 L 504.566,600.273 504.566,597.441 501.734,597.441 "/>
<path id="path157" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 496.062,600.273 L 498.898,600.273 498.898,597.441 496.062,597.441 "/>
<path id="path158" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 498.898,597.441 L 501.734,597.441 501.734,594.605 498.898,594.605 "/>
<path id="path159" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 504.566,597.441 L 507.402,597.441 507.402,594.605 504.566,594.605 "/>
<path id="path160" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 513.074,600.273 L 515.906,600.273 515.906,597.441 513.074,597.441 "/>
<path id="path161" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 507.402,600.273 L 510.238,600.273 510.238,597.441 507.402,597.441 "/>
<path id="path162" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 510.238,597.441 L 513.074,597.441 513.074,594.605 510.238,594.605 "/>
<path id="path163" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 515.906,597.441 L 518.742,597.441 518.742,594.605 515.906,594.605 "/>
<path id="path164" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 518.742,600.273 L 521.578,600.273 521.578,597.441 518.742,597.441 "/>
<path id="path165" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 521.578,597.441 L 524.414,597.441 524.414,594.605 521.578,594.605 "/>
<path id="path166" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 524.41,600.273 L 530.082,600.273 530.082,594.605 524.41,594.605 "/>
<path id="path167" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 524.41,611.613 L 530.082,611.613 530.082,605.945 524.41,605.945 "/>
<path id="path168" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 524.41,622.949 L 530.082,622.949 530.082,617.281 524.41,617.281 "/>
<path id="path169" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 530.082,605.945 L 535.75,605.945 535.75,600.277 530.082,600.277 "/>
<path id="path170" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 530.082,617.281 L 535.75,617.281 535.75,611.613 530.082,611.613 "/>
<path id="path171" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 535.754,600.277 L 541.422,600.277 541.422,594.609 535.754,594.609 "/>
<path id="path172" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 535.754,611.613 L 541.422,611.613 541.422,605.945 535.754,605.945 "/>
<path id="path173" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 535.754,622.953 L 541.422,622.953 541.422,617.285 535.754,617.285 "/>
<path id="path174" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 541.422,605.945 L 547.094,605.945 547.094,600.277 541.422,600.277 "/>
<path id="path175" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 541.422,617.285 L 547.094,617.285 547.094,611.617 541.422,611.617 "/>
<path id="path176" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 547.094,600.277 L 552.762,600.277 552.762,594.609 547.094,594.609 "/>
<path id="path177" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 547.094,611.617 L 552.762,611.617 552.762,605.949 547.094,605.949 "/>
<path id="path178" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 547.094,622.953 L 552.762,622.953 552.762,617.285 547.094,617.285 "/>
<path id="path179" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 558.434,622.949 L 564.102,622.949 564.102,594.605 558.434,594.605 "/>
<path id="path180" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 569.77,622.949 L 575.441,622.949 575.441,594.605 569.77,594.605 "/>
<path id="path181" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 609.449,617.289 L 637.797,617.289 637.797,611.617 609.449,611.617 "/>
<path id="path182" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 609.449,605.949 L 637.797,605.949 637.797,600.277 609.449,600.277 "/>
<path id="path183" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 609.449,622.949 L 609.449,618.941 585.113,594.605 581.25,594.605 581.102,594.75 581.102,598.613 605.441,622.949 609.449,622.949 "/>
<path id="path184" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 601.148,594.605 L 593.129,594.605 609.449,610.926 609.449,602.902 601.148,594.605 "/>
<path id="path185" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 581.102,614.652 L 589.402,622.949 597.422,622.949 581.105,606.633 581.105,614.652 "/>
<path id="path186" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 445.039,146.73 L 462.047,146.73 M 461.48,155.234 L 467.148,155.234 M 459.215,163.738 L 470.551,163.738 M 467.32,172.242 L 472.988,172.242 M 457.797,180.746 L 474.805,180.746 M 470.551,189.25 L 476.223,189.25 M 466.016,197.754 L 477.355,197.754 M 472.621,206.258 L 478.289,206.258 M 462.047,214.762 L 479.055,214.762 M 474.039,223.266 L 479.707,223.266 M 468.938,231.769 L 480.273,231.769 M 475.09,240.273 L 480.758,240.273 M 464.172,248.777 L 481.18,248.777 M 475.879,257.281 L 481.551,257.281 M 470.551,265.785 L 481.891,265.785 M 476.531,274.293 L 482.203,274.293 M 465.449,282.793 L 482.457,282.793 M 477.043,291.297 L 482.711,291.297 M 471.57,299.801 L 482.91,299.801 M 477.441,308.305 L 483.109,308.305 "/>
<path id="path187" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 467.719,146.73 L 470.039,150.133 472.82,155.234 474.32,158.637 476.223,163.738 477.297,167.141 478.656,172.242 479.453,175.644 480.473,180.746 481.066,184.148 481.891,189.25 483.023,197.754 483.961,206.258 484.727,214.762 485.379,223.266 485.945,231.769 486.426,240.277 486.852,248.781 487.219,257.285 487.559,265.789 487.871,274.293 488.129,282.797 488.383,291.301 488.582,299.805 488.781,308.308 488.977,316.812 489.914,316.812 489.773,308.308 489.629,299.805 489.461,291.301 489.262,282.797 489.062,274.293 488.809,265.789 488.555,257.285 488.27,248.781 487.93,240.277 487.562,231.769 487.137,223.266 486.625,214.762 486.004,206.258 485.293,197.754 484.414,189.25 483.789,184.148 483.309,180.746 482.516,175.644 481.891,172.242 480.844,167.141 479.992,163.738 478.52,158.637 477.355,155.234 475.203,150.133 473.391,146.73 467.719,146.73 "/>
<path id="path188" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 479.055,146.73 L 480.332,150.133 481.891,155.234 482.742,158.637 483.789,163.738 484.387,167.141 485.121,172.242 485.574,175.644 486.141,180.746 486.48,184.148 486.938,189.25 487.559,197.754 488.07,206.258 488.496,214.762 488.863,223.266 489.176,231.769 489.461,240.277 489.688,248.781 489.887,257.285 490.082,265.789 490.254,274.293 490.395,282.797 490.535,291.301 490.648,299.805 490.762,308.308 490.875,316.812 491.809,316.812 491.754,308.308 491.668,299.805 491.609,291.301 491.527,282.797 491.441,274.293 491.328,265.789 491.215,257.285 491.102,248.781 490.961,240.277 490.789,231.769 490.617,223.266 490.391,214.762 490.137,206.258 489.824,197.754 489.457,189.25 489.176,184.148 488.977,180.746 488.637,175.644 488.379,172.242 487.926,167.141 487.559,163.738 486.934,158.637 486.426,155.234 485.488,150.133 484.723,146.73 479.055,146.73 "/>
<path id="path189" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 490.395,146.73 L 490.648,150.133 490.961,155.234 491.133,158.637 491.328,163.738 491.473,167.141 491.613,172.242 491.699,175.644 491.812,180.746 491.867,184.148 491.98,189.25 492.094,197.754 492.207,206.258 492.293,214.762 492.352,223.266 492.406,231.769 492.465,240.277 492.52,248.781 492.551,257.285 492.605,265.789 492.637,274.293 492.664,282.797 492.691,291.301 492.723,299.805 492.75,308.308 492.75,316.812 493.715,316.812 493.715,308.308 493.742,299.805 493.77,291.301 493.797,282.797 493.828,274.293 493.855,265.789 493.91,257.285 493.941,248.781 493.996,240.277 494.055,231.769 494.113,223.266 494.168,214.762 494.254,206.258 494.367,197.754 494.48,189.25 494.594,184.148 494.648,180.746 494.762,175.644 494.848,172.242 495.02,167.141 495.133,163.738 495.328,158.637 495.5,155.234 495.812,150.133 496.066,146.73 490.398,146.73 "/>
<path id="path190" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 501.734,146.73 L 500.969,150.133 500.031,155.234 499.52,158.637 498.898,163.738 498.559,167.141 498.074,172.242 497.82,175.644 497.48,180.746 497.281,184.148 496.996,189.25 496.629,197.754 496.316,206.258 496.062,214.762 495.836,223.266 495.664,231.769 495.496,240.277 495.355,248.781 495.242,257.285 495.129,265.789 495.016,274.293 494.93,282.797 494.844,291.301 494.785,299.805 494.703,308.308 494.645,316.812 495.582,316.812 495.695,308.308 495.809,299.805 495.922,291.301 496.062,282.797 496.203,274.293 496.375,265.789 496.57,257.285 496.77,248.781 496.996,240.277 497.281,231.769 497.594,223.266 497.961,214.762 498.387,206.258 498.895,197.754 499.52,189.25 499.973,184.148 500.312,180.746 500.883,175.644 501.336,172.242 502.102,167.141 502.668,163.738 503.715,158.637 504.566,155.234 506.125,150.133 507.402,146.73 501.73,146.73 "/>
<path id="path191" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 513.07,146.73 L 511.258,150.133 509.105,155.234 507.941,158.637 506.469,163.738 505.645,167.141 504.566,172.242 503.945,175.644 503.152,180.746 502.668,184.148 502.047,189.25 501.168,197.754 500.457,206.258 499.836,214.762 499.324,223.266 498.898,231.769 498.531,240.277 498.191,248.781 497.906,257.285 497.652,265.789 497.395,274.293 497.199,282.797 497,291.301 496.828,299.805 496.688,308.308 496.547,316.812 497.48,316.812 497.68,308.308 497.879,299.805 498.074,291.301 498.332,282.797 498.586,274.293 498.898,265.789 499.238,257.285 499.609,248.781 500.031,240.277 500.516,231.769 501.082,223.266 501.734,214.762 502.5,206.258 503.434,197.754 504.566,189.25 505.391,184.148 505.984,180.746 507.008,175.644 507.801,172.242 509.191,167.141 510.238,163.738 512.141,158.637 513.641,155.234 516.418,150.133 518.742,146.73 513.074,146.73 "/>
<path id="path192" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 368.504,393.344 L 368.504,376.336 M 377.008,376.902 L 377.008,371.234 M 385.512,379.172 L 385.512,367.832 M 394.016,371.066 L 394.016,365.394 M 402.52,380.59 L 402.52,363.582 M 411.023,367.832 L 411.023,362.164 M 419.527,372.367 L 419.527,361.031 M 428.031,365.766 L 428.031,360.094 M 436.535,376.336 L 436.535,359.328 M 445.039,364.348 L 445.039,358.676 M 453.543,369.449 L 453.543,358.109 M 462.047,363.297 L 462.047,357.629 M 470.551,374.211 L 470.551,357.203 M 479.055,362.504 L 479.055,356.832 M 487.559,367.832 L 487.559,356.492 M 496.062,361.851 L 496.062,356.184 M 504.566,372.934 L 504.566,355.926 M 513.07,361.34 L 513.07,355.672 M 521.574,366.812 L 521.574,355.473 "/>
<path id="path193" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 368.504,370.668 L 371.906,368.344 377.008,365.566 380.41,364.062 385.512,362.164 388.914,361.09 394.016,359.726 397.418,358.934 402.52,357.914 405.922,357.32 411.023,356.496 419.527,355.363 428.031,354.426 436.535,353.66 445.039,353.012 453.543,352.441 462.051,351.961 470.555,351.535 479.059,351.168 487.562,350.828 496.066,350.516 504.57,350.258 513.074,350.004 521.578,349.805 530.082,349.605 538.586,349.41 538.586,348.473 530.082,348.613 521.578,348.758 513.074,348.926 504.57,349.125 496.066,349.324 487.562,349.578 479.059,349.836 470.555,350.117 462.051,350.457 453.543,350.828 445.039,351.254 436.535,351.762 428.031,352.387 419.527,353.094 411.023,353.973 405.922,354.598 402.52,355.078 397.418,355.871 394.016,356.496 388.914,357.547 385.512,358.394 380.41,359.871 377.008,361.031 371.906,363.187 368.504,365 368.504,370.668 "/>
<path id="path194" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 368.504,359.328 L 371.906,358.055 377.008,356.496 380.41,355.644 385.512,354.594 388.914,354 394.016,353.262 397.418,352.808 402.52,352.242 405.922,351.902 411.023,351.449 419.527,350.824 428.031,350.316 436.535,349.891 445.039,349.519 453.543,349.207 462.051,348.926 470.555,348.695 479.059,348.5 487.562,348.301 496.066,348.129 504.57,347.988 513.074,347.848 521.578,347.734 530.082,347.621 538.586,347.508 538.586,346.574 530.082,346.629 521.578,346.715 513.074,346.773 504.57,346.855 496.066,346.941 487.562,347.055 479.059,347.168 470.555,347.281 462.051,347.422 453.543,347.594 445.039,347.766 436.535,347.992 428.031,348.246 419.527,348.558 411.023,348.93 405.922,349.211 402.52,349.406 397.418,349.75 394.016,350.004 388.914,350.457 385.512,350.824 380.41,351.449 377.008,351.961 371.906,352.894 368.504,353.66 368.504,359.332 "/>
<path id="path195" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 368.504,347.992 L 371.906,347.734 377.008,347.422 380.41,347.254 385.512,347.055 388.914,346.91 394.016,346.769 397.418,346.684 402.52,346.57 405.922,346.516 411.023,346.402 419.527,346.289 428.031,346.176 436.535,346.09 445.039,346.035 453.543,345.976 462.051,345.922 470.555,345.863 479.059,345.836 487.562,345.777 496.066,345.75 504.57,345.723 513.074,345.691 521.578,345.664 530.082,345.637 538.586,345.637 538.586,344.672 530.082,344.672 521.578,344.641 513.074,344.613 504.57,344.586 496.066,344.558 487.562,344.527 479.059,344.473 470.555,344.441 462.051,344.387 453.543,344.328 445.039,344.269 436.535,344.215 428.031,344.129 419.527,344.016 411.023,343.902 405.922,343.789 402.52,343.734 397.418,343.621 394.016,343.535 388.914,343.363 385.512,343.25 380.41,343.055 377.008,342.883 371.906,342.57 368.504,342.316 368.504,347.984 "/>
<path id="path196" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 368.504,336.652 L 371.906,337.418 377.008,338.355 380.41,338.863 385.512,339.488 388.914,339.828 394.016,340.308 397.418,340.566 402.52,340.906 405.922,341.101 411.023,341.387 419.527,341.754 428.031,342.066 436.535,342.32 445.039,342.551 453.543,342.719 462.051,342.891 470.555,343.031 479.059,343.144 487.562,343.258 496.066,343.371 504.57,343.457 513.074,343.543 521.578,343.598 530.082,343.684 538.586,343.738 538.586,342.805 530.082,342.691 521.578,342.578 513.074,342.465 504.57,342.324 496.066,342.18 487.562,342.012 479.059,341.812 470.555,341.613 462.051,341.387 453.543,341.101 445.039,340.793 436.535,340.422 428.031,339.996 419.527,339.488 411.023,338.863 405.922,338.41 402.52,338.07 397.418,337.504 394.016,337.051 388.914,336.285 385.512,335.719 380.41,334.668 377.008,333.816 371.906,332.258 368.504,330.984 368.504,336.652 "/>
<path id="path197" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 368.504,325.312 L 371.906,327.129 377.008,329.281 380.41,330.441 385.512,331.918 388.914,332.738 394.016,333.816 397.418,334.441 402.52,335.234 405.922,335.715 411.023,336.34 419.527,337.219 428.031,337.926 436.535,338.551 445.039,339.058 453.543,339.484 462.051,339.855 470.555,340.195 479.059,340.476 487.562,340.734 496.066,340.988 504.57,341.187 513.074,341.387 521.578,341.555 530.082,341.695 538.586,341.84 538.586,340.902 530.082,340.703 521.578,340.508 513.074,340.308 504.57,340.051 496.066,339.797 487.562,339.484 479.059,339.144 470.555,338.777 462.051,338.351 453.543,337.871 445.039,337.305 436.535,336.652 428.031,335.887 419.527,334.953 411.023,333.816 405.922,332.996 402.52,332.398 397.418,331.379 394.016,330.586 388.914,329.195 385.512,328.148 380.41,326.25 377.008,324.746 371.906,321.969 368.504,319.644 368.504,325.312 "/>
<path id="path198" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 144.566,112.715 L 146.891,114.418 149.672,116.969 151.172,118.668 153.07,121.219 154.148,122.922 155.508,125.473 156.301,127.172 157.32,129.723 157.918,131.426 158.738,133.976 159.871,138.226 160.809,142.48 161.574,146.73 162.227,150.984 162.793,155.234 163.277,159.488 163.703,163.738 164.07,167.992 164.41,172.242 164.723,176.496 164.977,180.746 165.234,185 165.43,189.25 165.629,193.504 165.828,197.754 166.766,197.754 166.621,193.504 166.48,189.25 166.309,185 166.113,180.746 165.914,176.496 165.66,172.242 165.402,167.992 165.121,163.738 164.781,159.488 164.41,155.234 163.984,150.984 163.477,146.73 162.852,142.48 162.145,138.226 161.266,133.976 160.641,131.426 160.16,129.723 159.367,127.172 158.742,125.473 157.691,122.922 156.844,121.219 155.367,118.668 154.207,116.969 152.055,114.418 150.238,112.715 144.57,112.715 "/>
<path id="path199" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 155.906,112.715 L 157.184,114.418 158.742,116.969 159.59,118.668 160.641,121.219 161.234,122.922 161.973,125.473 162.426,127.172 162.992,129.723 163.332,131.426 163.785,133.976 164.41,138.226 164.922,142.48 165.344,146.73 165.715,150.984 166.027,155.234 166.309,159.488 166.535,163.738 166.734,167.992 166.934,172.242 167.102,176.496 167.246,180.746 167.387,185 167.5,189.25 167.613,193.504 167.727,197.754 168.66,197.754 168.602,193.504 168.52,189.25 168.461,185 168.375,180.746 168.289,176.496 168.18,172.242 168.066,167.992 167.953,163.738 167.809,159.488 167.641,155.234 167.469,150.984 167.242,146.73 166.988,142.48 166.676,138.226 166.309,133.976 166.023,131.426 165.824,129.723 165.484,127.172 165.23,125.473 164.777,122.922 164.406,121.219 163.785,118.668 163.273,116.969 162.34,114.418 161.574,112.715 155.902,112.715 "/>
<path id="path200" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 167.242,112.715 L 167.5,114.418 167.812,116.969 167.98,118.668 168.18,121.219 168.32,122.922 168.465,125.473 168.547,127.172 168.66,129.723 168.719,131.426 168.832,133.976 168.945,138.226 169.059,142.48 169.145,146.73 169.199,150.984 169.258,155.234 169.312,159.488 169.371,163.738 169.398,167.992 169.457,172.242 169.484,176.496 169.516,180.746 169.543,185 169.57,189.25 169.598,193.504 169.598,197.754 170.562,197.754 170.562,193.504 170.59,189.25 170.621,185 170.648,180.746 170.676,176.496 170.703,172.242 170.762,167.992 170.789,163.738 170.848,159.488 170.906,155.234 170.961,150.984 171.02,146.73 171.105,142.48 171.219,138.226 171.328,133.976 171.441,131.426 171.5,129.723 171.613,127.172 171.699,125.473 171.867,122.922 171.98,121.219 172.18,118.668 172.352,116.969 172.66,114.418 172.918,112.715 167.246,112.715 "/>
<path id="path201" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 178.582,112.715 L 177.816,114.418 176.879,116.969 176.371,118.668 175.746,121.219 175.406,122.922 174.926,125.473 174.668,127.172 174.328,129.723 174.133,131.426 173.848,133.976 173.48,138.226 173.168,142.48 172.91,146.73 172.684,150.984 172.516,155.234 172.344,159.488 172.203,163.738 172.09,167.992 171.977,172.242 171.863,176.496 171.777,180.746 171.691,185 171.637,189.25 171.551,193.504 171.492,197.754 172.43,197.754 172.543,193.504 172.656,189.25 172.77,185 172.91,180.746 173.055,176.496 173.223,172.242 173.422,167.992 173.617,163.738 173.848,159.488 174.129,155.234 174.441,150.984 174.809,146.73 175.234,142.48 175.746,138.226 176.367,133.976 176.82,131.426 177.16,129.723 177.73,127.172 178.184,125.473 178.949,122.922 179.516,121.219 180.566,118.668 181.414,116.969 182.977,114.418 184.25,112.715 178.582,112.715 "/>
<path id="path202" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 189.922,112.715 L 188.105,114.418 185.953,116.969 184.789,118.668 183.316,121.219 182.496,122.922 181.418,125.473 180.793,127.172 180,129.723 179.52,131.426 178.895,133.976 178.016,138.226 177.309,142.48 176.684,146.73 176.172,150.984 175.746,155.234 175.379,159.488 175.039,163.738 174.754,167.992 174.5,172.242 174.246,176.496 174.047,180.746 173.848,185 173.68,189.25 173.535,193.504 173.395,197.754 174.332,197.754 174.527,193.504 174.727,189.25 174.926,185 175.18,180.746 175.438,176.496 175.746,172.242 176.09,167.992 176.457,163.738 176.883,159.488 177.363,155.234 177.93,150.984 178.582,146.73 179.348,142.48 180.281,138.226 181.418,133.976 182.238,131.426 182.836,129.723 183.855,127.172 184.648,125.473 186.039,122.922 187.09,121.219 188.988,118.668 190.488,116.969 193.27,114.418 195.594,112.715 189.922,112.715 "/>
<path id="path203" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 188.504,129.723 L 197.008,129.723 M 184.254,146.73 L 192.758,146.73 M 182.129,163.738 L 190.633,163.738 "/>
<path id="path204" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,228.934 L 81.0703,226.609 83.6211,223.832 85.3242,222.328 87.875,220.43 89.5742,219.351 92.125,217.992 93.8281,217.199 96.3789,216.18 98.0781,215.582 100.629,214.762 104.883,213.629 109.133,212.691 113.387,211.926 117.637,211.273 121.891,210.707 126.141,210.223 130.395,209.797 134.645,209.43 138.898,209.09 143.148,208.777 147.402,208.523 151.652,208.266 155.906,208.07 160.156,207.871 164.41,207.672 164.41,206.734 160.156,206.879 155.906,207.019 151.652,207.191 147.402,207.391 143.148,207.586 138.898,207.844 134.645,208.098 130.395,208.383 126.141,208.723 121.891,209.09 117.637,209.516 113.387,210.023 109.133,210.648 104.883,211.359 100.629,212.238 98.0781,212.859 96.3789,213.344 93.8281,214.137 92.125,214.758 89.5742,215.808 87.875,216.66 85.3242,218.133 83.6211,219.293 81.0703,221.449 79.3711,223.262 79.3711,228.93 "/>
<path id="path205" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,217.594 L 81.0703,216.316 83.6211,214.758 85.3242,213.91 87.875,212.859 89.5742,212.266 92.125,211.527 93.8281,211.074 96.3789,210.508 98.0781,210.168 100.629,209.715 104.883,209.09 109.133,208.582 113.387,208.156 117.637,207.785 121.891,207.473 126.141,207.191 130.395,206.965 134.645,206.766 138.898,206.566 143.148,206.398 147.402,206.254 151.652,206.113 155.906,206 160.156,205.887 164.41,205.773 164.41,204.84 160.156,204.894 155.906,204.98 151.652,205.039 147.402,205.125 143.148,205.207 138.898,205.32 134.645,205.434 130.395,205.547 126.141,205.687 121.891,205.859 117.637,206.031 113.387,206.258 109.133,206.512 104.883,206.824 100.629,207.191 98.0781,207.476 96.3789,207.672 93.8281,208.012 92.125,208.269 89.5742,208.723 87.875,209.09 85.3242,209.715 83.6211,210.226 81.0703,211.16 79.3711,211.926 79.3711,217.598 "/>
<path id="path206" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,206.258 L 81.0703,206 83.6211,205.687 85.3242,205.519 87.875,205.32 89.5742,205.18 92.125,205.035 93.8281,204.953 96.3789,204.84 98.0781,204.781 100.629,204.668 104.883,204.555 109.133,204.441 113.387,204.355 117.637,204.301 121.891,204.242 126.141,204.187 130.395,204.129 134.645,204.101 138.898,204.043 143.148,204.016 147.402,203.984 151.652,203.957 155.906,203.93 160.156,203.902 164.41,203.902 164.41,202.937 160.156,202.937 155.906,202.91 151.652,202.879 147.402,202.851 143.148,202.824 138.898,202.797 134.645,202.738 130.395,202.711 126.141,202.652 121.891,202.594 117.637,202.539 113.387,202.48 109.133,202.394 104.883,202.281 100.629,202.172 98.0781,202.058 96.3789,202 93.8281,201.887 92.125,201.801 89.5742,201.633 87.875,201.519 85.3242,201.32 83.6211,201.148 81.0703,200.84 79.3711,200.582 79.3711,206.254 "/>
<path id="path207" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,194.918 L 81.0703,195.684 83.6211,196.617 85.3242,197.129 87.875,197.754 89.5742,198.094 92.125,198.574 93.8281,198.832 96.3789,199.172 98.0781,199.367 100.629,199.652 104.883,200.019 109.133,200.332 113.387,200.59 117.637,200.816 121.891,200.984 126.141,201.156 130.395,201.297 134.645,201.41 138.898,201.523 143.148,201.637 147.402,201.723 151.652,201.805 155.906,201.863 160.156,201.949 164.41,202.004 164.41,201.066 160.156,200.957 155.906,200.844 151.652,200.73 147.402,200.59 143.148,200.445 138.898,200.273 134.645,200.078 130.395,199.879 126.141,199.652 121.891,199.367 117.637,199.058 113.387,198.687 109.133,198.262 104.883,197.754 100.629,197.129 98.0781,196.676 96.3789,196.336 93.8281,195.769 92.125,195.312 89.5742,194.551 87.875,193.98 85.3242,192.934 83.6211,192.082 81.0703,190.523 79.3711,189.25 79.3711,194.918 "/>
<path id="path208" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,183.578 L 81.0703,185.391 83.6211,187.547 85.3242,188.707 87.875,190.184 89.5742,191.004 92.125,192.082 93.8281,192.703 96.3789,193.5 98.0781,193.98 100.629,194.605 104.883,195.484 109.133,196.191 113.387,196.816 117.637,197.324 121.891,197.754 126.141,198.121 130.395,198.461 134.645,198.742 138.898,199 143.148,199.254 147.402,199.453 151.652,199.652 155.906,199.82 160.156,199.961 164.41,200.101 164.41,199.168 160.156,198.969 155.906,198.769 151.652,198.574 147.402,198.316 143.148,198.062 138.898,197.75 134.645,197.41 130.395,197.039 126.141,196.613 121.891,196.133 117.637,195.566 113.387,194.914 109.133,194.148 104.883,193.215 100.629,192.078 98.0781,191.258 96.3789,190.66 93.8281,189.641 92.125,188.848 89.5742,187.457 87.875,186.41 85.3242,184.508 83.6211,183.008 81.0703,180.23 79.3711,177.906 79.3711,183.574 "/>
<path id="path209" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 96.3789,184.992 L 96.3789,176.488 M 113.387,189.246 L 113.387,180.742 M 130.395,191.371 L 130.395,182.867 "/>
<path id="path210" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 790.094,174.305 L 787.246,173.863 783.48,173.703 781.215,173.844 778.07,174.305 776.105,174.746 773.34,175.59 771.574,176.23 769.051,177.312 767.426,178.094 765.039,179.316 761.23,181.523 757.562,183.867 754.016,186.332 750.547,188.879 747.141,191.484 743.793,194.152 740.484,196.855 737.219,199.601 733.973,202.367 730.746,205.156 727.559,207.98 724.371,210.808 721.227,213.676 718.078,216.539 714.93,219.406 714.27,218.746 717.375,215.84 720.484,212.934 723.609,210.047 726.758,207.18 729.902,204.312 733.09,201.488 736.277,198.66 739.484,195.855 742.73,193.09 746,190.344 749.305,187.637 752.672,184.992 756.121,182.426 759.629,179.922 763.258,177.535 765.5,176.172 767.047,175.312 769.41,174.066 771.051,173.305 773.598,172.242 775.402,171.644 778.246,170.879 780.273,170.5 783.602,170.219 786.086,170.297 790.094,174.308 "/>
<path id="path211" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 782.078,166.289 L 779.973,166.59 777.066,167.293 775.262,167.894 772.719,168.957 771.094,169.738 768.77,171.019 767.242,171.902 765.039,173.305 763.598,174.266 761.473,175.75 758.027,178.316 754.656,180.961 751.352,183.668 748.086,186.414 744.855,189.199 741.648,192.008 738.48,194.851 735.336,197.719 732.188,200.586 729.062,203.473 725.953,206.379 722.848,209.285 719.762,212.211 716.676,215.137 713.586,218.062 712.926,217.402 715.973,214.437 719.039,211.488 722.086,208.523 725.152,205.578 728.219,202.629 731.305,199.703 734.395,196.777 737.48,193.851 740.586,190.945 743.715,188.058 746.84,185.172 750.008,182.324 753.195,179.5 756.422,176.711 759.688,173.965 761.691,172.363 763.035,171.301 765.078,169.734 766.465,168.715 768.59,167.23 770.055,166.289 772.297,164.926 773.859,164.082 776.324,162.941 778.07,162.277 782.078,166.285 "/>
<path id="path212" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 774.059,158.269 L 772.676,159.293 770.652,160.879 769.328,161.961 767.383,163.621 766.082,164.726 764.176,166.43 762.914,167.57 761.031,169.297 759.785,170.457 757.902,172.18 754.816,175.105 751.73,178.031 748.664,180.98 745.617,183.945 742.57,186.914 739.523,189.879 736.477,192.848 733.449,195.832 730.402,198.801 727.379,201.785 724.352,204.773 721.324,207.758 718.297,210.746 715.273,213.73 712.266,216.738 711.582,216.058 714.59,213.051 717.574,210.023 720.562,206.996 723.551,203.973 726.535,200.945 729.523,197.918 732.488,194.871 735.477,191.844 738.441,188.797 741.41,185.754 744.375,182.707 747.344,179.66 750.289,176.594 753.215,173.504 756.141,170.418 757.863,168.535 759.027,167.293 760.75,165.406 761.895,164.144 763.578,162.223 764.699,160.937 766.363,158.992 767.445,157.672 769.027,155.648 770.051,154.266 774.059,158.273 "/>
<path id="path213" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 766.043,150.254 L 765.383,151.996 764.238,154.461 763.395,156.023 762.031,158.269 761.07,159.715 759.605,161.859 758.586,163.242 757.023,165.285 755.961,166.629 754.355,168.633 751.609,171.898 748.824,175.129 746,178.312 743.152,181.48 740.266,184.609 737.379,187.734 734.473,190.84 731.547,193.93 728.617,197.016 725.691,200.101 722.746,203.168 719.801,206.234 716.836,209.281 713.887,212.348 710.922,215.394 710.258,214.73 713.184,211.644 716.113,208.558 719.039,205.473 721.945,202.363 724.852,199.258 727.738,196.133 730.602,192.984 733.469,189.836 736.316,186.672 739.121,183.461 741.91,180.234 744.656,176.969 747.359,173.66 750.008,170.293 752.57,166.844 754.055,164.723 755.02,163.277 756.418,161.074 757.301,159.551 758.566,157.203 759.367,155.601 760.43,153.055 761.031,151.254 761.73,148.344 762.035,146.238 766.043,150.25 "/>
<path id="path214" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 758.023,142.234 L 758.102,144.723 757.824,148.047 757.441,150.07 756.68,152.918 756.059,154.703 755.02,157.269 754.254,158.91 753.012,161.277 752.152,162.82 750.789,165.062 748.402,168.691 745.898,172.199 743.332,175.648 740.684,179.016 737.98,182.32 735.234,185.59 732.469,188.836 729.66,192.043 726.836,195.23 724.008,198.418 721.145,201.562 718.277,204.711 715.391,207.84 712.484,210.945 709.578,214.051 708.918,213.391 711.781,210.242 714.648,207.094 717.516,203.945 720.34,200.758 723.168,197.574 725.953,194.344 728.719,191.098 731.465,187.832 734.172,184.523 736.836,181.176 739.445,177.769 741.988,174.301 744.453,170.754 746.801,167.086 749.004,163.277 750.227,160.894 751.008,159.269 752.09,156.742 752.73,154.98 753.555,152.191 754.016,150.25 754.477,147.101 754.617,144.836 754.457,141.066 754.016,138.223 758.023,142.23 "/>
<path id="path215" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 740.984,149.25 L 747,155.262 M 731.969,164.281 L 737.98,170.297 M 721.441,177.812 L 727.457,183.824 "/>
<path id="path216" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 144.566,577.598 L 146.891,575.894 149.672,573.344 151.172,571.644 153.07,569.094 154.148,567.391 155.508,564.84 156.301,563.141 157.32,560.59 157.918,558.887 158.738,556.336 159.871,552.086 160.809,547.832 161.574,543.582 162.227,539.328 162.793,535.074 163.277,530.824 163.703,526.57 164.07,522.32 164.41,518.066 164.723,513.816 164.977,509.562 165.234,505.312 165.43,501.058 165.629,496.808 165.828,492.555 166.766,492.555 166.621,496.808 166.48,501.058 166.309,505.312 166.113,509.562 165.914,513.816 165.66,518.066 165.402,522.32 165.121,526.57 164.781,530.824 164.41,535.074 163.984,539.328 163.477,543.582 162.852,547.832 162.145,552.086 161.266,556.336 160.641,558.887 160.16,560.59 159.367,563.141 158.742,564.84 157.691,567.391 156.844,569.094 155.367,571.644 154.207,573.344 152.055,575.894 150.238,577.598 144.57,577.598 "/>
<path id="path217" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 155.906,577.598 L 157.184,575.894 158.742,573.344 159.59,571.644 160.641,569.094 161.234,567.391 161.973,564.84 162.426,563.141 162.992,560.59 163.332,558.887 163.785,556.336 164.41,552.086 164.922,547.832 165.344,543.582 165.715,539.328 166.027,535.074 166.309,530.824 166.535,526.57 166.734,522.32 166.934,518.066 167.102,513.816 167.246,509.562 167.387,505.312 167.5,501.058 167.613,496.808 167.727,492.555 168.66,492.555 168.602,496.808 168.52,501.058 168.461,505.312 168.375,509.562 168.289,513.816 168.18,518.066 168.066,522.32 167.953,526.57 167.809,530.824 167.641,535.074 167.469,539.328 167.242,543.582 166.988,547.832 166.676,552.086 166.309,556.336 166.023,558.887 165.824,560.59 165.484,563.141 165.23,564.84 164.777,567.391 164.406,569.094 163.785,571.644 163.273,573.344 162.34,575.894 161.574,577.598 155.902,577.598 "/>
<path id="path218" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 167.242,577.598 L 167.5,575.894 167.812,573.344 167.98,571.644 168.18,569.094 168.32,567.391 168.465,564.84 168.547,563.141 168.66,560.59 168.719,558.887 168.832,556.336 168.945,552.086 169.059,547.832 169.145,543.582 169.199,539.328 169.258,535.074 169.312,530.824 169.371,526.57 169.398,522.32 169.457,518.066 169.484,513.816 169.516,509.562 169.543,505.312 169.57,501.058 169.598,496.808 169.598,492.555 170.562,492.555 170.562,496.808 170.59,501.058 170.621,505.312 170.648,509.562 170.676,513.816 170.703,518.066 170.762,522.32 170.789,526.57 170.848,530.824 170.906,535.074 170.961,539.328 171.02,543.582 171.105,547.832 171.219,552.086 171.328,556.336 171.441,558.887 171.5,560.59 171.613,563.141 171.699,564.84 171.867,567.391 171.98,569.094 172.18,571.644 172.352,573.344 172.66,575.894 172.918,577.598 167.246,577.598 "/>
<path id="path219" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 178.582,577.598 L 177.816,575.894 176.879,573.344 176.371,571.644 175.746,569.094 175.406,567.391 174.926,564.84 174.668,563.141 174.328,560.59 174.133,558.887 173.848,556.336 173.48,552.086 173.168,547.832 172.91,543.582 172.684,539.328 172.516,535.074 172.344,530.824 172.203,526.57 172.09,522.32 171.977,518.066 171.863,513.816 171.777,509.562 171.691,505.312 171.637,501.058 171.551,496.808 171.492,492.555 172.43,492.555 172.543,496.808 172.656,501.058 172.77,505.312 172.91,509.562 173.055,513.816 173.223,518.066 173.422,522.32 173.617,526.57 173.848,530.824 174.129,535.074 174.441,539.328 174.809,543.582 175.234,547.832 175.746,552.086 176.367,556.336 176.82,558.887 177.16,560.59 177.73,563.141 178.184,564.84 178.949,567.391 179.516,569.094 180.566,571.644 181.414,573.344 182.977,575.894 184.25,577.598 178.582,577.598 "/>
<path id="path220" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 189.922,577.598 L 188.105,575.894 185.953,573.344 184.789,571.644 183.316,569.094 182.496,567.391 181.418,564.84 180.793,563.141 180,560.59 179.52,558.887 178.895,556.336 178.016,552.086 177.309,547.832 176.684,543.582 176.172,539.328 175.746,535.074 175.379,530.824 175.039,526.57 174.754,522.32 174.5,518.066 174.246,513.816 174.047,509.562 173.848,505.312 173.68,501.058 173.535,496.808 173.395,492.555 174.332,492.555 174.527,496.808 174.727,501.058 174.926,505.312 175.18,509.562 175.438,513.816 175.746,518.066 176.09,522.32 176.457,526.57 176.883,530.824 177.363,535.074 177.93,539.328 178.582,543.582 179.348,547.832 180.281,552.086 181.418,556.336 182.238,558.887 182.836,560.59 183.855,563.141 184.648,564.84 186.039,567.391 187.09,569.094 188.988,571.644 190.488,573.344 193.27,575.894 195.594,577.598 189.922,577.598 "/>
<path id="path221" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 197.008,560.59 L 188.504,560.59 M 192.758,543.582 L 184.254,543.582 M 190.633,526.57 L 182.129,526.57 "/>
<path id="path222" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,512.391 L 81.0703,510.066 83.6211,507.289 85.3242,505.785 87.875,503.891 89.5742,502.812 92.125,501.453 93.8281,500.656 96.3789,499.637 98.0781,499.043 100.629,498.219 104.883,497.086 109.133,496.148 113.387,495.383 117.637,494.73 121.891,494.168 126.141,493.684 130.395,493.258 134.645,492.891 138.898,492.551 143.148,492.238 147.402,491.98 151.652,491.726 155.906,491.527 160.156,491.332 164.41,491.133 164.41,490.195 160.156,490.336 155.906,490.48 151.652,490.648 147.402,490.848 143.148,491.047 138.898,491.301 134.645,491.558 130.395,491.84 126.141,492.18 121.891,492.551 117.637,492.973 113.387,493.484 109.133,494.109 104.883,494.816 100.629,495.695 98.0781,496.32 96.3789,496.801 93.8281,497.594 92.125,498.219 89.5742,499.266 87.875,500.117 85.3242,501.594 83.6211,502.754 81.0703,504.906 79.3711,506.723 79.3711,512.391 "/>
<path id="path223" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,501.055 L 81.0703,499.777 83.6211,498.219 85.3242,497.367 87.875,496.32 89.5742,495.723 92.125,494.988 93.8281,494.531 96.3789,493.969 98.0781,493.629 100.629,493.176 104.883,492.551 109.133,492.039 113.387,491.613 117.637,491.246 121.891,490.934 126.141,490.648 130.395,490.422 134.645,490.223 138.898,490.027 143.148,489.855 147.402,489.715 151.652,489.574 155.906,489.461 160.156,489.348 164.41,489.23 164.41,488.297 160.156,488.355 155.906,488.437 151.652,488.496 147.402,488.582 143.148,488.668 138.898,488.777 134.645,488.891 130.395,489.004 126.141,489.148 121.891,489.316 117.637,489.488 113.387,489.715 109.133,489.973 104.883,490.281 100.629,490.652 98.0781,490.934 96.3789,491.133 93.8281,491.473 92.125,491.73 89.5742,492.184 87.875,492.551 85.3242,493.176 83.6211,493.684 81.0703,494.621 79.3711,495.387 79.3711,501.055 "/>
<path id="path224" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,489.715 L 81.0703,489.461 83.6211,489.148 85.3242,488.976 87.875,488.777 89.5742,488.637 92.125,488.496 93.8281,488.41 96.3789,488.297 98.0781,488.238 100.629,488.125 104.883,488.012 109.133,487.898 113.387,487.816 117.637,487.758 121.891,487.703 126.141,487.644 130.395,487.59 134.645,487.558 138.898,487.504 143.148,487.476 147.402,487.445 151.652,487.418 155.906,487.391 160.156,487.363 164.41,487.363 164.41,486.398 160.156,486.398 155.906,486.371 151.652,486.344 147.402,486.316 143.148,486.285 138.898,486.258 134.645,486.203 130.395,486.172 126.141,486.117 121.891,486.058 117.637,486.004 113.387,485.945 109.133,485.859 104.883,485.746 100.629,485.633 98.0781,485.519 96.3789,485.465 93.8281,485.351 92.125,485.266 89.5742,485.098 87.875,484.98 85.3242,484.785 83.6211,484.613 81.0703,484.301 79.3711,484.047 79.3711,489.715 "/>
<path id="path225" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,478.375 L 81.0703,479.141 83.6211,480.078 85.3242,480.59 87.875,481.211 89.5742,481.551 92.125,482.035 93.8281,482.289 96.3789,482.629 98.0781,482.828 100.629,483.113 104.883,483.48 109.133,483.793 113.387,484.047 117.637,484.273 121.891,484.445 126.141,484.613 130.395,484.754 134.645,484.867 138.898,484.98 143.148,485.098 147.402,485.18 151.652,485.266 155.906,485.324 160.156,485.406 164.41,485.465 164.41,484.527 160.156,484.414 155.906,484.301 151.652,484.187 147.402,484.047 143.148,483.906 138.898,483.734 134.645,483.535 130.395,483.34 126.141,483.113 121.891,482.828 117.637,482.516 113.387,482.148 109.133,481.723 104.883,481.211 100.629,480.586 98.0781,480.133 96.3789,479.793 93.8281,479.226 92.125,478.773 89.5742,478.008 87.875,477.441 85.3242,476.391 83.6211,475.543 81.0703,473.98 79.3711,472.707 79.3711,478.375 "/>
<path id="path226" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 79.3711,467.035 L 81.0703,468.851 83.6211,471.004 85.3242,472.168 87.875,473.641 89.5742,474.465 92.125,475.543 93.8281,476.164 96.3789,476.957 98.0781,477.441 100.629,478.062 104.883,478.941 109.133,479.652 113.387,480.273 117.637,480.785 121.891,481.211 126.141,481.582 130.395,481.922 134.645,482.203 138.898,482.461 143.148,482.715 147.402,482.91 151.652,483.109 155.906,483.281 160.156,483.422 164.41,483.562 164.41,482.629 160.156,482.43 155.906,482.234 151.652,482.035 147.402,481.777 143.148,481.523 138.898,481.211 134.645,480.871 130.395,480.504 126.141,480.078 121.891,479.594 117.637,479.027 113.387,478.379 109.133,477.609 104.883,476.676 100.629,475.543 98.0781,474.719 96.3789,474.125 93.8281,473.101 92.125,472.308 89.5742,470.922 87.875,469.871 85.3242,467.973 83.6211,466.469 81.0703,463.691 79.3711,461.367 79.3711,467.035 "/>
<path id="path227" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 96.3789,511.976 L 96.3789,503.473 M 113.387,507.723 L 113.387,499.219 M 130.395,505.598 L 130.395,497.094 "/>
<path id="path228" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,228.934 L 1052.79,226.609 1050.24,223.832 1048.54,222.328 1045.98,220.43 1044.29,219.351 1041.73,217.992 1040.03,217.199 1037.48,216.18 1035.78,215.582 1033.23,214.762 1028.98,213.629 1024.73,212.691 1020.47,211.926 1016.22,211.273 1011.97,210.707 1007.72,210.226 1003.46,209.801 999.215,209.434 994.961,209.094 990.711,208.777 986.457,208.523 982.207,208.269 977.953,208.07 973.703,207.871 969.449,207.672 969.449,206.738 973.703,206.879 977.953,207.019 982.207,207.191 986.457,207.391 990.711,207.586 994.961,207.844 999.215,208.098 1003.46,208.383 1007.72,208.723 1011.97,209.09 1016.22,209.516 1020.47,210.023 1024.73,210.648 1028.98,211.359 1033.23,212.238 1035.78,212.859 1037.48,213.344 1040.03,214.137 1041.73,214.758 1044.29,215.808 1045.98,216.66 1048.54,218.133 1050.24,219.297 1052.79,221.449 1054.49,223.262 1054.49,228.934 "/>
<path id="path229" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,217.594 L 1052.79,216.316 1050.24,214.758 1048.54,213.91 1045.98,212.859 1044.29,212.266 1041.73,211.527 1040.03,211.074 1037.48,210.508 1035.78,210.168 1033.23,209.715 1028.98,209.09 1024.73,208.578 1020.47,208.156 1016.22,207.785 1011.97,207.473 1007.72,207.191 1003.46,206.965 999.215,206.766 994.961,206.566 990.711,206.398 986.457,206.254 982.207,206.113 977.953,206 973.703,205.887 969.449,205.773 969.449,204.84 973.703,204.894 977.953,204.98 982.207,205.035 986.457,205.121 990.711,205.207 994.961,205.32 999.215,205.434 1003.46,205.547 1007.72,205.687 1011.97,205.859 1016.22,206.027 1020.47,206.254 1024.73,206.512 1028.98,206.82 1033.23,207.191 1035.78,207.473 1037.48,207.672 1040.03,208.012 1041.73,208.269 1044.29,208.723 1045.98,209.09 1048.54,209.715 1050.24,210.223 1052.79,211.16 1054.49,211.926 1054.49,217.598 "/>
<path id="path230" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,206.254 L 1052.79,206 1050.24,205.687 1048.54,205.519 1045.98,205.32 1044.29,205.18 1041.73,205.035 1040.03,204.949 1037.48,204.84 1035.78,204.777 1033.23,204.668 1028.98,204.555 1024.73,204.441 1020.47,204.355 1016.22,204.301 1011.97,204.242 1007.72,204.184 1003.46,204.129 999.215,204.098 994.961,204.043 990.711,204.016 986.457,203.984 982.207,203.961 977.953,203.93 973.703,203.902 969.449,203.902 969.449,202.937 973.703,202.937 977.953,202.91 982.207,202.883 986.457,202.855 990.711,202.824 994.961,202.801 999.215,202.742 1003.46,202.715 1007.72,202.656 1011.97,202.598 1016.22,202.543 1020.47,202.484 1024.73,202.398 1028.98,202.285 1033.23,202.172 1035.78,202.058 1037.48,202.004 1040.03,201.891 1041.73,201.805 1044.29,201.637 1045.98,201.519 1048.54,201.324 1050.24,201.152 1052.79,200.84 1054.49,200.586 1054.49,206.254 "/>
<path id="path231" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,194.918 L 1052.79,195.684 1050.24,196.617 1048.54,197.129 1045.98,197.754 1044.29,198.094 1041.73,198.574 1040.03,198.832 1037.48,199.172 1035.78,199.367 1033.23,199.652 1028.98,200.019 1024.73,200.332 1020.47,200.59 1016.22,200.816 1011.97,200.984 1007.72,201.156 1003.46,201.297 999.215,201.41 994.961,201.523 990.711,201.637 986.457,201.723 982.207,201.808 977.953,201.863 973.703,201.949 969.449,202.004 969.449,201.07 973.703,200.957 977.953,200.844 982.207,200.73 986.457,200.59 990.711,200.445 994.961,200.277 999.215,200.078 1003.46,199.879 1007.72,199.652 1011.97,199.367 1016.22,199.058 1020.47,198.687 1024.73,198.262 1028.98,197.754 1033.23,197.129 1035.78,196.676 1037.48,196.336 1040.03,195.766 1041.73,195.312 1044.29,194.547 1045.98,193.98 1048.54,192.934 1050.24,192.082 1052.79,190.523 1054.49,189.246 1054.49,194.918 "/>
<path id="path232" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,183.578 L 1052.79,185.391 1050.24,187.547 1048.54,188.707 1045.98,190.184 1044.29,191.004 1041.73,192.082 1040.03,192.703 1037.48,193.5 1035.78,193.98 1033.23,194.605 1028.98,195.484 1024.73,196.191 1020.47,196.816 1016.22,197.324 1011.97,197.754 1007.72,198.121 1003.46,198.461 999.215,198.742 994.961,199 990.711,199.254 986.457,199.453 982.207,199.652 977.953,199.82 973.703,199.965 969.449,200.105 969.449,199.168 973.703,198.973 977.953,198.773 982.207,198.574 986.457,198.32 990.711,198.066 994.961,197.754 999.215,197.41 1003.46,197.043 1007.72,196.617 1011.97,196.137 1016.22,195.57 1020.47,194.918 1024.73,194.152 1028.98,193.219 1033.23,192.082 1035.78,191.262 1037.48,190.664 1040.03,189.644 1041.73,188.851 1044.29,187.461 1045.98,186.41 1048.54,184.512 1050.24,183.012 1052.79,180.23 1054.49,177.906 1054.49,183.578 "/>
<path id="path233" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 1037.48,176.488 L 1037.48,184.992 M 1020.47,180.742 L 1020.47,189.246 M 1003.46,182.867 L 1003.46,191.375 "/>
<path id="path234" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,461.371 L 1052.79,463.695 1050.24,466.473 1048.54,467.973 1045.98,469.875 1044.29,470.949 1041.73,472.312 1040.03,473.105 1037.48,474.129 1035.78,474.723 1033.23,475.543 1028.98,476.68 1024.73,477.613 1020.47,478.379 1016.22,479.031 1011.97,479.598 1007.72,480.082 1003.46,480.508 999.215,480.875 994.961,481.215 990.711,481.527 986.457,481.781 982.207,482.035 977.953,482.234 973.703,482.434 969.449,482.633 969.449,483.566 973.703,483.426 977.953,483.281 982.207,483.113 986.457,482.914 990.711,482.715 994.961,482.461 999.215,482.207 1003.46,481.922 1007.72,481.582 1011.97,481.215 1016.22,480.789 1020.47,480.277 1024.73,479.652 1028.98,478.945 1033.23,478.066 1035.78,477.441 1037.48,476.961 1040.03,476.168 1041.73,475.543 1044.29,474.496 1045.98,473.644 1048.54,472.172 1050.24,471.008 1052.79,468.855 1054.49,467.043 1054.49,461.371 "/>
<path id="path235" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,472.707 L 1052.79,473.984 1050.24,475.543 1048.54,476.394 1045.98,477.441 1044.29,478.039 1041.73,478.773 1040.03,479.23 1037.48,479.797 1035.78,480.137 1033.23,480.59 1028.98,481.211 1024.73,481.723 1020.47,482.148 1016.22,482.516 1011.97,482.828 1007.72,483.109 1003.46,483.34 999.215,483.535 994.961,483.734 990.711,483.906 986.457,484.047 982.207,484.187 977.953,484.301 973.703,484.414 969.449,484.527 969.449,485.465 973.703,485.406 977.953,485.32 982.207,485.266 986.457,485.18 990.711,485.094 994.961,484.98 999.215,484.867 1003.46,484.754 1007.72,484.613 1011.97,484.445 1016.22,484.273 1020.47,484.047 1024.73,483.793 1028.98,483.48 1033.23,483.109 1035.78,482.828 1037.48,482.629 1040.03,482.289 1041.73,482.031 1044.29,481.582 1045.98,481.211 1048.54,480.59 1050.24,480.078 1052.79,479.144 1054.49,478.379 1054.49,472.707 "/>
<path id="path236" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,484.047 L 1052.79,484.301 1050.24,484.613 1048.54,484.785 1045.98,484.98 1044.29,485.125 1041.73,485.266 1040.03,485.351 1037.48,485.465 1035.78,485.519 1033.23,485.633 1028.98,485.746 1024.73,485.859 1020.47,485.945 1016.22,486 1011.97,486.058 1007.72,486.113 1003.46,486.172 999.215,486.199 994.961,486.258 990.711,486.285 986.457,486.312 982.207,486.344 977.953,486.371 973.703,486.398 969.449,486.402 969.449,487.363 973.703,487.363 977.953,487.394 982.207,487.422 986.457,487.449 990.711,487.476 994.961,487.508 999.215,487.562 1003.46,487.594 1007.72,487.648 1011.97,487.707 1016.22,487.766 1020.47,487.82 1024.73,487.906 1028.98,488.019 1033.23,488.133 1035.78,488.246 1037.48,488.301 1040.03,488.414 1041.73,488.5 1044.29,488.672 1045.98,488.785 1048.54,488.98 1050.24,489.152 1052.79,489.465 1054.49,489.719 1054.49,484.051 "/>
<path id="path237" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,495.387 L 1052.79,494.621 1050.24,493.684 1048.54,493.176 1045.98,492.551 1044.29,492.211 1041.73,491.726 1040.03,491.473 1037.48,491.133 1035.78,490.934 1033.23,490.652 1028.98,490.281 1024.73,489.973 1020.47,489.715 1016.22,489.488 1011.97,489.32 1007.72,489.148 1003.46,489.008 999.215,488.894 994.961,488.781 990.711,488.668 986.457,488.582 982.207,488.496 977.953,488.441 973.703,488.355 969.449,488.301 969.449,489.234 973.703,489.348 977.953,489.461 982.207,489.574 986.457,489.715 990.711,489.859 994.961,490.027 999.215,490.226 1003.46,490.426 1007.72,490.652 1011.97,490.937 1016.22,491.25 1020.47,491.617 1024.73,492.043 1028.98,492.551 1033.23,493.176 1035.78,493.629 1037.48,493.969 1040.03,494.539 1041.73,494.992 1044.29,495.758 1045.98,496.324 1048.54,497.375 1050.24,498.223 1052.79,499.781 1054.49,501.058 1054.49,495.391 "/>
<path id="path238" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 1054.49,506.726 L 1052.79,504.91 1050.24,502.758 1048.54,501.598 1045.98,500.121 1044.29,499.301 1041.73,498.223 1040.03,497.598 1037.48,496.805 1035.78,496.324 1033.23,495.699 1028.98,494.82 1024.73,494.113 1020.47,493.488 1016.22,492.976 1011.97,492.551 1007.72,492.184 1003.46,491.844 999.215,491.558 994.961,491.305 990.711,491.051 986.457,490.851 982.207,490.652 977.953,490.48 973.703,490.34 969.449,490.199 969.449,491.137 973.703,491.332 977.953,491.531 982.207,491.726 986.457,491.984 990.711,492.238 994.961,492.551 999.215,492.891 1003.46,493.262 1007.72,493.684 1011.97,494.168 1016.22,494.734 1020.47,495.387 1024.73,496.152 1028.98,497.086 1033.23,498.219 1035.78,499.043 1037.48,499.637 1040.03,500.66 1041.73,501.453 1044.29,502.844 1045.98,503.891 1048.54,505.793 1050.24,507.293 1052.79,510.07 1054.49,512.394 1054.49,506.726 "/>
<path id="path239" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 1037.48,505.308 L 1037.48,513.812 M 1020.47,501.058 L 1020.47,509.562 M 1003.46,498.93 L 1003.46,507.434 "/>
<path id="path240" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 989.305,577.598 L 986.98,575.894 984.199,573.344 982.699,571.644 980.801,569.094 979.723,567.391 978.363,564.84 977.566,563.141 976.547,560.59 975.953,558.887 975.129,556.336 973.996,552.086 973.062,547.832 972.297,543.582 971.645,539.328 971.078,535.074 970.594,530.824 970.168,526.57 969.801,522.32 969.461,518.066 969.148,513.816 968.895,509.562 968.641,505.312 968.441,501.058 968.242,496.808 968.043,492.555 967.105,492.555 967.25,496.808 967.395,501.058 967.562,505.312 967.762,509.562 967.961,513.816 968.215,518.066 968.473,522.32 968.754,526.57 969.094,530.824 969.465,535.074 969.887,539.328 970.398,543.582 971.023,547.832 971.73,552.086 972.609,556.336 973.234,558.887 973.715,560.59 974.508,563.141 975.133,564.84 976.18,567.391 977.031,569.094 978.504,571.644 979.668,573.344 981.82,575.894 983.637,577.598 989.305,577.598 "/>
<path id="path241" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 977.965,577.598 L 976.688,575.894 975.129,573.344 974.277,571.644 973.23,569.094 972.633,567.391 971.898,564.84 971.441,563.141 970.879,560.59 970.535,558.887 970.086,556.336 969.461,552.086 968.949,547.832 968.523,543.582 968.156,539.328 967.844,535.074 967.562,530.824 967.336,526.57 967.137,522.32 966.938,518.066 966.77,513.816 966.625,509.562 966.484,505.312 966.371,501.058 966.258,496.808 966.145,492.555 965.207,492.555 965.266,496.808 965.352,501.058 965.406,505.312 965.492,509.562 965.578,513.816 965.691,518.066 965.805,522.32 965.918,526.57 966.059,530.824 966.23,535.074 966.398,539.328 966.625,543.582 966.883,547.832 967.191,552.086 967.562,556.336 967.844,558.887 968.043,560.59 968.383,563.141 968.641,564.84 969.094,567.391 969.461,569.094 970.086,571.644 970.594,573.344 971.531,575.894 972.297,577.598 977.969,577.598 "/>
<path id="path242" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 966.625,577.598 L 966.371,575.894 966.059,573.344 965.891,571.644 965.691,569.094 965.551,567.391 965.406,564.84 965.32,563.141 965.211,560.59 965.148,558.887 965.035,556.336 964.926,552.086 964.812,547.832 964.727,543.582 964.672,539.328 964.613,535.074 964.555,530.824 964.5,526.57 964.469,522.32 964.414,518.066 964.387,513.816 964.355,509.562 964.328,505.312 964.301,501.058 964.273,496.808 964.273,492.555 963.309,492.555 963.309,496.808 963.281,501.058 963.254,505.312 963.227,509.562 963.195,513.816 963.172,518.066 963.113,522.32 963.086,526.57 963.027,530.824 962.969,535.074 962.914,539.328 962.855,543.582 962.77,547.832 962.656,552.086 962.543,556.336 962.43,558.887 962.375,560.59 962.262,563.141 962.176,564.84 962.008,567.391 961.891,569.094 961.695,571.644 961.523,573.344 961.215,575.894 960.961,577.598 966.629,577.598 "/>
<path id="path243" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 955.285,577.598 L 956.051,575.894 956.988,573.344 957.496,571.644 958.121,569.094 958.461,567.391 958.945,564.84 959.199,563.141 959.539,560.59 959.738,558.887 960.023,556.336 960.391,552.086 960.703,547.832 960.957,543.582 961.184,539.328 961.355,535.074 961.523,530.824 961.664,526.57 961.777,522.32 961.891,518.066 962.008,513.816 962.09,509.562 962.176,505.312 962.234,501.058 962.316,496.808 962.375,492.555 961.438,492.555 961.324,496.808 961.215,501.058 961.102,505.312 960.957,509.562 960.816,513.816 960.645,518.066 960.445,522.32 960.25,526.57 960.023,530.824 959.738,535.074 959.426,539.328 959.059,543.582 958.633,547.832 958.121,552.086 957.496,556.336 957.043,558.887 956.703,560.59 956.137,563.141 955.684,564.84 954.918,567.391 954.352,569.094 953.301,571.644 952.453,573.344 950.895,575.894 949.617,577.598 955.285,577.598 "/>
<path id="path244" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 943.945,577.598 L 945.762,575.894 947.914,573.344 949.078,571.644 950.551,569.094 951.371,567.391 952.449,564.84 953.074,563.141 953.867,560.59 954.348,558.887 954.973,556.336 955.852,552.086 956.559,547.832 957.184,543.582 957.695,539.328 958.121,535.074 958.488,530.824 958.828,526.57 959.113,522.32 959.367,518.066 959.621,513.816 959.82,509.562 960.02,505.312 960.191,501.058 960.332,496.808 960.473,492.555 959.535,492.555 959.34,496.808 959.141,501.058 958.941,505.312 958.688,509.562 958.434,513.816 958.121,518.066 957.781,522.32 957.41,526.57 956.984,530.824 956.504,535.074 955.938,539.328 955.285,543.582 954.52,547.832 953.586,552.086 952.449,556.336 951.629,558.887 951.031,560.59 950.012,563.141 949.219,564.84 947.828,567.391 946.781,569.094 944.883,571.644 943.379,573.344 940.602,575.894 938.277,577.598 943.945,577.598 "/>
<path id="path245" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 945.363,560.59 L 936.859,560.59 M 949.613,543.582 L 941.109,543.582 M 951.742,526.57 L 943.238,526.57 "/>
<path id="path246" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 989.305,112.715 L 986.98,114.418 984.199,116.969 982.699,118.668 980.801,121.219 979.723,122.922 978.363,125.473 977.566,127.172 976.547,129.723 975.953,131.426 975.129,133.976 973.996,138.226 973.062,142.48 972.297,146.73 971.645,150.984 971.078,155.234 970.594,159.488 970.168,163.738 969.801,167.992 969.461,172.242 969.148,176.496 968.895,180.75 968.641,185 968.441,189.254 968.242,193.504 968.043,197.758 967.105,197.758 967.25,193.504 967.395,189.254 967.562,185 967.762,180.75 967.961,176.496 968.215,172.242 968.473,167.992 968.754,163.738 969.094,159.488 969.465,155.234 969.887,150.984 970.398,146.73 971.023,142.48 971.73,138.226 972.609,133.976 973.234,131.426 973.715,129.723 974.508,127.172 975.133,125.473 976.18,122.922 977.031,121.219 978.504,118.668 979.668,116.969 981.82,114.418 983.637,112.715 989.305,112.715 "/>
<path id="path247" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 977.965,112.715 L 976.688,114.418 975.129,116.969 974.277,118.668 973.23,121.219 972.633,122.922 971.898,125.473 971.441,127.172 970.879,129.723 970.535,131.426 970.086,133.976 969.461,138.226 968.949,142.48 968.523,146.73 968.156,150.984 967.844,155.234 967.562,159.488 967.336,163.738 967.137,167.992 966.938,172.242 966.77,176.496 966.625,180.75 966.484,185 966.371,189.254 966.258,193.504 966.145,197.758 965.207,197.758 965.266,193.504 965.352,189.254 965.406,185 965.492,180.75 965.578,176.496 965.691,172.242 965.805,167.992 965.918,163.738 966.059,159.488 966.23,155.234 966.398,150.984 966.625,146.73 966.883,142.48 967.191,138.226 967.562,133.976 967.844,131.426 968.043,129.723 968.383,127.172 968.641,125.473 969.094,122.922 969.461,121.219 970.086,118.668 970.594,116.969 971.531,114.418 972.297,112.715 977.969,112.715 "/>
<path id="path248" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 966.625,112.715 L 966.371,114.418 966.059,116.969 965.891,118.668 965.691,121.219 965.551,122.922 965.406,125.473 965.32,127.172 965.211,129.723 965.148,131.426 965.035,133.976 964.926,138.226 964.812,142.48 964.727,146.73 964.672,150.984 964.613,155.234 964.555,159.488 964.5,163.738 964.469,167.992 964.414,172.242 964.387,176.496 964.355,180.75 964.328,185 964.301,189.254 964.273,193.504 964.273,197.758 963.309,197.758 963.309,193.504 963.281,189.254 963.254,185 963.227,180.75 963.195,176.496 963.172,172.242 963.113,167.992 963.086,163.738 963.027,159.488 962.969,155.234 962.914,150.984 962.855,146.73 962.77,142.48 962.656,138.226 962.543,133.976 962.43,131.426 962.375,129.723 962.262,127.172 962.176,125.473 962.008,122.922 961.891,121.219 961.695,118.668 961.523,116.969 961.215,114.418 960.961,112.715 966.629,112.715 "/>
<path id="path249" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 955.285,112.715 L 956.051,114.418 956.988,116.969 957.496,118.668 958.121,121.219 958.461,122.922 958.945,125.473 959.199,127.172 959.539,129.723 959.738,131.426 960.023,133.976 960.391,138.226 960.703,142.48 960.957,146.73 961.184,150.984 961.355,155.234 961.523,159.488 961.664,163.738 961.777,167.992 961.891,172.242 962.008,176.496 962.09,180.75 962.176,185 962.234,189.254 962.316,193.504 962.375,197.758 961.438,197.758 961.324,193.504 961.215,189.254 961.102,185 960.957,180.75 960.816,176.496 960.645,172.242 960.445,167.992 960.25,163.738 960.023,159.488 959.738,155.234 959.426,150.984 959.059,146.73 958.633,142.48 958.121,138.226 957.496,133.976 957.043,131.426 956.703,129.723 956.137,127.172 955.684,125.473 954.918,122.922 954.352,121.219 953.301,118.668 952.453,116.969 950.895,114.418 949.617,112.715 955.285,112.715 "/>
<path id="path250" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 943.945,112.715 L 945.762,114.418 947.914,116.969 949.078,118.668 950.551,121.219 951.371,122.922 952.449,125.473 953.074,127.172 953.867,129.723 954.348,131.426 954.973,133.976 955.852,138.226 956.559,142.48 957.184,146.73 957.695,150.984 958.121,155.234 958.488,159.488 958.828,163.738 959.113,167.992 959.367,172.242 959.621,176.496 959.82,180.75 960.02,185 960.191,189.254 960.332,193.504 960.473,197.758 959.535,197.758 959.34,193.504 959.141,189.254 958.941,185 958.688,180.75 958.434,176.496 958.121,172.242 957.781,167.992 957.41,163.738 956.984,159.488 956.504,155.234 955.938,150.984 955.285,146.73 954.52,142.48 953.586,138.226 952.449,133.976 951.629,131.426 951.031,129.723 950.012,127.172 949.219,125.473 947.828,122.922 946.781,121.219 944.883,118.668 943.379,116.969 940.602,114.418 938.277,112.715 943.945,112.715 "/>
<path id="path251" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 936.859,129.723 L 945.363,129.723 M 941.109,146.73 L 949.613,146.73 M 943.238,163.738 L 951.742,163.738 "/>
<path id="path252" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 653.102,146.73 L 664.441,146.73 M 651.484,158.07 L 668.492,158.07 M 650.352,169.406 L 661.691,169.406 M 649.504,180.746 L 666.512,180.746 M 648.82,192.086 L 660.16,192.086 M 648.281,203.422 L 665.293,203.422 M 647.855,214.762 L 659.195,214.762 M 647.488,226.101 L 664.496,226.101 M 647.18,237.441 L 658.516,237.441 M 646.895,248.777 L 663.902,248.777 M 646.668,260.117 L 658.008,260.117 M 646.469,271.457 L 663.477,271.457 M 646.301,282.793 L 657.637,282.793 M 646.129,294.133 L 663.137,294.133 M 645.988,305.473 L 657.324,305.473 "/>
<path id="path253" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 628.156,146.73 L 629.035,152.398 629.773,158.07 630.367,163.738 630.906,169.406 631.359,175.078 631.785,180.746 632.125,186.418 632.438,192.086 632.719,197.754 632.977,203.426 633.203,209.094 633.398,214.762 633.598,220.434 633.77,226.101 633.938,231.769 634.078,237.441 634.223,243.109 634.363,248.777 634.477,254.449 634.59,260.117 634.676,265.785 634.789,271.457 634.871,277.125 634.957,282.797 635.043,288.465 635.129,294.133 635.184,299.805 635.27,305.473 635.328,311.141 635.387,316.812 635.668,316.812 635.609,311.141 635.555,305.473 635.496,299.805 635.441,294.133 635.355,288.465 635.297,282.797 635.211,277.125 635.129,271.457 635.043,265.785 634.957,260.117 634.871,254.449 634.758,248.777 634.645,243.109 634.531,237.441 634.391,231.769 634.25,226.101 634.105,220.434 633.938,214.762 633.738,209.094 633.539,203.426 633.312,197.754 633.059,192.086 632.805,186.418 632.492,180.746 632.121,175.078 631.727,169.406 631.242,163.738 630.703,158.07 630.055,152.398 629.285,146.73 628.152,146.73 "/>
<path id="path254" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 630.426,146.73 L 631.105,152.398 631.645,158.07 632.125,163.738 632.52,169.406 632.891,175.078 633.203,180.746 633.457,186.418 633.711,192.086 633.91,197.754 634.109,203.426 634.277,209.094 634.449,214.762 634.59,220.434 634.73,226.101 634.844,231.769 634.957,237.441 635.07,243.109 635.156,248.777 635.242,254.449 635.328,260.117 635.41,265.785 635.496,271.457 635.555,277.125 635.641,282.797 635.695,288.465 635.754,294.133 635.809,299.805 635.867,305.473 635.895,311.141 635.953,316.812 636.234,316.812 636.207,311.141 636.148,305.473 636.121,299.805 636.066,294.133 636.008,288.465 635.949,282.797 635.895,277.125 635.836,271.457 635.781,265.785 635.723,260.117 635.637,254.449 635.555,248.777 635.496,243.109 635.383,237.441 635.297,231.769 635.184,226.101 635.07,220.434 634.957,214.762 634.816,209.094 634.676,203.426 634.504,197.754 634.336,192.086 634.137,186.418 633.91,180.746 633.625,175.078 633.344,169.406 633.004,163.738 632.605,158.07 632.125,152.398 631.559,146.73 630.422,146.73 "/>
<path id="path255" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 632.691,146.73 L 633.145,152.398 633.543,158.07 633.883,163.738 634.137,169.406 634.395,175.078 634.621,180.746 634.793,186.418 634.961,192.086 635.102,197.754 635.242,203.426 635.359,209.094 635.473,214.762 635.586,220.434 635.668,226.101 635.754,231.769 635.84,237.441 635.895,243.109 635.98,248.777 636.039,254.449 636.094,260.117 636.152,265.785 636.211,271.457 636.238,277.125 636.297,282.797 636.352,288.465 636.383,294.133 636.41,299.805 636.465,305.473 636.496,311.141 636.523,316.812 636.805,316.812 636.777,311.141 636.75,305.473 636.723,299.805 636.691,294.133 636.664,288.465 636.637,282.797 636.605,277.125 636.551,271.457 636.52,265.785 636.465,260.117 636.438,254.449 636.379,248.777 636.32,243.109 636.266,237.441 636.207,231.769 636.148,226.101 636.066,220.434 635.98,214.762 635.895,209.094 635.809,203.426 635.695,197.754 635.586,192.086 635.473,186.418 635.328,180.746 635.16,175.078 634.961,169.406 634.734,163.738 634.48,158.07 634.195,152.398 633.828,146.73 632.691,146.73 "/>
<path id="path256" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 634.961,146.73 L 635.215,152.398 635.441,158.07 635.613,163.738 635.781,169.406 635.895,175.078 636.035,180.746 636.121,186.418 636.207,192.086 636.293,197.754 636.379,203.426 636.434,209.094 636.52,214.762 636.578,220.434 636.605,226.101 636.664,231.769 636.719,237.441 636.746,243.109 636.777,248.777 636.836,254.449 636.863,260.117 636.891,265.785 636.918,271.457 636.949,277.125 636.977,282.797 636.977,288.465 637.004,294.133 637.031,299.805 637.062,305.473 637.062,311.141 637.09,316.812 637.375,316.812 637.375,311.141 637.344,305.473 637.344,299.805 637.316,294.133 637.316,288.465 637.289,282.797 637.289,277.125 637.258,271.457 637.258,265.785 637.23,260.117 637.203,254.449 637.203,248.777 637.176,243.109 637.145,237.441 637.117,231.769 637.09,226.101 637.059,220.434 637.031,214.762 636.973,209.094 636.945,203.426 636.891,197.754 636.859,192.086 636.805,186.418 636.746,180.746 636.66,175.078 636.574,169.406 636.492,163.738 636.379,158.07 636.234,152.398 636.094,146.73 634.961,146.73 "/>
<path id="path257" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 637.227,146.73 L 637.285,152.398 637.312,158.07 637.371,163.738 637.398,169.406 637.43,175.078 637.457,180.746 637.457,186.418 637.484,192.086 637.484,197.754 637.512,203.426 637.512,209.094 637.543,214.762 637.543,220.434 637.57,226.101 637.57,237.441 637.598,243.109 637.598,260.117 637.629,265.785 637.629,294.133 637.656,299.801 637.656,316.808 637.938,316.808 637.938,299.801 637.969,294.133 637.969,265.785 637.996,260.117 637.996,243.109 638.023,237.441 638.023,226.101 638.055,220.434 638.055,214.762 638.082,209.094 638.082,203.426 638.109,197.754 638.109,192.086 638.137,186.418 638.168,180.746 638.168,175.078 638.195,169.406 638.223,163.738 638.281,158.07 638.309,152.398 638.367,146.73 637.23,146.73 "/>
<path id="path258" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 639.496,146.73 L 639.352,152.398 639.211,158.07 639.098,163.738 639.016,169.406 638.93,175.078 638.871,180.746 638.785,186.418 638.73,192.086 638.703,197.754 638.645,203.426 638.617,209.094 638.559,214.762 638.531,220.434 638.504,226.101 638.473,231.769 638.445,237.441 638.418,243.109 638.387,248.777 638.387,254.449 638.359,260.117 638.332,265.785 638.332,271.457 638.301,277.125 638.301,282.797 638.273,288.465 638.273,294.133 638.246,299.805 638.246,305.473 638.219,311.141 638.219,316.812 638.5,316.812 638.531,311.141 638.531,305.473 638.559,299.805 638.586,294.133 638.613,288.465 638.613,282.797 638.645,277.125 638.672,271.457 638.699,265.785 638.73,260.117 638.758,254.449 638.816,248.777 638.844,243.109 638.871,237.441 638.93,231.769 638.984,226.101 639.016,220.434 639.07,214.762 639.156,209.094 639.215,203.426 639.297,197.754 639.383,192.086 639.469,186.418 639.582,180.746 639.695,175.078 639.809,169.406 639.977,163.738 640.148,158.07 640.375,152.398 640.633,146.73 639.496,146.73 "/>
<path id="path259" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 641.766,146.73 L 641.395,152.398 641.113,158.07 640.855,163.738 640.629,169.406 640.43,175.078 640.289,180.746 640.117,186.418 640.008,192.086 639.895,197.754 639.781,203.426 639.695,209.094 639.609,214.762 639.523,220.434 639.438,226.101 639.383,231.769 639.324,237.441 639.27,243.109 639.211,248.777 639.152,254.449 639.125,260.117 639.066,265.785 639.039,271.457 638.984,277.125 638.953,282.797 638.926,288.465 638.898,294.133 638.867,299.805 638.84,305.473 638.812,311.141 638.781,316.812 639.066,316.812 639.094,311.141 639.121,305.473 639.18,299.805 639.211,294.133 639.238,288.465 639.293,282.797 639.352,277.125 639.379,271.457 639.438,265.785 639.492,260.117 639.551,254.449 639.609,248.777 639.691,243.109 639.75,237.441 639.836,231.769 639.922,226.101 640.004,220.434 640.117,214.762 640.23,209.094 640.344,203.426 640.484,197.754 640.629,192.086 640.801,186.418 640.996,180.746 641.195,175.078 641.449,169.406 641.707,163.738 642.047,158.07 642.441,152.398 642.895,146.73 641.762,146.73 "/>
<path id="path260" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 644.031,146.73 L 643.465,152.398 642.98,158.07 642.586,163.738 642.246,169.406 641.961,175.078 641.707,180.746 641.449,186.418 641.254,192.086 641.082,197.754 640.914,203.426 640.77,209.094 640.629,214.762 640.516,220.434 640.402,226.101 640.289,231.769 640.203,237.441 640.094,243.109 640.035,248.777 639.949,254.449 639.863,260.117 639.809,265.785 639.75,271.457 639.695,277.125 639.637,282.797 639.578,288.465 639.523,294.133 639.465,299.805 639.438,305.473 639.379,311.141 639.352,316.812 639.637,316.812 639.691,311.141 639.719,305.473 639.777,299.805 639.836,294.133 639.891,288.465 639.949,282.797 640.031,277.125 640.09,271.457 640.176,265.785 640.262,260.117 640.344,254.449 640.43,248.777 640.516,243.109 640.629,237.441 640.742,231.769 640.855,226.101 640.996,220.434 641.137,214.762 641.309,209.094 641.477,203.426 641.676,197.754 641.875,192.086 642.129,186.418 642.414,180.746 642.695,175.078 643.066,169.406 643.461,163.738 643.941,158.07 644.48,152.398 645.16,146.73 644.027,146.73 "/>
<path id="path261" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 646.301,146.73 L 645.531,152.398 644.883,158.07 644.344,163.738 643.859,169.406 643.465,175.078 643.125,180.746 642.785,186.418 642.527,192.086 642.273,197.754 642.047,203.426 641.848,209.094 641.648,214.762 641.48,220.434 641.336,226.101 641.195,231.769 641.055,237.441 640.941,243.109 640.828,248.777 640.715,254.449 640.629,260.117 640.543,265.785 640.461,271.457 640.375,277.125 640.289,282.797 640.23,288.465 640.148,294.133 640.09,299.805 640.031,305.473 639.977,311.141 639.918,316.812 640.203,316.812 640.258,311.141 640.316,305.473 640.402,299.805 640.457,294.133 640.543,288.465 640.629,282.797 640.715,277.125 640.801,271.457 640.91,265.785 640.996,260.117 641.109,254.449 641.223,248.777 641.363,243.109 641.508,237.441 641.648,231.769 641.82,226.101 641.988,220.434 642.188,214.762 642.387,209.094 642.613,203.426 642.867,197.754 643.152,192.086 643.465,186.418 643.832,180.746 644.227,175.078 644.68,169.406 645.219,163.738 645.816,158.07 646.551,152.398 647.43,146.73 646.297,146.73 "/>
<path id="path262" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 765.355,360.461 L 765.355,371.801 M 754.016,358.848 L 754.016,375.855 M 742.676,357.715 L 742.676,369.051 M 731.34,356.863 L 731.34,373.871 M 719.996,356.184 L 719.996,367.519 M 708.66,355.644 L 708.66,372.652 M 697.32,355.219 L 697.32,366.558 M 685.98,354.851 L 685.98,371.859 M 674.645,354.539 L 674.645,365.879 M 663.309,354.254 L 663.309,371.262 M 651.969,354.027 L 651.969,365.367 M 640.629,353.828 L 640.629,370.836 M 629.293,353.66 L 629.293,365 M 617.949,353.488 L 617.949,370.496 "/>
<path id="path263" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,335.519 L 759.684,336.398 754.016,337.133 748.348,337.73 742.676,338.266 737.008,338.723 731.34,339.144 725.668,339.488 719.996,339.797 714.328,340.082 708.66,340.336 702.988,340.562 697.32,340.762 691.652,340.961 685.98,341.129 680.312,341.301 674.645,341.441 668.973,341.586 663.305,341.726 657.637,341.84 651.965,341.949 646.297,342.035 640.629,342.148 634.957,342.234 629.289,342.32 623.621,342.402 617.949,342.488 612.281,342.547 606.613,342.633 600.941,342.687 595.273,342.746 595.273,343.027 600.941,342.973 606.613,342.914 612.281,342.859 617.949,342.801 623.621,342.715 629.289,342.66 634.957,342.574 640.629,342.488 646.297,342.402 651.965,342.316 657.637,342.234 663.305,342.121 668.973,342.008 674.645,341.894 680.312,341.754 685.98,341.609 691.652,341.469 697.32,341.297 702.988,341.101 708.66,340.902 714.328,340.676 719.996,340.418 725.668,340.164 731.34,339.851 737.008,339.484 742.676,339.086 748.348,338.605 754.016,338.066 759.684,337.414 765.355,336.648 765.355,335.516 "/>
<path id="path264" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,337.785 L 759.684,338.465 754.016,339.004 748.348,339.484 742.676,339.883 737.008,340.25 731.34,340.562 725.668,340.816 719.996,341.07 714.328,341.269 708.66,341.469 702.988,341.641 697.32,341.808 691.652,341.949 685.98,342.094 680.312,342.207 674.645,342.316 668.973,342.43 663.305,342.516 657.637,342.601 651.965,342.687 646.297,342.773 640.629,342.855 634.957,342.914 629.289,343 623.621,343.055 617.949,343.113 612.281,343.172 606.613,343.226 600.941,343.258 595.273,343.312 595.273,343.598 600.941,343.566 606.613,343.512 612.281,343.48 617.949,343.426 623.621,343.367 629.289,343.312 634.957,343.254 640.629,343.195 646.297,343.141 651.965,343.082 657.637,343 663.305,342.914 668.973,342.855 674.645,342.742 680.312,342.656 685.98,342.543 691.652,342.43 697.32,342.316 702.988,342.176 708.66,342.035 714.328,341.863 719.996,341.695 725.668,341.496 731.34,341.269 737.008,340.984 742.676,340.703 748.348,340.363 754.016,339.965 759.684,339.484 765.355,338.918 765.355,337.781 "/>
<path id="path265" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,340.055 L 759.684,340.508 754.016,340.902 748.348,341.242 742.676,341.5 737.008,341.754 731.34,341.98 725.668,342.152 719.996,342.32 714.328,342.461 708.66,342.605 702.988,342.719 697.32,342.832 691.652,342.945 685.98,343.027 680.312,343.113 674.645,343.199 668.973,343.258 663.305,343.34 657.637,343.398 651.965,343.457 646.297,343.512 640.629,343.57 634.957,343.598 629.289,343.656 623.621,343.711 617.949,343.742 612.281,343.769 606.613,343.824 600.941,343.855 595.273,343.883 595.273,344.168 600.941,344.137 606.613,344.109 612.281,344.082 617.949,344.051 623.621,344.023 629.289,343.996 634.957,343.969 640.629,343.91 646.297,343.883 651.965,343.824 657.637,343.797 663.305,343.738 668.973,343.684 674.645,343.625 680.312,343.566 685.98,343.512 691.652,343.426 697.32,343.34 702.988,343.254 708.66,343.172 714.328,343.058 719.996,342.945 725.668,342.832 731.34,342.691 737.008,342.519 742.676,342.32 748.348,342.094 754.016,341.84 759.684,341.555 765.355,341.187 765.355,340.055 "/>
<path id="path266" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,342.32 L 759.684,342.574 754.016,342.805 748.348,342.973 742.676,343.144 737.008,343.258 731.34,343.398 725.668,343.484 719.996,343.566 714.328,343.652 708.66,343.738 702.988,343.797 697.32,343.883 691.652,343.937 685.98,343.969 680.312,344.023 674.645,344.082 668.973,344.109 663.305,344.137 657.637,344.195 651.965,344.223 646.297,344.254 640.629,344.281 634.957,344.308 629.289,344.336 623.621,344.336 617.949,344.367 612.281,344.394 606.613,344.422 600.941,344.422 595.273,344.449 595.273,344.734 600.941,344.734 606.613,344.707 612.281,344.707 617.949,344.676 623.621,344.676 629.289,344.648 634.957,344.648 640.629,344.621 646.297,344.621 651.965,344.594 657.637,344.562 663.305,344.562 668.973,344.535 674.645,344.508 680.312,344.476 685.98,344.449 691.652,344.422 697.32,344.391 702.988,344.336 708.66,344.308 714.328,344.25 719.996,344.223 725.668,344.164 731.34,344.105 737.008,344.023 742.676,343.937 748.348,343.851 754.016,343.738 759.684,343.598 765.355,343.453 765.355,342.32 "/>
<path id="path267" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,344.59 L 759.684,344.644 754.016,344.676 748.348,344.73 742.676,344.762 737.008,344.789 731.34,344.816 725.668,344.816 719.996,344.848 714.328,344.848 708.66,344.875 702.988,344.875 697.32,344.902 691.652,344.902 685.98,344.93 674.645,344.93 668.973,344.961 651.965,344.961 646.297,344.988 617.949,344.988 612.281,345.016 595.273,345.016 595.273,345.301 612.281,345.301 617.949,345.328 646.297,345.328 651.965,345.355 668.973,345.355 674.645,345.387 685.98,345.387 691.652,345.414 697.32,345.414 702.988,345.441 708.66,345.441 714.328,345.473 719.996,345.473 725.668,345.5 731.34,345.527 737.008,345.527 742.676,345.555 748.348,345.586 754.016,345.641 759.684,345.672 765.355,345.726 765.355,344.594 "/>
<path id="path268" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,346.855 L 759.684,346.715 754.016,346.574 748.348,346.461 742.676,346.375 737.008,346.289 731.34,346.234 725.668,346.148 719.996,346.09 714.328,346.062 708.66,346.008 702.988,345.976 697.32,345.922 691.652,345.891 685.98,345.863 680.312,345.836 674.645,345.805 668.973,345.777 663.305,345.75 657.637,345.75 651.965,345.719 646.297,345.691 640.629,345.691 634.957,345.664 629.289,345.664 623.621,345.637 617.949,345.637 612.281,345.605 606.613,345.605 600.941,345.578 595.273,345.578 595.273,345.863 600.941,345.891 606.613,345.891 612.281,345.918 617.949,345.949 623.621,345.976 629.289,345.976 634.957,346.004 640.629,346.031 646.297,346.062 651.965,346.09 657.637,346.117 663.305,346.176 668.973,346.203 674.645,346.234 680.312,346.289 685.98,346.348 691.652,346.375 697.32,346.434 702.988,346.516 708.66,346.574 714.328,346.66 719.996,346.742 725.668,346.832 731.34,346.941 737.008,347.055 742.676,347.168 748.348,347.34 754.016,347.508 759.684,347.734 765.355,347.992 765.355,346.855 "/>
<path id="path269" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,349.125 L 759.684,348.758 754.016,348.473 748.348,348.219 742.676,347.992 737.008,347.793 731.34,347.648 725.668,347.48 719.996,347.367 714.328,347.254 708.66,347.141 702.988,347.055 697.32,346.973 691.652,346.887 685.98,346.801 680.312,346.742 674.645,346.687 668.973,346.629 663.305,346.57 657.637,346.516 651.965,346.484 646.297,346.43 640.629,346.402 634.957,346.344 629.289,346.316 623.621,346.285 617.949,346.258 612.281,346.23 606.613,346.199 600.941,346.172 595.273,346.144 595.273,346.426 600.941,346.457 606.613,346.484 612.281,346.543 617.949,346.57 623.621,346.598 629.289,346.656 634.957,346.711 640.629,346.742 646.297,346.797 651.965,346.855 657.637,346.91 663.305,346.969 668.973,347.055 674.645,347.109 680.312,347.195 685.98,347.281 691.652,347.367 697.32,347.48 702.988,347.594 708.66,347.707 714.328,347.848 719.996,347.988 725.668,348.16 731.34,348.359 737.008,348.555 742.676,348.812 748.348,349.066 754.016,349.406 759.684,349.805 765.355,350.258 765.355,349.125 "/>
<path id="path270" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,351.391 L 759.684,350.824 754.016,350.344 748.348,349.945 742.676,349.605 737.008,349.324 731.34,349.066 725.668,348.812 719.996,348.613 714.328,348.445 708.66,348.273 702.988,348.133 697.32,347.992 691.652,347.879 685.98,347.766 680.312,347.652 674.645,347.566 668.973,347.453 663.305,347.394 657.637,347.312 651.965,347.226 646.297,347.168 640.629,347.113 634.957,347.055 629.289,347 623.621,346.941 617.949,346.883 612.281,346.828 606.613,346.797 600.941,346.742 595.273,346.711 595.273,346.996 600.941,347.055 606.613,347.082 612.281,347.137 617.949,347.195 623.621,347.254 629.289,347.308 634.957,347.394 640.629,347.449 646.297,347.535 651.965,347.621 657.637,347.707 663.305,347.793 668.973,347.879 674.645,347.988 680.312,348.101 685.98,348.215 691.652,348.355 697.32,348.5 702.988,348.668 708.66,348.84 714.328,349.039 719.996,349.234 725.668,349.492 731.34,349.773 737.008,350.058 742.676,350.426 748.348,350.82 754.016,351.305 759.684,351.844 765.355,352.523 765.355,351.391 "/>
<path id="path271" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 765.355,353.66 L 759.684,352.894 754.016,352.242 748.348,351.703 742.676,351.223 737.008,350.824 731.34,350.484 725.668,350.144 719.996,349.891 714.328,349.633 708.66,349.406 702.988,349.211 697.32,349.012 691.652,348.84 685.98,348.699 680.312,348.558 674.645,348.414 668.973,348.301 663.305,348.187 657.637,348.074 651.965,347.992 646.297,347.906 640.629,347.82 634.957,347.734 629.289,347.648 623.621,347.594 617.949,347.508 612.281,347.449 606.613,347.394 600.941,347.336 595.273,347.281 595.273,347.562 600.941,347.621 606.613,347.676 612.281,347.762 617.949,347.82 623.621,347.902 629.289,347.988 634.957,348.074 640.629,348.16 646.297,348.273 651.965,348.359 657.637,348.473 663.305,348.586 668.973,348.726 674.645,348.867 680.312,349.012 685.98,349.18 691.652,349.351 697.32,349.547 702.988,349.746 708.66,349.973 714.328,350.23 719.996,350.512 725.668,350.824 731.34,351.191 737.008,351.59 742.676,352.043 748.348,352.582 754.016,353.176 759.684,353.91 765.355,354.793 765.355,353.656 "/>
<path id="path272" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 144.562,277.125 L 153.066,277.125 M 144.562,260.117 L 153.066,260.117 M 144.562,243.109 L 153.066,243.109 "/>
<path id="path273" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 160.438,294.133 L 161.316,285.629 162.055,277.125 162.648,268.621 163.188,260.117 163.641,251.613 164.066,243.109 164.406,234.605 164.719,226.101 165.004,217.598 165.258,209.094 165.824,209.094 165.598,217.598 165.344,226.101 165.086,234.605 164.777,243.109 164.406,251.613 164.012,260.117 163.527,268.621 162.992,277.125 162.34,285.629 161.574,294.133 160.438,294.133 "/>
<path id="path274" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 162.703,294.133 L 163.387,285.629 163.926,277.125 164.406,268.621 164.805,260.117 165.172,251.613 165.484,243.109 165.738,234.605 165.996,226.101 166.191,217.598 166.391,209.094 166.957,209.094 166.785,217.598 166.617,226.101 166.418,234.605 166.191,243.109 165.906,251.613 165.625,260.117 165.285,268.621 164.891,277.125 164.406,285.629 163.84,294.133 162.707,294.133 "/>
<path id="path275" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 164.973,294.133 L 165.426,285.629 165.824,277.125 166.164,268.621 166.418,260.117 166.672,251.613 166.898,243.109 167.07,234.605 167.242,226.101 167.383,217.598 167.527,209.094 168.094,209.094 167.98,217.598 167.867,226.101 167.754,234.605 167.609,243.109 167.441,251.613 167.242,260.117 167.016,268.621 166.762,277.125 166.477,285.629 166.109,294.133 164.973,294.133 "/>
<path id="path276" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 167.242,294.133 L 167.496,285.629 167.723,277.125 167.895,268.621 168.062,260.117 168.176,251.613 168.32,243.109 168.402,234.605 168.488,226.101 168.574,217.598 168.66,209.094 169.227,209.094 169.168,217.598 169.141,226.101 169.086,234.605 169.027,243.109 168.941,251.613 168.855,260.117 168.77,268.621 168.656,277.125 168.516,285.629 168.375,294.133 M 169.508,294.133 L 169.566,285.629 169.594,277.125 169.652,268.621 169.68,260.117 169.707,251.613 169.734,243.109 169.734,234.605 169.762,226.101 169.762,217.598 169.793,209.094 170.359,209.094 170.387,217.598 170.387,226.101 170.414,234.605 170.441,243.109 170.441,251.613 170.473,260.117 170.5,268.621 170.559,277.125 170.586,285.629 170.645,294.133 169.508,294.133 "/>
<path id="path277" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 171.777,294.133 L 171.633,285.629 171.492,277.125 171.379,268.621 171.293,260.117 171.207,251.613 171.152,243.109 171.066,234.605 171.012,226.101 170.98,217.598 170.926,209.094 171.492,209.094 171.574,217.598 171.66,226.101 171.746,234.605 171.859,243.109 171.973,251.613 172.086,260.117 172.254,268.621 172.426,277.125 172.652,285.629 172.906,294.133 171.773,294.133 "/>
<path id="path278" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 174.047,294.133 L 173.676,285.629 173.395,277.125 173.137,268.621 172.91,260.117 172.711,251.613 172.57,243.109 172.402,234.605 172.289,226.101 172.176,217.598 172.062,209.094 172.629,209.094 172.77,217.598 172.91,226.101 173.082,234.605 173.281,243.109 173.477,251.613 173.734,260.117 173.988,268.621 174.328,277.125 174.727,285.629 175.18,294.133 174.047,294.133 "/>
<path id="path279" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 176.312,294.133 L 175.742,285.629 175.262,277.125 174.863,268.621 174.523,260.117 174.242,251.613 173.988,243.109 173.73,234.605 173.531,226.101 173.363,217.598 173.191,209.094 173.758,209.094 173.957,217.598 174.156,226.101 174.41,234.605 174.695,243.109 174.977,251.613 175.344,260.117 175.742,268.621 176.223,277.125 176.762,285.629 177.441,294.133 176.309,294.133 "/>
<path id="path280" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 178.578,294.133 L 177.812,285.629 177.16,277.125 176.625,268.621 176.145,260.117 175.746,251.613 175.402,243.109 175.062,234.605 174.809,226.101 174.555,217.598 174.328,209.094 174.895,209.094 175.148,217.598 175.434,226.101 175.742,234.605 176.109,243.109 176.508,251.613 176.961,260.117 177.5,268.621 178.094,277.125 178.832,285.629 179.711,294.133 178.578,294.133 "/>
<path id="path281" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 243.777,228.93 L 243.777,220.426 M 226.77,228.93 L 226.77,220.426 M 209.766,228.93 L 209.766,220.426 "/>
<path id="path282" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,213.055 L 252.281,212.176 243.777,211.441 235.273,210.844 226.77,210.305 218.266,209.851 209.762,209.426 201.258,209.086 192.754,208.773 184.25,208.492 175.746,208.234 175.746,207.668 184.25,207.894 192.754,208.152 201.258,208.406 209.762,208.719 218.266,209.086 226.77,209.48 235.273,209.965 243.777,210.504 252.281,211.152 260.785,211.918 260.785,213.055 "/>
<path id="path283" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,210.789 L 252.281,210.105 243.777,209.57 235.273,209.086 226.77,208.691 218.266,208.32 209.762,208.008 201.258,207.754 192.754,207.5 184.25,207.301 175.746,207.101 175.746,206.535 184.25,206.707 192.754,206.879 201.258,207.074 209.762,207.301 218.266,207.586 226.77,207.867 235.273,208.211 243.777,208.605 252.281,209.086 260.785,209.652 260.785,210.789 "/>
<path id="path284" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,208.519 L 252.281,208.066 243.777,207.672 235.273,207.332 226.77,207.074 218.266,206.82 209.762,206.594 201.258,206.422 192.754,206.254 184.25,206.109 175.746,205.969 175.746,205.402 184.25,205.516 192.754,205.629 201.258,205.738 209.762,205.883 218.266,206.055 226.77,206.25 235.273,206.476 243.777,206.734 252.281,207.016 260.785,207.387 260.785,208.519 "/>
<path id="path285" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,206.254 L 252.281,206 243.777,205.769 235.273,205.601 226.77,205.43 218.266,205.316 209.762,205.176 201.258,205.09 192.754,205.004 184.25,204.918 175.746,204.836 175.746,204.269 184.25,204.324 192.754,204.351 201.258,204.41 209.762,204.469 218.266,204.555 226.77,204.637 235.273,204.723 243.777,204.836 252.281,204.976 260.785,205.117 M 260.785,203.984 L 252.281,203.93 243.777,203.898 235.273,203.844 226.77,203.812 218.266,203.785 209.762,203.758 201.258,203.758 192.754,203.73 184.25,203.73 175.746,203.699 175.746,203.137 184.25,203.105 192.754,203.105 201.258,203.078 209.762,203.051 218.266,203.051 226.77,203.019 235.273,202.992 243.777,202.937 252.281,202.906 260.785,202.851 260.785,203.984 "/>
<path id="path286" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,201.715 L 252.281,201.859 243.777,202 235.273,202.113 226.77,202.199 218.266,202.285 209.762,202.344 201.258,202.426 192.754,202.484 184.25,202.512 175.746,202.57 175.746,202.004 184.25,201.918 192.754,201.832 201.258,201.746 209.762,201.633 218.266,201.519 226.77,201.406 235.273,201.238 243.777,201.066 252.281,200.84 260.785,200.586 260.785,201.719 "/>
<path id="path287" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,199.449 L 252.281,199.816 243.777,200.101 235.273,200.355 226.77,200.586 218.266,200.781 209.762,200.922 201.258,201.094 192.754,201.207 184.25,201.32 175.746,201.434 175.746,200.867 184.25,200.726 192.754,200.582 201.258,200.414 209.762,200.215 218.266,200.016 226.77,199.762 235.273,199.504 243.777,199.164 252.281,198.769 260.785,198.316 260.785,199.449 "/>
<path id="path288" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,197.18 L 252.281,197.75 243.777,198.23 235.273,198.629 226.77,198.969 218.266,199.254 209.762,199.508 201.258,199.762 192.754,199.961 184.25,200.129 175.746,200.301 175.746,199.734 184.25,199.535 192.754,199.336 201.258,199.082 209.762,198.801 218.266,198.516 226.77,198.148 235.273,197.75 243.777,197.269 252.281,196.73 260.785,196.051 260.785,197.184 "/>
<path id="path289" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,194.914 L 252.281,195.68 243.777,196.332 235.273,196.871 226.77,197.351 218.266,197.75 209.762,198.09 201.258,198.43 192.754,198.684 184.25,198.941 175.746,199.168 175.746,198.601 184.25,198.344 192.754,198.062 201.258,197.75 209.762,197.383 218.266,196.988 226.77,196.531 235.273,195.996 243.777,195.398 252.281,194.66 260.785,193.781 260.785,194.918 "/>
<path id="path290" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 243.777,469.883 L 243.777,461.379 M 226.77,469.883 L 226.77,461.379 M 209.766,469.883 L 209.766,461.379 "/>
<path id="path291" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,477.254 L 252.281,478.133 243.777,478.867 235.273,479.465 226.77,480.004 218.266,480.457 209.762,480.883 201.258,481.223 192.754,481.535 184.25,481.816 175.746,482.07 175.746,482.641 184.25,482.414 192.754,482.156 201.258,481.902 209.762,481.59 218.266,481.223 226.77,480.824 235.273,480.344 243.777,479.805 252.281,479.156 260.785,478.391 260.785,477.254 "/>
<path id="path292" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,479.519 L 252.281,480.203 243.777,480.742 235.273,481.223 226.77,481.617 218.266,481.988 209.762,482.301 201.258,482.555 192.754,482.808 184.25,483.008 175.746,483.207 175.746,483.773 184.25,483.601 192.754,483.434 201.258,483.234 209.762,483.008 218.266,482.723 226.77,482.441 235.273,482.101 243.777,481.703 252.281,481.223 260.785,480.656 260.785,479.519 "/>
<path id="path293" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,481.789 L 252.281,482.242 243.777,482.641 235.273,482.98 226.77,483.234 218.266,483.488 209.762,483.715 201.258,483.887 192.754,484.058 184.25,484.199 175.746,484.344 175.746,484.906 184.25,484.797 192.754,484.684 201.258,484.57 209.762,484.426 218.266,484.258 226.77,484.058 235.273,483.832 243.777,483.574 252.281,483.293 260.785,482.926 260.785,481.789 "/>
<path id="path294" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,485.191 L 252.281,485.332 243.777,485.473 235.273,485.586 226.77,485.672 218.266,485.758 209.762,485.844 201.258,485.898 192.754,485.957 184.25,485.984 175.746,486.043 175.746,485.476 184.25,485.391 192.754,485.305 201.258,485.219 209.762,485.137 218.266,484.992 226.77,484.879 235.273,484.711 243.777,484.539 252.281,484.312 260.785,484.058 M 260.785,487.457 L 252.281,487.402 243.777,487.371 235.273,487.316 226.77,487.285 218.266,487.258 209.762,487.258 201.258,487.23 192.754,487.199 184.25,487.199 175.746,487.172 175.746,486.605 184.25,486.578 192.754,486.578 201.258,486.551 209.762,486.551 218.266,486.523 226.77,486.496 235.273,486.465 243.777,486.41 252.281,486.379 260.785,486.324 260.785,487.457 "/>
<path id="path295" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,488.594 L 252.281,488.449 243.777,488.308 235.273,488.195 226.77,488.109 218.266,488.023 209.762,487.969 201.258,487.883 192.754,487.824 184.25,487.797 175.746,487.738 175.746,488.308 184.25,488.391 192.754,488.476 201.258,488.562 209.762,488.676 218.266,488.789 226.77,488.902 235.273,489.07 243.777,489.242 252.281,489.469 260.785,489.723 260.785,488.59 "/>
<path id="path296" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,490.859 L 252.281,490.492 243.777,490.207 235.273,489.953 226.77,489.726 218.266,489.527 209.762,489.387 201.258,489.215 192.754,489.101 184.25,488.988 175.746,488.879 175.746,489.441 184.25,489.586 192.754,489.726 201.258,489.894 209.762,490.094 218.266,490.293 226.77,490.547 235.273,490.805 243.777,491.144 252.281,491.539 260.785,491.992 260.785,490.859 "/>
<path id="path297" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,493.129 L 252.281,492.558 243.777,492.078 235.273,491.68 226.77,491.34 218.266,491.058 209.762,490.805 201.258,490.547 192.754,490.348 184.25,490.18 175.746,490.008 175.746,490.574 184.25,490.773 192.754,490.973 201.258,491.226 209.762,491.512 218.266,491.793 226.77,492.16 235.273,492.558 243.777,493.039 252.281,493.582 260.785,494.262 260.785,493.125 "/>
<path id="path298" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 260.785,495.394 L 252.281,494.629 243.777,493.976 235.273,493.437 226.77,492.957 218.266,492.558 209.762,492.219 201.258,491.879 192.754,491.625 184.25,491.367 175.746,491.141 175.746,491.707 184.25,491.965 192.754,492.246 201.258,492.558 209.762,492.926 218.266,493.324 226.77,493.777 235.273,494.316 243.777,494.91 252.281,495.648 260.785,496.527 260.785,495.394 "/>
<path id="path299" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 153.066,413.187 L 144.562,413.187 M 153.066,430.195 L 144.562,430.195 M 153.066,447.203 L 144.562,447.203 "/>
<path id="path300" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 160.434,396.18 L 161.312,404.684 162.051,413.187 162.645,421.691 163.184,430.195 163.637,438.699 164.062,447.203 164.402,455.707 164.719,464.211 165,472.715 165.254,481.219 165.824,481.219 165.598,472.715 165.34,464.211 165.086,455.707 164.773,447.203 164.406,438.699 164.008,430.195 163.527,421.691 162.988,413.187 162.34,404.684 161.57,396.18 160.438,396.18 "/>
<path id="path301" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 162.703,396.18 L 163.383,404.684 163.922,413.187 164.402,421.691 164.801,430.195 165.168,438.699 165.48,447.203 165.734,455.707 165.992,464.211 166.191,472.715 166.387,481.219 166.953,481.219 166.785,472.715 166.613,464.211 166.414,455.707 166.188,447.203 165.906,438.699 165.621,430.195 165.281,421.691 164.887,413.187 164.402,404.684 163.84,396.18 162.703,396.18 "/>
<path id="path302" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 164.973,396.18 L 165.426,404.684 165.82,413.187 166.16,421.691 166.414,430.195 166.672,438.699 166.898,447.203 167.07,455.707 167.238,464.211 167.383,472.715 167.523,481.219 168.09,481.219 167.977,472.715 167.863,464.211 167.75,455.707 167.609,447.203 167.438,438.699 167.238,430.195 167.012,421.691 166.758,413.187 166.477,404.684 166.105,396.18 164.973,396.18 "/>
<path id="path303" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 168.371,396.18 L 168.512,404.684 168.656,413.187 168.77,421.691 168.855,430.195 168.938,438.699 169.023,447.203 169.082,455.707 169.137,464.211 169.164,472.715 169.223,481.219 168.656,481.219 168.57,472.715 168.484,464.211 168.402,455.707 168.316,447.203 168.176,438.699 168.059,430.195 167.891,421.691 167.719,413.187 167.492,404.684 167.238,396.18 M 170.641,396.18 L 170.582,404.684 170.555,413.187 170.496,421.691 170.469,430.195 170.441,438.699 170.441,447.203 170.41,455.707 170.383,464.211 170.383,472.715 170.355,481.219 169.789,481.219 169.762,472.715 169.762,464.211 169.734,455.707 169.734,447.203 169.703,438.699 169.676,430.195 169.648,421.691 169.59,413.187 169.562,404.684 169.504,396.18 170.641,396.18 "/>
<path id="path304" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 171.773,396.18 L 171.633,404.684 171.488,413.187 171.379,421.691 171.293,430.195 171.207,438.699 171.148,447.203 171.066,455.707 171.008,464.211 170.98,472.715 170.922,481.219 171.488,481.219 171.574,472.715 171.66,464.211 171.742,455.707 171.855,447.203 171.969,438.699 172.082,430.195 172.254,421.691 172.426,413.187 172.652,404.684 172.906,396.18 171.773,396.18 "/>
<path id="path305" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 174.043,396.18 L 173.672,404.684 173.391,413.187 173.133,421.691 172.906,430.195 172.711,438.699 172.566,447.203 172.398,455.707 172.285,464.211 172.172,472.715 172.059,481.219 172.625,481.219 172.766,472.715 172.906,464.211 173.078,455.707 173.277,447.203 173.477,438.699 173.73,430.195 173.984,421.691 174.324,413.187 174.723,404.684 175.176,396.18 174.043,396.18 "/>
<path id="path306" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 176.309,396.18 L 175.742,404.684 175.262,413.187 174.863,421.691 174.523,430.195 174.238,438.699 173.984,447.203 173.73,455.707 173.531,464.211 173.359,472.715 173.191,481.219 173.758,481.219 173.953,472.715 174.152,464.211 174.406,455.707 174.691,447.203 174.977,438.699 175.344,430.195 175.738,421.691 176.223,413.187 176.762,404.684 177.441,396.18 176.309,396.18 "/>
<path id="path307" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 178.578,396.18 L 177.812,404.684 177.16,413.187 176.621,421.691 176.141,430.195 175.742,438.699 175.402,447.203 175.062,455.707 174.805,464.211 174.551,472.715 174.324,481.219 174.891,481.219 175.145,472.715 175.43,464.211 175.738,455.707 176.109,447.203 176.504,438.699 176.957,430.195 177.496,421.691 178.094,413.187 178.828,404.684 179.707,396.18 178.574,396.18 "/>
<path id="path308" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 890.078,461.379 L 890.078,469.883 M 907.086,461.379 L 907.086,469.883 M 924.094,461.379 L 924.094,469.883 "/>
<path id="path309" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,477.254 L 881.574,478.133 890.078,478.867 898.582,479.465 907.086,480.004 915.59,480.457 924.094,480.883 932.598,481.223 941.102,481.535 949.605,481.816 958.109,482.07 958.109,482.641 949.605,482.414 941.102,482.156 932.598,481.902 924.094,481.59 915.59,481.223 907.086,480.824 898.582,480.344 890.078,479.805 881.574,479.156 873.07,478.391 873.07,477.254 "/>
<path id="path310" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,479.519 L 881.574,480.203 890.078,480.742 898.582,481.223 907.086,481.617 915.59,481.988 924.094,482.301 932.598,482.555 941.102,482.808 949.605,483.008 958.109,483.207 958.109,483.773 949.605,483.601 941.102,483.434 932.598,483.234 924.094,483.008 915.59,482.723 907.086,482.441 898.582,482.101 890.078,481.703 881.574,481.223 873.07,480.656 873.07,479.519 "/>
<path id="path311" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,481.789 L 881.574,482.242 890.078,482.641 898.582,482.98 907.086,483.234 915.59,483.488 924.094,483.715 932.598,483.887 941.102,484.058 949.605,484.199 958.109,484.344 958.109,484.906 949.605,484.797 941.102,484.684 932.598,484.57 924.094,484.426 915.59,484.258 907.086,484.058 898.582,483.832 890.078,483.574 881.574,483.293 873.07,482.926 873.07,481.789 "/>
<path id="path312" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,484.058 L 881.574,484.312 890.078,484.539 898.582,484.711 907.086,484.879 915.59,484.992 924.094,485.137 932.598,485.219 941.102,485.305 949.605,485.391 958.109,485.476 958.109,486.043 949.605,485.984 941.102,485.957 932.598,485.898 924.094,485.844 915.59,485.758 907.086,485.672 898.582,485.586 890.078,485.473 881.574,485.332 873.07,485.191 M 873.07,486.324 L 881.574,486.383 890.078,486.41 898.582,486.469 907.086,486.496 915.59,486.523 924.094,486.551 932.598,486.551 941.102,486.578 949.605,486.578 958.109,486.609 958.109,487.176 949.605,487.203 941.102,487.203 932.598,487.23 924.094,487.258 915.59,487.258 907.086,487.289 898.582,487.316 890.078,487.375 881.574,487.402 873.07,487.461 873.07,486.324 "/>
<path id="path313" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,488.594 L 881.574,488.449 890.078,488.308 898.582,488.195 907.086,488.109 915.59,488.023 924.094,487.969 932.598,487.883 941.102,487.824 949.605,487.797 958.109,487.738 958.109,488.308 949.605,488.391 941.102,488.476 932.598,488.562 924.094,488.676 915.59,488.789 907.086,488.902 898.582,489.07 890.078,489.242 881.574,489.469 873.07,489.723 873.07,488.59 "/>
<path id="path314" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,490.859 L 881.574,490.492 890.078,490.207 898.582,489.953 907.086,489.726 915.59,489.527 924.094,489.387 932.598,489.215 941.102,489.101 949.605,488.988 958.109,488.879 958.109,489.441 949.605,489.586 941.102,489.726 932.598,489.894 924.094,490.094 915.59,490.293 907.086,490.547 898.582,490.805 890.078,491.144 881.574,491.539 873.07,491.992 873.07,490.859 "/>
<path id="path315" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,493.129 L 881.574,492.558 890.078,492.078 898.582,491.68 907.086,491.34 915.59,491.058 924.094,490.805 932.598,490.547 941.102,490.348 949.605,490.18 958.109,490.008 958.109,490.574 949.605,490.773 941.102,490.973 932.598,491.226 924.094,491.512 915.59,491.793 907.086,492.16 898.582,492.558 890.078,493.039 881.574,493.582 873.07,494.262 873.07,493.125 "/>
<path id="path316" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,495.394 L 881.574,494.629 890.078,493.976 898.582,493.437 907.086,492.957 915.59,492.558 924.094,492.219 932.598,491.879 941.102,491.625 949.605,491.367 958.109,491.141 958.109,491.707 949.605,491.965 941.102,492.246 932.598,492.558 924.094,492.926 915.59,493.324 907.086,493.777 898.582,494.316 890.078,494.91 881.574,495.648 873.07,496.527 873.07,495.394 "/>
<path id="path317" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 980.785,277.125 L 989.289,277.125 M 980.785,260.117 L 989.289,260.117 M 980.785,243.109 L 989.289,243.109 "/>
<path id="path318" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 973.418,294.133 L 972.539,285.629 971.801,277.125 971.207,268.621 970.668,260.117 970.215,251.613 969.789,243.109 969.449,234.605 969.137,226.101 968.852,217.598 968.598,209.094 968.031,209.094 968.258,217.598 968.516,226.101 968.77,234.605 969.082,243.109 969.449,251.613 969.848,260.117 970.328,268.621 970.867,277.125 971.52,285.629 972.285,294.133 973.418,294.133 "/>
<path id="path319" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 971.148,294.133 L 970.469,285.629 969.93,277.125 969.449,268.621 969.055,260.117 968.684,251.613 968.371,243.109 968.117,234.605 967.863,226.101 967.664,217.598 967.465,209.094 966.898,209.094 967.07,217.598 967.238,226.101 967.438,234.605 967.664,243.109 967.949,251.613 968.23,260.117 968.57,268.621 968.969,277.125 969.449,285.629 970.016,294.133 971.152,294.133 "/>
<path id="path320" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 968.883,294.133 L 968.426,285.629 968.031,277.125 967.691,268.621 967.438,260.117 967.18,251.613 966.953,243.109 966.781,234.605 966.613,226.101 966.473,217.598 966.328,209.094 965.762,209.094 965.875,217.598 965.988,226.101 966.102,234.605 966.246,243.109 966.414,251.613 966.613,260.117 966.84,268.621 967.094,277.125 967.379,285.629 967.746,294.133 968.883,294.133 "/>
<path id="path321" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 965.48,294.133 L 965.34,285.629 965.195,277.125 965.086,268.621 964.996,260.117 964.914,251.613 964.828,243.109 964.77,234.605 964.715,226.101 964.684,217.598 964.629,209.094 965.195,209.094 965.281,217.598 965.367,226.101 965.449,234.605 965.535,243.109 965.676,251.613 965.789,260.117 965.961,268.621 966.133,277.125 966.359,285.629 966.613,294.133 M 963.211,294.133 L 963.27,285.629 963.297,277.125 963.355,268.621 963.383,260.117 963.41,251.613 963.41,243.109 963.441,234.605 963.469,226.101 963.469,217.598 963.496,209.094 964.062,209.094 964.094,217.598 964.094,226.101 964.117,234.605 964.117,243.109 964.148,251.613 964.176,260.117 964.203,268.621 964.262,277.125 964.289,285.629 964.348,294.133 963.211,294.133 "/>
<path id="path322" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 962.078,294.133 L 962.219,285.629 962.359,277.125 962.473,268.621 962.559,260.117 962.645,251.613 962.703,243.109 962.785,234.605 962.844,226.101 962.871,217.598 962.93,209.094 962.359,209.094 962.277,217.598 962.191,226.101 962.105,234.605 961.992,243.109 961.879,251.613 961.766,260.117 961.598,268.621 961.426,277.125 961.199,285.629 960.945,294.133 962.078,294.133 "/>
<path id="path323" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 959.809,294.133 L 960.18,285.629 960.461,277.125 960.719,268.621 960.945,260.117 961.145,251.613 961.285,243.109 961.453,234.605 961.566,226.101 961.68,217.598 961.793,209.094 961.227,209.094 961.086,217.598 960.945,226.101 960.773,234.605 960.574,243.109 960.379,251.613 960.121,260.117 959.867,268.621 959.527,277.125 959.133,285.629 958.68,294.133 959.812,294.133 "/>
<path id="path324" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 957.543,294.133 L 958.109,285.629 958.59,277.125 958.988,268.621 959.328,260.117 959.613,251.613 959.867,243.109 960.121,234.605 960.32,226.101 960.488,217.598 960.66,209.094 960.094,209.094 959.895,217.598 959.695,226.101 959.441,234.605 959.156,243.109 958.875,251.613 958.508,260.117 958.109,268.621 957.629,277.125 957.09,285.629 956.41,294.133 957.543,294.133 "/>
<path id="path325" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 955.273,294.133 L 956.039,285.629 956.691,277.125 957.23,268.621 957.715,260.117 958.109,251.613 958.449,243.109 958.789,234.605 959.047,226.101 959.301,217.598 959.527,209.094 958.961,209.094 958.707,217.598 958.422,226.101 958.109,234.605 957.742,243.109 957.348,251.613 956.895,260.117 956.355,268.621 955.758,277.125 955.023,285.629 954.145,294.133 955.277,294.133 "/>
<path id="path326" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 890.078,220.426 L 890.078,228.93 M 907.086,220.426 L 907.086,228.93 M 924.094,220.426 L 924.094,228.93 "/>
<path id="path327" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,213.055 L 881.574,212.176 890.078,211.441 898.582,210.844 907.086,210.305 915.59,209.851 924.094,209.426 932.598,209.086 941.102,208.773 949.605,208.492 958.109,208.234 958.109,207.668 949.605,207.894 941.102,208.152 932.598,208.406 924.094,208.719 915.59,209.086 907.086,209.48 898.582,209.965 890.078,210.504 881.574,211.152 873.07,211.918 873.07,213.055 "/>
<path id="path328" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,210.789 L 881.574,210.105 890.078,209.57 898.582,209.086 907.086,208.691 915.59,208.32 924.094,208.008 932.598,207.754 941.102,207.5 949.605,207.301 958.109,207.101 958.109,206.535 949.605,206.707 941.102,206.879 932.598,207.074 924.094,207.301 915.59,207.586 907.086,207.867 898.582,208.211 890.078,208.605 881.574,209.086 873.07,209.652 873.07,210.789 "/>
<path id="path329" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,208.519 L 881.574,208.066 890.078,207.672 898.582,207.332 907.086,207.074 915.59,206.82 924.094,206.594 932.598,206.422 941.102,206.254 949.605,206.109 958.109,205.969 958.109,205.402 949.605,205.516 941.102,205.629 932.598,205.738 924.094,205.883 915.59,206.055 907.086,206.25 898.582,206.476 890.078,206.734 881.574,207.016 873.07,207.387 873.07,208.519 "/>
<path id="path330" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,205.117 L 881.574,204.976 890.078,204.836 898.582,204.723 907.086,204.637 915.59,204.555 924.094,204.469 932.598,204.41 941.102,204.351 949.605,204.324 958.109,204.269 958.109,204.836 949.605,204.918 941.102,205.004 932.598,205.09 924.094,205.176 915.59,205.316 907.086,205.43 898.582,205.601 890.078,205.769 881.574,206 873.07,206.254 M 873.07,202.851 L 881.574,202.906 890.078,202.937 898.582,202.992 907.086,203.023 915.59,203.051 924.094,203.051 932.598,203.078 941.102,203.109 949.605,203.109 958.109,203.137 958.109,203.703 949.605,203.73 941.102,203.73 932.598,203.758 924.094,203.758 915.59,203.785 907.086,203.812 898.582,203.844 890.078,203.898 881.574,203.93 873.07,203.984 873.07,202.851 "/>
<path id="path331" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,201.715 L 881.574,201.859 890.078,202 898.582,202.113 907.086,202.199 915.59,202.285 924.094,202.344 932.598,202.426 941.102,202.484 949.605,202.512 958.109,202.57 958.109,202.004 949.605,201.918 941.102,201.832 932.598,201.746 924.094,201.633 915.59,201.519 907.086,201.406 898.582,201.238 890.078,201.066 881.574,200.84 873.07,200.586 873.07,201.719 "/>
<path id="path332" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,199.449 L 881.574,199.816 890.078,200.101 898.582,200.355 907.086,200.586 915.59,200.781 924.094,200.922 932.598,201.094 941.102,201.207 949.605,201.32 958.109,201.434 958.109,200.867 949.605,200.726 941.102,200.582 932.598,200.414 924.094,200.215 915.59,200.016 907.086,199.762 898.582,199.504 890.078,199.164 881.574,198.769 873.07,198.316 873.07,199.449 "/>
<path id="path333" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,197.18 L 881.574,197.75 890.078,198.23 898.582,198.629 907.086,198.969 915.59,199.254 924.094,199.508 932.598,199.762 941.102,199.961 949.605,200.129 958.109,200.301 958.109,199.734 949.605,199.535 941.102,199.336 932.598,199.082 924.094,198.801 915.59,198.516 907.086,198.148 898.582,197.75 890.078,197.269 881.574,196.73 873.07,196.051 873.07,197.184 "/>
<path id="path334" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 873.07,194.914 L 881.574,195.68 890.078,196.332 898.582,196.871 907.086,197.351 915.59,197.75 924.094,198.09 932.598,198.43 941.102,198.684 949.605,198.941 958.109,199.168 958.109,198.601 949.605,198.344 941.102,198.062 932.598,197.75 924.094,197.383 915.59,196.988 907.086,196.531 898.582,195.996 890.078,195.398 881.574,194.66 873.07,193.781 873.07,194.918 "/>
<path id="path335" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 989.289,413.187 L 980.785,413.187 M 989.289,430.195 L 980.785,430.195 M 989.289,447.203 L 980.785,447.203 "/>
<path id="path336" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 973.418,396.18 L 972.539,404.684 971.801,413.187 971.207,421.691 970.668,430.195 970.215,438.699 969.789,447.203 969.449,455.707 969.137,464.211 968.852,472.715 968.598,481.219 968.031,481.219 968.258,472.715 968.516,464.211 968.77,455.707 969.082,447.203 969.449,438.699 969.848,430.195 970.328,421.691 970.867,413.187 971.52,404.684 972.285,396.18 973.418,396.18 "/>
<path id="path337" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 971.148,396.18 L 970.469,404.684 969.93,413.187 969.449,421.691 969.055,430.195 968.684,438.699 968.371,447.203 968.117,455.707 967.863,464.211 967.664,472.715 967.465,481.219 966.898,481.219 967.07,472.715 967.238,464.211 967.438,455.707 967.664,447.203 967.949,438.699 968.23,430.195 968.57,421.691 968.969,413.187 969.449,404.684 970.016,396.18 971.152,396.18 "/>
<path id="path338" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 968.883,396.18 L 968.426,404.684 968.031,413.187 967.691,421.691 967.438,430.195 967.18,438.699 966.953,447.203 966.781,455.707 966.613,464.211 966.473,472.715 966.328,481.219 965.762,481.219 965.875,472.715 965.988,464.211 966.102,455.707 966.246,447.203 966.414,438.699 966.613,430.195 966.84,421.691 967.094,413.187 967.379,404.684 967.746,396.18 968.883,396.18 "/>
<path id="path339" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 966.613,396.18 L 966.359,404.684 966.133,413.187 965.961,421.691 965.789,430.195 965.676,438.699 965.535,447.203 965.449,455.707 965.367,464.211 965.281,472.715 965.195,481.219 964.629,481.219 964.684,472.715 964.715,464.211 964.77,455.707 964.828,447.203 964.914,438.699 964.996,430.195 965.086,421.691 965.195,413.187 965.34,404.684 965.48,396.18 M 964.348,396.18 L 964.289,404.684 964.262,413.187 964.203,421.691 964.176,430.195 964.148,438.699 964.117,447.203 964.117,455.707 964.094,464.211 964.094,472.715 964.062,481.219 963.496,481.219 963.469,472.715 963.469,464.211 963.441,455.707 963.41,447.203 963.41,438.699 963.383,430.195 963.355,421.691 963.297,413.187 963.27,404.684 963.211,396.18 964.348,396.18 "/>
<path id="path340" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 962.078,396.18 L 962.219,404.684 962.359,413.187 962.473,421.691 962.559,430.195 962.645,438.699 962.703,447.203 962.785,455.707 962.844,464.211 962.871,472.715 962.93,481.219 962.359,481.219 962.277,472.715 962.191,464.211 962.105,455.707 961.992,447.203 961.879,438.699 961.766,430.195 961.598,421.691 961.426,413.187 961.199,404.684 960.945,396.18 962.078,396.18 "/>
<path id="path341" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 959.809,396.18 L 960.18,404.684 960.461,413.187 960.719,421.691 960.945,430.195 961.145,438.699 961.285,447.203 961.453,455.707 961.566,464.211 961.68,472.715 961.793,481.219 961.227,481.219 961.086,472.715 960.945,464.211 960.773,455.707 960.574,447.203 960.379,438.699 960.121,430.195 959.867,421.691 959.527,413.187 959.133,404.684 958.68,396.18 959.812,396.18 "/>
<path id="path342" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 957.543,396.18 L 958.109,404.684 958.59,413.187 958.988,421.691 959.328,430.195 959.613,438.699 959.867,447.203 960.121,455.707 960.32,464.211 960.488,472.715 960.66,481.219 960.094,481.219 959.895,472.715 959.695,464.211 959.441,455.707 959.156,447.203 958.875,438.699 958.508,430.195 958.109,421.691 957.629,413.187 957.09,404.684 956.41,396.18 957.543,396.18 "/>
<path id="path343" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 955.273,396.18 L 956.039,404.684 956.691,413.187 957.23,421.691 957.715,430.195 958.109,438.699 958.449,447.203 958.789,455.707 959.047,464.211 959.301,472.715 959.527,481.219 958.961,481.219 958.707,472.715 958.422,464.211 958.109,455.707 957.742,447.203 957.348,438.699 956.895,430.195 956.355,421.691 955.758,413.187 955.023,404.684 954.145,396.18 955.277,396.18 "/>
<path id="path344" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 386.086,141.863 L 380.07,147.879 M 398.109,153.891 L 392.098,159.902 M 410.137,165.918 L 404.121,171.93 "/>
<path id="path345" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 362.836,141.062 L 368.227,147.695 373.719,154.23 379.309,160.664 384.941,167.058 390.637,173.394 396.348,179.707 402.117,185.961 407.91,192.195 413.727,198.41 419.559,204.601 419.156,205.004 413.305,198.832 407.473,192.637 401.641,186.441 395.848,180.211 390.094,173.934 384.359,167.641 378.688,161.285 373.055,154.894 367.504,148.422 362.031,141.863 362.836,141.062 "/>
<path id="path346" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 361.23,142.664 L 366.762,149.16 372.395,155.555 378.066,161.906 383.801,168.199 389.555,174.476 395.344,180.711 401.18,186.902 407.012,193.098 412.883,199.25 418.758,205.406 418.355,205.805 412.465,199.672 406.57,193.539 400.699,187.387 394.844,181.211 389.031,175 383.219,168.785 377.445,162.531 371.715,156.238 366.043,149.883 360.43,143.469 361.234,142.668 "/>
<path id="path347" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 359.629,144.269 L 365.32,150.601 371.051,156.898 376.824,163.148 382.656,169.344 388.488,175.535 394.344,181.711 400.234,187.844 406.129,193.976 412.043,200.09 417.953,206.203 417.555,206.605 411.621,200.512 405.688,194.418 399.754,188.324 393.844,182.211 387.949,176.078 382.078,169.922 376.223,163.75 370.391,157.555 364.578,151.344 358.824,145.07 359.629,144.266 "/>
<path id="path348" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 358.023,145.875 L 363.855,152.066 369.711,158.238 375.602,164.371 381.496,170.504 387.43,176.598 393.344,182.711 399.297,188.785 405.246,194.859 411.199,200.934 417.152,207.004 416.754,207.406 410.781,201.351 404.785,195.32 398.812,189.266 392.84,183.211 386.891,177.137 380.934,171.066 374.984,164.992 369.051,158.898 363.137,152.785 357.223,146.672 M 356.422,147.476 L 362.395,153.527 368.387,159.562 374.359,165.617 380.352,171.648 386.344,177.684 392.336,183.715 398.352,189.73 404.344,195.762 410.359,201.777 416.352,207.808 415.949,208.211 409.918,202.219 403.906,196.203 397.871,190.211 391.84,184.219 385.824,178.203 379.793,172.211 373.758,166.219 367.707,160.246 361.672,154.254 355.617,148.281 356.422,147.48 "/>
<path id="path349" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 354.816,149.078 L 360.93,154.992 367.043,160.906 373.137,166.84 379.211,172.793 385.281,178.742 391.336,184.715 397.41,190.668 403.461,196.641 409.496,202.633 415.551,208.609 415.148,209.008 409.074,203.055 403.004,197.101 396.93,191.148 390.836,185.215 384.742,179.281 378.648,173.351 372.516,167.457 366.383,161.562 360.207,155.711 354.016,149.879 354.816,149.078 "/>
<path id="path350" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 353.215,150.684 L 359.488,156.434 365.699,162.25 371.895,168.082 378.066,173.934 384.223,179.805 390.336,185.719 396.469,191.613 402.562,197.547 408.656,203.48 414.75,209.41 414.348,209.812 408.234,203.898 402.121,197.984 395.988,192.094 389.836,186.219 383.684,180.348 377.488,174.516 371.293,168.684 365.039,162.91 358.746,157.176 352.414,151.484 353.215,150.684 "/>
<path id="path351" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 351.609,152.285 L 358.023,157.898 364.379,163.57 370.672,169.305 376.926,175.074 383.141,180.887 389.332,186.723 395.523,192.555 401.68,198.426 407.812,204.32 413.945,210.215 413.547,210.613 407.391,204.742 401.238,198.867 395.047,193.035 388.832,187.223 382.617,181.41 376.344,175.656 370.051,169.926 363.695,164.25 357.301,158.617 350.809,153.086 351.609,152.285 "/>
<path id="path352" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 350.004,153.891 L 356.559,159.363 363.035,164.914 369.43,170.547 375.781,176.219 382.074,181.949 388.328,187.723 394.586,193.496 400.777,199.328 406.969,205.16 413.145,211.016 412.742,211.414 406.551,205.582 400.336,199.769 394.102,193.976 387.828,188.223 381.535,182.488 375.199,176.797 368.805,171.164 362.371,165.574 355.84,160.082 349.203,154.691 350.004,153.887 "/>
<path id="path353" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 164.41,209.094 L 175.746,209.094 175.746,197.754 164.41,197.754 "/>
<path id="path354" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 167.242,206.258 L 172.914,206.258 172.914,200.59 167.242,200.59 "/>
<path id="path355" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 164.41,492.558 L 175.746,492.558 175.746,481.219 164.41,481.219 "/>
<path id="path356" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 167.242,489.723 L 172.914,489.723 172.914,484.055 167.242,484.055 "/>
<path id="path357" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 958.109,209.094 L 969.449,209.094 969.449,197.754 958.109,197.754 "/>
<path id="path358" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 960.945,206.258 L 966.613,206.258 966.613,200.59 960.945,200.59 "/>
<path id="path359" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 958.109,492.558 L 969.449,492.558 969.449,481.219 958.109,481.219 "/>
<path id="path360" fill-rule="evenodd" stroke="none" fill="rgb(255,255,255)" d="M 960.945,489.723 L 966.613,489.723 966.613,484.055 960.945,484.055 "/>
<path id="path361" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 405.355,529.406 L 411.023,529.406 411.023,501.058 405.355,501.058 "/>
<path id="path362" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 445.039,529.406 L 450.707,529.406 450.707,501.058 445.039,501.058 "/>
<path id="path363" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 484.727,529.406 L 490.395,529.406 490.395,501.058 484.727,501.058 "/>
<path id="path364" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 524.41,529.406 L 530.078,529.406 530.078,501.058 524.41,501.058 "/>
<path id="path365" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 564.094,529.406 L 569.766,529.406 569.766,501.058 564.094,501.058 "/>
<path id="path366" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 603.781,529.406 L 609.449,529.406 609.449,501.058 603.781,501.058 "/>
<path id="path367" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 643.465,529.406 L 649.133,529.406 649.133,501.058 643.465,501.058 "/>
<path id="path368" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 683.148,529.406 L 688.82,529.406 688.82,501.058 683.148,501.058 "/>
<path id="path369" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 722.836,529.406 L 728.504,529.406 728.504,501.058 722.836,501.058 "/>
<path id="path370" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 371.34,501.058 L 377.008,501.058 374.176,529.406 371.34,529.406 371.34,501.058 "/>
<path id="path371" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 382.676,501.058 L 388.348,501.058 385.512,529.406 379.844,529.406 382.676,501.058 "/>
<path id="path372" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 394.016,501.058 L 399.688,501.058 396.852,529.406 391.184,529.406 394.016,501.058 "/>
<path id="path373" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 405.355,501.058 L 405.355,529.406 402.52,529.406 405.355,501.058 "/>
<path id="path374" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 411.023,501.058 L 412.914,501.058 410.078,529.406 408.191,529.406 411.023,501.058 "/>
<path id="path375" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 414.805,501.058 L 416.691,501.058 413.859,529.406 411.969,529.406 414.801,501.058 "/>
<path id="path376" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 418.582,501.058 L 420.473,501.058 417.637,529.406 415.746,529.406 418.582,501.058 "/>
<path id="path377" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 422.363,501.058 L 424.254,501.058 421.418,529.406 419.527,529.406 422.363,501.058 "/>
<path id="path378" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 426.145,501.058 L 428.031,501.058 425.199,529.406 423.309,529.406 426.145,501.058 "/>
<path id="path379" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 429.922,501.058 L 431.812,501.058 428.977,529.406 427.09,529.406 429.922,501.058 "/>
<path id="path380" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 433.703,501.058 L 435.59,501.058 432.758,529.406 430.867,529.406 433.703,501.058 "/>
<path id="path381" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 437.48,501.058 L 439.371,501.058 436.535,529.406 434.645,529.406 437.48,501.058 "/>
<path id="path382" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 441.262,501.058 L 443.152,501.058 440.316,529.406 438.426,529.406 441.262,501.058 "/>
<path id="path383" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 445.043,501.058 L 446.93,501.058 444.098,529.406 442.207,529.406 445.043,501.058 "/>
<path id="path384" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 450.711,501.058 L 451.844,501.058 449.008,529.406 447.875,529.406 450.711,501.058 "/>
<path id="path385" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 452.977,501.058 L 454.109,501.058 451.277,529.406 450.141,529.406 452.977,501.058 "/>
<path id="path386" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 455.246,501.058 L 456.379,501.058 453.543,529.406 452.41,529.406 455.246,501.058 "/>
<path id="path387" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 457.512,501.058 L 458.645,501.058 455.812,529.406 454.676,529.406 457.512,501.058 "/>
<path id="path388" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 459.781,501.058 L 460.914,501.058 458.078,529.406 456.945,529.406 459.781,501.058 "/>
<path id="path389" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 462.047,501.058 L 463.18,501.058 460.348,529.406 459.215,529.406 462.047,501.058 "/>
<path id="path390" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 464.316,501.058 L 465.449,501.058 462.613,529.406 461.48,529.406 464.316,501.058 "/>
<path id="path391" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 466.582,501.058 L 467.719,501.058 464.883,529.406 463.746,529.406 466.582,501.058 "/>
<path id="path392" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 468.852,501.058 L 469.984,501.058 467.148,529.406 466.016,529.406 468.852,501.058 "/>
<path id="path393" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 471.117,501.058 L 472.254,501.058 469.418,529.406 468.285,529.406 471.117,501.058 "/>
<path id="path394" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 473.387,501.058 L 474.52,501.058 471.684,529.406 470.551,529.406 473.387,501.058 "/>
<path id="path395" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 475.652,501.058 L 476.789,501.058 473.953,529.406 472.82,529.406 475.652,501.058 "/>
<path id="path396" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 477.922,501.058 L 479.055,501.058 476.219,529.406 475.086,529.406 477.922,501.058 "/>
<path id="path397" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 480.188,501.058 L 481.324,501.058 478.488,529.406 477.355,529.406 480.188,501.058 "/>
<path id="path398" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 482.457,501.058 L 483.59,501.058 480.758,529.406 479.621,529.406 482.457,501.058 "/>
<path id="path399" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 484.727,501.058 L 485.859,501.058 483.023,529.406 481.891,529.406 484.727,501.058 "/>
<path id="path400" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 486.992,501.058 L 488.125,501.058 485.293,529.406 484.156,529.406 486.992,501.058 "/>
<path id="path401" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 490.395,501.058 L 491.203,501.058 488.371,529.406 487.559,529.406 490.395,501.058 "/>
<path id="path402" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 492.012,501.058 L 492.82,501.058 489.988,529.406 489.176,529.406 492.012,501.058 "/>
<path id="path403" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 493.633,501.058 L 494.441,501.058 491.609,529.406 490.801,529.406 493.633,501.058 "/>
<path id="path404" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 495.254,501.058 L 496.062,501.058 493.227,529.406 492.418,529.406 495.254,501.058 "/>
<path id="path405" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 496.871,501.058 L 497.684,501.058 494.848,529.406 494.035,529.406 496.871,501.058 "/>
<path id="path406" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 498.492,501.058 L 499.305,501.058 496.469,529.406 495.66,529.406 498.492,501.058 "/>
<path id="path407" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 500.113,501.058 L 500.922,501.058 498.09,529.406 497.277,529.406 500.113,501.058 "/>
<path id="path408" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 501.73,501.058 L 502.539,501.058 499.707,529.406 498.895,529.406 501.73,501.058 "/>
<path id="path409" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 503.352,501.058 L 504.16,501.058 501.328,529.406 500.52,529.406 503.352,501.058 "/>
<path id="path410" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 504.973,501.058 L 505.781,501.058 502.945,529.406 502.137,529.406 504.973,501.058 "/>
<path id="path411" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 506.59,501.058 L 507.402,501.058 504.566,529.406 503.758,529.406 506.59,501.058 "/>
<path id="path412" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 508.211,501.058 L 509.02,501.058 506.188,529.406 505.375,529.406 508.211,501.058 "/>
<path id="path413" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 509.828,501.058 L 510.641,501.058 507.805,529.406 506.996,529.406 509.832,501.058 "/>
<path id="path414" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 511.449,501.058 L 512.262,501.058 509.426,529.406 508.617,529.406 511.449,501.058 "/>
<path id="path415" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 513.07,501.058 L 513.879,501.058 511.047,529.406 510.234,529.406 513.07,501.058 "/>
<path id="path416" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 514.691,501.058 L 515.5,501.058 512.664,529.406 511.855,529.406 514.691,501.058 "/>
<path id="path417" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 516.309,501.058 L 517.121,501.058 514.285,529.406 513.477,529.406 516.309,501.058 "/>
<path id="path418" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 517.93,501.058 L 518.738,501.058 515.906,529.406 515.094,529.406 517.93,501.058 "/>
<path id="path419" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 519.551,501.058 L 520.359,501.058 517.523,529.406 516.715,529.406 519.551,501.058 "/>
<path id="path420" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 521.168,501.058 L 521.977,501.058 519.145,529.406 518.336,529.406 521.168,501.058 "/>
<path id="path421" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 522.789,501.058 L 523.598,501.058 520.766,529.406 519.953,529.406 522.789,501.058 "/>
<path id="path422" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 524.406,501.058 L 525.219,501.058 522.383,529.406 521.57,529.406 524.406,501.058 "/>
<path id="path423" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 526.027,501.058 L 526.84,501.058 524.004,529.406 523.195,529.406 526.027,501.058 "/>
<path id="path424" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 530.078,501.058 L 530.711,501.058 527.875,529.406 527.246,529.406 530.078,501.058 "/>
<path id="path425" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 531.34,501.058 L 531.969,501.058 529.133,529.406 528.504,529.406 531.34,501.058 "/>
<path id="path426" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 532.598,501.058 L 533.227,501.058 530.395,529.406 529.766,529.406 532.598,501.058 "/>
<path id="path427" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 533.859,501.058 L 534.488,501.058 531.652,529.406 531.023,529.406 533.859,501.058 "/>
<path id="path428" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 535.117,501.058 L 535.746,501.058 532.914,529.406 532.281,529.406 535.117,501.058 "/>
<path id="path429" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 536.379,501.058 L 537.008,501.058 534.172,529.406 533.543,529.406 536.379,501.058 "/>
<path id="path430" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 537.637,501.058 L 538.266,501.058 535.434,529.406 534.801,529.406 537.637,501.058 "/>
<path id="path431" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 538.898,501.058 L 539.527,501.058 536.691,529.406 536.062,529.406 538.898,501.058 "/>
<path id="path432" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 540.156,501.058 L 540.785,501.058 537.953,529.406 537.32,529.406 540.156,501.058 "/>
<path id="path433" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 541.418,501.058 L 542.047,501.058 539.211,529.406 538.582,529.406 541.418,501.058 "/>
<path id="path434" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 542.676,501.058 L 543.305,501.058 540.473,529.406 539.84,529.406 542.676,501.058 "/>
<path id="path435" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 543.938,501.058 L 544.566,501.058 541.73,529.406 541.102,529.406 543.938,501.058 "/>
<path id="path436" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 545.195,501.058 L 545.824,501.058 542.992,529.406 542.359,529.406 545.195,501.058 "/>
<path id="path437" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 546.453,501.058 L 547.086,501.058 544.25,529.406 543.621,529.406 546.453,501.058 "/>
<path id="path438" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 547.715,501.058 L 548.344,501.058 545.512,529.406 544.879,529.406 547.715,501.058 "/>
<path id="path439" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 548.977,501.058 L 549.605,501.058 546.77,529.406 546.141,529.406 548.977,501.058 "/>
<path id="path440" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 550.234,501.058 L 550.863,501.058 548.031,529.406 547.398,529.406 550.234,501.058 "/>
<path id="path441" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 551.496,501.058 L 552.125,501.058 549.289,529.406 548.66,529.406 551.496,501.058 "/>
<path id="path442" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 552.754,501.058 L 553.383,501.058 550.551,529.406 549.918,529.406 552.754,501.058 "/>
<path id="path443" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 554.012,501.058 L 554.645,501.058 551.809,529.406 551.18,529.406 554.012,501.058 "/>
<path id="path444" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 555.273,501.058 L 555.902,501.058 553.066,529.406 552.438,529.406 555.273,501.058 "/>
<path id="path445" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 556.531,501.058 L 557.164,501.058 554.328,529.406 553.695,529.406 556.531,501.058 "/>
<path id="path446" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 557.793,501.058 L 558.422,501.058 555.59,529.406 554.957,529.406 557.793,501.058 "/>
<path id="path447" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 559.051,501.058 L 559.684,501.058 556.848,529.406 556.219,529.406 559.051,501.058 "/>
<path id="path448" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 560.312,501.058 L 560.941,501.058 558.105,529.406 557.477,529.406 560.312,501.058 "/>
<path id="path449" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 561.57,501.058 L 562.203,501.058 559.367,529.406 558.738,529.406 561.57,501.058 "/>
<path id="path450" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 562.832,501.058 L 563.461,501.058 560.625,529.406 559.996,529.406 562.832,501.058 "/>
<path id="path451" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 564.09,501.058 L 564.723,501.058 561.887,529.406 561.258,529.406 564.09,501.058 "/>
<path id="path452" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 565.352,501.058 L 565.98,501.058 563.145,529.406 562.516,529.406 565.352,501.058 "/>
<path id="path453" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 566.609,501.058 L 567.242,501.058 564.406,529.406 563.777,529.406 566.609,501.058 "/>
<path id="path454" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 569.766,501.058 L 570.332,501.058 567.496,529.406 566.93,529.406 569.766,501.058 "/>
<path id="path455" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 570.898,501.058 L 571.465,501.058 568.629,529.406 568.062,529.406 570.898,501.058 "/>
<path id="path456" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 572.031,501.058 L 572.598,501.058 569.766,529.406 569.195,529.406 572.031,501.058 "/>
<path id="path457" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 573.164,501.058 L 573.73,501.058 570.898,529.406 570.332,529.406 573.164,501.058 "/>
<path id="path458" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 574.301,501.058 L 574.867,501.058 572.031,529.406 571.465,529.406 574.301,501.058 "/>
<path id="path459" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 575.434,501.058 L 576,501.058 573.164,529.406 572.598,529.406 575.434,501.058 "/>
<path id="path460" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 576.566,501.058 L 577.133,501.058 574.301,529.406 573.73,529.406 576.566,501.058 "/>
<path id="path461" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 577.699,501.058 L 578.27,501.058 575.434,529.406 574.867,529.406 577.699,501.058 "/>
<path id="path462" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 578.836,501.058 L 579.402,501.058 576.566,529.406 576,529.406 578.836,501.058 "/>
<path id="path463" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 579.969,501.058 L 580.535,501.058 577.699,529.406 577.133,529.406 579.969,501.058 "/>
<path id="path464" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 581.102,501.058 L 581.668,501.058 578.836,529.406 578.27,529.406 581.102,501.058 "/>
<path id="path465" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 582.234,501.058 L 582.805,501.058 579.969,529.406 579.402,529.406 582.234,501.058 "/>
<path id="path466" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 583.371,501.058 L 583.938,501.058 581.102,529.406 580.535,529.406 583.371,501.058 "/>
<path id="path467" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 584.504,501.058 L 585.07,501.058 582.234,529.406 581.668,529.406 584.504,501.058 "/>
<path id="path468" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 585.637,501.058 L 586.203,501.058 583.371,529.406 582.805,529.406 585.637,501.058 "/>
<path id="path469" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 586.773,501.058 L 587.34,501.058 584.504,529.406 583.938,529.406 586.773,501.058 "/>
<path id="path470" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 587.906,501.058 L 588.473,501.058 585.637,529.406 585.07,529.406 587.906,501.058 "/>
<path id="path471" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 589.039,501.058 L 589.605,501.058 586.773,529.406 586.203,529.406 589.039,501.058 "/>
<path id="path472" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 590.172,501.058 L 590.738,501.058 587.906,529.406 587.34,529.406 590.172,501.058 "/>
<path id="path473" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 591.309,501.058 L 591.875,501.058 589.039,529.406 588.473,529.406 591.309,501.058 "/>
<path id="path474" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 592.441,501.058 L 593.008,501.058 590.172,529.406 589.605,529.406 592.441,501.058 "/>
<path id="path475" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 593.574,501.058 L 594.141,501.058 591.309,529.406 590.738,529.406 593.574,501.058 "/>
<path id="path476" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 594.707,501.058 L 595.277,501.058 592.441,529.406 591.875,529.406 594.707,501.058 "/>
<path id="path477" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 595.844,501.058 L 596.41,501.058 593.574,529.406 593.008,529.406 595.844,501.058 "/>
<path id="path478" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 596.977,501.058 L 597.543,501.058 594.707,529.406 594.141,529.406 596.977,501.058 "/>
<path id="path479" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 598.109,501.058 L 598.676,501.058 595.844,529.406 595.277,529.406 598.109,501.058 "/>
<path id="path480" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 599.242,501.058 L 599.812,501.058 596.977,529.406 596.41,529.406 599.242,501.058 "/>
<path id="path481" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 600.379,501.058 L 600.945,501.058 598.109,529.406 597.543,529.406 600.379,501.058 "/>
<path id="path482" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 601.512,501.058 L 602.078,501.058 599.242,529.406 598.676,529.406 601.512,501.058 "/>
<path id="path483" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 602.645,501.058 L 603.211,501.058 600.379,529.406 599.812,529.406 602.645,501.058 "/>
<path id="path484" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 603.781,501.058 L 604.348,501.058 601.512,529.406 600.945,529.406 603.781,501.058 "/>
<path id="path485" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 604.914,501.058 L 605.48,501.058 602.645,529.406 602.078,529.406 604.914,501.058 "/>
<path id="path486" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 606.047,501.058 L 606.613,501.058 603.781,529.406 603.211,529.406 606.047,501.058 "/>
<path id="path487" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 609.449,501.058 L 610.156,501.058 607.324,529.406 606.613,529.406 609.449,501.058 "/>
<path id="path488" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 610.867,501.058 L 611.574,501.058 608.738,529.406 608.031,529.406 610.867,501.058 "/>
<path id="path489" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 612.285,501.058 L 612.992,501.058 610.156,529.406 609.449,529.406 612.285,501.058 "/>
<path id="path490" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 613.699,501.058 L 614.41,501.058 611.574,529.406 610.867,529.406 613.699,501.058 "/>
<path id="path491" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 615.117,501.058 L 615.828,501.058 612.992,529.406 612.285,529.406 615.117,501.058 "/>
<path id="path492" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 616.535,501.058 L 617.242,501.058 614.41,529.406 613.699,529.406 616.535,501.058 "/>
<path id="path493" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 617.953,501.058 L 618.66,501.058 615.828,529.406 615.117,529.406 617.953,501.058 "/>
<path id="path494" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 619.371,501.058 L 620.078,501.058 617.242,529.406 616.535,529.406 619.371,501.058 "/>
<path id="path495" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 620.789,501.058 L 621.496,501.058 618.66,529.406 617.953,529.406 620.789,501.058 "/>
<path id="path496" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 622.203,501.058 L 622.914,501.058 620.078,529.406 619.371,529.406 622.203,501.058 "/>
<path id="path497" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 623.621,501.058 L 624.332,501.058 621.496,529.406 620.789,529.406 623.621,501.058 "/>
<path id="path498" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 625.039,501.058 L 625.75,501.058 622.914,529.406 622.203,529.406 625.039,501.058 "/>
<path id="path499" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 626.457,501.058 L 627.164,501.058 624.332,529.406 623.621,529.406 626.457,501.058 "/>
<path id="path500" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 627.875,501.058 L 628.582,501.058 625.75,529.406 625.039,529.406 627.875,501.058 "/>
<path id="path501" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 629.293,501.058 L 630,501.058 627.164,529.406 626.457,529.406 629.293,501.058 "/>
<path id="path502" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 630.707,501.058 L 631.418,501.058 628.582,529.406 627.875,529.406 630.707,501.058 "/>
<path id="path503" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 632.125,501.058 L 632.836,501.058 630,529.406 629.293,529.406 632.125,501.058 "/>
<path id="path504" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 633.543,501.058 L 634.254,501.058 631.418,529.406 630.707,529.406 633.543,501.058 "/>
<path id="path505" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 634.961,501.058 L 635.668,501.058 632.836,529.406 632.125,529.406 634.961,501.058 "/>
<path id="path506" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 636.379,501.058 L 637.086,501.058 634.254,529.406 633.543,529.406 636.379,501.058 "/>
<path id="path507" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 637.797,501.058 L 638.504,501.058 635.668,529.406 634.961,529.406 637.797,501.058 "/>
<path id="path508" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 639.211,501.058 L 639.922,501.058 637.086,529.406 636.379,529.406 639.211,501.058 "/>
<path id="path509" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 640.629,501.058 L 641.34,501.058 638.504,529.406 637.797,529.406 640.629,501.058 "/>
<path id="path510" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 642.047,501.058 L 642.758,501.058 639.922,529.406 639.211,529.406 642.047,501.058 "/>
<path id="path511" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 643.465,501.058 L 644.172,501.058 641.34,529.406 640.629,529.406 643.465,501.058 "/>
<path id="path512" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 644.883,501.058 L 645.59,501.058 642.758,529.406 642.047,529.406 644.883,501.058 "/>
<path id="path513" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 649.133,501.058 L 650.078,501.058 647.242,529.406 646.301,529.406 649.133,501.058 "/>
<path id="path514" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 651.023,501.058 L 651.969,501.058 649.133,529.406 648.188,529.406 651.023,501.058 "/>
<path id="path515" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 652.914,501.058 L 653.859,501.058 651.023,529.406 650.078,529.406 652.914,501.058 "/>
<path id="path516" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 654.801,501.058 L 655.746,501.058 652.914,529.406 651.969,529.406 654.801,501.058 "/>
<path id="path517" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 656.691,501.058 L 657.637,501.058 654.801,529.406 653.859,529.406 656.691,501.058 "/>
<path id="path518" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 658.582,501.058 L 659.527,501.058 656.691,529.406 655.746,529.406 658.582,501.058 "/>
<path id="path519" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 660.473,501.058 L 661.418,501.058 658.582,529.406 657.637,529.406 660.473,501.058 "/>
<path id="path520" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 662.359,501.058 L 663.305,501.058 660.473,529.406 659.527,529.406 662.359,501.058 "/>
<path id="path521" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 664.25,501.058 L 665.195,501.058 662.359,529.406 661.414,529.406 664.25,501.058 "/>
<path id="path522" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 666.141,501.058 L 667.086,501.058 664.25,529.406 663.305,529.406 666.141,501.058 "/>
<path id="path523" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 668.031,501.058 L 668.973,501.058 666.141,529.406 665.195,529.406 668.031,501.058 "/>
<path id="path524" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 669.918,501.058 L 670.863,501.058 668.031,529.406 667.086,529.406 669.918,501.058 "/>
<path id="path525" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 671.809,501.058 L 672.754,501.058 669.918,529.406 668.973,529.406 671.809,501.058 "/>
<path id="path526" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 673.699,501.058 L 674.645,501.058 671.809,529.406 670.863,529.406 673.699,501.058 "/>
<path id="path527" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 675.59,501.058 L 676.531,501.058 673.699,529.406 672.754,529.406 675.59,501.058 "/>
<path id="path528" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 677.477,501.058 L 678.422,501.058 675.586,529.406 674.645,529.406 677.477,501.058 "/>
<path id="path529" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 679.367,501.058 L 680.312,501.058 677.477,529.406 676.531,529.406 679.367,501.058 "/>
<path id="path530" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 681.258,501.058 L 682.203,501.058 679.367,529.406 678.422,529.406 681.258,501.058 "/>
<path id="path531" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 683.145,501.058 L 684.09,501.058 681.258,529.406 680.312,529.406 683.145,501.058 "/>
<path id="path532" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 685.035,501.058 L 685.98,501.058 683.145,529.406 682.199,529.406 685.035,501.058 "/>
<path id="path533" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 688.82,501.058 L 690.234,501.058 687.402,529.406 685.984,529.406 688.82,501.058 "/>
<path id="path534" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 691.652,501.058 L 693.07,501.058 690.234,529.406 688.82,529.406 691.652,501.058 "/>
<path id="path535" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 694.488,501.058 L 695.906,501.058 693.07,529.406 691.652,529.406 694.488,501.058 "/>
<path id="path536" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 697.324,501.058 L 698.738,501.058 695.906,529.406 694.488,529.406 697.324,501.058 "/>
<path id="path537" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 700.156,501.058 L 701.574,501.058 698.738,529.406 697.324,529.406 700.156,501.058 "/>
<path id="path538" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 702.992,501.058 L 704.41,501.058 701.574,529.406 700.156,529.406 702.992,501.058 "/>
<path id="path539" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 705.828,501.058 L 707.242,501.058 704.41,529.406 702.992,529.406 705.828,501.058 "/>
<path id="path540" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 708.66,501.058 L 710.078,501.058 707.242,529.406 705.828,529.406 708.66,501.058 "/>
<path id="path541" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 711.496,501.058 L 712.914,501.058 710.078,529.406 708.66,529.406 711.496,501.058 "/>
<path id="path542" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 714.328,501.058 L 715.746,501.058 712.914,529.406 711.496,529.406 714.328,501.058 "/>
<path id="path543" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 717.168,501.058 L 718.582,501.058 715.746,529.406 714.328,529.406 717.168,501.058 "/>
<path id="path544" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 720,501.058 L 721.418,501.058 718.582,529.406 717.164,529.406 720,501.058 "/>
<path id="path545" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 722.836,501.058 L 724.254,501.058 721.418,529.406 720,529.406 722.836,501.058 "/>
<path id="path546" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 728.504,501.058 L 731.34,501.058 728.504,529.406 725.672,529.406 728.504,501.058 "/>
<path id="path547" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 734.176,501.058 L 737.008,501.058 734.176,529.406 731.34,529.406 734.176,501.058 "/>
<path id="path548" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 739.844,501.058 L 742.68,501.058 739.844,529.406 737.008,529.406 739.844,501.058 "/>
<path id="path549" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 745.512,501.058 L 748.348,501.058 745.512,529.406 742.68,529.406 745.512,501.058 "/>
<path id="path550" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 751.184,501.058 L 754.016,501.058 751.184,529.406 748.348,529.406 751.184,501.058 "/>
<path id="path551" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 756.852,501.058 L 759.688,501.058 756.852,529.406 754.016,529.406 756.852,501.058 "/>
<path id="path552" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 762.52,501.058 L 762.52,529.406 759.688,529.406 762.52,501.058 "/>
<path id="path553" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,189.25 L 822.047,189.25 822.047,183.582 793.699,183.582 "/>
<path id="path554" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,228.934 L 822.047,228.934 822.047,223.266 793.699,223.266 "/>
<path id="path555" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,268.621 L 822.047,268.621 822.047,262.953 793.699,262.953 "/>
<path id="path556" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,308.305 L 822.047,308.305 822.047,302.637 793.699,302.637 "/>
<path id="path557" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,347.992 L 822.047,347.992 822.047,342.32 793.699,342.32 "/>
<path id="path558" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,387.676 L 822.047,387.676 822.047,382.008 793.699,382.008 "/>
<path id="path559" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,427.359 L 822.047,427.359 822.047,421.691 793.699,421.691 "/>
<path id="path560" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,467.047 L 822.047,467.047 822.047,461.375 793.699,461.375 "/>
<path id="path561" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 793.699,506.73 L 822.047,506.73 822.047,501.062 793.699,501.062 "/>
<path id="path562" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,149.566 L 822.047,155.234 793.699,152.402 793.699,149.566 822.047,149.566 "/>
<path id="path563" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,160.902 L 822.047,166.574 793.699,163.738 793.699,158.07 822.047,160.902 "/>
<path id="path564" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,172.242 L 822.047,177.91 793.699,175.078 793.699,169.406 822.047,172.242 "/>
<path id="path565" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,183.582 L 793.699,183.582 793.699,180.746 822.047,183.582 "/>
<path id="path566" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,189.25 L 822.047,191.141 793.699,188.305 793.699,186.414 822.047,189.25 "/>
<path id="path567" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,193.031 L 822.047,194.918 793.699,192.086 793.699,190.195 822.047,193.027 "/>
<path id="path568" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,196.808 L 822.047,198.699 793.699,195.867 793.699,193.976 822.047,196.812 "/>
<path id="path569" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,200.59 L 822.047,202.48 793.699,199.644 793.699,197.758 822.047,200.59 "/>
<path id="path570" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,204.367 L 822.047,206.258 793.699,203.426 793.699,201.535 822.047,204.367 "/>
<path id="path571" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,208.148 L 822.047,210.039 793.699,207.203 793.699,205.312 822.047,208.148 "/>
<path id="path572" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,211.93 L 822.047,213.816 793.699,210.984 793.699,209.094 822.047,211.93 "/>
<path id="path573" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,215.711 L 822.047,217.598 793.699,214.766 793.699,212.875 822.047,215.711 "/>
<path id="path574" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,219.488 L 822.047,221.379 793.699,218.543 793.699,216.652 822.047,219.488 "/>
<path id="path575" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,223.266 L 822.047,225.156 793.699,222.324 793.699,220.434 822.047,223.266 "/>
<path id="path576" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,228.934 L 822.047,230.07 793.699,227.234 793.699,226.101 822.047,228.934 "/>
<path id="path577" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,231.203 L 822.047,232.336 793.699,229.504 793.699,228.367 822.047,231.203 "/>
<path id="path578" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,233.473 L 822.047,234.605 793.699,231.769 793.699,230.637 822.047,233.473 "/>
<path id="path579" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,235.738 L 822.047,236.871 793.699,234.039 793.699,232.902 822.047,235.738 "/>
<path id="path580" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,238.008 L 822.047,239.141 793.699,236.305 793.699,235.172 822.047,238.008 "/>
<path id="path581" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,240.273 L 822.047,241.41 793.699,238.574 793.699,237.441 822.047,240.273 "/>
<path id="path582" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,242.543 L 822.047,243.676 793.699,240.84 793.699,239.707 822.047,242.543 "/>
<path id="path583" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,244.808 L 822.047,245.945 793.699,243.109 793.699,241.976 822.047,244.808 "/>
<path id="path584" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,247.078 L 822.047,248.211 793.699,245.375 793.699,244.242 822.047,247.078 "/>
<path id="path585" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,249.344 L 822.047,250.48 793.699,247.644 793.699,246.512 822.047,249.344 "/>
<path id="path586" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,251.613 L 822.047,252.746 793.699,249.91 793.699,248.777 822.047,251.613 "/>
<path id="path587" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,253.883 L 822.047,255.016 793.699,252.18 793.699,251.047 822.047,253.883 "/>
<path id="path588" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,256.148 L 822.047,257.281 793.699,254.445 793.699,253.312 822.047,256.148 "/>
<path id="path589" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,258.418 L 822.047,259.551 793.699,256.715 793.699,255.582 822.047,258.418 "/>
<path id="path590" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,260.684 L 822.047,261.816 793.699,258.984 793.699,257.848 822.047,260.684 "/>
<path id="path591" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,262.953 L 822.047,264.086 793.699,261.25 793.699,260.117 822.047,262.953 "/>
<path id="path592" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,265.219 L 822.047,266.351 793.699,263.519 793.699,262.387 822.047,265.219 "/>
<path id="path593" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,268.621 L 822.047,269.43 793.699,266.598 793.699,265.785 822.047,268.621 "/>
<path id="path594" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,270.238 L 822.047,271.051 793.699,268.215 793.699,267.406 822.047,270.238 "/>
<path id="path595" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,271.859 L 822.047,272.668 793.699,269.836 793.699,269.023 822.047,271.859 "/>
<path id="path596" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,273.48 L 822.047,274.293 793.699,271.457 793.699,270.648 822.047,273.48 "/>
<path id="path597" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,275.101 L 822.047,275.91 793.699,273.074 793.699,272.266 822.047,275.101 "/>
<path id="path598" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,276.719 L 822.047,277.527 793.699,274.695 793.699,273.883 822.047,276.719 "/>
<path id="path599" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,278.34 L 822.047,279.148 793.699,276.316 793.699,275.508 822.047,278.34 "/>
<path id="path600" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,279.961 L 822.047,280.769 793.699,277.934 793.699,277.125 822.047,279.961 "/>
<path id="path601" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,281.578 L 822.047,282.387 793.699,279.555 793.699,278.742 822.047,281.578 "/>
<path id="path602" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,283.199 L 822.047,284.008 793.699,281.172 793.699,280.363 822.047,283.199 "/>
<path id="path603" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,284.816 L 822.047,285.629 793.699,282.793 793.699,281.984 822.047,284.816 "/>
<path id="path604" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,286.437 L 822.047,287.246 793.699,284.414 793.699,283.601 822.047,286.437 "/>
<path id="path605" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,288.058 L 822.047,288.867 793.699,286.031 793.699,285.223 822.047,288.058 "/>
<path id="path606" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,289.676 L 822.047,290.488 793.699,287.652 793.699,286.844 822.047,289.68 "/>
<path id="path607" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,291.297 L 822.047,292.105 793.699,289.273 793.699,288.461 822.047,291.297 "/>
<path id="path608" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,292.918 L 822.047,293.726 793.699,290.891 793.699,290.082 822.047,292.918 "/>
<path id="path609" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,294.535 L 822.047,295.348 793.699,292.512 793.699,291.703 822.047,294.535 "/>
<path id="path610" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,296.156 L 822.047,296.965 793.699,294.133 793.699,293.32 822.047,296.156 "/>
<path id="path611" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,297.777 L 822.047,298.586 793.699,295.75 793.699,294.941 822.047,297.777 "/>
<path id="path612" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,299.394 L 822.047,300.207 793.699,297.371 793.699,296.558 822.047,299.394 "/>
<path id="path613" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,301.016 L 822.047,301.824 793.699,298.992 793.699,298.184 822.047,301.016 "/>
<path id="path614" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,302.637 L 822.047,303.445 793.699,300.609 793.699,299.801 822.047,302.637 "/>
<path id="path615" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,304.254 L 822.047,305.062 793.699,302.23 793.699,301.418 822.047,304.254 "/>
<path id="path616" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,308.305 L 822.047,308.937 793.699,306.101 793.699,305.473 822.047,308.305 "/>
<path id="path617" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,309.566 L 822.047,310.195 793.699,307.359 793.699,306.73 822.047,309.566 "/>
<path id="path618" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,310.824 L 822.047,311.457 793.699,308.621 793.699,307.992 822.047,310.824 "/>
<path id="path619" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,312.086 L 822.047,312.715 793.699,309.879 793.699,309.25 822.047,312.086 "/>
<path id="path620" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,313.344 L 822.047,313.976 793.699,311.141 793.699,310.512 822.047,313.344 "/>
<path id="path621" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,314.605 L 822.047,315.234 793.699,312.398 793.699,311.769 822.047,314.605 "/>
<path id="path622" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,315.863 L 822.047,316.492 793.699,313.66 793.699,313.027 822.047,315.863 "/>
<path id="path623" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,317.125 L 822.047,317.754 793.699,314.918 793.699,314.289 822.047,317.125 "/>
<path id="path624" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,318.383 L 822.047,319.012 793.699,316.18 793.699,315.551 822.047,318.383 "/>
<path id="path625" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,319.644 L 822.047,320.273 793.699,317.437 793.699,316.808 822.047,319.644 "/>
<path id="path626" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,320.902 L 822.047,321.531 793.699,318.699 793.699,318.066 822.047,320.902 "/>
<path id="path627" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,322.164 L 822.047,322.793 793.699,319.957 793.699,319.328 822.047,322.164 "/>
<path id="path628" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,323.422 L 822.047,324.051 793.699,321.219 793.699,320.59 822.047,323.422 "/>
<path id="path629" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,324.684 L 822.047,325.312 793.699,322.476 793.699,321.848 822.047,324.684 "/>
<path id="path630" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,325.941 L 822.047,326.57 793.699,323.738 793.699,323.105 822.047,325.941 "/>
<path id="path631" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,327.203 L 822.047,327.832 793.699,324.996 793.699,324.367 822.047,327.203 "/>
<path id="path632" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,328.461 L 822.047,329.09 793.699,326.258 793.699,325.629 822.047,328.461 "/>
<path id="path633" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,329.723 L 822.047,330.351 793.699,327.516 793.699,326.887 822.047,329.723 "/>
<path id="path634" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,330.98 L 822.047,331.609 793.699,328.777 793.699,328.144 822.047,330.98 "/>
<path id="path635" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,332.238 L 822.047,332.871 793.699,330.035 793.699,329.406 822.047,332.238 "/>
<path id="path636" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,333.5 L 822.047,334.129 793.699,331.297 793.699,330.664 822.047,333.5 "/>
<path id="path637" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,334.762 L 822.047,335.391 793.699,332.555 793.699,331.926 822.047,334.762 "/>
<path id="path638" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,336.019 L 822.047,336.648 793.699,333.816 793.699,333.184 822.047,336.019 "/>
<path id="path639" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,337.277 L 822.047,337.91 793.699,335.074 793.699,334.445 822.047,337.277 "/>
<path id="path640" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,338.539 L 822.047,339.168 793.699,336.336 793.699,335.703 822.047,338.539 "/>
<path id="path641" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,339.801 L 822.047,340.43 793.699,337.594 793.699,336.965 822.047,339.801 "/>
<path id="path642" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,341.058 L 822.047,341.687 793.699,338.851 793.699,338.223 822.047,341.058 "/>
<path id="path643" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,342.316 L 822.047,342.949 793.699,340.113 793.699,339.484 822.047,342.316 "/>
<path id="path644" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,343.578 L 822.047,344.207 793.699,341.375 793.699,340.742 822.047,343.578 "/>
<path id="path645" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,344.836 L 822.047,345.469 793.699,342.633 793.699,342.004 822.047,344.836 "/>
<path id="path646" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,347.992 L 822.047,348.558 793.699,345.723 793.699,345.156 822.047,347.992 "/>
<path id="path647" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,349.125 L 822.047,349.691 793.699,346.859 793.699,346.289 822.047,349.125 "/>
<path id="path648" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,350.258 L 822.047,350.824 793.699,347.992 793.699,347.426 822.047,350.258 "/>
<path id="path649" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,351.394 L 822.047,351.961 793.699,349.125 793.699,348.558 822.047,351.391 "/>
<path id="path650" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,352.527 L 822.047,353.094 793.699,350.262 793.699,349.691 822.047,352.527 "/>
<path id="path651" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,353.66 L 822.047,354.226 793.699,351.394 793.699,350.824 822.047,353.66 "/>
<path id="path652" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,354.793 L 822.047,355.359 793.699,352.527 793.699,351.961 822.047,354.793 "/>
<path id="path653" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,355.93 L 822.047,356.496 793.699,353.66 793.699,353.094 822.047,355.93 "/>
<path id="path654" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,357.062 L 822.047,357.629 793.699,354.793 793.699,354.226 822.047,357.062 "/>
<path id="path655" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,358.195 L 822.047,358.762 793.699,355.93 793.699,355.363 822.047,358.195 "/>
<path id="path656" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,359.328 L 822.047,359.894 793.699,357.062 793.699,356.496 822.047,359.328 "/>
<path id="path657" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,360.465 L 822.047,361.031 793.699,358.195 793.699,357.629 822.047,360.465 "/>
<path id="path658" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,361.598 L 822.047,362.164 793.699,359.328 793.699,358.762 822.047,361.598 "/>
<path id="path659" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,362.73 L 822.047,363.297 793.699,360.465 793.699,359.898 822.047,362.73 "/>
<path id="path660" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,363.863 L 822.047,364.43 793.699,361.598 793.699,361.031 822.047,363.863 "/>
<path id="path661" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,365 L 822.047,365.566 793.699,362.73 793.699,362.164 822.047,365 "/>
<path id="path662" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,366.133 L 822.047,366.699 793.699,363.863 793.699,363.297 822.047,366.133 "/>
<path id="path663" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,367.266 L 822.047,367.832 793.699,365 793.699,364.43 822.047,367.266 "/>
<path id="path664" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,368.398 L 822.047,368.965 793.699,366.133 793.699,365.566 822.047,368.398 "/>
<path id="path665" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,369.535 L 822.047,370.101 793.699,367.266 793.699,366.699 822.047,369.531 "/>
<path id="path666" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,370.668 L 822.047,371.234 793.699,368.402 793.699,367.836 822.047,370.668 "/>
<path id="path667" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,371.801 L 822.047,372.367 793.699,369.535 793.699,368.965 822.047,371.801 "/>
<path id="path668" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,372.934 L 822.047,373.504 793.699,370.668 793.699,370.101 822.047,372.937 "/>
<path id="path669" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,374.07 L 822.047,374.637 793.699,371.801 793.699,371.234 822.047,374.07 "/>
<path id="path670" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,375.203 L 822.047,375.769 793.699,372.937 793.699,372.371 822.047,375.203 "/>
<path id="path671" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,376.336 L 822.047,376.902 793.699,374.07 793.699,373.504 822.047,376.336 "/>
<path id="path672" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,377.473 L 822.047,378.039 793.699,375.203 793.699,374.637 822.047,377.473 "/>
<path id="path673" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,378.605 L 822.047,379.172 793.699,376.336 793.699,375.769 822.047,378.605 "/>
<path id="path674" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,379.738 L 822.047,380.305 793.699,377.469 793.699,376.902 822.047,379.738 "/>
<path id="path675" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,380.875 L 822.047,381.437 793.699,378.605 793.699,378.039 822.047,380.875 "/>
<path id="path676" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,382.008 L 822.047,382.574 793.699,379.738 793.699,379.172 822.047,382.008 "/>
<path id="path677" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,383.141 L 822.047,383.707 793.699,380.875 793.699,380.305 822.047,383.141 "/>
<path id="path678" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,384.273 L 822.047,384.84 793.699,382.008 793.699,381.437 822.047,384.273 "/>
<path id="path679" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,387.676 L 822.047,388.387 793.699,385.551 793.699,384.84 822.047,387.676 "/>
<path id="path680" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,389.094 L 822.047,389.801 793.699,386.969 793.699,386.258 822.047,389.094 "/>
<path id="path681" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,390.512 L 822.047,391.219 793.699,388.387 793.699,387.676 822.047,390.512 "/>
<path id="path682" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,391.93 L 822.047,392.637 793.699,389.801 793.699,389.094 822.047,391.93 "/>
<path id="path683" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,393.348 L 822.047,394.055 793.699,391.219 793.699,390.512 822.047,393.348 "/>
<path id="path684" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,394.762 L 822.047,395.473 793.699,392.637 793.699,391.93 822.047,394.762 "/>
<path id="path685" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,396.18 L 822.047,396.891 793.699,394.055 793.699,393.348 822.047,396.18 "/>
<path id="path686" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,397.598 L 822.047,398.305 793.699,395.473 793.699,394.762 822.047,397.598 "/>
<path id="path687" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,399.016 L 822.047,399.723 793.699,396.891 793.699,396.18 822.047,399.016 "/>
<path id="path688" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,400.434 L 822.047,401.141 793.699,398.305 793.699,397.598 822.047,400.434 "/>
<path id="path689" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,401.851 L 822.047,402.558 793.699,399.723 793.699,399.016 822.047,401.851 "/>
<path id="path690" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,403.266 L 822.047,403.976 793.699,401.141 793.699,400.434 822.047,403.266 "/>
<path id="path691" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,404.684 L 822.047,405.391 793.699,402.558 793.699,401.848 822.047,404.684 "/>
<path id="path692" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,406.101 L 822.047,406.808 793.699,403.976 793.699,403.266 822.047,406.101 "/>
<path id="path693" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,407.519 L 822.047,408.226 793.699,405.394 793.699,404.684 822.047,407.519 "/>
<path id="path694" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,408.934 L 822.047,409.644 793.699,406.808 793.699,406.101 822.047,408.934 "/>
<path id="path695" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,410.351 L 822.047,411.062 793.699,408.226 793.699,407.519 822.047,410.351 "/>
<path id="path696" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,411.769 L 822.047,412.48 793.699,409.644 793.699,408.937 822.047,411.769 "/>
<path id="path697" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,413.187 L 822.047,413.894 793.699,411.062 793.699,410.351 822.047,413.187 "/>
<path id="path698" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,414.605 L 822.047,415.312 793.699,412.48 793.699,411.769 822.047,414.605 "/>
<path id="path699" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,416.023 L 822.047,416.73 793.699,413.898 793.699,413.187 822.047,416.023 "/>
<path id="path700" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,417.437 L 822.047,418.148 793.699,415.312 793.699,414.605 822.047,417.437 "/>
<path id="path701" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,418.855 L 822.047,419.566 793.699,416.73 793.699,416.023 822.047,418.855 "/>
<path id="path702" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,420.273 L 822.047,420.984 793.699,418.148 793.699,417.441 822.047,420.273 "/>
<path id="path703" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,421.691 L 822.047,422.398 793.699,419.566 793.699,418.855 822.047,421.691 "/>
<path id="path704" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,423.109 L 822.047,423.816 793.699,420.984 793.699,420.273 822.047,423.109 "/>
<path id="path705" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,427.359 L 822.047,428.305 793.699,425.473 793.699,424.527 822.047,427.363 "/>
<path id="path706" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,429.25 L 822.047,430.195 793.699,427.359 793.699,426.414 822.047,429.25 "/>
<path id="path707" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,431.141 L 822.047,432.086 793.699,429.25 793.699,428.305 822.047,431.141 "/>
<path id="path708" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,433.027 L 822.047,433.973 793.699,431.141 793.699,430.195 822.047,433.027 "/>
<path id="path709" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,434.918 L 822.047,435.863 793.699,433.027 793.699,432.086 822.047,434.918 "/>
<path id="path710" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,436.808 L 822.047,437.754 793.699,434.918 793.699,433.973 822.047,436.808 "/>
<path id="path711" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,438.699 L 822.047,439.644 793.699,436.808 793.699,435.863 822.047,438.699 "/>
<path id="path712" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,440.59 L 822.047,441.531 793.699,438.699 793.699,437.754 822.047,440.59 "/>
<path id="path713" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,442.476 L 822.047,443.422 793.699,440.59 793.699,439.644 822.047,442.476 "/>
<path id="path714" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,444.367 L 822.047,445.312 793.699,442.476 793.699,441.531 822.047,444.367 "/>
<path id="path715" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,446.258 L 822.047,447.199 793.699,444.367 793.699,443.422 822.047,446.258 "/>
<path id="path716" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,448.144 L 822.047,449.09 793.699,446.258 793.699,445.312 822.047,448.148 "/>
<path id="path717" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,450.035 L 822.047,450.98 793.699,448.144 793.699,447.199 822.047,450.035 "/>
<path id="path718" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,451.926 L 822.047,452.871 793.699,450.035 793.699,449.094 822.047,451.926 "/>
<path id="path719" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,453.816 L 822.047,454.762 793.699,451.926 793.699,450.98 822.047,453.816 "/>
<path id="path720" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,455.707 L 822.047,456.648 793.699,453.816 793.699,452.871 822.047,455.707 "/>
<path id="path721" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,457.594 L 822.047,458.539 793.699,455.703 793.699,454.758 822.047,457.594 "/>
<path id="path722" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,459.484 L 822.047,460.43 793.699,457.594 793.699,456.648 822.047,459.484 "/>
<path id="path723" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,461.375 L 822.047,462.316 793.699,459.484 793.699,458.539 822.047,461.371 "/>
<path id="path724" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,463.262 L 822.047,464.207 793.699,461.375 793.699,460.43 822.047,463.262 "/>
<path id="path725" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,467.047 L 822.047,468.465 793.699,465.629 793.699,464.211 822.047,467.047 "/>
<path id="path726" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,469.883 L 822.047,471.297 793.699,468.465 793.699,467.047 822.047,469.883 "/>
<path id="path727" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,472.715 L 822.047,474.133 793.699,471.297 793.699,469.883 822.047,472.715 "/>
<path id="path728" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,475.551 L 822.047,476.969 793.699,474.133 793.699,472.715 822.047,475.551 "/>
<path id="path729" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,478.387 L 822.047,479.801 793.699,476.969 793.699,475.551 822.047,478.387 "/>
<path id="path730" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,481.219 L 822.047,482.637 793.699,479.801 793.699,478.387 822.047,481.219 "/>
<path id="path731" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,484.055 L 822.047,485.473 793.699,482.637 793.699,481.219 822.047,484.055 "/>
<path id="path732" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,486.891 L 822.047,488.305 793.699,485.473 793.699,484.055 822.047,486.891 "/>
<path id="path733" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,489.723 L 822.047,491.141 793.699,488.305 793.699,486.891 822.047,489.723 "/>
<path id="path734" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,492.558 L 822.047,493.976 793.699,491.141 793.699,489.723 822.047,492.558 "/>
<path id="path735" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,495.391 L 822.047,496.808 793.699,493.973 793.699,492.558 822.047,495.391 "/>
<path id="path736" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,498.226 L 822.047,499.644 793.699,496.808 793.699,495.391 822.047,498.226 "/>
<path id="path737" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,501.062 L 822.047,502.48 793.699,499.644 793.699,498.226 822.047,501.062 "/>
<path id="path738" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,506.73 L 822.047,509.566 793.699,506.73 793.699,503.898 822.047,506.73 "/>
<path id="path739" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,512.398 L 822.047,515.234 793.699,512.398 793.699,509.566 822.047,512.398 "/>
<path id="path740" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,518.066 L 822.047,520.902 793.699,518.066 793.699,515.234 822.047,518.066 "/>
<path id="path741" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,523.738 L 822.047,526.57 793.699,523.738 793.699,520.902 822.047,523.738 "/>
<path id="path742" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,529.406 L 822.047,532.242 793.699,529.406 793.699,526.57 822.047,529.406 "/>
<path id="path743" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,535.074 L 822.047,537.91 793.699,535.074 793.699,532.242 822.047,535.074 "/>
<path id="path744" fill-rule="evenodd" stroke="none" fill="rgb(0,0,0)" d="M 822.047,540.746 L 793.699,540.746 793.699,537.91 822.047,540.746 "/>
<path id="path745" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 368.504,546.418 L 368.504,563.426 M 412.598,546.418 L 412.598,563.426 M 456.691,546.418 L 456.691,563.426 M 500.789,546.418 L 500.789,563.426 M 544.883,546.418 L 544.883,563.426 M 588.977,546.418 L 588.977,563.426 M 633.07,546.418 L 633.07,563.426 M 677.164,546.418 L 677.164,563.426 M 721.262,546.418 L 721.262,563.426 "/>
<path id="path746" fill-rule="nonzero" fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" stroke="rgb(255,0,0)" d="M 323.148,146.73 L 306.141,146.73 M 323.148,190.824 L 306.141,190.824 M 323.148,234.918 L 306.141,234.918 M 323.148,279.016 L 306.141,279.016 M 323.148,323.109 L 306.141,323.109 M 323.148,367.199 L 306.141,367.199 M 323.148,411.297 L 306.141,411.297 M 323.148,455.391 L 306.141,455.391 M 323.148,499.484 L 306.141,499.484 "/>
</g></svg>

After

Width:  |  Height:  |  Size: 204 KiB

BIN
apps/imgs/scream.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -0,0 +1,355 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="183.9px" height="181.5px" viewBox="0 0 183.9 181.5" style="enable-background:new 0 0 183.9 181.5;" xml:space="preserve"
>
<style type="text/css">
.st0{fill:#A18E8A;}
.st1{fill:#5B3E3B;}
.st2{fill:#C9BAB8;}
.st3{opacity:0.8;}
.st4{fill:#EB969D;}
.st5{fill:#F9F4EA;}
.st6{fill:#C6AA91;}
.st7{fill:#77787B;}
.st8{fill:#FFFFFF;}
.st9{fill:#E2DED7;}
.st10{fill:#3F3736;}
.st11{fill:#8E1717;}
.st12{fill:#6B0000;}
.st13{fill:#BA5860;}
.st14{fill:#89706E;}
.st15{opacity:0.5;}
.st16{fill:#A5535D;}
.st17{opacity:0.6;fill:#EB969D;enable-background:new ;}
</style>
<g id="Layer_2_1_">
</g>
<path class="st0" d="M95.8,89.3c0,0,17.2-10.5,40.4-12.3c0,0,8.5-4.8,18.7-8.1c0,0,4-4.7,9.4-3.7s4.8,7.5,4.8,7.5s3,1.8,0.7,6.8
c0,0,2.8,4.5-3.2,6.9c-5.9,2.4-11.8-0.6-12.4-4.2c0,0-13.6,15.7-36.1,15.2c0,0,2.4,0.8,3.4,3s-3.8-0.8-3.8-0.8s4.1,2.5,4.4,7
c0.1,1.5-0.8-0.7-2.7-1.9c0,0,2.9,4.7,1.1,9.3l0.3,3.7c0,0,8.3-4.9,15.9,0c7.6,4.9-2.1,27.4-18.6,38.5c0,0,2.4-1.2,4.8,0
c0,0,0.9-2.4,4.4-0.9c0,0,0.4-2.3,3.6-0.9c3.2,1.4,4.8,9.3-3.6,9.6c0,0-0.7,0.7-3,0.4c0,0-2.8,1.1-5.3,0.4c0,0-7.3,0.7-10.6,0.2
c-3.3-0.5-5.6,1.3-7.4-1.4c0,0-1.3,4.7-4.6,4.4c0,0-1.9,2.5-6.1,1.5c0,0-0.6,1.7-5,1.8c-4.4,0-8.9,0.6-7.8-5c0,0-1.1,2.7-3.6,3.9
s-3.3-0.4-3.3-0.4s-1.7,2.6-5.5,1.8c0,0-1.5,2.2-4.8,2.1s-4.4-1.8-4.4-1.8s-1.7,0.2-6.2-0.3c-4.5-0.6-6.3-0.2-6.3-3.6
c0-3.4,1.5-4.3,1.5-4.3s-8.8-6.7-5-27.3S68.2,81.3,95.8,89.3z"/>
<g>
<path class="st1" d="M75,104L75,104c0.2,0.2,0.3,0.3,0.4,0.4c0.3,0.3,0.7,0.8,1.2,1.4c0.2,0.3,0.5,0.7,0.8,1.1
c0.2,0.4,0.5,0.9,0.8,1.3c0.3,0.5,0.6,1,0.9,1.5c0.2,0.6,0.5,1.2,0.8,1.8c0.3,0.6,0.5,1.3,0.8,2c0.2,0.7,0.5,1.4,0.7,2.2
c0.5,1.5,1,3,1.3,4.7s0.8,3.4,1.1,5.1c0.2,1.8,0.5,3.6,0.8,5.4c0.2,1.8,0.4,3.6,0.7,5.3c0.2,1.8,0.4,3.5,0.6,5.2
c0.3,1.7,0.6,3.3,0.8,4.8c0.1,0.8,0.3,1.5,0.5,2.2s0.4,1.4,0.5,2c0.1,0.3,0.2,0.6,0.2,1c0.1,0.3,0.2,0.6,0.3,0.9
c0.2,0.6,0.4,1.1,0.6,1.6s0.4,1,0.6,1.4s0.4,0.8,0.6,1.2c0.5,0.6,0.8,1.2,1.1,1.4c0.3,0.3,0.5,0.4,0.5,0.4s-0.2-0.1-0.5-0.4
c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.2-0.3-0.3c-0.2-0.2-0.4-0.5-0.7-0.8c-0.2-0.3-0.4-0.7-0.7-1.1c-0.2-0.4-0.5-0.9-0.7-1.4
s-0.4-1.1-0.7-1.6c-0.1-0.3-0.2-0.6-0.4-0.9c-0.1-0.3-0.2-0.6-0.3-1c-0.2-0.7-0.4-1.3-0.6-2s-0.4-1.4-0.6-2.2
c-0.3-1.5-0.7-3.1-1-4.8s-0.5-3.4-0.7-5.2s-0.5-3.6-0.7-5.3c-0.2-1.8-0.5-3.6-0.7-5.3c-0.3-1.7-0.7-3.4-1-5.1s-0.8-3.2-1.2-4.7
c-0.2-0.7-0.4-1.5-0.6-2.2c-0.3-0.7-0.5-1.3-0.7-2c-0.2-0.6-0.5-1.2-0.7-1.8c-0.2-0.6-0.5-1.1-0.7-1.6s-0.5-1-0.7-1.4
c-0.3-0.4-0.5-0.8-0.7-1.1c-0.4-0.7-0.8-1.2-1.1-1.5C75.2,104.2,75.1,104.1,75,104L75,104z"/>
</g>
<g>
<g>
<path class="st1" d="M75.9,98.2c0,0-0.2-0.3-0.7-0.7c-0.5-0.4-1.2-1.1-2.4-1.5c-1.1-0.5-2.6-0.7-4.2-0.2c-1.5,0.6-3.1,1.8-4.1,3.6
c-1,1.8-1.5,4-1.9,6.4c-0.3,2.4-0.4,4.9-0.3,7.5c0.2,5.2,1,10.8,2.2,16.2c0.6,2.7,1.3,5.4,2.1,8.1c0.8,2.6,1.8,5.1,2.9,7.5
c1.1,2.3,2.4,4.6,3.6,6.6c1.2,2.1,2.3,4.1,3.2,6c0.9,1.9,1.4,3.9,1.5,5.6c0.2,1.7-0.1,3.2-0.3,4.4c-0.1,1.2,0.5,2.1,1,2.5
c0.5,0.5,0.8,0.6,0.8,0.6s-0.3-0.1-0.8-0.6c-0.5-0.4-1.2-1.3-1.1-2.6c0.1-1.2,0.3-2.7,0.1-4.4c-0.2-1.7-0.7-3.5-1.6-5.4
c-1.8-3.8-4.7-7.8-7-12.5c-1.2-2.4-2.2-4.9-3.1-7.6c-0.8-2.7-1.5-5.4-2.2-8.1c-1.2-5.5-2-11.1-2.1-16.4c-0.1-2.6,0.1-5.2,0.5-7.6
s1-4.7,2.1-6.5c1.1-1.9,2.8-3.1,4.4-3.7c1.7-0.6,3.3-0.2,4.4,0.3s1.9,1.2,2.3,1.7C75.7,97.9,75.9,98.2,75.9,98.2z"/>
</g>
</g>
<g>
<path class="st1" d="M121.2,110.2c0,0,0.2,0.6,0.3,1.5c0,0.5,0,1-0.1,1.6c-0.1,0.3-0.1,0.6-0.2,0.9s-0.2,0.6-0.4,0.9
c-0.1,0.3-0.3,0.6-0.5,0.8c-0.2,0.3-0.4,0.5-0.6,0.7s-0.4,0.4-0.6,0.6s-0.4,0.3-0.6,0.4c-0.4,0.3-0.8,0.4-1,0.5
c-0.3,0.1-0.4,0.1-0.4,0.1s0.1-0.1,0.3-0.3c0.1-0.1,0.2-0.2,0.4-0.3c0.1-0.1,0.3-0.3,0.4-0.4c0.2-0.2,0.3-0.3,0.5-0.5
s0.3-0.4,0.5-0.6c0.3-0.4,0.6-0.9,0.9-1.4s0.5-1,0.6-1.5c0.2-0.5,0.3-1,0.4-1.4C121.1,110.8,121.2,110.2,121.2,110.2z"/>
</g>
<g>
<path class="st1" d="M120.7,115.6c0,0,0.1,0.7,0.3,2.1c0.1,1.3,0.3,3.2,0.3,5.5s-0.1,4.9-0.6,7.7c-0.2,1.4-0.6,2.8-1,4.3
c-0.4,1.4-1,2.9-1.7,4.3l-0.5,1c-0.2,0.4-0.4,0.6-0.6,1c-0.4,0.6-0.8,1.3-1.3,1.9c-0.9,1.2-1.8,2.4-2.8,3.4s-2,1.9-3.1,2.7
c-1,0.8-2.1,1.5-3,2.1c-1,0.6-1.9,1.1-2.8,1.4c-0.8,0.4-1.6,0.7-2.2,0.9c-1.3,0.4-2,0.5-2,0.5s0.7-0.2,1.9-0.7
c0.6-0.3,1.3-0.6,2.1-1c0.4-0.2,0.8-0.4,1.3-0.7c0.4-0.3,0.9-0.5,1.4-0.9c1.9-1.2,3.9-2.9,5.8-5c0.9-1,1.9-2.1,2.7-3.3
c0.4-0.6,0.8-1.2,1.2-1.9c0.2-0.3,0.4-0.6,0.6-0.9l0.5-1c0.7-1.3,1.2-2.7,1.7-4.1c0.4-1.4,0.8-2.8,1-4.2c0.5-2.7,0.8-5.4,0.9-7.6
s0.1-4.1,0.1-5.4C120.8,116.3,120.7,115.6,120.7,115.6z"/>
</g>
<g>
<path class="st1" d="M104.2,153.9c0,0-0.3,0.3-0.8,0.8s-1.1,1.1-1.7,1.8c-0.1,0.2-0.3,0.3-0.4,0.5s-0.3,0.3-0.3,0.5
c-0.1,0.2-0.2,0.3-0.3,0.5c-0.1,0.2-0.2,0.3-0.2,0.5c-0.1,0.2-0.1,0.3-0.2,0.4c0,0.1-0.1,0.3-0.1,0.4c-0.1,0.2-0.1,0.3-0.1,0.3
s0-0.1-0.1-0.3s-0.1-0.5-0.1-0.9c0-0.2,0-0.4,0.1-0.6c0-0.2,0.1-0.4,0.2-0.7c0.2-0.4,0.4-0.9,0.8-1.3c0.3-0.4,0.7-0.7,1.1-1
s0.7-0.5,1.1-0.6C103.7,154,104.2,153.9,104.2,153.9z"/>
</g>
<g>
<path class="st1" d="M85.4,142.5c0,0,0.2,0.7,0.4,1.8c0.1,0.5,0.2,1.2,0.3,1.8c0.1,0.7,0.2,1.4,0.3,2.1c0.1,0.7,0.2,1.4,0.3,2.1
c0.1,0.7,0.2,1.3,0.3,1.8c0,0.3,0.1,0.5,0.1,0.7s0.1,0.4,0.1,0.6c0,0.3,0.1,0.5,0.1,0.5s-0.1-0.2-0.3-0.4c-0.1-0.1-0.2-0.3-0.3-0.5
c-0.1-0.2-0.2-0.4-0.3-0.7c-0.1-0.3-0.2-0.5-0.3-0.8c-0.1-0.3-0.2-0.6-0.3-1c-0.2-0.7-0.3-1.4-0.4-2.1c-0.1-0.7-0.2-1.5-0.2-2.1
c0-0.7-0.1-1.3,0-1.9C85.3,143.2,85.4,142.5,85.4,142.5z"/>
</g>
<g>
<path class="st1" d="M80.4,106.2c0,0,0.1,0.1,0.2,0.4c0.2,0.2,0.3,0.6,0.5,1.1c0.1,0.2,0.2,0.5,0.3,0.8c0.1,0.3,0.2,0.6,0.2,0.9
c0.1,0.3,0.1,0.6,0.2,0.9s0.1,0.6,0.1,1c0,0.3,0,0.7,0,1s-0.1,0.6-0.1,0.9s-0.1,0.6-0.1,0.9s-0.1,0.5-0.2,0.8
c-0.3,1-0.5,1.6-0.5,1.6s-0.1-0.7-0.1-1.6c0-0.2,0-0.5,0-0.8s0-0.6,0-0.9s0-0.6,0-0.9s0-0.6-0.1-0.9c0-0.3,0-0.6-0.1-0.9
c0-0.3-0.1-0.6-0.1-0.9s-0.1-0.6-0.1-0.8c0-0.3-0.1-0.5-0.1-0.8C80.5,106.9,80.4,106.2,80.4,106.2z"/>
</g>
<g>
<path class="st1" d="M43.7,151c0,0-0.2-0.7-0.5-1.9c-0.1-0.6-0.3-1.3-0.4-2.2c-0.1-0.9-0.2-1.8-0.2-2.9c0-1.1,0-2.2,0.1-3.4
s0.2-2.5,0.5-3.8c0.1-0.7,0.3-1.3,0.4-2c0.1-0.7,0.3-1.3,0.6-2c0.2-0.7,0.4-1.3,0.7-2c0.2-0.7,0.5-1.4,0.8-2c0.5-1.3,1.2-2.6,2-3.8
c0.7-1.2,1.5-2.3,2.4-3.3s1.8-1.9,2.8-2.7c0.9-0.8,2-1.4,2.9-1.9c0.5-0.2,1-0.4,1.4-0.6c0.5-0.1,0.9-0.3,1.4-0.3
c0.4-0.1,0.8-0.1,1.2-0.1c0.2,0,0.4,0,0.5,0c0.2,0,0.3,0.1,0.5,0.1c0.3,0.1,0.6,0.2,0.8,0.3c0.1,0.1,0.2,0.1,0.3,0.2
s0.1,0.1,0.2,0.2c0.2,0.2,0.4,0.3,0.4,0.3s-0.1-0.1-0.4-0.3c-0.1,0-0.1-0.1-0.2-0.2c-0.1,0-0.2-0.1-0.3-0.1
c-0.2-0.1-0.5-0.2-0.8-0.2c-0.1,0-0.3-0.1-0.5-0.1s-0.3,0-0.5,0c-0.4,0-0.7,0.1-1.2,0.1c-0.4,0.1-0.8,0.3-1.3,0.4
c-0.4,0.2-0.9,0.4-1.3,0.6c-0.9,0.5-1.8,1.1-2.7,1.9c-0.5,0.4-0.9,0.8-1.3,1.3c-0.4,0.4-0.8,0.9-1.3,1.4c-0.8,1-1.6,2.1-2.3,3.3
c-0.7,1.2-1.3,2.4-1.9,3.7c-0.3,0.6-0.5,1.3-0.8,1.9c-0.3,0.6-0.5,1.3-0.7,1.9c-0.4,1.3-0.8,2.6-1,3.9c-0.3,1.3-0.5,2.5-0.6,3.7
s-0.2,2.3-0.2,3.4c0,1,0,2,0,2.9s0.1,1.6,0.2,2.2C43.5,150.3,43.7,151,43.7,151z"/>
</g>
<g>
<path class="st1" d="M42.9,142.8c0,0-0.1,0.5-0.4,1.2c-0.2,0.7-0.5,1.6-0.7,2.4c0,0.2-0.1,0.4-0.1,0.7s-0.1,0.4-0.1,0.6
c0,0.2-0.1,0.4-0.1,0.6c0,0.2-0.1,0.4-0.1,0.6c0,0.3,0,0.6,0,0.9c0,0.2,0,0.3,0,0.3s-0.3-0.4-0.5-1.1c-0.1-0.2-0.1-0.4-0.1-0.6
c0-0.2-0.1-0.4-0.1-0.7c0-0.5,0.1-1,0.2-1.5c0.1-0.5,0.3-1,0.5-1.4s0.4-0.8,0.7-1.1C42.4,143.1,42.9,142.8,42.9,142.8z"/>
</g>
<g>
<path class="st1" d="M129.9,123.3c0,0-0.9,0.5-2.1,1.5c-0.6,0.5-1.3,1-2,1.7c-0.4,0.3-0.7,0.7-1,1c-0.4,0.3-0.7,0.7-1,1.1
c-0.3,0.4-0.6,0.8-1,1.1c-0.3,0.4-0.6,0.8-0.9,1.2s-0.5,0.8-0.8,1.1c-0.3,0.4-0.5,0.7-0.7,1s-0.4,0.6-0.6,0.9
c-0.2,0.3-0.3,0.5-0.4,0.7c-0.2,0.4-0.4,0.6-0.4,0.6s0.1-0.2,0.2-0.7c0.1-0.4,0.3-1.1,0.6-1.8c0.2-0.4,0.3-0.8,0.5-1.1
c0.2-0.4,0.4-0.8,0.7-1.2c0.3-0.4,0.5-0.8,0.8-1.2s0.6-0.8,1-1.2c0.4-0.4,0.7-0.8,1.1-1.1c0.4-0.4,0.8-0.7,1.1-1
c0.8-0.6,1.5-1.1,2.2-1.5s1.3-0.6,1.7-0.8C129.6,123.4,129.9,123.3,129.9,123.3z"/>
</g>
<g>
<path class="st1" d="M43.7,162.1c0,0,0.6,0.6,1.5,1.3c0.4,0.4,1,0.7,1.6,1.1c0.6,0.4,1.2,0.8,1.9,1c0.3,0.2,0.7,0.3,1,0.4
c0.3,0.1,0.7,0.2,1,0.3s0.7,0.2,1,0.2c0.3,0.1,0.6,0.1,0.9,0.2c0.3,0,0.5,0.1,0.8,0.1c0.2,0,0.4,0,0.6,0.1c0.3,0,0.5,0.1,0.5,0.1
S54.3,167,54,167c-0.2,0-0.4,0.1-0.6,0.1c-0.2,0.1-0.5,0-0.8,0.1c-0.3,0-0.6,0-1,0c-0.3,0-0.7,0-1.1-0.1c-0.4-0.1-0.8-0.1-1.1-0.3
c-0.4-0.1-0.8-0.2-1.1-0.4c-0.4-0.2-0.7-0.4-1.1-0.6c-0.4-0.2-0.7-0.4-1-0.7c-0.6-0.5-1.1-1-1.5-1.4
C44,162.9,43.7,162.1,43.7,162.1z"/>
</g>
<g>
<path class="st1" d="M57,172.7c0,0-0.1-0.1-0.4-0.2c-0.2-0.2-0.6-0.5-0.9-0.9c-0.1-0.1-0.2-0.2-0.3-0.3s-0.1-0.3-0.2-0.4
c-0.1-0.3-0.3-0.6-0.4-1c-0.1-0.4-0.3-0.7-0.3-1.2c-0.1-0.4-0.1-0.9-0.2-1.3c0-0.5,0-1,0-1.5c0-0.3,0-0.5,0-0.8s0.1-0.5,0.1-0.8
c0.2-1.1,0.4-2.2,1-3.3c0.5-1.1,1.1-2.1,2-3s2.1-1.7,3.5-1.8s2.7,0.7,3.6,1.7c0.2,0.2,0.4,0.4,0.6,0.7s0.4,0.5,0.5,0.8
c0.3,0.5,0.5,1.1,0.7,1.7c0.8,2.2,0.8,4.5,0.6,6.3c-0.1,0.5-0.2,0.9-0.3,1.3c-0.1,0.4-0.2,0.8-0.4,1.1c-0.3,0.7-0.6,1.3-1,1.7
c-0.2,0.2-0.3,0.4-0.5,0.6c-0.1,0.1-0.3,0.3-0.4,0.3c-0.2,0.2-0.3,0.3-0.3,0.3s0.1-0.1,0.3-0.3c0.1-0.1,0.2-0.2,0.3-0.4
c0.1-0.2,0.2-0.4,0.4-0.6c0.3-0.4,0.6-1,0.8-1.7c0.2-0.7,0.4-1.5,0.5-2.4s0.1-1.9-0.1-2.9c-0.1-1-0.4-2.1-0.8-3.1
c-0.2-0.5-0.4-1-0.7-1.5c-0.1-0.3-0.3-0.5-0.5-0.7c-0.1-0.2-0.3-0.4-0.5-0.7c-0.7-0.8-1.7-1.4-2.8-1.3c-1.1,0.1-2.1,0.7-2.8,1.5
c-0.8,0.8-1.4,1.7-1.9,2.7s-0.8,2-1,3c0,0.3-0.1,0.5-0.1,0.8c0,0.2,0,0.5-0.1,0.7c0,0.5-0.1,0.9-0.1,1.4c0,0.4,0.1,0.9,0.1,1.3
c0,0.4,0.2,0.8,0.2,1.1c0.1,0.4,0.2,0.7,0.3,1c0.1,0.1,0.1,0.3,0.2,0.4c0.1,0.1,0.1,0.2,0.2,0.4c0.3,0.5,0.5,0.8,0.7,1
C56.8,172.7,57,172.7,57,172.7z"/>
</g>
<g>
<path class="st1" d="M63,157.5c0,0,0.2-0.3,0.8-0.8c0.5-0.4,1.4-1,2.6-1.4c0.6-0.1,1.3-0.3,2-0.2c0.7,0,1.5,0.2,2.2,0.5
c0.2,0.1,0.3,0.1,0.6,0.3l0.5,0.3c0.2,0.1,0.3,0.2,0.5,0.4l0.5,0.5c0.5,0.7,0.8,1.5,1,2.3c0.1,0.4,0.2,0.8,0.2,1.2
c0.1,0.4,0.1,0.8,0.1,1.2s0,0.8,0,1.2s-0.1,0.8-0.1,1.2c-0.1,0.8-0.3,1.5-0.6,2.1c-0.2,0.7-0.5,1.3-0.8,1.8s-0.6,1-1,1.4
c-0.3,0.4-0.7,0.6-0.9,0.9c-0.3,0.2-0.5,0.3-0.7,0.4c-0.2,0.1-0.2,0.1-0.2,0.1s0.1-0.1,0.2-0.2c0.1-0.1,0.4-0.3,0.6-0.5
c0.2-0.3,0.5-0.5,0.8-1c0.3-0.4,0.5-0.9,0.8-1.4c0.2-0.5,0.4-1.1,0.6-1.8c0.2-0.6,0.3-1.3,0.4-2c0.1-0.4,0.1-0.7,0.1-1.1
c0-0.4,0-0.7,0-1.1c0-0.4,0-0.7-0.1-1.1c0-0.4-0.1-0.7-0.2-1.1c-0.2-0.7-0.5-1.4-0.9-2l-0.3-0.4c-0.1-0.1-0.2-0.3-0.4-0.4l-0.5-0.3
c-0.1-0.1-0.3-0.1-0.4-0.2c-0.6-0.3-1.3-0.5-1.9-0.6s-1.2,0-1.8,0c-0.6,0.1-1.1,0.3-1.5,0.4c-0.4,0.2-0.8,0.4-1.1,0.5
C63.3,157.2,63,157.5,63,157.5z"/>
</g>
<g>
<path class="st1" d="M72.4,157.8c0,0,0.2-0.4,0.8-0.6c0.1-0.1,0.3-0.1,0.5-0.2c0.2,0,0.4-0.1,0.6-0.1s0.4,0,0.7,0.1
c0.2,0.1,0.4,0.2,0.6,0.3s0.4,0.3,0.5,0.4c0.2,0.2,0.3,0.3,0.4,0.5c0.2,0.3,0.4,0.7,0.4,1c0.1,0.3,0.1,0.6,0.1,0.7
c0,0.2,0,0.3,0,0.3s-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.3-0.4-0.5c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.2-0.3-0.3
c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.2-0.4-0.3s-0.3-0.2-0.4-0.2c-0.1-0.1-0.3-0.1-0.4-0.1c-0.3-0.1-0.6-0.1-0.9-0.1
C72.8,157.7,72.4,157.8,72.4,157.8z"/>
</g>
<g>
<path class="st1" d="M72,150.3c0,0,0.3,0.3,0.4,0.9c0.1,0.3,0.1,0.7,0.1,1c0,0.4,0,0.8-0.1,1.2c-0.1,0.2-0.1,0.4-0.2,0.6
c-0.1,0.2-0.2,0.4-0.2,0.5c-0.2,0.3-0.3,0.7-0.5,0.9c-0.4,0.5-0.7,0.7-0.7,0.7s0-0.4,0.2-1c0.1-0.3,0.2-0.6,0.2-0.9
c0.1-0.3,0.2-0.7,0.3-1c0-0.2,0.1-0.3,0.1-0.5s0.1-0.3,0.1-0.5c0.1-0.3,0.1-0.7,0.2-0.9C72,150.8,72,150.3,72,150.3z"/>
</g>
<g>
<path class="st1" d="M81.9,164c0,0,0-0.4,0.2-1s0.5-1.5,1.1-2.4c0.3-0.5,0.7-1,1.2-1.4s1.1-0.8,1.9-1c0.2-0.1,0.4-0.1,0.6-0.1h0.3
h0.1h0.1h0.1c0.1,0,0.4,0.1,0.6,0.1c0.2,0.1,0.4,0.1,0.6,0.3c0.7,0.4,1.2,1,1.6,1.7c0.8,1.3,1.2,2.8,1.4,4.1
c0.2,1.4,0.1,2.7-0.2,3.8c-0.3,1.1-0.9,1.9-1.4,2.2c-0.3,0.2-0.5,0.3-0.7,0.3s-0.2,0.1-0.2,0.1s0.1,0,0.2-0.1s0.3-0.2,0.6-0.4
c0.4-0.4,0.8-1.2,1-2.2s0.1-2.2-0.1-3.5s-0.7-2.6-1.4-3.7c-0.3-0.6-0.8-1.1-1.3-1.4c-0.1-0.1-0.3-0.1-0.4-0.2
c-0.1,0-0.2-0.1-0.4-0.1c-0.3,0-0.6,0-0.9,0.1c-0.6,0.1-1.1,0.4-1.6,0.7s-0.8,0.7-1.2,1.1c-0.6,0.8-1.1,1.6-1.3,2.2
C82.1,163.7,81.9,164,81.9,164z"/>
</g>
<g>
<path class="st1" d="M89.2,159.6c0,0,0.1-0.3,0.5-0.7c0.2-0.2,0.4-0.4,0.8-0.6c0.2-0.1,0.3-0.2,0.5-0.3s0.4-0.2,0.6-0.2
c0.2-0.1,0.5-0.1,0.7-0.2c0.3,0,0.5,0,0.8-0.1c0.2,0,0.2,0,0.4,0c0.1,0,0.3,0,0.4,0.1c0.4,0.1,0.6,0.2,0.9,0.4
c1.1,0.7,1.9,1.8,2.5,2.9c0.6,1.2,0.9,2.4,0.9,3.6c0,1.2-0.3,2.4-0.9,3.2c-0.3,0.4-0.6,0.7-0.9,0.9s-0.6,0.4-0.9,0.5
c-0.2,0.1-0.5,0.2-0.6,0.2s-0.2,0.1-0.2,0.1s0.1,0,0.2-0.1s0.3-0.2,0.5-0.3s0.5-0.3,0.7-0.6c0.3-0.2,0.5-0.6,0.7-1
c0.4-0.8,0.6-1.8,0.5-2.8c-0.1-1.1-0.4-2.2-0.9-3.2c-0.2-0.5-0.5-1-0.9-1.5c-0.3-0.4-0.7-0.9-1.1-1.1c-0.2-0.1-0.4-0.3-0.6-0.3
c-0.1,0-0.2-0.1-0.4-0.1h-0.3c-0.3,0-0.5,0-0.7,0s-0.5,0.1-0.7,0.1s-0.4,0.1-0.6,0.1c-0.2,0.1-0.4,0.1-0.5,0.2
c-0.3,0.1-0.6,0.3-0.8,0.4C89.3,159.4,89.2,159.6,89.2,159.6z"/>
</g>
<g>
<path class="st1" d="M93.5,157.9c0,0,0.1-0.2,0.5-0.5c0.3-0.3,0.9-0.6,1.6-0.7c0.4-0.1,0.8,0,1.2,0c0.4,0.1,0.9,0.2,1.3,0.5
c0.4,0.2,0.8,0.5,1.2,0.8l0.5,0.5l0.5,0.6c0.3,0.4,0.5,0.9,0.7,1.3c0.2,0.5,0.3,0.9,0.4,1.4s0.1,0.9,0,1.4c0,0.4-0.1,0.8-0.3,1.2
c-0.1,0.4-0.3,0.7-0.4,0.9c-0.2,0.3-0.3,0.5-0.5,0.6c-0.3,0.3-0.5,0.4-0.5,0.4s0.2-0.2,0.3-0.5c0.1-0.2,0.2-0.4,0.3-0.7
c0.1-0.3,0.2-0.6,0.2-0.9c0-0.3,0.1-0.7,0.1-1.1c0-0.4-0.1-0.8-0.1-1.2c-0.1-0.4-0.2-0.8-0.4-1.2c-0.2-0.4-0.4-0.8-0.6-1.1
l-0.4-0.5l-0.5-0.5c-0.3-0.3-0.6-0.6-1-0.8c-0.3-0.2-0.7-0.4-1-0.5s-0.7-0.2-1-0.2c-0.7,0-1.2,0.1-1.6,0.3
C93.7,157.7,93.5,157.9,93.5,157.9z"/>
</g>
<g>
<path class="st1" d="M111.6,95.3c0,0,0.7-0.1,1.8,0.1c0.5,0.1,1.1,0.2,1.8,0.3c0.6,0.2,1.3,0.4,2,0.6c0.3,0.1,0.6,0.3,1,0.4
c0.3,0.2,0.6,0.4,0.9,0.5c0.6,0.4,1,0.8,1.4,1.2c0.2,0.2,0.3,0.4,0.5,0.6c0.1,0.2,0.2,0.3,0.3,0.5c0.1,0.3,0.2,0.4,0.2,0.4
s-0.1-0.1-0.4-0.3c-0.2-0.2-0.6-0.4-1-0.7c-0.2-0.1-0.5-0.3-0.7-0.4c-0.3-0.1-0.5-0.3-0.8-0.4c-0.6-0.3-1.2-0.6-1.8-0.8
c-0.6-0.3-1.2-0.5-1.8-0.7c-0.6-0.2-1.2-0.4-1.6-0.6C112.3,95.6,111.6,95.3,111.6,95.3z"/>
</g>
<path class="st2" d="M115.8,128.1c-0.1-0.2-0.1-0.5-0.1-0.7c-0.2,0.4-0.9,3.1-1.6,2.7c-0.4-0.2-0.3-1.1-0.3-1.1s-1.1,2.9-2.1,3.7
c-0.5,0.4-0.6-0.5-0.6-0.5c-0.6,2-2.8,4.4-3,4c-0.3-0.4,0-1.2,0-1.2c-0.7,2.4-3.1,3.8-2.7,2.9c0.3-0.9,0.4-1.3,0.4-1.3
c-1,0.9-1.6,0.1-1.6,0.1s0.6,1.3-0.7,1.1c-2.9-0.4-4.2-3.5-4.2-3.5s0.9,2.1-1,1.1c-2.4-1.3-4.3-4.2-4.3-4.2s0.4,1.9-1.1,0.9
c-2.2-1.4-3.1-4-3.1-4s1.1,2.8-0.9,1.6s-2.6-5.9-2.6-5.9s0,6-1.8-1.6c-1.8-7.7,3-14.9,0.4-12.8s-1.7-0.7,1.3-5.4c0,0,0.2-0.1-1,0
s2.4-4.4,5.9-4.6c2.8-0.1,3.6-0.5,2.2-0.7s0.6-1.9,6.7-1c0,0,2.5-2.2,6.9-2.2c4.4,0.1,1.2,0.9,1.2,0.9s2.7,0.2,4.8,0.8
c0.3,0.4,1,0.6,1.4,0.9c0.5,0.3,0.9,0.7,1.3,1.2c0.8,0.9,1.7,2,2.3,3.1c-0.4-0.2-1.6-1-2.1-0.6c-0.4,0.4,0.5,1.1,0.8,1.3
c1,1,1.8,2.6,2.3,4.1c0.3,0.8,0.4,1.8,0.5,2.7c-0.5-0.7-1.1-1.5-1.8-1.9c-1.1-0.6-0.2,1.1-0.2,1.5c0.7,3.6-0.3,7.9-1.4,9.3
c-1,1.4,0.2,0.7,1,0.2s0.2,2.8-0.6,3.8C116.4,122.6,117.2,126,115.8,128.1z"/>
<g class="st3">
<path class="st0" d="M81.9,164c0,0-1.9,0.3-2.6-3.5c-0.6-3.8-3.1-6.9-8.7-17.1c-5.6-10.2-8.6-24.1-8.5-36.3c0,0-1.7,26.8,10,43
c0,0,0.2,4.2-1.2,5.8c0,0,1.2,0.9,1.7,1.6c4.3-1.6,5.7,6.2,4.9,9l0,0c-1,5.5,3.5,4.9,7.8,4.9c0.7,0,1.4-0.1,1.9-0.2
C87.3,171.2,80.5,171.6,81.9,164z"/>
</g>
<path class="st0" d="M67.3,24.3c0,0-8-11-15.3-10.6c-4.5,0.3-7.9,19.4-7.7,27.8c0,0-2.4,2.2-3.4,7.7s-7.2,11.9-11.1,6.4
c0,0-0.9,7.8,6.4,7.5c0,0-4.6,8.3,1.4,14.9c0,0,0.3-1.9,1.2-4.7c0,0-0.2,8.4,5,11.9c0,0-0.2-1.9-0.2-4.5c0,0,0,4.2,4,5.6
c0,0-1.1-1.9-1-5.4c0,0,4.4,9.5,20,12.3c14.9,2.7,27-2,27-2s3.8,2,8.9-0.1c5.2-2.2,7.3-9.2,7.3-9.2s14.4-8.9,17-19
c2.3-9.3,0.6-12.3,0.6-12.3s2.9,2,3.4,6.3c0,0,3.2-5.6-2-9.8c0,0,2.9-1.9,5.5-0.7c0,0-1-3.5-5.5-3.3c0,0,2.6-1.2,1.2-6.2
c0,0-1.6,5.8-5.3,4.6c-2.4-0.7-6-5.6-6-5.6c6.4-14.4,2.6-26,0.5-27.9c-2-2-16.3,2-23.6,11.5c0,0-3.5-1.3-6.1,0.4
c0,0,0.2-3.2,3.5-4.8c0,0-7.3-2.7-13.6,4.5c0,0,2.2-5.3-1.9-8.9C77.5,10.9,77.6,21.7,67.3,24.3z"/>
<path class="st4" d="M54.2,19.3c0,0-5.4,6.9-2.9,19.3c0,0,9,0.6,13.1-6.8C64.3,31.8,62.5,25.6,54.2,19.3z"/>
<path class="st4" d="M105.3,24c0,0,5.4,3.4,9.1,6.9c0,0,3.9-8.9,0.4-17C114.8,13.8,109.5,14.8,105.3,24z"/>
<g>
<path class="st5" d="M75.2,68.8c5.6,0,9.4-4.9,8.6-12.7c-0.7-6.5-4.5-13.6-8.6-13.6s-7.9,7.1-8.6,13.6
C65.8,63.9,69.6,68.8,75.2,68.8z"/>
<g>
<path class="st6" d="M75.3,69c2,0,3.9-0.6,5.5-1.9s2.7-3.3,3.2-5.3c0.7-2.7,0.5-5.5-0.1-8.2c-0.6-2.8-1.6-5.5-3.3-7.8
c-1.2-1.7-2.8-3.3-4.9-3.5s-3.8,0.9-5.1,2.4c-1.8,2-2.9,4.6-3.7,7.2c-0.8,2.7-1.2,5.6-0.8,8.5c0.3,2.4,1.3,4.7,3,6.3
C70.8,68.3,73,69,75.3,69c0.1,0,0.4,0,0.4-0.2s-0.5-0.2-0.6-0.2c-4.1,0-6.9-3.3-7.8-7.1c-0.5-2.4-0.4-5,0.1-7.4
c0.5-2.6,1.4-5.1,2.8-7.4c1-1.6,2.5-3.5,4.5-4c1.9-0.4,3.7,1.4,4.7,2.8c1.5,2,2.5,4.4,3.2,6.8c0.7,2.5,1,5.1,0.7,7.7
c-0.3,2.3-1.1,4.5-2.7,6.2c-1.5,1.5-3.4,2.3-5.6,2.4c-0.1,0-0.4,0-0.4,0.2C74.7,69,75.2,69,75.3,69z"/>
</g>
</g>
<g>
<path d="M77.5,66.5c3.1,0,5.6-3.4,5.6-7.5s-2.5-7.5-5.6-7.5S72,54.9,72,59.1C72,63.2,74.5,66.5,77.5,66.5z"/>
<path class="st7" d="M77.9,66.2c2.7,0,4.9-2.9,4.9-6.6c0-3.6-2.2-6.6-4.9-6.6c-2.7,0-4.9,2.9-4.9,6.6C73,63.3,75.2,66.2,77.9,66.2z
"/>
<path d="M79.8,63.6c1.6,0,2.9-1.7,2.9-3.9c0-2.1-1.3-3.9-2.9-3.9s-2.9,1.7-2.9,3.9C76.9,61.9,78.2,63.6,79.8,63.6z"/>
<path class="st8" d="M76.2,57.6c0.8,0.5,1.9,0.2,2.6-0.8c0.6-1,0.6-2.2-0.2-2.7c-0.8-0.5-1.9-0.2-2.6,0.8
C75.3,55.9,75.4,57.1,76.2,57.6z"/>
<path class="st8" d="M77,60.9c0.5,0,1-0.5,1-1.2s-0.4-1.2-1-1.2c-0.5,0-1,0.5-1,1.2S76.4,60.9,77,60.9z"/>
</g>
<g>
<path class="st9" d="M83.8,56.2c-0.7-6.5-4.5-13.6-8.6-13.6s-7.9,7.1-8.6,13.6c-0.8,7.8,3,12.7,8.6,12.7
C80.8,68.8,84.6,63.9,83.8,56.2z M74.1,64.9c-4.5,0-7.6-4-7-10.3c0.5-5.3,3.6-11,7-11c3.3,0,6.4,5.7,7,11
C81.7,60.9,78.7,64.9,74.1,64.9z"/>
</g>
<g>
<g>
<path class="st5" d="M112.2,54.2c4.2-2.4,4.9-7.6,1-13c-3.3-4.6-9.1-8.2-12.1-6.5c-3.1,1.7-2.9,8.6-0.6,13.8
C103.2,54.5,108.1,56.6,112.2,54.2z"/>
<g>
<path class="st6" d="M112.6,54.3c1.7-1,3-2.6,3.4-4.5c0.5-2.2,0-4.5-1-6.5c-1.1-2.2-2.7-4.2-4.6-5.8c-1.6-1.4-3.4-2.6-5.4-3.2
c-1.5-0.4-3.2-0.6-4.6,0.3c-1.4,0.9-1.9,2.6-2.1,4.2c-0.3,2.2,0,4.4,0.5,6.5c0.6,2.2,1.5,4.4,2.9,6.3c1.3,1.7,3,3,5.1,3.5
S110.9,55.3,112.6,54.3c0.3-0.2-0.6-0.4-0.8-0.3c-1.4,0.8-3,1.1-4.6,0.7c-1.7-0.5-3.2-1.7-4.2-3c-2.5-3.1-3.8-7.5-3.6-11.5
c0-1.6,0.3-3.3,1.3-4.6c1-1.2,2.4-1.4,3.8-1c1.8,0.5,3.5,1.6,5,2.9c1.7,1.4,3.2,3.1,4.3,5c1.1,2,1.9,4.3,1.5,6.7
c-0.3,2.1-1.6,3.8-3.4,4.9C111.5,54.2,112.4,54.5,112.6,54.3z"/>
</g>
</g>
<g>
<path d="M112.4,52.5c2.5-0.9,3.5-4.3,2.3-7.6s-4.2-5.3-6.7-4.4c-2.5,0.9-3.5,4.3-2.3,7.6C106.9,51.4,109.9,53.4,112.4,52.5z"/>
<path class="st7" d="M112.6,52.1c2.2-0.8,3.1-3.8,2-6.7s-3.7-4.6-5.8-3.8c-2.2,0.8-3.1,3.8-2,6.7
C107.8,51.2,110.5,52.9,112.6,52.1z"/>
<path d="M113.5,50.2c1.3-0.5,1.8-2.2,1.2-3.9c-0.6-1.7-2.2-2.7-3.4-2.3c-1.3,0.5-1.8,2.2-1.2,3.9
C110.7,49.7,112.2,50.7,113.5,50.2z"/>
<path class="st8" d="M108.8,46.5c0.8,0.2,1.6-0.4,1.8-1.4c0.2-1-0.2-1.9-1-2.1c-0.8-0.2-1.6,0.4-1.8,1.4
C107.6,45.3,108,46.3,108.8,46.5z"/>
<path class="st8" d="M110.4,48.9c0.4-0.2,0.6-0.7,0.4-1.2s-0.7-0.8-1.1-0.7c-0.4,0.2-0.6,0.7-0.4,1.2
C109.5,48.8,110,49.1,110.4,48.9z"/>
</g>
<g>
<path class="st9" d="M113.3,41.1c-3.3-4.6-9.1-8.2-12.1-6.5c-3.1,1.7-2.9,8.6-0.6,13.8c2.7,6.1,7.6,8.2,11.7,5.8
C116.4,51.8,117.1,46.6,113.3,41.1z M109.8,51.7c-3.4,1.9-7.3,0.2-9.5-4.7c-1.8-4.2-2-9.7,0.5-11.1s7.2,1.6,9.8,5.3
C113.7,45.5,113.2,49.7,109.8,51.7z"/>
</g>
</g>
<path class="st10" d="M70,42.5c0,0,0.8-3.6,4.6-3.8c3.8-0.2,3,3.6,0.9,2.8C73.4,40.6,71.3,41.3,70,42.5z"/>
<path class="st10" d="M102.7,32.1c0,0-3-2.1-5.9,0.4s0.3,4.7,1.3,2.6C99,33.1,101,32.1,102.7,32.1z"/>
<g>
<g>
<path class="st11" d="M104.3,73.6c-0.7,2.4-2.2,5-4.3,7.2c1.9,0.2,3.8,1.2,4.9,3.7c1.1-2.7,1.8-6.5,4.3-9.7
C106.4,74.8,104.3,73.6,104.3,73.6z"/>
<g>
<path class="st12" d="M103.8,73.6c-0.8,2.7-2.3,5.1-4.2,7.2c-0.1,0.2,0.1,0.2,0.2,0.3c2.2,0.3,3.8,1.6,4.7,3.6
c0.1,0.2,0.9,0.1,1-0.1c0.6-1.5,1.1-3.1,1.7-4.7c0.7-1.8,1.5-3.5,2.6-5c0.1-0.2-0.3-0.2-0.4-0.2c-1.6,0-3.2-0.4-4.6-1.2
c-0.2-0.1-0.5-0.1-0.7,0c-0.1,0-0.4,0.2-0.2,0.3c1.6,0.9,3.4,1.2,5.2,1.3c-0.1-0.1-0.2-0.1-0.4-0.2c-1.1,1.5-2,3.2-2.6,5
c-0.6,1.5-1,3.1-1.7,4.7c0.3,0,0.6-0.1,1-0.1c-0.9-2.2-2.8-3.5-5.1-3.8c0.1,0.1,0.1,0.2,0.2,0.3c2-2.1,3.6-4.5,4.3-7.3
C104.9,73.4,103.9,73.4,103.8,73.6z"/>
</g>
</g>
<g>
<path class="st13" d="M100,80.9c-0.8,0.8-1.6,1.5-2.5,2.2c0.5,2.6,1.7,6.1,4.6,4.9c1.4-0.6,2.2-1.8,2.9-3.4
C103.9,82,101.9,81.1,100,80.9z"/>
<g>
<path class="st12" d="M99.5,80.8c-0.8,0.8-1.6,1.5-2.5,2.2c0,0-0.1,0-0.1,0.1c0.4,2.2,1.3,5.4,4,5.4c1.4,0,2.7-0.9,3.5-2
c0.2-0.3,0.4-0.6,0.6-0.9c0.1-0.3,0.5-0.8,0.3-1.1c-0.3-0.7-0.7-1.4-1.3-1.9c-1.1-1.1-2.5-1.7-4-1.9
C99.9,80.6,99.5,80.6,99.5,80.8c0,0.2,0.3,0.3,0.5,0.3c1.2,0.2,2.4,0.7,3.2,1.6c0.2,0.3,0.5,0.5,0.6,0.8c0.2,0.3,0.6,0.8,0.4,1.2
c-0.2,0.7-0.7,1.4-1.1,1.9c-0.6,0.7-1.9,1.8-2.9,1.2c-1-0.6-1.4-1.8-1.8-2.8c-0.1-0.4-0.2-0.7-0.3-1.1c0-0.2-0.1-0.3-0.1-0.5
s0-0.2,0.2-0.4c0.8-0.6,1.5-1.3,2.2-2C100.7,80.8,99.7,80.5,99.5,80.8z"/>
</g>
</g>
</g>
<g>
<g>
<path class="st2" d="M92.5,58.8C75.9,67,75.7,83.5,85.4,85.7c9.6,2.2,17.2-5.8,18.9-12c0,0,8.1,4.5,13.3-3.7
C122.7,61.6,108.6,50.9,92.5,58.8z"/>
<g>
<path class="st14" d="M92.1,58.7c-4.3,2.1-8.2,5.1-10.9,9.2c-1.9,2.9-3.2,6.5-2.8,10c0.3,2.8,1.7,5.5,4.2,7
c1.6,1,3.6,1.3,5.5,1.3c2.4,0.1,4.9-0.5,7.1-1.5c4.5-2.1,8.3-6.3,9.6-11.1c-0.3,0.1-0.6,0.1-0.9,0.2c1.6,0.9,3.6,1.3,5.5,1.3
c3.8,0,7.2-2.3,9-5.7c1.4-2.7,0.8-5.7-1.1-8c-2.2-2.8-5.8-4.5-9.3-5.1C102.6,55.2,97,56.3,92.1,58.7c-0.2,0.1-0.1,0.2,0,0.3
c0.2,0.1,0.5,0,0.7-0.1c4.2-2.1,8.9-3.1,13.6-2.5c3.4,0.5,6.9,1.9,9.3,4.4c1.8,1.9,3,4.6,2.2,7.3c-0.5,1.7-1.7,3.3-3,4.4
s-2.8,1.9-4.5,2c-1.9,0.2-4-0.2-5.7-1.1c-0.2-0.1-0.8-0.1-0.9,0.2c-1.1,4.1-4.1,7.7-7.6,10c-2,1.3-4.3,2.1-6.6,2.2
c-2,0.1-4.1-0.1-5.9-1.1c-2.4-1.3-3.8-3.8-4.2-6.4C79,75,80,71.7,81.6,68.9c2.5-4.4,6.7-7.7,11.2-10c0.2-0.1,0.1-0.2,0-0.3
C92.6,58.6,92.3,58.7,92.1,58.7z"/>
</g>
</g>
<g>
<path class="st14" d="M104,67.5c0,0,0.4,0.6,0.7,1.6c0.2,0.5,0.3,1.1,0.3,1.8c0,0.7,0,1.4-0.1,2.1c0,0.4-0.2,0.7-0.2,1.1
c-0.1,0.3-0.2,0.7-0.4,1c-0.1,0.3-0.3,0.6-0.4,0.9s-0.3,0.5-0.5,0.7c-0.3,0.5-0.6,0.8-0.8,1c-0.2,0.2-0.3,0.3-0.3,0.3
s0.1-0.2,0.2-0.5c0.1-0.1,0.1-0.3,0.2-0.5s0.2-0.4,0.3-0.7c0.1-0.2,0.2-0.5,0.3-0.8c0.1-0.3,0.2-0.6,0.3-0.9
c0.1-0.3,0.2-0.6,0.3-0.9c0.1-0.3,0.2-0.6,0.2-1c0.1-0.7,0.2-1.3,0.2-2c0-0.6,0-1.2,0-1.7C104.1,68.2,104,67.5,104,67.5z"/>
</g>
<g>
<path class="st14" d="M82.3,75.4c0,0-0.3,0.6-0.6,1.4c-0.2,0.4-0.3,0.9-0.5,1.4c-0.1,0.2-0.1,0.5-0.2,0.8s-0.1,0.5-0.1,0.8
s-0.1,0.5,0,0.8c0,0.3,0,0.5,0.1,0.8c0,0.3,0.1,0.5,0.2,0.7s0.1,0.4,0.2,0.6s0.2,0.4,0.2,0.5c0.1,0.2,0.2,0.3,0.2,0.4
C81.9,83.8,82,84,82,84s-0.1-0.1-0.3-0.2c-0.2-0.2-0.5-0.4-0.8-0.8c-0.1-0.1-0.2-0.2-0.2-0.3c-0.1-0.1-0.1-0.2-0.2-0.4
c-0.1-0.2-0.3-0.5-0.3-0.8c-0.1-0.3-0.2-0.6-0.2-0.9c-0.1-0.3,0-0.6,0-1c0.1-0.6,0.2-1.3,0.5-1.8c0.2-0.5,0.5-1,0.8-1.4
C81.8,75.8,82.3,75.4,82.3,75.4z"/>
</g>
<g>
<path class="st14" d="M109.6,58.8c0,0,0.6-0.3,1.7-0.4c0.3,0,0.5,0,0.8,0s0.6,0,1,0.1c0.3,0.1,0.7,0.1,1,0.3
c0.3,0.1,0.7,0.3,1,0.4c0.3,0.2,0.6,0.4,0.9,0.6c0.3,0.2,0.5,0.5,0.7,0.7s0.4,0.5,0.6,0.8c0.2,0.2,0.3,0.5,0.4,0.8
c0.2,0.5,0.3,0.9,0.4,1.2s0.1,0.5,0.1,0.5s-0.1-0.1-0.3-0.4c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.2-0.3-0.3-0.4-0.5
c-0.2-0.2-0.3-0.4-0.5-0.6c-0.2-0.2-0.4-0.4-0.6-0.6c-0.2-0.2-0.4-0.4-0.7-0.6c-0.3-0.2-0.5-0.4-0.8-0.5c-0.3-0.2-0.5-0.3-0.8-0.4
c-0.3-0.1-0.6-0.2-0.9-0.3s-0.6-0.2-0.8-0.2c-0.3-0.1-0.5-0.1-0.8-0.1C110.3,58.8,109.6,58.8,109.6,58.8z"/>
</g>
<g class="st15">
<g>
<path class="st2" d="M92.5,58.8C75.9,67,75.7,83.5,85.4,85.7c9.6,2.2,17.2-5.8,18.9-12c0,0,8.1,4.5,13.3-3.7
C122.7,61.6,108.6,50.9,92.5,58.8z M96.8,79.3c-4.9,5.5-13.2,4.2-13.7,0s2.6-7.8-0.1-5.3s-2.4-5.9,5.5-11.2
c3.7-2.5-0.9,0.8,3.4,5c2.3,2.3,7.1,2.2,8.4,2.3C101.6,70.3,102.2,73.2,96.8,79.3z M110.7,71.7c-4-0.1-5.9-3.1-4.8-4.2
c3.3-3.2,3-5.6,2.6-7.8c-0.3-1.8,5.6-0.8,7.9,3.5C118.7,67.1,114.7,71.7,110.7,71.7z"/>
</g>
</g>
</g>
<g>
<g>
<path class="st4" d="M98.7,57.5c-14.8,4-3.5,13,3,11.2C108.1,67,112,54,98.7,57.5z"/>
<g>
<path class="st16" d="M98.5,57.4c-2.2,0.6-4.6,1.4-6.3,3c-0.9,0.9-1.5,2.2-1.2,3.5c0.7,2.8,3.9,4.5,6.4,5.1c3,0.7,5.9,0,8.1-2.3
c1.7-1.8,3.1-4.5,2.4-7C106.8,55.8,101.4,56.6,98.5,57.4c-0.7,0.2-0.1,0.5,0.3,0.4c2.4-0.6,6.6-1.4,8,1.6
c0.9,2.1-0.2,4.7-1.5,6.5c-0.7,1-1.7,1.9-2.8,2.4c-1.1,0.6-2.4,0.7-3.7,0.5c-2.5-0.4-5.4-1.8-6.6-4.2c-1.9-4,3.8-6.1,6.5-6.8
C99.5,57.5,98.9,57.3,98.5,57.4z"/>
</g>
</g>
<g>
<g>
<path class="st4" d="M98.7,57.5c-14.8,4-3.5,13,3,11.2C108.1,67,112,54,98.7,57.5z M101.9,67.1c-3,0.8-10.5-3.6-6.9-7
c3.9-3.8,11.4-3.3,11.7,0.3C106.9,62.6,104.4,66.5,101.9,67.1z"/>
</g>
</g>
<path class="st17" d="M105.2,61.2c-1,2-3.4,1.8-5.2,0.4C96,58.4,107.9,55.7,105.2,61.2z"/>
</g>
<path class="st17" d="M114.9,25.5c-1.5,3.1-8.1-0.2-6.1-4.4c2.1-4.4,5.4-6.6,6.5-5.7c-0.2-0.5-0.4-1-0.6-1.5c0,0-5.3,1-9.4,10.1
c0,0,5.4,3.4,9.1,6.9c0,0,1.9-4.3,1.8-9.7C116,22.3,115.3,24.6,114.9,25.5z"/>
<path class="st0" d="M40.2,154.3l3.4,7.4c0,0-25.7,4.4-32.8-17.3c-7-21.7,12.3-27,14.6-41.4c1.1-6.5-7.4-10.8-14.2-6.2
c-1.8,1.2,0.6-2.8,2-3.9c0,0-1.9,0.5-3.4,2.5s-0.9-2.9,1.5-4.9c0,0-1.7,0.3-2.5,1.8c-0.7,1.4-1.7-6.4,6.2-9.5
c7.8-3.2,21.9,4.2,18.3,18.7c-3.7,14.6-19,23.7-17.5,37.8C17.6,153.4,34.3,156.3,40.2,154.3z"/>
<g>
<path class="st2" d="M27.9,108.8c-8,13.8-16.4,19.7-14.8,30.5c1.4,9.1,11.3,16.2,11.3,12.5c-4.2-2.4-7.7-6.4-8.3-12.5
c-1.5-14.2,13.8-23.3,17.5-37.8c1.3-5.3,0.3-9.7-1.9-12.9c-0.6-0.5-1.2-0.8-1.9-1C26.6,86.8,35.9,95,27.9,108.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 1004 KiB

View File

@@ -0,0 +1,353 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1400px" height="980px" viewBox="0 0 1400 980" style="enable-background:new 0 0 1400 980;" xml:space="preserve">
<style type="text/css">
.st0{fill:#DCB86F;}
.st1{fill:#C39C56;}
.st2{fill:#89B740;}
.st3{fill:#92C54E;}
.st4{opacity:0.28;fill:#288C44;enable-background:new ;}
.st5{fill:#3C2A12;}
.st6{fill:#0E5566;}
.st7{fill:#E2E2E2;}
.st8{fill:#1CA8E0;}
.st9{fill:#3AC5EE;}
.st10{fill:#68CCF0;}
.st11{fill:#129BC6;}
.st12{fill:#D3D3D3;}
.st13{fill:#0B7A99;}
.st14{fill:#FFFFFF;}
.st15{fill:#F8B918;}
.st16{fill:#D1972A;}
.st17{fill:#FFD477;}
.st18{fill:#F2F2F2;}
.st19{fill:#1C6E76;}
.st20{fill:#FAB217;}
.st21{fill:#BA822C;}
.st22{fill:#F6C241;}
.st23{fill:#A6DEF3;}
.st24{fill:#EF4F42;}
.st25{fill:#FCFDFC;}
.st26{fill:#F4D091;}
.st27{fill:#FFCA44;}
.st28{fill:#F6BA17;}
.st29{fill:#F6A2A4;}
.st30{fill:#E1E677;}
.st31{fill:#FBD064;}
.st32{fill:#DA443B;}
.st33{fill:#F2756F;}
.st34{fill:#C7DA50;}
.st35{fill:#D1D1D1;}
.st36{fill:#AAAAAA;}
.st37{fill:#707171;}
.st38{fill:#EDECED;}
.st39{fill:#825422;}
.st40{fill:#A06C29;}
.st41{fill:#288C44;}
.st42{fill:#3BA956;}
.st43{fill:#1D7732;}
.st44{fill:#AEAEAF;}
.st45{fill:#EFEFEF;}
</style>
<path class="st0" d="M1216.5,674.8l-28.1-9.2c0.4-9.1,5.2-18.1,14.3-23.2l0.6-0.4c10.2-5.8,15-16.4,14.2-26.6v-37.7
c0,0-16.5-3.3-18.5-6.8c-1.5-2.5-77.3-45.8-118.6-69.2c1.1-8.3,5.9-16.2,14.3-20.8l43.9-24.2c10.3-5.7,15.2-16.3,14.5-26.5v-38.3
l-36.8-18.3l-25.1,6.4l-153.7-89c-8.7-5-19.5-5-28.2,0l-35.7,20.6c-8.9,5.2-20,5-28.8-0.3l-34-20.7c-8.8-5.4-19.8-5.5-28.8-0.4
l-526.3,303l-76.3,19.5V655l0,0c0.5,9,5.2,17.8,14.1,22.9l287.2,165.8c8.7,5,19.5,5,28.2,0L652,761.1c8.7-5,19.5-5,28.2,0
l186.1,107.4c8.7,5,19.5,5,28.2,0l78.9-45.6c8.7-5,19.5-5,28.2,0l14.6,8.4c8.7,5,19.5,5,28.2,0l157.8-91.1
c9.7-5.6,14.4-15.6,14.1-25.4v-40L1216.5,674.8L1216.5,674.8z"/>
<path class="st1" d="M1202.4,642.5h-172v192.7c4.9,0,9.8-1.2,14.2-3.8l157.8-91.1c9.7-5.6,14.4-15.6,14.1-25.4v-40l-28.1-9.2
C1188.8,656.5,1193.5,647.7,1202.4,642.5z"/>
<path class="st1" d="M1202.6,642.4l0.6-0.4c10.2-5.8,15-16.4,14.2-26.6v-37.7c0,0-16.5-3.3-18.5-6.8c-0.7-1.2-16.9-10.8-38.3-23.2
v128.6h55.8v-1.4l-28.1-9.2C1188.8,656.5,1193.5,647.5,1202.6,642.4z"/>
<path class="st1" d="M1094.9,480.7l43.8-24.1c10.3-5.7,15.2-16.3,14.5-26.5v-38.3l-36.8-18.3l-21.5,5.5V480.7L1094.9,480.7z"/>
<path class="st1" d="M497.3,847.4c4-0.3,8-1.6,11.7-3.7l143.1-82.6c4.4-2.5,9.2-3.8,14.1-3.8v-65.2H497.3V847.4z"/>
<path class="st1" d="M880.1,872.3c5,0.1,10-1.2,14.5-3.8l78.9-45.6c4.5-2.6,9.5-3.8,14.5-3.8V750H880.1V872.3z"/>
<path class="st2" d="M193.5,635.9l287.2,165.8c8.7,5,19.5,5,28.2,0L652,719.1c8.7-5,19.5-5,28.2,0l186.1,107.4c8.7,5,19.5,5,28.2,0
l78.9-45.6c8.7-5,19.5-5,28.2,0l14.6,8.4c8.7,5,19.5,5,28.2,0l157.8-91.1c18.8-10.9,18.8-38,0-48.9l0,0c-18.9-10.9-18.8-38.2,0.2-49
l0.6-0.4c19-10.8,19.1-38.1,0.2-49l-109.3-63.1c-19-11-18.8-38.5,0.5-49.1l43.9-24.2c19.2-10.6,19.5-38.2,0.5-49.1L937.5,249
c-8.7-5-19.5-5-28.2,0l-35.7,20.6c-8.9,5.2-20,5-28.8-0.3l-34-20.7c-8.8-5.4-19.8-5.5-28.8-0.4L193.5,587
C174.7,597.9,174.7,625,193.5,635.9z"/>
<path class="st3" d="M193.5,622.9l287.2,165.8c8.7,5,19.5,5,28.2,0L652,706.1c8.7-5,19.5-5,28.2,0l186.1,107.4c8.7,5,19.5,5,28.2,0
l78.9-45.6c8.7-5,19.5-5,28.2,0l14.6,8.4c8.7,5,19.5,5,28.2,0l157.8-91.1c18.8-10.9,18.8-38,0-48.9l0,0c-18.9-10.9-18.8-38.2,0.2-49
l0.6-0.4c19-10.8,19.1-38.1,0.2-49l-109.3-63.1c-19-11-18.8-38.5,0.5-49.1l43.9-24.2c19.2-10.6,19.5-38.2,0.5-49.1L937.5,236
c-8.7-5-19.5-5-28.2,0l-35.7,20.6c-8.9,5.2-20,5-28.8-0.3l-34-20.7c-8.8-5.4-19.8-5.5-28.8-0.4L193.5,574
C174.7,584.9,174.7,612,193.5,622.9z"/>
<path class="st4" d="M1034.1,564.8c0,0,105.1-63.9,104.9-64s50.2,29,50.2,29l-104,63.6L1034.1,564.8z"/>
<path class="st5" d="M529,598.7l41.3,32.6c0,0,259-139.6,259-141.3c0-1.7-13.8-44.3-13.8-44.3l-187.5,35L529,598.7z"/>
<g>
<path class="st6" d="M560,613.3L560,613.3c9.3-5.4,20.9,1.3,20.9,12.1v24.2c0,14.3-7.6,27.6-20,34.8l-0.1,0.1
c-9.3,5.4-21-1.3-21-12.1v-24.2C539.9,633.8,547.5,620.5,560,613.3z"/>
<path class="st7" d="M560.1,623.9L560.1,623.9c6.5-3.8,14.7,0.9,14.7,8.5v17c0,10.1-5.4,19.4-14.1,24.5h-0.1
c-6.5,3.8-14.8-0.9-14.8-8.5v-17C546,638.3,551.3,628.9,560.1,623.9z"/>
<path class="st6" d="M560.3,640.2L560.3,640.2c2.3-1.3,5.1,0.3,5.1,3v5.9c0,3.5-1.9,6.8-4.9,8.5l0,0c-2.3,1.3-5.1-0.3-5.1-3v-5.9
C555.4,645.2,557.2,641.9,560.3,640.2z"/>
</g>
<g>
<path class="st6" d="M795.3,477.3L795.3,477.3c9.3-5.4,20.9,1.3,20.9,12.1v24.2c0,14.3-7.6,27.6-20,34.8l-0.1,0.1
c-9.3,5.4-21-1.3-21-12.1v-24.2C775.2,497.8,782.9,484.5,795.3,477.3z"/>
<path class="st7" d="M795.4,487.9L795.4,487.9c6.5-3.8,14.7,0.9,14.7,8.5v17c0,10.1-5.4,19.4-14.1,24.5h-0.1
c-6.5,3.8-14.8-0.9-14.8-8.5v-17C781.3,502.3,786.7,492.9,795.4,487.9z"/>
<path class="st6" d="M795.6,504.2L795.6,504.2c2.3-1.3,5.1,0.3,5.1,3v5.9c0,3.5-1.9,6.8-4.9,8.5l0,0c-2.3,1.3-5.1-0.3-5.1-3v-5.9
C790.7,509.2,792.6,505.9,795.6,504.2z"/>
</g>
<path class="st8" d="M553,466.5l-15.3,107.6l-42.9,49.4v74.2l42.9-24.7v-29.9c0-12.1,6.5-23.3,17-29.4l9.4-5.4
c7.4-4.2,16.6,1.1,16.6,9.6v30.2L773.4,537v-29.8c0-12.1,6.5-23.3,17-29.4l9.4-5.4c7.4-4.2,16.6,1.1,16.6,9.6v30.1l21.1-12.2V302.2
L553,466.5z"/>
<path class="st9" d="M381.7,367.6L553,466.5l284.6-164.3l-171.4-98.9L381.7,367.6z"/>
<path class="st9" d="M396.2,349.9l160.4,92.6L823,288.7l-160.4-92.6L396.2,349.9z"/>
<path class="st11" d="M381.7,367.6l-15.3,107.6l171.3,98.9L553,466.5L381.7,367.6z"/>
<path class="st6" d="M388.6,380.6l-13.5,91.7l155.2,89.6l13.4-91.7L388.6,380.6z"/>
<path class="st9" d="M323.5,524.7l42.9-49.5l171.3,98.9l-42.9,49.5L323.5,524.7z"/>
<path class="st11" d="M488.2,612.9c-2.8,0-5.5-0.7-8.1-2.1l-138-79.7c-2.8-1.7-4.7-4.4-5.3-7.6c-0.5-3.2,0.4-6.4,2.5-8.9l0,0
l32.1-37l0.4,0.2l160.5,92.7l-32,37C497.3,611,492.8,612.9,488.2,612.9z M340.2,515.1c-1.9,2.3-2.8,5.2-2.3,8.1
c0.5,2.9,2.2,5.4,4.8,6.9l138,79.7c6.3,3.6,14.3,2.2,19-3.2l31.2-36l-159.1-91.9L340.2,515.1z"/>
<path class="st11" d="M323.5,598.9v-74.2l171.3,98.9v74.2L323.5,598.9z"/>
<path class="st6" d="M583.5,459l-17.2,9.9c-1.4,0.8-2.3,2.2-2.6,3.8l-10.9,76.5c-0.6,4.3,4,7.4,7.8,5.2l22.9-13.2V459L583.5,459z"/>
<path class="st6" d="M590.3,455.8l39.1-22.3c4.5-2.6,10.2,0.7,10.2,5.9v66.7c0,2.4-1.3,4.7-3.4,5.9l-46,26L590.3,455.8z"/>
<path class="st6" d="M584.4,631.8v-14.3c0-5-2.6-9.4-6.9-11.9c-4.3-2.5-9.4-2.5-13.7,0l-10.7,6.2c-1.9,1.1-4.2,1.1-6,0
s-2.9-3-2.9-5.1v-36.8L559.5,468l0.2-0.1l70.5-40.8c3.2-1.8,6.9-1.8,10.1,0c3.1,1.8,5,5,5,8.7v160.7L584.4,631.8z M570.7,602.8
c2.5,0,5,0.7,7.3,2c4.6,2.7,7.4,7.4,7.4,12.8V630l58.9-34.2V435.7c0-3.3-1.7-6.2-4.5-7.8c-2.8-1.6-6.2-1.6-9.1,0l-70.3,40.7
L545.2,570v36.7c0,1.8,0.9,3.4,2.4,4.3c1.5,0.9,3.4,0.9,5,0l10.7-6.2C565.7,603.4,568.2,602.8,570.7,602.8z"/>
<path class="st12" d="M451.9,620.1l-0.1,8c0,3.4,1.8,6.5,4.7,8.2l38.3,22.1l21.4-12.4v-10.9c0-6.2-6.7-10.1-12.1-7l-9.4,5.4
l-33.1-19.1C457.4,612,452,615.1,451.9,620.1z"/>
<path class="st12" d="M366.2,565.9v7.8c0,4.6-5,7.5-9,5.2l-33.8-19.5l0.2-24.7l37.1,21.5C364,558.2,366.2,561.9,366.2,565.9z"/>
<path class="st13" d="M467.1,620.8l-5.4-3.1c-3.2-1.8-7.1,0.5-7.1,4.1v6.3c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c3.2,1.8,7.1-0.5,7.1-4.1
v-6.3C470.8,624.6,469.4,622.1,467.1,620.8z"/>
<path class="st14" d="M470.8,633.6v-6.3c0-2.7-1.4-5.2-3.8-6.5l-5.4-3.1c-1.1-0.6-2.2-0.8-3.3-0.5c-0.8,0.8-1.3,1.9-1.2,3.2v6.3
c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c1.1,0.6,2.2,0.8,3.3,0.5C470.3,636,470.8,634.9,470.8,633.6z"/>
<path class="st13" d="M488.1,632.6l-5.4-3.1c-3.2-1.8-7.1,0.5-7.1,4.1v6.3c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c3.2,1.8,7.1-0.5,7.1-4.1
v-6.3C491.9,636.4,490.5,633.9,488.1,632.6z"/>
<path class="st14" d="M491.9,645.4v-6.3c0-2.7-1.4-5.2-3.8-6.5l-5.4-3.1c-1.1-0.6-2.2-0.8-3.3-0.5c-0.8,0.8-1.3,1.9-1.2,3.2v6.3
c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c1.1,0.6,2.2,0.8,3.3,0.5C491.4,647.8,491.9,646.7,491.9,645.4z"/>
<path class="st13" d="M338.5,546.6l-5.4-3.1c-3.2-1.8-7.1,0.5-7.1,4.1v6.3c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c3.2,1.8,7.1-0.5,7.1-4.1
v-6.3C342.2,550.4,340.8,547.9,338.5,546.6z"/>
<path class="st14" d="M342.2,559.4v-6.3c0-2.7-1.4-5.2-3.8-6.5l-5.4-3.1c-1.1-0.6-2.2-0.8-3.3-0.5c-0.8,0.8-1.3,1.9-1.2,3.2v6.3
c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c1.1,0.6,2.2,0.8,3.3,0.5C341.8,561.8,342.2,560.7,342.2,559.4z"/>
<path class="st13" d="M359.6,558.4l-5.4-3.1c-3.2-1.8-7.1,0.5-7.1,4.1v6.3c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c3.2,1.8,7.1-0.5,7.1-4.1
v-6.3C363.3,562.2,361.9,559.7,359.6,558.4z"/>
<path class="st14" d="M363.3,571.2v-6.3c0-2.7-1.4-5.2-3.8-6.5l-5.4-3.1c-1.1-0.6-2.2-0.8-3.3-0.5c-0.8,0.8-1.3,1.9-1.2,3.2v6.3
c0,2.7,1.4,5.2,3.8,6.5l5.4,3.1c1.1,0.6,2.2,0.8,3.3,0.5C362.8,573.6,363.3,572.5,363.3,571.2z"/>
<path class="st13" d="M453.3,564.7l-56.5-32.2c-1.8-1-4.2-0.7-5.6,0.9c-1.9,2.1-1.3,5.4,1.2,6.8l56.5,32.2c1.8,1,4,0.7,5.4-0.7l0,0
C456.3,569.6,455.8,566.1,453.3,564.7z"/>
<path class="st13" d="M387.2,491.5l-13.6-7.8c-1-0.6-2.2-0.3-2.9,0.5c-1,1.1-0.7,2.9,0.6,3.6l13.6,7.8c0.9,0.5,2.1,0.4,2.8-0.4l0,0
C388.8,494.2,388.5,492.3,387.2,491.5z"/>
<path class="st13" d="M523.1,569.2l-13.6-7.8c-1-0.6-2.2-0.3-2.9,0.5c-1,1.1-0.7,2.9,0.6,3.6l13.6,7.8c0.9,0.5,2.1,0.4,2.8-0.4l0,0
C524.7,571.8,524.4,569.9,523.1,569.2z"/>
<path class="st15" d="M514.2,634.3l-2.4-0.3c-0.4-0.1-0.8-0.2-1.3-0.2l0,0l0,0c-0.4,0-0.9,0.2-1.3,0.4l-8.8,5.1
c-1.9,1.1-3.1,3.1-3.1,5.3v2.5c0,1,0.5,1.9,1.2,2.4l0,0l0,0c0.6,0.5,1.4,0.7,2.2,0.6c1.1,0.2,2.1,0.4,2.1,0.4l1.5-2.2l6.4-3.7
c1.9-1.1,3.1-3.1,3.1-5.3v-2.5c0-0.6-0.1-1.1-0.4-1.5L514.2,634.3z"/>
<path class="st16" d="M512.3,634.7l-8.8,5.1c-1.9,1.1-3.1,3.1-3.1,5.3v2.5c0,2.4,2.6,3.8,4.6,2.7l8.8-5.1c1.9-1.1,3.1-3.1,3.1-5.3
v-2.5C516.9,635,514.3,633.5,512.3,634.7z"/>
<path class="st17" d="M508,637.1l-2-1l0,0l-5.7,3.3c-1.9,1.1-3.1,3.1-3.1,5.3v2.5c0,1,0.5,1.9,1.2,2.4l0,0l0,0
c0.6,0.5,1.4,0.7,2.2,0.6c1.1,0.2,2.1,0.4,2.1,0.4l1.5-2.2l3.7-2.1L508,637.1L508,637.1z"/>
<path class="st15" d="M508,637.2l-4.6,2.6c-1.9,1.1-3.1,3.1-3.1,5.3v2.5c0,2.4,2.6,3.8,4.6,2.7l3-1.8v-11.3H508z"/>
<path class="st18" d="M320.7,592.2v7.8c0,3.2,1.7,6.2,4.5,7.8l162.6,93.9c5.6,3.2,12.5,3.2,18.2,0l32.4-18.7
c2.8-1.6,4.5-4.6,4.5-7.8v-7.8c0-2.3-2.5-3.8-4.5-2.6L506,683.4c-5.6,3.2-12.5,3.2-18.2,0l-162.5-93.8
C323.3,588.4,320.7,589.9,320.7,592.2z"/>
<path class="st18" d="M577.4,649.5v5c0,2.7,2.9,4.3,5.2,3l189.2-109.2c3.9-2.2,6.3-6.4,6.3-10.9v-5c0-2.7-2.9-4.3-5.2-3L583.7,638.6
C579.8,640.8,577.4,645,577.4,649.5z"/>
<path class="st7" d="M812.9,513.5v5c0,2.7,2.9,4.3,5.2,3l18.1-10.4c3.9-2.2,6.3-6.4,6.3-10.9v-5c0-2.7-2.9-4.3-5.2-3l-18.1,10.4
C815.3,504.9,812.9,509,812.9,513.5z"/>
<path class="st11" d="M396.2,349.9v15.6l160.4,92.6v-15.6L396.2,349.9z"/>
<path class="st6" d="M818.7,301.7v-2.6c0-2.5-2.7-4-4.8-2.8l-12.5,7.2c-1.4,0.8-2.3,2.3-2.3,3.9v2.6c0,2.5,2.7,4,4.8,2.8l12.5-7.2
C817.8,304.9,818.7,303.4,818.7,301.7z"/>
<path class="st6" d="M796.5,314.5v-2.6c0-2.4-2.7-4-4.8-2.8l-12.5,7.2c-1.4,0.8-2.3,2.3-2.3,3.9v2.6c0,2.5,2.7,4,4.8,2.8l12.5-7.2
C795.7,317.6,796.5,316.1,796.5,314.5z"/>
<path class="st6" d="M774.4,327.2v-2.6c0-2.5-2.7-4-4.8-2.8l-12.5,7.2c-1.4,0.8-2.3,2.3-2.3,3.9v2.6c0,2.4,2.7,4,4.8,2.8l12.5-7.2
C773.5,330.3,774.4,328.8,774.4,327.2z"/>
<path class="st6" d="M752.3,339.9v-2.6c0-2.4-2.7-4-4.8-2.8l-12.5,7.2c-1.4,0.8-2.3,2.3-2.3,3.9v2.6c0,2.5,2.7,4,4.8,2.8l12.5-7.2
C751.4,343,752.3,341.5,752.3,339.9z"/>
<path class="st6" d="M730.1,352.6V350c0-2.4-2.7-4-4.8-2.8l-12.5,7.2c-1.4,0.8-2.3,2.3-2.3,3.9v2.6c0,2.5,2.7,4,4.8,2.8l12.5-7.2
C729.3,355.7,730.1,354.2,730.1,352.6z"/>
<path class="st20" d="M656.9,530.2l21.6,12.4l89.8-52.3L746.9,478L656.9,530.2z"/>
<path class="st21" d="M678.5,542.6v5.2l-21.6-12.4v-5.2L678.5,542.6z"/>
<path class="st22" d="M768.3,490.3v5.2l-89.8,52.3v-5.2L768.3,490.3z"/>
<path class="st23" d="M747.3,477.9V360.7l68.8-39.3l0.1,116.8L747.3,477.9z"/>
<path class="st24" d="M872.7,387.1c-13.8-25.4-32.9-47.7-55.9-65.2l-0.7-0.5l-159.2,90.8l56.6,65.8L872.7,387.1L872.7,387.1z"/>
<path class="st25" d="M802.3,427.2l39.5-22.5C828,379.3,809,357.1,786,339.5l-0.7-0.5l-0.7,0.3l-46.2,26.3L802.3,427.2z"/>
<path class="st24" d="M770,445.7l41.3-23.5c-13.8-25.4-32.9-47.6-55.8-65.1l-0.7-0.5l-0.9,0.3L711.5,381L770,445.7z"/>
<path class="st25" d="M741,462.2l39.6-22.6c-13.8-25.4-32.8-47.5-55.8-65l-0.7-0.5l-1.4,0.5L680,398.9L741,462.2z"/>
<path class="st11" d="M515.7,613.2c-0.3,0-0.6-0.1-0.9-0.2c-1-0.4-1.7-1.4-1.7-2.5c0-0.6,0.2-1.2,0.6-1.7l9.3-10.7
c0.8-0.8,1.9-1.1,2.9-0.7c1,0.4,1.7,1.3,1.7,2.4c0,0.6-0.2,1.2-0.6,1.7l-9.3,10.7C517.2,612.9,516.4,613.2,515.7,613.2z
M524.9,598.3c-0.4,0-0.8,0.1-1.2,0.5l-9.3,10.7c-0.2,0.3-0.4,0.7-0.4,1.1c0,0.9,0.5,1.4,1,1.5c0.5,0.2,1.2,0.2,1.8-0.5l9.3-10.7
c0.2-0.3,0.4-0.7,0.4-1.1c0-0.8-0.5-1.3-1-1.5C525.4,598.4,525.2,598.3,524.9,598.3z"/>
<path class="st6" d="M635.4,538L635.4,538c0,1.8,2,3,3.6,2l0,0c0.7-0.4,1.2-1.2,1.2-2l0,0c0-1.8-2-3-3.6-2l0,0
C635.9,536.5,635.4,537.2,635.4,538z"/>
<path class="st8" d="M555.8,528.6l-2.9,20.6c-0.6,4.3,4,7.4,7.8,5.2l5.6-3.2l0,0L555.8,528.6z"/>
<path class="st11" d="M559.4,528.6l10.3,6v24.7l-4.8-2.8c-3.5-2-5.6-5.8-5.6-9.8L559.4,528.6z"/>
<path class="st13" d="M557.2,548.5c1.2,0,2.1,1.1,2.1,2.5s-0.9,2.5-2.1,2.5s-2.1-1.1-2.1-2.5S556,548.5,557.2,548.5z"/>
<path class="st12" d="M557.2,549.6l5.9-2.9l1.2,2.6l-5.9,2.8c-0.7,0.3-1.6,0-1.9-0.7l0,0C556.3,550.6,556.6,549.9,557.2,549.6z"/>
<path class="st26" d="M681.9,209.9v49.5l96.4-55.6c6.6-3.8,10.7-10.9,10.7-18.6l0,0c0-16.5-17.9-26.8-32.2-18.6L681.9,209.9z"/>
<path class="st0" d="M689.4,213.9v49.5l96.4-55.6c6.6-3.8,10.7-10.9,10.7-18.6l0,0c0-16.5-17.9-26.8-32.2-18.6L689.4,213.9z"/>
<path class="st27" d="M706.4,161.6l-44.1-25.5l0,0c-2.9-1.4-6.5-1.6-9.8,0.3L475.7,238.3c-13.6,7.9-22,22.4-22,38.2l0.2,47.4
c0,15,7.3,27.5,17.9,35.2l0,0l0.1,0.1c2.4,1.8,47,27.4,47,27.4l39.2-47l104.8-60.7c3.2-1.9,5.2-5.3,5.2-9v-62.3L706.4,161.6z"/>
<path class="st28" d="M496.3,301.1l0.2,47.4c0.1,33.7,36.7,54.7,65.9,37.8l143.1-82.9c3.2-1.9,5.2-5.3,5.2-9V170.1
c0-8-8.7-13-15.6-9L518.3,262.9C504.7,270.8,496.3,285.3,496.3,301.1z"/>
<path class="st29" d="M625.2,152.2l-149.5,86.2c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0,15,7.3,27.5,17.9,35.2l0,0l0.1,0.1
c2.4,1.8,47,27.4,47,27.4l39.2-47L662.9,279c2.6-1.5,4.4-4.1,5-6.9l0.2-40.2v-24.2l0.1-0.2l0.2-30L625.2,152.2z"/>
<path class="st30" d="M625.1,201.3l-42.6-24.5l-106.8,61.5c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0,15,7.3,27.5,17.9,35.2l0,0l0.1,0.1
c2.4,1.8,47,27.4,47,27.4l39.2-47l67-38.8L625.1,201.3z"/>
<path class="st31" d="M582.4,325.5v-99.1l-43-24.8l-63.7,36.7c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0,15,7.3,27.5,17.9,35.2l0,0
l0.1,0.1c2.4,1.8,47,27.4,47,27.4l39.2-47L582.4,325.5z"/>
<path class="st32" d="M453.7,276.5l0.2,47.4c0,15,7.3,27.5,17.9,35.2l0,0l0.1,0.1c2.4,1.8,47,27.4,47,27.4l20.2-24.3V250.9
l-42.6-24.6l-20.9,12C462.1,246.2,453.7,260.8,453.7,276.5z"/>
<path class="st33" d="M668.4,177.4l-0.9-0.5l-149.3,86c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0.1,33.7,36.7,54.7,65.9,37.8l105.2-60.9
L668.4,177.4z"/>
<path class="st34" d="M625.1,201.3l-106.8,61.6c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0.1,33.7,36.7,54.7,65.9,37.8l62.8-36.3
L625.1,201.3z"/>
<path class="st28" d="M582.4,226.4l-0.4-0.2l-63.8,36.7c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0.1,33.7,36.7,54.7,65.9,37.8l20.1-11.6
V226.4L582.4,226.4z"/>
<path class="st24" d="M539.1,250.9l-20.8,12c-13.6,7.9-22,22.4-22,38.2l0.2,47.4c0.1,25.1,20.3,43.1,42.7,43.8V250.9H539.1z"/>
<path class="st36" d="M520.9,385.2v18c0,4.6,2.5,8.9,6.5,11.2l15.6,8.9c5.2,2.9,11.6-0.8,11.6-6.7l0.2-17.9c0-4.7-2.5-9.1-6.6-11.4
l-15.8-8.9C527.3,375.5,520.9,379.2,520.9,385.2z"/>
<path class="st37" d="M554.8,398.7c0-4.7-2.5-9.1-6.6-11.4l-15.8-8.9c-1.7-1-3.5-1.2-5.2-0.9c-0.1,0.4-0.1,0.9-0.1,1.3v18
c0,4.6,2.5,8.9,6.5,11.2l15.6,8.9c1.7,1,3.5,1.2,5.2,0.9c0.1-0.4,0.1-0.8,0.1-1.3L554.8,398.7z"/>
<path class="st38" d="M516.3,363.9l11.4-6.5l42.6,24.9l-10.8,6.1L516.3,363.9z"/>
<path class="st36" d="M559.1,437.8l42.9-24.4l-31.7-31.1l-10.8,6.1L559.1,437.8z"/>
<path class="st24" d="M693.2,393.1l-1.4-0.9l-7.3,4.2l-27.6,15.7l56.6,65.8l35.3-20.1C735,432.6,716,410.6,693.2,393.1z"/>
<path class="st38" d="M656.9,445.1l56.6,32.8l0,0c-13.8-25.4-32.9-47.7-55.9-65.2l-0.7-0.5L656.9,445.1L656.9,445.1z"/>
<g>
<path class="st35" d="M1016.4,594.4l18-10.4c1-0.6,2.3-0.6,3.3,0l18,10.4c2.2,1.3,2.2,4.4,0,5.7l-18,10.4c-1,0.6-2.3,0.6-3.3,0
l-18-10.4C1014.2,598.8,1014.2,595.6,1016.4,594.4z"/>
<path class="st36" d="M1016.4,594.4l18-10.4c1-0.6,2.3-0.6,3.3,0l14.2,9.9c2.2,1.3,0,0-2.2,1.3l-13.6,15.7c-0.4,0.1-0.8,0-1.7-0.4
l-18-10.4C1014.2,598.8,1014.2,595.6,1016.4,594.4z"/>
<path class="st38" d="M1052.6,579.9l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6
c1,0.6,2.3,0.6,3.3,0l14.9-8.6C1054.8,584.3,1054.8,581.2,1052.6,579.9z"/>
</g>
<g>
<path class="st35" d="M897.9,589.9l18-10.4c1-0.6,2.3-0.6,3.3,0l18,10.4c2.2,1.3,2.2,4.4,0,5.7l-18,10.4c-1,0.6-2.3,0.6-3.3,0
l-18-10.4C895.7,594.3,895.7,591.1,897.9,589.9z"/>
<path class="st36" d="M897.9,589.9l18-10.4c1-0.6,2.3-0.6,3.3,0l14.2,9.9c2.2,1.3,0,0-2.2,1.3l-13.6,15.7c-0.4,0.1-0.8,0-1.7-0.4
l-18-10.4C895.7,594.3,895.7,591.1,897.9,589.9z"/>
<path class="st38" d="M934.1,575.4l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6c1,0.6,2.3,0.6,3.3,0
l14.9-8.6C936.3,579.8,936.3,576.7,934.1,575.4z"/>
</g>
<path class="st4" d="M909.3,703.1c3.1-2.1,110.4-9.2,110.4-9.2h42.7l76.6-55.1l-81.7-42.4c0,0-123.2-26.8-123.2-21.1
C934.1,581.1,909.3,703.1,909.3,703.1z"/>
<path class="st39" d="M965.4,676.1v35.3l8,4.7l0.8-34.9L965.4,676.1z"/>
<path class="st39" d="M1058.8,622v35.3l8,4.7l0.7-34.9L1058.8,622z"/>
<path class="st39" d="M871.3,622.5v35.3l8.1,4.7l0.7-34.9L871.3,622.5z"/>
<path class="st40" d="M982.7,711l-9.3,5.1l0.8-34.9l8.5-5.1V711z"/>
<path class="st40" d="M1076,656.9l-9.2,5.1l0.7-34.9l8.5-5.1V656.9z"/>
<path class="st40" d="M888.6,657.4l-9.2,5.1l0.7-34.9l8.5-5.1V657.4z"/>
<path class="st20" d="M866.5,615.9l107.3-62l107.9,61.4L974.2,678L866.5,615.9z"/>
<path class="st21" d="M866.5,615.9v14.2l107.7,62.1V678L866.5,615.9z"/>
<path class="st22" d="M1081.7,615.3v14.2l-107.5,62.7V678L1081.7,615.3z"/>
<g>
<path class="st35" d="M888,687.1l18-10.4c1-0.6,2.3-0.6,3.3,0l18,10.4c2.2,1.3,2.2,4.4,0,5.7l-18,10.4c-1,0.6-2.3,0.6-3.3,0
l-18-10.4C885.8,691.5,885.8,688.3,888,687.1z"/>
<path class="st36" d="M888,687.1l18-10.4c1-0.6,2.3-0.6,3.3,0l14.2,9.9c2.2,1.3,0,0-2.2,1.3l-13.6,15.7c-0.4,0.1-0.8,0-1.6-0.4
l-18-10.4C885.8,691.5,885.8,688.3,888,687.1z"/>
<path class="st38" d="M924.2,672.6l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6c1,0.6,2.3,0.6,3.3,0
l14.9-8.6C926.4,677,926.4,673.8,924.2,672.6z"/>
</g>
<path class="st41" d="M1070.3,273.8l6.4-14.6c2.8-6.5,12.1-6.5,14.9,0l6.4,14.6l-13.8,8L1070.3,273.8z"/>
<path class="st42" d="M1070.3,273.8l-7.6,44.8l21.4,12.3v-49.1L1070.3,273.8z"/>
<path class="st41" d="M1098,273.8l-13.9,8v49.1l21.5-12.3L1098,273.8z"/>
<path class="st41" d="M1062.7,318.6l-21.4,61.8l43.1,24.9l-0.3-74.4L1062.7,318.6z"/>
<path class="st43" d="M1105.6,318.6l-21.5,12.3l0.3,74.4l42.7-24.8L1105.6,318.6z"/>
<path class="st42" d="M1041.3,380.4l-21.4,86.6l64.4,37.2l0.1-98.9L1041.3,380.4z"/>
<path class="st41" d="M1127.1,380.5l-42.7,24.8l-0.1,98.9l64-37.2L1127.1,380.5z"/>
<path class="st41" d="M1019.9,467l64.4,37.2l0.1,24.8l-43.1-24.9L1019.9,467z"/>
<path class="st43" d="M1148.3,467l-21.1,37.2l-42.8,24.8l-0.1-24.8L1148.3,467z"/>
<path class="st26" d="M1062.8,516.5l-7.6,48.3l29.2,16.8V529L1062.8,516.5z"/>
<path class="st0" d="M1105.8,516.6l7.6,48.2l-29,16.8V529L1105.8,516.6z"/>
<g>
<path class="st35" d="M1021.5,691.9l18-10.4c1-0.6,2.3-0.6,3.3,0l18,10.4c2.2,1.3,2.2,4.4,0,5.7l-18,10.4c-1,0.6-2.3,0.6-3.3,0
l-18-10.4C1019.3,696.3,1019.3,693.1,1021.5,691.9z"/>
<path class="st36" d="M1021.5,691.9l18-10.4c1-0.6,2.3-0.6,3.3,0l14.2,9.9c2.2,1.3,0,0-2.2,1.3l-13.6,15.7c-0.4,0.1-0.8,0-1.6-0.4
l-18-10.4C1019.3,696.3,1019.3,693.1,1021.5,691.9z"/>
<path class="st38" d="M1057.7,677.4l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6
c1,0.6,2.3,0.6,3.3,0l14.9-8.6C1059.9,681.8,1059.9,678.7,1057.7,677.4z"/>
<path class="st0" d="M759,614.5l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6c1,0.6,2.3,0.6,3.3,0
l14.9-8.6C761.2,618.9,761.2,615.8,759,614.5z"/>
<path class="st0" d="M784.5,598.2l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6c1,0.6,2.3,0.6,3.3,0
l14.9-8.6C786.7,602.6,786.7,599.5,784.5,598.2z"/>
<path class="st0" d="M809.9,582.7l-14.9-8.6c-1-0.6-2.3-0.6-3.3,0l-14.9,8.6c-2.2,1.3-2.2,4.4,0,5.7l14.9,8.6c1,0.6,2.3,0.6,3.3,0
l14.9-8.6C812.1,587.1,812.1,584,809.9,582.7z"/>
</g>
<path class="st41" d="M934.4,120.7l6.4-14.6c2.8-6.5,12.1-6.5,14.9,0l6.4,14.6l-13.8,8L934.4,120.7z"/>
<path class="st42" d="M934.4,120.7l-7.6,44.8l21.5,12.4v-49.2L934.4,120.7z"/>
<path class="st41" d="M962.1,120.7l-13.8,8v49.2l21.4-12.4L962.1,120.7z"/>
<path class="st41" d="M926.8,165.5l-21.4,61.8l43.1,24.9l-0.2-74.3L926.8,165.5z"/>
<path class="st43" d="M969.7,165.5l-21.4,12.4l0.2,74.3l42.7-24.8L969.7,165.5z"/>
<path class="st42" d="M905.4,227.3L884,313.9l64.4,37.2l0.1-98.9L905.4,227.3z"/>
<path class="st41" d="M991.2,227.4l-42.7,24.8l-0.1,98.9l64.1-37.1L991.2,227.4z"/>
<path class="st41" d="M884,313.9l64.4,37.2l0.1,24.8L905.4,351L884,313.9z"/>
<path class="st43" d="M1012.5,314l-21.2,37.2l-42.8,24.7l-0.1-24.8L1012.5,314z"/>
<path class="st41" d="M842.5,500.2"/>
<path class="st26" d="M926.2,450.7l-3.8,24.4l14.8,8.5V457L926.2,450.7z"/>
<path class="st0" d="M948,450.7l3.8,24.4l-14.6,8.5V457L948,450.7z"/>
<g>
<path class="st43" d="M961.3,438.2c0,13.3-10.8,24-24,24c-1.4,0-2.8-0.1-4.2-0.4c-11.3-2-19.9-11.8-19.9-23.7
c0-11.8,8.6-21.7,19.9-23.7c1.4-0.2,2.8-0.4,4.2-0.4C950.6,414.2,961.3,425,961.3,438.2z"/>
<path class="st41" d="M947.8,438.2c0,11.8-6.3,21.7-14.7,23.7c-11.3-2-19.9-11.8-19.9-23.7c0-11.8,8.6-21.7,19.9-23.7
C941.5,416.5,947.8,426.4,947.8,438.2z"/>
</g>
<path class="st24" d="M955.5,433.8c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S954.2,433.8,955.5,433.8z"/>
<path class="st24" d="M926.6,432.2c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S925.3,432.2,926.6,432.2z"/>
<path class="st24" d="M924.1,449.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S922.8,449.9,924.1,449.9z"/>
<path class="st24" d="M938.3,441.3c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S937,441.3,938.3,441.3z"/>
<path class="st24" d="M924.1,415c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S922.8,415,924.1,415z"/>
<path class="st24" d="M950.4,450.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S949.1,450.9,950.4,450.9z"/>
<path class="st24" d="M947.9,414c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S946.6,414,947.9,414z"/>
<path class="st24" d="M940.3,424.7c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S939,424.7,940.3,424.7z"/>
<path class="st0" d="M918,469.7l3.8,24.4l-14.6,8.5V476L918,469.7z"/>
<g>
<path class="st43" d="M931.3,457.2c0,13.3-10.8,24-24,24c-1.4,0-2.8-0.1-4.2-0.4c-11.3-2-19.9-11.8-19.9-23.7
c0-11.8,8.6-21.7,19.9-23.7c1.4-0.2,2.8-0.4,4.2-0.4C920.6,433.2,931.3,444,931.3,457.2z"/>
<path class="st41" d="M917.8,457.2c0,11.8-6.3,21.7-14.7,23.7c-11.3-2-19.9-11.8-19.9-23.7c0-11.8,8.6-21.7,19.9-23.7
C911.5,435.5,917.8,445.4,917.8,457.2z"/>
</g>
<path class="st24" d="M925.5,452.8c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S924.2,452.8,925.5,452.8z"/>
<path class="st24" d="M891.6,448.2c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S890.3,448.2,891.6,448.2z"/>
<path class="st24" d="M894.1,468.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S892.8,468.9,894.1,468.9z"/>
<path class="st24" d="M908.3,460.3c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S907,460.3,908.3,460.3z"/>
<path class="st24" d="M894.1,434c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S892.8,434,894.1,434z"/>
<path class="st24" d="M920.4,469.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S919.1,469.9,920.4,469.9z"/>
<path class="st24" d="M917.9,433c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S916.6,433,917.9,433z"/>
<path class="st24" d="M910.3,443.7c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S909,443.7,910.3,443.7z"/>
<path class="st44" d="M785.8,259.2c2.1,1.2,43.5,25.1,43.5,25.1l43.5-25.1v-12.5l-15.8-8.9V218l-27.8-13.4l-27.6,13.5v15l-16,8.8
L785.8,259.2z"/>
<path class="st45" d="M801.8,218.1c2.9,1.7,27.6,15.9,27.6,15.9l27.8-16l-27.8-13.4L801.8,218.1z"/>
<path class="st45" d="M785.8,241.8l27.4,14.6l16.1,25.4v-29.9L801.8,233L785.8,241.8z"/>
<path class="st45" d="M857.1,237.8l-20.5,12.5l36.3-3.6L857.1,237.8z"/>
<path class="st44" d="M1124.1,577.4c2.1,1.2,43.5,25.1,43.5,25.1l43.5-25.1V565l-15.8-8.9v-19.8l-27.8-13.4l-27.6,13.5v15l-16,8.8
L1124.1,577.4z"/>
<path class="st45" d="M1140,536.3c2.9,1.7,27.6,15.9,27.6,15.9l27.8-16l-27.8-13.4L1140,536.3z"/>
<path class="st45" d="M1124,560.1l27.5,14.6l16.1,25.4v-30l-27.6-18.8L1124,560.1z"/>
<path class="st45" d="M1195.4,556l-20.5,12.6l36.3-3.6L1195.4,556z"/>
<path class="st26" d="M258.2,514.7l-3.8,24.4l14.8,8.5V521L258.2,514.7z"/>
<path class="st0" d="M280,514.7l3.8,24.4l-14.6,8.5V521L280,514.7z"/>
<g>
<path class="st43" d="M293.3,502.2c0,13.3-10.8,24-24,24c-1.4,0-2.8-0.1-4.2-0.4c-11.3-2-19.9-11.8-19.9-23.7s8.6-21.7,19.9-23.7
c1.4-0.2,2.8-0.4,4.2-0.4C282.6,478.2,293.3,489,293.3,502.2z"/>
<path class="st41" d="M279.8,502.2c0,11.8-6.3,21.7-14.7,23.7c-11.3-2-19.9-11.8-19.9-23.7s8.6-21.7,19.9-23.7
C273.5,480.5,279.8,490.4,279.8,502.2z"/>
</g>
<path class="st24" d="M287.5,497.8c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S286.2,497.8,287.5,497.8z"/>
<path class="st24" d="M258.6,496.2c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S257.3,496.2,258.6,496.2z"/>
<path class="st24" d="M256.1,513.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4S254.8,513.9,256.1,513.9z"/>
<path class="st24" d="M270.3,505.3c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S269,505.3,270.3,505.3z"/>
<path class="st24" d="M256.1,479c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4S254.8,479,256.1,479z"/>
<path class="st24" d="M282.4,514.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S281.1,514.9,282.4,514.9z"/>
<path class="st24" d="M279.9,478c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S278.6,478,279.9,478z"/>
<path class="st24" d="M272.3,488.7c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S271,488.7,272.3,488.7z"/>
<g>
<g>
<path class="st43" d="M263.3,521.2c0,13.3-10.8,24-24,24c-1.4,0-2.8-0.1-4.2-0.4c-11.3-2-19.9-11.8-19.9-23.7s8.6-21.7,19.9-23.7
c1.4-0.2,2.8-0.4,4.2-0.4C252.6,497.2,263.3,508,263.3,521.2z"/>
<path class="st41" d="M249.8,521.2c0,11.8-6.3,21.7-14.7,23.7c-11.3-2-19.9-11.8-19.9-23.7s8.6-21.7,19.9-23.7
C243.5,499.5,249.8,509.4,249.8,521.2z"/>
</g>
<path class="st24" d="M257.5,516.8c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S256.2,516.8,257.5,516.8z"/>
<path class="st24" d="M223.6,512.2c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S222.3,512.2,223.6,512.2z"/>
<path class="st24" d="M226.1,532.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S224.8,532.9,226.1,532.9z"/>
<path class="st24" d="M240.3,524.3c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S239,524.3,240.3,524.3z"/>
<path class="st24" d="M226.1,498c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S224.8,498,226.1,498z"/>
<path class="st24" d="M252.4,533.9c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S251.1,533.9,252.4,533.9z"/>
<path class="st24" d="M249.9,497c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S248.6,497,249.9,497z"/>
<path class="st24" d="M242.3,507.7c1.3,0,2.4,1.1,2.4,2.4s-1.1,2.4-2.4,2.4s-2.4-1.1-2.4-2.4S241,507.7,242.3,507.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,7 @@
https://www.vecteezy.com/vector-art/192818-vector-landscape-illustration
https://www.vecteezy.com/vector-art/217221-vector-nature-landscape-illustration
https://www.vecteezy.com/vector-art/538989-a-panorama-view-od-urban-city
https://www.vecteezy.com/vector-art/419761-mushroom-house-in-the-dark-forest
https://www.vecteezy.com/vector-art/376425-brown-cat-looking-at-little-mouse
https://freesvg.org/great-wave-off-kanagawa
https://www.vecteezy.com/vector-art/298600-friendly-cat-and-dog-on-white-background

View File

@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="336px" height="235.2px" viewBox="0 0 336 235.2" style="enable-background:new 0 0 336 235.2;" xml:space="preserve">
<path style="fill:#0D2C47;" d="M0.1,0H336v117.4H0.1V0z"/>
<path style="fill:#FFFFFF;" d="M274.9,32.9c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S275.4,32.9,274.9,32.9z"/>
<path style="fill:#FFFFFF;" d="M252,16.2c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S252.6,16.2,252,16.2z"/>
<path style="fill:#FFFFFF;" d="M143.2,29c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S143.7,29,143.2,29z"/>
<path style="fill:#FFFFFF;" d="M317.9,62.6c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1C318.9,63.1,318.5,62.6,317.9,62.6z"/>
<path style="fill:#FFFFFF;" d="M202.9,45.2c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S203.5,45.2,202.9,45.2z"/>
<path style="fill:#FFFFFF;" d="M61.2,45.2c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S61.7,45.2,61.2,45.2z"/>
<path style="fill:#FFFFFF;" d="M227.8,28.3c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6s0.6-0.3,0.6-0.6
C228.4,28.6,228.2,28.3,227.8,28.3z"/>
<path style="fill:#FFFFFF;" d="M107.5,11.5c-0.3,0-0.6,0.4-0.5,0.7c0,0.3,0.3,0.5,0.5,0.5c0.3,0,0.6-0.4,0.5-0.7
C108,11.8,107.8,11.5,107.5,11.5z"/>
<path style="fill:#FFFFFF;" d="M8,45.2c-0.3,0-0.6,0.3-0.6,0.6s0.3,0.6,0.6,0.6c0.3,0,0.6-0.3,0.6-0.6C8.6,45.4,8.3,45.2,8,45.2
L8,45.2z"/>
<path style="fill:#FFFFFF;" d="M330.3,21.9c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6c0.3,0,0.6-0.3,0.6-0.6
C330.9,22.2,330.7,21.9,330.3,21.9z"/>
<path style="fill:#FFFFFF;" d="M249.6,68.4c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6s0.6-0.3,0.6-0.6
C250.2,68.7,250,68.4,249.6,68.4z"/>
<path style="fill:none;" d="M281.3,97.6c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6c0.3,0,0.6-0.3,0.6-0.6S281.6,97.6,281.3,97.6
z"/>
<path style="fill:#FFFFFF;" d="M40.1,51.1c-0.3,0-0.6,0.4-0.5,0.7c0,0.3,0.3,0.5,0.5,0.5c0.3,0,0.6-0.4,0.5-0.7
C40.6,51.3,40.3,51.1,40.1,51.1z"/>
<path style="fill:#FFFFFF;" d="M251,51.1c-0.3,0-0.6,0.4-0.5,0.7c0,0.3,0.3,0.5,0.5,0.5c0.3,0,0.6-0.4,0.5-0.7
C251.5,51.3,251.3,51.1,251,51.1z"/>
<path style="fill:#FFFFFF;" d="M168.1,11.1c-0.3,0-0.6,0.3-0.6,0.6s0.3,0.6,0.6,0.6s0.6-0.3,0.6-0.6
C168.7,11.4,168.4,11.1,168.1,11.1z"/>
<path style="fill:#FFFFFF;" d="M317.8,11.1c-0.3,0-0.6,0.3-0.6,0.6s0.3,0.6,0.6,0.6c0.3,0,0.6-0.3,0.6-0.6
C318.4,11.4,318.1,11.1,317.8,11.1z"/>
<path style="fill:#FFFFFF;" d="M40.7,19.9c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6s0.6-0.3,0.6-0.6
C41.3,20.2,41,19.9,40.7,19.9z"/>
<path style="fill:#FFFFFF;" d="M179.3,17.9c-0.3,0-0.6,0.3-0.6,0.6c0,0.3,0.3,0.6,0.6,0.6s0.6-0.3,0.6-0.6
C179.9,18.2,179.7,17.9,179.3,17.9z"/>
<path style="opacity:0.4;fill:#FFFFFF;enable-background:new ;" d="M326.1,65.7c-2.2,2.7-2.8,6.3-1.7,9.6c-1,0-2,0.3-2.9,0.9
c-0.3-0.4-0.6-0.7-1-1c0.1-0.4,0.2-0.8,0.2-1.2c0.1-2.3-1.7-4.2-4-4.3c-0.8,0-1.7,0.2-2.4,0.6c-0.7-0.7-1.6-1.1-2.6-1.2
c0-1-0.2-1.9-0.6-2.7c0.5-2.5-1.1-5-3.7-5.5c-1.5-0.3-3.1,0.2-4.2,1.3c-1.4-2.3-4.1-3.4-6.8-2.8c-0.6-0.4-1.2-0.8-1.8-1.1
c-4.2-1.8-9,0.2-10.8,4.4c-1.2,2.9-0.7,6.3,1.4,8.6c-0.2,0-0.4-0.1-0.7-0.1c-1.1,0-2.1,0.4-2.8,1.2c-0.4-0.5-0.8-0.9-1.3-1.2
c0-0.1,0-0.3,0-0.4c0-2.6-2.2-4.6-4.7-4.6c-1.4,0-2.7,0.7-3.6,1.8c0.4-2.5-1.4-4.9-3.9-5.3c-1.3-0.2-2.6,0.2-3.6,1
c-1.1,0.9-1.7,2.2-1.7,3.6c-2.2,0.2-4,1.9-4.3,4.1h-0.1c-3.1,0.1-5.5,2.6-5.4,5.7c0,0.7,0.2,1.4,0.5,2.1c-0.3-0.1-0.7-0.1-1.1-0.1
c-1.6,0-3,0.9-3.7,2.3c-3.3-1.3-7.1,0.3-8.4,3.6c-0.3,0.8-0.5,1.6-0.4,2.5c0,1.5,0.5,2.9,1.5,4h-0.4c-3.8,0-6.9,3.1-6.9,6.9
c0,0.6,0.1,1.2,0.3,1.8c-1.7-0.7-3.6-0.6-5.3,0.1c-0.2-1.2-0.6-2.4-1.4-3.3c-2.3-3-6.7-3.6-9.7-1.2l0,0c-0.2,0.2-0.4,0.4-0.6,0.6
c-2.4-3-6.8-3.4-9.7-1c-1.5,1.3-2.5,3.1-2.5,5.2l0.4,0.6c-1.2,0-2.3,0.5-3.1,1.3c-1.4-2.3-4.1-3.4-6.8-2.8c-0.6-0.4-1.2-0.8-1.8-1.1
c-4.2-1.8-9,0.1-10.8,4.3c-1.3,2.9-0.7,6.3,1.4,8.7c-0.2,0-0.5-0.1-0.7-0.1c-1.1,0-2.1,0.4-2.8,1.2c-0.4-0.5-0.8-0.9-1.3-1.2
c0-0.1,0-0.3,0-0.4c0-2.6-2.2-4.7-4.8-4.6c-1.4,0-2.7,0.7-3.6,1.8c0.2-1.3-0.2-2.6-1-3.6c-1.6-2-4.5-2.3-6.5-0.7
c-1.1,0.9-1.7,2.2-1.7,3.6c-2.2,0.2-4,1.9-4.3,4.1h-0.1c-3.1,0.1-5.5,1.9-5.5,5v0.1l183.9,0.2V65.5
C333.4,62.6,327.7,63.6,326.1,65.7z"/>
<path style="opacity:0.4;fill:#FAFAFB;enable-background:new ;" d="M130.7,107c0.2-0.6,0.3-1.3,0.3-2c0-4.2-4-7.6-8.9-7.6
c-0.6,0-1.2,0-1.8,0.2c0.2-0.6,0.3-1.2,0.3-1.9c0.1-3.7-2.8-6.8-6.5-6.9c-1.8,0-3.5,0.8-4.7,2.2c-3.7-5.7-11.4-7.3-17.1-3.5
c-1.6,1.1-3,2.5-3.9,4.2c-1.1-3.1-4-5.2-7.3-5.2c-1,0-2,0.2-2.9,0.6c0.1-0.5,0.2-1,0.2-1.5c-0.1-3-2.1-5.6-5-6.4
c0.3-0.7,0.4-1.4,0.4-2.2c0.1-3-2.2-5.6-5.2-5.7c-0.5,0-0.9,0.1-1.4,0.2c0-0.2,0-0.3,0-0.5c0-4.4-3-7.9-6.7-7.9
c-0.8,0-1.6,0.2-2.3,0.5c-1.4-5.1-6.8-8.1-11.9-6.7c-3,0.8-5.4,3-6.4,6c-1.6-1.7-3.8-2.7-6.1-2.6c-1,0-2,0.2-3,0.5
c0.1-0.2,0.1-0.5,0.1-0.7c0-1.8-1.7-3.2-3.8-3.2c-0.4,0-0.8,0.1-1.1,0.2c0.1-0.2,0.1-0.5,0.1-0.7c0-1.5-1.3-2.8-2.8-2.8h-0.1
c0-1.8-1.5-3.2-3.3-3.2c-0.5,0-0.9,0.1-1.3,0.3c-1-1.5-2.7-2.4-4.5-2.3c-2.2-0.1-4.2,1.2-5,3.3c-3,0.1-5.5,2.1-6.2,5
c-0.4-0.1-0.9-0.2-1.3-0.2c-0.6,0-1.3,0.1-1.9,0.4v59.5H126C134.7,113.4,133.6,108.9,130.7,107z"/>
<path style="fill:#FFFFFF;" d="M167.5,60c28.8,0,52.2,23.4,52.2,52.2s-23.4,52.2-52.2,52.2s-52.2-23.4-52.2-52.2S138.7,60,167.5,60z
"/>
<path style="fill:#00507E;" d="M-0.1,117.3h336.2v117.9H-0.1V117.3z"/>
<path style="opacity:0.4;fill:#606060;enable-background:new ;" d="M65.9,188.7h14.5l-1.1,6.4c-3.5-0.2-7.3-0.2-12.3-0.1
c0,0,7.4,26.1,11.4,40.2h5.9c4-14.2,11.4-40.2,11.4-40.2c-4.8-0.1-8.8-0.1-12.2,0.1l-1.6-6.4H99l0.7-1.8h2.6l-1.5-4.1h-32l-1.8,0.1
c-1.7,0.1-3.5,0.4-5.2,0.9c-0.4,0.1-0.9,0.3-1.3,0.5c-0.9,0.4-4.7,2.7-4.7,2.7s3,0,7.2-0.1L65.9,188.7z"/>
<g style="opacity:0.37;">
<g style="opacity:0.53;">
<polygon style="fill:#20323A;" points="336,140.5 58,138.5 336,138.5 "/>
</g>
<g style="opacity:0.28;">
<polygon style="fill:#20323A;" points="336,211.7 125.5,209.9 336,207.4 "/>
</g>
<g style="opacity:0.32;">
<polygon style="fill:#20323A;" points="-0.3,167 210.2,167.6 -0.3,165.3 "/>
</g>
<g style="opacity:0.13;">
<polygon style="fill:#20323A;" points="336,171.5 145.8,171.5 336,170 "/>
</g>
<g style="opacity:0.28;">
<polygon style="fill:#20323A;" points="336,177.1 145.8,174.8 336,173 "/>
</g>
<g style="opacity:0.3;">
<polygon style="fill:#20323A;" points="336,203.8 0.2,203 0.2,201.5 336,202.3 "/>
</g>
</g>
<path style="fill:#07293C;" d="M0,134.6c0,0,123.1,0.1,123.7-0.7s-24.8-23.4-26.5-23.7s-19.1,0.5-20.2-0.4S33.9,70.4,33.5,70.1
c-0.5-0.3-1.2-0.3-1.8,0C31.4,70.4,8.5,92.7,7.1,91.3S0,80.9,0,80.9V134.6z"/>
<path style="fill:#00507E;" d="M77,109.8c1,0.9,18.4,0.2,20.2,0.4c1.2,0.2,13,10.5,20.5,17.4h11.5c-3.3-3.7-38.8-34.9-39.3-34.9
c-0.2,0-2.7,2.2-2.8,2.2s-2.7-2.8-2.9-2.8s-6.7,5.4-13.8,11.5C74.1,107.2,76.8,109.6,77,109.8z"/>
<path style="fill:#004168;" d="M30.3,71.5c-4.5-4.2-7.4-6.8-7.7-6.8c-0.6,0-1.4,1.1-2.3,1.1c-1.1,0-6.7-5.6-7.8-5.6
C11,60.2,0,71.3,0,71.3v9.6c0,0,5.7,8.9,7.1,10.3C8.3,92.5,25.2,76.4,30.3,71.5z"/>
<path style="fill:#0A3455;" d="M255.9,126.8c-0.3-0.5-0.6-0.9-1.1-1.1c-0.3-0.2-48.6-29.2-50.1-29.2c-0.8,0-2.4,2-2.9,1.8
s-6.8-3.6-7.7-3.6h-4.7c-0.6,0-2.5,1.6-3.5,2.2c-0.2,0.1-0.5,0.2-0.7,0.2h-1.8c-0.4,0-5.5,5-6.4,5h-7.1c-0.6,0-1.2,0.2-1.7,0.6
c-2.9,2.4-13.4,10.8-13.8,11c-1.9,0.2-3.7,0.3-5.6,0.3c-0.7,0-11.5,8.3-17.6,12.9L255.9,126.8L255.9,126.8z"/>
<path style="fill:#07293C;" d="M335.9,114c-7.8,5.5-19.8,14.7-21.3,14.7c-3.1,0-15.3,0.1-16.8,0.1s-39.8,12.1-44.2,13.5h82.3
L335.9,114L335.9,114z"/>
<path style="opacity:0.37;fill:#20323A;enable-background:new ;" d="M335.9,170.8c-7.8-5.5-19.8-14.7-21.3-14.7
c-3.1,0-15.3-0.1-16.8-0.1s-39.8-12.1-44.2-13.5h82.3L335.9,170.8L335.9,170.8z"/>
<path style="fill:#0D2C47;" d="M335.9,88.5c-5.5,4-37.8,28.9-39.2,28.9c-3.5,0-6.9-0.1-9.8-0.1c-0.6,0-25.6,8.9-26,9.3
c-0.2,0.2,36.3-0.1,75-0.5V88.5z"/>
<path style="fill:#07293C;" d="M191,142.6c0,0,8.4-4.3,10-4.4s2.5,0.1,4.3-0.8c2.4-1.2,8.1-4.9,9.3-4.9c1.6,0,7.3,4.2,9.2,4.1
c1,0,3.6-0.1,3.8-0.1c1.6,0,2.6,1.2,3.6,1.2c2.2,0,11,4.9,11,4.9H191z"/>
<path style="opacity:0.37;fill:#20323A;enable-background:new ;" d="M131.2,126.7c6.1,4.6,16.9,12.9,17.6,12.9
c1.9,0,3.7,0.1,5.6,0.3c0.4,0.2,10.9,8.6,13.8,10.9c0.5,0.4,1.1,0.6,1.7,0.6h7.1c0.9,0,5.9,5,6.4,5c0.2,0,1,0,1.8,0
c0.3,0,0.5,0.1,0.7,0.2c1,0.6,2.9,2.2,3.5,2.2h4.7c0.9,0,7.2-3.4,7.7-3.6s2.1,1.8,2.9,1.8c0.4,0,3.8-1.9,8.7-4.7
c-2.2-1-6.1-3.5-8-4.4s-2.7-0.7-4.3-0.8s-10-4.4-10-4.4h38.8c12.4-7.4,24.8-14.8,25-14.9c0.5-0.3,0.9-0.6,1.1-1.1H131.2z"/>
<path style="opacity:0.5;fill:none;enable-background:new ;" d="M123.6,134l0.1,0.1L123.6,134L123.6,134z"/>
<path style="opacity:0.37;fill:#20323A;enable-background:new ;" d="M0,134.6v43.2c0,0,11.1,7.9,12.6,7.9c1.2,0,6.7-3.9,7.8-3.9
c0.9,0,1.7,0.8,2.3,0.8c2.6-1.5,5.2-3.1,7.7-4.8c0.9,0.6,1.4,0.9,1.5,1c0.6,0.2,1.2,0.2,1.8,0c0.4-0.2,42.5-27.3,43.5-28
s22.4-0.1,24.1-0.3s22.5-16.4,22.3-16.4C118.3,134.7,0,134.6,0,134.6z"/>
<polygon style="opacity:0.37;fill:#20323A;enable-background:new ;" points="261,126.6 279.7,134.3 297.9,128.8 315.2,128.6
319.1,126.4 "/>
<path style="fill:#0A3455;" d="M65.9,212.8c0,0-3,5.5-3.6,19.3c-1.1-7.9-3.5-18.5-9.3-23.7c3.1,8.5,4.7,17.5,4.7,26.5h7.9
C64.3,228.9,63.1,219.7,65.9,212.8z"/>
<path style="fill:#0A3455;" d="M88.6,212.8c0,0,1.2,13.3-0.4,22.1h3.2C92,228.3,92.2,218.3,88.6,212.8z"/>
<path style="fill:#0A3455;" d="M85.1,234.9h2.5c-0.5-3.5-0.9-8.2,0.2-11.7C86.2,227,85.3,230.9,85.1,234.9z"/>
<path style="fill:#0A3455;" d="M69.6,216.3c3.4,5.6,5.3,12,5.6,18.6H85c-0.7-11.6-1.1-30.8,2.9-40.2c0,0-6.8,9.6-7.9,37.9
C78.4,227.1,75.2,219.5,69.6,216.3z"/>
<path style="fill:#00507E;" d="M112,234.9c0.2-14.5,4.8-21,4.8-21c-4.7,5.1-6.7,13.1-7.2,21H112z"/>
<path style="fill:#00507E;" d="M94.9,208.3c2.1,4.9,3,12.2,3.4,19.9c-1.7-3.2-4-6-6.7-8.4c3.2,3.5,5.2,9.2,6.5,15.1h4.1
C99.9,215.3,94.9,208.3,94.9,208.3z"/>
<path style="fill:#0D2C47;" d="M249.2,212.8c0,0,3,5.5,3.6,19.3c1.1-7.9,3.5-18.5,9.3-23.7c-3.1,8.5-4.7,17.5-4.7,26.5h-7.9
C250.8,228.9,251.9,219.7,249.2,212.8z"/>
<path style="fill:#0D2C47;" d="M226.4,212.8c0,0-1.2,13.3,0.4,22.1h-3.2C223,228.3,222.8,218.3,226.4,212.8z"/>
<path style="fill:#0D2C47;" d="M230,234.9h-2.5c0.5-3.5,0.9-8.2-0.1-11.7C228.9,227,229.8,230.9,230,234.9z"/>
<path style="fill:#0D2C47;" d="M245.5,216.3c-3.4,5.6-5.3,12-5.7,18.6H230c0.7-11.6,1.1-30.8-2.9-40.2c0,0,6.8,9.6,7.9,37.9
C236.6,227.1,239.8,219.5,245.5,216.3z"/>
<g id="grass">
<path style="fill:#0D2C47;" d="M182.3,225.6c0.8-4.6,3.8-11.8,3.8-11.8s-3.4,5.9-6,11c-1.6,3.1-2.4,6.5-2.5,10h3.9
C181.6,231.7,181.8,228.6,182.3,225.6z"/>
<path style="fill:#0D2C47;" d="M222.8,234.8h2.5c-0.2-2.1-0.2-4.2-0.1-6.3c0.2-3,2.6-7.6,2.6-7.6c-1.9,2.3-3.5,4.7-5,7.2
c0-3.9-0.1-9.3-0.2-15.5c-0.3-8.2-1-16.4-2.1-24.5c0,0,0.6,12.6,0.2,25.1c-0.2,7.2-1,14.4-2.4,21.5h4.5V234.8z"/>
<path style="fill:#0D2C47;" d="M258.1,226.6c-3.8,1.5-7.5,3.4-10.8,5.9c1.3-3.6,2.9-7.1,4.8-10.5c0,0-4.6,5.9-8,11
c-0.4,0.6-0.8,1.2-1.1,1.8h4.5c0.1-0.2,0.2-0.4,0.3-0.7C250.1,229.9,258.1,226.6,258.1,226.6z"/>
<path style="fill:#0D2C47;" d="M186.7,233.5c1-4.6,5.1-11.8,5.1-11.8s-4.6,5.9-8.1,11c-0.5,0.7-0.9,1.4-1.2,2.1h3.9
C186.5,234.4,186.6,233.9,186.7,233.5z"/>
<path style="fill:#0D2C47;" d="M192.8,234.5c2.3-4.3,10.4-7.6,10.4-7.6c-4.7,1.8-9.1,4.3-12.9,7.6l-0.4,0.4h2.8L192.8,234.5z"/>
<path style="fill:#0D2C47;" d="M175.5,234.8c0,0-1.2-3.7-0.4-14.4s6.7-21.1,6.7-21.1s-6.9,7.4-9,16.5c-0.9,3.9-1.3,7.9-1.3,11.9
c-1.2-4.6-2.6-9-2.6-9s1,7.3,0.2,12c-0.3,1.4-0.6,2.8-1,4.1H175.5L175.5,234.8z"/>
<path style="fill:#0D2C47;" d="M162.7,234.8c-0.6-4.1-1.5-8.1-2.9-12c-2.1-6.2-9.1-13.3-9.1-13.3c2.8,3.9,4.9,8.3,6.2,12.9
c0.6,1.8,0.9,3.7,1.1,5.6c-2.5-3.2-5.6-5.8-9.1-7.7c0,0,6.6,3.9,7.2,8.4c0.3,2.1,0.2,4.2-0.3,6.2L162.7,234.8L162.7,234.8z"/>
<path style="fill:#0D2C47;" d="M212.2,234.4c-0.4-8.2-1.6-16.4-3.5-24.4c0,0,0.7,8.4,0.6,18.2c-1.6-4.8-3.5-9.6-3.5-9.6
s1.5,7.4,0.8,12c-0.2,1.4-0.5,2.8-0.9,4.1h6.6C212.2,234.7,212.2,234.6,212.2,234.4z"/>
<path style="fill:#0D2C47;" d="M233.5,234.8c0.1-2.6,0.5-5.1,1.3-7.6c1.3-4.3,5.9-7.6,5.9-7.6c-2.9,2-5.5,4.6-7.4,7.6
c-0.8,1.1-1.4,2.3-2,3.6c-0.2-2.1-0.8-4.1-2-5.9c1.4,2.5,1.6,5.5,0.6,8.2c-0.2,0.6-0.5,1.2-0.8,1.7H233.5L233.5,234.8z"/>
<path style="fill:#0D2C47;" d="M115.1,234.8c0,0,1.2-3.7,0.4-14.4s-6.7-21.1-6.7-21.1s6.9,7.4,9,16.5c0.9,3.9,1.3,7.9,1.3,11.9
c1.2-4.6,2.6-9,2.6-9s-1,7.3-0.2,12c0.3,1.4,0.6,2.9,1,4.1H115.1L115.1,234.8z"/>
<path style="fill:#0D2C47;" d="M284.4,234.8h-2.5c0.2-2.1,0.2-4.2,0.1-6.3c-0.2-3-2.6-7.6-2.6-7.6c1.9,2.3,3.5,4.7,5,7.2
c0-3.9,0.1-9.3,0.2-15.5c0.3-8.2,1-16.4,2.1-24.5c0,0-0.6,12.6-0.2,25.1c0.2,7.2,1,14.4,2.4,21.5h-4.5V234.8z"/>
<path style="fill:#0D2C47;" d="M70.1,234.8c0,0-1.2-3.7-0.4-14.4s6.7-21.1,6.7-21.1s-6.9,7.4-9,16.5c-0.9,3.9-1.3,7.9-1.3,11.9
c-1.2-4.6-2.6-9-2.6-9s1,7.3,0.2,12c-0.3,1.4-0.6,2.9-1,4.1H70.1L70.1,234.8z"/>
<path style="fill:#0D2C47;" d="M133,234.8c0-2.6,0.5-5.1,1.3-7.6c1.3-4.3,5.9-7.6,5.9-7.6c-2.9,2-5.5,4.6-7.4,7.6
c-0.8,1.1-1.4,2.3-2,3.6c-0.2-2.1-0.8-4.1-2-5.9c1.4,2.5,1.6,5.5,0.6,8.2c-0.2,0.6-0.5,1.2-0.8,1.7H133z"/>
<path style="fill:#0D2C47;" d="M52.4,213.3c-0.4-12.4,0.2-25.1,0.2-25.1c-1.1,8.1-1.9,16.3-2.1,24.5c0,0.9,0,1.8-0.1,2.7v19.4h4.4
C53.5,227.7,52.7,220.6,52.4,213.3z"/>
</g>
<path style="fill:#FFFFFF;" d="M166.5,113.4l0.1,16.9c2.7,0.2,5.5,0.1,8.2-0.2C173.1,125.4,168.8,117.9,166.5,113.4z"/>
<path style="fill:#B6CFD4;" d="M159.8,134.6h10.9h0.6c0.6,0,1.2-0.1,1.8-0.3l0.4-0.2c0.3-0.1,1.6-0.9,1.6-0.9s-15.7,0-15.9,0
L159.8,134.6z"/>
<polygon style="fill:#9F7464;" points="160.1,133.2 172.7,133.1 171.7,132.6 160.4,132.6 "/>
<path style="fill:#9F7464;" d="M166.4,132.6l-0.1-20.3l0.1-0.1c0,0,0.1,0,0.1,0.1l0.1,20.3H166.4z"/>
<path style="opacity:0.2;fill:#C1CAC7;enable-background:new ;" d="M166.7,130.3l-0.1-16.8c0,0.1,4.8,16.8,4.8,16.8
C169.8,130.5,168.2,130.4,166.7,130.3z"/>
<path style="fill:#B6CFD4;" d="M100.8,183h-32l-1.8-0.1c-1.7-0.1-3.5-0.4-5.1-0.9c-0.4-0.1-0.9-0.3-1.3-0.5
c-0.9-0.4-4.7-2.7-4.7-2.7c0.4,0.1,46,0.1,46.4,0.1L100.8,183z"/>
<polygon style="fill:#9F7464;" points="99.7,178.9 63.1,178.9 65.9,177.1 99,177.1 "/>
<path style="fill:#9F7464;" d="M81.4,177.1l0.4-59.5c0-0.1-0.2-0.2-0.4-0.2s-0.4,0.1-0.4,0.2l-0.4,59.5H81.4z"/>
<path style="fill:#FFFFFF;" d="M80.6,170.6l0.4-49c-0.1,0.2-14,49.2-14,49.2C71.5,171,76.1,170.9,80.6,170.6z"/>
<path style="fill:#FFFFFF;" d="M81.5,170.6l0.2-49c0.1,0.2,14,49.2,14,49.2C91,171,86.2,170.9,81.5,170.6z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#00507E;" d="M295.1,34.6c-0.7-0.1-1.3-0.3-2-0.5c-0.7-0.1-1.4,0.1-1.9,0.4
c-0.1-0.1-0.3-0.2-0.4-0.2c-0.2,0-0.3,0.1-0.4,0.2c-0.6-0.4-1.3-0.5-2-0.4c-0.7,0.2-1.3,0.4-2,0.5h-0.2h0.2c0.3,0.1,0.6,0.1,1,0.1
s0.7-0.1,1.1-0.1s0.7,0.1,1,0.3s0.7,0.4,1,0.6c0.3,0.1,0.7,0.1,1,0c0.3-0.2,0.6-0.4,0.9-0.5c0.3-0.2,0.7-0.2,1-0.2
c0.4,0,0.7,0,1.1,0.1c0.3,0,0.7,0,1,0h0.2L295.1,34.6z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" d="M103.5,41.2c-0.4-0.1-0.8-0.2-1.1-0.3c-0.4,0-0.8,0-1.1,0.2
c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.2,0.1c-0.3-0.2-0.7-0.3-1.1-0.2s-0.8,0.2-1.1,0.3h-0.1h0.1c0.2,0,0.4,0,0.5,0
c0.2,0,0.4,0,0.6,0s0.4,0.1,0.6,0.2c0.2,0.1,0.4,0.2,0.5,0.3c0.2,0.1,0.4,0.1,0.6,0s0.3-0.2,0.5-0.3s0.4-0.1,0.6-0.2
c0.2,0,0.4,0,0.6,0C103.1,41.3,103.3,41.3,103.5,41.2L103.5,41.2L103.5,41.2z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" d="M57.8,35.9c-0.8-0.1-1.6-0.3-2.4-0.6c-0.8-0.1-1.6,0.1-2.3,0.5
c-0.2-0.3-0.6-0.4-0.8-0.2c-0.1,0-0.1,0.1-0.2,0.2c-0.7-0.4-1.5-0.6-2.4-0.5c-0.8,0.3-1.6,0.4-2.4,0.6h-0.2h0.2
c0.4,0.1,0.8,0.1,1.1,0.1c0.4,0,0.9-0.1,1.3-0.1c0.4,0,0.8,0.1,1.2,0.3s0.8,0.4,1.1,0.7c0.4,0.2,0.8,0.2,1.2,0
c0.3-0.2,0.7-0.4,1-0.6c0.4-0.2,0.8-0.3,1.2-0.3s0.9,0.1,1.3,0.1C57,36,57.4,36,57.8,35.9L58,36L57.8,35.9z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" d="M238.1,64.4c-1.7-0.1-2.5-0.7-3.9-1c-1.3-0.2-2.6,0.1-3.7,0.7
c-0.2-0.3-0.5-0.4-0.8-0.5c-0.3,0-0.6,0.2-0.8,0.4c-1.1-0.7-2.5-1-3.8-0.8c-1.4,0.2-2.2,0.8-3.9,0.9h-0.4l0.4,0.1
c0.6,0.1,1.2,0.1,1.8,0.1c0.7-0.1,1.4-0.1,2.1-0.1c0.6,0,1.3,0.2,1.9,0.5c0.6,0.3,1.2,0.7,1.8,1.1c0.6,0.3,1.3,0.3,1.9,0
c0.5-0.4,1.1-0.7,1.7-1c0.6-0.3,1.2-0.5,1.9-0.5s1.4,0.1,2.1,0.2C236.9,64.6,237.5,64.5,238.1,64.4h0.4H238.1z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#00507E;" d="M90.8,51.2c-0.6-0.1-1.1-0.2-1.7-0.4c-0.6-0.1-1.1,0-1.6,0.3
C87.4,51,87.3,51,87.2,51c-0.1,0-0.3,0.1-0.3,0.2c-0.5-0.3-1.1-0.4-1.6-0.4c-0.5,0.2-1.1,0.3-1.7,0.4h-0.2h0.2c0.3,0,0.5,0,0.8,0
s0.6,0,0.9,0s0.5,0.1,0.8,0.2c0.3,0.1,0.5,0.3,0.8,0.5c0.3,0.1,0.5,0.1,0.8,0c0.2-0.2,0.5-0.3,0.7-0.4c0.2-0.1,0.5-0.2,0.8-0.2
s0.6,0,0.9,0.1C90.2,51.3,90.5,51.3,90.8,51.2L90.8,51.2L90.8,51.2z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#07293C;" d="M60.8,235.2c-7.3-2.8-15-4.6-22.8-5.1
c-11.8-0.8-25.9,2.5-33.1,5.1H60.8z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#08203E;" d="M3.5,235.1l0.6-0.9c8.8-12.7,46.1-59.4,46.1-59.4
C31.7,183.7,15,196,1.1,211.1c-0.4,0.4-0.7,0.8-1.1,1.2v22.8H3.5z"/>
<path style="fill:#054E7B;" d="M48.4,176.2l1-0.6C49,175.8,48.7,176,48.4,176.2z"/>
<path style="fill:#054E7B;" d="M0,224.9v2.4c1.4-1.9,2.7-3.7,4-5.6c15.2-21.6,39.3-41.8,44.4-45.5C43.8,179.3,23,193.7,0,224.9z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#0D3057;" d="M0,198.8v30.6c0.8-2.3,1.6-4.3,2.2-5.9
c4.3-11.3,23.6-54,23.6-54C15.8,177.8,7.1,187.7,0,198.8z"/>
<path style="fill:#054E7B;" d="M0,213.3c7.4-19.1,21.6-38.6,24.7-42.4c-2.7,2.9-14,15.9-24.7,39.9V213.3z"/>
<path style="fill:#054E7B;" d="M24.7,170.9l0.6-0.7C25.1,170.4,24.9,170.6,24.7,170.9z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#07293C;" d="M15.9,235.1C30,228,66,211.3,66,211.3
c-16.1-0.3-32.1,2.5-47.2,8.1C12.2,222,6,225.1,0,228.7v6.3h15.9V235.1z"/>
<path style="fill:#054E7B;" d="M1.6,235.1h2c4.6-2.6,9.3-4.9,13.6-7.1c18.2-9.8,42.3-15.4,47.1-16.2
C59.3,212.3,34.5,215.8,1.6,235.1z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#050826;" d="M14.3,235.1c4.5-3.9,8.5-7.3,11.4-9.6c11.9-9.8,60.2-45,60.2-45
c-20.2,3.7-39.5,11.1-57,21.9C18.6,208.7,8.7,217.3,0,226v9.1H14.3z"/>
<path style="fill:#054E7B;" d="M1.6,235.1h2l2.8-2.7c7.2-7,15.4-13.2,22.5-19c20.4-16.8,49-29.8,54.9-32
C77.2,183.4,42.2,195.8,1.6,235.1z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#0D3057;" d="M276,235.2c7.2-2.8,14.8-4.5,22.6-5.1
c11.7-0.8,25.6,2.5,32.8,5.1H276z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#08203E;" d="M332.6,235.1l-0.6-0.8c-8.7-12.5-45.6-58.8-45.6-58.8
c18.3,8.8,34.7,21,48.5,35.9l1.1,1.2v22.6L332.6,235.1L332.6,235.1z"/>
<path style="fill:#054E7B;" d="M288.2,176.9l-0.9-0.6C287.6,176.4,287.9,176.6,288.2,176.9z"/>
<path style="fill:#054E7B;" d="M336.1,225v2.3c-1.4-1.9-2.7-3.7-4-5.5c-15-21.4-38.9-41.4-43.9-45
C292.8,179.9,313.4,194.2,336.1,225z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#0D3057;" d="M336.1,199.2v30.3c-0.8-2.3-1.6-4.3-2.2-5.9
c-4.2-11.2-23.4-53.4-23.4-53.4C320.5,178.4,329.1,188.2,336.1,199.2z"/>
<path style="fill:#054E7B;" d="M336.1,213.6c-7.4-18.9-21.4-38.2-24.5-42c2.7,2.9,13.9,15.7,24.5,39.5V213.6z"/>
<path style="fill:#054E7B;" d="M311.6,171.6c-0.4-0.4-0.6-0.6-0.6-0.7C311.2,171.1,311.5,171.3,311.6,171.6z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#0D3057;" d="M320.4,235.1c-13.9-7.1-49.5-23.5-49.5-23.5
c15.9-0.3,31.7,2.4,46.7,8c6.5,2.5,12.7,5.6,18.6,9.2v6.3H320.4z"/>
<path style="fill:#054E7B;" d="M334.6,235.1h-2c-4.5-2.6-9.2-4.9-13.4-7.1c-18.1-9.7-41.8-15.2-46.6-16.1
C277.5,212.5,302,216.1,334.6,235.1z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#07293C;" d="M322,235.1c-4.5-3.8-8.4-7.2-11.2-9.5
c-11.8-9.7-59.6-44.5-59.6-44.5c20,3.6,39.1,11,56.4,21.7c10.1,6.3,20,14.8,28.6,23.4v9L322,235.1z"/>
<path style="fill:#054E7B;" d="M334.5,235.1h-1.9l-2.8-2.7c-7.1-6.9-15.2-13.1-22.3-18.8c-20.2-16.6-48.5-29.5-54.3-31.7
C259.7,184,294.3,196.2,334.5,235.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,899 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="2850px" height="1800px" viewBox="0 0 2850 1800" style="enable-background:new 0 0 2850 1800;" xml:space="preserve">
<path style="fill:#B34070;" d="M0,0h2850v1800H0V0z"/>
<path style="opacity:8.000000e-02;fill:#E5EDD4;enable-background:new ;" d="M1409.8,393.6c329.7,0,597.1,267.3,597.1,597.1
s-267.3,597.1-597.1,597.1s-597.1-267.3-597.1-597.1S1080.1,393.6,1409.8,393.6z"/>
<path style="opacity:8.000000e-02;fill:#E5EDD4;enable-background:new ;" d="M1409.8,561c237.3,0,429.7,192.4,429.7,429.7
s-192.4,429.7-429.7,429.7S980.1,1228,980.1,990.7S1172.5,561,1409.8,561z"/>
<path style="fill:#FFFFFF;" d="M1409.8,673.9c175,0,316.8,141.8,316.8,316.8s-141.8,316.8-316.8,316.8S1093,1165.6,1093,990.7
S1234.8,673.9,1409.8,673.9z"/>
<g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1707.5,264.5c0.6-1.2,0.6-2.5-0.2-3.6c-0.7-0.8-1.7-1.3-2.7-1.3c-0.9,0-1.8,0.4-2.5,1
c-1.1,1.1-1.1,2.6-0.5,3.9c0.7,1.4,2.9,2,4.2,1.1c1.5-0.9,1.9-2.7,1.1-4.2c0,0,0,0,0-0.1c0.1,0.2,0.2,0.5,0.3,0.7c0,0,0,0,0-0.1
c0,0.5,0,1.1,0,1.6c0,0,0,0,0,0c-0.1,0.2-0.2,0.5-0.3,0.7c0,0,0,0,0,0c-0.2,0.2-0.3,0.4-0.5,0.6c0,0,0,0,0,0
c-0.2,0.2-0.4,0.3-0.6,0.5c0,0,0,0,0,0c-0.2,0.1-0.5,0.2-0.7,0.3c0,0,0.1,0,0.1,0c-0.3,0-0.5,0.1-0.8,0.1c0.1,0,0.1,0,0.2,0
c-0.3,0-0.5-0.1-0.8-0.1c0,0,0.1,0,0.1,0c-0.2-0.1-0.5-0.2-0.7-0.3c0,0,0,0,0,0c-0.2-0.2-0.4-0.3-0.6-0.5c0,0,0,0,0,0
c-0.2-0.2-0.3-0.4-0.5-0.6c0,0,0,0,0,0c-0.1-0.2-0.2-0.5-0.3-0.7c0,0,0,0,0,0c0-0.5,0-1.1,0-1.6c0,0,0,0,0,0.1
c0.1-0.2,0.2-0.5,0.3-0.7c0,0,0,0,0,0.1c-0.4,0.8-0.5,1.5-0.3,2.4c0.2,0.7,0.7,1.5,1.4,1.8C1704.7,266.3,1706.7,266,1707.5,264.5
L1707.5,264.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1717.6,179.1c-0.3,0.3-0.6,0.6-0.8,0.8c-1.1,1.1-1.2,3.2,0,4.3c1.2,1.1,3.1,1.2,4.3,0
c0.3-0.3,0.6-0.6,0.8-0.8c1.1-1.1,1.2-3.2,0-4.3C1720.8,178,1718.9,177.9,1717.6,179.1L1717.6,179.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1757.5,137c-0.3-0.3-0.6-0.6-0.8-0.8c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.3,0.3,0.6,0.6,0.8,0.8c1.1,1.1,3.2,1.2,4.3,0C1758.6,140.1,1758.7,138.2,1757.5,137L1757.5,137z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1811.2,167.2c0-0.3,0-0.6,0-0.8c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.3,0,0.6,0,0.8c0,1.6,1.4,3.1,3.1,3.1C1809.8,170.2,1811.2,169,1811.2,167.2L1811.2,167.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1760.8,334c0-0.8-0.1-1.6-0.1-2.5c-0.1-1.6-1.4-3.1-3.1-3.1c-1.6,0.1-3.1,1.4-3.1,3.1
c0,0.8,0.1,1.6,0.1,2.5c0.1,1.6,1.4,3.1,3.1,3.1C1759.4,337,1760.9,335.8,1760.8,334L1760.8,334z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1726.9,381.4c-0.3-0.3-0.6-0.5-0.8-0.8c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.3,0.3,0.6,0.5,0.8,0.8c1.1,1.1,3.2,1.2,4.3,0C1728.1,384.5,1728.2,382.6,1726.9,381.4L1726.9,381.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1647.2,280.6c-0.2,0-0.3,0-0.5,0c-4,0-4,6.1,0,6.1c0.2,0,0.3,0,0.5,0
C1651.1,286.7,1651.1,280.6,1647.2,280.6c-0.2,0-0.3,0-0.5,0c-4,0-4,6.1,0,6.1c0.2,0,0.3,0,0.5,0
C1651.1,286.7,1651.1,280.6,1647.2,280.6L1647.2,280.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1576.1,280.6c-0.3,0-0.6,0-0.8,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.3,0,0.6,0,0.8,0c1.6,0,3.1-1.4,3.1-3.1C1579.1,282,1577.9,280.6,1576.1,280.6L1576.1,280.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1575.9,355.5c0-0.2,0-0.3,0-0.5c0-4-6.1-4-6.1,0c0,0.2,0,0.3,0,0.5
C1569.8,359.5,1575.9,359.5,1575.9,355.5c0-0.2,0-0.3,0-0.5c0-4-6.1-4-6.1,0c0,0.2,0,0.3,0,0.5
C1569.8,359.5,1575.9,359.5,1575.9,355.5L1575.9,355.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1475.9,313.1c0.3-0.3,0.6-0.5,0.8-0.8c1.1-1.1,1.2-3.2,0-4.3c-1.2-1.1-3.1-1.2-4.3,0
c-0.3,0.3-0.6,0.5-0.8,0.8c-1.1,1.1-1.2,3.2,0,4.3C1472.8,314.2,1474.7,314.3,1475.9,313.1L1475.9,313.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1421.7,255.4c4,0,4-6.1,0-6.1C1417.8,249.2,1417.8,255.4,1421.7,255.4L1421.7,255.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1548.6,186.5c-0.3-0.3-0.6-0.6-0.8-0.8c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.3,0.3,0.6,0.6,0.8,0.8c1.1,1.1,3.2,1.2,4.3,0C1549.7,189.7,1549.8,187.8,1548.6,186.5L1548.6,186.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1397,378c-0.3,0-0.6,0-0.8,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1c0.3,0,0.6,0,0.8,0
c1.6,0,3.1-1.4,3.1-3.1C1400,379.4,1398.7,378,1397,378L1397,378z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1527.4,463.9c-0.3,0-0.6,0-0.8,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.3,0,0.6,0,0.8,0c1.6,0,3.1-1.4,3.1-3.1C1530.4,465.3,1529.2,463.9,1527.4,463.9L1527.4,463.9z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1929.6,523.3c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1C1932.6,524.7,1931.3,523.3,1929.6,523.3L1929.6,523.3z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2096.1,422.7c4,0,4-6.1,0-6.1C2092.2,416.5,2092.2,422.7,2096.1,422.7L2096.1,422.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2272.5,427.7c-0.5-0.1-1.1-0.1-1.6-0.2c-0.7-0.1-1.7,0.4-2.2,0.9c-0.5,0.5-0.9,1.4-0.9,2.2
c0,0.8,0.3,1.6,0.9,2.2c0.6,0.6,1.3,0.8,2.2,0.9c0.5,0.1,1.1,0.1,1.6,0.2c0.7,0.1,1.7-0.4,2.2-0.9c0.5-0.5,0.9-1.4,0.9-2.2
c0-0.8-0.3-1.6-0.9-2.2C2274,428,2273.3,427.8,2272.5,427.7L2272.5,427.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1915,253.2c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0
C1918.9,259.3,1919,253.2,1915,253.2c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0C1918.9,259.3,1919,253.2,1915,253.2
L1915,253.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2039.5,227.3c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0
C2043.5,233.4,2043.5,227.3,2039.5,227.3c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0
C2043.5,233.4,2043.5,227.3,2039.5,227.3L2039.5,227.3z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1880,79.4c-0.5-0.5-1.1-1.1-1.6-1.6c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.5,0.5,1.1,1.1,1.6,1.6c1.1,1.1,3.2,1.2,4.3,0C1881.1,82.5,1881.2,80.6,1880,79.4L1880,79.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1939.3,71.7c4,0,4-6.1,0-6.1C1935.3,65.6,1935.3,71.7,1939.3,71.7L1939.3,71.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1816.3,92.7c4,0,4-6.1,0-6.1C1812.4,86.6,1812.4,92.7,1816.3,92.7L1816.3,92.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1853.5,7c4,0,4-6.1,0-6.1C1849.6,0.9,1849.6,7,1853.5,7L1853.5,7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1929.6,31.6c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1C1932.6,33,1931.3,31.6,1929.6,31.6L1929.6,31.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2022.8,37.3c-0.5,0.5-1.1,1.1-1.6,1.6c-1.1,1.1-1.2,3.2,0,4.3c1.2,1.1,3.1,1.2,4.3,0
c0.5-0.5,1.1-1.1,1.6-1.6c1.1-1.1,1.2-3.2,0-4.3C2025.9,36.2,2024,36.1,2022.8,37.3L2022.8,37.3z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2060.4,94.5c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C2059,97.5,2060.4,96.2,2060.4,94.5L2060.4,94.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2092.7,143c0-0.3,0-0.6,0-0.9c0-4-6.1-4-6.1,0c0,0.3,0,0.6,0,0.9
C2086.6,147,2092.7,147,2092.7,143c0-0.3,0-0.6,0-0.9c0-4-6.1-4-6.1,0c0,0.3,0,0.6,0,0.9C2086.6,147,2092.7,147,2092.7,143
L2092.7,143z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2190,8.9c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1c0.5,0,1.1,0,1.6,0
c1.6,0,3.1-1.4,3.1-3.1C2192.9,10.4,2191.7,8.9,2190,8.9L2190,8.9z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2266,5.4c4,0,4-6.1,0-6.1C2262-0.8,2262,5.4,2266,5.4L2266,5.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2266,120.5c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1C2269,122,2267.7,120.5,2266,120.5L2266,120.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2490.8,17c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0
C2494.7,23.2,2494.7,17,2490.8,17c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0C2494.7,23.2,2494.7,17,2490.8,17
L2490.8,17z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2569.9,58.9c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C2568.5,61.9,2569.9,60.6,2569.9,58.9L2569.9,58.9z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2642.8,351.5c-0.1,0-0.1,0-0.2,0c0.3,0,0.5,0.1,0.8,0.1c0,0,0,0-0.1,0c0.2,0.1,0.5,0.2,0.7,0.3
c0,0-0.1,0-0.1-0.1c0.2,0.2,0.4,0.3,0.6,0.5c0,0-0.1-0.1-0.1-0.1c0.2,0.2,0.3,0.4,0.5,0.6c0,0-0.1-0.1-0.1-0.1
c0.1,0.2,0.2,0.5,0.3,0.7c0-0.1,0-0.1-0.1-0.2c0,0.3,0.1,0.5,0.1,0.8c0-0.1,0-0.2,0-0.2c0,0.3-0.1,0.5-0.1,0.8
c0-0.1,0-0.1,0.1-0.2c-0.1,0.2-0.2,0.5-0.3,0.7c0-0.1,0.1-0.1,0.1-0.2c-0.2,0.2-0.3,0.4-0.5,0.6c0,0,0.1-0.1,0.1-0.1
c-0.2,0.2-0.4,0.3-0.6,0.5c0,0,0,0,0.1,0c-0.2,0.1-0.5,0.2-0.7,0.3c0,0,0.1,0,0.1,0c-0.3,0-0.5,0.1-0.8,0.1c0,0,0.1,0,0.1,0
c-0.3,0-0.5-0.1-0.8-0.1c0,0,0.1,0,0.1,0c0.8,0.1,1.6,0.1,2.4-0.3c0.6-0.4,1.2-1.1,1.4-1.8c0.3-1.5-0.5-3.5-2.1-3.8
c-1.3-0.2-2.4,0-3.4,0.9c-0.7,0.7-1.1,1.7-1.1,2.7c0,0.9,0.2,1.7,0.8,2.4c0.7,0.8,1.7,1.5,2.8,1.4c0.8-0.1,1.6-0.3,2.2-0.9
c0.5-0.5,0.9-1.4,0.9-2.2C2645.8,353.1,2644.5,351.4,2642.8,351.5L2642.8,351.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2480.8,478.6c0-0.1,0-0.2-0.1-0.3C2481,478.7,2480.8,479,2480.8,478.6c0-0.4,0,0.7,0,0.3
c0-0.4,0.4-0.1-0.1,0.2c0,0,0.2-0.2,0.2-0.3c0,0.1-0.5,0.6-0.2,0.2c0.3-0.4-0.5,0.3-0.2,0.1c0.3-0.2-0.8,0.3-0.2,0.1
c1.5-0.5,2.7-2.1,2.1-3.8c-0.5-1.5-2.1-2.7-3.8-2.1c-2.8,0.9-4.7,4-3.8,6.9c0.5,1.5,2.2,2.7,3.8,2.1
C2480.2,481.9,2481.3,480.3,2480.8,478.6L2480.8,478.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2596.8,573.4c-0.5-1.1-1.1-2.2-1.6-3.2c-0.7-1.4-2.9-2-4.2-1.1c-1.5,0.9-1.9,2.7-1.1,4.2
c0.5,1.1,1.1,2.2,1.6,3.2c0.7,1.4,2.9,2,4.2,1.1C2597.2,576.6,2597.6,574.9,2596.8,573.4L2596.8,573.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2744.6,508.6c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C2743.1,511.6,2744.6,510.3,2744.6,508.6L2744.6,508.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2746.2,659c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1c0,0.5,0,1.1,0,1.6
c0,1.6,1.4,3.1,3.1,3.1C2744.8,662,2746.2,660.7,2746.2,659L2746.2,659z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M2393.6,709.1c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C2392.2,712.1,2393.6,710.8,2393.6,709.1L2393.6,709.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1905.1,730.1c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C1903.7,733.1,1905.1,731.9,1905.1,730.1L1905.1,730.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1591.5,632.9c4,0,4-6.1,0-6.1C1587.6,626.8,1587.6,632.9,1591.5,632.9L1591.5,632.9z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1392.4,587.8c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C1391,590.8,1392.4,589.5,1392.4,587.8L1392.4,587.8z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1061,642.6c4,0,4-6.1,0-6.1C1057.1,636.5,1057.1,642.6,1061,642.6L1061,642.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M955.3,467.6c-0.5,0.5-1.1,1.1-1.6,1.6c-1.1,1.1-1.2,3.2,0,4.3c1.2,1.1,3.1,1.2,4.3,0
c0.5-0.5,1.1-1.1,1.6-1.6c1.1-1.1,1.2-3.2,0-4.3C958.5,466.4,956.5,466.4,955.3,467.6L955.3,467.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M975.3,371.2c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1C978.3,372.6,977,371.2,975.3,371.2L975.3,371.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1200.1,304.6c4,0,4-6.1,0-6.1C1196.2,298.5,1196.2,304.6,1200.1,304.6L1200.1,304.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M958.6,181.3c-0.5,0.5-1.1,1.1-1.6,1.6c-1.1,1.1-1.2,3.2,0,4.3c1.2,1.1,3.1,1.2,4.3,0
c0.5-0.5,1.1-1.1,1.6-1.6c1.1-1.1,1.2-3.2,0-4.3C961.7,180.2,959.8,180.1,958.6,181.3L958.6,181.3z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M951,93.1c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0C955,99.2,955,93.1,951,93.1
c-0.3,0-0.6,0-0.9,0c-4,0-4,6.1,0,6.1c0.3,0,0.6,0,0.9,0C955,99.2,955,93.1,951,93.1L951,93.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M684.2,120.5c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1c0.1,1.7,1.3,3.1,3.1,3.1
c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1C687.2,122,685.9,120.5,684.2,120.5L684.2,120.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M723.1,44.4c0,0.3,0,0.6,0,0.9c0,4,6.1,4,6.1,0c0-0.3,0-0.6,0-0.9
C729.3,40.4,723.1,40.4,723.1,44.4c0,0.3,0,0.6,0,0.9c0,4,6.1,4,6.1,0c0-0.3,0-0.6,0-0.9C729.3,40.4,723.1,40.4,723.1,44.4
L723.1,44.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M682.3,390.5c-0.1-0.5-0.1-1.1-0.2-1.6c-0.1-0.8-0.3-1.6-0.9-2.2c-0.5-0.5-1.4-0.9-2.2-0.9
c-0.8,0-1.6,0.3-2.2,0.9c-0.5,0.6-1,1.4-0.9,2.2c0.1,0.5,0.1,1.1,0.2,1.6c0.1,0.8,0.3,1.6,0.9,2.2c0.5,0.5,1.4,0.9,2.2,0.9
c0.8,0,1.6-0.3,2.2-0.9C681.9,392.1,682.3,391.3,682.3,390.5L682.3,390.5z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M478.8,37.7c1.1,0,2.2,0,3.2,0c1.6,0,3.1-1.4,3.1-3.1c-0.1-1.7-1.3-3.1-3.1-3.1
c-1.1,0-2.2,0-3.2,0c-1.6,0-3.1,1.4-3.1,3.1C475.8,36.3,477,37.7,478.8,37.7L478.8,37.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M226.4,91.1c0.5,0,1.1,0,1.6,0c1.6,0,3.1-1.4,3.1-3.1c-0.1-1.7-1.3-3.1-3.1-3.1
c-0.5,0-1.1,0-1.6,0c-1.6,0-3.1,1.4-3.1,3.1C223.5,89.7,224.7,91.1,226.4,91.1L226.4,91.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M271.7,274.1c-0.4,0,0.5,0.1,0.5,0.1c-0.4-0.1,0.5,0.2,0.5,0.2c-0.4-0.2,0.6,0.5,0.4,0.3
c-0.2-0.2,0.5,0.7,0.3,0.4c-0.3-0.4,0.3,0.8,0.1,0.3c-0.1-0.5,0,0.9,0,0.3c0,0,0-0.2,0-0.2c0,0-0.1,0.9-0.1,0.5
c0.1-0.6-0.3,0.5-0.1,0.3c0.2-0.3-0.3,0.4-0.3,0.4c0.3-0.3-0.6,0.4-0.4,0.3c0.2-0.1-0.8,0.3-0.5,0.2c0.2-0.1-0.9,0.1-0.5,0.1
c1.6,0.1,3.1-1.5,3.1-3.1c-0.1-1.7-1.3-3-3.1-3.1c-2.5-0.1-4.3,2.2-4.3,4.6c0,2.4,1.8,4.7,4.3,4.6c1.6-0.1,3.1-1.4,3.1-3.1
C274.7,275.6,273.4,274,271.7,274.1L271.7,274.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M54.8,434.2c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1c0,0.5,0,1.1,0,1.6
c0,1.6,1.4,3.1,3.1,3.1C53.4,437.2,54.8,435.9,54.8,434.2L54.8,434.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M162.3,566.2c-0.5-0.5-1.1-1.1-1.6-1.6c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.5,0.5,1.1,1.1,1.6,1.6c1.1,1.1,3.2,1.2,4.3,0C163.4,569.3,163.5,567.4,162.3,566.2L162.3,566.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M93.1,731.6c0.5-1.1,1.1-2.1,1.6-3.2c0.7-1.4,0.4-3.4-1.1-4.2c-1.4-0.7-3.4-0.4-4.2,1.1
c-0.5,1.1-1.1,2.1-1.6,3.2c-0.7,1.4-0.4,3.4,1.1,4.2C90.3,733.4,92.3,733.1,93.1,731.6L93.1,731.6z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M294.9,868.7c-0.5-0.5-1.1-1.1-1.6-1.6c-1.1-1.1-3.2-1.2-4.3,0c-1.1,1.2-1.2,3.1,0,4.3
c0.5,0.5,1.1,1.1,1.6,1.6c1.1,1.1,3.2,1.2,4.3,0C296.1,871.8,296.1,869.9,294.9,868.7L294.9,868.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M517.4,613.7c0-0.5,0-1.1,0-1.6c0-1.6-1.4-3.1-3.1-3.1c-1.7,0.1-3.1,1.3-3.1,3.1
c0,0.5,0,1.1,0,1.6c0,1.6,1.4,3.1,3.1,3.1C516,616.7,517.4,615.4,517.4,613.7L517.4,613.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M663.1,636.2c4,0,4-6.1,0-6.1C659.2,630,659.2,636.2,663.1,636.2L663.1,636.2z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1230.3,100.8c-1.3,0-2.6,0-3.9,0c-4,0-4,6.1,0,6.1c1.3,0,2.6,0,3.9,0
C1234.2,106.9,1234.2,100.8,1230.3,100.8c-1.3,0-2.6,0-3.9,0c-4,0-4,6.1,0,6.1c1.3,0,2.6,0,3.9,0
C1234.2,106.9,1234.2,100.8,1230.3,100.8L1230.3,100.8z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1481.3,65.7c0-2.1,0-4.2,0-6.4c0-4-6.1-4-6.1,0c0,2.1,0,4.2,0,6.4
C1475.2,69.6,1481.3,69.7,1481.3,65.7L1481.3,65.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1339.2,189.4c-2.1-0.3-4.2-0.6-6.2-0.9c-1.6-0.2-3.3,0.4-3.8,2.1c-0.4,1.4,0.5,3.5,2.1,3.8
c2.1,0.3,4.2,0.6,6.2,0.9c1.6,0.2,3.3-0.4,3.8-2.1C1341.8,191.7,1340.9,189.6,1339.2,189.4L1339.2,189.4z"/>
</g>
</g>
<g>
<g>
<path style="fill:#FFFFFF;" d="M1588.5,74.2c2.1-2.1,4.2-4.2,6.4-6.4c2.8-2.8-1.5-7.1-4.3-4.3c-2.1,2.1-4.2,4.2-6.4,6.4
C1581.4,72.7,1585.7,77,1588.5,74.2L1588.5,74.2z"/>
</g>
</g>
</g>
<g>
<g>
<path style="fill:#631F3D;" d="M2278.7,669.8c17.3-24.8,50.5-75.4,50.5-100.2c0-33.6-27.2-60.8-60.8-60.8
c-33.6,0-60.8,27.2-60.8,60.8c0,24.8,33.2,75.5,50.5,100.2H2278.7z"/>
</g>
<g>
<path style="fill:#812E52;" d="M2091.1,784c12.1-17.2,35.1-52.4,35.1-69.7c0-23.3-18.9-42.3-42.3-42.3s-42.3,18.9-42.3,42.3
c0,17.2,23.1,52.4,35.1,69.7H2091.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#812E52;" d="M1106.9,737.5c7.2-6.2,16.2-12.8,25.4-10.3c5.1,1.4,12.3,4,17.3,10.3c0,0,13.4-10,20.7-10.9
s15.1,1.1,20.6,6c-5-2.7-11.1-1.6-16.5,0.3c-9.9,3.6-18.8,9.7-25.7,17.6c-3.8-6.5-8.1-13.4-15.2-15.9
C1124.7,731.3,1115.1,732.8,1106.9,737.5"/>
</g>
<g>
<path style="fill:#812E52;" d="M1156.5,773.6c7.2-6.2,16.2-12.8,25.4-10.3c5.1,1.4,12.3,4,17.3,10.3c0,0,13.4-10,20.7-10.9
s15.1,1.1,20.6,6c-5-2.7-11.1-1.6-16.5,0.3c-9.9,3.6-18.8,9.7-25.7,17.6c-3.8-6.5-8.1-13.4-15.2-15.9
C1174.3,767.4,1164.7,768.9,1156.5,773.6"/>
</g>
<g>
<path style="fill:#812E52;" d="M1396.6,875.9c3.2-2.7,7.1-5.6,11.1-4.5c2.2,0.6,5.4,1.8,7.6,4.5c0,0,5.9-4.4,9.1-4.8
s6.6,0.5,9,2.6c-2.2-1.2-4.9-0.7-7.2,0.1c-4.3,1.6-8.2,4.2-11.3,7.7c-1.7-2.8-3.6-5.9-6.7-7
C1404.4,873.2,1400.2,873.9,1396.6,875.9"/>
</g>
<g>
<path style="fill:#812E52;" d="M1015,830.9c-3.3-24.6,21.7-26.9,26.7-20.6c0,0,16.3-15.6,33,16.5c-18-13.1-26.9-11.4-33.8-3.5
C1037,816.7,1027,812.7,1015,830.9"/>
</g>
<g>
<path style="fill:#812E52;" d="M1325.4,761.8c-3.3-24.6,21.9-23.3,26.8-17c0,0,16.1-19.2,32.8,12.8c-18-13.1-26.9-11.4-33.8-3.5
C1347.5,747.7,1337.4,743.6,1325.4,761.8"/>
</g>
<g>
<path style="fill:#812E52;" d="M1269.6,845.1c-0.4-15.5,15.2-13,17.8-8.7c0,0,11.3-10.8,19.5,10.2c-10.3-9.3-16-8.9-20.8-4.5
C1284.2,837.9,1278.2,834.7,1269.6,845.1"/>
</g>
<g>
<path style="fill:#812E52;" d="M953.7,724.5c7.5-1.5,16.3-2.7,21.8,2.6c3,2.9,7.1,7.6,8.1,14c0,0,13.3-1.8,18.8,0.4
s10.2,6.6,12.1,12.2c-2.4-3.8-7.2-5.5-11.7-6.2c-8.3-1.3-17-0.5-24.9,2.4c-0.2-6-0.5-12.6-4.5-17.1
C968.6,727,961.3,724.4,953.7,724.5"/>
</g>
<g>
<path style="fill:#812E52;" d="M1401.6,805.1c3.5-3.8,7.8-8,13-7.3c2.8,0.4,6.9,1.3,10,4.4c0,0,6.6-6.3,10.4-7.3s8.2-0.5,11.5,1.8
c-2.9-1.1-6.1-0.1-8.9,1.3c-5.1,2.6-9.5,6.5-12.6,11.2c-2.5-3.2-5.3-6.7-9.3-7.6C1410.7,800.6,1405.7,802,1401.6,805.1"/>
</g>
</g>
<g>
<path style="fill:#812E52;" d="M2304.2,854.4c-86.2,31.2-166.1,113.8-225,120.5c-58.9,6.7-92.5-78.1-180.8-49.1
s-342.8,180.8-485.8,187.5S828,823.2,731.2,800.9c-80.5-18.6-314.3,71.5-390.3,102.2l0-0.6c-35.2,13.7-71,26-107.2,36.9
c-37.7,11.4-78.8,21.1-115.9,7.8c-45.2-16.2-73.3-62.5-117.1-82v531.6H2850v-283.4C2850,1113.5,2390.4,823.2,2304.2,854.4z"/>
</g>
<g>
<path style="fill:#B34070;" d="M143.8,953c-8.8-0.9-17.5-2.7-26-5.7c-45.2-16.2-73.3-62.5-117.1-82v32.5
c43.8,19.6,71.9,65.9,117.1,82c8.5,3,155.4,13.1,164.2,13.9L143.8,953z"/>
</g>
<g>
<path style="fill:#B34070;" d="M1898.3,925.9c-88.3,29-342.8,180.8-485.8,187.5c-142.4,6.7-580.8-287.6-680-312.2
c0,0,558.6,396.7,701,390.1c143-6.7,339.4-164,419.4-211.5c23.1-13.7,85.7-59.8,85.7-59.8C1926.4,919.3,1913.2,921,1898.3,925.9z"
/>
</g>
<g>
<path style="fill:#B34070;" d="M2304.2,854.4c-81.8,29.7-158,105.6-215.9,118.9c0,0,94.2-20.9,167.3-68.1
c17.9-11.6,57.4-52.8,57.4-52.8C2309.7,852.8,2306.8,853.5,2304.2,854.4z"/>
</g>
<g>
<path style="fill:#75294A;" d="M2493.3,1166.2c-13.9-2.4-28,1.3-41.4,5.7c-107.2,35.5-203.4,121.2-315.9,110.8
c-112.9-10.5-213.2-118-322.5-87.7c-40.4,11.2-77.4,41.1-119,35.9c-14.1-1.7-27.3-7.5-40.9-11.2c-68.7-18.5-139.2,15-204.2,44
c-64.9,29-142.1,53.8-204.7,20c-18.8-10.2-36.3-25.6-57.6-26.6c-23.4-1.1-47.4,15.6-68.8,6.1c-10.8-4.8-17.8-15.3-24-25.4
c-22.8-37.2-42.8-76.9-73.6-107.8c-30.8-30.9-75.7-52.2-118-41.6c-26.7,6.7-52.4,25.6-79.2,19.1c-17.4-4.2-30.4-18.4-42.2-31.8
c-32.4-36.8-64.8-73.6-97.2-110.5c-8.5-9.6-17.5-19.6-29.5-24.2c-14.5-5.6-30.8-2.3-45.7,1.9c-81.5,22.8-153.9,69.2-230.6,105
c-76.6,35.8-163.8,61.3-245.3,39c-56.1-15.4-92-55.4-132.4-97.2L0,1167.3c0,73.1,29.4,127.8,80.4,166.4c38.2,28.8,90.7,26,138.5,23
c276.3-17.2,553.3,6.5,830,13c201.8,4.7,403.7,0.2,605.5-4.3c226.5-5,452.9-10.1,679.4-15.1c43.4-1,461.3,11.5,501.4-5.2
c40.1-16.7-149.1-73.1-188.9-113.6C2624.9,1209.6,2523.4,1171.4,2493.3,1166.2z"/>
</g>
<g>
<path style="fill:#672140;" d="M-2.1,1471.1c25-49.2,70.4-84.9,117.6-113.5c206.4-124.5,467-136.6,699.7-74
c126.7,34.1,249.8,90.4,345.1,180.6"/>
</g>
<g>
<path style="fill:#672140;" d="M941.7,1328.4c163.3,64,346.7,32.6,518.4-3.3s351.6-75.3,519.8-25.7c49.4,14.6,96.9,36.7,147.9,44.5
c77.9,12,156.3-10.2,234.5-20c80.3-10.1,162.2-7,241.5,9c69.2,14,142.1,42.4,176.9,103.9c3.8,6.7,7.1,14.8,4.4,22
c-3.2,8.4-13.1,11.9-21.7,14.3c-410,112.9-841.7,118.9-1266.4,98c-144.8-7.1-289.9-17.3-432-46c-37.4-7.6-76-17-105.9-40.8
c-29.9-23.8-48.7-65.7-34.5-101.1"/>
</g>
<g style="opacity:0.75;">
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1240.5,1622.4c-57.6,21.4-117.2,37.5-177.8,48.1c-13.1,2.3-16.8,19.3-5.7,26.8
c10.6,7.2,23.4,11.9,36,14.7c22.7,5,46.4,5.6,68.4,13.2c9.7,3.4,20.2,9.9,21,20.2c-73.9,28.5-154.5,33.3-230.8,54.6l811.8-1
c-3.2-7.2-10.9-13.7-18.3-17.5c-71.9-36.9-165.1-10.3-235.2-50.6c40.9-11,81.8-22,122.7-33c9.1-2.4,20.2-7.2,20.3-16.7
c0.1-10-12-14.8-21.8-16.8c-66.9-13.5-134.5-23.5-202.4-30.1c43.9-8.4,87.7-16.8,131.6-25.2c8.9-1.7,20.4-7.1,18.2-15.9
c-1.7-6.8-10.3-8.6-17.2-9.3c-46.8-4.6-93.1-15.4-137.1-32c16.9-16.1,46.5-15.5,66.7-24.7c9.2-4.2,6.2-18-3.9-18.2
c-34.8-0.8-69.7-1.5-104.5-2.3c-7.1-0.2-16.7-2.8-15.3-10.4c0.6-3.2,3-5.7,6-6.8c24-8.5,48-16.9,72-25.4c3.8-1.3,6.4-5,6-9
c-0.4-4.6-4.4-5.9-7.9-6.8c-15.4-4.1-30.8-8.3-46.1-12.4c0.2-6.5,5.9-11.2,10.1-16.2c5.2-6.1,8.2-17.1-2.7-19.6
c-1.4-0.3-2.8-0.4-4.2-0.3c-24.7,0.9-25-0.4-17.5-3h-63.8c-2.7,2.7-23,2.2-23.6,5c-1.1,5.5,13.6,14.8,7.9,16.2
c-12.3,3.1-27.5,6.4-33.7,9.3c-2.5,1.2-5.1,2.5-6.5,4.8c-6.1,10.1,15.8,17.5,15.3,29.3c-0.4,8-10.3,11.2-18.2,12.3
c-10.8,1.5-21.6,3-32.4,4.5c-11.9,1.7-27.4,7.4-23.1,21c2.6,8.2,11.1,12.9,19.6,11.7c11.2-1.6,33.4,7.3,26.8,20.5
c-1.3,2.6-3.5,4.7-6.1,6c-21.1,10.4-44.1,16.9-67.5,19c-11.3,1-26.8,5.5-25,16.8c1.6,10.1,15.4,11.3,25.6,11.3
c24.4-0.2,48.7,7.5,68.6,21.7c1.8,1.3,3.1,3.1,3.6,5.2C1251.5,1617.3,1245.5,1620.5,1240.5,1622.4z"/>
</g>
<g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1477.7,1483.9c-13.5-1.3-27-0.3-40.5,0.6c0,0-0.1,0-0.1,0c-3.8,0.2-3.8,5.9,0,6.1
c1.8,0.1,3.6,0.2,5.4,0.2c12,0.2,24.1-0.3,35.6-3.5C1479.9,1486.9,1479.7,1484.1,1477.7,1483.9
C1477.7,1483.9,1477.7,1483.9,1477.7,1483.9z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1443.1,1424c-0.1-0.3-0.5-0.5-0.8-0.5c-7.9-1.9-13.8-1.9-21.7-0.2c-3.1,0.6-6.5,1.6-7.3,3
c-0.2,0.3-0.3,0.6-0.1,0.9c0.2,0.2,0.5,0.3,0.8,0.3c8.3,1.1,17,2.1,25-0.6c1.3-0.4,2.6-1,3.7-1.9
C1443,1424.8,1443.3,1424.4,1443.1,1424z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1626,1514.6c-2.8-1.6-6.8-3.8-10-3.9c-15.4-0.8-31,2.2-45,8.7c-0.7,0.3-1.5,0.8-1.4,1.6
c0,0.8,1,1.3,1.8,1.5c12.6,3.5,25.7,4.9,38.8,4.2c6-0.3,12.3-1.2,16.9-5.1c1-0.8,2-2,2-3.3
C1628.9,1516.6,1627.4,1515.4,1626,1514.6z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1700.9,1645.3c-0.3-1.3-1.3-2.2-2.4-2.9c-6-4-13.4-5.1-20.5-5.9c-22.4-2.5-57.2-2.6-79.6,0.1
l0.2,0c-1,0.1-2,0.2-3,0.3c-1.1,0.1-2.2,0.3-3,1c-1.6,1.4-1.1,4.2,0.5,5.6c1.6,1.4,3.7,1.9,5.8,2.2c31.5,5.4,63.7,6.9,95.5,4.2
C1697.5,1649.8,1701.5,1648.3,1700.9,1645.3z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1240.2,1436.7c-2-2-2.7-2.3-4.4-3c-9.6-2.1-19.6-2.3-29.3-0.5c-1.9,0.3-3.9,0.9-4.9,2.5
c-1,1.8-0.2,4.2,1.4,5.5s3.6,1.8,5.6,2.2c10,1.8,20.5,0.8,30.1-2.7c1.1-0.4,2.3-1.1,2.4-2.2
C1241.1,1437.8,1240.7,1437.2,1240.2,1436.7z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1125.2,1571.1L1125.2,1571.1C1125.2,1571.1,1125.2,1571.1,1125.2,1571.1c-0.1,0-0.2,0-0.3,0
c-22.7-1.9-44.5-3.5-66.8,1.2c-1.7,0.4-3.5,0.8-4.5,2.2c-1.4,1.9-0.4,4.8,1.6,6.3c1.9,1.4,4.4,1.8,6.8,2c19.6,2,39.4,1,58.7-2.8
c2.8-0.5,5.9-1.4,7.1-4C1128.8,1574,1127,1571.4,1125.2,1571.1z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M1127,1631c-0.5-0.7-1.4-1-2.2-1.2c-4.5-1-7.3-0.4-12.2-0.5l0.7,0c-5.6-0.3-11.2,0.2-16.7,1.3
c-2.2,0.5-4.8,1.4-5.4,3.6c-0.9,3.3,3.1,5.7,6.4,6.3c9.3,1.8,19.3-0.2,27.3-5.3C1126.3,1634.3,1127.9,1632.5,1127,1631z"/>
</g>
<g style="opacity:0.75;">
<path style="fill:#FFFFFF;" d="M962.5,1749.5c-7,0.8-14.6,2-19,7.7c-0.5,0.7-0.9,1.6-0.9,2.5c0,2.6,2.7,3.5,5,3.8
c11.9,1.8,24,0.5,35.9-1.3c28-4.1,55.6-10.7,82.4-19.5c0.6-0.2,1-0.7,1.2-1.2l0,0c0.3-1.2-0.6-2.3-1.9-2.2
C1036.8,1741.6,989.7,1746.3,962.5,1749.5z"/>
</g>
</g>
</g>
<g>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M824.2,1468.9h-84.7c-1.1,0-2-0.9-2-2s0.9-2,2-2h84.7
c1.1,0,2,0.9,2,2S825.3,1468.9,824.2,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1258.5,1468.9H937.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h320.9
c1.1,0,2,0.9,2,2S1259.6,1468.9,1258.5,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1517.3,1468.9h-113.1c-1.1,0-2-0.9-2-2s0.9-2,2-2h113.1
c1.1,0,2,0.9,2,2S1518.4,1468.9,1517.3,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1882.9,1468.9h-196.2c-1.1,0-2-0.9-2-2s0.9-2,2-2h196.2
c1.1,0,2,0.9,2,2S1884,1468.9,1882.9,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M2217.5,1468.9h-123.4c-1.1,0-2-0.9-2-2s0.9-2,2-2h123.4
c1.1,0,2,0.9,2,2S2218.6,1468.9,2217.5,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M2336.3,1468.9h-38.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h38.6
c1.1,0,2,0.9,2,2S2337.4,1468.9,2336.3,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M412.5,1468.9h-38.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h38.6
c1.1,0,2,0.9,2,2S413.6,1468.9,412.5,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M638.8,1468.9H500.2c-1.1,0-2-0.9-2-2s0.9-2,2-2h138.6
c1.1,0,2,0.9,2,2S639.9,1468.9,638.8,1468.9z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M722.2,1506.7H595.1c-1.1,0-2-0.9-2-2s0.9-2,2-2h127.1
c1.1,0,2,0.9,2,2S723.3,1506.7,722.2,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1009.7,1506.7H980c-1.1,0-2-0.9-2-2s0.9-2,2-2h29.7
c1.1,0,2,0.9,2,2S1010.8,1506.7,1009.7,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1331.6,1506.7h-84c-1.1,0-2-0.9-2-2s0.9-2,2-2h84
c1.1,0,2,0.9,2,2S1332.7,1506.7,1331.6,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1101.5,1759.3h-29.7c-1.1,0-2-0.9-2-2s0.9-2,2-2h29.7
c1.1,0,2,0.9,2,2S1102.6,1759.3,1101.5,1759.3z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1423.4,1759.3h-84c-1.1,0-2-0.9-2-2s0.9-2,2-2h84
c1.1,0,2,0.9,2,2S1424.5,1759.3,1423.4,1759.3z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1535.1,1506.7h-35.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h35.6
c1.1,0,2,0.9,2,2S1536.2,1506.7,1535.1,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1977.9,1506.7h-140.7c-1.1,0-2-0.9-2-2s0.9-2,2-2h140.7
c1.1,0,2,0.9,2,2S1979,1506.7,1977.9,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M2190.4,1506.7h-34.7c-1.1,0-2-0.9-2-2s0.9-2,2-2h34.7
c1.1,0,2,0.9,2,2S2191.5,1506.7,2190.4,1506.7z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M739.5,1544.6h-28.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h28.8
c1.1,0,2,0.9,2,2S740.6,1544.6,739.5,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M890.3,1544.6h-93.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h93.8
c1.1,0,2,0.9,2,2S891.4,1544.6,890.3,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1142.6,1544.6h-39.4c-1.1,0-2-0.9-2-2s0.9-2,2-2h39.4
c1.1,0,2,0.9,2,2S1143.7,1544.6,1142.6,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1590.9,1544.6h-132.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h132.8
c1.1,0,2,0.9,2,2S1592,1544.6,1590.9,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1745.9,1544.6h-27.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h27.6
c1.1,0,2,0.9,2,2S1747,1544.6,1745.9,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M2012.1,1544.6h-68.4c-1.1,0-2-0.9-2-2s0.9-2,2-2h68.4
c1.1,0,2,0.9,2,2S2013.2,1544.6,2012.1,1544.6z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M801.4,1582.5h-61.9c-1.1,0-2-0.9-2-2s0.9-2,2-2h61.9
c1.1,0,2,0.9,2,2S802.5,1582.5,801.4,1582.5z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1662.2,1582.5h-85.9c-1.1,0-2-0.9-2-2s0.9-2,2-2h85.9
c1.1,0,2,0.9,2,2S1663.4,1582.5,1662.2,1582.5z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1872.9,1582.5h-35.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h35.8
c1.1,0,2,0.9,2,2S1874,1582.5,1872.9,1582.5z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1466.1,1582.5h-35.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h35.8
c1.1,0,2,0.9,2,2S1467.2,1582.5,1466.1,1582.5z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1336.1,1582.5h-281.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h281.6
c1.1,0,2,0.9,2,2S1337.2,1582.5,1336.1,1582.5z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1040.6,1705.1h-85.9c-1.1,0-2-0.9-2-2s0.9-2,2-2h85.9
c1.1,0,2,0.9,2,2S1041.7,1705.1,1040.6,1705.1z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1186.6,1705.1h-35.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h35.8
c1.1,0,2,0.9,2,2S1187.7,1705.1,1186.6,1705.1z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1562.4,1705.1h-281.6c-1.1,0-2-0.9-2-2s0.9-2,2-2h281.6
c1.1,0,2,0.9,2,2S1563.5,1705.1,1562.4,1705.1z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1070.1,1620.4H869.4c-1.1,0-2-0.9-2-2s0.9-2,2-2h200.7
c1.1,0,2,0.9,2,2S1071.3,1620.4,1070.1,1620.4z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1197.1,1620.4h-66.9c-1.1,0-2-0.9-2-2s0.9-2,2-2h66.9
c1.1,0,2,0.9,2,2S1198.2,1620.4,1197.1,1620.4z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1739.1,1620.4h-16.3c-1.1,0-2-0.9-2-2s0.9-2,2-2h16.3
c1.1,0,2,0.9,2,2S1740.2,1620.4,1739.1,1620.4z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1602.4,1620.4h-308.5c-1.1,0-2-0.9-2-2s0.9-2,2-2h308.5
c1.1,0,2,0.9,2,2S1603.5,1620.4,1602.4,1620.4z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1336.1,1658.2h-324.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h324.8
c1.1,0,2,0.9,2,2S1337.2,1658.2,1336.1,1658.2z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1458.1,1658.2h-67.8c-1.1,0-2-0.9-2-2s0.9-2,2-2h67.8
c1.1,0,2,0.9,2,2S1459.2,1658.2,1458.1,1658.2z"/>
<path style="opacity:0.42;fill:#FFFFFF;enable-background:new ;" d="M1602.4,1658.2h-23.1c-1.1,0-2-0.9-2-2s0.9-2,2-2h23.1
c1.1,0,2,0.9,2,2S1603.5,1658.2,1602.4,1658.2z"/>
</g>
<g>
<path style="fill:#531331;" d="M960.2,1800c-70.4-54.1-140.8-138-211.3-192.1c-7.4-5.7-15-11.5-23.8-14.5c-8.6-3-18-3.3-27.1-3.5
c-67.5-2-134.8-6.4-202-13.3c-32-3.3-108.4-15.6-108.4-15.6c-79.4-128.6-172.6-281.7-252-410.3c-20.3-32.9-41.6-66.8-73.8-88.1
c-18.6-12.3-40-19.7-61.9-24V1800H960.2z"/>
</g>
<path style="fill:#531331;" d="M2788.1,1062.6c-32.2,21.3-53.5,55.2-73.8,88.1c-15.6,25.3-147.5,277.9-147.5,277.9
s-433.4,161.8-442,164.9c-8.8,3.1-16.4,8.9-23.8,14.5c-30.1,23.1-42.1,32.6-71.3,61l4,131.1h42.3H2850v-761.5
C2828.1,1042.9,2806.7,1050.3,2788.1,1062.6z"/>
<g>
<path style="fill:#531331;" d="M2055.4,1649.4c-4.1-3.6-9.7-5.1-15.1-5.1c-5.4,0-10.8,1.3-16.1,2.7c8.7-4.3,18.1-7.3,27.7-8.9
c-6-10.6-17.9-16.1-29.1-20.9c13.1-0.2,26.2,3.6,37.2,10.8c-2-7.3-5.2-14.4-9.3-20.8c11.2,7.1,20.7,17,27.2,28.6"/>
</g>
<g>
<path style="fill:#531331;" d="M2108.8,1608.5c-6.9-0.5-12.8-7.2-12.4-14.2c0.4-7,7.1-12.9,14-12.6c-3.6-8.3-3.7-18.5,1.7-25.7
s17.1-9.6,23.7-3.5c1.4-12,7.4-23.4,16.5-31.3c3-2.6,6.3-4.9,10.2-5.9c4.5-1.2,9.4-0.6,13.8,0.9c9.7,3.2,17.9,10.3,22.5,19.4
s5.3,20,2,29.6c-1,3-2.4,5.9-4.6,8.2c-2,2.1-4.5,3.6-7,5.1c-24.7,14.4-51.8,24.6-79.9,29.9"/>
</g>
<g>
<path style="fill:#531331;" d="M788.3,1656.6c-0.3-15.6,24.1-65.3,21.5-77.8c-2.3-10.7-6.2-20.9-9-31.5c-5.3-20.4-6-41.7-6.6-62.8
c3-0.5,5.9-1.1,8.9-1.6c-4.2,29.4,5,60.5,24.6,82.9c2.2-11.7,8.5-22.5,17.7-30.1c4.8-3.9,10.2-7,15.1-10.8
c10.5-8.3,18-20.5,20.6-33.7c2.5,1.3,5.1,2.6,7.6,3.8c-10,14-15.1,31.3-27.1,43.7c-4.8,5-10.7,9-14.8,14.6
c-6.3,8.5-35.2,81.9-38.5,108.9"/>
</g>
<g>
<path style="fill:#531331;" d="M808.3,1496c-10.5,4-22.1,5-33.1,3c-6.1-1.1-12.2-3.3-16.9-7.4s-7.8-10.3-7-16.5
c1.4-10.1,12.5-16.3,22.8-16.7c-9.6-1.4-17.3-9.1-21.8-17.8c-8.5-16.8-5.8-39.9,9.4-51c9.3-6.8,21.4-8.3,32.9-8.2
c11.5,0.1,23.1,1.6,34.5,0c-1.8-6.3,0.1-13.4,4.8-18c4.7-4.5,11.9-6.2,18.1-4.2c-0.1-7.5,1.9-14.9,5.7-21.4c1.2-2,2.6-4,4.7-5.1
c2-1,4.3-1.1,6.6-1.1c15.2,0.1,30.4,2.9,44.6,8.2c4.7,1.8,9.5,3.9,12.9,7.6c5.8,6.2,6.6,15.8,4.3,23.9c-2.3,8.2-7.3,15.2-12.2,22.2
c7.4-0.8,15,3.7,17.8,10.6s0.5,15.5-5.3,20c14,8.2,27.7,20,30.7,35.9c3.5,18.9-10.5,38.2-28.6,44.5c-18.2,6.3-38.8,1.3-54.9-9.2
c-16.7,14.2-41.8,17.6-61.7,8.3c-3.5-1.6-7.2-4.2-7.3-8.1"/>
</g>
<path style="fill:#3F0021;" d="M0,1111.1c0,0,43,20.2,54.8,64.1c11.8,43.8,64.5,225.6,64.5,225.6l-46,109.6l203.4,71.9l39,108.7
l256.6,4L717.3,1800H0V1111.1z"/>
<g>
<g>
<path style="fill:#3F0021;" d="M520.2,1161.9c30.2,4.1,59.2,17.1,82.4,36.8c7.1,6,14.2,14.7,11.5,23.6c-1.8,6-7.5,9.8-12.1,14.1
s-8.7,10.8-6,16.5c1.3,2.7,3.8,4.5,6.3,6.2c24.8,16.5,54.7,26,75.3,47.5c7.4,7.7,13.4,19.9,7.3,28.6c-2.3,3.4-6.4,6.3-5.8,10.4
c0.3,1.8,1.5,3.3,2.8,4.6c7.1,7.1,16.9,10.5,25.4,15.8c8.5,5.3,16.3,14.2,14.8,24.1c-0.7,4.9-3.7,9.2-6.6,13.3
c-9.6,13.3-20,26.3-32.9,36.5s-28.7,17.4-45.1,17.6c-25.4,0.4-47.8-15.4-70.9-25.8c-2.4-1.1-5-2.2-7.7-2c-3.5,0.2-6.4,2.4-9.3,4.3
c-9.7,6.5-21.5,10.9-33,8.9c-11.8-2.1-21.3-10.4-31.6-16.4c-2.5-1.5-5.2-2.8-8.1-3.1c-4.7-0.4-9,2.2-13.2,4.4
c-37,19.5-83.1,10.6-120.4-8.3c-12-6-24.1-13.8-29.6-26c-7-15.4,0-35.7,15-43.6c4.8-2.5,10.3-3.9,14.5-7.2c4.3-3.3,7-9.8,3.9-14.2
c-2.3-3.3-7.4-5.2-7.2-9.3c0.1-1.6,1-3.1,2-4.4c26.8-35.3,74.9-44.7,113-67.3c1.6-0.9,3.3-2.1,3.7-3.8c0.8-3.2-2.8-5.5-5.4-7.4
c-11.3-8.4-11.5-26.3-3.9-38.1s20.7-18.8,33.5-24.6c12.5-5.6,25.6-10.5,39.2-11.1"/>
</g>
<g>
<path style="fill:#3F0021;" d="M422.9,1415.6c-1.7,17,14.3,76.8,17.3,78.8c16.7,10.8,33.4,21.5,50.2,32.3l0,0
c15.1-5.4,26.7-6,42.6-8.7c9.3-1.6,19.4-3,26-9.7c4.2-4.2,6.3-10,8.2-15.6c8-23.2,14.4-47,19-71.1l11.4,22.6
c-5.2,18.7-10.3,37.4-15.5,56.1c-1.8,6.7-3.8,13.5-7.9,19.1c-9.3,12.7-26.8,15.5-42,19.6c-4.4,1.2-9,2.7-12.3,6
c-2.5,2.5-4,5.8-5.5,9.1c-15.7,35.3-36.7,134.9-47,172.1l-61.4-6.4c16.4-39.1,51.5-134.1,62.2-175.1c0.1-0.4,0.2-0.8,0.3-1.2
c-12.1-8.2-24.1-16.4-36.2-24.7c-2.4-1.6-4.9-3.3-6.4-5.8c-1.5-2.3-1.9-5.2-2.3-7.9c-4.7-30.3-8.5-60.8-11.7-91.3
C417.5,1414.5,417.5,1414.5,422.9,1415.6z"/>
</g>
<g>
<path style="fill:#3F0021;" d="M705.9,1691.1c-18.3-8.9-41.5-6.3-57.5,6.2c-1.1-13.6-12.8-25-26.1-27.8
c-13.4-2.8-27.6,2.2-37.9,11.1c2.8-15.1-6.9-30.6-20.4-37.7c-13.6-7.1-30.1-6.7-44.7-2.2c-14.6,4.5-27.7,12.9-40.4,21.4
c-4.6,3.1-9.6,8.9-6.2,13.2l-5-1.7c-2.1,30.8,17.8,60.1,44.1,76.2c26.3,16.1,58,21,88.9,21.8c29.9,0.8,60.2-2,88.5-11.5
c9.4-3.1,18.8-7.1,26.3-13.7c7.5-6.6,12.9-16.1,12.5-26C727.4,1707.7,717.5,1696.7,705.9,1691.1z"/>
</g>
<g>
<path style="fill:#3F0021;" d="M314.4,1641.7c10.1-12.2,27.2-19.3,42.5-15c12,3.3,21.1,12.7,29.6,21.8c-2-7.8,3.8-16.2,11.5-18.6
s16.3,0.3,22.5,5.3c6.3,5.1,10.5,12.2,13.9,19.4l0,0c11.5,13.2,8.4,27.3,3,43.9c-5.4,16.7-19.2,30.2-35.6,36.3
c-11.2,4.1-23.4,5-35.3,4.4c-8.8-0.4-17.5-1.8-26.1-4.1c-10.3-2.7-20.7-6.8-28-14.6c-8.4-9-11.5-21.9-11.8-34.3
C300.4,1670.4,304.3,1653.9,314.4,1641.7z"/>
</g>
<g>
<path style="fill:#531331;" d="M742.4,1594.4c9.4-17.8,12.3-38.9,8-58.5c8.8,6.2,14.3,16.4,16.9,26.9s2.8,21.4,2.9,32.2
c9.4-8.1,17.2-18,22.9-29c0.5,17.8-6.4,35.7-18.9,48.4c8.3-1.7,16.7-2.7,25.2-2.9c-7.3,5.7-14.6,11.4-21.9,17.1l-50.9-2.7
c7.2-5.6,10.4-15.3,10-24.4s-4.2-17.8-8.9-25.6C734.8,1579.7,740.3,1586.6,742.4,1594.4z"/>
</g>
<g>
<path style="fill:#531331;" d="M838.1,1673.3c9.5-10.2,22.7-16.9,36.5-18.6c-6.1-4.4-14-5.6-21.4-4.9s-14.6,3.1-21.7,5.5
c3.2-8,7.9-15.3,13.8-21.6c-11.8,3.7-21.9,12.3-27.4,23.4c-0.8-5.8-2-11.5-3.8-17.1c-2.1,6.1-4.1,12.2-6.2,18.2l13.4,32.7
c2-6,7.6-10.3,13.7-12.1c6.1-1.8,12.6-1.3,18.8,0C849.5,1674.9,843.7,1672.9,838.1,1673.3z"/>
</g>
</g>
<g>
<g>
<path style="fill:#531331;" d="M205.4,966.8c-1.5-2.1-3.6-3.8-4.8-6.1c-1.2-2.3-1-5.6,1.2-6.9c1.7-1,4.2-0.7,5-2.5
c0.3-0.7,0.2-1.5,0-2.3c-1.8-8.8-6.3-16.3-11.7-23.4c1.9-2.4,3.2-5.3,3.7-8.3c1.3-8.7-6.1-17.7-14.9-18.2c4.3-3.7,6-9.7,5.6-15.3
c-0.4-5.6-2.8-10.9-5.5-15.9c-2.7-4.8-5.8-9.5-9.8-13.2c-7.2-6.7-17-10.3-26.9-11.3c-8.8-0.8-17.6,0.2-26.2,2.1
c-5.1,0.8-10.2,2-15.2,3.5c-5.3,1.6-10.7,3.7-14.9,7.3c-4.2,3.6-7.2,9.2-6.5,14.7c-8.4-3.9-18.7-0.6-25.5,5.6
c-4.4,4-7.8,9.5-7.9,15.4c0,1.3,0.1,2.5,0.4,3.8c-3.8,0.8-7.8,0.5-11.6,1c-4.7,0.5-9.9,2.8-11.3,7.3c-0.7,2.3-0.3,4.7,0.2,7
c1.4,7.7,3.2,15.3,6.7,22.3c3.5,7,8.8,13.3,15.8,16.7c10.8,5.3,23.6,3.1,35.6,3.3c1.3,0,2.6,0.1,3.7,0.7c1.4,0.8,2.3,2.3,3.1,3.7
c2.8,4.8,7,9.1,12.4,10.5c5.5,1.5,11.2-0.1,16.9-0.6c1.4-0.1,2.8-0.2,4.1,0.3c2.1,0.8,3.4,2.8,4.8,4.6
c11.9,15.8,33.5,21.4,53.3,20.9c6.4-0.2,13.1-1,18-5.1C209.1,983.4,210.2,973.3,205.4,966.8z"/>
</g>
<g>
<path style="fill:#531331;" d="M98.8,1032.1c0.1-0.2,30.1-60.8,30.1-60.8c0.4-5.8,0.5-13.3,0.3-21c-8.2,13.6-16.1,27.4-26.5,39.3
c1-27.1,5.5-53.7,10.5-80.2c-7.9,9.2-19.2,40.9-34.8,113.5c-3.9,17.9-17.9,55.1-24.2,72.3l26.9-5.5
C85.7,1070.1,91.6,1050.9,98.8,1032.1z"/>
</g>
<g>
<path style="fill:#531331;" d="M96.7,1094.8c4.6-9.4,12.7-17,22.3-21.2c-5.3-1.8-11.3-1-16.5,1s-9.9,5.3-14.5,8.6
c0.6-6.4,2.4-12.7,5.3-18.5c-7.7,5.2-13.1,13.6-14.7,22.7c-1.8-4-3.9-7.9-6.4-11.5c-0.2,4.8-0.4,9.6-0.6,14.4l16.6,20.7
c0.2-4.7,3.3-9,7.3-11.6s8.8-3.6,13.5-4C105.2,1093.6,100.6,1093.3,96.7,1094.8z"/>
</g>
</g>
<g>
<g>
<path style="fill:#531331;" d="M2145.5,1421c-7.3-9-19-14.2-30.6-13.6c4.6-3.3,8.8-7,12.6-11.1c1.3-1.4,2.6-3,2.8-4.9
c0.3-2.8-2-5.2-4.2-7c-18.8-15.8-44.2-23.5-68.6-20.9c1.7-4.6-0.2-10.2-4.2-13.1c-2-5.5-6.2-10.4-11.1-13.5
c-8.8-5.5-19.4-6.6-29.7-7.7c-3.7-0.4-7.6-0.8-11.2,0.2c-4.1,1.1-7.6,3.7-10.8,6.4c-7.4,6.2-14.2,13.2-20.3,20.9
c-2.7,3.4-5.2,7-6.3,11.2s-0.2,9.1,3.1,11.9c2.9,2.5,8,4.5,6.8,8.2c-0.3,1-1.2,1.8-2,2.5c-10.6,9.3-21.1,18.7-31.7,28
c-5.3,4.7-10.8,9.7-12.5,16.6c-1.7,6.8,2.7,15.5,9.7,15.5c-6.7,1.3-13.1,3.9-18.7,7.7c-1.7,1.2-3.5,2.5-4.5,4.3
c-1,1.8-1.2,4-1.2,6.1c0,15.4,10.7,29.6,24.6,36s30.4,5.9,44.9,0.8c14.5-5.1,27.1-14.4,38.3-25c0.9-0.9,2-1.8,3.3-2
c1.8-0.2,3.2,1.3,4.6,2.4c5.9,4.9,14.8,6,21.7,2.5c6.9-3.5,11.3-11.2,10.9-18.9c12.7,6.9,28,8.4,42.2,5.4
c14.2-3,27.2-10.4,38.1-19.9c4.4-3.8,8.7-8.5,9.4-14.3C2151.3,1430.4,2148.8,1425.1,2145.5,1421z"/>
</g>
<g>
<path style="fill:#531331;" d="M2073.2,1558.1c-1.8-3.4-3.8-6.7-4.8-10.4c-1.1-4.1-0.8-8.3-0.5-12.5c1.8-24.8,3.9-49.6,6.2-74.4
l-12.9-5.6c-3.4,22.5-6.7,45-10.1,67.5c-0.5-0.2-1.1-0.2-1.7-0.3c-12.3-0.7-24.6-1.6-36.9-2.9c-1.4-0.1-2.8-0.3-3.9-1.1
c-1.2-0.9-1.8-2.3-2.4-3.7c-4.6-11.4-9.3-22.9-13.9-34.3l-4.5,0.2c3.7,16.5,8,32.8,12.8,49c0.2,0.8,0.5,1.5,1,2.1
c1.2,1.5,3.5,1.4,5.4,1.3c14.1-1,28.3,0,42.1,2.9c-0.2,1.9-0.4,3.8-0.2,5.6c0.3,2.4,1.1,4.8,1.9,7.1c9.4,26.7,18.9,53.3,28.3,80
c7.3-0.8,14.3-3.3,20.5-7.3c-6.1-15-12.2-29.9-18.3-44.9C2078.8,1570.1,2076.3,1564,2073.2,1558.1z"/>
</g>
</g>
<g>
<g>
<path style="fill:#3F0021;" d="M2471.7,1125.3c-21.6-18.8-50.6-27.7-79.2-28c5.2-8.6,4.9-20.2-0.6-28.6s-16.1-13.2-26-11.9
c15.6-11.2,16.8-35.6,6.7-51.9s-28.5-25.7-46.9-31.2c-22.8-6.9-49-8.5-68.9,4.4c-26.9,17.4-32.7,53.6-36,85.5
c-19-5-40.8-2.5-55.5,10.5c-14.7,13-19.4,37.5-7.1,52.8c-48.4-2.6-100,25.5-114.3,71.8c-5.6,18-4.9,39,6.4,54.1
c9.1,12.2,24,19,39,21.3c15,2.3,57.7-0.9,72.8-3.1c0,0,24.2,44.8,112.7,36c72-7.2,84-32.4,84-32.4s69.1,20.1,104.3-9.6
C2479.1,1251.3,2539.7,1184.6,2471.7,1125.3z"/>
</g>
<g>
<path style="fill:#3F0021;" d="M2390.9,1250.9c-5.1,37.4-10.2,74.8-15.4,112.3c-1.5,11.2-3.2,22.7-8.7,32.6
c-5.3,9.4-13.7,16.7-21.9,23.7c-17.3,14.7-34.5,29.5-51.8,44.2c-9.6-69.2-8.4-139.9,4.3-208.6l-17.6,19.8
c-4.1,31.4-8.2,62.7-12.3,94.1c-0.8,6.4-1.7,12.9-2.4,19.3c-1.3-1.5-3.6-2.2-5.6-2.6c-14.6-3.1-28.5-9-40.9-17.3
c-2.1-1.4-4.3-3-5.5-5.3c-1.1-2.1-1.1-4.6-1.1-7c-0.4-36.7-0.7-73.4-1.1-110.1l-27.2-21.2c5.5,48.9,7.9,98.1,7.2,147.3
c0,3.3-0.1,6.8,1.4,9.7c1.6,3.2,4.8,5.2,7.8,7c19.2,11.4,40.2,19.7,62,24.5c0.4-1.9,0.7-3.9,1.1-5.8c-0.6,8.5-1,17.1-0.8,25.6
c0.5,25.2,5.4,50.1,9.5,75c7.6,45.8,12.5,92.1,14.6,138.5c19.7-0.5,39.5-1.1,59.2-1.6c-21.6-47.2-37.3-97-47.1-148
c22.8-22.1,45.6-44.3,68.4-66.4c5.5-5.4,11.2-10.9,14.4-17.9c2.9-6.2,3.7-13.1,4.5-19.8c6.2-53,12.4-106.1,18.6-159.1
L2390.9,1250.9z"/>
</g>
</g>
<path style="fill:#3F0021;" d="M2676.4,1359.2l-1.7,78l-234.1,135.5v61l-734.8,62.9c0,0-12.8,2-33.7,16.4l-126.4,87h173.8h170.3h144
H2850v-592.9L2676.4,1359.2z"/>
<g>
<path style="fill:#3F0021;" d="M1724.8,1694.8c-1.9-8.7-5.2-17.2-9.6-24.9c9,4.8,17,11.6,23.3,19.7c-0.5-21-10.7-40.4-14.4-61.1
c8.9,7.8,14.9,18.5,18.7,29.7s5.6,23,7.4,34.7c1-13,2-26.4,7.9-38c0.4,11.2,1.4,22.4,3.1,33.5c1.2-8.7,5.2-17,11.3-23.3
c-1.8,12.6-2.5,25.4-2.2,38.2"/>
</g>
<g>
<g>
<path style="fill:#3F0021;" d="M1826.1,1661.2c-3.9-1.2-7.7-2.3-11.6-3.5c-0.9-0.3-1.9-0.6-2.5-1.3c-0.5-0.5-0.8-1.3-1-2
c-1.4-3.9-2.9-7.8-4.3-11.8c3.2-0.5,6.3-1.6,9.1-3.3c-3.6-1.3-8.6-1.8-12.2-3.1c0,0-24.3-30.5-36.2-42.3c9.1,1.2,18,3.3,26.7,6.3
c2.7,0.9,12.8,4.2,12.8,4.2s-2.3,5.2-3.6,7.7c2.2-1.1,4.4-2.2,6.5-3.3c0.7-0.4,2.4-1.3,2.4-1.3s1.6,1.4,2.3,2.1
c8.4,8.3,14.5,18.7,20.4,28.9c1.6,2.7,3.2,6,2.1,9c1.8,0.5,3.7,0.5,5.4-0.1c3.1,9.6,4.6,19.8,4.6,29.9
c-5.3-7.2-12.6-12.9-20.8-16.4"/>
</g>
<g>
<g>
<path style="fill:#3F0021;" d="M1838.3,1664c6.6,12.4,11.1,25.7,13.4,39.6c0.5,2.7,4.5,1.5,4-1.1c-2.4-14.2-7.1-27.8-13.9-40.6
C1840.6,1659.5,1837,1661.6,1838.3,1664L1838.3,1664z"/>
</g>
</g>
<g>
<path style="fill:#3F0021;" d="M1843.8,1574.6c-2.6,3.8-5.2,14-6.2,18.5c1.6,1.2,3,2.5,4.4,4c-2,0.6-4.1,0.8-6.2,0.6
c-0.2,4.6-0.5,9.3-0.7,13.9c-0.1,2.3,0,8.9,0,8.9s3.3,2,5.6,2.1c-1.5,0.8-3,1.5-4.5,2.3c2.6,11,6.8,21.6,12.4,31.3
c4.4-6.9,8.5-22.7,8.5-22.7l1.7-7l-4.9-4.2h5.8C1863.1,1606.4,1856.7,1584.5,1843.8,1574.6"/>
</g>
<g>
<g>
<path style="fill:#3F0021;" d="M1847.5,1614c-1.1,14.3-2.6,28.7-2.4,43c0.2,13.7,2.3,27.2,6,40.4c0.7,2.6,4.8,1.5,4-1.1
c-3.7-13.5-5.8-27.3-5.9-41.3c-0.1-13.7,1.3-27.4,2.4-41.1C1851.9,1611.3,1847.7,1611.4,1847.5,1614L1847.5,1614z"/>
</g>
</g>
<g>
<g>
<path style="fill:#3F0021;" d="M1854.6,1696.1c5.8-28.1,19.6-58.3,43.3-75.6c2.2-1.6,0.1-5.2-2.1-3.6
c-24.7,18-39.2,48.9-45.2,78.2C1850,1697.6,1854,1698.8,1854.6,1696.1L1854.6,1696.1z"/>
</g>
</g>
<g>
<path style="fill:#3F0021;" d="M1903.6,1634.4c5.8-8.3,10.9-17.1,15.8-25.8c-6.1-0.6-12.3,0.2-18.2,2c-0.7,1.8-1.5,3.6-0.6,5.4
c-0.8-1.6-1.2-3.2-1.8-4.5c-4.9,1.8-9.7,4.2-14.1,7c-4.8,3.1-9.4,6.7-13,11c-0.9,1-1.7,2.1-2.5,3.3c0.9,1.9,2.5,3.7,3.4,5.6
c-1.9,0-3.9-0.7-5.8-1.6c-0.9,1.7-1.7,3.4-2.4,5.2c-2.9,8-5.7,20-5.4,28.5l0.7,1.7c7.3-4.1,14.7-8.2,21.3-13.3
c0.2-0.2,0.5-0.4,0.7-0.6c-0.7-1.5-1.7-2.7-0.7-4.6c0,2.1,1.5,2.5,2.9,2.8c6.4-5.4,12-11.7,17-18.5c-2.1-0.9-3.5-4-5.9-4
C1897.9,1634.1,1900.8,1633.5,1903.6,1634.4z"/>
</g>
</g>
<g>
<path style="fill:#672140;" d="M282,1284.4c3.3-7.3,6.7-14.6,10-21.8c0.5-1.1,1.5-2.4,2.6-1.9c0.5,0.2,0.7,0.8,1,1.3
c2.6,5.9,5.2,11.9,7.9,17.8c10-21.2,20.9-42,32.7-62.3c7.2,16.8,12.8,34.3,16.8,52.1c2.5-5.2,5-10.4,7.6-15.6
c0.3-0.6,0.6-1.3,1.2-1.7c2-1.3,4.1,1.5,4.9,3.8c1,3.3,2,6.6,3.1,9.9c3-6.6,6.1-13.2,9.1-19.8c2.8,5.7,4.7,11.9,5.3,18.3"/>
</g>
<g>
<path style="fill:#672140;" d="M626.4,1252.5c1.6-4.9,4.5-9.4,8.2-13c2.1,6.8,4.2,13.5,6.3,20.3c10.7-18.8,23-36.7,36.5-53.6
c4.5,12.4,7.9,25.2,10,38.1c1.8-4.1,4.4-7.8,7.6-10.8c1.1,4.9,2.2,9.8,3.3,14.6c3.8-3.2,7.7-6.4,11.5-9.6
c3.4,11.4,5.5,23.2,6.3,35.1c5.2-7.1,10.3-14.3,15.5-21.4c3.3,4.5,5.1,10,5.2,15.6c3.5-2.8,7.1-5.7,10.6-8.5
c2.8,6.7,4.8,13.8,5.9,21.1"/>
</g>
<g>
<path style="fill:#672140;" d="M905.5,1312.9c2.2-7.8,5.2-15.3,8.9-22.4c0.5,8.9,2.2,17.8,4.8,26.4c1.8-4.8,4.1-9.3,7-13.5
c4.4,6.5-1.5,17.5,4.7,22.3c4.9-16.5,11.2-32.6,18.8-48c0.9-1.8,2.8-3.9,4.5-2.8c4,22.6,6.9,45.4,8.4,68.3c4-8.7,8.1-17.3,12.1-26
c2.1,8.9,3.6,18,4.5,27.1c3.3-4.9,6.5-9.8,9.8-14.7c1.6,7,2.2,14.3,1.7,21.4"/>
</g>
<g>
<g>
<path style="fill:#672140;" d="M1497.3,1320.7l16.8-3.5c-3.1-9.4-6.8-18.6-11-27.6C1500.4,1299.8,1498.4,1310.2,1497.3,1320.7z"/>
</g>
<g>
<path style="fill:#672140;" d="M1514.7,1318.9c0.2-0.7,0.4-1.3,0.6-2l-1.2,0.2C1514.3,1317.8,1514.5,1318.3,1514.7,1318.9z"/>
</g>
<g>
<path style="fill:#672140;" d="M1569.4,1305.7l15.7-3.3c-1.4-8-3.8-15.9-7-23.4c-3,8.5-6.1,17-9.1,25.5
c-4.2-15-9.4-29.7-15.6-43.9c-2.3,8.9-4.4,17.8-6.3,26.7c-3.6-11.8-7.6-23.4-12.2-34.9c-6.2,21.6-12.7,43.1-19.6,64.4l31.6-6.5
l21.1-3.7c0.1,0.2,0.1,0.3,0.2,0.4c0.1-0.2,0.1-0.3,0.2-0.5l1.2-0.2C1569.5,1306.2,1569.5,1306,1569.4,1305.7z"/>
</g>
</g>
<g>
<g>
<path style="fill:#672140;" d="M1672.6,1265.6c-0.3-4.8-0.6-10.3-4.3-13.4c-2.5,6.5-4.9,13.1-7.1,19.8c-1.3-9.7-2.3-19.4-2.8-29.2
c-0.3-5.6-0.5-11.5-3.6-16.2c-2.7,13.3-5.4,26.5-8.1,39.8c-1.9-6.3-4.4-12.4-8.4-17.5c-5.3,16.3-10.5,32.6-15.8,48.9l55.1-5.7
C1674.9,1283.5,1673.2,1274.6,1672.6,1265.6z"/>
</g>
<g>
<path style="fill:#672140;" d="M1716,1261.9c-0.2-1.6-1.1-3.7-2.6-3.1c-0.8,0.3-1.1,1.1-1.3,1.9c-3,9.4-6.1,18.9-9.1,28.3
c-3.2-11.8-6.4-23.6-9.6-35.4c-3.9,12.8-7.9,25.6-11.8,38.5l37.1-4.6C1717.8,1278.9,1716.9,1270.4,1716,1261.9z"/>
</g>
</g>
<g>
<g>
<path style="fill:#672140;" d="M1825.3,1285.7c0.3-1.3,0.7-2.5,1.1-3.8l-1.6-0.1C1824.9,1283.1,1825.1,1284.4,1825.3,1285.7z"/>
</g>
<g>
<path style="fill:#672140;" d="M1821.7,1204.2c-8.3,25.4-16.6,50.7-24.9,76.1l28,1.6C1821.4,1256.1,1825.9,1229.8,1821.7,1204.2z"
/>
</g>
<g>
<path style="fill:#672140;" d="M1849.2,1255.4c-3.7,7.3-6.8,14.9-9.1,22.8c-1.6-9.8-2.2-19.8-1.6-29.8c-4.7,10.9-8.7,22-12.1,33.4
l25.5,1.4C1852.1,1274,1851.2,1264.6,1849.2,1255.4z"/>
</g>
<g>
<path style="fill:#672140;" d="M1795.8,1251.6c-0.2-7.8-0.5-15.8-4-22.8c-6.2,14.4-12.4,28.7-18.6,43.1c-1-5.1-2.1-10.2-3.1-15.2
c-4,7.3-6.9,15.2-8.6,23.4l7.9,0.5c-0.2,0.4-0.3,0.8-0.5,1.2l26.1,0.6c0.3,0.2,0.6,0.3,0.9,0.4c0-0.1,0.1-0.2,0.1-0.4l0.6,0
c0-0.6,0-1.2-0.1-1.8c0-0.1,0.1-0.3,0.1-0.4l-0.2,0C1796.3,1270.7,1796,1261.2,1795.8,1251.6z"/>
</g>
</g>
<g style="opacity:0.11;">
<g>
<path style="fill:#FFFFFF;" d="M642.3,589.8c-21-18.9-55.5-20.4-78-3.4c11.9-32.4-3.5-70.7-30.8-91.8
c-27.3-21.2-63.9-27.3-98.3-24.1C360.8,477.4,292,527.4,262.4,596c-20.8-19.3-53.5-24.4-79.2-12.5s-42.9,40.2-41.7,68.5l512.3,15
C668.4,642.9,663.3,608.7,642.3,589.8z"/>
</g>
<g>
<path style="fill:#FFFFFF;" d="M2073.8,561.5c-19.9-11.1-47.2-6.5-62.4,10.5c3.8-57.8-49-110.8-106.8-114.3
c-57.9-3.5-113.5,37-135.3,90.7c-33.8-26.5-91.5-11-107.4,28.9c-11-18.2-38.1-20.8-56.6-10.5s-30,29.8-38.5,49.3l530.9,4.1
C2104.1,598.3,2093.7,572.6,2073.8,561.5z"/>
</g>
<g>
<path style="fill:#FFFFFF;" d="M1889.2,236.1c-17-10-40.2-8.4-55.6,3.9c-3.7-49.6-51.9-91.4-101.5-88.2
c-48.6,3.2-86.6,41.7-119.5,77.6c-13.9-22.8-43.9-32.1-70.1-27.3c-26.2,4.8-48.9,21.4-67.3,40.6c-8.2-12.1-27.1-12.4-39.3-4.4
s-19.4,21.6-26.1,34.6l503,13.7C1916.1,267.1,1906.3,246.1,1889.2,236.1z"/>
</g>
<g>
<path style="fill:#FFFFFF;" d="M2540.6,352.6c-13.1-3.2-27.1,1.9-37.7,10.3c7.8-23.8-7.2-51.2-29.8-62.1s-50.1-7.4-72.5,3.9
c-22.4,11.3-40.4,29.6-56.7,48.6c-3.9-16.9-25.8-24.2-42.4-18.8c-16.5,5.4-28.6,19.3-39.8,32.6l299.7,15.5
C2564.4,369.4,2553.7,355.9,2540.6,352.6z"/>
</g>
<g>
<path style="fill:#FFFFFF;" d="M2695.1,724.8c-2.2-7.4-9.4-13.9-16.9-12.4c-5.7,1.1-11.1,6.3-16.4,4c0-19.8-2-43.3-19.1-53.4
c-16.5-9.8-38.2-0.9-52.5,12.1c-12.5,11.3-22.2,25.5-28.3,41.1c-10.9-9.6-31.4-1.9-33.2,12.5l165.3,18.9
C2695.7,740.1,2697.3,732.2,2695.1,724.8z"/>
</g>
<g>
<path style="fill:#FFFFFF;" d="M732,231c-18.3-6.9-41.2,5-46.2,23.9c-4.9-39.4-13.9-85.1-49.5-102.8
c-29.3-14.6-65.9-2.9-90.7,18.4s-41,50.7-59.1,77.9c-1.4,2.1-3,4.3-5.4,5c-5.5,1.6-9.2-5.2-13.1-9.3c-8.6-8.9-24.7-5.2-32.7,4.3
c-8,9.4-10.2,22.4-12,34.6l327.7-3.6C759.8,261.9,750.3,237.9,732,231z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 49 KiB

BIN
apps/imgs/seurat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

13
apps/imgs/shared_edge.svg Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 197.04 144.66" style="enable-background:new 0 0 197.04 144.66;" xml:space="preserve">
<style type="text/css">
.st0{fill:rgb(255, 255, 255);}
.st1{fill:#38469D;}
.st2{fill:#37BFC2;}
</style>
<rect class="st0" width="197.04" height="144.66"/>
<polygon class="st1" points="186.07,33.77 110.84,109 83.31,6.23 "/>
<polygon class="st2" points="110.87,109.06 8.11,81.53 83.34,6.3 "/>
</svg>

After

Width:  |  Height:  |  Size: 662 B

BIN
apps/imgs/starry_night.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

317
apps/imgs/tiger.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -0,0 +1,115 @@
import diffvg
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width = 256
canvas_height = 256
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width=canvas_width,
canvas_height=canvas_height,
shapes=shapes,
shape_groups=shape_groups,
filter=pydiffvg.PixelFilter(type = diffvg.FilterType.hann,
radius = torch.tensor(8.0)))
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/optimize_pixel_filter/target.png', gamma=2.2)
target = img.clone()
# Change the pixel filter radius
radius = torch.tensor(1.0, requires_grad = True)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width=canvas_width,
canvas_height=canvas_height,
shapes=shapes,
shape_groups=shape_groups,
filter=pydiffvg.PixelFilter(type = diffvg.FilterType.hann,
radius = radius))
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/optimize_pixel_filter/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([radius], lr=1.0)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width=canvas_width,
canvas_height=canvas_height,
shapes=shapes,
shape_groups=shape_groups,
filter=pydiffvg.PixelFilter(type = diffvg.FilterType.hann,
radius = radius))
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
None,
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/optimize_pixel_filter/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', radius)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width=canvas_width,
canvas_height=canvas_height,
shapes=shapes,
shape_groups=shape_groups,
filter=pydiffvg.PixelFilter(type = diffvg.FilterType.hann,
radius = radius))
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
None,
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/optimize_pixel_filter/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/optimize_pixel_filter/iter_%d.png", "-vb", "20M",
"results/optimize_pixel_filter/out.mp4"])

223
apps/painterly_rendering.py Normal file
View File

@@ -0,0 +1,223 @@
"""
Scream: python painterly_rendering.py imgs/scream.jpg --num_paths 2048 --max_width 4.0
Fallingwater: python painterly_rendering.py imgs/fallingwater.jpg --num_paths 2048 --max_width 4.0
Fallingwater: python painterly_rendering.py imgs/fallingwater.jpg --num_paths 2048 --max_width 4.0 --use_lpips_loss
Baboon: python painterly_rendering.py imgs/baboon.png --num_paths 1024 --max_width 4.0 --num_iter 250
Baboon Lpips: python painterly_rendering.py imgs/baboon.png --num_paths 1024 --max_width 4.0 --num_iter 500 --use_lpips_loss
Kitty: python painterly_rendering.py imgs/kitty.jpg --num_paths 1024 --use_blob
"""
import pydiffvg
import torch
import skimage
import skimage.io
import random
import ttools.modules
import argparse
import math
pydiffvg.set_print_timing(True)
gamma = 1.0
def main(args):
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
perception_loss = ttools.modules.LPIPS().to(pydiffvg.get_device())
#target = torch.from_numpy(skimage.io.imread('imgs/lena.png')).to(torch.float32) / 255.0
target = torch.from_numpy(skimage.io.imread(args.target)).to(torch.float32) / 255.0
target = target.pow(gamma)
target = target.to(pydiffvg.get_device())
target = target.unsqueeze(0)
target = target.permute(0, 3, 1, 2) # NHWC -> NCHW
#target = torch.nn.functional.interpolate(target, size = [256, 256], mode = 'area')
canvas_width, canvas_height = target.shape[3], target.shape[2]
num_paths = args.num_paths
max_width = args.max_width
random.seed(1234)
torch.manual_seed(1234)
shapes = []
shape_groups = []
if args.use_blob:
for i in range(num_paths):
num_segments = random.randint(3, 5)
num_control_points = torch.zeros(num_segments, dtype = torch.int32) + 2
points = []
p0 = (random.random(), random.random())
points.append(p0)
for j in range(num_segments):
radius = 0.05
p1 = (p0[0] + radius * (random.random() - 0.5), p0[1] + radius * (random.random() - 0.5))
p2 = (p1[0] + radius * (random.random() - 0.5), p1[1] + radius * (random.random() - 0.5))
p3 = (p2[0] + radius * (random.random() - 0.5), p2[1] + radius * (random.random() - 0.5))
points.append(p1)
points.append(p2)
if j < num_segments - 1:
points.append(p3)
p0 = p3
points = torch.tensor(points)
points[:, 0] *= canvas_width
points[:, 1] *= canvas_height
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
stroke_width = torch.tensor(1.0),
is_closed = True)
shapes.append(path)
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([len(shapes) - 1]),
fill_color = torch.tensor([random.random(),
random.random(),
random.random(),
random.random()]))
shape_groups.append(path_group)
else:
for i in range(num_paths):
num_segments = random.randint(1, 3)
num_control_points = torch.zeros(num_segments, dtype = torch.int32) + 2
points = []
p0 = (random.random(), random.random())
points.append(p0)
for j in range(num_segments):
radius = 0.05
p1 = (p0[0] + radius * (random.random() - 0.5), p0[1] + radius * (random.random() - 0.5))
p2 = (p1[0] + radius * (random.random() - 0.5), p1[1] + radius * (random.random() - 0.5))
p3 = (p2[0] + radius * (random.random() - 0.5), p2[1] + radius * (random.random() - 0.5))
points.append(p1)
points.append(p2)
points.append(p3)
p0 = p3
points = torch.tensor(points)
points[:, 0] *= canvas_width
points[:, 1] *= canvas_height
#points = torch.rand(3 * num_segments + 1, 2) * min(canvas_width, canvas_height)
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
stroke_width = torch.tensor(1.0),
is_closed = False)
shapes.append(path)
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([len(shapes) - 1]),
fill_color = None,
stroke_color = torch.tensor([random.random(),
random.random(),
random.random(),
random.random()]))
shape_groups.append(path_group)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/painterly_rendering/init.png', gamma=gamma)
points_vars = []
stroke_width_vars = []
color_vars = []
for path in shapes:
path.points.requires_grad = True
points_vars.append(path.points)
if not args.use_blob:
for path in shapes:
path.stroke_width.requires_grad = True
stroke_width_vars.append(path.stroke_width)
if args.use_blob:
for group in shape_groups:
group.fill_color.requires_grad = True
color_vars.append(group.fill_color)
else:
for group in shape_groups:
group.stroke_color.requires_grad = True
color_vars.append(group.stroke_color)
# Optimize
points_optim = torch.optim.Adam(points_vars, lr=1.0)
if len(stroke_width_vars) > 0:
width_optim = torch.optim.Adam(stroke_width_vars, lr=0.1)
color_optim = torch.optim.Adam(color_vars, lr=0.01)
# Adam iterations.
for t in range(args.num_iter):
print('iteration:', t)
points_optim.zero_grad()
if len(stroke_width_vars) > 0:
width_optim.zero_grad()
color_optim.zero_grad()
# Forward pass: render the image.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
t, # seed
None,
*scene_args)
# Compose img with white background
img = img[:, :, 3:4] * img[:, :, :3] + torch.ones(img.shape[0], img.shape[1], 3, device = pydiffvg.get_device()) * (1 - img[:, :, 3:4])
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/painterly_rendering/iter_{}.png'.format(t), gamma=gamma)
img = img[:, :, :3]
# Convert img from HWC to NCHW
img = img.unsqueeze(0)
img = img.permute(0, 3, 1, 2) # NHWC -> NCHW
if args.use_lpips_loss:
loss = perception_loss(img, target) + (img.mean() - target.mean()).pow(2)
else:
loss = (img - target).pow(2).mean()
print('render loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Take a gradient descent step.
points_optim.step()
if len(stroke_width_vars) > 0:
width_optim.step()
color_optim.step()
if len(stroke_width_vars) > 0:
for path in shapes:
path.stroke_width.data.clamp_(1.0, max_width)
if args.use_blob:
for group in shape_groups:
group.fill_color.data.clamp_(0.0, 1.0)
else:
for group in shape_groups:
group.stroke_color.data.clamp_(0.0, 1.0)
if t % 10 == 0 or t == args.num_iter - 1:
pydiffvg.save_svg('results/painterly_rendering/iter_{}.svg'.format(t),
canvas_width, canvas_height, shapes, shape_groups)
# Render the final result.
img = render(target.shape[1], # width
target.shape[0], # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/painterly_rendering/final.png'.format(t), gamma=gamma)
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/painterly_rendering/iter_%d.png", "-vb", "20M",
"results/painterly_rendering/out.mp4"])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("target", help="target image path")
parser.add_argument("--num_paths", type=int, default=512)
parser.add_argument("--max_width", type=float, default=2.0)
parser.add_argument("--use_lpips_loss", dest='use_lpips_loss', action='store_true')
parser.add_argument("--num_iter", type=int, default=500)
parser.add_argument("--use_blob", dest='use_blob', action='store_true')
args = parser.parse_args()
main(args)

View File

@@ -0,0 +1,76 @@
import pydiffvg
import torch
import skimage
import numpy as np
import matplotlib.pyplot as plt
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([1])
points = torch.tensor([[ 50.0, 30.0], # base
[125.0, 400.0], # control point
[170.0, 30.0]]) # base
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
stroke_width = torch.tensor([30.0]),
is_closed = False,
use_distance_approx = False)
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = None,
stroke_color = torch.tensor([0.5, 0.5, 0.5, 0.5]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
None, # background_image
*scene_args)
img /= 256.0
cm = plt.get_cmap('viridis')
img = cm(img.squeeze())
pydiffvg.imwrite(img, 'results/quadratic_distance_approx/ref_sdf.png')
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None, # background_image
*scene_args)
pydiffvg.imwrite(img, 'results/quadratic_distance_approx/ref_color.png')
shapes[0].use_distance_approx = True
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
None, # background_image
*scene_args)
img /= 256.0
img = cm(img.squeeze())
pydiffvg.imwrite(img, 'results/quadratic_distance_approx/approx_sdf.png')
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None, # background_image
*scene_args)
pydiffvg.imwrite(img, 'results/quadratic_distance_approx/approx_color.png')

115
apps/refine_svg.py Normal file
View File

@@ -0,0 +1,115 @@
import pydiffvg
import argparse
import ttools.modules
import torch
import skimage.io
gamma = 1.0
def main(args):
perception_loss = ttools.modules.LPIPS().to(pydiffvg.get_device())
target = torch.from_numpy(skimage.io.imread(args.target)).to(torch.float32) / 255.0
target = target.pow(gamma)
target = target.to(pydiffvg.get_device())
target = target.unsqueeze(0)
target = target.permute(0, 3, 1, 2) # NHWC -> NCHW
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(args.svg)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None, # bg
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/refine_svg/init.png', gamma=gamma)
points_vars = []
for path in shapes:
path.points.requires_grad = True
points_vars.append(path.points)
color_vars = {}
for group in shape_groups:
group.fill_color.requires_grad = True
color_vars[group.fill_color.data_ptr()] = group.fill_color
color_vars = list(color_vars.values())
# Optimize
points_optim = torch.optim.Adam(points_vars, lr=1.0)
color_optim = torch.optim.Adam(color_vars, lr=0.01)
# Adam iterations.
for t in range(args.num_iter):
print('iteration:', t)
points_optim.zero_grad()
color_optim.zero_grad()
# Forward pass: render the image.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None, # bg
*scene_args)
# Compose img with white background
img = img[:, :, 3:4] * img[:, :, :3] + torch.ones(img.shape[0], img.shape[1], 3, device = pydiffvg.get_device()) * (1 - img[:, :, 3:4])
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/refine_svg/iter_{}.png'.format(t), gamma=gamma)
img = img[:, :, :3]
# Convert img from HWC to NCHW
img = img.unsqueeze(0)
img = img.permute(0, 3, 1, 2) # NHWC -> NCHW
if args.use_lpips_loss:
loss = perception_loss(img, target)
else:
loss = (img - target).pow(2).mean()
print('render loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Take a gradient descent step.
points_optim.step()
color_optim.step()
for group in shape_groups:
group.fill_color.data.clamp_(0.0, 1.0)
if t % 10 == 0 or t == args.num_iter - 1:
pydiffvg.save_svg('results/refine_svg/iter_{}.svg'.format(t),
canvas_width, canvas_height, shapes, shape_groups)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None, # bg
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/refine_svg/final.png'.format(t), gamma=gamma)
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/refine_svg/iter_%d.png", "-vb", "20M",
"results/refine_svg/out.mp4"])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("svg", help="source SVG path")
parser.add_argument("target", help="target image path")
parser.add_argument("--use_lpips_loss", dest='use_lpips_loss', action='store_true')
parser.add_argument("--num_iter", type=int, default=250)
args = parser.parse_args()
main(args)

41
apps/render_svg.py Normal file
View File

@@ -0,0 +1,41 @@
"""
Simple utility to render an .svg to a .png
"""
import os
import argparse
import pydiffvg
import torch as th
def render(canvas_width, canvas_height, shapes, shape_groups):
_render = pydiffvg.RenderFunction.apply
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = _render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
return img
def main(args):
pydiffvg.set_device(th.device('cuda:1'))
# Load SVG
svg = os.path.join(args.svg)
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(svg)
# Save initial state
ref = render(canvas_width, canvas_height, shapes, shape_groups)
pydiffvg.imwrite(ref.cpu(), args.out, gamma=2.2)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("svg", help="source SVG path")
parser.add_argument("out", help="output image path")
args = parser.parse_args()
main(args)

284
apps/seam_carving.py Normal file
View File

@@ -0,0 +1,284 @@
"""Retargets an .svg using image-domain seam carving to shrink it."""
import os
import pydiffvg
import argparse
import torch as th
import scipy.ndimage.filters as filters
import numba
import numpy as np
import skimage.io
def energy(im):
"""Compute image energy.
Args:
im(np.ndarray) with shape [h, w, 3]: input image.
Returns:
(np.ndarray) with shape [h, w]: energy map.
"""
f_dx = np.array([
[-1, 0, 1 ],
[-2, 0, 2 ],
[-1, 0, 1 ],
])
f_dy = f_dx.T
dx = filters.convolve(im.mean(2), f_dx)
dy = filters.convolve(im.mean(2), f_dy)
return np.abs(dx) + np.abs(dy)
@numba.jit(nopython=True)
def min_seam(e):
"""Finds the seam with minimal cost in an energy map.
Args:
e(np.ndarray) with shape [h, w]: energy map.
Returns:
min_e(np.ndarray) with shape [h, w]: for all (y,x) min_e[y, x]
is the cost of the minimal seam from 0 to y (top to bottom).
The minimal seam can be found by looking at the last row of min_e.
This is computed by dynamic programming.
argmin_e(np.ndarray) with shape [h, w]: for all (y,x) argmin_e[y, x]
contains the x coordinate corresponding to this seam in the
previous row (y-1). We use this for backtracking.
"""
# initialize to local energy
min_e = e.copy()
argmin_e = np.zeros_like(e, dtype=np.int64)
h, w = e.shape
# propagate vertically
for y in range(1, h):
for x in range(w):
if x == 0:
idx = np.argmin(e[y-1, x:x+2])
argmin_e[y, x] = idx + x
mini = e[y-1, x + idx]
elif x == w-1:
idx = np.argmin(e[y-1, x-1:x+1])
argmin_e[y, x] = idx + x - 1
mini = e[y-1, x + idx - 1]
else:
idx = np.argmin(e[y-1, x-1:x+2])
argmin_e[y, x] = idx + x - 1
mini = e[y-1, x + idx - 1]
min_e[y, x] = min_e[y, x] + mini
return min_e, argmin_e
def carve_seam(im):
"""Carves a vertical seam in an image, reducing it's horizontal size by 1.
Args:
im(np.ndarray) with shape [h, w, 3]: input image.
Returns:
(np.ndarray) with shape [h, w-1, 1]: the image with one seam removed.
"""
e = energy(im)
min_e, argmin_e = min_seam(e)
h, w = im.shape[:2]
# boolean flags for the pixels to preserve
to_keep = np.ones((h, w), dtype=np.bool)
# get lowest energy (from last row)
x = np.argmin(min_e[-1])
print("carving seam", x, "with energy", min_e[-1, x])
# backtract to identify the seam
for y in range(h-1, -1, -1):
# remove seam pixel
to_keep[y, x] = False
x = argmin_e[y, x]
# replicate mask over color channels
to_keep = np.stack(3*[to_keep], axis=2)
new_im = im[to_keep].reshape((h, w-1, 3))
return new_im
def render(canvas_width, canvas_height, shapes, shape_groups, samples=2):
_render = pydiffvg.RenderFunction.apply
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = _render(canvas_width, # width
canvas_height, # height
samples, # num_samples_x
samples, # num_samples_y
0, # seed
None,
*scene_args)
return img
def vector_rescale(shapes, scale_x=1.00, scale_y=1.00):
new_shapes = []
for path in shapes:
path.points[..., 0] *= scale_x
path.points[..., 1] *= scale_y
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--svg", default=os.path.join("imgs", "hokusai.svg"))
parser.add_argument("--optim_steps", default=10, type=int)
parser.add_argument("--lr", default=1e-1, type=int)
args = parser.parse_args()
name = os.path.splitext(os.path.basename(args.svg))[0]
root = os.path.join("results", "seam_carving", name)
svg_root = os.path.join(root, "svg")
os.makedirs(root, exist_ok=True)
os.makedirs(os.path.join(root, "svg"), exist_ok=True)
pydiffvg.set_use_gpu(False)
# pydiffvg.set_device(th.device('cuda'))
# Load SVG
print("loading svg %s" % args.svg)
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(args.svg)
print("done loading")
max_size = 512
scale_factor = max_size / max(canvas_width, canvas_height)
print("rescaling from %dx%d with scale %f" % (canvas_width, canvas_height, scale_factor))
canvas_width = int(canvas_width*scale_factor)
canvas_height = int(canvas_height*scale_factor)
print("new shape %dx%d" % (canvas_width, canvas_height))
vector_rescale(shapes, scale_x=scale_factor, scale_y=scale_factor)
# Shrink image by 33 %
# num_seams_to_remove = 2
num_seams_to_remove = canvas_width // 3
new_canvas_width = canvas_width - num_seams_to_remove
scaling = new_canvas_width * 1.0 / canvas_width
# Naive scaling baseline
print("rendering naive rescaling...")
vector_rescale(shapes, scale_x=scaling)
resized = render(new_canvas_width, canvas_height, shapes, shape_groups)
pydiffvg.imwrite(resized.cpu(), os.path.join(root, 'uniform_scaling.png'), gamma=2.2)
pydiffvg.save_svg(os.path.join(svg_root, 'uniform_scaling.svg') , canvas_width,
canvas_height, shapes, shape_groups, use_gamma=False)
vector_rescale(shapes, scale_x=1.0/scaling) # bring back original coordinates
print("saved naiving scaling")
# Save initial state
print("rendering initial state...")
im = render(canvas_width, canvas_height, shapes, shape_groups)
pydiffvg.imwrite(im.cpu(), os.path.join(root, 'init.png'), gamma=2.2)
pydiffvg.save_svg(os.path.join(svg_root, 'init.svg'), canvas_width,
canvas_height, shapes, shape_groups, use_gamma=False)
print("saved initial state")
# Optimize
# color_optim = th.optim.Adam(color_vars, lr=0.01)
retargeted = im[..., :3].cpu().numpy()
previous_width = canvas_width
print("carving seams")
for seam_idx in range(num_seams_to_remove):
print('\nseam', seam_idx+1, 'of', num_seams_to_remove)
# Remove a seam
retargeted = carve_seam(retargeted)
current_width = canvas_width - seam_idx - 1
scale_factor = current_width * 1.0 / previous_width
previous_width = current_width
padded = np.zeros((canvas_height, canvas_width, 4))
padded[:, :-seam_idx-1, :3] = retargeted
padded[:, :-seam_idx-1, -1] = 1.0 # alpha
padded = th.from_numpy(padded).to(im.device)
# Remap points to the smaller canvas and
# collect variables to optimize
points_vars = []
# width_vars = []
mini, maxi = canvas_width, 0
for path in shapes:
path.points.requires_grad = False
x = path.points[..., 0]
y = path.points[..., 1]
# rescale
x = x * scale_factor
# clip to canvas
path.points[..., 0] = th.clamp(x, 0, current_width)
path.points[..., 1] = th.clamp(y, 0, canvas_height)
path.points.requires_grad = True
points_vars.append(path.points)
path.stroke_width.requires_grad = True
# width_vars.append(path.stroke_width)
mini = min(mini, path.points.min().item())
maxi = max(maxi, path.points.max().item())
print("points", mini, maxi, "scale", scale_factor)
# recreate an optimizer so we don't carry over the previous update
# (momentum)?
geom_optim = th.optim.Adam(points_vars, lr=args.lr)
for step in range(args.optim_steps):
geom_optim.zero_grad()
img = render(canvas_width, canvas_height, shapes, shape_groups,
samples=2)
pydiffvg.imwrite(
img.cpu(),
os.path.join(root, "seam_%03d_iter_%02d.png" % (seam_idx, step)), gamma=2.2)
# NO alpha
loss = (img - padded)[..., :3].pow(2).mean()
# loss = (img - padded).pow(2).mean()
print('render loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Take a gradient descent step.
geom_optim.step()
pydiffvg.save_svg(os.path.join(svg_root, "seam%03d.svg" % seam_idx),
canvas_width-seam_idx, canvas_height, shapes,
shape_groups, use_gamma=False)
for path in shapes:
mini = min(mini, path.points.min().item())
maxi = max(maxi, path.points.max().item())
print("points", mini, maxi)
img = render(canvas_width, canvas_height, shapes, shape_groups)
img = img[:, :-num_seams_to_remove]
pydiffvg.imwrite(img.cpu(), os.path.join(root, 'final.png'),
gamma=2.2)
pydiffvg.imwrite(retargeted, os.path.join(root, 'ref.png'),
gamma=2.2)
pydiffvg.save_svg(os.path.join(svg_root, 'final.svg'),
canvas_width-seam_idx, canvas_height, shapes,
shape_groups, use_gamma=False)
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i", os.path.join(root, "seam_%03d_iter_00.png"), "-vb", "20M",
os.path.join(root, "out.mp4")])
if __name__ == "__main__":
main()

127
apps/shared_edge_compare.py Normal file
View File

@@ -0,0 +1,127 @@
import pydiffvg
import diffvg
from matplotlib import cm
import matplotlib.pyplot as plt
import argparse
import torch
def normalize(x, min_, max_):
range = max(abs(min_), abs(max_))
return (x + range) / (2 * range)
def main(args):
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(args.svg_file)
w = int(canvas_width * args.size_scale)
h = int(canvas_height * args.size_scale)
pfilter = pydiffvg.PixelFilter(type = diffvg.FilterType.box,
radius = torch.tensor(0.5))
use_prefiltering = False
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
num_samples_x = 16
num_samples_y = 16
render = pydiffvg.RenderFunction.apply
img = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/finite_difference_comp/img.png', gamma=1.0)
epsilon = 0.1
def perturb_scene(axis, epsilon):
shapes[2].points[:, axis] += epsilon
# for s in shapes:
# if isinstance(s, pydiffvg.Circle):
# s.center[axis] += epsilon
# elif isinstance(s, pydiffvg.Ellipse):
# s.center[axis] += epsilon
# elif isinstance(s, pydiffvg.Path):
# s.points[:, axis] += epsilon
# elif isinstance(s, pydiffvg.Polygon):
# s.points[:, axis] += epsilon
# elif isinstance(s, pydiffvg.Rect):
# s.p_min[axis] += epsilon
# s.p_max[axis] += epsilon
# for s in shape_groups:
# if isinstance(s.fill_color, pydiffvg.LinearGradient):
# s.fill_color.begin[axis] += epsilon
# s.fill_color.end[axis] += epsilon
perturb_scene(0, epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
render = pydiffvg.RenderFunction.apply
img0 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None,
*scene_args)
forward_diff = (img0 - img) / (epsilon)
forward_diff = forward_diff.sum(axis = 2)
x_diff_max = 1.5
x_diff_min = -1.5
print(forward_diff.max())
print(forward_diff.min())
forward_diff = cm.viridis(normalize(forward_diff, x_diff_min, x_diff_max).cpu().numpy())
pydiffvg.imwrite(forward_diff, 'results/finite_difference_comp/shared_edge_forward_diff.png', gamma=1.0)
perturb_scene(0, -2 * epsilon)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
img1 = render(w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
None,
*scene_args)
backward_diff = (img - img1) / (epsilon)
backward_diff = backward_diff.sum(axis = 2)
print(backward_diff.max())
print(backward_diff.min())
backward_diff = cm.viridis(normalize(backward_diff, x_diff_min, x_diff_max).cpu().numpy())
pydiffvg.imwrite(backward_diff, 'results/finite_difference_comp/shared_edge_backward_diff.png', gamma=1.0)
perturb_scene(0, epsilon)
num_samples_x = 4
num_samples_y = 4
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
filter = pfilter,
use_prefiltering = use_prefiltering)
render_grad = pydiffvg.RenderFunction.render_grad
img_grad = render_grad(torch.ones(h, w, 4),
w, # width
h, # height
num_samples_x, # num_samples_x
num_samples_y, # num_samples_y
0, # seed
*scene_args)
print(img_grad[:, :, 0].max())
print(img_grad[:, :, 0].min())
x_diff = cm.viridis(normalize(img_grad[:, :, 0], x_diff_min, x_diff_max).cpu().numpy())
pydiffvg.imwrite(x_diff, 'results/finite_difference_comp/ours_x_diff.png', gamma=1.0)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("svg_file", help="source SVG path")
parser.add_argument("--size_scale", type=float, default=1.0)
args = parser.parse_args()
main(args)

View File

@@ -0,0 +1,237 @@
import pydiffvg
import torch
import torchvision
from PIL import Image
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
def inv_exp(a,x,xpow=1):
return pow(a,pow(1.-x,xpow))
import math
import numbers
import torch
from torch import nn
from torch.nn import functional as F
import visdom
class GaussianSmoothing(nn.Module):
"""
Apply gaussian smoothing on a
1d, 2d or 3d tensor. Filtering is performed seperately for each channel
in the input using a depthwise convolution.
Arguments:
channels (int, sequence): Number of channels of the input tensors. Output will
have this number of channels as well.
kernel_size (int, sequence): Size of the gaussian kernel.
sigma (float, sequence): Standard deviation of the gaussian kernel.
dim (int, optional): The number of dimensions of the data.
Default value is 2 (spatial).
"""
def __init__(self, channels, kernel_size, sigma, dim=2):
super(GaussianSmoothing, self).__init__()
if isinstance(kernel_size, numbers.Number):
kernel_size = [kernel_size] * dim
if isinstance(sigma, numbers.Number):
sigma = [sigma] * dim
# The gaussian kernel is the product of the
# gaussian function of each dimension.
kernel = 1
meshgrids = torch.meshgrid(
[
torch.arange(size, dtype=torch.float32)
for size in kernel_size
]
)
for size, std, mgrid in zip(kernel_size, sigma, meshgrids):
mean = (size - 1) / 2
kernel *= 1 / (std * math.sqrt(2 * math.pi)) * \
torch.exp(-((mgrid - mean) / std) ** 2 / 2)
# Make sure sum of values in gaussian kernel equals 1.
kernel = kernel / torch.sum(kernel)
# Reshape to depthwise convolutional weight
kernel = kernel.view(1, 1, *kernel.size())
kernel = kernel.repeat(channels, *[1] * (kernel.dim() - 1))
self.register_buffer('weight', kernel)
self.groups = channels
if dim == 1:
self.conv = F.conv1d
elif dim == 2:
self.conv = F.conv2d
elif dim == 3:
self.conv = F.conv3d
else:
raise RuntimeError(
'Only 1, 2 and 3 dimensions are supported. Received {}.'.format(dim)
)
def forward(self, input):
"""
Apply gaussian filter to input.
Arguments:
input (torch.Tensor): Input to apply gaussian filter on.
Returns:
filtered (torch.Tensor): Filtered output.
"""
return self.conv(input, weight=self.weight, groups=self.groups)
vis=visdom.Visdom(port=8080)
smoothing = GaussianSmoothing(4, 5, 1)
settings=pydiffvg.SvgOptimizationSettings()
settings.global_override(["optimize_color"],False)
settings.global_override(["optimize_alpha"],False)
settings.global_override(["gradients","optimize_color"],False)
settings.global_override(["gradients","optimize_alpha"],False)
settings.global_override(["gradients","optimize_stops"],False)
settings.global_override(["gradients","optimize_location"],False)
settings.global_override(["optimizer"],"Adam")
settings.global_override(["paths","optimize_points"],False)
settings.global_override(["transforms","transform_lr"],1e-2)
settings.undefault("linearGradient3152")
settings.retrieve("linearGradient3152")[0]["transforms"]["optimize_transforms"]=False
#optim=pydiffvg.OptimizableSvg("note_small.svg",settings,verbose=True)
optim=pydiffvg.OptimizableSvg("heart_green.svg",settings,verbose=True)
#img=torchvision.transforms.ToTensor()(Image.open("note_transformed.png")).permute(1,2,0)
img=torchvision.transforms.ToTensor()(Image.open("heart_green_90.png")).permute(1,2,0)
name="heart_green_90"
pydiffvg.imwrite(img.cpu(), 'results/simple_transform_svg/target.png')
target = img.clone().detach().requires_grad_(False)
img=optim.render()
pydiffvg.imwrite(img.cpu(), 'results/simple_transform_svg/init.png')
def smooth(input, kernel):
input=torch.nn.functional.pad(input.permute(2,0,1).unsqueeze(0), (2, 2, 2, 2), mode='reflect')
output=kernel(input)
return output
def printimg(optim):
img=optim.render()
comp = img.clone().detach()
bg = torch.tensor([[[1., 1., 1.]]])
comprgb = comp[:, :, 0:3]
compalpha = comp[:, :, 3].unsqueeze(2)
comp = comprgb * compalpha \
+ bg * (1 - compalpha)
return comp
def comp_loss_and_grad(img, tgt, it, sz):
dif=img-tgt
loss=dif.pow(2).mean()
dif=dif.detach()
cdif=dif.clone().abs()
cdif[:,:,3]=1.
resdif=torch.nn.functional.interpolate(cdif.permute(2,0,1).unsqueeze(0),sz,mode='bilinear').squeeze().permute(1,2,0).abs()
pydiffvg.imwrite(resdif[:,:,0:4], 'results/simple_transform_svg/dif_{:04}.png'.format(it))
dif=dif.numpy()
padded=np.pad(dif,[(1,1),(1,1),(0,0)],mode='edge')
#print(padded[:-2,:,:].shape)
grad_x=(padded[:-2,:,:]-padded[2:,:,:])[:,1:-1,:]
grad_y=(padded[:,:-2,:]-padded[:,2:,:])[1:-1,:,:]
resshape=dif.shape
resshape=(resshape[0],resshape[1],2)
res=np.zeros(resshape)
for x in range(resshape[0]):
for y in range(resshape[1]):
A=np.concatenate((grad_x[x,y,:][:,np.newaxis],grad_y[x,y,:][:,np.newaxis]),axis=1)
b=-dif[x,y,:]
v=np.linalg.lstsq(np.dot(A.T,A),np.dot(A.T,b))
res[x,y,:]=v[0]
return loss, res
import colorsys
def print_gradimg(gradimg,it,shape=None):
out=torch.zeros((gradimg.shape[0],gradimg.shape[1],3),requires_grad=False,dtype=torch.float32)
for x in range(gradimg.shape[0]):
for y in range(gradimg.shape[1]):
h=math.atan2(gradimg[x,y,1],gradimg[x,y,0])
s=math.tanh(np.linalg.norm(gradimg[x,y,:]))
v=1.
vec=(gradimg[x,y,:].clip(min=-1,max=1)/2)+.5
#out[x,y,:]=torch.tensor(colorsys.hsv_to_rgb(h,s,v),dtype=torch.float32)
out[x,y,:]=torch.tensor([vec[0],vec[1],0])
if shape is not None:
out=torch.nn.functional.interpolate(out.permute(2,0,1).unsqueeze(0),shape,mode='bilinear').squeeze().permute(1,2,0)
pydiffvg.imwrite(out.cpu(), 'results/simple_transform_svg/grad_{:04}.png'.format(it))
# Run 150 Adam iterations.
for t in range(1000):
print('iteration:', t)
optim.zero_grad()
with open('results/simple_transform_svg/viter_{:04}.svg'.format(t),"w") as f:
f.write(optim.write_xml())
scale=inv_exp(1/16,math.pow(t/1000,1),0.5)
#print(scale)
#img = optim.render(seed=t+1,scale=scale)
img = optim.render(seed=t + 1, scale=None)
vis.line(torch.tensor([img.shape[0]]), X=torch.tensor([t]), win=name + " size", update="append",
opts={"title": name + " size"})
#print(img.shape)
#img = optim.render(seed=t + 1)
ptgt=target.permute(2,0,1).unsqueeze(0)
sz=img.shape[0:2]
restgt=torch.nn.functional.interpolate(ptgt,size=sz,mode='bilinear').squeeze().permute(1,2,0)
# Compute the loss function. Here it is L2.
#loss = (smooth(img,smoothing) - smooth(restgt,smoothing)).pow(2).mean()
#loss = (img - restgt).pow(2).mean()
#loss=(img-target).pow(2).mean()
loss,gradimg=comp_loss_and_grad(img, restgt,t,target.shape[0:2])
print_gradimg(gradimg,t,target.shape[0:2])
print('loss:', loss.item())
vis.line(loss.unsqueeze(0), X=torch.tensor([t]), win=name+" loss", update="append",
opts={"title": name + " loss"})
# Backpropagate the gradients.
loss.backward()
# Take a gradient descent step.
optim.step()
# Save the intermediate render.
comp=printimg(optim)
pydiffvg.imwrite(comp.cpu(), 'results/simple_transform_svg/iter_{:04}.png'.format(t))
# Render the final result.
img = optim.render()
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/simple_transform_svg/final.png')
with open('results/simple_transform_svg/final.svg', "w") as f:
f.write(optim.write_xml())
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/simple_transform_svg/iter_%04d.png", "-vb", "20M",
"results/simple_transform_svg/out.mp4"])
call(["ffmpeg", "-framerate", "24", "-i",
"results/simple_transform_svg/grad_%04d.png", "-vb", "20M",
"results/simple_transform_svg/out_grad.mp4"])

106
apps/single_circle.py Normal file
View File

@@ -0,0 +1,106 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width = 256
canvas_height = 256
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_circle/target.png', gamma=2.2)
target = img.clone()
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor(20.0 / 256.0, requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_circle/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
None,
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_circle/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', circle.radius)
print('center:', circle.center)
print('color:', circle_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_circle/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_circle/iter_%d.png", "-vb", "20M",
"results/single_circle/out.mp4"])

View File

@@ -0,0 +1,118 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]),
stroke_width = torch.tensor(5.0))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]),
stroke_color = torch.tensor([0.6, 0.3, 0.6, 0.8]))
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_outline/target.png', gamma=2.2)
target = img.clone()
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor(20.0 / 256.0, requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
fill_color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
stroke_color = torch.tensor([0.4, 0.7, 0.5, 0.5], requires_grad=True)
stroke_width_n = torch.tensor(10.0 / 100.0, requires_grad=True)
circle.radius = radius_n * 256
circle.center = center_n * 256
circle.stroke_width = stroke_width_n * 100
circle_group.fill_color = fill_color
circle_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_circle_outline/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, fill_color, stroke_color, stroke_width_n], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle.stroke_width = stroke_width_n * 100
circle_group.fill_color = fill_color
circle_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
None,
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_outline/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('fill_color.grad:', fill_color.grad)
print('stroke_color.grad:', stroke_color.grad)
print('stroke_width.grad:', stroke_width_n.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', circle.radius)
print('center:', circle.center)
print('stroke_width:', circle.stroke_width)
print('fill_color:', circle_group.fill_color)
print('stroke_color:', circle_group.stroke_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
202, # seed
None,
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_outline/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_circle_outline/iter_%d.png", "-vb", "20M",
"results/single_circle_outline/out.mp4"])

114
apps/single_circle_sdf.py Normal file
View File

@@ -0,0 +1,114 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width = 256
canvas_height = 256
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/single_circle_sdf/target.png')
target = img.clone()
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor(20.0 / 256.0, requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
None,
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/single_circle_sdf/init.png')
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
None,
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_sdf/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', circle.radius)
print('center:', circle.center)
print('color:', circle_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
None,
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_sdf/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_circle_sdf/iter_%d.png", "-vb", "20M",
"results/single_circle_sdf/out.mp4"])

94
apps/single_circle_tf.py Normal file
View File

@@ -0,0 +1,94 @@
import pydiffvg_tensorflow as pydiffvg
import tensorflow as tf
import skimage
import numpy as np
canvas_width = 256
canvas_height = 256
circle = pydiffvg.Circle(radius = tf.constant(40.0),
center = tf.constant([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = tf.constant([0], dtype = tf.int32),
fill_color = tf.constant([0.3, 0.6, 0.3, 1.0]))
shape_groups = [circle_group]
scene_args = pydiffvg.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.render
img = render(tf.constant(256), # width
tf.constant(256), # height
tf.constant(2), # num_samples_x
tf.constant(2), # num_samples_y
tf.constant(0), # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img, 'results/single_circle_tf/target.png', gamma=2.2)
target = tf.identity(img)
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = tf.Variable(20.0 / 256.0)
center_n = tf.Variable([108.0 / 256.0, 138.0 / 256.0])
color = tf.Variable([0.3, 0.2, 0.8, 1.0])
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(tf.constant(256), # width
tf.constant(256), # height
tf.constant(2), # num_samples_x
tf.constant(2), # num_samples_y
tf.constant(1), # seed
*scene_args)
pydiffvg.imwrite(img, 'results/single_circle_tf/init.png', gamma=2.2)
optimizer = tf.compat.v1.train.AdamOptimizer(1e-2)
for t in range(100):
print('iteration:', t)
with tf.GradientTape() as tape:
# Forward pass: render the image.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
# Important to use a different seed every iteration, otherwise the result
# would be biased.
scene_args = pydiffvg.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(tf.constant(256), # width
tf.constant(256), # height
tf.constant(2), # num_samples_x
tf.constant(2), # num_samples_y
tf.constant(t+1), # seed,
*scene_args)
loss_value = tf.reduce_sum(tf.square(img - target))
print(f"loss_value: {loss_value}")
pydiffvg.imwrite(img, 'results/single_circle_tf/iter_{}.png'.format(t))
grads = tape.gradient(loss_value, [radius_n, center_n, color])
print(grads)
optimizer.apply_gradients(zip(grads, [radius_n, center_n, color]))
# Render the final result.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(tf.constant(256), # width
tf.constant(256), # height
tf.constant(2), # num_samples_x
tf.constant(2), # num_samples_y
tf.constant(101), # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_circle_tf/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_circle_tf/iter_%d.png", "-vb", "20M",
"results/single_circle_tf/out.mp4"])

121
apps/single_curve.py Normal file
View File

@@ -0,0 +1,121 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2, 2, 2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0], # base
[ 90.0, 180.0], # control point
[200.0, 65.0], # control point
[210.0, 98.0], # base
[220.0, 70.0], # control point
[130.0, 55.0]]) # control point
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = True)
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_curve/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0], # base
[100.0/256.0, 200.0/256.0], # control point
[170.0/256.0, 55.0/256.0], # control point
[220.0/256.0, 100.0/256.0], # base
[210.0/256.0, 80.0/256.0], # control point
[140.0/256.0, 60.0/256.0]], # control point
requires_grad = True)
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
path.points = points_n * 256
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
None,
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_curve/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
None,
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_curve/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('color:', path_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
None,
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_curve/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_curve/iter_%d.png", "-vb", "20M",
"results/single_curve/out.mp4"])

View File

@@ -0,0 +1,132 @@
import pydiffvg
import torch
import skimage
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2, 2, 2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0], # base
[ 90.0, 180.0], # control point
[200.0, 65.0], # control point
[210.0, 98.0], # base
[220.0, 70.0], # control point
[130.0, 55.0]]) # control point
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = True,
stroke_width = torch.tensor(5.0))
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]),
stroke_color = torch.tensor([0.6, 0.3, 0.6, 0.8]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_outline/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0], # base
[100.0/256.0, 200.0/256.0], # control point
[170.0/256.0, 55.0/256.0], # control point
[220.0/256.0, 100.0/256.0], # base
[210.0/256.0, 80.0/256.0], # control point
[140.0/256.0, 60.0/256.0]], # control point
requires_grad = True)
fill_color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
stroke_color = torch.tensor([0.4, 0.7, 0.5, 0.5], requires_grad=True)
stroke_width_n = torch.tensor(10.0 / 100.0, requires_grad=True)
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.fill_color = fill_color
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_curve_outline/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, fill_color, stroke_color, stroke_width_n], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.fill_color = fill_color
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_outline/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('fill_color.grad:', fill_color.grad)
print('stroke_color.grad:', stroke_color.grad)
print('stroke_width.grad:', stroke_width_n.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('fill_color:', path_group.fill_color)
print('stroke_color:', path_group.stroke_color)
print('stroke_width:', path.stroke_width)
# Render the final result.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.fill_color = fill_color
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
202, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_outline/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_curve_outline/iter_%d.png", "-vb", "20M",
"results/single_curve_outline/out.mp4"])

125
apps/single_curve_sdf.py Normal file
View File

@@ -0,0 +1,125 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2, 2, 2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0], # base
[ 90.0, 180.0], # control point
[200.0, 65.0], # control point
[210.0, 98.0], # base
[220.0, 70.0], # control point
[130.0, 55.0]]) # control point
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = True)
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
*scene_args)
img /= 256.0
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/target.png', gamma=1.0)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0], # base
[100.0/256.0, 200.0/256.0], # control point
[170.0/256.0, 55.0/256.0], # control point
[220.0/256.0, 100.0/256.0], # base
[210.0/256.0, 80.0/256.0], # control point
[140.0/256.0, 60.0/256.0]], # control point
requires_grad = True)
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
path.points = points_n * 256
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
1, # seed
*scene_args)
img /= 256.0
pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/init.png', gamma=1.0)
# Optimize
optimizer = torch.optim.Adam([points_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
t+1, # seed
*scene_args)
img /= 256.0
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/iter_{}.png'.format(t), gamma=1.0)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('color:', path_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
102, # seed
*scene_args)
img /= 256.0
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/final.png', gamma=1.0)
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_curve_sdf/iter_%d.png", "-vb", "20M",
"results/single_curve_sdf/out.mp4"])

View File

@@ -0,0 +1,172 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2])
# points = torch.tensor([[120.0, 30.0], # base
# [150.0, 60.0], # control point
# [ 90.0, 198.0], # control point
# [ 60.0, 218.0], # base
# [ 90.0, 180.0], # control point
# [200.0, 65.0], # control point
# [210.0, 98.0], # base
# [220.0, 70.0], # control point
# [130.0, 55.0]]) # control point
points = torch.tensor([[ 20.0, 128.0], # base
[ 50.0, 128.0], # control point
[170.0, 128.0], # control point
[200.0, 128.0]]) # base
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = False,
stroke_width = torch.tensor(10.0))
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = None,
stroke_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
*scene_args)
path.points[:, 1] += 1e-3
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img2 = render(256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
*scene_args)
# diff = img2 - img
# diff = diff[:, :, 0] / 1e-3
# import matplotlib.pyplot as plt
# plt.imshow(diff)
# plt.show()
# # The output image is in linear RGB space. Do Gamma correction before saving the image.
# pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/target.png', gamma=1.0)
# target = img.clone()
render_grad = pydiffvg.RenderFunction.render_grad
img = render_grad(torch.ones(256, 256, 1), # grad_img
256, # width
256, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
*scene_args)
img = img[:, :, 0]
import matplotlib.pyplot as plt
plt.imshow(img)
plt.show()
# # Move the path to produce initial guess
# # normalize points for easier learning rate
# # points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
# # [155.0/256.0, 65.0/256.0], # control point
# # [100.0/256.0, 180.0/256.0], # control point
# # [ 65.0/256.0, 238.0/256.0], # base
# # [100.0/256.0, 200.0/256.0], # control point
# # [170.0/256.0, 55.0/256.0], # control point
# # [220.0/256.0, 100.0/256.0], # base
# # [210.0/256.0, 80.0/256.0], # control point
# # [140.0/256.0, 60.0/256.0]], # control point
# # requires_grad = True)
# points_n = torch.tensor([[118.4274/256.0, 32.0159/256.0],
# [174.9657/256.0, 28.1877/256.0],
# [ 87.6629/256.0, 175.1049/256.0],
# [ 57.8093/256.0, 232.8987/256.0],
# [ 80.1829/256.0, 165.4280/256.0],
# [197.3640/256.0, 83.4058/256.0],
# [209.3676/256.0, 97.9176/256.0],
# [219.1048/256.0, 72.0000/256.0],
# [143.1226/256.0, 57.0636/256.0]],
# requires_grad = True)
# color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
# path.points = points_n * 256
# path_group.fill_color = color
# scene_args = pydiffvg.RenderFunction.serialize_scene(\
# canvas_width, canvas_height, shapes, shape_groups,
# output_type = pydiffvg.OutputType.sdf)
# img = render(256, # width
# 256, # height
# 1, # num_samples_x
# 1, # num_samples_y
# 1, # seed
# *scene_args)
# img /= 256.0
# pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/init.png', gamma=1.0)
# # Optimize
# optimizer = torch.optim.Adam([points_n, color], lr=1e-3)
# # Run 100 Adam iterations.
# for t in range(2):
# print('iteration:', t)
# optimizer.zero_grad()
# # Forward pass: render the image.
# path.points = points_n * 256
# path_group.fill_color = color
# scene_args = pydiffvg.RenderFunction.serialize_scene(\
# canvas_width, canvas_height, shapes, shape_groups,
# output_type = pydiffvg.OutputType.sdf)
# img = render(256, # width
# 256, # height
# 1, # num_samples_x
# 1, # num_samples_y
# t+1, # seed
# *scene_args)
# img /= 256.0
# # Save the intermediate render.
# pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/iter_{}.png'.format(t), gamma=1.0)
# # Compute the loss function. Here it is L2.
# loss = (img - target).pow(2).sum()
# print('loss:', loss.item())
# # Backpropagate the gradients.
# loss.backward()
# # Print the gradients
# print('points_n.grad:', points_n.grad)
# print('color.grad:', color.grad)
# # Take a gradient descent step.
# optimizer.step()
# # Print the current params.
# print('points:', path.points)
# print('color:', path_group.fill_color)
# exit()
# # Render the final result.
# scene_args = pydiffvg.RenderFunction.serialize_scene(\
# canvas_width, canvas_height, shapes, shape_groups,
# output_type = pydiffvg.OutputType.sdf)
# img = render(256, # width
# 256, # height
# 1, # num_samples_x
# 1, # num_samples_y
# 102, # seed
# *scene_args)
# img /= 256.0
# # Save the images and differences.
# pydiffvg.imwrite(img.cpu(), 'results/single_curve_sdf/final.png', gamma=1.0)
# # Convert the intermediate renderings to a video.
# from subprocess import call
# call(["ffmpeg", "-framerate", "24", "-i",
# "results/single_curve_sdf/iter_%d.png", "-vb", "20M",
# "results/single_curve_sdf/out.mp4"])

105
apps/single_ellipse.py Normal file
View File

@@ -0,0 +1,105 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
ellipse = pydiffvg.Ellipse(radius = torch.tensor([60.0, 30.0]),
center = torch.tensor([128.0, 128.0]))
shapes = [ellipse]
ellipse_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [ellipse_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse/target.png', gamma=2.2)
target = img.clone()
# Move the ellipse to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor([20.0 / 256.0, 40.0 / 256.0], requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
ellipse.radius = radius_n * 256
ellipse.center = center_n * 256
ellipse_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, color], lr=1e-2)
# Run 50 Adam iterations.
for t in range(50):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
ellipse.radius = radius_n * 256
ellipse.center = center_n * 256
ellipse_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', ellipse.radius)
print('center:', ellipse.center)
print('color:', ellipse_group.fill_color)
# Render the final result.
ellipse.radius = radius_n * 256
ellipse.center = center_n * 256
ellipse_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
52, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_ellipse/iter_%d.png", "-vb", "20M",
"results/single_ellipse/out.mp4"])

View File

@@ -0,0 +1,108 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
ellipse = pydiffvg.Ellipse(radius = torch.tensor([60.0, 30.0]),
center = torch.tensor([128.0, 128.0]))
shapes = [ellipse]
ellipse_group = pydiffvg.ShapeGroup(\
shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]),
shape_to_canvas = torch.eye(3, 3))
shape_groups = [ellipse_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse_transform/target.png', gamma=2.2)
target = img.clone()
# Affine transform the ellipse to produce initial guess
color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
affine = torch.zeros(2, 3)
affine[0, 0] = 1.3
affine[0, 1] = 0.2
affine[0, 2] = 0.1
affine[1, 0] = 0.2
affine[1, 1] = 0.6
affine[1, 2] = 0.3
affine.requires_grad = True
shape_to_canvas = torch.cat((affine, torch.tensor([[0.0, 0.0, 1.0]])), axis=0)
ellipse_group.fill_color = color
ellipse_group.shape_to_canvas = shape_to_canvas
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse_transform/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([color, affine], lr=1e-2)
# Run 150 Adam iterations.
for t in range(150):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
ellipse_group.fill_color = color
ellipse_group.shape_to_canvas = torch.cat((affine, torch.tensor([[0.0, 0.0, 1.0]])), axis=0)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse_transform/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('color.grad:', color.grad)
print('affine.grad:', affine.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('color:', ellipse_group.fill_color)
print('affine:', affine)
# Render the final result.
ellipse_group.fill_color = color
ellipse_group.shape_to_canvas = torch.cat((affine, torch.tensor([[0.0, 0.0, 1.0]])), axis=0)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
52, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_ellipse_transform/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_ellipse_transform/iter_%d.png", "-vb", "20M",
"results/single_ellipse_transform/out.mp4"])

127
apps/single_gradient.py Normal file
View File

@@ -0,0 +1,127 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
color = pydiffvg.LinearGradient(\
begin = torch.tensor([50.0, 50.0]),
end = torch.tensor([200.0, 200.0]),
offsets = torch.tensor([0.0, 1.0]),
stop_colors = torch.tensor([[0.2, 0.5, 0.7, 1.0],
[0.7, 0.2, 0.5, 1.0]]))
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]), fill_color = color)
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_gradient/target.png', gamma=2.2)
target = img.clone()
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor(20.0 / 256.0, requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
begin_n = torch.tensor([100.0 / 256.0, 100.0 / 256.0], requires_grad=True)
end_n = torch.tensor([150.0 / 256.0, 150.0 / 256.0], requires_grad=True)
stop_colors = torch.tensor([[0.1, 0.9, 0.2, 1.0],
[0.5, 0.3, 0.6, 1.0]], requires_grad=True)
color.begin = begin_n * 256
color.end = end_n * 256
color.stop_colors = stop_colors
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
shapes = [circle]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_gradient/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, begin_n, end_n, stop_colors], lr=1e-2)
# Run 50 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
color.begin = begin_n * 256
color.end = end_n * 256
color.stop_colors = stop_colors
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_gradient/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('begin.grad:', begin_n.grad)
print('end.grad:', end_n.grad)
print('stop_colors.grad:', stop_colors.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', circle.radius)
print('center:', circle.center)
print('begin:', begin_n)
print('end:', end_n)
print('stop_colors:', stop_colors)
# Render the final result.
color.begin = begin_n * 256
color.end = end_n * 256
color.stop_colors = stop_colors
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
52, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_gradient/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_gradient/iter_%d.png", "-vb", "20M",
"results/single_gradient/out.mp4"])

117
apps/single_open_curve.py Normal file
View File

@@ -0,0 +1,117 @@
import pydiffvg
import torch
import skimage
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0]]) # base
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
thickness = None,
is_closed = False,
stroke_width = torch.tensor(5.0))
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = None,
stroke_color = torch.tensor([0.6, 0.3, 0.6, 0.8]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0]], # base
requires_grad = True)
stroke_color = torch.tensor([0.4, 0.7, 0.5, 0.5], requires_grad=True)
stroke_width_n = torch.tensor(10.0 / 100.0, requires_grad=True)
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, stroke_color, stroke_width_n], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('stroke_color.grad:', stroke_color.grad)
print('stroke_width.grad:', stroke_width_n.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('stroke_color:', path_group.stroke_color)
print('stroke_width:', path.stroke_width)
# Render the final result.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
202, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_open_curve/iter_%d.png", "-vb", "20M",
"results/single_open_curve/out.mp4"])

View File

@@ -0,0 +1,120 @@
import pydiffvg
import torch
import skimage
pydiffvg.set_print_timing(True)
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0]]) # base
thickness = torch.tensor([10.0, 5.0, 4.0, 20.0])
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = False,
stroke_width = thickness)
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = None,
stroke_color = torch.tensor([0.6, 0.3, 0.6, 0.8]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve_thickness/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0]], # base
requires_grad = True)
thickness_n = torch.tensor([10.0 / 100.0, 10.0 / 100.0, 10.0 / 100.0, 10.0 / 100.0],
requires_grad = True)
stroke_color = torch.tensor([0.4, 0.7, 0.5, 0.5], requires_grad=True)
path.points = points_n * 256
path.stroke_width = thickness_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve_thickness/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, thickness_n, stroke_color], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path.stroke_width = thickness_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve_thickness/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('thickness_n.grad:', thickness_n.grad)
print('stroke_color.grad:', stroke_color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('thickness:', path.stroke_width)
print('stroke_color:', path_group.stroke_color)
# Render the final result.
path.points = points_n * 256
path.stroke_width = thickness_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
202, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_open_curve_thickness/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_open_curve_thickness/iter_%d.png", "-vb", "20M",
"results/single_open_curve_thickness/out.mp4"])

99
apps/single_path.py Normal file
View File

@@ -0,0 +1,99 @@
import pydiffvg
import torch
import skimage
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 510, 510
# https://www.flaticon.com/free-icon/black-plane_61212#term=airplane&page=1&position=8
shapes = pydiffvg.from_svg_path('M510,255c0-20.4-17.85-38.25-38.25-38.25H331.5L204,12.75h-51l63.75,204H76.5l-38.25-51H0L25.5,255L0,344.25h38.25l38.25-51h140.25l-63.75,204h51l127.5-204h140.25C492.15,293.25,510,275.4,510,255z')
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(510, # width
510, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_path/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
noise = torch.FloatTensor(shapes[0].points.shape).uniform_(0.0, 1.0)
points_n = (shapes[0].points.clone() + (noise * 60 - 30)) / 510.0
points_n.requires_grad = True
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(510, # width
510, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_path/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(510, # width
510, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_path/iter_{:02}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', shapes[0].points)
print('color:', path_group.fill_color)
# Render the final result.
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(510, # width
510, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_path/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "20", "-i",
"results/single_path/iter_%02d.png", "-vb", "20M",
"results/single_path/out.mp4"])

105
apps/single_path_sdf.py Normal file
View File

@@ -0,0 +1,105 @@
import pydiffvg
import torch
import skimage
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 510, 510
# https://www.flaticon.com/free-icon/black-plane_61212#term=airplane&page=1&position=8
shapes = pydiffvg.from_svg_path('M510,255c0-20.4-17.85-38.25-38.25-38.25H331.5L204,12.75h-51l63.75,204H76.5l-38.25-51H0L25.5,255L0,344.25h38.25l38.25-51h140.25l-63.75,204h51l127.5-204h140.25C492.15,293.25,510,275.4,510,255z')
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(510, # width
510, # height
1, # num_samples_x
1, # num_samples_y
0, # seed
*scene_args)
img = img / 510 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/single_path_sdf/target.png', gamma=1.0)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
noise = torch.FloatTensor(shapes[0].points.shape).uniform_(0.0, 1.0)
points_n = (shapes[0].points.clone() + (noise * 60 - 30)) / 510.0
points_n.requires_grad = True
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(510, # width
510, # height
1, # num_samples_x
1, # num_samples_y
1, # seed
*scene_args)
img = img / 510 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/single_path_sdf/init.png', gamma=1.0)
# Optimize
optimizer = torch.optim.Adam([points_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(510, # width
510, # height
1, # num_samples_x
1, # num_samples_y
t+1, # seed
*scene_args)
img = img / 510 # Normalize SDF to [0, 1]
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_path_sdf/iter_{}.png'.format(t), gamma=1.0)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', shapes[0].points)
print('color:', path_group.fill_color)
# Render the final result.
shapes[0].points = points_n * 510
path_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(510, # width
510, # height
1, # num_samples_x
1, # num_samples_y
102, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_path_sdf/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_path_sdf/iter_%d.png", "-vb", "20M",
"results/single_path_sdf/out.mp4"])

108
apps/single_polygon.py Normal file
View File

@@ -0,0 +1,108 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
# https://www.w3schools.com/graphics/svg_polygon.asp
points = torch.tensor([[120.0, 30.0],
[ 60.0, 218.0],
[210.0, 98.0],
[ 30.0, 98.0],
[180.0, 218.0]])
polygon = pydiffvg.Polygon(points = points, is_closed = True)
shapes = [polygon]
polygon_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [polygon_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_polygon/target.png', gamma=2.2)
target = img.clone()
# Move the polygon to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[140.0 / 256.0, 20.0 / 256.0],
[ 65.0 / 256.0, 228.0 / 256.0],
[215.0 / 256.0, 100.0 / 256.0],
[ 35.0 / 256.0, 90.0 / 256.0],
[160.0 / 256.0, 208.0 / 256.0]], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
polygon.points = points_n * 256
polygon_group.color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_polygon/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([points_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
polygon.points = points_n * 256
polygon_group.color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_polygon/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', polygon.points)
print('color:', polygon_group.fill_color)
# Render the final result.
polygon.points = points_n * 256
polygon_group.color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_polygon/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_polygon/iter_%d.png", "-vb", "20M",
"results/single_polygon/out.mp4"])

102
apps/single_rect.py Normal file
View File

@@ -0,0 +1,102 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256 ,256
rect = pydiffvg.Rect(p_min = torch.tensor([40.0, 40.0]),
p_max = torch.tensor([160.0, 160.0]))
shapes = [rect]
rect_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [rect_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_rect/target.png', gamma=2.2)
target = img.clone()
# Move the rect to produce initial guess
# normalize p_min & p_max for easier learning rate
p_min_n = torch.tensor([80.0 / 256.0, 20.0 / 256.0], requires_grad=True)
p_max_n = torch.tensor([100.0 / 256.0, 60.0 / 256.0], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.5, 1.0], requires_grad=True)
rect.p_min = p_min_n * 256
rect.p_max = p_max_n * 256
rect_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_rect/init.png', gamma=2.2)
# Optimize for radius & center
optimizer = torch.optim.Adam([p_min_n, p_max_n, color], lr=1e-2)
# Run 100 Adam iterations.
for t in range(100):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
rect.p_min = p_min_n * 256
rect.p_max = p_max_n * 256
rect_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_rect/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('p_min.grad:', p_min_n.grad)
print('p_max.grad:', p_max_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('p_min:', rect.p_min)
print('p_max:', rect.p_max)
print('color:', rect_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_rect/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_rect/iter_%d.png", "-vb", "20M",
"results/single_rect/out.mp4"])

117
apps/single_stroke.py Normal file
View File

@@ -0,0 +1,117 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height = 256, 256
num_control_points = torch.tensor([2])
points = torch.tensor([[120.0, 30.0], # base
[150.0, 60.0], # control point
[ 90.0, 198.0], # control point
[ 60.0, 218.0]]) # base
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
is_closed = False,
stroke_width = torch.tensor(5.0))
shapes = [path]
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.0, 0.0, 0.0, 0.0]),
stroke_color = torch.tensor([0.6, 0.3, 0.6, 0.8]))
shape_groups = [path_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'results/single_stroke/target.png', gamma=2.2)
target = img.clone()
# Move the path to produce initial guess
# normalize points for easier learning rate
points_n = torch.tensor([[100.0/256.0, 40.0/256.0], # base
[155.0/256.0, 65.0/256.0], # control point
[100.0/256.0, 180.0/256.0], # control point
[ 65.0/256.0, 238.0/256.0]], # base
requires_grad = True)
stroke_color = torch.tensor([0.4, 0.7, 0.5, 0.5], requires_grad=True)
stroke_width_n = torch.tensor(10.0 / 100.0, requires_grad=True)
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
pydiffvg.imwrite(img.cpu(), 'results/single_stroke/init.png', gamma=2.2)
# Optimize
optimizer = torch.optim.Adam([points_n, stroke_color, stroke_width_n], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
t+1, # seed
*scene_args)
# Save the intermediate render.
pydiffvg.imwrite(img.cpu(), 'results/single_stroke/iter_{}.png'.format(t), gamma=2.2)
# Compute the loss function. Here it is L2.
loss = (img - target).pow(2).sum()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('points_n.grad:', points_n.grad)
print('stroke_color.grad:', stroke_color.grad)
print('stroke_width.grad:', stroke_width_n.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('points:', path.points)
print('stroke_color:', path_group.stroke_color)
print('stroke_width:', path.stroke_width)
# Render the final result.
path.points = points_n * 256
path.stroke_width = stroke_width_n * 100
path_group.stroke_color = stroke_color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
202, # seed
*scene_args)
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/single_stroke/final.png')
# Convert the intermediate renderings to a video.
from subprocess import call
call(["ffmpeg", "-framerate", "24", "-i",
"results/single_stroke/iter_%d.png", "-vb", "20M",
"results/single_stroke/out.mp4"])

213
apps/sketch_gan.py Normal file
View File

@@ -0,0 +1,213 @@
"""A simple training interface using ttools."""
import argparse
import os
import logging
import random
import numpy as np
import torch
from torchvision.datasets import MNIST
import torchvision.transforms as xforms
from torch.utils.data import DataLoader
import ttools
import ttools.interfaces
import pydiffvg
LOG = ttools.get_logger(__name__)
pydiffvg.render_pytorch.print_timing = False
torch.manual_seed(123)
np.random.seed(123)
torch.backends.cudnn.deterministic = True
latent_dim = 100
img_size = 32
num_paths = 8
num_segments = 8
def weights_init_normal(m):
classname = m.__class__.__name__
if classname.find("Conv") != -1:
torch.nn.init.normal_(m.weight.data, 0.0, 0.02)
elif classname.find("BatchNorm2d") != -1:
torch.nn.init.normal_(m.weight.data, 1.0, 0.02)
torch.nn.init.constant_(m.bias.data, 0.0)
class VisdomImageCallback(ttools.callbacks.ImageDisplayCallback):
def visualized_image(self, batch, fwd_result):
return torch.cat([batch[0], fwd_result.cpu()], dim = 2)
# From https://github.com/eriklindernoren/PyTorch-GAN/blob/master/implementations/dcgan/dcgan.py
class Generator(torch.nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.fc = torch.nn.Sequential(
torch.nn.Linear(latent_dim, 128),
torch.nn.LeakyReLU(0.2, inplace=True),
torch.nn.Linear(128, 256),
torch.nn.LeakyReLU(0.2, inplace=True),
torch.nn.Linear(256, 512),
torch.nn.LeakyReLU(0.2, inplace=True),
torch.nn.Linear(512, 1024),
torch.nn.LeakyReLU(0.2, inplace=True),
torch.nn.Linear(1024, 2 * num_paths * (num_segments + 1) + num_paths + num_paths),
torch.nn.Sigmoid()
)
def forward(self, z):
out = self.fc(z)
# construct paths
imgs = []
for b in range(out.shape[0]):
index = 0
shapes = []
shape_groups = []
for i in range(num_paths):
points = img_size * out[b, index: index + 2 * (num_segments + 1)].view(-1, 2).cpu()
index += 2 * (num_segments + 1)
stroke_width = img_size * out[b, index].view(1).cpu()
index += 1
num_control_points = torch.zeros(num_segments, dtype = torch.int32) + 2
path = pydiffvg.Path(num_control_points = num_control_points,
points = points,
stroke_width = stroke_width,
is_closed = False)
shapes.append(path)
stroke_color = out[b, index].view(1).cpu()
index += 1
stroke_color = torch.cat([stroke_color, torch.tensor([0.0, 0.0, 1.0])])
path_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([len(shapes) - 1]),
fill_color = None,
stroke_color = stroke_color)
shape_groups.append(path_group)
scene_args = pydiffvg.RenderFunction.serialize_scene(img_size, img_size, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(img_size, # width
img_size, # height
2, # num_samples_x
2, # num_samples_y
random.randint(0, 1048576), # seed
None,
*scene_args)
img = img[:, :, :1]
# HWC -> NCHW
img = img.unsqueeze(0)
img = img.permute(0, 3, 1, 2) # NHWC -> NCHW
imgs.append(img)
img = torch.cat(imgs, dim = 0)
return img
class Discriminator(torch.nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
def discriminator_block(in_filters, out_filters, bn=True):
block = [torch.nn.Conv2d(in_filters, out_filters, 3, 2, 1),
torch.nn.LeakyReLU(0.2, inplace=True),
torch.nn.Dropout2d(0.25)]
if bn:
block.append(torch.nn.BatchNorm2d(out_filters, 0.8))
return block
self.model = torch.nn.Sequential(
*discriminator_block(1, 16, bn=False),
*discriminator_block(16, 32),
*discriminator_block(32, 64),
*discriminator_block(64, 128),
)
# The height and width of downsampled image
ds_size = img_size // 2 ** 4
self.adv_layer = torch.nn.Sequential(
torch.nn.Linear(128 * ds_size ** 2, 1),
torch.nn.Sigmoid())
def forward(self, img):
out = self.model(img)
out = out.view(out.shape[0], -1)
validity = self.adv_layer(out)
return validity
class MNISTInterface(ttools.interfaces.SGANInterface):
"""An adapter to run or train a model."""
def __init__(self, gen, discrim, lr=2e-4):
super(MNISTInterface, self).__init__(gen, discrim, lr, opt = 'adam')
def forward(self, batch):
return self.gen(torch.zeros([batch[0].shape[0], latent_dim], device = self.device).normal_())
def _discriminator_input(self, batch, fwd_data, fake=False):
if fake:
return fwd_data
else:
return batch[0].to(self.device)
def train(args):
"""Train a MNIST classifier."""
# Setup train and val data
_xform = xforms.Compose([xforms.Resize([32, 32]), xforms.ToTensor()])
data = MNIST("data/mnist", train=True, download=True, transform=_xform)
# Initialize asynchronous dataloaders
loader = DataLoader(data, batch_size=args.bs, num_workers=2)
# Instantiate the models
gen = Generator()
discrim = Discriminator()
gen.apply(weights_init_normal)
discrim.apply(weights_init_normal)
# Checkpointer to save/recall model parameters
checkpointer_gen = ttools.Checkpointer(os.path.join(args.out, "checkpoints"), model=gen, prefix="gen_")
checkpointer_discrim = ttools.Checkpointer(os.path.join(args.out, "checkpoints"), model=discrim, prefix="discrim_")
# resume from a previous checkpoint, if any
checkpointer_gen.load_latest()
checkpointer_discrim.load_latest()
# Setup a training interface for the model
interface = MNISTInterface(gen, discrim, lr=args.lr)
# Create a training looper with the interface we defined
trainer = ttools.Trainer(interface)
# Adds several callbacks, that will be called by the trainer --------------
# A periodic checkpointing operation
trainer.add_callback(ttools.callbacks.CheckpointingCallback(checkpointer_gen))
trainer.add_callback(ttools.callbacks.CheckpointingCallback(checkpointer_discrim))
# A simple progress bar
trainer.add_callback(ttools.callbacks.ProgressBarCallback(
keys=["loss_g", "loss_d", "loss"]))
# A volatile logging using visdom
trainer.add_callback(ttools.callbacks.VisdomLoggingCallback(
keys=["loss_g", "loss_d", "loss"],
port=8080, env="mnist_demo"))
# Image
trainer.add_callback(VisdomImageCallback(port=8080, env="mnist_demo"))
# -------------------------------------------------------------------------
# Start the training
LOG.info("Training started, press Ctrl-C to interrupt.")
trainer.train(loader, num_epochs=args.epochs)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# TODO: subparsers
parser.add_argument("data", help="directory where we download and store the MNIST dataset.")
parser.add_argument("out", help="directory where we write the checkpoints and visualizations.")
parser.add_argument("--lr", type=float, default=1e-4, help="learning rate for the optimizer.")
parser.add_argument("--epochs", type=int, default=500, help="number of epochs to train for.")
parser.add_argument("--bs", type=int, default=64, help="number of elements per batch.")
args = parser.parse_args()
ttools.set_logger(True) # activate debug prints
train(args)

291
apps/style_transfer.py Normal file
View File

@@ -0,0 +1,291 @@
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.models as models
from PIL import Image
import copy
import pydiffvg
import argparse
def main(args):
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width, canvas_height, shapes, shape_groups = pydiffvg.svg_to_scene(args.content_file)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# Transform to gamma space
pydiffvg.imwrite(img.cpu(), 'results/style_transfer/init.png', gamma=1.0)
# HWC -> NCHW
img = img.unsqueeze(0)
img = img.permute(0, 3, 1, 2) # NHWC -> NCHW
loader = transforms.Compose([
transforms.ToTensor()]) # transform it into a torch tensor
def image_loader(image_name):
image = Image.open(image_name)
# fake batch dimension required to fit network's input dimensions
image = loader(image).unsqueeze(0)
return image.to(pydiffvg.get_device(), torch.float)
style_img = image_loader(args.style_img)
# alpha blend content with a gray background
content_img = img[:, :3, :, :] * img[:, 3, :, :] + \
0.5 * torch.ones([1, 3, img.shape[2], img.shape[3]]) * \
(1 - img[:, 3, :, :])
assert style_img.size() == content_img.size(), \
"we need to import style and content images of the same size"
unloader = transforms.ToPILImage() # reconvert into PIL image
class ContentLoss(nn.Module):
def __init__(self, target,):
super(ContentLoss, self).__init__()
# we 'detach' the target content from the tree used
# to dynamically compute the gradient: this is a stated value,
# not a variable. Otherwise the forward method of the criterion
# will throw an error.
self.target = target.detach()
def forward(self, input):
self.loss = F.mse_loss(input, self.target)
return input
def gram_matrix(input):
a, b, c, d = input.size() # a=batch size(=1)
# b=number of feature maps
# (c,d)=dimensions of a f. map (N=c*d)
features = input.view(a * b, c * d) # resise F_XL into \hat F_XL
G = torch.mm(features, features.t()) # compute the gram product
# we 'normalize' the values of the gram matrix
# by dividing by the number of element in each feature maps.
return G.div(a * b * c * d)
class StyleLoss(nn.Module):
def __init__(self, target_feature):
super(StyleLoss, self).__init__()
self.target = gram_matrix(target_feature).detach()
def forward(self, input):
G = gram_matrix(input)
self.loss = F.mse_loss(G, self.target)
return input
device = pydiffvg.get_device()
cnn = models.vgg19(pretrained=True).features.to(device).eval()
cnn_normalization_mean = torch.tensor([0.485, 0.456, 0.406]).to(device)
cnn_normalization_std = torch.tensor([0.229, 0.224, 0.225]).to(device)
# create a module to normalize input image so we can easily put it in a
# nn.Sequential
class Normalization(nn.Module):
def __init__(self, mean, std):
super(Normalization, self).__init__()
# .view the mean and std to make them [C x 1 x 1] so that they can
# directly work with image Tensor of shape [B x C x H x W].
# B is batch size. C is number of channels. H is height and W is width.
self.mean = mean.clone().view(-1, 1, 1)
self.std = std.clone().view(-1, 1, 1)
def forward(self, img):
# normalize img
return (img - self.mean) / self.std
# desired depth layers to compute style/content losses :
content_layers_default = ['conv_4']
style_layers_default = ['conv_1', 'conv_2', 'conv_3', 'conv_4', 'conv_5']
def get_style_model_and_losses(cnn, normalization_mean, normalization_std,
style_img, content_img,
content_layers=content_layers_default,
style_layers=style_layers_default):
cnn = copy.deepcopy(cnn)
# normalization module
normalization = Normalization(normalization_mean, normalization_std).to(device)
# just in order to have an iterable access to or list of content/syle
# losses
content_losses = []
style_losses = []
# assuming that cnn is a nn.Sequential, so we make a new nn.Sequential
# to put in modules that are supposed to be activated sequentially
model = nn.Sequential(normalization)
i = 0 # increment every time we see a conv
for layer in cnn.children():
if isinstance(layer, nn.Conv2d):
i += 1
name = 'conv_{}'.format(i)
elif isinstance(layer, nn.ReLU):
name = 'relu_{}'.format(i)
# The in-place version doesn't play very nicely with the ContentLoss
# and StyleLoss we insert below. So we replace with out-of-place
# ones here.
layer = nn.ReLU(inplace=False)
elif isinstance(layer, nn.MaxPool2d):
name = 'pool_{}'.format(i)
elif isinstance(layer, nn.BatchNorm2d):
name = 'bn_{}'.format(i)
else:
raise RuntimeError('Unrecognized layer: {}'.format(layer.__class__.__name__))
model.add_module(name, layer)
if name in content_layers:
# add content loss:
target = model(content_img).detach()
content_loss = ContentLoss(target)
model.add_module("content_loss_{}".format(i), content_loss)
content_losses.append(content_loss)
if name in style_layers:
# add style loss:
target_feature = model(style_img).detach()
style_loss = StyleLoss(target_feature)
model.add_module("style_loss_{}".format(i), style_loss)
style_losses.append(style_loss)
# now we trim off the layers after the last content and style losses
for i in range(len(model) - 1, -1, -1):
if isinstance(model[i], ContentLoss) or isinstance(model[i], StyleLoss):
break
model = model[:(i + 1)]
return model, style_losses, content_losses
def run_style_transfer(cnn, normalization_mean, normalization_std,
content_img, style_img,
canvas_width, canvas_height,
shapes, shape_groups,
num_steps=500, style_weight=5000, content_weight=1):
"""Run the style transfer."""
print('Building the style transfer model..')
model, style_losses, content_losses = get_style_model_and_losses(cnn,
normalization_mean, normalization_std, style_img, content_img)
point_params = []
color_params = []
stroke_width_params = []
for shape in shapes:
if isinstance(shape, pydiffvg.Path):
point_params.append(shape.points.requires_grad_())
stroke_width_params.append(shape.stroke_width.requires_grad_())
for shape_group in shape_groups:
if isinstance(shape_group.fill_color, torch.Tensor):
color_params.append(shape_group.fill_color.requires_grad_())
elif isinstance(shape_group.fill_color, pydiffvg.LinearGradient):
point_params.append(shape_group.fill_color.begin.requires_grad_())
point_params.append(shape_group.fill_color.end.requires_grad_())
color_params.append(shape_group.fill_color.stop_colors.requires_grad_())
if isinstance(shape_group.stroke_color, torch.Tensor):
color_params.append(shape_group.stroke_color.requires_grad_())
elif isinstance(shape_group.stroke_color, pydiffvg.LinearGradient):
point_params.append(shape_group.stroke_color.begin.requires_grad_())
point_params.append(shape_group.stroke_color.end.requires_grad_())
color_params.append(shape_group.stroke_color.stop_colors.requires_grad_())
point_optimizer = optim.Adam(point_params, lr=1.0)
color_optimizer = optim.Adam(color_params, lr=0.01)
stroke_width_optimizers = optim.Adam(stroke_width_params, lr=0.1)
print('Optimizing..')
run = [0]
while run[0] <= num_steps:
point_optimizer.zero_grad()
color_optimizer.zero_grad()
stroke_width_optimizers.zero_grad()
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# alpha blend img with a gray background
img = img[:, :, :3] * img[:, :, 3:4] + \
0.5 * torch.ones([img.shape[0], img.shape[1], 3]) * \
(1 - img[:, :, 3:4])
pydiffvg.imwrite(img.cpu(),
'results/style_transfer/step_{}.png'.format(run[0]),
gamma=1.0)
# HWC to NCHW
img = img.permute([2, 0, 1]).unsqueeze(0)
model(img)
style_score = 0
content_score = 0
for sl in style_losses:
style_score += sl.loss
for cl in content_losses:
content_score += cl.loss
style_score *= style_weight
content_score *= content_weight
loss = style_score + content_score
loss.backward()
run[0] += 1
if run[0] % 1 == 0:
print("run {}:".format(run))
print('Style Loss : {:4f} Content Loss: {:4f}'.format(
style_score.item(), content_score.item()))
print()
point_optimizer.step()
color_optimizer.step()
stroke_width_optimizers.step()
for color in color_params:
color.data.clamp_(0, 1)
for w in stroke_width_params:
w.data.clamp_(0.5, 4.0)
return shapes, shape_groups
shapes, shape_groups = run_style_transfer(\
cnn, cnn_normalization_mean, cnn_normalization_std,
content_img, style_img,
canvas_width, canvas_height, shapes, shape_groups)
scene_args = pydiffvg.RenderFunction.serialize_scene(shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
# Transform to gamma space
pydiffvg.imwrite(img.cpu(), 'results/style_transfer/output.png', gamma=1.0)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("content_file", help="source SVG path")
parser.add_argument("style_img", help="target image path")
args = parser.parse_args()
main(args)

167
apps/svg_brush.py Normal file
View File

@@ -0,0 +1,167 @@
import sys
sys.path.append("../svg")
from geometry import GeometryLoss
import numpy as np
import pygame as pg
import torch
import pydiffvg
import tkinter as tk
from tkinter import filedialog
def box_kernel(val):
return np.heaviside(-val+1,0)
def cone_kernel(val):
return np.maximum(0,1-val)
def nptosurf(arr):
if arr.shape[2]==1:
#greyscale
shape=arr.shape
shape=(shape[0],shape[1],3)
arr=np.broadcast_to(arr,shape)
return pg.surfarray.make_surface(arr*255)
def brush_tensor(screen_size,coords,radius,kernel):
coordarr=np.stack(np.meshgrid(np.linspace(0,screen_size[0]-1,screen_size[0]),np.linspace(0,screen_size[1]-1,screen_size[1]),indexing='ij'),axis=2)
ctrarr = np.reshape(np.array(coords), [1, 1, 2])
distarr=np.sqrt(np.sum(np.power(coordarr-ctrarr,2),axis=2))
valarr=kernel(distarr/radius)
return torch.tensor(valarr,requires_grad=False,dtype=torch.float32)
def checkerboard(shape, square_size=2):
xv,yv=np.meshgrid(np.floor(np.linspace(0,shape[1]-1,shape[1])/square_size),np.floor(np.linspace(0,shape[0]-1,shape[0])/square_size))
bin=np.expand_dims(((xv+yv)%2),axis=2)
res=bin*np.array([[[1., 1., 1.,]]])+(1-bin)*np.array([[[.75, .75, .75,]]])
return torch.tensor(res,requires_grad=False,dtype=torch.float32)
def render(optim, viewport):
scene_args = pydiffvg.RenderFunction.serialize_scene(*optim.build_scene())
render = pydiffvg.RenderFunction.apply
img = render(viewport[0], # width
viewport[1], # height
2, # num_samples_x
2, # num_samples_y
0, # seed
None,
*scene_args)
return img
def optimize(optim, viewport, brush_kernel, increase=True, strength=0.1):
optim.zero_grad()
geomLoss=torch.tensor(0.)
for shape, gloss in zip(optim.scene[2],geometryLosses):
geomLoss+=gloss.compute(shape)
img=render(optim,viewport)
imalpha=img[:,:,3]
multiplied=imalpha*brush_kernel
loss=((1-multiplied).mean() if increase else multiplied.mean())*strength
loss+=geomLoss
loss.backward()
optim.step()
return render(optim,viewport)
def get_infile():
pydiffvg.set_use_gpu(False)
root = tk.Tk()
#root.withdraw()
file_path = filedialog.askopenfilename(initialdir = ".",title = "Select graphic to optimize",filetypes = (("SVG files","*.svg"),("all files","*.*")))
root.destroy()
return file_path
def compositebg(img):
bg=checkerboard(img.shape,2)
color=img[:,:,0:3]
alpha=img[:,:,3]
composite=alpha.unsqueeze(2)*color+(1-alpha).unsqueeze(2)*bg
return composite
def main():
infile=get_infile()
settings=pydiffvg.SvgOptimizationSettings()
settings.global_override(["optimize_color"],False)
settings.global_override(["transforms","optimize_transforms"], False)
settings.global_override(["optimizer"], "SGD")
settings.global_override(["paths","shape_lr"], 1e-1)
optim=pydiffvg.OptimizableSvg(infile,settings)
global geometryLosses
geometryLosses = []
for shape in optim.build_scene()[2]:
geometryLosses.append(GeometryLoss(shape))
scaling=1
brush_radius=100
graphic_size=optim.canvas
screen_size=(graphic_size[1]*scaling, graphic_size[0]*scaling)
pg.init()
screen=pg.display.set_mode(screen_size)
screen.fill((255,255,255))
img=render(optim,graphic_size)
print(img.max())
npsurf = pg.transform.scale(nptosurf(compositebg(img).detach().permute(1,0,2).numpy()), screen_size)
screen.blit(npsurf,(0,0))
pg.display.update()
clock=pg.time.Clock()
z=0
btn=0
while True:
clock.tick(60)
for event in pg.event.get():
if event.type==pg.QUIT:
pg.quit()
sys.exit()
y, x = pg.mouse.get_pos()
if event.type == pg.MOUSEBUTTONDOWN:
if event.button in [1,3]:
z=1
btn=event.button
elif event.button == 4:
brush_radius*=1.1
elif event.button == 5:
brush_radius/=1.1
brush_radius=max(brush_radius,5)
elif event.type == pg.MOUSEBUTTONUP:
if event.button in [1,3]:
z=0
if z==1:
brush=brush_tensor((graphic_size[0],graphic_size[1]), (x/scaling, y/scaling), brush_radius, box_kernel)
img=optimize(optim,graphic_size,brush,btn==1)
npsurf = pg.transform.scale(nptosurf(compositebg(img).detach().permute(1,0,2).numpy()), screen_size)
screen.blit(npsurf,(0,0))
pg.draw.circle(screen, (255,255,255), (y,x), int(brush_radius*scaling), 1)
pg.display.update()
if __name__ == '__main__':
main()

63
apps/svg_parse_test.py Normal file
View File

@@ -0,0 +1,63 @@
import pydiffvg
import sys
import numpy as np
import torch
sys.path.append("../pydiffvg")
from optimize_svg import OptimizableSvg
pydiffvg.set_use_gpu(False)
"""
for x in range(100000):
inmat=np.eye(3)
inmat[0:2,:]=(np.random.rand(2,3)-0.5)*2
decomp=OptimizableSvg.TransformTools.decompose(inmat)
outmat=OptimizableSvg.TransformTools.recompose(torch.tensor(decomp[0],dtype=torch.float32),torch.tensor(decomp[1],dtype=torch.float32),torch.tensor(decomp[2],dtype=torch.float32),torch.tensor(decomp[3],dtype=torch.float32)).numpy()
dif=np.linalg.norm(inmat-outmat)
if dif > 1e-3:
print(dif)
print(inmat)
print(outmat)
print(decomp)"""
#infile='../../data/test_data/linear_grad_alpha_aspaths.svg'
#infile='../../data/note_small.svg'
infile='linux.svg'
canvas_width, canvas_height, shapes, shape_groups = \
pydiffvg.svg_to_scene(infile)
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups)
render = pydiffvg.RenderFunction.apply
img = render(canvas_width, # width
canvas_height, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'test_old.png', gamma=1.0)
#optim=OptimizableSvg('linux.svg',verbose=True)
optim=OptimizableSvg(infile,verbose=True)
scene=optim.build_scene()
scene_args = pydiffvg.RenderFunction.serialize_scene(*scene)
render = pydiffvg.RenderFunction.apply
img = render(scene[0], # width
scene[1], # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
with open("resaved.svg","w") as f:
f.write(optim.write_xml())
# The output image is in linear RGB space. Do Gamma correction before saving the image.
pydiffvg.imwrite(img.cpu(), 'test_new.png', gamma=1.0)
print("Done!")

109
apps/test_eval_positions.py Normal file
View File

@@ -0,0 +1,109 @@
import pydiffvg
import torch
import skimage
import numpy as np
# Use GPU if available
pydiffvg.set_use_gpu(torch.cuda.is_available())
canvas_width = 256
canvas_height = 256
circle = pydiffvg.Circle(radius = torch.tensor(40.0),
center = torch.tensor([128.0, 128.0]))
shapes = [circle]
circle_group = pydiffvg.ShapeGroup(shape_ids = torch.tensor([0]),
fill_color = torch.tensor([0.3, 0.6, 0.3, 1.0]))
shape_groups = [circle_group]
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
render = pydiffvg.RenderFunction.apply
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
0, # seed
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/test_eval_positions/target.png')
target = img.clone()
# Move the circle to produce initial guess
# normalize radius & center for easier learning rate
radius_n = torch.tensor(20.0 / 256.0, requires_grad=True)
center_n = torch.tensor([108.0 / 256.0, 138.0 / 256.0], requires_grad=True)
color = torch.tensor([0.3, 0.2, 0.8, 1.0], requires_grad=True)
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
1, # seed
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
pydiffvg.imwrite(img.cpu(), 'results/test_eval_positions/init.png')
# Optimize for radius & center
optimizer = torch.optim.Adam([radius_n, center_n, color], lr=1e-2)
# Run 200 Adam iterations.
for t in range(200):
print('iteration:', t)
optimizer.zero_grad()
# Forward pass: render the image.
circle.radius = radius_n * 256
circle.center = center_n * 256
circle_group.fill_color = color
# Evaluate 1000 positions
eval_positions = torch.rand(1000, 2) * 256
# for grid_sample()
grid_eval_positions = (eval_positions / 256.0) * 2.0 - 1.0
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf,
eval_positions = eval_positions)
samples = render(256, # width
256, # height
0, # num_samples_x
0, # num_samples_y
t+1, # seed
*scene_args)
samples = samples / 256 # Normalize SDF to [0, 1]
target_sampled = torch.nn.functional.grid_sample(\
target.view(1, 1, target.shape[0], target.shape[1]),
grid_eval_positions.view(1, -1, 1, 2), mode='nearest')
loss = (samples - target_sampled).pow(2).mean()
print('loss:', loss.item())
# Backpropagate the gradients.
loss.backward()
# Print the gradients
print('radius.grad:', radius_n.grad)
print('center.grad:', center_n.grad)
print('color.grad:', color.grad)
# Take a gradient descent step.
optimizer.step()
# Print the current params.
print('radius:', circle.radius)
print('center:', circle.center)
print('color:', circle_group.fill_color)
# Render the final result.
scene_args = pydiffvg.RenderFunction.serialize_scene(\
canvas_width, canvas_height, shapes, shape_groups,
output_type = pydiffvg.OutputType.sdf)
img = render(256, # width
256, # height
2, # num_samples_x
2, # num_samples_y
102, # seed
*scene_args)
img = img / 256 # Normalize SDF to [0, 1]
# Save the images and differences.
pydiffvg.imwrite(img.cpu(), 'results/test_eval_positions/final.png')

BIN
apps/textureSyn/1.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
apps/textureSyn/2.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
apps/textureSyn/3.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,26 @@
# for gif making
import imageio
import numpy as np
import os
from PIL import Image
from math import floor
def make_gif(savePath, outputPath, frame_every_X_steps=15, repeat_ending=15, total_iter=200):
number_files = len(os.listdir(savePath)) - 2
frame_every_X_steps = frame_every_X_steps
repeat_ending = repeat_ending
steps = np.arange(floor(number_files / frame_every_X_steps)) * frame_every_X_steps
steps = steps + (number_files - np.max(steps))
images = []
for f in range(total_iter-1):
# for f in steps:
filename = savePath + 'iter_' + str(f+1) + '.png'
images.append(imageio.imread(filename))
# repeat ending
for _ in range(repeat_ending):
filename = savePath + 'final.png'
# filename = savePath + 'iter_' + str(number_files) + '.png'
images.append(imageio.imread(filename))
imageio.mimsave(outputPath, images)

View File

@@ -0,0 +1,388 @@
#imports
import numpy as np
import matplotlib.pyplot as plt
import os
from math import floor, ceil
from random import randint
from sklearn.neighbors import KDTree
from skimage.util.shape import view_as_windows
from skimage import io
from PIL import Image, ImageDraw
from IPython.display import clear_output
class patchBasedTextureSynthesis:
def __init__(self, exampleMapPath, in_outputPath, in_outputSize, in_patchSize, in_overlapSize, in_windowStep = 5, in_mirror_hor = True, in_mirror_vert = True, in_shapshots = True):
self.exampleMap = self.loadExampleMap(exampleMapPath)
self.snapshots = in_shapshots
self.outputPath = in_outputPath
self.outputSize = in_outputSize
self.patchSize = in_patchSize
self.overlapSize = in_overlapSize
self.mirror_hor = in_mirror_hor
self.mirror_vert = in_mirror_vert
self.total_patches_count = 0 #excluding mirrored versions
self.windowStep = 5
self.iter = 0
self.checkIfDirectoryExists() #check if output directory exists
self.examplePatches = self.prepareExamplePatches()
self.canvas, self.filledMap, self.idMap = self.initCanvas()
self.initFirstPatch() #place random block to start with
self.kdtree_topOverlap, self.kdtree_leftOverlap, self.kdtree_combined = self.initKDtrees()
self.PARM_truncation = 0.8
self.PARM_attenuation = 2
def checkIfDirectoryExists(self):
if not os.path.exists(self.outputPath):
os.makedirs(self.outputPath)
def resolveAll(self):
self.saveParams()
#resolve all unresolved patches
for i in range(np.sum(1-self.filledMap).astype(int)):
self.resolveNext()
if not self.snapshots:
img = Image.fromarray(np.uint8(self.canvas*255))
img = img.resize((self.outputSize[0], self.outputSize[1]), resample=0, box=None)
img.save(self.outputPath + 'out.jpg')
# else:
# self.visualize([0,0], [], [], showCandidates=False)
return img
def saveParams(self):
#write
text_file = open(self.outputPath + 'params.txt', "w")
text_file.write("PatchSize: %d \nOverlapSize: %d \nMirror Vert: %d \nMirror Hor: %d" % (self.patchSize, self.overlapSize, self.mirror_vert, self.mirror_hor))
text_file.close()
def resolveNext(self):
#coordinate of the next one to resolve
coord = self.idCoordTo2DCoord(np.sum(self.filledMap), np.shape(self.filledMap)) #get 2D coordinate of next to resolve patch
#get overlap areas of the patch we want to resolve
overlapArea_Top = self.getOverlapAreaTop(coord)
overlapArea_Left = self.getOverlapAreaLeft(coord)
#find most similar patch from the examples
dist, ind = self.findMostSimilarPatches(overlapArea_Top, overlapArea_Left, coord)
if self.mirror_hor or self.mirror_vert:
#check that top and left neighbours are not mirrors
dist, ind = self.checkForMirrors(dist, ind, coord)
#choose random valid patch
probabilities = self.distances2probability(dist, self.PARM_truncation, self.PARM_attenuation)
chosenPatchId = np.random.choice(ind, 1, p=probabilities)
#update canvas
blend_top = (overlapArea_Top is not None)
blend_left = (overlapArea_Left is not None)
self.updateCanvas(chosenPatchId, coord[0], coord[1], blend_top, blend_left)
#update filledMap and id map ;)
self.filledMap[coord[0], coord[1]] = 1
self.idMap[coord[0], coord[1]] = chosenPatchId
#visualize
# self.visualize(coord, chosenPatchId, ind)
self.iter += 1
def visualize(self, coord, chosenPatchId, nonchosenPatchId, showCandidates = True):
#full visualization includes both example and generated img
canvasSize = np.shape(self.canvas)
#insert generated image
vis = np.zeros((canvasSize[0], canvasSize[1] * 2, 3)) + 0.2
vis[:, 0:canvasSize[1]] = self.canvas
#insert example
exampleHighlited = np.copy(self.exampleMap)
if showCandidates:
exampleHighlited = self.hightlightPatchCandidates(chosenPatchId, nonchosenPatchId)
h = floor(canvasSize[0] / 2)
w = floor(canvasSize[1] / 2)
exampleResized = self.resize(exampleHighlited, [h, w])
offset_h = floor((canvasSize[0] - h) / 2)
offset_w = floor((canvasSize[1] - w) / 2)
vis[offset_h:offset_h+h, canvasSize[1]+offset_w:canvasSize[1]+offset_w+w] = exampleResized
#show live update
plt.imshow(vis)
clear_output(wait=True)
display(plt.show())
if self.snapshots:
img = Image.fromarray(np.uint8(vis*255))
img = img.resize((self.outputSize[0]*2, self.outputSize[1]), resample=0, box=None)
img.save(self.outputPath + 'out' + str(self.iter) + '.jpg')
def hightlightPatchCandidates(self, chosenPatchId, nonchosenPatchId):
result = np.copy(self.exampleMap)
#mod patch ID
chosenPatchId = chosenPatchId[0] % self.total_patches_count
if len(nonchosenPatchId)>0:
nonchosenPatchId = nonchosenPatchId % self.total_patches_count
#exlcude chosen from nonchosen
nonchosenPatchId = np.delete(nonchosenPatchId, np.where(nonchosenPatchId == chosenPatchId))
#highlight non chosen candidates
c = [0.25, 0.9 ,0.45]
self.highlightPatches(result, nonchosenPatchId, color=c, highlight_width = 4, alpha = 0.5)
#hightlight chosen
c = [1.0, 0.25, 0.15]
self.highlightPatches(result, [chosenPatchId], color=c, highlight_width = 4, alpha = 1)
return result
def highlightPatches(self, writeResult, patchesIDs, color, highlight_width = 2, solid = False, alpha = 0.1):
searchWindow = self.patchSize + 2*self.overlapSize
#number of possible steps
row_steps = floor((np.shape(writeResult)[0] - searchWindow) / self.windowStep) + 1
col_steps = floor((np.shape(writeResult)[1] - searchWindow) / self.windowStep) + 1
for i in range(len(patchesIDs)):
chosenPatchId = patchesIDs[i]
#patch Id to step
patch_row = floor(chosenPatchId / col_steps)
patch_col = chosenPatchId - patch_row * col_steps
#highlight chosen patch (below are boundaries of the example patch)
row_start = self.windowStep* patch_row
row_end = self.windowStep * patch_row + searchWindow
col_start = self.windowStep * patch_col
col_end = self.windowStep * patch_col + searchWindow
if not solid:
w = highlight_width
overlap = np.copy(writeResult[row_start:row_start+w, col_start:col_end])
writeResult[row_start:row_start+w, col_start:col_end] = overlap * (1-alpha) + (np.zeros(np.shape(overlap))+color) * alpha #top
overlap = np.copy(writeResult[row_end-w:row_end, col_start:col_end])
writeResult[row_end-w:row_end, col_start:col_end] = overlap * (1-alpha) + (np.zeros(np.shape(overlap))+color) * alpha #bot
overlap = np.copy( writeResult[row_start:row_end, col_start:col_start+w])
writeResult[row_start:row_end, col_start:col_start+w] = overlap * (1-alpha) + (np.zeros(np.shape(overlap))+color) * alpha #left
overlap = np.copy(writeResult[row_start:row_end, col_end-w:col_end])
writeResult[row_start:row_end, col_end-w:col_end] = overlap * (1-alpha) + (np.zeros(np.shape(overlap))+color) * alpha #end
else:
a = alpha
writeResult[row_start:row_end, col_start:col_end] = writeResult[row_start:row_end, col_start:col_end] * (1-a) + (np.zeros(np.shape(writeResult[row_start:row_end, col_start:col_end]))+color) * a
def resize(self, imgArray, targetSize):
img = Image.fromarray(np.uint8(imgArray*255))
img = img.resize((targetSize[0], targetSize[1]), resample=0, box=None)
return np.array(img)/255
def findMostSimilarPatches(self, overlapArea_Top, overlapArea_Left, coord, in_k=5):
#check which KD tree we need to use
if (overlapArea_Top is not None) and (overlapArea_Left is not None):
combined = self.getCombinedOverlap(overlapArea_Top.reshape(-1), overlapArea_Left.reshape(-1))
dist, ind = self.kdtree_combined.query([combined], k=in_k)
elif overlapArea_Top is not None:
dist, ind = self.kdtree_topOverlap.query([overlapArea_Top.reshape(-1)], k=in_k)
elif overlapArea_Left is not None:
dist, ind = self.kdtree_leftOverlap.query([overlapArea_Left.reshape(-1)], k=in_k)
else:
raise Exception("ERROR: no valid overlap area is passed to -findMostSimilarPatch-")
dist = dist[0]
ind = ind[0]
return dist, ind
#disallow visually similar blocks to be placed next to each other
def checkForMirrors(self, dist, ind, coord, thres = 3):
remove_i = []
#do I have a top or left neighbour
if coord[0]-1>-1:
top_neigh = int(self.idMap[coord[0]-1, coord[1]])
for i in range(len(ind)):
if (abs(ind[i]%self.total_patches_count - top_neigh%self.total_patches_count) < thres):
remove_i.append(i)
if coord[1]-1>-1:
left_neigh = int(self.idMap[coord[0], coord[1]-1])
for i in range(len(ind)):
if (abs(ind[i]%self.total_patches_count - left_neigh%self.total_patches_count) < thres):
remove_i.append(i)
dist = np.delete(dist, remove_i)
ind = np.delete(ind, remove_i)
return dist, ind
def distances2probability(self, distances, PARM_truncation, PARM_attenuation):
probabilities = 1 - distances / np.max(distances)
probabilities *= (probabilities > PARM_truncation)
probabilities = pow(probabilities, PARM_attenuation) #attenuate the values
#check if we didn't truncate everything!
if np.sum(probabilities) == 0:
#then just revert it
probabilities = 1 - distances / np.max(distances)
probabilities *= (probabilities > PARM_truncation*np.max(probabilities)) # truncate the values (we want top truncate%)
probabilities = pow(probabilities, PARM_attenuation)
probabilities /= np.sum(probabilities) #normalize so they add up to one
return probabilities
def getOverlapAreaTop(self, coord):
#do I have a top neighbour
if coord[0]-1>-1:
canvasPatch = self.patchCoord2canvasPatch(coord)
return canvasPatch[0:self.overlapSize, :, :]
else:
return None
def getOverlapAreaLeft(self, coord):
#do I have a left neighbour
if coord[1]-1>-1:
canvasPatch = self.patchCoord2canvasPatch(coord)
return canvasPatch[:, 0:self.overlapSize, :]
else:
return None
def initKDtrees(self):
#prepate overlap patches
topOverlap = self.examplePatches[:, 0:self.overlapSize, :, :]
leftOverlap = self.examplePatches[:, :, 0:self.overlapSize, :]
shape_top = np.shape(topOverlap)
shape_left = np.shape(leftOverlap)
flatten_top = topOverlap.reshape(shape_top[0], -1)
flatten_left = leftOverlap.reshape(shape_left[0], -1)
flatten_combined = self.getCombinedOverlap(flatten_top, flatten_left)
tree_top = KDTree(flatten_top)
tree_left = KDTree(flatten_left)
tree_combined = KDTree(flatten_combined)
return tree_top, tree_left, tree_combined
#the corner of 2 overlaps is counted double
def getCombinedOverlap(self, top, left):
shape = np.shape(top)
if len(shape) > 1:
combined = np.zeros((shape[0], shape[1]*2))
combined[0:shape[0], 0:shape[1]] = top
combined[0:shape[0], shape[1]:shape[1]*2] = left
else:
combined = np.zeros((shape[0]*2))
combined[0:shape[0]] = top
combined[shape[0]:shape[0]*2] = left
return combined
def initFirstPatch(self):
#grab a random block
patchId = randint(0, np.shape(self.examplePatches)[0])
#mark out fill map
self.filledMap[0, 0] = 1
self.idMap[0, 0] = patchId % self.total_patches_count
#update canvas
self.updateCanvas(patchId, 0, 0, False, False)
#visualize
# self.visualize([0,0], [patchId], [])
def prepareExamplePatches(self):
searchKernelSize = self.patchSize + 2 * self.overlapSize
result = view_as_windows(self.exampleMap, [searchKernelSize, searchKernelSize, 3] , self.windowStep)
shape = np.shape(result)
result = result.reshape(shape[0]*shape[1], searchKernelSize, searchKernelSize, 3)
self.total_patches_count = shape[0]*shape[1]
if self.mirror_hor:
#flip along horizonal axis
hor_result = np.zeros(np.shape(result))
for i in range(self.total_patches_count):
hor_result[i] = result[i][::-1, :, :]
result = np.concatenate((result, hor_result))
if self.mirror_vert:
vert_result = np.zeros((shape[0]*shape[1], searchKernelSize, searchKernelSize, 3))
for i in range(self.total_patches_count):
vert_result[i] = result[i][:, ::-1, :]
result = np.concatenate((result, vert_result))
return result
def initCanvas(self):
#check whether the outputSize adheres to patch+overlap size
num_patches_X = ceil((self.outputSize[0]-self.overlapSize)/(self.patchSize+self.overlapSize))
num_patches_Y = ceil((self.outputSize[1]-self.overlapSize)/(self.patchSize+self.overlapSize))
#calc needed output image size
required_size_X = num_patches_X*self.patchSize + (num_patches_X+1)*self.overlapSize
required_size_Y = num_patches_Y*self.patchSize + (num_patches_X+1)*self.overlapSize
#create empty canvas
canvas = np.zeros((required_size_X, required_size_Y, 3))
filledMap = np.zeros((num_patches_X, num_patches_Y)) #map showing which patches have been resolved
idMap = np.zeros((num_patches_X, num_patches_Y)) - 1 #stores patches id
print("modified output size: ", np.shape(canvas))
print("number of patches: ", np.shape(filledMap)[0])
return canvas, filledMap, idMap
def idCoordTo2DCoord(self, idCoord, imgSize):
row = int(floor(idCoord / imgSize[0]))
col = int(idCoord - row * imgSize[1])
return [row, col]
def updateCanvas(self, inputPatchId, coord_X, coord_Y, blendTop = False, blendLeft = False):
#translate Patch coordinate into Canvas coordinate
x_range = self.patchCoord2canvasCoord(coord_X)
y_range = self.patchCoord2canvasCoord(coord_Y)
examplePatch = self.examplePatches[inputPatchId]
if blendLeft:
canvasOverlap = self.canvas[x_range[0]:x_range[1], y_range[0]:y_range[0]+self.overlapSize]
examplePatchOverlap = np.copy(examplePatch[0][:, 0:self.overlapSize])
examplePatch[0][:, 0:self.overlapSize] = self.linearBlendOverlaps(canvasOverlap, examplePatchOverlap, 'left')
if blendTop:
canvasOverlap = self.canvas[x_range[0]:x_range[0]+self.overlapSize, y_range[0]:y_range[1]]
examplePatchOverlap = np.copy(examplePatch[0][0:self.overlapSize, :])
examplePatch[0][0:self.overlapSize, :] = self.linearBlendOverlaps(canvasOverlap, examplePatchOverlap, 'top')
self.canvas[x_range[0]:x_range[1], y_range[0]:y_range[1]] = examplePatch
def linearBlendOverlaps(self, canvasOverlap, examplePatchOverlap, mode):
if mode == 'left':
mask = np.repeat(np.arange(self.overlapSize)[np.newaxis, :], np.shape(canvasOverlap)[0], axis=0) / self.overlapSize
elif mode == 'top':
mask = np.repeat(np.arange(self.overlapSize)[:, np.newaxis], np.shape(canvasOverlap)[1], axis=1) / self.overlapSize
mask = np.repeat(mask[:, :, np.newaxis], 3, axis=2) #cast to 3d array
return canvasOverlap * (1 - mask) + examplePatchOverlap * mask
#def minimumBoundaryError(self, canvasOverlap, examplePatchOverlap, mode)
def patchCoord2canvasCoord(self, coord):
return [(self.patchSize+self.overlapSize)*coord, (self.patchSize+self.overlapSize)*(coord+1) + self.overlapSize]
def patchCoord2canvasPatch(self, coord):
x_range = self.patchCoord2canvasCoord(coord[0])
y_range = self.patchCoord2canvasCoord(coord[1])
return np.copy(self.canvas[x_range[0]:x_range[1], y_range[0]:y_range[1]])
def loadExampleMap(self, exampleMapPath):
exampleMap = io.imread(exampleMapPath) #returns an MxNx3 array
exampleMap = exampleMap / 255.0 #normalize
#make sure it is 3channel RGB
if (np.shape(exampleMap)[-1] > 3):
exampleMap = exampleMap[:,:,:3] #remove Alpha Channel
elif (len(np.shape(exampleMap)) == 2):
exampleMap = np.repeat(exampleMap[np.newaxis, :, :], 3, axis=0) #convert from Grayscale to RGB
return exampleMap

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

1969
apps/textureSyn/traced_1.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

8204
apps/textureSyn/traced_2.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 560 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

13302
apps/textureSyn/traced_3.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 926 KiB

Some files were not shown because too many files have changed in this diff Show More