x/talks/2014/gotham-context: talk for GothamGo 2014 in NYC.

LGTM=bcmills, adg
R=bcmills, adg, minux
CC=golang-codereviews
https://golang.org/cl/170290043
diff --git a/2014/gotham-context.slide b/2014/gotham-context.slide
new file mode 100644
index 0000000..afe00f0
--- /dev/null
+++ b/2014/gotham-context.slide
@@ -0,0 +1,329 @@
+Cancelation, Context, and Plumbing
+GothamGo 2014
+
+Sameer Ajmani
+sameer@golang.org
+
+* Introduction
+
+In Go servers, each incoming request is handled in its own goroutine.
+
+Handler code needs access to request-specific values:
+
+- security credentials
+- request deadline
+- operation priority
+
+When the request completes or times out, its work should be canceled.
+
+* Cancelation
+
+Abandon work when the caller no longer needs the result.
+
+- user navigates away, closes connection
+- operation exceeds its deadline
+- when using hedged requests, cancel the laggards
+
+Efficiently canceling unneeded work saves resources.
+
+* Cancelation is advisory
+
+Cancelation does not stop execution or trigger panics.
+
+Cancelation informs code that its work is no longer needed.
+
+Code checks for cancelation and decides what to do:
+shut down, clean up, return errors.
+
+* Cancelation is transitive
+
+.image gotham-context/transitive.svg
+
+* Cancelation affects all APIs on the request path
+
+Network protocols support cancelation.
+
+- HTTP: close the connection
+- RPC: send a control message
+
+APIs above network need cancelation, too.
+
+- Database clients
+- Network file system clients
+- Cloud service clients
+
+And all the layers atop those, up to the UI.
+
+*Goal:* provide a uniform cancelation API that works across package boundaries.
+
+* Cancelation APIs
+
+Many Go APIs support cancelation and deadlines already.
+
+Go APIs are synchronous, so cancelation comes from another goroutine.
+
+Method on the connection or client object:
+
+  // goroutine #1
+  result, err := conn.Do(req)
+
+  // goroutine #2
+  conn.Cancel(req)
+
+Method on the request object:
+
+  // goroutine #1
+  result, err := conn.Do(req)
+
+  // goroutine #2
+  req.Cancel()
+
+* Cancelation APIs (continued)
+
+Method on the pending result object:
+
+  // goroutine #1
+  pending := conn.Start(req)
+  ...
+  result, err := pending.Result()  
+
+  // goroutine #2
+  pending.Cancel()
+
+
+Different cancelation APIs in each package are a headache.
+
+We need one that's independent of package or transport:
+
+  // goroutine #1
+  result, err := conn.Do(x, req)
+
+  // goroutine #2
+  x.Cancel()
+
+* Context
+
+A `Context` carries a cancelation signal and request-scoped values to all functions running on behalf of the same task.  It's safe for concurrent access.
+
+.code gotham-context/interface.go /type Context/,/^}/
+
+*Idiom:* pass `ctx` as the first argument to a function.
+
+  import "golang.org/x/net/context"
+
+  // ReadFile reads file name and returns its contents.
+  // If ctx.Done is closed, ReadFile returns ctx.Err immediately.
+  func ReadFile(ctx context.Context, name string) ([]byte, error)
+
+Examples and discussion in [[http://blog.golang.org/context][blog.golang.org/context]].
+
+* Contexts are hierarchical
+
+`Context` has no `Cancel` method; obtain a cancelable `Context` using `WithCancel`:
+
+.code gotham-context/interface.go /WithCancel /,/func WithCancel/
+
+Passing a `Context` to a function does not pass the ability to cancel that `Context`.
+
+  // goroutine #1
+  ctx, cancel := context.WithCancel(parent)
+  ...
+  data, err := ReadFile(ctx, name)
+
+  // goroutine #2
+  cancel()
+
+Contexts form a tree, any subtree of which can be canceled.
+
+* Why does Done return a channel?
+
+Closing a channel works well as a broadcast signal.
+
+_After_the_last_value_has_been_received_from_a_closed_channel_c,_any_receive_from_c_will_succeed_without_blocking,_returning_the_zero_value_for_the_channel_element._
+
+Any number of goroutines can `select` on `<-ctx.Done()`.
+
+Examples and discussion in in [[http://blog.golang.org/pipelines][blog.golang.org/pipelines]].
+
+Using `close` requires care.
+
+- closing a nil channel panics
+- closing a closed channel panics
+
+`Done` returns a receive-only channel that can only be canceled using the `cancel` function returned by `WithCancel`.  It ensures the channel is closed exactly once.
+
+* Context values
+
+Contexts carry request-scoped values across API boundaries.
+
+- deadline
+- cancelation signal
+- security credentials
+- distributed trace IDs
+- operation priority
+- network QoS label
+
+RPC clients encode `Context` values onto the wire.
+
+RPC servers decode them into a new `Context` for the handler function.
+
+* Replicated Search
+
+Example from [[https://talks.golang.org/2012/concurrency.slide][Go Concurrency Patterns]].
+
+.code gotham-context/first.go /START1/,/STOP1/
+
+Remaining searches may continue running after First returns.
+
+* Cancelable Search
+
+.code gotham-context/first-context.go /START1/,/STOP1/
+
+* Context plumbing
+
+*Goal:* pass a `Context` parameter from each inbound RPC at a server through the call stack to each outgoing RPC.
+
+.code gotham-context/before.go /START/,/END/
+
+* Context plumbing (after)
+
+.code gotham-context/after.go /START/,/END/
+
+* Problem: Existing and future code
+
+Google has millions of lines of Go code.
+
+We've retrofitted the internal RPC and distributed file system APIs to take a Context.
+
+Lots more to do, growing every day.
+
+* Why not use (something like) thread local storage?
+
+C++ and Java pass request state in thread-local storage.
+
+Requires no API changes, but ...
+requires custom thread and callback libraries.
+
+Mostly works, except when it doesn't. Failures are hard to debug.
+
+Serious consequences if credential-passing bugs affect user privacy.
+
+"Goroutine-local storage" doesn't exist, and even if it did,
+request processing may flow between goroutines via channels.
+
+We won't sacrifice clarity for convenience.
+
+* In Go, pass Context explicitly
+
+Easy to tell when a Context passes between functions, goroutines, and processes.
+
+Invest up front to make the system easier to maintain:
+
+- update relevant functions to accept a `Context`
+- update function calls to provide a `Context`
+- update interface methods and implementations
+
+Go's awesome tools can help.
+
+* Automated refactoring
+
+*Initial*State:*
+
+Pass `context.TODO()` to outbound RPCs.
+
+`context.TODO()` is a sentinel for static analysis tools. Use it wherever a `Context` is needed but there isn't one available.
+
+*Iteration:*
+
+For each function `F(x)` whose body contains `context.TODO()`,
+
+- add a `Context` parameter to `F`
+- update callers to use `F(context.TODO(),`x)`
+- if the caller has a `Context` available, pass it to `F` instead
+
+Repeat until `context.TODO()` is gone.
+
+* Finding relevant functions
+
+The [[http://godoc.org/golang.org/x/tools/cmd/callgraph][golang.org/x/tools/cmd/callgraph]] tool constructs the call graph of a Go program.
+
+It uses whole-program pointer analysis to find dynamic calls (via interfaces or function values).
+
+*For*context*plumbing:*
+
+Find all functions on call paths from `Context` _suppliers_ (inbound RPCs) to `Context` _consumers_ (`context.TODO`).
+
+* Updating function calls
+
+To change add all `F(x)` to `F(context.TODO(),`x)`:
+
+- define `FContext(ctx,`x)`
+- `F(x)` → `FContext(context.TODO(),`x)`
+- change `F(x)` to `F(ctx,`x)`
+- `FContext(context.TODO(),`x)` → `F(context.TODO(),`x)`
+- remove `FContext(ctx,`x)`
+
+* gofmt -r
+
+Works well for simple replacements:
+
+  gofmt -r 'pkg.F(a) -> pkg.FContext(context.TODO(), a)'
+
+But this is too imprecise for methods.  There may be many methods named M:
+
+  gofmt -r 'x.M(y) -> x.MContext(context.TODO(), y)'
+
+We want to restrict the transformation to specific method signatures.
+
+* The eg tool
+
+The [[http://godoc.org/golang.org/x/tools/cmd/eg][golang.org/x/tools/cmd/eg]] tool performs precise example-based refactoring.
+
+The `before` expression specifies a pattern and the `after` expression its replacement.
+
+To replace `x.M(y)` with `x.MContext(context.TODO(),`y)`:
+
+.code gotham-context/eg.go
+
+* Dealing with interfaces
+
+We need to update dynamic calls to `x.M(y)`.
+
+If `M` called via interface `I`, then `I.M` also needs to change.  The eg tool can update call sites with receiver type `I`.
+
+When we change `I`, we need to update all of its implementations.
+
+Find types assignable to `I` using [[http://godoc.org/golang.org/x/tools/go/types][golang.org/x/tools/go/types]].
+
+More to do here.
+
+* What about the standard library?
+
+The Go 1.0 compatibility guarantee means we will not break existing code.
+
+Interfaces like `io.Reader` and `io.Writer` are widely used.
+
+For Google files, used a currying approach:
+
+  f, err := file.Open(ctx, "/gfs/cell/path")
+  ...
+  fio := f.IO(ctx)  // returns an io.ReadWriteCloser that passes ctx
+  data, err := ioutil.ReadAll(fio)
+
+For versioned public packages, add `Context` parameters in a new API version and provide `eg` templates to insert `context.TODO()`.
+
+More to do here.
+
+* Conclusion
+
+Cancelation needs a uniform API across package boundaries.
+
+Retrofitting code is hard, but Go is tool-friendly.
+
+New code should use `Context`.
+
+Links:
+
+- [[http://golang.org/x/net/context][golang.org/x/net/context]] - package
+- [[http://blog.golang.org/context][blog.golang.org/context]] - blog post
+- [[http://golang.org/x/tools/cmd/eg][golang.org/x/tools/cmd/eg]] - eg tool
diff --git a/2014/gotham-context/after.go b/2014/gotham-context/after.go
new file mode 100644
index 0000000..c86662c
--- /dev/null
+++ b/2014/gotham-context/after.go
@@ -0,0 +1,18 @@
+// +build OMIT
+
+package after
+
+// START OMIT
+func (*ServiceA) HandleRPC(ctx context.Context, a Arg) {
+	f(ctx, a)
+}
+
+func f(ctx context.Context, a Args) { // HL
+	x.M(ctx, a)
+}
+
+func (x *X) M(ctx context.Context, a Args) { // HL
+	serviceB.IssueRPC(ctx, a)
+}
+
+// END OMIT
diff --git a/2014/gotham-context/before.go b/2014/gotham-context/before.go
new file mode 100644
index 0000000..79a1efa
--- /dev/null
+++ b/2014/gotham-context/before.go
@@ -0,0 +1,19 @@
+// +build OMIT
+
+package before
+
+// START OMIT
+func (*ServiceA) HandleRPC(ctx context.Context, a Arg) {
+	f(a)
+}
+
+func f(a Args) {
+	x.M(a)
+}
+
+func (x *X) M(a Args) {
+	// TODO(sameer): pass a real Context here.
+	serviceB.IssueRPC(context.TODO(), a) // HL
+}
+
+// END OMIT
diff --git a/2014/gotham-context/eg.go b/2014/gotham-context/eg.go
new file mode 100644
index 0000000..c314f4d
--- /dev/null
+++ b/2014/gotham-context/eg.go
@@ -0,0 +1,18 @@
+// +build OMIT
+
+package P
+
+import (
+	"xpkg"
+	"ypkg"
+
+	"golang.org/x/net/context"
+)
+
+func before(x xpkg.X, y ypkg.Y) error { // HL
+	return x.M(y)
+}
+
+func after(x xpkg.X, y ypkg.Y) error { // HL
+	return x.MContext(context.TODO(), y)
+}
diff --git a/2014/gotham-context/first-context.go b/2014/gotham-context/first-context.go
new file mode 100644
index 0000000..dde0ffa
--- /dev/null
+++ b/2014/gotham-context/first-context.go
@@ -0,0 +1,61 @@
+// +build OMIT
+
+package main
+
+import (
+	"fmt"
+	"math/rand"
+	"time"
+
+	"golang.org/x/net/context"
+)
+
+type Result struct {
+	Hit string
+	Err error
+}
+
+// START1 OMIT
+// Search runs query on a backend and returns the result.
+type Search func(ctx context.Context, query string) Result // HL
+
+// First runs query on replicas and returns the first result.
+func First(ctx context.Context, query string, replicas ...Search) Result {
+	c := make(chan Result, len(replicas))
+	ctx, cancel := context.WithCancel(ctx)                      // HL
+	defer cancel()                                              // HL
+	search := func(replica Search) { c <- replica(ctx, query) } // HL
+	for _, replica := range replicas {
+		go search(replica)
+	}
+	select {
+	case <-ctx.Done(): // HL
+		return Result{Err: ctx.Err()} // HL
+	case r := <-c:
+		return r
+	}
+}
+
+// STOP1 OMIT
+
+// START2 OMIT
+func main() {
+	rand.Seed(time.Now().UnixNano())
+	start := time.Now()
+	result := First(context.Background(),
+		"golang",
+		fakeSearch("replica 1"),
+		fakeSearch("replica 2"))
+	elapsed := time.Since(start)
+	fmt.Printf("%+v\n", result)
+	fmt.Println(elapsed)
+}
+
+// STOP2 OMIT
+
+func fakeSearch(kind string) Search {
+	return func(ctx context.Context, query string) Result {
+		time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
+		return Result{Hit: fmt.Sprintf("%s result for %q\n", kind, query)}
+	}
+}
diff --git a/2014/gotham-context/first.go b/2014/gotham-context/first.go
new file mode 100644
index 0000000..47bee60
--- /dev/null
+++ b/2014/gotham-context/first.go
@@ -0,0 +1,50 @@
+// +build OMIT
+
+package main
+
+import (
+	"fmt"
+	"math/rand"
+	"time"
+)
+
+// START1 OMIT
+// Search runs query on a backend and returns the result.
+type Search func(query string) Result
+type Result struct {
+	Hit string
+	Err error
+}
+
+// First runs query on replicas and returns the first result.
+func First(query string, replicas ...Search) Result {
+	c := make(chan Result, len(replicas))
+	search := func(replica Search) { c <- replica(query) }
+	for _, replica := range replicas {
+		go search(replica)
+	}
+	return <-c
+}
+
+// STOP1 OMIT
+
+// START2 OMIT
+func main() {
+	rand.Seed(time.Now().UnixNano())
+	start := time.Now()
+	result := First("golang",
+		fakeSearch("replica 1"),
+		fakeSearch("replica 2"))
+	elapsed := time.Since(start)
+	fmt.Printf("%+v\n", result)
+	fmt.Println(elapsed)
+}
+
+// STOP2 OMIT
+
+func fakeSearch(kind string) Search {
+	return func(query string) Result {
+		time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
+		return Result{Hit: fmt.Sprintf("%s result for %q\n", kind, query)}
+	}
+}
diff --git a/2014/gotham-context/interface.go b/2014/gotham-context/interface.go
new file mode 100644
index 0000000..a203450
--- /dev/null
+++ b/2014/gotham-context/interface.go
@@ -0,0 +1,37 @@
+// +build OMIT
+
+package context
+
+import "time"
+
+// A Context carries a deadline, cancelation signal, and request-scoped values
+// across API boundaries. Its methods are safe for simultaneous use by multiple
+// goroutines.
+type Context interface {
+	Done() <-chan struct{}                   // closed when this Context is canceled
+	Err() error                              // why this Context was canceled
+	Deadline() (deadline time.Time, ok bool) // when this Context will be canceled
+	Value(key interface{}) interface{}       // data associated with this Context
+}
+
+// WithCancel returns a copy of parent whose Done channel is closed as soon as
+// parent.Done is closed or cancel is called.
+func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
+
+// A CancelFunc cancels a Context.
+type CancelFunc func()
+
+// WithTimeout returns a copy of parent whose Done channel is closed as soon as
+// parent.Done is closed, cancel is called, or timeout elapses. The new
+// Context's Deadline is the sooner of now+timeout and the parent's deadline, if
+// any. If the timer is still running, the cancel function releases its
+// resources.
+func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
+
+// WithValue returns a copy of parent whose Value method returns val for key.
+func WithValue(parent Context, key interface{}, val interface{}) Context
+
+// Background returns an empty Context. It is never canceled, has no deadline,
+// and has no values. Background is typically used in main, init, and tests,
+// and as the top-level Context for incoming requests.
+func Background() Context
diff --git a/2014/gotham-context/transitive.svg b/2014/gotham-context/transitive.svg
new file mode 100644
index 0000000..e89c01d
--- /dev/null
+++ b/2014/gotham-context/transitive.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 938.0 518.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l938.0 0l0 518.0l-938.0 0l0 -518.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l938.5066 0l0 518.7297l-938.5066 0z" fill-rule="nonzero"></path><path fill="#a2c4c9" d="m193.52625 221.31859l0 0c0 -27.562607 22.343903 -49.90651 49.90651 -49.90651l200.43895 0l0 0c13.236023 0 25.929932 5.2579803 35.289246 14.617279c9.359283 9.359283 14.617279 22.053192 14.617279 35.28923l0 199.62004c0 27.562592 -22.343933 49.906525 -49.906525 49.906525l-200.43895 0c-27.562607 0 -49.90651 -22.343933 -49.90651 -49.906525z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m193.52625 221.31859l0 0c0 -27.562607 22.343903 -49.90651 49.90651 -49.90651l200.43895 0l0 0c13.236023 0 25.929932 5.2579803 35.289246 14.617279c9.359283 9.359283 14.617279 22.053192 14.617279 35.28923l0 199.62004c0 27.562592 -22.343933 49.906525 -49.906525 49.906525l-200.43895 0c-27.562607 0 -49.90651 -22.343933 -49.90651 -49.906525z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m230.32677 206.8348l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l127.99971 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863403 3.298584 2.1863403 5.278351l0 29.857971c0 4.12265 -3.342041 7.4647064 -7.464691 7.4647064l-127.99971 0c-4.12265 0 -7.4647217 -3.3420563 -7.4647217 -7.4647064z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m230.32677 206.8348l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l127.99971 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863403 3.298584 2.1863403 5.278351l0 29.857971c0 4.12265 -3.342041 7.4647064 -7.464691 7.4647064l-127.99971 0c-4.12265 0 -7.4647217 -3.3420563 -7.4647217 -7.4647064z" fill-rule="nonzero"></path><path fill="#000000" d="m250.6754 228.68378l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.0937347 0 1.8906097 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.54685974 -0.578125 -1.5312347 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813217 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.078827 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.766357 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.235077 4.921875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.926086 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.375702 5.875l0 -13.59375l1.8125 0l0 5.578125l7.0625 0l0 -5.578125l1.796875 0l0 13.59375l-1.796875 0l0 -6.40625l-7.0625 0l0 6.40625l-1.8125 0zm16.879211 0l0 -12.0l-4.46875 0l0 -1.59375l10.765625 0l0 1.59375l-4.5 0l0 12.0l-1.796875 0zm11.395966 0l0 -12.0l-4.46875 0l0 -1.59375l10.765625 0l0 1.59375l-4.5 0l0 12.0l-1.796875 0zm7.942871 0l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m274.59448 300.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m274.59448 300.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path fill="#000000" d="m295.5383 322.01712l5.234375 -13.59375l1.9375 0l5.5625 13.59375l-2.046875 0l-1.59375 -4.125l-5.6875 0l-1.484375 4.125l-1.921875 0zm3.921875 -5.578125l4.609375 0l-1.40625 -3.78125q-0.65625 -1.703125 -0.96875 -2.8125q-0.265625 1.3125 -0.734375 2.59375l-1.5 4.0z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m274.59448 380.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m274.59448 380.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999023 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path fill="#000000" d="m296.96017 402.01712l0 -13.59375l5.109375 0q1.546875 0 2.484375 0.40625q0.953125 0.40625 1.484375 1.265625q0.53125 0.859375 0.53125 1.796875q0 0.875 -0.46875 1.65625q-0.46875 0.765625 -1.4375 1.234375q1.234375 0.359375 1.890625 1.234375q0.671875 0.875 0.671875 2.0625q0 0.953125 -0.40625 1.78125q-0.390625 0.8125 -0.984375 1.265625q-0.59375 0.4375 -1.5 0.671875q-0.890625 0.21875 -2.1875 0.21875l-5.1875 0zm1.796875 -7.890625l2.9375 0q1.203125 0 1.71875 -0.15625q0.6875 -0.203125 1.03125 -0.671875q0.359375 -0.46875 0.359375 -1.1875q0 -0.671875 -0.328125 -1.1875q-0.328125 -0.515625 -0.9375 -0.703125q-0.59375 -0.203125 -2.0625 -0.203125l-2.71875 0l0 4.109375zm0 6.28125l3.390625 0q0.875 0 1.21875 -0.0625q0.625 -0.109375 1.046875 -0.359375q0.421875 -0.265625 0.6875 -0.765625q0.265625 -0.5 0.265625 -1.140625q0 -0.765625 -0.390625 -1.328125q-0.390625 -0.5625 -1.078125 -0.78125q-0.6875 -0.234375 -1.984375 -0.234375l-3.15625 0l0 4.671875z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m412.72833 300.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999329 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m412.72833 300.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999329 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path fill="#000000" d="m440.49762 316.689l0 -1.609375l5.765625 0l0 5.046875q-1.328125 1.0625 -2.75 1.59375q-1.40625 0.53125 -2.890625 0.53125q-2.0 0 -3.640625 -0.859375q-1.625 -0.859375 -2.46875 -2.484375q-0.828125 -1.625 -0.828125 -3.625q0 -1.984375 0.828125 -3.703125q0.828125 -1.71875 2.390625 -2.546875q1.5625 -0.84375 3.59375 -0.84375q1.46875 0 2.65625 0.484375q1.203125 0.46875 1.875 1.328125q0.671875 0.84375 1.03125 2.21875l-1.625 0.4375q-0.3125 -1.03125 -0.765625 -1.625q-0.453125 -0.59375 -1.296875 -0.953125q-0.84375 -0.359375 -1.875 -0.359375q-1.234375 0 -2.140625 0.375q-0.890625 0.375 -1.453125 1.0q-0.546875 0.609375 -0.84375 1.34375q-0.53125 1.25 -0.53125 2.734375q0 1.8125 0.625 3.046875q0.640625 1.21875 1.828125 1.8125q1.203125 0.59375 2.546875 0.59375q1.171875 0 2.28125 -0.453125q1.109375 -0.453125 1.6875 -0.953125l0 -2.53125l-4.0 0z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m412.72833 380.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999329 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m412.72833 380.16812l0 0c0 -4.12265 3.3420715 -7.4647217 7.4647217 -7.4647217l39.464264 0c1.9797668 0 3.8784485 0.7864685 5.278351 2.1863708c1.3999329 1.3999023 2.1863708 3.298584 2.1863708 5.278351l0 29.857971c0 4.12265 -3.3420715 7.4647217 -7.4647217 7.4647217l-39.464264 0c-4.12265 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path fill="#000000" d="m434.70435 402.01712l0 -13.59375l1.8125 0l0 5.578125l7.0625 0l0 -5.578125l1.796875 0l0 13.59375l-1.796875 0l0 -6.40625l-7.0625 0l0 6.40625l-1.8125 0z" fill-rule="nonzero"></path><path fill="#e69138" d="m250.59448 61.769028l0 0c0 -28.275238 22.92163 -51.19685 51.19687 -51.19685c28.275238 0 51.19684 22.921612 51.19684 51.19685c0 28.275246 -22.9216 51.196854 -51.19684 51.196854c-28.275238 0 -51.19687 -22.921608 -51.19687 -51.196854z" fill-rule="nonzero"></path><path fill="#b7732c" d="m280.05637 46.45738c0 -2.9453354 2.3876953 -5.333004 5.333008 -5.333004c2.945343 0 5.333008 2.3876686 5.333008 5.333004c0 2.9453392 -2.3876648 5.333004 -5.333008 5.333004c-2.9453125 0 -5.333008 -2.3876648 -5.333008 -5.333004m32.803925 0c0 -2.9453354 2.3876648 -5.333004 5.333008 -5.333004c2.945343 0 5.333008 2.3876686 5.333008 5.333004c0 2.9453392 -2.3876648 5.333004 -5.333008 5.333004c-2.945343 0 -5.333008 -2.3876648 -5.333008 -5.333004" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m274.0423 84.09632q27.749054 19.05751 55.433258 0" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m250.59448 61.769028l0 0c0 -28.275238 22.92163 -51.19685 51.19687 -51.19685c28.275238 0 51.19684 22.921612 51.19684 51.19685c0 28.275246 -22.9216 51.196854 -51.19684 51.196854c-28.275238 0 -51.19687 -22.921608 -51.19687 -51.196854z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m280.05637 46.45738c0 -2.9453354 2.3876953 -5.333004 5.333008 -5.333004c2.945343 0 5.333008 2.3876686 5.333008 5.333004c0 2.9453392 -2.3876648 5.333004 -5.333008 5.333004c-2.9453125 0 -5.333008 -2.3876648 -5.333008 -5.333004m32.803925 0c0 -2.9453354 2.3876648 -5.333004 5.333008 -5.333004c2.945343 0 5.333008 2.3876686 5.333008 5.333004c0 2.9453392 -2.3876648 5.333004 -5.333008 5.333004c-2.945343 0 -5.333008 -2.3876648 -5.333008 -5.333004" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m274.0423 84.09632q27.749054 19.05751 55.433258 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m250.59448 61.769028l0 0c0 -28.275238 22.92163 -51.19685 51.19687 -51.19685c28.275238 0 51.19684 22.921612 51.19684 51.19685c0 28.275246 -22.9216 51.196854 -51.19684 51.196854c-28.275238 0 -51.19687 -22.921608 -51.19687 -51.196854z" fill-rule="nonzero"></path><path fill="#a2c4c9" d="m563.6575 380.8614l0 0c0 -14.061066 11.398743 -25.459808 25.459839 -25.459808l130.4032 0c6.7523193 0 13.228149 2.682373 18.002808 7.4570007c4.774658 4.774658 7.45697 11.250458 7.45697 18.002808l0 101.83627c0 14.061066 -11.398743 25.459808 -25.459778 25.459808l-130.4032 0c-14.061096 0 -25.459839 -11.398743 -25.459839 -25.459808z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m563.6575 380.8614l0 0c0 -14.061066 11.398743 -25.459808 25.459839 -25.459808l130.4032 0c6.7523193 0 13.228149 2.682373 18.002808 7.4570007c4.774658 4.774658 7.45697 11.250458 7.45697 18.002808l0 101.83627c0 14.061066 -11.398743 25.459808 -25.459778 25.459808l-130.4032 0c-14.061096 0 -25.459839 -11.398743 -25.459839 -25.459808z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m583.2638 380.4658l0 0c0 -4.12265 3.342041 -7.4647217 7.4647217 -7.4647217l127.999695 0c1.9797363 0 3.878418 0.7864685 5.2783203 2.1863708c1.3999023 1.3999023 2.1864014 3.298584 2.1864014 5.278351l0 29.857971c0 4.12265 -3.342102 7.464691 -7.4647217 7.464691l-127.999695 0c-4.1226807 0 -7.4647217 -3.342041 -7.4647217 -7.464691z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m583.2638 380.4658l0 0c0 -4.12265 3.342041 -7.4647217 7.4647217 -7.4647217l127.999695 0c1.9797363 0 3.878418 0.7864685 5.2783203 2.1863708c1.3999023 1.3999023 2.1864014 3.298584 2.1864014 5.278351l0 29.857971c0 4.12265 -3.342102 7.464691 -7.4647217 7.464691l-127.999695 0c-4.1226807 0 -7.4647217 -3.342041 -7.4647217 -7.464691z" fill-rule="nonzero"></path><path fill="#000000" d="m608.2719 402.31476l0 -13.59375l1.671875 0l0 4.875q1.171875 -1.359375 2.953125 -1.359375q1.09375 0 1.890625 0.4375q0.8125 0.421875 1.15625 1.1875q0.359375 0.765625 0.359375 2.203125l0 6.25l-1.671875 0l0 -6.25q0 -1.25 -0.546875 -1.8125q-0.546875 -0.578125 -1.53125 -0.578125q-0.75 0 -1.40625 0.390625q-0.640625 0.375 -0.921875 1.046875q-0.28125 0.65625 -0.28125 1.8125l0 5.390625l-1.671875 0zm16.813232 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0787964 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.766357 0l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375zm9.235107 4.921875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.926086 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.360107 5.875l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm11.644775 7.59375l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm20.349854 2.375l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375z" fill-rule="nonzero"></path><path fill="#fff2cc" d="m627.5315 456.7335l0 0c0 -4.12265 3.342041 -7.4647217 7.4647217 -7.4647217l39.464294 0c1.9797363 0 3.878418 0.7864685 5.2783203 2.1863708c1.3999023 1.3999023 2.1863403 3.298584 2.1863403 5.278351l0 29.857971c0 4.12265 -3.342041 7.4647217 -7.4646606 7.4647217l-39.464294 0c-4.1226807 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m627.5315 456.7335l0 0c0 -4.12265 3.342041 -7.4647217 7.4647217 -7.4647217l39.464294 0c1.9797363 0 3.878418 0.7864685 5.2783203 2.1863708c1.3999023 1.3999023 2.1863403 3.298584 2.1863403 5.278351l0 29.857971c0 4.12265 -3.342041 7.4647217 -7.4646606 7.4647217l-39.464294 0c-4.1226807 0 -7.4647217 -3.3420715 -7.4647217 -7.4647217z" fill-rule="nonzero"></path><path fill="#000000" d="m650.59283 478.5825l0 -13.59375l9.171875 0l0 1.59375l-7.375 0l0 4.21875l6.375 0l0 1.609375l-6.375 0l0 6.171875l-1.796875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m301.79135 112.96588l0 86.39371" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m301.79135 112.96588l0 74.39369" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m298.48788 187.35957l3.3034668 9.076202l3.3034668 -9.076202z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m301.79135 244.15747l0 48.53543" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m301.79135 244.15749l0 36.535416" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m298.48788 280.6929l3.3034668 9.076202l3.3034668 -9.076202z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m301.79135 337.4908l0 35.212585" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m301.79135 337.4908l0 23.212585" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m298.48788 360.7034l3.3034668 9.076202l3.3034668 -9.076202z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m328.9882 315.0971l83.74802 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="2.0,6.0" d="m328.9882 315.0971l71.74802 0" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m400.7362 318.40057l9.076202 -3.3034668l-9.076202 -3.3034668z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m439.9252 337.4908l0 35.212585" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m439.9252 337.4908l0 23.212585" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m436.62173 360.7034l3.3034668 9.076202l3.3034668 -9.076202z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m467.12204 395.0971l116.12601 0.28347778" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m467.12204 395.0971l104.12601 0.2541809" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m571.24 398.65475l9.0842285 -3.281311l-9.068115 -3.3256226z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m654.72833 417.78845l0 31.496063" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m654.72833 417.78848l0 19.496063" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m651.42487 437.28455l3.3034668 9.076172l3.3034668 -9.076172z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m332.18738 279.88574l75.74802 -0.03149414l0 35.212585l-75.74802 0.03152466z" fill-rule="nonzero"></path><path fill="#000000" d="m342.31238 307.4578l2.96875 0.35812378q0.078125 0.5155945 0.34375 0.7030029q0.375 0.2810669 1.171875 0.28076172q1.03125 -4.272461E-4 1.53125 -0.29751587q0.34375 -0.20327759 0.515625 -0.6564636q0.125 -0.32818604 0.125 -1.203186l0 -1.4375q-1.171875 1.5942383 -2.953125 1.5949707q-1.984375 8.239746E-4 -3.140625 -1.6705627q-0.90625 -1.3277588 -0.90625 -3.3121338q0 -2.46875 1.1875 -3.7817383q1.1875 -1.3129883 2.96875 -1.3137207q1.828125 -7.6293945E-4 3.015625 1.6081238l0 -1.390625l2.4375 -0.0010375977l0 8.84375q0 1.75 -0.296875 2.6095276q-0.28125 0.85946655 -0.796875 1.3440552q-0.515625 0.5002136 -1.390625 0.78182983q-0.859375 0.2816162 -2.1875 0.28216553q-2.515625 0.0010375977 -3.5625 -0.85787964q-1.046875 -0.85894775 -1.046875 -2.1714478q0 -0.140625 0.015625 -0.3125zm2.328125 -5.7822266q0 1.5625 0.609375 2.2966309q0.609375 0.71847534 1.5 0.71810913q0.953125 -3.9672852E-4 1.609375 -0.7350464q0.65625 -0.75027466 0.65625 -2.2190247q0 -1.53125 -0.640625 -2.2653503q-0.625 -0.74972534 -1.578125 -0.7493286q-0.9375 3.6621094E-4 -1.546875 0.73501587q-0.609375 0.71899414 -0.609375 2.2189941zm8.708466 0.05886841q0 -1.296875 0.640625 -2.5158691q0.640625 -1.2190247 1.8125 -1.8601379q1.171875 -0.6411133 2.609375 -0.64172363q2.25 -9.1552734E-4 3.671875 1.4515991q1.421875 1.4525452 1.421875 3.6712952q0 2.234375 -1.4375 3.7037354q-1.4375 1.4693298 -3.625 1.4702454q-1.359375 5.493164E-4 -2.59375 -0.6083069q-1.21875 -0.6088562 -1.859375 -1.7960815q-0.640625 -1.1872559 -0.640625 -2.8747559zm2.671875 0.13952637q0 1.46875 0.6875 2.2497253q0.703125 0.7653198 1.71875 0.7648926q1.015625 -4.272461E-4 1.703125 -0.7663269q0.703125 -0.7815552 0.703125 -2.2659302q0 -1.453125 -0.703125 -2.2340698q-0.6875 -0.78097534 -1.703125 -0.7805481q-1.015625 4.272461E-4 -1.71875 0.7819824q-0.6875 0.78152466 -0.6875 2.2502747zm20.84491 -0.08679199l0 -2.296875l5.921875 -0.0024719238l0 5.421875q-0.859375 0.8284912 -2.5 1.4697876q-1.640625 0.6413269 -3.3125 0.6419983q-2.140625 9.1552734E-4 -3.734375 -0.8890686q-1.578125 -0.9055786 -2.375 -2.561493q-0.796875 -1.6715393 -0.796875 -3.6246643q0 -2.125 0.890625 -3.7816467q0.890625 -1.6566162 2.609375 -2.532318q1.3125 -0.6724243 3.25 -0.6732178q2.546875 -0.0010681152 3.96875 1.0608215q1.421875 1.0619202 1.828125 2.9367676l-2.734375 0.50112915q-0.28125 -0.9998779 -1.078125 -1.5776978q-0.796875 -0.5777893 -1.984375 -0.5772705q-1.796875 7.324219E-4 -2.859375 1.1417847q-1.0625 1.1410828 -1.0625 3.3910828q0 2.421875 1.078125 3.6401672q1.078125 1.2026978 2.828125 1.2019653q0.859375 -3.6621094E-4 1.71875 -0.34448242q0.875 -0.3441162 1.5 -0.82873535l0 -1.71875l-3.15625 0.0013122559zm12.495819 8.994812l-1.796875 7.324219E-4q-1.40625 -2.1400452 -2.15625 -4.4522095q-0.734375 -2.3121948 -0.734375 -4.468445q0 -2.6875 0.90625 -5.0785217q0.796875 -2.0784607 2.03125 -3.8289795l1.78125 -7.324219E-4q-1.28125 2.8130493 -1.765625 4.7819824q-0.46875 1.9689636 -0.46875 4.1720886q0 1.53125 0.28125 3.124878q0.28125 1.5936279 0.78125 3.0309143q0.328125 0.9530029 1.140625 2.7182922zm1.165802 -4.8828125E-4q0.765625 -1.6565857 1.078125 -2.5473328q0.328125 -0.8751221 0.59375 -2.0158691q0.265625 -1.1563721 0.390625 -2.1876526q0.140625 -1.031311 0.140625 -2.125061q0 -2.203125 -0.484375 -4.171692q-0.46875 -1.9685364 -1.734375 -4.7805176l1.765625 -7.324219E-4q1.40625 1.9837952 2.171875 4.2334595q0.78125 2.2340698 0.78125 4.530945q0 1.9375 -0.609375 4.156494q-0.703125 2.4846802 -2.296875 4.907196l-1.796875 7.6293945E-4z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m300.7257 122.03674l75.74805 0l0 31.496063l-75.74805 0z" fill-rule="nonzero"></path><path fill="#000000" d="m311.11633 148.95674l0 -13.59375l2.75 0l0 5.34375l5.375 0l0 -5.34375l2.75 0l0 13.59375l-2.75 0l0 -5.953125l-5.375 0l0 5.953125l-2.75 0zm16.519836 0l0 -11.296875l-4.03125 0l0 -2.296875l10.8125 0l0 2.296875l-4.03125 0l0 11.296875l-2.75 0zm11.395966 0l0 -11.296875l-4.03125 0l0 -2.296875l10.8125 0l0 2.296875l-4.03125 0l0 11.296875l-2.75 0zm8.333496 0l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m498.58084 359.88452l61.858246 0l0 35.212585l-61.858246 0z" fill-rule="nonzero"></path><path fill="#000000" d="m508.97147 386.8045l0 -13.59375l5.7812195 0q2.1875 0 3.171875 0.359375q0.984375 0.359375 1.578125 1.296875q0.59375 0.9375 0.59375 2.15625q0 1.53125 -0.90625 2.53125q-0.890625 0.984375 -2.6875 1.25q0.890625 0.515625 1.46875 1.140625q0.578125 0.625 1.5625 2.203125l1.671875 2.65625l-3.296875 0l-1.984375 -2.953125q-1.046875 -1.59375 -1.4375 -2.0q-0.390625 -0.421875 -0.828125 -0.5625q-0.4375 -0.15625 -1.390625 -0.15625l-0.5468445 0l0 5.671875l-2.75 0zm2.75 -7.84375l2.0312195 0q1.96875 0 2.453125 -0.171875q0.5 -0.171875 0.78125 -0.578125q0.28125 -0.40625 0.28125 -1.015625q0 -0.6875 -0.375 -1.109375q-0.359375 -0.421875 -1.03125 -0.53125q-0.328125 -0.046875 -2.0 -0.046875l-2.1405945 0l0 3.453125zm10.707306 7.84375l0 -13.59375l4.421875 0q2.5 0 3.265625 0.203125q1.15625 0.296875 1.9375 1.328125q0.796875 1.015625 0.796875 2.640625q0 1.25 -0.453125 2.109375q-0.453125 0.859375 -1.15625 1.34375q-0.703125 0.484375 -1.421875 0.640625q-0.984375 0.203125 -2.84375 0.203125l-1.796875 0l0 5.125l-2.75 0zm2.75 -11.296875l0 3.859375l1.5 0q1.625 0 2.171875 -0.21875q0.546875 -0.21875 0.859375 -0.671875q0.3125 -0.453125 0.3125 -1.046875q0 -0.75 -0.4375 -1.234375q-0.4375 -0.484375 -1.09375 -0.59375q-0.5 -0.09375 -1.984375 -0.09375l-1.328125 0zm18.396729 6.296875l2.671875 0.84375q-0.609375 2.21875 -2.046875 3.3125q-1.421875 1.078125 -3.609375 1.078125q-2.703125 0 -4.453125 -1.84375q-1.734375 -1.859375 -1.734375 -5.078125q0 -3.390625 1.75 -5.265625q1.75 -1.875 4.609375 -1.875q2.5 0 4.046875 1.46875q0.9375 0.875 1.390625 2.5l-2.71875 0.65625q-0.234375 -1.0625 -1.0 -1.671875q-0.765625 -0.609375 -1.859375 -0.609375q-1.515625 0 -2.453125 1.09375q-0.9375 1.078125 -0.9375 3.5q0 2.578125 0.921875 3.6875q0.921875 1.09375 2.40625 1.09375q1.109375 0 1.890625 -0.6875q0.78125 -0.703125 1.125 -2.203125z" fill-rule="nonzero"></path></g></svg>
+