summaryrefslogtreecommitdiff
path: root/chromium/third_party/skia/tools
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/third_party/skia/tools
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-chromium-85-based.tar.gz
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/skia/tools')
-rw-r--r--chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp2
-rw-r--r--chromium/third_party/skia/tools/DDLTileHelper.cpp9
-rw-r--r--chromium/third_party/skia/tools/DDLTileHelper.h6
-rw-r--r--chromium/third_party/skia/tools/convert-to-nia.cpp227
-rw-r--r--chromium/third_party/skia/tools/debugger/DebugCanvas.cpp4
-rw-r--r--chromium/third_party/skia/tools/fiddle/all_examples.cpp5
-rw-r--r--chromium/third_party/skia/tools/fiddle/disabled_examples.txt1
-rw-r--r--chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt22
-rw-r--r--chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp8
-rw-r--r--chromium/third_party/skia/tools/flags/CommonFlagsConfig.h3
-rw-r--r--chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp2
-rw-r--r--chromium/third_party/skia/tools/fm/fm.cpp8
-rw-r--r--chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp4
-rw-r--r--chromium/third_party/skia/tools/fonts/TestTypeface.cpp2
-rw-r--r--chromium/third_party/skia/tools/gpu/GrContextFactory.cpp3
-rw-r--r--chromium/third_party/skia/tools/gpu/GrTest.cpp8
-rw-r--r--chromium/third_party/skia/tools/gpu/MemoryCache.cpp3
-rw-r--r--chromium/third_party/skia/tools/gpu/MemoryCache.h9
-rw-r--r--chromium/third_party/skia/tools/gpu/TestContext.cpp1
-rw-r--r--chromium/third_party/skia/tools/gpu/TestOps.cpp39
-rw-r--r--chromium/third_party/skia/tools/gpu/YUVUtils.cpp25
-rw-r--r--chromium/third_party/skia/tools/gpu/YUVUtils.h40
-rw-r--r--chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp483
-rw-r--r--chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h25
-rw-r--r--chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h37
-rw-r--r--chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp1
-rw-r--r--chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp12
-rw-r--r--chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h5
-rw-r--r--chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp35
-rw-r--r--chromium/third_party/skia/tools/gpu/gl/GLTestContext.h4
-rw-r--r--chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp23
-rw-r--r--chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp6
-rw-r--r--chromium/third_party/skia/tools/gpu/gl/interface/templates.go48
-rw-r--r--chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp109
-rw-r--r--chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h71
-rw-r--r--chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp5
-rw-r--r--chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp196
-rw-r--r--chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h48
-rw-r--r--chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html22
-rw-r--r--chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html22
-rw-r--r--chromium/third_party/skia/tools/lottiecap/driver.html38
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile20
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json49
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json2
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html189
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg5155
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js33
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html157
-rw-r--r--chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html6
-rw-r--r--chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp11
-rw-r--r--chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h2
-rw-r--r--chromium/third_party/skia/tools/sk_app/Window.cpp2
-rw-r--r--chromium/third_party/skia/tools/sk_app/Window.h3
-rw-r--r--chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp243
-rw-r--r--chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h4
-rw-r--r--chromium/third_party/skia/tools/sk_app/win/Window_win.cpp6
-rw-r--r--chromium/third_party/skia/tools/skiaserve/Response.cpp2
-rw-r--r--chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html24
-rw-r--r--chromium/third_party/skia/tools/skottie2movie.cpp1
-rw-r--r--chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm2
-rw-r--r--chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm2
-rw-r--r--chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py3
-rw-r--r--chromium/third_party/skia/tools/skpbench/README.md67
-rw-r--r--chromium/third_party/skia/tools/skpbench/skpbench.cpp67
-rwxr-xr-xchromium/third_party/skia/tools/skpbench/skpbench.py10
-rw-r--r--chromium/third_party/skia/tools/skqp/bad_gms.txt1
-rw-r--r--chromium/third_party/skia/tools/valgrind.supp16
-rw-r--r--chromium/third_party/skia/tools/viewer/GMSlide.cpp7
-rw-r--r--chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp2
-rw-r--r--chromium/third_party/skia/tools/viewer/SKPSlide.cpp34
-rw-r--r--chromium/third_party/skia/tools/viewer/SKPSlide.h5
-rw-r--r--chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp69
-rw-r--r--chromium/third_party/skia/tools/viewer/SkRiveSlide.h41
-rw-r--r--chromium/third_party/skia/tools/viewer/SkSLSlide.cpp19
-rw-r--r--chromium/third_party/skia/tools/viewer/SkSLSlide.h3
-rw-r--r--chromium/third_party/skia/tools/viewer/SkottieSlide.cpp15
-rw-r--r--chromium/third_party/skia/tools/viewer/SkottieSlide.h3
-rw-r--r--chromium/third_party/skia/tools/viewer/SvgSlide.cpp22
-rw-r--r--chromium/third_party/skia/tools/viewer/SvgSlide.h6
-rw-r--r--chromium/third_party/skia/tools/viewer/Viewer.cpp212
-rw-r--r--chromium/third_party/skia/tools/viewer/Viewer.h7
81 files changed, 7248 insertions, 895 deletions
diff --git a/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp b/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp
index 89dca3c80f7..2dba0b9f8cb 100644
--- a/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp
+++ b/chromium/third_party/skia/tools/DDLPromiseImageHelper.cpp
@@ -128,6 +128,7 @@ static GrBackendTexture create_yuva_texture(GrContext* context, const SkPixmap&
auto beTex = context->createBackendTexture(&pm, 1, GrRenderable::kNo, GrProtected::kNo,
markFinished, &finishedBECreate);
if (beTex.isValid()) {
+ context->submit();
while (!finishedBECreate) {
context->checkAsyncWorkCompletion();
}
@@ -175,6 +176,7 @@ void DDLPromiseImageHelper::CreateBETexturesForPromiseImage(GrContext* context,
GrRenderable::kNo, GrProtected::kNo,
markFinished, &finishedBECreate);
SkASSERT(backendTex.isValid());
+ context->submit();
while (!finishedBECreate) {
context->checkAsyncWorkCompletion();
}
diff --git a/chromium/third_party/skia/tools/DDLTileHelper.cpp b/chromium/third_party/skia/tools/DDLTileHelper.cpp
index 7771a6ec961..6333ded6219 100644
--- a/chromium/third_party/skia/tools/DDLTileHelper.cpp
+++ b/chromium/third_party/skia/tools/DDLTileHelper.cpp
@@ -109,6 +109,7 @@ void DDLTileHelper::createComposeDDL() {
}
fComposeDDL = recorder.detach();
+ SkASSERT(fComposeDDL);
}
void DDLTileHelper::TileData::precompile(GrContext* context) {
@@ -287,6 +288,11 @@ static void do_gpu_stuff(GrContext* context, DDLTileHelper::TileData* tile) {
tile->precompile(context);
tile->draw(context);
+
+ // TODO: remove this flush once DDLs are reffed by the drawing manager
+ context->flushAndSubmit();
+
+ tile->dropDDL();
}
// We expect to have more than one recording thread but just one gpu thread
@@ -315,6 +321,7 @@ void DDLTileHelper::kickOffThreadedWork(SkTaskGroup* recordingTaskGroup,
recordingTaskGroup->add([this] { this->createComposeDDL(); });
}
+// Only called from ViaDDL
void DDLTileHelper::precompileAndDrawAllTiles(GrContext* context) {
for (int i = 0; i < this->numTiles(); ++i) {
fTiles[i].precompile(context);
@@ -322,6 +329,7 @@ void DDLTileHelper::precompileAndDrawAllTiles(GrContext* context) {
}
}
+// Only called from skpbench
void DDLTileHelper::interleaveDDLCreationAndDraw(GrContext* context) {
for (int i = 0; i < this->numTiles(); ++i) {
fTiles[i].createDDL();
@@ -329,6 +337,7 @@ void DDLTileHelper::interleaveDDLCreationAndDraw(GrContext* context) {
}
}
+// Only called from skpbench
void DDLTileHelper::drawAllTilesDirectly(GrContext* context) {
for (int i = 0; i < this->numTiles(); ++i) {
fTiles[i].drawSKPDirectly(context);
diff --git a/chromium/third_party/skia/tools/DDLTileHelper.h b/chromium/third_party/skia/tools/DDLTileHelper.h
index 4430b52ee6f..bd9112acef3 100644
--- a/chromium/third_party/skia/tools/DDLTileHelper.h
+++ b/chromium/third_party/skia/tools/DDLTileHelper.h
@@ -44,6 +44,8 @@ public:
// Create the DDL for this tile (i.e., fill in 'fDisplayList').
void createDDL();
+ void dropDDL() { fDisplayList.reset(); }
+
// Precompile all the programs required to draw this tile's DDL
void precompile(GrContext*);
@@ -98,11 +100,11 @@ public:
const SkIRect& viewport,
int numDivisions);
- void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper& helper);
+ void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper&);
void kickOffThreadedWork(SkTaskGroup* recordingTaskGroup,
SkTaskGroup* gpuTaskGroup,
- GrContext* gpuThreadContext);
+ GrContext*);
void createDDLsInParallel();
diff --git a/chromium/third_party/skia/tools/convert-to-nia.cpp b/chromium/third_party/skia/tools/convert-to-nia.cpp
new file mode 100644
index 00000000000..58f9a67360f
--- /dev/null
+++ b/chromium/third_party/skia/tools/convert-to-nia.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// This program converts an image from stdin (e.g. a JPEG, PNG, etc.) to stdout
+// (in the NIA/NIE format, a trivial image file format).
+//
+// The NIA/NIE file format specification is at:
+// https://github.com/google/wuffs/blob/master/doc/spec/nie-spec.md
+//
+// Pass "-1" or "-first-frame-only" as a command line flag to output NIE (a
+// still image) instead of NIA (an animated image). The output format (NIA or
+// NIE) depends only on this flag's absence or presence, not on the stdin
+// image's format.
+//
+// There are multiple codec implementations of any given image format. For
+// example, as of May 2020, Chromium, Skia and Wuffs each have their own BMP
+// decoder implementation. There is no standard "libbmp" that they all share.
+// Comparing this program's output (or hashed output) to similar programs in
+// other repositories can identify image inputs for which these decoders (or
+// different versions of the same decoder) produce different output (pixels).
+//
+// An equivalent program (using the Chromium image codecs) is at:
+// https://crrev.com/c/2210331
+//
+// An equivalent program (using the Wuffs image codecs) is at:
+// https://github.com/google/wuffs/blob/master/example/convert-to-nia/convert-to-nia.c
+
+#include <stdio.h>
+#include <string.h>
+
+#include "include/codec/SkCodec.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkData.h"
+#include "src/core/SkAutoMalloc.h"
+
+static inline void set_u32le(uint8_t* ptr, uint32_t val) {
+ ptr[0] = val >> 0;
+ ptr[1] = val >> 8;
+ ptr[2] = val >> 16;
+ ptr[3] = val >> 24;
+}
+
+static inline void set_u64le(uint8_t* ptr, uint64_t val) {
+ ptr[0] = val >> 0;
+ ptr[1] = val >> 8;
+ ptr[2] = val >> 16;
+ ptr[3] = val >> 24;
+ ptr[4] = val >> 32;
+ ptr[5] = val >> 40;
+ ptr[6] = val >> 48;
+ ptr[7] = val >> 56;
+}
+
+static void write_nix_header(uint32_t magicU32le, uint32_t width, uint32_t height) {
+ uint8_t data[16];
+ set_u32le(data + 0, magicU32le);
+ set_u32le(data + 4, 0x346E62FF); // 4 bytes per pixel non-premul BGRA.
+ set_u32le(data + 8, width);
+ set_u32le(data + 12, height);
+ fwrite(data, 1, 16, stdout);
+}
+
+static bool write_nia_duration(uint64_t totalDurationMillis) {
+ // Flicks are NIA's unit of time. One flick (frame-tick) is 1 / 705_600_000
+ // of a second. See https://github.com/OculusVR/Flicks
+ static constexpr uint64_t flicksPerMilli = 705600;
+ if (totalDurationMillis > (INT64_MAX / flicksPerMilli)) {
+ // Converting from millis to flicks would overflow.
+ return false;
+ }
+
+ uint8_t data[8];
+ set_u64le(data + 0, totalDurationMillis * flicksPerMilli);
+ fwrite(data, 1, 8, stdout);
+ return true;
+}
+
+static void write_nie_pixels(uint32_t width, uint32_t height, const SkBitmap& bm) {
+ static constexpr size_t kBufferSize = 4096;
+ uint8_t buf[kBufferSize];
+ size_t n = 0;
+ for (uint32_t y = 0; y < height; y++) {
+ for (uint32_t x = 0; x < width; x++) {
+ SkColor c = bm.getColor(x, y);
+ buf[n++] = SkColorGetB(c);
+ buf[n++] = SkColorGetG(c);
+ buf[n++] = SkColorGetR(c);
+ buf[n++] = SkColorGetA(c);
+ if (n == kBufferSize) {
+ fwrite(buf, 1, n, stdout);
+ n = 0;
+ }
+ }
+ }
+ if (n > 0) {
+ fwrite(buf, 1, n, stdout);
+ }
+}
+
+static void write_nia_padding(uint32_t width, uint32_t height) {
+ // 4 bytes of padding when the width and height are both odd.
+ if (width & height & 1) {
+ uint8_t data[4];
+ set_u32le(data + 0, 0);
+ fwrite(data, 1, 4, stdout);
+ }
+}
+
+static void write_nia_footer(int repetitionCount, bool stillImage) {
+ uint8_t data[8];
+ if (stillImage || (repetitionCount == SkCodec::kRepetitionCountInfinite)) {
+ set_u32le(data + 0, 0);
+ } else {
+ // NIA's loop count and Skia's repetition count differ by one. See
+ // https://github.com/google/wuffs/blob/master/doc/spec/nie-spec.md#nii-footer
+ set_u32le(data + 0, 1 + repetitionCount);
+ }
+ set_u32le(data + 4, 0x80000000);
+ fwrite(data, 1, 8, stdout);
+}
+
+int main(int argc, char** argv) {
+ bool firstFrameOnly = false;
+ for (int a = 1; a < argc; a++) {
+ if ((strcmp(argv[a], "-1") == 0) || (strcmp(argv[a], "-first-frame-only") == 0)) {
+ firstFrameOnly = true;
+ break;
+ }
+ }
+
+ std::unique_ptr<SkCodec> codec(SkCodec::MakeFromData(SkData::MakeFromFILE(stdin)));
+ if (!codec) {
+ SkDebugf("Decode failed.\n");
+ return 1;
+ }
+ codec->getInfo().makeColorSpace(nullptr);
+ SkBitmap bm;
+ bm.allocPixels(codec->getInfo());
+ size_t bmByteSize = bm.computeByteSize();
+
+ // Cache a frame that future frames may depend on.
+ int cachedFrame = SkCodec::kNoFrame;
+ SkAutoMalloc cachedFramePixels;
+
+ uint64_t totalDurationMillis = 0;
+ const int frameCount = codec->getFrameCount();
+ if (frameCount == 0) {
+ SkDebugf("No frames.\n");
+ return 1;
+ }
+ // The SkCodec::getFrameInfo comment says that this vector will be empty
+ // for still (not animated) images, even though frameCount should be 1.
+ std::vector<SkCodec::FrameInfo> frameInfos = codec->getFrameInfo();
+ bool stillImage = frameInfos.empty();
+
+ for (int i = 0; i < frameCount; i++) {
+ SkCodec::Options opts;
+ opts.fFrameIndex = i;
+
+ if (!stillImage) {
+ int durationMillis = frameInfos[i].fDuration;
+ if (durationMillis < 0) {
+ SkDebugf("Negative animation duration.\n");
+ return 1;
+ }
+ totalDurationMillis += static_cast<uint64_t>(durationMillis);
+ if (totalDurationMillis > INT64_MAX) {
+ SkDebugf("Unsupported animation duration.\n");
+ return 1;
+ }
+
+ if ((cachedFrame != SkCodec::kNoFrame) &&
+ (cachedFrame == frameInfos[i].fRequiredFrame) && cachedFramePixels.get()) {
+ opts.fPriorFrame = cachedFrame;
+ memcpy(bm.getPixels(), cachedFramePixels.get(), bmByteSize);
+ }
+ }
+
+ if (!firstFrameOnly) {
+ if (i == 0) {
+ write_nix_header(0x41AFC36E, // "nïA" magic string as a u32le.
+ bm.width(), bm.height());
+ }
+
+ if (!write_nia_duration(totalDurationMillis)) {
+ SkDebugf("Unsupported animation duration.\n");
+ return 1;
+ }
+ }
+
+ const SkCodec::Result result =
+ codec->getPixels(codec->getInfo(), bm.getPixels(), bm.rowBytes(), &opts);
+ if ((result != SkCodec::kSuccess) && (result != SkCodec::kIncompleteInput)) {
+ SkDebugf("Decode frame pixels #%d failed.\n", i);
+ return 1;
+ }
+
+ // If the next frame depends on this one, store it in cachedFrame. It
+ // is possible that we may discard a frame that future frames depend
+ // on, but the codec will simply redecode the discarded frame.
+ if ((static_cast<size_t>(i + 1) < frameInfos.size()) &&
+ (frameInfos[i + 1].fRequiredFrame == i)) {
+ cachedFrame = i;
+ memcpy(cachedFramePixels.reset(bmByteSize), bm.getPixels(), bmByteSize);
+ }
+
+ int width = bm.width();
+ int height = bm.height();
+ write_nix_header(0x45AFC36E, // "nïE" magic string as a u32le.
+ width, height);
+ write_nie_pixels(width, height, bm);
+ if (result == SkCodec::kIncompleteInput) {
+ SkDebugf("Incomplete input.\n");
+ return 1;
+ }
+ if (firstFrameOnly) {
+ return 0;
+ }
+ write_nia_padding(width, height);
+ }
+ write_nia_footer(codec->getRepetitionCount(), stillImage);
+ return 0;
+}
diff --git a/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp b/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp
index 11b76085241..95d2e06e0cf 100644
--- a/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp
+++ b/chromium/third_party/skia/tools/debugger/DebugCanvas.cpp
@@ -328,11 +328,11 @@ void DebugCanvas::didConcat44(const SkM44& m) {
}
void DebugCanvas::didScale(SkScalar x, SkScalar y) {
- this->didConcat(SkMatrix::MakeScale(x, y));
+ this->didConcat(SkMatrix::Scale(x, y));
}
void DebugCanvas::didTranslate(SkScalar x, SkScalar y) {
- this->didConcat(SkMatrix::MakeTrans(x, y));
+ this->didConcat(SkMatrix::Translate(x, y));
}
void DebugCanvas::didConcat(const SkMatrix& matrix) {
diff --git a/chromium/third_party/skia/tools/fiddle/all_examples.cpp b/chromium/third_party/skia/tools/fiddle/all_examples.cpp
index 9046fee7f6c..3850ee0a22c 100644
--- a/chromium/third_party/skia/tools/fiddle/all_examples.cpp
+++ b/chromium/third_party/skia/tools/fiddle/all_examples.cpp
@@ -261,7 +261,6 @@
#include "../../docs/examples/Difference.cpp"
#include "../../docs/examples/Dither_a.cpp"
#include "../../docs/examples/Dither_b.cpp"
-#include "../../docs/examples/Draw_Looper_Methods.cpp"
#include "../../docs/examples/Dst.cpp"
#include "../../docs/examples/Dst_Atop.cpp"
#include "../../docs/examples/Dst_In.cpp"
@@ -538,7 +537,6 @@
#include "../../docs/examples/Paint_getColor.cpp"
#include "../../docs/examples/Paint_getColor4f.cpp"
#include "../../docs/examples/Paint_getColorFilter.cpp"
-#include "../../docs/examples/Paint_getDrawLooper.cpp"
#include "../../docs/examples/Paint_getFillPath.cpp"
#include "../../docs/examples/Paint_getFillPath_2.cpp"
#include "../../docs/examples/Paint_getFilterQuality.cpp"
@@ -579,7 +577,6 @@
#include "../../docs/examples/Paint_notequal_operator.cpp"
#include "../../docs/examples/Paint_nothingToDraw.cpp"
#include "../../docs/examples/Paint_refColorFilter.cpp"
-#include "../../docs/examples/Paint_refDrawLooper.cpp"
#include "../../docs/examples/Paint_refImageFilter.cpp"
#include "../../docs/examples/Paint_refMaskFilter.cpp"
#include "../../docs/examples/Paint_refPathEffect.cpp"
@@ -595,7 +592,6 @@
#include "../../docs/examples/Paint_setColor4f.cpp"
#include "../../docs/examples/Paint_setColorFilter.cpp"
#include "../../docs/examples/Paint_setDither.cpp"
-#include "../../docs/examples/Paint_setDrawLooper.cpp"
#include "../../docs/examples/Paint_setEmbeddedBitmapText.cpp"
#include "../../docs/examples/Paint_setFakeBoldText.cpp"
#include "../../docs/examples/Paint_setFilterQuality.cpp"
@@ -1043,7 +1039,6 @@
#include "../../docs/examples/State_Stack_b.cpp"
#include "../../docs/examples/Stroke_Width.cpp"
#include "../../docs/examples/Surface_MakeFromBackendTexture.cpp"
-#include "../../docs/examples/Surface_MakeFromBackendTextureAsRenderTarget.cpp"
#include "../../docs/examples/Surface_MakeNull.cpp"
#include "../../docs/examples/Surface_MakeRaster.cpp"
#include "../../docs/examples/Surface_MakeRasterDirect.cpp"
diff --git a/chromium/third_party/skia/tools/fiddle/disabled_examples.txt b/chromium/third_party/skia/tools/fiddle/disabled_examples.txt
index 3970425b03e..1c568526b76 100644
--- a/chromium/third_party/skia/tools/fiddle/disabled_examples.txt
+++ b/chromium/third_party/skia/tools/fiddle/disabled_examples.txt
@@ -174,7 +174,6 @@ docs/examples/Region_op_6.cpp
docs/examples/Region_setPath.cpp
docs/examples/Region_writeToMemory.cpp
docs/examples/Surface_MakeFromBackendTexture.cpp
-docs/examples/Surface_MakeFromBackendTextureAsRenderTarget.cpp
docs/examples/Surface_MakeRenderTarget.cpp
docs/examples/Surface_MakeRenderTarget_2.cpp
docs/examples/Surface_MakeRenderTarget_3.cpp
diff --git a/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt b/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt
index 2a98cc07111..46ef1c5b400 100644
--- a/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt
+++ b/chromium/third_party/skia/tools/fiddle/documumentation_examples_map.txt
@@ -2022,10 +2022,6 @@ SkColor4f getColor4f() const;
SkPaint
SkColorFilter* getColorFilter() const;
-[Paint_getDrawLooper]
-SkPaint
-SkDrawLooper* getDrawLooper() const;
-
[Paint_getFillPath_2]
[Shader_Methods_a]
[Shader_Methods_b]
@@ -2196,10 +2192,6 @@ bool operator==(const SkPaint& a, const SkPaint& b);
SkPaint
sk_sp<SkColorFilter> refColorFilter() const;
-[Paint_refDrawLooper]
-SkPaint
-sk_sp<SkDrawLooper> refDrawLooper() const;
-
[Paint_refImageFilter]
SkPaint
sk_sp<SkImageFilter> refImageFilter() const;
@@ -2266,11 +2258,6 @@ void setColorFilter(sk_sp<SkColorFilter> colorFilter);
SkPaint
void setDither(bool dither);
-[Paint_setDrawLooper]
-[Text_Size]
-SkPaint
-void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
-
[Paint_setEmbeddedBitmapText]
SkPaint
void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
@@ -2294,11 +2281,6 @@ void setFlags(uint32_t flags);
SkPaint
void setHinting(SkFontHinting hintingLevel);
-[Draw_Looper_Methods]
-[Paint_setImageFilter]
-SkPaint
-void setImageFilter(sk_sp<SkImageFilter> imageFilter);
-
[Paint_setLCDRenderText]
SkPaint
void setLCDRenderText(bool lcdText);
@@ -3924,10 +3906,6 @@ SkRegion
SkSurface
static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context, const GrBackendTexture& backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* surfaceProps);
-[Surface_MakeFromBackendTextureAsRenderTarget]
-SkSurface
-static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context, const GrBackendTexture& backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* surfaceProps);
-
[Surface_MakeNull]
SkSurface
static sk_sp<SkSurface> MakeNull(int width, int height);
diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp
index fa0c414363e..0dc0a52d470 100644
--- a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp
+++ b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.cpp
@@ -72,6 +72,7 @@ static const struct {
{ "gltestprecompile", "gpu", "api=gl,testPrecompile=true" },
{ "glestestprecompile", "gpu", "api=gles,testPrecompile=true" },
{ "glddl", "gpu", "api=gl,useDDLSink=true" },
+ { "glooprddl", "gpu", "api=gl,OOPRish=true" },
{ "angle_d3d11_es2", "gpu", "api=angle_d3d11_es2" },
{ "angle_d3d11_es3", "gpu", "api=angle_d3d11_es3" },
{ "angle_d3d9_es2", "gpu", "api=angle_d3d9_es2" },
@@ -103,6 +104,7 @@ static const struct {
{ "vkbert", "gpu", "api=vulkan,surf=bert" },
{ "vktestpersistentcache", "gpu", "api=vulkan,testPersistentCache=1" },
{ "vkddl", "gpu", "api=vulkan,useDDLSink=true" },
+ { "vkooprddl", "gpu", "api=vulkan,OOPRish=true" },
#endif
#ifdef SK_METAL
{ "mtl", "gpu", "api=metal" },
@@ -110,6 +112,7 @@ static const struct {
{ "mtlmsaa4", "gpu", "api=metal,samples=4" },
{ "mtlmsaa8", "gpu", "api=metal,samples=8" },
{ "mtlddl", "gpu", "api=metal,useDDLSink=true" },
+ { "mtlooprddl", "gpu", "api=metal,OOPRish=true" },
#endif
#ifdef SK_DIRECT3D
{ "d3d", "gpu", "api=direct3d" },
@@ -459,6 +462,7 @@ SkCommandLineConfigGpu::SkCommandLineConfigGpu(const SkString& tag,
int testPersistentCache,
bool testPrecompile,
bool useDDLSink,
+ bool OOPRish,
SurfType surfType)
: SkCommandLineConfig(tag, SkString("gpu"), viaParts)
, fContextType(contextType)
@@ -472,6 +476,7 @@ SkCommandLineConfigGpu::SkCommandLineConfigGpu(const SkString& tag,
, fTestPersistentCache(testPersistentCache)
, fTestPrecompile(testPrecompile)
, fUseDDLSink(useDDLSink)
+ , fOOPRish(OOPRish)
, fSurfType(surfType) {
if (!useStencilBuffers) {
fContextOverrides |= ContextOverrides::kAvoidStencilBuffers;
@@ -493,6 +498,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString&
int testPersistentCache = 0;
bool testPrecompile = false;
bool useDDLs = false;
+ bool ooprish = false;
SkCommandLineConfigGpu::SurfType surfType = SkCommandLineConfigGpu::SurfType::kDefault;
bool parseSucceeded = false;
@@ -511,6 +517,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString&
extendedOptions.get_option_int("testPersistentCache", &testPersistentCache) &&
extendedOptions.get_option_bool("testPrecompile", &testPrecompile) &&
extendedOptions.get_option_bool("useDDLSink", &useDDLs) &&
+ extendedOptions.get_option_bool("OOPRish", &ooprish) &&
extendedOptions.get_option_gpu_surf_type("surf", &surfType);
// testing threading and the persistent cache are mutually exclusive.
@@ -531,6 +538,7 @@ SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString&
testPersistentCache,
testPrecompile,
useDDLs,
+ ooprish,
surfType);
}
diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h
index f4ae2949ea1..02bd8569a41 100644
--- a/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h
+++ b/chromium/third_party/skia/tools/flags/CommonFlagsConfig.h
@@ -64,6 +64,7 @@ public:
int testPersistentCache,
bool testPrecompile,
bool useDDLSink,
+ bool OOPRish,
SurfType);
const SkCommandLineConfigGpu* asConfigGpu() const override { return this; }
@@ -78,6 +79,7 @@ public:
int getTestPersistentCache() const { return fTestPersistentCache; }
bool getTestPrecompile() const { return fTestPrecompile; }
bool getUseDDLSink() const { return fUseDDLSink; }
+ bool getOOPRish() const { return fOOPRish; }
SurfType getSurfType() const { return fSurfType; }
private:
@@ -92,6 +94,7 @@ private:
int fTestPersistentCache;
bool fTestPrecompile;
bool fUseDDLSink;
+ bool fOOPRish;
SurfType fSurfType;
};
diff --git a/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp b/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp
index b00bf8892d8..4f15944e750 100644
--- a/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp
+++ b/chromium/third_party/skia/tools/flags/CommonFlagsGpu.cpp
@@ -60,7 +60,7 @@ static GpuPathRenderers get_named_pathrenderers_flags(const char* name) {
} else if (!strcmp(name, "default")) {
return GpuPathRenderers::kDefault;
}
- SK_ABORT(SkStringPrintf("error: unknown named path renderer \"%s\"\n", name).c_str());
+ SK_ABORT("error: unknown named path renderer \"%s\"\n", name);
}
static GpuPathRenderers collect_gpu_path_renderers_from_flags() {
diff --git a/chromium/third_party/skia/tools/fm/fm.cpp b/chromium/third_party/skia/tools/fm/fm.cpp
index 75f1389eaa8..b9909133140 100644
--- a/chromium/third_party/skia/tools/fm/fm.cpp
+++ b/chromium/third_party/skia/tools/fm/fm.cpp
@@ -132,6 +132,12 @@ static void init(Source* source, std::shared_ptr<skiagm::GM> gm) {
source->tweak = [gm](GrContextOptions* options) { gm->modifyGrContextOptions(options); };
source->draw = [gm](SkCanvas* canvas) {
SkString err;
+ switch (gm->gpuSetup(canvas->getGrContext(), &err)) {
+ case skiagm::DrawResult::kOk : break;
+ case skiagm::DrawResult::kSkip: return skip;
+ case skiagm::DrawResult::kFail: return fail(err.c_str());
+ }
+
switch (gm->draw(canvas, &err)) {
case skiagm::DrawResult::kOk: break;
case skiagm::DrawResult::kSkip: return skip;
@@ -573,7 +579,7 @@ int main(int argc, char** argv) {
case Result::Ok: break;
case Result::Skip: return false;
case Result::Fail:
- SK_ABORT(result.failure.c_str());
+ SK_ABORT("%s", result.failure.c_str());
}
return true;
};
diff --git a/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp b/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp
index 1bba3a608e0..c10bb2185d7 100644
--- a/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp
+++ b/chromium/third_party/skia/tools/fonts/TestSVGTypeface.cpp
@@ -772,7 +772,7 @@ void TestSVGTypeface::exportTtxCbdt(SkWStream* out, SkSpan<unsigned> strikeSizes
-bounds.fTop,
font,
paint);
- surface->flush();
+ surface->flushAndSubmit();
sk_sp<SkImage> image = surface->makeImageSnapshot();
sk_sp<SkData> data = image->encodeToData(SkEncodedImageFormat::kPNG, 100);
@@ -994,7 +994,7 @@ void TestSVGTypeface::exportTtxSbix(SkWStream* out, SkSpan<unsigned> strikeSizes
-bounds.fTop,
font,
paint);
- surface->flush();
+ surface->flushAndSubmit();
sk_sp<SkImage> image = surface->makeImageSnapshot();
sk_sp<SkData> data = image->encodeToData(SkEncodedImageFormat::kPNG, 100);
diff --git a/chromium/third_party/skia/tools/fonts/TestTypeface.cpp b/chromium/third_party/skia/tools/fonts/TestTypeface.cpp
index 7f30f01c1d2..f32f77aa03f 100644
--- a/chromium/third_party/skia/tools/fonts/TestTypeface.cpp
+++ b/chromium/third_party/skia/tools/fonts/TestTypeface.cpp
@@ -132,7 +132,7 @@ void TestTypeface::onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) co
*isLocal = false;
}
-void TestTypeface::onCharsToGlyphs(const SkUnichar uni[], int count, SkGlyphID glyphs[]) const {
+void TestTypeface::onCharsToGlyphs(const SkUnichar* uni, int count, SkGlyphID glyphs[]) const {
for (int i = 0; i < count; ++i) {
glyphs[i] = fTestFont->glyphForUnichar(uni[i]);
}
diff --git a/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp b/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp
index 13cc9792050..f7356f57fb8 100644
--- a/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp
+++ b/chromium/third_party/skia/tools/gpu/GrContextFactory.cpp
@@ -90,7 +90,8 @@ void GrContextFactory::abandonContexts() {
auto restore = context.fTestContext->makeCurrentAndAutoRestore();
context.fTestContext->testAbandon();
}
- bool requiresEarlyAbandon = (context.fGrContext->backend() == GrBackendApi::kVulkan);
+ GrBackendApi api = context.fGrContext->backend();
+ bool requiresEarlyAbandon = api == GrBackendApi::kVulkan || api == GrBackendApi::kDawn;
if (requiresEarlyAbandon) {
context.fGrContext->abandonContext();
}
diff --git a/chromium/third_party/skia/tools/gpu/GrTest.cpp b/chromium/third_party/skia/tools/gpu/GrTest.cpp
index 2a030d43eb0..d6286674e72 100644
--- a/chromium/third_party/skia/tools/gpu/GrTest.cpp
+++ b/chromium/third_party/skia/tools/gpu/GrTest.cpp
@@ -54,20 +54,18 @@ int GrResourceCache::countUniqueKeysWithTag(const char* tag) const {
///////////////////////////////////////////////////////////////////////////////
-#define ASSERT_SINGLE_OWNER \
- SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fRenderTargetContext->singleOwner());)
-
+#define ASSERT_SINGLE_OWNER GR_ASSERT_SINGLE_OWNER(fRenderTargetContext->singleOwner())
uint32_t GrRenderTargetContextPriv::testingOnly_getOpsTaskID() {
return fRenderTargetContext->getOpsTask()->uniqueID();
}
void GrRenderTargetContextPriv::testingOnly_addDrawOp(std::unique_ptr<GrDrawOp> op) {
- this->testingOnly_addDrawOp(GrNoClip(), std::move(op));
+ this->testingOnly_addDrawOp(nullptr, std::move(op), {});
}
void GrRenderTargetContextPriv::testingOnly_addDrawOp(
- const GrClip& clip,
+ const GrClip* clip,
std::unique_ptr<GrDrawOp> op,
const std::function<GrRenderTargetContext::WillAddOpFn>& willAddFn) {
ASSERT_SINGLE_OWNER
diff --git a/chromium/third_party/skia/tools/gpu/MemoryCache.cpp b/chromium/third_party/skia/tools/gpu/MemoryCache.cpp
index d8fdaf71578..93ef2b14a47 100644
--- a/chromium/third_party/skia/tools/gpu/MemoryCache.cpp
+++ b/chromium/third_party/skia/tools/gpu/MemoryCache.cpp
@@ -57,6 +57,7 @@ void MemoryCache::store(const SkData& key, const SkData& data) {
SkDebugf("Store Key: %s\n\tData: %s\n\n", data_to_str(key).c_str(),
data_to_str(data).c_str());
}
+ ++fCacheStoreCnt;
fMap[Key(key)] = Value(data);
}
@@ -96,7 +97,7 @@ void MemoryCache::writeShadersToDisk(const char* path, GrBackendApi api) {
// Even with the SPIR-V switches, it seems like we must use .spv, or malisc tries to
// run glslang on the input.
const char* ext = GrBackendApi::kOpenGL == api ? "frag" : "spv";
- SkReader32 reader(data->data(), data->size());
+ SkReadBuffer reader(data->data(), data->size());
GrPersistentCacheUtils::GetType(&reader); // Shader type tag
GrPersistentCacheUtils::UnpackCachedShaders(&reader, shaders,
inputsIgnored, kGrShaderTypeCount);
diff --git a/chromium/third_party/skia/tools/gpu/MemoryCache.h b/chromium/third_party/skia/tools/gpu/MemoryCache.h
index 22911a5413b..f70cf1388e8 100644
--- a/chromium/third_party/skia/tools/gpu/MemoryCache.h
+++ b/chromium/third_party/skia/tools/gpu/MemoryCache.h
@@ -28,14 +28,18 @@ public:
MemoryCache(const MemoryCache&) = delete;
MemoryCache& operator=(const MemoryCache&) = delete;
void reset() {
- fCacheMissCnt = 0;
+ this->resetCacheStats();
fMap.clear();
}
sk_sp<SkData> load(const SkData& key) override;
void store(const SkData& key, const SkData& data) override;
int numCacheMisses() const { return fCacheMissCnt; }
- void resetNumCacheMisses() { fCacheMissCnt = 0; }
+ int numCacheStores() const { return fCacheStoreCnt; }
+ void resetCacheStats() {
+ fCacheMissCnt = 0;
+ fCacheStoreCnt = 0;
+ }
void writeShadersToDisk(const char* path, GrBackendApi backend);
@@ -80,6 +84,7 @@ private:
};
int fCacheMissCnt = 0;
+ int fCacheStoreCnt = 0;
std::unordered_map<Key, Value, Hash> fMap;
};
diff --git a/chromium/third_party/skia/tools/gpu/TestContext.cpp b/chromium/third_party/skia/tools/gpu/TestContext.cpp
index cdd86c4fc4b..9b9e5dcbb9d 100644
--- a/chromium/third_party/skia/tools/gpu/TestContext.cpp
+++ b/chromium/third_party/skia/tools/gpu/TestContext.cpp
@@ -54,6 +54,7 @@ void TestContext::flushAndWaitOnSync(GrContext* context) {
flushInfo.fFinishedContext = fFinishTrackers[fCurrentFlushIdx].get();
context->flush(flushInfo);
+ context->submit();
fCurrentFlushIdx = (fCurrentFlushIdx + 1) % SK_ARRAY_COUNT(fFinishTrackers);
}
diff --git a/chromium/third_party/skia/tools/gpu/TestOps.cpp b/chromium/third_party/skia/tools/gpu/TestOps.cpp
index ff5201a2c98..1ef7420d74c 100644
--- a/chromium/third_party/skia/tools/gpu/TestOps.cpp
+++ b/chromium/third_party/skia/tools/gpu/TestOps.cpp
@@ -32,26 +32,29 @@ public:
const char* name() const override { return "TestRectOp::GP"; }
- GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override;
+ GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override {
+ return new GLSLGP();
+ }
- void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
+ void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const override {
+ GLSLGP::GenKey(*this, b);
+ }
bool wideColor() const { return fInColor.cpuType() != kUByte4_norm_GrVertexAttribType; }
private:
- Attribute fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
- Attribute fInLocalCoords = {"inLocalCoords", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
- Attribute fInColor;
- SkMatrix fLocalMatrix;
-};
-
-GrGLSLPrimitiveProcessor* GP::createGLSLInstance(const GrShaderCaps& caps) const {
class GLSLGP : public GrGLSLGeometryProcessor {
+ public:
void setData(const GrGLSLProgramDataManager& pdman,
const GrPrimitiveProcessor& pp,
const CoordTransformRange& transformRange) override {
const auto& gp = pp.cast<GP>();
- this->setTransformDataHelper(gp.fLocalMatrix, pdman, transformRange);
+ this->setTransformDataHelper(pdman, transformRange);
+ this->setTransform(pdman, fLocalMatrixUni, gp.fLocalMatrix);
+ }
+
+ static void GenKey(const GP& gp, GrProcessorKeyBuilder* b) {
+ b->add32(ComputeMatrixKey(gp.fLocalMatrix));
}
private:
@@ -65,13 +68,19 @@ GrGLSLPrimitiveProcessor* GP::createGLSLInstance(const GrShaderCaps& caps) const
args.fFragBuilder->codeAppendf("%s = %s;", args.fOutputColor, colorVarying.fsIn());
args.fFragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
this->writeOutputPosition(args.fVertBuilder, gpArgs, gp.fInPosition.name());
- this->emitTransforms(args.fVertBuilder, args.fVaryingHandler, args.fUniformHandler,
- gp.fInLocalCoords.asShaderVar(), gp.fLocalMatrix,
- args.fFPCoordTransformHandler);
+ this->writeLocalCoord(args.fVertBuilder, args.fUniformHandler, gpArgs,
+ gp.fInLocalCoords.asShaderVar(), gp.fLocalMatrix,
+ &fLocalMatrixUni);
}
+
+ UniformHandle fLocalMatrixUni;
};
- return new GLSLGP();
-}
+
+ Attribute fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
+ Attribute fInLocalCoords = {"inLocalCoords", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
+ Attribute fInColor;
+ SkMatrix fLocalMatrix;
+};
class TestRectOp final : public GrMeshDrawOp {
public:
diff --git a/chromium/third_party/skia/tools/gpu/YUVUtils.cpp b/chromium/third_party/skia/tools/gpu/YUVUtils.cpp
index eb4ca2c3d12..5b941358e3f 100644
--- a/chromium/third_party/skia/tools/gpu/YUVUtils.cpp
+++ b/chromium/third_party/skia/tools/gpu/YUVUtils.cpp
@@ -85,4 +85,29 @@ bool LazyYUVImage::ensureYUVImage(GrContext* context) {
return fYUVImage != nullptr;
}
+///////////////////////////////////////////////////////////////////////////////////////////////////
+void YUVABackendReleaseContext::Unwind(GrContext* context, YUVABackendReleaseContext* beContext) {
+ // Some backends (e.g., Vulkan) require that all work associated w/ texture
+ // creation be completed before deleting the textures.
+ GrFlushInfo flushInfoSyncCpu;
+ flushInfoSyncCpu.fFlags = kSyncCpu_GrFlushFlag;
+ context->flush(flushInfoSyncCpu);
+ context->submit(true);
+
+ delete beContext;
+}
+
+YUVABackendReleaseContext::YUVABackendReleaseContext(GrContext* context) : fContext(context) {
+ SkASSERT(context->priv().getGpu());
+ SkASSERT(context->priv().asDirectContext());
+}
+
+YUVABackendReleaseContext::~YUVABackendReleaseContext() {
+ for (int i = 0; i < 4; ++i) {
+ if (fBETextures[i].isValid()) {
+ fContext->deleteBackendTexture(fBETextures[i]);
+ }
+ }
+}
+
} // namespace sk_gpu_test
diff --git a/chromium/third_party/skia/tools/gpu/YUVUtils.h b/chromium/third_party/skia/tools/gpu/YUVUtils.h
index f6097b9476d..bfca6f41fe3 100644
--- a/chromium/third_party/skia/tools/gpu/YUVUtils.h
+++ b/chromium/third_party/skia/tools/gpu/YUVUtils.h
@@ -11,6 +11,7 @@
#include "include/core/SkImage.h"
#include "include/core/SkYUVAIndex.h"
#include "include/core/SkYUVASizeInfo.h"
+#include "include/gpu/GrBackendSurface.h"
#include "src/core/SkAutoMalloc.h"
class SkData;
@@ -49,6 +50,45 @@ private:
bool ensureYUVImage(GrContext* context);
};
+// A helper for managing the lifetime of backend textures for YUVA images.
+class YUVABackendReleaseContext {
+public:
+ // A stock 'TextureReleaseProc' to use with this class
+ static void Release(void* releaseContext) {
+ auto beContext = reinterpret_cast<YUVABackendReleaseContext*>(releaseContext);
+
+ delete beContext;
+ }
+
+ // Given how and when backend textures are created, just deleting this object often
+ // isn't enough. This helper encapsulates the extra work needed.
+ static void Unwind(GrContext* context, YUVABackendReleaseContext* beContext);
+
+ YUVABackendReleaseContext(GrContext* context);
+ ~YUVABackendReleaseContext();
+
+ void set(int index, const GrBackendTexture& beTex) {
+ SkASSERT(index >= 0 && index < 4);
+ SkASSERT(!fBETextures[index].isValid());
+ SkASSERT(beTex.isValid());
+
+ fBETextures[index] = beTex;
+ }
+
+ const GrBackendTexture* beTextures() const { return fBETextures; }
+
+ const GrBackendTexture& beTexture(int index) {
+ SkASSERT(index >= 0 && index < 4);
+ SkASSERT(fBETextures[index].isValid());
+ return fBETextures[index];
+ }
+
+private:
+ GrContext* fContext;
+ GrBackendTexture fBETextures[4];
+};
+
+
} // namespace sk_gpu_test
#endif // YUVUtils_DEFINED
diff --git a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp b/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp
deleted file mode 100644
index c8dc0540fce..00000000000
--- a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.cpp
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "include/core/SkBitmap.h"
-#include "src/gpu/gl/GrGLDefines.h"
-#include "src/gpu/gl/GrGLUtil.h"
-#include "tools/gpu/atlastext/GLTestAtlasTextRenderer.h"
-#include "tools/gpu/atlastext/TestAtlasTextRenderer.h"
-#include "tools/gpu/gl/GLTestContext.h"
-
-using sk_gpu_test::GLTestContext;
-
-namespace {
-
-class GLTestAtlasTextRenderer : public sk_gpu_test::TestAtlasTextRenderer {
-public:
- GLTestAtlasTextRenderer(std::unique_ptr<GLTestContext>);
-
- void* createTexture(AtlasFormat, int width, int height) override;
-
- void deleteTexture(void* textureHandle) override;
-
- void setTextureData(void* textureHandle, const void* data, int x, int y, int width, int height,
- size_t rowBytes) override;
-
- void drawSDFGlyphs(void* targetHandle, void* textureHandle, const SDFVertex vertices[],
- int quadCnt) override;
-
- void* makeTargetHandle(int width, int height) override;
-
- void targetDeleted(void* targetHandle) override;
-
- SkBitmap readTargetHandle(void* targetHandle) override;
-
- void clearTarget(void* targetHandle, uint32_t color) override;
-
- bool initialized() const { return 0 != fProgram; }
-
-private:
- struct AtlasTexture {
- GrGLuint fID;
- AtlasFormat fFormat;
- int fWidth;
- int fHeight;
- };
-
- struct Target {
- GrGLuint fFBOID;
- GrGLuint fRBID;
- int fWidth;
- int fHeight;
- };
-
- std::unique_ptr<GLTestContext> fContext;
- GrGLuint fProgram = 0;
- GrGLint fDstScaleAndTranslateLocation = 0;
- GrGLint fAtlasInvSizeLocation = 0;
- GrGLint fSamplerLocation = 0;
-};
-
-#define callgl(NAME, ...) fContext->gl()->fFunctions.f##NAME(__VA_ARGS__)
-#define checkgl() \
- do { \
- static constexpr auto line = __LINE__; \
- auto error = fContext->gl()->fFunctions.fGetError(); \
- if (error != GR_GL_NO_ERROR) { \
- SkDebugf("GL ERROR: 0x%x, line %d\n", error, line); \
- } \
- } while (false)
-
-GLTestAtlasTextRenderer::GLTestAtlasTextRenderer(std::unique_ptr<GLTestContext> context)
- : fContext(std::move(context)) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- // First check whether the GL is supported so we can avoid spammy failures on systems
- // where the GL simply doesn't work with this class.
- const char* versionStr = reinterpret_cast<const char*>(callgl(GetString, GR_GL_VERSION));
- auto version = GrGLGetVersionFromString(versionStr);
- auto standard = GrGLGetStandardInUseFromString(versionStr);
- switch (standard) {
- case kWebGL_GrGLStandard:
- case kNone_GrGLStandard:
- return;
- case kGLES_GrGLStandard:
- if (version < GR_GL_VER(3, 0)) {
- return;
- }
- break;
- case kGL_GrGLStandard: {
- if (version < GR_GL_VER(4, 3)) {
- return;
- }
- GrGLint profileMask;
- callgl(GetIntegerv, GR_GL_CONTEXT_PROFILE_MASK, &profileMask);
- if (profileMask & GR_GL_CONTEXT_CORE_PROFILE_BIT) {
- return;
- }
- }
- }
-
- auto vs = callgl(CreateShader, GR_GL_VERTEX_SHADER);
- static constexpr char kGLVersionString[] = "#version 430 compatibility";
- static constexpr char kGLESVersionString[] = "#version 300 es";
- GrGLint lengths[2];
- const GrGLchar* strings[2];
- switch (fContext->gl()->fStandard) {
- case kGL_GrGLStandard:
- strings[0] = kGLVersionString;
- lengths[0] = static_cast<GrGLint>(SK_ARRAY_COUNT(kGLVersionString)) - 1;
- break;
- case kGLES_GrGLStandard:
- strings[0] = kGLESVersionString;
- lengths[0] = static_cast<GrGLint>(SK_ARRAY_COUNT(kGLESVersionString)) - 1;
- break;
- default:
- strings[0] = nullptr;
- lengths[0] = 0;
- break;
- }
-
- static constexpr const char kVS[] = R"(
- uniform vec4 uDstScaleAndTranslate;
- uniform vec2 uAtlasInvSize;
-
- layout (location = 0) in vec3 inPosition;
- layout (location = 1) in vec4 inColor;
- layout (location = 2) in uvec2 inTextureCoords;
-
- out vec2 vTexCoord;
- out vec4 vColor;
- out vec2 vIntTexCoord;
-
- void main() {
- vec2 intCoords;
- // floor(vec2) doesn't seem to work on some ES devices.
- intCoords.x = floor(float(inTextureCoords.x));
- intCoords.y = floor(float(inTextureCoords.y));
- vTexCoord = intCoords * uAtlasInvSize;
- vIntTexCoord = intCoords;
- vColor = inColor;
- gl_Position = vec4(inPosition.x * uDstScaleAndTranslate.x + uDstScaleAndTranslate.y,
- inPosition.y * uDstScaleAndTranslate.z + uDstScaleAndTranslate.w,
- 0.0, inPosition.z);
- }
- )";
- strings[1] = kVS;
- lengths[1] = SK_ARRAY_COUNT(kVS) - 1;
- callgl(ShaderSource, vs, 2, strings, lengths);
- callgl(CompileShader, vs);
- GrGLint compileStatus;
- callgl(GetShaderiv, vs, GR_GL_COMPILE_STATUS, &compileStatus);
- if (compileStatus == GR_GL_FALSE) {
- GrGLint logLength;
- callgl(GetShaderiv, vs, GR_GL_INFO_LOG_LENGTH, &logLength);
- std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]);
- log[logLength] = '\0';
- callgl(GetShaderInfoLog, vs, logLength, &logLength, log.get());
- SkDebugf("Vertex Shader failed to compile\n%s", log.get());
- callgl(DeleteShader, vs);
- return;
- }
-
- auto fs = callgl(CreateShader, GR_GL_FRAGMENT_SHADER);
- static constexpr const char kFS[] = R"(
- uniform sampler2D uSampler;
-
- in vec2 vTexCoord;
- in vec4 vColor;
- in vec2 vIntTexCoord;
-
- layout (location = 0) out vec4 outColor;
-
- void main() {
- float sdfValue = texture(uSampler, vTexCoord).r;
- float distance = 7.96875 * (sdfValue - 0.50196078431000002);
- vec2 dist_grad = vec2(dFdx(distance), dFdy(distance));
- vec2 Jdx = dFdx(vIntTexCoord);
- vec2 Jdy = dFdy(vIntTexCoord);
- float dg_len2 = dot(dist_grad, dist_grad);
- if (dg_len2 < 0.0001) {
- dist_grad = vec2(0.7071, 0.7071);
- } else {
- dist_grad = dist_grad * inversesqrt(dg_len2);
- }
- vec2 grad = vec2(dist_grad.x * Jdx.x + dist_grad.y * Jdy.x,
- dist_grad.x * Jdx.y + dist_grad.y * Jdy.y);
- float afwidth = abs(0.65000000000000002 * length(grad));
- float value = smoothstep(-afwidth, afwidth, distance);
- outColor = value * vec4(vColor.rgb * vColor.a, vColor.a);
- }
- )";
- strings[1] = kFS;
- lengths[1] = SK_ARRAY_COUNT(kFS) - 1;
- callgl(ShaderSource, fs, 2, strings, lengths);
- callgl(CompileShader, fs);
- callgl(GetShaderiv, fs, GR_GL_COMPILE_STATUS, &compileStatus);
- if (compileStatus == GR_GL_FALSE) {
- GrGLint logLength;
- callgl(GetShaderiv, fs, GR_GL_INFO_LOG_LENGTH, &logLength);
- std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]);
- log[logLength] = '\0';
- callgl(GetShaderInfoLog, fs, logLength, &logLength, log.get());
- SkDebugf("Fragment Shader failed to compile\n%s", log.get());
- callgl(DeleteShader, vs);
- callgl(DeleteShader, fs);
- return;
- }
-
- fProgram = callgl(CreateProgram);
- if (!fProgram) {
- callgl(DeleteShader, vs);
- callgl(DeleteShader, fs);
- return;
- }
-
- callgl(AttachShader, fProgram, vs);
- callgl(AttachShader, fProgram, fs);
- callgl(LinkProgram, fProgram);
- GrGLint linkStatus;
- callgl(GetProgramiv, fProgram, GR_GL_LINK_STATUS, &linkStatus);
- if (linkStatus == GR_GL_FALSE) {
- GrGLint logLength = 0;
- callgl(GetProgramiv, vs, GR_GL_INFO_LOG_LENGTH, &logLength);
- std::unique_ptr<GrGLchar[]> log(new GrGLchar[logLength + 1]);
- log[logLength] = '\0';
- callgl(GetProgramInfoLog, vs, logLength, &logLength, log.get());
- SkDebugf("Program failed to link\n%s", log.get());
- callgl(DeleteShader, vs);
- callgl(DeleteShader, fs);
- callgl(DeleteProgram, fProgram);
- fProgram = 0;
- return;
- }
- fDstScaleAndTranslateLocation = callgl(GetUniformLocation, fProgram, "uDstScaleAndTranslate");
- fAtlasInvSizeLocation = callgl(GetUniformLocation, fProgram, "uAtlasInvSize");
- fSamplerLocation = callgl(GetUniformLocation, fProgram, "uSampler");
- if (fDstScaleAndTranslateLocation < 0 || fAtlasInvSizeLocation < 0 || fSamplerLocation < 0) {
- callgl(DeleteShader, vs);
- callgl(DeleteShader, fs);
- callgl(DeleteProgram, fProgram);
- fProgram = 0;
- }
-
- checkgl();
-}
-
-inline bool atlas_format_to_gl_types(SkAtlasTextRenderer::AtlasFormat format,
- GrGLenum* internalFormat, GrGLenum* externalFormat,
- GrGLenum* type) {
- switch (format) {
- case SkAtlasTextRenderer::AtlasFormat::kA8:
- *internalFormat = GR_GL_R8;
- *externalFormat = GR_GL_RED;
- *type = GR_GL_UNSIGNED_BYTE;
- return true;
- }
- return false;
-}
-
-inline int atlas_format_bytes_per_pixel(SkAtlasTextRenderer::AtlasFormat format) {
- switch (format) {
- case SkAtlasTextRenderer::AtlasFormat::kA8:
- return 1;
- }
- return 0;
-}
-
-void* GLTestAtlasTextRenderer::createTexture(AtlasFormat format, int width, int height) {
- GrGLenum internalFormat;
- GrGLenum externalFormat;
- GrGLenum type;
- if (!atlas_format_to_gl_types(format, &internalFormat, &externalFormat, &type)) {
- return nullptr;
- }
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- GrGLuint id;
- callgl(GenTextures, 1, &id);
- if (!id) {
- return nullptr;
- }
-
- callgl(BindTexture, GR_GL_TEXTURE_2D, id);
- callgl(TexImage2D, GR_GL_TEXTURE_2D, 0, internalFormat, width, height, 0, externalFormat, type,
- nullptr);
- checkgl();
-
- AtlasTexture* atlas = new AtlasTexture;
- atlas->fID = id;
- atlas->fFormat = format;
- atlas->fWidth = width;
- atlas->fHeight = height;
- return atlas;
-}
-
-void GLTestAtlasTextRenderer::deleteTexture(void* textureHandle) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- auto* atlasTexture = reinterpret_cast<const AtlasTexture*>(textureHandle);
-
- callgl(DeleteTextures, 1, &atlasTexture->fID);
- checkgl();
-
- delete atlasTexture;
-}
-
-void GLTestAtlasTextRenderer::setTextureData(void* textureHandle, const void* data, int x, int y,
- int width, int height, size_t rowBytes) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- auto atlasTexture = reinterpret_cast<const AtlasTexture*>(textureHandle);
-
- GrGLenum internalFormat;
- GrGLenum externalFormat;
- GrGLenum type;
- if (!atlas_format_to_gl_types(atlasTexture->fFormat, &internalFormat, &externalFormat, &type)) {
- return;
- }
- int bpp = atlas_format_bytes_per_pixel(atlasTexture->fFormat);
- GrGLint rowLength = static_cast<GrGLint>(rowBytes / bpp);
- if (static_cast<size_t>(rowLength * bpp) != rowBytes) {
- return;
- }
- callgl(PixelStorei, GR_GL_UNPACK_ALIGNMENT, 1);
- callgl(PixelStorei, GR_GL_UNPACK_ROW_LENGTH, rowLength);
- callgl(BindTexture, GR_GL_TEXTURE_2D, atlasTexture->fID);
- callgl(TexSubImage2D, GR_GL_TEXTURE_2D, 0, x, y, width, height, externalFormat, type, data);
- checkgl();
-}
-
-void GLTestAtlasTextRenderer::drawSDFGlyphs(void* targetHandle, void* textureHandle,
- const SDFVertex vertices[], int quadCnt) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- auto target = reinterpret_cast<const Target*>(targetHandle);
- auto atlas = reinterpret_cast<const AtlasTexture*>(textureHandle);
-
- callgl(UseProgram, fProgram);
-
- callgl(ActiveTexture, GR_GL_TEXTURE0);
- callgl(BindTexture, GR_GL_TEXTURE_2D, atlas->fID);
- callgl(TexParameteri, GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, GR_GL_LINEAR);
- callgl(TexParameteri, GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_GL_LINEAR);
-
- float uniformScaleAndTranslate[4] = {2.f / target->fWidth, -1.f, 2.f / target->fHeight, -1.f};
- callgl(Uniform4fv, fDstScaleAndTranslateLocation, 1, uniformScaleAndTranslate);
- callgl(Uniform2f, fAtlasInvSizeLocation, 1.f / atlas->fWidth, 1.f / atlas->fHeight);
- callgl(Uniform1i, fSamplerLocation, 0);
-
- callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID);
- callgl(Viewport, 0, 0, target->fWidth, target->fHeight);
-
- callgl(Enable, GR_GL_BLEND);
- callgl(BlendFunc, GR_GL_ONE, GR_GL_ONE_MINUS_SRC_ALPHA);
- callgl(Disable, GR_GL_DEPTH_TEST);
-
- callgl(BindVertexArray, 0);
- callgl(BindBuffer, GR_GL_ARRAY_BUFFER, 0);
- callgl(BindBuffer, GR_GL_ELEMENT_ARRAY_BUFFER, 0);
- callgl(VertexAttribPointer, 0, 3, GR_GL_FLOAT, GR_GL_FALSE, sizeof(SDFVertex), vertices);
- size_t colorOffset = 3 * sizeof(float);
- callgl(VertexAttribPointer, 1, 4, GR_GL_UNSIGNED_BYTE, GR_GL_TRUE, sizeof(SDFVertex),
- reinterpret_cast<const char*>(vertices) + colorOffset);
- size_t texOffset = colorOffset + sizeof(uint32_t);
- callgl(VertexAttribIPointer, 2, 2, GR_GL_UNSIGNED_SHORT, sizeof(SDFVertex),
- reinterpret_cast<const char*>(vertices) + texOffset);
- callgl(EnableVertexAttribArray, 0);
- callgl(EnableVertexAttribArray, 1);
- callgl(EnableVertexAttribArray, 2);
-
- std::unique_ptr<uint16_t[]> indices(new uint16_t[quadCnt * 6]);
- for (int q = 0; q < quadCnt; ++q) {
- indices[q * 6 + 0] = 0 + 4 * q;
- indices[q * 6 + 1] = 1 + 4 * q;
- indices[q * 6 + 2] = 2 + 4 * q;
- indices[q * 6 + 3] = 2 + 4 * q;
- indices[q * 6 + 4] = 1 + 4 * q;
- indices[q * 6 + 5] = 3 + 4 * q;
- }
- callgl(DrawElements, GR_GL_TRIANGLES, 6 * quadCnt, GR_GL_UNSIGNED_SHORT, indices.get());
- checkgl();
-}
-
-void* GLTestAtlasTextRenderer::makeTargetHandle(int width, int height) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- GrGLuint fbo;
- callgl(GenFramebuffers, 1, &fbo);
- if (!fbo) {
- return nullptr;
- }
- GrGLuint rb;
- callgl(GenRenderbuffers, 1, &rb);
- if (!rb) {
- callgl(DeleteFramebuffers, 1, &fbo);
- return nullptr;
- }
- callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, fbo);
- callgl(BindRenderbuffer, GR_GL_RENDERBUFFER, rb);
- callgl(RenderbufferStorage, GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, height);
- callgl(FramebufferRenderbuffer, GR_GL_FRAMEBUFFER, GR_GL_COLOR_ATTACHMENT0, GR_GL_RENDERBUFFER,
- rb);
- GrGLenum status = callgl(CheckFramebufferStatus, GR_GL_FRAMEBUFFER);
- if (GR_GL_FRAMEBUFFER_COMPLETE != status) {
- callgl(DeleteFramebuffers, 1, &fbo);
- callgl(DeleteRenderbuffers, 1, &rb);
- return nullptr;
- }
- callgl(Disable, GR_GL_SCISSOR_TEST);
- callgl(ClearColor, 0, 0, 0, 0.0);
- callgl(Clear, GR_GL_COLOR_BUFFER_BIT);
- checkgl();
- Target* target = new Target;
- target->fFBOID = fbo;
- target->fRBID = rb;
- target->fWidth = width;
- target->fHeight = height;
- return target;
-}
-
-void GLTestAtlasTextRenderer::targetDeleted(void* targetHandle) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- Target* target = reinterpret_cast<Target*>(targetHandle);
- callgl(DeleteFramebuffers, 1, &target->fFBOID);
- callgl(DeleteRenderbuffers, 1, &target->fRBID);
- delete target;
-}
-
-SkBitmap GLTestAtlasTextRenderer::readTargetHandle(void* targetHandle) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- Target* target = reinterpret_cast<Target*>(targetHandle);
-
- auto info =
- SkImageInfo::Make(target->fWidth, target->fHeight, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
- SkBitmap bmp;
- bmp.setInfo(info, sizeof(uint32_t) * target->fWidth);
- bmp.allocPixels();
-
- callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID);
- callgl(ReadPixels, 0, 0, target->fWidth, target->fHeight, GR_GL_RGBA, GR_GL_UNSIGNED_BYTE,
- bmp.getPixels());
- checkgl();
- return bmp;
-}
-
-void GLTestAtlasTextRenderer::clearTarget(void* targetHandle, uint32_t color) {
- auto restore = fContext->makeCurrentAndAutoRestore();
-
- Target* target = reinterpret_cast<Target*>(targetHandle);
- callgl(BindFramebuffer, GR_GL_FRAMEBUFFER, target->fFBOID);
- callgl(Disable, GR_GL_SCISSOR_TEST);
- float r = ((color >> 0) & 0xff) / 255.f;
- float g = ((color >> 8) & 0xff) / 255.f;
- float b = ((color >> 16) & 0xff) / 255.f;
- float a = ((color >> 24) & 0xff) / 255.f;
- callgl(ClearColor, r, g, b, a);
- callgl(Clear, GR_GL_COLOR_BUFFER_BIT);
-}
-
-} // anonymous namespace
-
-namespace sk_gpu_test {
-
-sk_sp<TestAtlasTextRenderer> MakeGLTestAtlasTextRenderer() {
- std::unique_ptr<GLTestContext> context(CreatePlatformGLTestContext(kGL_GrGLStandard));
- if (!context) {
- context.reset(CreatePlatformGLTestContext(kGLES_GrGLStandard));
- }
- if (!context) {
- return nullptr;
- }
- auto restorer = context->makeCurrentAndAutoRestore();
- auto renderer = sk_make_sp<GLTestAtlasTextRenderer>(std::move(context));
- return renderer->initialized() ? std::move(renderer) : nullptr;
-}
-
-} // namespace sk_gpu_test
diff --git a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h b/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h
deleted file mode 100644
index d1536d303c6..00000000000
--- a/chromium/third_party/skia/tools/gpu/atlastext/GLTestAtlasTextRenderer.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GLTestAtlasTextRenderer_DEFINED
-#define GLTestAtlasTextRenderer_DEFINED
-
-#include "include/core/SkRefCnt.h"
-
-namespace sk_gpu_test {
-
-class TestAtlasTextRenderer;
-
-/**
- * Creates a TestAtlasTextRenderer that uses its own OpenGL context to implement
- * SkAtlasTextRenderer.
- */
-sk_sp<TestAtlasTextRenderer> MakeGLTestAtlasTextRenderer();
-
-} // namespace sk_gpu_test
-
-#endif
diff --git a/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h b/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h
deleted file mode 100644
index e928e76402b..00000000000
--- a/chromium/third_party/skia/tools/gpu/atlastext/TestAtlasTextRenderer.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef TestAtlasTextRenderer_DEFINED
-#define TestAtlasTextRenderer_DEFINED
-
-#include "include/atlastext/SkAtlasTextRenderer.h"
-#include "include/core/SkBitmap.h"
-
-namespace sk_gpu_test {
-
-class TestContext;
-
-/**
- * Base class for implementations of SkAtlasTextRenderer in order to test the SkAtlasText APIs.
- * Adds a helper for creating SkAtlasTextTargets and to read back the contents of a target as a
- * bitmap.
- */
-class TestAtlasTextRenderer : public SkAtlasTextRenderer {
-public:
- /** Returns a handle that can be used to construct a SkAtlasTextTarget instance. */
- virtual void* makeTargetHandle(int width, int height) = 0;
-
- /** Makes a SkBitmap of the target handle's contents. */
- virtual SkBitmap readTargetHandle(void* targetHandle) = 0;
-
- /** Clears the target to the specified color, encoded as RGBA (low to high byte order) */
- virtual void clearTarget(void* targetHandle, uint32_t color) = 0;
-};
-
-} // namespace sk_gpu_test
-
-#endif
diff --git a/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp b/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp
index ba00a36cd5c..fff7ca127ff 100644
--- a/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp
+++ b/chromium/third_party/skia/tools/gpu/d3d/D3DTestContext.cpp
@@ -55,6 +55,7 @@ protected:
private:
D3DTestContextImpl(const GrD3DBackendContext& backendContext, bool ownsContext)
: D3DTestContext(backendContext, ownsContext) {
+ fFenceSupport = true;
}
void onPlatformMakeNotCurrent() const override {}
diff --git a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp
index c23669709f7..58d755ea5c1 100644
--- a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp
+++ b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.cpp
@@ -6,7 +6,6 @@
*/
#include "dawn/webgpu_cpp.h"
-#include "dawn_native/DawnNative.h"
#include "tools/gpu/dawn/DawnTestContext.h"
#ifdef SK_BUILD_FOR_UNIX
@@ -78,6 +77,10 @@ private:
ProcGetter* ProcGetter::fInstance;
#endif
+static void PrintDeviceError(WGPUErrorType, const char* message, void*) {
+ SkDebugf("Device error: %s\n", message);
+}
+
class DawnTestContextImpl : public sk_gpu_test::DawnTestContext {
public:
static wgpu::Device createDevice(const dawn_native::Instance& instance,
@@ -88,7 +91,7 @@ public:
std::vector<dawn_native::Adapter> adapters = instance.GetAdapters();
for (dawn_native::Adapter adapter : adapters) {
if (adapter.GetBackendType() == type) {
- return adapter.CreateDevice();
+ return wgpu::Device::Acquire(adapter.CreateDevice());
}
}
return nullptr;
@@ -125,6 +128,7 @@ public:
#endif
#endif
device = createDevice(*instance, type);
+ device.SetUncapturedErrorCallback(PrintDeviceError, 0);
}
if (!device) {
return nullptr;
@@ -150,15 +154,13 @@ protected:
private:
DawnTestContextImpl(std::unique_ptr<dawn_native::Instance> instance,
const wgpu::Device& device)
- : DawnTestContext(device)
- , fInstance(std::move(instance)) {
+ : DawnTestContext(std::move(instance), device) {
fFenceSupport = true;
}
void onPlatformMakeNotCurrent() const override {}
void onPlatformMakeCurrent() const override {}
std::function<void()> onPlatformGetAutoContextRestore() const override { return nullptr; }
- std::unique_ptr<dawn_native::Instance> fInstance;
typedef sk_gpu_test::DawnTestContext INHERITED;
};
diff --git a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h
index 63f35f6f261..73b4e5df260 100644
--- a/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h
+++ b/chromium/third_party/skia/tools/gpu/dawn/DawnTestContext.h
@@ -9,6 +9,7 @@
#define DawnTestContext_DEFINED
#include "tools/gpu/TestContext.h"
+#include <dawn_native/DawnNative.h>
#ifdef SK_DAWN
@@ -22,8 +23,10 @@ public:
}
protected:
- DawnTestContext(const wgpu::Device& device) : fDevice(device) {}
+ DawnTestContext(std::unique_ptr<dawn_native::Instance> instance, const wgpu::Device& device)
+ : fInstance(std::move(instance)), fDevice(device) {}
+ std::unique_ptr<dawn_native::Instance> fInstance;
wgpu::Device fDevice;
private:
diff --git a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp
index 75c1fee8fd5..f40657c9388 100644
--- a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp
+++ b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.cpp
@@ -222,41 +222,6 @@ void GLTestContext::finish() {
#endif
}
-GrGLuint GLTestContext::createTextureRectangle(int width, int height, GrGLenum internalFormat,
- GrGLenum externalFormat, GrGLenum externalType,
- GrGLvoid* data) {
-#ifdef SK_GL
- // Should match GrGLCaps check for fRectangleTextureSupport.
- if (kGL_GrGLStandard != fGL->fStandard ||
- (GrGLGetVersion(fGL.get()) < GR_GL_VER(3, 1) &&
- !fGL->fExtensions.has("GL_ARB_texture_rectangle") &&
- !fGL->fExtensions.has("GL_ANGLE_texture_rectangle"))) {
- return 0;
- }
-
- if (GrGLGetGLSLVersion(fGL.get()) < GR_GLSL_VER(1, 40)) {
- return 0;
- }
-
- GrGLuint id;
- GR_GL_CALL(fGL.get(), GenTextures(1, &id));
- GR_GL_CALL(fGL.get(), BindTexture(GR_GL_TEXTURE_RECTANGLE, id));
- GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_MAG_FILTER,
- GR_GL_NEAREST));
- GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_MIN_FILTER,
- GR_GL_NEAREST));
- GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_S,
- GR_GL_CLAMP_TO_EDGE));
- GR_GL_CALL(fGL.get(), TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_T,
- GR_GL_CLAMP_TO_EDGE));
- GR_GL_CALL(fGL.get(), TexImage2D(GR_GL_TEXTURE_RECTANGLE, 0, internalFormat, width, height, 0,
- externalFormat, externalType, data));
- return id;
-#else
- return 0;
-#endif
-}
-
sk_sp<GrContext> GLTestContext::makeGrContext(const GrContextOptions& options) {
#ifdef SK_GL
return GrContext::MakeGL(fGL, options);
diff --git a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h
index 601c3b9f18c..54b47492504 100644
--- a/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h
+++ b/chromium/third_party/skia/tools/gpu/gl/GLTestContext.h
@@ -33,10 +33,6 @@ public:
virtual void destroyEGLImage(GrEGLImage) const { }
- /** Used for testing GL_TEXTURE_RECTANGLE integration. */
- GrGLuint createTextureRectangle(int width, int height, GrGLenum internalFormat,
- GrGLenum externalFormat, GrGLenum externalType, GrGLvoid* data);
-
/**
* Used for testing EGLImage integration. Takes a EGLImage and wraps it in a
* GL_TEXTURE_EXTERNAL_OES.
diff --git a/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp b/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp
index 57d39e00fad..24eeb2f0441 100644
--- a/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp
+++ b/chromium/third_party/skia/tools/gpu/gl/angle/GLTestContext_angle.cpp
@@ -25,6 +25,8 @@
#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208
#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D
+#define EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE 0x3483
+
using sk_gpu_test::ANGLEBackend;
using sk_gpu_test::ANGLEContextVersion;
@@ -281,12 +283,20 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version,
}
int versionNum = ANGLEContextVersion::kES2 == version ? 2 : 3;
- const EGLint contextAttribs[] = {
+ std::vector<EGLint> contextAttribs = {
EGL_CONTEXT_CLIENT_VERSION, versionNum,
- EGL_NONE
};
+
+ const char* extensions = eglQueryString(fDisplay, EGL_EXTENSIONS);
+ if (strstr(extensions, "EGL_ANGLE_create_context_backwards_compatible")) {
+ contextAttribs.push_back(EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE);
+ contextAttribs.push_back(EGL_FALSE);
+ }
+
+ contextAttribs.push_back(EGL_NONE);
+
EGLContext eglShareContext = shareContext ? shareContext->fContext : nullptr;
- fContext = eglCreateContext(fDisplay, surfaceConfig, eglShareContext, contextAttribs);
+ fContext = eglCreateContext(fDisplay, surfaceConfig, eglShareContext, contextAttribs.data());
if (EGL_NO_CONTEXT == fContext) {
SkDebugf("Could not create context!");
this->destroyGLContext();
@@ -337,7 +347,6 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version,
break;
}
#endif
- const char* extensions = eglQueryString(fDisplay, EGL_EXTENSIONS);
if (strstr(extensions, "EGL_KHR_image")) {
fCreateImage = (PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR");
fDestroyImage = (PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR");
@@ -366,7 +375,7 @@ GrEGLImage ANGLEGLContext::texture2DToEGLImage(GrGLuint texID) const {
void ANGLEGLContext::destroyEGLImage(GrEGLImage image) const { fDestroyImage(fDisplay, image); }
GrGLuint ANGLEGLContext::eglImageToExternalTexture(GrEGLImage image) const {
- GrGLClearErr(this->gl());
+ while (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {}
if (!this->gl()->hasExtension("GL_OES_EGL_image_external")) {
return 0;
}
@@ -382,12 +391,12 @@ GrGLuint ANGLEGLContext::eglImageToExternalTexture(GrEGLImage image) const {
return 0;
}
GR_GL_CALL(this->gl(), BindTexture(GR_GL_TEXTURE_EXTERNAL, texID));
- if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) {
+ if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {
GR_GL_CALL(this->gl(), DeleteTextures(1, &texID));
return 0;
}
glEGLImageTargetTexture2D(GR_GL_TEXTURE_EXTERNAL, image);
- if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) {
+ if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {
GR_GL_CALL(this->gl(), DeleteTextures(1, &texID));
return 0;
}
diff --git a/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp b/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp
index e3228a4e787..325e034a07e 100644
--- a/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp
+++ b/chromium/third_party/skia/tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp
@@ -375,7 +375,7 @@ void EGLGLTestContext::destroyEGLImage(GrEGLImage image) const {
GrGLuint EGLGLTestContext::eglImageToExternalTexture(GrEGLImage image) const {
#ifdef SK_GL
- GrGLClearErr(this->gl());
+ while (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {}
if (!this->gl()->hasExtension("GL_OES_EGL_image_external")) {
return 0;
}
@@ -392,12 +392,12 @@ GrGLuint EGLGLTestContext::eglImageToExternalTexture(GrEGLImage image) const {
return 0;
}
GR_GL_CALL_NOERRCHECK(this->gl(), BindTexture(GR_GL_TEXTURE_EXTERNAL, texID));
- if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) {
+ if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {
GR_GL_CALL(this->gl(), DeleteTextures(1, &texID));
return 0;
}
glEGLImageTargetTexture2D(GR_GL_TEXTURE_EXTERNAL, image);
- if (GR_GL_GET_ERROR(this->gl()) != GR_GL_NO_ERROR) {
+ if (this->gl()->fFunctions.fGetError() != GR_GL_NO_ERROR) {
GR_GL_CALL(this->gl(), DeleteTextures(1, &texID));
return 0;
}
diff --git a/chromium/third_party/skia/tools/gpu/gl/interface/templates.go b/chromium/third_party/skia/tools/gpu/gl/interface/templates.go
index ebed908c67d..5f3e3918bce 100644
--- a/chromium/third_party/skia/tools/gpu/gl/interface/templates.go
+++ b/chromium/third_party/skia/tools/gpu/gl/interface/templates.go
@@ -234,6 +234,54 @@ GrGLInterface::GrGLInterface() {
fStandard = kNone_GrGLStandard;
}
+#if GR_GL_CHECK_ERROR
+static const char* get_error_string(GrGLenum err) {
+ switch (err) {
+ case GR_GL_NO_ERROR:
+ return "";
+ case GR_GL_INVALID_ENUM:
+ return "Invalid Enum";
+ case GR_GL_INVALID_VALUE:
+ return "Invalid Value";
+ case GR_GL_INVALID_OPERATION:
+ return "Invalid Operation";
+ case GR_GL_OUT_OF_MEMORY:
+ return "Out of Memory";
+ case GR_GL_CONTEXT_LOST:
+ return "Context Lost";
+ }
+ return "Unknown";
+}
+
+GrGLenum GrGLInterface::checkError(const char* location, const char* call) const {
+ GrGLenum error = fFunctions.fGetError();
+ if (error != GR_GL_NO_ERROR && !fSuppressErrorLogging) {
+ SkDebugf("---- glGetError 0x%x(%s)", error, get_error_string(error));
+ if (location) {
+ SkDebugf(" at\n\t%s", location);
+ }
+ if (call) {
+ SkDebugf("\n\t\t%s", call);
+ }
+ SkDebugf("\n");
+ if (error == GR_GL_OUT_OF_MEMORY) {
+ fOOMed = true;
+ }
+ }
+ return error;
+}
+
+bool GrGLInterface::checkAndResetOOMed() const {
+ if (fOOMed) {
+ fOOMed = false;
+ return true;
+ }
+ return false;
+}
+
+void GrGLInterface::suppressErrorLogging() { fSuppressErrorLogging = true; }
+#endif
+
#define RETURN_FALSE_INTERFACE \
SkDEBUGF("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); \
return false
diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp
new file mode 100644
index 00000000000..f1a02a495fb
--- /dev/null
+++ b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "tools/gpu/vk/VkTestHelper.h"
+
+#ifdef SK_VULKAN
+
+#include "include/core/SkSurface.h"
+#include "include/gpu/GrContext.h"
+#include "tools/gpu/vk/VkTestUtils.h"
+
+#define ACQUIRE_INST_VK_PROC(name) \
+ fVk##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, fBackendContext.fInstance,\
+ VK_NULL_HANDLE)); \
+ if (fVk##name == nullptr) { \
+ SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \
+ return false; \
+ }
+
+#define ACQUIRE_DEVICE_VK_PROC(name) \
+ fVk##name = reinterpret_cast<PFN_vk##name>(getProc("vk" #name, VK_NULL_HANDLE, fDevice)); \
+ if (fVk##name == nullptr) { \
+ SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \
+ return false; \
+ }
+
+bool VkTestHelper::init() {
+ PFN_vkGetInstanceProcAddr instProc;
+ PFN_vkGetDeviceProcAddr devProc;
+ if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc, &devProc)) {
+ return false;
+ }
+ auto getProc = [&instProc, &devProc](const char* proc_name,
+ VkInstance instance, VkDevice device) {
+ if (device != VK_NULL_HANDLE) {
+ return devProc(device, proc_name);
+ }
+ return instProc(instance, proc_name);
+ };
+
+ fFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ fFeatures.pNext = nullptr;
+
+ fBackendContext.fInstance = VK_NULL_HANDLE;
+ fBackendContext.fDevice = VK_NULL_HANDLE;
+
+ if (!sk_gpu_test::CreateVkBackendContext(getProc, &fBackendContext, &fExtensions,
+ &fFeatures, &fDebugCallback, nullptr,
+ sk_gpu_test::CanPresentFn(), fIsProtected)) {
+ return false;
+ }
+ fDevice = fBackendContext.fDevice;
+
+ if (fDebugCallback != VK_NULL_HANDLE) {
+ fDestroyDebugCallback = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(
+ instProc(fBackendContext.fInstance, "vkDestroyDebugReportCallbackEXT"));
+ }
+ ACQUIRE_INST_VK_PROC(DestroyInstance)
+ ACQUIRE_INST_VK_PROC(DeviceWaitIdle)
+ ACQUIRE_INST_VK_PROC(DestroyDevice)
+
+ ACQUIRE_INST_VK_PROC(GetPhysicalDeviceFormatProperties)
+ ACQUIRE_INST_VK_PROC(GetPhysicalDeviceMemoryProperties)
+
+ ACQUIRE_DEVICE_VK_PROC(CreateImage)
+ ACQUIRE_DEVICE_VK_PROC(DestroyImage)
+ ACQUIRE_DEVICE_VK_PROC(GetImageMemoryRequirements)
+ ACQUIRE_DEVICE_VK_PROC(AllocateMemory)
+ ACQUIRE_DEVICE_VK_PROC(FreeMemory)
+ ACQUIRE_DEVICE_VK_PROC(BindImageMemory)
+ ACQUIRE_DEVICE_VK_PROC(MapMemory)
+ ACQUIRE_DEVICE_VK_PROC(UnmapMemory)
+ ACQUIRE_DEVICE_VK_PROC(FlushMappedMemoryRanges)
+ ACQUIRE_DEVICE_VK_PROC(GetImageSubresourceLayout)
+
+ fGrContext = GrContext::MakeVulkan(fBackendContext);
+ if (!fGrContext) {
+ return false;
+ }
+
+ return true;
+}
+
+void VkTestHelper::cleanup() {
+ fGrContext.reset();
+
+ fBackendContext.fMemoryAllocator.reset();
+ if (fDevice != VK_NULL_HANDLE) {
+ fVkDeviceWaitIdle(fDevice);
+ fVkDestroyDevice(fDevice, nullptr);
+ fDevice = VK_NULL_HANDLE;
+ }
+ if (fDebugCallback != VK_NULL_HANDLE) {
+ fDestroyDebugCallback(fBackendContext.fInstance, fDebugCallback, nullptr);
+ }
+
+ if (fBackendContext.fInstance != VK_NULL_HANDLE) {
+ fVkDestroyInstance(fBackendContext.fInstance, nullptr);
+ fBackendContext.fInstance = VK_NULL_HANDLE;
+ }
+
+ sk_gpu_test::FreeVulkanFeaturesStructs(&fFeatures);
+}
+
+#endif // SK_VULKAN
diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h
new file mode 100644
index 00000000000..965885a1599
--- /dev/null
+++ b/chromium/third_party/skia/tools/gpu/vk/VkTestHelper.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef VkTestHelper_DEFINED
+#define VkTestHelper_DEFINED
+
+#include "include/core/SkTypes.h"
+
+#ifdef SK_VULKAN
+
+#include "include/core/SkRefCnt.h"
+#include "include/gpu/vk/GrVkBackendContext.h"
+#include "include/gpu/vk/GrVkExtensions.h"
+
+class GrContext;
+class SkSurface;
+
+#define DECLARE_VK_PROC(name) PFN_vk##name fVk##name
+
+class VkTestHelper {
+public:
+ VkTestHelper(bool isProtected) : fIsProtected(isProtected) {}
+
+ ~VkTestHelper() {
+ this->cleanup();
+ }
+
+ bool init();
+
+ GrContext* grContext() { return fGrContext.get(); }
+
+private:
+ void cleanup();
+
+ DECLARE_VK_PROC(DestroyInstance);
+ DECLARE_VK_PROC(DeviceWaitIdle);
+ DECLARE_VK_PROC(DestroyDevice);
+
+ DECLARE_VK_PROC(GetPhysicalDeviceFormatProperties);
+ DECLARE_VK_PROC(GetPhysicalDeviceMemoryProperties);
+
+ DECLARE_VK_PROC(CreateImage);
+ DECLARE_VK_PROC(DestroyImage);
+ DECLARE_VK_PROC(GetImageMemoryRequirements);
+ DECLARE_VK_PROC(AllocateMemory);
+ DECLARE_VK_PROC(FreeMemory);
+ DECLARE_VK_PROC(BindImageMemory);
+ DECLARE_VK_PROC(MapMemory);
+ DECLARE_VK_PROC(UnmapMemory);
+ DECLARE_VK_PROC(FlushMappedMemoryRanges);
+ DECLARE_VK_PROC(GetImageSubresourceLayout);
+
+ bool fIsProtected = false;
+ VkDevice fDevice = VK_NULL_HANDLE;
+
+ GrVkExtensions fExtensions;
+ VkPhysicalDeviceFeatures2 fFeatures = {};
+ VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE;
+ PFN_vkDestroyDebugReportCallbackEXT fDestroyDebugCallback = nullptr;
+ GrVkBackendContext fBackendContext;
+ sk_sp<GrContext> fGrContext;
+};
+
+#undef DECLARE_VK_PROC
+
+#endif // SK_VULKAN
+#endif // VkTestHelper_DEFINED
diff --git a/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp b/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp
index a6026af739b..86084cf7935 100644
--- a/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp
+++ b/chromium/third_party/skia/tools/gpu/vk/VkTestUtils.cpp
@@ -110,6 +110,11 @@ VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback(
const char* pMessage,
void* pUserData) {
if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
+ // See https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/1887
+ if (strstr(pMessage, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521") ||
+ strstr(pMessage, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522")) {
+ return VK_FALSE;
+ }
SkDebugf("Vulkan error [%s]: code: %d: %s\n", pLayerPrefix, messageCode, pMessage);
print_backtrace();
SkDEBUGFAIL("Vulkan debug layer error");
diff --git a/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp
new file mode 100644
index 00000000000..6e464a1c8a9
--- /dev/null
+++ b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.cpp
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "tools/gpu/vk/VkYcbcrSamplerHelper.h"
+
+#ifdef SK_VULKAN
+
+#include "include/gpu/GrContext.h"
+#include "src/gpu/GrContextPriv.h"
+#include "src/gpu/vk/GrVkGpu.h"
+#include "src/gpu/vk/GrVkUtil.h"
+
+int VkYcbcrSamplerHelper::GetExpectedY(int x, int y, int width, int height) {
+ return 16 + (x + y) * 219 / (width + height - 2);
+}
+
+std::pair<int, int> VkYcbcrSamplerHelper::GetExpectedUV(int x, int y, int width, int height) {
+ return { 16 + x * 224 / (width - 1), 16 + y * 224 / (height - 1) };
+}
+
+GrVkGpu* VkYcbcrSamplerHelper::vkGpu() {
+ return (GrVkGpu*) fContext->priv().getGpu();
+}
+
+VkYcbcrSamplerHelper::VkYcbcrSamplerHelper(GrContext* context) : fContext(context) {
+ SkASSERT_RELEASE(context->backend() == GrBackendApi::kVulkan);
+}
+
+VkYcbcrSamplerHelper::~VkYcbcrSamplerHelper() {
+ GrVkGpu* vkGpu = this->vkGpu();
+
+ if (fImage != VK_NULL_HANDLE) {
+ GR_VK_CALL(vkGpu->vkInterface(), DestroyImage(vkGpu->device(), fImage, nullptr));
+ fImage = VK_NULL_HANDLE;
+ }
+ if (fImageMemory != VK_NULL_HANDLE) {
+ GR_VK_CALL(vkGpu->vkInterface(), FreeMemory(vkGpu->device(), fImageMemory, nullptr));
+ fImageMemory = VK_NULL_HANDLE;
+ }
+}
+
+bool VkYcbcrSamplerHelper::isYCbCrSupported() {
+ GrVkGpu* vkGpu = this->vkGpu();
+
+ return vkGpu->vkCaps().supportsYcbcrConversion();
+}
+
+bool VkYcbcrSamplerHelper::createBackendTexture(uint32_t width, uint32_t height) {
+ GrVkGpu* vkGpu = this->vkGpu();
+ VkResult result;
+
+ // Verify that the image format is supported.
+ VkFormatProperties formatProperties;
+ GR_VK_CALL(vkGpu->vkInterface(),
+ GetPhysicalDeviceFormatProperties(vkGpu->physicalDevice(),
+ VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+ &formatProperties));
+ if (!(formatProperties.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+ // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM is not supported
+ return false;
+ }
+
+ // Create YCbCr image.
+ VkImageCreateInfo vkImageInfo = {};
+ vkImageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ vkImageInfo.imageType = VK_IMAGE_TYPE_2D;
+ vkImageInfo.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ vkImageInfo.extent = VkExtent3D{width, height, 1};
+ vkImageInfo.mipLevels = 1;
+ vkImageInfo.arrayLayers = 1;
+ vkImageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+ vkImageInfo.tiling = VK_IMAGE_TILING_LINEAR;
+ vkImageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ vkImageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ vkImageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+
+ SkASSERT(fImage == VK_NULL_HANDLE);
+ GR_VK_CALL_RESULT(vkGpu, result, CreateImage(vkGpu->device(), &vkImageInfo, nullptr, &fImage));
+ if (result != VK_SUCCESS) {
+ return false;
+ }
+
+ VkMemoryRequirements requirements;
+ GR_VK_CALL(vkGpu->vkInterface(), GetImageMemoryRequirements(vkGpu->device(),
+ fImage,
+ &requirements));
+
+ uint32_t memoryTypeIndex = 0;
+ bool foundHeap = false;
+ VkPhysicalDeviceMemoryProperties phyDevMemProps;
+ GR_VK_CALL(vkGpu->vkInterface(), GetPhysicalDeviceMemoryProperties(vkGpu->physicalDevice(),
+ &phyDevMemProps));
+ for (uint32_t i = 0; i < phyDevMemProps.memoryTypeCount && !foundHeap; ++i) {
+ if (requirements.memoryTypeBits & (1 << i)) {
+ // Map host-visible memory.
+ if (phyDevMemProps.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
+ memoryTypeIndex = i;
+ foundHeap = true;
+ }
+ }
+ }
+ if (!foundHeap) {
+ return false;
+ }
+
+ VkMemoryAllocateInfo allocInfo = {};
+ allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ allocInfo.allocationSize = requirements.size;
+ allocInfo.memoryTypeIndex = memoryTypeIndex;
+
+ SkASSERT(fImageMemory == VK_NULL_HANDLE);
+ GR_VK_CALL_RESULT(vkGpu, result, AllocateMemory(vkGpu->device(), &allocInfo,
+ nullptr, &fImageMemory));
+ if (result != VK_SUCCESS) {
+ return false;
+ }
+
+ void* mappedBuffer;
+ GR_VK_CALL_RESULT(vkGpu, result, MapMemory(vkGpu->device(), fImageMemory, 0u,
+ requirements.size, 0u, &mappedBuffer));
+ if (result != VK_SUCCESS) {
+ return false;
+ }
+
+ // Write Y channel.
+ VkImageSubresource subresource;
+ subresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ subresource.mipLevel = 0;
+ subresource.arrayLayer = 0;
+
+ VkSubresourceLayout yLayout;
+ GR_VK_CALL(vkGpu->vkInterface(), GetImageSubresourceLayout(vkGpu->device(), fImage,
+ &subresource, &yLayout));
+ uint8_t* bufferData = reinterpret_cast<uint8_t*>(mappedBuffer) + yLayout.offset;
+ for (size_t y = 0; y < height; ++y) {
+ for (size_t x = 0; x < width; ++x) {
+ bufferData[y * yLayout.rowPitch + x] = GetExpectedY(x, y, width, height);
+ }
+ }
+
+ // Write UV channels.
+ subresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ VkSubresourceLayout uvLayout;
+ GR_VK_CALL(vkGpu->vkInterface(), GetImageSubresourceLayout(vkGpu->device(), fImage,
+ &subresource, &uvLayout));
+ bufferData = reinterpret_cast<uint8_t*>(mappedBuffer) + uvLayout.offset;
+ for (size_t y = 0; y < height / 2; ++y) {
+ for (size_t x = 0; x < width / 2; ++x) {
+ auto [u, v] = GetExpectedUV(2*x, 2*y, width, height);
+ bufferData[y * uvLayout.rowPitch + x * 2] = u;
+ bufferData[y * uvLayout.rowPitch + x * 2 + 1] = v;
+ }
+ }
+
+ VkMappedMemoryRange flushRange;
+ flushRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
+ flushRange.pNext = nullptr;
+ flushRange.memory = fImageMemory;
+ flushRange.offset = 0;
+ flushRange.size = VK_WHOLE_SIZE;
+ GR_VK_CALL_RESULT(vkGpu, result, FlushMappedMemoryRanges(vkGpu->device(), 1, &flushRange));
+ if (result != VK_SUCCESS) {
+ return false;
+ }
+ GR_VK_CALL(vkGpu->vkInterface(), UnmapMemory(vkGpu->device(), fImageMemory));
+
+ // Bind image memory.
+ GR_VK_CALL_RESULT(vkGpu, result, BindImageMemory(vkGpu->device(), fImage, fImageMemory, 0u));
+ if (result != VK_SUCCESS) {
+ return false;
+ }
+
+ // Wrap the image into SkImage.
+ GrVkYcbcrConversionInfo ycbcrInfo(vkImageInfo.format,
+ /*externalFormat=*/0,
+ VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709,
+ VK_SAMPLER_YCBCR_RANGE_ITU_NARROW,
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_FILTER_LINEAR,
+ false,
+ formatProperties.linearTilingFeatures);
+ GrVkAlloc alloc(fImageMemory, 0 /* offset */, requirements.size, 0 /* flags */);
+ GrVkImageInfo imageInfo(fImage, alloc, VK_IMAGE_TILING_LINEAR, VK_IMAGE_LAYOUT_UNDEFINED,
+ vkImageInfo.format, 1 /* levelCount */, VK_QUEUE_FAMILY_IGNORED,
+ GrProtected::kNo, ycbcrInfo);
+
+ fTexture = GrBackendTexture(width, height, imageInfo);
+ return true;
+}
+
+#endif // SK_VULKAN
diff --git a/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h
new file mode 100644
index 00000000000..929f4c94e87
--- /dev/null
+++ b/chromium/third_party/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef VkYcbcrSamplerHelper_DEFINED
+#define VkYcbcrSamplerHelper_DEFINED
+
+#include "include/core/SkTypes.h"
+
+#ifdef SK_VULKAN
+
+#include "include/gpu/GrBackendSurface.h"
+
+class GrContext;
+class GrVkGpu;
+
+// This helper will create and hold data for a Vulkan YCbCr backend texture. This format is
+// particularly interesting because its sampler is immutable.
+class VkYcbcrSamplerHelper {
+public:
+ VkYcbcrSamplerHelper(GrContext*);
+ ~VkYcbcrSamplerHelper();
+
+ bool isYCbCrSupported();
+
+ bool createBackendTexture(uint32_t width, uint32_t height);
+
+ const GrBackendTexture& backendTexture() const { return fTexture; }
+
+ static int GetExpectedY(int x, int y, int width, int height);
+ static std::pair<int, int> GetExpectedUV(int x, int y, int width, int height);
+
+private:
+ GrVkGpu* vkGpu();
+
+ GrContext* fContext;
+
+ VkImage fImage = VK_NULL_HANDLE;
+ VkDeviceMemory fImageMemory = VK_NULL_HANDLE;
+ GrBackendTexture fTexture;
+};
+
+#endif // SK_VULKAN
+
+#endif // VkYcbcrSamplerHelper_DEFINED
diff --git a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html
index 746c0bcfed7..1cab30faad0 100644
--- a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html
+++ b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-canvas-perf.html
@@ -1,17 +1,17 @@
<!DOCTYPE html>
<html>
<head>
- <title>Lottie-Web Perf</title>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script>
- <style type="text/css" media="screen">
- body {
- margin: 0;
- padding: 0;
- }
- </style>
+ <title>Lottie-Web Perf</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
</head>
<body>
<main>
diff --git a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html
index 88cc992fa6f..9fc499b7c5c 100644
--- a/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html
+++ b/chromium/third_party/skia/tools/lottie-web-perf/lottie-web-perf.html
@@ -1,17 +1,17 @@
<!DOCTYPE html>
<html>
<head>
- <title>Lottie-Web Perf</title>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script>
- <style type="text/css" media="screen">
- body {
- margin: 0;
- padding: 0;
- }
- </style>
+ <title>Lottie-Web Perf</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
</head>
<body>
<main>
diff --git a/chromium/third_party/skia/tools/lottiecap/driver.html b/chromium/third_party/skia/tools/lottiecap/driver.html
index 2b6dc94049c..0811441c645 100644
--- a/chromium/third_party/skia/tools/lottiecap/driver.html
+++ b/chromium/third_party/skia/tools/lottiecap/driver.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
<head>
- <title>Lottie Filmstrip Capture</title>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="/lottie.js" type="text/javascript" charset="utf-8"></script>
- <style type="text/css" media="screen">
- body,
- main,
- .anim {
- margin: 0;
- padding: 0;
- }
+ <title>Lottie Filmstrip Capture</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="/lottie.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body,
+ main,
+ .anim {
+ margin: 0;
+ padding: 0;
+ }
- main {
- display: flex;
- width: 1000px;
- height: 1000px;
- flex-flow: row wrap;
- }
- </style>
+ main {
+ display: flex;
+ width: 1000px;
+ height: 1000px;
+ flex-flow: row wrap;
+ }
+ </style>
</head>
<body>
<main>
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile
index 1aad3a80185..3e6aece221d 100644
--- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/Makefile
@@ -4,3 +4,23 @@ frames_load_lego_with_local:
--canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \
--input_lottie ../../modules/canvaskit/perf/assets/lego_loader.json \
--bench_html skottie-frames.html
+
+test_path_transform_without_snap:
+ node perf-canvaskit-with-puppeteer.js --canvaskit_js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \
+ --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \
+ --assets path_translate_assets \
+ --bench_html path-transform.html \
+ --query_params translate opacity
+
+test_path_transform_with_snap:
+ node perf-canvaskit-with-puppeteer.js --canvaskit_js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \
+ --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \
+ --assets path_translate_assets \
+ --bench_html path-transform.html \
+ --query_params translate opacity snap
+
+skp_with_local:
+ node perf-canvaskit-with-puppeteer.js --canvaskit_js ../../out/canvaskit_wasm/canvaskit.js \
+ --canvaskit_wasm ../../out/canvaskit_wasm/canvaskit.wasm --use_gpu \
+ --input_skp ${HOME}/skps/desk_nytimes.skp \
+ --bench_html render-skp.html \ No newline at end of file
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json
index f6f194a4616..2d6e0388481 100644
--- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package-lock.json
@@ -4,15 +4,10 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
- "@types/mime-types": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz",
- "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM="
- },
"@types/node": {
- "version": "13.13.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz",
- "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==",
+ "version": "14.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz",
+ "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==",
"optional": true
},
"@types/yauzl": {
@@ -536,9 +531,9 @@
}
},
"mkdirp-classic": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz",
- "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g=="
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
},
"ms": {
"version": "2.0.0",
@@ -615,16 +610,14 @@
}
},
"puppeteer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.0.1.tgz",
- "integrity": "sha512-DxNnI9n4grVHC+9irUfNK2T6YFuRECJnvG7VzdVolxpVwWC5DQqI5ho9Z0af48K5MQW4sJY5cq3qQ5g6NkAjvw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.1.0.tgz",
+ "integrity": "sha512-jLa9sqdVx0tPnr2FcwAq+8DSjGhSM4YpkwOf3JE22Ycyqm71SW7B5uGfTyMGFoLCmbCozbLZclCjasPb0flTRw==",
"requires": {
- "@types/mime-types": "^2.1.0",
"debug": "^4.1.0",
"extract-zip": "^2.0.0",
"https-proxy-agent": "^4.0.0",
"mime": "^2.0.3",
- "mime-types": "^2.1.25",
"progress": "^2.0.1",
"proxy-from-env": "^1.0.0",
"rimraf": "^3.0.2",
@@ -642,9 +635,9 @@
}
},
"mime": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
- "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz",
+ "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w=="
},
"ms": {
"version": "2.1.2",
@@ -764,9 +757,9 @@
},
"dependencies": {
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
}
}
},
@@ -806,9 +799,9 @@
}
},
"tar-fs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
- "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz",
+ "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==",
"requires": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
@@ -903,9 +896,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
- "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA=="
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
+ "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w=="
},
"yauzl": {
"version": "2.10.0",
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json
index ca96fc13b03..f2efa67d912 100644
--- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/package.json
@@ -7,7 +7,7 @@
"command-line-args": "^5.0.2",
"command-line-usage": "^5.0.3",
"express": "^4.16.3",
- "puppeteer": "^3.0.0"
+ "puppeteer": "^3.0.4"
},
"devDependencies": {},
"scripts": {
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html
new file mode 100644
index 00000000000..66a293bd255
--- /dev/null
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path-transform.html
@@ -0,0 +1,189 @@
+<!-- This benchmark aims to measure performance degredation related to
+moving a complex path. May be related to caching an alpha mask of the path at
+subpixel coordinates i.e. (25.234, 43.119) instead of (25, 43).
+As a consequence the cache may get full very quickly. Effect of paint opacity
+and rotation transformations on performance can also be tested using the query param options.
+
+Available query param options:
+ - snap: Round all path translations to the nearest integer. This means subpixel coordinate.
+ translations will not be used. Only has an effect when the translating option is used.
+ - opacity: Use a transparent color to fill the path. If this option is
+ not included then opaque black is used.
+ - translate: The path will be randomly translated every frame.
+ - rotate: The path will be randomly rotated every frame.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Complex Path translation Perf</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="/static/canvaskit.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ #test-svg {
+ height: 0;
+ width: 0;
+ }
+ #complex-path {
+ height: 1000px;
+ width: 1000px;
+ }
+ </style>
+</head>
+<body>
+ <!-- Arbitrary svg for testing. Source: https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/gallardo.svg-->
+ <object type="image/svg+xml" data="/static/assets/car.svg" id="test-svg">
+ Car image
+ </object>
+
+ <main>
+ <button id="start_bench">Start Benchmark</button>
+ <br>
+ <canvas id=complex-path width=1000 height=1000></canvas>
+ </main>
+ <script type="text/javascript" charset="utf-8">
+ const urlSearchParams = new URLSearchParams(window.location.search);
+
+ // We sample MAX_FRAMES or until MAX_SAMPLE_SECONDS has elapsed.
+ const MAX_FRAMES = 60 * 30; // ~30s at 60fps
+ const MAX_SAMPLE_MS = 30 * 1000; // in case something takes a while, stop after 30 seconds.
+ const TRANSPARENT_PINK = new Float32Array([1,0,1,0.1]);
+
+ const svgObjectElement = document.getElementById('test-svg');
+ svgObjectElement.addEventListener('load', () => {
+ CanvasKitInit({
+ locateFile: (file) => '/static/' + file,
+ }).then(run);
+ });
+
+ function run(CanvasKit) {
+
+ const surface = getSurface(CanvasKit);
+ if (!surface) {
+ console.error('Could not make surface', window._error);
+ return;
+ }
+ const skcanvas = surface.getCanvas();
+ const grContext = surface.grContext;
+
+ document.getElementById('start_bench').addEventListener('click', () => {
+ // Initialize drawing related objects
+ const svgElement = svgObjectElement.contentDocument;
+ const svgPathAndFillColorPairs = svgToPathAndFillColorPairs(svgElement, CanvasKit);
+
+ const paint = new CanvasKit.SkPaint();
+ paint.setAntiAlias(true);
+ paint.setStyle(CanvasKit.PaintStyle.Fill);
+ let paintColor = CanvasKit.BLACK;
+
+ // Path is large, scale canvas so entire path is visible
+ skcanvas.scale(0.5, 0.5);
+
+ // Initialize perf data
+ let currentFrameNumber = 0;
+ const frameTimesMs = new Float32Array(MAX_FRAMES);
+ let startTimeMs = performance.now();
+ let previousFrameTimeMs = performance.now();
+
+ const resourceCacheUsageBytes = new Float32Array(MAX_FRAMES);
+ const usedJSHeapSizesBytes = new Float32Array(MAX_FRAMES);
+
+ function drawFrame() {
+ // Draw complex path with random translations and rotations.
+ let randomHorizontalTranslation = 0;
+ let randomVerticalTranslation = 0;
+ let randomRotation = 0;
+
+ if (urlSearchParams.has('translate')) {
+ randomHorizontalTranslation = Math.random() * 50 - 25;
+ randomVerticalTranslation = Math.random() * 50 - 25;
+ }
+ if (urlSearchParams.has('snap')) {
+ randomHorizontalTranslation = Math.round(randomHorizontalTranslation);
+ randomVerticalTranslation = Math.round(randomVerticalTranslation);
+ }
+ if (urlSearchParams.has('opacity')) {
+ paintColor = TRANSPARENT_PINK;
+ }
+ if (urlSearchParams.has('rotate')) {
+ randomRotation = (Math.random() - 0.5) / 20;
+ }
+
+ skcanvas.clear(CanvasKit.WHITE);
+ for (const [path, color] of svgPathAndFillColorPairs) {
+ path.transform([Math.cos(randomRotation), -Math.sin(randomRotation), randomHorizontalTranslation,
+ Math.sin(randomRotation), Math.cos(randomRotation), randomVerticalTranslation,
+ 0, 0, 1 ]);
+ paint.setColor(paintColor);
+ skcanvas.drawPath(path, paint);
+ }
+ surface.flush();
+
+ // Record perf data: measure frame times, memory usage
+ const currentFrameTimeMs = performance.now();
+ frameTimesMs[currentFrameNumber] = currentFrameTimeMs - previousFrameTimeMs;
+ previousFrameTimeMs = currentFrameTimeMs;
+
+ resourceCacheUsageBytes[currentFrameNumber] = grContext.getResourceCacheUsageBytes();
+ usedJSHeapSizesBytes[currentFrameNumber] = window.performance.memory.totalJSHeapSize;
+ currentFrameNumber++;
+
+ const timeSinceStart = performance.now() - startTimeMs;
+ if (currentFrameNumber >= MAX_FRAMES || timeSinceStart >= MAX_SAMPLE_MS) {
+ window._perfData = {
+ frames_ms: Array.from(frameTimesMs).slice(0, currentFrameNumber),
+ resourceCacheUsage_bytes: Array.from(resourceCacheUsageBytes).slice(0, currentFrameNumber),
+ usedJSHeapSizes_bytes: Array.from(usedJSHeapSizesBytes).slice(0, currentFrameNumber),
+ };
+ window._perfDone = true;
+ return;
+ }
+ window.requestAnimationFrame(drawFrame);
+ }
+ window.requestAnimationFrame(drawFrame);
+ });
+
+ console.log('Perf is ready');
+ window._perfReady = true;
+ }
+
+ function svgToPathAndFillColorPairs(svgElement, CanvasKit) {
+ const pathElements = Array.from(svgElement.getElementsByTagName('path'));
+ return pathElements.map((path) => [
+ CanvasKit.MakePathFromSVGString(path.getAttribute("d")),
+ CanvasKit.parseColorString(path.getAttribute("fill")??'#000000')
+ ]);
+ }
+
+ function getSurface(CanvasKit) {
+ let surface;
+ if (window.location.hash.indexOf('gpu') !== -1) {
+ surface = CanvasKit.MakeWebGLCanvasSurface('complex-path');
+ if (!surface) {
+ window._error = 'Could not make GPU surface';
+ return null;
+ }
+ let c = document.getElementById('complex-path');
+ // If CanvasKit was unable to instantiate a WebGL context, it will fallback
+ // to CPU and add a ck-replaced class to the canvas element.
+ if (c.classList.contains('ck-replaced')) {
+ window._error = 'fell back to CPU';
+ return null;
+ }
+ } else {
+ surface = CanvasKit.MakeSWCanvasSurface('complex-path');
+ if (!surface) {
+ window._error = 'Could not make CPU surface';
+ return null;
+ }
+ }
+ return surface;
+ }
+ </script>
+</body>
+</html> \ No newline at end of file
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg
new file mode 100644
index 00000000000..8fb17a713bf
--- /dev/null
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/path_translate_assets/car.svg
@@ -0,0 +1,5155 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1901"
+ height="1018"
+ viewBox="0 0 1901 1018"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44+devel"
+ version="1.0"
+ sodipodi:docbase="/home/d/ink/inkscape/share/examples"
+ sodipodi:docname="gallardo.svgz"
+ inkscape:export-filename="C:\Documents and Settings\MichaelG\My Documents\My Pictures\gallardo.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ inkscape:output_extension="org.inkscape.output.svgz.inkscape"
+ sodipodi:modified="true">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3931">
+ <stop
+ style="stop-color:#ebf3ff;stop-opacity:1;"
+ offset="0"
+ id="stop3933" />
+ <stop
+ id="stop3935"
+ offset="0.5"
+ style="stop-color:#cfeefe;stop-opacity:1;" />
+ <stop
+ style="stop-color:#8face1;stop-opacity:1;"
+ offset="0.75"
+ id="stop3937" />
+ <stop
+ style="stop-color:#9caedc;stop-opacity:1"
+ offset="1"
+ id="stop3940" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6405">
+ <stop
+ id="stop6407"
+ offset="0"
+ style="stop-color:#434343;stop-opacity:1" />
+ <stop
+ style="stop-color:#69606d;stop-opacity:0;"
+ offset="0.78571427"
+ id="stop6409" />
+ <stop
+ id="stop6411"
+ offset="1"
+ style="stop-color:#705f78;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4263">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop4265" />
+ <stop
+ style="stop-color:black;stop-opacity:0.26160339"
+ offset="1"
+ id="stop4267" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3838">
+ <stop
+ style="stop-color:#212152;stop-opacity:1"
+ offset="0"
+ id="stop3840" />
+ <stop
+ style="stop-color:#272768;stop-opacity:0;"
+ offset="1"
+ id="stop3842" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3877">
+ <stop
+ id="stop3879"
+ offset="0"
+ style="stop-color:#5b75ac;stop-opacity:1" />
+ <stop
+ id="stop3881"
+ offset="1"
+ style="stop-color:#829acf;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5016">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5018" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5020" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5002">
+ <stop
+ style="stop-color:#99bcfa;stop-opacity:1;"
+ offset="0"
+ id="stop5004" />
+ <stop
+ style="stop-color:#20376c;stop-opacity:1"
+ offset="1"
+ id="stop5006" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4970">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop4972" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop4974" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2980">
+ <stop
+ style="stop-color:#19274c;stop-opacity:1"
+ offset="0"
+ id="stop2982" />
+ <stop
+ style="stop-color:#7b92af;stop-opacity:1"
+ offset="1"
+ id="stop2984" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3747">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3749" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3751" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2954"
+ id="linearGradient4332"
+ gradientUnits="userSpaceOnUse"
+ x1="814.44556"
+ y1="742.2583"
+ x2="814.44556"
+ y2="699.93915" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3937"
+ id="linearGradient4330"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.367696,0.367696)"
+ x1="809.74945"
+ y1="715.75433"
+ x2="822.82684"
+ y2="711.34198" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="linearGradient4328"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,-0.357143,0.821429,258.463,86.94653)"
+ x1="815.54865"
+ y1="721.63739"
+ x2="812.54578"
+ y2="701.04614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient4326"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.945605,-0.217581,0.40526,0.47818,-220.401,581.0172)"
+ x1="815.54865"
+ y1="721.63739"
+ x2="810.40088"
+ y2="701.04645" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="linearGradient4324"
+ gradientUnits="userSpaceOnUse"
+ x1="815.54865"
+ y1="721.63739"
+ x2="810.40088"
+ y2="701.04645" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3937"
+ id="linearGradient4322"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-11.76626,14.70782)"
+ x1="812.69104"
+ y1="719.43127"
+ x2="822.82684"
+ y2="711.34198" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4316"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="793.18713"
+ y2="793.88776" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="radialGradient4314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.76434,-2.35869e-2,0.426816,1.801459,-928.0471,-507.7961)"
+ cx="819.57001"
+ cy="681.40497"
+ fx="819.57001"
+ fy="681.40497"
+ r="89.050735" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3146"
+ id="linearGradient4312"
+ gradientUnits="userSpaceOnUse"
+ x1="823.68597"
+ y1="611.11115"
+ x2="806.85175"
+ y2="711.99713" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3463"
+ id="radialGradient4310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.402597,0,-270.1008)"
+ cx="828.16028"
+ cy="706.72321"
+ fx="828.16028"
+ fy="706.72321"
+ r="84.93766" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3422"
+ id="linearGradient4308"
+ gradientUnits="userSpaceOnUse"
+ x1="837.68555"
+ y1="796.52527"
+ x2="780.84125"
+ y2="572.90417" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3422"
+ id="linearGradient4306"
+ gradientUnits="userSpaceOnUse"
+ x1="799.76501"
+ y1="597.83502"
+ x2="814.95313"
+ y2="814.15497" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4286"
+ gradientUnits="userSpaceOnUse"
+ x1="823.10938"
+ y1="833.45209"
+ x2="823.10938"
+ y2="858.61041" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4284"
+ gradientUnits="userSpaceOnUse"
+ x1="912.13434"
+ y1="738.04584"
+ x2="892.15674"
+ y2="785.84998" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4282"
+ gradientUnits="userSpaceOnUse"
+ x1="751.09253"
+ y1="735"
+ x2="732.11664"
+ y2="745.52069" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4280"
+ gradientUnits="userSpaceOnUse"
+ x1="867.10388"
+ y1="601.625"
+ x2="850.70032"
+ y2="613.44067" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4278"
+ gradientUnits="userSpaceOnUse"
+ x1="743.77771"
+ y1="577.80316"
+ x2="760.22034"
+ y2="597.8407" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4276"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4274"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4272"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4270"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4268"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient4266"
+ gradientUnits="userSpaceOnUse"
+ x1="782.83337"
+ y1="799.42517"
+ x2="864.77716"
+ y2="577.03143" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3937">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3939" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3941" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3771">
+ <stop
+ style="stop-color:#808aa5;stop-opacity:1;"
+ offset="0"
+ id="stop3773" />
+ <stop
+ style="stop-color:#363c4d;stop-opacity:1;"
+ offset="1"
+ id="stop3775" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3463">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop3465" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop3467" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3422">
+ <stop
+ style="stop-color:#959db8;stop-opacity:1;"
+ offset="0"
+ id="stop3424" />
+ <stop
+ id="stop3432"
+ offset="0.25"
+ style="stop-color:#d3d7e2;stop-opacity:1;" />
+ <stop
+ id="stop3430"
+ offset="0.5"
+ style="stop-color:#566081;stop-opacity:1;" />
+ <stop
+ style="stop-color:#bdc2d3;stop-opacity:1;"
+ offset="0.75"
+ id="stop3434" />
+ <stop
+ id="stop3436"
+ offset="0.875"
+ style="stop-color:#959db8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#586284;stop-opacity:1;"
+ offset="1"
+ id="stop3426" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4018">
+ <stop
+ style="stop-color:#272b3a;stop-opacity:1;"
+ offset="0"
+ id="stop4020" />
+ <stop
+ id="stop4044"
+ offset="0.5"
+ style="stop-color:#8b97a4;stop-opacity:1;" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop4022" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3611">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop3613" />
+ <stop
+ id="stop3619"
+ offset="0.5"
+ style="stop-color:#7f7f7f;stop-opacity:0;" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop3615" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3599">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop3601" />
+ <stop
+ style="stop-color:#474747;stop-opacity:1;"
+ offset="1"
+ id="stop3603" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#434343;stop-opacity:0;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ id="stop3357"
+ offset="0.78571427"
+ style="stop-color:#69606d;stop-opacity:0;" />
+ <stop
+ style="stop-color:#705f78;stop-opacity:1;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3337">
+ <stop
+ style="stop-color:#1d1d1d;stop-opacity:1;"
+ offset="0"
+ id="stop3339" />
+ <stop
+ style="stop-color:#483030;stop-opacity:1;"
+ offset="1"
+ id="stop3342" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3660">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3662" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3664" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3651">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3653" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3655" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3602">
+ <stop
+ style="stop-color:#485276;stop-opacity:1;"
+ offset="0"
+ id="stop3604" />
+ <stop
+ style="stop-color:#485276;stop-opacity:0;"
+ offset="1"
+ id="stop3606" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3592">
+ <stop
+ style="stop-color:#141921;stop-opacity:1;"
+ offset="0"
+ id="stop3594" />
+ <stop
+ style="stop-color:#141921;stop-opacity:0;"
+ offset="1"
+ id="stop3596" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3582">
+ <stop
+ style="stop-color:#aaa4b9;stop-opacity:1;"
+ offset="0"
+ id="stop3584" />
+ <stop
+ style="stop-color:#aaa4b9;stop-opacity:0;"
+ offset="1"
+ id="stop3586" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3556">
+ <stop
+ style="stop-color:#506485;stop-opacity:1;"
+ offset="0"
+ id="stop3558" />
+ <stop
+ style="stop-color:#506485;stop-opacity:0;"
+ offset="1"
+ id="stop3560" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3535">
+ <stop
+ style="stop-color:#393e68;stop-opacity:1;"
+ offset="0"
+ id="stop3537" />
+ <stop
+ style="stop-color:#393e68;stop-opacity:0;"
+ offset="1"
+ id="stop3539" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3512">
+ <stop
+ id="stop3514"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ style="stop-color:#d8e6fd;stop-opacity:1;"
+ offset="0.5"
+ id="stop3518" />
+ <stop
+ id="stop3516"
+ offset="1"
+ style="stop-color:#9dc1f9;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3495">
+ <stop
+ style="stop-color:#181e34;stop-opacity:1;"
+ offset="0"
+ id="stop3497" />
+ <stop
+ style="stop-color:#181e34;stop-opacity:0;"
+ offset="1"
+ id="stop3499" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3483">
+ <stop
+ style="stop-color:#7b7ecb;stop-opacity:1;"
+ offset="0"
+ id="stop3485" />
+ <stop
+ style="stop-color:#969eba;stop-opacity:1;"
+ offset="1"
+ id="stop3487" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3475">
+ <stop
+ style="stop-color:#eef0f7;stop-opacity:1;"
+ offset="0"
+ id="stop3477" />
+ <stop
+ style="stop-color:#bec0f8;stop-opacity:1;"
+ offset="1"
+ id="stop3479" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3452">
+ <stop
+ style="stop-color:#6072b2;stop-opacity:1;"
+ offset="0"
+ id="stop3454" />
+ <stop
+ style="stop-color:#6072b2;stop-opacity:0;"
+ offset="1"
+ id="stop3456" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3419">
+ <stop
+ style="stop-color:#b8bce6;stop-opacity:1;"
+ offset="0"
+ id="stop3421" />
+ <stop
+ style="stop-color:#b8bce6;stop-opacity:0;"
+ offset="1"
+ id="stop3423" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3371">
+ <stop
+ id="stop3373"
+ offset="0"
+ style="stop-color:#1d44a6;stop-opacity:1;" />
+ <stop
+ id="stop3375"
+ offset="1"
+ style="stop-color:#2d82df;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3361">
+ <stop
+ style="stop-color:#818181;stop-opacity:1;"
+ offset="0"
+ id="stop3363" />
+ <stop
+ style="stop-color:#b6b6b6;stop-opacity:1;"
+ offset="1"
+ id="stop3365" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3293">
+ <stop
+ style="stop-color:#7987b8;stop-opacity:1;"
+ offset="0"
+ id="stop3295" />
+ <stop
+ style="stop-color:#2a324f;stop-opacity:1;"
+ offset="1"
+ id="stop3297" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3276">
+ <stop
+ style="stop-color:#000b17;stop-opacity:1;"
+ offset="0"
+ id="stop3278" />
+ <stop
+ style="stop-color:#000b17;stop-opacity:0;"
+ offset="1"
+ id="stop3280" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3232">
+ <stop
+ style="stop-color:#a7d0fe;stop-opacity:1;"
+ offset="0"
+ id="stop3235" />
+ <stop
+ style="stop-color:#7987b8;stop-opacity:1;"
+ offset="1"
+ id="stop3237" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3221">
+ <stop
+ style="stop-color:#5b78a4;stop-opacity:1;"
+ offset="0"
+ id="stop3224" />
+ <stop
+ style="stop-color:#4b5587;stop-opacity:1;"
+ offset="1"
+ id="stop3226" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3208">
+ <stop
+ style="stop-color:#7b90c5;stop-opacity:1;"
+ offset="0"
+ id="stop3210" />
+ <stop
+ style="stop-color:#7b90c5;stop-opacity:0;"
+ offset="1"
+ id="stop3212" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3314">
+ <stop
+ style="stop-color:#464e64;stop-opacity:1;"
+ offset="0"
+ id="stop3316" />
+ <stop
+ style="stop-color:#273251;stop-opacity:1;"
+ offset="1"
+ id="stop3318" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3254">
+ <stop
+ style="stop-color:#0e0d13;stop-opacity:1;"
+ offset="0"
+ id="stop3257" />
+ <stop
+ style="stop-color:#45405e;stop-opacity:1;"
+ offset="1"
+ id="stop3259" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3197">
+ <stop
+ style="stop-color:#6b83ac;stop-opacity:1;"
+ offset="0"
+ id="stop3199" />
+ <stop
+ style="stop-color:#899cbd;stop-opacity:1;"
+ offset="1"
+ id="stop3201" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3172">
+ <stop
+ style="stop-color:#556c95;stop-opacity:1;"
+ offset="0"
+ id="stop3174" />
+ <stop
+ style="stop-color:#242e3f;stop-opacity:1;"
+ offset="1"
+ id="stop3176" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3725">
+ <stop
+ style="stop-color:#312e43;stop-opacity:1;"
+ offset="0"
+ id="stop3727" />
+ <stop
+ style="stop-color:#1d1b28;stop-opacity:1;"
+ offset="1"
+ id="stop3729" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3715">
+ <stop
+ style="stop-color:#6f7790;stop-opacity:1;"
+ offset="0"
+ id="stop3717" />
+ <stop
+ style="stop-color:#6f7790;stop-opacity:0;"
+ offset="1"
+ id="stop3719" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3688">
+ <stop
+ style="stop-color:#b3d2fe;stop-opacity:1;"
+ offset="0"
+ id="stop3690" />
+ <stop
+ id="stop3696"
+ offset="0.5"
+ style="stop-color:#e0edff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cbeafa;stop-opacity:1;"
+ offset="1"
+ id="stop3692" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3674">
+ <stop
+ style="stop-color:#9ea9cd;stop-opacity:1;"
+ offset="0"
+ id="stop3676" />
+ <stop
+ style="stop-color:#b3d2fe;stop-opacity:1;"
+ offset="1"
+ id="stop3678" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3664">
+ <stop
+ style="stop-color:#6681c4;stop-opacity:1;"
+ offset="0"
+ id="stop3666" />
+ <stop
+ style="stop-color:#6681c4;stop-opacity:0;"
+ offset="1"
+ id="stop3668" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2747">
+ <stop
+ style="stop-color:#c0faff;stop-opacity:1;"
+ offset="0"
+ id="stop2749" />
+ <stop
+ style="stop-color:#f9ffff;stop-opacity:1;"
+ offset="1"
+ id="stop2751" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3261">
+ <stop
+ style="stop-color:#8b9fdc;stop-opacity:1;"
+ offset="0"
+ id="stop3263" />
+ <stop
+ style="stop-color:#354572;stop-opacity:1;"
+ offset="1"
+ id="stop3265" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3241">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3243" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3245" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3229">
+ <stop
+ style="stop-color:#8390d3;stop-opacity:1;"
+ offset="0"
+ id="stop3231" />
+ <stop
+ style="stop-color:#253068;stop-opacity:1;"
+ offset="1"
+ id="stop3233" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3209">
+ <stop
+ style="stop-color:#ebf1ff;stop-opacity:1;"
+ offset="0"
+ id="stop3211" />
+ <stop
+ id="stop3269"
+ offset="0.2109797"
+ style="stop-color:#99bbd2;stop-opacity:1;" />
+ <stop
+ style="stop-color:#506d8e;stop-opacity:1;"
+ offset="0.64264262"
+ id="stop4996" />
+ <stop
+ id="stop4998"
+ offset="0.78125"
+ style="stop-color:#4f6586;stop-opacity:1;" />
+ <stop
+ style="stop-color:#20376c;stop-opacity:1;"
+ offset="1"
+ id="stop3213" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3190">
+ <stop
+ style="stop-color:#a6bee0;stop-opacity:1;"
+ offset="0"
+ id="stop3192" />
+ <stop
+ style="stop-color:#a6bee0;stop-opacity:0;"
+ offset="1"
+ id="stop3194" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3157">
+ <stop
+ style="stop-color:#214673;stop-opacity:1;"
+ offset="0"
+ id="stop3159" />
+ <stop
+ style="stop-color:#7e8cbe;stop-opacity:1;"
+ offset="1"
+ id="stop3161" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3059">
+ <stop
+ style="stop-color:#a5c1ff;stop-opacity:1;"
+ offset="0"
+ id="stop3061" />
+ <stop
+ id="stop3071"
+ offset="0.34999999"
+ style="stop-color:#8bbbff;stop-opacity:1;" />
+ <stop
+ id="stop3069"
+ offset="0.56"
+ style="stop-color:#96d5ff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#f0f5ff;stop-opacity:1;"
+ offset="1"
+ id="stop3063" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3049">
+ <stop
+ style="stop-color:#19274c;stop-opacity:1;"
+ offset="0"
+ id="stop3051" />
+ <stop
+ style="stop-color:#19274c;stop-opacity:0;"
+ offset="1"
+ id="stop3053" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3033">
+ <stop
+ style="stop-color:#a8bbc8;stop-opacity:1;"
+ offset="0"
+ id="stop3035" />
+ <stop
+ id="stop3041"
+ offset="0.25"
+ style="stop-color:#223261;stop-opacity:1;" />
+ <stop
+ style="stop-color:#3d4c75;stop-opacity:1;"
+ offset="0.5"
+ id="stop3043" />
+ <stop
+ id="stop3045"
+ offset="0.75"
+ style="stop-color:#3d528b;stop-opacity:1;" />
+ <stop
+ style="stop-color:#9caedf;stop-opacity:1;"
+ offset="1"
+ id="stop3037" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3015">
+ <stop
+ style="stop-color:#a7bffb;stop-opacity:1;"
+ offset="0"
+ id="stop3017" />
+ <stop
+ id="stop3026"
+ offset="0.5"
+ style="stop-color:#a7cffb;stop-opacity:1;" />
+ <stop
+ style="stop-color:#dcf3fe;stop-opacity:1;"
+ offset="1"
+ id="stop3019" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3099">
+ <stop
+ style="stop-color:#9dc1ff;stop-opacity:1;"
+ offset="0"
+ id="stop3101" />
+ <stop
+ id="stop3107"
+ offset="0.60714287"
+ style="stop-color:#93b4f3;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cbeaff;stop-opacity:1;"
+ offset="1"
+ id="stop3103" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3068">
+ <stop
+ style="stop-color:#aeccef;stop-opacity:1;"
+ offset="0"
+ id="stop3070" />
+ <stop
+ style="stop-color:#aeccef;stop-opacity:0;"
+ offset="1"
+ id="stop3072" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2979">
+ <stop
+ style="stop-color:#8c99c6;stop-opacity:1;"
+ offset="0"
+ id="stop2981" />
+ <stop
+ style="stop-color:#8c99c6;stop-opacity:0;"
+ offset="1"
+ id="stop2983" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3056">
+ <stop
+ style="stop-color:#4b72a9;stop-opacity:1;"
+ offset="0"
+ id="stop3058" />
+ <stop
+ style="stop-color:#4b72a9;stop-opacity:0;"
+ offset="1"
+ id="stop3060" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3046">
+ <stop
+ style="stop-color:#0b1e37;stop-opacity:1;"
+ offset="0"
+ id="stop3048" />
+ <stop
+ style="stop-color:#0b1e37;stop-opacity:0;"
+ offset="1"
+ id="stop3050" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3032">
+ <stop
+ style="stop-color:#27528b;stop-opacity:1;"
+ offset="0"
+ id="stop3034" />
+ <stop
+ style="stop-color:#0a3064;stop-opacity:1;"
+ offset="1"
+ id="stop3036" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3010">
+ <stop
+ style="stop-color:#c5c8ff;stop-opacity:0;"
+ offset="0"
+ id="stop3012" />
+ <stop
+ id="stop3030"
+ offset="0.5"
+ style="stop-color:#91d3ff;stop-opacity:0.72156864;" />
+ <stop
+ style="stop-color:#e0fdff;stop-opacity:1;"
+ offset="1"
+ id="stop3014" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3000">
+ <stop
+ style="stop-color:#34628c;stop-opacity:1;"
+ offset="0"
+ id="stop3002" />
+ <stop
+ style="stop-color:#34628c;stop-opacity:0;"
+ offset="1"
+ id="stop3004" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2972">
+ <stop
+ style="stop-color:#7d8da5;stop-opacity:1;"
+ offset="0"
+ id="stop2974" />
+ <stop
+ style="stop-color:#5f6f89;stop-opacity:1;"
+ offset="1"
+ id="stop2976" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2954">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop2956" />
+ <stop
+ id="stop2962"
+ offset="0.5"
+ style="stop-color:#b8b8b8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#2a2a2a;stop-opacity:1;"
+ offset="1"
+ id="stop2958" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2938">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop2940" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop2942" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2916">
+ <stop
+ style="stop-color:#353c47;stop-opacity:1;"
+ offset="0"
+ id="stop2918" />
+ <stop
+ style="stop-color:#353c47;stop-opacity:0;"
+ offset="1"
+ id="stop2920" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3332">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop3334" />
+ <stop
+ id="stop3341"
+ offset="0.5535714"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop3336" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3317">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop3319" />
+ <stop
+ id="stop3325"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:0.14432989;" />
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="1"
+ id="stop3321" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3931"
+ id="linearGradient3288"
+ x1="321.67255"
+ y1="442.76962"
+ x2="325.79459"
+ y2="409.21478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,50)" />
+ <linearGradient
+ id="linearGradient3290">
+ <stop
+ id="stop3292"
+ offset="0"
+ style="stop-color:#ebf3ff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cfeefe;stop-opacity:1;"
+ offset="0.5"
+ id="stop3294" />
+ <stop
+ id="stop3298"
+ offset="0.75"
+ style="stop-color:#8face1;stop-opacity:1;" />
+ <stop
+ id="stop3296"
+ offset="1"
+ style="stop-color:#8aa3e1;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3262">
+ <stop
+ style="stop-color:#42495a;stop-opacity:1;"
+ offset="0"
+ id="stop3264" />
+ <stop
+ style="stop-color:#42495a;stop-opacity:0;"
+ offset="1"
+ id="stop3266" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3252">
+ <stop
+ style="stop-color:#afc3e6;stop-opacity:1;"
+ offset="0"
+ id="stop3254" />
+ <stop
+ style="stop-color:#afc3e6;stop-opacity:0;"
+ offset="1"
+ id="stop3256" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3240">
+ <stop
+ style="stop-color:#8c99c6;stop-opacity:1;"
+ offset="0"
+ id="stop3242" />
+ <stop
+ style="stop-color:#86a3ea;stop-opacity:1;"
+ offset="1"
+ id="stop3244" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3230">
+ <stop
+ style="stop-color:#b0ddfa;stop-opacity:1;"
+ offset="0"
+ id="stop3232" />
+ <stop
+ style="stop-color:#e5f5ff;stop-opacity:1;"
+ offset="1"
+ id="stop3234" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3214">
+ <stop
+ style="stop-color:#9ea9cd;stop-opacity:1;"
+ offset="0"
+ id="stop3216" />
+ <stop
+ style="stop-color:#9ea9cd;stop-opacity:0;"
+ offset="1"
+ id="stop3218" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3200">
+ <stop
+ style="stop-color:#8197da;stop-opacity:1;"
+ offset="0"
+ id="stop3202" />
+ <stop
+ style="stop-color:#232f54;stop-opacity:1"
+ offset="1"
+ id="stop3204" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3186">
+ <stop
+ style="stop-color:#a9c7fd;stop-opacity:1;"
+ offset="0"
+ id="stop3188" />
+ <stop
+ style="stop-color:#c7ebfe;stop-opacity:1;"
+ offset="1"
+ id="stop3190" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3176">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3178" />
+ <stop
+ style="stop-color:white;stop-opacity:0.41237113;"
+ offset="1"
+ id="stop3180" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3168">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop3170" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop3172" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3156">
+ <stop
+ style="stop-color:#ebf3ff;stop-opacity:1;"
+ offset="0"
+ id="stop3158" />
+ <stop
+ id="stop3164"
+ offset="0.5"
+ style="stop-color:#cfeefe;stop-opacity:1;" />
+ <stop
+ style="stop-color:#b3d2fe;stop-opacity:1;"
+ offset="1"
+ id="stop3160" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3146">
+ <stop
+ style="stop-color:#687586;stop-opacity:1;"
+ offset="0"
+ id="stop3148" />
+ <stop
+ style="stop-color:#8ba7cb;stop-opacity:1;"
+ offset="1"
+ id="stop3150" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3126">
+ <stop
+ style="stop-color:#ff9739;stop-opacity:1;"
+ offset="0"
+ id="stop3128" />
+ <stop
+ style="stop-color:#ff9739;stop-opacity:0;"
+ offset="1"
+ id="stop3130" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3108">
+ <stop
+ style="stop-color:#ffaa57;stop-opacity:1;"
+ offset="0"
+ id="stop3110" />
+ <stop
+ style="stop-color:#c35c00;stop-opacity:0.76288658;"
+ offset="1"
+ id="stop3112" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3062">
+ <stop
+ style="stop-color:#444;stop-opacity:1;"
+ offset="0"
+ id="stop3064" />
+ <stop
+ style="stop-color:#6e6e6e;stop-opacity:1;"
+ offset="1"
+ id="stop3066" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3003">
+ <stop
+ style="stop-color:#6b96c6;stop-opacity:1;"
+ offset="0"
+ id="stop3005" />
+ <stop
+ id="stop3044"
+ offset="0.29464287"
+ style="stop-color:#84b2da;stop-opacity:1;" />
+ <stop
+ id="stop3013"
+ offset="0.5"
+ style="stop-color:#9eceee;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cedcec;stop-opacity:1;"
+ offset="1"
+ id="stop3007" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2993">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop2995" />
+ <stop
+ style="stop-color:#9dc1f9;stop-opacity:1;"
+ offset="1"
+ id="stop2997" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2957">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop2959" />
+ <stop
+ id="stop3088"
+ offset="0.5"
+ style="stop-color:#c1d7fc;stop-opacity:0.79381442;" />
+ <stop
+ style="stop-color:#c1d7fc;stop-opacity:0;"
+ offset="1"
+ id="stop2961" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2848">
+ <stop
+ style="stop-color:#5b6879;stop-opacity:1;"
+ offset="0"
+ id="stop2850" />
+ <stop
+ style="stop-color:#6c7c90;stop-opacity:1;"
+ offset="1"
+ id="stop2852" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2848"
+ id="linearGradient2854"
+ x1="605.78571"
+ y1="693.82843"
+ x2="679.82141"
+ y2="416.68555"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient2963"
+ x1="1059.4688"
+ y1="542.11444"
+ x2="1008.7902"
+ y2="639.25726"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2993"
+ id="linearGradient2999"
+ x1="81.606529"
+ y1="264.65201"
+ x2="611.91901"
+ y2="264.65201"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3003"
+ id="radialGradient3011"
+ cx="575.95508"
+ cy="20.347525"
+ fx="575.95508"
+ fy="20.347525"
+ r="240.65582"
+ gradientTransform="matrix(1.330288,0.722981,-0.410079,0.754547,-166.9089,-302.4274)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3062"
+ id="linearGradient3086"
+ x1="538.01337"
+ y1="286.5759"
+ x2="618.42566"
+ y2="118.00446"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3108"
+ id="linearGradient3140"
+ gradientUnits="userSpaceOnUse"
+ x1="989.28571"
+ y1="1700.8572"
+ x2="990.71429"
+ y2="1690.8738" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3126"
+ id="linearGradient3142"
+ gradientUnits="userSpaceOnUse"
+ x1="995.00024"
+ y1="1697.8326"
+ x2="992.47485"
+ y2="1687.7312" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3146"
+ id="linearGradient3152"
+ x1="682.85712"
+ y1="509.42856"
+ x2="716.42859"
+ y2="397.57141"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3156"
+ id="radialGradient3162"
+ cx="574.18042"
+ cy="1347.757"
+ fx="574.18042"
+ fy="1347.757"
+ r="191.53386"
+ gradientTransform="matrix(1,0,0,0.55348,-14.28574,-379.0895)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3176"
+ id="radialGradient3182"
+ cx="1281.3784"
+ cy="1089.6825"
+ fx="1281.3784"
+ fy="1089.6825"
+ r="462.13467"
+ gradientTransform="matrix(0.418567,1.138515e-8,0,0.199982,745.0363,502.0475)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3186"
+ id="linearGradient3192"
+ x1="378.57144"
+ y1="1178"
+ x2="281.3913"
+ y2="1148"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.857144,-958.5714)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3186"
+ id="linearGradient3196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.857129,-957.8571)"
+ x1="378.57144"
+ y1="1178"
+ x2="294.96271"
+ y2="1148" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient3206"
+ x1="302.69244"
+ y1="1206.0665"
+ x2="299.28571"
+ y2="1189.4286"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.285714,-1016.857)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3214"
+ id="linearGradient3220"
+ x1="312.85715"
+ y1="1122.2858"
+ x2="297.34143"
+ y2="1120.8572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.285716,-959.1429)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3230"
+ id="linearGradient3236"
+ x1="260"
+ y1="1203"
+ x2="185"
+ y2="1170.1428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.14286,-1043.571)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="linearGradient3246"
+ x1="235.71429"
+ y1="1084.4683"
+ x2="237.14285"
+ y2="1102.2856"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.857136,-966.2856)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3252"
+ id="linearGradient3258"
+ x1="-265.71429"
+ y1="655.14288"
+ x2="105.71429"
+ y2="898"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(343.7143,-513.2857)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3262"
+ id="linearGradient3268"
+ x1="660.63977"
+ y1="714.95422"
+ x2="661.38232"
+ y2="527.64288"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3156"
+ id="linearGradient3310"
+ x1="198.10001"
+ y1="362.28571"
+ x2="276.1857"
+ y2="362.28571"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(20,0)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3317"
+ id="radialGradient3328"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.681717,-0.196991,1.189962,4.118073,-340.6222,-1084.458)"
+ cx="300.60941"
+ cy="366.53375"
+ fx="300.60941"
+ fy="366.53375"
+ r="33.840111" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3332"
+ id="radialGradient3343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0.43825,-0.199228,0.4546,60.32876,28.03149)"
+ cx="315.1676"
+ cy="302.81201"
+ fx="315.1676"
+ fy="302.81201"
+ r="154.43303" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3290"
+ id="linearGradient2024"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-36.21248,-969.3161)"
+ x1="236.21936"
+ y1="1114.7728"
+ x2="234.11238"
+ y2="1072.989" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2916"
+ id="radialGradient2922"
+ cx="454.64285"
+ cy="610.14288"
+ fx="454.64285"
+ fy="610.14288"
+ r="249.64285"
+ gradientTransform="matrix(1,0,0,0.549356,0,274.9571)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2938"
+ id="linearGradient2944"
+ x1="306.85715"
+ y1="266.8215"
+ x2="357.2941"
+ y2="227.53578"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2954"
+ id="radialGradient2960"
+ cx="342.5"
+ cy="424.42856"
+ fx="342.5"
+ fy="424.42856"
+ r="32.785721"
+ gradientTransform="matrix(2.109187,-1.212215e-6,2.571153e-6,4.473662,-379.8976,-1474.32)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2972"
+ id="linearGradient2978"
+ x1="148.61224"
+ y1="381.59784"
+ x2="108.62619"
+ y2="201.59782"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3032"
+ id="linearGradient3136"
+ gradientUnits="userSpaceOnUse"
+ x1="1105.9832"
+ y1="1614.0305"
+ x2="917.41821"
+ y2="1754.0305" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3046"
+ id="linearGradient3138"
+ gradientUnits="userSpaceOnUse"
+ x1="930"
+ y1="1780"
+ x2="1002"
+ y2="1698" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3000"
+ id="linearGradient3141"
+ gradientUnits="userSpaceOnUse"
+ x1="1202"
+ y1="1738"
+ x2="1226.4431"
+ y2="1812.2965" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3010"
+ id="linearGradient3143"
+ gradientUnits="userSpaceOnUse"
+ x1="1340.5737"
+ y1="1702.1013"
+ x2="1381.4182"
+ y2="1632.1013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3056"
+ id="linearGradient3145"
+ gradientUnits="userSpaceOnUse"
+ x1="1140"
+ y1="1753"
+ x2="1128"
+ y2="1771" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2979"
+ id="linearGradient2985"
+ x1="72.359482"
+ y1="174.41611"
+ x2="87.939209"
+ y2="175.18224"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3068"
+ id="linearGradient3074"
+ x1="324.92596"
+ y1="477.6283"
+ x2="340.82547"
+ y2="440.29376"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3099"
+ id="linearGradient3177"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-90)"
+ x1="898"
+ y1="1078"
+ x2="1830"
+ y2="1237.4438" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient3179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-450)"
+ x1="1035"
+ y1="1524"
+ x2="1377"
+ y2="1544" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient3181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-90)"
+ x1="1258"
+ y1="939"
+ x2="1152"
+ y2="1126.6492" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient3183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(312,-152)"
+ x1="1255"
+ y1="976"
+ x2="1234.5"
+ y2="1155" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3168"
+ id="linearGradient3185"
+ gradientUnits="userSpaceOnUse"
+ x1="1491"
+ y1="922"
+ x2="1643"
+ y2="1000" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3015"
+ id="radialGradient3028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,2.342884e-7,-2.223753e-7,0.949152,9.885316e-5,-47.39676)"
+ cx="686.60065"
+ cy="439.31793"
+ fx="686.60065"
+ fy="439.31793"
+ r="83.438599" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3059"
+ id="radialGradient3083"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.384977,-5.035681e-8,2.308549e-8,0.63493,-225.5372,145.4852)"
+ cx="595.03033"
+ cy="230.00166"
+ fx="595.03033"
+ fy="230.00166"
+ r="75.30687" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3049"
+ id="linearGradient3088"
+ gradientUnits="userSpaceOnUse"
+ x1="612.35449"
+ y1="324.73068"
+ x2="624.37524"
+ y2="328.97333" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3033"
+ id="linearGradient3091"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.414207,0.707104)"
+ x1="599.91406"
+ y1="356.82278"
+ x2="625.0824"
+ y2="363.18677" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3321">
+ <path
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 973.22231,1494.6884 C 980.29341,1498.729 1119.1893,1603.7849 1134.3416,1615.9067 C 1149.4938,1628.0285 1253.5396,1719.9524 1262.6309,1731.0641 C 1341.4228,1729.0438 1391.9305,1720.9626 1391.9305,1720.9626 C 1391.9305,1720.9626 1264.6512,1621.9676 1227.2756,1597.7239 C 1189.9,1573.4803 1111.1081,1524.993 1101.0065,1518.932 C 1090.905,1512.8711 1067.6715,1504.7899 1057.57,1503.7798 C 1047.4684,1502.7696 973.22231,1494.6884 973.22231,1494.6884 z "
+ sodipodi:nodetypes="csccsssc"
+ id="path3317" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3157"
+ id="linearGradient3340"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(37.44,-16.64)"
+ x1="1403.2334"
+ y1="1581.9968"
+ x2="1396.5648"
+ y2="1632.5245" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3190"
+ id="linearGradient3342"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(37.44,-16.64)"
+ x1="1155.48"
+ y1="1550.48"
+ x2="1355.08"
+ y2="1548.92" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient3344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-216.9404,-73.53911)"
+ x1="1242.0754"
+ y1="1584.9865"
+ x2="1242.0754"
+ y2="1598.2235" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3209"
+ id="radialGradient3346"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.756834,0.11341,-6.052729e-2,0.937628,-578.1804,-19.99804)"
+ cx="1000.5534"
+ cy="1561.3158"
+ fx="1000.5534"
+ fy="1561.3158"
+ r="35.931072" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3209"
+ id="linearGradient3348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(84.56997,2.206172)"
+ x1="952.80212"
+ y1="1525.0521"
+ x2="998.19037"
+ y2="1566.1309" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2954"
+ id="linearGradient3350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.936508,0,0,0.936508,-23.6257,32.33626)"
+ x1="1125.1483"
+ y1="1587.5604"
+ x2="1123.6775"
+ y2="1597.8558" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="radialGradient3352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.609707,0.792627,-0.764705,0.588229,1686.72,-238.9536)"
+ cx="1146.1069"
+ cy="1620.7581"
+ fx="1146.1069"
+ fy="1620.7581"
+ r="18.752472" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3241"
+ id="radialGradient3354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0625,0,-101.0151)"
+ cx="1206.0413"
+ cy="1616.2406"
+ fx="1206.0413"
+ fy="1616.2406"
+ r="5.8831282" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3261"
+ id="linearGradient3356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-132.3704,-14.70782)"
+ x1="1222.2198"
+ y1="1600.4297"
+ x2="1238.3984"
+ y2="1582.7803" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3209"
+ id="linearGradient3360"
+ gradientUnits="userSpaceOnUse"
+ x1="1107.2343"
+ y1="1611.0929"
+ x2="1179.0966"
+ y2="1611.0929" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2954"
+ id="linearGradient3362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-11.03081,1.470782)"
+ x1="1125.1483"
+ y1="1587.5604"
+ x2="1123.6775"
+ y2="1597.8558" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="radialGradient3364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.609707,0.792627,-0.764705,0.588229,1686.72,-238.9536)"
+ cx="1146.1069"
+ cy="1620.7581"
+ fx="1146.1069"
+ fy="1620.7581"
+ r="18.752472" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3241"
+ id="radialGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0625,0,-101.0151)"
+ cx="1206.0413"
+ cy="1616.2406"
+ fx="1206.0413"
+ fy="1616.2406"
+ r="5.8831282" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2747"
+ id="linearGradient2753"
+ x1="354.45847"
+ y1="95.084274"
+ x2="356.66464"
+ y2="108.32131"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3059"
+ id="linearGradient3648"
+ x1="839.81659"
+ y1="215.09087"
+ x2="836.30078"
+ y2="153.0452"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,3.86443,0,-686.1124)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="linearGradient3659"
+ x1="874.62329"
+ y1="121.56011"
+ x2="872.55994"
+ y2="147.18008"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-70)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3664"
+ id="linearGradient3670"
+ x1="606.31995"
+ y1="67.440048"
+ x2="674.95996"
+ y2="64.320045"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3674"
+ id="linearGradient3680"
+ x1="366.59244"
+ y1="186.64046"
+ x2="389.75723"
+ y2="203.92215"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3688"
+ id="linearGradient3694"
+ x1="131.56"
+ y1="129.32004"
+ x2="154.43999"
+ y2="135.56004"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3715"
+ id="linearGradient3721"
+ x1="240.25999"
+ y1="195.36005"
+ x2="327.83997"
+ y2="195.36005"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3725"
+ id="linearGradient3731"
+ x1="1095.7327"
+ y1="928.28229"
+ x2="1092.791"
+ y2="954.75635"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-40)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3172"
+ id="linearGradient3178"
+ x1="1483.5599"
+ y1="378.92004"
+ x2="1503.3199"
+ y2="386.72003"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-50)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3197"
+ id="linearGradient3203"
+ x1="1369.8599"
+ y1="336.50003"
+ x2="1482.9082"
+ y2="336.50003"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3172"
+ id="linearGradient3237"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-30,-50)"
+ x1="1529.6799"
+ y1="370.94003"
+ x2="1540.0798"
+ y2="370.16003" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3263"
+ x1="1410.1123"
+ y1="317.54004"
+ x2="1411.583"
+ y2="326.91629"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3267"
+ gradientUnits="userSpaceOnUse"
+ x1="1442.1018"
+ y1="321.95239"
+ x2="1506.8162"
+ y2="339.2341" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3271"
+ gradientUnits="userSpaceOnUse"
+ x1="1288.0374"
+ y1="342.54333"
+ x2="1289.5081"
+ y2="358.90579" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3275"
+ gradientUnits="userSpaceOnUse"
+ x1="1410.1123"
+ y1="327.46783"
+ x2="1413.0538"
+ y2="343.46259" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3283"
+ gradientUnits="userSpaceOnUse"
+ x1="1065.2139"
+ y1="356.88348"
+ x2="1065.9492"
+ y2="373.79745" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3361"
+ id="linearGradient3367"
+ x1="1684.7999"
+ y1="745.52002"
+ x2="1694.1599"
+ y2="771.52002"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3371"
+ id="linearGradient3377"
+ gradientUnits="userSpaceOnUse"
+ x1="1684.7999"
+ y1="745.52002"
+ x2="1694.1599"
+ y2="771.52002" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3276"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ x1="1501.2399"
+ y1="852.64001"
+ x2="1506.4399"
+ y2="875" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3314"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-80)"
+ x1="1253.1063"
+ y1="937.10699"
+ x2="1841.4191"
+ y2="776.79175" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3232"
+ id="linearGradient3400"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-50)"
+ x1="1738.3599"
+ y1="851.60004"
+ x2="1528.7999"
+ y2="935.32001" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3208"
+ id="linearGradient3404"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-30,0)"
+ x1="1853.7999"
+ y1="719.00006"
+ x2="1847.5599"
+ y2="727.32001" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3221"
+ id="linearGradient3407"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-30,0)"
+ x1="1813.7599"
+ y1="765.79999"
+ x2="1807.5199"
+ y2="772.56" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3293"
+ id="linearGradient3411"
+ gradientUnits="userSpaceOnUse"
+ x1="1392.5599"
+ y1="917.12006"
+ x2="1314.5599"
+ y2="926.47998" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3254"
+ id="linearGradient3415"
+ x1="1640.6"
+ y1="754.88"
+ x2="1645.7999"
+ y2="789.72003"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3419"
+ id="linearGradient3425"
+ x1="1492.1084"
+ y1="880.48187"
+ x2="1510.4932"
+ y2="874.59875"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3475"
+ id="linearGradient3481"
+ x1="1499.6799"
+ y1="290.52005"
+ x2="1138.7999"
+ y2="91.360046"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,10)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3483"
+ id="linearGradient3489"
+ x1="1127.8799"
+ y1="219.26003"
+ x2="1477.3199"
+ y2="219.26003"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-20)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3495"
+ id="linearGradient3501"
+ x1="1499.6799"
+ y1="300.40002"
+ x2="1490.3199"
+ y2="293.90002"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3452"
+ id="linearGradient3504"
+ gradientUnits="userSpaceOnUse"
+ x1="1410.7599"
+ y1="202.90004"
+ x2="1402.96"
+ y2="209.14005"
+ gradientTransform="translate(-40,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3240"
+ id="linearGradient3507"
+ gradientUnits="userSpaceOnUse"
+ x1="1394.86"
+ y1="194.71004"
+ x2="1409.1599"
+ y2="214.47005"
+ gradientTransform="translate(-40,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3512"
+ id="linearGradient3510"
+ gradientUnits="userSpaceOnUse"
+ x1="1391.3207"
+ y1="192.83658"
+ x2="1397.4015"
+ y2="207.39658"
+ gradientTransform="translate(-40,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3452"
+ id="linearGradient3522"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-40,0)"
+ x1="1370.4598"
+ y1="179.65312"
+ x2="1381.8999"
+ y2="194.58005" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3556"
+ id="linearGradient3618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-30,0)"
+ x1="1775.2339"
+ y1="510.5802"
+ x2="1781.8524"
+ y2="517.19873" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3535"
+ id="linearGradient3620"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-20,0)"
+ x1="1736.2582"
+ y1="481.16455"
+ x2="1757.0873"
+ y2="498.28571" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3582"
+ id="linearGradient3622"
+ gradientUnits="userSpaceOnUse"
+ x1="1593.2843"
+ y1="384.09293"
+ x2="1627.7415"
+ y2="384.09293" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3592"
+ id="linearGradient3624"
+ gradientUnits="userSpaceOnUse"
+ x1="1615.6399"
+ y1="384.64005"
+ x2="1607.84"
+ y2="378.40002" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3602"
+ id="linearGradient3626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-30,0)"
+ x1="1626.0399"
+ y1="366.96002"
+ x2="1639.3199"
+ y2="356.30002" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3651"
+ id="radialGradient3670"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,-2.449946e-5,3.26177e-5,1.331364,-9.189301e-3,-92.83615)"
+ cx="337.68991"
+ cy="281.73077"
+ fx="337.69009"
+ fy="281.73068"
+ r="26.197193" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3660"
+ id="radialGradient3672"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.184925,0.291241,-0.244616,0.995229,5.770674,-93.65263)"
+ cx="337.68951"
+ cy="278.87592"
+ fx="337.68961"
+ fy="278.87601"
+ r="30.057995" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3617"
+ x1="782.83337"
+ y1="799.42517"
+ x2="864.77716"
+ y2="577.03143"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3623"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3627"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3631"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3635"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3640"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="771.66034"
+ y2="777.76068" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3852"
+ gradientUnits="userSpaceOnUse"
+ x1="751.09253"
+ y1="735"
+ x2="732.11664"
+ y2="745.52069" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3854"
+ gradientUnits="userSpaceOnUse"
+ x1="743.77771"
+ y1="577.80316"
+ x2="760.22034"
+ y2="597.8407" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3856"
+ gradientUnits="userSpaceOnUse"
+ x1="867.10388"
+ y1="601.625"
+ x2="850.70032"
+ y2="613.44067" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3858"
+ gradientUnits="userSpaceOnUse"
+ x1="912.13434"
+ y1="738.04584"
+ x2="892.15674"
+ y2="785.84998" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3860"
+ gradientUnits="userSpaceOnUse"
+ x1="823.10938"
+ y1="833.45209"
+ x2="823.10938"
+ y2="858.61041" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3422"
+ id="linearGradient3711"
+ x1="799.76501"
+ y1="597.83502"
+ x2="814.95313"
+ y2="814.15497"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3611"
+ id="linearGradient3769"
+ gradientUnits="userSpaceOnUse"
+ x1="911.05261"
+ y1="548.50476"
+ x2="793.18713"
+ y2="793.88776" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="radialGradient3777"
+ cx="819.57001"
+ cy="681.40497"
+ fx="819.57001"
+ fy="681.40497"
+ r="89.050735"
+ gradientTransform="matrix(1.76434,-2.35869e-2,0.426816,1.801459,-928.0471,-507.7961)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3422"
+ id="linearGradient3823"
+ gradientUnits="userSpaceOnUse"
+ x1="837.68555"
+ y1="796.52527"
+ x2="780.84125"
+ y2="572.90417" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3463"
+ id="radialGradient3825"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.402597,0,-270.1008)"
+ cx="828.16028"
+ cy="706.72321"
+ fx="828.16028"
+ fy="706.72321"
+ r="84.93766" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3146"
+ id="linearGradient3827"
+ gradientUnits="userSpaceOnUse"
+ x1="823.68597"
+ y1="611.11115"
+ x2="806.85175"
+ y2="711.99713" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3833">
+ <path
+ style="color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 959.1425,564.82625 C 958.9956,564.82625 958.8509,564.85409 958.705,564.8575 C 961.2854,564.93481 963.8642,565.51476 966.3925,566.57625 C 954.3198,572.32964 947.5839,591.64301 950.8613,614.57625 C 954.1381,637.50677 966.3961,656.82032 980.1113,662.57625 C 977.8891,663.63465 975.4796,664.21731 972.9238,664.295 C 973.0707,664.29841 973.2143,664.32625 973.3613,664.32625 C 990.1318,664.32625 1000.5676,642.0416 996.6425,614.57625 C 992.7175,587.11092 975.913,564.82627 959.1425,564.82625 z M 927.6738,573.51375 C 927.3371,573.69114 927.0075,573.89192 926.6738,574.07625 C 926.7234,578.55327 926.3543,582.80673 925.6113,586.7325 C 919.4843,593.25496 914.1454,601.22202 909.7363,610.38875 C 909.9551,610.48576 910.173,610.57965 910.3925,610.67 C 908.1368,611.726 905.6807,612.32482 903.08,612.38875 C 903.2563,612.39364 903.4348,612.38875 903.6113,612.38875 C 918.2837,612.38875 928.0972,595.68484 927.6738,573.51375 z M 907.1113,624.38875 C 906.9645,624.38875 906.8195,624.41667 906.6738,624.42 C 909.2562,624.49606 911.8301,625.06603 914.3613,626.1075 C 902.3011,631.72743 895.5873,650.58123 898.8613,672.9825 C 902.1345,695.37929 914.3493,714.23337 928.0488,719.8575 C 925.828,720.89233 923.4162,721.46813 920.8613,721.545 C 921.008,721.54833 921.152,721.57625 921.2988,721.57625 C 938.0517,721.57625 948.4696,699.81075 944.5488,672.9825 C 940.6278,646.15426 923.8643,624.38876 907.1113,624.38875 z M 1026.2363,642.76375 C 1026.0897,642.76375 1025.9444,642.79173 1025.7988,642.795 C 1028.3705,642.87004 1030.9296,643.43172 1033.455,644.45125 C 1020.76,650.25663 1013.6554,670.40681 1017.08,694.3575 C 1020.5058,718.3161 1033.3753,738.46594 1047.7363,744.26375 C 1045.4992,745.28674 1043.1036,745.84538 1040.5488,745.92 C 1040.6953,745.92327 1040.8397,745.95125 1040.9863,745.95125 C 1058.3863,745.95125 1069.1835,722.83766 1065.1113,694.3575 C 1061.0389,665.87733 1043.6362,642.76378 1026.2363,642.76375 z M 937.2363,739.1075 C 937.0865,739.1075 936.9475,739.1352 936.7988,739.13875 C 939.3775,739.21619 941.9607,739.7971 944.4863,740.8575 C 932.4421,746.61998 925.7459,765.90143 929.0175,788.795 C 932.291,811.70197 944.5042,831.01373 958.205,836.76375 C 955.9853,837.82106 953.5716,838.40468 951.0175,838.4825 C 951.1643,838.48591 951.3082,838.51375 951.455,838.51375 C 968.208,838.51375 978.6259,816.23209 974.705,788.795 C 970.7841,761.35788 953.9893,739.1075 937.2363,739.1075 z M 1010.0488,755.295 C 1009.9022,755.295 1009.7569,755.32298 1009.6113,755.32625 C 1012.183,755.40129 1014.7421,755.96297 1017.2675,756.9825 C 1004.5739,762.78928 997.4681,782.93954 1000.8925,806.88875 C 1004.3184,830.84781 1017.2187,850.99762 1031.58,856.795 C 1029.3699,857.80582 1026.9794,858.36539 1024.455,858.45125 C 1024.5702,858.45327 1024.6835,858.4825 1024.7988,858.4825 C 1042.1988,858.4825 1053.0273,835.36894 1048.955,806.88875 C 1044.8826,778.40858 1027.4487,755.295 1010.0488,755.295 z M 977.83,841.7325 C 977.6941,841.7325 977.5588,841.76088 977.4238,841.76375 C 979.983,841.84501 982.5447,842.42434 985.0488,843.45125 C 981.1116,845.30446 977.7441,848.58583 975.1113,852.92 C 984.5554,858.6399 994.3582,862.32873 1004.2363,863.63875 C 1001.955,863.95668 999.6342,864.13326 997.2675,864.17 C 1000.3379,864.17 1003.3416,863.95003 1006.2675,863.4825 C 998.9144,850.38461 988.3818,841.73252 977.83,841.7325 z "
+ id="path3535"
+ sodipodi:nodetypes="cccsccsscccccccsccccsccssccccsccssccccsccssccccsccssccccccccc" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2954"
+ id="linearGradient3912"
+ gradientUnits="userSpaceOnUse"
+ x1="814.44556"
+ y1="742.2583"
+ x2="814.44556"
+ y2="699.93915" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="linearGradient3917"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,-0.357143,0.821429,258.463,86.94653)"
+ x1="815.54865"
+ y1="721.63739"
+ x2="812.54578"
+ y2="701.04614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient3921"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.945605,-0.217581,0.40526,0.47818,-220.401,581.0172)"
+ x1="815.54865"
+ y1="721.63739"
+ x2="810.40088"
+ y2="701.04645" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3771"
+ id="linearGradient3925"
+ gradientUnits="userSpaceOnUse"
+ x1="815.54865"
+ y1="721.63739"
+ x2="810.40088"
+ y2="701.04645" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3932">
+ <path
+ transform="matrix(0.31032,0,5.178125e-2,0.352536,530.9291,471.175)"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335"
+ sodipodi:rx="84.93766"
+ sodipodi:cy="670.89545"
+ sodipodi:cx="813.71014"
+ id="path3895"
+ style="opacity:1;color:black;fill:#fc0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3937"
+ id="linearGradient3943"
+ x1="809.74945"
+ y1="715.75433"
+ x2="822.82684"
+ y2="711.34198"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.367696,0.367696)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3937"
+ id="linearGradient3947"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-11.76626,14.70782)"
+ x1="812.69104"
+ y1="719.43127"
+ x2="822.82684"
+ y2="711.34198" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2830"
+ gradientUnits="userSpaceOnUse"
+ x1="909.77393"
+ y1="748.375"
+ x2="909.77393"
+ y2="799.96875" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3463"
+ id="linearGradient2833"
+ gradientUnits="userSpaceOnUse"
+ x1="812.26624"
+ y1="665.6875"
+ x2="820.95752"
+ y2="739.92749" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2851"
+ gradientUnits="userSpaceOnUse"
+ x1="812.26831"
+ y1="842.35431"
+ x2="814.00519"
+ y2="851.5625" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2855"
+ gradientUnits="userSpaceOnUse"
+ x1="733.65625"
+ y1="696.75964"
+ x2="744.9621"
+ y2="768.34375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2858"
+ gradientUnits="userSpaceOnUse"
+ x1="847.7276"
+ y1="557.90625"
+ x2="894.53625"
+ y2="619.54285" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2861"
+ gradientUnits="userSpaceOnUse"
+ x1="752.10992"
+ y1="576.96875"
+ x2="752.10992"
+ y2="635.84375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2864"
+ gradientUnits="userSpaceOnUse"
+ x1="761.6665"
+ y1="621.93903"
+ x2="759.14404"
+ y2="753.24847" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2867"
+ gradientUnits="userSpaceOnUse"
+ x1="773.9549"
+ y1="732.1875"
+ x2="782.68182"
+ y2="850.28198" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2870"
+ gradientUnits="userSpaceOnUse"
+ x1="858.75"
+ y1="748.375"
+ x2="858.01459"
+ y2="865.15143" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2873"
+ gradientUnits="userSpaceOnUse"
+ x1="879.375"
+ y1="642.57867"
+ x2="879.375"
+ y2="744.06262" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2876"
+ gradientUnits="userSpaceOnUse"
+ x1="813.66602"
+ y1="557.90625"
+ x2="813.41272"
+ y2="657.40625" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3599"
+ id="linearGradient2891"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.220779,0,0.203704,1.382716,-313.0049,-219.993)"
+ x1="819.11285"
+ y1="555.48511"
+ x2="793.83105"
+ y2="790.02881" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2905"
+ gradientUnits="userSpaceOnUse"
+ x1="909.77393"
+ y1="748.375"
+ x2="909.77393"
+ y2="799.96875"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3463"
+ id="linearGradient2908"
+ gradientUnits="userSpaceOnUse"
+ x1="812.26624"
+ y1="665.6875"
+ x2="820.95752"
+ y2="739.92749"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2926"
+ gradientUnits="userSpaceOnUse"
+ x1="812.26831"
+ y1="842.35431"
+ x2="814.00519"
+ y2="851.5625"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2929"
+ gradientUnits="userSpaceOnUse"
+ x1="733.65625"
+ y1="696.75964"
+ x2="744.9621"
+ y2="768.34375"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2932"
+ gradientUnits="userSpaceOnUse"
+ x1="847.7276"
+ y1="557.90625"
+ x2="879.375"
+ y2="601.625"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2935"
+ gradientUnits="userSpaceOnUse"
+ x1="752.10992"
+ y1="576.96875"
+ x2="752.10992"
+ y2="635.84375"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2939"
+ gradientUnits="userSpaceOnUse"
+ x1="761.6665"
+ y1="621.93903"
+ x2="759.14404"
+ y2="714.65625"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2942"
+ gradientUnits="userSpaceOnUse"
+ x1="773.9549"
+ y1="732.1875"
+ x2="782.68182"
+ y2="850.28198"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2945"
+ gradientUnits="userSpaceOnUse"
+ x1="858.75"
+ y1="748.375"
+ x2="858.01459"
+ y2="865.15143"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2948"
+ gradientUnits="userSpaceOnUse"
+ x1="879.375"
+ y1="642.57867"
+ x2="879.375"
+ y2="744.06262"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4018"
+ id="linearGradient2951"
+ gradientUnits="userSpaceOnUse"
+ x1="813.66602"
+ y1="557.90625"
+ x2="813.41272"
+ y2="657.40625"
+ gradientTransform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3599"
+ id="linearGradient2966"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.598901,0,8.400139e-2,0.962206,-424.6396,-245.4445)"
+ x1="819.11285"
+ y1="555.48511"
+ x2="793.83105"
+ y2="790.02881" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3747"
+ id="radialGradient3753"
+ cx="900.87634"
+ cy="429.33759"
+ fx="900.87634"
+ fy="429.33759"
+ r="48.691078"
+ gradientTransform="matrix(1,0,0,0.848475,0,65.71196)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter3933">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="22.417147"
+ id="feGaussianBlur3935" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="radialGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.336911,-6.393033e-3,7.168639e-3,1.499105,-315.1945,-350.4958)"
+ cx="889.67188"
+ cy="707.07434"
+ fx="889.67188"
+ fy="707.07434"
+ r="145.07635" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3337"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-240,0)"
+ x1="1088.0862"
+ y1="752.67523"
+ x2="1070.9225"
+ y2="516.59521" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="radialGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.855854,-4.721012e-3,-1.795074e-2,1.107032,-573.9138,-379.4444)"
+ cx="889.67188"
+ cy="707.07434"
+ fx="889.67188"
+ fy="707.07434"
+ r="145.07635" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3337"
+ id="linearGradient3408"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.640101,0,-1.503523e-2,0.738462,-531.0515,-120.6166)"
+ x1="1088.0862"
+ y1="752.67523"
+ x2="1070.9225"
+ y2="516.59521" />
+ <filter
+ inkscape:collect="always"
+ id="filter4382">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="5.8935163"
+ id="feGaussianBlur4384" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2980"
+ id="radialGradient2993"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.945085,0.545627,-0.270591,0.468689,142.3973,-159.4092)"
+ cx="628.70422"
+ cy="407.33719"
+ fx="628.48901"
+ fy="398.23914"
+ r="38.580692" />
+ <filter
+ inkscape:collect="always"
+ x="-0.23653734"
+ width="1.4730747"
+ y="-0.35096824"
+ height="1.7019365"
+ id="filter4877">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="7.6348052"
+ id="feGaussianBlur4879" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.17345947"
+ width="1.3469189"
+ y="-0.27603572"
+ height="1.5520714"
+ id="filter4958">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.6896932"
+ id="feGaussianBlur4960" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4970"
+ id="linearGradient4976"
+ x1="627.0163"
+ y1="374.24841"
+ x2="582.94659"
+ y2="386.46796"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5002"
+ id="linearGradient5008"
+ x1="1105.0763"
+ y1="556.67267"
+ x2="1116.7949"
+ y2="540.26642"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3209"
+ id="radialGradient5012"
+ cx="1217.5303"
+ cy="1610.0789"
+ fx="1217.5303"
+ fy="1610.0789"
+ r="35.931072"
+ gradientTransform="matrix(1.618346,-0.534976,1.718181,1.15679,-3572.63,429.4414)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5016"
+ id="linearGradient5022"
+ x1="1070.3107"
+ y1="525.81335"
+ x2="1072.6544"
+ y2="544.75861"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ x="-0.026605937"
+ width="1.0532119"
+ y="-0.11884383"
+ height="1.2376877"
+ id="filter5154">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.9936009"
+ id="feGaussianBlur5156" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.058378786"
+ width="1.1167576"
+ y="-0.14122266"
+ height="1.2824453"
+ id="filter5194">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.3537535"
+ id="feGaussianBlur5196" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5254">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="12.362587"
+ id="feGaussianBlur5256" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.33162393"
+ width="1.6632479"
+ y="-0.50389611"
+ height="2.0077922"
+ id="filter5329">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="15.236484"
+ id="feGaussianBlur5331" />
+ </filter>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath5339">
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path5198"
+ id="use5337"
+ width="1"
+ height="1"
+ transform="translate(0,-540)" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ x="-0.059271395"
+ width="1.1185428"
+ y="-0.2476752"
+ height="1.4953504"
+ id="filter3952">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="6.568345"
+ id="feGaussianBlur3954" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.067821837"
+ width="1.1356437"
+ y="-0.13965996"
+ height="1.2793199"
+ id="filter4914">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="7.9175213"
+ id="feGaussianBlur4916" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3871">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="6.9266087"
+ id="feGaussianBlur3873" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3877"
+ id="linearGradient3875"
+ gradientUnits="userSpaceOnUse"
+ x1="1843.3077"
+ y1="1139.8347"
+ x2="1798.4442"
+ y2="1145.3904" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3877"
+ id="linearGradient2949"
+ gradientUnits="userSpaceOnUse"
+ x1="1332.6165"
+ y1="1341.6736"
+ x2="1329.6609"
+ y2="1290.606" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3838"
+ id="linearGradient3844"
+ x1="1306.5068"
+ y1="1474.1163"
+ x2="1334.7703"
+ y2="1533.567"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ x="-0.284216"
+ width="1.568432"
+ y="-0.23374538"
+ height="1.4674908"
+ id="filter3912">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="12.342325"
+ id="feGaussianBlur3914" />
+ </filter>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3918">
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path3144"
+ id="use3916"
+ width="1"
+ height="1" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ id="filter4167">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.164557"
+ id="feGaussianBlur4169" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2957"
+ id="linearGradient4211"
+ gradientUnits="userSpaceOnUse"
+ x1="1059.4688"
+ y1="542.11444"
+ x2="1044.2227"
+ y2="593.19513" />
+ <filter
+ inkscape:collect="always"
+ id="filter4217">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="10.108017"
+ id="feGaussianBlur4219" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.21888952"
+ width="1.437779"
+ y="-0.19940901"
+ height="1.398818"
+ id="filter4259">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="12.615137"
+ id="feGaussianBlur4261" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4263"
+ id="linearGradient4269"
+ x1="1182.5635"
+ y1="429.21915"
+ x2="1247.7144"
+ y2="430.47183"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ x="-0.050900629"
+ width="1.1018013"
+ y="-0.10984331"
+ height="1.2196866"
+ id="filter4601">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="9.025964"
+ id="feGaussianBlur4603" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3059"
+ id="linearGradient4607"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.496947,0,-822.1609)"
+ x1="839.81659"
+ y1="215.09087"
+ x2="836.30078"
+ y2="153.0452" />
+ <filter
+ inkscape:collect="always"
+ id="filter4653">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="8.6485882"
+ id="feGaussianBlur4655" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.10894429"
+ width="1.2178886"
+ y="-0.17668761"
+ height="1.3533752"
+ id="filter4826">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.9101588"
+ id="feGaussianBlur4828" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.1440634"
+ width="1.2881268"
+ y="-0.21936503"
+ height="1.4387301"
+ id="filter5032">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.7103122"
+ id="feGaussianBlur5034" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.30684853"
+ width="1.6136971"
+ y="-0.20180214"
+ height="1.4036043"
+ id="filter5106">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="5.8270206"
+ id="feGaussianBlur5108" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.094454055"
+ width="1.1889081"
+ y="-0.14074299"
+ height="1.281486"
+ id="filter5200">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="5.3388835"
+ id="feGaussianBlur5202" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.12801512"
+ width="1.2560302"
+ y="-0.3464887"
+ height="1.6929774"
+ id="filter5304">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="3.7809852"
+ id="feGaussianBlur5306" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.035006558"
+ width="1.0700131"
+ y="-0.14665898"
+ height="1.293318"
+ id="filter6393">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="6.4832538"
+ id="feGaussianBlur6395" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6405"
+ id="linearGradient6403"
+ x1="931.52002"
+ y1="872.21838"
+ x2="1079.7725"
+ y2="885.69226"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter3915">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="3.0141434"
+ id="feGaussianBlur3917" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3332"
+ id="radialGradient3919"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.200899,0.579174,-0.2156105,0.4470627,8.8637985,-8.9711893)"
+ cx="347.41388"
+ cy="303.43369"
+ fx="347.41388"
+ fy="303.43369"
+ r="154.43303" />
+ <filter
+ inkscape:collect="always"
+ x="-0.097929535"
+ width="1.1958591"
+ y="-0.11166643"
+ height="1.2233329"
+ id="filter3927">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.8517745"
+ id="feGaussianBlur3929" />
+ </filter>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3946">
+ <path
+ style="opacity:1;color:#000000;fill:url(#linearGradient3949);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3944"
+ sodipodi:nodetypes="csscsccsc"
+ d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3931"
+ id="linearGradient3949"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,50)"
+ x1="321.67255"
+ y1="442.76962"
+ x2="325.79459"
+ y2="409.21478" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3953">
+ <path
+ style="opacity:1;color:#000000;fill:url(#linearGradient3956);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3951"
+ sodipodi:nodetypes="csscsccsc"
+ d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3931"
+ id="linearGradient3956"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,50)"
+ x1="321.67255"
+ y1="442.76962"
+ x2="325.79459"
+ y2="409.21478" />
+ <filter
+ inkscape:collect="always"
+ id="filter3982">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2477499"
+ id="feGaussianBlur3984" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4008">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.5339087"
+ id="feGaussianBlur4010" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3156"
+ id="linearGradient4012"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(18.081772,0)"
+ x1="198.10001"
+ y1="362.28571"
+ x2="276.1857"
+ y2="362.28571" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3156"
+ id="linearGradient4016"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(84,0)"
+ x1="198.10001"
+ y1="362.28571"
+ x2="276.1857"
+ y2="362.28571" />
+ <filter
+ inkscape:collect="always"
+ id="filter4022">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.0729348"
+ id="feGaussianBlur4024" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4070">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2671386"
+ id="feGaussianBlur4072" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ x="-0.04195043"
+ width="1.0839009"
+ y="-0.14643413"
+ height="1.2928683"
+ id="filter4097">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.7365391"
+ id="feGaussianBlur4099" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3230"
+ id="linearGradient4101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.14286,-1045.1974)"
+ x1="260"
+ y1="1203"
+ x2="185"
+ y2="1170.1428" />
+ <filter
+ inkscape:collect="always"
+ x="-0.038803903"
+ width="1.0776078"
+ y="-0.1411126"
+ height="1.2822252"
+ id="filter4119">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.419179"
+ id="feGaussianBlur4121" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4139">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="5.6950996"
+ id="feGaussianBlur4141" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4161">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="4.9493976"
+ id="feGaussianBlur4163" />
+ </filter>
+ </defs>
+ <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="0.48036041"
+ inkscape:cx="851.92362"
+ inkscape:cy="521.2444"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer3"
+ width="1901px"
+ height="1018px"
+ inkscape:window-width="900"
+ inkscape:window-height="687"
+ inkscape:window-x="10"
+ inkscape:window-y="20"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ showborder="false" />
+ <metadata
+ id="metadata7">
+ <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>Lamborghini Gallardo</dc:title>
+ <dc:date>10.25.2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Michael Grosberg</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:description>A traced Lamborghini Gallardo.
+The source image can be found at:
+http://en.wikipedia.org/wiki/Image:Lamborghini_Gallardo_silver.jpg</dc:description>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.5/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:prohibits
+ rdf:resource="http://web.resource.org/cc/CommercialUse" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="shadow"
+ style="opacity:1;display:inline"
+ id="layer6"
+ inkscape:groupmode="layer">
+ <path
+ style="opacity:0.75652179;fill:url(#linearGradient6403);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter6393)"
+ d="M 833.92042,891.98536 C 852.45199,895.69167 862.33549,901.86886 873.45443,900.63342 C 884.57337,899.39798 1151.4279,910.51692 1144.0153,901.86886 C 1136.6027,893.2208 1103.2458,841.33241 1081.008,843.80329 C 1058.7701,846.27416 996.9982,826.50716 971.054,826.50716 C 945.10981,826.50716 869.74812,812.91735 847.51024,817.8591 C 825.27236,822.80085 765.97135,831.44891 774.61942,841.33241 C 783.26748,851.21592 799.32817,887.04361 833.92042,891.98536 z "
+ id="path5398" />
+ <path
+ style="opacity:0.75;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3933)"
+ d="M 1723.6555,787.9542 C 1760.3047,803.4157 1777.1834,823.7398 1754.1015,846.0505 C 1749.1968,851.3011 1737.9063,858.5431 1721.797,866.8706 C 1637.8809,910.3155 1423.8477,988.2316 1316.0696,988.3291 C 1303.4824,988.3491 1284.8718,986.4359 1262.8773,983.2064 C 1180.5796,970.8403 1042.9036,938.2083 1001.7948,921.9216 C 975.7298,911.4804 942.7654,911.8916 910.653,911.7278 C 875.7047,911.2128 838.4307,909.9972 808.9547,893.2168 C 791.2046,882.9509 779.904,873.7065 772.6421,865.0477 C 752.7058,840.9555 763.5005,822.0002 748.5703,799.5818 C 742.099,790.8866 714.0216,771.8511 672.6307,748.8436 C 560.35406,686.2063 339.78489,576.1304 279.061,551.8925 C 271.83005,549.0114 266.67254,547.2996 264.04046,546.9561 C 234.24042,543.1389 148.46794,567.8161 130.10669,542.5468 C 130.07796,542.5073 130.04939,542.4676 130.02098,542.4279 C 111.74379,516.8365 152.20544,475.4745 188.8197,471.533 C 188.97119,471.5167 189.1229,471.5009 189.27482,471.4856 C 226.04741,467.7881 642.21633,370.1412 716.9405,387.9473 C 719.5366,388.561 723.0239,389.5757 727.3347,390.965 C 848.5229,430.0548 1700.6312,778.9385 1723.6555,787.9542 C 1723.6555,787.9542 1723.6555,787.9542 1723.6555,787.9542"
+ id="path7090" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path5398"
+ id="use6413"
+ transform="matrix(0.9136,0,0,0.9136,-620.2102,-276.0885)"
+ width="1901"
+ height="1018" />
+ </g>
+ <g
+ inkscape:label="paint"
+ style="opacity:1;display:inline"
+ id="layer3"
+ inkscape:groupmode="layer">
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 1033.7599,832.88001 C 946.39995,785.04001 809.11996,712.24001 782.07996,718.48001 C 755.03996,724.72001 700.95997,747.60001 700.95997,747.60001 L 659.35997,691.44002 L 671.83997,473.04003 L 794.55996,435.60003 L 960.95995,518.80002 L 1033.7599,832.88001 z "
+ id="path3635" />
+ <path
+ d="M 988,874.48001 C 931.84,892.16001 885.04,899.44001 865.28,899.44001 C 845.52,899.44001 786.24,884.88001 757.11996,840.16001 C 727.99996,795.44001 701.99997,724.72001 703.03997,669.60002 C 704.07997,614.48002 706.15997,502.16002 819.52,508.40002 C 932.88,514.64002 979.68,647.76002 989.04,684.16002 C 998.4,720.56001 989.04,874.48001 988,874.48001 z "
+ id="path3331"
+ style="opacity:1;color:black;fill:url(#linearGradient3392);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" />
+ <path
+ id="path3540"
+ d="M 988,874.48001 C 931.84,892.16001 885.04,899.44001 865.28,899.44001 C 845.52,899.44001 786.24,884.88001 757.11996,840.16001 C 727.99996,795.44001 701.99997,724.72001 703.03997,669.60002 C 704.07997,614.48002 706.15997,502.16002 819.52,508.40002 C 932.88,514.64002 979.68,647.76002 989.04,684.16002 C 998.4,720.56001 989.04,874.48001 988,874.48001 z "
+ style="opacity:0.29444442;color:black;fill:url(#radialGradient3380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 76.959996,366.96003 C 69.679996,358.64003 58.239997,336.80004 58.239997,294.16004 C 58.239997,271.28004 72.799996,225.52004 72.799996,225.52004 L 147.67999,227.60004 L 241.27999,402.32003 L 265.19999,467.84003 C 265.19999,467.84003 190.55853,384.49949 130.31349,390.57618 C 101.54215,393.47824 76.959996,366.96003 76.959996,366.96003 z "
+ sodipodi:nodetypes="csccccsc"
+ id="path3637" />
+ <path
+ id="path4128"
+ sodipodi:nodetypes="csssssc"
+ d="M 241.84448,525.15366 C 205.63058,538.20967 175.5644,543.58567 162.91601,543.58567 C 150.26761,543.58567 112.54134,532.83366 94.573945,499.80964 C 76.606579,466.78562 61.027251,414.56159 62.521698,373.85757 C 64.016144,333.15354 67.036312,250.20949 139.50436,254.8175 C 211.97239,259.4255 263.84761,445.08956 269.29167,471.96957 C 274.73573,498.84958 242.51018,525.15366 241.84448,525.15366 z "
+ style="opacity:1;color:black;fill:url(#linearGradient3408);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="M 232.48448,518.91366 C 196.27059,531.96967 175.5644,543.58567 162.91601,543.58567 C 150.26761,543.58567 112.54134,532.83366 94.573945,499.80964 C 76.606579,466.78562 61.027251,414.56159 62.521698,373.85757 C 64.016144,333.15354 67.036312,250.20949 139.50436,254.8175 C 211.97239,259.4255 256.5676,459.64955 262.01166,486.52957 C 267.45572,513.40958 233.15019,518.91366 232.48448,518.91366 z "
+ sodipodi:nodetypes="csssssc"
+ id="path4144"
+ style="opacity:0.29444442;color:black;fill:url(#radialGradient3395);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="color:black;fill:#5b6879;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1482.9039,285.6394 C 1482.9039,285.6394 1562.706,300.79169 1609.173,327.05566 C 1655.64,353.31962 1764.4406,443.34576 1833.131,534.25949 C 1833.131,534.25949 1846.4286,550.14286 1859.2857,581.57143 M 1482.9039,285.63941 C 1482.9039,285.63941 1371.7872,215.93888 1326.3303,189.67491 C 1280.8734,163.41095 1185.9191,114.92362 1140.4622,98.761184 C 1095.0054,82.598743 1018.2338,67.446455 978.83782,62.395693 C 939.44187,57.34493 769.73624,50.273862 717.20831,53.30432 C 664.68037,56.334777 553.56359,65.426151 485.88337,77.547981 C 435.37575,81.588591 323.24881,88.659659 284.86302,92.700269 C 246.47722,96.740879 200.89409,102.80179 200.95723,102.80179 C 171.72593,104.8221 109.09647,121.99469 76.588293,132.59549 L 65.714286,197.28571 L 62.142857,202.28571 C 62.142857,202.28571 58.571429,245.14286 57.142857,252.28571 C 55.714286,259.42857 52.857143,292.28571 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.428571,229.42857 103.57143,233 C 115.71429,236.57143 164.28571,282.28571 185,363.71429 C 205.71429,445.14286 204.28571,457.28571 204.28571,457.28571 L 201.42857,461.57143 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 681.62886,558.00714 711.42857,477.28571 786.42857,488 C 854.22975,497.68587 902.85714,573.71429 910,586.57143 C 908.57143,589.42857 909.28571,589.42857 909.28571,589.42857 C 909.28571,589.42857 962.14286,681.57143 969.28571,751.57143 C 976.42857,821.57143 975,853 975,853 C 975,853 1143.5714,905.14286 1211.4286,915.14286 C 1299.2857,771.57143 1304.2857,768.71429 1304.1963,769.61346 C 1400.0714,766.47202 1597.0512,729.09637 1692.0055,698.7918 C 1786.9599,668.48722 1839.4878,611.91868 1858.6807,580.60395"
+ sodipodi:nodetypes="cscccsssscsccccscssscccsccccssccscccsc"
+ id="path2801" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2854);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 664.28571,423.35714 C 630,406.21428 361.42857,252.28571 325.71429,233.71429 C 290,215.14286 172.85714,145.14286 142.85714,135.14286 C 112.85714,125.14286 96.132704,131.69398 76.588293,132.59549 L 65.714286,197.28571 L 62.142857,202.28571 C 62.142857,202.28571 58.571429,245.14286 57.142857,252.28571 C 55.714286,259.42857 52.857143,292.28571 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.428571,229.42857 103.57143,233 C 115.71429,236.57143 164.28571,282.28571 185,363.71429 C 205.71429,445.14286 204.28571,457.28571 204.28571,457.28571 L 201.42857,461.57143 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 681.62886,558.00714 711.42857,477.28571 786.42857,488 C 854.22975,497.68587 902.85714,573.71429 910,586.57143 C 908.57143,589.42857 909.28571,589.42857 909.28571,589.42857 C 909.28571,589.42857 962.14286,681.57143 969.28571,751.57143 C 976.42857,821.57143 975,853 975,853 C 975,853 1143.5714,905.14286 1211.4286,915.14286 C 1299.2857,771.57143 1304.2857,768.71429 1304.2857,768.71429 L 1252.1429,715.14286 C 1252.1429,715.14286 1067.8571,548 987.85714,498.71429 C 907.85714,449.42857 849.33268,417.77137 818.57143,411.57143 C 757.12842,399.18757 696.88216,394.82973 672.36316,398.77249 C 669.37512,408.00389 664.28571,423.35714 664.28571,423.35714 z "
+ sodipodi:nodetypes="csscccscssscccsccccssccsccccsscc"
+ id="path2973" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3258);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3248"
+ sodipodi:nodetypes="csscccscssscccscc"
+ d="M 665.14286,421.5 C 630.85715,404.35714 362.28571,250.42857 326.57143,231.85715 C 290.85714,213.28572 173.71429,143.28572 143.71429,133.28572 C 113.71429,123.28572 98.505075,132.36222 78.960665,133.26373 L 66.571426,195.42857 L 62.999996,200.42857 C 62.999996,200.42857 59.428576,243.28572 57.999996,250.42857 C 56.571426,257.57143 53.714286,290.42857 60.857146,324 C 57.285716,266.85715 67.999996,251.14286 73.714286,242.57143 C 79.428576,234 92.285716,227.57143 104.42858,231.14286 C 116.57144,234.71429 165.14286,280.42857 185.85715,361.85715 C 206.57144,443.28572 205.14286,455.42857 205.14286,455.42857 L 202.28572,459.71429 L 208.71429,501.14289 C 208.71429,501.14289 310.14285,539.71429 392.28571,583.99999 C 474.42858,628.28569 705.14286,745.42859 705.14286,745.42859 C 627.05373,594.84069 665.0035,569.41479 665.14286,421.5 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2985);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path2976"
+ sodipodi:nodetypes="ccccccccc"
+ d="M 75.23606,243.22315 L 60.164992,238.5404 L 63.170068,201.47441 L 65.123833,198.26601 L 65.979144,197.98959 L 78.999998,132.50002 L 115.71343,132.18931 L 97.999997,215.50002 L 75.23606,243.22315 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2999);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path2965"
+ sodipodi:nodetypes="cssssccsssssssssscsscccssssc"
+ d="M 117.95028,131.82387 C 118.96044,143.94577 118.96979,142.91927 113.91903,148.98017 C 108.86827,155.04107 105.82528,155.05507 105.82528,163.13637 C 105.82528,171.21757 104.8237,181.31457 98.762783,185.35517 C 92.701872,189.39567 92.700282,189.37697 92.700282,193.41767 C 92.700282,197.45827 82.111603,202.51219 80.596379,216.14927 C 102.15149,218.96692 120.15358,226.87465 132.10653,243.94887 C 143.21819,239.90827 139.15808,237.88487 137.13778,231.82387 C 135.11747,225.76297 137.14873,225.74957 139.16903,220.69887 C 141.18933,215.64807 139.15808,217.66597 137.13778,211.60517 C 135.11747,205.54427 151.28467,215.66527 155.32528,206.57387 C 159.3659,197.48257 150.2761,195.44817 161.38778,192.41767 C 172.49946,189.38707 174.51515,186.36767 183.60653,194.44887 C 192.6979,202.53007 206.83939,209.59657 220.98153,216.66767 C 235.12367,223.73867 258.35969,231.82457 270.48153,234.85517 C 282.60336,237.88567 294.72297,233.84567 301.79403,237.88637 C 308.86509,241.92697 303.82845,244.94967 315.95028,247.98017 C 324.91012,250.22007 369.39404,263.24968 435.24677,296.16641 C 404.4122,278.76461 329.19878,237.08445 315.6868,228.67135 C 262.14871,195.33635 190.67601,157.07237 177.54403,151.01137 C 164.41206,144.95047 130.07211,131.82387 117.95028,131.82387 z M 153.54403,177.16767 C 155.24491,177.05947 156.5896,177.32287 157.35653,178.26137 C 149.7542,185.86367 152.56806,190.38397 150.29403,199.48017 C 148.22327,207.76317 141.64769,206.14957 138.16903,201.51137 C 136.45178,199.22167 124.01278,195.89187 124.01278,194.44887 C 124.01278,187.42117 125.91394,181.29257 134.10653,181.29267 C 140.06869,181.29267 148.44138,177.49197 153.54403,177.16767 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3152);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 685.71429,527.57141 C 695.71429,497.57141 730.9746,446.39679 807.03486,462.89842 C 802.74915,424.32702 747.14286,401.85711 747.14286,401.85711 L 675.71429,397.57141 C 675.71429,397.57141 664.28571,410.42861 664.28571,426.14281 C 664.28571,441.85711 662.85714,509.00001 662.85714,509.00001 L 685.71429,527.57141 z "
+ id="path3144"
+ sodipodi:nodetypes="ccccscc" />
+ <path
+ style="opacity:0.56956522;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter3912)"
+ id="path3850"
+ d="M 721.67688,456.86456 C 729.30457,453.42935 737.72355,453.00826 745.85283,451.55583 C 748.01123,452.31667 765.21374,447.8819 756.84996,448.67261 C 756.38575,458.55317 751.28724,445.55918 748.77771,441.88811 C 745.65845,435.95671 742.29659,430.31658 738.09673,425.11953 C 734.77045,421.97746 730.50938,420.36682 726.42252,418.49738 C 714.57034,413.07586 720.69767,396.05939 732.68987,401.16374 L 732.68987,401.16374 C 738.75684,403.74608 744.72407,406.56833 749.74464,410.94576 C 754.9415,416.39336 759.11042,422.53887 762.23822,429.40789 C 768.44893,439.08502 775.13182,445.24087 772.54164,458.10853 C 765.79028,467.62205 759.32448,468.59758 748.32866,469.57403 C 742.02784,470.81009 703.27245,512.99529 697.2797,515.37227 C 692.16919,519.10918 714.84173,460.77048 721.67688,456.86456 z "
+ sodipodi:nodetypes="cccccscccccccc"
+ clip-path="url(#clipPath3918)" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2963);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path2857"
+ sodipodi:nodetypes="cccssccccssc"
+ d="M 696.90625,397.375 C 716.31072,399.15039 730.7816,403.02757 724.08756,414.24651 C 747.87178,417.64391 763.29567,436.9156 769.42747,458.40244 C 784.47414,462.16706 851.21242,454.70446 912.71875,547.46875 C 933.43519,578.71344 951.13573,647.06961 967.29118,659.67127 C 983.40346,672.23925 994.08962,609.51337 1009.375,623.0625 C 1036.9696,640.7111 1085.7096,694.90941 1117,705.0625 C 1169.4389,716.82057 1227.3539,726.23713 1280.2188,744 L 1252.1563,715.15625 C 1252.1562,715.15623 1067.8437,548.00446 987.84375,498.71875 C 907.84377,449.43303 849.32375,417.76244 818.5625,411.5625 C 772.48026,402.2746 727.07461,397.51778 696.90625,397.375 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3011);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 487.2123,108.89615 C 439.26568,111.09441 391.38329,115.92628 344.28114,124.95681 C 336.96091,127.43505 330.58931,131.91334 324.56325,136.56314 C 364.74696,171.77294 403.98097,208.3632 451.13456,233.88525 C 521.94112,275.56005 594.70245,314.22138 669.45346,348.45715 C 706.54686,364.87734 747.03861,370.7207 787.14746,374.61313 C 793.3854,375.23462 799.63181,375.77396 805.87489,376.34372 C 770.04529,320.75944 736.35336,263.76108 696.2648,211.20112 C 671.43459,181.40361 644.97507,152.66792 612.06086,131.70103 C 584.15074,117.98769 552.47933,115.39278 522.06312,110.85314 C 510.49462,109.57466 498.85779,108.74629 487.2123,108.89615 z "
+ id="path3001" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3192);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3184"
+ sodipodi:nodetypes="cssscc"
+ d="M 402.85715,215.14287 C 388.57143,205.14287 344.99997,175.14291 337.85715,172.28573 C 330.71429,169.42853 282.10983,172.87456 268.92244,184.68104 C 261.47206,191.35126 309.60572,206.31147 318.57143,216.57147 C 325.73041,224.76393 325.71429,235.14287 325.71429,235.14287 C 325.71429,235.14287 368.57143,217.99997 402.85715,215.14287 z " />
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 494.9375,104.78125 C 461.60246,104.78125 358.55933,116.91799 346.4375,121.96875 C 334.31567,127.01952 319.15625,140.15625 319.15625,140.15625 C 319.15624,140.15626 379.77902,194.70399 411.09375,217.9375 C 442.40846,241.171 618.66281,335.20635 689.90625,362.12054 C 735.36314,379.29314 814.41316,380.79911 812.39286,380.79911 C 812.39285,380.79912 737.54278,259.00793 713.29911,226.68304 C 689.05546,194.35816 641.39912,136.11168 614.125,125 C 586.85088,113.88832 528.27253,104.78125 494.9375,104.78125 z M 497.0625,111.90625 C 506.75642,112.04153 516.42756,112.77895 526.0625,113.84375 C 556.47871,118.38339 588.15239,120.97416 616.0625,134.6875 C 648.97671,155.65439 675.41982,184.38998 700.25,214.1875 C 703.63285,218.62274 706.95293,223.09864 710.25,227.59375 C 709.11316,230.30784 682.77602,293.60911 675.96875,352.53125 C 675.13851,352.17562 674.29566,351.8348 673.46875,351.46875 C 598.71774,317.23298 525.93157,278.5498 455.125,236.875 C 444.49805,231.12313 434.26704,224.79545 424.34375,218.0625 C 444.27323,174.03577 483.54579,130.27867 497.0625,111.90625 z M 484.65625,112.21875 C 474.51946,123.1227 437.29401,164.90878 416,212.25 C 385.21587,190.30191 357.12398,164.58866 328.5625,139.5625 C 334.58856,134.9127 340.96103,130.44699 348.28125,127.96875 C 393.23692,119.34975 438.90106,114.54918 484.65625,112.21875 z M 716.0625,235.59375 C 749.41739,282.03967 778.8563,331.22286 809.875,379.34375 C 803.63192,378.77399 797.39419,378.24649 791.15625,377.625 C 754.84036,374.10066 718.2297,368.96977 684.09375,355.84375 C 690.00797,305.83151 710.97052,256.43507 716.0625,235.59375 z "
+ sodipodi:nodetypes="cscsssssccccccccccccccccccccc"
+ id="path3270" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 490.9375,101.78125 C 457.60246,101.78125 354.55933,113.91799 342.4375,118.96875 C 330.31567,124.01952 315.15625,137.15625 315.15625,137.15625 C 315.15624,137.15626 375.77902,191.70399 407.09375,214.9375 C 438.40846,238.171 614.66281,336.49206 685.90625,363.40625 C 731.36314,380.57885 823.2703,385.65625 821.25,385.65625 C 821.24999,385.65626 736.39992,250.29364 712.15625,217.96875 C 687.9126,185.64387 637.39912,133.11168 610.125,122 C 582.85088,110.88832 524.27253,101.78125 490.9375,101.78125 z M 493.0625,108.90625 C 502.75642,109.04153 512.42756,109.77895 522.0625,110.84375 C 552.47871,115.38339 584.15239,117.97416 612.0625,131.6875 C 644.97671,152.65439 671.41982,181.38998 696.25,211.1875 C 699.63285,215.62274 702.95293,220.09864 706.25,224.59375 C 705.11316,227.30784 678.77602,290.60911 671.96875,349.53125 C 671.13851,349.17562 670.29566,348.8348 669.46875,348.46875 C 594.71774,314.23298 521.93157,275.5498 451.125,233.875 C 440.49805,228.12313 430.26704,221.79545 420.34375,215.0625 C 440.27323,171.03577 479.54579,127.27867 493.0625,108.90625 z M 480.65625,109.21875 C 470.51946,120.1227 433.29401,161.90878 412,209.25 C 381.21587,187.30191 353.12398,161.58866 324.5625,136.5625 C 330.58856,131.9127 336.96103,127.44699 344.28125,124.96875 C 389.23692,116.34975 434.90106,111.54918 480.65625,109.21875 z M 712.0625,232.59375 C 745.41739,279.03967 774.8563,328.22286 805.875,376.34375 C 799.63192,375.77399 793.39419,375.24649 787.15625,374.625 C 750.84036,371.10066 714.2297,365.96977 680.09375,352.84375 C 686.00797,302.83151 706.97052,253.43507 712.0625,232.59375 z "
+ id="path3053" />
+ <g
+ id="g3134"
+ transform="translate(-10,-1074.286)">
+ <path
+ style="opacity:1;color:black;fill:#76452b;fill-opacity:0.77631579;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 952.57385,1666.5179 L 964.69568,1694.8022 C 964.69568,1694.8022 994.58841,1704.537 1003.0815,1707.9342 C 1018.2338,1713.9952 1043.4876,1703.8936 1043.4876,1703.8936 L 952.57385,1666.5179 z "
+ sodipodi:nodetypes="ccscc"
+ id="path3090" />
+ <path
+ style="opacity:1;color:black;fill:#d17827;fill-opacity:0.77631579;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3092"
+ d="M 956.0625,1670.2188 C 960.19233,1677.1049 962.13721,1684.9727 965.75,1692.0625 C 969.11452,1696.2138 975.70112,1694.9161 980.12825,1697.6204 C 995.4794,1703.1908 1011.5555,1711.0394 1028.1563,1706.375 C 1030.7134,1705.6178 1037.675,1704.642 1037.1563,1703.2188 C 1020.6011,1697.4663 1004.6387,1689.635 988.1997,1683.3083 C 977.52337,1678.9651 966.59327,1674.3794 956.0625,1670.2188 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3140);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3100"
+ d="M 963.34375,1676 C 961.22401,1679.6177 964.66365,1684.3186 965.96875,1688.0938 C 969.26394,1695.2571 978.36466,1693.5937 984.24841,1696.9772 C 997.14095,1701.693 1010.9742,1708.0754 1024.9688,1704.9375 C 1028.8342,1701.44 1022.0874,1699.0432 1019.375,1698.4063 C 1000.9085,1691.0721 982.67631,1682.46 964.00071,1675.9752 L 963.34375,1676 z " />
+ <path
+ sodipodi:cy="1692.2769"
+ sodipodi:type="arc"
+ sodipodi:cx="992.47485"
+ style="opacity:1;color:black;fill:url(#linearGradient3142);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3124"
+ sodipodi:rx="7.5761442"
+ d="M 1000.051 1692.2769 A 7.5761442 4.5456862 0 1 1 984.89871,1692.2769 A 7.5761442 4.5456862 0 1 1 1000.051 1692.2769 z"
+ sodipodi:ry="4.5456862" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3162);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3154"
+ sodipodi:nodetypes="csssscscsscc"
+ d="M 325.50371,235.26855 C 325.50371,235.26855 499.60709,332.18715 515.76953,342.28875 C 531.93197,352.39025 655.17058,421.08065 663.2518,421.08065 C 671.33302,421.08065 680.71429,428.71425 683.57143,424.42855 C 686.42857,420.14285 677.14286,413.00005 683.57143,413.00005 C 690,413.00005 700,410.14285 708.57143,410.85715 C 682.85714,405.14285 690,405.14285 682.85714,405.85715 C 675.71429,406.57145 673.06747,416.91511 666.63889,411.91511 C 660.21032,406.91511 665,403.00005 657.85714,396.57145 C 650.71429,390.14285 591.42857,320.85715 577.14286,313.71425 C 562.85714,306.57145 443.18263,243.8982 407.46834,213.8981 C 358.89691,221.041 326.78572,233.17855 325.50371,235.26855 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3196);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 341.42857,228.00005 C 231.07143,162.82145 182.02366,134.71267 167.98858,135.98859 C 162.26858,136.50859 154.87714,136.63436 147.85714,138.71436 C 165.20537,146.18896 230.32484,179.03195 326.03913,235.46055 C 326.03913,235.46055 324.64286,231.03575 341.42857,228.00005 z "
+ sodipodi:nodetypes="ccccc"
+ id="path3194" />
+ <path
+ style="opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4070)"
+ d="M 314.15745,145.20789 C 300.01531,148.23839 284.86302,150.25869 273.75134,155.30939 C 262.63967,160.36019 241.42646,171.47189 241.42646,171.47189 L 276.81165,189.88479 L 326.27928,170.46169 L 314.15745,145.20789 z "
+ sodipodi:nodetypes="cscccc"
+ id="path3222" />
+ <path
+ style="opacity:0.94782609;color:black;fill:url(#linearGradient3206);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4119)"
+ id="path3198"
+ sodipodi:nodetypes="ccsccsc"
+ d="M 281.14286,192.5715 C 307.33928,189.99763 351.04624,198.41235 378.28572,198.2858 C 360.46198,188.17501 341.57637,182.42027 334.43352,178.13457 C 327.29066,173.84887 328.28572,172.5715 328.28572,172.5715 L 305.42858,164 C 305.42858,164 248.28572,172.5715 254,176.8572 C 259.71429,181.1429 282.57143,194 281.14286,192.5715 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3220);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 316.38881,143.34171 L 380.43346,199.677 C 380.43346,199.677 323.85715,174.57144 308.14286,174.57144 C 292.42858,174.57144 316.38881,143.34171 316.38881,143.34171 z "
+ sodipodi:nodetypes="ccsc"
+ id="path3212" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 316.86447,143.55277 C 306.86447,143.55277 287.71429,148.94155 280.57143,148.94155 C 275.22263,148.94155 209.34077,132.57172 173.91411,135.06808 C 162.30428,135.88617 165.37429,135.73719 165.37429,135.73719 L 146.03715,128.33719 C 146.03715,128.33719 199.14286,113.14289 207.71429,113.14289 C 216.28572,113.14289 222.04221,104.16151 240.61364,107.01871 C 259.18507,109.87581 304.00733,130.69567 316.86447,143.55277 z "
+ sodipodi:nodetypes="cssccssc"
+ id="path3238" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3236);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 294.07695,145.84997 C 265.79267,136.75857 244.57947,134.73827 231.44749,136.75857 C 218.3155,138.77887 208.21398,133.72807 198.11245,133.72807 C 188.01093,133.72807 163.76727,135.74837 163.76727,135.74837 C 163.76727,135.74837 179.92971,140.79917 195.082,147.87027 C 210.23428,154.94127 239.52871,171.10377 239.52871,171.10377 C 239.52871,171.10377 263.77237,156.96157 270.84344,153.93117 C 277.9145,150.90067 296.09725,144.83977 294.07695,145.84997 z "
+ id="path3224" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6b89a2;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3228"
+ sodipodi:nodetypes="cc"
+ d="M 315.84571,144.68857 C 286.75428,147.93427 263.44,157.15717 242.01143,172.15717" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3268);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3260"
+ sodipodi:nodetypes="cccccccccc"
+ d="M 664.28571,423.35714 C 630,406.21428 361.42857,252.28571 325.71429,233.71429 C 210.11211,477.92779 168.54943,473.07191 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.14286,713.71429 L 696.42857,708 L 690.71429,704.42857 C 690.71429,704.42857 680,662.31034 680.71429,616.57143 C 684.07606,583.66932 689.97812,551.14682 701.35097,531.37465 C 677.62453,492.14479 666.70522,466.89564 664.28571,423.35714 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2024);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 235.40172,107.87418 L 137.94474,130.42048 L 85.864752,130.37242 C 112.70742,123.24989 168.02796,105.98041 197.22153,103.80642 C 204.68128,103.12799 223.55473,105.1186 235.40172,107.87418 z "
+ sodipodi:nodetypes="ccccc"
+ id="path2022" />
+ <path
+ style="opacity:0.71111115;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path2911"
+ sodipodi:nodetypes="cc"
+ d="M 688.57143,710.85714 L 204.28571,459.42857" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 201.96428,456.39285 C 201.96428,456.39285 209.03535,459.42331 209.03535,459.42331 C 209.03535,459.42331 215.69326,444.13271 194.97897,362.70414 C 174.26468,281.27556 138.76871,224.10864 103.57143,213.8071 C 80.911886,207.17511 68.469904,224.74546 62.755618,233.31689 C 57.041332,241.88832 51.785714,292.64286 60,325.85714 C 56.428571,268.71429 67.142857,253 72.857143,244.42857 C 78.571429,235.85714 91.151034,230.56322 103.57143,233 C 121.77521,236.57143 162.14285,282.28571 182.85714,363.71429 C 203.57143,445.14286 201.96428,456.39285 201.96428,456.39285 z "
+ sodipodi:nodetypes="ccssscsssc"
+ id="path2964" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#efefef;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 73.23606,244.22315 L 66.164992,226.0404 L 66.670068,219.47441 L 64.144687,199.77644"
+ id="path2980" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#37404e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path2983"
+ d="M 75.23606,243.22315 L 68.164992,225.0404 L 68.670068,218.47441 L 66.144687,198.77644" />
+ <g
+ style="opacity:1;display:inline"
+ id="g3105"
+ transform="translate(-59.41309,-1435.706)">
+ <path
+ style="color:black;fill:url(#linearGradient3136);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path2985"
+ sodipodi:nodetypes="csscscssssc"
+ d="M 1201.4927,1535.7713 C 1157.046,1536.7815 1068.1525,1535.7713 1010.5738,1541.8322 C 952.99516,1547.8932 770.15754,1570.1165 758.03571,1572.1368 C 745.91388,1574.1571 746.92404,1578.1977 749.95449,1581.2282 C 809.55349,1637.7967 923.70073,1807.5024 932.7921,1820.6343 C 941.88348,1833.7663 948.95455,1829.7257 948.95455,1829.7257 C 948.95455,1829.7257 1172.9422,1847.1973 1237.8582,1843.8679 C 1340.1822,1838.6717 1419.6856,1810.5328 1467.1628,1800.4313 C 1514.6399,1790.3298 1552.0156,1752.9541 1531.8126,1733.7612 C 1521.4554,1723.9219 1420.6958,1653.9592 1405.5435,1644.8678 C 1390.3912,1635.7764 1231.7973,1546.883 1201.4927,1535.7713 z " />
+ <path
+ style="color:black;fill:url(#linearGradient3138);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ d="M 766.25989,1588.4609 L 926,1812 L 1178,1754 L 1184,1684 L 766.25989,1588.4609 z "
+ sodipodi:nodetypes="ccccc"
+ id="path3044" />
+ <path
+ style="color:black;fill:url(#linearGradient3141);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path2987"
+ d="M 1453.0625,1704.7813 C 1442.9429,1704.7349 1435.125,1705.375 1432,1706 C 1422,1708 1354,1730 1340,1730 C 1326,1730 1266,1734 1252,1734 C 1238,1734 1190,1718 1176,1716 C 1162,1714 1138,1718 1118,1724 C 1098,1730 1104,1734 1094,1742 C 1084,1750 1060,1752 1060,1752 L 922,1788 C 922.83382,1788.8338 921.93726,1798.7449 921.46875,1810.8438 C 923.57963,1813.9369 926.02664,1817.535 926.78125,1818.625 C 935.87262,1831.757 942.96875,1827.7188 942.96875,1827.7188 C 942.96877,1827.7187 1166.9277,1845.2044 1231.8438,1841.875 C 1334.1678,1836.6788 1413.6791,1808.539 1461.1563,1798.4375 C 1508.6333,1788.336 1546.0155,1750.9429 1525.8125,1731.75 C 1522.6238,1728.7207 1510.8466,1719.99 1495.6563,1709.0938 C 1480.8889,1705.8916 1465.2921,1704.8373 1453.0625,1704.7813 z " />
+ <path
+ style="color:black;fill:#4c75a1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ d="M 1043.3753,1607.2495 C 1110.3746,1638.7505 1241.0441,1666.2137 1339.3753,1689.2495 L 1334,1678 L 1034,1594 L 1043.3753,1607.2495 z "
+ sodipodi:nodetypes="ccccc"
+ id="path2992" />
+ <path
+ style="color:black;fill:#6ea9d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path2994"
+ d="M 1154,1556 L 1024,1564 L 1032,1596 C 1163.8555,1639.7684 1250.8514,1659.3815 1336,1678 L 1322,1626 L 1154,1556 z M 1372,1650 L 1384,1686 L 1446,1704 L 1372,1650 z "
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="color:black;fill:url(#linearGradient3143);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1201.4927,1535.7713 C 1157.046,1536.7815 1068.1525,1535.7713 1010.5738,1541.8322 C 1201.0479,1637.8143 1308.2698,1670.0197 1467.1628,1800.4313 C 1514.6399,1790.3298 1552.0156,1752.9541 1531.8126,1733.7612 C 1521.4554,1723.9219 1420.6958,1653.9592 1405.5435,1644.8678 C 1390.3912,1635.7764 1231.7973,1546.883 1201.4927,1535.7713 z "
+ sodipodi:nodetypes="cccssc"
+ id="path3008" />
+ <path
+ style="color:black;fill:#184177;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path3040"
+ d="M 1086,1566 C 1068,1566 1014,1568 1002,1572 C 990,1576 986,1584 994,1594 C 1002,1604 1018,1608 1032,1608 C 1046,1608 1106,1610 1110,1600 C 1114,1590 1112,1576 1102,1570 C 1092,1564 1086,1564 1086,1566 z " />
+ <path
+ style="color:black;fill:#1a4680;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path3042"
+ d="M 802,1590 C 816,1588 870,1584 870,1584 L 860,1624 C 860,1624 832,1632 828,1624 C 824,1616 798,1590 802,1590 z " />
+ <path
+ style="color:black;fill:url(#linearGradient3145);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path3054"
+ d="M 1086,1748 C 1098,1750 1170,1792 1188,1810 C 1206,1828 1216,1838 1216,1838 C 1216,1838 1186,1786 1162,1766 C 1138,1746 1120,1728 1112,1728 C 1104,1728 1086,1752 1086,1748 z " />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2944);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.85526315;visibility:visible;display:inline;overflow:visible"
+ d="M 405.66291,214.21444 C 405.66291,214.21444 436.97763,237.44794 405.6886,214.32151 C 405.71429,214.42857 330.23183,229.19675 325.71429,233.71429 C 320,239.42857 295,292.28571 295,292.28571"
+ id="path2924" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2960);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.85526315;visibility:visible;display:inline;overflow:visible"
+ id="path2928"
+ sodipodi:nodetypes="csssc"
+ d="M 310.71428,303 C 312.14285,316.57143 320.71428,348.71429 328.57143,378 C 336.42857,407.28571 368.92857,490.14286 372.14285,495.67857 C 373.97171,498.82827 364.46428,514.25 364.46428,518.53571 C 364.46428,522.82142 374.28572,545.85714 374.28572,545.85714" />
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:0.30263157;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1142.1875,99.750032 C 1097.7408,100.76023 1008.8599,99.751632 951.2812,105.81253 C 893.70262,111.87353 710.87183,134.10473 698.75,136.12503 C 686.62817,138.14543 687.6258,142.18833 690.65625,145.21883 C 750.25527,201.78733 864.40863,371.49313 873.5,384.62503 C 882.59136,397.75703 889.65625,393.71883 889.65625,393.71883 C 889.65627,393.71873 1113.6465,411.17313 1178.5625,407.84383 C 1280.8866,402.64753 1360.3978,374.50783 1407.875,364.40633 C 1455.3521,354.30483 1492.7343,316.94293 1472.5313,297.75003 C 1462.174,287.91063 1361.4023,217.93523 1346.25,208.84383 C 1331.0978,199.75233 1172.4921,110.86173 1142.1875,99.750032 z M 1158.1875,110.81253 C 1201.5324,130.30313 1239.0798,151.33873 1280.625,174.46883 C 1344.1639,207.05073 1403.1865,247.21713 1460.625,289.62503 C 1465.7201,295.19363 1459.3367,303.65383 1461.75,311.40633 C 1455.5213,326.68703 1440.0107,335.79223 1425.375,341.96883 C 1404.6546,348.96473 1383.0983,353.82113 1361.9688,359.65633 C 1305.2556,374.08683 1247.8693,387.80073 1189.25,390.93753 C 1091.1562,394.69503 993.346,383.78543 895.53125,378.25003 C 889.18828,379.82653 886.5665,373.84663 883.15625,369.81253 C 829.6456,295.32933 779.53599,217.81223 717.34375,150.09383 C 765.92012,143.17733 815.62684,137.89733 864.71875,131.96883 C 950.1476,118.94013 1036.8226,111.07603 1123.1875,110.93753 C 1128.1875,110.89583 1153.1875,110.85423 1158.1875,110.81253 z "
+ id="path2993" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path2744"
+ id="use4125"
+ style="filter:url(#filter4139)" />
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:0.1842105;fill-rule:evenodd;stroke:none;stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 481.24773,109.96447 C 435.34721,112.28647 389.53367,117.0681 344.43523,125.71447 C 337.11499,128.19271 330.74254,132.65842 324.71648,137.30822 C 353.08617,162.16634 380.98495,187.7046 411.52898,209.55822 C 413.09557,206.34504 414.77574,203.13089 416.49773,199.93322 C 394.90233,186.48643 374.10949,169.1597 360.15398,155.90197 C 365.15398,145.18769 370.86379,140.16536 384.43523,127.30822 C 409.94324,123.3839 445.52563,121.86778 471.65398,121.08947 C 475.42332,116.61121 478.70818,112.82887 481.24773,109.96447 z M 713.12273,234.58947 C 705.71323,258.8358 686.01622,309.31718 679.62273,353.37072 C 713.92701,366.66493 750.78553,371.82612 787.31023,375.37072 C 793.54817,375.99221 799.7859,376.51971 806.02898,377.08947 C 775.28355,329.39251 746.1125,280.67101 713.12273,234.58947 z M 717.31023,260.90197 C 718.02452,260.18768 743.02449,298.73679 782.31023,362.30822 C 735.88166,357.30822 692.31021,342.30822 692.31023,342.30822 C 692.31023,342.30822 703.0245,289.47339 717.31023,260.90197 z "
+ id="path3024" />
+ <g
+ id="g3639">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3288);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3280"
+ sodipodi:nodetypes="csscsccsc"
+ d="M 544.28571,615.14286 C 502.85714,590.85714 445.71429,549.42857 421.42857,533.71429 C 397.14286,518 368.57143,493.71429 354.28571,479.42857 C 340,465.14286 317.14286,445.14286 312.85714,435.14286 C 290,446.57143 297.14286,456.57143 295.71429,462.28571 C 294.28571,468 291.42857,472.28571 291.42857,472.28571 L 218.57143,436.57143 C 218.57143,436.57143 348.57143,509.42857 364.28571,518 C 380,526.57143 548.57143,619.42857 544.28571,615.14286 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3310);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3302"
+ d="M 291.89344,471.33463 C 256.17916,395.62034 254.28571,382.28571 245.71429,353.71429 C 237.14286,325.14286 222.85714,286.57143 220,259.42857"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="opacity:0.53913043;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3343);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3466"
+ d="M 162.63456,229.06071 L 467.70063,378.56329" />
+ <path
+ style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3313"
+ d="M 220.21325,257.35513 C 230.31478,301.80185 245.5406,343.25376 250.73194,363.42115 C 257.61909,390.17647 287.84328,458.35575 292.89404,469.46743 C 301.91998,453.44571 313.14729,436.15213 313.14729,436.15213 C 313.14729,436.15213 284.86302,376.55313 278.8021,352.30947 C 272.74119,328.06581 261.62951,279.57849 261.62951,279.57849 L 220.21325,257.35513 z "
+ sodipodi:nodetypes="csccscc" />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 277.22995,287.19347 C 278.76005,305.9259 289.25026,344.10569 297.33148,366.87002 C 304.29823,386.49495 305.81009,407.50891 322.16687,447.61044 C 316.43155,441.448 317.20277,442.83451 311.71872,435.43784 C 296.94896,410.89831 283.43445,375.83884 277.37353,351.59518 C 271.31262,327.35152 260.20094,278.8642 260.20094,278.8642 L 277.22995,287.19347 z "
+ sodipodi:nodetypes="csccscc"
+ id="path3469" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3074);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35526315;visibility:visible;display:inline;overflow:visible"
+ id="path3066"
+ d="M 313.9554,436.75824 C 323.14779,448.77906 344.36099,470.69937 348.60363,474.2349 C 352.84627,477.77043 371.23105,495.4481 371.23105,495.4481 L 347.18942,438.87956 L 302.64169,416.25215 L 313.9554,436.75824 z " />
+ <path
+ d="M 163.5275,231.29306 L 557.77109,424.49853"
+ id="path3000"
+ style="opacity:0.41304345;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3919);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3915)"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="csc"
+ d="M 289.9752,471.33463 C 254.26092,395.62034 252.36747,382.28571 243.79605,353.71429 C 235.22462,325.14286 220.9389,286.57143 218.08176,259.42857"
+ id="path3986"
+ style="opacity:0.38260869;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4012);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4008)" />
+ <path
+ style="opacity:0.10869565;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4016);stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4022)"
+ id="path4014"
+ d="M 329.55771,453.04593 C 307.89786,393.24881 295.66955,355.75004 284.73154,290.88513"
+ sodipodi:nodetypes="cc" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path3280"
+ id="use4143"
+ style="filter:url(#filter4161);opacity:0.9173913" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient2922);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path2914"
+ sodipodi:nodetypes="ccsccc"
+ d="M 205,473 L 207.85714,503 C 207.85714,503 309.28571,541.57143 391.42857,585.85714 C 473.57143,630.14286 704.28571,747.28571 704.28571,747.28571 L 692.85715,720.85715 L 205,473 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3028);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3013"
+ sodipodi:nodetypes="ccsccccc"
+ d="M 761.55397,401.40291 L 756.60423,379.4826 C 756.60423,379.4826 697.20726,370.99732 688.01487,366.75468 C 678.82248,362.51204 577.70621,315.84299 577.70621,315.84299 L 594.67678,383.72524 L 662.55903,422.61611 L 673.16563,398.57448 C 673.16563,398.57448 723.37021,397.16027 761.55397,401.40291 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.45394736;visibility:visible;display:inline;overflow:visible"
+ d="M 687.94679,365.35343 C 616.70335,338.43924 438.99996,236.8964 407.68524,213.6629 C 407.68524,213.6629 330.23183,229.19675 325.71429,233.71429 C 320,239.42857 295,292.28571 295,292.28571 C 295,292.28571 296.42857,295.14286 312.85714,302.28571 C 314.28571,315.85714 322.85714,348.71429 330.71429,378 C 338.57143,407.28571 373.57143,493.71429 374.28571,497.28571 C 375,500.85714 366.42857,513.71429 366.42857,518 C 366.42857,522.28571 377.14286,548 377.14286,548 L 675.71429,701.57143 C 675.71429,701.57143 668.57143,697.28571 668.57143,693 C 668.57143,688.71429 665.71429,625.85714 663.57143,573.71429 C 661.42857,521.57143 662.16391,437.14531 664.28571,423 C 666.42857,408.71429 687.94679,365.35343 687.94679,365.35343 z "
+ id="path1897" />
+ <g
+ style="opacity:1;display:inline"
+ id="g3159"
+ transform="translate(-2.641884,-561.5901)">
+ <path
+ style="color:black;fill:url(#linearGradient3177);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3089"
+ sodipodi:nodetypes="ccscccccccccsccsccsz"
+ d="M 819.54383,974.21723 C 783.31746,965.09822 758.63736,962.71531 730.75908,961.06724 C 776.39437,962.12044 815.84589,943.8445 823.55086,945.3846 C 844.20909,949.5138 884.75481,954.5533 884.75481,954.5533 C 884.75481,954.5533 1131.232,968.6954 1177.699,974.7563 C 1184.7701,978.7969 1184.7701,978.7969 1184.7701,978.7969 L 1190.831,972.736 C 1190.831,972.736 1415.0849,948.4924 1484.7854,918.1878 C 1489.8362,917.1776 1491.8565,917.1776 1491.8565,917.1776 L 1491.8565,913.137 C 1491.8565,913.137 1538.3235,871.7208 1492.8666,851.5177 C 1481.7549,845.4568 1481.7549,845.4568 1481.7549,845.4568 C 1481.7549,845.4568 1560.9961,861.62723 1608.024,886.8731 C 1655.011,912.097 1762.7716,997.9632 1831.982,1094.0769 C 1831.982,1094.0769 1845.2796,1109.9603 1857.8342,1140.9051 C 1838.3388,1171.7361 1785.8109,1228.3046 1690.8565,1258.6092 C 1595.9022,1288.9138 1398.9224,1326.2894 1303.0473,1329.4309 L 1250.9939,1274.9603 C 1250.9939,1274.9603 1066.7081,1107.8174 986.70821,1058.5317 C 906.70821,1009.246 855.10484,983.16875 819.54383,974.21723 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3179);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3109"
+ d="M 1178,978 C 1178,978 1264,1060 1280,1080 C 1296,1100 1354,1176 1376,1210" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3181);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1178,978 C 1178,978 1264,1060 1280,1080 C 1296,1100 1354,1176 1376,1210 L 1374,1208 C 1374,1208 1218,1136 1168,1110 C 1118,1084 927.99997,956 927.99997,956 C 927.99997,956 1142,970 1178,978 z "
+ sodipodi:nodetypes="csccscc"
+ id="path3119" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3183);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1488,915 C 1488,915 1600.7516,975.6995 1622,990 C 1678.3886,1027.9505 1718.2001,1046.9778 1738,1080 C 1738,1080 1530,1074 1480,1048 C 1430,1022 1291.8654,960.62692 1291.8654,960.62692 C 1291.8654,960.62692 1452,928 1488,915 z "
+ sodipodi:nodetypes="cscscc"
+ id="path3129" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#7a99d9;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3133"
+ d="M 1492,916 C 1526,930 1688,1014 1794,1122" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3185);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1492,912 C 1526,926 1688,1010 1794,1118"
+ id="path3137" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3875);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1516,876 C 1573,887 1622,924 1668,972 C 1714,1020 1724,1041 1730,1050 C 1736,1059 1742,1072 1751,1080 C 1760,1088 1775,1117 1776,1129 C 1777,1141 1777,1149 1777,1149 L 1787,1142 C 1787,1142 1786,1154 1791,1162 C 1796,1170 1809,1174 1812,1174 C 1815,1174 1791,1194 1782,1203 C 1773,1212 1749,1224 1738,1225 C 1727,1226 1716,1238 1709,1242 C 1702,1246 1688,1245 1680,1245 C 1672,1245 1669,1251 1660,1251 C 1651,1251 1662,1249 1646,1249 C 1630,1249 1598,1259 1586,1259 C 1574,1259 1557,1256 1551,1256 C 1545,1256 1521,1270 1507,1270 C 1493,1270 1477,1263 1458,1263 C 1439,1263 1382,1274 1362,1280 C 1342,1286 1278.6891,1304.0674 1278.6891,1304.0674 L 1305.04,1326.08 C 1305.04,1326.08 1456.08,1318.48 1534,1300 C 1561.8628,1293.3919 1700.8868,1257.7496 1725,1247 C 1757.84,1232.36 1798.32,1208.72 1824,1182.5 C 1839.3459,1166.8314 1853.28,1151.44 1859,1140 C 1859,1140 1837.2311,1103.6399 1831.4,1095.64 C 1802.04,1055.36 1754.371,1007.035 1729.28,982.52 C 1699.4373,953.35054 1644.3563,910.269 1610.6323,890.47078 C 1594.7053,881.12058 1565.1202,868.00854 1530.1031,858.49311 C 1533.1031,866.49311 1532,864.83848 1532,864.83848 L 1498,851 C 1498,851 1517,866 1516,876 z "
+ sodipodi:nodetypes="cssssccsssssssssssssccssscssscccc"
+ id="path3149" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path3149"
+ id="use3857"
+ style="filter:url(#filter3871)" />
+ <path
+ id="path2946"
+ sodipodi:nodetypes="csssssssssccsss"
+ d="M 1738,1225 C 1727,1226 1716,1238 1709,1242 C 1702,1246 1688,1245 1680,1245 C 1672,1245 1669,1251 1660,1251 C 1651,1251 1662,1249 1646,1249 C 1630,1249 1598,1259 1586,1259 C 1574,1259 1557,1256 1551,1256 C 1545,1256 1521,1270 1507,1270 C 1493,1270 1477,1263 1458,1263 C 1439,1263 1382,1274 1362,1280 C 1342,1286 1280,1303.9326 1280,1303.9326 L 1302.9726,1330.2149 C 1302.9726,1330.2149 1456.08,1318.48 1534,1300 C 1561.8628,1293.3919 1700.8868,1257.7496 1725,1247 C 1757.84,1232.36 1749,1224 1738,1225 z "
+ style="opacity:1;color:black;fill:url(#linearGradient2949);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3182);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3166"
+ d="M 909.13729,592.69532 L 941.46217,594.71563 L 953.584,624.01005 L 991.9698,638.15219 C 991.9698,638.15219 1011.1627,641.18264 1019.2439,638.15219 C 1027.3251,635.12173 1031.3657,632.09127 1031.3657,632.09127 L 1250.5689,718.96439 C 1250.5689,718.96439 1366.7364,711.89332 1395.0207,706.84256 C 1395.0207,706.84256 1588.97,679.56844 1656.6502,652.29432 C 1724.3304,625.0202 1791.0005,586.63441 1805.1426,575.52273 C 1819.2847,564.41105 1831.4066,536.12678 1831.4066,536.12678" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.36842107;visibility:visible;display:inline;overflow:visible"
+ d="M 909.13729,589.69532 L 941.46217,591.71563 L 953.584,621.01005 L 991.9698,635.15219 C 991.9698,635.15219 1011.1627,638.18264 1019.2439,635.15219 C 1027.3251,632.12173 1031.3657,629.09127 1031.3657,629.09127 L 1250.5689,715.96439 C 1250.5689,715.96439 1366.7364,708.89332 1395.0207,703.84256 C 1395.0207,703.84256 1588.97,676.56844 1656.6502,649.29432 C 1724.3304,622.0202 1791.0005,583.63441 1805.1426,572.52273 C 1819.2847,561.41105 1831.4066,533.12678 1831.4066,533.12678"
+ id="path3190" />
+ <path
+ style="opacity:1;color:black;fill:#9fbbf1;fill-opacity:1;fill-rule:evenodd;stroke:#89a2db;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3010"
+ sodipodi:nodetypes="csc"
+ d="M 820.95094,386.55367 C 810.34434,395.74606 782.76718,400.13237 765.79661,398.01105 C 748.82605,395.88973 725.49153,396.45317 715.59203,374.53286" />
+ <g
+ style="opacity:1;display:inline"
+ id="g3138"
+ transform="translate(-26,12)">
+ <path
+ style="opacity:1;color:black;fill:#0d1021;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3134"
+ sodipodi:nodetypes="cscsc"
+ d="M 1634.4173,588.01711 C 1639.4239,593.82868 1666.7798,620.28293 1673.2523,616.79474 C 1679.7248,613.30654 1662.33,580.60468 1657.8802,576.24443 C 1652.2167,574.50034 1646.1487,574.50034 1642.9125,575.80841 C 1639.6762,577.11647 1633.3559,582.92805 1634.4173,588.01711 z " />
+ <path
+ style="opacity:1;color:black;fill:#c0c6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1636.2504,587.33066 C 1641.029,592.83866 1667.1394,617.91103 1673.3173,614.60505 C 1679.4951,611.29906 1662.8922,580.30543 1658.645,576.17295 C 1653.2394,574.51996 1647.4477,574.51996 1644.3588,575.7597 C 1641.2698,576.99944 1635.2373,582.50744 1636.2504,587.33066 z "
+ sodipodi:nodetypes="cscsc"
+ id="path3130" />
+ <path
+ style="opacity:1;color:black;fill:#494d83;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3132"
+ sodipodi:nodetypes="cscsc"
+ d="M 1641.0142,590.19024 C 1645.109,594.68633 1667.483,615.15244 1672.7768,612.45383 C 1678.0705,609.75521 1663.8435,584.45568 1660.2041,581.08242 C 1655.5721,579.7331 1650.6092,579.7331 1647.9623,580.74508 C 1645.3154,581.75706 1640.1461,586.25314 1641.0142,590.19024 z " />
+ <path
+ style="opacity:1;color:black;fill:#ebf0e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3136"
+ d="M 1656.0489,585.98123 C 1650.6163,588.06746 1655.2132,591.40541 1655.631,595.16063 C 1656.0489,598.91584 1656.0489,604.75728 1658.9742,604.34003 C 1661.8994,603.92279 1659.8099,597.6641 1661.8994,597.24686 C 1663.9889,596.8296 1670.6753,599.33309 1668.1679,595.99512 C 1665.6604,592.65716 1662.7353,591.40541 1660.2279,588.4847 C 1657.7204,585.56398 1655.2132,585.56398 1656.0489,585.98123 z " />
+ </g>
+ <g
+ style="opacity:1;display:inline"
+ id="g3324"
+ transform="translate(-210.08,-960.96)">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3340);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1187.4623,1436.4484 C 1194.5334,1440.489 1333.4293,1545.5449 1348.5816,1557.6667 C 1363.7338,1569.7885 1467.7796,1661.7124 1476.8709,1672.8241 C 1555.6628,1670.8038 1606.1705,1662.7226 1606.1705,1662.7226 C 1606.1705,1662.7226 1478.8912,1563.7276 1441.5156,1539.4839 C 1404.14,1515.2403 1325.3481,1466.753 1315.2465,1460.692 C 1305.145,1454.6311 1281.9115,1446.5499 1271.81,1445.5398 C 1261.7084,1444.5296 1187.4623,1436.4484 1187.4623,1436.4484 z "
+ sodipodi:nodetypes="csccsssc"
+ id="path3155" />
+ <path
+ style="opacity:1;color:black;fill:#202c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1422.333,1622.4002 C 1453.3979,1650.0085 1472.8742,1665.7815 1477.7376,1671.7257 C 1556.5295,1669.7053 1598.9295,1663.1027 1605.5481,1662.3673 C 1605.5481,1662.3673 1579.6649,1640.958 1543.2124,1613.2078 C 1543.2124,1613.2078 1559.6435,1626.8251 1551.5542,1627.1928 L 1442.7745,1632.732 C 1433.9499,1633.8351 1422.333,1622.4002 1422.333,1622.4002 z "
+ sodipodi:nodetypes="ccccccc"
+ id="path3165" />
+ <path
+ id="path2951"
+ sodipodi:nodetypes="csccsssc"
+ d="M 1187.4623,1436.4484 C 1194.5334,1440.489 1333.4293,1545.5449 1348.5816,1557.6667 C 1363.7338,1569.7885 1467.7796,1661.7124 1476.8709,1672.8241 C 1555.6628,1670.8038 1606.1705,1662.7226 1606.1705,1662.7226 C 1606.1705,1662.7226 1478.8912,1563.7276 1441.5156,1539.4839 C 1404.14,1515.2403 1325.3481,1466.753 1315.2465,1460.692 C 1305.145,1454.6311 1281.9115,1446.5499 1271.81,1445.5398 C 1261.7084,1444.5296 1187.4623,1436.4484 1187.4623,1436.4484 z "
+ style="opacity:1;color:black;fill:url(#linearGradient3844);fill-opacity:1.0;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3342);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1193.92,1438.16 C 1206.4,1448.56 1277.12,1498.48 1306.24,1520.32 C 1335.36,1542.16 1432.08,1626.4 1432.08,1626.4"
+ sodipodi:nodetypes="csc"
+ id="path3180" />
+ <g
+ clip-path="url(#clipPath3321)"
+ transform="translate(216.32,-62.4)"
+ id="g3305">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3344);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1052.3445,1512.1827 L 997.92562,1511.4474 L 1006.0149,1549.6877 L 1052.3445,1512.1827 z "
+ sodipodi:nodetypes="cccc"
+ id="path3301" />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3346);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3348);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3271"
+ sodipodi:nodetypes="csccsc"
+ d="M 1101.6157,1537.9215 C 1101.6157,1553.3647 1101.6157,1567.3371 1087.6432,1567.3371 C 1073.6709,1567.3371 1014.8396,1547.4816 1014.8396,1547.4816 L 1022.9289,1529.8322 C 1022.9289,1529.8322 1017.7901,1514.2279 1044.2553,1513.6536 C 1068.5286,1513.1269 1088.3786,1529.8322 1101.6157,1537.9215 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3350);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1035.7458,1514.1206 C 1050.2085,1515.4979 1059.0099,1518.066 1059.0099,1533.9061 C 1059.0099,1549.7461 1050.7455,1554.567 1050.7455,1554.567 L 1022.9291,1527.8945 C 1022.9291,1527.8945 1024.2597,1514.8092 1035.7458,1514.1206 z "
+ sodipodi:nodetypes="csccc"
+ id="path3289" />
+ <path
+ transform="matrix(0.818861,0,0,0.818861,108.7186,219.3779)"
+ sodipodi:cy="1611.8282"
+ sodipodi:type="arc"
+ sodipodi:cx="1141.6946"
+ style="opacity:1;color:black;fill:url(#radialGradient3352);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3291"
+ sodipodi:rx="18.752472"
+ d="M 1160.4471 1611.8282 A 18.752472 23.164818 0 1 1 1122.9421,1611.8282 A 18.752472 23.164818 0 1 1 1160.4471 1611.8282 z"
+ sodipodi:ry="23.164818" />
+ <path
+ transform="matrix(1.330649,0,0,1.541385,-556.0913,-957.7293)"
+ sodipodi:cy="1616.2406"
+ sodipodi:type="arc"
+ sodipodi:cx="1206.0413"
+ style="opacity:1;color:black;fill:url(#radialGradient3354);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3293"
+ sodipodi:rx="5.8831282"
+ d="M 1211.9244 1616.2406 A 5.8831282 6.250824 0 1 1 1200.1581,1616.2406 A 5.8831282 6.250824 0 1 1 1211.9244 1616.2406 z"
+ sodipodi:ry="6.250824" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3356);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1136.9145,1571.014 L 1032.489,1544.54 L 1090.5849,1608.519 L 1136.9145,1571.014 z "
+ id="path3259" />
+ <path
+ inkscape:transform-center-y="-16.160042"
+ transform="matrix(1.093875,0,0.39879,0.998849,-751.9213,1.854308)"
+ sodipodi:cy="1611.0929"
+ sodipodi:type="arc"
+ sodipodi:cx="1143.1654"
+ style="opacity:1;color:black;fill:url(#radialGradient5012);fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient3360);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ inkscape:transform-center-x="-66.767625"
+ id="path3199"
+ sodipodi:rx="34.931072"
+ d="M 1178.0965 1611.0929 A 34.931072 39.343422 0 1 1 1108.2343,1611.0929 A 34.931072 39.343422 0 1 1 1178.0965 1611.0929 z"
+ sodipodi:ry="39.343422" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3362);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1106.0282,1580.5742 C 1121.4714,1582.0449 1145.0039,1587.9281 1145.0039,1604.8421 C 1145.0039,1621.7561 1136.1792,1626.9038 1136.1792,1626.9038 L 1099.4097,1595.282 C 1099.4097,1595.282 1101.6158,1581.3095 1106.0282,1580.5742 z "
+ id="path3249" />
+ <path
+ transform="translate(-14.70782,-0.735389)"
+ sodipodi:cy="1611.8282"
+ sodipodi:type="arc"
+ sodipodi:cx="1141.6946"
+ style="opacity:1;color:black;fill:url(#radialGradient3364);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3227"
+ sodipodi:rx="18.752472"
+ d="M 1160.4471 1611.8282 A 18.752472 23.164818 0 1 1 1122.9421,1611.8282 A 18.752472 23.164818 0 1 1 1160.4471 1611.8282 z"
+ sodipodi:ry="23.164818" />
+ <path
+ transform="matrix(1.625,0,0,1.882353,-826.5795,-1438.229)"
+ sodipodi:cy="1616.2406"
+ sodipodi:type="arc"
+ sodipodi:cx="1206.0413"
+ style="opacity:1;color:black;fill:url(#radialGradient3366);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3239"
+ sodipodi:rx="5.8831282"
+ d="M 1211.9244 1616.2406 A 5.8831282 6.250824 0 1 1 1200.1581,1616.2406 A 5.8831282 6.250824 0 1 1 1211.9244 1616.2406 z"
+ sodipodi:ry="6.250824" />
+ <path
+ style="fill:url(#linearGradient5008);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 1139.4511,548.07893 C 1133.2012,545.73519 1052.342,525.81334 1052.342,525.81334 C 1052.342,525.81334 1105.0763,563.70391 1105.0763,563.70391 C 1109.6261,555.79874 1116.2816,546.34848 1139.4511,548.07893 z "
+ id="path5000"
+ transform="translate(-6.24,1023.36)"
+ sodipodi:nodetypes="ccsc" />
+ <path
+ sodipodi:nodetypes="ccsc"
+ transform="translate(-6.24,1023.36)"
+ id="path5014"
+ d="M 1139.4511,548.07893 C 1133.2012,545.73519 1052.342,525.81334 1052.342,525.81334 C 1052.342,525.81334 1105.0763,563.70391 1105.0763,563.70391 C 1109.6261,555.79874 1116.2816,546.34848 1139.4511,548.07893 z "
+ style="fill:url(#linearGradient5022);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.53043478" />
+ </g>
+ <path
+ style="opacity:0.53043476;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5154);enable-background:accumulate"
+ id="path5120"
+ d="M 1260.6097,709.68561 C 1257.6313,704.30499 1239.4961,688.30688 1234.577,684.7353 C 1228.2945,680.6957 1222.9763,679.17553 1224.0869,670.89591 C 1229.2219,665.71476 1236.5969,667.5455 1243.1906,667.69223 C 1249.4113,667.46897 1255.5898,667.91808 1261.7893,668.32645 C 1267.6422,669.15685 1273.5001,668.84644 1279.3758,668.57004 C 1285.2286,668.33741 1291.0871,668.40966 1296.9426,668.44226 C 1303.0974,668.32722 1309.116,667.17398 1315.1554,666.12154 C 1321.2855,664.59528 1327.4489,665.08165 1333.6472,665.66824 C 1339.4381,666.36866 1345.0483,664.5506 1350.7503,665.85513 C 1356.0675,668.54094 1361.4074,671.31639 1366.4208,674.54242 C 1368.9944,676.18397 1380.7414,685.76626 1382.8034,687.97895 C 1384.7121,690.02703 1372.4913,685.70059 1370.5986,683.63778 L 1395.266,701.22932 C 1393.4024,699.19824 1366.8843,679.56838 1364.5526,678.04932 C 1359.8751,674.95511 1354.7869,672.47209 1349.8852,669.75235 C 1344.3862,669.14513 1338.8855,669.99885 1333.2771,669.61947 C 1327.3648,669.05538 1321.5066,668.56124 1315.6556,670.03526 C 1309.4299,671.14148 1303.2094,672.27139 1296.864,672.40329 C 1291.0632,672.37703 1285.259,672.3107 1279.4613,672.54699 C 1273.4672,672.80913 1267.4891,673.12262 1261.5222,672.25095 C 1255.3642,671.87067 1249.2292,671.43545 1243.0526,671.64262 C 1237.7859,671.51322 1232.0143,670.11783 1227.418,673.07591 C 1228.1031,674.37246 1231.8653,679.74443 1236.5843,681.30791 C 1241.7547,685.04603 1246.2248,689.19799 1249.3066,694.8863 C 1250.6351,697.33819 1261.9602,712.12539 1260.6097,709.68561 z "
+ transform="matrix(0.932847,-2.173754e-2,2.173754e-2,0.932847,282.4787,1035.819)"
+ sodipodi:nodetypes="cccccccccccsccccccccccccsc" />
+ <path
+ style="opacity:0.53043476;color:black;fill:#2f5586;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter5194)"
+ id="path5164"
+ d="M 1405.28,1598.9689 C 1408.5084,1603.5631 1412.5544,1607.5013 1417.0856,1610.7914 C 1421.5033,1614.403 1426.0316,1617.8695 1430.4945,1621.4221 C 1434.8239,1625.8799 1438.1193,1627.7707 1444.3084,1627.4335 C 1450.4682,1626.3484 1456.653,1626.1557 1462.8803,1626.0455 C 1468.7654,1625.8212 1527.2793,1627.0102 1533.149,1627.3891 C 1535.9556,1627.5702 1483.0042,1630.7045 1480.198,1630.5183 L 1480.198,1630.5183 C 1474.4214,1630.135 1487.0152,1627.2823 1481.223,1627.493 C 1475.0342,1627.6316 1450.5006,1630.2885 1444.3804,1631.3774 C 1437.4396,1631.7493 1433.1059,1629.754 1428.3131,1624.7551 C 1423.9114,1621.2114 1419.3929,1617.815 1415.0452,1614.201 C 1410.1759,1610.6946 1388.3146,1590.6488 1384.7734,1585.7857 C 1383.1077,1583.4985 1403.6531,1596.6538 1405.28,1598.9689 z "
+ sodipodi:nodetypes="cccccsccccccsc" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2753);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 218.2913,105.33514 C 221.37881,104.86014 244.52449,105.13105 249.0731,104.59612 C 286.777,100.16207 368.65601,93.953045 394.90498,90.67193 C 424.32062,86.99497 471.38564,81.11185 486.09346,81.11185 C 500.80128,81.11185 540.5124,81.11185 552.27865,82.58263 C 564.04491,84.05341 571.39882,106.85053 541.98318,103.90897 C 512.56754,100.9674 486.09346,101.70279 466.2379,102.43819 C 446.38235,103.17358 352.2523,114.20444 345.63378,117.14601 C 339.01526,120.08757 314.74735,136.26617 314.74735,136.26617 L 405.93585,213.11453 C 405.93585,213.11453 325.04283,150.2386 311.0704,139.20774 C 297.09797,128.17687 261.06381,113.46905 255.91607,111.26288 C 250.76834,109.0567 217.55591,105.33514 218.2913,105.33514 z "
+ sodipodi:nodetypes="csssssssccssc"
+ id="path2744" />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient2993);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 624.9099,362.64482 C 624.09528,371.41246 616.44404,377.72566 606.63474,377.19246 C 606.63474,377.19246 598.87477,378.0361 604.58709,382.60576 C 621.10593,395.82025 658.50309,402.80443 666.47502,413.26303 C 669.6844,405.24161 670.24637,402.3972 671.50922,400.269 C 675.26049,393.94718 653.17204,375.81556 624.9099,362.64482 z "
+ id="path2977"
+ sodipodi:nodetypes="ccscsc"
+ transform="matrix(1.017743,0,0,0.97895,-11.88466,7.633765)" />
+ <g
+ id="g3114">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3091);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 610.23313,317.25719 C 610.23313,317.25719 598.91942,359.6836 596.7981,366.75467 C 594.67678,373.82573 601.04074,381.60391 605.99049,383.01812 C 610.94024,384.43233 622.25395,384.43233 626.49659,373.11863 C 630.73923,361.80492 636.39608,313.01455 636.39608,313.01455 L 610.23313,317.25719 z "
+ sodipodi:nodetypes="cssscc"
+ id="path3043" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3088);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3047"
+ d="M 630.03213,315.84298 C 626.49659,325.03537 623.66816,333.52065 619.42552,336.34908 C 615.18288,339.17751 607.40471,352.61254 607.40471,348.3699 C 607.40471,344.12726 607.40471,341.29883 601.04075,340.59172 C 594.67679,339.88461 516.89504,332.10644 508.40976,329.27801 C 499.92448,326.44959 487.90367,313.01456 487.90367,309.47902 C 487.90367,305.94349 630.03213,316.55009 630.03213,315.84298 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3083);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 487.82661,309.06261 C 487.82661,309.06261 612.78264,315.54446 620.56082,315.54446 C 628.33899,315.54446 637.10319,315.84299 637.10319,310.18613 C 637.10319,304.52928 633.56766,291.09425 627.2037,284.73029 C 620.83974,278.36633 603.16207,268.46684 589.72704,268.46684 C 576.29201,268.46684 526.08743,267.75973 511.9453,276.95212 C 497.80316,286.1445 488.53372,294.21337 487.82661,309.06261 z "
+ sodipodi:nodetypes="csssssc"
+ id="path3057" />
+ <path
+ style="opacity:0.23043478;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4877);enable-background:accumulate"
+ id="path4827"
+ d="M 672.07967,364.71084 C 670.42546,367.09722 667.6541,367.90897 665.12408,369.03759 C 661.84684,370.84217 658.86544,373.12904 655.77552,375.23387 C 652.90706,376.82391 650.61188,381.34386 647.23238,380.84 C 645.2797,383.53727 641.40304,382.52314 638.35458,383.56296 C 635.0111,383.653 632.64311,384.42579 629.47719,384.25502 C 626.47028,384.38201 623.38674,382.77046 621.49606,380.48683 C 621.21102,380.15219 620.92599,379.81754 620.64095,379.4829 C 610.74633,367.8662 616.36466,345.22463 624.35511,358.22478 L 624.35511,358.22478 C 624.59646,358.61746 624.83782,359.01014 625.07918,359.40282 C 626.83581,361.71888 628.11608,362.94479 631.22893,362.78295 C 634.30209,362.79263 636.3171,363.77923 639.57541,362.89681 C 642.51192,362.74924 645.52592,360.42208 647.93092,361.13382 C 650.1124,358.71938 653.49086,358.40258 656.108,356.28295 C 659.2285,354.04751 662.60734,352.15958 665.42704,349.54001 C 667.55521,347.38156 669.52413,345.01154 671.97224,343.20794 C 684.21379,334.18921 680.74194,352.21452 672.07967,364.71084 z "
+ transform="matrix(1,0,-0.718026,1,264.3032,6)" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3659);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 451.35998,84.08005 C 497.11997,79.92005 533.51997,83.04005 556.39997,86.16005 C 579.27997,89.28005 623.99997,102.80005 623.99997,102.80005 C 623.99997,102.80005 867.35996,80.960049 893.35995,83.040049 C 919.35995,85.120049 1013.9999,102.28005 1013.9999,102.28005 L 1143.9999,99.68005 C 1117.9999,90.32005 1070.9668,79.065394 1029.5999,70.56005 C 973.95995,59.12005 892.31996,56.52005 857.99996,54.96005 C 826.76296,53.540186 744.63996,49.76005 711.35996,52.88005 C 678.07997,56.00005 548.07997,67.44005 523.11997,71.60005 C 498.15997,75.76005 450.31998,84.08005 451.35998,84.08005 z "
+ sodipodi:nodetypes="cscsccssssc"
+ id="path3651" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3648);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;"
+ d="M 689.79677,145.09086 C 686.11982,133.72341 690.53216,113.83034 695.6799,108.14662 C 700.82764,102.46288 885.41078,20.048761 917.76799,5.8394101 C 950.12519,-8.3699012 1064.1108,-31.104839 1069.9939,-31.104839 C 1075.8771,-31.104839 1089.8495,-39.630427 1070.7293,-59.523501 C 1051.6092,-79.416577 980.27622,-122.04455 949.3898,-133.41204 C 918.50338,-144.77949 892.76469,-161.8307 883.20461,-164.67256 C 873.64453,-167.51443 849.37662,-187.40746 838.34576,-178.88188 C 827.31489,-170.35629 807.45934,-133.41204 819.96098,-130.57014 C 832.46263,-127.72828 857.46592,-122.04455 847.90584,-119.20269 C 838.34576,-116.36083 750.83423,-87.942164 732.44945,-82.258439 C 714.06468,-76.574675 633.17167,-22.579252 622.1408,-22.579252 C 660.38114,37.099974 683.17825,113.83034 689.79677,145.09086 z "
+ sodipodi:nodetypes="csssssssssscc"
+ id="path3640"
+ transform="matrix(1,0,0,0.255782,0,107.9793)" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3670);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 538.71997,84.080047 C 552.23997,75.760047 582.39997,71.600048 602.15997,69.520048 C 621.91997,67.440048 683.27997,63.280048 683.27997,63.280048 L 629.19997,59.120048 C 629.19997,59.120048 555.35997,66.400048 528.31997,70.560048 C 501.27997,74.720048 457.59998,83.040047 457.59998,83.040047 C 457.59998,83.040047 515.83997,82.000047 538.71997,84.080047 z "
+ id="path3662" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3680);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 315.48275,142.88469 L 355.99906,187.62087 L 376.8879,197.67132 L 400.42041,214.21762 L 407.03893,213.48222 L 315.48275,142.88469 z "
+ sodipodi:nodetypes="cccccc"
+ id="path3672" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3694);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 79.039996,133.48004 C 96.719995,131.92004 107.63999,131.40004 118.03999,131.92004 C 128.43999,132.44004 151.05999,140.50004 151.05999,140.50004 L 167.69999,137.12004 C 167.69999,137.12004 152.87999,128.28004 137.79999,127.24004 C 122.71999,126.20004 107.63999,124.12004 99.839995,126.20004 C 92.039995,128.28004 79.039996,133.48004 79.039996,133.48004 z "
+ sodipodi:nodetypes="csccssc"
+ id="path3686" />
+ <path
+ style="opacity:1;color:black;fill:#a4b0ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 186.15999,105.92005 C 210.68921,105.43701 222.94616,105.66005 242.70616,105.40005 C 292.01695,101.36622 366.07998,93.440047 366.07998,93.440047 L 458.63998,82.000047 L 485.67998,77.840047 C 485.67998,77.840047 395.28036,82.546991 355.67998,85.855438 C 314.6892,89.280047 201.75999,101.76005 186.15999,105.92005 z "
+ sodipodi:nodetypes="cccccsc"
+ id="path3699" />
+ <path
+ style="opacity:1;color:black;fill:#7a8cbd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3701"
+ sodipodi:nodetypes="cccccsc"
+ d="M 186.15999,105.92005 C 210.13767,104.15008 207.4268,102.49544 229.57141,103.40927 C 278.8822,97.295437 362.77072,89.395396 362.77072,89.395396 L 458.63998,82.000047 L 485.67998,77.840047 C 485.67998,77.840047 395.28036,82.546991 355.67998,85.855438 C 314.6892,89.280047 201.75999,101.76005 186.15999,105.92005 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3721);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 240.75999,171.44004 C 268.31999,184.44004 312.51999,209.92004 327.33998,219.28004"
+ sodipodi:nodetypes="cc"
+ id="path3705" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3731);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1322.9685,950.34403 C 1283.2573,940.04855 1211.9244,915.04526 1211.9244,915.04526 C 1211.9244,915.04526 1057.4923,875.33414 975.12849,850.33085 C 985.42396,878.27571 991.30709,887.1004 991.30709,887.1004 C 991.30709,887.1004 1209.7182,938.57777 1322.9685,950.34403 z "
+ sodipodi:nodetypes="ccccc"
+ id="path3723" />
+ <path
+ style="opacity:1;color:black;fill:#201e2b;fill-opacity:0.73026315;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1360.3199,219.28004 C 1384.2399,239.04004 1400.8799,247.36004 1410.2399,259.84004 C 1419.5999,272.32004 1431.0399,286.88004 1445.5999,298.32003 C 1460.1599,309.76003 1475.7599,323.28003 1475.7599,323.28003 C 1475.7599,323.28003 1486.1599,309.76003 1476.7999,301.44003 C 1467.4399,293.12004 1374.8799,226.56004 1360.3199,219.28004 z "
+ id="path2273" />
+ <path
+ style="opacity:1;color:black;fill:#201e2b;fill-opacity:0.73026315;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1452.8799,283.76004 C 1438.3199,306.64003 1397.7599,325.36003 1377.9999,333.68003 C 1358.2399,342.00003 1198.0799,372.16003 1176.2399,372.16003 C 1154.3999,372.16003 880.87996,369.04003 880.87996,369.04003 L 896.47996,392.96003 C 896.47996,392.96003 1138.7999,410.64003 1173.1199,406.48003 C 1207.4399,402.32003 1407.1199,370.08003 1422.7199,363.84003 C 1438.3199,357.60003 1462.2399,343.04003 1467.4399,337.84003 C 1472.6399,332.64003 1487.1999,309.76003 1477.8399,302.48003 C 1468.4799,295.20004 1452.8799,283.76004 1452.8799,283.76004 z "
+ sodipodi:nodetypes="cssccssssc"
+ id="path3167" />
+ <g
+ style="display:inline"
+ id="g3224">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3178);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3170"
+ sodipodi:nodetypes="ccssscsccccsc"
+ d="M 1496.5599,303.00003 C 1488.7599,297.80003 1478.3599,291.04003 1478.3599,291.04003 C 1478.3599,291.04003 1486.6799,308.72003 1484.0799,318.08003 C 1481.4799,327.44003 1462.2399,346.68003 1454.4399,351.88003 C 1446.6399,357.08003 1424.2799,365.40003 1411.7999,371.12003 C 1400.2112,376.43153 1312.9999,396.60003 1312.9999,396.60003 C 1312.9999,396.60003 1409.7199,382.04003 1426.8799,376.32003 C 1444.0399,370.60003 1486.1599,356.56003 1486.1599,356.56003 L 1490.3199,358.12003 L 1492.3999,353.44003 L 1507.9999,336.80003 C 1507.9999,336.80003 1503.8399,332.12003 1501.7599,325.36003 C 1499.6799,318.60003 1496.5599,303.00003 1496.5599,303.00003 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3181"
+ sodipodi:nodetypes="cssc"
+ d="M 1480.3199,293.08003 C 1484.4799,304.52003 1485.5199,319.08003 1481.3599,326.36003 C 1477.1999,333.64003 1466.2799,346.64003 1450.1599,354.96003 C 1434.0399,363.28003 1374.2399,381.22003 1350.8399,386.42003" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3203);stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3183"
+ sodipodi:nodetypes="cssc"
+ d="M 1479.3999,292.56003 C 1483.5599,304.00003 1482.5199,319.08003 1478.3599,326.36003 C 1474.1999,333.64003 1463.2799,346.64003 1447.1599,354.96003 C 1431.0399,363.28003 1373.3199,381.22003 1349.9199,386.42003" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3237);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3205"
+ sodipodi:nodetypes="ccsccc"
+ d="M 1496.0399,302.48003 C 1495.5199,312.88003 1506.7761,338.48079 1506.7761,338.48079 C 1506.7761,338.48079 1513.7199,331.08003 1513.7199,323.80003 C 1513.7199,316.52003 1512.5646,314.59233 1512.5646,314.59233 L 1500.1999,302.48003 L 1496.0399,302.48003 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3210"
+ d="M 1513.7199,320.68003 C 1513.7199,310.28003 1511.6399,303.52003 1507.4799,299.88003 C 1503.3199,296.24003 1485.1199,289.48003 1485.1199,289.48003 L 1502.7999,299.88003 L 1500.1999,304.04003 L 1513.7199,320.68003 z " />
+ </g>
+ <g
+ style="display:inline"
+ id="g3285">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3275);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3273"
+ d="M 1492.1084,342.17566 C 1471.8851,336.66022 1436.5864,334.82174 1428.1294,335.55714 C 1419.6724,336.29253 1377.3874,345.11722 1375.5489,346.22031 C 1373.7104,347.32339 1365.6211,359.45734 1365.6211,359.45734 L 1350.9133,356.51578 L 1350.9133,342.54335 C 1350.9133,342.54335 1436.5864,327.46783 1442.4695,327.46783 C 1448.3526,327.46783 1494.3145,336.66022 1494.3145,336.66022 L 1492.1084,342.17566 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3240"
+ sodipodi:nodetypes="cccssscsscc"
+ d="M 1503.3199,338.36003 C 1494.7399,333.42003 1465.6199,323.28003 1454.1799,323.28003 C 1445.3399,318.08003 1448.7199,320.68003 1448.7199,320.68003 C 1448.7199,320.68003 1427.9268,321.95005 1405.0104,325.60107 C 1379.3059,329.69629 1351.0643,336.25021 1349.1399,336.80003 C 1347.3633,337.30762 1347.0996,340.16875 1350.7559,342.96511 C 1354.5909,345.89819 1362.3999,348.76003 1362.3999,348.76003 C 1362.3999,348.76003 1381.3799,337.06003 1398.5399,334.98003 C 1415.6999,332.90003 1453.9199,329.52003 1466.3999,331.60003 C 1478.8799,333.68003 1492.9199,342.52003 1492.9199,342.52003 L 1503.3199,338.36003 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3242"
+ sodipodi:nodetypes="cssccccsscscsc"
+ d="M 1494.4799,342.26003 C 1471.5999,334.98003 1448.7199,333.16003 1438.3199,333.68003 C 1427.9199,334.20003 1377.9999,342.52003 1374.8799,344.60003 C 1371.7599,346.68003 1364.9999,358.64003 1364.9999,358.64003 L 1353.5599,355.52003 L 1349.3999,360.20003 L 1369.1599,363.32003 C 1369.1599,363.32003 1372.7999,349.28003 1379.5599,347.72003 C 1386.3199,346.16003 1423.2399,337.32003 1430.5199,337.84003 C 1437.7999,338.36003 1448.7199,338.88003 1448.7199,338.88003 C 1448.7199,338.88003 1452.3599,342.52003 1454.9599,342.52003 C 1457.5599,342.52003 1460.6799,339.92003 1460.6799,339.92003 C 1460.6799,339.92003 1472.1199,341.48003 1475.2399,344.08003 C 1478.3599,346.68003 1493.9599,343.30003 1494.4799,342.26003 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3271);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3269"
+ d="M 1353.1195,351.73574 C 1353.8549,347.69109 1349.8102,337.39561 1346.8686,337.39561 C 1343.9271,337.39561 1343.9271,341.44026 1339.8824,341.44026 C 1335.8378,341.44026 1301.2744,344.01413 1298.3328,342.91105 C 1295.3913,341.80796 1295.3913,340.70487 1290.6112,340.70487 C 1285.8312,340.70487 1282.5219,343.27874 1281.0512,343.27874 C 1279.5804,343.27874 1280.3158,346.22031 1275.5357,346.22031 C 1270.7557,346.22031 1140.9592,356.88348 1139.1207,359.08965 C 1137.2822,361.29582 1131.3991,370.8559 1135.076,370.8559 C 1138.753,370.8559 1353.4872,352.83882 1353.1195,351.73574 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3244"
+ d="M 1354.0799,349.80003 C 1349.9199,346.16003 1346.7999,344.60003 1340.5599,349.28003 C 1330.1599,350.84003 1300.5199,351.88003 1300.5199,351.88003 C 1300.5199,351.88003 1298.4399,348.24003 1295.3199,348.24003 C 1292.1999,348.24003 1289.0799,351.88003 1289.0799,351.88003 C 1289.0799,351.88003 1289.5999,348.24003 1285.4399,348.24003 C 1281.2799,348.24003 1275.5599,353.44003 1275.5599,353.44003 L 1136.1999,367.48003 L 1133.5999,373.72003 L 1269.8399,363.32003 L 1351.4799,357.08003 L 1354.0799,349.80003 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3246"
+ sodipodi:nodetypes="ccssssccccssssc"
+ d="M 1428.4399,373.20003 C 1412.8399,374.24003 1387.3599,382.04003 1368.1199,380.48003 C 1305.7199,387.76003 1279.1999,392.96003 1267.7599,395.04003 C 1256.3199,397.12003 1236.5599,400.24003 1226.1599,398.16003 C 1215.7599,396.08003 1173.1199,377.36003 1163.2399,375.80003 C 1153.3599,374.24003 1136.1999,371.64003 1125.7999,371.64003 C 1115.3999,371.64003 1077.6999,363.84003 1077.6999,363.84003 L 1060.7999,370.60003 L 879.62457,366.85999 L 876.71996,377.88003 C 876.71996,377.88003 1076.3999,377.36003 1097.7199,378.92003 C 1119.0399,380.48003 1165.8399,383.08003 1177.7999,387.76003 C 1189.7599,392.44003 1219.9199,405.96003 1227.1999,405.44003 C 1234.4799,404.92003 1313.5199,395.56003 1333.2799,393.48003 C 1353.0399,391.40003 1428.9599,373.72003 1428.4399,373.20003 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3250"
+ d="M 1060.7999,382.56003 C 1093.0399,384.64003 1140.3599,385.68003 1150.2399,390.88003 C 1160.1199,396.08003 1169.9999,404.40003 1179.8799,404.92003 C 1189.7599,405.44003 1168.9599,408.04003 1159.5999,405.44003 C 1150.2399,402.84003 1139.3199,395.56003 1130.4799,395.56003 C 1121.6399,395.56003 1077.9599,393.48003 1072.7599,390.88003 C 1067.5599,388.28003 1061.8399,382.56003 1060.7999,382.56003 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3263);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3252"
+ d="M 1447.6172,320.48162 C 1436.5864,323.05549 1417.8339,325.62936 1414.8923,325.26166 C 1411.9508,324.89397 1357.8995,337.76331 1355.6933,337.76331 C 1353.4872,337.76331 1347.9717,339.23409 1347.9717,339.23409 L 1346.1333,334.82174 C 1346.1333,334.82174 1348.7071,331.14479 1352.0164,330.4094 C 1355.3256,329.67401 1398.7137,317.54006 1401.6553,317.54006 C 1404.5968,317.54006 1442.1018,314.59849 1442.1018,314.59849 L 1447.6172,320.48162 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3267);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3265"
+ d="M 1446.8818,320.11392 L 1451.2942,324.15858 C 1451.2942,324.15858 1473.7236,327.83553 1482.5483,330.0417 C 1491.373,332.24788 1503.8746,339.23409 1503.8746,339.23409 L 1506.8162,335.92483 C 1506.8162,335.92483 1482.5483,327.10014 1476.2975,325.99705 C 1470.0466,324.89397 1457.1773,322.68779 1453.868,321.58471 C 1450.5588,320.48162 1446.8818,319.37853 1446.8818,320.11392 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3277"
+ d="M 1458.0799,343.56003 C 1446.6399,345.12003 1421.6799,346.68003 1421.6799,346.68003 L 1411.2799,338.36003 C 1411.2799,338.36003 1383.1999,342.00003 1377.4799,344.60003 C 1371.7599,347.20003 1353.5599,355.52003 1353.5599,355.52003 L 1347.8399,360.72003 L 1333.2799,360.72003 L 1327.5599,365.40003 L 1295.3199,367.48003 L 1298.4399,357.08003 L 1267.2399,360.20003 L 1280.2399,375.28003 L 1330.1599,370.60003 C 1330.1599,370.60003 1329.6399,374.24003 1333.7999,374.76003 C 1337.9599,375.28003 1350.9599,374.24003 1356.1599,374.24003 C 1361.3599,374.24003 1405.0399,366.96003 1410.7599,366.44003 C 1416.4799,365.92003 1457.0399,345.64003 1458.0799,343.56003 z " />
+ <path
+ style="opacity:1;color:black;fill:#0e0d13;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3279"
+ d="M 1188.1999,370.08003 C 1203.2799,370.60003 1250.0799,375.28003 1254.2399,377.36003 C 1258.3999,379.44003 1259.4399,388.28003 1259.4399,388.28003 C 1259.4399,388.28003 1228.7599,395.04003 1221.9999,393.48003 C 1215.2399,391.92003 1155.4399,371.12003 1155.4399,371.12003 L 1188.1999,370.08003 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3283);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3281"
+ sodipodi:nodetypes="cccccssscccccc"
+ d="M 1132.5022,366.44356 C 1119.2651,364.97278 1088.3787,362.7666 1088.3787,362.7666 L 1081.0248,356.88348 L 1066.317,357.61887 L 1060.4338,362.03121 C 1060.4338,362.03121 939.09433,359.08965 916.29721,359.08965 C 893.50009,359.08965 884.67539,359.08965 882.46922,362.03121 C 880.26305,364.97277 876.58609,368.64973 880.26305,370.12051 C 883.94,371.5913 1064.1108,370.85591 1064.1108,370.85591 L 1072.2001,367.17895 L 1084.7017,367.17895 L 1090.5849,370.85591 L 1137.6499,373.79747 L 1132.5022,366.44356 z " />
+ </g>
+ <path
+ style="color:black;fill:url(#linearGradient3411);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1496.5599,904.12001 L 1491.3599,853.68001 L 1246.9599,905.16001 L 1323.9199,940.52 L 1496.5599,904.12001 z "
+ id="path3288" />
+ <path
+ style="color:black;fill:#100f15;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1522.0399,780.88001 L 1473.1599,889.04001 C 1473.1599,889.04001 1336.3999,917.12 1323.9199,917.12 C 1311.4399,917.12 1270.3599,914 1270.3599,914 L 1230.8399,901.00001 L 1309.8799,774.64001 L 1522.0399,780.88001 z "
+ sodipodi:nodetypes="ccscccc"
+ id="path3202" />
+ <path
+ style="color:black;fill:url(#linearGradient3407);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1810.1199,713.80001 L 1766.4399,762.68001 L 1784.6399,779.32001 L 1832.4799,730.96001 L 1832.4799,720.56001 L 1810.1199,713.80001 z "
+ id="path3217" />
+ <path
+ style="color:black;fill:url(#linearGradient3404);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1825.7199,688.32002 C 1831.9599,698.20002 1832.4799,726.28001 1830.9199,730.96001 C 1829.3599,735.64001 1810.1199,719.00001 1810.1199,719.00001 L 1825.7199,688.32002 z "
+ sodipodi:nodetypes="cscc"
+ id="path3206" />
+ <path
+ style="color:black;fill:#222537;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1549.0799,777.24001 L 1522.5599,846.40001 L 1484.5999,859.92001 L 1521.5199,778.80001 L 1549.0799,777.24001 z "
+ sodipodi:nodetypes="ccccc"
+ id="path3284" />
+ <path
+ style="color:black;fill:url(#linearGradient3400);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1754.9999,751.76001 L 1784.6399,779.32001 C 1784.6399,779.32001 1732.1199,817.28001 1717.5599,825.60001 C 1702.9999,833.92001 1599.5199,879.68001 1594.3199,881.24001 C 1589.1199,882.80001 1496.0399,908.80001 1496.0399,908.80001 L 1489.7999,857.84001 L 1520.9999,847.44001 C 1520.9999,847.44001 1545.9599,869.80001 1555.8399,866.68001 L 1748.2399,781.92001 C 1756.0399,777.24001 1754.9999,751.76001 1754.9999,751.76001 z "
+ sodipodi:nodetypes="ccsscccccc"
+ id="path3230" />
+ <path
+ id="path3258"
+ d="M 1754.4799,760.60916 C 1754.4799,760.60916 1750.3199,779.84916 1749.2799,784.52916 C 1748.2399,789.20916 1744.5999,793.36916 1736.2799,797.52916 C 1727.9599,801.68916 1569.8799,872.40916 1562.0799,872.92916 C 1554.2799,873.44916 1545.9599,875.52916 1542.3199,871.88916 C 1538.6799,868.24916 1520.9999,855.76916 1520.9999,855.76916 L 1754.4799,760.60916 z "
+ style="opacity:0.91739131;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4914)"
+ transform="matrix(1.041323,0,0,1.079015,-62.85208,-69.7474)" />
+ <path
+ style="color:black;fill:#100f15;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1857.9599,591.60002 C 1855.8799,607.20002 1834.0399,665.96002 1831.4399,673.24002 C 1828.8399,680.52002 1814.7999,717.44001 1814.7999,717.44001 C 1814.7999,717.44001 1786.1999,751.76001 1767.4799,763.72001 C 1750.8399,753.84001 1754.9999,752.80001 1754.9999,752.80001 L 1761.7599,693.52002 L 1857.9599,591.60002 z "
+ sodipodi:nodetypes="csccccc"
+ id="path3204" />
+ <path
+ style="color:black;fill:url(#linearGradient3415);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1546.4799,775.68001 L 1518.3999,846.40001 L 1550.6399,870.32001 L 1752.3999,779.84001 L 1763.3199,708.60001 L 1759.1599,696.12002 L 1554.2799,776.20001 L 1546.4799,775.68001 z "
+ sodipodi:nodetypes="cccccccc"
+ id="path3286" />
+ <path
+ style="opacity:1;color:black;fill:#12131d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1544.3999,780.88001 L 1517.8799,845.88001 L 1551.6799,870.32001 L 1559.9999,770.48001 L 1544.3999,780.88001 z "
+ id="path3413" />
+ <path
+ style="color:black;fill:url(#linearGradient3389);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3312"
+ sodipodi:nodetypes="cscccsccccsscssscsccc"
+ d="M 1858.6807,580.60395 C 1837.9278,610.87868 1786.4399,665.88722 1691.4855,696.1918 C 1596.5312,726.49637 1397.8652,764.63354 1301.9007,768.67415 C 1219.0682,897.97367 1221.2744,896.78169 1211.1729,915.97459 C 1316.2288,954.3604 1284.3241,945.63264 1323.2998,949.3096 C 1323.2998,949.3096 1583.9192,910.92383 1679.8837,852.33498 C 1775.8482,793.74613 1799.0817,779.604 1833.4269,733.13698 C 1833.4269,694.75119 1827.1801,679.50192 1827.1801,679.50192 L 1824.7921,686.2053 C 1824.7921,686.2053 1831.4066,702.83241 1829.3863,730.10652 C 1785.9497,777.58369 1782.9192,788.69537 1670.7923,845.26391 C 1558.6654,901.83246 1338.8092,931.7186 1328.7077,932.7288 C 1318.6062,933.7389 1245.5181,900.8223 1245.5181,900.8223 C 1245.5181,900.8223 1238.447,895.77154 1245.5181,885.67002 C 1252.5892,875.56849 1305.1171,796.77659 1307.1374,791.72583 C 1309.1577,786.67507 1315.2186,780.61415 1326.3303,781.6243 C 1337.442,782.63446 1540.4826,781.6243 1540.4826,781.6243 C 1540.4826,781.6243 1650.5893,756.37049 1693.0157,736.16744 C 1735.4421,715.96439 1780.8989,689.70042 1780.8989,689.70042 C 1780.8989,689.70042 1850.5995,607.87807 1857.6705,596.76639 C 1861.7111,580.60395 1858.6807,581.6141 1858.6807,580.60395 z " />
+ <path
+ style="color:black;fill:url(#linearGradient3380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1543.3599,863.04001 L 1520.9999,846.40001 L 1486.1599,857.84001 L 1472.6399,887.48001 L 1543.3599,863.04001 z "
+ sodipodi:nodetypes="ccccc"
+ id="path3274" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3367);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1753.4399,718.48001 L 1745.1199,773.60001 L 1580.7999,844.32001 L 1589.1199,781.92001 L 1753.4399,718.48001 z "
+ id="path3358" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3377);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3369"
+ sodipodi:nodetypes="ccccc"
+ d="M 1574.0045,786.13598 L 1566.4199,850.81607 L 1580.7999,844.32001 L 1589.1199,781.92001 L 1574.0045,786.13598 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3425);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1489.9022,861.36171 C 1489.9022,861.36171 1499.4623,899.60205 1492.1084,903.279 C 1484.7545,906.95596 1531.0841,892.98353 1531.0841,892.98353 L 1509.0224,856.21398 L 1489.9022,861.36171 z "
+ id="path3417" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3481);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1473.6799,292.60003 C 1477.3199,290.52003 1480.4399,291.56003 1483.5599,293.64003 C 1486.6799,295.72003 1494.9999,301.96003 1494.9999,301.96003 L 1504.3599,301.44003 C 1504.3599,301.44003 1397.7599,232.80004 1388.3999,227.60004 C 1379.0399,222.40004 1286.9999,166.76004 1278.1599,162.60004 C 1269.3199,158.44004 1186.1199,116.62465 1176.7599,112.46465 C 1167.3999,108.30465 1129.6021,95.514632 1129.6021,95.514632 C 1129.6021,95.514632 1214.7199,132.44004 1225.1199,138.16004 C 1235.5199,143.88004 1319.7599,190.68004 1329.1199,195.88004 C 1338.4799,201.08004 1413.3599,251.00004 1420.6399,255.68004 C 1427.9199,260.36004 1473.6799,292.60003 1473.6799,292.60003 z "
+ sodipodi:nodetypes="csccssscsssc"
+ id="path3471" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3489);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1475.2399,292.08003 C 1474.7199,294.68003 1477.3199,303.00003 1477.3199,303.00003 C 1477.3199,303.00003 1426.8799,266.08004 1417.5199,258.28004 C 1408.1599,250.48004 1293.6299,180.02004 1283.2299,173.26004 C 1272.8299,166.50004 1172.1872,114.82406 1127.8799,95.52004 C 1142.3701,100.02183 1173.5183,113.47569 1189.4237,120.63234 C 1216.9739,133.02854 1299.7457,177.23751 1351.8476,210.07234 C 1362.9509,217.06966 1475.7599,292.60003 1475.2399,292.08003 z "
+ sodipodi:nodetypes="ccsscssc"
+ id="path3473" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3501);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1485.6399,294.68003 L 1495.5199,302.74003 L 1501.7599,305.34003 L 1505.3999,300.66003 L 1488.4999,290.52003 L 1485.6399,294.68003 z "
+ id="path3493" />
+ <g
+ id="g3524">
+ <path
+ style="color:black;fill:url(#linearGradient3510);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3430"
+ d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z " />
+ <path
+ style="color:black;fill:url(#linearGradient3507);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3440"
+ sodipodi:nodetypes="cccscc"
+ d="M 1363.4399,212.52004 C 1358.7599,202.12004 1350.6999,189.38004 1340.5599,185.22004 C 1347.0599,186.00004 1346.7999,186.52004 1350.6999,189.12004 C 1350.6999,189.12004 1368.3799,204.20004 1371.4999,209.40004 C 1374.6199,214.60004 1375.9199,219.80004 1375.9199,219.80004 L 1363.4399,212.52004 z " />
+ <path
+ style="color:black;fill:url(#linearGradient3504);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z "
+ id="path3450" />
+ <path
+ style="color:black;fill:url(#linearGradient3522);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3520"
+ d="M 1324.4399,188.60004 C 1332.2399,183.92004 1338.4799,184.96004 1343.6799,186.00004 C 1348.8799,187.04004 1367.5999,198.48004 1371.7599,203.16004 C 1375.9199,207.84004 1379.0399,214.08004 1377.9999,216.68004 C 1376.9599,219.28004 1376.4399,220.32004 1376.4399,220.32004 L 1324.4399,188.60004 z " />
+ </g>
+ <g
+ style="opacity:1;display:inline"
+ id="g3610"
+ transform="translate(50,0)">
+ <path
+ style="opacity:1;color:black;fill:#1d1a2f;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 1595.9588,373.84137 L 1589.4953,350.56353 C 1643.1377,389.45686 1723.127,460.2671 1777.626,533.33599 C 1777.1209,533.84106 1765.4843,556.84949 1755.4026,568.31252 C 1755.4026,568.31252 1697.0302,458.84137 1595.9588,373.84137 z "
+ sodipodi:nodetypes="cccsc"
+ id="path3600" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3618);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3543"
+ d="M 1713.0313,458.53125 L 1696.1875,479.59375 C 1713.2501,501.66495 1726.8181,521.63941 1736.6563,537.03125 L 1758.1563,508.59375 C 1743.9913,491.44477 1728.7149,474.64744 1713.0313,458.53125 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3530"
+ d="M 1628.4063,380.71875 L 1626.375,401.28125 C 1658.3763,432.14635 1684.9703,464.2647 1705.5625,492 C 1713.2991,496.18976 1722.4132,500.14931 1725.2188,497.34375 C 1727.8055,494.75703 1729.459,485.49122 1730.4688,476.90625 C 1697.2378,440.8052 1660.8438,407.36778 1628.4063,380.71875 z " />
+ <path
+ style="opacity:1;color:black;fill:#506485;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3622);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path3564"
+ d="M 1625.9561,398.80076 L 1626.6915,381.88677 L 1594.3343,369.38512 L 1625.9561,398.80076 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3624);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path3590"
+ d="M 1624.9999,382.56003 L 1611.9999,385.68003 L 1596.3999,371.12003 L 1624.9999,382.56003 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3626);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path3606"
+ d="M 1587.4799,349.28003 L 1594.2399,366.96003 L 1631.1599,385.16003 C 1631.1599,385.16003 1604.1199,361.24003 1587.4799,349.28003 z " />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#292531;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 306.65805,271.57812 C 338.27987,287.75672 358.59115,294.40654 356.84849,308.34767 C 356.1131,314.2308 353.90692,320.11393 353.90692,320.11393"
+ sodipodi:nodetypes="csc"
+ id="path3647" />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient3672);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3670);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path3649"
+ sodipodi:nodetypes="ccscc"
+ d="M 295.99489,293.27215 L 304.45188,272.68121 C 336.0737,288.85981 357.12037,293.67115 355.37771,307.61228 C 354.64232,313.49541 352.43614,318.64315 352.43614,318.64315 L 352.2523,318.27545" />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.49342107;visibility:visible;display:inline;overflow:visible"
+ d="M 883.88348,393.72573 C 882.87332,405.84756 881.86317,415.94908 881.86317,415.94908 C 881.86317,415.94908 881.86317,424.0303 893.985,431.10137 C 906.10683,438.17244 970.48587,471.41454 977.55694,475.45515"
+ id="path2850"
+ sodipodi:nodetypes="ccss" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3737"
+ d="M 886.51578,393.35803 C 885.50562,405.47986 884.12778,415.21369 884.12778,415.21369 C 884.12778,415.21369 882.657,421.82413 894.77883,428.8952 C 906.90066,435.96627 972.38278,469.94376 979.45385,473.98437"
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3753);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:1;color:black;fill:#7b6c69;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible;filter:url(#filter4382)"
+ id="path3424"
+ d="M 796.91629,519.29625 C 774.88799,519.36309 755.14159,533.70664 744.29124,552.17125 C 726.5769,581.5909 721.62479,616.57722 720.32249,650.3275 C 729.55311,601.29909 739.33496,539.6491 808.55376,547.80836 C 884.45036,556.75478 912.62913,637.71705 929.38499,695.9525 C 926.38479,643.06364 906.55029,589.39343 867.07249,552.73375 C 849.07199,536.47244 827.32319,521.73935 802.57249,519.3275 C 800.68969,519.23667 798.80019,519.24332 796.91629,519.29625 z "
+ sodipodi:nodetypes="cccscccc"
+ transform="matrix(1,0,-6.65908e-2,0.916762,36.4609,43.22222)" />
+ <path
+ sodipodi:nodetypes="cccscccc"
+ d="M 143.30141,264.49705 C 121.27311,264.56389 101.52671,278.90744 90.676363,297.37205 C 72.962023,326.7917 68.009913,361.77802 66.707613,395.5283 C 75.938233,346.49989 85.720083,284.8499 154.93888,293.00916 C 230.83548,301.95558 259.01425,382.91785 275.77011,441.1533 C 272.76991,388.26444 252.93541,334.59423 213.45761,297.93455 C 195.45711,281.67324 173.70831,266.94015 148.95761,264.5283 C 147.07481,264.43747 145.18531,264.44412 143.30141,264.49705 z "
+ id="path4386"
+ style="opacity:1;color:black;fill:#7b6c69;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible;filter:url(#filter4382)"
+ transform="matrix(0.514575,0,0,0.941733,38.26461,25.70466)" />
+ <g
+ style="display:inline"
+ id="g3061">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2891);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4026"
+ d="M 790.94698,540.19833 C 754.72619,540.71825 728.95453,571.11018 717.7422,605.83687 C 697.98987,666.7463 708.92894,743.88739 745.26374,805.52032 C 765.90842,840.20434 798.62328,871.23818 834.78799,874.8156 C 868.48817,878.5734 895.99243,855.5754 909.73018,825.72918 C 935.97225,768.86578 929.36771,692.18826 898.79143,628.21685 C 880.06413,589.66458 848.74089,552.44694 810.32088,542.48845 C 803.85764,540.79759 797.31924,540.03971 790.94698,540.19833 z " />
+ <path
+ transform="matrix(1.217408,0,0.203141,1.378897,-309.8841,-217.4311)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3617);stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4028"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <g
+ style="opacity:1;display:inline"
+ id="g4030">
+ <path
+ transform="matrix(0.35769,0,5.968548e-2,0.41765,475.067,327.4519)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3623);stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4032"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.371116,0,6.192573e-2,0.433082,529.996,396.8886)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3627);stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4034"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.371116,0,6.192573e-2,0.433082,513.8174,509.4034)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3631);stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4036"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.357317,0,5.96232e-2,0.417221,453.5199,501.9763)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3635);stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4038"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.357317,0,5.96232e-2,0.407962,423.3689,392.3642)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3640);stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4040"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3854);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 767.59375,566.59375 C 753.99813,573.75695 742.77156,586.59663 734.65625,603.46875 C 737.57614,604.76217 740.53964,605.46875 743.53125,605.46875 C 758.20373,605.46875 768.01733,588.76484 767.59375,566.59375 z "
+ id="path4042" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3856);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 839.125,576.96875 C 839.15658,577.19851 839.18506,577.42573 839.21875,577.65625 C 843.13967,604.48448 859.90323,626.28126 876.65625,626.28125 C 877.93248,626.28125 879.17587,626.12033 880.375,625.875 C 868.75343,605.36177 854.56788,588.48788 839.125,576.96875 z "
+ id="path4044" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3852);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 721.78125,701.65625 C 722.05446,703.99289 722.37332,706.35522 722.71875,708.71875 C 725.81891,729.93104 731.5407,750.08353 739.21875,768.34375 C 742.24009,760.7239 743.30883,750.78622 741.71875,739.90625 C 739.29936,723.35199 731.3693,708.97479 721.78125,701.65625 z "
+ id="path4046" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3858);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 910.75,739.40625 C 898.12259,744.48579 890.98865,763.76215 894.34375,786.71875 C 895.35456,793.63507 897.21958,800.19825 899.71875,806.15625 C 907.15716,787.43227 911.12123,764.58884 910.75,739.40625 z "
+ id="path4048" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3860);stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 817.75,834.8125 C 810.39953,834.8125 804.26586,839.02904 800.03125,846 C 812.03051,853.2674 824.61494,857.25 837.1875,857.25 C 840.25793,857.25 843.26165,857.03003 846.1875,856.5625 C 838.83437,843.46461 828.30177,834.81252 817.75,834.8125 z "
+ id="path4050" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2876);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4052"
+ d="M 798.0625,557.90625 C 781.29199,557.90625 770.85622,580.19093 774.78125,607.65625 C 778.70626,635.12159 795.51073,657.40627 812.28125,657.40625 C 815.04721,657.40625 817.64641,656.79216 820.03125,655.65625 C 806.31614,649.90032 794.0582,630.58677 790.78125,607.65625 C 787.50389,584.72301 794.23982,565.40964 806.3125,559.65625 C 803.59909,558.51703 800.83263,557.90625 798.0625,557.90625 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2873);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4054"
+ d="M 865.15625,635.84375 C 847.75626,635.84375 836.92769,658.95733 841,687.4375 C 845.07234,715.91767 862.50626,739.03127 879.90625,739.03125 C 882.67354,739.03125 885.2554,738.44165 887.65625,737.34375 C 873.29529,731.54594 860.4258,711.3961 857,687.4375 C 853.57535,663.48681 860.67997,643.33663 873.375,637.53125 C 870.66474,636.43706 867.91871,635.84375 865.15625,635.84375 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2870);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4056"
+ d="M 848.96875,748.375 C 831.56876,748.375 820.74018,771.48861 824.8125,799.96875 C 828.88484,828.44892 846.31875,851.56249 863.71875,851.5625 C 866.48647,851.5625 869.09884,850.97322 871.5,849.875 C 857.1387,844.07762 844.23837,823.92781 840.8125,799.96875 C 837.38805,776.01954 844.49392,755.86928 857.1875,750.0625 C 854.47724,748.96831 851.73121,748.375 848.96875,748.375 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2867);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4058"
+ sodipodi:nodetypes="csscscc"
+ d="M 776.15625,732.1875 C 759.40323,732.1875 749.01657,754.43791 752.9375,781.875 C 756.85842,809.31212 773.62199,831.59376 790.375,831.59375 C 793.13807,831.59375 803.09656,825.83075 805.47891,824.69601 C 791.77811,818.94599 772.21103,804.78197 768.9375,781.875 C 765.66587,758.98143 772.36213,739.69998 784.40625,733.9375 C 781.69566,732.79945 778.92349,732.1875 776.15625,732.1875 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2864);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4060"
+ d="M 746.03125,617.46875 C 729.27823,617.46875 718.86032,639.23429 722.78125,666.0625 C 726.70217,692.89074 743.46574,714.65622 760.21875,714.65625 C 762.98318,714.65625 765.58543,714.04811 767.96875,712.9375 C 754.26931,707.31337 742.05452,688.45929 738.78125,666.0625 C 735.50732,643.66123 742.22116,624.80743 754.28125,619.1875 C 751.5647,618.06976 748.80485,617.46875 746.03125,617.46875 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2861);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4062"
+ d="M 766.59375,566.59375 C 752.99813,573.75695 741.77156,586.59663 733.65625,603.46875 C 736.57614,604.76217 739.53964,605.46875 742.53125,605.46875 C 745.30699,605.46875 747.92096,604.86955 750.3125,603.75 C 750.09302,603.65965 749.87524,603.56576 749.65625,603.46875 C 754.06535,594.30202 759.40441,586.33496 765.53125,579.8125 C 766.30565,575.72087 766.68328,571.27999 766.59375,566.59375 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2858);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4064"
+ d="M 838.125,576.96875 C 838.15658,577.19851 838.18506,577.42573 838.21875,577.65625 C 842.13967,604.48448 858.90323,626.28126 875.65625,626.28125 C 876.93248,626.28125 878.17587,626.12033 879.375,625.875 C 878.26443,623.91474 877.125,621.98605 875.96875,620.09375 C 869.58799,615.02694 863.91172,607.14937 859.84375,597.65625 C 853.01371,589.60687 845.71836,582.63277 838.125,576.96875 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2855);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4066"
+ d="M 720.78125,701.65625 C 721.05446,703.99289 721.37332,706.35522 721.71875,708.71875 C 724.81891,729.93104 730.5407,750.08353 738.21875,768.34375 C 741.24009,760.7239 742.30883,750.78622 740.71875,739.90625 C 738.29936,723.35199 730.3693,708.97479 720.78125,701.65625 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2851);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4068"
+ d="M 816.75,834.8125 C 809.39953,834.8125 803.26586,839.02904 799.03125,846 C 811.03051,853.2674 823.61494,857.25 836.1875,857.25 C 838.90063,857.25 841.555,857.08129 844.15625,856.71875 C 834.27818,855.40873 824.47543,851.7199 815.03125,846 C 817.6641,841.66583 821.03164,838.38446 824.96875,836.53125 C 822.27037,835.42464 819.50739,834.81251 816.75,834.8125 z " />
+ <g
+ clip-path="url(#clipPath3833)"
+ style="opacity:1;display:inline"
+ id="g4084"
+ transform="translate(-160.08,-6.92)">
+ <path
+ transform="matrix(1.182067,0,0.197245,1.342882,-116.3514,-181.2832)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4086"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.728694,0,0.121593,0.827829,330.3581,158.0236)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#linearGradient3823);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4088"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.399961,0,6.673916e-2,0.454373,634.653,408.5734)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4090"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(5.083673e-2,0,8.482827e-3,5.775273e-2,992.1429,635.1441)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4092"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.728694,0,0.121593,0.827829,333.4781,155.9436)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#radialGradient3825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4094"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.245003,0,4.088223e-2,0.278334,778.0912,526.6771)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#linearGradient3827);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4096"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ </g>
+ <g
+ style="opacity:1;display:inline"
+ id="g4070">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient3711);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 766.46875,579.125 L 745.6875,604.09375 L 746.34375,605.25 C 756.58142,603.68632 764.04784,593.60291 766.625,579.375 L 766.46875,579.125 z M 775.03125,593.09375 C 774.82821,597.70319 775.05675,602.58655 775.78125,607.65625 C 779.70626,635.12159 796.51072,657.40626 813.28125,657.40625 C 813.63747,657.40625 813.99333,657.39495 814.34375,657.375 L 775.03125,593.09375 z M 844.75,597.4375 C 850.54334,611.07565 859.64242,621.40204 869.40625,624.9375 L 869.4375,624.875 L 844.75,597.4375 z M 836.8125,609.8125 L 824.53125,653.5 C 834.01028,646.20806 839.11131,629.48445 836.8125,609.8125 z M 754.0625,618.71875 L 785.1875,673 C 785.0588,670.73508 784.81279,668.41655 784.46875,666.0625 C 781.10031,643.01452 768.24142,623.70504 754.0625,618.71875 z M 865.71875,635.875 C 848.57591,636.25991 837.96199,659.19725 842,687.4375 C 846.07233,715.91767 863.50626,739.03127 880.90625,739.03125 C 884.96968,739.03125 888.66667,737.76385 891.90625,735.46875 L 844.75,697.90625 L 844.46875,698.71875 L 844.46875,697.6875 L 844.75,697.90625 L 865.71875,635.875 z M 783.1875,693.46875 L 744.3125,707.5 C 749.59407,712.04565 755.40496,714.65624 761.21875,714.65625 C 771.62157,714.65625 779.58739,706.25677 783.1875,693.46875 z M 731.34375,712.15625 L 731.125,712.25 L 741.53125,755.90625 L 742.15625,755.71875 C 742.64506,750.81799 742.53466,745.48907 741.71875,739.90625 C 740.17452,729.3401 736.3762,719.67921 731.34375,712.15625 z M 777.15625,732.1875 C 767.34788,732.1875 759.73316,739.822 755.875,751.65625 L 794.75,740.125 C 789.29318,735.10731 783.21605,732.1875 777.15625,732.1875 z M 849.96875,748.375 C 846.5652,748.375 843.43136,749.27029 840.59375,750.90625 L 881.5625,775.46875 C 873.92485,759.33771 861.95309,748.375 849.96875,748.375 z M 840.28125,751.09375 C 828.81261,757.98705 822.56628,777.26606 825.8125,799.96875 C 827.20724,809.72295 830.19739,818.84266 834.1875,826.625 L 840.28125,751.09375 z M 898.78125,751.21875 C 895.36157,757.78637 893.46241,766.41429 893.53125,776.125 L 898.78125,751.21875 z M 807.5625,758.21875 L 806.03125,824.46875 C 813.58502,815.76206 817.20471,799.9269 814.625,781.875 C 813.40117,773.31113 810.89987,765.25546 807.5625,758.21875 z "
+ id="path4072" />
+ <path
+ style="opacity:1;color:black;fill:#7d86a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 840.10457,750.72001 L 834.07996,825.60001 L 847.07996,821.96001 L 852.21687,757.48001 L 840.10457,750.72001 z "
+ sodipodi:nodetypes="ccccc"
+ id="path4074" />
+ <path
+ style="opacity:1;color:black;fill:#5e6787;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 865.27996,635.80002 L 844.47996,696.64002 L 857.99996,693.52002 L 878.27996,640.48002 C 878.27996,640.48002 871.51996,636.32002 865.27996,635.80002 z "
+ id="path4076" />
+ <path
+ style="opacity:1;color:black;fill:#dadee2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 844.47996,696.12002 L 857.99996,694.56002 L 899.59996,724.20001 C 899.59996,724.20001 895.43996,732.00001 891.79996,735.12001 C 847.07996,699.76002 844.47996,697.16002 844.47996,696.12002 z "
+ id="path4078" />
+ <path
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 775.31996,592.64002 L 790.39996,588.48002 L 825.23996,650.88002 C 825.23996,650.88002 822.36762,656.89703 813.24719,656.28749 C 806.00627,647.65603 789.21488,610.71836 775.31996,592.64002 z "
+ sodipodi:nodetypes="ccccc"
+ id="path4080" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:#d8dbe4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4082"
+ sodipodi:nodetypes="ccc"
+ d="M 767.57222,770.53227 C 766.71066,794.14766 786.67074,822.30157 806.43074,823.34157 C 782.51074,795.26157 770.69222,780.93227 767.57222,770.53227 z " />
+ <path
+ transform="matrix(0.31032,0,5.178125e-2,0.352536,530.9291,471.175)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:url(#radialGradient3777);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3769);stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4098"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2833);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4100"
+ d="M 812,665.6875 C 797.45046,665.6875 788.40727,684.50414 791.8125,707.6875 C 795.21772,730.87083 809.7942,749.68749 824.34375,749.6875 C 827.69586,749.6875 830.75473,748.66455 833.4375,746.84375 C 822.68304,740.76704 813.43435,725.53755 810.8125,707.6875 C 808.19259,689.85074 812.94987,674.6171 821.90625,668.53125 C 818.69301,666.71563 815.34709,665.68751 812,665.6875 z " />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2830);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4102"
+ d="M 909.75,739.40625 C 897.12259,744.48579 889.98865,763.76215 893.34375,786.71875 C 894.35456,793.63507 896.21958,800.19825 898.71875,806.15625 C 906.15716,787.43227 910.12123,764.58884 909.75,739.40625 z " />
+ <g
+ style="opacity:1;display:inline"
+ id="g4104">
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3947);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4106"
+ sodipodi:nodetypes="css"
+ d="M 829.88877,749.94997 C 820.63051,755.49288 804.26228,742.54343 797.53157,728.25594 C 792.49647,717.56778 789.07457,708.40038 791.64844,693.32487" />
+ <path
+ style="color:black;fill:url(#linearGradient3925);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 810.4009,701.04647 C 801.57621,704.72343 800.10543,704.72343 794.95769,707.66499 C 789.80995,710.60655 789.80995,721.63742 796.42847,721.63742 C 803.04699,721.63742 815.54864,719.43125 815.54864,719.43125 L 810.4009,701.04647 z "
+ id="path4108" />
+ <path
+ style="color:black;fill:url(#linearGradient3921);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 830.02351,739.91505 C 823.16897,743.59338 821.77819,743.9134 818.10255,746.44005 C 814.42692,748.96669 817.33727,752.55142 823.59578,751.11135 C 829.85428,749.67129 835.19183,745.24622 835.19183,745.24622 L 830.02351,739.91505 z "
+ sodipodi:nodetypes="csscc"
+ id="path4110" />
+ <path
+ style="color:black;fill:url(#linearGradient3917);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4112"
+ sodipodi:nodetypes="csscc"
+ d="M 813.74521,665.86114 C 803.60732,668.8815 806.88154,665.8265 800.68324,668.24278 C 794.48494,670.65906 790.54534,679.72013 797.16386,679.72013 C 803.78238,679.72013 817.07195,677.90792 817.07195,677.90792 L 813.74521,665.86114 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3943);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 835.7719,738.18372 C 824.37333,732.30059 814.44556,726.78516 811.87169,710.23886 C 809.29782,693.69257 811.1363,685.23557 813.34247,679.72014 C 815.54864,674.2047 815.91634,674.2047 815.91634,674.2047"
+ id="path4114" />
+ <g
+ clip-path="url(#clipPath3932)"
+ id="g4116">
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,123.8091,-80.38611)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4118"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,146.6062,-53.17664)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4120"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,129.6922,-117.891)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:3.19906235;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4122"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ </g>
+ <path
+ transform="matrix(1.478247,0.384378,0,1.454217,-369.2512,-643.1703)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#263141;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3912);stroke-width:0.68204319;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4124"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ </g>
+ </g>
+ <g
+ style="display:inline"
+ id="g3163">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2966);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 108.18708,283.55817 C 90.41157,283.91998 77.41806,305.06914 71.517246,329.23479 C 61.125088,371.6205 65.60275,425.30152 82.717984,468.19071 C 92.44636,492.32666 108.1383,513.92252 125.83908,516.41197 C 142.32872,519.02696 156.08702,503.02308 163.17054,482.25367 C 176.69987,442.68351 174.34333,389.32508 160.08011,344.80859 C 151.33696,317.9808 136.39899,292.08175 117.66532,285.15183 C 114.51401,283.97519 111.31507,283.44779 108.18708,283.55817 z "
+ id="path4148" />
+ <path
+ transform="matrix(0.597247,0,8.37692e-2,0.959548,-423.1381,-243.6618)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4266);stroke-width:3.59412193;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4150"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <g
+ transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)"
+ style="opacity:1;display:inline"
+ id="g4152">
+ <path
+ transform="matrix(0.35769,0,5.968548e-2,0.41765,475.067,327.4519)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4268);stroke-width:12.04805183;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4154"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.371116,0,6.192573e-2,0.433082,529.996,396.8886)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4270);stroke-width:11.61547089;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4156"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.371116,0,6.192573e-2,0.433082,513.8174,509.4034)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4272);stroke-width:11.61547089;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4158"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.357317,0,5.96232e-2,0.417221,453.5199,501.9763)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4274);stroke-width:12.06053925;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4160"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.357317,0,5.96232e-2,0.407962,423.3689,392.3642)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4276);stroke-width:12.19663715;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4162"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4278);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4164"
+ d="M 767.59375,566.59375 C 753.99813,573.75695 742.77156,586.59663 734.65625,603.46875 C 737.57614,604.76217 740.53964,605.46875 743.53125,605.46875 C 758.20373,605.46875 768.01733,588.76484 767.59375,566.59375 z " />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4280);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4166"
+ d="M 839.125,576.96875 C 839.15658,577.19851 839.18506,577.42573 839.21875,577.65625 C 843.13967,604.48448 859.90323,626.28126 876.65625,626.28125 C 877.93248,626.28125 879.17587,626.12033 880.375,625.875 C 868.75343,605.36177 854.56788,588.48788 839.125,576.96875 z " />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4282);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4168"
+ d="M 721.78125,701.65625 C 722.05446,703.99289 722.37332,706.35522 722.71875,708.71875 C 725.81891,729.93104 731.5407,750.08353 739.21875,768.34375 C 742.24009,760.7239 743.30883,750.78622 741.71875,739.90625 C 739.29936,723.35199 731.3693,708.97479 721.78125,701.65625 z " />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4284);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4170"
+ d="M 910.75,739.40625 C 898.12259,744.48579 890.98865,763.76215 894.34375,786.71875 C 895.35456,793.63507 897.21958,800.19825 899.71875,806.15625 C 907.15716,787.43227 911.12123,764.58884 910.75,739.40625 z " />
+ <path
+ style="opacity:1;color:black;fill:#959db8;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4286);stroke-width:4.6566844;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4172"
+ d="M 817.75,834.8125 C 810.39953,834.8125 804.26586,839.02904 800.03125,846 C 812.03051,853.2674 824.61494,857.25 837.1875,857.25 C 840.25793,857.25 843.26165,857.03003 846.1875,856.5625 C 838.83437,843.46461 828.30177,834.81252 817.75,834.8125 z " />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2951);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.03952456;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 111.47382,295.88078 C 103.2464,295.88078 97.869927,311.38826 99.479011,330.50086 C 101.08808,349.61347 109.07538,365.12095 117.30281,365.12094 C 118.65976,365.12094 119.94198,364.69361 121.12504,363.90315 C 114.46289,359.8977 108.67183,346.45777 107.32843,330.50086 C 105.98487,314.54205 109.51199,301.10225 115.50102,297.09857 C 114.18298,296.30581 112.83282,295.88078 111.47382,295.88078 z "
+ id="path4174" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2948);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 143.49118,350.116 C 134.95493,350.116 129.37621,366.20031 131.04585,386.01911 C 132.71551,405.83792 141.00205,421.92224 149.5383,421.92223 C 150.8959,421.92223 152.16933,421.51193 153.35981,420.74793 C 146.38129,416.71334 140.29985,402.69145 138.89528,386.01911 C 137.49117,369.35228 141.20882,355.33016 147.50376,351.2903 C 146.18674,350.52888 144.84641,350.116 143.49118,350.116 z "
+ id="path4176" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2945);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.7867713;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 134.25303,428.42436 C 125.71678,428.42436 120.13806,444.50869 121.8077,464.32747 C 123.47736,484.14628 131.7639,500.23058 140.30015,500.23058 C 141.65796,500.23058 142.94635,499.82052 144.13699,499.05628 C 137.1583,495.022 131.06173,481.00013 129.65713,464.32747 C 128.25311,447.66167 131.97137,433.63949 138.26561,429.59866 C 136.9486,428.83724 135.60826,428.42436 134.25303,428.42436 z "
+ id="path4178" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2942);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.04681969;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 98.718551,417.15979 C 90.499704,417.15979 85.147723,432.64343 86.75512,451.73638 C 88.362512,470.82935 96.329776,486.33472 104.54862,486.33471 C 105.90415,486.33471 110.85608,482.32435 112.03792,481.5347 C 105.38271,477.53337 95.946537,467.6769 94.604544,451.73638 C 93.26333,435.80518 96.770628,422.38758 102.74574,418.37758 C 101.42907,417.58563 100.07613,417.15979 98.718551,417.15979 z "
+ sodipodi:nodetypes="csscscc"
+ id="path4180" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2939);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.12633991;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 85.261504,337.32919 C 77.042657,337.32919 71.680932,352.47542 73.295346,371.14466 C 74.909755,389.81392 82.882966,404.96011 91.101808,404.96013 C 92.458007,404.96013 93.74165,404.53693 94.923678,403.76408 C 88.267693,399.85036 82.492514,386.73016 81.14477,371.14466 C 79.796754,355.55604 83.307749,342.43604 89.289057,338.52524 C 87.969228,337.74742 86.622202,337.32919 85.261504,337.32919 z "
+ id="path4182" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2935);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 95.935492,301.92625 C 89.183086,306.91098 83.527498,315.84587 79.351792,327.58686 C 80.769354,328.48692 82.215072,328.97862 83.682723,328.97862 C 85.04447,328.97862 86.33376,328.56165 87.519924,327.78257 C 87.413291,327.7197 87.307533,327.65436 87.201216,327.58686 C 89.469904,321.2079 92.180995,315.66378 95.261916,311.12492 C 95.688978,308.27763 95.925413,305.18731 95.935492,301.92625 z "
+ id="path4184" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2932);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 130.90838,309.14601 C 130.92123,309.3059 130.93258,309.46401 130.94645,309.62443 C 132.56086,328.29368 140.53371,343.46165 148.75255,343.46164 C 149.37866,343.46164 149.99051,343.34966 150.58161,343.17894 C 150.05937,341.81483 149.5226,340.47269 148.97716,339.15588 C 145.90522,335.62998 143.21128,330.14813 141.32497,323.54205 C 138.06698,317.94064 134.56833,313.08749 130.90838,309.14601 z "
+ id="path4186" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2929);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 71.904008,395.91367 C 72.011116,397.5397 72.140323,399.1836 72.282551,400.82833 C 73.559019,415.58956 76.133841,429.6133 79.690189,442.32024 C 81.260232,437.01773 81.899059,430.10229 81.244357,422.53112 C 80.248192,411.01133 76.523466,401.00651 71.904008,395.91367 z "
+ id="path4188" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2926);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 117.45081,488.57458 C 113.84475,488.57458 110.78705,491.50879 108.62927,496.35975 C 114.43223,501.41699 120.56012,504.18841 126.72808,504.18841 C 128.05911,504.18841 129.36326,504.07101 130.64358,503.81872 C 125.81261,502.9071 121.04599,500.34012 116.47869,496.35975 C 117.82029,493.34368 119.51018,491.06024 121.46303,489.77062 C 120.15199,489.00055 118.80356,488.57458 117.45081,488.57458 z "
+ id="path4190" />
+ <g
+ clip-path="url(#clipPath3833)"
+ style="opacity:1;display:inline"
+ id="g4206"
+ transform="matrix(0.490589,0,-1.152337e-2,0.695881,-352.0716,-97.17108)">
+ <path
+ transform="matrix(1.182067,0,0.197245,1.342882,-116.3514,-181.2832)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4208"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.728694,0,0.121593,0.827829,330.3581,158.0236)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#linearGradient4308);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4210"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.399961,0,6.673916e-2,0.454373,634.653,408.5734)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4212"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(5.083673e-2,0,8.482827e-3,5.775273e-2,992.1429,635.1441)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4214"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.728694,0,0.121593,0.827829,333.4781,155.9436)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#radialGradient4310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4216"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ transform="matrix(0.245003,0,4.088223e-2,0.278334,778.0912,526.6771)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="color:black;fill:url(#linearGradient4312);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.50316167;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4218"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ </g>
+ <g
+ transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)"
+ style="opacity:1;display:inline"
+ id="g4192">
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient4306);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4194"
+ d="M 766.46875,579.125 L 745.6875,604.09375 L 746.34375,605.25 C 756.58142,603.68632 764.04784,593.60291 766.625,579.375 L 766.46875,579.125 z M 775.03125,593.09375 C 774.82821,597.70319 775.05675,602.58655 775.78125,607.65625 C 779.70626,635.12159 796.51072,657.40626 813.28125,657.40625 C 813.63747,657.40625 813.99333,657.39495 814.34375,657.375 L 775.03125,593.09375 z M 844.75,597.4375 C 850.54334,611.07565 859.64242,621.40204 869.40625,624.9375 L 869.4375,624.875 L 844.75,597.4375 z M 836.8125,609.8125 L 824.53125,653.5 C 834.01028,646.20806 839.11131,629.48445 836.8125,609.8125 z M 754.0625,618.71875 L 785.1875,673 C 785.0588,670.73508 784.81279,668.41655 784.46875,666.0625 C 781.10031,643.01452 768.24142,623.70504 754.0625,618.71875 z M 865.71875,635.875 C 848.57591,636.25991 837.96199,659.19725 842,687.4375 C 846.07233,715.91767 863.50626,739.03127 880.90625,739.03125 C 884.96968,739.03125 888.66667,737.76385 891.90625,735.46875 L 844.75,697.90625 L 844.46875,698.71875 L 844.46875,697.6875 L 844.75,697.90625 L 865.71875,635.875 z M 783.1875,693.46875 L 744.3125,707.5 C 749.59407,712.04565 755.40496,714.65624 761.21875,714.65625 C 771.62157,714.65625 779.58739,706.25677 783.1875,693.46875 z M 731.34375,712.15625 L 731.125,712.25 L 741.53125,755.90625 L 742.15625,755.71875 C 742.64506,750.81799 742.53466,745.48907 741.71875,739.90625 C 740.17452,729.3401 736.3762,719.67921 731.34375,712.15625 z M 777.15625,732.1875 C 767.34788,732.1875 759.73316,739.822 755.875,751.65625 L 794.75,740.125 C 789.29318,735.10731 783.21605,732.1875 777.15625,732.1875 z M 849.96875,748.375 C 846.5652,748.375 843.43136,749.27029 840.59375,750.90625 L 881.5625,775.46875 C 873.92485,759.33771 861.95309,748.375 849.96875,748.375 z M 840.28125,751.09375 C 828.81261,757.98705 822.56628,777.26606 825.8125,799.96875 C 827.20724,809.72295 830.19739,818.84266 834.1875,826.625 L 840.28125,751.09375 z M 898.78125,751.21875 C 895.36157,757.78637 893.46241,766.41429 893.53125,776.125 L 898.78125,751.21875 z M 807.5625,758.21875 L 806.03125,824.46875 C 813.58502,815.76206 817.20471,799.9269 814.625,781.875 C 813.40117,773.31113 810.89987,765.25546 807.5625,758.21875 z " />
+ <path
+ style="opacity:1;color:black;fill:#7d86a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4196"
+ sodipodi:nodetypes="ccccc"
+ d="M 840.10457,750.72001 L 834.07996,825.60001 L 847.07996,821.96001 L 852.21687,757.48001 L 840.10457,750.72001 z " />
+ <path
+ style="opacity:1;color:black;fill:#5e6787;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4198"
+ d="M 865.27996,635.80002 L 844.47996,696.64002 L 857.99996,693.52002 L 878.27996,640.48002 C 878.27996,640.48002 871.51996,636.32002 865.27996,635.80002 z " />
+ <path
+ style="opacity:1;color:black;fill:#dadee2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4200"
+ d="M 844.47996,696.12002 L 857.99996,694.56002 L 899.59996,724.20001 C 899.59996,724.20001 895.43996,732.00001 891.79996,735.12001 C 847.07996,699.76002 844.47996,697.16002 844.47996,696.12002 z " />
+ <path
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4202"
+ sodipodi:nodetypes="ccccc"
+ d="M 775.31996,592.64002 L 790.39996,588.48002 L 825.23996,650.88002 C 825.23996,650.88002 822.36762,656.89703 813.24719,656.28749 C 806.00627,647.65603 789.21488,610.71836 775.31996,592.64002 z " />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:#d8dbe4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 94.065459,443.84319 C 93.370659,460.27669 102.83843,479.86846 112.52048,480.59218 C 101.10917,461.05184 95.476254,451.08035 94.065459,443.84319 z "
+ sodipodi:nodetypes="ccc"
+ id="path4204" />
+ <path
+ transform="matrix(0.15224,0,2.134091e-2,0.245323,-18.57945,235.5262)"
+ sodipodi:cy="670.89545"
+ sodipodi:type="arc"
+ sodipodi:cx="813.71014"
+ style="opacity:1;color:black;fill:url(#radialGradient4314);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4316);stroke-width:14.07893753;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ id="path4220"
+ sodipodi:rx="84.93766"
+ d="M 898.6478 670.89545 A 84.93766 119.13335 0 1 1 728.77248,670.89545 A 84.93766 119.13335 0 1 1 898.6478 670.89545 z"
+ sodipodi:ry="119.13335" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2908);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8.22614479;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.625;visibility:visible;display:inline;overflow:visible"
+ d="M 117.0694,370.8837 C 109.93156,370.8837 105.27824,383.97785 106.68166,400.11071 C 108.08507,416.24354 115.0193,429.3377 122.15715,429.33771 C 123.80166,429.33771 125.31409,428.62586 126.65121,427.3588 C 121.44522,423.13013 117.08341,412.53222 116.00285,400.11071 C 114.92309,387.69844 117.4325,377.09764 121.89653,372.86261 C 120.34107,371.59916 118.71145,370.88371 117.0694,370.8837 z "
+ id="path4222" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient2905);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72084141;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 164.17499,422.18318 C 157.92159,425.71794 154.19963,439.13199 155.58107,455.10705 C 155.99726,459.91999 156.83659,464.48718 157.994,468.63324 C 161.85896,455.60358 164.06692,439.70727 164.17499,422.18318 z "
+ id="path4224" />
+ <g
+ transform="matrix(0.490589,0,-1.152337e-2,0.695881,-273.6179,-92.35558)"
+ style="opacity:1;display:inline"
+ id="g4226">
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4322);stroke-width:4.10756874;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4228"
+ sodipodi:nodetypes="css"
+ d="M 829.88877,749.94997 C 820.63051,755.49288 804.26228,742.54343 797.53157,728.25594 C 792.49647,717.56778 789.07457,708.40038 791.64844,693.32487" />
+ <path
+ style="color:black;fill:url(#linearGradient4324);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4230"
+ d="M 810.4009,701.04647 C 801.57621,704.72343 800.10543,704.72343 794.95769,707.66499 C 789.80995,710.60655 789.80995,721.63742 796.42847,721.63742 C 803.04699,721.63742 815.54864,719.43125 815.54864,719.43125 L 810.4009,701.04647 z " />
+ <path
+ style="color:black;fill:url(#linearGradient4326);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4232"
+ sodipodi:nodetypes="csscc"
+ d="M 830.02351,739.91505 C 823.16897,743.59338 821.77819,743.9134 818.10255,746.44005 C 814.42692,748.96669 817.33727,752.55142 823.59578,751.11135 C 829.85428,749.67129 835.19183,745.24622 835.19183,745.24622 L 830.02351,739.91505 z " />
+ <path
+ style="color:black;fill:url(#linearGradient4328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.72083974;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4234"
+ sodipodi:nodetypes="csscc"
+ d="M 813.74521,665.86114 C 803.60732,668.8815 806.88154,665.8265 800.68324,668.24278 C 794.48494,670.65906 790.54534,679.72013 797.16386,679.72013 C 803.78238,679.72013 817.07195,677.90792 817.07195,677.90792 L 813.74521,665.86114 z " />
+ <path
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4330);stroke-width:4.10756874;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4236"
+ d="M 835.7719,738.18372 C 824.37333,732.30059 814.44556,726.78516 811.87169,710.23886 C 809.29782,693.69257 811.1363,685.23557 813.34247,679.72014 C 815.54864,674.2047 815.91634,674.2047 815.91634,674.2047" />
+ <g
+ clip-path="url(#clipPath3932)"
+ id="g4238">
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,123.8091,-80.38611)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4240"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,146.6062,-53.17664)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4242"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ <path
+ transform="matrix(0.846668,0.225827,0,0.854372,129.6922,-117.891)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#9faec6;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:5.47515392;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51315792;visibility:visible;display:inline;overflow:visible"
+ id="path4244"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ </g>
+ <path
+ transform="matrix(1.478247,0.384378,0,1.454217,-369.2512,-643.1703)"
+ sodipodi:cy="710.97424"
+ sodipodi:type="arc"
+ sodipodi:cx="814.44556"
+ style="color:black;fill:#263141;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4332);stroke-width:1.16730797;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4246"
+ sodipodi:rx="6.9862146"
+ d="M 821.43177 710.97424 A 6.9862146 9.9277792 0 1 1 807.45934,710.97424 A 6.9862146 9.9277792 0 1 1 821.43177 710.97424 z"
+ sodipodi:ry="9.9277792" />
+ </g>
+ </g>
+ <path
+ style="opacity:0.70434783;color:black;fill:url(#linearGradient4976);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter4958)"
+ id="path4896"
+ d="M 603.49401,376.6917 C 605.68022,380.29314 608.90095,381.472 612.89829,381.76628 C 616.55274,381.84427 619.06683,380.48985 621.67203,378.153 C 623.23324,374.8852 625.20964,371.78876 626.4345,368.37411 C 627.56726,365.21619 631.64398,367.99002 630.33308,371.07825 L 630.33308,371.07825 C 628.7101,374.90167 626.80709,378.7071 624.37026,382.06935 C 621.03262,385.02787 617.1318,386.70851 612.5883,386.43999 C 607.52089,386.17306 603.14577,384.3949 600.14288,380.10581 C 598.20277,377.33469 601.73866,373.80002 603.49401,376.6917 z " />
+ <path
+ style="opacity:1;color:black;fill:#f2ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path5198"
+ d="M 819.33652,386.084 C 819.33652,386.084 742.11653,260.504 717.15653,226.184 C 702.80803,206.4548 683.47615,183.6325 665.18672,165.0271 C 651.66069,151.2674 638.70481,139.814 628.75653,133.624 C 614.9308,125.0214 593.16949,114.6801 563.22582,108.0611 C 544.26429,103.8698 522.02171,101.1711 496.43539,101.3517 C 495.48043,101.3584 494.52081,101.3692 493.55653,101.384 C 497.64803,91.431 504.87858,87.738226 511.22886,83.615245 C 511.22886,83.615245 520.47,82.410986 534.03338,83.054232 C 555.83602,84.088187 587.81986,90.862122 612.11653,98.685902 C 627.1091,103.51371 638.77262,109.155 649.73884,115.1879 C 681.02965,132.402 702.34177,152.356 737.9938,195.3709 C 741.95339,200.1482 746.08986,205.2099 750.43653,210.584 C 768.47858,232.8905 816.99652,294.824 876.27652,391.544 C 862.43288,391.544 847.93403,390.4957 834.73361,388.6781 C 829.34006,387.9355 824.16328,387.0644 819.33652,386.084 C 819.33652,386.084 819.33652,386.084 819.33652,386.084"
+ sodipodi:nodetypes="csssssccssssscscc" />
+ <path
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter5106)"
+ id="path5036"
+ d="M 507.64262,283.34374 C 505.47606,286.36974 503.8547,288.55197 500.0401,288.96742 C 499.76275,292.25488 497.62043,293.52247 496.82896,296.74274 C 496.30525,299.70348 494.86523,301.70693 494.4431,304.92175 C 492.4482,309.38606 491.50333,307.70402 488.77311,311.1671 C 490.33377,312.96016 492.02997,315.08438 493.24677,317.57662 C 496.22657,319.77266 496.30264,324.27833 500.393,323.55709 C 501.86827,326.8485 505.64254,329.88761 501.60307,328.55147 C 498.23646,325.77417 494.98031,326.44889 492.24951,322.50889 C 493.21978,318.4119 488.66429,317.54931 487.90971,313.44211 C 487.97774,309.1429 486.8583,305.68217 488.34447,301.43637 C 490.2953,298.7153 490.51305,295.57962 491.09746,292.57097 C 493.67001,289.94427 494.26715,285.99688 496.49521,283.03536 C 499.73376,282.12685 502.34667,281.70501 503.96776,278.28573 C 505.86163,274.29107 510.21623,279.74922 507.64262,283.34374 z "
+ sodipodi:nodetypes="cccccccccccccsc" />
+ <g
+ id="g5333"
+ clip-path="url(#clipPath5339)"
+ transform="translate(0,540)">
+ <path
+ sodipodi:nodetypes="cssssssscscsssccc"
+ d="M 864.07817,-148.146 C 852.74527,-169.7657 812.50322,-226.4162 780.2559,-270.6337 C 764.41493,-292.3548 750.50317,-310.29031 742.89522,-320.38451 C 734.07075,-332.09281 725.47937,-341.77351 718.65114,-350.21231 C 705.71545,-366.19931 695.2722,-376.94443 680.9193,-389.36203 C 660.51571,-407.01443 657.09804,-411.15079 639.21395,-420.99159 C 638.5411,-421.36179 637.09908,-421.3337 636.45801,-421.6927 C 628.24674,-426.292 622.59004,-429.9982 618.14947,-433.3989 C 612.77561,-437.5143 563.64397,-446.73572 559.46006,-450.99712 C 574.39687,-446.01812 642.36945,-429.9353 661.28336,-418.3569 C 671.70217,-411.9789 681.05291,-405.2825 687.49412,-399.0202 C 710.25855,-376.9147 721.18315,-365.913 750.43653,-329.416 C 753.01933,-326.1937 756.22228,-322.1731 759.98828,-317.3664 C 779.98013,-291.8495 815.83892,-244.1753 859.02259,-176.123 C 864.65559,-167.2461 892.46594,-151.13093 898.32924,-141.56453 C 894.824,-141.01303 868.33803,-148.0219 864.07817,-148.146 C 864.07817,-148.146 870.96964,-132.98476 870.96964,-132.98476"
+ id="path5200"
+ style="opacity:1;color:black;fill:#2556dd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5254)" />
+ <path
+ transform="matrix(2.242215,0.424538,-0.186032,0.982545,-876.716,-289.2858)"
+ d="M 691.13947 -447.13715 A 45.945068 30.237352 0 1 1 599.24933,-447.13715 A 45.945068 30.237352 0 1 1 691.13947 -447.13715 z"
+ sodipodi:ry="30.237352"
+ sodipodi:rx="45.945068"
+ sodipodi:cy="-447.13715"
+ sodipodi:cx="645.1944"
+ id="path5263"
+ style="opacity:0.72608696;color:black;fill:#6488ea;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5329);enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <path
+ transform="matrix(0.916345,0,0,0.916345,113.2764,74.39469)"
+ style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3952)"
+ d="M 1272.4399,903.60001 L 1469.5199,872.40001 C 1469.5199,872.40001 1496.0399,893.20001 1493.9599,893.20001 C 1491.8799,893.20001 1315.5999,925.44 1315.5999,925.44 L 1272.4399,903.60001 z "
+ id="path3321"
+ sodipodi:nodetypes="ccscc" />
+ <path
+ style="opacity:0.60434783;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter4167)"
+ id="path4085"
+ d="M 837.87844,577.98179 C 841.46692,584.35026 845.6653,603.51883 851.56879,607.74463 C 854.38266,613.5104 862.93242,621.44522 874.67166,626.5043 C 875.61093,626.90908 867.52797,625.20659 866.57168,624.84382 L 866.57168,624.84382 C 858.90138,621.93405 854.13398,616.4021 849.03714,610.27999 C 843.93926,604.80748 840.54667,597.01066 840.00857,590.29176 C 839.91024,589.064 837.27379,576.90873 837.87844,577.98179 z "
+ sodipodi:nodetypes="ccscccsc" />
+ <path
+ d="M 696.90625,397.375 C 716.31072,399.15039 730.7816,403.02757 724.08756,414.24651 C 747.87178,417.64391 763.29567,436.9156 769.42747,458.40244 C 784.47414,462.16706 851.21242,454.70446 912.71875,547.46875 C 933.43519,578.71344 951.13573,647.06961 967.29118,659.67127 C 983.40346,672.23925 994.08962,609.51337 1009.375,623.0625 C 1036.9696,640.7111 1085.7096,694.90941 1117,705.0625 C 1169.4389,716.82057 1227.3539,726.23713 1280.2188,744 L 1252.1563,715.15625 C 1252.1562,715.15623 1067.8437,548.00446 987.84375,498.71875 C 907.84377,449.43303 849.32375,417.76244 818.5625,411.5625 C 772.48026,402.2746 727.07461,397.51778 696.90625,397.375 z "
+ sodipodi:nodetypes="cccssccccssc"
+ id="use4171"
+ style="opacity:0.32173917;color:black;fill:url(#linearGradient4211);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4217)" />
+ <path
+ style="fill:url(#linearGradient4269);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.11304348;filter:url(#filter4259)"
+ d="M 1342.9215,394.1428 C 1309.0979,396.64825 1181.3199,409.1755 1182.5726,415.43913 C 1183.8254,421.70275 1320.3725,567.01889 1340.4161,595.83157 C 1277.2878,487.51853 1221.3106,404.78717 1342.9215,394.1428 z "
+ id="path4221"
+ sodipodi:nodetypes="cscc" />
+ <path
+ d="M 117.95028,131.82387 C 118.96044,143.94577 118.96979,142.91927 113.91903,148.98017 C 108.86827,155.04107 105.82528,155.05507 105.82528,163.13637 C 105.82528,171.21757 104.8237,181.31457 98.762783,185.35517 C 92.701872,189.39567 92.700282,189.37697 92.700282,193.41767 C 92.700282,197.45827 82.111603,202.51219 80.596379,216.14927 C 109.46712,205.68175 140.65228,235.39211 137.13778,231.82387 C 132.65466,227.27219 137.14873,225.74957 139.16903,220.69887 C 141.18933,215.64807 139.15808,217.66597 137.13778,211.60517 C 135.11747,205.54427 151.28467,215.66527 155.32528,206.57387 C 159.3659,197.48257 150.2761,195.44817 161.38778,192.41767 C 172.49946,189.38707 174.51515,186.36767 183.60653,194.44887 C 192.6979,202.53007 206.83939,209.59657 220.98153,216.66767 C 235.12367,223.73867 258.35969,231.82457 270.48153,234.85517 C 282.60336,237.88567 294.72297,233.84567 301.79403,237.88637 C 308.86509,241.92697 303.82845,244.94967 315.95028,247.98017 C 324.91012,250.22007 369.39404,263.24968 435.24677,296.16641 C 404.4122,278.76461 329.19878,237.08445 315.6868,228.67135 C 262.14871,195.33635 190.67601,157.07237 177.54403,151.01137 C 164.41206,144.95047 130.07211,131.82387 117.95028,131.82387 z M 153.54403,177.16767 C 155.24491,177.05947 156.5896,177.32287 157.35653,178.26137 C 149.7542,185.86367 152.56806,190.38397 150.29403,199.48017 C 148.22327,207.76317 141.64769,206.14957 138.16903,201.51137 C 136.45178,199.22167 124.01278,195.89187 124.01278,194.44887 C 124.01278,187.42117 125.91394,181.29257 134.10653,181.29267 C 140.06869,181.29267 148.44138,177.49197 153.54403,177.16767 z "
+ sodipodi:nodetypes="csssscsssssssssscsscccssssc"
+ id="path4539"
+ style="opacity:1;color:black;fill:url(#linearGradient2999);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4601)" />
+ <path
+ id="path4605"
+ sodipodi:nodetypes="csssssssssscc"
+ d="M 689.79677,145.09093 C 686.11982,131.86289 690.53216,108.71379 695.6799,102.09978 C 700.82764,95.485746 885.41078,-0.41763823 917.76799,-16.952728 C 950.12519,-33.487771 1064.1108,-59.943887 1069.9939,-59.943887 C 1075.8771,-59.943887 1089.8495,-69.864915 1070.7293,-93.01402 C 1051.6092,-116.16313 980.27622,-165.7683 949.3898,-178.99639 C 918.50338,-192.22442 892.76469,-212.06652 883.20461,-215.37352 C 873.64453,-218.68054 849.37662,-241.82959 838.34576,-231.90858 C 827.31489,-221.98755 807.45934,-178.99639 819.96098,-175.68933 C 832.46263,-172.38233 857.46592,-165.7683 847.90584,-162.4613 C 838.34576,-159.15429 750.83423,-126.08415 732.44945,-119.47014 C 714.06468,-112.85607 633.17167,-50.022861 622.1408,-50.022861 C 660.38114,19.42446 683.17825,108.71379 689.79677,145.09093 z "
+ style="opacity:0.52173911;color:black;fill:url(#linearGradient4607);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4653)"
+ transform="matrix(1,0,0,0.230566,0,111.6378)" />
+ <g
+ id="g4663"
+ style="opacity:0.55652174;filter:url(#filter5200)">
+ <path
+ d="M 1806.6185,615.58146 C 1804.8267,618.06369 1801.5664,622.79015 1799.2825,623.09218 C 1795.8213,625.05097 1795.0148,626.6908 1794.0321,630.38076 C 1790.965,632.01807 1786.8719,633.70351 1784.249,636.31985 C 1780.2709,637.10109 1781.1876,640.68028 1778.8384,642.70679 C 1776.1233,643.71768 1771.3524,647.51399 1770.2967,646.7437 C 1770.6412,652.46947 1765.0568,651.9056 1762.0387,653.61314 C 1758.4097,655.05792 1756.6452,655.14756 1754.0337,658.71823 C 1749.8519,659.95696 1746.8734,661.40411 1742.3186,660.94588 C 1739.432,661.27862 1736.2825,663.54249 1733.3868,662.82183 C 1732.0885,664.62847 1727.0652,667.14698 1724.4244,666.98569 C 1721.8266,669.88342 1719.7227,668.9769 1718.3407,672.86742 C 1715.7651,673.60629 1698.523,685.49074 1694.735,680.6428 C 1692.0002,677.14269 1710.1394,673.98852 1711.7567,669.85154 L 1711.7567,669.85154 C 1713.5151,665.35349 1711.2316,670.9242 1713.0912,667.1255 C 1716.6749,665.98631 1717.6014,660.15728 1722.751,661.93537 C 1724.9849,657.41233 1727.3308,658.69344 1731.6397,656.90311 C 1734.6912,654.91325 1738.5185,654.83707 1741.8144,653.74433 C 1745.1175,653.36767 1749.4778,653.51689 1750.0423,651.1683 C 1754.3519,652.0677 1755.938,646.12295 1760.8569,647.4964 C 1762.1851,644.618 1765.7421,646.55097 1767.0513,643.08916 C 1768.4207,637.70231 1771.3409,640.26201 1773.764,636.84834 C 1776.6794,635.21098 1778.4886,632.14392 1781.2052,629.90534 C 1784.6968,628.25744 1785.3112,625.39949 1788.9987,625.25998 C 1789.5916,621.20235 1793.5739,620.0327 1795.3326,616.4096 C 1798.0704,616.0827 1800.5443,612.6309 1802.3968,611.17285 C 1805.7884,608.50339 1809.1446,612.08181 1806.6185,615.58146 z "
+ id="path4657"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:nodetypes="ccccccccccccscccccccccccccsc" />
+ <path
+ d="M 1798.0216,613.29382 C 1797.0874,616.28412 1796.2418,620.33359 1793.1599,622.9797 C 1792.0706,626.89824 1787.453,627.48264 1785.5451,630.11989 C 1782.5165,631.86806 1781.8122,636.90866 1778.0487,638.3375 C 1775.9998,639.03739 1775.3976,640.4401 1773.259,640.85512 C 1768.1978,641.83731 1765.6928,637.04124 1770.061,634.30273 L 1770.061,634.30273 C 1772.9697,632.47918 1774.1144,637.36387 1774.0334,632.09126 C 1778.2644,631.31327 1778.0743,625.32316 1782.4137,625.5583 C 1783.5676,621.94087 1785.4312,620.61344 1788.3529,617.85061 C 1791.4004,614.47009 1790.9779,612.08063 1793.6707,608.75029 C 1796.4676,605.29131 1799.348,609.04795 1798.0216,613.29382 z "
+ id="path4659"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 1793.516,613.20171 C 1789.0948,614.37009 1791.8615,616.25358 1790.4862,619.02314 C 1789.9465,620.10983 1788.1005,619.9809 1787.4209,620.98606 C 1785.4294,624.4117 1783.8327,626.96005 1780.7755,629.96653 C 1776.9483,633.73013 1774.8728,628.65432 1776.655,623.59116 L 1776.655,623.59116 C 1777.9141,620.01393 1781.4593,619.97533 1782.8182,616.60362 C 1784.4707,613.27159 1786.0483,610.14364 1788.2172,607.19962 C 1791.5752,602.64166 1798.9895,611.75524 1793.516,613.20171 z "
+ id="path4661"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="opacity:0.55652173;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4826);enable-background:accumulate"
+ d="M 317.50085,276.97238 C 318.91462,278.18011 320.89037,278.6003 322.09804,280.07033 C 323.10794,281.15753 324.37269,281.98621 325.7251,282.58431 C 328.14276,282.86624 330.32574,284.10473 332.23001,285.56005 C 332.78645,285.94644 333.43594,286.28302 334.13296,286.24069 C 334.63876,285.96515 335.28921,286.34027 335.45206,286.85688 C 336.45064,287.83774 337.8631,288.14129 339.14048,288.59061 C 340.57356,289.01305 342.02214,289.38162 343.45021,289.82128 C 344.02793,289.73077 344.53147,290.19207 344.75215,290.6874 C 345.59739,291.67816 346.89755,292.03777 347.99638,292.65643 C 348.55012,292.88332 349.20346,293.06136 349.51388,293.62488 C 350.10693,294.52567 350.437,295.64836 350.27185,296.72641 C 350.17573,297.23743 349.96656,297.80674 349.50023,298.08296 C 348.98543,298.27415 348.45039,297.87311 348.23552,297.42072 C 347.73255,296.79085 347.05164,296.32111 346.59887,295.64847 C 345.91925,295.09362 345.04567,294.82639 344.41247,294.20674 C 343.89341,293.79526 343.39893,293.35403 342.88408,292.93741 C 341.57502,292.64655 340.15875,292.54569 339.02699,291.75417 C 338.65852,291.23834 337.96258,291.43337 337.42808,291.36442 C 335.81585,291.16081 334.57881,289.82757 332.93478,289.74715 C 331.73001,289.52779 330.89356,288.56076 329.93606,287.88576 C 329.4197,287.63165 328.91352,287.34895 328.46107,286.99101 C 327.54252,286.58713 326.49926,286.66729 325.568,286.29898 C 325.1333,286.14956 324.71368,285.93696 324.36976,285.62824 C 322.81805,285.06953 321.92727,283.41936 320.29848,283.01199 C 319.58779,282.64075 319.21632,281.82892 318.45559,281.53047 C 317.44533,280.9046 316.26687,280.43866 315.55467,279.43804 C 314.9945,278.54539 315.19953,277.19556 316.1202,276.62161 C 316.59581,276.41325 317.14929,276.62779 317.50085,276.97238 z "
+ id="path4788" />
+ <path
+ style="fill:#5b6879;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.23043478"
+ d="M 487.89301,308.72039 C 488.3326,300.80774 491.4635,295.31127 491.4635,295.31127 C 491.4635,295.31127 501.13452,293.11331 499.81575,297.50923 C 498.49697,301.90515 494.98024,306.74065 497.1782,306.74065 C 499.37615,306.74065 505.53044,305.42188 505.53044,305.42188 C 505.53044,305.42188 512.78213,307.83806 512.78213,310.03602 C 512.78213,312.23398 487.45342,308.72039 487.89301,308.72039 z "
+ id="path4956"
+ sodipodi:nodetypes="ccsscsc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3927);opacity:0.27391304"
+ d="M 292.19051,471.87988 C 294.6394,467.05863 286.53648,469.6405 284.16343,463.44555 C 280.55878,454.03548 311.62618,435.19934 312.40474,435.78326 C 313.79552,436.82635 332.5711,458.20965 330.65877,456.47117 C 328.74645,454.73269 302.01065,468.12376 292.19051,471.87988 z "
+ id="path3921"
+ sodipodi:nodetypes="csssc"
+ clip-path="url(#clipPath3953)" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path4956"
+ id="use4958"
+ style="opacity:1;filter:url(#filter5032)" />
+ <path
+ style="fill:#080000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5304)"
+ d="M 1501.9565,338.98683 C 1498.1548,339.12763 1478.721,343.40924 1476.0457,341.8604 C 1473.3704,340.31156 1471.2584,342.14201 1471.2584,342.14201 L 1465.063,340.17075 C 1465.063,340.17075 1447.6033,353.2655 1437.4655,357.20801 C 1427.3276,361.15051 1417.7347,368.3163 1417.7347,368.3163 C 1417.7347,368.3163 1450.1378,357.63042 1451.8275,356.9264 C 1453.5171,356.22238 1466.3302,350.87184 1467.8791,350.59023 C 1469.4279,350.30862 1483.5689,346.80325 1485.5401,346.66244 C 1487.5114,346.52164 1501.9565,339.26844 1501.9565,338.98683 z "
+ id="path5282"
+ sodipodi:nodetypes="csccscsssc" />
+ <path
+ sodipodi:nodetypes="csssc"
+ id="path3942"
+ d="M 292.19051,471.87988 C 294.6394,467.05863 286.53648,469.6405 284.16343,463.44555 C 280.55878,454.03548 311.62618,435.19934 312.40474,435.78326 C 313.79552,436.82635 322.74618,448.20609 320.83385,446.46761 C 318.92153,444.72913 302.01065,468.12376 292.19051,471.87988 z "
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3927);opacity:0.33913043"
+ clip-path="url(#clipPath3946)" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#b2d1fd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3982)"
+ d="M 323.69746,231.50388 L 405.14932,213.56953"
+ id="path3960"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path4075"
+ d="M 294.07695,144.22375 C 265.79267,135.13235 244.57947,133.11205 231.44749,135.13235 C 218.3155,137.15265 208.21398,132.10185 198.11245,132.10185 C 188.01093,132.10185 163.76727,134.12215 163.76727,134.12215 C 163.76727,134.12215 179.92971,139.17295 195.082,146.24405 C 210.23428,153.31505 239.52871,169.47755 239.52871,169.47755 C 239.52871,169.47755 263.77237,155.33535 270.84344,152.30495 C 277.9145,149.27445 296.09725,143.21355 294.07695,144.22375 z "
+ style="opacity:0.92173911;color:#000000;fill:url(#linearGradient4101);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4097)" />
+ </g>
+</svg>
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js
index 903702ad3ee..402f4c14dce 100644
--- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/perf-canvaskit-with-puppeteer.js
@@ -33,9 +33,14 @@ const opts = [
description: 'The Lottie JSON file to process.'
},
{
+ name: 'input_skp',
+ typeLabel: '{underline file}',
+ description: 'The SKP file to process.'
+ },
+ {
name: 'assets',
typeLabel: '{underline file}',
- description: 'Any assets needed by the lottie file (e.g. images/fonts).'
+ description: 'A directory containing any assets needed by the lottie file (e.g. images/fonts).'
},
{
name: 'output',
@@ -59,6 +64,13 @@ const opts = [
type: Number,
},
{
+ name: 'query_params',
+ description: 'The query params to be added to the testing page URL. Useful for passing' +
+ 'options to the perf html page.',
+ type: String,
+ multiple: true
+ },
+ {
name: 'help',
alias: 'h',
type: Boolean,
@@ -130,6 +142,12 @@ if (options.input_lottie) {
const lottieJSON = fs.readFileSync(options.input_lottie, 'utf8');
app.get('/static/lottie.json', (req, res) => res.send(lottieJSON));
}
+if (options.input_skp) {
+ const skpBytes = fs.readFileSync(options.input_skp, 'binary');
+ app.get('/static/test.skp', (req, res) => {
+ res.send(new Buffer(skpBytes, 'binary'));
+ });
+}
if (options.assets) {
app.use('/static/assets/', express.static(options.assets));
console.log('assets served from', options.assets);
@@ -141,7 +159,13 @@ let hash = "#cpu";
if (options.use_gpu) {
hash = "#gpu";
}
-const targetURL = `http://localhost:${options.port}/${hash}`;
+let query_param_string = '?';
+if (options.query_params) {
+ for (const string of options.query_params) {
+ query_param_string += string + '&';
+ }
+}
+const targetURL = `http://localhost:${options.port}/${query_param_string}${hash}`;
const viewPort = {width: 1000, height: 1000};
// Drive chrome to load the web page from the server we have running.
@@ -154,6 +178,11 @@ async function driveBrowser() {
'--no-sandbox',
'--disable-setuid-sandbox',
'--window-size=' + viewPort.width + ',' + viewPort.height,
+ // The following two params allow Chrome to run at an unlimited fps. Note, if there is
+ // already a chrome instance running, these arguments will have NO EFFECT, as the existing
+ // Chrome instance will be used instead of puppeteer spinning up a new one.
+ '--disable-frame-rate-limit',
+ '--disable-gpu-vsync',
];
if (options.use_gpu) {
browser_args.push('--ignore-gpu-blacklist');
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html
new file mode 100644
index 00000000000..ef1ed254580
--- /dev/null
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/render-skp.html
@@ -0,0 +1,157 @@
+<!-- This benchmark aims to accurately measure the time it takes for CanvasKit to render
+ an SKP from our test corpus. It is very careful to measure the time between frames. This form
+ of measurement makes sure we are capturing the GPU draw time. CanvasKit.flush() returns after
+ it has sent all the instructions to the GPU, but we don't know the GPU is done until the next
+ frame is requested. Thus, we need to keep track of the time between frames in order to
+ accurately calculate draw time. Keeping track of the drawPicture and drawPicture+flush is still
+ useful for telling us how much time we are spending in WASM land and if our drawing is CPU
+ bound or GPU bound. If total_frame_ms is close to with_flush_ms, we are CPU bound; if
+ total_frame_ms >> with_flush_ms, we are GPU bound.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CanvasKit SKP Perf</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="/static/canvaskit.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
+</head>
+<body>
+ <main>
+ <button id="start_bench">Start Benchmark</button>
+ <br>
+ <canvas id=anim width=1000 height=1000 style="height: 1000px; width: 1000px;"></canvas>
+ </main>
+ <script type="text/javascript" charset="utf-8">
+ const WIDTH = 1000;
+ const HEIGHT = 1000;
+ // Run this number of frames before starting to measure things. This allows us to make sure
+ // the noise from the first few renders (e.g shader compilation, caches) is removed from the
+ // data we capture.
+ const WARM_UP_FRAMES = 10;
+ const MAX_FRAMES = 201; // This should be sufficient to have low noise.
+
+ const SKP_PATH = '/static/test.skp';
+ (function() {
+
+ const loadKit = CanvasKitInit({
+ locateFile: (file) => '/static/' + file,
+ });
+
+ const loadSKP = fetch(SKP_PATH).then((resp) => {
+ return resp.arrayBuffer();
+ });
+
+ Promise.all([loadKit, loadSKP]).then((values) => {
+ const [CanvasKit, skpBytes] = values;
+ const loadStart = performance.now();
+ const skp = CanvasKit.MakeSkPicture(skpBytes);
+ const loadTime = performance.now() - loadStart;
+ console.log('loaded skp', skp, loadTime);
+ if (!skp) {
+ window._error = 'could not read skp';
+ return;
+ }
+
+ const surface = getSurface(CanvasKit);
+ if (!surface) {
+ console.error('Could not make surface', window._error);
+ return;
+ }
+ const canvas = surface.getCanvas();
+
+ document.getElementById('start_bench').addEventListener('click', () => {
+ const clearColor = CanvasKit.WHITE;
+ const totalFrame = new Float32Array(MAX_FRAMES);
+ const withFlush = new Float32Array(MAX_FRAMES);
+ const withoutFlush = new Float32Array(MAX_FRAMES);
+ let warmUp = true;
+ let idx = 0;
+
+ let previousFrame;
+
+ function drawFrame() {
+ const start = performance.now();
+ canvas.clear(clearColor);
+ canvas.drawPicture(skp);
+ const afterDraw = performance.now();
+ surface.flush();
+ const end = performance.now();
+
+ if (warmUp) {
+ idx++;
+ if (idx >= WARM_UP_FRAMES) {
+ idx = -1;
+ warmUp = false;
+ }
+ window.requestAnimationFrame(drawFrame);
+ return;
+ }
+ if (idx >= 0) {
+ // Fill out total time the previous frame took to draw.
+ totalFrame[idx] = start - previousFrame;
+ }
+ previousFrame = start;
+ idx++;
+ // If we have maxed out the frames we are measuring or have completed the animation,
+ // we stop benchmarking.
+ if (idx >= withFlush.length) {
+ window._perfData = {
+ total_frame_ms: Array.from(totalFrame).slice(0, idx),
+ with_flush_ms: Array.from(withFlush).slice(0, idx),
+ without_flush_ms: Array.from(withoutFlush).slice(0, idx),
+ skp_load_ms: loadTime,
+ };
+ window._perfDone = true;
+ return;
+ }
+
+ // We can fill out this frame's intermediate steps.
+ withFlush[idx] = end - start;
+ withoutFlush[idx] = afterDraw - start;
+ window.requestAnimationFrame(drawFrame);
+ }
+ window.requestAnimationFrame(drawFrame);
+ });
+ console.log('Perf is ready');
+ window._perfReady = true;
+ });
+ }
+ )();
+
+ // TODO(kjlubick) make this configurable to return a WEBGL 1 or WEBGL 2 surface.
+ function getSurface(CanvasKit) {
+ let surface;
+ if (window.location.hash.indexOf('gpu') !== -1) {
+ surface = CanvasKit.MakeWebGLCanvasSurface('anim');
+ if (!surface) {
+ window._error = 'Could not make GPU surface';
+ return null;
+ }
+ let c = document.getElementById('anim');
+ // If CanvasKit was unable to instantiate a WebGL context, it will fallback
+ // to CPU and add a ck-replaced class to the canvas element.
+ if (c.classList.contains('ck-replaced')) {
+ window._error = 'fell back to CPU';
+ return null;
+ }
+ } else {
+ surface = CanvasKit.MakeSWCanvasSurface('anim');
+ if (!surface) {
+ window._error = 'Could not make CPU surface';
+ return null;
+ }
+ }
+ return surface;
+ }
+
+ </script>
+</body>
+</html>
diff --git a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html
index f6bbf1a6837..19728d3cc40 100644
--- a/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html
+++ b/chromium/third_party/skia/tools/perf-canvaskit-puppeteer/skottie-frames.html
@@ -36,7 +36,7 @@ would display the animation (e.g. using clock time to determine where to seek, n
const loadKit = CanvasKitInit({
locateFile: (file) => '/static/' + file,
- }).ready();
+ });
const loadLottie = fetch(LOTTIE_JSON_PATH).then((resp) => {
return resp.text()
@@ -118,7 +118,7 @@ would display the animation (e.g. using clock time to determine where to seek, n
function getSurface(CanvasKit) {
let surface;
if (window.location.hash.indexOf('gpu') !== -1) {
- surface = CanvasKit.MakeWebGLCanvasSurface('anim', WIDTH, HEIGHT);
+ surface = CanvasKit.MakeWebGLCanvasSurface('anim');
if (!surface) {
window._error = 'Could not make GPU surface';
return null;
@@ -131,7 +131,7 @@ would display the animation (e.g. using clock time to determine where to seek, n
return null;
}
} else {
- surface = CanvasKit.MakeSWCanvasSurface('anim', WIDTH, HEIGHT);
+ surface = CanvasKit.MakeSWCanvasSurface('anim');
if (!surface) {
window._error = 'Could not make CPU surface';
return null;
diff --git a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp
index 4abbd9d667d..970c67ec0c1 100644
--- a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp
+++ b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.cpp
@@ -317,12 +317,14 @@ bool VulkanWindowContext::createSwapchain(int width, int height,
fDestroySwapchainKHR(fDevice, swapchainCreateInfo.oldSwapchain, nullptr);
}
- this->createBuffers(swapchainCreateInfo.imageFormat, colorType);
+ this->createBuffers(swapchainCreateInfo.imageFormat, colorType,
+ swapchainCreateInfo.imageSharingMode);
return true;
}
-void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType) {
+void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType,
+ VkSharingMode sharingMode) {
fGetSwapchainImagesKHR(fDevice, fSwapchain, &fImageCount, nullptr);
SkASSERT(fImageCount);
fImages = new VkImage[fImageCount];
@@ -342,6 +344,7 @@ void VulkanWindowContext::createBuffers(VkFormat format, SkColorType colorType)
info.fFormat = format;
info.fLevelCount = 1;
info.fCurrentQueueFamily = fPresentQueueIndex;
+ info.fSharingMode = sharingMode;
if (fSampleCount == 1) {
GrBackendRenderTarget backendRT(fWidth, fHeight, fSampleCount, info);
@@ -525,7 +528,9 @@ void VulkanWindowContext::swapBuffers() {
GrFlushInfo info;
info.fNumSemaphores = 1;
info.fSignalSemaphores = &beSemaphore;
- surface->flush(SkSurface::BackendSurfaceAccess::kPresent, info);
+ GrBackendSurfaceMutableState presentState(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, fPresentQueueIndex);
+ surface->flush(info, &presentState);
+ surface->getContext()->submit();
// Submit present operation to present queue
const VkPresentInfoKHR presentInfo =
diff --git a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h
index 2db9e79ae62..5e245aff700 100644
--- a/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h
+++ b/chromium/third_party/skia/tools/sk_app/VulkanWindowContext.h
@@ -61,7 +61,7 @@ private:
BackbufferInfo* getAvailableBackbuffer();
bool createSwapchain(int width, int height, const DisplayParams& params);
- void createBuffers(VkFormat format, SkColorType colorType);
+ void createBuffers(VkFormat format, SkColorType colorType, VkSharingMode);
void destroyBuffers();
VkInstance fInstance = VK_NULL_HANDLE;
diff --git a/chromium/third_party/skia/tools/sk_app/Window.cpp b/chromium/third_party/skia/tools/sk_app/Window.cpp
index bf125a83200..c8c6cd278dc 100644
--- a/chromium/third_party/skia/tools/sk_app/Window.cpp
+++ b/chromium/third_party/skia/tools/sk_app/Window.cpp
@@ -89,7 +89,7 @@ void Window::onPaint() {
this->visitLayers([](Layer* layer) { layer->onPrePaint(); });
this->visitLayers([=](Layer* layer) { layer->onPaint(backbuffer.get()); });
- backbuffer->flush();
+ backbuffer->flushAndSubmit();
fWindowContext->swapBuffers();
}
diff --git a/chromium/third_party/skia/tools/sk_app/Window.h b/chromium/third_party/skia/tools/sk_app/Window.h
index 0648e970ce8..f2d40360fc8 100644
--- a/chromium/third_party/skia/tools/sk_app/Window.h
+++ b/chromium/third_party/skia/tools/sk_app/Window.h
@@ -61,6 +61,9 @@ public:
#ifdef SK_METAL
kMetal_BackendType,
#endif
+#ifdef SK_DIRECT3D
+ kDirect3D_BackendType,
+#endif
kRaster_BackendType,
kLast_BackendType = kRaster_BackendType
diff --git a/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp b/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp
new file mode 100644
index 00000000000..55df2820a27
--- /dev/null
+++ b/chromium/third_party/skia/tools/sk_app/win/D3D12WindowContext_win.cpp
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "tools/sk_app/WindowContext.h"
+#include "tools/sk_app/win/WindowContextFactory_win.h"
+
+#include "tools/gpu/d3d/D3DTestUtils.h"
+
+#include "include/core/SkSurface.h"
+#include "include/gpu/d3d/GrD3DBackendContext.h"
+
+#include <d3d12.h>
+#include <dxgi1_4.h>
+#include <wrl/client.h>
+
+#define GR_D3D_CALL_ERRCHECK(X) \
+ do { \
+ HRESULT result = X; \
+ SkASSERT(SUCCEEDED(result)); \
+ if (!SUCCEEDED(result)) { \
+ SkDebugf("Failed Direct3D call. Error: 0x%08x\n", result); \
+ } \
+ } while(false)
+
+using namespace Microsoft::WRL;
+
+namespace sk_app {
+
+class D3D12WindowContext : public WindowContext {
+public:
+ D3D12WindowContext(HWND hwnd, const DisplayParams& params);
+ ~D3D12WindowContext() override;
+ void initializeContext();
+ void destroyContext();
+ void setupSurfaces(int width, int height);
+
+ bool isValid() override {
+ return fDevice.get() != nullptr;
+ }
+
+ sk_sp<SkSurface> getBackbufferSurface() override;
+ void swapBuffers() override;
+
+ void resize(int width, int height) override;
+ void setDisplayParams(const DisplayParams& params) override;
+private:
+ static constexpr int kNumFrames = 2;
+
+ HWND fWindow;
+ gr_cp<ID3D12Device> fDevice;
+ gr_cp<ID3D12CommandQueue> fQueue;
+ gr_cp<IDXGISwapChain3> fSwapChain;
+ gr_cp<ID3D12Resource> fBuffers[kNumFrames];
+ sk_sp<SkSurface> fSurfaces[kNumFrames];
+
+ // Synchronization objects.
+ unsigned int fBufferIndex;
+ HANDLE fFenceEvent;
+ gr_cp<ID3D12Fence> fFence;
+ uint64_t fFenceValues[kNumFrames];
+};
+
+D3D12WindowContext::D3D12WindowContext(HWND hwnd, const DisplayParams& params)
+ : WindowContext(params)
+ , fWindow(hwnd) {
+
+ this->initializeContext();
+}
+
+D3D12WindowContext::~D3D12WindowContext() {
+ this->destroyContext();
+}
+
+void D3D12WindowContext::initializeContext() {
+ GrD3DBackendContext backendContext;
+ sk_gpu_test::CreateD3DBackendContext(&backendContext);
+ fDevice = backendContext.fDevice;
+ fQueue = backendContext.fQueue;
+
+ fContext = GrContext::MakeDirect3D(backendContext, fDisplayParams.fGrContextOptions);
+ SkASSERT(fContext);
+
+ // Make the swapchain
+ RECT windowRect;
+ GetWindowRect(fWindow, &windowRect);
+ unsigned int width = windowRect.right - windowRect.left;
+ unsigned int height = windowRect.bottom - windowRect.top;
+
+ UINT dxgiFactoryFlags = 0;
+ SkDEBUGCODE(dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;)
+
+ gr_cp<IDXGIFactory4> factory;
+ GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory)));
+
+ DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
+ swapChainDesc.BufferCount = kNumFrames;
+ swapChainDesc.Width = width;
+ swapChainDesc.Height = height;
+ swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
+ swapChainDesc.SampleDesc.Count = 1; // TODO: support MSAA
+
+ gr_cp<IDXGISwapChain1> swapChain;
+ GR_D3D_CALL_ERRCHECK(factory->CreateSwapChainForHwnd(
+ fQueue.get(), fWindow, &swapChainDesc, nullptr, nullptr, &swapChain));
+
+ // We don't support fullscreen transitions.
+ GR_D3D_CALL_ERRCHECK(factory->MakeWindowAssociation(fWindow, DXGI_MWA_NO_ALT_ENTER));
+
+ GR_D3D_CALL_ERRCHECK(swapChain->QueryInterface(IID_PPV_ARGS(&fSwapChain)));
+
+ fBufferIndex = fSwapChain->GetCurrentBackBufferIndex();
+
+ this->setupSurfaces(width, height);
+
+ for (int i = 0; i < kNumFrames; ++i) {
+ fFenceValues[i] = 1;
+ }
+ GR_D3D_CALL_ERRCHECK(fDevice->CreateFence(fFenceValues[fBufferIndex], D3D12_FENCE_FLAG_NONE,
+ IID_PPV_ARGS(&fFence)));
+
+ fFenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
+ SkASSERT(fFenceEvent);
+
+ fWidth = width;
+ fHeight = height;
+}
+
+void D3D12WindowContext::setupSurfaces(int width, int height) {
+ // set up base resource info
+ GrD3DTextureResourceInfo info(nullptr,
+ D3D12_RESOURCE_STATE_PRESENT,
+ DXGI_FORMAT_R8G8B8A8_UNORM,
+ 1,
+ 0);
+ for (int i = 0; i < kNumFrames; ++i) {
+ GR_D3D_CALL_ERRCHECK(fSwapChain->GetBuffer(i, IID_PPV_ARGS(&fBuffers[i])));
+
+ SkASSERT(fBuffers[i]->GetDesc().Width == (UINT64)width &&
+ fBuffers[i]->GetDesc().Height == (UINT64)height);
+
+ // TODO: support MSAA
+ info.fResource = fBuffers[i];
+ GrBackendRenderTarget backendRT(width, height, 1, info);
+ fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(
+ fContext.get(), backendRT, kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+ fDisplayParams.fColorSpace, &fDisplayParams.fSurfaceProps);
+ }
+}
+
+void D3D12WindowContext::destroyContext() {
+ CloseHandle(fFenceEvent);
+ fFence.reset(nullptr);
+
+ for (int i = 0; i < kNumFrames; ++i) {
+ fSurfaces[i].reset(nullptr);
+ fBuffers[i].reset(nullptr);
+ }
+
+ fSwapChain.reset(nullptr);
+ fQueue.reset(nullptr);
+ fDevice.reset(nullptr);
+}
+
+sk_sp<SkSurface> D3D12WindowContext::getBackbufferSurface() {
+ // Update the frame index.
+ const UINT64 currentFenceValue = fFenceValues[fBufferIndex];
+ fBufferIndex = fSwapChain->GetCurrentBackBufferIndex();
+
+ // If the last frame for this buffer index is not done, wait until it is ready.
+ if (fFence->GetCompletedValue() < fFenceValues[fBufferIndex]) {
+ GR_D3D_CALL_ERRCHECK(fFence->SetEventOnCompletion(fFenceValues[fBufferIndex], fFenceEvent));
+ WaitForSingleObjectEx(fFenceEvent, INFINITE, FALSE);
+ }
+
+ // Set the fence value for the next frame.
+ fFenceValues[fBufferIndex] = currentFenceValue + 1;
+
+ return fSurfaces[fBufferIndex];
+}
+
+void D3D12WindowContext::swapBuffers() {
+ SkSurface* surface = fSurfaces[fBufferIndex].get();
+
+ GrFlushInfo info;
+ surface->flush(SkSurface::BackendSurfaceAccess::kPresent, info);
+ fContext->submit();
+
+ GR_D3D_CALL_ERRCHECK(fSwapChain->Present(1, 0));
+
+ // Schedule a Signal command in the queue.
+ GR_D3D_CALL_ERRCHECK(fQueue->Signal(fFence.get(), fFenceValues[fBufferIndex]));
+}
+
+void D3D12WindowContext::resize(int width, int height) {
+ // Clean up any outstanding resources in command lists
+ fContext->flush({});
+ fContext->submit(true);
+
+ // release the previous surface and backbuffer resources
+ for (int i = 0; i < kNumFrames; ++i) {
+ // Let present complete
+ if (fFence->GetCompletedValue() < fFenceValues[i]) {
+ GR_D3D_CALL_ERRCHECK(fFence->SetEventOnCompletion(fFenceValues[i], fFenceEvent));
+ WaitForSingleObjectEx(fFenceEvent, INFINITE, FALSE);
+ }
+ fSurfaces[i].reset(nullptr);
+ fBuffers[i].reset(nullptr);
+ }
+
+ GR_D3D_CALL_ERRCHECK(fSwapChain->ResizeBuffers(0, width, height,
+ DXGI_FORMAT_R8G8B8A8_UNORM, 0));
+
+ this->setupSurfaces(width, height);
+
+ fWidth = width;
+ fHeight = height;
+}
+
+void D3D12WindowContext::setDisplayParams(const DisplayParams& params) {
+ this->destroyContext();
+ fDisplayParams = params;
+ this->initializeContext();
+}
+
+namespace window_context_factory {
+
+std::unique_ptr<WindowContext> MakeD3D12ForWin(HWND hwnd, const DisplayParams& params) {
+ std::unique_ptr<WindowContext> ctx(new D3D12WindowContext(hwnd, params));
+ if (!ctx->isValid()) {
+ return nullptr;
+ }
+ return ctx;
+}
+
+}
+
+} //namespace sk_app
diff --git a/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h b/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h
index 33dd6d413b8..c05a4f0acf5 100644
--- a/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h
+++ b/chromium/third_party/skia/tools/sk_app/win/WindowContextFactory_win.h
@@ -26,6 +26,10 @@ std::unique_ptr<WindowContext> MakeGLForWin(HWND, const DisplayParams&);
std::unique_ptr<WindowContext> MakeANGLEForWin(HWND, const DisplayParams&);
+#ifdef SK_DIRECT3D
+std::unique_ptr<WindowContext> MakeD3D12ForWin(HWND, const DisplayParams&);
+#endif
+
#ifdef SK_DAWN
std::unique_ptr<WindowContext> MakeDawnD3D12ForWin(HWND, const DisplayParams&);
#endif
diff --git a/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp b/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp
index 9afe0886b40..de001bfbb04 100644
--- a/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp
+++ b/chromium/third_party/skia/tools/sk_app/win/Window_win.cpp
@@ -377,6 +377,12 @@ bool Window_win::attach(BackendType attachType) {
window_context_factory::MakeVulkanForWin(fHWnd, fRequestedDisplayParams);
break;
#endif
+#ifdef SK_DIRECT3D
+ case kDirect3D_BackendType:
+ fWindowContext =
+ window_context_factory::MakeD3D12ForWin(fHWnd, fRequestedDisplayParams);
+ break;
+#endif
}
this->onBackendCreated();
diff --git a/chromium/third_party/skia/tools/skiaserve/Response.cpp b/chromium/third_party/skia/tools/skiaserve/Response.cpp
index d74963a62d5..6ad5c3bfeb0 100644
--- a/chromium/third_party/skia/tools/skiaserve/Response.cpp
+++ b/chromium/third_party/skia/tools/skiaserve/Response.cpp
@@ -25,7 +25,7 @@ static SkString generate_template(SkString source) {
"<head>\n"
" <title>SkDebugger</title>\n"
" <meta charset='utf-8' />\n"
- " <meta http-equiv='X-UA-Compatible' content='IE=egde,chrome=1'>\n"
+ " <meta http-equiv='X-UA-Compatible' content='IE=edge'>\n"
" <meta name='viewport' content='width=device-width, initial-scale=1.0'>\n"
" <script src='%s/res/js/core.js' type='text/javascript' charset='utf-8'></script>\n"
" <link href='%s/res/vul/elements.html' rel='import' />\n"
diff --git a/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html b/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html
index f7fd4a1e485..ac29945eb0e 100644
--- a/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html
+++ b/chromium/third_party/skia/tools/skottie-wasm-perf/skottie-wasm-perf.html
@@ -1,17 +1,17 @@
<!DOCTYPE html>
<html>
<head>
- <title>Skottie-WASM Perf</title>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="res/canvaskit.js" type="text/javascript" charset="utf-8"></script>
- <style type="text/css" media="screen">
- body {
- margin: 0;
- padding: 0;
- }
- </style>
+ <title>Skottie-WASM Perf</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="res/canvaskit.js" type="text/javascript" charset="utf-8"></script>
+ <style type="text/css" media="screen">
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
</head>
<body>
<main>
@@ -26,7 +26,7 @@
CanvasKitInit({
locateFile: (file) => '/res/'+file,
- }).ready().then((CanvasKit) => {
+ }).then((CanvasKit) => {
CK = CanvasKit;
Bench(CK, lottieJSON);
});
diff --git a/chromium/third_party/skia/tools/skottie2movie.cpp b/chromium/third_party/skia/tools/skottie2movie.cpp
index ca887b5d729..e9da0d111c6 100644
--- a/chromium/third_party/skia/tools/skottie2movie.cpp
+++ b/chromium/third_party/skia/tools/skottie2movie.cpp
@@ -146,6 +146,7 @@ int main(int argc, char** argv) {
SkSurface::RescaleGamma::kSrc,
kNone_SkFilterQuality,
read_pixels_cb, &asyncRec);
+ surf->getContext()->submit();
} else {
SkPixmap pm;
SkAssertResult(surf->peekPixels(&pm));
diff --git a/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm b/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm
index 4b12f38f98d..e6e4e048806 100644
--- a/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm
+++ b/chromium/third_party/skia/tools/skottie_ios_app/SkiaGLContext.mm
@@ -87,7 +87,7 @@ static sk_sp<SkSurface> make_gl_surface(GrContext* grContext, int width, int hei
[viewController draw:rect
toCanvas:(surface->getCanvas())
atSize:CGSize{(CGFloat)width, (CGFloat)height}];
- surface->flush();
+ surface->flushAndSubmit();
}
if (next) {
[NSTimer scheduledTimerWithTimeInterval:std::max(0.0, next - SkTime::GetNSecs() * 1e-9)
diff --git a/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm b/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm
index b49e360110d..f67d547885f 100644
--- a/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm
+++ b/chromium/third_party/skia/tools/skottie_ios_app/SkiaMetalContext.mm
@@ -55,7 +55,7 @@
return;
}
[viewController draw:rect toCanvas:surface->getCanvas() atSize:size];
- surface->flush();
+ surface->flushAndSubmit();
surface = nullptr;
id<MTLCommandBuffer> commandBuffer = [fQueue commandBuffer];
diff --git a/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py b/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py
index 594faf15600..9eaa54a4541 100644
--- a/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py
+++ b/chromium/third_party/skia/tools/skp/page_sets/skia_css3gradients_desktop.py
@@ -37,7 +37,8 @@ class SkiaCss3gradientsDesktopPageSet(story.StorySet):
urls_list = [
# Why: http://code.google.com/p/chromium/issues/detail?id=168448
- 'https://www.webkit.org/blog/1424/css3-gradients/',
+ # and https://bugs.chromium.org/p/skia/issues/detail?id=10390
+ 'https://www.w3schools.com/css/css3_gradients.asp',
]
for url in urls_list:
diff --git a/chromium/third_party/skia/tools/skpbench/README.md b/chromium/third_party/skia/tools/skpbench/README.md
new file mode 100644
index 00000000000..830c1568e2d
--- /dev/null
+++ b/chromium/third_party/skia/tools/skpbench/README.md
@@ -0,0 +1,67 @@
+# skpbench
+
+skpbench is a benchmarking tool for replaying skp or mksp files on android devices.
+it achieves a lower variance in framerate by controlling the clock speed and stopping
+all other processes that could cause interference.
+
+## Build
+
+skpbench consists of the skpbench binary which must be built for the phone you intend to run on,
+and skpbench.py which runs on the machine the phone is connected to via ADB and is the entry point.
+
+The to build skia for android are at https://skia.org/user/build#android and reproduced here.
+
+Download the Android NDK
+
+```
+cipd auth-login
+python2 infra/bots/assets/android_ndk_linux/download.py -t /tmp/ndk
+
+```
+
+After this is set up once, build skpbench for your target cpu (assumed to be arm64 here for a Pixel 3)
+
+```
+bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64" is_debug=false'
+ninja -C out/arm64 skpbench
+```
+
+## Benchmark an SKP on a connected device.
+
+First, copy the built skpbench binary and an example skp file to the device.
+
+```
+adb push out/arm64/skpbench /data/local/tmp
+adb push /home/nifong/Downloads/foo.skp /data/local/tmp/skps/
+```
+
+Run skpbench.py (in my case on a Pixel 3)
+
+```
+python tools/skpbench/skpbench.py \
+ --adb \
+ --force \
+ --config gles \
+ /data/local/tmp/skpbench \
+ /data/local/tmp/skps/foo.skp
+```
+
+`--adb` specifies that it should use adb to the only connected device and run skpbench there.
+`--force` is necessary because we don't yet have a configuration to monitor vitals on the Pixel 3.
+`--config gles` specifies Open GL ES is the backend GPU config to use.
+
+Additional documentation of arguments is printed by `python tools/skpbench/skpbench.py --help`
+
+Output appears in the following format
+```
+ accum median max min stddev samples sample_ms clock metric config bench
+ 0.1834 0.1832 0.1897 0.1707 1.59% 101 50 cpu ms gles foo.skp
+```
+
+`accum` is the time taken to draw all frames, divided by the number of frames.
+`metric` specifies that the unit is ms (milliseconds per frame)
+
+## Production
+
+skpbench is run as a tryjob from gerrit, where it uploads the results to perf.skia.org.
+TODO(nifong, csmartdalton): elaborate on this section. \ No newline at end of file
diff --git a/chromium/third_party/skia/tools/skpbench/skpbench.cpp b/chromium/third_party/skia/tools/skpbench/skpbench.cpp
index 8a0dda48a0b..e0c0fcb5776 100644
--- a/chromium/third_party/skia/tools/skpbench/skpbench.cpp
+++ b/chromium/third_party/skia/tools/skpbench/skpbench.cpp
@@ -60,8 +60,7 @@
*/
static DEFINE_bool(ddl, false, "record the skp into DDLs before rendering");
-static DEFINE_int(ddlNumAdditionalThreads, 0,
- "number of DDL recording threads in addition to main one");
+static DEFINE_int(ddlNumRecordingThreads, 0, "number of DDL recording threads (0=num_cores)");
static DEFINE_int(ddlTilingWidthHeight, 0, "number of tiles along one edge when in DDL mode");
static DEFINE_bool(comparableDDL, false, "render in a way that is comparable to 'comparableSKP'");
@@ -201,7 +200,8 @@ private:
std::vector<SkDocumentPage> fFrames;
};
-static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSync, Sample* sample,
+static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSync,
+ Sample* sample, SkTaskGroup* recordingTaskGroup, SkTaskGroup* gpuTaskGroup,
std::chrono::high_resolution_clock::time_point* startStopTime) {
using clock = std::chrono::high_resolution_clock;
@@ -220,12 +220,18 @@ static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSyn
// through a DDL.
tiles->drawAllTilesDirectly(context);
} else {
- // TODO: Here we create all the DDLs, wait, and then draw them all. This should be updated
- // to use the GPUDDLSink method of having a separate GPU thread.
- tiles->createDDLsInParallel();
- tiles->precompileAndDrawAllTiles(context);
+ tiles->kickOffThreadedWork(recordingTaskGroup, gpuTaskGroup, context);
+ recordingTaskGroup->wait();
+ }
+
+ if (gpuTaskGroup) {
+ gpuTaskGroup->add([&]{
+ flush_with_sync(context, gpuSync);
+ });
+ gpuTaskGroup->wait();
+ } else {
+ flush_with_sync(context, gpuSync);
}
- flush_with_sync(context, gpuSync);
*startStopTime = clock::now();
@@ -235,8 +241,9 @@ static void ddl_sample(GrContext* context, DDLTileHelper* tiles, GpuSync& gpuSyn
}
}
-static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface,
- SkPicture* inputPicture, std::vector<Sample>* samples) {
+static void run_ddl_benchmark(sk_gpu_test::TestContext* testContext, GrContext *context,
+ sk_sp<SkSurface> dstSurface, SkPicture* inputPicture,
+ std::vector<Sample>* samples) {
using clock = std::chrono::high_resolution_clock;
const Sample::duration sampleDuration = std::chrono::milliseconds(FLAGS_sampleMs);
const clock::duration benchDuration = std::chrono::milliseconds(FLAGS_duration);
@@ -262,12 +269,26 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface,
tiles.createSKPPerTile(compressedPictureData.get(), promiseImageHelper);
- SkTaskGroup::Enabler enabled(FLAGS_ddlNumAdditionalThreads);
+ // In comparable modes, there is no GPU thread. The following pointers are all null.
+ // Otherwise, we transfer testContext onto the GPU thread until after the bench.
+ std::unique_ptr<SkExecutor> gpuThread;
+ std::unique_ptr<SkTaskGroup> gpuTaskGroup;
+ std::unique_ptr<SkExecutor> recordingThreadPool;
+ std::unique_ptr<SkTaskGroup> recordingTaskGroup;
+ if (!FLAGS_comparableDDL && !FLAGS_comparableSKP) {
+ gpuThread = SkExecutor::MakeFIFOThreadPool(1, false);
+ gpuTaskGroup = std::make_unique<SkTaskGroup>(*gpuThread);
+ recordingThreadPool = SkExecutor::MakeFIFOThreadPool(FLAGS_ddlNumRecordingThreads, false);
+ recordingTaskGroup = std::make_unique<SkTaskGroup>(*recordingThreadPool);
+ testContext->makeNotCurrent();
+ gpuTaskGroup->add([=]{ testContext->makeCurrent(); });
+ }
clock::time_point startStopTime = clock::now();
GpuSync gpuSync;
- ddl_sample(context, &tiles, gpuSync, nullptr, &startStopTime);
+ ddl_sample(context, &tiles, gpuSync, nullptr, recordingTaskGroup.get(),
+ gpuTaskGroup.get(), &startStopTime);
clock::duration cumulativeDuration = std::chrono::milliseconds(0);
@@ -277,16 +298,26 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface,
do {
tiles.resetAllTiles();
- ddl_sample(context, &tiles, gpuSync, &sample, &startStopTime);
+ ddl_sample(context, &tiles, gpuSync, &sample, recordingTaskGroup.get(),
+ gpuTaskGroup.get(), &startStopTime);
} while (sample.fDuration < sampleDuration);
cumulativeDuration += sample.fDuration;
} while (cumulativeDuration < benchDuration || 0 == samples->size() % 2);
+ // Move the context back to this thread now that we're done benching.
+ if (gpuTaskGroup) {
+ gpuTaskGroup->add([=]{
+ testContext->makeNotCurrent();
+ });
+ gpuTaskGroup->wait();
+ testContext->makeCurrent();
+ }
+
if (!FLAGS_png.isEmpty()) {
// The user wants to see the final result
dstSurface->draw(tiles.composeDDL());
- dstSurface->flush();
+ dstSurface->flushAndSubmit();
}
tiles.resetAllTiles();
@@ -296,6 +327,7 @@ static void run_ddl_benchmark(GrContext* context, sk_sp<SkSurface> dstSurface,
GrFlushInfo flushInfo;
flushInfo.fFlags = kSyncCpu_GrFlushFlag;
context->flush(flushInfo);
+ context->submit(true);
promiseImageHelper.deleteAllFromGPU(nullptr, context);
@@ -335,6 +367,7 @@ static void run_benchmark(GrContext* context, SkSurface* surface, SkpProducer* s
GrFlushInfo flushInfo;
flushInfo.fFlags = kSyncCpu_GrFlushFlag;
surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo);
+ context->submit(true);
}
static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* context,
@@ -377,8 +410,10 @@ static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* c
using QueryStatus = sk_gpu_test::GpuTimer::QueryStatus;
case QueryStatus::kInvalid:
exitf(ExitErr::kUnavailable, "GPU timer failed");
+ break;
case QueryStatus::kPending:
exitf(ExitErr::kUnavailable, "timer query still not ready after fence sync");
+ break;
case QueryStatus::kDisjoint:
if (FLAGS_verbosity >= 4) {
fprintf(stderr, "discarding timer query due to disjoint operations.\n");
@@ -402,6 +437,7 @@ static void run_gpu_time_benchmark(sk_gpu_test::GpuTimer* gpuTimer, GrContext* c
GrFlushInfo flushInfo;
flushInfo.fFlags = kSyncCpu_GrFlushFlag;
surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo);
+ context->submit(true);
}
void print_result(const std::vector<Sample>& samples, const char* config, const char* bench) {
@@ -577,7 +613,7 @@ int main(int argc, char** argv) {
}
if (!FLAGS_gpuClock) {
if (FLAGS_ddl) {
- run_ddl_benchmark(ctx, surface, skp.get(), &samples);
+ run_ddl_benchmark(testCtx, ctx, surface, skp.get(), &samples);
} else if (!mskp) {
auto s = std::make_unique<StaticSkp>(skp);
run_benchmark(ctx, surface.get(), s.get(), &samples);
@@ -621,6 +657,7 @@ static void flush_with_sync(GrContext* context, GpuSync& gpuSync) {
flushInfo.fFinishedContext = gpuSync.newFlushTracker(context);
context->flush(flushInfo);
+ context->submit();
}
static void draw_skp_and_flush_with_sync(GrContext* context, SkSurface* surface,
diff --git a/chromium/third_party/skia/tools/skpbench/skpbench.py b/chromium/third_party/skia/tools/skpbench/skpbench.py
index 8c53e9aed45..8c148188808 100755
--- a/chromium/third_party/skia/tools/skpbench/skpbench.py
+++ b/chromium/third_party/skia/tools/skpbench/skpbench.py
@@ -73,9 +73,9 @@ __argparse.add_argument('-a', '--resultsfile',
help="optional file to append results into")
__argparse.add_argument('--ddl',
action='store_true', help="record the skp into DDLs before rendering")
-__argparse.add_argument('--ddlNumAdditionalThreads',
+__argparse.add_argument('--ddlNumRecordingThreads',
type=int, default=0,
- help="number of DDL recording threads in addition to main one")
+ help="number of DDL recording threads (0=num_cores)")
__argparse.add_argument('--ddlTilingWidthHeight',
type=int, default=0, help="number of tiles along one edge when in DDL mode")
__argparse.add_argument('--gpuThreads',
@@ -144,9 +144,9 @@ class SKPBench:
# DDL parameters
if FLAGS.ddl:
ARGV.extend(['--ddl', 'true'])
- if FLAGS.ddlNumAdditionalThreads:
- ARGV.extend(['--ddlNumAdditionalThreads',
- str(FLAGS.ddlNumAdditionalThreads)])
+ if FLAGS.ddlNumRecordingThreads:
+ ARGV.extend(['--ddlNumRecordingThreads',
+ str(FLAGS.ddlNumRecordingThreads)])
if FLAGS.ddlTilingWidthHeight:
ARGV.extend(['--ddlTilingWidthHeight', str(FLAGS.ddlTilingWidthHeight)])
diff --git a/chromium/third_party/skia/tools/skqp/bad_gms.txt b/chromium/third_party/skia/tools/skqp/bad_gms.txt
index 551ba444af8..bf0c1f3b676 100644
--- a/chromium/third_party/skia/tools/skqp/bad_gms.txt
+++ b/chromium/third_party/skia/tools/skqp/bad_gms.txt
@@ -1,5 +1,4 @@
arcs_as_paths
-atlastext
bigbitmaprect_i
bigbitmaprect_s
blurcircles2
diff --git a/chromium/third_party/skia/tools/valgrind.supp b/chromium/third_party/skia/tools/valgrind.supp
index 1e3a3e84106..57f7586ecfb 100644
--- a/chromium/third_party/skia/tools/valgrind.supp
+++ b/chromium/third_party/skia/tools/valgrind.supp
@@ -317,3 +317,19 @@
fun:_Z12GrClearImageRK11GrImageInfoPvm8SkRGBA4fIL11SkAlphaType3EE
...
}
+{
+ make_get_error_with_random_oom1
+ Memcheck:Leak
+ match-leak-kinds: definite
+ ...
+ fun:_Z30make_get_error_with_random_oom12GrGLFunctionIFjvEE
+ ...
+}
+{
+ make_get_error_with_random_oom2
+ Memcheck:Leak
+ match-leak-kinds: definite
+ ...
+ fun:make_get_error_with_random_oom
+ ...
+}
diff --git a/chromium/third_party/skia/tools/viewer/GMSlide.cpp b/chromium/third_party/skia/tools/viewer/GMSlide.cpp
index 24d8421b304..1f904eb9dce 100644
--- a/chromium/third_party/skia/tools/viewer/GMSlide.cpp
+++ b/chromium/third_party/skia/tools/viewer/GMSlide.cpp
@@ -21,10 +21,15 @@ GMSlide::GMSlide(std::unique_ptr<skiagm::GM> gm) : fGM(std::move(gm)) {
GMSlide::~GMSlide() = default;
void GMSlide::draw(SkCanvas* canvas) {
+ SkString msg;
+
+ fGM->setMode(skiagm::GM::kSample_Mode);
+
+ fGM->gpuSetup(canvas->getGrContext(), &msg);
// Do we care about timing the draw of the background (once)?
// Does the GM ever rely on drawBackground to lazily compute something?
fGM->drawBackground(canvas);
- fGM->drawContent(canvas);
+ fGM->drawContent(canvas, &msg);
}
bool GMSlide::animate(double nanos) { return fGM->animate(nanos); }
diff --git a/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp b/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp
index 31b3a54eaae..768e2cce629 100644
--- a/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp
+++ b/chromium/third_party/skia/tools/viewer/ImGuiLayer.cpp
@@ -53,7 +53,7 @@ ImGuiLayer::ImGuiLayer() {
io.Fonts->GetTexDataAsAlpha8(&pixels, &w, &h);
SkImageInfo info = SkImageInfo::MakeA8(w, h);
SkPixmap pmap(info, pixels, info.minRowBytes());
- SkMatrix localMatrix = SkMatrix::MakeScale(1.0f / w, 1.0f / h);
+ SkMatrix localMatrix = SkMatrix::Scale(1.0f / w, 1.0f / h);
auto fontImage = SkImage::MakeFromRaster(pmap, nullptr, nullptr);
auto fontShader = fontImage->makeShader(&localMatrix);
fFontPaint.setShader(fontShader);
diff --git a/chromium/third_party/skia/tools/viewer/SKPSlide.cpp b/chromium/third_party/skia/tools/viewer/SKPSlide.cpp
index 1c03a5e4df0..b4655090641 100644
--- a/chromium/third_party/skia/tools/viewer/SKPSlide.cpp
+++ b/chromium/third_party/skia/tools/viewer/SKPSlide.cpp
@@ -11,7 +11,12 @@
#include "include/core/SkStream.h"
#include "src/core/SkOSFile.h"
-SKPSlide::SKPSlide(const SkString& name, const SkString& path) : fPath(path) {
+SKPSlide::SKPSlide(const SkString& name, const SkString& path)
+ : SKPSlide(name, SkStream::MakeFromFile(path.c_str())) {
+}
+
+SKPSlide::SKPSlide(const SkString& name, std::unique_ptr<SkStream> stream)
+ : fStream(std::move(stream)) {
fName = name;
}
@@ -33,25 +38,18 @@ void SKPSlide::draw(SkCanvas* canvas) {
}
}
-static sk_sp<SkPicture> read_picture(const char path[]) {
- std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(path);
- if (!stream) {
- SkDebugf("Could not read %s.\n", path);
- return nullptr;
- }
-
- auto pic = SkPicture::MakeFromStream(stream.get());
- if (!pic) {
- SkDebugf("Could not read %s as an SkPicture.\n", path);
- }
- return pic;
-}
-
void SKPSlide::load(SkScalar, SkScalar) {
- fPic = read_picture(fPath.c_str());
- if (fPic) {
- fCullRect = fPic->cullRect().roundOut();
+ if (!fStream) {
+ SkDebugf("No skp stream for slide %s.\n", fName.c_str());
+ return;
+ }
+ fStream->rewind();
+ fPic = SkPicture::MakeFromStream(fStream.get());
+ if (!fPic) {
+ SkDebugf("Could parse SkPicture from skp stream for slide %s.\n", fName.c_str());
+ return;
}
+ fCullRect = fPic->cullRect().roundOut();
}
void SKPSlide::unload() {
diff --git a/chromium/third_party/skia/tools/viewer/SKPSlide.h b/chromium/third_party/skia/tools/viewer/SKPSlide.h
index e20225038cb..5e88ae0a39e 100644
--- a/chromium/third_party/skia/tools/viewer/SKPSlide.h
+++ b/chromium/third_party/skia/tools/viewer/SKPSlide.h
@@ -14,6 +14,7 @@
class SKPSlide : public Slide {
public:
SKPSlide(const SkString& name, const SkString& path);
+ SKPSlide(const SkString& name, std::unique_ptr<SkStream>);
~SKPSlide() override;
SkISize getDimensions() const override { return fCullRect.size(); }
@@ -23,9 +24,9 @@ public:
void unload() override;
private:
- SkString fPath;
+ std::unique_ptr<SkStream> fStream;
sk_sp<const SkPicture> fPic;
- SkIRect fCullRect;
+ SkIRect fCullRect;
};
#endif
diff --git a/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp b/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp
new file mode 100644
index 00000000000..de29104c01d
--- /dev/null
+++ b/chromium/third_party/skia/tools/viewer/SkRiveSlide.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "tools/viewer/SkRiveSlide.h"
+
+#include "include/core/SkCanvas.h"
+#include "include/core/SkStream.h"
+
+#if defined(SK_ENABLE_SKRIVE)
+
+SkRiveSlide::SkRiveSlide(const SkString& name, const SkString& path)
+ : fPath(path) {
+ fName = name;
+}
+
+SkRiveSlide::~SkRiveSlide() = default;
+
+void SkRiveSlide::load(SkScalar w, SkScalar h) {
+ fWinSize = {w , h};
+ fRive = skrive::SkRive::Builder().make(SkFILEStream::Make(fPath.c_str()));
+ fRiveBounds = SkRect::MakeEmpty();
+
+ if (fRive) {
+ SkDebugf("Loaded Rive animation: %zu artboards\n", fRive->artboards().size());
+ for (const auto& ab : fRive->artboards()) {
+ const auto& pos = ab->getTranslation();
+ const auto& size = ab->getSize();
+
+ fRiveBounds.join(SkRect::MakeXYWH(pos.x, pos.y, size.x, size.y));
+ }
+ } else {
+ SkDebugf("Failed to load Rive animation: %s\n", fPath.c_str());
+ }
+}
+
+void SkRiveSlide::unload() {
+ fRive.reset();
+}
+
+void SkRiveSlide::resize(SkScalar w, SkScalar h) {
+ fWinSize = {w , h};
+}
+
+SkISize SkRiveSlide::getDimensions() const {
+ // We always scale to fill the window.
+ return fWinSize.toCeil();
+}
+
+void SkRiveSlide::draw(SkCanvas* canvas) {
+ if (!fRive) {
+ return;
+ }
+
+ // Scale the Rive artboards to fill our window.
+ SkAutoCanvasRestore acr(canvas, true);
+ canvas->concat(SkMatrix::MakeRectToRect(fRiveBounds,
+ SkRect::MakeSize(fWinSize),
+ SkMatrix::kCenter_ScaleToFit ));
+
+ for (const auto& ab : fRive->artboards()) {
+ ab->render(canvas);
+ }
+}
+
+#endif // defined(SK_ENABLE_SKRIVE)
diff --git a/chromium/third_party/skia/tools/viewer/SkRiveSlide.h b/chromium/third_party/skia/tools/viewer/SkRiveSlide.h
new file mode 100644
index 00000000000..820902e76e1
--- /dev/null
+++ b/chromium/third_party/skia/tools/viewer/SkRiveSlide.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkRiveSlide_DEFINED
+#define SkRiveSlide_DEFINED
+
+#include "tools/viewer/Slide.h"
+
+#if defined(SK_ENABLE_SKRIVE)
+
+#include "experimental/skrive/include/SkRive.h"
+
+class SkRiveSlide final : public Slide {
+public:
+ SkRiveSlide(const SkString& name, const SkString& path);
+ ~SkRiveSlide() override;
+
+private:
+ void load(SkScalar winWidth, SkScalar winHeight) override;
+ void unload() override;
+ void resize(SkScalar, SkScalar) override;
+
+ SkISize getDimensions() const override;
+
+ void draw(SkCanvas*) override;
+
+ const SkString fPath;
+
+ sk_sp<skrive::SkRive> fRive;
+ SkRect fRiveBounds;
+ SkSize fWinSize;
+
+ using INHERITED = Slide;
+};
+
+#endif // defined(SK_ENABLE_SKRIVE)
+#endif // SkRiveSlide_DEFINED
diff --git a/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp b/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp
index f564df25a94..81a628cd28c 100644
--- a/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp
+++ b/chromium/third_party/skia/tools/viewer/SkSLSlide.cpp
@@ -10,12 +10,9 @@
#include "include/core/SkCanvas.h"
#include "include/effects/SkGradientShader.h"
#include "include/effects/SkPerlinNoiseShader.h"
-#include "include/gpu/GrContext.h"
#include "src/core/SkEnumerate.h"
-#include "src/gpu/GrContextPriv.h"
-#include "src/gpu/GrShaderUtils.h"
#include "tools/Resources.h"
-#include "tools/viewer/ImGuiLayer.h"
+#include "tools/viewer/Viewer.h"
#include <algorithm>
#include "imgui.h"
@@ -41,10 +38,10 @@ SkSLSlide::SkSLSlide() {
fSkSL =
- "in fragmentProcessor fp;\n"
+ "in shader child;\n"
"\n"
"void main(float2 p, inout half4 color) {\n"
- " color = sample(fp, p);\n"
+ " color = sample(child, p);\n"
"}\n";
fCodeIsDirty = true;
@@ -80,10 +77,10 @@ void SkSLSlide::unload() {
fShaders.reset();
}
-bool SkSLSlide::rebuild(GrContextOptions::ShaderErrorHandler* errorHandler) {
+bool SkSLSlide::rebuild() {
auto [effect, errorText] = SkRuntimeEffect::Make(fSkSL);
if (!effect) {
- errorHandler->compileError(fSkSL.c_str(), errorText.c_str());
+ Viewer::ShaderErrorHandler()->compileError(fSkSL.c_str(), errorText.c_str());
return false;
}
@@ -105,10 +102,6 @@ bool SkSLSlide::rebuild(GrContextOptions::ShaderErrorHandler* errorHandler) {
}
void SkSLSlide::draw(SkCanvas* canvas) {
- GrContextOptions::ShaderErrorHandler* errorHandler = GrShaderUtils::DefaultShaderErrorHandler();
- if (auto grContext = canvas->getGrContext()) {
- errorHandler = grContext->priv().getShaderErrorHandler();
- }
canvas->clear(SK_ColorWHITE);
ImGui::Begin("SkSL", nullptr, ImGuiWindowFlags_AlwaysVerticalScrollbar);
@@ -122,7 +115,7 @@ void SkSLSlide::draw(SkCanvas* canvas) {
}
if (fCodeIsDirty || !fEffect) {
- this->rebuild(errorHandler);
+ this->rebuild();
}
if (!fEffect) {
diff --git a/chromium/third_party/skia/tools/viewer/SkSLSlide.h b/chromium/third_party/skia/tools/viewer/SkSLSlide.h
index a778350ef11..4287c398b9d 100644
--- a/chromium/third_party/skia/tools/viewer/SkSLSlide.h
+++ b/chromium/third_party/skia/tools/viewer/SkSLSlide.h
@@ -11,7 +11,6 @@
#include "tools/viewer/Slide.h"
#include "include/effects/SkRuntimeEffect.h"
-#include "include/gpu/GrContextOptions.h"
class SkSLSlide : public Slide {
public:
@@ -26,7 +25,7 @@ public:
void unload() override;
private:
- bool rebuild(GrContextOptions::ShaderErrorHandler*);
+ bool rebuild();
SkString fSkSL;
bool fCodeIsDirty;
diff --git a/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp b/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp
index 9467c52c0c4..18561356dde 100644
--- a/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp
+++ b/chromium/third_party/skia/tools/viewer/SkottieSlide.cpp
@@ -96,7 +96,12 @@ void SkottieSlide::load(SkScalar w, SkScalar h) {
};
auto logger = sk_make_sp<Logger>();
- skottie::Animation::Builder builder;
+
+ uint32_t flags = 0;
+ if (fPreferGlyphPaths) {
+ flags |= skottie::Animation::Builder::kPreferEmbeddedFonts;
+ }
+ skottie::Animation::Builder builder(flags);
auto resource_provider =
skresources::DataURIResourceProviderProxy::Make(
@@ -221,9 +226,11 @@ bool SkottieSlide::onChar(SkUnichar c) {
switch (c) {
case 'I':
fShowAnimationStats = !fShowAnimationStats;
- break;
- default:
- break;
+ return true;
+ case 'G':
+ fPreferGlyphPaths = !fPreferGlyphPaths;
+ this->load(fWinSize.width(), fWinSize.height());
+ return true;
}
return INHERITED::onChar(c);
diff --git a/chromium/third_party/skia/tools/viewer/SkottieSlide.h b/chromium/third_party/skia/tools/viewer/SkottieSlide.h
index dd0a49f66b1..aec76a32cac 100644
--- a/chromium/third_party/skia/tools/viewer/SkottieSlide.h
+++ b/chromium/third_party/skia/tools/viewer/SkottieSlide.h
@@ -53,7 +53,8 @@ private:
bool fShowAnimationInval = false,
fShowAnimationStats = false,
fShowUI = false,
- fDraggingProgress = false;
+ fDraggingProgress = false,
+ fPreferGlyphPaths = false;
typedef Slide INHERITED;
};
diff --git a/chromium/third_party/skia/tools/viewer/SvgSlide.cpp b/chromium/third_party/skia/tools/viewer/SvgSlide.cpp
index 3779ffd3f7f..c420843464c 100644
--- a/chromium/third_party/skia/tools/viewer/SvgSlide.cpp
+++ b/chromium/third_party/skia/tools/viewer/SvgSlide.cpp
@@ -14,18 +14,26 @@
#include "include/core/SkStream.h"
SvgSlide::SvgSlide(const SkString& name, const SkString& path)
- : fPath(path) {
+ : SvgSlide(name, SkStream::MakeFromFile(path.c_str())) {
+}
+
+SvgSlide::SvgSlide(const SkString& name, std::unique_ptr<SkStream> stream)
+ : fStream(std::move(stream)) {
fName = name;
}
void SvgSlide::load(SkScalar w, SkScalar h) {
- fWinSize = SkSize::Make(w, h);
+ if (!fStream) {
+ SkDebugf("No svg stream for slide %s.\n", fName.c_str());
+ return;
+ }
- if (const auto svgStream = SkStream::MakeFromFile(fPath.c_str())) {
- fDom = SkSVGDOM::MakeFromStream(*svgStream);
- if (fDom) {
- fDom->setContainerSize(fWinSize);
- }
+ fWinSize = SkSize::Make(w, h);
+
+ fStream->rewind();
+ fDom = SkSVGDOM::MakeFromStream(*fStream);
+ if (fDom) {
+ fDom->setContainerSize(fWinSize);
}
}
diff --git a/chromium/third_party/skia/tools/viewer/SvgSlide.h b/chromium/third_party/skia/tools/viewer/SvgSlide.h
index ccc840ed8c8..6a15a307b0c 100644
--- a/chromium/third_party/skia/tools/viewer/SvgSlide.h
+++ b/chromium/third_party/skia/tools/viewer/SvgSlide.h
@@ -15,6 +15,7 @@ class SkSVGDOM;
class SvgSlide final : public Slide {
public:
SvgSlide(const SkString& name, const SkString& path);
+ SvgSlide(const SkString& name, std::unique_ptr<SkStream>);
void load(SkScalar winWidth, SkScalar winHeight) override;
void unload() override;
@@ -24,9 +25,8 @@ public:
void draw(SkCanvas*) override;
private:
- const SkString fPath;
-
- SkSize fWinSize = SkSize::MakeEmpty();
+ std::unique_ptr<SkStream> fStream;
+ SkSize fWinSize = SkSize::MakeEmpty();
sk_sp<SkSVGDOM> fDom;
typedef Slide INHERITED;
diff --git a/chromium/third_party/skia/tools/viewer/Viewer.cpp b/chromium/third_party/skia/tools/viewer/Viewer.cpp
index 6d41aad1ce7..45d4fbd177b 100644
--- a/chromium/third_party/skia/tools/viewer/Viewer.cpp
+++ b/chromium/third_party/skia/tools/viewer/Viewer.cpp
@@ -50,9 +50,16 @@
#include "imgui.h"
#include "misc/cpp/imgui_stdlib.h" // For ImGui support of std::string
+#ifdef SK_VULKAN
+#include "spirv-tools/libspirv.hpp"
+#endif
+
#if defined(SK_ENABLE_SKOTTIE)
#include "tools/viewer/SkottieSlide.h"
#endif
+#if defined(SK_ENABLE_SKRIVE)
+ #include "tools/viewer/SkRiveSlide.h"
+#endif
class CapturingShaderErrorHandler : public GrContextOptions::ShaderErrorHandler {
public:
@@ -72,6 +79,8 @@ public:
static CapturingShaderErrorHandler gShaderErrorHandler;
+GrContextOptions::ShaderErrorHandler* Viewer::ShaderErrorHandler() { return &gShaderErrorHandler; }
+
using namespace sk_app;
static std::map<GpuPathRenderers, std::string> gPathRendererNames;
@@ -83,15 +92,34 @@ Application* Application::Create(int argc, char** argv, void* platformData) {
static DEFINE_string(slide, "", "Start on this sample.");
static DEFINE_bool(list, false, "List samples?");
-#if defined(SK_VULKAN)
-# define BACKENDS_STR "\"sw\", \"gl\", and \"vk\""
-#elif defined(SK_METAL) && defined(SK_BUILD_FOR_MAC)
-# define BACKENDS_STR "\"sw\", \"gl\", and \"mtl\""
-#elif defined(SK_DAWN)
-# define BACKENDS_STR "\"sw\", \"gl\", and \"dawn\""
+#ifdef SK_GL
+#define GL_BACKEND_STR ", \"gl\""
+#else
+#define GL_BACKEND_STR
+#endif
+#ifdef SK_VULKAN
+#define VK_BACKEND_STR ", \"vk\""
+#else
+#define VK_BACKEND_STR
+#endif
+#ifdef SK_METAL
+#define MTL_BACKEND_STR ", \"mtl\""
+#else
+#define MTL_BACKEND_STR
+#endif
+#ifdef SK_DIRECT3D
+#define D3D_BACKEND_STR ", \"d3d\""
#else
-# define BACKENDS_STR "\"sw\" and \"gl\""
+#define D3D_BACKEND_STR
#endif
+#ifdef SK_DAWN
+#define DAWN_BACKEND_STR ", \"dawn\""
+#else
+#define DAWN_BACKEND_STR
+#endif
+#define BACKENDS_STR_EVALUATOR(sw, gl, vk, mtl, d3d, dawn) sw gl vk mtl d3d dawn
+#define BACKENDS_STR BACKENDS_STR_EVALUATOR( \
+ "\"sw\"", GL_BACKEND_STR, VK_BACKEND_STR, MTL_BACKEND_STR, D3D_BACKEND_STR, DAWN_BACKEND_STR)
static DEFINE_string2(backend, b, "sw", "Backend to use. Allowed values are " BACKENDS_STR ".");
@@ -116,10 +144,13 @@ static DEFINE_string2(match, m, nullptr,
static DEFINE_string(skps, "/data/local/tmp/skps", "Directory to read skps from.");
static DEFINE_string(lotties, "/data/local/tmp/lotties",
"Directory to read (Bodymovin) jsons from.");
+ static DEFINE_string(rives, "/data/local/tmp/rives",
+ "Directory to read Rive (Flare) files from.");
#else
static DEFINE_string(jpgs, "jpgs", "Directory to read jpgs from.");
static DEFINE_string(skps, "skps", "Directory to read skps from.");
static DEFINE_string(lotties, "lotties", "Directory to read (Bodymovin) jsons from.");
+ static DEFINE_string(rives, "rives", "Directory to read Rive (Flare) files from.");
#endif
static DEFINE_string(svgs, "", "Directory to read SVGs from, or a single SVG file.");
@@ -153,6 +184,9 @@ const char* kBackendTypeStrings[sk_app::Window::kBackendTypeCount] = {
#ifdef SK_METAL
"Metal",
#endif
+#ifdef SK_DIRECT3D
+ "Direct3D",
+#endif
"Raster"
};
@@ -177,6 +211,12 @@ static sk_app::Window::BackendType get_backend_type(const char* str) {
return sk_app::Window::kMetal_BackendType;
} else
#endif
+#ifdef SK_DIRECT3D
+ if (0 == strcmp(str, "d3d")) {
+ return sk_app::Window::kDirect3D_BackendType;
+ } else
+#endif
+
if (0 == strcmp(str, "gl")) {
return sk_app::Window::kNativeGL_BackendType;
} else if (0 == strcmp(str, "sw")) {
@@ -666,6 +706,12 @@ void Viewer::initSlides() {
return sk_make_sp<SkottieSlide>(name, path);}
},
#endif
+ #if defined(SK_ENABLE_SKRIVE)
+ { ".flr", "skrive-dir", FLAGS_rives,
+ [](const SkString& name, const SkString& path) -> sk_sp<Slide> {
+ return sk_make_sp<SkRiveSlide>(name, path);}
+ },
+ #endif
#if defined(SK_XML)
{ ".svg", "svg-dir", FLAGS_svgs,
[](const SkString& name, const SkString& path) -> sk_sp<Slide> {
@@ -1133,7 +1179,7 @@ SkMatrix Viewer::computeMatrix() {
void Viewer::setBackend(sk_app::Window::BackendType backendType) {
fPersistentCache.reset();
- fCachedGLSL.reset();
+ fCachedShaders.reset();
fBackendType = backendType;
fWindow->detach();
@@ -1422,7 +1468,7 @@ void Viewer::drawSlide(SkSurface* surface) {
// Force a flush so we can time that, too
fStatsLayer.beginTiming(fFlushTimer);
- slideSurface->flush();
+ slideSurface->flushAndSubmit();
fStatsLayer.endTiming(fFlushTimer);
// If we rendered offscreen, snap an image and push the results to the window's canvas
@@ -1647,6 +1693,35 @@ static bool ImGui_DragQuad(SkPoint* pts) {
return dc.fDragging;
}
+static SkSL::String build_sksl_highlight_shader() {
+ return SkSL::String("out half4 sk_FragColor;\n"
+ "void main() { sk_FragColor = half4(1, 0, 1, 0.5); }");
+}
+
+static SkSL::String build_metal_highlight_shader(const SkSL::String& inShader) {
+ // Metal fragment shaders need a lot of non-trivial boilerplate that we don't want to recompute
+ // here. So keep all shader code, but right before `return *_out;`, swap out the sk_FragColor.
+ size_t pos = inShader.rfind("return *_out;\n");
+ if (pos == std::string::npos) {
+ return inShader;
+ }
+
+ SkSL::String replacementShader = inShader;
+ replacementShader.insert(pos, "_out->sk_FragColor = float4(1.0, 0.0, 1.0, 0.5); ");
+ return replacementShader;
+}
+
+static SkSL::String build_glsl_highlight_shader(const GrShaderCaps& shaderCaps) {
+ const char* versionDecl = shaderCaps.versionDeclString();
+ SkSL::String highlight = versionDecl ? versionDecl : "";
+ if (shaderCaps.usesPrecisionModifiers()) {
+ highlight.append("precision mediump float;\n");
+ }
+ highlight.appendf("out vec4 sk_FragColor;\n"
+ "void main() { sk_FragColor = vec4(1, 0, 1, 0.5); }");
+ return highlight;
+}
+
void Viewer::drawImGui() {
// Support drawing the ImGui demo window. Superfluous, but gives a good idea of what's possible
if (fShowImGuiTestWindow) {
@@ -1684,6 +1759,10 @@ void Viewer::drawImGui() {
ImGui::SameLine();
ImGui::RadioButton("Metal", &newBackend, sk_app::Window::kMetal_BackendType);
#endif
+#if defined(SK_DIRECT3D)
+ ImGui::SameLine();
+ ImGui::RadioButton("Direct3D", &newBackend, sk_app::Window::kDirect3D_BackendType);
+#endif
if (newBackend != fBackendType) {
fDeferredActions.push_back([=]() {
this->setBackend(static_cast<sk_app::Window::BackendType>(newBackend));
@@ -2147,30 +2226,22 @@ void Viewer::drawImGui() {
}
}
- bool backendIsGL = Window::kNativeGL_BackendType == fBackendType
-#if SK_ANGLE && defined(SK_BUILD_FOR_WIN)
- || Window::kANGLE_BackendType == fBackendType
+ if (ImGui::CollapsingHeader("Shaders")) {
+ bool sksl = params.fGrContextOptions.fShaderCacheStrategy ==
+ GrContextOptions::ShaderCacheStrategy::kSkSL;
+#if defined(SK_VULKAN)
+ const bool isVulkan = fBackendType == sk_app::Window::kVulkan_BackendType;
+#else
+ const bool isVulkan = false;
#endif
- ;
-
- // HACK: If we get here when SKSL caching isn't enabled, and we're on a backend other
- // than GL, we need to force it on. Just do that on the first frame after the backend
- // switch, then resume normal operation.
- if (!backendIsGL &&
- params.fGrContextOptions.fShaderCacheStrategy !=
- GrContextOptions::ShaderCacheStrategy::kSkSL) {
- params.fGrContextOptions.fShaderCacheStrategy =
- GrContextOptions::ShaderCacheStrategy::kSkSL;
- paramsChanged = true;
- fPersistentCache.reset();
- } else if (ImGui::CollapsingHeader("Shaders")) {
- // To re-load shaders from the currently active programs, we flush all caches on one
- // frame, then set a flag to poll the cache on the next frame.
+
+ // To re-load shaders from the currently active programs, we flush all
+ // caches on one frame, then set a flag to poll the cache on the next frame.
static bool gLoadPending = false;
if (gLoadPending) {
auto collectShaders = [this](sk_sp<const SkData> key, sk_sp<SkData> data,
int hitCount) {
- CachedGLSL& entry(fCachedGLSL.push_back());
+ CachedShader& entry(fCachedShaders.push_back());
entry.fKey = key;
SkMD5 hash;
hash.write(key->bytes(), key->size());
@@ -2179,37 +2250,47 @@ void Viewer::drawImGui() {
entry.fKeyString.appendf("%02x", digest.data[i]);
}
- SkReader32 reader(data->data(), data->size());
+ SkReadBuffer reader(data->data(), data->size());
entry.fShaderType = GrPersistentCacheUtils::GetType(&reader);
GrPersistentCacheUtils::UnpackCachedShaders(&reader, entry.fShader,
entry.fInputs,
kGrShaderTypeCount);
};
- fCachedGLSL.reset();
+ fCachedShaders.reset();
fPersistentCache.foreach(collectShaders);
gLoadPending = false;
+
+#if defined(SK_VULKAN)
+ if (isVulkan && !sksl) {
+ spvtools::SpirvTools tools(SPV_ENV_VULKAN_1_0);
+ for (auto& entry : fCachedShaders) {
+ for (int i = 0; i < kGrShaderTypeCount; ++i) {
+ const SkSL::String& spirv(entry.fShader[i]);
+ std::string disasm;
+ tools.Disassemble((const uint32_t*)spirv.c_str(), spirv.size() / 4,
+ &disasm);
+ entry.fShader[i].assign(disasm);
+ }
+ }
+ }
+#endif
}
// Defer actually doing the load/save logic so that we can trigger a save when we
// start or finish hovering on a tree node in the list below:
bool doLoad = ImGui::Button("Load"); ImGui::SameLine();
- bool doSave = ImGui::Button("Save");
- if (backendIsGL) {
- ImGui::SameLine();
- bool sksl = params.fGrContextOptions.fShaderCacheStrategy ==
- GrContextOptions::ShaderCacheStrategy::kSkSL;
- if (ImGui::Checkbox("SkSL", &sksl)) {
- params.fGrContextOptions.fShaderCacheStrategy = sksl
- ? GrContextOptions::ShaderCacheStrategy::kSkSL
- : GrContextOptions::ShaderCacheStrategy::kBackendSource;
- paramsChanged = true;
- doLoad = true;
- fDeferredActions.push_back([=]() { fPersistentCache.reset(); });
- }
+ bool doSave = ImGui::Button("Save"); ImGui::SameLine();
+ if (ImGui::Checkbox("SkSL", &sksl)) {
+ params.fGrContextOptions.fShaderCacheStrategy =
+ sksl ? GrContextOptions::ShaderCacheStrategy::kSkSL
+ : GrContextOptions::ShaderCacheStrategy::kBackendSource;
+ paramsChanged = true;
+ doLoad = true;
+ fDeferredActions.push_back([=]() { fPersistentCache.reset(); });
}
ImGui::BeginChild("##ScrollingRegion");
- for (auto& entry : fCachedGLSL) {
+ for (auto& entry : fCachedShaders) {
bool inTreeNode = ImGui::TreeNode(entry.fKeyString.c_str());
bool hovered = ImGui::IsItemHovered();
if (hovered != entry.fHovered) {
@@ -2234,30 +2315,35 @@ void Viewer::drawImGui() {
fWindow->getGrContext()->priv().getGpu()->resetShaderCacheForTesting();
gLoadPending = true;
}
+ // We don't support updating SPIRV shaders. We could re-assemble them (with edits),
+ // but I'm not sure anyone wants to do that.
+ if (isVulkan && !sksl) {
+ doSave = false;
+ }
if (doSave) {
- // The hovered item (if any) gets a special shader to make it identifiable
- auto shaderCaps = ctx->priv().caps()->shaderCaps();
- bool sksl = params.fGrContextOptions.fShaderCacheStrategy ==
- GrContextOptions::ShaderCacheStrategy::kSkSL;
-
- SkSL::String highlight;
- if (!sksl) {
- highlight = shaderCaps->versionDeclString();
- if (shaderCaps->usesPrecisionModifiers()) {
- highlight.append("precision mediump float;\n");
- }
- }
- const char* f4Type = sksl ? "half4" : "vec4";
- highlight.appendf("out %s sk_FragColor;\n"
- "void main() { sk_FragColor = %s(1, 0, 1, 0.5); }",
- f4Type, f4Type);
-
fPersistentCache.reset();
fWindow->getGrContext()->priv().getGpu()->resetShaderCacheForTesting();
- for (auto& entry : fCachedGLSL) {
+ for (auto& entry : fCachedShaders) {
SkSL::String backup = entry.fShader[kFragment_GrShaderType];
if (entry.fHovered) {
- entry.fShader[kFragment_GrShaderType] = highlight;
+ // The hovered item (if any) gets a special shader to make it
+ // identifiable.
+ SkSL::String& fragShader = entry.fShader[kFragment_GrShaderType];
+ switch (entry.fShaderType) {
+ case SkSetFourByteTag('S', 'K', 'S', 'L'): {
+ fragShader = build_sksl_highlight_shader();
+ break;
+ }
+ case SkSetFourByteTag('G', 'L', 'S', 'L'): {
+ fragShader = build_glsl_highlight_shader(
+ *ctx->priv().caps()->shaderCaps());
+ break;
+ }
+ case SkSetFourByteTag('M', 'S', 'L', ' '): {
+ fragShader = build_metal_highlight_shader(fragShader);
+ break;
+ }
+ }
}
auto data = GrPersistentCacheUtils::PackCachedShaders(entry.fShaderType,
diff --git a/chromium/third_party/skia/tools/viewer/Viewer.h b/chromium/third_party/skia/tools/viewer/Viewer.h
index 41c478e7bcb..47913ae660d 100644
--- a/chromium/third_party/skia/tools/viewer/Viewer.h
+++ b/chromium/third_party/skia/tools/viewer/Viewer.h
@@ -11,6 +11,7 @@
#include "gm/gm.h"
#include "include/core/SkExecutor.h"
#include "include/core/SkFont.h"
+#include "include/gpu/GrContextOptions.h"
#include "src/core/SkScan.h"
#include "src/sksl/SkSLString.h"
#include "src/sksl/ir/SkSLProgram.h"
@@ -45,6 +46,8 @@ public:
bool onPinch(skui::InputState state, float scale, float x, float y) override;
bool onFling(skui::InputState state) override;
+ static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler();
+
struct SkFontFields {
bool fTypeface = false;
bool fSize = false;
@@ -193,7 +196,7 @@ private:
SkFontFields fFontOverrides;
bool fPixelGeometryOverrides = false;
- struct CachedGLSL {
+ struct CachedShader {
bool fHovered = false;
sk_sp<const SkData> fKey;
@@ -205,7 +208,7 @@ private:
};
sk_gpu_test::MemoryCache fPersistentCache;
- SkTArray<CachedGLSL> fCachedGLSL;
+ SkTArray<CachedShader> fCachedShaders;
};
#endif