DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] net/intel: optimize for fast-free hint
From: Bruce Richardson @ 2026-05-19 11:06 UTC (permalink / raw)
  To: dev; +Cc: mb, Bruce Richardson
In-Reply-To: <20260123112032.2174361-1-bruce.richardson@intel.com>

When the fast-free hint is provided to the driver we know that the mbufs
have refcnt of 1 and are from the same mempool. Therefore, we can
optimize a bit for this case by:

* resetting the necessary mbuf fields, ie. nb_seg and next pointer when
  we are accessing the mbuf on writing the descriptor.
* on cleanup of buffers after transmit, we can just write those buffers
  straight to the mempool without accessing them.
* when doing buffer cleanup, we can follow the model of the vector
  driver where we cleanup in fixed bursts which don't wrap, and where we
  track the mbufs between tx_tail and last_cleaned as invalid, so we
  don't need to set them to NULL. [We only set to NULL valid mbuf slots
  where we have a context descriptor or segment not backed by an mbuf]

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
v3:
* used mbuf_raw_free_bulk rather than mempool function directly
* check for fast_free via mp pointer rather than flags
* remove unnecessary prefetches

V2: Fix issues with original submission:
* missed check for NULL mbufs
* fixed issue with freeing directly from sw_ring in scalar path which
  doesn't work as thats not a flag array of pointers
* fixed missing null assignment in case of large segments for TSO
---
 drivers/net/intel/common/tx.h        | 21 ++++--
 drivers/net/intel/common/tx_scalar.h | 99 +++++++++++++++++++++-------
 2 files changed, 92 insertions(+), 28 deletions(-)

diff --git a/drivers/net/intel/common/tx.h b/drivers/net/intel/common/tx.h
index 23a8c39cf2..5fe71aed12 100644
--- a/drivers/net/intel/common/tx.h
+++ b/drivers/net/intel/common/tx.h
@@ -329,13 +329,22 @@ ci_txq_release_all_mbufs(struct ci_tx_queue *txq, bool use_ctx)
 		return;
 
 	if (!txq->use_vec_entry) {
-		/* Regular scalar path uses sw_ring with ci_tx_entry */
-		for (uint16_t i = 0; i < txq->nb_tx_desc; i++) {
-			if (txq->sw_ring[i].mbuf != NULL) {
-				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
-				txq->sw_ring[i].mbuf = NULL;
-			}
+		/* Free mbufs from (last_desc_cleaned + 1) to (tx_tail - 1). */
+		const uint16_t start = (txq->last_desc_cleaned + 1) % txq->nb_tx_desc;
+		const uint16_t nb_desc = txq->nb_tx_desc;
+		const uint16_t end = txq->tx_tail;
+
+		uint16_t i = start;
+		if (end < i) {
+			for (; i < nb_desc; i++)
+				if (txq->sw_ring[i].mbuf != NULL)
+					rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
+			i = 0;
 		}
+		for (; i < end; i++)
+			if (txq->sw_ring[i].mbuf != NULL)
+				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
+		memset(txq->sw_ring, 0, sizeof(txq->sw_ring[0]) * nb_desc);
 		return;
 	}
 
diff --git a/drivers/net/intel/common/tx_scalar.h b/drivers/net/intel/common/tx_scalar.h
index 9fcd2e4733..d27df34dfa 100644
--- a/drivers/net/intel/common/tx_scalar.h
+++ b/drivers/net/intel/common/tx_scalar.h
@@ -197,16 +197,64 @@ ci_tx_xmit_cleanup(struct ci_tx_queue *txq)
 	const uint16_t rs_idx = (last_desc_cleaned == nb_tx_desc - 1) ?
 			0 :
 			(last_desc_cleaned + 1) >> txq->log2_rs_thresh;
-	uint16_t desc_to_clean_to = (rs_idx << txq->log2_rs_thresh) + (txq->tx_rs_thresh - 1);
+	const uint16_t dd_idx = txq->rs_last_id[rs_idx];
+	const uint16_t first_to_clean = rs_idx << txq->log2_rs_thresh;
 
-	/* Check if descriptor is done  */
-	if ((txd[txq->rs_last_id[rs_idx]].cmd_type_offset_bsz &
-			rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
-				rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
+	/* Check if descriptor is done - all drivers use 0xF as done value in bits 3:0 */
+	if ((txd[dd_idx].cmd_type_offset_bsz & rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
+			rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
+		/* Descriptor not yet processed by hardware */
 		return -1;
 
+	/* DD bit is set, descriptors are done. Now free the mbufs. */
+	/* Note: nb_tx_desc is guaranteed to be a multiple of tx_rs_thresh,
+	 * validated during queue setup. This means cleanup never wraps around
+	 * the ring within a single burst (e.g., ring=256, rs_thresh=32 gives
+	 * bursts of 0-31, 32-63, ..., 224-255).
+	 */
+	const uint16_t nb_to_clean = txq->tx_rs_thresh;
+	struct ci_tx_entry *sw_ring = txq->sw_ring;
+
+	/* fast_free_mp is NULL only when the fast free is disabled*/
+	if (txq->fast_free_mp != NULL) {
+		/* FAST_FREE path: mbufs are already reset, just return to pool */
+		struct rte_mbuf *free[CI_TX_MAX_FREE_BUF_SZ];
+		uint16_t nb_free = 0;
+
+		/* Get cached mempool pointer, or cache it on first use */
+		struct rte_mempool *mp =
+			likely(txq->fast_free_mp != (void *)UINTPTR_MAX) ?
+			txq->fast_free_mp :
+			(txq->fast_free_mp = sw_ring[dd_idx].mbuf->pool);
+
+		/* Pack non-NULL mbufs in-place at start of sw_ring range.
+		 * No modulo needed in loop since we're guaranteed not to wrap.
+		 */
+		for (uint16_t i = 0; i < nb_to_clean; i++) {
+			struct rte_mbuf *m = sw_ring[first_to_clean + i].mbuf;
+			if (m == NULL)
+				continue;
+			free[nb_free++] = m;
+			if (unlikely(nb_free == CI_TX_MAX_FREE_BUF_SZ)) {
+				rte_mbuf_raw_free_bulk(mp, free, nb_free);
+				nb_free = 0;
+			}
+		}
+
+		/* Bulk return to mempool using packed sw_ring entries directly */
+		if (nb_free > 0)
+			rte_mbuf_raw_free_bulk(mp, free, nb_free);
+	} else {
+		/* Non-FAST_FREE path: use free_seg for refcount checks and freeing */
+		for (uint16_t i = 0; i < nb_to_clean; i++) {
+			struct rte_mbuf *m = sw_ring[first_to_clean + i].mbuf;
+			if (m != NULL)
+				rte_pktmbuf_free_seg(m);
+		}
+	}
+
 	/* Update the txq to reflect the last descriptor that was cleaned */
-	txq->last_desc_cleaned = desc_to_clean_to;
+	txq->last_desc_cleaned = first_to_clean + txq->tx_rs_thresh - 1;
 	txq->nb_tx_free += txq->tx_rs_thresh;
 
 	return 0;
@@ -450,8 +498,6 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 			txd = &ci_tx_ring[tx_id];
 			tx_id = txe->next_id;
 
-			if (txe->mbuf)
-				rte_pktmbuf_free_seg(txe->mbuf);
 			txe->mbuf = tx_pkt;
 			/* Setup TX Descriptor */
 			td_cmd |= CI_TX_DESC_CMD_EOP;
@@ -471,11 +517,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 			uint64_t *ctx_txd = RTE_CAST_PTR(uint64_t *, &ci_tx_ring[tx_id]);
 
 			txn = &sw_ring[txe->next_id];
-			RTE_MBUF_PREFETCH_TO_FREE(txn->mbuf);
-			if (txe->mbuf) {
-				rte_pktmbuf_free_seg(txe->mbuf);
-				txe->mbuf = NULL;
-			}
+			txe->mbuf = NULL;
 
 			write_txd(ctx_txd, cd_qw0, cd_qw1);
 
@@ -488,11 +530,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 			uint64_t *ipsec_txd = RTE_CAST_PTR(uint64_t *, &ci_tx_ring[tx_id]);
 
 			txn = &sw_ring[txe->next_id];
-			RTE_MBUF_PREFETCH_TO_FREE(txn->mbuf);
-			if (txe->mbuf) {
-				rte_pktmbuf_free_seg(txe->mbuf);
-				txe->mbuf = NULL;
-			}
+			txe->mbuf = NULL;
 
 			ipsec_txd[0] = ipsec_qw0;
 			ipsec_txd[1] = ipsec_qw1;
@@ -507,10 +545,22 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 			txd = &ci_tx_ring[tx_id];
 			txn = &sw_ring[txe->next_id];
 
-			if (txe->mbuf)
-				rte_pktmbuf_free_seg(txe->mbuf);
 			txe->mbuf = m_seg;
 
+			/* For FAST_FREE: reset mbuf fields while we have it in cache.
+			 * [Fast free is indicated by txq->fast_free_mp being non-NULL.]
+			 * FAST_FREE guarantees refcnt=1 and direct mbufs, so we only
+			 * need to reset nb_segs and next pointer as per rte_pktmbuf_prefree_seg.
+			 * Save next pointer before resetting since we need it for loop iteration.
+			 */
+			struct rte_mbuf *next_seg = m_seg->next;
+			if (txq->fast_free_mp != NULL) {
+				if (m_seg->nb_segs != 1)
+					m_seg->nb_segs = 1;
+				if (next_seg != NULL)
+					m_seg->next = NULL;
+			}
+
 			/* Setup TX Descriptor */
 			/* Calculate segment length, using IPsec callback if provided */
 			if (ipsec_ops != NULL)
@@ -528,18 +578,23 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 					((uint64_t)CI_MAX_DATA_PER_TXD << CI_TXD_QW1_TX_BUF_SZ_S) |
 					((uint64_t)td_tag << CI_TXD_QW1_L2TAG1_S);
 				write_txd(txd, buf_dma_addr, cmd_type_offset_bsz);
+				/* txe for this slot has already been written (e.g. above outside
+				 * loop), so we write the extra NULL mbuf pointer for this
+				 * descriptor after we increment txe below.
+				 */
 
 				buf_dma_addr += CI_MAX_DATA_PER_TXD;
 				slen -= CI_MAX_DATA_PER_TXD;
 
 				tx_id = txe->next_id;
 				txe = txn;
+				txe->mbuf = NULL;
 				txd = &ci_tx_ring[tx_id];
 				txn = &sw_ring[txe->next_id];
 			}
 
 			/* fill the last descriptor with End of Packet (EOP) bit */
-			if (m_seg->next == NULL)
+			if (next_seg == NULL)
 				td_cmd |= CI_TX_DESC_CMD_EOP;
 
 			const uint64_t cmd_type_offset_bsz = CI_TX_DESC_DTYPE_DATA |
@@ -551,7 +606,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
 
 			tx_id = txe->next_id;
 			txe = txn;
-			m_seg = m_seg->next;
+			m_seg = next_seg;
 		} while (m_seg);
 end_pkt:
 		txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_used);
-- 
2.53.0


^ permalink raw reply related

* Re: [PATCH v3 1/3] spinlock: remove volatile qualifier
From: Bruce Richardson @ 2026-05-19 11:03 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, Stephen Hemminger, Konstantin Ananyev, Robin Jarry, stable
In-Reply-To: <20260519103640.3986710-1-thomas@monjalon.net>

On Tue, May 19, 2026 at 12:34:14PM +0200, Thomas Monjalon wrote:
> When compiling with C++20 standard requirement (default in GCC 16),
> the increment and decrement of volatile variables are rejected:
> 
> rte_spinlock.h:241:14: error:
> 	'++' expression of 'volatile'-qualified type is deprecated
> rte_spinlock.h:252:21: error:
> 	'--' expression of 'volatile'-qualified type is deprecated
> rte_spinlock.h:278:14: error:
> 	'++' expression of 'volatile'-qualified type is deprecated
> 
> The count field of rte_spinlock_recursive_t
> does not need the volatile qualifier
> because it is only accessed by the thread holding the lock,
> which already provides the necessary memory ordering.
> 
> The user field can be accessed outside of the lock,
> so it must handled as a C11 atomic variable.
> The name is also changed from user to owner.
> It will break if an application is accessing this field directly,
> which should never happen.
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
> v1: drop volatile keyword
> v2: make user an atomic variable
> v3: rename user as owner
> ---
>  lib/eal/include/generic/rte_spinlock.h | 17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
> 
Series-acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply

* Re: [PATCH v2] net/intel: optimize for fast-free hint
From: Bruce Richardson @ 2026-05-19 11:01 UTC (permalink / raw)
  To: Morten Brørup; +Cc: dev
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35F657DE@smartserver.smartshare.dk>

On Wed, Apr 08, 2026 at 09:27:11PM +0200, Morten Brørup wrote:
> > From: Bruce Richardson [mailto:bruce.richardson@intel.com]
> > Sent: Wednesday, 8 April 2026 15.25
> > 
> > When the fast-free hint is provided to the driver we know that the
> > mbufs
> > have refcnt of 1 and are from the same mempool. Therefore, we can
> > optimize a bit for this case by:
> > 
> > * resetting the necessary mbuf fields, ie. nb_seg and next pointer when
> >   we are accessing the mbuf on writing the descriptor.
> > * on cleanup of buffers after transmit, we can just write those buffers
> >   straight to the mempool without accessing them.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> 
> A bunch of review thoughts inline below.
> The ones regarding instrumentation should be fixed.
> The rest might be irrelevant and/or nonsense.
>

See inline below. Summary:
* ack for mempool functions for instrumentation
* ack for referencing the mp pointer rather than the offload flags
* nak for setting the mbuf pointers for null, it's unnecessary with this
  design.
* ack for removing the prefetches

Thanks for the detailed review. Preparing v3 now.

/Bruce
 
> > ---
> > V2: Fix issues with original submission:
> > * missed check for NULL mbufs
> > * fixed issue with freeing directly from sw_ring in scalar path which
> >   doesn't work as thats not a flag array of pointers
> > * fixed missing null assignment in case of large segments for TSO
> > ---
> >  drivers/net/intel/common/tx.h        | 21 ++++--
> >  drivers/net/intel/common/tx_scalar.h | 95 ++++++++++++++++++++++------
> >  2 files changed, 90 insertions(+), 26 deletions(-)
> > 
> > diff --git a/drivers/net/intel/common/tx.h
> > b/drivers/net/intel/common/tx.h
> > index 283bd58d5d..f2123f069c 100644
> > --- a/drivers/net/intel/common/tx.h
> > +++ b/drivers/net/intel/common/tx.h
> > @@ -363,13 +363,22 @@ ci_txq_release_all_mbufs(struct ci_tx_queue *txq,
> > bool use_ctx)
> >  		return;
> > 
> >  	if (!txq->use_vec_entry) {
> > -		/* Regular scalar path uses sw_ring with ci_tx_entry */
> > -		for (uint16_t i = 0; i < txq->nb_tx_desc; i++) {
> > -			if (txq->sw_ring[i].mbuf != NULL) {
> > -				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
> > -				txq->sw_ring[i].mbuf = NULL;
> > -			}
> > +		/* Free mbufs from (last_desc_cleaned + 1) to (tx_tail -
> > 1). */
> > +		const uint16_t start = (txq->last_desc_cleaned + 1) % txq-
> > >nb_tx_desc;
> > +		const uint16_t nb_desc = txq->nb_tx_desc;
> > +		const uint16_t end = txq->tx_tail;
> > +
> > +		uint16_t i = start;
> > +		if (end < i) {
> > +			for (; i < nb_desc; i++)
> > +				if (txq->sw_ring[i].mbuf != NULL)
> > +					rte_pktmbuf_free_seg(txq-
> > >sw_ring[i].mbuf);
> > +			i = 0;
> >  		}
> > +		for (; i < end; i++)
> > +			if (txq->sw_ring[i].mbuf != NULL)
> > +				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
> > +		memset(txq->sw_ring, 0, sizeof(txq->sw_ring[0]) * nb_desc);
> >  		return;
> >  	}
> 
> The above LGTM.
> IIRC, we already discussed it - or something very similar.
> 
> > 
> > diff --git a/drivers/net/intel/common/tx_scalar.h
> > b/drivers/net/intel/common/tx_scalar.h
> > index 9fcd2e4733..adbc4bafee 100644
> > --- a/drivers/net/intel/common/tx_scalar.h
> > +++ b/drivers/net/intel/common/tx_scalar.h
> > @@ -197,16 +197,63 @@ ci_tx_xmit_cleanup(struct ci_tx_queue *txq)
> >  	const uint16_t rs_idx = (last_desc_cleaned == nb_tx_desc - 1) ?
> >  			0 :
> >  			(last_desc_cleaned + 1) >> txq->log2_rs_thresh;
> > -	uint16_t desc_to_clean_to = (rs_idx << txq->log2_rs_thresh) +
> > (txq->tx_rs_thresh - 1);
> > +	const uint16_t dd_idx = txq->rs_last_id[rs_idx];
> > +	const uint16_t first_to_clean = rs_idx << txq->log2_rs_thresh;
> > 
> > -	/* Check if descriptor is done  */
> > -	if ((txd[txq->rs_last_id[rs_idx]].cmd_type_offset_bsz &
> > -			rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
> > -				rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
> > +	/* Check if descriptor is done - all drivers use 0xF as done
> > value in bits 3:0 */
> > +	if ((txd[dd_idx].cmd_type_offset_bsz &
> > rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
> > +			rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
> > +		/* Descriptor not yet processed by hardware */
> >  		return -1;
> > 
> > +	/* DD bit is set, descriptors are done. Now free the mbufs. */
> > +	/* Note: nb_tx_desc is guaranteed to be a multiple of
> > tx_rs_thresh,
> > +	 * validated during queue setup. This means cleanup never wraps
> > around
> > +	 * the ring within a single burst (e.g., ring=256, rs_thresh=32
> > gives
> > +	 * bursts of 0-31, 32-63, ..., 224-255).
> > +	 */
> > +	const uint16_t nb_to_clean = txq->tx_rs_thresh;
> > +	struct ci_tx_entry *sw_ring = txq->sw_ring;
> > +
> > +	if (txq->offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) {
> > +		/* FAST_FREE path: mbufs are already reset, just return to
> > pool */
> 
> Depending on which cache lines from txq have already been loaded, unless txq->offloads is hot in the CPU cache and txq->fast_free_mp is not, consider testing (mp != NULL) instead of (txq->offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE).
> Like here:
> https://elixir.bootlin.com/dpdk/v26.03/source/drivers/net/intel/common/tx.h#L281
> 

Ack. The offloads are on the second cacheline of the txq, I think, while
the fast_free_mp is on the first one. Therefore, checking the mp pointer
for null is slightly better.

> > +		void *free[CI_TX_MAX_FREE_BUF_SZ];
> > +		uint16_t nb_free = 0;
> > +
> > +		/* Get cached mempool pointer, or cache it on first use */
> > +		struct rte_mempool *mp =
> > +			likely(txq->fast_free_mp != (void *)UINTPTR_MAX) ?
> > +			txq->fast_free_mp :
> > +			(txq->fast_free_mp = sw_ring[dd_idx].mbuf->pool);
> > +
> > +		/* Pack non-NULL mbufs in-place at start of sw_ring range.
> > +		 * No modulo needed in loop since we're guaranteed not to
> > wrap.
> > +		 */
> > +		for (uint16_t i = 0; i < nb_to_clean; i++) {
> > +			struct rte_mbuf *m = sw_ring[first_to_clean +
> > i].mbuf;
> > +			if (m == NULL)
> > +				continue;
> > +			free[nb_free++] = m;
> 
> Should sw_ring[first_to_clean + i].mbuf be set to NULL here, instead of in ci_xmit_pkts()?
> I don't know, just want you to consider it.

No, we are ok just setting it there. The changes in this patch to the
ci_txq_release_all_mbufs() function mean that we assume all buffers between
tx_tail and last_desc_cleaned are invalid/freed (i.e. we free from
last-cleaned to tx_tail only), and so we don't need to set the invalid
slots to NULL.  The NULL sentinel is only used where we have a valid slot
but which does not have an associated mbuf.

> 
> > +			if (unlikely(nb_free == CI_TX_MAX_FREE_BUF_SZ)) {
> > +				rte_mempool_put_bulk(mp, free, nb_free);
> 
> rte_mempool_put_bulk() -> rte_mbuf_raw_free_bulk(),
> for instrumentation.
> 

Ack

> > +				nb_free = 0;
> > +			}
> > +		}
> > +
> > +		/* Bulk return to mempool using packed sw_ring entries
> > directly */
> > +		if (nb_free > 0)
> > +			rte_mempool_put_bulk(mp, free, nb_free);
> 
> rte_mempool_put_bulk() -> rte_mbuf_raw_free_bulk(),
> for instrumentation.

Ack

> 
> > +	} else {
> > +		/* Non-FAST_FREE path: use prefree_seg for refcount checks
> > */
> > +		for (uint16_t i = 0; i < nb_to_clean; i++) {
> > +			struct rte_mbuf *m = sw_ring[first_to_clean +
> > i].mbuf;
> > +			if (m != NULL)
> > +				rte_pktmbuf_free_seg(m);
> 
> Should sw_ring[first_to_clean + i].mbuf be set to NULL here, instead of in ci_xmit_pkts()?
> I don't know, just want you to consider it.
> 

As above, reason should hold for both fast-free and non-fast-free paths.

> > +		}
> > +	}
> > +
> >  	/* Update the txq to reflect the last descriptor that was cleaned
> > */
> > -	txq->last_desc_cleaned = desc_to_clean_to;
> > +	txq->last_desc_cleaned = first_to_clean + txq->tx_rs_thresh - 1;
> >  	txq->nb_tx_free += txq->tx_rs_thresh;
> > 
> >  	return 0;
> > @@ -450,8 +497,6 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> >  			txd = &ci_tx_ring[tx_id];
> >  			tx_id = txe->next_id;
> > 
> > -			if (txe->mbuf)
> > -				rte_pktmbuf_free_seg(txe->mbuf);
> >  			txe->mbuf = tx_pkt;
> >  			/* Setup TX Descriptor */
> >  			td_cmd |= CI_TX_DESC_CMD_EOP;
> > @@ -472,10 +517,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> > 
> >  			txn = &sw_ring[txe->next_id];
> >  			RTE_MBUF_PREFETCH_TO_FREE(txn->mbuf);
> 
> RTE_MBUF_PREFETCH_TO_FREE() doesn't seem relevant here anymore.
> I don't know if it fits into ci_tx_xmit_cleanup() instead.

Yes, dropping.

> 
> > -			if (txe->mbuf) {
> > -				rte_pktmbuf_free_seg(txe->mbuf);
> > -				txe->mbuf = NULL;
> > -			}
> > +			txe->mbuf = NULL;
> 
> Already mentioned: Should txe->mbuf be set to NULL in ci_tx_xmit_cleanup() instead of in ci_tx_xmit_pkts()?
> 
> > 
> >  			write_txd(ctx_txd, cd_qw0, cd_qw1);
> > 
> > @@ -489,10 +531,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> > 
> >  			txn = &sw_ring[txe->next_id];
> >  			RTE_MBUF_PREFETCH_TO_FREE(txn->mbuf);
> 
> RTE_MBUF_PREFETCH_TO_FREE() doesn't seem relevant here anymore.
> I don't know if it fits into ci_tx_xmit_cleanup() instead.
> 
> > -			if (txe->mbuf) {
> > -				rte_pktmbuf_free_seg(txe->mbuf);
> > -				txe->mbuf = NULL;
> > -			}
> > +			txe->mbuf = NULL;
> 
> Already mentioned: Should txe->mbuf be set to NULL in ci_tx_xmit_cleanup() instead of in ci_tx_xmit_pkts()?
> 
> > 
> >  			ipsec_txd[0] = ipsec_qw0;
> >  			ipsec_txd[1] = ipsec_qw1;
> > @@ -507,10 +546,21 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> >  			txd = &ci_tx_ring[tx_id];
> >  			txn = &sw_ring[txe->next_id];
> > 
> > -			if (txe->mbuf)
> > -				rte_pktmbuf_free_seg(txe->mbuf);
> >  			txe->mbuf = m_seg;
> > 
> > +			/* For FAST_FREE: reset mbuf fields while we have it
> > in cache.
> > +			 * FAST_FREE guarantees refcnt=1 and direct mbufs, so
> > we only
> > +			 * need to reset nb_segs and next pointer as per
> > rte_pktmbuf_prefree_seg.
> > +			 * Save next pointer before resetting since we need
> > it for loop iteration.
> > +			 */
> > +			struct rte_mbuf *next_seg = m_seg->next;
> > +			if (txq->offloads &
> > RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) {
> 
> Similar to comment further above: Is txq->offloads or txq->fast_free_mp hotter in the CPU cache here?
> 

Updating as you suggest.

> > +				if (m_seg->nb_segs != 1)
> > +					m_seg->nb_segs = 1;
> > +				if (next_seg != NULL)
> > +					m_seg->next = NULL;
> > +			}
> > +
> >  			/* Setup TX Descriptor */
> >  			/* Calculate segment length, using IPsec callback if
> > provided */
> >  			if (ipsec_ops != NULL)
> > @@ -528,18 +578,23 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> >  					((uint64_t)CI_MAX_DATA_PER_TXD <<
> > CI_TXD_QW1_TX_BUF_SZ_S) |
> >  					((uint64_t)td_tag <<
> > CI_TXD_QW1_L2TAG1_S);
> >  				write_txd(txd, buf_dma_addr,
> > cmd_type_offset_bsz);
> > +				/* txe for this slot has already been written
> > (e.g. above outside
> > +				 * loop), so we write the extra NULL mbuf
> > pointer for this
> > +				 * descriptor after we increment txe below.
> > +				 */
> > 
> >  				buf_dma_addr += CI_MAX_DATA_PER_TXD;
> >  				slen -= CI_MAX_DATA_PER_TXD;
> > 
> >  				tx_id = txe->next_id;
> >  				txe = txn;
> > +				txe->mbuf = NULL;
> >  				txd = &ci_tx_ring[tx_id];
> >  				txn = &sw_ring[txe->next_id];
> >  			}
> > 
> >  			/* fill the last descriptor with End of Packet (EOP)
> > bit */
> > -			if (m_seg->next == NULL)
> > +			if (next_seg == NULL)
> >  				td_cmd |= CI_TX_DESC_CMD_EOP;
> > 
> >  			const uint64_t cmd_type_offset_bsz =
> > CI_TX_DESC_DTYPE_DATA |
> > @@ -551,7 +606,7 @@ ci_xmit_pkts(struct ci_tx_queue *txq,
> > 
> >  			tx_id = txe->next_id;
> >  			txe = txn;
> > -			m_seg = m_seg->next;
> > +			m_seg = next_seg;
> >  		} while (m_seg);
> >  end_pkt:
> >  		txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_used);
> > --
> > 2.51.0
> 

^ permalink raw reply

* [PATCH v3 3/3] spinlock: fix API comments
From: Thomas Monjalon @ 2026-05-19 10:34 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Konstantin Ananyev, Bruce Richardson,
	Robin Jarry, stable, Cunming Liang, Olivier Matz
In-Reply-To: <20260519103640.3986710-1-thomas@monjalon.net>

This is not a read-write lock.

The user field stores the thread ID, not the core ID
since a change in DPDK 2.0.0.

The implementation is architecture-specific in some cases only.

Fixes: ca2e2dab079a ("spinlock: support non-EAL thread")
Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Reported-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 lib/eal/include/generic/rte_spinlock.h | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/lib/eal/include/generic/rte_spinlock.h b/lib/eal/include/generic/rte_spinlock.h
index e7cd18a8e2..dd3d2d046c 100644
--- a/lib/eal/include/generic/rte_spinlock.h
+++ b/lib/eal/include/generic/rte_spinlock.h
@@ -7,12 +7,16 @@
 
 /**
  * @file
+ * DPDK spinlocks
  *
- * RTE Spinlocks
+ * This is an API for spinlocks.
+ * This kind of lock simply waits in a loop
+ * repeatedly checking until the lock becomes available.
  *
- * This file defines an API for read-write locks, which are implemented
- * in an architecture-specific way. This kind of lock simply waits in
- * a loop repeatedly checking until the lock becomes available.
+ * Some functions may have an architecture-specific implementation
+ * if RTE_FORCE_INTRINSICS is disabled.
+ * The hardware transactional memory (lock elision) functions have _tm suffix
+ * and are implemented in architecture-specific files.
  *
  * All locks must be initialised before use, and only initialised once.
  */
@@ -198,7 +202,7 @@ rte_spinlock_trylock_tm(rte_spinlock_t *sl)
  */
 typedef struct {
 	rte_spinlock_t sl; /**< the actual spinlock */
-	RTE_ATOMIC(int) owner; /**< core id using lock, -1 for unused */
+	RTE_ATOMIC(int) owner; /**< thread id owning lock, -1 for unused */
 	int count; /**< count of time this lock has been called */
 } rte_spinlock_recursive_t;
 
-- 
2.54.0


^ permalink raw reply related

* [PATCH v3 2/3] spinlock: add debug checks in recursive unlock
From: Thomas Monjalon @ 2026-05-19 10:34 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Konstantin Ananyev, Bruce Richardson,
	Robin Jarry
In-Reply-To: <20260519103640.3986710-1-thomas@monjalon.net>

The recursive unlock assumes that the caller owns the lock.
This behavior will be checked when RTE_ENABLE_ASSERT is on.
There is an additional check for the count which should be positive
if no corruption happened.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
v3: new patch in the series
---
 lib/eal/include/generic/rte_spinlock.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/eal/include/generic/rte_spinlock.h b/lib/eal/include/generic/rte_spinlock.h
index ffdcb8fa3d..e7cd18a8e2 100644
--- a/lib/eal/include/generic/rte_spinlock.h
+++ b/lib/eal/include/generic/rte_spinlock.h
@@ -21,6 +21,7 @@
 #ifdef RTE_FORCE_INTRINSICS
 #include <rte_common.h>
 #endif
+#include <rte_debug.h>
 #include <rte_lock_annotations.h>
 #include <rte_pause.h>
 #include <rte_stdatomic.h>
@@ -245,6 +246,8 @@ static inline void rte_spinlock_recursive_lock(rte_spinlock_recursive_t *slr)
 static inline void rte_spinlock_recursive_unlock(rte_spinlock_recursive_t *slr)
 	__rte_no_thread_safety_analysis
 {
+	RTE_ASSERT(rte_atomic_load_explicit(&slr->owner, rte_memory_order_relaxed) == rte_gettid());
+	RTE_ASSERT(slr->count > 0);
 	if (--(slr->count) == 0) {
 		rte_atomic_store_explicit(&slr->owner, -1, rte_memory_order_relaxed);
 		rte_spinlock_unlock(&slr->sl);
-- 
2.54.0


^ permalink raw reply related

* [PATCH v3 1/3] spinlock: remove volatile qualifier
From: Thomas Monjalon @ 2026-05-19 10:34 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Konstantin Ananyev, Bruce Richardson,
	Robin Jarry, stable
In-Reply-To: <20260504083714.2904729-1-thomas@monjalon.net>

When compiling with C++20 standard requirement (default in GCC 16),
the increment and decrement of volatile variables are rejected:

rte_spinlock.h:241:14: error:
	'++' expression of 'volatile'-qualified type is deprecated
rte_spinlock.h:252:21: error:
	'--' expression of 'volatile'-qualified type is deprecated
rte_spinlock.h:278:14: error:
	'++' expression of 'volatile'-qualified type is deprecated

The count field of rte_spinlock_recursive_t
does not need the volatile qualifier
because it is only accessed by the thread holding the lock,
which already provides the necessary memory ordering.

The user field can be accessed outside of the lock,
so it must handled as a C11 atomic variable.
The name is also changed from user to owner.
It will break if an application is accessing this field directly,
which should never happen.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
v1: drop volatile keyword
v2: make user an atomic variable
v3: rename user as owner
---
 lib/eal/include/generic/rte_spinlock.h | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/lib/eal/include/generic/rte_spinlock.h b/lib/eal/include/generic/rte_spinlock.h
index c907d4e45c..ffdcb8fa3d 100644
--- a/lib/eal/include/generic/rte_spinlock.h
+++ b/lib/eal/include/generic/rte_spinlock.h
@@ -197,8 +197,8 @@ rte_spinlock_trylock_tm(rte_spinlock_t *sl)
  */
 typedef struct {
 	rte_spinlock_t sl; /**< the actual spinlock */
-	volatile int user; /**< core id using lock, -1 for unused */
-	volatile int count; /**< count of time this lock has been called */
+	RTE_ATOMIC(int) owner; /**< core id using lock, -1 for unused */
+	int count; /**< count of time this lock has been called */
 } rte_spinlock_recursive_t;
 
 /**
@@ -215,7 +215,7 @@ typedef struct {
 static inline void rte_spinlock_recursive_init(rte_spinlock_recursive_t *slr)
 {
 	rte_spinlock_init(&slr->sl);
-	slr->user = -1;
+	rte_atomic_store_explicit(&slr->owner, -1, rte_memory_order_relaxed);
 	slr->count = 0;
 }
 
@@ -230,9 +230,9 @@ static inline void rte_spinlock_recursive_lock(rte_spinlock_recursive_t *slr)
 {
 	int id = rte_gettid();
 
-	if (slr->user != id) {
+	if (rte_atomic_load_explicit(&slr->owner, rte_memory_order_relaxed) != id) {
 		rte_spinlock_lock(&slr->sl);
-		slr->user = id;
+		rte_atomic_store_explicit(&slr->owner, id, rte_memory_order_relaxed);
 	}
 	slr->count++;
 }
@@ -246,10 +246,9 @@ static inline void rte_spinlock_recursive_unlock(rte_spinlock_recursive_t *slr)
 	__rte_no_thread_safety_analysis
 {
 	if (--(slr->count) == 0) {
-		slr->user = -1;
+		rte_atomic_store_explicit(&slr->owner, -1, rte_memory_order_relaxed);
 		rte_spinlock_unlock(&slr->sl);
 	}
-
 }
 
 /**
@@ -266,10 +265,10 @@ static inline int rte_spinlock_recursive_trylock(rte_spinlock_recursive_t *slr)
 {
 	int id = rte_gettid();
 
-	if (slr->user != id) {
+	if (rte_atomic_load_explicit(&slr->owner, rte_memory_order_relaxed) != id) {
 		if (rte_spinlock_trylock(&slr->sl) == 0)
 			return 0;
-		slr->user = id;
+		rte_atomic_store_explicit(&slr->owner, id, rte_memory_order_relaxed);
 	}
 	slr->count++;
 	return 1;
-- 
2.54.0


^ permalink raw reply related

* Re: [PATCH v2 1/2] spinlock: remove volatile qualifier
From: Thomas Monjalon @ 2026-05-19 10:35 UTC (permalink / raw)
  To: Robin Jarry
  Cc: Bruce Richardson, dev, Stephen Hemminger, Konstantin Ananyev,
	stable
In-Reply-To: <DIMJH4P7RJRX.3PUWC7L1KC4I8@redhat.com>

19/05/2026 11:17, Robin Jarry:
> Bruce Richardson, May 18, 2026 at 17:28:
> > On Mon, May 18, 2026 at 05:25:43PM +0200, Thomas Monjalon wrote:
> >> 18/05/2026 17:14, Robin Jarry:
> >> > Thomas Monjalon, May 18, 2026 at 17:07:
> >> > > @@ -246,10 +246,9 @@ static inline void rte_spinlock_recursive_unlock(rte_spinlock_recursive_t *slr)
> >> > >  	__rte_no_thread_safety_analysis
> >> > >  {
> >> > >  	if (--(slr->count) == 0) {
> >> > 
> >> > This code is completely broken. Any thread can unlock without any check.
> >> 
> >> Maybe, but I don't intend to fix recursive unlock in this patch.
> >> The subject is "remove volatile qualifier" (and unblock GCC 16).
> >> 
> > As with regular mutexes, threads should not go around unlocking when not
> > holding the lock. Therefore, I think this is fine. [With regular spinlocks
> > we can't check since we don't track threads, therefore I think we just need
> > to assume a well-behaved app.]
> 
> Ok, fair enough :)
> 
> As Stephen suggested, maybe we could add some assertions?
> 
>  static inline void rte_spinlock_recursive_unlock(rte_spinlock_recursive_t *slr)
>         __rte_no_thread_safety_analysis
>  {
> +       RTE_ASSERT(rte_atomic_load_explicit(&slr->user, rte_memory_order_relaxed) == rte_gettid());
> +       RTE_ASSERT(slr->count > 0);
> +

OK I add it as a separate patch in v3.



^ permalink raw reply

* DPDK 24.11.6 released
From: luca.boccassi @ 2026-05-19 10:27 UTC (permalink / raw)
  To: announce

Hi all,

Here is a new stable release:
	https://fast.dpdk.org/rel/dpdk-24.11.6.tar.xz

The git tree is at:
	https://dpdk.org/browse/dpdk-stable/?h=24.11

Luca Boccassi

---
 VERSION                                |  2 +-
 doc/guides/rel_notes/release_24_11.rst | 17 +++++++++++++++++
 lib/net/rte_net.c                      | 29 +++++++++++++++--------------
 3 files changed, 33 insertions(+), 15 deletions(-)
Luca Boccassi (3):
      docs: fix build issue due to missing spacing between paragraphs
      Revert "net: fix packet type for stacked VLAN"
      version: 24.11.6

^ permalink raw reply

* RE: [EXTERNAL] [PATCH dpdk] graph: replace circular buffer with priority-based bitmap scheduling
From: Jerin Jacob @ 2026-05-19 10:25 UTC (permalink / raw)
  To: Robin Jarry, dev@dpdk.org, Kiran Kumar Kokkilagadda,
	Nithin Kumar Dabilpuram, Zhirun Yan
  Cc: Vladimir Medvedkin, Christophe Fontaine, David Marchand,
	Konstantin Ananyev, Maxime Leroy
In-Reply-To: <20260519101232.541102-2-rjarry@redhat.com>



> -----Original Message-----
> From: Robin Jarry <rjarry@redhat.com>
> Sent: Tuesday, May 19, 2026 3:43 PM
> To: dev@dpdk.org; Jerin Jacob <jerinj@marvell.com>; Kiran Kumar
> Kokkilagadda <kirankumark@marvell.com>; Nithin Kumar Dabilpuram
> <ndabilpuram@marvell.com>; Zhirun Yan <yanzhirun_163@163.com>
> Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>; Christophe Fontaine
> <cfontain@redhat.com>; David Marchand <david.marchand@redhat.com>;
> Konstantin Ananyev <konstantin.ananyev@huawei.com>; Maxime Leroy
> <maxime@leroys.fr>
> Subject: [EXTERNAL] [PATCH dpdk] graph: replace circular buffer with priority-
> based bitmap scheduling
> 
> Replace the FIFO circular buffer used to track pending nodes with a bitmap and
> a priority-sorted schedule table. Each node can now have a scheduling priority
> (int16_t, default 0, lower value means visited first). Source nodes are forced to
> INT16_MIN
> > Replace the FIFO circular buffer used to track pending nodes with
> a bitmap and a priority-sorted schedule table. Each node can now have
> a scheduling priority (int16_t, default 0, lower value means visited
> first). Source nodes are forced to INT16_MIN so they always run first.
> 
> At graph creation time, nodes are sorted by (priority, id) and assigned
> a bit position (sched_idx). During the walk, a bitmap tracks which nodes
> have pending objects. Scanning from the lowest bit naturally visits
> nodes in priority order.
> 
> This improves batching in fan-out-then-converge topologies. When
> eth_input classifies packets to both mpls_input and ipv4_input, the old
> FIFO order could process ipv4_input before mpls_input, causing
> ipv4_input to be visited twice (once before and once after the MPLS
> label is popped). With mpls_input at a higher priority (lower value), it
> runs first and its output accumulates in ipv4_input which is then
> visited only once with all packets.
> 
> The bitmap set operation is idempotent (OR on an already-set bit is
> a no-op) which removes the need for the idx == 0 guards that the
> circular buffer required to avoid duplicate enqueue.


Some high-level comments:

1)What will be the performance overhead for graph walk.  Try app/test/test_graph_perf.c and l3fwd_graph
2)If priorities are same, Does it have similar performance with existing code?
3)Does it have any effect on packet ordering on egress.i.e for a given flow ingress order != egress order

If there is performance regression we may need to consider new RTE_GRAPH_MODEL_XXXXX to enable this feature



^ permalink raw reply

* [PATCH dpdk] graph: replace circular buffer with priority-based bitmap scheduling
From: Robin Jarry @ 2026-05-19 10:12 UTC (permalink / raw)
  To: dev, Jerin Jacob, Kiran Kumar K, Nithin Dabilpuram, Zhirun Yan
  Cc: Vladimir Medvedkin, Christophe Fontaine, David Marchand,
	Konstantin Ananyev, Maxime Leroy

Replace the FIFO circular buffer used to track pending nodes with
a bitmap and a priority-sorted schedule table. Each node can now have
a scheduling priority (int16_t, default 0, lower value means visited
first). Source nodes are forced to INT16_MIN so they always run first.

At graph creation time, nodes are sorted by (priority, id) and assigned
a bit position (sched_idx). During the walk, a bitmap tracks which nodes
have pending objects. Scanning from the lowest bit naturally visits
nodes in priority order.

This improves batching in fan-out-then-converge topologies. When
eth_input classifies packets to both mpls_input and ipv4_input, the old
FIFO order could process ipv4_input before mpls_input, causing
ipv4_input to be visited twice (once before and once after the MPLS
label is popped). With mpls_input at a higher priority (lower value), it
runs first and its output accumulates in ipv4_input which is then
visited only once with all packets.

The bitmap set operation is idempotent (OR on an already-set bit is
a no-op) which removes the need for the idx == 0 guards that the
circular buffer required to avoid duplicate enqueue.

Suggested-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Signed-off-by: Robin Jarry <rjarry@redhat.com>
Cc: Christophe Fontaine <cfontain@redhat.com>
Cc: David Marchand <david.marchand@redhat.com>
Cc: Konstantin Ananyev <konstantin.ananyev@huawei.com>
Cc: Maxime Leroy <maxime@leroys.fr>
---
 doc/guides/prog_guide/graph_lib.rst           |   37 +-
 .../prog_guide/img/graph_mem_layout.svg       | 1823 +++++++----------
 lib/graph/graph.c                             |   19 +-
 lib/graph/graph_debug.c                       |   12 +-
 lib/graph/graph_populate.c                    |  117 +-
 lib/graph/graph_private.h                     |   27 +-
 lib/graph/node.c                              |    2 +
 lib/graph/rte_graph.h                         |    1 +
 lib/graph/rte_graph_model_mcore_dispatch.h    |   34 +-
 lib/graph/rte_graph_model_rtc.h               |   65 +-
 lib/graph/rte_graph_worker.h                  |    2 +-
 lib/graph/rte_graph_worker_common.h           |   81 +-
 12 files changed, 984 insertions(+), 1236 deletions(-)

diff --git a/doc/guides/prog_guide/graph_lib.rst b/doc/guides/prog_guide/graph_lib.rst
index 8409e7666e85..9c6d8679b686 100644
--- a/doc/guides/prog_guide/graph_lib.rst
+++ b/doc/guides/prog_guide/graph_lib.rst
@@ -117,13 +117,22 @@ next_node[]:
 The dynamic array to store the downstream nodes connected to this node. Downstream
 node should not be current node itself or a source node.
 
+priority:
+^^^^^^^^^
+
+The scheduling priority of the node (``int16_t``, default 0). Nodes with lower
+priority values are visited first during the graph walk. This allows control
+over the order in which pending nodes are processed, which can improve packet
+batching in topologies where multiple paths converge on the same node.
+
 Source node:
 ^^^^^^^^^^^^
 
 Source nodes are static nodes created using ``RTE_NODE_REGISTER`` by passing
 ``flags`` as ``RTE_NODE_SOURCE_F``.
-While performing the graph walk, the ``process()`` function of all the source
-nodes will be called first. So that these nodes can be used as input nodes for a graph.
+Source nodes are automatically assigned the lowest possible priority
+(``INT16_MIN``) so that their ``process()`` function is always called first
+during the graph walk. This ensures they act as input nodes for a graph.
 
 nb_xstats:
 ^^^^^^^^^^
@@ -396,12 +405,26 @@ Graph object memory layout
 Understanding the memory layout helps to debug the graph library and
 improve the performance if needed.
 
-Graph object consists of a header, circular buffer to store the pending stream
-when walking over the graph, variable-length memory to store the ``rte_node`` objects,
-and variable-length memory to store the xstat reported by each ``rte_node``.
+A graph object consists of a header, a scheduling table mapping bit positions to
+node offsets, pending and source bitmaps for tracking which nodes need
+processing, variable-length memory to store the ``rte_node`` objects, and
+variable-length memory to store the xstat reported by each ``rte_node``.
 
-The graph_nodes_mem_create() creates and populate this memory. The functions
-such as ``rte_graph_walk()`` and ``rte_node_enqueue_*`` use this memory
+Nodes are sorted by ``(priority, node_id)`` at graph creation time and each
+node is assigned a bit position in the pending bitmap. During the graph walk,
+the bitmap is scanned from the lowest bit, so nodes with lower priority values
+are visited first. Source nodes are always assigned the lowest priority
+(``INT16_MIN``) to ensure they run before any processing node.
+
+This priority-based ordering improves batching in fan-out-then-converge
+topologies. For example, if ``eth_input`` classifies packets to both
+``mpls_input`` and ``ipv4_input``, giving ``mpls_input`` a lower priority value
+ensures it runs first. Its output accumulates in ``ipv4_input`` which is then
+visited only once with all packets, instead of being visited twice (before and
+after MPLS label popping).
+
+The ``graph_fp_mem_create()`` function creates and populates this memory. The
+functions such as ``rte_graph_walk()`` and ``rte_node_enqueue_*`` use this memory
 to enable fastpath services.
 
 Graph feature arc
diff --git a/doc/guides/prog_guide/img/graph_mem_layout.svg b/doc/guides/prog_guide/img/graph_mem_layout.svg
index 3f3a4f3a808e..853987907dec 100644
--- a/doc/guides/prog_guide/img/graph_mem_layout.svg
+++ b/doc/guides/prog_guide/img/graph_mem_layout.svg
@@ -1,65 +1,22 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
 <!-- SPDX-License-Identifier: BSD-3-Clause -->
+
 <!-- Copyright(C) 2020 Marvell International Ltd. -->
+
 <svg
-   width="960"
-   height="600"
-   viewBox="0 0 960 600"
+   width="820"
+   height="540"
+   viewBox="0 0 819.99998 540"
    version="1.1"
-   id="svg1"
-   inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
+   id="svg56"
    sodipodi:docname="graph_mem_layout.svg"
+   inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:svg="http://www.w3.org/2000/svg">
-  <sodipodi:namedview
-     id="namedview1"
-     pagecolor="#ffffff"
-     bordercolor="#000000"
-     borderopacity="0.25"
-     inkscape:showpageshadow="2"
-     inkscape:pageopacity="0.0"
-     inkscape:pagecheckerboard="0"
-     inkscape:deskcolor="#d1d1d1"
-     inkscape:document-units="px"
-     showgrid="true"
-     inkscape:zoom="6.1531386"
-     inkscape:cx="753.51789"
-     inkscape:cy="469.11019"
-     inkscape:window-width="1920"
-     inkscape:window-height="1057"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="layer1">
-    <inkscape:grid
-       id="grid18"
-       units="px"
-       originx="0"
-       originy="0"
-       spacingx="1"
-       spacingy="1"
-       empcolor="#0099e5"
-       empopacity="0.30196078"
-       color="#0099e5"
-       opacity="0.14901961"
-       empspacing="5"
-       dotted="false"
-       gridanglex="30"
-       gridanglez="30"
-       visible="true" />
-  </sodipodi:namedview>
   <defs
-     id="defs1">
-    <rect
-       x="569.30411"
-       y="433.24112"
-       width="99.519047"
-       height="22.294105"
-       id="rect22" />
+     id="defs56">
     <marker
        style="overflow:visible"
        id="Triangle"
@@ -67,8 +24,8 @@
        refY="0"
        orient="auto-start-reverse"
        inkscape:stockid="Triangle arrow"
-       markerWidth="1"
-       markerHeight="1"
+       markerWidth="2"
+       markerHeight="2"
        viewBox="0 0 1 1"
        inkscape:isstock="true"
        inkscape:collect="always"
@@ -79,1065 +36,705 @@
          d="M 5.77,0 -2.88,5 V -5 Z"
          id="path135" />
     </marker>
-    <rect
-       x="656.57551"
-       y="399.79598"
-       width="185.92138"
-       height="16.251869"
-       id="rect19" />
-    <rect
-       x="765.814"
-       y="425.65652"
-       width="104.80528"
-       height="23.902958"
-       id="rect18" />
-    <rect
-       x="650.43626"
-       y="461.97063"
-       width="56.999362"
-       height="17.927219"
-       id="rect16" />
-    <linearGradient
-       id="swatch10"
-       inkscape:swatch="solid">
-      <stop
-         style="stop-color:#090608;stop-opacity:1;"
-         offset="0"
-         id="stop10" />
-    </linearGradient>
-    <rect
-       x="451.39817"
-       y="509.77655"
-       width="136.52266"
-       height="74.007236"
-       id="rect7" />
-    <rect
-       x="334.18174"
-       y="450.01915"
-       width="51.483294"
-       height="22.064269"
-       id="rect6" />
-    <rect
-       x="332.80272"
-       y="483.11556"
-       width="57.918706"
-       height="32.177059"
-       id="rect5" />
-    <rect
-       x="361.3024"
-       y="464.26899"
-       width="133.30496"
-       height="49.644605"
-       id="rect4" />
-    <rect
-       x="155.8289"
-       y="426.57587"
-       width="103.88593"
-       height="13.330496"
-       id="rect2" />
-    <marker
-       style="overflow:visible"
-       id="Triangle-0"
-       refX="0"
-       refY="0"
-       orient="auto-start-reverse"
-       inkscape:stockid="Triangle arrow"
-       markerWidth="1"
-       markerHeight="1"
-       viewBox="0 0 1 1"
-       inkscape:isstock="true"
-       inkscape:collect="always"
-       preserveAspectRatio="xMidYMid">
-      <path
-         transform="scale(0.5)"
-         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         id="path135-2" />
-    </marker>
-    <rect
-       x="656.5755"
-       y="399.79599"
-       width="186.38106"
-       height="37.396793"
-       id="rect19-5" />
   </defs>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <path
-       stroke="#1155cc"
-       stroke-width="1.13576"
-       stroke-linecap="butt"
-       d="M 144.20018,75.514867 V 521.03057"
-       fill-rule="nonzero"
-       id="path232" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1.13545"
-       stroke-linecap="butt"
-       d="M 272.64375,75.629785 V 520.91592"
-       fill-rule="nonzero"
-       id="path234" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,76.013557 H 273.14244"
-       fill-rule="nonzero"
-       id="path236" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,127.21041 H 273.14244"
-       fill-rule="nonzero"
-       id="path238" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,180.40726 H 273.14244"
-       fill-rule="nonzero"
-       id="path240" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,215.60412 H 273.14244"
-       fill-rule="nonzero"
-       id="path242" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,266.80095 H 273.14244"
-       fill-rule="nonzero"
-       id="path244" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,317.99782 H 273.14244"
-       fill-rule="nonzero"
-       id="path246" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,369.19466 H 273.14244"
-       fill-rule="nonzero"
-       id="path248" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.70149,420.3915 H 273.14244"
-       fill-rule="nonzero"
-       id="path250" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 143.59745,445.61126 H 273.0384"
-       fill-rule="nonzero"
-       id="path250-4" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.998115"
-       stroke-linecap="butt"
-       d="M 143.86386,470.4766 H 272.81725"
-       fill-rule="nonzero"
-       id="path250-4-4" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.998115"
-       stroke-linecap="butt"
-       d="M 144.33823,495.4898 H 273.29162"
-       fill-rule="nonzero"
-       id="path250-4-4-6" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.999778"
-       stroke-linecap="butt"
-       d="M 143.81154,520.51707 H 273.19503"
-       fill-rule="nonzero"
-       id="path250-7" />
-    <path
-       fill="#000000"
-       d="m 173.54384,94.079177 v -1.125 l 4.03125,-0.0156 v 3.54688 q -0.92188,0.75 -1.92188,1.125 -0.98437,0.35937 -2.03125,0.35937 -1.40625,0 -2.5625,-0.59375 -1.14062,-0.60937 -1.73437,-1.73437 -0.57813,-1.14063 -0.57813,-2.54688 0,-1.40625 0.57813,-2.60937 0.59375,-1.20313 1.6875,-1.78125 1.09375,-0.59375 2.51562,-0.59375 1.03125,0 1.85938,0.34375 0.84375,0.32812 1.3125,0.9375 0.48437,0.59375 0.73437,1.54687 l -1.14062,0.3125 q -0.21875,-0.71875 -0.53125,-1.14062 -0.3125,-0.42188 -0.90625,-0.67188 -0.59375,-0.25 -1.3125,-0.25 -0.875,0 -1.51563,0.26563 -0.625,0.26562 -1.01562,0.70312 -0.375,0.42188 -0.59375,0.9375 -0.35938,0.875 -0.35938,1.92188 0,1.26562 0.4375,2.125 0.4375,0.85937 1.26563,1.28125 0.84375,0.42187 1.79687,0.42187 0.8125,0 1.59375,-0.3125 0.78125,-0.32812 1.1875,-0.6875 v -1.76562 z m 5.72643,3.73437 v -6.90625 h 1.0625 v 1.04688 q 0.40625,-0.73438 0.73437,-0.96875 0.34375,-0.23438 0.76563,-0.23438 0.59375,0 1.20312,0.375 l -0.40625,1.07813 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23437 -0.29687,0.23438 -0.42187,0.64063 -0.20313,0.625 -0.20313,1.35937 v 3.625 z m 8.96961,-0.85937 q -0.65625,0.5625 -1.26562,0.79687 -0.59375,0.21875 -1.28125,0.21875 -1.14063,0 -1.75,-0.54687 -0.60938,-0.5625 -0.60938,-1.4375 0,-0.5 0.21875,-0.92188 0.23438,-0.42187 0.60938,-0.67187 0.375,-0.25 0.84375,-0.39063 0.34375,-0.0781 1.04687,-0.17187 1.42188,-0.17188 2.09375,-0.40625 0,-0.23438 0,-0.29688 0,-0.71875 -0.32812,-1.01562 -0.45313,-0.39063 -1.34375,-0.39063 -0.8125,0 -1.21875,0.29688 -0.39063,0.28125 -0.57813,1.01562 l -1.14062,-0.15625 q 0.15625,-0.73437 0.51562,-1.1875 0.35938,-0.45312 1.03125,-0.6875 0.67188,-0.25 1.5625,-0.25 0.89063,0 1.4375,0.20313 0.5625,0.20312 0.8125,0.53125 0.26563,0.3125 0.375,0.79687 0.0469,0.29688 0.0469,1.07813 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29688,0.82812 h -1.21875 q -0.1875,-0.35937 -0.23438,-0.85937 z m -0.0937,-2.60938 q -0.64062,0.26563 -1.92187,0.4375 -0.71875,0.10938 -1.01563,0.25 -0.29687,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54688 0,0.46875 0.34375,0.78125 0.35938,0.3125 1.04688,0.3125 0.67187,0 1.20312,-0.29688 0.53125,-0.29687 0.78125,-0.8125 0.1875,-0.39062 0.1875,-1.17187 z m 2.99061,6.125003 v -9.562503 h 1.07812 v 0.89063 q 0.375,-0.53125 0.84375,-0.78125 0.48438,-0.26563 1.15625,-0.26563 0.875,0 1.54688,0.45313 0.6875,0.45312 1.03125,1.28125 0.34375,0.82812 0.34375,1.82812 0,1.04688 -0.375,1.90625 -0.375,0.84375 -1.10938,1.29688 -0.71875,0.45312 -1.53125,0.45312 -0.57812,0 -1.04687,-0.25 -0.46875,-0.25 -0.76563,-0.625 v 3.375003 z m 1.0625,-6.078123 q 0,1.34375 0.53125,1.98437 0.54687,0.625 1.3125,0.625 0.78125,0 1.34375,-0.65625 0.5625,-0.65625 0.5625,-2.04687 0,-1.3125 -0.54688,-1.96875 -0.54687,-0.67188 -1.29687,-0.67188 -0.75,0 -1.32813,0.70313 -0.57812,0.70312 -0.57812,2.03125 z m 6.34997,3.42187 v -9.54687 h 1.17188 v 3.42187 q 0.82812,-0.9375 2.07812,-0.9375 0.76563,0 1.32813,0.29688 0.5625,0.29687 0.8125,0.84375 0.25,0.53125 0.25,1.54687 v 4.375 h -1.17188 v -4.375 q 0,-0.89062 -0.39062,-1.28125 -0.375,-0.40625 -1.07813,-0.40625 -0.51562,0 -0.98437,0.28125 -0.45313,0.26563 -0.65625,0.73438 -0.1875,0.45312 -0.1875,1.26562 v 3.78125 z m 11.30296,0 v -9.54687 h 1.26563 v 3.92187 h 4.95312 v -3.92187 h 1.26563 v 9.54687 h -1.26563 v -4.5 h -4.95312 v 4.5 z m 14.17203,-2.21875 1.20313,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57812 -1.96875,0.57812 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60937 0,-1.75 0.89063,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 H 220.118 q 0.0625,1.14063 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32812 0.45313,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54687 -0.54688,0.53125 -0.60938,1.4375 z m 11.03748,3.26563 q -0.65625,0.5625 -1.26563,0.79687 -0.59375,0.21875 -1.28125,0.21875 -1.14062,0 -1.75,-0.54687 -0.60937,-0.5625 -0.60937,-1.4375 0,-0.5 0.21875,-0.92188 0.23437,-0.42187 0.60937,-0.67187 0.375,-0.25 0.84375,-0.39063 0.34375,-0.0781 1.04688,-0.17187 1.42187,-0.17188 2.09375,-0.40625 0,-0.23438 0,-0.29688 0,-0.71875 -0.32813,-1.01562 -0.45312,-0.39063 -1.34375,-0.39063 -0.8125,0 -1.21875,0.29688 -0.39062,0.28125 -0.57812,1.01562 l -1.14063,-0.15625 q 0.15625,-0.73437 0.51563,-1.1875 0.35937,-0.45312 1.03125,-0.6875 0.67187,-0.25 1.5625,-0.25 0.89062,0 1.4375,0.20313 0.5625,0.20312 0.8125,0.53125 0.26562,0.3125 0.375,0.79687 0.0469,0.29688 0.0469,1.07813 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29687,0.82812 h -1.21875 q -0.1875,-0.35937 -0.23437,-0.85937 z m -0.0937,-2.60938 q -0.64063,0.26563 -1.92188,0.4375 -0.71875,0.10938 -1.01562,0.25 -0.29688,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54688 0,0.46875 0.34375,0.78125 0.35937,0.3125 1.04687,0.3125 0.67188,0 1.20313,-0.29688 0.53125,-0.29687 0.78125,-0.8125 0.1875,-0.39062 0.1875,-1.17187 z m 7.47497,3.46875 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51562,-0.45312 -0.6875,-0.45313 -1.07813,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70313,-0.45313 1.54688,-0.45313 0.625,0 1.10937,0.26563 0.5,0.25 0.79688,0.67187 v -3.42187 h 1.17187 v 9.54687 z m -3.70312,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32812,0.65625 0.76563,0 1.29688,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54688,-2.07812 -0.54687,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51562,0.625 -0.51562,2 z m 11.3656,1.23437 1.20312,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 6.50623,4.125 v -6.90625 h 1.0625 v 1.04688 q 0.40625,-0.73438 0.73437,-0.96875 0.34375,-0.23438 0.76563,-0.23438 0.59375,0 1.20312,0.375 l -0.40625,1.07813 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23437 -0.29687,0.23438 -0.42187,0.64063 -0.20313,0.625 -0.20313,1.35937 v 3.625 z"
-       fill-rule="nonzero"
-       id="path252" />
-    <path
-       fill="#000000"
-       d="m 162.29759,111.45418 1.1875,-0.0781 q 0,0.51563 0.15625,0.875 0.15625,0.35938 0.57812,0.59375 0.42188,0.21875 0.96875,0.21875 0.78125,0 1.17188,-0.3125 0.39062,-0.3125 0.39062,-0.73437 0,-0.3125 -0.23437,-0.57813 -0.23438,-0.28125 -1.17188,-0.67187 -0.9375,-0.40625 -1.1875,-0.57813 -0.4375,-0.26562 -0.67187,-0.625 -0.21875,-0.35937 -0.21875,-0.82812 0,-0.8125 0.65625,-1.39063 0.65625,-0.59375 1.82812,-0.59375 1.29688,0 1.96875,0.60938 0.6875,0.59375 0.71875,1.57812 l -1.15625,0.0781 q -0.0312,-0.625 -0.45312,-0.98438 -0.40625,-0.375 -1.17188,-0.375 -0.60937,0 -0.95312,0.28125 -0.32813,0.28125 -0.32813,0.60938 0,0.3125 0.29688,0.5625 0.1875,0.17187 1,0.53125 1.35937,0.57812 1.70312,0.92187 0.5625,0.53125 0.5625,1.3125 0,0.51563 -0.3125,1.01563 -0.3125,0.48437 -0.96875,0.78125 -0.64062,0.29687 -1.51562,0.29687 -1.20313,0 -2.04688,-0.59375 -0.84375,-0.59375 -0.79687,-1.92187 z m 9.32031,1.40625 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 0.93737,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 9.15712,-1.25 q -1.23438,1.40625 -2.54688,1.40625 -0.79687,0 -1.29687,-0.45312 -0.48438,-0.46875 -0.48438,-1.125 0,-0.4375 0.21875,-1.5 l 0.84375,-3.98438 h 1.17188 l -0.92188,4.40625 q -0.10937,0.5625 -0.10937,0.85938 0,0.39062 0.23437,0.60937 0.23438,0.21875 0.70313,0.21875 0.48437,0 0.95312,-0.23437 0.48438,-0.23438 0.8125,-0.64063 0.34375,-0.42187 0.5625,-0.98437 0.14063,-0.35938 0.32813,-1.25 l 0.625,-2.98438 h 1.1875 l -1.45313,6.90625 h -1.07812 z m 7.47497,-1.26562 1.17188,0.125 q -0.4375,1.29687 -1.26563,1.92187 -0.8125,0.625 -1.84375,0.625 -1.14062,0 -1.84375,-0.71875 -0.6875,-0.73437 -0.6875,-2.04687 0,-1.125 0.4375,-2.21875 0.45313,-1.09375 1.28125,-1.65625 0.84375,-0.57813 1.92188,-0.57813 1.10937,0 1.76562,0.625 0.65625,0.625 0.65625,1.65625 l -1.15625,0.0781 q -0.0156,-0.65625 -0.39062,-1.01563 -0.375,-0.375 -0.98438,-0.375 -0.70312,0 -1.23437,0.45313 -0.51563,0.4375 -0.8125,1.35937 -0.29688,0.90625 -0.29688,1.75 0,0.89063 0.39063,1.34375 0.39062,0.4375 0.96875,0.4375 0.5625,0 1.07812,-0.4375 0.53125,-0.4375 0.84375,-1.32812 z m 4.64844,1.5625 -0.20313,0.95312 q -0.42187,0.10938 -0.8125,0.10938 -0.70312,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17188,-1.04687 l 0.82812,-4.01563 h -0.92187 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35937,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79687,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10937,0.32813 0.125,0.10937 0.40625,0.10937 0.39063,0 0.70313,-0.0781 z m 4.64035,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 7.20399,-0.95312 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 6.01549,-1.39063 1.15625,0.10938 q -0.25,0.85937 -1.14062,1.625 -0.89063,0.76562 -2.125,0.76562 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35937 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54687 0,-1.14063 0.51562,-2.20313 0.53125,-1.0625 1.35938,-1.57812 0.84375,-0.51563 1.8125,-0.51563 1.23437,0 1.96875,0.76563 0.75,0.76562 0.75,2.09375 0,0.5 -0.0937,1.04687 h -5.09375 q -0.0312,0.1875 -0.0312,0.35938 0,0.96875 0.4375,1.48437 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39062 0.59375,-0.39063 0.92187,-1.14063 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26562 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48438 -1.125,-0.48438 -0.76563,0 -1.39063,0.53125 -0.60937,0.51563 -0.92187,1.5625 z m 4.47497,6.71875 v -0.85937 h 7.76563 v 0.85937 z m 8.63123,-2.03125 1.1875,0.10938 q 0,0.40625 0.10937,0.60937 0.10938,0.20313 0.34375,0.3125 0.32813,0.14063 0.82813,0.14063 1.0625,0 1.53125,-0.54688 0.3125,-0.375 0.57812,-1.625 l 0.10938,-0.5625 q -0.92188,0.9375 -1.95313,0.9375 -1.04687,0 -1.75,-0.76562 -0.70312,-0.78125 -0.70312,-2.1875 0,-1.17188 0.54687,-2.14063 0.5625,-0.98437 1.32813,-1.46875 0.76562,-0.5 1.57812,-0.5 1.35938,0 2.09375,1.28125 l 0.23438,-1.125 h 1.07812 l -1.39062,6.67188 q -0.21875,1.09375 -0.59375,1.70312 -0.375,0.625 -1.03125,0.95313 -0.65625,0.34375 -1.53125,0.34375 -0.82813,0 -1.4375,-0.21875 -0.59375,-0.20313 -0.89063,-0.625 -0.29687,-0.40625 -0.29687,-0.95313 0,-0.15625 0.0312,-0.34375 z m 1.46875,-3.6875 q 0,0.71875 0.14062,1.07813 0.20313,0.5 0.5625,0.76562 0.35938,0.25 0.79688,0.25 0.57812,0 1.14062,-0.40625 0.57813,-0.40625 0.9375,-1.25 0.35938,-0.85937 0.35938,-1.625 0,-0.85937 -0.48438,-1.35937 -0.46875,-0.51563 -1.15625,-0.51563 -0.4375,0 -0.84375,0.23438 -0.39062,0.23437 -0.75,0.70312 -0.34375,0.46875 -0.53125,1.14063 -0.17187,0.65625 -0.17187,0.98437 z m 6.00622,3.0625 1.45313,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51562,-0.39063 1.04687,-0.39063 0.35938,0 0.875,0.25 l -0.48437,1.09375 q -0.3125,-0.21875 -0.67188,-0.21875 -0.625,0 -1.28125,0.6875 -0.64062,0.6875 -1.01562,2.48438 l -0.57813,2.76562 z m 9.11025,-0.85937 q -0.625,0.53125 -1.1875,0.78125 -0.5625,0.23437 -1.20313,0.23437 -0.96875,0 -1.5625,-0.5625 -0.57812,-0.5625 -0.57812,-1.4375 0,-0.57812 0.26562,-1.01562 0.26563,-0.45313 0.70313,-0.71875 0.4375,-0.28125 1.0625,-0.39063 0.40625,-0.0781 1.51562,-0.125 1.10938,-0.0469 1.59375,-0.23437 0.125,-0.48438 0.125,-0.8125 0,-0.40625 -0.29687,-0.64063 -0.40625,-0.32812 -1.1875,-0.32812 -0.75,0 -1.21875,0.32812 -0.46875,0.32813 -0.6875,0.9375 l -1.1875,-0.10937 q 0.35937,-1.01563 1.14062,-1.5625 0.79688,-0.54688 2,-0.54688 1.28125,0 2.03125,0.60938 0.57813,0.45312 0.57813,1.1875 0,0.54687 -0.15625,1.28125 l -0.39063,1.71875 q -0.1875,0.8125 -0.1875,1.32812 0,0.32813 0.15625,0.9375 h -1.20312 q -0.0937,-0.34375 -0.125,-0.85937 z m 0.42187,-2.64063 q -0.23437,0.0937 -0.53125,0.15625 -0.28125,0.0469 -0.9375,0.10938 -1.03125,0.0781 -1.45312,0.21875 -0.42188,0.14062 -0.64063,0.45312 -0.21875,0.29688 -0.21875,0.67188 0,0.5 0.34375,0.82812 0.34375,0.3125 0.98438,0.3125 0.57812,0 1.10937,-0.3125 0.54688,-0.3125 0.85938,-0.85937 0.3125,-0.5625 0.48437,-1.57813 z m 1.7406,6.15625 2,-9.5625 h 1.09375 l -0.20312,0.95313 q 0.59375,-0.625 1.07812,-0.85938 0.48438,-0.25 1.01563,-0.25 0.98437,0 1.625,0.71875 0.65625,0.71875 0.65625,2.0625 0,1.07813 -0.35938,1.96875 -0.34375,0.875 -0.875,1.42188 -0.51562,0.54687 -1.04687,0.79687 -0.53125,0.25 -1.09375,0.25 -1.25,0 -1.92188,-1.26562 l -0.78125,3.76562 z m 2.32813,-5.48437 q 0,0.78125 0.10937,1.07812 0.17188,0.42188 0.53125,0.6875 0.375,0.25 0.875,0.25 1.01563,0 1.64063,-1.14062 0.625,-1.14063 0.625,-2.32813 0,-0.875 -0.42188,-1.35937 -0.42187,-0.48438 -1.04687,-0.48438 -0.45313,0 -0.84375,0.25 -0.375,0.23438 -0.70313,0.70313 -0.32812,0.46875 -0.54687,1.15625 -0.21875,0.6875 -0.21875,1.1875 z m 5.66247,2.82812 2,-9.54687 h 1.17188 l -0.76563,3.67187 q 0.65625,-0.64062 1.21875,-0.90625 0.57813,-0.28125 1.17188,-0.28125 0.85937,0 1.32812,0.45313 0.48438,0.45312 0.48438,1.1875 0,0.35937 -0.20313,1.34375 l -0.85937,4.07812 h -1.17188 l 0.875,-4.1875 q 0.1875,-0.90625 0.1875,-1.14062 0,-0.34375 -0.23437,-0.54688 -0.23438,-0.21875 -0.67188,-0.21875 -0.64062,0 -1.21875,0.34375 -0.57812,0.32813 -0.90625,0.90625 -0.32812,0.57813 -0.60937,1.875 l -0.60938,2.96875 z"
-       fill-rule="nonzero"
-       id="path254" />
-    <path
-       fill="#000000"
-       d="m 190.99429,149.01041 v -9.54688 h 6.4375 v 1.125 h -5.17188 v 2.96875 h 4.46875 v 1.125 h -4.46875 v 4.32813 z m 12.65698,-2.21875 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 6.52185,4.125 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26563,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17187 v -4.20313 q 0,-0.71875 -0.14063,-1.0625 -0.14062,-0.35937 -0.48437,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29688,0.46875 -0.54687,0.46875 -0.54687,1.79688 v 3.78125 z m 11.9281,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92187,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85938,-0.9375 -0.85938,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76563,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92188,1.60938 l -1.14063,0.17187 q -0.17187,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98437,-0.35938 -0.89063,0 -1.45313,0.64063 -0.54687,0.64062 -0.54687,2 0,1.40625 0.53125,2.03125 0.54687,0.625 1.40625,0.625 0.6875,0 1.14062,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.88282,0.3125 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z"
-       fill-rule="nonzero"
-       id="path256" />
-    <path
-       fill="#000000"
-       d="m 161.95064,158.35416 q 0,0.45312 -0.125,0.85937 -0.125,0.39063 -0.39063,0.73438 -0.25,0.34375 -0.64062,0.60937 -0.375,0.25 -0.89063,0.42188 0.34375,0.125 0.54688,0.51562 0.21875,0.39063 0.34375,1.04688 l 0.34375,1.85937 q 0.0156,0.125 0.0312,0.23438 0.0156,0.10937 0.0156,0.1875 0,0.0625 -0.0312,0.10937 -0.0312,0.0469 -0.10937,0.0781 -0.0625,0.0156 -0.1875,0.0156 -0.125,0.0156 -0.3125,0.0156 -0.17188,0 -0.28125,-0.0156 -0.0937,0 -0.15625,-0.0312 -0.0469,-0.0312 -0.0781,-0.0781 -0.0156,-0.0625 -0.0312,-0.14063 l -0.32812,-1.98437 q -0.0625,-0.34375 -0.15625,-0.625 -0.0937,-0.28125 -0.26563,-0.48438 -0.15625,-0.20312 -0.42187,-0.3125 -0.26563,-0.10937 -0.64063,-0.10937 h -0.75 l -0.71875,3.59375 q -0.0156,0.0469 -0.0469,0.0937 -0.0312,0.0312 -0.10938,0.0469 -0.0781,0.0156 -0.1875,0.0312 -0.10937,0.0156 -0.26562,0.0156 -0.15625,0 -0.26563,-0.0156 -0.0937,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.0937,-0.0625 -0.0156,-0.0469 0,-0.0937 l 1.5625,-7.8125 q 0.0469,-0.25 0.20313,-0.34375 0.15625,-0.10938 0.34375,-0.10938 h 1.82812 q 0.60938,0 1.0625,0.125 0.45313,0.10938 0.75,0.34375 0.3125,0.21875 0.45313,0.54688 0.15625,0.32812 0.15625,0.75 z m -1.20313,0.17187 q 0,-0.21875 -0.0781,-0.40625 -0.0781,-0.1875 -0.25,-0.32812 -0.15625,-0.14063 -0.4375,-0.20313 -0.26563,-0.0781 -0.64063,-0.0781 h -1.15625 l -0.57812,2.84375 h 0.98437 q 0.57813,0 0.98438,-0.15625 0.42187,-0.15625 0.67187,-0.40625 0.25,-0.26563 0.375,-0.59375 0.125,-0.32813 0.125,-0.67188 z m 8.93988,-1.70312 q 0,0.0312 0,0.10937 0,0.0625 -0.0156,0.14063 -0.0156,0.0781 -0.0469,0.17187 -0.0156,0.0781 -0.0625,0.14063 -0.0312,0.0625 -0.0937,0.10937 -0.0625,0.0469 -0.125,0.0469 h -2.35937 l -1.46875,7.29687 q -0.0156,0.0625 -0.0469,0.10938 -0.0312,0.0312 -0.10937,0.0469 -0.0625,0.0156 -0.17188,0.0312 -0.10937,0.0156 -0.28125,0.0156 -0.15625,0 -0.26562,-0.0156 -0.0937,-0.0156 -0.15625,-0.0312 -0.0625,-0.0156 -0.0781,-0.0469 -0.0156,-0.0469 -0.0156,-0.10938 l 1.46875,-7.29687 h -2.35938 q -0.0937,0 -0.125,-0.0625 -0.0312,-0.0625 -0.0312,-0.15625 0,-0.0469 0,-0.10938 0.0156,-0.0781 0.0312,-0.15625 0.0156,-0.0937 0.0469,-0.17187 0.0312,-0.0781 0.0625,-0.14063 0.0469,-0.0781 0.0937,-0.10937 0.0469,-0.0469 0.10937,-0.0469 h 5.85938 q 0.0781,0 0.10937,0.0625 0.0312,0.0625 0.0312,0.17188 z m 5.83861,-0.0156 q 0,0.0312 0,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0469 -0.10937,0.0469 h -3.29688 l -0.53125,2.64063 h 2.82813 q 0.0781,0 0.10937,0.0469 0.0469,0.0469 0.0469,0.15625 0,0.0312 -0.0156,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0469,0.14063 -0.0312,0.0625 -0.0937,0.10937 -0.0469,0.0469 -0.10938,0.0469 H 171.198 l -0.60938,3 h 3.34375 q 0.0625,0 0.10938,0.0625 0.0469,0.0469 0.0469,0.15625 0,0.0469 -0.0156,0.125 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0312 -0.10938,0.0312 h -4.04687 q -0.0781,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.10938,-0.0781 -0.0469,-0.0625 -0.0625,-0.14063 -0.0156,-0.0937 0.0156,-0.21875 l 1.5,-7.51562 q 0.0469,-0.25 0.20312,-0.34375 0.15625,-0.10938 0.29688,-0.10938 h 4 q 0.14062,0 0.14062,0.21875 z m 5.44538,9.9375 q 0,0.0469 0,0.10938 0,0.0625 -0.0156,0.125 -0.0156,0.0625 -0.0469,0.14062 -0.0312,0.0781 -0.0781,0.125 -0.0312,0.0625 -0.0781,0.0937 -0.0469,0.0469 -0.10938,0.0469 h -6.26562 q -0.0781,0 -0.10938,-0.0625 -0.0312,-0.0625 -0.0312,-0.15625 0,-0.0312 0,-0.0937 0,-0.0625 0.0156,-0.14063 0.0156,-0.0625 0.0469,-0.14062 0.0156,-0.0625 0.0625,-0.14063 0.0312,-0.0625 0.0781,-0.0937 0.0469,-0.0312 0.10937,-0.0312 h 6.26563 q 0.0781,0 0.10937,0.0625 0.0469,0.0625 0.0469,0.15625 z m 9.27865,-9.23437 q 0,0.0469 -0.0156,0.10937 -0.0156,0.0625 -0.0312,0.14063 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0469,0.14062 -0.0312,0.0625 -0.0781,0.10938 -0.0312,0.0312 -0.0781,0.0312 -0.0937,0 -0.26563,-0.10938 -0.17187,-0.125 -0.45312,-0.26562 -0.26563,-0.15625 -0.67188,-0.26563 -0.39062,-0.125 -0.9375,-0.125 -0.57812,0 -1.09375,0.17188 -0.5,0.17187 -0.92187,0.48437 -0.42188,0.29688 -0.75,0.70313 -0.32813,0.40625 -0.5625,0.90625 -0.23438,0.48437 -0.35938,1.01562 -0.10937,0.53125 -0.10937,1.07813 0,0.5625 0.15625,1.01562 0.17187,0.4375 0.48437,0.73438 0.3125,0.29687 0.75,0.45312 0.4375,0.15625 0.98438,0.15625 0.40625,0 0.84375,-0.0937 0.45312,-0.0937 0.82812,-0.29687 l 0.48438,-2.4375 h -1.95313 q -0.0781,0 -0.125,-0.0469 -0.0312,-0.0625 -0.0312,-0.17187 0,-0.0469 0,-0.10938 0.0156,-0.0781 0.0312,-0.15625 0.0156,-0.0781 0.0469,-0.15625 0.0312,-0.0781 0.0625,-0.14062 0.0469,-0.0625 0.0937,-0.0937 0.0469,-0.0469 0.10937,-0.0469 h 2.67188 q 0.1875,0 0.26562,0.125 0.0781,0.125 0.0312,0.32813 l -0.64062,3.25 q -0.0312,0.125 -0.0781,0.20312 -0.0312,0.0625 -0.0937,0.125 -0.0469,0.0625 -0.29687,0.17188 -0.23438,0.10937 -0.59375,0.23437 -0.35938,0.10938 -0.8125,0.1875 -0.45313,0.0937 -0.95313,0.0937 -0.84375,0 -1.48437,-0.20312 -0.64063,-0.21875 -1.07813,-0.64063 -0.4375,-0.42187 -0.67187,-1.01562 -0.21875,-0.59375 -0.21875,-1.32813 0,-0.70312 0.15625,-1.375 0.15625,-0.67187 0.45312,-1.28125 0.3125,-0.60937 0.75,-1.10937 0.4375,-0.51563 1,-0.89063 0.57813,-0.375 1.25,-0.57812 0.6875,-0.21875 1.48438,-0.21875 0.45312,0 0.84375,0.0781 0.40625,0.0781 0.71875,0.20313 0.3125,0.10937 0.51562,0.25 0.21875,0.125 0.29688,0.20312 0.0781,0.0625 0.10937,0.14063 0.0312,0.0625 0.0312,0.15625 z m 6.9863,0.84375 q 0,0.45312 -0.125,0.85937 -0.125,0.39063 -0.39062,0.73438 -0.25,0.34375 -0.64063,0.60937 -0.375,0.25 -0.89062,0.42188 0.34375,0.125 0.54687,0.51562 0.21875,0.39063 0.34375,1.04688 l 0.34375,1.85937 q 0.0156,0.125 0.0312,0.23438 0.0156,0.10937 0.0156,0.1875 0,0.0625 -0.0312,0.10937 -0.0312,0.0469 -0.10938,0.0781 -0.0625,0.0156 -0.1875,0.0156 -0.125,0.0156 -0.3125,0.0156 -0.17187,0 -0.28125,-0.0156 -0.0937,0 -0.15625,-0.0312 -0.0469,-0.0312 -0.0781,-0.0781 -0.0156,-0.0625 -0.0312,-0.14063 l -0.32813,-1.98437 q -0.0625,-0.34375 -0.15625,-0.625 -0.0937,-0.28125 -0.26562,-0.48438 -0.15625,-0.20312 -0.42188,-0.3125 -0.26562,-0.10937 -0.64062,-0.10937 h -0.75 l -0.71875,3.59375 q -0.0156,0.0469 -0.0469,0.0937 -0.0312,0.0312 -0.10937,0.0469 -0.0781,0.0156 -0.1875,0.0312 -0.10938,0.0156 -0.26563,0.0156 -0.15625,0 -0.26562,-0.0156 -0.0937,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.0937,-0.0625 -0.0156,-0.0469 0,-0.0937 l 1.5625,-7.8125 q 0.0469,-0.25 0.20312,-0.34375 0.15625,-0.10938 0.34375,-0.10938 h 1.82813 q 0.60937,0 1.0625,0.125 0.45312,0.10938 0.75,0.34375 0.3125,0.21875 0.45312,0.54688 0.15625,0.32812 0.15625,0.75 z m -1.20312,0.17187 q 0,-0.21875 -0.0781,-0.40625 -0.0781,-0.1875 -0.25,-0.32812 -0.15625,-0.14063 -0.4375,-0.20313 -0.26562,-0.0781 -0.64062,-0.0781 h -1.15625 l -0.57813,2.84375 h 0.98438 q 0.57812,0 0.98437,-0.15625 0.42188,-0.15625 0.67188,-0.40625 0.25,-0.26563 0.375,-0.59375 0.125,-0.32813 0.125,-0.67188 z m 8.42425,6.09375 q 0.0312,0.14063 0.0156,0.23438 -0.0156,0.0781 -0.0781,0.125 -0.0469,0.0469 -0.1875,0.0469 -0.125,0.0156 -0.34375,0.0156 -0.14062,0 -0.25,-0.0156 -0.10937,0 -0.17187,-0.0156 -0.0469,-0.0312 -0.0781,-0.0625 -0.0156,-0.0469 -0.0312,-0.0937 l -0.3125,-2.0625 h -3.5 l -1.09375,2.03125 q -0.0469,0.0781 -0.0937,0.125 -0.0312,0.0312 -0.10937,0.0625 -0.0781,0.0156 -0.20313,0.0156 -0.10937,0.0156 -0.28125,0.0156 -0.20312,0 -0.3125,-0.0156 -0.125,-0.0156 -0.15625,-0.0469 -0.0469,-0.0469 -0.0312,-0.14063 0.0156,-0.0937 0.0937,-0.23437 l 4.375,-7.8125 q 0.0469,-0.0781 0.0937,-0.125 0.0625,-0.0469 0.14063,-0.0625 0.0937,-0.0312 0.21875,-0.0312 0.125,-0.0156 0.3125,-0.0156 0.21875,0 0.34375,0.0156 0.14062,0 0.21875,0.0312 0.0937,0.0156 0.125,0.0625 0.0312,0.0469 0.0469,0.125 z m -2.1875,-6.90625 v 0 l -2.28125,4.1875 h 2.92188 z m 9.93059,0.85938 q 0,0.34375 -0.0781,0.71875 -0.0781,0.375 -0.26562,0.73437 -0.17188,0.35938 -0.4375,0.6875 -0.26563,0.32813 -0.65625,0.57813 -0.375,0.23437 -0.875,0.375 -0.5,0.14062 -1.1875,0.14062 h -1.15625 l -0.59375,3.04688 q -0.0156,0.0469 -0.0469,0.0937 -0.0312,0.0312 -0.10937,0.0469 -0.0781,0.0156 -0.1875,0.0312 -0.10938,0.0156 -0.26563,0.0156 -0.15625,0 -0.26562,-0.0156 -0.0937,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.0937,-0.0625 -0.0156,-0.0469 0,-0.0937 l 1.54687,-7.78125 q 0.0469,-0.26563 0.20313,-0.375 0.17187,-0.10938 0.39062,-0.10938 h 1.65625 q 0.32813,0 0.57813,0.0312 0.25,0.0156 0.48437,0.0625 0.35938,0.0781 0.64063,0.25 0.28125,0.15625 0.46875,0.40625 0.20312,0.23438 0.29687,0.54688 0.10938,0.3125 0.10938,0.6875 z m -1.1875,0.10937 q 0,-0.40625 -0.20313,-0.6875 -0.1875,-0.29687 -0.60937,-0.40625 -0.15625,-0.0469 -0.34375,-0.0625 -0.1875,-0.0156 -0.40625,-0.0156 h -1.04688 l -0.67187,3.375 h 1.0625 q 0.46875,0 0.78125,-0.0937 0.32812,-0.10938 0.5625,-0.28125 0.25,-0.17188 0.40625,-0.39063 0.17187,-0.23437 0.26562,-0.46875 0.10938,-0.25 0.15625,-0.5 0.0469,-0.25 0.0469,-0.46875 z m 7.76033,6.17188 q -0.0156,0.0469 -0.0469,0.0937 -0.0312,0.0312 -0.10937,0.0469 -0.0625,0.0156 -0.17188,0.0312 -0.10937,0.0156 -0.28125,0.0156 -0.15625,0 -0.26562,-0.0156 -0.0937,-0.0156 -0.15625,-0.0312 -0.0625,-0.0156 -0.0781,-0.0469 -0.0156,-0.0469 0,-0.0937 l 0.73438,-3.75 h -3.82813 l -0.73437,3.75 q -0.0156,0.0469 -0.0469,0.0937 -0.0312,0.0312 -0.10937,0.0469 -0.0781,0.0156 -0.1875,0.0312 -0.10938,0.0156 -0.26563,0.0156 -0.17187,0 -0.28125,-0.0156 -0.0937,-0.0156 -0.15625,-0.0312 -0.0469,-0.0156 -0.0781,-0.0469 -0.0156,-0.0469 0,-0.0937 l 1.60937,-8.10938 q 0.0156,-0.0312 0.0469,-0.0625 0.0469,-0.0469 0.10937,-0.0625 0.0781,-0.0312 0.1875,-0.0469 0.10938,-0.0156 0.26563,-0.0156 0.15625,0 0.26562,0.0156 0.10938,0.0156 0.15625,0.0469 0.0625,0.0156 0.0781,0.0625 0.0156,0.0312 0.0156,0.0625 l -0.67187,3.39063 h 3.82812 l 0.67188,-3.39063 q 0.0156,-0.0312 0.0469,-0.0625 0.0312,-0.0469 0.0937,-0.0625 0.0781,-0.0312 0.1875,-0.0469 0.10938,-0.0156 0.28125,-0.0156 0.15625,0 0.25,0.0156 0.10938,0.0156 0.17188,0.0469 0.0625,0.0156 0.0781,0.0625 0.0156,0.0312 0,0.0625 z m 7.38217,1.89062 q 0,0.0469 0,0.10938 0,0.0625 -0.0156,0.125 -0.0156,0.0625 -0.0469,0.14062 -0.0312,0.0781 -0.0781,0.125 -0.0312,0.0625 -0.0781,0.0937 -0.0469,0.0469 -0.10938,0.0469 h -6.26562 q -0.0781,0 -0.10938,-0.0625 -0.0312,-0.0625 -0.0312,-0.15625 0,-0.0312 0,-0.0937 0,-0.0625 0.0156,-0.14063 0.0156,-0.0625 0.0469,-0.14062 0.0156,-0.0625 0.0625,-0.14063 0.0312,-0.0625 0.0781,-0.0937 0.0469,-0.0312 0.10937,-0.0312 h 6.26563 q 0.0781,0 0.10937,0.0625 0.0469,0.0625 0.0469,0.15625 z m 7.49741,-9.9375 q 0,0.0469 0,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.17188 -0.0312,0.0781 -0.0781,0.15625 -0.0312,0.0625 -0.0781,0.10937 -0.0469,0.0469 -0.125,0.0469 h -3.07813 l -0.5625,2.85937 h 2.90625 q 0.0781,0 0.10938,0.0625 0.0469,0.0469 0.0469,0.14063 0,0.0625 -0.0156,0.14062 0,0.0625 -0.0156,0.14063 -0.0156,0.0625 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.14062 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0469 -0.10938,0.0469 h -2.90625 l -0.70312,3.5 q -0.0156,0.0625 -0.0469,0.10938 -0.0312,0.0312 -0.10937,0.0469 -0.0625,0.0156 -0.17188,0.0312 -0.10937,0.0156 -0.28125,0.0156 -0.15625,0 -0.26562,-0.0156 -0.10938,-0.0156 -0.17188,-0.0312 -0.0469,-0.0156 -0.0781,-0.0469 -0.0156,-0.0469 0,-0.10938 l 1.5625,-7.79687 q 0.0469,-0.25 0.20312,-0.34375 0.15625,-0.10938 0.29688,-0.10938 h 3.78125 q 0.0937,0 0.125,0.0625 0.0312,0.0625 0.0312,0.15625 z m 6.32704,0 q 0,0.0312 0,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0469 -0.10938,0.0469 h -3.29687 l -0.53125,2.64063 h 2.82812 q 0.0781,0 0.10938,0.0469 0.0469,0.0469 0.0469,0.15625 0,0.0312 -0.0156,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0469,0.14063 -0.0312,0.0625 -0.0937,0.10937 -0.0469,0.0469 -0.10937,0.0469 H 235.652 l -0.60937,3 h 3.34375 q 0.0625,0 0.10937,0.0625 0.0469,0.0469 0.0469,0.15625 0,0.0469 -0.0156,0.125 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0312 -0.10937,0.0312 h -4.04688 q -0.0781,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.10937,-0.0781 -0.0469,-0.0625 -0.0625,-0.14063 -0.0156,-0.0937 0.0156,-0.21875 l 1.5,-7.51562 q 0.0469,-0.25 0.20313,-0.34375 0.15625,-0.10938 0.29687,-0.10938 h 4 q 0.14063,0 0.14063,0.21875 z m 6.711,7.73438 q -0.0156,0.14062 -0.0781,0.23437 -0.0625,0.0781 -0.14062,0.14063 -0.0625,0.0625 -0.15625,0.0937 -0.0781,0.0156 -0.17188,0.0156 h -0.42187 q -0.17188,0 -0.29688,-0.0312 -0.10937,-0.0469 -0.20312,-0.14062 -0.0781,-0.0937 -0.15625,-0.23438 -0.0625,-0.15625 -0.14063,-0.39062 l -1.57812,-4.48438 q -0.15625,-0.48437 -0.32813,-0.95312 -0.15625,-0.48438 -0.29687,-0.96875 h -0.0156 q -0.0781,0.53125 -0.1875,1.0625 -0.0937,0.51562 -0.20312,1.04687 l -0.96875,4.90625 q -0.0156,0.0625 -0.0625,0.10938 -0.0312,0.0312 -0.0937,0.0469 -0.0625,0.0156 -0.17188,0.0312 -0.10937,0.0156 -0.26562,0.0156 -0.14063,0 -0.25,-0.0156 -0.0937,-0.0156 -0.15625,-0.0312 -0.0469,-0.0156 -0.0625,-0.0469 -0.0156,-0.0469 0,-0.10938 l 1.54687,-7.76562 q 0.0469,-0.26563 0.21875,-0.375 0.17188,-0.10938 0.34375,-0.10938 h 0.5 q 0.15625,0 0.26563,0.0312 0.125,0.0312 0.20312,0.125 0.0937,0.0781 0.15625,0.21875 0.0781,0.125 0.15625,0.32813 l 1.59375,4.5625 q 0.14063,0.42187 0.28125,0.84375 0.15625,0.42187 0.29688,0.84375 h 0.0156 q 0.0937,-0.53125 0.20313,-1.09375 0.10937,-0.57813 0.20312,-1.10938 l 0.92188,-4.5625 q 0.0156,-0.0625 0.0469,-0.0937 0.0312,-0.0312 0.0937,-0.0625 0.0625,-0.0312 0.15625,-0.0312 0.10938,-0.0156 0.26563,-0.0156 0.15625,0 0.25,0.0156 0.10937,0 0.15625,0.0312 0.0625,0.0312 0.0781,0.0625 0.0156,0.0312 0.0156,0.0937 z m 9.09039,-7.09375 q 0,0.14062 -0.0469,0.34375 -0.0469,0.20312 -0.125,0.32812 -0.0781,0.10938 -0.15625,0.10938 -0.0937,0 -0.21875,-0.125 -0.125,-0.125 -0.32812,-0.26563 -0.20313,-0.14062 -0.53125,-0.25 -0.32813,-0.125 -0.82813,-0.125 -0.54687,0 -1,0.20313 -0.4375,0.20312 -0.8125,0.5625 -0.35937,0.34375 -0.64062,0.79687 -0.26563,0.45313 -0.45313,0.95313 -0.17187,0.5 -0.26562,1.01562 -0.0781,0.5 -0.0781,0.95313 0,0.51562 0.125,0.92187 0.125,0.40625 0.375,0.6875 0.25,0.28125 0.60938,0.42188 0.35937,0.14062 0.8125,0.14062 0.51562,0 0.875,-0.10937 0.375,-0.10938 0.625,-0.25 0.26562,-0.14063 0.4375,-0.25 0.1875,-0.125 0.29687,-0.125 0.0781,0 0.10938,0.0625 0.0312,0.0469 0.0312,0.15625 0,0.0312 -0.0156,0.0937 -0.0156,0.0625 -0.0312,0.14062 0,0.0625 -0.0156,0.15625 -0.0156,0.0781 -0.0469,0.15625 -0.0312,0.0625 -0.0625,0.125 -0.0156,0.0625 -0.0937,0.125 -0.0625,0.0625 -0.28125,0.20313 -0.21875,0.125 -0.53125,0.23437 -0.3125,0.10938 -0.71875,0.1875 -0.39062,0.0937 -0.82812,0.0937 -0.67188,0 -1.20313,-0.20312 -0.53125,-0.20313 -0.90625,-0.57813 -0.375,-0.39062 -0.57812,-0.96875 -0.20313,-0.57812 -0.20313,-1.32812 0,-0.60938 0.125,-1.26563 0.14063,-0.65625 0.39063,-1.26562 0.25,-0.625 0.625,-1.17188 0.39062,-0.54687 0.89062,-0.95312 0.5,-0.42188 1.125,-0.65625 0.64063,-0.25 1.39063,-0.25 0.48437,0 0.89062,0.10937 0.42188,0.10938 0.70313,0.28125 0.29687,0.15625 0.42187,0.28125 0.14063,0.125 0.14063,0.29688 z m 6.26028,-0.64063 q 0,0.0312 0,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0469 -0.10937,0.0469 h -3.29688 l -0.53125,2.64063 h 2.82813 q 0.0781,0 0.10937,0.0469 0.0469,0.0469 0.0469,0.15625 0,0.0312 -0.0156,0.10938 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0469,0.14063 -0.0312,0.0625 -0.0937,0.10937 -0.0469,0.0469 -0.10938,0.0469 h -2.82812 l -0.60936,3 h 3.34373 q 0.0625,0 0.10938,0.0625 0.0469,0.0469 0.0469,0.15625 0,0.0469 -0.0156,0.125 0,0.0625 -0.0156,0.14062 -0.0156,0.0781 -0.0469,0.15625 -0.0156,0.0781 -0.0625,0.15625 -0.0312,0.0625 -0.0937,0.10938 -0.0469,0.0312 -0.10938,0.0312 h -4.04686 q -0.0781,0 -0.15625,-0.0156 -0.0625,-0.0312 -0.10937,-0.0781 -0.0469,-0.0625 -0.0625,-0.14063 -0.0156,-0.0937 0.0156,-0.21875 l 1.49999,-7.51562 q 0.0469,-0.25 0.20312,-0.34375 0.15625,-0.10938 0.29688,-0.10938 h 4 q 0.14062,0 0.14062,0.21875 z"
-       fill-rule="nonzero"
-       id="path258" />
-    <path
-       fill="#000000"
-       d="m 173.78297,198.86352 1.26562,0.3125 q -0.39062,1.5625 -1.42187,2.375 -1.03125,0.8125 -2.53125,0.8125 -1.53125,0 -2.5,-0.625 -0.96875,-0.625 -1.48438,-1.8125 -0.5,-1.1875 -0.5,-2.5625 0,-1.48438 0.5625,-2.59375 0.57813,-1.10938 1.625,-1.6875 1.0625,-0.57813 2.32813,-0.57813 1.42187,0 2.39062,0.73438 0.98438,0.71875 1.375,2.04687 l -1.25,0.29688 q -0.32812,-1.04688 -0.96875,-1.51563 -0.625,-0.48437 -1.57812,-0.48437 -1.09375,0 -1.84375,0.53125 -0.73438,0.53125 -1.03125,1.42187 -0.29688,0.875 -0.29688,1.82813 0,1.21875 0.34375,2.125 0.35938,0.90625 1.10938,1.35937 0.75,0.4375 1.625,0.4375 1.0625,0 1.79687,-0.60937 0.73438,-0.60938 0.98438,-1.8125 z m 2.68765,-4.84375 v -1.35938 h 1.17188 v 1.35938 z m 0,8.1875 v -6.90625 h 1.17188 v 6.90625 z m 2.92984,0 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 8.96962,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92187,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85938,-0.9375 -0.85938,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76563,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92188,1.60938 l -1.14063,0.17187 q -0.17187,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98437,-0.35938 -0.89063,0 -1.45313,0.64063 -0.54687,0.64062 -0.54687,2 0,1.40625 0.53125,2.03125 0.54687,0.625 1.40625,0.625 0.6875,0 1.14062,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.67969,2.53125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60937,0 -1.14062,-0.23438 -0.53125,-0.23437 -0.79688,-0.57812 -0.25,-0.35938 -0.35937,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17187 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10938,0.46875 0.46875,0.73437 0.35938,0.25 0.89063,0.25 0.51562,0 0.98437,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17188 v 6.90625 z m 2.8656,0 v -9.54688 h 1.17188 v 9.54688 z m 7.49234,-0.85938 q -0.65625,0.5625 -1.26562,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14063,0 -1.75,-0.54688 -0.60938,-0.5625 -0.60938,-1.4375 0,-0.5 0.21875,-0.92187 0.23438,-0.42188 0.60938,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04687,-0.17188 1.42188,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32812,-1.01563 -0.45313,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39063,0.28125 -0.57813,1.01563 l -1.14062,-0.15625 q 0.15625,-0.73438 0.51562,-1.1875 0.35938,-0.45313 1.03125,-0.6875 0.67188,-0.25 1.5625,-0.25 0.89063,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26563,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29688,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23438,-0.85938 z m -0.0937,-2.60937 q -0.64062,0.26562 -1.92187,0.4375 -0.71875,0.10937 -1.01563,0.25 -0.29687,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35938,0.3125 1.04688,0.3125 0.67187,0 1.20312,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.97498,3.46875 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.25073,0 v -9.54688 h 3.59375 q 1.09375,0 1.75,0.29688 0.65625,0.28125 1.03125,0.89062 0.375,0.60938 0.375,1.26563 0,0.60937 -0.34375,1.15625 -0.32813,0.53125 -0.98438,0.85937 0.85938,0.25 1.32813,0.875 0.46875,0.60938 0.46875,1.4375 0,0.67188 -0.29688,1.25 -0.28125,0.57813 -0.70312,0.89063 -0.40625,0.3125 -1.03125,0.46875 -0.625,0.15625 -1.54688,0.15625 z m 1.26562,-5.53125 h 2.0625 q 0.84375,0 1.20313,-0.10938 0.48437,-0.14062 0.71875,-0.46875 0.25,-0.34375 0.25,-0.84375 0,-0.46875 -0.23438,-0.82812 -0.21875,-0.35938 -0.64062,-0.5 -0.42188,-0.14063 -1.45313,-0.14063 h -1.90625 z m 0,4.40625 h 2.375 q 0.60938,0 0.85938,-0.0469 0.4375,-0.0781 0.73437,-0.25 0.29688,-0.1875 0.48438,-0.53125 0.1875,-0.35937 0.1875,-0.8125 0,-0.53125 -0.28125,-0.92187 -0.26563,-0.40625 -0.75,-0.5625 -0.48438,-0.15625 -1.40625,-0.15625 h -2.20313 z m 12.06163,1.125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60937,0 -1.14062,-0.23438 -0.53125,-0.23437 -0.79688,-0.57812 -0.25,-0.35938 -0.35937,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17187 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10938,0.46875 0.46875,0.73437 0.35938,0.25 0.89063,0.25 0.51562,0 0.98437,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17188 v 6.90625 z m 3.16248,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 8.15611,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 6.50622,4.125 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z"
-       fill-rule="nonzero"
-       id="path260" />
-    <path
-       fill="#000000"
-       d="m 187.94858,237.4041 v -9.54687 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54687 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45312 q 0,-1.92188 1.07812,-2.84375 0.89063,-0.76563 2.17188,-0.76563 1.42187,0 2.32812,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98438 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45313 1.54687,-0.45313 0.625,0 1.10938,0.26563 0.5,0.25 0.79687,0.67187 v -3.42187 h 1.17188 v 9.54687 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54687,-2.07812 -0.54688,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51563,0.625 -0.51563,2 z m 11.36561,1.23437 1.20312,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 9.89671,-0.57812 q 0,-1.6875 0.34375,-2.71875 0.35937,-1.03125 1.04687,-1.59375 0.6875,-0.5625 1.71875,-0.5625 0.78125,0 1.35938,0.3125 0.57812,0.29687 0.95312,0.89062 0.375,0.57813 0.59375,1.42188 0.21875,0.82812 0.21875,2.25 0,1.67187 -0.35937,2.70312 -0.34375,1.03125 -1.03125,1.59375 -0.67188,0.5625 -1.73438,0.5625 -1.375,0 -2.15625,-0.98437 -0.95312,-1.1875 -0.95312,-3.875 z m 1.20312,0 q 0,2.34375 0.54688,3.125 0.5625,0.78125 1.35937,0.78125 0.8125,0 1.35938,-0.78125 0.5625,-0.78125 0.5625,-3.125 0,-2.35938 -0.5625,-3.125 -0.54688,-0.78125 -1.35938,-0.78125 -0.8125,0 -1.29687,0.6875 -0.60938,0.875 -0.60938,3.21875 z"
-       fill-rule="nonzero"
-       id="path262" />
-    <path
-       fill="#000000"
-       d="m 164.51677,251.04473 1.1875,-0.0781 q 0,0.51562 0.15625,0.875 0.15625,0.35937 0.57812,0.59375 0.42188,0.21875 0.96875,0.21875 0.78125,0 1.17188,-0.3125 0.39062,-0.3125 0.39062,-0.73438 0,-0.3125 -0.23437,-0.57812 -0.23438,-0.28125 -1.17188,-0.67188 -0.9375,-0.40625 -1.1875,-0.57812 -0.4375,-0.26563 -0.67187,-0.625 -0.21875,-0.35938 -0.21875,-0.82813 0,-0.8125 0.65625,-1.39062 0.65625,-0.59375 1.82812,-0.59375 1.29688,0 1.96875,0.60937 0.6875,0.59375 0.71875,1.57813 l -1.15625,0.0781 q -0.0312,-0.625 -0.45312,-0.98437 -0.40625,-0.375 -1.17188,-0.375 -0.60937,0 -0.95312,0.28125 -0.32813,0.28125 -0.32813,0.60937 0,0.3125 0.29688,0.5625 0.1875,0.17188 1,0.53125 1.35937,0.57813 1.70312,0.92188 0.5625,0.53125 0.5625,1.3125 0,0.51562 -0.3125,1.01562 -0.3125,0.48438 -0.96875,0.78125 -0.64062,0.29688 -1.51562,0.29688 -1.20313,0 -2.04688,-0.59375 -0.84375,-0.59375 -0.79687,-1.92188 z m 9.32031,1.40625 -0.20312,0.95313 q -0.42188,0.10937 -0.8125,0.10937 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17187,-1.04688 l 0.82813,-4.01562 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35938,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10938,0.32812 0.125,0.10938 0.40625,0.10938 0.39062,0 0.70312,-0.0781 z m 0.93737,0.95313 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79688 1.03125,-1.17188 0.51563,-0.39062 1.04688,-0.39062 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48437 l -0.57812,2.76563 z m 9.15712,-1.25 q -1.23438,1.40625 -2.54688,1.40625 -0.79687,0 -1.29687,-0.45313 -0.48438,-0.46875 -0.48438,-1.125 0,-0.4375 0.21875,-1.5 l 0.84375,-3.98437 h 1.17188 l -0.92188,4.40625 q -0.10937,0.5625 -0.10937,0.85937 0,0.39063 0.23437,0.60938 0.23438,0.21875 0.70313,0.21875 0.48437,0 0.95312,-0.23438 0.48438,-0.23437 0.8125,-0.64062 0.34375,-0.42188 0.5625,-0.98438 0.14063,-0.35937 0.32813,-1.25 l 0.625,-2.98437 h 1.1875 l -1.45313,6.90625 h -1.07812 z m 7.47497,-1.26563 1.17188,0.125 q -0.4375,1.29688 -1.26563,1.92188 -0.8125,0.625 -1.84375,0.625 -1.14062,0 -1.84375,-0.71875 -0.6875,-0.73438 -0.6875,-2.04688 0,-1.125 0.4375,-2.21875 0.45313,-1.09375 1.28125,-1.65625 0.84375,-0.57812 1.92188,-0.57812 1.10937,0 1.76562,0.625 0.65625,0.625 0.65625,1.65625 l -1.15625,0.0781 q -0.0156,-0.65625 -0.39062,-1.01562 -0.375,-0.375 -0.98438,-0.375 -0.70312,0 -1.23437,0.45312 -0.51563,0.4375 -0.8125,1.35938 -0.29688,0.90625 -0.29688,1.75 0,0.89062 0.39063,1.34375 0.39062,0.4375 0.96875,0.4375 0.5625,0 1.07812,-0.4375 0.53125,-0.4375 0.84375,-1.32813 z m 4.64844,1.5625 -0.20313,0.95313 q -0.42187,0.10937 -0.8125,0.10937 -0.70312,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17188,-1.04688 l 0.82812,-4.01562 h -0.92187 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35937,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79687,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10937,0.32812 0.125,0.10938 0.40625,0.10938 0.39063,0 0.70313,-0.0781 z m 4.64035,0.95313 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79688 1.03125,-1.17188 0.51563,-0.39062 1.04688,-0.39062 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48437 l -0.57812,2.76563 z m 7.20399,-0.95313 -0.20312,0.95313 q -0.42188,0.10937 -0.8125,0.10937 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17187,-1.04688 l 0.82813,-4.01562 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35938,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10938,0.32812 0.125,0.10938 0.40625,0.10938 0.39062,0 0.70312,-0.0781 z m 6.01549,-1.39062 1.15625,0.10937 q -0.25,0.85938 -1.14062,1.625 -0.89063,0.76563 -2.125,0.76563 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35938 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54688 0,-1.14062 0.51562,-2.20312 0.53125,-1.0625 1.35938,-1.57813 0.84375,-0.51562 1.8125,-0.51562 1.23437,0 1.96875,0.76562 0.75,0.76563 0.75,2.09375 0,0.5 -0.0937,1.04688 h -5.09375 q -0.0312,0.1875 -0.0312,0.35937 0,0.96875 0.4375,1.48438 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39063 0.59375,-0.39062 0.92187,-1.14062 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26563 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48437 -1.125,-0.48437 -0.76563,0 -1.39063,0.53125 -0.60937,0.51562 -0.92187,1.5625 z m 4.47497,6.71875 v -0.85938 h 7.76563 v 0.85938 z m 8.69373,-2.65625 1.45312,-6.90625 h 1.0625 l -0.25,1.20312 q 0.6875,-0.71875 1.29688,-1.03125 0.60937,-0.32812 1.23437,-0.32812 0.84375,0 1.3125,0.45312 0.48438,0.45313 0.48438,1.21875 0,0.375 -0.17188,1.20313 l -0.875,4.1875 h -1.17187 l 0.92187,-4.375 q 0.125,-0.64063 0.125,-0.95313 0,-0.34375 -0.23437,-0.54687 -0.23438,-0.21875 -0.6875,-0.21875 -0.90625,0 -1.60938,0.65625 -0.70312,0.64062 -1.03125,2.21875 l -0.67187,3.21875 z m 7.63122,-2.625 q 0,-2.01563 1.1875,-3.34375 0.98438,-1.09375 2.57813,-1.09375 1.25,0 2.01562,0.78125 0.76563,0.78125 0.76563,2.10937 0,1.1875 -0.48438,2.21875 -0.48437,1.01563 -1.375,1.5625 -0.89062,0.54688 -1.875,0.54688 -0.79687,0 -1.46875,-0.34375 -0.65625,-0.34375 -1,-0.96875 -0.34375,-0.64063 -0.34375,-1.46875 z m 1.17188,-0.10938 q 0,0.96875 0.46875,1.48438 0.46875,0.5 1.1875,0.5 0.375,0 0.75,-0.15625 0.375,-0.15625 0.6875,-0.46875 0.32812,-0.3125 0.54687,-0.70313 0.21875,-0.40625 0.35938,-0.875 0.20312,-0.64062 0.20312,-1.23437 0,-0.9375 -0.46875,-1.45313 -0.46875,-0.51562 -1.1875,-0.51562 -0.5625,0 -1.01562,0.26562 -0.45313,0.26563 -0.82813,0.78125 -0.35937,0.5 -0.53125,1.17188 -0.17187,0.67187 -0.17187,1.20312 z m 10.69372,1.73438 q -1.01562,1.15625 -2.10937,1.15625 -0.98438,0 -1.64063,-0.71875 -0.65625,-0.73438 -0.65625,-2.10938 0,-1.26562 0.51563,-2.3125 0.51562,-1.04687 1.29687,-1.5625 0.78125,-0.51562 1.5625,-0.51562 1.28125,0 1.9375,1.23437 l 0.78125,-3.71875 h 1.17188 l -1.98438,9.54688 h -1.09375 z m -3.23437,-1.89063 q 0,0.71875 0.14062,1.14063 0.14063,0.40625 0.48438,0.6875 0.34375,0.28125 0.82812,0.28125 0.79688,0 1.45313,-0.84375 0.875,-1.10938 0.875,-2.73438 0,-0.8125 -0.4375,-1.26562 -0.42188,-0.46875 -1.07813,-0.46875 -0.42187,0 -0.76562,0.1875 -0.34375,0.1875 -0.6875,0.64062 -0.34375,0.45313 -0.57813,1.15625 -0.23437,0.6875 -0.23437,1.21875 z m 11.0531,0.54688 1.15625,0.10937 q -0.25,0.85938 -1.14062,1.625 -0.89063,0.76563 -2.125,0.76563 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35938 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54688 0,-1.14062 0.51562,-2.20312 0.53125,-1.0625 1.35938,-1.57813 0.84375,-0.51562 1.8125,-0.51562 1.23437,0 1.96875,0.76562 0.75,0.76563 0.75,2.09375 0,0.5 -0.0937,1.04688 h -5.09375 q -0.0312,0.1875 -0.0312,0.35937 0,0.96875 0.4375,1.48438 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39063 0.59375,-0.39062 0.92187,-1.14062 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26563 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48437 -1.125,-0.48437 -0.76563,0 -1.39063,0.53125 -0.60937,0.51562 -0.92187,1.5625 z"
-       fill-rule="nonzero"
-       id="path264" />
-    <path
-       fill="#000000"
-       d="m 187.94858,288.60097 v -9.54687 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54687 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45312 q 0,-1.92188 1.07812,-2.84375 0.89063,-0.76563 2.17188,-0.76563 1.42187,0 2.32812,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98438 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45313 1.54687,-0.45313 0.625,0 1.10938,0.26563 0.5,0.25 0.79687,0.67187 v -3.42187 h 1.17188 v 9.54687 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54687,-2.07812 -0.54688,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51563,0.625 -0.51563,2 z m 11.36561,1.23437 1.20312,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 14.31858,4.125 h -1.17187 v -7.46875 q -0.42188,0.40625 -1.10938,0.8125 -0.6875,0.40625 -1.23437,0.60938 v -1.14063 q 0.98437,-0.45312 1.71875,-1.10937 0.73437,-0.67188 1.03125,-1.28125 h 0.76562 z"
-       fill-rule="nonzero"
-       id="path266" />
-    <path
-       fill="#000000"
-       d="m 164.51677,302.2416 1.1875,-0.0781 q 0,0.51563 0.15625,0.875 0.15625,0.35938 0.57812,0.59375 0.42188,0.21875 0.96875,0.21875 0.78125,0 1.17188,-0.3125 0.39062,-0.3125 0.39062,-0.73437 0,-0.3125 -0.23437,-0.57813 -0.23438,-0.28125 -1.17188,-0.67187 -0.9375,-0.40625 -1.1875,-0.57813 -0.4375,-0.26562 -0.67187,-0.625 -0.21875,-0.35937 -0.21875,-0.82812 0,-0.8125 0.65625,-1.39063 0.65625,-0.59375 1.82812,-0.59375 1.29688,0 1.96875,0.60938 0.6875,0.59375 0.71875,1.57812 l -1.15625,0.0781 q -0.0312,-0.625 -0.45312,-0.98438 -0.40625,-0.375 -1.17188,-0.375 -0.60937,0 -0.95312,0.28125 -0.32813,0.28125 -0.32813,0.60938 0,0.3125 0.29688,0.5625 0.1875,0.17187 1,0.53125 1.35937,0.57812 1.70312,0.92187 0.5625,0.53125 0.5625,1.3125 0,0.51563 -0.3125,1.01563 -0.3125,0.48437 -0.96875,0.78125 -0.64062,0.29687 -1.51562,0.29687 -1.20313,0 -2.04688,-0.59375 -0.84375,-0.59375 -0.79687,-1.92187 z m 9.32031,1.40625 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 0.93737,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 9.15712,-1.25 q -1.23438,1.40625 -2.54688,1.40625 -0.79687,0 -1.29687,-0.45312 -0.48438,-0.46875 -0.48438,-1.125 0,-0.4375 0.21875,-1.5 l 0.84375,-3.98438 h 1.17188 l -0.92188,4.40625 q -0.10937,0.5625 -0.10937,0.85938 0,0.39062 0.23437,0.60937 0.23438,0.21875 0.70313,0.21875 0.48437,0 0.95312,-0.23437 0.48438,-0.23438 0.8125,-0.64063 0.34375,-0.42187 0.5625,-0.98437 0.14063,-0.35938 0.32813,-1.25 l 0.625,-2.98438 h 1.1875 l -1.45313,6.90625 h -1.07812 z m 7.47497,-1.26562 1.17188,0.125 q -0.4375,1.29687 -1.26563,1.92187 -0.8125,0.625 -1.84375,0.625 -1.14062,0 -1.84375,-0.71875 -0.6875,-0.73437 -0.6875,-2.04687 0,-1.125 0.4375,-2.21875 0.45313,-1.09375 1.28125,-1.65625 0.84375,-0.57813 1.92188,-0.57813 1.10937,0 1.76562,0.625 0.65625,0.625 0.65625,1.65625 l -1.15625,0.0781 q -0.0156,-0.65625 -0.39062,-1.01563 -0.375,-0.375 -0.98438,-0.375 -0.70312,0 -1.23437,0.45313 -0.51563,0.4375 -0.8125,1.35937 -0.29688,0.90625 -0.29688,1.75 0,0.89063 0.39063,1.34375 0.39062,0.4375 0.96875,0.4375 0.5625,0 1.07812,-0.4375 0.53125,-0.4375 0.84375,-1.32812 z m 4.64844,1.5625 -0.20313,0.95312 q -0.42187,0.10938 -0.8125,0.10938 -0.70312,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17188,-1.04687 l 0.82812,-4.01563 h -0.92187 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35937,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79687,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10937,0.32813 0.125,0.10937 0.40625,0.10937 0.39063,0 0.70313,-0.0781 z m 4.64035,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 7.20399,-0.95312 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 6.01549,-1.39063 1.15625,0.10938 q -0.25,0.85937 -1.14062,1.625 -0.89063,0.76562 -2.125,0.76562 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35937 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54687 0,-1.14063 0.51562,-2.20313 0.53125,-1.0625 1.35938,-1.57812 0.84375,-0.51563 1.8125,-0.51563 1.23437,0 1.96875,0.76563 0.75,0.76562 0.75,2.09375 0,0.5 -0.0937,1.04687 h -5.09375 q -0.0312,0.1875 -0.0312,0.35938 0,0.96875 0.4375,1.48437 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39062 0.59375,-0.39063 0.92187,-1.14063 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26562 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48438 -1.125,-0.48438 -0.76563,0 -1.39063,0.53125 -0.60937,0.51563 -0.92187,1.5625 z m 4.47497,6.71875 v -0.85937 h 7.76563 v 0.85937 z m 8.69373,-2.65625 1.45312,-6.90625 h 1.0625 l -0.25,1.20313 q 0.6875,-0.71875 1.29688,-1.03125 0.60937,-0.32813 1.23437,-0.32813 0.84375,0 1.3125,0.45313 0.48438,0.45312 0.48438,1.21875 0,0.375 -0.17188,1.20312 l -0.875,4.1875 h -1.17187 l 0.92187,-4.375 q 0.125,-0.64062 0.125,-0.95312 0,-0.34375 -0.23437,-0.54688 -0.23438,-0.21875 -0.6875,-0.21875 -0.90625,0 -1.60938,0.65625 -0.70312,0.64063 -1.03125,2.21875 l -0.67187,3.21875 z m 7.63122,-2.625 q 0,-2.01562 1.1875,-3.34375 0.98438,-1.09375 2.57813,-1.09375 1.25,0 2.01562,0.78125 0.76563,0.78125 0.76563,2.10938 0,1.1875 -0.48438,2.21875 -0.48437,1.01562 -1.375,1.5625 -0.89062,0.54687 -1.875,0.54687 -0.79687,0 -1.46875,-0.34375 -0.65625,-0.34375 -1,-0.96875 -0.34375,-0.64062 -0.34375,-1.46875 z m 1.17188,-0.10937 q 0,0.96875 0.46875,1.48437 0.46875,0.5 1.1875,0.5 0.375,0 0.75,-0.15625 0.375,-0.15625 0.6875,-0.46875 0.32812,-0.3125 0.54687,-0.70312 0.21875,-0.40625 0.35938,-0.875 0.20312,-0.64063 0.20312,-1.23438 0,-0.9375 -0.46875,-1.45312 -0.46875,-0.51563 -1.1875,-0.51563 -0.5625,0 -1.01562,0.26563 -0.45313,0.26562 -0.82813,0.78125 -0.35937,0.5 -0.53125,1.17187 -0.17187,0.67188 -0.17187,1.20313 z m 10.69372,1.73437 q -1.01562,1.15625 -2.10937,1.15625 -0.98438,0 -1.64063,-0.71875 -0.65625,-0.73437 -0.65625,-2.10937 0,-1.26563 0.51563,-2.3125 0.51562,-1.04688 1.29687,-1.5625 0.78125,-0.51563 1.5625,-0.51563 1.28125,0 1.9375,1.23438 l 0.78125,-3.71875 h 1.17188 l -1.98438,9.54687 h -1.09375 z m -3.23437,-1.89062 q 0,0.71875 0.14062,1.14062 0.14063,0.40625 0.48438,0.6875 0.34375,0.28125 0.82812,0.28125 0.79688,0 1.45313,-0.84375 0.875,-1.10937 0.875,-2.73437 0,-0.8125 -0.4375,-1.26563 -0.42188,-0.46875 -1.07813,-0.46875 -0.42187,0 -0.76562,0.1875 -0.34375,0.1875 -0.6875,0.64063 -0.34375,0.45312 -0.57813,1.15625 -0.23437,0.6875 -0.23437,1.21875 z m 11.0531,0.54687 1.15625,0.10938 q -0.25,0.85937 -1.14062,1.625 -0.89063,0.76562 -2.125,0.76562 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35937 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54687 0,-1.14063 0.51562,-2.20313 0.53125,-1.0625 1.35938,-1.57812 0.84375,-0.51563 1.8125,-0.51563 1.23437,0 1.96875,0.76563 0.75,0.76562 0.75,2.09375 0,0.5 -0.0937,1.04687 h -5.09375 q -0.0312,0.1875 -0.0312,0.35938 0,0.96875 0.4375,1.48437 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39062 0.59375,-0.39063 0.92187,-1.14063 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26562 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48438 -1.125,-0.48438 -0.76563,0 -1.39063,0.53125 -0.60937,0.51563 -0.92187,1.5625 z"
-       fill-rule="nonzero"
-       id="path268" />
-    <path
-       fill="#000000"
-       d="m 187.94858,339.7978 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.36561,1.23438 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 16.05296,3 v 1.125 h -6.29688 q -0.0156,-0.42188 0.14063,-0.8125 0.23437,-0.64063 0.76562,-1.26563 0.53125,-0.625 1.53125,-1.45312 1.5625,-1.26563 2.10938,-2.01563 0.54687,-0.75 0.54687,-1.40625 0,-0.70312 -0.5,-1.17187 -0.5,-0.48438 -1.29687,-0.48438 -0.85938,0 -1.375,0.51563 -0.5,0.5 -0.5,1.39062 l -1.20313,-0.10937 q 0.125,-1.35938 0.92188,-2.0625 0.8125,-0.70313 2.17187,-0.70313 1.375,0 2.17188,0.76563 0.8125,0.75 0.8125,1.875 0,0.57812 -0.23438,1.14062 -0.23437,0.54688 -0.78125,1.15625 -0.54687,0.60938 -1.8125,1.67188 -1.04687,0.89062 -1.35937,1.21875 -0.29688,0.3125 -0.48438,0.625 z"
-       fill-rule="nonzero"
-       id="path270" />
-    <path
-       fill="#000000"
-       d="m 164.51677,353.43844 1.1875,-0.0781 q 0,0.51562 0.15625,0.875 0.15625,0.35937 0.57812,0.59375 0.42188,0.21875 0.96875,0.21875 0.78125,0 1.17188,-0.3125 0.39062,-0.3125 0.39062,-0.73438 0,-0.3125 -0.23437,-0.57812 -0.23438,-0.28125 -1.17188,-0.67188 -0.9375,-0.40625 -1.1875,-0.57812 -0.4375,-0.26563 -0.67187,-0.625 -0.21875,-0.35938 -0.21875,-0.82813 0,-0.8125 0.65625,-1.39062 0.65625,-0.59375 1.82812,-0.59375 1.29688,0 1.96875,0.60937 0.6875,0.59375 0.71875,1.57813 l -1.15625,0.0781 q -0.0312,-0.625 -0.45312,-0.98437 -0.40625,-0.375 -1.17188,-0.375 -0.60937,0 -0.95312,0.28125 -0.32813,0.28125 -0.32813,0.60937 0,0.3125 0.29688,0.5625 0.1875,0.17188 1,0.53125 1.35937,0.57813 1.70312,0.92188 0.5625,0.53125 0.5625,1.3125 0,0.51562 -0.3125,1.01562 -0.3125,0.48438 -0.96875,0.78125 -0.64062,0.29688 -1.51562,0.29688 -1.20313,0 -2.04688,-0.59375 -0.84375,-0.59375 -0.79687,-1.92188 z m 9.32031,1.40625 -0.20312,0.95313 q -0.42188,0.10937 -0.8125,0.10937 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17187,-1.04688 l 0.82813,-4.01562 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35938,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10938,0.32812 0.125,0.10938 0.40625,0.10938 0.39062,0 0.70312,-0.0781 z m 0.93737,0.95313 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79688 1.03125,-1.17188 0.51563,-0.39062 1.04688,-0.39062 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48437 l -0.57812,2.76563 z m 9.15712,-1.25 q -1.23438,1.40625 -2.54688,1.40625 -0.79687,0 -1.29687,-0.45313 -0.48438,-0.46875 -0.48438,-1.125 0,-0.4375 0.21875,-1.5 l 0.84375,-3.98437 h 1.17188 l -0.92188,4.40625 q -0.10937,0.5625 -0.10937,0.85937 0,0.39063 0.23437,0.60938 0.23438,0.21875 0.70313,0.21875 0.48437,0 0.95312,-0.23438 0.48438,-0.23437 0.8125,-0.64062 0.34375,-0.42188 0.5625,-0.98438 0.14063,-0.35937 0.32813,-1.25 l 0.625,-2.98437 h 1.1875 l -1.45313,6.90625 h -1.07812 z m 7.47497,-1.26563 1.17188,0.125 q -0.4375,1.29688 -1.26563,1.92188 -0.8125,0.625 -1.84375,0.625 -1.14062,0 -1.84375,-0.71875 -0.6875,-0.73438 -0.6875,-2.04688 0,-1.125 0.4375,-2.21875 0.45313,-1.09375 1.28125,-1.65625 0.84375,-0.57812 1.92188,-0.57812 1.10937,0 1.76562,0.625 0.65625,0.625 0.65625,1.65625 l -1.15625,0.0781 q -0.0156,-0.65625 -0.39062,-1.01562 -0.375,-0.375 -0.98438,-0.375 -0.70312,0 -1.23437,0.45312 -0.51563,0.4375 -0.8125,1.35938 -0.29688,0.90625 -0.29688,1.75 0,0.89062 0.39063,1.34375 0.39062,0.4375 0.96875,0.4375 0.5625,0 1.07812,-0.4375 0.53125,-0.4375 0.84375,-1.32813 z m 4.64844,1.5625 -0.20313,0.95313 q -0.42187,0.10937 -0.8125,0.10937 -0.70312,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17188,-1.04688 l 0.82812,-4.01562 h -0.92187 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35937,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79687,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10937,0.32812 0.125,0.10938 0.40625,0.10938 0.39063,0 0.70313,-0.0781 z m 4.64035,0.95313 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79688 1.03125,-1.17188 0.51563,-0.39062 1.04688,-0.39062 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48437 l -0.57812,2.76563 z m 7.20399,-0.95313 -0.20312,0.95313 q -0.42188,0.10937 -0.8125,0.10937 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70312 0,-0.23438 0.17187,-1.04688 l 0.82813,-4.01562 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70313 1.35938,-0.8125 -0.53125,2.51563 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73437 -0.15625,0.875 0,0.21875 0.10938,0.32812 0.125,0.10938 0.40625,0.10938 0.39062,0 0.70312,-0.0781 z m 6.01549,-1.39062 1.15625,0.10937 q -0.25,0.85938 -1.14062,1.625 -0.89063,0.76563 -2.125,0.76563 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35938 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54688 0,-1.14062 0.51562,-2.20312 0.53125,-1.0625 1.35938,-1.57813 0.84375,-0.51562 1.8125,-0.51562 1.23437,0 1.96875,0.76562 0.75,0.76563 0.75,2.09375 0,0.5 -0.0937,1.04688 h -5.09375 q -0.0312,0.1875 -0.0312,0.35937 0,0.96875 0.4375,1.48438 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39063 0.59375,-0.39062 0.92187,-1.14062 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26563 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48437 -1.125,-0.48437 -0.76563,0 -1.39063,0.53125 -0.60937,0.51562 -0.92187,1.5625 z m 4.47497,6.71875 v -0.85938 h 7.76563 v 0.85938 z m 8.69373,-2.65625 1.45312,-6.90625 h 1.0625 l -0.25,1.20312 q 0.6875,-0.71875 1.29688,-1.03125 0.60937,-0.32812 1.23437,-0.32812 0.84375,0 1.3125,0.45312 0.48438,0.45313 0.48438,1.21875 0,0.375 -0.17188,1.20313 l -0.875,4.1875 h -1.17187 l 0.92187,-4.375 q 0.125,-0.64063 0.125,-0.95313 0,-0.34375 -0.23437,-0.54687 -0.23438,-0.21875 -0.6875,-0.21875 -0.90625,0 -1.60938,0.65625 -0.70312,0.64062 -1.03125,2.21875 l -0.67187,3.21875 z m 7.63122,-2.625 q 0,-2.01563 1.1875,-3.34375 0.98438,-1.09375 2.57813,-1.09375 1.25,0 2.01562,0.78125 0.76563,0.78125 0.76563,2.10937 0,1.1875 -0.48438,2.21875 -0.48437,1.01563 -1.375,1.5625 -0.89062,0.54688 -1.875,0.54688 -0.79687,0 -1.46875,-0.34375 -0.65625,-0.34375 -1,-0.96875 -0.34375,-0.64063 -0.34375,-1.46875 z m 1.17188,-0.10938 q 0,0.96875 0.46875,1.48438 0.46875,0.5 1.1875,0.5 0.375,0 0.75,-0.15625 0.375,-0.15625 0.6875,-0.46875 0.32812,-0.3125 0.54687,-0.70313 0.21875,-0.40625 0.35938,-0.875 0.20312,-0.64062 0.20312,-1.23437 0,-0.9375 -0.46875,-1.45313 -0.46875,-0.51562 -1.1875,-0.51562 -0.5625,0 -1.01562,0.26562 -0.45313,0.26563 -0.82813,0.78125 -0.35937,0.5 -0.53125,1.17188 -0.17187,0.67187 -0.17187,1.20312 z m 10.69372,1.73438 q -1.01562,1.15625 -2.10937,1.15625 -0.98438,0 -1.64063,-0.71875 -0.65625,-0.73438 -0.65625,-2.10938 0,-1.26562 0.51563,-2.3125 0.51562,-1.04687 1.29687,-1.5625 0.78125,-0.51562 1.5625,-0.51562 1.28125,0 1.9375,1.23437 l 0.78125,-3.71875 h 1.17188 l -1.98438,9.54688 h -1.09375 z m -3.23437,-1.89063 q 0,0.71875 0.14062,1.14063 0.14063,0.40625 0.48438,0.6875 0.34375,0.28125 0.82812,0.28125 0.79688,0 1.45313,-0.84375 0.875,-1.10938 0.875,-2.73438 0,-0.8125 -0.4375,-1.26562 -0.42188,-0.46875 -1.07813,-0.46875 -0.42187,0 -0.76562,0.1875 -0.34375,0.1875 -0.6875,0.64062 -0.34375,0.45313 -0.57813,1.15625 -0.23437,0.6875 -0.23437,1.21875 z m 11.0531,0.54688 1.15625,0.10937 q -0.25,0.85938 -1.14062,1.625 -0.89063,0.76563 -2.125,0.76563 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35938 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54688 0,-1.14062 0.51562,-2.20312 0.53125,-1.0625 1.35938,-1.57813 0.84375,-0.51562 1.8125,-0.51562 1.23437,0 1.96875,0.76562 0.75,0.76563 0.75,2.09375 0,0.5 -0.0937,1.04688 h -5.09375 q -0.0312,0.1875 -0.0312,0.35937 0,0.96875 0.4375,1.48438 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39063 0.59375,-0.39062 0.92187,-1.14062 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26563 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48437 -1.125,-0.48437 -0.76563,0 -1.39063,0.53125 -0.60937,0.51562 -0.92187,1.5625 z"
-       fill-rule="nonzero"
-       id="path272" />
-    <path
-       fill="#000000"
-       d="m 186.84224,390.99465 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.36547,4.125 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z"
-       fill-rule="nonzero"
-       id="path274" />
-    <path
-       fill="#000000"
-       d="m 164.51677,404.63527 1.1875,-0.0781 q 0,0.51563 0.15625,0.875 0.15625,0.35938 0.57812,0.59375 0.42188,0.21875 0.96875,0.21875 0.78125,0 1.17188,-0.3125 0.39062,-0.3125 0.39062,-0.73437 0,-0.3125 -0.23437,-0.57813 -0.23438,-0.28125 -1.17188,-0.67187 -0.9375,-0.40625 -1.1875,-0.57813 -0.4375,-0.26562 -0.67187,-0.625 -0.21875,-0.35937 -0.21875,-0.82812 0,-0.8125 0.65625,-1.39063 0.65625,-0.59375 1.82812,-0.59375 1.29688,0 1.96875,0.60938 0.6875,0.59375 0.71875,1.57812 l -1.15625,0.0781 q -0.0312,-0.625 -0.45312,-0.98438 -0.40625,-0.375 -1.17188,-0.375 -0.60937,0 -0.95312,0.28125 -0.32813,0.28125 -0.32813,0.60938 0,0.3125 0.29688,0.5625 0.1875,0.17187 1,0.53125 1.35937,0.57812 1.70312,0.92187 0.5625,0.53125 0.5625,1.3125 0,0.51563 -0.3125,1.01563 -0.3125,0.48437 -0.96875,0.78125 -0.64062,0.29687 -1.51562,0.29687 -1.20313,0 -2.04688,-0.59375 -0.84375,-0.59375 -0.79687,-1.92187 z m 9.32031,1.40625 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 0.93737,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 9.15712,-1.25 q -1.23438,1.40625 -2.54688,1.40625 -0.79687,0 -1.29687,-0.45312 -0.48438,-0.46875 -0.48438,-1.125 0,-0.4375 0.21875,-1.5 l 0.84375,-3.98438 h 1.17188 l -0.92188,4.40625 q -0.10937,0.5625 -0.10937,0.85938 0,0.39062 0.23437,0.60937 0.23438,0.21875 0.70313,0.21875 0.48437,0 0.95312,-0.23437 0.48438,-0.23438 0.8125,-0.64063 0.34375,-0.42187 0.5625,-0.98437 0.14063,-0.35938 0.32813,-1.25 l 0.625,-2.98438 h 1.1875 l -1.45313,6.90625 h -1.07812 z m 7.47497,-1.26562 1.17188,0.125 q -0.4375,1.29687 -1.26563,1.92187 -0.8125,0.625 -1.84375,0.625 -1.14062,0 -1.84375,-0.71875 -0.6875,-0.73437 -0.6875,-2.04687 0,-1.125 0.4375,-2.21875 0.45313,-1.09375 1.28125,-1.65625 0.84375,-0.57813 1.92188,-0.57813 1.10937,0 1.76562,0.625 0.65625,0.625 0.65625,1.65625 l -1.15625,0.0781 q -0.0156,-0.65625 -0.39062,-1.01563 -0.375,-0.375 -0.98438,-0.375 -0.70312,0 -1.23437,0.45313 -0.51563,0.4375 -0.8125,1.35937 -0.29688,0.90625 -0.29688,1.75 0,0.89063 0.39063,1.34375 0.39062,0.4375 0.96875,0.4375 0.5625,0 1.07812,-0.4375 0.53125,-0.4375 0.84375,-1.32812 z m 4.64844,1.5625 -0.20313,0.95312 q -0.42187,0.10938 -0.8125,0.10938 -0.70312,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17188,-1.04687 l 0.82812,-4.01563 h -0.92187 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35937,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79687,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10937,0.32813 0.125,0.10937 0.40625,0.10937 0.39063,0 0.70313,-0.0781 z m 4.64035,0.95312 1.45312,-6.90625 h 1.03125 l -0.28125,1.40625 q 0.53125,-0.79687 1.03125,-1.17187 0.51563,-0.39063 1.04688,-0.39063 0.35937,0 0.875,0.25 l -0.48438,1.09375 q -0.3125,-0.21875 -0.67187,-0.21875 -0.625,0 -1.28125,0.6875 -0.64063,0.6875 -1.01563,2.48438 l -0.57812,2.76562 z m 7.20399,-0.95312 -0.20312,0.95312 q -0.42188,0.10938 -0.8125,0.10938 -0.70313,0 -1.125,-0.34375 -0.3125,-0.25 -0.3125,-0.70313 0,-0.23437 0.17187,-1.04687 l 0.82813,-4.01563 h -0.92188 l 0.1875,-0.90625 h 0.9375 l 0.34375,-1.70312 1.35938,-0.8125 -0.53125,2.51562 h 1.15625 l -0.1875,0.90625 h -1.15625 l -0.79688,3.8125 q -0.15625,0.73438 -0.15625,0.875 0,0.21875 0.10938,0.32813 0.125,0.10937 0.40625,0.10937 0.39062,0 0.70312,-0.0781 z m 6.01549,-1.39063 1.15625,0.10938 q -0.25,0.85937 -1.14062,1.625 -0.89063,0.76562 -2.125,0.76562 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35937 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54687 0,-1.14063 0.51562,-2.20313 0.53125,-1.0625 1.35938,-1.57812 0.84375,-0.51563 1.8125,-0.51563 1.23437,0 1.96875,0.76563 0.75,0.76562 0.75,2.09375 0,0.5 -0.0937,1.04687 h -5.09375 q -0.0312,0.1875 -0.0312,0.35938 0,0.96875 0.4375,1.48437 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39062 0.59375,-0.39063 0.92187,-1.14063 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26562 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48438 -1.125,-0.48438 -0.76563,0 -1.39063,0.53125 -0.60937,0.51563 -0.92187,1.5625 z m 4.47497,6.71875 v -0.85937 h 7.76563 v 0.85937 z m 8.69373,-2.65625 1.45312,-6.90625 h 1.0625 l -0.25,1.20313 q 0.6875,-0.71875 1.29688,-1.03125 0.60937,-0.32813 1.23437,-0.32813 0.84375,0 1.3125,0.45313 0.48438,0.45312 0.48438,1.21875 0,0.375 -0.17188,1.20312 l -0.875,4.1875 h -1.17187 l 0.92187,-4.375 q 0.125,-0.64062 0.125,-0.95312 0,-0.34375 -0.23437,-0.54688 -0.23438,-0.21875 -0.6875,-0.21875 -0.90625,0 -1.60938,0.65625 -0.70312,0.64063 -1.03125,2.21875 l -0.67187,3.21875 z m 7.63122,-2.625 q 0,-2.01562 1.1875,-3.34375 0.98438,-1.09375 2.57813,-1.09375 1.25,0 2.01562,0.78125 0.76563,0.78125 0.76563,2.10938 0,1.1875 -0.48438,2.21875 -0.48437,1.01562 -1.375,1.5625 -0.89062,0.54687 -1.875,0.54687 -0.79687,0 -1.46875,-0.34375 -0.65625,-0.34375 -1,-0.96875 -0.34375,-0.64062 -0.34375,-1.46875 z m 1.17188,-0.10937 q 0,0.96875 0.46875,1.48437 0.46875,0.5 1.1875,0.5 0.375,0 0.75,-0.15625 0.375,-0.15625 0.6875,-0.46875 0.32812,-0.3125 0.54687,-0.70312 0.21875,-0.40625 0.35938,-0.875 0.20312,-0.64063 0.20312,-1.23438 0,-0.9375 -0.46875,-1.45312 -0.46875,-0.51563 -1.1875,-0.51563 -0.5625,0 -1.01562,0.26563 -0.45313,0.26562 -0.82813,0.78125 -0.35937,0.5 -0.53125,1.17187 -0.17187,0.67188 -0.17187,1.20313 z m 10.69372,1.73437 q -1.01562,1.15625 -2.10937,1.15625 -0.98438,0 -1.64063,-0.71875 -0.65625,-0.73437 -0.65625,-2.10937 0,-1.26563 0.51563,-2.3125 0.51562,-1.04688 1.29687,-1.5625 0.78125,-0.51563 1.5625,-0.51563 1.28125,0 1.9375,1.23438 l 0.78125,-3.71875 h 1.17188 l -1.98438,9.54687 h -1.09375 z m -3.23437,-1.89062 q 0,0.71875 0.14062,1.14062 0.14063,0.40625 0.48438,0.6875 0.34375,0.28125 0.82812,0.28125 0.79688,0 1.45313,-0.84375 0.875,-1.10937 0.875,-2.73437 0,-0.8125 -0.4375,-1.26563 -0.42188,-0.46875 -1.07813,-0.46875 -0.42187,0 -0.76562,0.1875 -0.34375,0.1875 -0.6875,0.64063 -0.34375,0.45312 -0.57813,1.15625 -0.23437,0.6875 -0.23437,1.21875 z m 11.0531,0.54687 1.15625,0.10938 q -0.25,0.85937 -1.14062,1.625 -0.89063,0.76562 -2.125,0.76562 -0.76563,0 -1.40625,-0.34375 -0.64063,-0.35937 -0.98438,-1.03125 -0.32812,-0.6875 -0.32812,-1.54687 0,-1.14063 0.51562,-2.20313 0.53125,-1.0625 1.35938,-1.57812 0.84375,-0.51563 1.8125,-0.51563 1.23437,0 1.96875,0.76563 0.75,0.76562 0.75,2.09375 0,0.5 -0.0937,1.04687 h -5.09375 q -0.0312,0.1875 -0.0312,0.35938 0,0.96875 0.4375,1.48437 0.45312,0.5 1.10937,0.5 0.59375,0 1.17188,-0.39062 0.59375,-0.39063 0.92187,-1.14063 z m -3.42187,-1.71875 h 3.875 q 0.0156,-0.1875 0.0156,-0.26562 0,-0.875 -0.45312,-1.34375 -0.4375,-0.48438 -1.125,-0.48438 -0.76563,0 -1.39063,0.53125 -0.60937,0.51563 -0.92187,1.5625 z"
-       fill-rule="nonzero"
-       id="path276" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="M 93.256612,37.783637 H 323.58733 v 27.46456 H 93.256612 Z"
-       fill-rule="evenodd"
-       id="path278" />
-    <path
-       fill="#000000"
-       d="m 115.56788,59.583637 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 7.01649,-1.04688 0.17188,1.03125 q -0.5,0.10938 -0.89063,0.10938 -0.64062,0 -1,-0.20313 -0.34375,-0.20312 -0.48437,-0.53125 -0.14063,-0.32812 -0.14063,-1.39062 v -3.96875 h -0.85937 v -0.90625 h 0.85937 v -1.71875 l 1.17188,-0.70313 v 2.42188 h 1.17187 v 0.90625 h -1.17187 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20313,0.23437 0.14062,0.0781 0.40625,0.0781 0.20312,0 0.51562,-0.0469 z m 5.87487,-1.17187 1.20311,0.14062 q -0.28125,1.0625 -1.06249,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.87499,0.9375 0.87499,2.65625 0,0.10937 0,0.3125 h -5.15624 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 5.44372,6.78125 v -0.85938 h 7.76562 v 0.85938 z m 8.27185,-2.07813 1.14062,0.15625 q 0.0781,0.53125 0.40625,0.78125 0.4375,0.3125 1.1875,0.3125 0.8125,0 1.25,-0.32812 0.45313,-0.3125 0.60938,-0.90625 0.0937,-0.35938 0.0781,-1.5 -0.76562,0.90625 -1.90625,0.90625 -1.4375,0 -2.21875,-1.03125 -0.78125,-1.03125 -0.78125,-2.46875 0,-0.98438 0.35938,-1.8125 0.35937,-0.84375 1.03125,-1.29688 0.6875,-0.45312 1.60937,-0.45312 1.21875,0 2.01563,0.98437 v -0.82812 h 1.07812 v 5.96875 q 0,1.60937 -0.32812,2.28125 -0.32813,0.6875 -1.04688,1.07812 -0.70312,0.39063 -1.75,0.39063 -1.23437,0 -2,-0.5625 -0.75,-0.5625 -0.73437,-1.67188 z m 0.98437,-4.15625 q 0,1.35938 0.53125,1.98438 0.54688,0.625 1.35938,0.625 0.79687,0 1.34375,-0.625 0.54687,-0.625 0.54687,-1.95313 0,-1.26562 -0.5625,-1.90625 -0.5625,-0.64062 -1.35937,-0.64062 -0.76563,0 -1.3125,0.64062 -0.54688,0.625 -0.54688,1.875 z m 6.63123,3.57813 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.96962,-0.85938 q -0.65625,0.5625 -1.26563,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14062,0 -1.75,-0.54688 -0.60937,-0.5625 -0.60937,-1.4375 0,-0.5 0.21875,-0.92187 0.23437,-0.42188 0.60937,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04688,-0.17188 1.42187,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32813,-1.01563 -0.45312,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39062,0.28125 -0.57812,1.01563 l -1.14063,-0.15625 q 0.15625,-0.73438 0.51563,-1.1875 0.35937,-0.45313 1.03125,-0.6875 0.67187,-0.25 1.5625,-0.25 0.89062,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26562,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29687,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23437,-0.85938 z m -0.0937,-2.60937 q -0.64063,0.26562 -1.92188,0.4375 -0.71875,0.10937 -1.01562,0.25 -0.29688,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35937,0.3125 1.04687,0.3125 0.67188,0 1.20313,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.9906,6.125 v -9.5625 h 1.07812 v 0.89062 q 0.375,-0.53125 0.84375,-0.78125 0.48438,-0.26562 1.15625,-0.26562 0.875,0 1.54688,0.45312 0.6875,0.45313 1.03125,1.28125 0.34375,0.82813 0.34375,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.10938,1.29687 -0.71875,0.45313 -1.53125,0.45313 -0.57812,0 -1.04687,-0.25 -0.46875,-0.25 -0.76563,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.53125,1.98438 0.54687,0.625 1.3125,0.625 0.78125,0 1.34375,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.54688,-1.96875 -0.54687,-0.67187 -1.29687,-0.67187 -0.75,0 -1.32813,0.70312 -0.57812,0.70313 -0.57812,2.03125 z m 6.34997,3.42188 v -9.54688 h 1.17188 v 3.42188 q 0.82812,-0.9375 2.07812,-0.9375 0.76563,0 1.32813,0.29687 0.5625,0.29688 0.8125,0.84375 0.25,0.53125 0.25,1.54688 v 4.375 h -1.17188 v -4.375 q 0,-0.89063 -0.39062,-1.28125 -0.375,-0.40625 -1.07813,-0.40625 -0.51562,0 -0.98437,0.28125 -0.45313,0.26562 -0.65625,0.73437 -0.1875,0.45313 -0.1875,1.26563 v 3.78125 z m 10.67797,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 7.72498,3.45313 h -1.07813 v -9.54688 h 1.17188 v 3.40625 q 0.73437,-0.92187 1.89062,-0.92187 0.64063,0 1.20313,0.26562 0.57812,0.25 0.9375,0.71875 0.375,0.45313 0.57812,1.10938 0.20313,0.65625 0.20313,1.40625 0,1.78125 -0.875,2.75 -0.875,0.96875 -2.10938,0.96875 -1.21875,0 -1.92187,-1.01563 z m 0,-3.5 q 0,1.23437 0.32812,1.78125 0.5625,0.90625 1.5,0.90625 0.76563,0 1.32813,-0.65625 0.5625,-0.67188 0.5625,-2 0,-1.34375 -0.54688,-1.98438 -0.53125,-0.65625 -1.29687,-0.65625 -0.76563,0 -1.32813,0.67188 -0.54687,0.67187 -0.54687,1.9375 z m 6.33435,-4.6875 v -1.35938 h 1.17187 v 1.35938 z m -1.48438,10.875 0.21875,-1 q 0.35938,0.0937 0.54688,0.0937 0.35937,0 0.53125,-0.25 0.1875,-0.23438 0.1875,-1.1875 v -7.25 h 1.17187 v 7.28125 q 0,1.28125 -0.32812,1.78125 -0.4375,0.65625 -1.40625,0.65625 -0.48438,0 -0.92188,-0.125 z m 9.17984,-4.90625 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 11.03748,1.59375 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92188,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85937,-0.9375 -0.85937,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76562,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92187,1.60938 l -1.14062,0.17187 q -0.17188,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98438,-0.35938 -0.89062,0 -1.45312,0.64063 -0.54688,0.64062 -0.54688,2 0,1.40625 0.53125,2.03125 0.54688,0.625 1.40625,0.625 0.6875,0 1.14063,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 4.71094,1.48437 0.17187,1.03125 q -0.5,0.10938 -0.89062,0.10938 -0.64063,0 -1,-0.20313 -0.34375,-0.20312 -0.48438,-0.53125 -0.14062,-0.32812 -0.14062,-1.39062 v -3.96875 h -0.85938 v -0.90625 h 0.85938 v -1.71875 l 1.17187,-0.70313 v 2.42188 h 1.17188 v 0.90625 h -1.17188 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20312,0.23437 0.14063,0.0781 0.40625,0.0781 0.20313,0 0.51563,-0.0469 z m 4.84347,1.04688 v -6.90625 h 1.04688 v 0.96875 q 0.32812,-0.51563 0.85937,-0.8125 0.54688,-0.3125 1.23438,-0.3125 0.78125,0 1.26562,0.3125 0.48438,0.3125 0.6875,0.89062 0.82813,-1.20312 2.14063,-1.20312 1.03125,0 1.57812,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.17187 v -4.35938 q 0,-0.70312 -0.125,-1 -0.10938,-0.3125 -0.40625,-0.5 -0.29688,-0.1875 -0.70313,-0.1875 -0.71875,0 -1.20312,0.48438 -0.48438,0.48437 -0.48438,1.54687 v 4.01563 h -1.17187 v -4.48438 q 0,-0.78125 -0.29688,-1.17187 -0.28125,-0.39063 -0.92187,-0.39063 -0.5,0 -0.92188,0.26563 -0.42187,0.25 -0.60937,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 15.83681,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.8438,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 6.52185,4.125 v -6.90625 h 1.04687 v 0.96875 q 0.32813,-0.51563 0.85938,-0.8125 0.54687,-0.3125 1.23437,-0.3125 0.78125,0 1.26563,0.3125 0.48437,0.3125 0.6875,0.89062 0.82812,-1.20312 2.14062,-1.20312 1.03125,0 1.57813,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.17188 v -4.35938 q 0,-0.70312 -0.125,-1 -0.10937,-0.3125 -0.40625,-0.5 -0.29687,-0.1875 -0.70312,-0.1875 -0.71875,0 -1.20313,0.48438 -0.48437,0.48437 -0.48437,1.54687 v 4.01563 h -1.17188 v -4.48438 q 0,-0.78125 -0.29687,-1.17187 -0.28125,-0.39063 -0.92188,-0.39063 -0.5,0 -0.92187,0.26563 -0.42188,0.25 -0.60938,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 10.66493,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 6.63122,3.45313 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 4.40712,2.65625 -0.125,-1.09375 q 0.375,0.10937 0.65625,0.10937 0.39063,0 0.625,-0.14062 0.23438,-0.125 0.39063,-0.35938 0.10937,-0.17187 0.35937,-0.875 0.0312,-0.0937 0.10938,-0.28125 l -2.625,-6.92187 h 1.26562 l 1.4375,4 q 0.28125,0.76562 0.5,1.59375 0.20313,-0.79688 0.46875,-1.57813 l 1.48438,-4.01562 h 1.17187 l -2.625,7.01562 q -0.42187,1.14063 -0.65625,1.57813 -0.3125,0.57812 -0.71875,0.84375 -0.40625,0.28125 -0.96875,0.28125 -0.32812,0 -0.75,-0.15625 z m 10.39832,-2.65625 v -9.54688 h 1.17187 v 9.54688 z m 7.49234,-0.85938 q -0.65625,0.5625 -1.26563,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14062,0 -1.75,-0.54688 -0.60937,-0.5625 -0.60937,-1.4375 0,-0.5 0.21875,-0.92187 0.23437,-0.42188 0.60937,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04688,-0.17188 1.42187,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32813,-1.01563 -0.45312,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39062,0.28125 -0.57812,1.01563 l -1.14063,-0.15625 q 0.15625,-0.73438 0.51563,-1.1875 0.35937,-0.45313 1.03125,-0.6875 0.67187,-0.25 1.5625,-0.25 0.89062,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26562,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29687,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23437,-0.85938 z m -0.0937,-2.60937 q -0.64063,0.26562 -1.92188,0.4375 -0.71875,0.10937 -1.01562,0.25 -0.29688,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35937,0.3125 1.04687,0.3125 0.67188,0 1.20313,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.94372,6.125 -0.125,-1.09375 q 0.375,0.10937 0.65625,0.10937 0.39063,0 0.625,-0.14062 0.23438,-0.125 0.39063,-0.35938 0.10937,-0.17187 0.35937,-0.875 0.0312,-0.0937 0.10938,-0.28125 l -2.625,-6.92187 h 1.26562 l 1.4375,4 q 0.28125,0.76562 0.5,1.59375 0.20313,-0.79688 0.46875,-1.57813 l 1.48438,-4.01562 h 1.17187 l -2.625,7.01562 q -0.42187,1.14063 -0.65625,1.57813 -0.3125,0.57812 -0.71875,0.84375 -0.40625,0.28125 -0.96875,0.28125 -0.32812,0 -0.75,-0.15625 z m 6.27344,-6.10938 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.17811,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 5.44372,-1.04688 0.17188,1.03125 q -0.5,0.10938 -0.89063,0.10938 -0.64062,0 -1,-0.20313 -0.34375,-0.20312 -0.48437,-0.53125 -0.14063,-0.32812 -0.14063,-1.39062 v -3.96875 h -0.85937 v -0.90625 h 0.85937 v -1.71875 l 1.17188,-0.70313 v 2.42188 H 301.87 v 0.90625 h -1.17187 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20313,0.23437 0.14062,0.0781 0.40625,0.0781 0.20312,0 0.51562,-0.0469 z"
-       fill-rule="nonzero"
-       id="path280"
-       style="fill:#c8ab37" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 141.69362,420.4057 c -7.18405,0 -13.00787,-0.97061 -13.00787,-2.16791 v -97.61697 c 0,-1.1973 -5.82383,-2.16788 -13.00788,-2.16788 v 0 c 7.18405,0 13.00788,-0.97061 13.00788,-2.16791 v -97.61696 0 c 0,-1.19729 5.82382,-2.16789 13.00787,-2.16789 z"
-       fill-rule="evenodd"
-       id="path282" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 141.69362,420.4057 c -7.18405,0 -13.00787,-0.97061 -13.00787,-2.16791 v -97.61697 c 0,-1.1973 -5.82383,-2.16788 -13.00788,-2.16788 v 0 c 7.18405,0 13.00788,-0.97061 13.00788,-2.16791 v -97.61696 0 c 0,-1.19729 5.82382,-2.16789 13.00787,-2.16789"
-       fill-rule="evenodd"
-       id="path284" />
-    <path
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       d="m 141.69362,420.4057 c -7.18405,0 -13.00787,-0.97061 -13.00787,-2.16791 v -97.61697 c 0,-1.1973 -5.82383,-2.16788 -13.00788,-2.16788 v 0 c 7.18405,0 13.00788,-0.97061 13.00788,-2.16791 v -97.61696 0 c 0,-1.19729 5.82382,-2.16789 13.00787,-2.16789"
-       fill-rule="evenodd"
-       id="path286"
-       style="fill:none" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 66.103062,278.3112 h 99.401568 v 27.46457 H 66.103062 Z"
-       fill-rule="evenodd"
-       id="path288" />
-    <path
-       fill="#000000"
-       d="m 75.899942,298.8312 v -6.21875 h 0.9375 v 0.875 q 0.6875,-1.01562 1.98437,-1.01562 0.5625,0 1.03125,0.20312 0.48438,0.20313 0.71875,0.53125 0.23438,0.32813 0.32813,0.76563 0.0469,0.29687 0.0469,1.03125 v 3.82812 h -1.04687 v -3.78125 q 0,-0.65625 -0.125,-0.96875 -0.125,-0.3125 -0.4375,-0.5 -0.3125,-0.20312 -0.73438,-0.20312 -0.67187,0 -1.17187,0.4375 -0.48438,0.42187 -0.48438,1.60937 v 3.40625 z m 7.64258,0 h -0.98438 v -8.59375 h 1.0625 v 3.0625 q 0.67188,-0.82812 1.70313,-0.82812 0.57812,0 1.07812,0.23437 0.51563,0.21875 0.84375,0.64063 0.34375,0.42187 0.53125,1.01562 0.1875,0.59375 0.1875,1.26563 0,1.59375 -0.79687,2.46875 -0.79688,0.875 -1.89063,0.875 -1.10937,0 -1.73437,-0.92188 z m -0.0156,-3.15625 q 0,1.10938 0.3125,1.60938 0.5,0.8125 1.34375,0.8125 0.6875,0 1.1875,-0.59375 0.51562,-0.59375 0.51562,-1.79688 0,-1.21875 -0.48437,-1.79687 -0.48438,-0.57813 -1.17188,-0.57813 -0.6875,0 -1.20312,0.60938 -0.5,0.59375 -0.5,1.73437 z m 4.73633,5.54688 v -0.76563 h 7 v 0.76563 z m 7.6582,-2.39063 v -6.21875 h 0.9375 v 0.875 q 0.6875,-1.01562 1.98437,-1.01562 0.5625,0 1.03125,0.20312 0.484378,0.20313 0.718748,0.53125 0.23438,0.32813 0.32813,0.76563 0.0469,0.29687 0.0469,1.03125 v 3.82812 h -1.046878 v -3.78125 q 0,-0.65625 -0.125,-0.96875 -0.125,-0.3125 -0.4375,-0.5 -0.3125,-0.20312 -0.73437,-0.20312 -0.67188,0 -1.17188,0.4375 -0.48437,0.42187 -0.48437,1.60937 v 3.40625 z m 6.283208,-3.10937 q 0,-1.73438 0.95312,-2.5625 0.79688,-0.6875 1.95313,-0.6875 1.28125,0 2.09375,0.84375 0.82812,0.82812 0.82812,2.3125 0,1.20312 -0.35937,1.89062 -0.35938,0.6875 -1.0625,1.07813 -0.6875,0.375 -1.5,0.375 -1.29688,0 -2.10938,-0.82813 -0.79687,-0.84375 -0.79687,-2.42187 z m 1.07812,0 q 0,1.1875 0.51563,1.78125 0.53125,0.59375 1.3125,0.59375 0.79687,0 1.3125,-0.59375 0.51562,-0.59375 0.51562,-1.8125 0,-1.15625 -0.53125,-1.75 -0.51562,-0.59375 -1.29687,-0.59375 -0.78125,0 -1.3125,0.59375 -0.51563,0.57812 -0.51563,1.78125 z m 10.01758,3.10937 v -0.78125 q -0.59375,0.92188 -1.73437,0.92188 -0.75,0 -1.375,-0.40625 -0.625,-0.42188 -0.96875,-1.15625 -0.34375,-0.73438 -0.34375,-1.6875 0,-0.92188 0.3125,-1.6875 0.3125,-0.76563 0.9375,-1.15625 0.625,-0.40625 1.39062,-0.40625 0.5625,0 1,0.23437 0.4375,0.23438 0.71875,0.60938 v -3.07813 h 1.04688 v 8.59375 z m -3.32812,-3.10937 q 0,1.20312 0.5,1.79687 0.5,0.57813 1.1875,0.57813 0.6875,0 1.17187,-0.5625 0.48438,-0.5625 0.48438,-1.71875 0,-1.28125 -0.5,-1.875 -0.48438,-0.59375 -1.20313,-0.59375 -0.70312,0 -1.17187,0.57812 -0.46875,0.5625 -0.46875,1.79688 z m 10.2207,1.10937 1.09375,0.125 q -0.25,0.95313 -0.95313,1.48438 -0.70312,0.53125 -1.78125,0.53125 -1.35937,0 -2.17187,-0.84375 -0.79688,-0.84375 -0.79688,-2.35938 0,-1.5625 0.8125,-2.42187 0.8125,-0.875 2.09375,-0.875 1.25,0 2.03125,0.84375 0.79688,0.84375 0.79688,2.39062 0,0.0937 0,0.28125 h -4.64063 q 0.0625,1.03125 0.57813,1.57813 0.51562,0.53125 1.29687,0.53125 0.57813,0 0.98438,-0.29688 0.42187,-0.3125 0.65625,-0.96875 z m -3.45313,-1.70312 h 3.46875 q -0.0625,-0.79688 -0.39062,-1.1875 -0.51563,-0.60938 -1.3125,-0.60938 -0.73438,0 -1.23438,0.48438 -0.48437,0.48437 -0.53125,1.3125 z m 5.45508,1.84375 1.03125,-0.15625 q 0.0937,0.625 0.48438,0.95312 0.40625,0.32813 1.14062,0.32813 0.71875,0 1.0625,-0.28125 0.35938,-0.29688 0.35938,-0.70313 0,-0.35937 -0.3125,-0.5625 -0.21875,-0.14062 -1.07813,-0.35937 -1.15625,-0.29688 -1.60937,-0.5 -0.4375,-0.21875 -0.67188,-0.59375 -0.23437,-0.375 -0.23437,-0.84375 0,-0.40625 0.1875,-0.76563 0.1875,-0.35937 0.51562,-0.59375 0.25,-0.17187 0.67188,-0.29687 0.42187,-0.125 0.92187,-0.125 0.71875,0 1.26563,0.21875 0.5625,0.20312 0.82812,0.5625 0.26563,0.35937 0.35938,0.95312 l -1.03125,0.14063 q -0.0625,-0.46875 -0.40625,-0.73438 -0.32813,-0.28125 -0.95313,-0.28125 -0.71875,0 -1.03125,0.25 -0.3125,0.23438 -0.3125,0.5625 0,0.20313 0.125,0.35938 0.14063,0.17187 0.40625,0.28125 0.15625,0.0625 0.9375,0.26562 1.125,0.3125 1.5625,0.5 0.4375,0.1875 0.6875,0.54688 0.25,0.35937 0.25,0.90625 0,0.53125 -0.3125,1 -0.29687,0.45312 -0.875,0.71875 -0.57812,0.25 -1.3125,0.25 -1.21875,0 -1.85937,-0.5 -0.625,-0.51563 -0.79688,-1.5 z"
-       fill-rule="nonzero"
-       id="path290" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 688.20019,75.514867 V 360.08705"
-       fill-rule="nonzero"
-       id="path292" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 816.64369,75.514867 V 360.08705"
-       fill-rule="nonzero"
-       id="path294" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,76.013557 h 129.441"
-       fill-rule="nonzero"
-       id="path296" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,111.21041 h 129.441"
-       fill-rule="nonzero"
-       id="path298" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,148.40726 h 129.441"
-       fill-rule="nonzero"
-       id="path300" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,183.60412 h 129.441"
-       fill-rule="nonzero"
-       id="path302" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,218.80095 h 129.441"
-       fill-rule="nonzero"
-       id="path304" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,253.99782 h 129.441"
-       fill-rule="nonzero"
-       id="path306" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,289.19466 h 129.441"
-       fill-rule="nonzero"
-       id="path308" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,324.3915 h 129.441"
-       fill-rule="nonzero"
-       id="path310" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.969816"
-       stroke-linecap="butt"
-       d="M 688.95796,420.60254 H 810.70284"
-       fill-rule="nonzero"
-       id="path310-0" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.9689"
-       stroke-linecap="butt"
-       d="M 689.29865,450.44943 H 810.81369"
-       fill-rule="nonzero"
-       id="path310-0-7" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 687.70149,359.58837 h 129.441"
-       fill-rule="nonzero"
-       id="path312" />
-    <path
-       fill="#000000"
-       d="m 734.99429,97.813557 v -9.54688 h 6.4375 v 1.125 h -5.1719 v 2.96875 h 4.4688 v 1.125 h -4.4688 v 4.32813 z m 12.657,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5157,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1563 q 0.062,1.14062 0.6407,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1093,-0.32813 0.4532,-0.34375 0.7188,-1.07812 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 6.5219,4.125 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1719 v -4.20313 q 0,-0.71875 -0.1406,-1.0625 -0.1406,-0.35937 -0.4844,-0.5625 -0.3437,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5468,0.46875 -0.5468,1.79688 v 3.78125 z m 11.9281,-2.53125 1.1562,0.15625 q -0.1875,1.1875 -0.9687,1.85937 -0.7813,0.67188 -1.9219,0.67188 -1.4062,0 -2.2812,-0.92188 -0.8594,-0.9375 -0.8594,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.7656,-0.42187 1.6562,-0.42187 1.125,0 1.8438,0.57812 0.7187,0.5625 0.9219,1.60938 l -1.1407,0.17187 q -0.1718,-0.70312 -0.5937,-1.04687 -0.4063,-0.35938 -0.9844,-0.35938 -0.8906,0 -1.4531,0.64063 -0.5469,0.64062 -0.5469,2 0,1.40625 0.5313,2.03125 0.5468,0.625 1.4062,0.625 0.6875,0 1.1406,-0.42188 0.4688,-0.42187 0.5938,-1.29687 z m 6.8828,0.3125 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5157,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1563 q 0.062,1.14062 0.6407,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1093,-0.32813 0.4532,-0.34375 0.7188,-1.07812 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5469,0.53125 -0.6094,1.4375 z"
-       fill-rule="nonzero"
-       id="path314" />
-    <path
-       fill="#000000"
-       d="m 710.41189,129.94791 1.2031,-0.10938 q 0.078,0.71875 0.3906,1.1875 0.3125,0.45313 0.9532,0.73438 0.6562,0.28125 1.4687,0.28125 0.7188,0 1.2656,-0.21875 0.5625,-0.21875 0.8282,-0.57813 0.2656,-0.375 0.2656,-0.82812 0,-0.45313 -0.2656,-0.78125 -0.25,-0.32813 -0.8438,-0.5625 -0.3906,-0.15625 -1.7031,-0.46875 -1.3125,-0.3125 -1.8438,-0.59375 -0.6718,-0.35938 -1.0156,-0.89063 -0.3281,-0.53125 -0.3281,-1.1875 0,-0.71875 0.4062,-1.34375 0.4063,-0.625 1.1875,-0.95312 0.7969,-0.32813 1.7657,-0.32813 1.0468,0 1.8593,0.34375 0.8125,0.34375 1.25,1.01563 0.4375,0.65625 0.4688,1.48437 l -1.2031,0.0937 q -0.1094,-0.90625 -0.6719,-1.35937 -0.5625,-0.46875 -1.6563,-0.46875 -1.1406,0 -1.6718,0.42187 -0.5157,0.42188 -0.5157,1.01563 0,0.51562 0.3594,0.84375 0.375,0.32812 1.9063,0.6875 1.5468,0.34375 2.1093,0.59375 0.8438,0.39062 1.2344,0.98437 0.3906,0.57813 0.3906,1.35938 0,0.75 -0.4375,1.4375 -0.4218,0.67187 -1.25,1.04687 -0.8125,0.35938 -1.8281,0.35938 -1.2969,0 -2.1719,-0.375 -0.875,-0.375 -1.375,-1.125 -0.5,-0.76563 -0.5312,-1.71875 z m 9.1553,3.0625 v -9.54688 h 1.1719 v 9.54688 z m 2.5393,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4218,0 2.3281,0.9375 0.9062,0.92187 0.9062,2.57812 0,1.32813 -0.4062,2.09375 -0.3906,0.76563 -1.1563,1.1875 -0.7656,0.42188 -1.6718,0.42188 -1.4532,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5782,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 7.9281,3.45313 -2.125,-6.90625 h 1.2188 l 1.0937,3.98437 0.4219,1.48438 q 0.016,-0.10938 0.3594,-1.42188 l 1.0937,-4.04687 h 1.2031 l 1.0313,4 0.3437,1.32812 0.4063,-1.34375 1.1719,-3.98437 h 1.1406 l -2.1563,6.90625 h -1.2187 l -1.0938,-4.14063 -0.2656,-1.17187 -1.4062,5.3125 z m 8.3439,2.65625 v -9.5625 h 1.0781 v 0.89062 q 0.375,-0.53125 0.8437,-0.78125 0.4844,-0.26562 1.1563,-0.26562 0.875,0 1.5469,0.45312 0.6875,0.45313 1.0312,1.28125 0.3438,0.82813 0.3438,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29687 -0.7188,0.45313 -1.5313,0.45313 -0.5781,0 -1.0468,-0.25 -0.4688,-0.25 -0.7657,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.5312,1.98438 0.5469,0.625 1.3125,0.625 0.7813,0 1.3438,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.5469,-1.96875 -0.5469,-0.67187 -1.2969,-0.67187 -0.75,0 -1.3281,0.70312 -0.5781,0.70313 -0.5781,2.03125 z m 10.8656,2.5625 q -0.6563,0.5625 -1.2657,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1406,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2188,-0.92187 0.2343,-0.42188 0.6093,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0469,-0.17188 1.4218,-0.17187 2.0937,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4531,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3906,0.28125 -0.5781,1.01563 l -1.1407,-0.15625 q 0.1563,-0.73438 0.5157,-1.1875 0.3593,-0.45313 1.0312,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2343,-0.85938 z m -0.094,-2.60937 q -0.6407,0.26562 -1.9219,0.4375 -0.7188,0.10937 -1.0156,0.25 -0.2969,0.125 -0.4688,0.375 -0.1562,0.25 -0.1562,0.54687 0,0.46875 0.3437,0.78125 0.3594,0.3125 1.0469,0.3125 0.6719,0 1.2031,-0.29687 0.5313,-0.29688 0.7813,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 5.5531,2.42187 0.1718,1.03125 q -0.5,0.10938 -0.8906,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4844,-0.53125 -0.1406,-0.32812 -0.1406,-1.39062 v -3.96875 h -0.8594 v -0.90625 h 0.8594 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1406,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1405,1.04688 v -9.54688 h 1.1719 v 3.42188 q 0.8281,-0.9375 2.0781,-0.9375 0.7656,0 1.3281,0.29687 0.5625,0.29688 0.8125,0.84375 0.25,0.53125 0.25,1.54688 v 4.375 h -1.1719 v -4.375 q 0,-0.89063 -0.3906,-1.28125 -0.375,-0.40625 -1.0781,-0.40625 -0.5156,0 -0.9844,0.28125 -0.4531,0.26562 -0.6562,0.73437 -0.1875,0.45313 -0.1875,1.26563 v 3.78125 z m 15.6311,-0.85938 q -0.6563,0.5625 -1.2656,0.79688 -0.5938,0.21875 -1.2813,0.21875 -1.1406,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2188,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8437,-0.39062 0.3438,-0.0781 1.0469,-0.17188 1.4219,-0.17187 2.0937,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4531,-0.39062 -1.3437,-0.39062 -0.8125,0 -1.2188,0.29687 -0.3906,0.28125 -0.5781,1.01563 l -1.1406,-0.15625 q 0.1562,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0312,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8907,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2657,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2187 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9219,0.4375 -0.7187,0.10937 -1.0156,0.25 -0.2969,0.125 -0.4688,0.375 -0.1562,0.25 -0.1562,0.54687 0,0.46875 0.3437,0.78125 0.3594,0.3125 1.0469,0.3125 0.6719,0 1.2031,-0.29687 0.5313,-0.29688 0.7813,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.975,3.46875 v -6.90625 h 1.0625 v 1.04687 q 0.4062,-0.73437 0.7343,-0.96875 0.3438,-0.23437 0.7657,-0.23437 0.5937,0 1.2031,0.375 l -0.4063,1.07812 q -0.4375,-0.25 -0.8593,-0.25 -0.3907,0 -0.7032,0.23438 -0.2968,0.23437 -0.4218,0.64062 -0.2032,0.625 -0.2032,1.35938 v 3.625 z m 9.1883,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 11.0374,3.26562 q -0.6562,0.5625 -1.2656,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1407,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2187,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0468,-0.17188 1.4219,-0.17187 2.0938,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4532,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3907,0.28125 -0.5782,1.01563 l -1.1406,-0.15625 q 0.1563,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0313,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9218,0.4375 -0.7188,0.10937 -1.0157,0.25 -0.2968,0.125 -0.4687,0.375 -0.1563,0.25 -0.1563,0.54687 0,0.46875 0.3438,0.78125 0.3594,0.3125 1.0469,0.3125 0.6718,0 1.2031,-0.29687 0.5312,-0.29688 0.7812,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z"
-       fill-rule="nonzero"
-       id="path316" />
-    <path
-       fill="#000000"
-       d="m 711.36619,166.86352 1.2656,0.3125 q -0.3906,1.5625 -1.4219,2.375 -1.0312,0.8125 -2.5312,0.8125 -1.5313,0 -2.5,-0.625 -0.9688,-0.625 -1.4844,-1.8125 -0.5,-1.1875 -0.5,-2.5625 0,-1.48438 0.5625,-2.59375 0.5781,-1.10938 1.625,-1.6875 1.0625,-0.57813 2.3281,-0.57813 1.4219,0 2.3907,0.73438 0.9843,0.71875 1.375,2.04687 l -1.25,0.29688 q -0.3282,-1.04688 -0.9688,-1.51563 -0.625,-0.48437 -1.5781,-0.48437 -1.0938,0 -1.8438,0.53125 -0.7343,0.53125 -1.0312,1.42187 -0.2969,0.875 -0.2969,1.82813 0,1.21875 0.3438,2.125 0.3593,0.90625 1.1093,1.35937 0.75,0.4375 1.625,0.4375 1.0625,0 1.7969,-0.60937 0.7344,-0.60938 0.9844,-1.8125 z m 2.2345,-0.10938 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7657,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 6.6469,3.45313 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1719 v -4.20313 q 0,-0.71875 -0.1406,-1.0625 -0.1407,-0.35937 -0.4844,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 9.9749,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8906,0.10938 -0.6406,0 -1,-0.20313 -0.3438,-0.20312 -0.4844,-0.53125 -0.1406,-0.32812 -0.1406,-1.39062 v -3.96875 h -0.8594 v -0.90625 h 0.8594 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1718 v 0.90625 h -1.1718 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1406,0.0781 0.4062,0.0781 0.2032,0 0.5157,-0.0469 z m 5.8749,-1.17187 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 5.7406,4.125 2.5312,-3.59375 -2.3437,-3.3125 h 1.4687 l 1.0625,1.60937 q 0.2969,0.46875 0.4844,0.78125 0.2812,-0.4375 0.5156,-0.76562 l 1.1719,-1.625 h 1.4062 l -2.3906,3.25 2.5625,3.65625 h -1.4375 l -1.4219,-2.14063 -0.375,-0.59375 -1.8125,2.73438 z m 10.0078,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8434,1.04688 v -6.90625 h 1.0469 v 0.96875 q 0.3281,-0.51563 0.8594,-0.8125 0.5468,-0.3125 1.2343,-0.3125 0.7813,0 1.2657,0.3125 0.4843,0.3125 0.6875,0.89062 0.8281,-1.20312 2.1406,-1.20312 1.0312,0 1.5781,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.1719 v -4.35938 q 0,-0.70312 -0.125,-1 -0.1093,-0.3125 -0.4062,-0.5 -0.2969,-0.1875 -0.7031,-0.1875 -0.7188,0 -1.2032,0.48438 -0.4843,0.48437 -0.4843,1.54687 v 4.01563 h -1.1719 v -4.48438 q 0,-0.78125 -0.2969,-1.17187 -0.2812,-0.39063 -0.9219,-0.39063 -0.5,0 -0.9218,0.26563 -0.4219,0.25 -0.6094,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 15.8369,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5157,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1563 q 0.062,1.14062 0.6407,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1093,-0.32813 0.4532,-0.34375 0.7188,-1.07812 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 6.5219,4.125 v -6.90625 h 1.0468 v 0.96875 q 0.3282,-0.51563 0.8594,-0.8125 0.5469,-0.3125 1.2344,-0.3125 0.7812,0 1.2656,0.3125 0.4844,0.3125 0.6875,0.89062 0.8281,-1.20312 2.1406,-1.20312 1.0313,0 1.5782,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.1719 v -4.35938 q 0,-0.70312 -0.125,-1 -0.1094,-0.3125 -0.4063,-0.5 -0.2968,-0.1875 -0.7031,-0.1875 -0.7187,0 -1.2031,0.48438 -0.4844,0.48437 -0.4844,1.54687 v 4.01563 h -1.1719 v -4.48438 q 0,-0.78125 -0.2968,-1.17187 -0.2813,-0.39063 -0.9219,-0.39063 -0.5,0 -0.9219,0.26563 -0.4219,0.25 -0.6094,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 10.6649,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7657,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 6.6313,3.45313 v -6.90625 h 1.0625 v 1.04687 q 0.4062,-0.73437 0.7343,-0.96875 0.3438,-0.23437 0.7657,-0.23437 0.5937,0 1.2031,0.375 l -0.4063,1.07812 q -0.4375,-0.25 -0.8593,-0.25 -0.3907,0 -0.7032,0.23438 -0.2968,0.23437 -0.4218,0.64062 -0.2032,0.625 -0.2032,1.35938 v 3.625 z m 4.407,2.65625 -0.125,-1.09375 q 0.375,0.10937 0.6563,0.10937 0.3906,0 0.625,-0.14062 0.2344,-0.125 0.3906,-0.35938 0.1094,-0.17187 0.3594,-0.875 0.031,-0.0937 0.1094,-0.28125 l -2.625,-6.92187 h 1.2656 l 1.4375,4 q 0.2812,0.76562 0.5,1.59375 0.2031,-0.79688 0.4687,-1.57813 l 1.4844,-4.01562 h 1.1719 l -2.625,7.01562 q -0.4219,1.14063 -0.6563,1.57813 -0.3125,0.57812 -0.7187,0.84375 -0.4063,0.28125 -0.9688,0.28125 -0.3281,0 -0.75,-0.15625 z"
-       fill-rule="nonzero"
-       id="path318" />
-    <path
-       fill="#000000"
-       d="m 712.39569,205.4041 v -9.54688 h 6.4375 v 1.125 h -5.1719 v 2.96875 h 4.4688 v 1.125 h -4.4688 v 4.32813 z m 12.4382,-0.85938 q -0.6562,0.5625 -1.2656,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1407,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2187,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0468,-0.17188 1.4219,-0.17187 2.0938,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4532,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3907,0.28125 -0.5782,1.01563 l -1.1406,-0.15625 q 0.1563,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0313,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9218,0.4375 -0.7188,0.10937 -1.0157,0.25 -0.2968,0.125 -0.4687,0.375 -0.1563,0.25 -0.1563,0.54687 0,0.46875 0.3438,0.78125 0.3594,0.3125 1.0469,0.3125 0.6718,0 1.2031,-0.29687 0.5312,-0.29688 0.7812,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.5219,1.40625 1.1562,-0.1875 q 0.1094,0.70312 0.5469,1.07812 0.4531,0.35938 1.25,0.35938 0.8125,0 1.2031,-0.32813 0.3907,-0.32812 0.3907,-0.76562 0,-0.39063 -0.3594,-0.625 -0.2344,-0.15625 -1.1875,-0.39063 -1.2969,-0.32812 -1.7969,-0.5625 -0.4844,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.2031,-0.84375 0.2188,-0.40625 0.5782,-0.67187 0.2812,-0.1875 0.75,-0.32813 0.4687,-0.14062 1.0156,-0.14062 0.8125,0 1.4219,0.23437 0.6093,0.23438 0.9062,0.64063 0.2969,0.39062 0.4063,1.0625 l -1.1407,0.15625 q -0.078,-0.53125 -0.4531,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.1562,0.26563 -0.3438,0.26562 -0.3438,0.625 0,0.23437 0.1406,0.42187 0.1563,0.1875 0.4532,0.3125 0.1718,0.0625 1.0312,0.29688 1.25,0.32812 1.7344,0.54687 0.5,0.20313 0.7812,0.60938 0.2813,0.40625 0.2813,1 0,0.59375 -0.3438,1.10937 -0.3437,0.51563 -1,0.79688 -0.6406,0.28125 -1.4531,0.28125 -1.3437,0 -2.0469,-0.5625 -0.7031,-0.5625 -0.9062,-1.65625 z m 9.6953,1.01562 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1405,3.70313 v -9.5625 h 1.0781 v 0.89062 q 0.375,-0.53125 0.8438,-0.78125 0.4843,-0.26562 1.1562,-0.26562 0.875,0 1.5469,0.45312 0.6875,0.45313 1.0312,1.28125 0.3438,0.82813 0.3438,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29687 -0.7187,0.45313 -1.5312,0.45313 -0.5782,0 -1.0469,-0.25 -0.4688,-0.25 -0.7656,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.5312,1.98438 0.5469,0.625 1.3125,0.625 0.7813,0 1.3438,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.5469,-1.96875 -0.5469,-0.67187 -1.2969,-0.67187 -0.75,0 -1.3281,0.70312 -0.5781,0.70313 -0.5781,2.03125 z m 10.8656,2.5625 q -0.6563,0.5625 -1.2656,0.79688 -0.5938,0.21875 -1.2813,0.21875 -1.1406,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2188,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8437,-0.39062 0.3438,-0.0781 1.0469,-0.17188 1.4219,-0.17187 2.0937,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4531,-0.39062 -1.3437,-0.39062 -0.8125,0 -1.2188,0.29687 -0.3906,0.28125 -0.5781,1.01563 l -1.1406,-0.15625 q 0.1562,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0312,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8907,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2657,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2187 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9219,0.4375 -0.7187,0.10937 -1.0156,0.25 -0.2969,0.125 -0.4688,0.375 -0.1562,0.25 -0.1562,0.54687 0,0.46875 0.3437,0.78125 0.3594,0.3125 1.0469,0.3125 0.6719,0 1.2031,-0.29687 0.5313,-0.29688 0.7813,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 5.5531,2.42187 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1405,1.04688 v -9.54688 h 1.1719 v 3.42188 q 0.8281,-0.9375 2.0781,-0.9375 0.7656,0 1.3281,0.29687 0.5625,0.29688 0.8125,0.84375 0.25,0.53125 0.25,1.54688 v 4.375 h -1.1719 v -4.375 q 0,-0.89063 -0.3906,-1.28125 -0.375,-0.40625 -1.0781,-0.40625 -0.5156,0 -0.9844,0.28125 -0.4531,0.26562 -0.6562,0.73437 -0.1875,0.45313 -0.1875,1.26563 v 3.78125 z m 15.631,-0.85938 q -0.6562,0.5625 -1.2656,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1407,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2187,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0468,-0.17188 1.4219,-0.17187 2.0938,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4532,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3907,0.28125 -0.5782,1.01563 l -1.1406,-0.15625 q 0.1563,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0313,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9218,0.4375 -0.7188,0.10937 -1.0157,0.25 -0.2968,0.125 -0.4687,0.375 -0.1563,0.25 -0.1563,0.54687 0,0.46875 0.3438,0.78125 0.3594,0.3125 1.0469,0.3125 0.6718,0 1.2031,-0.29687 0.5312,-0.29688 0.7812,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.975,3.46875 v -6.90625 h 1.0625 v 1.04687 q 0.4063,-0.73437 0.7344,-0.96875 0.3437,-0.23437 0.7656,-0.23437 0.5938,0 1.2031,0.375 l -0.4062,1.07812 q -0.4375,-0.25 -0.8594,-0.25 -0.3906,0 -0.7031,0.23438 -0.2969,0.23437 -0.4219,0.64062 -0.2031,0.625 -0.2031,1.35938 v 3.625 z m 9.1884,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 11.0374,3.26562 q -0.6562,0.5625 -1.2656,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1407,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2187,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0468,-0.17188 1.4219,-0.17187 2.0938,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4532,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3907,0.28125 -0.5782,1.01563 l -1.1406,-0.15625 q 0.1563,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0313,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9218,0.4375 -0.7188,0.10937 -1.0157,0.25 -0.2968,0.125 -0.4687,0.375 -0.1563,0.25 -0.1563,0.54687 0,0.46875 0.3438,0.78125 0.3594,0.3125 1.0469,0.3125 0.6718,0 1.2031,-0.29687 0.5312,-0.29688 0.7812,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z"
-       fill-rule="nonzero"
-       id="path320" />
-    <path
-       fill="#000000"
-       d="m 707.87269,240.60097 v -9.54689 h 1.2969 l 5.0156,7.50002 v -7.50002 h 1.2031 v 9.54689 h -1.2969 l -5.0156,-7.5 v 7.5 z m 14.2189,-2.21875 1.2032,0.14063 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57812 -1.9688,0.57812 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60937 0,-1.75 0.8907,-2.70313 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.1562 q 0.062,1.14063 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32812 0.4531,-0.34375 0.7187,-1.07813 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54687 -0.5469,0.53125 -0.6094,1.4375 z m 5.7406,4.125 2.5312,-3.59375 -2.3437,-3.3125 h 1.4687 l 1.0625,1.60938 q 0.2969,0.46875 0.4844,0.78125 0.2813,-0.4375 0.5156,-0.76563 l 1.1719,-1.625 h 1.4063 l -2.3907,3.25 2.5625,3.65625 h -1.4375 l -1.4218,-2.14062 -0.375,-0.59375 -1.8125,2.73437 z m 10.0078,-1.04687 0.1719,1.03125 q -0.5,0.10937 -0.8907,0.10937 -0.6406,0 -1,-0.20312 -0.3437,-0.20313 -0.4843,-0.53125 -0.1407,-0.32813 -0.1407,-1.39063 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70314 v 2.42189 h 1.1719 v 0.90625 h -1.1719 v 4.04688 q 0,0.5 0.047,0.64062 0.062,0.14063 0.2031,0.23438 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8434,1.04687 v -6.90625 h 1.0625 v 0.98438 q 0.75,-1.14063 2.1875,-1.14063 0.625,0 1.1563,0.21875 0.5312,0.21875 0.7812,0.59375 0.2657,0.35938 0.375,0.85938 0.062,0.32812 0.062,1.14062 v 4.25 h -1.1718 v -4.20312 q 0,-0.71875 -0.1407,-1.0625 -0.1406,-0.35938 -0.4843,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79687 v 3.78125 z m 6.975,-3.45312 q 0,-1.92188 1.0781,-2.84375 0.8907,-0.76563 2.1719,-0.76563 1.4219,0 2.3281,0.9375 0.9063,0.92188 0.9063,2.57813 0,1.32812 -0.4063,2.09375 -0.3906,0.76562 -1.1562,1.1875 -0.7656,0.42187 -1.6719,0.42187 -1.4531,0 -2.3594,-0.92187 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32812 0.5782,1.98437 0.5937,0.65625 1.4687,0.65625 0.875,0 1.4531,-0.65625 0.5782,-0.67187 0.5782,-2.03125 0,-1.28125 -0.5938,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4687,0.65625 -0.5782,0.65625 -0.5782,1.98438 z m 11.1313,3.45312 v -0.875 q -0.6563,1.03125 -1.9375,1.03125 -0.8125,0 -1.5157,-0.45312 -0.6875,-0.45313 -1.0781,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.3438,-1.875 0.3437,-0.84375 1.0312,-1.28125 0.7031,-0.45313 1.5469,-0.45313 0.625,0 1.1094,0.26563 0.5,0.25 0.7968,0.67187 v -3.42189 h 1.1719 v 9.54689 z m -3.7032,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.3282,0.65625 0.7656,0 1.2968,-0.625 0.5313,-0.625 0.5313,-1.90625 0,-1.42187 -0.5469,-2.07812 -0.5469,-0.67188 -1.3437,-0.67188 -0.7813,0 -1.3125,0.64063 -0.5157,0.625 -0.5157,2 z m 11.3656,1.23437 1.2032,0.14063 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57812 -1.9688,0.57812 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60937 0,-1.75 0.8907,-2.70313 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.1562 q 0.062,1.14063 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32812 0.4531,-0.34375 0.7187,-1.07813 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54687 -0.5469,0.53125 -0.6094,1.4375 z m 9.8967,-0.57812 q 0,-1.6875 0.3438,-2.71875 0.3593,-1.03125 1.0468,-1.59375 0.6875,-0.56252 1.7188,-0.56252 0.7812,0 1.3594,0.3125 0.5781,0.29689 0.9531,0.89064 0.375,0.57813 0.5937,1.42188 0.2188,0.82812 0.2188,2.25 0,1.67187 -0.3594,2.70312 -0.3437,1.03125 -1.0312,1.59375 -0.6719,0.5625 -1.7344,0.5625 -1.375,0 -2.1563,-0.98437 -0.9531,-1.1875 -0.9531,-3.875 z m 1.2031,0 q 0,2.34375 0.5469,3.125 0.5625,0.78125 1.3594,0.78125 0.8125,0 1.3594,-0.78125 0.5625,-0.78125 0.5625,-3.125 0,-2.35938 -0.5625,-3.125 -0.5469,-0.78125 -1.3594,-0.78125 -0.8125,0 -1.2969,0.6875 -0.6094,0.875 -0.6094,3.21875 z m 10.2405,7.35937 v -9.5625 h 1.0781 v 0.89063 q 0.375,-0.53125 0.8438,-0.78125 0.4844,-0.26563 1.1562,-0.26563 0.875,0 1.5469,0.45313 0.6875,0.45312 1.0313,1.28125 0.3437,0.82812 0.3437,1.82812 0,1.04688 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29688 -0.7187,0.45312 -1.5312,0.45312 -0.5781,0 -1.0469,-0.25 -0.4687,-0.25 -0.7656,-0.625 v 3.375 z m 1.0625,-6.07812 q 0,1.34375 0.5313,1.98437 0.5468,0.625 1.3125,0.625 0.7812,0 1.3437,-0.65625 0.5625,-0.65625 0.5625,-2.04687 0,-1.3125 -0.5469,-1.96875 -0.5468,-0.67188 -1.2968,-0.67188 -0.75,0 -1.3282,0.70313 -0.5781,0.70312 -0.5781,2.03125 z m 8.9125,2.375 0.1719,1.03125 q -0.5,0.10937 -0.8907,0.10937 -0.6406,0 -1,-0.20312 -0.3437,-0.20313 -0.4843,-0.53125 -0.1407,-0.32813 -0.1407,-1.39063 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70314 v 2.42189 h 1.1719 v 0.90625 h -1.1719 v 4.04688 q 0,0.5 0.047,0.64062 0.062,0.14063 0.2032,0.23438 0.1406,0.0781 0.4062,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1248,1.04687 v -6.90625 h 1.0625 v 1.04688 q 0.4063,-0.73438 0.7344,-0.96875 0.3437,-0.23438 0.7656,-0.23438 0.5938,0 1.2031,0.375 l -0.4062,1.07813 q -0.4375,-0.25 -0.8594,-0.25 -0.3906,0 -0.7031,0.23437 -0.2969,0.23438 -0.4219,0.64063 -0.2031,0.625 -0.2031,1.35937 v 3.625 z"
-       fill-rule="nonzero"
-       id="path322" />
-    <path
-       fill="#000000"
-       d="m 707.87269,275.7978 v -9.54688 h 1.2969 l 5.0156,7.5 v -7.5 h 1.2031 v 9.54688 h -1.2969 l -5.0156,-7.5 v 7.5 z m 14.2189,-2.21875 1.2032,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57813 -1.9688,0.57813 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60938 0,-1.75 0.8907,-2.70312 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 5.7406,4.125 2.5312,-3.59375 -2.3437,-3.3125 h 1.4687 l 1.0625,1.60937 q 0.2969,0.46875 0.4844,0.78125 0.2813,-0.4375 0.5156,-0.76562 l 1.1719,-1.625 h 1.4063 l -2.3907,3.25 2.5625,3.65625 h -1.4375 l -1.4218,-2.14063 -0.375,-0.59375 -1.8125,2.73438 z m 10.0078,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8434,1.04688 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1563,0.21875 0.5312,0.21875 0.7812,0.59375 0.2657,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1718 v -4.20313 q 0,-0.71875 -0.1407,-1.0625 -0.1406,-0.35937 -0.4843,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 6.975,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8907,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7656,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5782,1.98438 0.5937,0.65625 1.4687,0.65625 0.875,0 1.4531,-0.65625 0.5782,-0.67188 0.5782,-2.03125 0,-1.28125 -0.5938,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4687,0.65625 -0.5782,0.65625 -0.5782,1.98437 z m 11.1313,3.45313 v -0.875 q -0.6563,1.03125 -1.9375,1.03125 -0.8125,0 -1.5157,-0.45313 -0.6875,-0.45312 -1.0781,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.3438,-1.875 0.3437,-0.84375 1.0312,-1.28125 0.7031,-0.45312 1.5469,-0.45312 0.625,0 1.1094,0.26562 0.5,0.25 0.7968,0.67188 v -3.42188 h 1.1719 v 9.54688 z m -3.7032,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.3282,0.65625 0.7656,0 1.2968,-0.625 0.5313,-0.625 0.5313,-1.90625 0,-1.42188 -0.5469,-2.07813 -0.5469,-0.67187 -1.3437,-0.67187 -0.7813,0 -1.3125,0.64062 -0.5157,0.625 -0.5157,2 z m 11.3656,1.23438 1.2032,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57813 -1.9688,0.57813 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60938 0,-1.75 0.8907,-2.70312 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 14.3186,4.125 h -1.1719 v -7.46875 q -0.4219,0.40625 -1.1094,0.8125 -0.6875,0.40625 -1.2343,0.60937 v -1.14062 q 0.9843,-0.45313 1.7187,-1.10938 0.7344,-0.67187 1.0313,-1.28125 h 0.7656 z m 7.0217,2.65625 v -9.5625 h 1.0781 v 0.89062 q 0.375,-0.53125 0.8438,-0.78125 0.4844,-0.26562 1.1562,-0.26562 0.875,0 1.5469,0.45312 0.6875,0.45313 1.0313,1.28125 0.3437,0.82813 0.3437,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29687 -0.7187,0.45313 -1.5312,0.45313 -0.5781,0 -1.0469,-0.25 -0.4687,-0.25 -0.7656,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.5313,1.98438 0.5468,0.625 1.3125,0.625 0.7812,0 1.3437,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.5469,-1.96875 -0.5468,-0.67187 -1.2968,-0.67187 -0.75,0 -1.3282,0.70312 -0.5781,0.70313 -0.5781,2.03125 z m 8.9125,2.375 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2032,0.23437 0.1406,0.0781 0.4062,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1248,1.04688 v -6.90625 h 1.0625 v 1.04687 q 0.4063,-0.73437 0.7344,-0.96875 0.3437,-0.23437 0.7656,-0.23437 0.5938,0 1.2031,0.375 l -0.4062,1.07812 q -0.4375,-0.25 -0.8594,-0.25 -0.3906,0 -0.7031,0.23438 -0.2969,0.23437 -0.4219,0.64062 -0.2031,0.625 -0.2031,1.35938 v 3.625 z"
-       fill-rule="nonzero"
-       id="path324" />
-    <path
-       fill="#000000"
-       d="m 707.87269,310.99465 v -9.54688 h 1.2969 l 5.0156,7.5 v -7.5 h 1.2031 v 9.54688 h -1.2969 l -5.0156,-7.5 v 7.5 z m 14.2189,-2.21875 1.2032,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57813 -1.9688,0.57813 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60938 0,-1.75 0.8907,-2.70312 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 5.7406,4.125 2.5312,-3.59375 -2.3437,-3.3125 h 1.4687 l 1.0625,1.60937 q 0.2969,0.46875 0.4844,0.78125 0.2813,-0.4375 0.5156,-0.76562 l 1.1719,-1.625 h 1.4063 l -2.3907,3.25 2.5625,3.65625 h -1.4375 l -1.4218,-2.14063 -0.375,-0.59375 -1.8125,2.73438 z m 10.0078,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8434,1.04688 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1563,0.21875 0.5312,0.21875 0.7812,0.59375 0.2657,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1718 v -4.20313 q 0,-0.71875 -0.1407,-1.0625 -0.1406,-0.35937 -0.4843,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 6.975,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8907,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7656,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5782,1.98438 0.5937,0.65625 1.4687,0.65625 0.875,0 1.4531,-0.65625 0.5782,-0.67188 0.5782,-2.03125 0,-1.28125 -0.5938,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4687,0.65625 -0.5782,0.65625 -0.5782,1.98437 z m 11.1313,3.45313 v -0.875 q -0.6563,1.03125 -1.9375,1.03125 -0.8125,0 -1.5157,-0.45313 -0.6875,-0.45312 -1.0781,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.3438,-1.875 0.3437,-0.84375 1.0312,-1.28125 0.7031,-0.45312 1.5469,-0.45312 0.625,0 1.1094,0.26562 0.5,0.25 0.7968,0.67188 v -3.42188 h 1.1719 v 9.54688 z m -3.7032,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.3282,0.65625 0.7656,0 1.2968,-0.625 0.5313,-0.625 0.5313,-1.90625 0,-1.42188 -0.5469,-2.07813 -0.5469,-0.67187 -1.3437,-0.67187 -0.7813,0 -1.3125,0.64062 -0.5157,0.625 -0.5157,2 z m 11.3656,1.23438 1.2032,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57813 -1.9688,0.57813 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60938 0,-1.75 0.8907,-2.70312 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 16.053,3 v 1.125 h -6.2969 q -0.016,-0.42188 0.1406,-0.8125 0.2344,-0.64063 0.7656,-1.26563 0.5313,-0.625 1.5313,-1.45312 1.5625,-1.26563 2.1094,-2.01563 0.5468,-0.75 0.5468,-1.40625 0,-0.70312 -0.5,-1.17187 -0.5,-0.48438 -1.2968,-0.48438 -0.8594,0 -1.375,0.51563 -0.5,0.5 -0.5,1.39062 l -1.2032,-0.10937 q 0.125,-1.35938 0.9219,-2.0625 0.8125,-0.70313 2.1719,-0.70313 1.375,0 2.1719,0.76563 0.8125,0.75 0.8125,1.875 0,0.57812 -0.2344,1.14062 -0.2344,0.54688 -0.7813,1.15625 -0.5468,0.60938 -1.8125,1.67188 -1.0468,0.89062 -1.3593,1.21875 -0.2969,0.3125 -0.4844,0.625 z m 5.2873,3.78125 v -9.5625 h 1.0781 v 0.89062 q 0.375,-0.53125 0.8438,-0.78125 0.4844,-0.26562 1.1562,-0.26562 0.875,0 1.5469,0.45312 0.6875,0.45313 1.0313,1.28125 0.3437,0.82813 0.3437,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29687 -0.7187,0.45313 -1.5312,0.45313 -0.5781,0 -1.0469,-0.25 -0.4687,-0.25 -0.7656,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.5313,1.98438 0.5468,0.625 1.3125,0.625 0.7812,0 1.3437,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.5469,-1.96875 -0.5468,-0.67187 -1.2968,-0.67187 -0.75,0 -1.3282,0.70312 -0.5781,0.70313 -0.5781,2.03125 z m 8.9125,2.375 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2032,0.23437 0.1406,0.0781 0.4062,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1248,1.04688 v -6.90625 h 1.0625 v 1.04687 q 0.4063,-0.73437 0.7344,-0.96875 0.3437,-0.23437 0.7656,-0.23437 0.5938,0 1.2031,0.375 l -0.4062,1.07812 q -0.4375,-0.25 -0.8594,-0.25 -0.3906,0 -0.7031,0.23438 -0.2969,0.23437 -0.4219,0.64062 -0.2031,0.625 -0.2031,1.35938 v 3.625 z"
-       fill-rule="nonzero"
-       id="path326" />
-    <path
-       fill="#000000"
-       d="m 706.76639,346.19152 v -9.54687 h 1.2968 l 5.0157,7.5 v -7.5 h 1.2031 v 9.54687 h -1.2969 l -5.0156,-7.5 v 7.5 z m 14.2188,-2.21875 1.2032,0.14063 q -0.2813,1.0625 -1.0625,1.65625 -0.7657,0.57812 -1.9688,0.57812 -1.5156,0 -2.4062,-0.9375 -0.8907,-0.9375 -0.8907,-2.60937 0,-1.75 0.8907,-2.70313 0.9062,-0.96875 2.3437,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.1562 q 0.062,1.14063 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32812 0.4531,-0.34375 0.7187,-1.07813 z m -3.8437,-1.90625 h 3.8594 q -0.078,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.4532,-0.6875 -0.8125,0 -1.3593,0.54687 -0.5469,0.53125 -0.6094,1.4375 z m 5.7406,4.125 2.5312,-3.59375 -2.3437,-3.3125 h 1.4687 l 1.0625,1.60938 q 0.2969,0.46875 0.4844,0.78125 0.2812,-0.4375 0.5156,-0.76563 l 1.1719,-1.625 h 1.4062 l -2.3906,3.25 2.5625,3.65625 h -1.4375 l -1.4219,-2.14062 -0.375,-0.59375 -1.8125,2.73437 z m 10.0078,-1.04687 0.1719,1.03125 q -0.5,0.10937 -0.8907,0.10937 -0.6406,0 -1,-0.20312 -0.3437,-0.20313 -0.4843,-0.53125 -0.1407,-0.32813 -0.1407,-1.39063 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70312 v 2.42187 h 1.1719 v 0.90625 h -1.1719 v 4.04688 q 0,0.5 0.047,0.64062 0.062,0.14063 0.2031,0.23438 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8435,1.04687 v -6.90625 h 1.0625 v 0.98438 q 0.75,-1.14063 2.1875,-1.14063 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35938 0.375,0.85938 0.062,0.32812 0.062,1.14062 v 4.25 h -1.1719 v -4.20312 q 0,-0.71875 -0.1406,-1.0625 -0.1406,-0.35938 -0.4844,-0.5625 -0.3437,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5468,0.46875 -0.5468,1.79687 v 3.78125 z m 6.975,-3.45312 q 0,-1.92188 1.0781,-2.84375 0.8906,-0.76563 2.1719,-0.76563 1.4218,0 2.3281,0.9375 0.9062,0.92188 0.9062,2.57813 0,1.32812 -0.4062,2.09375 -0.3906,0.76562 -1.1563,1.1875 -0.7656,0.42187 -1.6718,0.42187 -1.4532,0 -2.3594,-0.92187 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32812 0.5781,1.98437 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67187 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5782,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98438 z m 11.1312,3.45312 v -0.875 q -0.6562,1.03125 -1.9375,1.03125 -0.8125,0 -1.5156,-0.45312 -0.6875,-0.45313 -1.0781,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.3437,-1.875 0.3438,-0.84375 1.0313,-1.28125 0.7031,-0.45313 1.5468,-0.45313 0.625,0 1.1094,0.26563 0.5,0.25 0.7969,0.67187 v -3.42187 h 1.1719 v 9.54687 z m -3.7031,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.3281,0.65625 0.7656,0 1.2969,-0.625 0.5312,-0.625 0.5312,-1.90625 0,-1.42187 -0.5468,-2.07812 -0.5469,-0.67188 -1.3438,-0.67188 -0.7812,0 -1.3125,0.64063 -0.5156,0.625 -0.5156,2 z m 11.3656,1.23437 1.2031,0.14063 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57812 -1.9687,0.57812 -1.5157,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60937 0,-1.75 0.8906,-2.70313 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.1563 q 0.062,1.14063 0.6407,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1093,-0.32812 0.4532,-0.34375 0.7188,-1.07813 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54687 -0.5469,0.53125 -0.6094,1.4375 z m 10.3655,4.125 v -9.54687 h 1.2969 l 5.0156,7.5 v -7.5 h 1.2031 v 9.54687 h -1.2968 l -5.0157,-7.5 v 7.5 z m 13.1875,2.65625 v -9.5625 h 1.0781 v 0.89063 q 0.375,-0.53125 0.8438,-0.78125 0.4844,-0.26563 1.1562,-0.26563 0.875,0 1.5469,0.45313 0.6875,0.45312 1.0313,1.28125 0.3437,0.82812 0.3437,1.82812 0,1.04688 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29688 -0.7187,0.45312 -1.5312,0.45312 -0.5781,0 -1.0469,-0.25 -0.4687,-0.25 -0.7656,-0.625 v 3.375 z m 1.0625,-6.07812 q 0,1.34375 0.5313,1.98437 0.5468,0.625 1.3125,0.625 0.7812,0 1.3437,-0.65625 0.5625,-0.65625 0.5625,-2.04687 0,-1.3125 -0.5469,-1.96875 -0.5468,-0.67188 -1.2968,-0.67188 -0.75,0 -1.3282,0.70313 -0.5781,0.70312 -0.5781,2.03125 z m 8.9125,2.375 0.1719,1.03125 q -0.5,0.10937 -0.8906,0.10937 -0.6407,0 -1,-0.20312 -0.3438,-0.20313 -0.4844,-0.53125 -0.1406,-0.32813 -0.1406,-1.39063 v -3.96875 h -0.8594 v -0.90625 h 0.8594 v -1.71875 l 1.1718,-0.70312 v 2.42187 h 1.1719 v 0.90625 h -1.1719 v 4.04688 q 0,0.5 0.047,0.64062 0.062,0.14063 0.2031,0.23438 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1249,1.04687 v -6.90625 h 1.0625 v 1.04688 q 0.4062,-0.73438 0.7343,-0.96875 0.3438,-0.23438 0.7657,-0.23438 0.5937,0 1.2031,0.375 l -0.4063,1.07813 q -0.4375,-0.25 -0.8593,-0.25 -0.3907,0 -0.7032,0.23437 -0.2968,0.23438 -0.4218,0.64063 -0.2032,0.625 -0.2032,1.35937 v 3.625 z"
-       fill-rule="nonzero"
-       id="path328" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 637.25669,45.783637 h 230.3306 v 27.46457 h -230.3306 z"
-       fill-rule="evenodd"
-       id="path330" />
-    <path
-       fill="#000000"
-       d="m 661.78699,67.583637 v -6.90625 h 1.0625 v 1.04687 q 0.4063,-0.73437 0.7344,-0.96875 0.3438,-0.23437 0.7656,-0.23437 0.5938,0 1.2032,0.375 l -0.4063,1.07812 q -0.4375,-0.25 -0.8594,-0.25 -0.3906,0 -0.7031,0.23438 -0.2969,0.23437 -0.4219,0.64062 -0.2031,0.625 -0.2031,1.35938 v 3.625 z m 7.0166,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 5.8748,-1.17187 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 5.4437,6.78125 v -0.85938 h 7.7656 v 0.85938 z m 8.4906,-2.65625 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1719 v -4.20313 q 0,-0.71875 -0.1406,-1.0625 -0.1407,-0.35937 -0.4844,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 6.975,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4218,0 2.3281,0.9375 0.9062,0.92187 0.9062,2.57812 0,1.32813 -0.4062,2.09375 -0.3906,0.76563 -1.1563,1.1875 -0.7656,0.42188 -1.6718,0.42188 -1.4532,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5782,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 11.1312,3.45313 v -0.875 q -0.6563,1.03125 -1.9375,1.03125 -0.8125,0 -1.5156,-0.45313 -0.6875,-0.45312 -1.0782,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.3438,-1.875 0.3437,-0.84375 1.0312,-1.28125 0.7032,-0.45312 1.5469,-0.45312 0.625,0 1.1094,0.26562 0.5,0.25 0.7969,0.67188 v -3.42188 h 1.1718 v 9.54688 z m -3.7031,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.3281,0.65625 0.7656,0 1.2969,-0.625 0.5312,-0.625 0.5312,-1.90625 0,-1.42188 -0.5469,-2.07813 -0.5468,-0.67187 -1.3437,-0.67187 -0.7813,0 -1.3125,0.64062 -0.5156,0.625 -0.5156,2 z m 11.3656,1.23438 1.2031,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9688,0.57813 -1.5156,0 -2.4062,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9062,-0.96875 2.3437,-0.96875 1.3907,0 2.2657,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1563 q 0.062,1.14062 0.6406,1.75 0.5782,0.59375 1.4375,0.59375 0.6563,0 1.1094,-0.32813 0.4531,-0.34375 0.7188,-1.07812 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 9.7874,0.67187 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7657,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 7.725,3.45313 h -1.0781 v -9.54688 h 1.1718 v 3.40625 q 0.7344,-0.92187 1.8907,-0.92187 0.6406,0 1.2031,0.26562 0.5781,0.25 0.9375,0.71875 0.375,0.45313 0.5781,1.10938 0.2031,0.65625 0.2031,1.40625 0,1.78125 -0.875,2.75 -0.875,0.96875 -2.1093,0.96875 -1.2188,0 -1.9219,-1.01563 z m 0,-3.5 q 0,1.23437 0.3281,1.78125 0.5625,0.90625 1.5,0.90625 0.7656,0 1.3281,-0.65625 0.5625,-0.67188 0.5625,-2 0,-1.34375 -0.5468,-1.98438 -0.5313,-0.65625 -1.2969,-0.65625 -0.7656,0 -1.3281,0.67188 -0.5469,0.67187 -0.5469,1.9375 z m 6.3343,-4.6875 v -1.35938 h 1.1719 v 1.35938 z m -1.4843,10.875 0.2187,-1 q 0.3594,0.0937 0.5469,0.0937 0.3594,0 0.5312,-0.25 0.1875,-0.23438 0.1875,-1.1875 v -7.25 h 1.1719 v 7.28125 q 0,1.28125 -0.3281,1.78125 -0.4375,0.65625 -1.4063,0.65625 -0.4843,0 -0.9218,-0.125 z m 9.1798,-4.90625 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 11.0374,1.59375 1.1563,0.15625 q -0.1875,1.1875 -0.9688,1.85937 -0.7812,0.67188 -1.9218,0.67188 -1.4063,0 -2.2813,-0.92188 -0.8594,-0.9375 -0.8594,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.7657,-0.42187 1.6563,-0.42187 1.125,0 1.8437,0.57812 0.7188,0.5625 0.9219,1.60938 l -1.1406,0.17187 q -0.1719,-0.70312 -0.5938,-1.04687 -0.4062,-0.35938 -0.9843,-0.35938 -0.8907,0 -1.4532,0.64063 -0.5468,0.64062 -0.5468,2 0,1.40625 0.5312,2.03125 0.5469,0.625 1.4063,0.625 0.6875,0 1.1406,-0.42188 0.4687,-0.42187 0.5937,-1.29687 z m 4.711,1.48437 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 4.8434,1.04688 v -6.90625 h 1.0469 v 0.96875 q 0.3281,-0.51563 0.8594,-0.8125 0.5469,-0.3125 1.2344,-0.3125 0.7812,0 1.2656,0.3125 0.4844,0.3125 0.6875,0.89062 0.8281,-1.20312 2.1406,-1.20312 1.0313,0 1.5781,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.1718 v -4.35938 q 0,-0.70312 -0.125,-1 -0.1094,-0.3125 -0.4063,-0.5 -0.2969,-0.1875 -0.7031,-0.1875 -0.7188,0 -1.2031,0.48438 -0.4844,0.48437 -0.4844,1.54687 v 4.01563 h -1.1719 v -4.48438 q 0,-0.78125 -0.2969,-1.17187 -0.2812,-0.39063 -0.9218,-0.39063 -0.5,0 -0.9219,0.26563 -0.4219,0.25 -0.6094,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 15.8369,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5157,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1563 q 0.062,1.14062 0.6407,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1093,-0.32813 0.4532,-0.34375 0.7188,-1.07812 z m -3.8438,-1.90625 h 3.8594 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5469,0.53125 -0.6094,1.4375 z m 6.5219,4.125 v -6.90625 h 1.0469 v 0.96875 q 0.3281,-0.51563 0.8593,-0.8125 0.5469,-0.3125 1.2344,-0.3125 0.7813,0 1.2656,0.3125 0.4844,0.3125 0.6875,0.89062 0.8282,-1.20312 2.1407,-1.20312 1.0312,0 1.5781,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.1719 v -4.35938 q 0,-0.70312 -0.125,-1 -0.1094,-0.3125 -0.4062,-0.5 -0.2969,-0.1875 -0.7032,-0.1875 -0.7187,0 -1.2031,0.48438 -0.4844,0.48437 -0.4844,1.54687 v 4.01563 h -1.1718 v -4.48438 q 0,-0.78125 -0.2969,-1.17187 -0.2813,-0.39063 -0.9219,-0.39063 -0.5,0 -0.9219,0.26563 -0.4218,0.25 -0.6093,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 10.6649,-3.45313 q 0,-1.92187 1.0781,-2.84375 0.8907,-0.76562 2.1719,-0.76562 1.4219,0 2.3281,0.9375 0.9063,0.92187 0.9063,2.57812 0,1.32813 -0.4063,2.09375 -0.3906,0.76563 -1.1562,1.1875 -0.7656,0.42188 -1.6719,0.42188 -1.4531,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5782,1.98438 0.5937,0.65625 1.4687,0.65625 0.875,0 1.4531,-0.65625 0.5782,-0.67188 0.5782,-2.03125 0,-1.28125 -0.5938,-1.9375 -0.5781,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4687,0.65625 -0.5782,0.65625 -0.5782,1.98437 z m 6.6313,3.45313 v -6.90625 h 1.0625 v 1.04687 q 0.4062,-0.73437 0.7343,-0.96875 0.3438,-0.23437 0.7657,-0.23437 0.5937,0 1.2031,0.375 l -0.4063,1.07812 q -0.4375,-0.25 -0.8593,-0.25 -0.3907,0 -0.7032,0.23438 -0.2968,0.23437 -0.4218,0.64062 -0.2032,0.625 -0.2032,1.35938 v 3.625 z m 4.4071,2.65625 -0.125,-1.09375 q 0.375,0.10937 0.6562,0.10937 0.3906,0 0.625,-0.14062 0.2344,-0.125 0.3906,-0.35938 0.1094,-0.17187 0.3594,-0.875 0.031,-0.0937 0.1094,-0.28125 l -2.625,-6.92187 h 1.2656 l 1.4375,4 q 0.2813,0.76562 0.5,1.59375 0.2031,-0.79688 0.4688,-1.57813 l 1.4843,-4.01562 h 1.1719 l -2.625,7.01562 q -0.4219,1.14063 -0.6562,1.57813 -0.3125,0.57812 -0.7188,0.84375 -0.4062,0.28125 -0.9687,0.28125 -0.3282,0 -0.75,-0.15625 z m 10.3983,-2.65625 v -9.54688 h 1.1718 v 9.54688 z m 7.4923,-0.85938 q -0.6563,0.5625 -1.2656,0.79688 -0.5938,0.21875 -1.2813,0.21875 -1.1406,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2188,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8437,-0.39062 0.3438,-0.0781 1.0469,-0.17188 1.4219,-0.17187 2.0937,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4531,-0.39062 -1.3437,-0.39062 -0.8125,0 -1.2188,0.29687 -0.3906,0.28125 -0.5781,1.01563 l -1.1406,-0.15625 q 0.1562,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0312,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8907,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2657,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2187 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9219,0.4375 -0.7187,0.10937 -1.0156,0.25 -0.2969,0.125 -0.4688,0.375 -0.1562,0.25 -0.1562,0.54687 0,0.46875 0.3437,0.78125 0.3594,0.3125 1.0469,0.3125 0.6719,0 1.2031,-0.29687 0.5313,-0.29688 0.7813,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.9437,6.125 -0.125,-1.09375 q 0.375,0.10937 0.6563,0.10937 0.3906,0 0.625,-0.14062 0.2343,-0.125 0.3906,-0.35938 0.1094,-0.17187 0.3594,-0.875 0.031,-0.0937 0.1093,-0.28125 l -2.625,-6.92187 h 1.2657 l 1.4375,4 q 0.2812,0.76562 0.5,1.59375 0.2031,-0.79688 0.4687,-1.57813 l 1.4844,-4.01562 h 1.1719 l -2.625,7.01562 q -0.4219,1.14063 -0.6563,1.57813 -0.3125,0.57812 -0.7187,0.84375 -0.4063,0.28125 -0.9688,0.28125 -0.3281,0 -0.75,-0.15625 z m 6.2735,-6.10938 q 0,-1.92187 1.0781,-2.84375 0.8906,-0.76562 2.1719,-0.76562 1.4218,0 2.3281,0.9375 0.9062,0.92187 0.9062,2.57812 0,1.32813 -0.4062,2.09375 -0.3906,0.76563 -1.1563,1.1875 -0.7656,0.42188 -1.6718,0.42188 -1.4532,0 -2.3594,-0.92188 -0.8906,-0.9375 -0.8906,-2.6875 z m 1.2031,0 q 0,1.32813 0.5781,1.98438 0.5938,0.65625 1.4688,0.65625 0.875,0 1.4531,-0.65625 0.5781,-0.67188 0.5781,-2.03125 0,-1.28125 -0.5937,-1.9375 -0.5782,-0.65625 -1.4375,-0.65625 -0.875,0 -1.4688,0.65625 -0.5781,0.65625 -0.5781,1.98437 z m 11.1781,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.6094,0 -1.1406,-0.23438 -0.5313,-0.23437 -0.7969,-0.57812 -0.25,-0.35938 -0.3594,-0.875 -0.062,-0.34375 -0.062,-1.09375 v -4.28125 h 1.1719 v 3.82812 q 0,0.92188 0.062,1.23438 0.1094,0.46875 0.4687,0.73437 0.3594,0.25 0.8907,0.25 0.5156,0 0.9843,-0.26562 0.4688,-0.26563 0.6563,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.1719 v 6.90625 z m 5.4437,-1.04688 0.1719,1.03125 q -0.5,0.10938 -0.8906,0.10938 -0.6407,0 -1,-0.20313 -0.3438,-0.20312 -0.4844,-0.53125 -0.1406,-0.32812 -0.1406,-1.39062 v -3.96875 h -0.8594 v -0.90625 h 0.8594 v -1.71875 l 1.1718,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2032,0.23437 0.1406,0.0781 0.4062,0.0781 0.2031,0 0.5156,-0.0469 z"
-       fill-rule="nonzero"
-       id="path332"
-       style="fill:#008033" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 816.20809,219.40832 c 7.1841,0 13.0079,2.83072 13.0079,6.3226 v 53.98471 c 0,3.49188 5.8238,6.3226 13.0078,6.3226 v 0 c -7.184,0 -13.0078,2.83072 -13.0078,6.3226 v 53.98471 0 c 0,3.49189 -5.8238,6.32261 -13.0079,6.32261 z"
-       fill-rule="evenodd"
-       id="path334" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 816.20809,219.40832 c 7.1841,0 13.0079,2.83072 13.0079,6.3226 v 53.98471 c 0,3.49188 5.8238,6.3226 13.0078,6.3226 v 0 c -7.184,0 -13.0078,2.83072 -13.0078,6.3226 v 53.98471 0 c 0,3.49189 -5.8238,6.32261 -13.0079,6.32261"
-       fill-rule="evenodd"
-       id="path336" />
-    <path
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       d="m 816.20809,219.40832 c 7.1841,0 13.0079,2.83072 13.0079,6.3226 v 53.98471 c 0,3.49188 5.8238,6.3226 13.0078,6.3226 v 0 c -7.184,0 -13.0078,2.83072 -13.0078,6.3226 v 53.98471 0 c 0,3.49189 -5.8238,6.32261 -13.0079,6.32261"
-       fill-rule="evenodd"
-       id="path338"
-       style="fill:none" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 823.16869,253.99886 h 99.4015 v 27.46457 h -99.4015 z"
-       fill-rule="evenodd"
-       id="path340" />
-    <path
-       fill="#000000"
-       d="m 832.96559,274.51885 v -6.21875 h 0.9375 v 0.875 q 0.6875,-1.01563 1.9844,-1.01563 0.5625,0 1.0312,0.20313 0.4844,0.20312 0.7188,0.53125 0.2343,0.32812 0.3281,0.76562 0.047,0.29688 0.047,1.03125 v 3.82813 h -1.0469 v -3.78125 q 0,-0.65625 -0.125,-0.96875 -0.125,-0.3125 -0.4375,-0.5 -0.3125,-0.20313 -0.7344,-0.20313 -0.6718,0 -1.1718,0.4375 -0.4844,0.42188 -0.4844,1.60938 v 3.40625 z m 7.6426,0 h -0.9844 v -8.59375 h 1.0625 v 3.0625 q 0.6719,-0.82813 1.7031,-0.82813 0.5781,0 1.0781,0.23438 0.5157,0.21875 0.8438,0.64062 0.3437,0.42188 0.5312,1.01563 0.1875,0.59375 0.1875,1.26562 0,1.59375 -0.7968,2.46875 -0.7969,0.875 -1.8907,0.875 -1.1093,0 -1.7343,-0.92187 z m -0.016,-3.15625 q 0,1.10937 0.3125,1.60937 0.5,0.8125 1.3437,0.8125 0.6875,0 1.1875,-0.59375 0.5157,-0.59375 0.5157,-1.79687 0,-1.21875 -0.4844,-1.79688 -0.4844,-0.57812 -1.1719,-0.57812 -0.6875,0 -1.2031,0.60937 -0.5,0.59375 -0.5,1.73438 z m 4.7363,5.54687 v -0.76562 h 7 v 0.76562 z m 11.9082,-4.39062 1.0938,0.125 q -0.25,0.95312 -0.9532,1.48437 -0.7031,0.53125 -1.7812,0.53125 -1.3594,0 -2.1719,-0.84375 -0.7969,-0.84375 -0.7969,-2.35937 0,-1.5625 0.8125,-2.42188 0.8125,-0.875 2.0938,-0.875 1.25,0 2.0312,0.84375 0.7969,0.84375 0.7969,2.39063 0,0.0937 0,0.28125 h -4.6406 q 0.062,1.03125 0.5781,1.57812 0.5156,0.53125 1.2969,0.53125 0.5781,0 0.9844,-0.29687 0.4218,-0.3125 0.6562,-0.96875 z m -3.4531,-1.70313 h 3.4687 q -0.062,-0.79687 -0.3906,-1.1875 -0.5156,-0.60937 -1.3125,-0.60937 -0.7344,0 -1.2344,0.48437 -0.4843,0.48438 -0.5312,1.3125 z m 9.9082,3.70313 v -0.78125 q -0.5938,0.92187 -1.7344,0.92187 -0.75,0 -1.375,-0.40625 -0.625,-0.42187 -0.9687,-1.15625 -0.3438,-0.73437 -0.3438,-1.6875 0,-0.92187 0.3125,-1.6875 0.3125,-0.76562 0.9375,-1.15625 0.625,-0.40625 1.3906,-0.40625 0.5625,0 1,0.23438 0.4375,0.23437 0.7188,0.60937 v -3.07812 h 1.0469 v 8.59375 z m -3.3281,-3.10938 q 0,1.20313 0.5,1.79688 0.5,0.57812 1.1875,0.57812 0.6875,0 1.1718,-0.5625 0.4844,-0.5625 0.4844,-1.71875 0,-1.28125 -0.5,-1.875 -0.4844,-0.59375 -1.2031,-0.59375 -0.7031,0 -1.1719,0.57813 -0.4687,0.5625 -0.4687,1.79687 z m 5.7675,3.625 1.0313,0.15625 q 0.062,0.46875 0.3594,0.6875 0.3906,0.29688 1.0625,0.29688 0.7343,0 1.125,-0.29688 0.4062,-0.29687 0.5468,-0.8125 0.094,-0.32812 0.078,-1.35937 -0.6875,0.8125 -1.7187,0.8125 -1.2813,0 -1.9844,-0.92188 -0.7031,-0.9375 -0.7031,-2.21875 0,-0.89062 0.3125,-1.64062 0.3281,-0.76563 0.9375,-1.17188 0.6093,-0.40625 1.4375,-0.40625 1.1093,0 1.8281,0.89063 v -0.75 h 0.9687 v 5.375 q 0,1.45312 -0.2968,2.0625 -0.2969,0.60937 -0.9375,0.95312 -0.6407,0.35938 -1.5782,0.35938 -1.1093,0 -1.7968,-0.5 -0.6875,-0.5 -0.6719,-1.51563 z m 0.875,-3.73437 q 0,1.21875 0.4844,1.78125 0.4844,0.5625 1.2188,0.5625 0.7343,0 1.2187,-0.5625 0.5,-0.5625 0.5,-1.75 0,-1.14063 -0.5156,-1.71875 -0.5,-0.57813 -1.2188,-0.57813 -0.7031,0 -1.2031,0.57813 -0.4844,0.5625 -0.4844,1.6875 z m 10.252,1.21875 1.0937,0.125 q -0.25,0.95312 -0.9531,1.48437 -0.7031,0.53125 -1.7812,0.53125 -1.3594,0 -2.1719,-0.84375 -0.7969,-0.84375 -0.7969,-2.35937 0,-1.5625 0.8125,-2.42188 0.8125,-0.875 2.0938,-0.875 1.25,0 2.0312,0.84375 0.7969,0.84375 0.7969,2.39063 0,0.0937 0,0.28125 h -4.6406 q 0.062,1.03125 0.5781,1.57812 0.5156,0.53125 1.2969,0.53125 0.5781,0 0.9843,-0.29687 0.4219,-0.3125 0.6563,-0.96875 z m -3.4531,-1.70313 h 3.4687 q -0.062,-0.79687 -0.3906,-1.1875 -0.5156,-0.60937 -1.3125,-0.60937 -0.7344,0 -1.2344,0.48437 -0.4844,0.48438 -0.5312,1.3125 z m 5.455,1.84375 1.0313,-0.15625 q 0.094,0.625 0.4844,0.95313 0.4062,0.32812 1.1406,0.32812 0.7187,0 1.0625,-0.28125 0.3594,-0.29687 0.3594,-0.70312 0,-0.35938 -0.3125,-0.5625 -0.2188,-0.14063 -1.0782,-0.35938 -1.1562,-0.29687 -1.6093,-0.5 -0.4375,-0.21875 -0.6719,-0.59375 -0.2344,-0.375 -0.2344,-0.84375 0,-0.40625 0.1875,-0.76562 0.1875,-0.35938 0.5156,-0.59375 0.25,-0.17188 0.6719,-0.29688 0.4219,-0.125 0.9219,-0.125 0.7187,0 1.2656,0.21875 0.5625,0.20313 0.8281,0.5625 0.2657,0.35938 0.3594,0.95313 l -1.0312,0.14062 q -0.062,-0.46875 -0.4063,-0.73437 -0.3281,-0.28125 -0.9531,-0.28125 -0.7188,0 -1.0313,0.25 -0.3125,0.23437 -0.3125,0.5625 0,0.20312 0.125,0.35937 0.1407,0.17188 0.4063,0.28125 0.1562,0.0625 0.9375,0.26563 1.125,0.3125 1.5625,0.5 0.4375,0.1875 0.6875,0.54687 0.25,0.35938 0.25,0.90625 0,0.53125 -0.3125,1 -0.2969,0.45313 -0.875,0.71875 -0.5781,0.25 -1.3125,0.25 -1.2188,0 -1.8594,-0.5 -0.625,-0.51562 -0.7969,-1.5 z"
-       fill-rule="nonzero"
-       id="path342" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.61488,75.514867 V 322.89017"
-       fill-rule="nonzero"
-       id="path344" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 521.53879,75.514867 V 322.89017"
-       fill-rule="nonzero"
-       id="path346" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,76.013557 H 522.03739"
-       fill-rule="nonzero"
-       id="path348" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,111.21041 H 522.03739"
-       fill-rule="nonzero"
-       id="path350" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,146.40726 H 522.03739"
-       fill-rule="nonzero"
-       id="path352" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,181.60412 H 522.03739"
-       fill-rule="nonzero"
-       id="path354" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,216.80095 H 522.03739"
-       fill-rule="nonzero"
-       id="path356" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,251.99782 H 522.03739"
-       fill-rule="nonzero"
-       id="path358" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,287.19466 H 522.03739"
-       fill-rule="nonzero"
-       id="path360" />
-    <path
-       stroke="#1155cc"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="M 360.11618,322.3915 H 522.03739"
-       fill-rule="nonzero"
-       id="path362" />
-    <path
-       fill="#000000"
-       d="m 381.0367,94.751057 1.20312,-0.10938 q 0.0781,0.71875 0.39063,1.1875 0.3125,0.45313 0.95312,0.73438 0.65625,0.28125 1.46875,0.28125 0.71875,0 1.26563,-0.21875 0.5625,-0.21875 0.82812,-0.57813 0.26563,-0.375 0.26563,-0.82812 0,-0.45313 -0.26563,-0.78125 -0.25,-0.32813 -0.84375,-0.5625 -0.39062,-0.15625 -1.70312,-0.46875 -1.3125,-0.3125 -1.84375,-0.59375 -0.67188,-0.35938 -1.01563,-0.89063 -0.32812,-0.53125 -0.32812,-1.1875 0,-0.71875 0.40625,-1.34375 0.40625,-0.625 1.1875,-0.95312 0.79687,-0.32813 1.76562,-0.32813 1.04688,0 1.85938,0.34375 0.8125,0.34375 1.25,1.01563 0.4375,0.65625 0.46875,1.48437 l -1.20313,0.0937 q -0.10937,-0.90625 -0.67187,-1.35937 -0.5625,-0.46875 -1.65625,-0.46875 -1.14063,0 -1.67188,0.42187 -0.51562,0.42188 -0.51562,1.01563 0,0.51562 0.35937,0.84375 0.375,0.32812 1.90625,0.6875 1.54688,0.34375 2.10938,0.59375 0.84375,0.39062 1.23437,0.98437 0.39063,0.57813 0.39063,1.35938 0,0.75 -0.4375,1.4375 -0.42188,0.67187 -1.25,1.04687 -0.8125,0.35938 -1.82813,0.35938 -1.29687,0 -2.17187,-0.375 -0.875,-0.375 -1.375,-1.125 -0.5,-0.76563 -0.53125,-1.71875 z m 8.73352,-0.39063 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.1781,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 2.8656,0 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.9696,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92187,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85938,-0.9375 -0.85938,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76563,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92188,1.60938 l -1.14063,0.17187 q -0.17187,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98437,-0.35938 -0.89063,0 -1.45313,0.64063 -0.54687,0.64062 -0.54687,2 0,1.40625 0.53125,2.03125 0.54687,0.625 1.40625,0.625 0.6875,0 1.14062,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.88281,0.3125 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29688 l 5.01562,7.5 v -7.5 h 1.20313 v 9.54688 h -1.29688 l -5.01562,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.13122,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51562,-0.45313 -0.6875,-0.45312 -1.07813,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70313,-0.45312 1.54688,-0.45312 0.625,0 1.10937,0.26562 0.5,0.25 0.79688,0.67188 v -3.42188 h 1.17187 v 9.54688 z m -3.70312,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32812,0.65625 0.76563,0 1.29688,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54688,-2.07813 -0.54687,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51562,0.625 -0.51562,2 z m 11.3656,1.23438 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 6.19372,-0.57813 q 0,-1.6875 0.34375,-2.71875 0.35938,-1.03125 1.04688,-1.59375 0.6875,-0.5625 1.71875,-0.5625 0.78125,0 1.35937,0.3125 0.57813,0.29688 0.95313,0.89063 0.375,0.57812 0.59375,1.42187 0.21875,0.82813 0.21875,2.25 0,1.67188 -0.35938,2.70313 -0.34375,1.03125 -1.03125,1.59375 -0.67187,0.5625 -1.73437,0.5625 -1.375,0 -2.15625,-0.98438 -0.95313,-1.1875 -0.95313,-3.875 z m 1.20313,0 q 0,2.34375 0.54687,3.125 0.5625,0.78125 1.35938,0.78125 0.8125,0 1.35937,-0.78125 0.5625,-0.78125 0.5625,-3.125 0,-2.35937 -0.5625,-3.125 -0.54687,-0.78125 -1.35937,-0.78125 -0.8125,0 -1.29688,0.6875 -0.60937,0.875 -0.60937,3.21875 z m 9.80295,1.25 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17188,-0.45313 0.59375,-0.73438 0.42188,-0.28125 1.20313,-0.28125 0.48437,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35938,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.953,-2.0625 1.15625,-0.1875 q 0.10938,0.70312 0.54688,1.07812 0.45312,0.35938 1.25,0.35938 0.8125,0 1.20312,-0.32813 0.39063,-0.32812 0.39063,-0.76562 0,-0.39063 -0.35938,-0.625 -0.23437,-0.15625 -1.1875,-0.39063 -1.29687,-0.32812 -1.79687,-0.5625 -0.48438,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20312,-0.84375 0.21875,-0.40625 0.57813,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01562,-0.14062 0.8125,0 1.42188,0.23437 0.60937,0.23438 0.90625,0.64063 0.29687,0.39062 0.40625,1.0625 l -1.14063,0.15625 q -0.0781,-0.53125 -0.45312,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14062,0.42187 0.15625,0.1875 0.45313,0.3125 0.17187,0.0625 1.03125,0.29688 1.25,0.32812 1.73437,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64062,0.28125 -1.45312,0.28125 -1.34375,0 -2.04688,-0.5625 -0.70312,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 9.08435,3.07812 0.17188,1.03125 q -0.5,0.10938 -0.89063,0.10938 -0.64062,0 -1,-0.20313 -0.34375,-0.20312 -0.48437,-0.53125 -0.14063,-0.32812 -0.14063,-1.39062 v -3.96875 h -0.85937 v -0.90625 h 0.85937 v -1.71875 l 1.17188,-0.70313 v 2.42188 h 1.17187 v 0.90625 h -1.17187 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20313,0.23437 0.14062,0.0781 0.40625,0.0781 0.20312,0 0.51562,-0.0469 z"
-       fill-rule="nonzero"
-       id="path364" />
-    <path
-       fill="#000000"
-       d="m 381.0367,129.94791 1.20312,-0.10938 q 0.0781,0.71875 0.39063,1.1875 0.3125,0.45313 0.95312,0.73438 0.65625,0.28125 1.46875,0.28125 0.71875,0 1.26563,-0.21875 0.5625,-0.21875 0.82812,-0.57813 0.26563,-0.375 0.26563,-0.82812 0,-0.45313 -0.26563,-0.78125 -0.25,-0.32813 -0.84375,-0.5625 -0.39062,-0.15625 -1.70312,-0.46875 -1.3125,-0.3125 -1.84375,-0.59375 -0.67188,-0.35938 -1.01563,-0.89063 -0.32812,-0.53125 -0.32812,-1.1875 0,-0.71875 0.40625,-1.34375 0.40625,-0.625 1.1875,-0.95312 0.79687,-0.32813 1.76562,-0.32813 1.04688,0 1.85938,0.34375 0.8125,0.34375 1.25,1.01563 0.4375,0.65625 0.46875,1.48437 l -1.20313,0.0937 q -0.10937,-0.90625 -0.67187,-1.35937 -0.5625,-0.46875 -1.65625,-0.46875 -1.14063,0 -1.67188,0.42187 -0.51562,0.42188 -0.51562,1.01563 0,0.51562 0.35937,0.84375 0.375,0.32812 1.90625,0.6875 1.54688,0.34375 2.10938,0.59375 0.84375,0.39062 1.23437,0.98437 0.39063,0.57813 0.39063,1.35938 0,0.75 -0.4375,1.4375 -0.42188,0.67187 -1.25,1.04687 -0.8125,0.35938 -1.82813,0.35938 -1.29687,0 -2.17187,-0.375 -0.875,-0.375 -1.375,-1.125 -0.5,-0.76563 -0.53125,-1.71875 z m 8.73352,-0.39063 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.1781,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 2.8656,0 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.9696,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92187,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85938,-0.9375 -0.85938,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76563,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92188,1.60938 l -1.14063,0.17187 q -0.17187,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98437,-0.35938 -0.89063,0 -1.45313,0.64063 -0.54687,0.64062 -0.54687,2 0,1.40625 0.53125,2.03125 0.54687,0.625 1.40625,0.625 0.6875,0 1.14062,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.88281,0.3125 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29688 l 5.01562,7.5 v -7.5 h 1.20313 v 9.54688 h -1.29688 l -5.01562,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.13122,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51562,-0.45313 -0.6875,-0.45312 -1.07813,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70313,-0.45312 1.54688,-0.45312 0.625,0 1.10937,0.26562 0.5,0.25 0.79688,0.67188 v -3.42188 h 1.17187 v 9.54688 z m -3.70312,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32812,0.65625 0.76563,0 1.29688,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54688,-2.07813 -0.54687,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51562,0.625 -0.51562,2 z m 11.3656,1.23438 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 10.6156,4.125 h -1.17188 v -7.46875 q -0.42187,0.40625 -1.10937,0.8125 -0.6875,0.40625 -1.23438,0.60937 v -1.14062 q 0.98438,-0.45313 1.71875,-1.10938 0.73438,-0.67187 1.03125,-1.28125 h 0.76563 z m 6.5842,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17188,-0.45313 0.59375,-0.73438 0.42188,-0.28125 1.20313,-0.28125 0.48437,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35938,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.953,-2.0625 1.15625,-0.1875 q 0.10938,0.70312 0.54688,1.07812 0.45312,0.35938 1.25,0.35938 0.8125,0 1.20312,-0.32813 0.39063,-0.32812 0.39063,-0.76562 0,-0.39063 -0.35938,-0.625 -0.23437,-0.15625 -1.1875,-0.39063 -1.29687,-0.32812 -1.79687,-0.5625 -0.48438,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20312,-0.84375 0.21875,-0.40625 0.57813,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01562,-0.14062 0.8125,0 1.42188,0.23437 0.60937,0.23438 0.90625,0.64063 0.29687,0.39062 0.40625,1.0625 l -1.14063,0.15625 q -0.0781,-0.53125 -0.45312,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14062,0.42187 0.15625,0.1875 0.45313,0.3125 0.17187,0.0625 1.03125,0.29688 1.25,0.32812 1.73437,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64062,0.28125 -1.45312,0.28125 -1.34375,0 -2.04688,-0.5625 -0.70312,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 9.08435,3.07812 0.17188,1.03125 q -0.5,0.10938 -0.89063,0.10938 -0.64062,0 -1,-0.20313 -0.34375,-0.20312 -0.48437,-0.53125 -0.14063,-0.32812 -0.14063,-1.39062 v -3.96875 h -0.85937 v -0.90625 h 0.85937 v -1.71875 l 1.17188,-0.70313 v 2.42188 h 1.17187 v 0.90625 h -1.17187 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20313,0.23437 0.14062,0.0781 0.40625,0.0781 0.20312,0 0.51562,-0.0469 z"
-       fill-rule="nonzero"
-       id="path366" />
-    <path
-       fill="#000000"
-       d="m 378.07888,165.14477 1.20313,-0.10938 q 0.0781,0.71875 0.39062,1.1875 0.3125,0.45313 0.95313,0.73438 0.65625,0.28125 1.46875,0.28125 0.71875,0 1.26562,-0.21875 0.5625,-0.21875 0.82813,-0.57813 0.26562,-0.375 0.26562,-0.82812 0,-0.45313 -0.26562,-0.78125 -0.25,-0.32813 -0.84375,-0.5625 -0.39063,-0.15625 -1.70313,-0.46875 -1.3125,-0.3125 -1.84375,-0.59375 -0.67187,-0.35938 -1.01562,-0.89063 -0.32813,-0.53125 -0.32813,-1.1875 0,-0.71875 0.40625,-1.34375 0.40625,-0.625 1.1875,-0.95312 0.79688,-0.32813 1.76563,-0.32813 1.04687,0 1.85937,0.34375 0.8125,0.34375 1.25,1.01563 0.4375,0.65625 0.46875,1.48437 l -1.20312,0.0937 q -0.10938,-0.90625 -0.67188,-1.35937 -0.5625,-0.46875 -1.65625,-0.46875 -1.14062,0 -1.67187,0.42187 -0.51563,0.42188 -0.51563,1.01563 0,0.51562 0.35938,0.84375 0.375,0.32812 1.90625,0.6875 1.54687,0.34375 2.10937,0.59375 0.84375,0.39062 1.23438,0.98437 0.39062,0.57813 0.39062,1.35938 0,0.75 -0.4375,1.4375 -0.42187,0.67187 -1.25,1.04687 -0.8125,0.35938 -1.82812,0.35938 -1.29688,0 -2.17188,-0.375 -0.875,-0.375 -1.375,-1.125 -0.5,-0.76563 -0.53125,-1.71875 z m 8.73352,-0.39063 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.1781,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 2.8656,0 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.9696,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92187,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85938,-0.9375 -0.85938,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76563,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92188,1.60938 l -1.14063,0.17187 q -0.17187,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98437,-0.35938 -0.89063,0 -1.45313,0.64063 -0.54687,0.64062 -0.54687,2 0,1.40625 0.53125,2.03125 0.54687,0.625 1.40625,0.625 0.6875,0 1.14062,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.88281,0.3125 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29688 l 5.01562,7.5 v -7.5 h 1.20313 v 9.54688 h -1.29688 l -5.01562,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 11.13122,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51562,-0.45313 -0.6875,-0.45312 -1.07813,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70313,-0.45312 1.54688,-0.45312 0.625,0 1.10937,0.26562 0.5,0.25 0.79688,0.67188 v -3.42188 h 1.17187 v 9.54688 z m -3.70312,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32812,0.65625 0.76563,0 1.29688,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54688,-2.07813 -0.54687,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51562,0.625 -0.51562,2 z m 11.3656,1.23438 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 10.36545,4.125 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 12.75003,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17188,-0.45313 0.59375,-0.73438 0.42188,-0.28125 1.20313,-0.28125 0.48437,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35938,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.95297,-2.0625 1.15625,-0.1875 q 0.10938,0.70312 0.54688,1.07812 0.45312,0.35938 1.25,0.35938 0.8125,0 1.20312,-0.32813 0.39063,-0.32812 0.39063,-0.76562 0,-0.39063 -0.35938,-0.625 -0.23437,-0.15625 -1.1875,-0.39063 -1.29687,-0.32812 -1.79687,-0.5625 -0.48438,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20312,-0.84375 0.21875,-0.40625 0.57813,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01562,-0.14062 0.8125,0 1.42188,0.23437 0.60937,0.23438 0.90625,0.64063 0.29687,0.39062 0.40625,1.0625 l -1.14063,0.15625 q -0.0781,-0.53125 -0.45312,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14062,0.42187 0.15625,0.1875 0.45313,0.3125 0.17187,0.0625 1.03125,0.29688 1.25,0.32812 1.73437,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64062,0.28125 -1.45312,0.28125 -1.34375,0 -2.04688,-0.5625 -0.70312,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 9.08435,3.07812 0.17185,1.03125 q -0.49998,0.10938 -0.8906,0.10938 -0.64063,0 -1,-0.20313 -0.34375,-0.20312 -0.48438,-0.53125 -0.14062,-0.32812 -0.14062,-1.39062 v -3.96875 h -0.85938 v -0.90625 h 0.85938 v -1.71875 l 1.17187,-0.70313 v 2.42188 h 1.17188 v 0.90625 h -1.17188 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20312,0.23437 0.14063,0.0781 0.40625,0.0781 0.20313,0 0.51563,-0.0469 z"
-       fill-rule="nonzero"
-       id="path368" />
-    <path
-       fill="#000000"
-       d="m 374.07084,203.4041 v -9.54688 h 6.90625 v 1.125 h -5.64062 v 2.92188 h 5.28125 v 1.125 h -5.28125 v 3.25 h 5.85937 v 1.125 z m 8.71787,0 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 11.81872,2.65625 v -3.39063 q -0.26562,0.39063 -0.76562,0.64063 -0.48438,0.25 -1.04688,0.25 -1.21875,0 -2.10937,-0.98438 -0.89063,-0.98437 -0.89063,-2.6875 0,-1.04687 0.35938,-1.875 0.35937,-0.82812 1.04687,-1.25 0.6875,-0.42187 1.51563,-0.42187 1.28125,0 2.01562,1.07812 v -0.92187 h 1.04688 v 9.5625 z m -3.60937,-6.125 q 0,1.32812 0.5625,2 0.5625,0.65625 1.34375,0.65625 0.75,0 1.28125,-0.625 0.54687,-0.64063 0.54687,-1.9375 0,-1.375 -0.57812,-2.0625 -0.5625,-0.70313 -1.32813,-0.70313 -0.76562,0 -1.29687,0.65625 -0.53125,0.64063 -0.53125,2.01563 z m 11.14685,3.46875 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 11.0531,4.125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 9.8967,-0.57813 q 0,-1.6875 0.34375,-2.71875 0.35938,-1.03125 1.04688,-1.59375 0.6875,-0.5625 1.71875,-0.5625 0.78125,0 1.35937,0.3125 0.57813,0.29688 0.95313,0.89063 0.375,0.57812 0.59375,1.42187 0.21875,0.82813 0.21875,2.25 0,1.67188 -0.35938,2.70313 -0.34375,1.03125 -1.03125,1.59375 -0.67187,0.5625 -1.73437,0.5625 -1.375,0 -2.15625,-0.98438 -0.95313,-1.1875 -0.95313,-3.875 z m 1.20313,0 q 0,2.34375 0.54687,3.125 0.5625,0.78125 1.35938,0.78125 0.8125,0 1.35937,-0.78125 0.5625,-0.78125 0.5625,-3.125 0,-2.35937 -0.5625,-3.125 -0.54687,-0.78125 -1.35937,-0.78125 -0.8125,0 -1.29688,0.6875 -0.60937,0.875 -0.60937,3.21875 z m 9.80297,1.25 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.95297,-2.0625 1.15625,-0.1875 q 0.10937,0.70312 0.54687,1.07812 0.45313,0.35938 1.25,0.35938 0.8125,0 1.20313,-0.32813 0.39062,-0.32812 0.39062,-0.76562 0,-0.39063 -0.35937,-0.625 -0.23438,-0.15625 -1.1875,-0.39063 -1.29688,-0.32812 -1.79688,-0.5625 -0.48437,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20313,-0.84375 0.21875,-0.40625 0.57812,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01563,-0.14062 0.8125,0 1.42187,0.23437 0.60938,0.23438 0.90625,0.64063 0.29688,0.39062 0.40625,1.0625 l -1.14062,0.15625 q -0.0781,-0.53125 -0.45313,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14063,0.42187 0.15625,0.1875 0.45312,0.3125 0.17188,0.0625 1.03125,0.29688 1.25,0.32812 1.73438,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64063,0.28125 -1.45313,0.28125 -1.34375,0 -2.04687,-0.5625 -0.70313,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20311,0.14062 q -0.2812,1.0625 -1.06249,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.87501,0.9375 0.87501,2.65625 0,0.10937 0,0.3125 h -5.15626 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 9.08436,3.07812 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z"
-       fill-rule="nonzero"
-       id="path370" />
-    <path
-       fill="#000000"
-       d="m 374.07084,238.60097 v -9.54689 h 6.90625 v 1.125 h -5.64062 v 2.92189 h 5.28125 v 1.125 h -5.28125 v 3.25 h 5.85937 v 1.125 z m 8.71787,0 v -6.90625 h 1.0625 v 0.98438 q 0.75,-1.14063 2.1875,-1.14063 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35938 0.375,0.85938 0.0625,0.32812 0.0625,1.14062 v 4.25 h -1.17188 v -4.20312 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35938 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79687 v 3.78125 z m 11.81872,2.65625 v -3.39062 q -0.26562,0.39062 -0.76562,0.64062 -0.48438,0.25 -1.04688,0.25 -1.21875,0 -2.10937,-0.98437 -0.89063,-0.98438 -0.89063,-2.6875 0,-1.04688 0.35938,-1.875 0.35937,-0.82813 1.04687,-1.25 0.6875,-0.42188 1.51563,-0.42188 1.28125,0 2.01562,1.07813 v -0.92188 h 1.04688 v 9.5625 z m -3.60937,-6.125 q 0,1.32813 0.5625,2 0.5625,0.65625 1.34375,0.65625 0.75,0 1.28125,-0.625 0.54687,-0.64062 0.54687,-1.9375 0,-1.375 -0.57812,-2.0625 -0.5625,-0.70312 -1.32813,-0.70312 -0.76562,0 -1.29687,0.65625 -0.53125,0.64062 -0.53125,2.01562 z m 11.14685,3.46875 v -1.01562 q -0.8125,1.17187 -2.1875,1.17187 -0.60938,0 -1.14063,-0.23437 -0.53125,-0.23438 -0.79687,-0.57813 -0.25,-0.35937 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82813 q 0,0.92187 0.0625,1.23437 0.10937,0.46875 0.46875,0.73438 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26563 0.46875,-0.26562 0.65625,-0.73437 0.1875,-0.46875 0.1875,-1.34375 v -3.70313 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 11.0531,4.125 v -1.01562 q -0.8125,1.17187 -2.1875,1.17187 -0.60938,0 -1.14063,-0.23437 -0.53125,-0.23438 -0.79687,-0.57813 -0.25,-0.35937 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82813 q 0,0.92187 0.0625,1.23437 0.10937,0.46875 0.46875,0.73438 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26563 0.46875,-0.26562 0.65625,-0.73437 0.1875,-0.46875 0.1875,-1.34375 v -3.70313 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 10.36548,4.125 v -9.54689 h 1.29687 l 5.01563,7.50002 v -7.50002 h 1.20312 v 9.54689 h -1.29687 l -5.01563,-7.50002 v 7.50002 z m 9.04703,-3.45312 q 0,-1.92188 1.07812,-2.84375 0.89063,-0.76563 2.17188,-0.76563 1.42187,0 2.32812,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39062,0.76562 -1.15625,1.1875 -0.76562,0.42187 -1.67187,0.42187 -1.45313,0 -2.35938,-0.92187 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32812 0.57813,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67187 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98438 z m 11.13123,3.45312 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45312 -0.6875,-0.45313 -1.07812,-1.26563 -0.375,-0.82812 -0.375,-1.89062 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45313 1.54687,-0.45313 0.625,0 1.10938,0.26563 0.5,0.25 0.79687,0.67187 v -3.42189 h 1.17188 v 9.54689 z m -3.70313,-3.45312 q 0,1.32812 0.5625,1.98437 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42187 -0.54687,-2.07812 -0.54688,-0.67188 -1.34375,-0.67188 -0.78125,0 -1.3125,0.64063 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23437 1.20313,0.14063 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57812 -1.96875,0.57812 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60937 0,-1.75 0.89063,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10938 0,0.3125 h -5.15625 q 0.0625,1.14063 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32812 0.45313,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54687 -0.54688,0.53125 -0.60938,1.4375 z m 14.31858,4.125 h -1.17188 v -7.46877 q -0.42187,0.40627 -1.10937,0.81252 -0.6875,0.40625 -1.23438,0.60937 v -1.14064 q 0.98438,-0.45312 1.71875,-1.10937 0.73438,-0.67188 1.03125,-1.28125 h 0.76563 z m 6.58422,-3.45312 q 0,-1.92188 1.07813,-2.84375 0.89062,-0.76563 2.17187,-0.76563 1.42188,0 2.32813,0.9375 0.90625,0.92188 0.90625,2.57813 0,1.32812 -0.40625,2.09375 -0.39063,0.76562 -1.15625,1.1875 -0.76563,0.42187 -1.67188,0.42187 -1.45312,0 -2.35937,-0.92187 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32812 0.57812,1.98437 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67187 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98438 z m 6.9281,3.45312 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73439 q 0,-0.70313 0.125,-1.04688 0.17187,-0.45312 0.59375,-0.73437 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10937 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23438 -0.21875,0.21875 -0.21875,0.84375 v 0.64064 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73439 q 0,-0.70313 0.125,-1.04688 0.17187,-0.45312 0.59375,-0.73437 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10937 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23438 -0.21875,0.21875 -0.21875,0.84375 v 0.64064 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.95297,-2.0625 1.15625,-0.1875 q 0.10937,0.70313 0.54687,1.07813 0.45313,0.35937 1.25,0.35937 0.8125,0 1.20313,-0.32812 0.39062,-0.32813 0.39062,-0.76563 0,-0.39062 -0.35937,-0.625 -0.23438,-0.15625 -1.1875,-0.39062 -1.29688,-0.32813 -1.79688,-0.5625 -0.48437,-0.25 -0.75,-0.65625 -0.25,-0.42188 -0.25,-0.9375 0,-0.45313 0.20313,-0.84375 0.21875,-0.40625 0.57812,-0.67188 0.28125,-0.1875 0.75,-0.32812 0.46875,-0.14063 1.01563,-0.14063 0.8125,0 1.42187,0.23438 0.60938,0.23437 0.90625,0.64062 0.29688,0.39063 0.40625,1.0625 l -1.14062,0.15625 q -0.0781,-0.53125 -0.45313,-0.82812 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26562 -0.34375,0.26563 -0.34375,0.625 0,0.23438 0.14063,0.42188 0.15625,0.1875 0.45312,0.3125 0.17188,0.0625 1.03125,0.29687 1.25,0.32813 1.73438,0.54688 0.5,0.20312 0.78125,0.60937 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10938 -0.34375,0.51562 -1,0.79687 -0.64063,0.28125 -1.45313,0.28125 -1.34375,0 -2.04687,-0.5625 -0.70313,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20311,0.14063 q -0.2812,1.0625 -1.06249,1.65625 -0.76562,0.57812 -1.96875,0.57812 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60937 0,-1.75 0.89062,-2.70313 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.87501,0.9375 0.87501,2.65625 0,0.10938 0,0.3125 h -5.15626 q 0.0625,1.14063 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32812 0.45312,-0.34375 0.71875,-1.07813 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85937 -0.4375,-1.29687 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54687 -0.54687,0.53125 -0.60937,1.4375 z m 9.08436,3.07813 0.1719,1.03125 q -0.5,0.10937 -0.8907,0.10937 -0.6406,0 -1,-0.20312 -0.3437,-0.20313 -0.4843,-0.53125 -0.1407,-0.32813 -0.1407,-1.39063 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71877 l 1.1719,-0.70312 v 2.42189 h 1.1719 v 0.90625 h -1.1719 v 4.04688 q 0,0.5 0.047,0.64062 0.062,0.14063 0.2031,0.23438 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z"
-       fill-rule="nonzero"
-       id="path372" />
-    <path
-       fill="#000000"
-       d="m 374.07084,273.7978 v -9.54688 h 6.90625 v 1.125 h -5.64062 v 2.92188 h 5.28125 v 1.125 h -5.28125 v 3.25 h 5.85937 v 1.125 z m 8.71787,0 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 11.81872,2.65625 v -3.39063 q -0.26562,0.39063 -0.76562,0.64063 -0.48438,0.25 -1.04688,0.25 -1.21875,0 -2.10937,-0.98438 -0.89063,-0.98437 -0.89063,-2.6875 0,-1.04687 0.35938,-1.875 0.35937,-0.82812 1.04687,-1.25 0.6875,-0.42187 1.51563,-0.42187 1.28125,0 2.01562,1.07812 v -0.92187 h 1.04688 v 9.5625 z m -3.60937,-6.125 q 0,1.32812 0.5625,2 0.5625,0.65625 1.34375,0.65625 0.75,0 1.28125,-0.625 0.54687,-0.64063 0.54687,-1.9375 0,-1.375 -0.57812,-2.0625 -0.5625,-0.70313 -1.32813,-0.70313 -0.76562,0 -1.29687,0.65625 -0.53125,0.64063 -0.53125,2.01563 z m 11.14685,3.46875 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 11.0531,4.125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 16.05295,3 v 1.125 h -6.29687 q -0.0156,-0.42188 0.14062,-0.8125 0.23438,-0.64063 0.76563,-1.26563 0.53125,-0.625 1.53125,-1.45312 1.5625,-1.26563 2.10937,-2.01563 0.54688,-0.75 0.54688,-1.40625 0,-0.70312 -0.5,-1.17187 -0.5,-0.48438 -1.29688,-0.48438 -0.85937,0 -1.375,0.51563 -0.5,0.5 -0.5,1.39062 l -1.20312,-0.10937 q 0.125,-1.35938 0.92187,-2.0625 0.8125,-0.70313 2.17188,-0.70313 1.375,0 2.17187,0.76563 0.8125,0.75 0.8125,1.875 0,0.57812 -0.23437,1.14062 -0.23438,0.54688 -0.78125,1.15625 -0.54688,0.60938 -1.8125,1.67188 -1.04688,0.89062 -1.35938,1.21875 -0.29687,0.3125 -0.48437,0.625 z m 4.84985,-2.32813 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.4621,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.95297,-2.0625 1.15625,-0.1875 q 0.10937,0.70312 0.54687,1.07812 0.45313,0.35938 1.25,0.35938 0.8125,0 1.20313,-0.32813 0.39062,-0.32812 0.39062,-0.76562 0,-0.39063 -0.35937,-0.625 -0.23438,-0.15625 -1.1875,-0.39063 -1.29688,-0.32812 -1.79688,-0.5625 -0.48437,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20313,-0.84375 0.21875,-0.40625 0.57812,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01563,-0.14062 0.8125,0 1.42187,0.23437 0.60938,0.23438 0.90625,0.64063 0.29688,0.39062 0.40625,1.0625 l -1.14062,0.15625 q -0.0781,-0.53125 -0.45313,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14063,0.42187 0.15625,0.1875 0.45312,0.3125 0.17188,0.0625 1.03125,0.29688 1.25,0.32812 1.73438,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64063,0.28125 -1.45313,0.28125 -1.34375,0 -2.04687,-0.5625 -0.70313,-0.5625 -0.90625,-1.65625 z m 11.86719,-0.15625 1.20311,0.14062 q -0.2812,1.0625 -1.06249,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.87501,0.9375 0.87501,2.65625 0,0.10937 0,0.3125 h -5.15626 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 9.08436,3.07812 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z"
-       fill-rule="nonzero"
-       id="path374" />
-    <path
-       fill="#000000"
-       d="m 372.96448,308.99465 v -9.54688 h 6.90625 v 1.125 h -5.64062 v 2.92188 h 5.28125 v 1.125 h -5.28125 v 3.25 h 5.85937 v 1.125 z m 8.7179,0 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.15625,0.21875 0.53125,0.21875 0.78125,0.59375 0.26562,0.35937 0.375,0.85937 0.0625,0.32813 0.0625,1.14063 v 4.25 h -1.17188 v -4.20313 q 0,-0.71875 -0.14062,-1.0625 -0.14063,-0.35937 -0.48438,-0.5625 -0.34375,-0.21875 -0.8125,-0.21875 -0.75,0 -1.29687,0.46875 -0.54688,0.46875 -0.54688,1.79688 v 3.78125 z m 11.81872,2.65625 v -3.39063 q -0.26562,0.39063 -0.76562,0.64063 -0.48438,0.25 -1.04688,0.25 -1.21875,0 -2.10937,-0.98438 -0.89063,-0.98437 -0.89063,-2.6875 0,-1.04687 0.35938,-1.875 0.35937,-0.82812 1.04687,-1.25 0.6875,-0.42187 1.51563,-0.42187 1.28125,0 2.01562,1.07812 v -0.92187 h 1.04688 v 9.5625 z m -3.60937,-6.125 q 0,1.32812 0.5625,2 0.5625,0.65625 1.34375,0.65625 0.75,0 1.28125,-0.625 0.54687,-0.64063 0.54687,-1.9375 0,-1.375 -0.57812,-2.0625 -0.5625,-0.70313 -1.32813,-0.70313 -0.76562,0 -1.29687,0.65625 -0.53125,0.64063 -0.53125,2.01563 z m 11.14685,3.46875 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 11.0531,4.125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 7.6156,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 10.36545,4.125 v -9.54688 h 1.29687 l 5.01563,7.5 v -7.5 h 1.20312 v 9.54688 h -1.29687 l -5.01563,-7.5 v 7.5 z m 9.04703,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.13123,3.45313 v -0.875 q -0.65625,1.03125 -1.9375,1.03125 -0.8125,0 -1.51563,-0.45313 -0.6875,-0.45312 -1.07812,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.34375,-1.875 0.34375,-0.84375 1.03125,-1.28125 0.70312,-0.45312 1.54687,-0.45312 0.625,0 1.10938,0.26562 0.5,0.25 0.79687,0.67188 v -3.42188 h 1.17188 v 9.54688 z m -3.70313,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.32813,0.65625 0.76562,0 1.29687,-0.625 0.53125,-0.625 0.53125,-1.90625 0,-1.42188 -0.54687,-2.07813 -0.54688,-0.67187 -1.34375,-0.67187 -0.78125,0 -1.3125,0.64062 -0.51563,0.625 -0.51563,2 z m 11.3656,1.23438 1.20313,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76563,0.57813 -1.96875,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26562,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85938 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 10.36548,4.125 v -9.54688 h 1.29688 l 5.01562,7.5 v -7.5 h 1.20313 v 9.54688 h -1.29688 l -5.01562,-7.5 v 7.5 z m 12.75,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 6.9281,3.45313 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17187,-0.45313 0.59375,-0.73438 0.42187,-0.28125 1.20312,-0.28125 0.48438,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35937,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 3.46209,0 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17188,-0.45313 0.59375,-0.73438 0.42188,-0.28125 1.20313,-0.28125 0.48437,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35938,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.95301,-2.0625 1.15625,-0.1875 q 0.10937,0.70312 0.54687,1.07812 0.45313,0.35938 1.25,0.35938 0.8125,0 1.20313,-0.32813 0.39062,-0.32812 0.39062,-0.76562 0,-0.39063 -0.35937,-0.625 -0.23438,-0.15625 -1.1875,-0.39063 -1.29688,-0.32812 -1.79688,-0.5625 -0.48437,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.20313,-0.84375 0.21875,-0.40625 0.57812,-0.67187 0.28125,-0.1875 0.75,-0.32813 0.46875,-0.14062 1.01563,-0.14062 0.8125,0 1.42187,0.23437 0.60938,0.23438 0.90625,0.64063 0.29688,0.39062 0.40625,1.0625 l -1.14062,0.15625 q -0.0781,-0.53125 -0.45313,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.15625,0.26563 -0.34375,0.26562 -0.34375,0.625 0,0.23437 0.14063,0.42187 0.15625,0.1875 0.45312,0.3125 0.17188,0.0625 1.03125,0.29688 1.25,0.32812 1.73438,0.54687 0.5,0.20313 0.78125,0.60938 0.28125,0.40625 0.28125,1 0,0.59375 -0.34375,1.10937 -0.34375,0.51563 -1,0.79688 -0.64063,0.28125 -1.45313,0.28125 -1.34375,0 -2.04687,-0.5625 -0.70313,-0.5625 -0.90625,-1.65625 z m 11.86715,-0.15625 1.2032,0.14062 q -0.2813,1.0625 -1.0625,1.65625 -0.76567,0.57813 -1.96879,0.57813 -1.51563,0 -2.40625,-0.9375 -0.89063,-0.9375 -0.89063,-2.60938 0,-1.75 0.89063,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39062,0 2.26559,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15622 q 0.0625,1.14062 0.64063,1.75 0.57812,0.59375 1.4375,0.59375 0.65625,0 1.10937,-0.32813 0.45313,-0.34375 0.71872,-1.07812 z m -3.84372,-1.90625 h 3.85942 q -0.078,-0.85938 -0.43754,-1.29688 -0.5625,-0.6875 -1.45313,-0.6875 -0.8125,0 -1.35937,0.54688 -0.54688,0.53125 -0.60938,1.4375 z m 9.08432,3.07812 0.1719,1.03125 q -0.5,0.10938 -0.8906,0.10938 -0.6406,0 -1,-0.20313 -0.3438,-0.20312 -0.4844,-0.53125 -0.1406,-0.32812 -0.1406,-1.39062 v -3.96875 h -0.8594 v -0.90625 h 0.8594 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1718 v 0.90625 h -1.1718 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1406,0.0781 0.4062,0.0781 0.2032,0 0.5157,-0.0469 z"
-       fill-rule="nonzero"
-       id="path376" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 327.9666,40.550037 h 280.09449 v 27.46457 H 327.9666 Z"
-       fill-rule="evenodd"
-       id="path378" />
-    <path
-       fill="#000000"
-       d="m 346.58571,59.006287 1.26562,0.3125 q -0.39062,1.5625 -1.42187,2.375 -1.03125,0.8125 -2.53125,0.8125 -1.53125,0 -2.5,-0.625 -0.96875,-0.625 -1.48438,-1.8125 -0.5,-1.1875 -0.5,-2.5625 0,-1.48438 0.5625,-2.59375 0.57813,-1.10938 1.625,-1.6875 1.0625,-0.57813 2.32813,-0.57813 1.42187,0 2.39062,0.73438 0.98438,0.71875 1.375,2.04687 l -1.25,0.29688 q -0.32812,-1.04688 -0.96875,-1.51563 -0.625,-0.48437 -1.57812,-0.48437 -1.09375,0 -1.84375,0.53125 -0.73438,0.53125 -1.03125,1.42187 -0.29688,0.875 -0.29688,1.82813 0,1.21875 0.34375,2.125 0.35938,0.90625 1.10938,1.35937 0.75,0.4375 1.625,0.4375 1.0625,0 1.79687,-0.60937 0.73438,-0.60938 0.98438,-1.8125 z m 2.68765,-4.84375 v -1.35938 h 1.17188 v 1.35938 z m 0,8.1875 v -6.90625 h 1.17188 v 6.90625 z m 2.92984,0 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 8.96964,-2.53125 1.15625,0.15625 q -0.1875,1.1875 -0.96875,1.85937 -0.78125,0.67188 -1.92188,0.67188 -1.40625,0 -2.28125,-0.92188 -0.85937,-0.9375 -0.85937,-2.65625 0,-1.125 0.375,-1.96875 0.375,-0.84375 1.125,-1.25 0.76562,-0.42187 1.65625,-0.42187 1.125,0 1.84375,0.57812 0.71875,0.5625 0.92187,1.60938 l -1.14062,0.17187 q -0.17188,-0.70312 -0.59375,-1.04687 -0.40625,-0.35938 -0.98438,-0.35938 -0.89062,0 -1.45312,0.64063 -0.54688,0.64062 -0.54688,2 0,1.40625 0.53125,2.03125 0.54688,0.625 1.40625,0.625 0.6875,0 1.14063,-0.42188 0.46875,-0.42187 0.59375,-1.29687 z m 6.67969,2.53125 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60938,0 -1.14063,-0.23438 -0.53125,-0.23437 -0.79687,-0.57812 -0.25,-0.35938 -0.35938,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17188 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10937,0.46875 0.46875,0.73437 0.35937,0.25 0.89062,0.25 0.51563,0 0.98438,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17187 v 6.90625 z m 2.8656,0 v -9.54688 H 371.89 v 9.54688 z m 7.49234,-0.85938 q -0.65625,0.5625 -1.26563,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14062,0 -1.75,-0.54688 -0.60937,-0.5625 -0.60937,-1.4375 0,-0.5 0.21875,-0.92187 0.23437,-0.42188 0.60937,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04688,-0.17188 1.42187,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32813,-1.01563 -0.45312,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39062,0.28125 -0.57812,1.01563 l -1.14063,-0.15625 q 0.15625,-0.73438 0.51563,-1.1875 0.35937,-0.45313 1.03125,-0.6875 0.67187,-0.25 1.5625,-0.25 0.89062,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26562,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29687,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23437,-0.85938 z m -0.0937,-2.60937 q -0.64063,0.26562 -1.92188,0.4375 -0.71875,0.10937 -1.01562,0.25 -0.29688,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35937,0.3125 1.04687,0.3125 0.67188,0 1.20313,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.97497,3.46875 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 8.15698,0 v -6.90625 h 1.04688 v 0.96875 q 0.32812,-0.51563 0.85937,-0.8125 0.54688,-0.3125 1.23438,-0.3125 0.78125,0 1.26562,0.3125 0.48438,0.3125 0.6875,0.89062 0.82813,-1.20312 2.14063,-1.20312 1.03125,0 1.57812,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.17187 v -4.35938 q 0,-0.70312 -0.125,-1 -0.10938,-0.3125 -0.40625,-0.5 -0.29688,-0.1875 -0.70313,-0.1875 -0.71875,0 -1.20312,0.48438 -0.48438,0.48437 -0.48438,1.54687 v 4.01563 h -1.17187 v -4.48438 q 0,-0.78125 -0.29688,-1.17187 -0.28125,-0.39063 -0.92187,-0.39063 -0.5,0 -0.92188,0.26563 -0.42187,0.25 -0.60937,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 15.8368,-2.21875 1.20312,0.14062 q -0.28125,1.0625 -1.0625,1.65625 -0.76562,0.57813 -1.96875,0.57813 -1.51562,0 -2.40625,-0.9375 -0.89062,-0.9375 -0.89062,-2.60938 0,-1.75 0.89062,-2.70312 0.90625,-0.96875 2.34375,-0.96875 1.39063,0 2.26563,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.15625 q 0.0625,1.14062 0.64062,1.75 0.57813,0.59375 1.4375,0.59375 0.65625,0 1.10938,-0.32813 0.45312,-0.34375 0.71875,-1.07812 z m -3.84375,-1.90625 h 3.85937 q -0.0781,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.45312,-0.6875 -0.8125,0 -1.35938,0.54688 -0.54687,0.53125 -0.60937,1.4375 z m 6.52185,4.125 v -6.90625 h 1.04687 v 0.96875 q 0.32813,-0.51563 0.85938,-0.8125 0.54687,-0.3125 1.23437,-0.3125 0.78125,0 1.26563,0.3125 0.48437,0.3125 0.6875,0.89062 0.82812,-1.20312 2.14062,-1.20312 1.03125,0 1.57813,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.17188 v -4.35938 q 0,-0.70312 -0.125,-1 -0.10937,-0.3125 -0.40625,-0.5 -0.29687,-0.1875 -0.70312,-0.1875 -0.71875,0 -1.20313,0.48438 -0.48437,0.48437 -0.48437,1.54687 v 4.01563 h -1.17188 v -4.48438 q 0,-0.78125 -0.29687,-1.17187 -0.28125,-0.39063 -0.92188,-0.39063 -0.5,0 -0.92187,0.26563 -0.42188,0.25 -0.60938,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 10.66494,-3.45313 q 0,-1.92187 1.07813,-2.84375 0.89062,-0.76562 2.17187,-0.76562 1.42188,0 2.32813,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39063,0.76563 -1.15625,1.1875 -0.76563,0.42188 -1.67188,0.42188 -1.45312,0 -2.35937,-0.92188 -0.89063,-0.9375 -0.89063,-2.6875 z m 1.20313,0 q 0,1.32813 0.57812,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45313,-0.65625 0.57812,-0.67188 0.57812,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57812,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57812,0.65625 -0.57812,1.98437 z m 6.63122,3.45313 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73438,-0.96875 0.34375,-0.23437 0.76562,-0.23437 0.59375,0 1.20313,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85938,-0.25 -0.39062,0 -0.70312,0.23438 -0.29688,0.23437 -0.42188,0.64062 -0.20312,0.625 -0.20312,1.35938 v 3.625 z m 4.40711,2.65625 -0.125,-1.09375 q 0.375,0.10937 0.65625,0.10937 0.39062,0 0.625,-0.14062 0.23437,-0.125 0.39062,-0.35938 0.10938,-0.17187 0.35938,-0.875 0.0312,-0.0937 0.10937,-0.28125 l -2.625,-6.92187 h 1.26563 l 1.4375,4 q 0.28125,0.76562 0.5,1.59375 0.20312,-0.79688 0.46875,-1.57813 l 1.48437,-4.01562 h 1.17188 l -2.625,7.01562 q -0.42188,1.14063 -0.65625,1.57813 -0.3125,0.57812 -0.71875,0.84375 -0.40625,0.28125 -0.96875,0.28125 -0.32813,0 -0.75,-0.15625 z m 10.39831,-2.65625 v -9.54688 h 1.17188 v 9.54688 z m 7.49234,-0.85938 q -0.65625,0.5625 -1.26562,0.79688 -0.59375,0.21875 -1.28125,0.21875 -1.14063,0 -1.75,-0.54688 -0.60938,-0.5625 -0.60938,-1.4375 0,-0.5 0.21875,-0.92187 0.23438,-0.42188 0.60938,-0.67188 0.375,-0.25 0.84375,-0.39062 0.34375,-0.0781 1.04687,-0.17188 1.42188,-0.17187 2.09375,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.32812,-1.01563 -0.45313,-0.39062 -1.34375,-0.39062 -0.8125,0 -1.21875,0.29687 -0.39063,0.28125 -0.57813,1.01563 l -1.14062,-0.15625 q 0.15625,-0.73438 0.51562,-1.1875 0.35938,-0.45313 1.03125,-0.6875 0.67188,-0.25 1.5625,-0.25 0.89063,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.26563,0.3125 0.375,0.79688 0.0469,0.29687 0.0469,1.07812 v 1.5625 q 0,1.625 0.0781,2.0625 0.0781,0.4375 0.29688,0.82813 h -1.21875 q -0.1875,-0.35938 -0.23438,-0.85938 z m -0.0937,-2.60937 q -0.64062,0.26562 -1.92187,0.4375 -0.71875,0.10937 -1.01563,0.25 -0.29687,0.125 -0.46875,0.375 -0.15625,0.25 -0.15625,0.54687 0,0.46875 0.34375,0.78125 0.35938,0.3125 1.04688,0.3125 0.67187,0 1.20312,-0.29687 0.53125,-0.29688 0.78125,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.94373,6.125 -0.125,-1.09375 q 0.375,0.10937 0.65625,0.10937 0.39062,0 0.625,-0.14062 0.23437,-0.125 0.39062,-0.35938 0.10938,-0.17187 0.35938,-0.875 0.0312,-0.0937 0.10937,-0.28125 l -2.625,-6.92187 h 1.26563 l 1.4375,4 q 0.28125,0.76562 0.5,1.59375 0.20312,-0.79688 0.46875,-1.57813 l 1.48437,-4.01562 h 1.17188 l -2.625,7.01562 q -0.42188,1.14063 -0.65625,1.57813 -0.3125,0.57812 -0.71875,0.84375 -0.40625,0.28125 -0.96875,0.28125 -0.32813,0 -0.75,-0.15625 z m 6.27344,-6.10938 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 11.1781,3.45313 v -1.01563 q -0.8125,1.17188 -2.1875,1.17188 -0.60937,0 -1.14062,-0.23438 -0.53125,-0.23437 -0.79688,-0.57812 -0.25,-0.35938 -0.35937,-0.875 -0.0625,-0.34375 -0.0625,-1.09375 v -4.28125 h 1.17187 v 3.82812 q 0,0.92188 0.0625,1.23438 0.10938,0.46875 0.46875,0.73437 0.35938,0.25 0.89063,0.25 0.51562,0 0.98437,-0.26562 0.46875,-0.26563 0.65625,-0.73438 0.1875,-0.46875 0.1875,-1.34375 v -3.70312 h 1.17188 v 6.90625 z m 5.44373,-1.04688 0.17187,1.03125 q -0.5,0.10938 -0.89062,0.10938 -0.64063,0 -1,-0.20313 -0.34375,-0.20312 -0.48438,-0.53125 -0.14062,-0.32812 -0.14062,-1.39062 v -3.96875 h -0.85938 v -0.90625 h 0.85938 v -1.71875 l 1.17187,-0.70313 v 2.42188 h 1.17188 v 0.90625 h -1.17188 v 4.04687 q 0,0.5 0.0469,0.64063 0.0625,0.14062 0.20312,0.23437 0.14063,0.0781 0.40625,0.0781 0.20313,0 0.51563,-0.0469 z m 5.12472,1.04688 v -6 h -1.03125 v -0.90625 h 1.03125 v -0.73438 q 0,-0.70312 0.125,-1.04687 0.17188,-0.45313 0.59375,-0.73438 0.42188,-0.28125 1.20313,-0.28125 0.48437,0 1.09375,0.10938 l -0.1875,1.03125 q -0.35938,-0.0625 -0.6875,-0.0625 -0.53125,0 -0.75,0.23437 -0.21875,0.21875 -0.21875,0.84375 v 0.64063 h 1.34375 v 0.90625 h -1.34375 v 6 z m 2.98423,-3.45313 q 0,-1.92187 1.07812,-2.84375 0.89063,-0.76562 2.17188,-0.76562 1.42187,0 2.32812,0.9375 0.90625,0.92187 0.90625,2.57812 0,1.32813 -0.40625,2.09375 -0.39062,0.76563 -1.15625,1.1875 -0.76562,0.42188 -1.67187,0.42188 -1.45313,0 -2.35938,-0.92188 -0.89062,-0.9375 -0.89062,-2.6875 z m 1.20312,0 q 0,1.32813 0.57813,1.98438 0.59375,0.65625 1.46875,0.65625 0.875,0 1.45312,-0.65625 0.57813,-0.67188 0.57813,-2.03125 0,-1.28125 -0.59375,-1.9375 -0.57813,-0.65625 -1.4375,-0.65625 -0.875,0 -1.46875,0.65625 -0.57813,0.65625 -0.57813,1.98437 z m 6.63123,3.45313 v -6.90625 h 1.0625 v 1.04687 q 0.40625,-0.73437 0.73437,-0.96875 0.34375,-0.23437 0.76563,-0.23437 0.59375,0 1.20312,0.375 l -0.40625,1.07812 q -0.4375,-0.25 -0.85937,-0.25 -0.39063,0 -0.70313,0.23438 -0.29687,0.23437 -0.42187,0.64062 -0.20313,0.625 -0.20313,1.35938 v 3.625 z m 8.15698,2.65625 v -9.5625 h 1.07812 v 0.89062 q 0.375,-0.53125 0.84375,-0.78125 0.48438,-0.26562 1.15625,-0.26562 0.875,0 1.54688,0.45312 0.68752,0.45313 1.03122,1.28125 0.3438,0.82813 0.3438,1.82813 0,1.04687 -0.375,1.90625 -0.375,0.84375 -1.1094,1.29687 -0.71875,0.45313 -1.53125,0.45313 -0.57812,0 -1.04687,-0.25 -0.46875,-0.25 -0.76563,-0.625 v 3.375 z m 1.0625,-6.07813 q 0,1.34375 0.53125,1.98438 0.54687,0.625 1.3125,0.625 0.78125,0 1.34375,-0.65625 0.5625,-0.65625 0.5625,-2.04688 0,-1.3125 -0.54688,-1.96875 -0.54687,-0.67187 -1.29687,-0.67187 -0.75,0 -1.32813,0.70312 -0.57812,0.70313 -0.57812,2.03125 z m 11.08432,1.20313 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 6.5219,4.125 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1719 v -4.20313 q 0,-0.71875 -0.1406,-1.0625 -0.1407,-0.35937 -0.4844,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 11.8968,0 v -0.875 q -0.6562,1.03125 -1.9375,1.03125 -0.8125,0 -1.5156,-0.45313 -0.6875,-0.45312 -1.0781,-1.26562 -0.375,-0.82813 -0.375,-1.89063 0,-1.03125 0.3437,-1.875 0.3438,-0.84375 1.0313,-1.28125 0.7031,-0.45312 1.5468,-0.45312 0.625,0 1.1094,0.26562 0.5,0.25 0.7969,0.67188 v -3.42188 h 1.1719 v 9.54688 z m -3.7031,-3.45313 q 0,1.32813 0.5625,1.98438 0.5625,0.65625 1.3281,0.65625 0.7656,0 1.2969,-0.625 0.5312,-0.625 0.5312,-1.90625 0,-1.42188 -0.5468,-2.07813 -0.5469,-0.67187 -1.3438,-0.67187 -0.7812,0 -1.3125,0.64062 -0.5156,0.625 -0.5156,2 z m 6.6468,-4.73437 v -1.35938 h 1.1719 v 1.35938 z m 0,8.1875 v -6.90625 h 1.1719 v 6.90625 z m 2.9455,0 v -6.90625 h 1.0625 v 0.98437 q 0.75,-1.14062 2.1875,-1.14062 0.625,0 1.1562,0.21875 0.5313,0.21875 0.7813,0.59375 0.2656,0.35937 0.375,0.85937 0.062,0.32813 0.062,1.14063 v 4.25 h -1.1719 v -4.20313 q 0,-0.71875 -0.1406,-1.0625 -0.1407,-0.35937 -0.4844,-0.5625 -0.3438,-0.21875 -0.8125,-0.21875 -0.75,0 -1.2969,0.46875 -0.5469,0.46875 -0.5469,1.79688 v 3.78125 z m 7.1937,0.57812 1.1406,0.15625 q 0.078,0.53125 0.4063,0.78125 0.4375,0.3125 1.1875,0.3125 0.8125,0 1.25,-0.32812 0.4531,-0.3125 0.6093,-0.90625 0.094,-0.35938 0.078,-1.5 -0.7656,0.90625 -1.9062,0.90625 -1.4375,0 -2.2188,-1.03125 -0.7812,-1.03125 -0.7812,-2.46875 0,-0.98438 0.3594,-1.8125 0.3593,-0.84375 1.0312,-1.29688 0.6875,-0.45312 1.6094,-0.45312 1.2187,0 2.0156,0.98437 v -0.82812 h 1.0781 v 5.96875 q 0,1.60937 -0.3281,2.28125 -0.3281,0.6875 -1.0469,1.07812 -0.7031,0.39063 -1.75,0.39063 -1.2343,0 -2,-0.5625 -0.75,-0.5625 -0.7343,-1.67188 z m 0.9844,-4.15625 q 0,1.35938 0.5312,1.98438 0.5469,0.625 1.3594,0.625 0.7969,0 1.3437,-0.625 0.5469,-0.625 0.5469,-1.95313 0,-1.26562 -0.5625,-1.90625 -0.5625,-0.64062 -1.3594,-0.64062 -0.7656,0 -1.3125,0.64062 -0.5468,0.625 -0.5468,1.875 z m 9.8811,1.51563 1.1562,-0.1875 q 0.1094,0.70312 0.5469,1.07812 0.4531,0.35938 1.25,0.35938 0.8125,0 1.2031,-0.32813 0.3907,-0.32812 0.3907,-0.76562 0,-0.39063 -0.3594,-0.625 -0.2344,-0.15625 -1.1875,-0.39063 -1.2969,-0.32812 -1.7969,-0.5625 -0.4844,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.2031,-0.84375 0.2188,-0.40625 0.5782,-0.67187 0.2812,-0.1875 0.75,-0.32813 0.4687,-0.14062 1.0156,-0.14062 0.8125,0 1.4219,0.23437 0.6093,0.23438 0.9062,0.64063 0.2969,0.39062 0.4063,1.0625 l -1.1407,0.15625 q -0.078,-0.53125 -0.4531,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.1562,0.26563 -0.3438,0.26562 -0.3438,0.625 0,0.23437 0.1406,0.42187 0.1563,0.1875 0.4532,0.3125 0.1718,0.0625 1.0312,0.29688 1.25,0.32812 1.7344,0.54687 0.5,0.20313 0.7812,0.60938 0.2813,0.40625 0.2813,1 0,0.59375 -0.3438,1.10937 -0.3437,0.51563 -1,0.79688 -0.6406,0.28125 -1.4531,0.28125 -1.3437,0 -2.0469,-0.5625 -0.7031,-0.5625 -0.9062,-1.65625 z m 9.6953,1.01562 0.1719,1.03125 q -0.5,0.10938 -0.8907,0.10938 -0.6406,0 -1,-0.20313 -0.3437,-0.20312 -0.4843,-0.53125 -0.1407,-0.32812 -0.1407,-1.39062 v -3.96875 h -0.8593 v -0.90625 h 0.8593 v -1.71875 l 1.1719,-0.70313 v 2.42188 h 1.1719 v 0.90625 h -1.1719 v 4.04687 q 0,0.5 0.047,0.64063 0.062,0.14062 0.2031,0.23437 0.1407,0.0781 0.4063,0.0781 0.2031,0 0.5156,-0.0469 z m 1.1249,1.04688 v -6.90625 h 1.0625 v 1.04687 q 0.4062,-0.73437 0.7343,-0.96875 0.3438,-0.23437 0.7657,-0.23437 0.5937,0 1.2031,0.375 l -0.4063,1.07812 q -0.4375,-0.25 -0.8593,-0.25 -0.3907,0 -0.7032,0.23438 -0.2968,0.23437 -0.4218,0.64062 -0.2032,0.625 -0.2032,1.35938 v 3.625 z m 9.1883,-2.21875 1.2031,0.14062 q -0.2812,1.0625 -1.0625,1.65625 -0.7656,0.57813 -1.9687,0.57813 -1.5156,0 -2.4063,-0.9375 -0.8906,-0.9375 -0.8906,-2.60938 0,-1.75 0.8906,-2.70312 0.9063,-0.96875 2.3438,-0.96875 1.3906,0 2.2656,0.9375 0.875,0.9375 0.875,2.65625 0,0.10937 0,0.3125 h -5.1562 q 0.062,1.14062 0.6406,1.75 0.5781,0.59375 1.4375,0.59375 0.6562,0 1.1094,-0.32813 0.4531,-0.34375 0.7187,-1.07812 z m -3.8437,-1.90625 h 3.8593 q -0.078,-0.85938 -0.4375,-1.29688 -0.5625,-0.6875 -1.4531,-0.6875 -0.8125,0 -1.3594,0.54688 -0.5468,0.53125 -0.6093,1.4375 z m 11.0374,3.26562 q -0.6562,0.5625 -1.2656,0.79688 -0.5937,0.21875 -1.2812,0.21875 -1.1407,0 -1.75,-0.54688 -0.6094,-0.5625 -0.6094,-1.4375 0,-0.5 0.2187,-0.92187 0.2344,-0.42188 0.6094,-0.67188 0.375,-0.25 0.8438,-0.39062 0.3437,-0.0781 1.0468,-0.17188 1.4219,-0.17187 2.0938,-0.40625 0,-0.23437 0,-0.29687 0,-0.71875 -0.3281,-1.01563 -0.4532,-0.39062 -1.3438,-0.39062 -0.8125,0 -1.2187,0.29687 -0.3907,0.28125 -0.5782,1.01563 l -1.1406,-0.15625 q 0.1563,-0.73438 0.5156,-1.1875 0.3594,-0.45313 1.0313,-0.6875 0.6719,-0.25 1.5625,-0.25 0.8906,0 1.4375,0.20312 0.5625,0.20313 0.8125,0.53125 0.2656,0.3125 0.375,0.79688 0.047,0.29687 0.047,1.07812 v 1.5625 q 0,1.625 0.078,2.0625 0.078,0.4375 0.2969,0.82813 h -1.2188 q -0.1875,-0.35938 -0.2344,-0.85938 z m -0.094,-2.60937 q -0.6406,0.26562 -1.9218,0.4375 -0.7188,0.10937 -1.0157,0.25 -0.2968,0.125 -0.4687,0.375 -0.1563,0.25 -0.1563,0.54687 0,0.46875 0.3438,0.78125 0.3594,0.3125 1.0469,0.3125 0.6718,0 1.2031,-0.29687 0.5312,-0.29688 0.7812,-0.8125 0.1875,-0.39063 0.1875,-1.17188 z m 2.9906,3.46875 v -6.90625 h 1.0469 v 0.96875 q 0.3281,-0.51563 0.8594,-0.8125 0.5469,-0.3125 1.2344,-0.3125 0.7812,0 1.2656,0.3125 0.4844,0.3125 0.6875,0.89062 0.8281,-1.20312 2.1406,-1.20312 1.0313,0 1.5781,0.57812 0.5625,0.5625 0.5625,1.73438 v 4.75 h -1.1718 v -4.35938 q 0,-0.70312 -0.125,-1 -0.1094,-0.3125 -0.4063,-0.5 -0.2969,-0.1875 -0.7031,-0.1875 -0.7188,0 -1.2031,0.48438 -0.4844,0.48437 -0.4844,1.54687 v 4.01563 h -1.1719 v -4.48438 q 0,-0.78125 -0.2969,-1.17187 -0.2812,-0.39063 -0.9218,-0.39063 -0.5,0 -0.9219,0.26563 -0.4219,0.25 -0.6094,0.75 -0.1875,0.5 -0.1875,1.45312 v 3.57813 z m 10.6337,-2.0625 1.1563,-0.1875 q 0.1093,0.70312 0.5468,1.07812 0.4532,0.35938 1.25,0.35938 0.8125,0 1.2032,-0.32813 0.3906,-0.32812 0.3906,-0.76562 0,-0.39063 -0.3594,-0.625 -0.2344,-0.15625 -1.1875,-0.39063 -1.2969,-0.32812 -1.7969,-0.5625 -0.4843,-0.25 -0.75,-0.65625 -0.25,-0.42187 -0.25,-0.9375 0,-0.45312 0.2032,-0.84375 0.2187,-0.40625 0.5781,-0.67187 0.2812,-0.1875 0.75,-0.32813 0.4687,-0.14062 1.0156,-0.14062 0.8125,0 1.4219,0.23437 0.6094,0.23438 0.9062,0.64063 0.2969,0.39062 0.4063,1.0625 l -1.1406,0.15625 q -0.078,-0.53125 -0.4532,-0.82813 -0.375,-0.3125 -1.0625,-0.3125 -0.8125,0 -1.1562,0.26563 -0.3438,0.26562 -0.3438,0.625 0,0.23437 0.1407,0.42187 0.1562,0.1875 0.4531,0.3125 0.1719,0.0625 1.0312,0.29688 1.25,0.32812 1.7344,0.54687 0.5,0.20313 0.7813,0.60938 0.2812,0.40625 0.2812,1 0,0.59375 -0.3437,1.10937 -0.3438,0.51563 -1,0.79688 -0.6407,0.28125 -1.4532,0.28125 -1.3437,0 -2.0468,-0.5625 -0.7032,-0.5625 -0.9063,-1.65625 z"
-       fill-rule="nonzero"
-       id="path380"
-       style="fill:#88aa00" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 517.42329,154.1406 h 115.4646 v 27.46455 h -115.4646 z"
-       fill-rule="evenodd"
-       id="path382" />
-    <path
-       fill="#000000"
-       d="m 533.48579,171.64496 1.125,0.29687 q -0.3594,1.39063 -1.2813,2.125 -0.9218,0.73438 -2.2656,0.73438 -1.3906,0 -2.2656,-0.5625 -0.875,-0.5625 -1.3281,-1.625 -0.4532,-1.07813 -0.4532,-2.3125 0,-1.34375 0.5157,-2.34375 0.5156,-1 1.4531,-1.51563 0.9531,-0.51562 2.0937,-0.51562 1.2813,0 2.1563,0.65625 0.8906,0.65625 1.2344,1.84375 l -1.125,0.26562 q -0.2969,-0.9375 -0.875,-1.35937 -0.5625,-0.4375 -1.4219,-0.4375 -0.9844,0 -1.6563,0.48437 -0.6562,0.46875 -0.9375,1.26563 -0.2656,0.79687 -0.2656,1.65625 0,1.09375 0.3125,1.90625 0.3281,0.8125 1,1.21875 0.6719,0.40625 1.4688,0.40625 0.9531,0 1.6093,-0.54688 0.6719,-0.54687 0.9063,-1.64062 z m 2.4004,-4.35938 v -1.21875 h 1.0625 v 1.21875 z m 0,7.375 v -6.21875 h 1.0625 v 6.21875 z m 2.6504,0 v -6.21875 h 0.9531 v 0.9375 q 0.3594,-0.65625 0.6563,-0.85937 0.3125,-0.21875 0.6875,-0.21875 0.5312,0 1.0781,0.32812 l -0.3594,0.98438 q -0.3906,-0.23438 -0.7656,-0.23438 -0.3594,0 -0.6406,0.21875 -0.2657,0.20313 -0.375,0.57813 -0.1875,0.5625 -0.1875,1.21875 v 3.26562 z m 8.0742,-2.28125 1.0312,0.14063 q -0.1718,1.0625 -0.875,1.67187 -0.7031,0.60938 -1.7187,0.60938 -1.2813,0 -2.0625,-0.82813 -0.7656,-0.84375 -0.7656,-2.40625 0,-1 0.3281,-1.75 0.3437,-0.76562 1.0156,-1.14062 0.6875,-0.375 1.5,-0.375 1,0 1.6406,0.51562 0.6563,0.5 0.8438,1.45313 l -1.0313,0.15625 q -0.1406,-0.625 -0.5156,-0.9375 -0.375,-0.32813 -0.9062,-0.32813 -0.7969,0 -1.2969,0.57813 -0.5,0.5625 -0.5,1.79687 0,1.26563 0.4844,1.82813 0.4843,0.5625 1.25,0.5625 0.625,0 1.0312,-0.375 0.4219,-0.375 0.5469,-1.17188 z m 6.0156,2.28125 v -0.92187 q -0.7344,1.0625 -1.9844,1.0625 -0.5468,0 -1.0312,-0.20313 -0.4688,-0.21875 -0.7031,-0.53125 -0.2344,-0.32812 -0.3282,-0.79687 -0.062,-0.29688 -0.062,-0.98438 v -3.84375 h 1.0625 v 3.45313 q 0,0.8125 0.062,1.10937 0.094,0.40625 0.4063,0.65625 0.3281,0.23438 0.8125,0.23438 0.4687,0 0.875,-0.23438 0.4219,-0.25 0.5937,-0.67187 0.1875,-0.42188 0.1875,-1.21875 v -3.32813 h 1.0469 v 6.21875 z m 2.5645,0 v -8.59375 h 1.0625 v 8.59375 z m 6.7597,-0.76562 q -0.5937,0.5 -1.1406,0.70312 -0.5312,0.20313 -1.1562,0.20313 -1.0313,0 -1.5782,-0.5 -0.5468,-0.5 -0.5468,-1.28125 0,-0.45313 0.2031,-0.82813 0.2031,-0.39062 0.5469,-0.60937 0.3437,-0.23438 0.7656,-0.34375 0.2969,-0.0937 0.9375,-0.17188 1.2656,-0.14062 1.875,-0.35937 0,-0.21875 0,-0.26563 0,-0.65625 -0.2969,-0.92187 -0.4062,-0.34375 -1.2031,-0.34375 -0.7344,0 -1.0938,0.26562 -0.3593,0.25 -0.5312,0.90625 l -1.0313,-0.14062 q 0.1407,-0.65625 0.4688,-1.0625 0.3281,-0.40625 0.9375,-0.625 0.6094,-0.21875 1.4062,-0.21875 0.7969,0 1.2969,0.1875 0.5,0.1875 0.7344,0.46875 0.2344,0.28125 0.3281,0.71875 0.047,0.26562 0.047,0.96875 v 1.40625 q 0,1.46875 0.062,1.85937 0.078,0.39063 0.2813,0.75 h -1.1094 q -0.1563,-0.32812 -0.2031,-0.76562 z m -0.094,-2.35938 q -0.5781,0.23438 -1.7187,0.40625 -0.6563,0.0937 -0.9219,0.21875 -0.2656,0.10938 -0.4219,0.32813 -0.1406,0.21875 -0.1406,0.5 0,0.42187 0.3125,0.70312 0.3281,0.28125 0.9375,0.28125 0.6094,0 1.0781,-0.26562 0.4844,-0.26563 0.7032,-0.73438 0.1718,-0.35937 0.1718,-1.04687 z m 2.6895,3.125 v -6.21875 h 0.9531 v 0.9375 q 0.3594,-0.65625 0.6563,-0.85937 0.3125,-0.21875 0.6875,-0.21875 0.5312,0 1.0781,0.32812 l -0.3594,0.98438 q -0.3906,-0.23438 -0.7656,-0.23438 -0.3594,0 -0.6406,0.21875 -0.2657,0.20313 -0.375,0.57813 -0.1875,0.5625 -0.1875,1.21875 v 3.26562 z m 8.3144,0 h -0.9843 v -8.59375 h 1.0625 v 3.0625 q 0.6718,-0.82812 1.7031,-0.82812 0.5781,0 1.0781,0.23437 0.5156,0.21875 0.8438,0.64063 0.3437,0.42187 0.5312,1.01562 0.1875,0.59375 0.1875,1.26563 0,1.59375 -0.7969,2.46875 -0.7968,0.875 -1.8906,0.875 -1.1094,0 -1.7344,-0.92188 z m -0.016,-3.15625 q 0,1.10938 0.3125,1.60938 0.5,0.8125 1.3438,0.8125 0.6875,0 1.1875,-0.59375 0.5156,-0.59375 0.5156,-1.79688 0,-1.21875 -0.4844,-1.79687 -0.4843,-0.57813 -1.1718,-0.57813 -0.6875,0 -1.2032,0.60938 -0.5,0.59375 -0.5,1.73437 z m 9.7989,3.15625 v -0.92187 q -0.7344,1.0625 -1.9844,1.0625 -0.5469,0 -1.0313,-0.20313 -0.4687,-0.21875 -0.7031,-0.53125 -0.2344,-0.32812 -0.3281,-0.79687 -0.062,-0.29688 -0.062,-0.98438 v -3.84375 h 1.0625 v 3.45313 q 0,0.8125 0.062,1.10937 0.094,0.40625 0.4062,0.65625 0.3282,0.23438 0.8125,0.23438 0.4688,0 0.875,-0.23438 0.4219,-0.25 0.5938,-0.67187 0.1875,-0.42188 0.1875,-1.21875 v -3.32813 h 1.0469 v 6.21875 z m 2.8457,0 v -5.40625 h -0.9375 v -0.8125 h 0.9375 v -0.67187 q 0,-0.625 0.1093,-0.92188 0.1563,-0.42187 0.5313,-0.67187 0.3906,-0.25 1.0781,-0.25 0.4531,0 0.9844,0.10937 l -0.1563,0.90625 q -0.3281,-0.0469 -0.625,-0.0469 -0.4843,0 -0.6875,0.20312 -0.1875,0.20313 -0.1875,0.76563 v 0.57812 h 1.2188 v 0.8125 h -1.2188 v 5.40625 z m 5.9961,-1.85937 1.0312,-0.15625 q 0.094,0.625 0.4844,0.95312 0.4062,0.32813 1.1406,0.32813 0.7188,0 1.0625,-0.28125 0.3594,-0.29688 0.3594,-0.70313 0,-0.35937 -0.3125,-0.5625 -0.2188,-0.14062 -1.0781,-0.35937 -1.1563,-0.29688 -1.6094,-0.5 -0.4375,-0.21875 -0.6719,-0.59375 -0.2344,-0.375 -0.2344,-0.84375 0,-0.40625 0.1875,-0.76563 0.1875,-0.35937 0.5157,-0.59375 0.25,-0.17187 0.6718,-0.29687 0.4219,-0.125 0.9219,-0.125 0.7188,0 1.2656,0.21875 0.5625,0.20312 0.8282,0.5625 0.2656,0.35937 0.3593,0.95312 l -1.0312,0.14063 q -0.062,-0.46875 -0.4063,-0.73438 -0.3281,-0.28125 -0.9531,-0.28125 -0.7187,0 -1.0312,0.25 -0.3125,0.23438 -0.3125,0.5625 0,0.20313 0.125,0.35938 0.1406,0.17187 0.4062,0.28125 0.1563,0.0625 0.9375,0.26562 1.125,0.3125 1.5625,0.5 0.4375,0.1875 0.6875,0.54688 0.25,0.35937 0.25,0.90625 0,0.53125 -0.3125,1 -0.2969,0.45312 -0.875,0.71875 -0.5781,0.25 -1.3125,0.25 -1.2187,0 -1.8594,-0.5 -0.625,-0.51563 -0.7968,-1.5 z m 8.7187,0.92187 0.1563,0.92188 q -0.4532,0.0937 -0.7969,0.0937 -0.5781,0 -0.8906,-0.17188 -0.3125,-0.1875 -0.4532,-0.48437 -0.125,-0.29688 -0.125,-1.25 v -3.57813 h -0.7656 v -0.8125 h 0.7656 v -1.54687 l 1.0469,-0.625 v 2.17187 h 1.0625 v 0.8125 h -1.0625 v 3.64063 q 0,0.45312 0.047,0.57812 0.062,0.125 0.1875,0.20313 0.125,0.0781 0.3594,0.0781 0.1875,0 0.4687,-0.0312 z m 5.0996,0.17188 q -0.5937,0.5 -1.1406,0.70312 -0.5313,0.20313 -1.1563,0.20313 -1.0312,0 -1.5781,-0.5 -0.5469,-0.5 -0.5469,-1.28125 0,-0.45313 0.2032,-0.82813 0.2031,-0.39062 0.5468,-0.60937 0.3438,-0.23438 0.7657,-0.34375 0.2968,-0.0937 0.9375,-0.17188 1.2656,-0.14062 1.875,-0.35937 0,-0.21875 0,-0.26563 0,-0.65625 -0.2969,-0.92187 -0.4063,-0.34375 -1.2031,-0.34375 -0.7344,0 -1.0938,0.26562 -0.3594,0.25 -0.5312,0.90625 l -1.0313,-0.14062 q 0.1406,-0.65625 0.4688,-1.0625 0.3281,-0.40625 0.9375,-0.625 0.6093,-0.21875 1.4062,-0.21875 0.7969,0 1.2969,0.1875 0.5,0.1875 0.7344,0.46875 0.2343,0.28125 0.3281,0.71875 0.047,0.26562 0.047,0.96875 v 1.40625 q 0,1.46875 0.062,1.85937 0.078,0.39063 0.2812,0.75 h -1.1093 q -0.1563,-0.32812 -0.2032,-0.76562 z m -0.094,-2.35938 q -0.5781,0.23438 -1.7187,0.40625 -0.6563,0.0937 -0.9219,0.21875 -0.2656,0.10938 -0.4219,0.32813 -0.1406,0.21875 -0.1406,0.5 0,0.42187 0.3125,0.70312 0.3281,0.28125 0.9375,0.28125 0.6094,0 1.0781,-0.26562 0.4844,-0.26563 0.7031,-0.73438 0.1719,-0.35937 0.1719,-1.04687 z m 2.6895,3.125 v -6.21875 h 0.9531 v 0.9375 q 0.3594,-0.65625 0.6563,-0.85937 0.3125,-0.21875 0.6875,-0.21875 0.5312,0 1.0781,0.32812 l -0.3594,0.98438 q -0.3906,-0.23438 -0.7656,-0.23438 -0.3594,0 -0.6406,0.21875 -0.2657,0.20313 -0.375,0.57813 -0.1875,0.5625 -0.1875,1.21875 v 3.26562 z m 6.3086,-0.9375 0.1562,0.92188 q -0.4531,0.0937 -0.7969,0.0937 -0.5781,0 -0.8906,-0.17188 -0.3125,-0.1875 -0.4531,-0.48437 -0.125,-0.29688 -0.125,-1.25 v -3.57813 h -0.7656 v -0.8125 h 0.7656 v -1.54687 l 1.0469,-0.625 v 2.17187 h 1.0625 v 0.8125 h -1.0625 v 3.64063 q 0,0.45312 0.047,0.57812 0.062,0.125 0.1875,0.20313 0.125,0.0781 0.3594,0.0781 0.1875,0 0.4687,-0.0312 z"
-       fill-rule="nonzero"
-       id="path384" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 590.79859,181.60515 h -61.2598"
-       fill-rule="evenodd"
-       id="path386" />
-    <path
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="8, 3"
-       d="m 590.79859,181.60515 h -55.2598"
-       fill-rule="evenodd"
-       id="path388"
-       style="fill:#00ffcc" />
-    <path
-       fill="#595959"
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 535.53879,179.95344 -4.5381,1.65172 4.5381,1.65173 z"
-       fill-rule="evenodd"
-       id="path390" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 521.92459,298.1406 h 115.4645 v 27.46457 h -115.4645 z"
-       fill-rule="evenodd"
-       id="path392" />
-    <path
-       fill="#000000"
-       d="m 537.98709,315.64498 1.125,0.29687 q -0.3594,1.39063 -1.2813,2.125 -0.9218,0.73438 -2.2656,0.73438 -1.3906,0 -2.2656,-0.5625 -0.875,-0.5625 -1.3281,-1.625 -0.4532,-1.07813 -0.4532,-2.3125 0,-1.34375 0.5157,-2.34375 0.5156,-1 1.4531,-1.51563 0.9531,-0.51562 2.0937,-0.51562 1.2813,0 2.1563,0.65625 0.8906,0.65625 1.2344,1.84375 l -1.125,0.26562 q -0.2969,-0.9375 -0.875,-1.35937 -0.5625,-0.4375 -1.4219,-0.4375 -0.9844,0 -1.6563,0.48437 -0.6562,0.46875 -0.9375,1.26563 -0.2656,0.79687 -0.2656,1.65625 0,1.09375 0.3125,1.90625 0.3281,0.8125 1,1.21875 0.6719,0.40625 1.4688,0.40625 0.9531,0 1.6093,-0.54688 0.6719,-0.54687 0.9063,-1.64062 z m 2.4004,-4.35938 v -1.21875 h 1.0625 v 1.21875 z m 0,7.375 v -6.21875 h 1.0625 v 6.21875 z m 2.6504,0 v -6.21875 h 0.9531 v 0.9375 q 0.3594,-0.65625 0.6563,-0.85937 0.3125,-0.21875 0.6875,-0.21875 0.5312,0 1.0781,0.32812 l -0.3594,0.98438 q -0.3906,-0.23438 -0.7656,-0.23438 -0.3594,0 -0.6406,0.21875 -0.2657,0.20313 -0.375,0.57813 -0.1875,0.5625 -0.1875,1.21875 v 3.26562 z m 8.0742,-2.28125 1.0312,0.14063 q -0.1718,1.0625 -0.875,1.67187 -0.7031,0.60938 -1.7187,0.60938 -1.2813,0 -2.0625,-0.82813 -0.7656,-0.84375 -0.7656,-2.40625 0,-1 0.3281,-1.75 0.3437,-0.76562 1.0156,-1.14062 0.6875,-0.375 1.5,-0.375 1,0 1.6406,0.51562 0.6563,0.5 0.8438,1.45313 l -1.0313,0.15625 q -0.1406,-0.625 -0.5156,-0.9375 -0.375,-0.32813 -0.9062,-0.32813 -0.7969,0 -1.2969,0.57813 -0.5,0.5625 -0.5,1.79687 0,1.26563 0.4844,1.82813 0.4843,0.5625 1.25,0.5625 0.625,0 1.0312,-0.375 0.4219,-0.375 0.5469,-1.17188 z m 6.0156,2.28125 v -0.92187 q -0.7344,1.0625 -1.9844,1.0625 -0.5468,0 -1.0312,-0.20313 -0.4688,-0.21875 -0.7031,-0.53125 -0.2344,-0.32812 -0.3282,-0.79687 -0.062,-0.29688 -0.062,-0.98438 v -3.84375 h 1.0625 v 3.45313 q 0,0.8125 0.062,1.10937 0.094,0.40625 0.4063,0.65625 0.3281,0.23438 0.8125,0.23438 0.4687,0 0.875,-0.23438 0.4219,-0.25 0.5937,-0.67187 0.1875,-0.42188 0.1875,-1.21875 v -3.32813 h 1.0469 v 6.21875 z m 2.5645,0 v -8.59375 h 1.0625 v 8.59375 z m 6.7597,-0.76562 q -0.5937,0.5 -1.1406,0.70312 -0.5312,0.20313 -1.1562,0.20313 -1.0313,0 -1.5782,-0.5 -0.5468,-0.5 -0.5468,-1.28125 0,-0.45313 0.2031,-0.82813 0.2031,-0.39062 0.5469,-0.60937 0.3437,-0.23438 0.7656,-0.34375 0.2969,-0.0937 0.9375,-0.17188 1.2656,-0.14062 1.875,-0.35937 0,-0.21875 0,-0.26563 0,-0.65625 -0.2969,-0.92187 -0.4062,-0.34375 -1.2031,-0.34375 -0.7344,0 -1.0938,0.26562 -0.3593,0.25 -0.5312,0.90625 l -1.0313,-0.14062 q 0.1407,-0.65625 0.4688,-1.0625 0.3281,-0.40625 0.9375,-0.625 0.6094,-0.21875 1.4062,-0.21875 0.7969,0 1.2969,0.1875 0.5,0.1875 0.7344,0.46875 0.2344,0.28125 0.3281,0.71875 0.047,0.26562 0.047,0.96875 v 1.40625 q 0,1.46875 0.062,1.85937 0.078,0.39063 0.2813,0.75 h -1.1094 q -0.1563,-0.32812 -0.2031,-0.76562 z m -0.094,-2.35938 q -0.5781,0.23438 -1.7187,0.40625 -0.6563,0.0937 -0.9219,0.21875 -0.2656,0.10938 -0.4219,0.32813 -0.1406,0.21875 -0.1406,0.5 0,0.42187 0.3125,0.70312 0.3281,0.28125 0.9375,0.28125 0.6094,0 1.0781,-0.26562 0.4844,-0.26563 0.7032,-0.73438 0.1718,-0.35937 0.1718,-1.04687 z m 2.6895,3.125 v -6.21875 h 0.9531 v 0.9375 q 0.3594,-0.65625 0.6563,-0.85937 0.3125,-0.21875 0.6875,-0.21875 0.5312,0 1.0781,0.32812 l -0.3594,0.98438 q -0.3906,-0.23438 -0.7656,-0.23438 -0.3594,0 -0.6406,0.21875 -0.2657,0.20313 -0.375,0.57813 -0.1875,0.5625 -0.1875,1.21875 v 3.26562 z m 8.3144,0 h -0.9843 v -8.59375 h 1.0625 v 3.0625 q 0.6718,-0.82812 1.7031,-0.82812 0.5781,0 1.0781,0.23437 0.5156,0.21875 0.8438,0.64063 0.3437,0.42187 0.5312,1.01562 0.1875,0.59375 0.1875,1.26563 0,1.59375 -0.7969,2.46875 -0.7968,0.875 -1.8906,0.875 -1.1094,0 -1.7344,-0.92188 z m -0.016,-3.15625 q 0,1.10938 0.3125,1.60938 0.5,0.8125 1.3438,0.8125 0.6875,0 1.1875,-0.59375 0.5156,-0.59375 0.5156,-1.79688 0,-1.21875 -0.4844,-1.79687 -0.4843,-0.57813 -1.1718,-0.57813 -0.6875,0 -1.2032,0.60938 -0.5,0.59375 -0.5,1.73437 z m 9.7989,3.15625 v -0.92187 q -0.7344,1.0625 -1.9844,1.0625 -0.5469,0 -1.0313,-0.20313 -0.4687,-0.21875 -0.7031,-0.53125 -0.2344,-0.32812 -0.3281,-0.79687 -0.062,-0.29688 -0.062,-0.98438 v -3.84375 h 1.0625 v 3.45313 q 0,0.8125 0.062,1.10937 0.094,0.40625 0.4062,0.65625 0.3282,0.23438 0.8125,0.23438 0.4688,0 0.875,-0.23438 0.4219,-0.25 0.5938,-0.67187 0.1875,-0.42188 0.1875,-1.21875 v -3.32813 h 1.0469 v 6.21875 z m 2.8457,0 v -5.40625 h -0.9375 v -0.8125 h 0.9375 v -0.67187 q 0,-0.625 0.1093,-0.92188 0.1563,-0.42187 0.5313,-0.67187 0.3906,-0.25 1.0781,-0.25 0.4531,0 0.9844,0.10937 l -0.1563,0.90625 q -0.3281,-0.0469 -0.625,-0.0469 -0.4843,0 -0.6875,0.20312 -0.1875,0.20313 -0.1875,0.76563 v 0.57812 h 1.2188 v 0.8125 h -1.2188 v 5.40625 z m 10.6679,-2 1.0938,0.125 q -0.25,0.95313 -0.9531,1.48438 -0.7032,0.53125 -1.7813,0.53125 -1.3594,0 -2.1719,-0.84375 -0.7968,-0.84375 -0.7968,-2.35938 0,-1.5625 0.8125,-2.42187 0.8125,-0.875 2.0937,-0.875 1.25,0 2.0313,0.84375 0.7968,0.84375 0.7968,2.39062 0,0.0937 0,0.28125 h -4.6406 q 0.062,1.03125 0.5781,1.57813 0.5157,0.53125 1.2969,0.53125 0.5781,0 0.9844,-0.29688 0.4219,-0.3125 0.6562,-0.96875 z m -3.4531,-1.70312 h 3.4688 q -0.062,-0.79688 -0.3907,-1.1875 -0.5156,-0.60938 -1.3125,-0.60938 -0.7343,0 -1.2343,0.48438 -0.4844,0.48437 -0.5313,1.3125 z m 5.877,3.70312 v -6.21875 h 0.9375 v 0.875 q 0.6875,-1.01562 1.9843,-1.01562 0.5625,0 1.0313,0.20312 0.4844,0.20313 0.7187,0.53125 0.2344,0.32813 0.3282,0.76563 0.047,0.29687 0.047,1.03125 v 3.82812 h -1.0469 v -3.78125 q 0,-0.65625 -0.125,-0.96875 -0.125,-0.3125 -0.4375,-0.5 -0.3125,-0.20312 -0.7344,-0.20312 -0.6719,0 -1.1719,0.4375 -0.4843,0.42187 -0.4843,1.60937 v 3.40625 z m 10.705,0 v -0.78125 q -0.5937,0.92188 -1.7343,0.92188 -0.75,0 -1.375,-0.40625 -0.625,-0.42188 -0.9688,-1.15625 -0.3437,-0.73438 -0.3437,-1.6875 0,-0.92188 0.3125,-1.6875 0.3125,-0.76563 0.9375,-1.15625 0.625,-0.40625 1.3906,-0.40625 0.5625,0 1,0.23437 0.4375,0.23438 0.7187,0.60938 v -3.07813 h 1.0469 v 8.59375 z m -3.3281,-3.10937 q 0,1.20312 0.5,1.79687 0.5,0.57813 1.1875,0.57813 0.6875,0 1.1719,-0.5625 0.4844,-0.5625 0.4844,-1.71875 0,-1.28125 -0.5,-1.875 -0.4844,-0.59375 -1.2032,-0.59375 -0.7031,0 -1.1718,0.57812 -0.4688,0.5625 -0.4688,1.79688 z"
-       fill-rule="nonzero"
-       id="path394" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 587.53349,322.39257 h -61.2598"
-       fill-rule="evenodd"
-       id="path396" />
-    <path
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="8, 3"
-       d="m 587.53349,322.39257 h -55.2598"
-       fill-rule="evenodd"
-       id="path398"
-       style="fill:#00ffcc" />
-    <path
-       fill="#595959"
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 532.27369,320.74084 -4.5381,1.65173 4.5381,1.65174 z"
-       fill-rule="evenodd"
-       id="path400" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="M 272.64375,180.18784 358.15556,77.542157"
-       fill-rule="evenodd"
-       id="path402" />
-    <path
-       stroke="#a61c00"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="1, 3"
-       d="M 272.64375,180.18784 354.31514,82.152067"
-       fill-rule="evenodd"
-       id="path404" />
-    <path
-       fill="#a61c00"
-       stroke="#a61c00"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 355.58421,83.209287 1.63562,-4.54392 -4.17374,2.42948 z"
-       fill-rule="evenodd"
-       id="path406" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="m 272.24478,215.52642 88,105.60629"
-       fill-rule="evenodd"
-       id="path408" />
-    <path
-       stroke="#a61c00"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="1, 3"
-       d="m 272.24478,215.52642 84.15903,100.99686"
-       fill-rule="evenodd"
-       id="path410" />
-    <path
-       fill="#a61c00"
-       stroke="#a61c00"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 355.1349,317.58065 4.17404,2.42899 -1.6362,-4.54374 z"
-       fill-rule="evenodd"
-       id="path412" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="M 272.24478,368.30334 684.11879,77.531667"
-       fill-rule="evenodd"
-       id="path414" />
-    <path
-       stroke="#274e13"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="1, 3"
-       d="M 272.24478,368.30334 679.21719,80.992057"
-       fill-rule="evenodd"
-       id="path416" />
-    <path
-       fill="#274e13"
-       stroke="#274e13"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 680.16979,82.341417 2.7547,-3.96662 -4.6599,1.2679 z"
-       fill-rule="evenodd"
-       id="path418" />
-    <path
-       fill="#000000"
-       fill-opacity="0"
-       d="M 272.24478,417.58678 688.21329,356.48442"
-       fill-rule="evenodd"
-       id="path420" />
-    <path
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linejoin="round"
-       stroke-linecap="butt"
-       stroke-dasharray="1, 3"
-       d="M 272.24478,417.58678 682.27699,357.35643"
-       fill-rule="evenodd"
-       id="path422" />
-    <path
-       fill="#595959"
-       stroke="#595959"
-       stroke-width="1"
-       stroke-linecap="butt"
-       d="m 682.51709,358.99062 4.2499,-2.29373 -4.73,-0.97467 z"
-       fill-rule="evenodd"
-       id="path424" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#741b47;stroke-width:1.1461;stroke-opacity:1"
-       id="rect1"
-       width="860.90546"
-       height="529.77783"
-       x="51.046341"
-       y="34.574326" />
-    <text
-       xml:space="preserve"
-       id="text1"
-       style="white-space:pre;shape-inside:url(#rect2);fill:none;stroke:#741b47;stroke-width:1.151" />
-    <text
-       xml:space="preserve"
-       style="fill:none;stroke:#741b47;stroke-width:1.151"
-       x="159.96594"
-       y="437.608"
-       id="text3"><tspan
-         sodipodi:role="line"
-         id="tspan3"
-         x="159.96594"
-         y="437.608" /></text>
-    <text
-       xml:space="preserve"
-       id="text4"
-       style="fill:none;stroke:#741b47;stroke-width:1.151;white-space:pre;shape-inside:url(#rect5)" />
-    <text
-       xml:space="preserve"
-       id="text6"
-       style="fill:none;stroke:#741b47;stroke-width:1.151;-inkscape-font-specification:Arial;font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;line-height:0;white-space:pre;shape-inside:url(#rect7)" />
-    <use
-       x="0"
-       y="0"
-       xlink:href="#path290"
-       id="use8" />
-    <text
-       xml:space="preserve"
-       id="text16"
-       style="fill:#000000;-inkscape-font-specification:Arial;font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;line-height:0;fill-rule:evenodd;fill-opacity:1;white-space:pre;shape-inside:url(#rect16)" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;font-size:12px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="171.56448"
-       y="438.474"
-       id="text17"><tspan
-         sodipodi:role="line"
-         id="tspan17"
-         x="171.56448"
-         y="438.474">Node 1 xstats</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd"
-       x="646.48962"
-       y="409.63776"
-       id="text17-1"><tspan
-         sodipodi:role="line"
-         id="tspan17-02"
-         x="646.48962"
-         y="409.63776">Node 1 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="717.65833"
-       y="393.14011"
-       id="text17-1-3"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9"
-         x="717.65833"
-         y="393.14011"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 1 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="731.20496"
-       y="421.08084"
-       id="text17-1-3-4"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-9"
-         x="731.20496"
-         y="421.08084"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 1 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="723.08594"
-       y="450.06653"
-       id="text17-1-3-4-5"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-9-6"
-         x="723.08594"
-         y="450.06653"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 1 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="748.5882"
-       y="393.18039"
-       id="text17-1-3-5"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3"
-         x="748.5882"
-         y="393.18039"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 2 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="793.07227"
-       y="421.1171"
-       id="text17-1-3-5-7"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-6"
-         x="793.07227"
-         y="421.1171"
-         style="stroke-width:0.820641;-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:9.33333333px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">xstat 2 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="765.38727"
-       y="450.09952"
-       id="text17-1-3-5-7-6"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-6-0"
-         x="765.38727"
-         y="450.09952"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 2 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="763.57843"
-       y="479.1445"
-       id="text17-1-3-5-7-6-7"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-6-0-5"
-         x="763.57843"
-         y="479.1445"
-         style="stroke-width:0.820641;-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:9.33333333px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">xstat N </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="779.73914"
-       y="393.17386"
-       id="text17-1-3-5-6"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-5"
-         x="779.73914"
-         y="393.17386"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 3 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="807.05823"
-       y="450.12637"
-       id="text17-1-3-5-6-0"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-5-6"
-         x="807.05823"
-         y="450.12637"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 3 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.820641"
-       x="811.46503"
-       y="393.10345"
-       id="text17-1-3-5-6-9"
-       transform="scale(0.96355962,1.0378185)"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-9-3-5-9"
-         x="811.46503"
-         y="393.10345"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.33333px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.820641">xstat 4 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd"
-       x="647.08496"
-       y="438.59705"
-       id="text17-1-2"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-6"
-         x="647.08496"
-         y="438.59705">Node 4 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd"
-       x="647.08643"
-       y="468.59579"
-       id="text17-1-2-4"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-6-2"
-         x="647.08643"
-         y="468.59579">Node 8 </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd"
-       x="647.08948"
-       y="498.58841"
-       id="text17-1-2-4-2"><tspan
-         sodipodi:role="line"
-         id="tspan17-02-6-2-1"
-         x="647.08948"
-         y="498.58841">Node N </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;font-size:12px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="171.51901"
-       y="463.50073"
-       id="text17-9"><tspan
-         sodipodi:role="line"
-         id="tspan17-0"
-         x="171.51901"
-         y="463.50073">Node 4 xstats</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;font-size:12px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="171.66028"
-       y="488.6954"
-       id="text17-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan17-0-6"
-         x="171.66028"
-         y="488.6954">Node 8 xstats</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0;font-family:Arial;-inkscape-font-specification:'Arial, Normal';fill:#000000;fill-opacity:1;fill-rule:evenodd;font-size:12px;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
-       x="171.61055"
-       y="513.5614"
-       id="text17-9-7-1"><tspan
-         sodipodi:role="line"
-         id="tspan17-0-6-1"
-         x="171.61055"
-         y="513.5614">Node N xstats</tspan></text>
-    <text
-       xml:space="preserve"
-       id="text18"
-       style="fill:#000000;-inkscape-font-specification:Arial;font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;line-height:0;fill-rule:evenodd;fill-opacity:1;white-space:pre;shape-inside:url(#rect18)" />
-    <text
-       xml:space="preserve"
-       id="text19"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:0;font-family:Arial;-inkscape-font-specification:Arial;white-space:pre;shape-inside:url(#rect19);fill:#008033;fill-opacity:1;fill-rule:evenodd"
-       transform="translate(9.7511214,-22.752617)"><tspan
-         x="656.57617"
-         y="403.47359"
-         id="tspan2">rte_node xstat memory layout</tspan></text>
-    <text
-       xml:space="preserve"
-       id="text19-3"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:0;font-family:Arial;-inkscape-font-specification:Arial;white-space:pre;shape-inside:url(#rect19-5);fill:#008033;fill-opacity:1;fill-rule:evenodd"
-       transform="matrix(1,0,0,1.3775713,-86.925353,-93.357559)" />
-    <rect
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-width:0.975519;stroke-opacity:1"
-       id="rect20"
-       width="121.46339"
-       height="119.3132"
-       x="689.06696"
-       y="390.52017" />
-    <path
-       stroke="#1155cc"
-       stroke-width="0.969816"
-       stroke-linecap="butt"
-       d="M 689.31334,480.57387 H 811.05822"
-       fill-rule="nonzero"
-       id="path310-0-5" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#595959;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Triangle)"
-       d="M 274.42435,420.14046 C 682.15366,393.93914 683.99234,393.65184 683.99234,393.65184"
-       id="path20"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#595959;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Triangle-0)"
-       d="M 273.95206,520.01368 C 680.76203,508.98154 685.1289,509.15392 685.1289,509.15392"
-       id="path20-9"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 719.87654,390.57304 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 749.50421,420.67017 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21-8" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 729.7747,450.11771 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21-8-6" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 770.41929,450.27903 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21-8-6-2" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 749.58061,390.87575 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21-3" />
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 779.67339,389.9164 c -0.0406,30.30974 -0.0406,30.30974 -0.0406,30.30974 v 0"
-       id="path21-3-4" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;line-height:0;font-family:Arial;-inkscape-font-specification:Arial;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#1155cc;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       x="615.2713"
-       y="435.30963"
-       id="text21"><tspan
-         sodipodi:role="line"
-         id="tspan21"
-         x="615.2713"
-         y="435.30963" /></text>
-  </g>
+  <sodipodi:namedview
+     id="namedview56"
+     pagecolor="#505050"
+     bordercolor="#ffffff"
+     borderopacity="1"
+     inkscape:showpageshadow="0"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="1"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="1.3717872"
+     inkscape:cx="356.83377"
+     inkscape:cy="244.20697"
+     inkscape:window-width="2556"
+     inkscape:window-height="1394"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg56" />
+  <style
+     id="style1">
+    text { font-family: sans-serif; font-size: 12px; }
+    text.title { font-size: 13px; fill: #009900; font-weight: bold; }
+    text.label { fill: #000000; }
+    text.italic { font-style: italic; fill: #666666; font-size: 11px; }
+    text.brace { font-size: 12px; fill: #000000; }
+    rect.cell { fill: #ffffff; stroke: #333333; stroke-width: 1; }
+    rect.header { fill: #f8f8f0; stroke: #333333; stroke-width: 1; }
+    line.arrow { stroke: #999999; stroke-width: 1; stroke-dasharray: 5,3; }
+    line.brace-line { stroke: #000000; stroke-width: 1; }
+  </style>
+  <rect
+     style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-linecap:round;stroke-dasharray:4, 8;stroke-opacity:1;paint-order:markers fill stroke"
+     id="rect2"
+     width="820"
+     height="540"
+     x="0"
+     y="0"
+     sodipodi:insensitive="true" />
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#009900;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:0.733333;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="m 215.11719,269.87695 365.21484,-112"
+     id="path56"
+     sodipodi:nodetypes="cc" />
+  <!-- ========================== -->
+  <!-- rte_graph object memory layout (left column) -->
+  <!-- ========================== -->
+  <text
+     x="19.517578"
+     y="21.559082"
+     class="title"
+     id="text1"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#3e3e3e;fill-opacity:1">rte_graph object memory layout</text>
+  <!-- Graph Header -->
+  <rect
+     x="35.117188"
+     y="29.876953"
+     width="180"
+     height="40"
+     class="header"
+     id="rect1"
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="44.876953"
+     class="label"
+     text-anchor="middle"
+     id="text2">Graph Header</text>
+  <text
+     x="125.11719"
+     y="59.876953"
+     class="italic"
+     text-anchor="middle"
+     id="text3"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">struct rte_graph</text>
+  <!-- Scheduling table -->
+  <rect
+     x="35.117188"
+     y="109.87695"
+     width="180"
+     height="28"
+     class="cell"
+     id="rect3"
+     style="fill:#b3e7f6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="128.87695"
+     class="label"
+     text-anchor="middle"
+     id="text4">Scheduling table</text>
+  <!-- Pending bitmap -->
+  <rect
+     x="35.117188"
+     y="137.87695"
+     width="180"
+     height="44.834362"
+     class="cell"
+     id="rect4"
+     style="fill:#fffbda;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="156.87695"
+     class="label"
+     text-anchor="middle"
+     id="text5">Pending bitmap</text>
+  <!-- Source pending bitmap -->
+  <rect
+     x="35.117188"
+     y="182.71132"
+     width="180"
+     height="41.165638"
+     class="cell"
+     id="rect5"
+     style="fill:#fffbda;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="200.87695"
+     class="label"
+     text-anchor="middle"
+     id="text6">Source nodes bitmap</text>
+  <!-- Fence -->
+  <rect
+     x="35.117188"
+     y="69.876953"
+     width="180"
+     height="36"
+     class="header"
+     id="rect6"
+     style="fill:#ffa6a6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="83.876953"
+     class="label"
+     text-anchor="middle"
+     id="text7">Fence</text>
+  <text
+     x="125.11719"
+     y="97.876953"
+     class="italic"
+     text-anchor="middle"
+     id="text8"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">RTE_GRAPH_FENCE</text>
+  <!-- Node 0 -->
+  <rect
+     x="35.117188"
+     y="229.87695"
+     width="180"
+     height="40"
+     class="cell"
+     id="rect8"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="246.87695"
+     class="label"
+     text-anchor="middle"
+     id="text9">Node 0</text>
+  <text
+     x="125.11719"
+     y="261.87695"
+     class="italic"
+     text-anchor="middle"
+     id="text10"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">struct rte_node</text>
+  <!-- Node 1 -->
+  <rect
+     x="35.117188"
+     y="269.87695"
+     width="180"
+     height="40"
+     class="cell"
+     id="rect10"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="286.87695"
+     class="label"
+     text-anchor="middle"
+     id="text11">Node 1</text>
+  <text
+     x="125.11719"
+     y="301.87695"
+     class="italic"
+     text-anchor="middle"
+     id="text12"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">struct rte_node</text>
+  <!-- Node 2 -->
+  <rect
+     x="35.117188"
+     y="309.87695"
+     width="180"
+     height="40"
+     class="cell"
+     id="rect12"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="326.87695"
+     class="label"
+     text-anchor="middle"
+     id="text13">Node 2</text>
+  <text
+     x="125.11719"
+     y="341.87695"
+     class="italic"
+     text-anchor="middle"
+     id="text14"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">struct rte_node</text>
+  <!-- Node N -->
+  <rect
+     x="35.117188"
+     y="357.87695"
+     width="180"
+     height="40"
+     class="cell"
+     id="rect14"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="374.87695"
+     class="label"
+     text-anchor="middle"
+     id="text15">Node N</text>
+  <text
+     x="125.11719"
+     y="389.87695"
+     class="italic"
+     text-anchor="middle"
+     id="text16"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:Monospace;-inkscape-font-specification:'Monospace, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">struct rte_node</text>
+  <!-- dots between Node 2 and Node N -->
+  <text
+     x="125.11719"
+     y="353.87695"
+     class="label"
+     text-anchor="middle"
+     id="text17">...</text>
+  <!-- nb_nodes brace -->
+  <line
+     x1="25.117188"
+     y1="229.87695"
+     x2="25.117188"
+     y2="397.87695"
+     class="brace-line"
+     id="line17" />
+  <line
+     x1="25.117188"
+     y1="229.87695"
+     x2="30.117188"
+     y2="229.87695"
+     class="brace-line"
+     id="line18" />
+  <line
+     x1="25.117188"
+     y1="397.87695"
+     x2="30.117188"
+     y2="397.87695"
+     class="brace-line"
+     id="line19" />
+  <text
+     x="-313.87695"
+     y="17.117188"
+     class="brace"
+     text-anchor="middle"
+     transform="rotate(-90)"
+     id="text19">nb_nodes</text>
+  <!-- Node xstats -->
+  <rect
+     x="35.117188"
+     y="405.87695"
+     width="180"
+     height="38.393005"
+     class="cell"
+     id="rect19"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="429.54709"
+     class="label"
+     text-anchor="middle"
+     id="text20">Node 1 xstats</text>
+  <!-- ========================== -->
+  <!-- Bitmap scheduling layout (center column) -->
+  <!-- ========================== -->
+  <text
+     x="350.58447"
+     y="19.876953"
+     class="title"
+     id="text24"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1f297a;fill-opacity:1">Scheduling table</text>
+  <!-- Arrow from scheduling table to bitmap layout -->
+  <rect
+     x="305.11719"
+     y="29.876953"
+     width="200"
+     height="28"
+     class="cell"
+     id="rect24"
+     style="fill:#b3e7f6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="405.11719"
+     y="47.876953"
+     class="label"
+     text-anchor="middle"
+     id="text25">Node 0 offset (prio min)</text>
+  <rect
+     x="305.11719"
+     y="57.876953"
+     width="200"
+     height="28"
+     class="cell"
+     id="rect25"
+     style="fill:#b3e7f6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="405.11719"
+     y="75.876953"
+     class="label"
+     text-anchor="middle"
+     id="text26">Node 1 offset</text>
+  <rect
+     x="305.11719"
+     y="85.876953"
+     width="200"
+     height="28"
+     class="cell"
+     id="rect26"
+     style="fill:#b3e7f6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="405.11719"
+     y="103.87695"
+     class="label"
+     text-anchor="middle"
+     id="text27">Node 2 offset</text>
+  <text
+     x="405.11719"
+     y="121.87695"
+     class="label"
+     text-anchor="middle"
+     id="text28">...</text>
+  <rect
+     x="305.11719"
+     y="127.87695"
+     width="200"
+     height="28"
+     class="cell"
+     id="rect28"
+     style="fill:#b3e7f6;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="405.11719"
+     y="145.87695"
+     class="label"
+     text-anchor="middle"
+     id="text29">Node N offset (prio max)</text>
+  <!-- ========================== -->
+  <!-- rte_node object memory layout (right column) -->
+  <!-- ========================== -->
+  <text
+     x="555.31494"
+     y="146.68994"
+     class="title"
+     id="text30"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal">rte_node object memory layout</text>
+  <!-- Arrow from Node N to rte_node layout -->
+  <rect
+     x="580.33203"
+     y="157.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect30"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="657.83936"
+     y="175.87695"
+     class="label"
+     text-anchor="middle"
+     id="text31">Fence</text>
+  <rect
+     x="580.33203"
+     y="185.87695"
+     width="155.55365"
+     height="36"
+     class="cell"
+     id="rect31"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="658.2583"
+     y="200.87695"
+     class="label"
+     text-anchor="middle"
+     id="text32">Slowpath area</text>
+  <text
+     x="658.24585"
+     y="214.87695"
+     class="italic"
+     text-anchor="middle"
+     id="text33">(incl. sched_idx)</text>
+  <rect
+     x="580.33203"
+     y="221.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect33"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="657.95068"
+     y="239.87695"
+     class="label"
+     text-anchor="middle"
+     id="text34">Context memory</text>
+  <rect
+     x="580.33203"
+     y="249.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect34"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="658.06494"
+     y="267.87695"
+     class="label"
+     text-anchor="middle"
+     id="text35">Fastpath area</text>
+  <rect
+     x="580.33203"
+     y="277.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect35"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="657.52002"
+     y="295.87695"
+     class="label"
+     text-anchor="middle"
+     id="text36">Next node 0 ptr</text>
+  <rect
+     x="580.33203"
+     y="305.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect36"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="657.52002"
+     y="323.87695"
+     class="label"
+     text-anchor="middle"
+     id="text37">Next node 1 ptr</text>
+  <rect
+     x="580.33203"
+     y="347.87695"
+     width="155.55365"
+     height="28"
+     class="cell"
+     id="rect38"
+     style="fill:#d7fbe0;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="657.52002"
+     y="365.87695"
+     class="label"
+     text-anchor="middle"
+     id="text39">Next node N ptr</text>
+  <!-- nb_edges brace -->
+  <line
+     x1="746.33203"
+     y1="277.8587"
+     x2="746.33203"
+     y2="375.8952"
+     class="brace-line"
+     id="line39" />
+  <line
+     x1="741.33203"
+     y1="277.8587"
+     x2="746.33203"
+     y2="277.8587"
+     class="brace-line"
+     id="line40" />
+  <line
+     x1="741.33203"
+     y1="375.8952"
+     x2="746.33203"
+     y2="375.8952"
+     class="brace-line"
+     id="line41" />
+  <text
+     x="784.33203"
+     y="329.87695"
+     class="brace"
+     text-anchor="middle"
+     id="text41">nb_edges</text>
+  <!-- ========================== -->
+  <!-- rte_node xstat memory layout (bottom right) -->
+  <!-- ========================== -->
+  <text
+     x="382.12714"
+     y="403.88254"
+     class="title"
+     id="text42"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#990091;fill-opacity:1">rte_node xstats memory layout</text>
+  <!-- Arrow from Node N xstats -->
+  <!-- Node 1 xstats: 4 xstats -->
+  <!-- Node 4 xstats: 2 xstats -->
+  <!-- Node 8 xstats: 3 xstats -->
+  <!-- Node N xstats: 1 xstat -->
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#009900;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:0.733333;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="m 215.11719,309.87695 365.21484,66"
+     id="path57"
+     sodipodi:nodetypes="cc" />
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#215fe5;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="m 215.11719,109.87695 90,-79.999997"
+     id="path58"
+     sodipodi:nodetypes="cc" />
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#215fe5;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="m 215.11719,137.87695 90,18"
+     id="path59"
+     sodipodi:nodetypes="cc" />
+  <text
+     x="125.68945"
+     y="172.06445"
+     class="italic"
+     text-anchor="middle"
+     id="text59"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#666666">one uint64_t word per node</text>
+  <text
+     x="125.11719"
+     y="214.87695"
+     class="label"
+     text-anchor="middle"
+     id="text60"
+     style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-anchor:middle;fill:#666666;fill-opacity:1">Seeded to pending on walk start</text>
+  <rect
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:4.00001, 8;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
+     id="rect22"
+     width="90.698799"
+     height="112.00012"
+     x="439.24158"
+     y="414.93521" />
+  <rect
+     x="439.24158"
+     y="414.93527"
+     width="90.698799"
+     height="22"
+     class="cell"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+     id="rect23" />
+  <text
+     x="484.77899"
+     y="429.57541"
+     class="label"
+     text-anchor="middle"
+     style="font-size:10px"
+     id="text23">xstat0</text>
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f04dff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="M 215.11719,483.66296 439.24158,526.9353"
+     id="path54"
+     sodipodi:nodetypes="cc" />
+  <rect
+     x="35.117188"
+     y="445.26996"
+     width="180"
+     height="38.393005"
+     class="cell"
+     id="rect54"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="468.94009"
+     class="label"
+     text-anchor="middle"
+     id="text56">Node 7 xstats</text>
+  <rect
+     x="35.117188"
+     y="491.9743"
+     width="180"
+     height="38.393005"
+     class="cell"
+     id="rect56"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+  <text
+     x="125.11719"
+     y="515.64447"
+     class="label"
+     text-anchor="middle"
+     id="text57">Node N xstats</text>
+  <text
+     x="120.69043"
+     y="488.99603"
+     class="label"
+     text-anchor="middle"
+     id="text58">...</text>
+  <line
+     x1="542.88934"
+     y1="414.93527"
+     x2="542.88934"
+     y2="526.9353"
+     class="brace-line"
+     id="line61" />
+  <line
+     x1="537.88934"
+     y1="414.93527"
+     x2="542.88934"
+     y2="414.93527"
+     class="brace-line"
+     id="line62" />
+  <line
+     x1="537.88934"
+     y1="526.9353"
+     x2="542.88934"
+     y2="526.9353"
+     class="brace-line"
+     id="line63" />
+  <text
+     x="576.78027"
+     y="467.90891"
+     class="brace"
+     text-anchor="middle"
+     id="text63"><tspan
+       sodipodi:role="line"
+       id="tspan63"
+       x="576.78027"
+       y="467.90891">cache</tspan><tspan
+       sodipodi:role="line"
+       id="tspan64"
+       x="576.78027"
+       y="482.90891">line</tspan></text>
+  <rect
+     x="439.24158"
+     y="436.93527"
+     width="90.698799"
+     height="22"
+     class="cell"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+     id="rect64" />
+  <text
+     x="484.77899"
+     y="451.57541"
+     class="label"
+     text-anchor="middle"
+     style="font-size:10px"
+     id="text64">xstat1</text>
+  <rect
+     x="439.24158"
+     y="470.93527"
+     width="90.698799"
+     height="22"
+     class="cell"
+     style="fill:#fbccff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+     id="rect65" />
+  <text
+     x="484.77899"
+     y="485.57541"
+     class="label"
+     text-anchor="middle"
+     style="font-size:10px"
+     id="text65">xstatN</text>
+  <text
+     x="485.8313"
+     y="465.24936"
+     class="label"
+     text-anchor="middle"
+     id="text66">...</text>
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f04dff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+     d="M 215.11719,445.26996 439.24158,414.93527"
+     id="path66"
+     sodipodi:nodetypes="cc" />
+  <text
+     x="669.32764"
+     y="342.00354"
+     class="label"
+     text-anchor="middle"
+     id="text67">...</text>
+  <path
+     style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffbb4c;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 8;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:url(#Triangle);stop-color:#000000;stop-opacity:1"
+     d="M 272.58698,191.75977 221.56049,164.4668"
+     id="path67"
+     sodipodi:nodetypes="cc" />
+  <text
+     x="318.07004"
+     y="192.13014"
+     class="label"
+     text-anchor="middle"
+     id="text68"><tspan
+       sodipodi:role="line"
+       id="tspan68"
+       x="318.07004"
+       y="192.13014">bit set to 1</tspan><tspan
+       sodipodi:role="line"
+       id="tspan69"
+       x="318.07004"
+       y="207.13014">when node has work</tspan></text>
 </svg>
diff --git a/lib/graph/graph.c b/lib/graph/graph.c
index 6911ea8abeed..6dc1402e6bd0 100644
--- a/lib/graph/graph.c
+++ b/lib/graph/graph.c
@@ -334,20 +334,6 @@ graph_mem_fixup_secondary(struct rte_graph *graph)
 	return graph_mem_fixup_node_ctx(graph);
 }
 
-static bool
-graph_src_node_avail(struct graph *graph)
-{
-	struct graph_node *graph_node;
-
-	STAILQ_FOREACH(graph_node, &graph->node_list, next)
-		if ((graph_node->node->flags & RTE_NODE_SOURCE_F) &&
-		    (graph_node->node->lcore_id == RTE_MAX_LCORE ||
-		     graph->lcore_id == graph_node->node->lcore_id))
-			return true;
-
-	return false;
-}
-
 RTE_EXPORT_SYMBOL(rte_graph_model_mcore_dispatch_core_bind)
 int
 rte_graph_model_mcore_dispatch_core_bind(rte_graph_t id, int lcore)
@@ -375,9 +361,8 @@ rte_graph_model_mcore_dispatch_core_bind(rte_graph_t id, int lcore)
 	graph->graph->dispatch.lcore_id = graph->lcore_id;
 	graph->socket = rte_lcore_to_socket_id(lcore);
 
-	/* check the availability of source node */
-	if (!graph_src_node_avail(graph))
-		graph->graph->head = 0;
+	/* Rebuild source bitmap with only source nodes bound to this lcore */
+	graph_src_bitmap_rebuild(graph);
 
 	return 0;
 
diff --git a/lib/graph/graph_debug.c b/lib/graph/graph_debug.c
index e3b8cccdc1f0..8e99fa1b0fb8 100644
--- a/lib/graph/graph_debug.c
+++ b/lib/graph/graph_debug.c
@@ -15,8 +15,8 @@ graph_dump(FILE *f, struct graph *g)
 
 	fprintf(f, "graph <%s>\n", g->name);
 	fprintf(f, "  id=%" PRIu32 "\n", g->id);
-	fprintf(f, "  cir_start=%" PRIu32 "\n", g->cir_start);
-	fprintf(f, "  cir_mask=%" PRIu32 "\n", g->cir_mask);
+	fprintf(f, "  sched_table_off=%" PRIu32 "\n", g->sched_table_off);
+	fprintf(f, "  nb_sched_words=%" PRIu16 "\n", g->nb_sched_words);
 	fprintf(f, "  addr=%p\n", g);
 	fprintf(f, "  graph=%p\n", g->graph);
 	fprintf(f, "  mem_sz=%zu\n", g->mem_sz);
@@ -63,14 +63,14 @@ rte_graph_obj_dump(FILE *f, struct rte_graph *g, bool all)
 
 	fprintf(f, "graph <%s> @ %p\n", g->name, g);
 	fprintf(f, "  id=%" PRIu32 "\n", g->id);
-	fprintf(f, "  head=%" PRId32 "\n", (int32_t)g->head);
-	fprintf(f, "  tail=%" PRId32 "\n", (int32_t)g->tail);
-	fprintf(f, "  cir_mask=0x%" PRIx32 "\n", g->cir_mask);
 	fprintf(f, "  nb_nodes=%" PRId32 "\n", g->nb_nodes);
+	fprintf(f, "  nb_sched_words=%" PRIu16 "\n", g->nb_sched_words);
 	fprintf(f, "  socket=%d\n", g->socket);
 	fprintf(f, "  fence=0x%" PRIx64 "\n", g->fence);
 	fprintf(f, "  nodes_start=0x%" PRIx32 "\n", g->nodes_start);
-	fprintf(f, "  cir_start=%p\n", g->cir_start);
+	fprintf(f, "  sched_table=%p\n", g->sched_table);
+	fprintf(f, "  pending=%p\n", g->pending);
+	fprintf(f, "  src_pending=%p\n", g->src_pending);
 
 	rte_graph_foreach_node(count, off, g, n) {
 		if (!all && n->idx == 0)
diff --git a/lib/graph/graph_populate.c b/lib/graph/graph_populate.c
index 026daecb2122..45bc7704fede 100644
--- a/lib/graph/graph_populate.c
+++ b/lib/graph/graph_populate.c
@@ -3,6 +3,8 @@
  */
 
 
+#include <stdlib.h>
+
 #include <rte_common.h>
 #include <rte_errno.h>
 #include <rte_malloc.h>
@@ -15,19 +17,27 @@ static size_t
 graph_fp_mem_calc_size(struct graph *graph)
 {
 	struct graph_node *graph_node;
-	rte_node_t val;
+	uint16_t nwords;
 	size_t sz;
 
 	/* Graph header */
 	sz = sizeof(struct rte_graph);
-	/* Source nodes list */
-	sz += sizeof(rte_graph_off_t) * graph->src_node_count;
-	/* Circular buffer for pending streams of size number of nodes */
-	val = rte_align32pow2(graph->node_count * sizeof(rte_graph_off_t));
-	sz = RTE_ALIGN(sz, val);
-	graph->cir_start = sz;
-	graph->cir_mask = rte_align32pow2(graph->node_count) - 1;
-	sz += val;
+
+	/* Schedule table: node offset indexed by sched_idx */
+	sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);
+	graph->sched_table_off = sz;
+	sz += sizeof(rte_graph_off_t) * graph->node_count;
+
+	/* Pending and source pending bitmaps */
+	nwords = (graph->node_count + 63) / 64;
+	graph->nb_sched_words = nwords;
+	sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);
+	graph->pending_off = sz;
+	sz += sizeof(uint64_t) * nwords;
+	sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);
+	graph->src_pending_off = sz;
+	sz += sizeof(uint64_t) * nwords;
+
 	/* Fence */
 	sz += sizeof(RTE_GRAPH_FENCE);
 	sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);
@@ -54,20 +64,44 @@ graph_fp_mem_calc_size(struct graph *graph)
 }
 
 static void
-graph_header_popluate(struct graph *_graph)
+graph_header_populate(struct graph *_graph)
 {
 	struct rte_graph *graph = _graph->graph;
 
-	graph->tail = 0;
-	graph->head = (int32_t)-_graph->src_node_count;
-	graph->cir_mask = _graph->cir_mask;
 	graph->nb_nodes = _graph->node_count;
-	graph->cir_start = RTE_PTR_ADD(graph, _graph->cir_start);
+	graph->nb_sched_words = _graph->nb_sched_words;
+	graph->sched_table = RTE_PTR_ADD(graph, _graph->sched_table_off);
+	graph->pending = RTE_PTR_ADD(graph, _graph->pending_off);
+	graph->src_pending = RTE_PTR_ADD(graph, _graph->src_pending_off);
 	graph->nodes_start = _graph->nodes_start;
 	graph->socket = _graph->socket;
 	graph->id = _graph->id;
 	memcpy(graph->name, _graph->name, RTE_GRAPH_NAMESIZE);
 	graph->fence = RTE_GRAPH_FENCE;
+
+	memset(graph->pending, 0, sizeof(uint64_t) * _graph->nb_sched_words);
+	memset(graph->src_pending, 0, sizeof(uint64_t) * _graph->nb_sched_words);
+}
+
+static int16_t
+graph_node_effective_priority(const struct graph_node *gn)
+{
+	if (gn->node->flags & RTE_NODE_SOURCE_F)
+		return INT16_MIN;
+	return gn->node->priority;
+}
+
+static int
+graph_node_priority_cmp(const void *a, const void *b)
+{
+	const struct graph_node *const *na = a;
+	const struct graph_node *const *nb = b;
+	int16_t pa = graph_node_effective_priority(*na);
+	int16_t pb = graph_node_effective_priority(*nb);
+
+	if (pa != pb)
+		return (int)pa - (int)pb;
+	return (int)(*na)->node->id - (int)(*nb)->node->id;
 }
 
 static void
@@ -76,15 +110,26 @@ graph_nodes_populate(struct graph *_graph)
 	rte_graph_off_t xstat_off = _graph->xstats_start;
 	rte_graph_off_t off = _graph->nodes_start;
 	struct rte_graph *graph = _graph->graph;
-	struct graph_node *graph_node;
+	struct graph_node **sorted, *graph_node;
 	rte_edge_t count, nb_edges;
 	rte_node_t pid;
+	uint32_t n;
 
-	STAILQ_FOREACH(graph_node, &_graph->node_list, next) {
+	/* Build a sorted array of graph_node pointers by (priority, id) */
+	sorted = calloc(_graph->node_count, sizeof(*sorted));
+	RTE_VERIFY(sorted != NULL);
+	n = 0;
+	STAILQ_FOREACH(graph_node, &_graph->node_list, next)
+		sorted[n++] = graph_node;
+	qsort(sorted, n, sizeof(*sorted), graph_node_priority_cmp);
+
+	for (n = 0; n < _graph->node_count; n++) {
+		graph_node = sorted[n];
 		struct rte_node *node = RTE_PTR_ADD(graph, off);
 		memset(node, 0, sizeof(*node));
 		node->fence = RTE_GRAPH_FENCE;
 		node->off = off;
+		node->sched_idx = n;
 		if (graph_pcap_is_enable()) {
 			node->process = graph_pcap_dispatch;
 			node->original_process = graph_node->node->process;
@@ -123,8 +168,14 @@ graph_nodes_populate(struct graph *_graph)
 		off += sizeof(struct rte_node *) * nb_edges;
 		off = RTE_ALIGN(off, RTE_CACHE_LINE_SIZE);
 		node->next = off;
+
+		/* Fill the schedule table */
+		graph->sched_table[n] = node->off;
+
 		__rte_node_stream_alloc(graph, node);
 	}
+
+	free(sorted);
 }
 
 struct rte_node *
@@ -179,12 +230,11 @@ graph_node_nexts_populate(struct graph *_graph)
 }
 
 static int
-graph_src_nodes_offset_populate(struct graph *_graph)
+graph_src_bitmap_populate(struct graph *_graph)
 {
 	struct rte_graph *graph = _graph->graph;
 	struct graph_node *graph_node;
 	struct rte_node *node;
-	int32_t head = -1;
 	const char *name;
 
 	STAILQ_FOREACH(graph_node, &_graph->node_list, next) {
@@ -195,7 +245,7 @@ graph_src_nodes_offset_populate(struct graph *_graph)
 				SET_ERR_JMP(EINVAL, fail, "%s not found", name);
 
 			__rte_node_stream_alloc(graph, node);
-			graph->cir_start[head--] = node->off;
+			__rte_node_pending_set(graph->src_pending, node);
 		}
 	}
 
@@ -204,17 +254,42 @@ graph_src_nodes_offset_populate(struct graph *_graph)
 	return -rte_errno;
 }
 
+void
+graph_src_bitmap_rebuild(struct graph *_graph)
+{
+	struct rte_graph *graph = _graph->graph;
+	struct graph_node *graph_node;
+	struct rte_node *node;
+	const char *name;
+
+	memset(graph->src_pending, 0,
+	       sizeof(uint64_t) * graph->nb_sched_words);
+
+	STAILQ_FOREACH(graph_node, &_graph->node_list, next) {
+		if (!(graph_node->node->flags & RTE_NODE_SOURCE_F))
+			continue;
+		if (graph_node->node->lcore_id != RTE_MAX_LCORE &&
+		    graph_node->node->lcore_id != _graph->lcore_id)
+			continue;
+		name = graph_node->node->name;
+		node = graph_node_name_to_ptr(graph, name);
+		if (node == NULL)
+			continue;
+		__rte_node_pending_set(graph->src_pending, node);
+	}
+}
+
 static int
 graph_fp_mem_populate(struct graph *graph)
 {
 	int rc;
 
-	graph_header_popluate(graph);
+	graph_header_populate(graph);
 	if (graph_pcap_is_enable())
 		graph_pcap_init(graph);
 	graph_nodes_populate(graph);
 	rc = graph_node_nexts_populate(graph);
-	rc |= graph_src_nodes_offset_populate(graph);
+	rc |= graph_src_bitmap_populate(graph);
 
 	return rc;
 }
diff --git a/lib/graph/graph_private.h b/lib/graph/graph_private.h
index 26cdc6637192..df6f83b20261 100644
--- a/lib/graph/graph_private.h
+++ b/lib/graph/graph_private.h
@@ -49,6 +49,7 @@ struct node {
 	STAILQ_ENTRY(node) next;      /**< Next node in the list. */
 	char name[RTE_NODE_NAMESIZE]; /**< Name of the node. */
 	uint64_t flags;		      /**< Node configuration flag. */
+	int16_t priority;	      /**< Scheduling priority. */
 	unsigned int lcore_id;
 	/**< Node runs on the Lcore ID used for mcore dispatch model. */
 	rte_node_process_t process;   /**< Node process function. */
@@ -98,19 +99,23 @@ struct graph {
 	const struct rte_memzone *mz;
 	/**< Memzone to store graph data. */
 	rte_graph_off_t nodes_start;
-	/**< Node memory start offset in graph reel. */
+	/**< Node memory start offset in graph memory. */
 	rte_graph_off_t xstats_start;
-	/**< Node xstats memory start offset in graph reel. */
+	/**< Node xstats memory start offset in graph memory. */
 	rte_node_t src_node_count;
 	/**< Number of source nodes in a graph. */
 	struct rte_graph *graph;
 	/**< Pointer to graph data. */
 	rte_node_t node_count;
 	/**< Total number of nodes. */
-	uint32_t cir_start;
-	/**< Circular buffer start offset in graph reel. */
-	uint32_t cir_mask;
-	/**< Circular buffer mask for wrap around. */
+	uint32_t sched_table_off;
+	/**< Schedule table start offset in graph memory. */
+	uint32_t pending_off;
+	/**< Pending bitmap start offset in graph memory. */
+	uint32_t src_pending_off;
+	/**< Source pending bitmap start offset in graph memory. */
+	uint16_t nb_sched_words;
+	/**< Number of uint64_t words in pending bitmaps. */
 	rte_graph_t id;
 	/**< Graph identifier. */
 	rte_graph_t parent_id;
@@ -378,6 +383,16 @@ int graph_fp_mem_create(struct graph *graph);
  */
 int graph_fp_mem_destroy(struct graph *graph);
 
+/**
+ * @internal
+ *
+ * Rebuild the source pending bitmap based on lcore affinity.
+ *
+ * @param graph
+ *   Pointer to the internal graph object.
+ */
+void graph_src_bitmap_rebuild(struct graph *graph);
+
 /* Lookup functions */
 /**
  * @internal
diff --git a/lib/graph/node.c b/lib/graph/node.c
index e3359fe490a5..b5599143b37b 100644
--- a/lib/graph/node.c
+++ b/lib/graph/node.c
@@ -153,6 +153,7 @@ __rte_node_register(const struct rte_node_register *reg)
 	if (rte_strscpy(node->name, reg->name, RTE_NODE_NAMESIZE) < 0)
 		goto free_xstat;
 	node->flags = reg->flags;
+	node->priority = reg->priority;
 	node->process = reg->process;
 	node->init = reg->init;
 	node->fini = reg->fini;
@@ -216,6 +217,7 @@ node_clone(struct node *node, const char *name)
 
 	/* Clone the source node */
 	reg->flags = node->flags;
+	reg->priority = node->priority;
 	reg->process = node->process;
 	reg->init = node->init;
 	reg->fini = node->fini;
diff --git a/lib/graph/rte_graph.h b/lib/graph/rte_graph.h
index 7e433f466129..6cd32ec22284 100644
--- a/lib/graph/rte_graph.h
+++ b/lib/graph/rte_graph.h
@@ -496,6 +496,7 @@ struct rte_node_register {
 	char name[RTE_NODE_NAMESIZE]; /**< Name of the node. */
 	uint64_t flags;		      /**< Node configuration flag. */
 #define RTE_NODE_SOURCE_F (1ULL << 0) /**< Node type is source. */
+	int16_t priority; /**< Scheduling priority (lower = visited first, default 0). */
 	rte_node_process_t process; /**< Node process function. */
 	rte_node_init_t init;       /**< Node init function. */
 	rte_node_fini_t fini;       /**< Node fini function. */
diff --git a/lib/graph/rte_graph_model_mcore_dispatch.h b/lib/graph/rte_graph_model_mcore_dispatch.h
index f9ff3daa88ec..50a473564b56 100644
--- a/lib/graph/rte_graph_model_mcore_dispatch.h
+++ b/lib/graph/rte_graph_model_mcore_dispatch.h
@@ -77,9 +77,13 @@ int rte_graph_model_mcore_dispatch_node_lcore_affinity_set(const char *name,
 							   unsigned int lcore_id);
 
 /**
- * Perform graph walk on the circular buffer and invoke the process function
+ * Perform graph walk on the pending bitmap and invoke the process function
  * of the nodes and collect the stats.
  *
+ * Nodes are visited in scheduling order (lowest priority value first).
+ * Source nodes are seeded into the pending bitmap at the start of each walk.
+ * Nodes with different lcore affinity are dispatched to their target lcore.
+ *
  * @param graph
  *   Graph pointer returned from rte_graph_lookup function.
  *
@@ -88,20 +92,28 @@ int rte_graph_model_mcore_dispatch_node_lcore_affinity_set(const char *name,
 static inline void
 rte_graph_walk_mcore_dispatch(struct rte_graph *graph)
 {
-	const rte_graph_off_t *cir_start = graph->cir_start;
-	const rte_node_t mask = graph->cir_mask;
-	uint32_t head = graph->head;
+	const uint16_t nwords = graph->nb_sched_words;
 	struct rte_node *node;
+	uint16_t word, bit;
 
 	if (graph->dispatch.wq != NULL)
 		__rte_graph_mcore_dispatch_sched_wq_process(graph);
 
-	while (likely(head != graph->tail)) {
-		node = (struct rte_node *)RTE_PTR_ADD(graph, cir_start[(int32_t)head++]);
+	/* Seed pending bitmap with source nodes bound to this lcore */
+	for (word = 0; word < nwords; word++)
+		graph->pending[word] |= graph->src_pending[word];
 
-		/* skip the src nodes which not bind with current worker */
-		if ((int32_t)head < 1 && node->dispatch.lcore_id != graph->dispatch.lcore_id)
-			continue;
+	for (;;) {
+		/* find first word with any pending bit */
+		for (word = 0; word < nwords; word++)
+			if (graph->pending[word])
+				break;
+		if (word == nwords)
+			break; /* no more pending nodes */
+
+		bit = rte_ctz64(graph->pending[word]);
+		graph->pending[word] &= ~(1ULL << bit);
+		node = __rte_graph_pending_node(graph, word, bit);
 
 		/* Schedule the node until all task/objs are done */
 		if (node->dispatch.lcore_id != RTE_MAX_LCORE &&
@@ -111,11 +123,7 @@ rte_graph_walk_mcore_dispatch(struct rte_graph *graph)
 			continue;
 
 		__rte_node_process(graph, node);
-
-		head = likely((int32_t)head > 0) ? head & mask : head;
 	}
-
-	graph->tail = 0;
 }
 
 #ifdef __cplusplus
diff --git a/lib/graph/rte_graph_model_rtc.h b/lib/graph/rte_graph_model_rtc.h
index 4b6236e301e3..38feb3e1ca88 100644
--- a/lib/graph/rte_graph_model_rtc.h
+++ b/lib/graph/rte_graph_model_rtc.h
@@ -6,9 +6,12 @@
 #include "rte_graph_worker_common.h"
 
 /**
- * Perform graph walk on the circular buffer and invoke the process function
+ * Perform graph walk on the pending bitmap and invoke the process function
  * of the nodes and collect the stats.
  *
+ * Nodes are visited in scheduling order (lowest priority value first).
+ * Source nodes are seeded into the pending bitmap at the start of each walk.
+ *
  * @param graph
  *   Graph pointer returned from rte_graph_lookup function.
  *
@@ -17,30 +20,52 @@
 static inline void
 rte_graph_walk_rtc(struct rte_graph *graph)
 {
-	const rte_graph_off_t *cir_start = graph->cir_start;
-	const rte_node_t mask = graph->cir_mask;
-	uint32_t head = graph->head;
+	const uint16_t nwords = graph->nb_sched_words;
 	struct rte_node *node;
+	uint16_t word, bit;
 
 	/*
-	 * Walk on the source node(s) ((cir_start - head) -> cir_start) and then
-	 * on the pending streams (cir_start -> (cir_start + mask) -> cir_start)
-	 * in a circular buffer fashion.
+	 * Nodes are assigned a bit position (sched_idx) sorted by (priority,
+	 * node_id) at graph creation time. Source nodes are forced to INT16_MIN
+	 * priority so they always come first.
 	 *
-	 *	+-----+ <= cir_start - head [number of source nodes]
-	 *	|     |
-	 *	| ... | <= source nodes
-	 *	|     |
-	 *	+-----+ <= cir_start [head = 0] [tail = 0]
-	 *	|     |
-	 *	| ... | <= pending streams
-	 *	|     |
-	 *	+-----+ <= cir_start + mask
+	 * sched_table[] maps bit positions to node offsets:
+	 *
+	 *   pending[]         sched_table[]
+	 *   +----------+      +------------------+
+	 *   | word 0   | ---> | src_node_0       | bit 0 (prio=INT16_MIN)
+	 *   | 1100...1 |      | src_node_1       | bit 1 (prio=INT16_MIN)
+	 *   |          |      | mpls_input       | bit 2 (prio=-10)
+	 *   |          |      | ipv4_input       | bit 3 (prio=0)
+	 *   |          |      | ...              |
+	 *   +----------+      +------------------+
+	 *   | word 1   | ---> | ip4_rewrite      | bit 64 (prio=10)
+	 *   | ...      |      | ...              |
+	 *   +----------+      +------------------+
+	 *
+	 * Walk: for each word, find lowest set bit (rte_ctz64), process that
+	 * node, clear the bit, re-read the word (processing may have set new
+	 * bits), repeat.
+	 *
+	 * After each node is processed, restart scanning from word 0 since
+	 * processing may set bits in any word, including earlier ones.
 	 */
-	while (likely(head != graph->tail)) {
-		node = (struct rte_node *)RTE_PTR_ADD(graph, cir_start[(int32_t)head++]);
+
+	/* Seed pending bitmap with source nodes */
+	for (word = 0; word < nwords; word++)
+		graph->pending[word] |= graph->src_pending[word];
+
+	for (;;) {
+		/* find first word with any pending bit */
+		for (word = 0; word < nwords; word++)
+			if (graph->pending[word])
+				break;
+		if (word == nwords)
+			break; /* no more pending nodes */
+
+		bit = rte_ctz64(graph->pending[word]);
+		graph->pending[word] &= ~(1ULL << bit);
+		node = __rte_graph_pending_node(graph, word, bit);
 		__rte_node_process(graph, node);
-		head = likely((int32_t)head > 0) ? head & mask : head;
 	}
-	graph->tail = 0;
 }
diff --git a/lib/graph/rte_graph_worker.h b/lib/graph/rte_graph_worker.h
index b0f952a82cc9..e513d7a655d9 100644
--- a/lib/graph/rte_graph_worker.h
+++ b/lib/graph/rte_graph_worker.h
@@ -14,7 +14,7 @@ extern "C" {
 #endif
 
 /**
- * Perform graph walk on the circular buffer and invoke the process function
+ * Perform graph walk on the pending bitmap and invoke the process function
  * of the nodes and collect the stats.
  *
  * @param graph
diff --git a/lib/graph/rte_graph_worker_common.h b/lib/graph/rte_graph_worker_common.h
index 4ab53a533e4c..e52a37ce5e84 100644
--- a/lib/graph/rte_graph_worker_common.h
+++ b/lib/graph/rte_graph_worker_common.h
@@ -49,15 +49,14 @@ SLIST_HEAD(rte_graph_rq_head, rte_graph);
  */
 struct __rte_cache_aligned rte_graph {
 	/* Fast path area. */
-	uint32_t tail;		     /**< Tail of circular buffer. */
-	uint32_t head;		     /**< Head of circular buffer. */
-	uint32_t cir_mask;	     /**< Circular buffer wrap around mask. */
 	rte_node_t nb_nodes;	     /**< Number of nodes in the graph. */
-	rte_graph_off_t *cir_start;  /**< Pointer to circular buffer. */
 	rte_graph_off_t nodes_start; /**< Offset at which node memory starts. */
+	rte_graph_off_t *sched_table; /**< Node offset indexed by sched_idx. */
+	uint64_t *pending;	     /**< Bitmap of pending nodes. */
+	uint64_t *src_pending;	     /**< Bitmap of source nodes (constant). */
+	uint16_t nb_sched_words;     /**< Number of uint64_t words in pending bitmaps. */
 	uint8_t model;		     /**< graph model */
-	uint8_t reserved1;	     /**< Reserved for future use. */
-	uint16_t reserved2;	     /**< Reserved for future use. */
+	/* 26 bytes padding */
 	union {
 		/* Fast schedule area for mcore dispatch model */
 		struct {
@@ -98,6 +97,7 @@ struct __rte_cache_aligned rte_node {
 	rte_node_t id;		/**< Node identifier. */
 	rte_node_t parent_id;	/**< Parent Node identifier. */
 	rte_edge_t nb_edges;	/**< Number of edges from this node. */
+	uint16_t sched_idx;	/**< Bit position in pending bitmap. */
 	uint32_t realloc_count;	/**< Number of times realloced. */
 
 	char parent[RTE_NODE_NAMESIZE];	/**< Parent node name. */
@@ -132,7 +132,7 @@ struct __rte_cache_aligned rte_node {
 		}; /**< Node Context. */
 		uint16_t size;		/**< Total number of objects available. */
 		uint16_t idx;		/**< Number of objects used. */
-		rte_graph_off_t off;	/**< Offset of node in the graph reel. */
+		rte_graph_off_t off;	/**< Offset of node in the graph memory. */
 		uint64_t total_cycles;	/**< Cycles spent in this node. */
 		uint64_t total_calls;	/**< Calls done to this node. */
 		uint64_t total_objs;	/**< Objects processed by this node. */
@@ -187,12 +187,12 @@ void __rte_node_stream_alloc_size(struct rte_graph *graph,
 /**
  * @internal
  *
- * Enqueue a given node to the tail of the graph reel.
+ * Process a node's pending objects and collect stats.
  *
  * @param graph
  *   Pointer Graph object.
  * @param node
- *   Pointer to node object to be enqueued.
+ *   Pointer to node object to be processed.
  */
 static __rte_always_inline void
 __rte_node_process(struct rte_graph *graph, struct rte_node *node)
@@ -220,21 +220,42 @@ __rte_node_process(struct rte_graph *graph, struct rte_node *node)
 /**
  * @internal
  *
- * Enqueue a given node to the tail of the graph reel.
+ * Get a pointer to a node from the scheduling table.
  *
  * @param graph
  *   Pointer Graph object.
+ * @param word
+ *   Offset in the pending bitmap.
+ * @param bit
+ *   Bit number.
+ *
+ * @return
+ *   Pointer to the node.
+ */
+static __rte_always_inline struct rte_node *
+__rte_graph_pending_node(struct rte_graph *graph, uint16_t word, uint16_t bit)
+{
+	const uint16_t index = (word * sizeof(*graph->pending) * CHAR_BIT) + bit;
+	const rte_graph_off_t node_offset = graph->sched_table[index];
+	return RTE_PTR_ADD(graph, node_offset);
+}
+
+/**
+ * @internal
+ *
+ * Mark a node as pending in the graph scheduling bitmap.
+ *
+ * @param bitmap
+ *   Either graph->pending or graph->src_pending.
  * @param node
- *   Pointer to node object to be enqueued.
+ *   Pointer to node object to be marked pending.
  */
 static __rte_always_inline void
-__rte_node_enqueue_tail_update(struct rte_graph *graph, struct rte_node *node)
+__rte_node_pending_set(uint64_t *bitmap, struct rte_node *node)
 {
-	uint32_t tail;
-
-	tail = graph->tail;
-	graph->cir_start[tail++] = node->off;
-	graph->tail = tail & graph->cir_mask;
+	const uint16_t word = node->sched_idx / (sizeof(*bitmap) * CHAR_BIT);
+	const uint16_t bit = node->sched_idx % (sizeof(*bitmap) * CHAR_BIT);
+	bitmap[word] |= 1ULL << bit;
 }
 
 /**
@@ -242,8 +263,8 @@ __rte_node_enqueue_tail_update(struct rte_graph *graph, struct rte_node *node)
  *
  * Enqueue sequence prologue function.
  *
- * Updates the node to tail of graph reel and resizes the number of objects
- * available in the stream as needed.
+ * Marks the node as pending in the scheduling bitmap and resizes the number
+ * of objects available in the stream as needed.
  *
  * @param graph
  *   Pointer to the graph object.
@@ -259,9 +280,7 @@ __rte_node_enqueue_prologue(struct rte_graph *graph, struct rte_node *node,
 			    const uint16_t idx, const uint16_t space)
 {
 
-	/* Add to the pending stream list if the node is new */
-	if (idx == 0)
-		__rte_node_enqueue_tail_update(graph, node);
+	__rte_node_pending_set(graph->pending, node);
 
 	if (unlikely(node->size < (idx + space)))
 		__rte_node_stream_alloc_size(graph, node, node->size + space);
@@ -293,7 +312,7 @@ __rte_node_next_node_get(struct rte_node *node, rte_edge_t next)
 
 /**
  * Enqueue the objs to next node for further processing and set
- * the next node to pending state in the circular buffer.
+ * the next node to pending state in the scheduling bitmap.
  *
  * @param graph
  *   Graph pointer returned from rte_graph_lookup().
@@ -321,7 +340,7 @@ rte_node_enqueue(struct rte_graph *graph, struct rte_node *node,
 
 /**
  * Enqueue only one obj to next node for further processing and
- * set the next node to pending state in the circular buffer.
+ * set the next node to pending state in the scheduling bitmap.
  *
  * @param graph
  *   Graph pointer returned from rte_graph_lookup().
@@ -347,7 +366,7 @@ rte_node_enqueue_x1(struct rte_graph *graph, struct rte_node *node,
 
 /**
  * Enqueue only two objs to next node for further processing and
- * set the next node to pending state in the circular buffer.
+ * set the next node to pending state in the scheduling bitmap.
  * Same as rte_node_enqueue_x1 but enqueue two objs.
  *
  * @param graph
@@ -377,7 +396,7 @@ rte_node_enqueue_x2(struct rte_graph *graph, struct rte_node *node,
 
 /**
  * Enqueue only four objs to next node for further processing and
- * set the next node to pending state in the circular buffer.
+ * set the next node to pending state in the scheduling bitmap.
  * Same as rte_node_enqueue_x1 but enqueue four objs.
  *
  * @param graph
@@ -414,7 +433,7 @@ rte_node_enqueue_x4(struct rte_graph *graph, struct rte_node *node,
 
 /**
  * Enqueue objs to multiple next nodes for further processing and
- * set the next nodes to pending state in the circular buffer.
+ * set the next nodes to pending state in the scheduling bitmap.
  * objs[i] will be enqueued to nexts[i].
  *
  * @param graph
@@ -472,7 +491,7 @@ rte_node_next_stream_get(struct rte_graph *graph, struct rte_node *node,
 }
 
 /**
- * Put the next stream to pending state in the circular buffer
+ * Put the next stream to pending state in the scheduling bitmap
  * for further processing. Should be invoked after rte_node_next_stream_get().
  *
  * @param graph
@@ -495,9 +514,7 @@ rte_node_next_stream_put(struct rte_graph *graph, struct rte_node *node,
 		return;
 
 	node = __rte_node_next_node_get(node, next);
-	if (node->idx == 0)
-		__rte_node_enqueue_tail_update(graph, node);
-
+	__rte_node_pending_set(graph->pending, node);
 	node->idx += idx;
 }
 
@@ -530,7 +547,7 @@ rte_node_next_stream_move(struct rte_graph *graph, struct rte_node *src,
 		src->objs = dobjs;
 		src->size = dsz;
 		dst->idx = src->idx;
-		__rte_node_enqueue_tail_update(graph, dst);
+		__rte_node_pending_set(graph->pending, dst);
 	} else { /* Move the objects from src node to dst node */
 		rte_node_enqueue(graph, src, next, src->objs, src->idx);
 	}
-- 
2.54.0


^ permalink raw reply related

* [PATCH v2 25/25] doc: add BPF validate debug to programmer's guide
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Document the new gdb-like validation debugger API, outlining how it can
be used to set breakpoints and inspect register states during
validation.

Highlight its primary use case: writing robust tests for the eBPF
verifier using the harness in app/test/test_bpf_validate.c.

Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 doc/guides/prog_guide/bpf_lib.rst | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/doc/guides/prog_guide/bpf_lib.rst b/doc/guides/prog_guide/bpf_lib.rst
index df37825088..08ea187687 100644
--- a/doc/guides/prog_guide/bpf_lib.rst
+++ b/doc/guides/prog_guide/bpf_lib.rst
@@ -118,6 +118,37 @@ For example, ``(BPF_IND | BPF_W | BPF_LD)`` means:
 and ``R1-R5`` were scratched.
 
 
+Validation Debugger
+-------------------
+
+The DPDK BPF library includes a validation debugger API designed primarily for
+writing comprehensive unit tests for the eBPF verifier. It allows developers
+to introspect the abstract interpretation process step-by-step to guarantee
+that the verifier correctly models the semantics of eBPF instructions.
+
+The debugger operates using a gdb-like approach:
+
+1.  **Initialization:** Create a debug session using
+    ``rte_bpf_validate_debug_create()`` and pass it to the loader via the
+    ``debug`` field in ``struct rte_bpf_prm_ex``.
+2.  **Breakpoints and Catchpoints:** Before loading, use
+    ``rte_bpf_validate_debug_break()`` or ``rte_bpf_validate_debug_catch()``
+    to register callback functions that trigger at specific instruction indices
+    (program counters) or upon specific validation events.
+3.  **State Introspection:** Within the callbacks, the API provides functions
+    like ``rte_bpf_validate_debug_can_access()``,
+    ``rte_bpf_validate_debug_may_jump()``, and various formatting functions
+    to safely inspect the verifier's internal belief about register bounds
+    and memory states at that specific execution point.
+
+When adding a test for a new eBPF instruction or fixing a validator bug,
+developers should utilize the harness provided in
+``app/test/test_bpf_validate.c``. This harness encapsulates the debugger API,
+allowing you to define the expected abstract domains (signed and unsigned
+intervals) for registers before and after a tested instruction, generating
+the necessary eBPF bytecode and breakpoints automatically.
+
+
 Not currently supported eBPF features
 -------------------------------------
 
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 24/25] doc: add release notes for BPF validation fixes
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  Cc: dev, Konstantin Ananyev
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Document the following new features and fixes:
* Added BPF validation debugger API (rte_bpf_validate_debug_*).
* Hardened BPF validator with numerous bug fixes and UB preventions.

Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 doc/guides/rel_notes/release_26_07.rst | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst
index 18810ab81d..4ef2d35463 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -83,6 +83,22 @@ New Features
   ``rte_bpf_eth_tx_install`` for installing already loaded BPF programs as
   port callbacks (as opposed to loading them directly from ELF files).
 
+* **Hardened BPF validator.**
+
+  Fixed numerous bugs in the BPF validator's abstract interpretation logic,
+  including incorrect bounds tracking for jumps and arithmetic operations, as
+  well as fixing several instances of undefined behavior (UB) when verifying
+  malicious or corrupt programs.
+
+* **Added BPF validation debugger API.**
+
+  Introduced a new set of APIs (prefixed with ``rte_bpf_validate_debug_``) to
+  introspect the BPF validator. This provides a mechanism to set breakpoints or
+  catchpoints during validation and inspect the verifier's internal state
+  (such as tracked register bounds). This API is crucial primarily for writing
+  comprehensive tests for the validator, but also serves as a foundation for a
+  future interactive eBPF validation debugger.
+
 
 Removed Items
 -------------
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 23/25] bpf/validate: prevent overflow when building graph
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `evst_pool_init` for malicious or corrupt BPF program with
number of conditional jumps exceeding a third of UINT32_MAX could cause
arithmetic and buffer overflows when working with the program graph.

Fix the issue by limiting maximum number of conditional jumps supported
by UINT32_MAX / 4, or more than 1 billion.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 lib/bpf/bpf_validate.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 35b7d4ad83..23311a36d1 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -2662,6 +2662,10 @@ evst_pool_init(struct bpf_verifier *bvf)
 {
 	uint32_t k, n;
 
+	if (bvf->nb_jcc_nodes > UINT32_MAX / 4)
+		/* Calculations that follow may overflow. */
+		return -E2BIG;
+
 	/*
 	 * We need nb_jcc_nodes + 1 for save_cur/restore_cur
 	 * remaining ones will be used for state tracking/pruning.
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 22/25] bpf/validate: fix BPF_XOR signed min calculation
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_xor` calculated signed minimum using essentially unsigned
algorithm as long as any of the operands have non-negative range, which
is incorrect since it ignores any negative numbers that may have the
sign or any other bits set.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jsgt r2, #0x0, L5
        3:  xor r2, #0x0  ; tested instruction
        4:  mov r0, #0x1
        5:  exit
    Pre-state:
       r2:  INT64_MIN..0
    Post-state:
       r2:  0

After the tested instruction validator considers r2 to equal 0, however
if -1 was loaded on step 1 it is possible for it to be -1.

Set signed range to full if any of the operands can be negative,
otherwise (if both operands are non-negative) use same algorithm as for
unsigned numbers. Add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  2 +-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 205373a4f8..a06d3254d6 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1764,6 +1764,23 @@ test_alu64_sub_x_src_signed_max_zero(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_sub_x_src_signed_max_zero_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_sub_x_src_signed_max_zero);
 
+/* 64-bit bitwise XOR between a negative scalar range and zero immediate. */
+static int
+test_alu64_xor_k_negative(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_XOR | BPF_K),
+			.imm = 0,
+		},
+		.pre.dst = make_signed_domain(INT64_MIN, 0),
+		.post.dst = unknown,
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_xor_k_negative_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_xor_k_negative);
+
 /* Jump if greater than immediate. */
 static int
 test_jmp64_jeq_k(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index a500ad662c..35b7d4ad83 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -910,7 +910,7 @@ eval_xor(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 		rd->s.max ^= rs->s.max;
 
 	/* both operands are non-negative */
-	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
+	} else if (rd->s.min >= 0 && rs->s.min >= 0) {
 		rd->s.max = eval_uor_max(rd->s.max, rs->s.max, opsz);
 		rd->s.min = 0;
 	} else
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 21/25] bpf/validate: fix BPF_SUB signed max zero case
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_sub` used source register signed minimum to detect
overflow of the difference (operation result) signed minimum, and source
register signed maximum to detect overflow of the difference signed
maximum. However in the actual formula for difference source register
bounds are swapped (correctly, since we subtract it), so in overflow
detection we should also have swapped them. It caused false negatives in
certain cases.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jsgt r2, #0x0, L7
        3:  ldxdw r3, [r1 + 8]
        4:  jsgt r3, #0x0, L7
        5:  sub r2, r3  ; tested instruction
        6:  mov r0, #0x1
        7:  exit
    Pre-state:
       r2:  INT64_MIN..0
       r3:  INT64_MIN..0
    Post-state:
       r2:  INT64_MIN

Validator ignores overflow of signed minimum and considers result to
always equal INT64_MIN. However, if -1 was loaded on step 1 and -2 was
loaded on step 3 it is possible for the difference to equal 1.

Swap source register signed minimum and maximum in the overflow
condition to match the new range formula, add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  4 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 7cf9e404b6..205373a4f8 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1747,6 +1747,23 @@ test_alu64_or_k_positive(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_or_k_positive_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_or_k_positive);
 
+/* 64-bit difference between two negative ranges.. */
+static int
+test_alu64_sub_x_src_signed_max_zero(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_SUB | BPF_X),
+		},
+		.pre.dst = make_signed_domain(INT64_MIN, 0),
+		.pre.src = make_signed_domain(INT64_MIN, 0),
+		.post.dst = unknown,
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_sub_x_src_signed_max_zero_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_sub_x_src_signed_max_zero);
+
 /* Jump if greater than immediate. */
 static int
 test_jmp64_jeq_k(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index d9ee0563c9..a500ad662c 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -716,9 +716,9 @@ eval_sub(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, uint64_t msk)
 		eval_umax_bound(&rv, msk);
 
 	if ((rd->s.min != rd->s.max || rs->s.min != rs->s.max) &&
-			(((rs->s.min < 0 && rv.s.min < rd->s.min) ||
+			(((rs->s.max < 0 && rv.s.min < rd->s.min) ||
 			rv.s.min > rd->s.min) ||
-			((rs->s.max < 0 && rv.s.max < rd->s.max) ||
+			((rs->s.min < 0 && rv.s.max < rd->s.max) ||
 			rv.s.max > rd->s.max)))
 		eval_smax_bound(&rv, msk);
 
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 20/25] bpf/validate: fix BPF_OR min calculations
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

This commit fixes two different problems in signed and unsigned minimum
calculations within `eval_or`. Passing tests requires both problems to
be fixed which is why the changes are squashed in one commit.

1) Function `eval_or` calculated result signed minimum as bitwise OR
between corresponding minimums as long as any of them is non-negative,
which is incorrect since values within the range can have zeroes where
the minimums don't, including the sign bit.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jlt r2, #0x5, L8
        3:  jgt r2, #0x6, L8
        4:  jslt r2, #0x5, L8
        5:  jsgt r2, #0x6, L8
        6:  or r2, #0xfffffffe  ; tested instruction
        7:  mov r0, #0x1
        8:  exit
    Pre-state:
       r2:  5..6
    Post-state:
       r2:  -1

After the tested instruction validator considers r2 to always equal -1,
however if 6 was loaded on step 1 it is possible for it to be -2:

     0x6 & 0xfffffffffffffffe == 0xfffffffffffffffe = -2

Set signed range to full if any of the operands can be negative,
otherwise use the maximum of both minimums as a new signed minimum
following the idea that result of bitwise OR cannot be smaller than its
operands. Add test.

2) Function `eval_or` calculated result unsigned minimum as bitwise OR
between corresponding minimums, which is incorrect since values within
the range can have zeroes the minimums don't.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jlt r2, #0x5, L8
        3:  jgt r2, #0x6, L8
        4:  jslt r2, #0x5, L8
        5:  jsgt r2, #0x6, L8
        6:  or r2, #0x2  ; tested instruction
        7:  mov r0, #0x1
        8:  exit
    Pre-state:
       r2:  5..6
    Post-state:
       r2:  7

After the tested instruction validator considers r2 to always equal 7,
however if 6 was loaded on step 1 it is possible for it to be 6:

    0x6 & 0x2 == 0x6

Use the maximum of both minimums as a new unsigned minimum following the
idea that result of bitwise OR cannot be smaller than its operands. Add
test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 34 ++++++++++++++++++++++++++++++++++
 lib/bpf/bpf_validate.c       |  6 +++---
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index c3d1bdb78f..7cf9e404b6 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1713,6 +1713,40 @@ test_alu64_neg_zero_last(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_neg_zero_last_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_neg_zero_last);
 
+/* 64-bit bitwise OR between a positive scalar range and negative immediate. */
+static int
+test_alu64_or_k_negative(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_OR | BPF_K),
+			.imm = -2,
+		},
+		.pre.dst = make_signed_domain(5, 6),
+		.post.dst = make_signed_domain(-2, -1),
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_or_k_negative_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_or_k_negative);
+
+/* 64-bit bitwise OR between a positive scalar range and positive immediate. */
+static int
+test_alu64_or_k_positive(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_OR | BPF_K),
+			.imm = 2,
+		},
+		.pre.dst = make_signed_domain(5, 6),
+		.post.dst = make_signed_domain(5, 7),
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_or_k_positive_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_or_k_positive);
+
 /* Jump if greater than immediate. */
 static int
 test_jmp64_jeq_k(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 2c61e5d96a..d9ee0563c9 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -875,7 +875,7 @@ eval_or(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 		rd->u.max |= rs->u.max;
 	} else {
 		rd->u.max = eval_uor_max(rd->u.max, rs->u.max, opsz);
-		rd->u.min |= rs->u.min;
+		rd->u.min = RTE_MAX(rd->u.min, rs->u.min);
 	}
 
 	/* both operands are constants */
@@ -884,9 +884,9 @@ eval_or(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 		rd->s.max |= rs->s.max;
 
 	/* both operands are non-negative */
-	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
+	} else if (rd->s.min >= 0 && rs->s.min >= 0) {
 		rd->s.max = eval_uor_max(rd->s.max, rs->s.max, opsz);
-		rd->s.min |= rs->s.min;
+		rd->s.min = RTE_MAX(rd->s.min, rs->s.min);
 	} else
 		eval_smax_bound(rd, msk);
 }
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 19/25] bpf/validate: fix BPF_LSH shift-out-of-bounds UB
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_lsh` when validating left shift by 63 invoked macro
`RTE_LEN2MASK(0, int64_t)` which triggered shift-out-of-bounds undefined
behaviour.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jlt r2, #0x3, L8
        3:  jgt r2, #0x5, L8
        4:  jslt r2, #0x3, L8
        5:  jsgt r2, #0x5, L8
        6:  lsh r2, #0x3f  ; tested instruction
        7:  mov r0, #0x1
        8:  exit
    Pre-state:
       r2:  3..5
    Post-state:
       r2:  0..UINT64_MAX

With sanitizer the following diagnostic is generated:

    lib/bpf/bpf_validate.c:785:4: runtime error: shift exponent 64 is
    too large for 64-bit type 'long unsigned int'
        #0 0x00000274d5e0 in eval_lsh lib/bpf/bpf_validate.c:785
        #1 0x00000275a2ea in eval_alu lib/bpf/bpf_validate.c:1310
        #2 0x00000276ce3d in evaluate lib/bpf/bpf_validate.c:3284

Add guard for this case, add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  3 ++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 5d26299ba6..c3d1bdb78f 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1536,6 +1536,23 @@ test_alu64_div_mod_overflow(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_overflow_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_div_mod_overflow);
 
+/* 64-bit left shift by 63. */
+static int
+test_alu64_lsh_63(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_LSH | BPF_K),
+			.imm = 63,
+		},
+		.pre.dst = make_signed_domain(3, 5),
+		.post.dst = unknown,
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_lsh_63_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_lsh_63);
+
 /* 64-bit multiplication of constant and immediate with overflow. */
 static int
 test_alu64_mul_k_overflow(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 4dbf3a3ef8..2c61e5d96a 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -746,7 +746,8 @@ eval_lsh(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 
 	/* check that dreg values are and would remain always positive */
 	if ((uint64_t)rd->s.min >> (opsz - 1) != 0 || rd->s.max >=
-			RTE_LEN2MASK(opsz - rs->u.max - 1, int64_t))
+			(rs->u.max == opsz - 1 ? 0 :
+				 RTE_LEN2MASK(opsz - rs->u.max - 1, int64_t)))
 		eval_smax_bound(rd, msk);
 	else {
 		rd->s.max <<= rs->u.max;
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 18/25] bpf/validate: fix BPF_AND min calculations
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_and` calculated both signed (if positive) and unsigned
minimum values as bitwise AND between corresponding minimums, which is
incorrect since intermediate values can have zeroes in bits where
minimum values don't.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jlt r2, #0x6, L8
        3:  jgt r2, #0x8, L8
        4:  jslt r2, #0x6, L8
        5:  jsgt r2, #0x8, L8
        6:  and r2, #0x5  ; tested instruction
        7:  mov r0, #0x1
        8:  exit
    Pre-state:
       r2:  6..8
    Post-state:
       r2:  4..7

After the tested instruction validator considers r2 to be equal or
greater than 4, however if 8 was loaded on step 1 it is possible for it
to be zero (0x8 & 0x5 == 0).

Use zero as a new safe lower bound for both signed (if positive) and
unsigned minimum. Add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  4 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index f80dee24a6..5d26299ba6 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1384,6 +1384,23 @@ test_alu64_add_x_scalar_scalar(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_add_x_scalar_scalar_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_add_x_scalar_scalar);
 
+/* 64-bit bitwise AND between a scalar range and immediate. */
+static int
+test_alu64_and_k(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_AND | BPF_K),
+			.imm = 5,
+		},
+		.pre.dst = make_signed_domain(6, 8),
+		.post.dst = make_signed_domain(0, 7),
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_and_k_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_and_k);
+
 /* 64-bit division and modulo of UINT64_MAX*2/3. */
 static int
 test_alu64_div_mod_big_constant(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index fbae70df92..4dbf3a3ef8 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -848,7 +848,7 @@ eval_and(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 		rd->u.max &= rs->u.max;
 	} else {
 		rd->u.max = eval_uand_max(rd->u.max, rs->u.max, opsz);
-		rd->u.min &= rs->u.min;
+		rd->u.min = 0;
 	}
 
 	/* both operands are constants */
@@ -859,7 +859,7 @@ eval_and(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 	} else if (rd->s.min >= 0 || rs->s.min >= 0) {
 		rd->s.max = eval_uand_max(rd->s.max & (msk >> 1),
 			rs->s.max & (msk >> 1), opsz);
-		rd->s.min &= rs->s.min;
+		rd->s.min = 0;
 	} else
 		eval_smax_bound(rd, msk);
 }
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 17/25] bpf/validate: fix BPF_JMP empty range handling
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_jcc` did not account for 'dynamically unreachable' code
paths. Some code paths may be _dynamically_ unreachable, which measn
that according to validator calculations no valid values are left to
evaluate. This does not indicate dead code since same code might be
reachable through other code paths. Previous behaviour resulted in:
* undefined behaviour in corner cases;
* ranges breaking min <= max invariant relied upon in multiple places
  (e.g. signed overflow detection in `eval_mul` only checks `s.min` to
  make sure the range is non-negative and so on);
* unnecessary work for validator contributing to exponential code paths
  grow in some cases.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  mov r2, #0x2a
        2:  lddw r3, #0x8000000000000000
        4:  jslt r2, r3, L7  ; tested instruction
        5:  mov r0, #0x1
        6:  exit
        7:  mov r0, #0x2
        8:  exit
    Pre-state:
       r2:  42
       r3:  INT64_MIN
    Post-state:
       r2:  42
       r3:  INT64_MIN
    Jump-state:
       r2:  42
       r3:  43..INT64_MIN INTERSECT 0x8000000000000000 (!)

At step 7 after jump from tested instruction validator considers r3 to
equal 0x8000000000000000 if viewed as unsigned, or have nonsensical
range 43..INT64_MIN if viewed as signed. In reality there is just no
valid range for this code path since it will never occur.

With sanitizer the following diagnostic is generated:

    lib/bpf/bpf_validate.c:1824:15: runtime error: signed integer
    overflow: -9223372036854775808 - 1 cannot be represented in type
    'long int'
        #0 0x000002761e41 in eval_jslt_jsge lib/bpf/bpf_validate.c:1824
        #1 0x000002762acb in eval_jcc lib/bpf/bpf_validate.c:1881
        #2 0x00000276b749 in evaluate lib/bpf/bpf_validate.c:3245
    ...

    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
    lib/bpf/bpf_validate.c:1824:15

Add pruning of dynamically unreachable code paths that arise from
ordering comparisons. Add tests for remaining ordering jump cases.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c     | 277 ++++++++++++++++++++++++++++++-
 lib/bpf/bpf_validate.c           |  96 ++++++++---
 lib/bpf/rte_bpf_validate_debug.h |   2 +
 3 files changed, 351 insertions(+), 24 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 15ccf4f6a5..f80dee24a6 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -135,6 +135,11 @@ static const struct domain unknown = {
 	.u = { .min = 0, .max = UINT64_MAX },
 };
 
+/* Unreachable state. */
+static const struct state unreachable = {
+	.is_unreachable = true,
+};
+
 
 /* BUILDING DOMAINS */
 
@@ -1710,6 +1715,55 @@ test_jmp64_jslt_x(void)
 REGISTER_FAST_TEST(bpf_validate_jmp64_jslt_x_autotest, NOHUGE_OK, ASAN_OK,
 	test_jmp64_jslt_x);
 
+/* Jump on ordering comparisons with potential bound overflow. */
+static int
+test_jmp64_ordering_overflow(void)
+{
+	/* In this test signed and unsigned cases are spelled out explicitly. */
+	const bool also_signed = false;
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSLT | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(42),
+		.pre.src = make_singleton_domain(INT64_MIN),
+		.jump = unreachable,
+	}, also_signed), "signed less than INT64_MIN");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSGT | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(42),
+		.pre.src = make_singleton_domain(INT64_MAX),
+		.jump = unreachable,
+	}, also_signed), "signed greater than INT64_MAX");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(42),
+		.pre.src = make_singleton_domain(0),
+		.jump = unreachable,
+	}, also_signed), "unsigned less than zero");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGT | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(42),
+		.pre.src = make_singleton_domain(UINT64_MAX),
+		.jump = unreachable,
+	}, also_signed), "unsigned greater than UINT64_MAX");
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_overflow_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_overflow);
+
 /* Jump on ordering comparisons between two ranges. */
 static int
 test_jmp64_ordering_ranges(void)
@@ -1717,6 +1771,29 @@ test_jmp64_ordering_ranges(void)
 	/* All ranges used are valid for both signed and unsigned comparisons. */
 	const bool also_signed = true;
 
+	/*
+	 *               20 ---- dst ---- 60
+	 * 0 - src - 10
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(0, 10),
+		.jump = unreachable,
+	}, also_signed), "strict, dst range strongly greater than src range");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(0, 10),
+		.jump = unreachable,
+	}, also_signed), "non-strict, dst range strongly greater than src range");
+
 	/*
 	 *     20 ---- dst ---- 60
 	 * 10 -- src -- 40
@@ -1817,15 +1894,38 @@ test_jmp64_ordering_ranges(void)
 		.post.src = make_signed_domain(40, 59),
 	}, also_signed), "non-strict, dst range weakly less than src range");
 
+	/*
+	 *     20 ---- dst ---- 60
+	 *                          70 - src - 80
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(70, 80),
+		.post = unreachable,
+	}, also_signed), "strict, dst range strongly less than src range");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(70, 80),
+		.post = unreachable,
+	}, also_signed), "non-strict, dst range strongly less than src range");
+
 	return TEST_SUCCESS;
 }
 
 REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_ranges_autotest, NOHUGE_OK, ASAN_OK,
 	test_jmp64_ordering_ranges);
 
-/* Jump on ordering comparisons with singleton. */
+/* Jump on ordering comparisons with singleton inside the range. */
 static int
-test_jmp64_ordering_singleton(void)
+test_jmp64_ordering_singleton_inside(void)
 {
 	/* All ranges used are valid for both signed and unsigned comparisons. */
 	const bool also_signed = true;
@@ -1878,8 +1978,177 @@ test_jmp64_ordering_singleton(void)
 	return TEST_SUCCESS;
 }
 
-REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_singleton_autotest, NOHUGE_OK, ASAN_OK,
-	test_jmp64_ordering_singleton);
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_singleton_inside_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_singleton_inside);
+
+/* Jump on ordering comparisons with singleton outside the range. */
+static int
+test_jmp64_ordering_singleton_outside(void)
+{
+	/* All ranges used are valid for both signed and unsigned comparisons. */
+	const bool also_signed = true;
+
+	/*
+	 *       20 ---- dst ---- 60
+	 *  imm
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_K),
+			.imm = 10,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.jump = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JLT | BPF_K) check, range greater than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_K),
+			.imm = 10,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.jump = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JLE | BPF_K) check, range greater than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGT | BPF_K),
+			.imm = 10,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JGT | BPF_K) check, range greater than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGE | BPF_K),
+			.imm = 10,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JGE | BPF_K) check, range greater than imm");
+
+	/*
+	 *       20 ---- dst ---- 60
+	 *                            imm
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_K),
+			.imm = 70,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JLT | BPF_K) check, range less than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_K),
+			.imm = 70,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JLE | BPF_K) check, range less than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGT | BPF_K),
+			.imm = 70,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.jump = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JGT | BPF_K) check, range less than imm");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGE | BPF_K),
+			.imm = 70,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.jump = unreachable,
+	}, also_signed), "(BPF_JMP | EBPF_JGE | BPF_K) check, range less than imm");
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_singleton_outside_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_singleton_outside);
+
+/* Jump on ordering comparisons with ranges "touching" each other. */
+static int
+test_jmp64_ordering_touching(void)
+{
+	/* All ranges used are valid for both signed and unsigned comparisons. */
+	const bool also_signed = true;
+
+	for (int overlap = 0; overlap != 3; ++overlap) {
+
+		/*
+		 *                  20 - dst - 30
+		 * 10 - src - (19 + overlap)
+		 */
+
+		TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (BPF_JMP | EBPF_JLT | BPF_X),
+			},
+			.pre.dst = make_signed_domain(20, 30),
+			.pre.src = make_signed_domain(10, 19 + overlap),
+			.jump = overlap <= 1 ? unreachable : (struct state){
+				.dst = make_singleton_domain(20),
+				.src = make_singleton_domain(21),
+			},
+		}, also_signed), "strict, dst left touching src right, overlap=%d", overlap);
+
+		TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (BPF_JMP | EBPF_JLE | BPF_X),
+			},
+			.pre.dst = make_signed_domain(20, 30),
+			.pre.src = make_signed_domain(10, 19 + overlap),
+			.jump = overlap < 1 ? unreachable : (struct state){
+				.dst = make_signed_domain(20, 19 + overlap),
+				.src = make_signed_domain(20, 19 + overlap),
+			},
+		}, also_signed), "non-strict, dst left touching src right, overlap=%d", overlap);
+
+		/*
+		 * 10 - dst - (19 + overlap)
+		 *                  20 - src - 30
+		 */
+
+		TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (BPF_JMP | EBPF_JLT | BPF_X),
+			},
+			.pre.dst = make_signed_domain(10, 19 + overlap),
+			.pre.src = make_signed_domain(20, 30),
+			.post = overlap < 1 ? unreachable : (struct state){
+				.dst = make_signed_domain(20, 19 + overlap),
+				.src = make_signed_domain(20, 19 + overlap),
+			},
+		}, also_signed), "strict, dst right touching src left, overlap=%d", overlap);
+
+		TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (BPF_JMP | EBPF_JLE | BPF_X),
+			},
+			.pre.dst = make_signed_domain(10, 19 + overlap),
+			.pre.src = make_signed_domain(20, 30),
+			.post = overlap <= 1 ? unreachable : (struct state){
+				.dst = make_singleton_domain(21),
+				.src = make_singleton_domain(20),
+			},
+		}, also_signed), "non-strict, dst right touching src left, overlap=%d", overlap);
+	}
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_touching_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_touching);
 
 /* 64-bit load from heap (should be set to unknown). */
 static int
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 8b7c27a2fa..fbae70df92 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -19,6 +19,9 @@
 
 #define BPF_ARG_PTR_STACK RTE_BPF_ARG_RESERVED
 
+/* type containing no values (AKA "bottom", "never" etc)  */
+#define BPF_ARG_UNINHABITED ((enum rte_bpf_arg_type)(RTE_BPF_ARG_UNDEF - 1))
+
 struct bpf_reg_val {
 	struct rte_bpf_arg v;
 	uint64_t mask;
@@ -36,6 +39,8 @@ struct bpf_eval_state {
 	SLIST_ENTRY(bpf_eval_state) next; /* for @safe list traversal */
 	struct bpf_reg_val rv[EBPF_REG_NUM];
 	struct bpf_reg_val sv[MAX_BPF_STACK_SIZE / sizeof(uint64_t)];
+	/* flag set for branches determined to be dynamically unreachable */
+	bool unreachable;
 };
 
 SLIST_HEAD(bpf_evst_head, bpf_eval_state);
@@ -174,6 +179,9 @@ __rte_bpf_validate_can_access(const struct bpf_verifier *verifier,
 	struct value_set access_set;
 	uint32_t opsz;
 
+	if (st->unreachable)
+		return -ENOENT;
+
 	switch (BPF_CLASS(access->code)) {
 	case BPF_LDX:
 		rv = &st->rv[access->src_reg];
@@ -310,6 +318,10 @@ __rte_bpf_validate_may_jump(const struct bpf_verifier *verifier,
 	if (!may_jump_code_is_supported(jump->code))
 		return -ENOTSUP;
 
+	if (st->unreachable)
+		/* Set no bits since neither false nor true is possible. */
+		return 0;
+
 	rd = &st->rv[jump->dst_reg];
 	dst_set = (rd->v.type == RTE_BPF_ARG_UNDEF) ? value_set_full :
 		value_set_from_pair(rd->s.min, rd->s.max, rd->u.min, rd->u.max);
@@ -1521,40 +1533,68 @@ static void
 eval_jgt_jle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->u.max = RTE_MIN(frd->u.max, frs->u.max);
-	frs->u.min = RTE_MAX(frs->u.min, frd->u.min);
-	trd->u.min = RTE_MAX(trd->u.min, trs->u.min + 1);
-	trs->u.max = RTE_MIN(trs->u.max, trd->u.max - 1);
+	if (frd->u.min <= frs->u.max) {
+		frd->u.max = RTE_MIN(frd->u.max, frs->u.max);
+		frs->u.min = RTE_MAX(frs->u.min, frd->u.min);
+	} else
+		frd->v.type = frs->v.type = BPF_ARG_UNINHABITED;
+
+	if (trs->u.min < trd->u.max) {
+		trd->u.min = RTE_MAX(trd->u.min, trs->u.min + 1);
+		trs->u.max = RTE_MIN(trs->u.max, trd->u.max - 1);
+	} else
+		trd->v.type = trs->v.type = BPF_ARG_UNINHABITED;
 }
 
 static void
 eval_jlt_jge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->u.min = RTE_MAX(frd->u.min, frs->u.min);
-	frs->u.max = RTE_MIN(frs->u.max, frd->u.max);
-	trd->u.max = RTE_MIN(trd->u.max, trs->u.max - 1);
-	trs->u.min = RTE_MAX(trs->u.min, trd->u.min + 1);
+	if (frs->u.min <= frd->u.max) {
+		frd->u.min = RTE_MAX(frd->u.min, frs->u.min);
+		frs->u.max = RTE_MIN(frs->u.max, frd->u.max);
+	} else
+		frd->v.type = frs->v.type = BPF_ARG_UNINHABITED;
+
+	if (trd->u.min < trs->u.max) {
+		trd->u.max = RTE_MIN(trd->u.max, trs->u.max - 1);
+		trs->u.min = RTE_MAX(trs->u.min, trd->u.min + 1);
+	} else
+		trd->v.type = trs->v.type = BPF_ARG_UNINHABITED;
 }
 
 static void
 eval_jsgt_jsle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->s.max = RTE_MIN(frd->s.max, frs->s.max);
-	frs->s.min = RTE_MAX(frs->s.min, frd->s.min);
-	trd->s.min = RTE_MAX(trd->s.min, trs->s.min + 1);
-	trs->s.max = RTE_MIN(trs->s.max, trd->s.max - 1);
+	if (frd->s.min <= frs->s.max) {
+		frd->s.max = RTE_MIN(frd->s.max, frs->s.max);
+		frs->s.min = RTE_MAX(frs->s.min, frd->s.min);
+	} else
+		frd->v.type = frs->v.type = BPF_ARG_UNINHABITED;
+
+	if (trs->s.min < trd->s.max) {
+		trd->s.min = RTE_MAX(trd->s.min, trs->s.min + 1);
+		trs->s.max = RTE_MIN(trs->s.max, trd->s.max - 1);
+	} else
+		trd->v.type = trs->v.type = BPF_ARG_UNINHABITED;
 }
 
 static void
 eval_jslt_jsge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->s.min = RTE_MAX(frd->s.min, frs->s.min);
-	frs->s.max = RTE_MIN(frs->s.max, frd->s.max);
-	trd->s.max = RTE_MIN(trd->s.max, trs->s.max - 1);
-	trs->s.min = RTE_MAX(trs->s.min, trd->s.min + 1);
+	if (frs->s.min <= frd->s.max) {
+		frd->s.min = RTE_MAX(frd->s.min, frs->s.min);
+		frs->s.max = RTE_MIN(frs->s.max, frd->s.max);
+	} else
+		frd->v.type = frs->v.type = BPF_ARG_UNINHABITED;
+
+	if (trd->s.min < trs->s.max) {
+		trd->s.max = RTE_MIN(trd->s.max, trs->s.max - 1);
+		trs->s.min = RTE_MAX(trs->s.min, trd->s.min + 1);
+	} else
+		trd->v.type = trs->v.type = BPF_ARG_UNINHABITED;
 }
 
 static const char *
@@ -1609,6 +1649,14 @@ eval_jcc(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
 	else if (op == EBPF_JSGE)
 		eval_jslt_jsge(frd, frs, trd, trs);
 
+	if (trd->v.type == BPF_ARG_UNINHABITED ||
+			trs->v.type == BPF_ARG_UNINHABITED)
+		tst->unreachable = true;
+
+	if (frd->v.type == BPF_ARG_UNINHABITED ||
+			frs->v.type == BPF_ARG_UNINHABITED)
+		fst->unreachable = true;
+
 	return NULL;
 }
 
@@ -2349,7 +2397,7 @@ set_edge_type(struct bpf_verifier *bvf, struct inst_node *node,
  * Depth-First Search (DFS) through previously constructed
  * Control Flow Graph (CFG).
  * Information collected at this path would be used later
- * to determine is there any loops, and/or unreachable instructions.
+ * to determine is there any loops, and/or statically unreachable instructions.
  * PREREQUISITE: there is at least one node.
  */
 static void
@@ -2397,7 +2445,7 @@ dfs(struct bpf_verifier *bvf)
 }
 
 /*
- * report unreachable instructions.
+ * report statically unreachable instructions.
  */
 static void
 log_unreachable(const struct bpf_verifier *bvf)
@@ -2970,13 +3018,21 @@ evaluate(struct bpf_verifier *bvf)
 				stats.nb_restore++;
 			}
 
+			if (bvf->evst->unreachable) {
+				rc = __rte_bpf_validate_debug_evaluate_step(
+					debug, get_node_idx(bvf, next),
+					RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_UNREACHABLE);
+				if (rc < 0)
+					break;
+
+				next = NULL;
 			/*
 			 * for jcc targets: check did we already evaluated
 			 * that path and can it's evaluation be skipped that
 			 * time.
 			 */
-			if (node->nb_edge > 1 && prune_eval_state(bvf, node,
-					next) == 0) {
+			} else if (node->nb_edge > 1 &&
+					prune_eval_state(bvf, node, next) == 0) {
 				rc = __rte_bpf_validate_debug_evaluate_step(
 					debug, get_node_idx(bvf, next),
 					RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_PRUNE);
diff --git a/lib/bpf/rte_bpf_validate_debug.h b/lib/bpf/rte_bpf_validate_debug.h
index 89bf587f02..f30fa926f1 100644
--- a/lib/bpf/rte_bpf_validate_debug.h
+++ b/lib/bpf/rte_bpf_validate_debug.h
@@ -49,6 +49,8 @@ enum rte_bpf_validate_debug_event {
 	RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_PRUNE,
 	/* End of branch verification, after the last verified instruction. */
 	RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_RETURN,
+	/* Pruning branch as dynamically unreachable. */
+	RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_UNREACHABLE,
 	/* Number of valid event values. */
 	RTE_BPF_VALIDATE_DEBUG_EVENT_END,
 };
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 16/25] bpf/validate: fix BPF_JMP source range calculation
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

All two-register ordering comparison functions (`eval_jgt_jle`,
`eval_jlt_jge`, `eval_jsgt_jsle`, `eval_jslt_jsge`) were updating only
the destination register value set but not the source register one. For
instance, instruction `jgt r2, r3` should be exactly equivalent to `jlt
r3, r2`, but previously the former only updated the possible values of
r2 while the latter only updated possible values of r3. Thus the
estimate for source register was conservative and could cause false
positives.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  mov r2, #0x28
        2:  ldxdw r3, [r1 + 0]
        3:  jlt r3, #0x14, L11
        4:  jgt r3, #0x3c, L11
        5:  jslt r3, #0x14, L11
        6:  jsgt r3, #0x3c, L11
        7:  jgt r2, r3, L10  ; tested instruction
        8:  mov r0, #0x1
        9:  exit
       10:  mov r0, #0x2
       11:  exit
    Pre-state:
       r2:  40
       r3:  20..60
    ...
    Jump-state:
       r2:  40
       r3:  20..60

If tested instruction jumped from step 7 to step 10 validator expects r3
to contain values up to 60, for example 55, however for this value jump
condition r2 > r3 will never be satisfied since r2 is known to equal 40,
and thus execution would always continue to step 8 instead of jumping.

Add missing source register values update.

Introduce test harness for verifying all equivalent variations of a
comparison instruction. Add tests for all cases where both code branches
are reachable (unreachable branches will be covered by subsequent
commits).

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 394 +++++++++++++++++++++++++++++++----
 lib/bpf/bpf_validate.c       |   8 +
 2 files changed, 358 insertions(+), 44 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index acc238f7d3..15ccf4f6a5 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -32,6 +32,31 @@ RTE_LOG_REGISTER(test_bpf_validate_logtype, test.bpf_validate, NOTICE);
 #define REGISTER_FORMAT_BUFFER_SIZE 256
 #define DISASSEMBLY_FORMAT_BUFFER_SIZE 64
 
+#define COMPARISON_INDEX_IMMEDIATE RTE_BIT32(0)
+#define COMPARISON_INDEX_GREATER   RTE_BIT32(1)
+#define COMPARISON_INDEX_INCLUSIVE RTE_BIT32(2)
+#define COMPARISON_INDEX_SIGNED    RTE_BIT32(3)
+
+/* List comparison opcodes to make their index bits match constants above.  */
+static const uint8_t comparisons_opcode[] = {
+	(BPF_JMP | EBPF_JLT  | BPF_X),
+	(BPF_JMP | EBPF_JLT  | BPF_K),
+	(BPF_JMP |  BPF_JGT  | BPF_X),
+	(BPF_JMP |  BPF_JGT  | BPF_K),
+	(BPF_JMP | EBPF_JLE  | BPF_X),
+	(BPF_JMP | EBPF_JLE  | BPF_K),
+	(BPF_JMP |  BPF_JGE  | BPF_X),
+	(BPF_JMP |  BPF_JGE  | BPF_K),
+	(BPF_JMP | EBPF_JSLT | BPF_X),
+	(BPF_JMP | EBPF_JSLT | BPF_K),
+	(BPF_JMP | EBPF_JSGT | BPF_X),
+	(BPF_JMP | EBPF_JSGT | BPF_K),
+	(BPF_JMP | EBPF_JSLE | BPF_X),
+	(BPF_JMP | EBPF_JSLE | BPF_K),
+	(BPF_JMP | EBPF_JSGE | BPF_X),
+	(BPF_JMP | EBPF_JSGE | BPF_K),
+};
+
 /* Interval bounded by two signed values, inclusive; min <= max. */
 struct signed_interval {
 	int64_t min;
@@ -1044,6 +1069,206 @@ verify_instruction(struct verify_instruction_param prm)
 	return rc;
 }
 
+static int
+opcode_comparison_index(uint8_t opcode)
+{
+	for (int index = 0; index != RTE_DIM(comparisons_opcode); ++index)
+		if (comparisons_opcode[index] == opcode)
+			return index;
+	TEST_LOG_LINE(ERR, "Unsupported or not a comparison opcode: %hhx", opcode);
+	RTE_VERIFY(false);
+}
+
+/* Change two-register comparison verification to immediate one. */
+static bool
+make_comparison_immediate(struct verify_instruction_param *prm)
+{
+	int comparison_index = opcode_comparison_index(prm->tested_instruction.code);
+	const int64_t value = prm->pre.src.s.min;
+
+	if ((comparison_index & COMPARISON_INDEX_IMMEDIATE) != 0) {
+		TEST_LOG_LINE(ERR, "Comparison %hhx is already immediate.",
+			prm->tested_instruction.code);
+		RTE_VERIFY(false);
+	}
+
+	if (!domain_is_singleton(&prm->pre.src) || !domain_is_singleton(&prm->post.src) ||
+			!domain_is_singleton(&prm->jump.src)) {
+		TEST_LOG_LINE(DEBUG, "Cannot make immediate out of a non-singleton domain.");
+		return false;
+	}
+	if (prm->pre.src.is_pointer || prm->post.src.is_pointer || prm->jump.src.is_pointer) {
+		TEST_LOG_LINE(DEBUG, "Cannot make immediate out of a pointer.");
+		return false;
+	}
+	if (prm->post.src.s.min != value || prm->jump.src.s.min != value) {
+		TEST_LOG_LINE(DEBUG, "Cannot make immediate if the value changes.");
+		return false;
+	}
+	if (!fits_in_imm32(value)) {
+		TEST_LOG_LINE(ERR, "Cannot make immediate unless value fits in int32.");
+		return false;
+	}
+
+	comparison_index |= COMPARISON_INDEX_IMMEDIATE;
+	prm->tested_instruction.code = comparisons_opcode[comparison_index];
+	prm->tested_instruction.imm = value;
+
+	RTE_VERIFY(prm->pre.src.is_defined);
+	prm->pre.src.is_defined = false;
+
+	if (!prm->post.is_unreachable) {
+		RTE_VERIFY(prm->post.src.is_defined);
+		prm->post.src.is_defined = false;
+	}
+
+	if (!prm->jump.is_unreachable) {
+		RTE_VERIFY(prm->jump.src.is_defined);
+		prm->jump.src.is_defined = false;
+	}
+
+	return true;
+}
+
+/* Change immediate comparison verification to two-register one. */
+static void
+make_comparison_two_register(struct verify_instruction_param *prm)
+{
+	int comparison_index = opcode_comparison_index(prm->tested_instruction.code);
+	const int64_t value = prm->tested_instruction.imm;
+
+	if ((comparison_index & COMPARISON_INDEX_IMMEDIATE) == 0) {
+		TEST_LOG_LINE(ERR, "Comparison %hhx is already two-register.",
+			prm->tested_instruction.code);
+		RTE_VERIFY(false);
+	}
+
+	comparison_index &= ~COMPARISON_INDEX_IMMEDIATE;
+	prm->tested_instruction.code = comparisons_opcode[comparison_index];
+	prm->tested_instruction.imm = 0;
+
+	RTE_VERIFY(!prm->pre.src.is_defined);
+	prm->pre.src = make_singleton_domain(value);
+
+	if (!prm->post.is_unreachable) {
+		RTE_VERIFY(!prm->post.src.is_defined);
+		prm->post.src = prm->pre.src;
+	}
+
+	if (!prm->jump.is_unreachable) {
+		RTE_VERIFY(!prm->jump.src.is_defined);
+		prm->jump.src = prm->pre.src;
+	}
+}
+
+/* Change comparison verification to complement (negated result) one. */
+static void
+make_comparison_complement(struct verify_instruction_param *prm)
+{
+	int comparison_index = opcode_comparison_index(prm->tested_instruction.code);
+	comparison_index ^= COMPARISON_INDEX_GREATER | COMPARISON_INDEX_INCLUSIVE;
+	prm->tested_instruction.code = comparisons_opcode[comparison_index];
+	RTE_SWAP(prm->post, prm->jump);
+}
+
+/* Change comparison verification to converse (swapped operands) one. */
+static void
+make_comparison_converse(struct verify_instruction_param *prm)
+{
+	int comparison_index = opcode_comparison_index(prm->tested_instruction.code);
+	comparison_index ^= COMPARISON_INDEX_GREATER;
+	prm->tested_instruction.code = comparisons_opcode[comparison_index];
+	RTE_SWAP(prm->pre.dst, prm->pre.src);
+	RTE_SWAP(prm->post.dst, prm->post.src);
+	RTE_SWAP(prm->jump.dst, prm->jump.src);
+}
+
+/* Change signed comparison verification to unsigned one. */
+static void
+make_comparison_signed(struct verify_instruction_param *prm)
+{
+	int comparison_index = opcode_comparison_index(prm->tested_instruction.code);
+	if ((comparison_index & COMPARISON_INDEX_SIGNED) != 0) {
+		TEST_LOG_LINE(ERR, "Comparison %hhx is already signed.",
+			prm->tested_instruction.code);
+		RTE_VERIFY(false);
+	}
+	comparison_index |= COMPARISON_INDEX_SIGNED;
+	prm->tested_instruction.code = comparisons_opcode[comparison_index];
+}
+
+/* Verify specified two-register comparison and, if possible, immediate one. */
+static int
+verify_comparison_subcase(struct verify_instruction_param prm)
+{
+	TEST_ASSERT_SUCCESS(verify_instruction(prm), "two-register version check");
+
+	if (make_comparison_immediate(&prm))
+		TEST_ASSERT_SUCCESS(verify_instruction(prm), "immediate version check");
+
+	return TEST_SUCCESS;
+}
+
+/*
+ * Verify comparison instruction validation behaviour.
+ *
+ * Call `verify_instruction` for all valid variations of the instruction.
+ *
+ * For instance, `jgt r2, r3` verifies:
+ * * `jgt r2, r3`;
+ * * `jlt r3, r2` src and dst swapped with each other;
+ * * `jle r2, r3` with post and jump domains swapped with each other;
+ * * `jge r3, r2` with all corresponding swaps;
+ * * immediate versions of everything above where possible,
+ *   that is, register on the right is an int32 scalar singleton;
+ * * signed versions of everything above if `also_signed` is true;
+ *
+ * Regardless if passed instruction compares with immediate or singleton src
+ * both cases are generated and tested.
+ */
+static int
+verify_comparison(struct verify_instruction_param prm, bool also_signed)
+{
+	fill_verify_instruction_defaults(&prm);
+
+	if (!prm.pre.src.is_defined)
+		/* Convert from immediate form to simplify further logic. */
+		make_comparison_two_register(&prm);
+
+	/* All reachable domains must be defined by this point. */
+	RTE_VERIFY(prm.pre.dst.is_defined);
+	RTE_VERIFY(prm.pre.src.is_defined);
+	if (!prm.post.is_unreachable) {
+		RTE_VERIFY(prm.post.dst.is_defined);
+		RTE_VERIFY(prm.post.src.is_defined);
+	}
+	if (!prm.jump.is_unreachable) {
+		RTE_VERIFY(prm.jump.dst.is_defined);
+		RTE_VERIFY(prm.jump.src.is_defined);
+	}
+
+	for (int make_signed = 0; make_signed <= also_signed; ++make_signed) {
+		if (make_signed)
+			make_comparison_signed(&prm);
+
+		for (int complement = false; complement <= true; ++complement) {
+
+			for (int converse = false; converse <= true; ++converse) {
+
+				TEST_ASSERT_SUCCESS(verify_comparison_subcase(prm),
+					"make_signed=%d, complement=%d, converse=%d",
+					make_signed, complement, converse);
+
+				make_comparison_converse(&prm);
+			}
+
+			make_comparison_complement(&prm);
+		}
+	}
+
+	return TEST_SUCCESS;
+}
+
 
 /* TESTS FOR SPECIFIC INSTRUCTIONS */
 
@@ -1485,31 +1710,69 @@ test_jmp64_jslt_x(void)
 REGISTER_FAST_TEST(bpf_validate_jmp64_jslt_x_autotest, NOHUGE_OK, ASAN_OK,
 	test_jmp64_jslt_x);
 
-/* Jump on ordering relationship with narrower range. */
+/* Jump on ordering comparisons between two ranges. */
 static int
-test_jmp64_jxx_x_ordering_narrower(void)
+test_jmp64_ordering_ranges(void)
 {
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	/* All ranges used are valid for both signed and unsigned comparisons. */
+	const bool also_signed = true;
+
+	/*
+	 *     20 ---- dst ---- 60
+	 * 10 -- src -- 40
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | BPF_JGT | BPF_X),
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(20, 50),
-		.jump.dst = make_signed_domain(31, 60),
-	}), "(BPF_JMP | BPF_JGT | BPF_X) check");
+		.pre.src = make_signed_domain(10, 40),
+		.jump.dst = make_signed_domain(20, 39),
+		.jump.src = make_signed_domain(21, 40),
+	}, also_signed), "strict, dst range weakly greater than src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | BPF_JGE | BPF_X),
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(20, 49),
-		.jump.dst = make_signed_domain(30, 60),
-	}), "(BPF_JMP | BPF_JGE | BPF_X) check");
+		.pre.src = make_signed_domain(10, 40),
+		.jump.dst = make_signed_domain(20, 40),
+		.jump.src = make_signed_domain(20, 40),
+	}, also_signed), "non-strict, dst range weakly greater than src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	/*
+	 *     20 ---- dst ---- 60
+	 * 10 -------- src -------- 70
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(10, 70),
+		.post.src = make_signed_domain(10, 60),
+		.jump.src = make_signed_domain(21, 70),
+	}, also_signed), "strict, dst range included in src range");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(10, 70),
+		.post.src = make_signed_domain(10, 59),
+		.jump.src = make_signed_domain(20, 70),
+	}, also_signed), "non-strict, dst range included in src range");
+
+	/*
+	 *     20 ---- dst ---- 60
+	 *        30 - src - 50
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
 			.code = (BPF_JMP | EBPF_JLT | BPF_X),
 		},
@@ -1517,9 +1780,9 @@ test_jmp64_jxx_x_ordering_narrower(void)
 		.pre.src = make_signed_domain(30, 50),
 		.post.dst = make_signed_domain(30, 60),
 		.jump.dst = make_signed_domain(20, 49),
-	}), "(BPF_JMP | EBPF_JLT | BPF_X) check");
+	}, also_signed), "strict, dst range includes src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
 			.code = (BPF_JMP | EBPF_JLE | BPF_X),
 		},
@@ -1527,53 +1790,96 @@ test_jmp64_jxx_x_ordering_narrower(void)
 		.pre.src = make_signed_domain(30, 50),
 		.post.dst = make_signed_domain(31, 60),
 		.jump.dst = make_signed_domain(20, 50),
-	}), "(BPF_JMP | EBPF_JLE | BPF_X) check");
+	}, also_signed), "non-strict, dst range includes src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	/*
+	 *     20 ---- dst ---- 60
+	 *             40 -- src -- 70
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | EBPF_JSGT | BPF_X),
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(20, 50),
-		.jump.dst = make_signed_domain(31, 60),
-	}), "(BPF_JMP | EBPF_JSGT | BPF_X) check");
+		.pre.src = make_signed_domain(40, 70),
+		.post.dst = make_signed_domain(40, 60),
+		.post.src = make_signed_domain(40, 60),
+	}, also_signed), "strict, dst range weakly less than src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | EBPF_JSGE | BPF_X),
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(20, 49),
-		.jump.dst = make_signed_domain(30, 60),
-	}), "(BPF_JMP | EBPF_JSGE | BPF_X) check");
+		.pre.src = make_signed_domain(40, 70),
+		.post.dst = make_signed_domain(41, 60),
+		.post.src = make_signed_domain(40, 59),
+	}, also_signed), "non-strict, dst range weakly less than src range");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_ranges_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_ranges);
+
+/* Jump on ordering comparisons with singleton. */
+static int
+test_jmp64_ordering_singleton(void)
+{
+	/* All ranges used are valid for both signed and unsigned comparisons. */
+	const bool also_signed = true;
+
+	/*
+	 *     20 ---- dst ---- 60
+	 *             imm
+	 */
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | EBPF_JSLT | BPF_X),
+			.code = (BPF_JMP | EBPF_JLT | BPF_K),
+			.imm = 40,
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(30, 60),
-		.jump.dst = make_signed_domain(20, 49),
-	}), "(BPF_JMP | EBPF_JSLT | BPF_X) check");
+		.post.dst = make_signed_domain(40, 60),
+		.jump.dst = make_signed_domain(20, 39),
+	}, also_signed), "(BPF_JMP | EBPF_JLT | BPF_K) check");
 
-	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
 		.tested_instruction = {
-			.code = (BPF_JMP | EBPF_JSLE | BPF_X),
+			.code = (BPF_JMP | BPF_JGT | BPF_K),
+			.imm = 40,
 		},
 		.pre.dst = make_signed_domain(20, 60),
-		.pre.src = make_signed_domain(30, 50),
-		.post.dst = make_signed_domain(31, 60),
-		.jump.dst = make_signed_domain(20, 50),
-	}), "(BPF_JMP | EBPF_JSLE | BPF_X) check");
+		.post.dst = make_signed_domain(20, 40),
+		.jump.dst = make_signed_domain(41, 60),
+	}, also_signed), "(BPF_JMP | EBPF_JGT | BPF_K) check");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_K),
+			.imm = 40,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post.dst = make_signed_domain(41, 60),
+		.jump.dst = make_signed_domain(20, 40),
+	}, also_signed), "(BPF_JMP | EBPF_JLE | BPF_K) check");
+
+	TEST_ASSERT_SUCCESS(verify_comparison((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGE | BPF_K),
+			.imm = 40,
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.post.dst = make_signed_domain(20, 39),
+		.jump.dst = make_signed_domain(40, 60),
+	}, also_signed), "(BPF_JMP | EBPF_JGE | BPF_K) check");
 
 	return TEST_SUCCESS;
 }
 
-REGISTER_FAST_TEST(bpf_validate_jmp64_jxx_x_ordering_narrower_autotest, NOHUGE_OK, ASAN_OK,
-	test_jmp64_jxx_x_ordering_narrower);
+REGISTER_FAST_TEST(bpf_validate_jmp64_ordering_singleton_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_ordering_singleton);
 
 /* 64-bit load from heap (should be set to unknown). */
 static int
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index ddc468fa0d..8b7c27a2fa 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -1522,7 +1522,9 @@ eval_jgt_jle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
 	frd->u.max = RTE_MIN(frd->u.max, frs->u.max);
+	frs->u.min = RTE_MAX(frs->u.min, frd->u.min);
 	trd->u.min = RTE_MAX(trd->u.min, trs->u.min + 1);
+	trs->u.max = RTE_MIN(trs->u.max, trd->u.max - 1);
 }
 
 static void
@@ -1530,7 +1532,9 @@ eval_jlt_jge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
 	frd->u.min = RTE_MAX(frd->u.min, frs->u.min);
+	frs->u.max = RTE_MIN(frs->u.max, frd->u.max);
 	trd->u.max = RTE_MIN(trd->u.max, trs->u.max - 1);
+	trs->u.min = RTE_MAX(trs->u.min, trd->u.min + 1);
 }
 
 static void
@@ -1538,7 +1542,9 @@ eval_jsgt_jsle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
 	frd->s.max = RTE_MIN(frd->s.max, frs->s.max);
+	frs->s.min = RTE_MAX(frs->s.min, frd->s.min);
 	trd->s.min = RTE_MAX(trd->s.min, trs->s.min + 1);
+	trs->s.max = RTE_MIN(trs->s.max, trd->s.max - 1);
 }
 
 static void
@@ -1546,7 +1552,9 @@ eval_jslt_jsge(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
 	frd->s.min = RTE_MAX(frd->s.min, frs->s.min);
+	frs->s.max = RTE_MIN(frs->s.max, frd->s.max);
 	trd->s.max = RTE_MIN(trd->s.max, trs->s.max - 1);
+	trs->s.min = RTE_MAX(trs->s.min, trd->s.min + 1);
 }
 
 static const char *
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 15/25] bpf/validate: fix BPF_JGT/EBPF_JSGT no-jump max
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Functions `eval_jgt_jle` and `eval_jsgt_jsle` reduced range maximum for
BPF_JGT and EBPF_JSGT instructions in the no-jump case to the minimum of
src register instead of the maximum, producing more conservative
estimate that could cause false positives.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  jlt r2, #0x14, L15
        3:  jgt r2, #0x3c, L15
        4:  jslt r2, #0x14, L15
        5:  jsgt r2, #0x3c, L15
        6:  ldxdw r3, [r1 + 8]
        7:  jlt r3, #0x1e, L15
        8:  jgt r3, #0x32, L15
        9:  jslt r3, #0x1e, L15
       10:  jsgt r3, #0x32, L15
       11:  jgt r2, r3, L14  ; tested instruction
       12:  mov r0, #0x1
       13:  exit
       14:  mov r0, #0x2
       15:  exit
    Pre-state:
       r2:  20..60
       r3:  30..50
    Post-state:
       r2:  20..60 INTERSECT 0x14..0x1e (!)

Immediately after the tested instruction on step 12 validator expects r2
to contain values up to 60, for example 55, however for this value jump
condition r2 > r3 on step 11 would be always satisfied since r3 is known
to not exceed 50, and thus execution will always jump to step 14 instead
of continuing to step 12.

Fix range calculation, add tests for cases where range of src register
values is a strict subset of dst. Other cases will be covered in the
subsequent commits.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 90 ++++++++++++++++++++++++++++++++++++
 lib/bpf/bpf_validate.c       |  4 +-
 2 files changed, 92 insertions(+), 2 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 15cdc83f4f..acc238f7d3 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1485,6 +1485,96 @@ test_jmp64_jslt_x(void)
 REGISTER_FAST_TEST(bpf_validate_jmp64_jslt_x_autotest, NOHUGE_OK, ASAN_OK,
 	test_jmp64_jslt_x);
 
+/* Jump on ordering relationship with narrower range. */
+static int
+test_jmp64_jxx_x_ordering_narrower(void)
+{
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(20, 50),
+		.jump.dst = make_signed_domain(31, 60),
+	}), "(BPF_JMP | BPF_JGT | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | BPF_JGE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(20, 49),
+		.jump.dst = make_signed_domain(30, 60),
+	}), "(BPF_JMP | BPF_JGE | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(30, 60),
+		.jump.dst = make_signed_domain(20, 49),
+	}), "(BPF_JMP | EBPF_JLT | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JLE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(31, 60),
+		.jump.dst = make_signed_domain(20, 50),
+	}), "(BPF_JMP | EBPF_JLE | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSGT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(20, 50),
+		.jump.dst = make_signed_domain(31, 60),
+	}), "(BPF_JMP | EBPF_JSGT | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSGE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(20, 49),
+		.jump.dst = make_signed_domain(30, 60),
+	}), "(BPF_JMP | EBPF_JSGE | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSLT | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(30, 60),
+		.jump.dst = make_signed_domain(20, 49),
+	}), "(BPF_JMP | EBPF_JSLT | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (BPF_JMP | EBPF_JSLE | BPF_X),
+		},
+		.pre.dst = make_signed_domain(20, 60),
+		.pre.src = make_signed_domain(30, 50),
+		.post.dst = make_signed_domain(31, 60),
+		.jump.dst = make_signed_domain(20, 50),
+	}), "(BPF_JMP | EBPF_JSLE | BPF_X) check");
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_jmp64_jxx_x_ordering_narrower_autotest, NOHUGE_OK, ASAN_OK,
+	test_jmp64_jxx_x_ordering_narrower);
+
 /* 64-bit load from heap (should be set to unknown). */
 static int
 test_mem_ldx_dw_heap(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index a53048801a..ddc468fa0d 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -1521,7 +1521,7 @@ static void
 eval_jgt_jle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->u.max = RTE_MIN(frd->u.max, frs->u.min);
+	frd->u.max = RTE_MIN(frd->u.max, frs->u.max);
 	trd->u.min = RTE_MAX(trd->u.min, trs->u.min + 1);
 }
 
@@ -1537,7 +1537,7 @@ static void
 eval_jsgt_jsle(struct bpf_reg_val *trd, struct bpf_reg_val *trs,
 	struct bpf_reg_val *frd, struct bpf_reg_val *frs)
 {
-	frd->s.max = RTE_MIN(frd->s.max, frs->s.min);
+	frd->s.max = RTE_MIN(frd->s.max, frs->s.max);
 	trd->s.min = RTE_MAX(trd->s.min, trs->s.min + 1);
 }
 
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 14/25] bpf/validate: fix BPF_MUL signed overflow UB
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_mul` triggered signed overflow for large constants.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  lddw r2, #0x9876543210
        3:  mul r2, #0x12345678  ; tested instruction
        4:  mov r0, #0x1
        5:  exit

With sanitizer the following diagnostic is generated:

    lib/bpf/bpf_validate.c:1032:26: runtime error: signed integer
    overflow: 654820258320 * 305419896 cannot be represented in type
    'long int'
        #0 0x000002746bfd in eval_mul lib/bpf/bpf_validate.c:1032
        #1 0x00000274b6ac in eval_alu lib/bpf/bpf_validate.c:1260
        #2 0x00000275c526 in evaluate lib/bpf/bpf_validate.c:3174
        ...

    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
    lib/bpf/bpf_validate.c:1032:26

Multiply constants as unsigned which will produce mathematically correct
result in two's complement representation, add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  4 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index ecebfd48dd..15cdc83f4f 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1289,6 +1289,23 @@ test_alu64_div_mod_overflow(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_overflow_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_div_mod_overflow);
 
+/* 64-bit multiplication of constant and immediate with overflow. */
+static int
+test_alu64_mul_k_overflow(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_MUL | BPF_K),
+			.imm = 0x12345678,
+		},
+		.pre.dst = make_singleton_domain(0x9876543210),
+		.post.dst = make_singleton_domain(0x9876543210u * 0x12345678),
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_mul_k_overflow_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_mul_k_overflow);
+
 /* 64-bit mul of small scalar range and immediate. */
 static int
 test_alu64_mul_k_range_small(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 39c75bbcd7..a53048801a 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -921,8 +921,8 @@ eval_mul(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 
 	/* both operands are constants */
 	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
-		rd->s.min = (rd->s.min * rs->s.min) & msk;
-		rd->s.max = (rd->s.max * rs->s.max) & msk;
+		rd->s.min = ((uint64_t)rd->s.min * (uint64_t)rs->s.min) & msk;
+		rd->s.max = ((uint64_t)rd->s.max * (uint64_t)rs->s.max) & msk;
 	/* check that both operands are positive and no overflow */
 	} else if (rd->s.min >= 0 && rs->s.min >= 0) {
 		rd->s.max *= rs->s.max;
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 13/25] bpf/validate: fix BPF_MUL ranges minimum typo
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_mul` calculated minimum of the both signed and unsigned
ranges as destination square instead of product with source due to a
typo.

E.g. consider the following program with the current validation code:

     Tested program:
         0:  mov r0, #0x0
         1:  ldxdw r2, [r1 + 0]
         2:  jlt r2, #0x11, L8
         3:  jgt r2, #0x1d, L8
         4:  jslt r2, #0x11, L8
         5:  jsgt r2, #0x1d, L8
         6:  mul r2, #0xb  ; tested instruction
         7:  mov r0, #0x1
         8:  exit
     Pre-state:
        r2:  17..29
     Post-state:
        r2:  289..319

After the tested instruction validator considers r2 to be no less than
289, however if 20 was loaded on step 1 it is possible for it after
multiplying by 11 to become 220 which is less than 289.

Fix the typo, add test.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 17 +++++++++++++++++
 lib/bpf/bpf_validate.c       |  4 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index 31a235a55a..ecebfd48dd 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1289,6 +1289,23 @@ test_alu64_div_mod_overflow(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_overflow_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_div_mod_overflow);
 
+/* 64-bit mul of small scalar range and immediate. */
+static int
+test_alu64_mul_k_range_small(void)
+{
+	return verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_MUL | BPF_K),
+			.imm = 11,
+		},
+		.pre.dst = make_unsigned_domain(17, 29),
+		.post.dst = make_unsigned_domain(17 * 11, 29 * 11),
+	});
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_mul_k_range_small_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_mul_k_range_small);
+
 /* 64-bit negation when interval first element is INT64_MIN. */
 static int
 test_alu64_neg_int64min_first(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index b784777bbb..39c75bbcd7 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -915,7 +915,7 @@ eval_mul(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 	/* check for overflow */
 	} else if (rd->u.max <= msk >> opsz / 2 && rs->u.max <= msk >> opsz) {
 		rd->u.max *= rs->u.max;
-		rd->u.min *= rd->u.min;
+		rd->u.min *= rs->u.min;
 	} else
 		eval_umax_bound(rd, msk);
 
@@ -926,7 +926,7 @@ eval_mul(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 	/* check that both operands are positive and no overflow */
 	} else if (rd->s.min >= 0 && rs->s.min >= 0) {
 		rd->s.max *= rs->s.max;
-		rd->s.min *= rd->s.min;
+		rd->s.min *= rs->s.min;
 	} else
 		eval_smax_bound(rd, msk);
 }
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 12/25] bpf/validate: fix BPF_DIV and BPF_MOD signed part
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_divmod` for _unsigned_ division or modulo operation
calculated signed ranges using _signed_ division, which is
mathematically incorrect: unlike some other mathematical operations,
signed and unsigned divisions in the CPU register cyclic ring math are
not equivalent.

E.g. consider the following program with the current validation code:

     Tested program:
         0:  mov r0, #0x0
         1:  lddw r2, #0xaaaaaaaaaaaaaaaa
         3:  mov r3, #0x2
         4:  div r2, r3  ; tested instruction
         5:  mov r0, #0x1
         6:  exit
     Pre-state:
        r2:  -6148914691236517206
        r3:  2
     Post-state:
        r2:  -3074457345618258603 INTERSECT 0x5555555555555555 (!)

After the tested instruction validator considers r2 to equal
0x5555555555555555 if viewed as unsigned (correct, this is
0xaaaaaaaaaaaaaaaaull / 2), but equal -3074457345618258603 or
0xd555555555555555 if viewed as signed, although it cannot be both true.

Additionally, when validating division or modulo of INT64_MIN by -1
overflow happened in the validator possibly triggering an exception.

The following error is shown without sanitizer:

    1/1 DPDK:fast-tests / bpf_autotest FAIL            0.37s
    killed by signal 8 SIGFPE

With sanitizer the following diagnostic is generated:

    lib/bpf/bpf_validate.c:1086:14: runtime error: division of
    -9223372036854775808 by -1 cannot be represented in type 'long int'
        #0 0x0000027484bb in eval_divmod lib/bpf/bpf_validate.c:1086
        #1 0x00000274bcf3 in eval_alu lib/bpf/bpf_validate.c:1280
        #2 0x00000275cb3e in evaluate lib/bpf/bpf_validate.c:3192
        ...

    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
    lib/bpf/bpf_validate.c:1086:14

Change logic to copy results from unsigned division into signed. Add
both validation and execution tests for the case that triggered an
exception. Add validation tests for non-constant division to make sure
it is still valid (ranges of the non-constant division or modulo are not
really minimal, this can be addressed in the future).

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf.c          |  99 +++++++++++++++++++++++++
 app/test/test_bpf_validate.c | 135 +++++++++++++++++++++++++++++++++++
 lib/bpf/bpf_validate.c       |  38 +++-------
 3 files changed, 244 insertions(+), 28 deletions(-)

diff --git a/app/test/test_bpf.c b/app/test/test_bpf.c
index 69e84f0cab..744bf02f73 100644
--- a/app/test/test_bpf.c
+++ b/app/test/test_bpf.c
@@ -393,6 +393,13 @@ cmp_res(const char *func, uint64_t exp_rc, uint64_t ret_rc,
 	return ret;
 }
 
+/* Empty prepare function */
+static void
+dummy_prepare(void *arg)
+{
+	RTE_SET_USED(arg);
+}
+
 /* store immediate test-cases */
 static const struct ebpf_insn test_store1_prog[] = {
 	{
@@ -3157,6 +3164,70 @@ static const struct ebpf_insn test_ld_mbuf3_prog[] = {
 	},
 };
 
+/* divide INT64_MIN by -1 */
+static const struct ebpf_insn test_int64min_udiv_uint64max_prog[] = {
+	/* Load INT64_MIN into r0 */
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_0,
+		.imm = (int32_t)INT64_MIN,
+	},
+	{
+		.imm = (int32_t)(INT64_MIN >> 32),
+	},
+	/* Divide r0 by immediate -1 */
+	{
+		.code = (EBPF_ALU64 | BPF_DIV | BPF_K),
+		.dst_reg = EBPF_REG_0,
+		.imm = -1,
+	},
+	/* Exit for correctness otherwise */
+	{
+		.code = (BPF_JMP | EBPF_EXIT),
+	},
+};
+
+static int
+test_int64min_udiv_uint64max_check(uint64_t rc, const void *arg)
+{
+	RTE_SET_USED(arg);
+	/* 0x8000000000000000ull / 0xFFFFFFFFFFFFFFFFull == 0 */
+	TEST_ASSERT_EQUAL(rc, 0, "expected 0, found %#" PRIx64, rc);
+	return TEST_SUCCESS;
+}
+
+/* modulo INT64_MIN by -1 */
+static const struct ebpf_insn test_int64min_umod_uint64max_prog[] = {
+	/* Load INT64_MIN into r0 */
+	{
+		.code = (BPF_LD | BPF_IMM | EBPF_DW),
+		.dst_reg = EBPF_REG_0,
+		.imm = (int32_t)INT64_MIN,
+	},
+	{
+		.imm = (int32_t)(INT64_MIN >> 32),
+	},
+	/* Modulo r0 by immediate -1 */
+	{
+		.code = (EBPF_ALU64 | BPF_MOD | BPF_K),
+		.dst_reg = EBPF_REG_0,
+		.imm = -1,
+	},
+	/* Exit for correctness otherwise */
+	{
+		.code = (BPF_JMP | EBPF_EXIT),
+	},
+};
+
+static int
+test_int64min_umod_uint64max_check(uint64_t rc, const void *arg)
+{
+	RTE_SET_USED(arg);
+	/* 0x8000000000000000ull % 0xFFFFFFFFFFFFFFFFull == 0x8000000000000000ull  */
+	TEST_ASSERT_EQUAL(rc, (uint64_t)INT64_MIN, "expected INT64_MIN, found %#" PRIx64, rc);
+	return TEST_SUCCESS;
+}
+
 /* all bpf test cases */
 static const struct bpf_test tests[] = {
 	{
@@ -3465,6 +3536,34 @@ static const struct bpf_test tests[] = {
 		/* mbuf as input argument is not supported on 32 bit platform */
 		.allow_fail = (sizeof(uint64_t) != sizeof(uintptr_t)),
 	},
+	{
+		.name = "test_int64min_udiv_uint64max",
+		.arg_sz = sizeof(struct dummy_vect8),
+		.prm = {
+			.ins = test_int64min_udiv_uint64max_prog,
+			.nb_ins = RTE_DIM(test_int64min_udiv_uint64max_prog),
+			.prog_arg = {
+				.type = RTE_BPF_ARG_PTR,
+				.size = sizeof(struct dummy_vect8),
+			},
+		},
+		.prepare = dummy_prepare,
+		.check_result = test_int64min_udiv_uint64max_check,
+	},
+	{
+		.name = "test_int64min_umod_uint64max",
+		.arg_sz = 1,
+		.prm = {
+			.ins = test_int64min_umod_uint64max_prog,
+			.nb_ins = RTE_DIM(test_int64min_umod_uint64max_prog),
+			.prog_arg = {
+				.type = RTE_BPF_ARG_PTR,
+				.size = 1,
+			},
+		},
+		.prepare = dummy_prepare,
+		.check_result = test_int64min_umod_uint64max_check,
+	},
 };
 
 static int
diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index c752d86357..31a235a55a 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1154,6 +1154,141 @@ test_alu64_add_x_scalar_scalar(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_add_x_scalar_scalar_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_add_x_scalar_scalar);
 
+/* 64-bit division and modulo of UINT64_MAX*2/3. */
+static int
+test_alu64_div_mod_big_constant(void)
+{
+	const uint64_t dividend = UINT64_MAX / 3 * 2;
+	static const uint64_t divisors[] = {
+		1,
+		2,
+		3,
+		UINT64_MAX / 3,
+		INT64_MAX,
+		INT64_MIN,
+		UINT64_MAX / 3 * 2,
+		UINT64_MAX / 4 * 3,
+		UINT64_MAX,
+	};
+	for (int index = 0; index != RTE_DIM(divisors); ++index) {
+		const uint64_t divisor = divisors[index];
+
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_DIV | BPF_X),
+			},
+			.pre.dst = make_singleton_domain(dividend),
+			.pre.src = make_singleton_domain(divisor),
+			.post.dst = make_singleton_domain(dividend / divisor),
+		}), "(EBPF_ALU64 | BPF_DIV | BPF_X) check, index=%d", index);
+
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_MOD | BPF_X),
+			},
+			.pre.dst = make_singleton_domain(dividend),
+			.pre.src = make_singleton_domain(divisor),
+			.post.dst = make_singleton_domain(dividend % divisor),
+		}), "(EBPF_ALU64 | BPF_MOD | BPF_X) check, index=%d", index);
+	}
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_big_constant_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_div_mod_big_constant);
+
+/* 64-bit division and modulo of UINT64_MAX/3..UINT64_MAX*2/3 by a constant. */
+static int
+test_alu64_div_mod_big_range(void)
+{
+	const uint64_t dividend_first = UINT64_MAX / 3;
+	const uint64_t dividend_last = UINT64_MAX / 3 * 2;
+	static const uint64_t divisors[] = {
+		1,
+		2,
+		3,
+		UINT64_MAX / 3,
+		INT64_MAX,
+		INT64_MIN,
+		UINT64_MAX / 3 * 2,
+		UINT64_MAX / 4 * 3,
+		UINT64_MAX,
+	};
+	for (int index = 0; index != RTE_DIM(divisors); ++index) {
+		const uint64_t divisor = divisors[index];
+
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_DIV | BPF_X),
+			},
+			.pre.dst = make_unsigned_domain(dividend_first, dividend_last),
+			.pre.src = make_singleton_domain(divisor),
+			.post.dst = make_unsigned_domain(0, dividend_last),
+		}), "(EBPF_ALU64 | BPF_DIV | BPF_X) check, index=%d", index);
+
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_MOD | BPF_X),
+			},
+			.pre.dst = make_unsigned_domain(dividend_first, dividend_last),
+			.pre.src = make_singleton_domain(divisor),
+			.post.dst = make_unsigned_domain(0, RTE_MIN(dividend_last, divisor - 1)),
+		}), "(EBPF_ALU64 | BPF_MOD | BPF_X) check, index=%d", index);
+	}
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_big_range_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_div_mod_big_range);
+
+/* 64-bit division and modulo of INT64_MIN by -1. */
+static int
+test_alu64_div_mod_overflow(void)
+{
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_DIV | BPF_K),
+			.imm = -1,
+		},
+		.pre.dst = make_singleton_domain(INT64_MIN),
+		.post.dst = make_singleton_domain(0),
+	}), "(EBPF_ALU64 | BPF_DIV | BPF_K) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_DIV | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(INT64_MIN),
+		.pre.src = make_singleton_domain(-1),
+		.post.dst = make_singleton_domain(0),
+	}), "(EBPF_ALU64 | BPF_DIV | BPF_X) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_MOD | BPF_K),
+			.imm = -1,
+		},
+		.pre.dst = make_singleton_domain(INT64_MIN),
+		.post.dst = make_singleton_domain(INT64_MIN),
+	}), "(EBPF_ALU64 | BPF_MOD | BPF_K) check");
+
+	TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+		.tested_instruction = {
+			.code = (EBPF_ALU64 | BPF_MOD | BPF_X),
+		},
+		.pre.dst = make_singleton_domain(INT64_MIN),
+		.pre.src = make_singleton_domain(-1),
+		.post.dst = make_singleton_domain(INT64_MIN),
+	}), "(EBPF_ALU64 | BPF_MOD | BPF_X) check");
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_div_mod_overflow_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_div_mod_overflow);
+
 /* 64-bit negation when interval first element is INT64_MIN. */
 static int
 test_alu64_neg_int64min_first(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index 79c8679ac5..b784777bbb 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -932,8 +932,7 @@ eval_mul(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, size_t opsz,
 }
 
 static const char *
-eval_divmod(uint32_t op, struct bpf_reg_val *rd, struct bpf_reg_val *rs,
-	size_t opsz, uint64_t msk)
+eval_divmod(uint32_t op, struct bpf_reg_val *rd, struct bpf_reg_val *rs, uint64_t msk)
 {
 	/* both operands are constants */
 	if (rd->u.min == rd->u.max && rs->u.min == rs->u.max) {
@@ -954,34 +953,17 @@ eval_divmod(uint32_t op, struct bpf_reg_val *rd, struct bpf_reg_val *rs,
 		rd->u.min = 0;
 	}
 
-	/* if we have 32-bit values - extend them to 64-bit */
-	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
-		rd->s.min = (int32_t)rd->s.min;
-		rd->s.max = (int32_t)rd->s.max;
-		rs->s.min = (int32_t)rs->s.min;
-		rs->s.max = (int32_t)rs->s.max;
-	}
-
-	/* both operands are constants */
-	if (rd->s.min == rd->s.max && rs->s.min == rs->s.max) {
-		if (rs->s.max == 0)
-			return "division by 0";
-		if (op == BPF_DIV) {
-			rd->s.min /= rs->s.min;
-			rd->s.max /= rs->s.max;
-		} else {
-			rd->s.min %= rs->s.min;
-			rd->s.max %= rs->s.max;
-		}
-	} else if (op == BPF_MOD) {
-		rd->s.min = RTE_MAX(rd->s.max, 0);
-		rd->s.min = RTE_MIN(rd->s.min, 0);
+	if (rd->u.min >= (uint64_t)INT64_MIN || rd->u.max <= (uint64_t)INT64_MAX) {
+		/*
+		 * All values have the same sign bit, which means range
+		 * contiguous as unsigned is also contiguous as signed,
+		 * so we can just reuse it without any changes.
+		 */
+		rd->s.min = rd->u.min;
+		rd->s.max = rd->u.max;
 	} else
 		eval_smax_bound(rd, msk);
 
-	rd->s.max &= msk;
-	rd->s.min &= msk;
-
 	return NULL;
 }
 
@@ -1165,7 +1147,7 @@ eval_alu(struct bpf_verifier *bvf, const struct ebpf_insn *ins)
 	else if (op == BPF_MUL)
 		eval_mul(rd, &rs, opsz, msk);
 	else if (op == BPF_DIV || op == BPF_MOD)
-		err = eval_divmod(op, rd, &rs, opsz, msk);
+		err = eval_divmod(op, rd, &rs, msk);
 	else if (op == BPF_NEG)
 		eval_neg(rd, opsz, msk);
 	else if (op == EBPF_MOV)
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 11/25] bpf/validate: fix BPF_NEG of INT64_MIN and 0
From: Marat Khalili @ 2026-05-19  9:31 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev, stable, Claudia Cauli
In-Reply-To: <20260519093131.52022-1-marat.khalili@huawei.com>

Function `eval_neg` did not treat values of INT64_MIN and 0 specially
when calculating negation ranges (e.g.  negated unsigned range 0..2
should turn into 0..UINT64_MAX) producing incorrect results. On top of
this negating signed INT64_MIN caused undefined behaviour.

E.g. consider the following program with the current validation code:

    Tested program:
        0:  mov r0, #0x0
        1:  ldxdw r2, [r1 + 0]
        2:  lddw r4, #0x8000000000000000
        4:  jgt r2, r4, L7
        5:  neg r2, #0x0  ; tested instruction
        6:  mov r0, #0x1
        7:  exit
    Pre-state:
       r2:  0..0x8000000000000000
    Post-state:
       r2:  INT64_MIN..INT64_MIN+1 INTERSECT 0..0x8000000000000000 (!)

After the tested instruction validator considers r2 to be within
INT64_MIN..INT64_MIN+1 if viewed as signed, or within
0..0x8000000000000000 if viewed as unsigned, however if 1 was loaded on
step 1 into r2 it is possible for it to become -1 after the tested
instruction which satisfies neither of the ranges.

With sanitizer the following diagnostic is generated:

    lib/bpf/bpf_validate.c:1120:7: runtime error: negation of
    -9223372036854775808 cannot be represented in type 'long int'; cast
    to an unsigned type to negate
        #0 0x000002747230 in eval_neg lib/bpf/bpf_validate.c:1120
        #1 0x000002748fb6 in eval_alu lib/bpf/bpf_validate.c:1251
        #2 0x000002759dd3 in evaluate lib/bpf/bpf_validate.c:3161
        ...

    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
    lib/bpf/bpf_validate.c:1120:7

Add missing handling of special cases, add tests.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: stable@dpdk.org

Reported-by: Claudia Cauli <claudiacauli@gmail.com>
Signed-off-by: Marat Khalili <marat.khalili@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
Depends-on: series-38149 ("bpf: introduce extensible load API")
 app/test/test_bpf_validate.c | 126 +++++++++++++++++++++++++++++++++++
 lib/bpf/bpf_validate.c       |  55 ++++++++++++---
 2 files changed, 173 insertions(+), 8 deletions(-)

diff --git a/app/test/test_bpf_validate.c b/app/test/test_bpf_validate.c
index aa385ec8c2..c752d86357 100644
--- a/app/test/test_bpf_validate.c
+++ b/app/test/test_bpf_validate.c
@@ -1154,6 +1154,132 @@ test_alu64_add_x_scalar_scalar(void)
 REGISTER_FAST_TEST(bpf_validate_alu64_add_x_scalar_scalar_autotest, NOHUGE_OK, ASAN_OK,
 	test_alu64_add_x_scalar_scalar);
 
+/* 64-bit negation when interval first element is INT64_MIN. */
+static int
+test_alu64_neg_int64min_first(void)
+{
+	static const int64_t other_values[] = {
+		INT64_MIN,
+		INT64_MIN + 1,
+		INT64_MIN + 13,
+		-17,
+		-1,
+		0,
+		1,
+		19,
+		INT64_MAX - 23,
+		INT64_MAX - 1,
+		INT64_MAX,
+	};
+	for (int other_index = 0; other_index != RTE_DIM(other_values); ++other_index) {
+		const int64_t other_value = other_values[other_index];
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_NEG),
+			},
+			.pre.dst = make_signed_domain(INT64_MIN, other_value),
+			.post.dst = other_value > 0 ? unknown :
+				make_unsigned_domain(-(uint64_t)other_value, INT64_MIN),
+		}), "other_index=%d", other_index);
+	}
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_neg_int64min_first_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_neg_int64min_first);
+
+/* 64-bit negation when interval last element is INT64_MIN. */
+static int
+test_alu64_neg_int64min_last(void)
+{
+	static const uint64_t other_values[] = {
+		0,
+		1,
+		19,
+		INT64_MAX - 23,
+		INT64_MAX - 1,
+		INT64_MAX,
+		INT64_MIN,
+	};
+	for (int other_index = 0; other_index != RTE_DIM(other_values); ++other_index) {
+		const int64_t other_value = other_values[other_index];
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_NEG),
+			},
+			.pre.dst = make_unsigned_domain(other_value, INT64_MIN),
+			.post.dst = make_signed_domain(INT64_MIN, -(uint64_t)other_value),
+		}), "other_index=%d", other_index);
+	}
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_neg_int64min_last_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_neg_int64min_last);
+
+/* 64-bit negation when interval first element is zero. */
+static int
+test_alu64_neg_zero_first(void)
+{
+	static const uint64_t other_values[] = {
+		0,
+		1,
+		19,
+		INT64_MAX - 23,
+		INT64_MAX - 1,
+		INT64_MAX,
+		INT64_MIN,
+		INT64_MIN + 1,
+		INT64_MIN + 13,
+		-17,
+		-1,
+	};
+	for (int other_index = 0; other_index != RTE_DIM(other_values); ++other_index) {
+		const uint64_t other_value = other_values[other_index];
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_NEG),
+			},
+			.pre.dst = make_unsigned_domain(0, other_value),
+			.post.dst = other_value > (uint64_t)INT64_MIN ? unknown :
+				make_signed_domain(-(uint64_t)other_value, 0),
+		}), "other_index=%d", other_index);
+	}
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_neg_zero_first_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_neg_zero_first);
+
+/* 64-bit negation when interval last element is zero. */
+static int
+test_alu64_neg_zero_last(void)
+{
+	static const int64_t other_values[] = {
+		INT64_MIN,
+		INT64_MIN + 1,
+		INT64_MIN + 13,
+		-17,
+		-1,
+		0,
+	};
+	for (int other_index = 0; other_index != RTE_DIM(other_values); ++other_index) {
+		const int64_t other_value = other_values[other_index];
+		TEST_ASSERT_SUCCESS(verify_instruction((struct verify_instruction_param){
+			.tested_instruction = {
+				.code = (EBPF_ALU64 | BPF_NEG),
+			},
+			.pre.dst = make_signed_domain(other_value, 0),
+			.post.dst = make_unsigned_domain(0, -(uint64_t)other_value),
+		}), "other_index=%d", other_index);
+	}
+
+	return TEST_SUCCESS;
+}
+
+REGISTER_FAST_TEST(bpf_validate_alu64_neg_zero_last_autotest, NOHUGE_OK, ASAN_OK,
+	test_alu64_neg_zero_last);
+
 /* Jump if greater than immediate. */
 static int
 test_jmp64_jeq_k(void)
diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
index b0d88fe7d2..79c8679ac5 100644
--- a/lib/bpf/bpf_validate.c
+++ b/lib/bpf/bpf_validate.c
@@ -990,6 +990,11 @@ eval_neg(struct bpf_reg_val *rd, size_t opsz, uint64_t msk)
 {
 	uint64_t ux, uy;
 	int64_t sx, sy;
+	/* additional limits imposed by signed on unsigned and back */
+	struct bpf_reg_val cross_limits = {
+		.s = { INT64_MIN, INT64_MAX },
+		.u = { 0, UINT64_MAX },
+	};
 
 	/* if we have 32-bit values - extend them to 64-bit */
 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
@@ -997,11 +1002,29 @@ eval_neg(struct bpf_reg_val *rd, size_t opsz, uint64_t msk)
 		rd->u.max = (int32_t)rd->u.max;
 	}
 
-	ux = -(int64_t)rd->u.min & msk;
-	uy = -(int64_t)rd->u.max & msk;
+	if (rd->u.min == 0) {
+		/* special case: ranges that include 0 and, possibly, 1 */
+
+		/*
+		 * Calculate requirements on the signed range of negation.
+		 * It is only possible when negated range does not cross from
+		 * INT64_MIN to INT64_MAX, which means our original range does
+		 * not reach (uint64_t)-INT64_MAX.
+		 */
+		if (rd->u.max < (uint64_t)-INT64_MAX) {
+			cross_limits.s.min = -rd->u.max;
+			cross_limits.s.max = -rd->u.min;
+		}
+
+		if (rd->u.max != 0)
+			rd->u.max = UINT64_MAX;
+	} else {
+		ux = -rd->u.min & msk;
+		uy = -rd->u.max & msk;
 
-	rd->u.max = RTE_MAX(ux, uy);
-	rd->u.min = RTE_MIN(ux, uy);
+		rd->u.max = RTE_MAX(ux, uy);
+		rd->u.min = RTE_MIN(ux, uy);
+	}
 
 	/* if we have 32-bit values - extend them to 64-bit */
 	if (opsz == sizeof(uint32_t) * CHAR_BIT) {
@@ -1009,11 +1032,27 @@ eval_neg(struct bpf_reg_val *rd, size_t opsz, uint64_t msk)
 		rd->s.max = (int32_t)rd->s.max;
 	}
 
-	sx = -rd->s.min & msk;
-	sy = -rd->s.max & msk;
+	if (rd->s.min == INT64_MIN) {
+		/* special case: negation of INT64_MIN is INT64_MIN */
+		if (rd->s.max <= 0) {
+			cross_limits.u.min = -(uint64_t)rd->s.max;
+			cross_limits.u.max = -(uint64_t)rd->s.min;
+		}
+		if (rd->s.max != INT64_MIN)
+			rd->s.max = INT64_MAX;
+	} else {
+		/* since max >= min, neither can be INT64_MIN here */
+		sx = -rd->s.min & msk;
+		sy = -rd->s.max & msk;
+
+		rd->s.max = RTE_MAX(sx, sy);
+		rd->s.min = RTE_MIN(sx, sy);
+	}
 
-	rd->s.max = RTE_MAX(sx, sy);
-	rd->s.min = RTE_MIN(sx, sy);
+	rd->s.min = RTE_MAX(rd->s.min, cross_limits.s.min) & msk;
+	rd->s.max = RTE_MIN(rd->s.max, cross_limits.s.max) & msk;
+	rd->u.min = RTE_MAX(rd->u.min, cross_limits.u.min) & msk;
+	rd->u.max = RTE_MIN(rd->u.max, cross_limits.u.max) & msk;
 }
 
 static const char *
-- 
2.43.0


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox