This commit is contained in:
Oliver Kennedy 2019-10-24 01:06:06 -04:00
parent dcaa1e3c55
commit ff5667d7aa
Signed by: okennedy
GPG key ID: 3E5F9B3ABD3FDB60
9 changed files with 5993 additions and 2 deletions

View file

@ -104,8 +104,8 @@ After the taking the course, students should be able to:
* **Oct 10** - Skyserver (continued)
* **Oct 15** - NoDB / RAW ([paper 1](https://dl-acm-org.gate.lib.buffalo.edu/citation.cfm?id=2213864) | [paper 2](http://www.vldb.org/pvldb/vol7/p1119-karpathiotakis.pdf))
* **Oct 17** - Group Presentations
* **Oct 22** - Legorithmics ([paper](https://infoscience.epfl.ch/record/186017/files/main-final.pdf))
* **Oct 24** - Streaming ([paper](https://www.cs.cornell.edu/johannes/papers/2007/2007-CIDR-Cayuga.pdf))
* **Oct 22** - Legorithmics ([paper](https://infoscience.epfl.ch/record/186017/files/main-final.pdf) | [slides](slides/2019-10-22-Legorithmics.html))
* **Oct 24** - Streaming ([paper](https://www.cs.cornell.edu/johannes/papers/2007/2007-CIDR-Cayuga.pdf) | [slides](slides/2019-10-24-Cayuga.html))
* **Oct 29** - Scan Sharing ([paper](https://dl-acm-org.gate.lib.buffalo.edu/citation.cfm?id=1687707))
* **Oct 31** - Group Presentations
* **Nov 4** - Differential Dataflow ([paper](http://cidrdb.org/cidr2013/Papers/CIDR13_Paper111.pdf))

View file

@ -3,3 +3,795 @@ template: templates/cse662_2019_slides.erb
title: Cayuga
date: October 24
---
<section>
<section>
<h3>Non-Standard Database Workloads</h3>
<dl>
<dt>Stock Markets</dt>
<dd>Alert me when a stock reverses a downward trend.</dd>
<dt>Manufacturing IoT</dt>
<dd>Alert me when two adjacent process steps both signal non-critical errors.</dd>
<dt>Cloud Computing</dt>
<dd>Alert me when the number of errors is more than twice as high as the 2-week average.</dd>
</dl>
</section>
<section>
<table>
<tr>
<td><img src="graphics/DB.png" height="200px" style="vertical-align: middle"/></td>
</tr>
<tr>
<td>Classical DB</td>
</tr>
</table>
</section>
<section>
<table>
<tr>
<th>These Problems</th>
<th>Classical DB</th>
</tr>
<tr class="fragment">
<td>Expressive Queries</td>
<td>Expressive Queries</td>
<td class="fragment" style="color: green">✔</td>
</tr>
<tr class="fragment">
<td>Changing Data</td>
<td>Static Data</td>
<td class="fragment" style="color: red">🗶</td>
</tr>
<tr class="fragment">
<td>Static Queries</td>
<td>Ad-Hoc Queries</td>
<td class="fragment" style="color: blue">✔</td>
</tr>
<tr class="fragment">
<td>Latency: Msec</td>
<td>Latency: Sec/Min</td>
<td class="fragment" style="color: red">🗶</td>
</tr>
</table>
</section>
<section>
<table>
<tr>
<td><img src="graphics/DB.png" height="200px" style="vertical-align: middle"/>
<div style="position: relative; top: -200px; font-size: 100pt; height: 0px; color: red">🗶</div>
</td>
<td class="fragment" data-fragment-index=1><img src="graphics/2019-10-24-PubSub.svg" height="160px" style="vertical-align: middle;"/></td>
</tr>
<tr>
<td style="text-decoration: line-through;">Classical DB</td>
<td class="fragment" data-fragment-index=1>Publish/Subscribe</td>
</tr>
</table>
</section>
<section>
<table>
<tr>
<th>These Problems</th>
<th>Pub/Sub</th>
</tr>
<tr class="fragment">
<td>Expressive Queries</td>
<td>Filter Queries</td>
<td class="fragment" style="color: red">🗶</td>
</tr>
<tr class="fragment">
<td>Changing Data</td>
<td>Changing Data</td>
<td class="fragment" style="color: green">✔</td>
</tr>
<tr class="fragment">
<td>Static Queries</td>
<td>Static Queries</td>
<td class="fragment" style="color: green">✔</td>
</tr>
<tr class="fragment">
<td>Latency: Msec</td>
<td>Latency: Msec</td>
<td class="fragment" style="color: green">✔</td>
</tr>
</table>
</section>
<section>
<h3>Trivial</h3>
<p>↕</p>
<h3>Expressive</h3>
</section>
<section>
<h3>Trivial</h3>
<p>↕</p>
<h3>Performant Expressiveness</h3>
<p>↕</p>
<h3>Expressive</h3>
</section>
<section>
<h3>Cayuga</h3>
<dl>
<div class="fragment">
<dt>Language</dt>
<dd>Maximize Expressiveness w/o Compromising Performance</dd>
</div>
<div class="fragment">
<dt>Compiler</dt>
<dd>Emit a tight, optimized program representation</dd>
</div>
<div class="fragment">
<dt>Runtime</dt>
<dd>Necessary support for concurrent, asynchronous execution</dd>
</div>
</dl>
</section>
<!--
- Stream Processing
- Applications
- Stock Markets
- Internet of Things
- Intrusion Detection
- Central Idea
- Classical Queries: Queries Change, Data Fixed
- View Maintenance: Data Changes, Queries Fixed, Slow
Response
- Here: Data Changes, Queries Fixed, Fast Response
- Language Models
- Classical SQL w/ Windows
- Stream-specific query langs
- Challenges & Advantages
- Limited Compute Time: Want to deal with large numbers of
records as they come in quickly.
- All compute requirements (structurally, at least) are
given upfront.
- Typically specialized for bounded data sizes
-->
</section>
<section>
<section>
<h3>Language</h3>
<p>Start with something familiar</p>
</section>
<section>
<dl>
<dt class="fragment">Projection, Selection, Union</dt>
<dd class="fragment">Single-pass operators: Easy to do efficiently</dd>
<dt class="fragment">Join</dt>
<dd class="fragment">Multi-pass operator: Will need to revisit</dd>
<dt class="fragment">Aggregate</dt>
<dd class="fragment">Single-pass operator: Probably ok</dd>
<dd class="fragment">Blocking operator: Not ok</dd>
</dl>
</section>
<section>
<h3>Projection</h3>
<pre><code class="sql">
SELECT A, B, C, ...
FROM [Query]
</code></pre>
<p>Emit tuples emitted by [Query] with only columns A, B, C</p>
</section>
<section>
<h3>Selection</h3>
<pre><code class="sql">
FILTER { [Condition] } [Query]
</code></pre>
<p>Emit only tuples emitted by [Query] that pass [Condition]</p>
</section>
<section>
<h3>Union</h3>
<pre><code class="sql">
[Query1] UNION [Query2]
</code></pre>
<p>Emit any tuples emitted by either [Query1] or [Query2]</p>
</section>
</section>
<section>
<section>
<h3>Join</h3>
<ol>
<li class="fragment">$O(N^2)$ complexity doesn't work when $N = \infty$</li>
<li class="fragment">Storage requirements grow infinitely</li>
<li class="fragment">Work per tuple grows with every insertion</li>
</ol>
<p class="fragment">How to fix?</p>
</section>
<section>
<dl>
<div class="fragment">
<dt>RHS tuple has to arrive <b>after</b> LHS tuple</dt>
<dd>Storage requirement only scales in LHS complexity</dd>
</div>
<div class="fragment">
<dt>Each LHS tuple joins at most <b>one</b> RHS tuple</dt>
<dd>$O(N^2) \rightarrow O(N)$</dd>
<dd>Better chance of work staying constant</dd>
</div>
</dl>
</section>
<section>
<h3>Join (Next)</h3>
<pre><code class="sql">
[Query1] NEXT { [Condition] } [Query2]
</code></pre>
<ol>
<li class="fragment">For each tuple emitted by [Query1],</li>
<li class="fragment">wait until [Query2] emits a tuple that passes [Condition]</li>
<li class="fragment">and emit the cartesian product of the tuples</li>
</ol>
</section>
</section>
<section>
<section>
<h3>Aggregate</h3>
<p class="fragment">
Blocking operators are not ok. Need semantics that allow tuples to be emitted sooner.
</p>
</section>
<section>
<h3>Group-by...ish Aggregates</h3>
<ul>
<li>When do you create a new group?</li>
<li>Which tuples go into the group?</li>
<li>When does the group get emitted?</li>
</ul>
</section>
<section>
<h3>Aggregate (Fold)</h3>
<pre><code class="sql">
[Query1] FOLD { [Condition1], [Condition2], [Agg] } [Query2]
</code></pre>
<ol>
<li class="fragment">For each tuple emitted by [Query1]</li>
<li class="fragment">Wait until [Query2] emits a tuple that passes [Condition1]</li>
<li class="fragment">Update [Agg]</li>
<li class="fragment">Emit the cartesian product of the [Query1] tuple, the first [Query2] tuple, and the [Agg] value</li>
<li class="fragment">If the [Query2] tuple ALSO passes [Condition2] repeat from 2</li>
</ol>
</section>
<section>
<p>Analogous to...</p>
<pre><code class="sql">
[Query1] NEXT { [Condition1] } [Query2]
NEXT { [Condition1] } [Query2]
NEXT { [Condition1] } [Query2]
NEXT { [Condition1] } [Query2]
... until [Condition2] is failed
</code></pre>
</section>
</section>
<section>
<section>
<h3>Cayuga</h3>
<dl>
<div style="text-decoration: line-through;">
<dt>Language</dt>
<dd>Maximize Expressiveness w/o Compromising Performance</dd>
</div>
<div>
<dt>Compiler</dt>
<dd>Emit a tight, optimized program representation</dd>
</div>
<div>
<dt>Runtime</dt>
<dd>Necessary support for concurrent, asynchronous execution</dd>
</div>
</dl>
</section>
<section>
<h3>Deterministic Finite Automata</h3>
<p>Model a program by a directed graph</p>
<ul>
<li>Each node is a <b>state</b></li>
<li>Each edge is a <b>transition</b> with a rule</li>
<li>One node is a <b>start</b> state</li>
<li>One node is an <b>end</b> state</li>
</ul>
</section>
<section>
<h3>Deterministic Finite Automata</h3>
<p>The program accepts an <b>input</b>: A string.</p>
<ol>
<li class="fragment">Start at the start state.</li>
<li class="fragment">Find the transition edge corresponding to the next character and follow it.</li>
<li class="fragment">Repeat from 2 until the end state of end of string</li>
<li class="fragment">Accept the string if the final state is the end state</li>
</ol>
</section>
<section>
<img src="graphics/2019-10-24-DFAExample.svg" />
<p class="fragment">/Hi+!/ ↣
<span style="color: green" class="fragment">"Hi!"</span>
<span style="color: green" class="fragment">"OHiiiiii!"</span>
<span style="color: red" class="fragment">"Ha!"</span></p>
</section>
<section>
<h3>Deterministic Finite Automata</h3>
<ul>
<li>Simple</li>
<li>Easy to implement efficiently</li>
<li>Expressive (Regular Expressions)</li>
</ul>
<p class="fragment">... but what if we don't know which edge to take?</p>
</section>
<section>
<h3>Nondeterministic Finite Automata</h3>
<p>The program state is a <b>set</b> of active states</p>
<ol style="font-size: 80%">
<li class="fragment">Start in state $\{\texttt{start}\}$</li>
<li class="fragment">Initialize the next state to $\{\}$</li>
<li class="fragment">For each active state, follow <b>each</b> transition edge with a matching letter and add the destination to the active states <b>in the next step</b></li>
<li class="fragment">Replace the current state with the next state.</li>
<li class="fragment">Repeat from 2 until the end state is active or there are no active states</li>
<li class="fragment">Accept the string if the end state is active</li>
</ol>
</section>
<section>
<img src="graphics/2019-10-24-NDFAExample.svg" />
<p class="fragment">/Ha?i!+/ ↣
<span style="color: green" class="fragment">"Hi!"</span>
<span style="color: green" class="fragment">"OHai!"</span>
<span style="color: red" class="fragment">"HaHai!"</span>
<span style="color: green" class="fragment">"HiHaH!"</span>
</p>
</section>
<section>
<img src="graphics/2019-10-24-NDFAExample.svg" height="200px"/>
<table style="font-size: 70%">
<tr>
<th>Letter</th>
<th>Start</th>
<th>$S_1$</th>
<th>$S_2$</th>
<th>$S_3$</th>
<th>End</th>
</tr>
<tr class="fragment">
<td></td>
<td>✓</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="fragment">
<td>H</td>
<td>✓</td>
<td>✓</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="fragment">
<td>i</td>
<td>✓</td>
<td></td>
<td>✓</td>
<td></td>
<td></td>
</tr>
<tr class="fragment">
<td>H</td>
<td>✓</td>
<td>✓</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="fragment">
<td>a</td>
<td>✓</td>
<td></td>
<td></td>
<td>✓</td>
<td></td>
</tr>
<tr class="fragment">
<td>H</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
</tr>
<tr class="fragment">
<td>!</td>
<td>✓</td>
<td></td>
<td></td>
<td></td>
<td>✓</td>
</tr>
</table>
</section>
<section>
<h3>Nondeterministic Finite Automata</h3>
<ul>
<li>Nearly as simple</li>
<li>Almost as easy to implement efficiently</li>
<li>Expressive (Full Regular Expressions)</li>
</ul>
<p>NDFAs can be compiled down to DFAs</p>
</section>
</section>
<section>
<section>
<h3>Cayuga</h3>
<dl>
<div style="text-decoration: line-through;">
<dt>Language</dt>
<dd>Maximize Expressiveness w/o Compromising Performance</dd>
</div>
<div>
<dt>Compiler</dt>
<dd>Emit a tight, optimized program representation</dd>
</div>
<div>
<dt>Runtime</dt>
<dd>Necessary support for concurrent, asynchronous execution</dd>
</div>
</dl>
</section>
<section>
<h3>Cayuga Autometa</h3>
<p>Each node of the NDFA is a relation.</p>
<p>Each transition of the NDFA is a join condition + projection</p>
</section>
<section>
<h3>Example</h3>
<ol>
<li class="fragment">Look for high-volume (10,000 or more) trades</li>
<li class="fragment">When one happens, check if it's followed by a 10 minute sequence of trades with dropping prices</li>
<li class="fragment">Wait for the stock to rally (5% higher than its lowest point) and alert me</li>
</ol>
</section>
<section>
<pre><code class="sql">
SELECT Name, MaxPrice, MinPrice, Price as FinalPrice
-- Only consider aggregates spanning 10 minutes or more
FROM FILTER { dur ≥ 10 min } (
(
-- Trigger aggregate when a Stock w/ Volume > 10000 sells
SELECT Name, Price_1 AS MaxPrice, Price as MinPrice
FROM Filter { Volume > 10000 } Stock
) FOLD {
$2.Name = $.Name, -- Grouping Condition
$2.Price < $.Price -- Continue Condition
} Stock -- Fold over any stock
) NEXT {
-- Find the next upturn after a 10 minute descending run
$2.Name = $1.Name AND $2.Price > 1.05 * $1.MinPrice
} Stock
</code></pre>
</section>
<section>
<svg data-src="graphics/2019-10-24-CayugaUnannotated.svg" />
<ul>
<li class="fragment" data-fragment-index=0><b>A</b>: Sequences started by a 10k trade</li>
<li class="fragment" data-fragment-index=1><b>B</b>: &gt;10 min runs</li>
</ul>
</section>
<section>
<pre><code class="sql">
CREATE TABLE A(
Name_l STRING, -- From LHS
MaxPrice DECIMAL, -- From LHS
MinPrice DECIMAL, -- From LHS
Name_r STRING, -- From RHS
Price Decimal, -- From RHS
Start Int, -- From LHS
End Int -- From RHS
)
</code></pre>
<pre><code class="sql">
CREATE TABLE B(
Name STRING,
MaxPrice DECIMAL,
MinPrice DECIMAL,
Price Decimal,
Start Int,
End Int
)
</code></pre>
</section>
<section>
<svg data-src="graphics/2019-10-24-CayugaExample.svg" />
<ul>
<li><b>A</b>: Sequences started by a 10k trade</li>
<li><b>B</b>: &gt;10 min runs</li>
</ul>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>90</td>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
<tr><td>IBM</td><td>85</td><td>7,000</td><td>9:15</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>85</td>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
<tr><td>IBM</td><td>85</td><td>7,000</td><td>9:15</td></tr>
<tr><td>Dell</td><td>40</td><td>11,000</td><td>9:17</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>85</td>
</tr>
<tr>
<td>Dell</td><td>40</td><td>Dell</td><td>40</td>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
<tr><td>IBM</td><td>85</td><td>7,000</td><td>9:15</td></tr>
<tr><td>Dell</td><td>40</td><td>11,000</td><td>9:17</td></tr>
<tr><td>IBM</td><td>81</td><td>8,000</td><td>9:21</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>81</td>
<td>IBM</td><td>90</td><td>81</td>
</tr>
<tr>
<td>Dell</td><td>40</td><td>Dell</td><td>40</td>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
<tr><td>IBM</td><td>85</td><td>7,000</td><td>9:15</td></tr>
<tr><td>Dell</td><td>40</td><td>11,000</td><td>9:17</td></tr>
<tr><td>IBM</td><td>81</td><td>8,000</td><td>9:21</td></tr>
<tr><td>MSFT</td><td>25</td><td>6,000</td><td>9:23</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>81</td>
<td>IBM</td><td>90</td><td>81</td>
</tr>
<tr>
<td>Dell</td><td>40</td><td>Dell</td><td>40</td>
</tr>
</table>
</section>
<section>
<table style="float:left; font-size: 40%">
<tr><th>Name</th><th>Price</th><th>Valuation</th><th>Time</th></tr>
<tr><td>IBM</td><td>90</td><td>15,000</td><td>9:10</td></tr>
<tr><td>IBM</td><td>85</td><td>7,000</td><td>9:15</td></tr>
<tr><td>Dell</td><td>40</td><td>11,000</td><td>9:17</td></tr>
<tr><td>IBM</td><td>81</td><td>8,000</td><td>9:21</td></tr>
<tr><td>MSFT</td><td>25</td><td>6,000</td><td>9:23</td></tr>
<tr><td>IBM</td><td>91</td><td>9,000</td><td>9:24</td></tr>
</table>
<table style="font-size: 60%">
<tr><td colspan=4 style="background: lightgrey;">State A</td><td colspan=3 style="background: grey;">State B</td><td>Emitted</td></tr>
<tr>
<th>Name_l</th><th>MinPrice</th><th>Name_r</th><th>Price</th>
<th>Name</th><th>MinPrice</th><th>Price</th>
<th>&nbsp</th>
</tr>
<tr>
<td>IBM</td><td>90</td><td>IBM</td><td>81</td>
<td colspan=3></td>
<td>IBM!</td>
</tr>
<tr>
<td>Dell</td><td>40</td><td>Dell</td><td>40</td>
</tr>
</table>
</section>
</section>
<section>
<section>
<h3>Cayuga</h3>
<dl>
<div style="text-decoration: line-through;">
<dt>Language</dt>
<dd>Maximize Expressiveness w/o Compromising Performance</dd>
</div>
<div style="text-decoration: line-through;">
<dt>Compiler</dt>
<dd>Emit a tight, optimized program representation</dd>
</div>
<div>
<dt>Runtime</dt>
<dd>Necessary support for concurrent, asynchronous execution</dd>
</div>
</dl>
</section>
<section>
<h3>Challenges</h3>
<dl>
<dt>Asynchronous Arrival</dt>
<dd>Updates may arrive out of order</dd>
<dt>Threading</dt>
<dd>Make sure each thread sees a concurrent view of the state</dd>
<dt>Shallow Copies</dt>
<dd>Need to keep track of which threads are using which state</dd>
<dt>Relational State</dt>
<dd>Lots of work for each event!</dd>
<dt>String Comparisons</dt>
<dd>Expensive!</dd>
</dl>
</section>
<section>
<h3>Asynchronous Arrival</h3>
<p><b>Simple Solution: </b>Add a delay to event processing to buffer for out-of-order arrival.</p>
</section>
<section>
<h3>Threading</h3>
<p><b>Mostly Simple Solution: </b>Parallel processing of one event to create a new state, swap in the new state, repeat.</p>
</section>
<section>
<h3>Shallow Copies</h3>
<p><b>Not so Simple Solution: </b>Add an epoch-based garbage collector to detect when an object falls out of scope.</p>
<p class="fragment">(Reference counting creates points of contention on every refcount update)</p>
</section>
<section>
<h3>Relational State</h3>
<p><b>Simple Solution: </b> Index the states to make it easier to discover which states a new event interacts with.</p>
</section>
<section>
<h3>String Comparison</h3>
<p><b>Simple Solution: </b> Build a dictionary of strings (can be done asynchronously while the event is waiting to be processed).</p>
</section>
</section>

View file

@ -0,0 +1,474 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="217.77841mm"
height="117.04876mm"
viewBox="0 0 217.77841 117.04874"
version="1.1"
id="svg898"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="2019-10-24-CayugaExample.svg">
<defs
id="defs892">
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1428"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1426"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1422"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1420" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1264"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1262"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1246"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1244"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1240"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1238"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1234"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1232"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1226"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1224"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1222"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1194"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path1192"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1182"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1180"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path919"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path925"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path913"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="94.353348"
inkscape:cy="158.82168"
inkscape:document-units="mm"
inkscape:current-layer="g1468"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata895">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(45.156824,3.1281176)">
<circle
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path902"
cx="25.551773"
cy="59.798286"
r="9.3544331" />
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle906"
cx="102.09696"
cy="59.798286"
r="9.3544331" />
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1234)"
d="M 35.814117,59.66465 H 90.87164"
id="path908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1178"
d="m 111.45139,59.66465 h 39.82316"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1182)" />
<circle
r="9.3544331"
cy="59.798286"
cx="25.367809"
id="circle1206"
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1208"
d="M -25.680688,59.66465 H 14.14247"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1212"
d="M 31.247721,52.181103 C 45.771869,26.493635 2.9493866,27.062848 18.418785,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1194)" />
<circle
r="9.3544331"
cy="59.798286"
cx="162.76715"
id="circle1204-6"
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<circle
style="fill:#dde9af;stroke:#677821;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1297"
cx="-35.302391"
cy="59.798286"
r="9.3544331" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="158.46623"
y="63.581081"
id="text1320"><tspan
sodipodi:role="line"
id="tspan1318"
x="158.46623"
y="63.581081"
style="fill:#008000;stroke-width:0.26458332">✓</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-42.092018"
y="61.710194"
id="text1324"><tspan
sodipodi:role="line"
id="tspan1322"
x="-42.092018"
y="61.710194"
style="font-size:5.64444447px;stroke-width:0.26458332">Start</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="21.769283"
y="63.046539"
id="text1328"><tspan
sodipodi:role="line"
id="tspan1326"
x="21.769283"
y="63.046539"
style="stroke-width:0.26458332">A</tspan></text>
<text
id="text1336"
y="63.046539"
x="98.314468"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="63.046539"
x="98.314468"
id="tspan1334"
sodipodi:role="line">B</tspan></text>
<path
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1422)"
d="M 108.59471,52.181103 C 123.11886,26.493635 80.296378,27.062848 95.765777,51.112025"
id="path1418"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1424"
d="M 31.782257,67.560954 C 46.306407,93.248422 3.4839256,92.679209 18.953324,68.630032"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1428)" />
<g
id="g1468">
<text
transform="rotate(43.971758)"
id="text1432"
y="44.691925"
x="35.504986"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="1"><tspan
style="font-size:5.64444447px;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="44.691925"
x="35.504986"
id="tspan1430"
sodipodi:role="line">e.volume &gt;10,000</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="87.266563"
y="-12.67179"
id="text1436"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="4"><tspan
sodipodi:role="line"
x="87.266563"
y="-12.67179"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
id="tspan5886">e.Name = A.Name AND</tspan><tspan
sodipodi:role="line"
x="87.266563"
y="-5.2634573"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
id="tspan5876">e.END - A.START ≥ 10 min</tspan></text>
<text
transform="rotate(43.971758)"
id="text1442"
y="-62.371143"
x="138.39761"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="6"><tspan
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="-62.371143"
x="138.39761"
id="tspan1440"
sodipodi:role="line">e.Name = B.Name AND</tspan><tspan
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="-54.962811"
x="138.39761"
sodipodi:role="line"
id="tspan5884">e.price &gt; 1.05 * B.MinPrice</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="90.133484"
y="-37.719891"
id="text1446"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="5"><tspan
sodipodi:role="line"
id="tspan1444"
x="90.133484"
y="-37.719891"
style="font-size:5.64444447px;text-align:end;text-anchor:end;stroke-width:0.26458332">e.Name ≠ B.Name</tspan></text>
<text
transform="rotate(43.971758)"
id="text1450"
y="17.390469"
x="33.008698"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="2"><tspan
style="font-size:5.64444447px;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="17.390469"
x="33.008698"
id="tspan1448"
sodipodi:role="line">e.Name ≠ A.Name</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="40.620228"
y="55.70665"
id="text1454"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="3"><tspan
sodipodi:role="line"
id="tspan1452"
x="40.620228"
y="55.70665"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:start;text-anchor:start;stroke-width:0.26458332">e.name = A.Name AND</tspan><tspan
sodipodi:role="line"
x="40.620228"
y="63.114983"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:start;text-anchor:start;stroke-width:0.26458332"
id="tspan5888">e.Price &lt; A.Price</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,372 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="201.90341mm"
height="110.91811mm"
viewBox="0 0 201.90341 110.9181"
version="1.1"
id="svg898"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="2019-10-24-CayugaUnannotated.svg">
<defs
id="defs892">
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1428"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1426"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1422"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1420" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1264"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1262"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1246"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1244"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1240"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1238"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1234"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1232"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1226"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1224"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1222"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1194"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path1192"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1182"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1180"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path919"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path925"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path913"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="444.47528"
inkscape:cy="139.69135"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata895">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(29.281824,3.1281176)">
<circle
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path902"
cx="41.426773"
cy="59.798286"
r="9.3544331" />
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle906"
cx="102.09696"
cy="59.798286"
r="9.3544331" />
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1234)"
d="M 51.04848,59.66465 H 90.87164"
id="path908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1178"
d="m 111.45139,59.66465 h 39.82316"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1182)" />
<circle
r="9.3544331"
cy="59.798286"
cx="41.242809"
id="circle1206"
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1208"
d="M -9.8056873,59.66465 H 30.017471"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1212"
d="M 47.122722,52.181103 C 61.64687,26.493635 18.824387,27.062848 34.293786,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1194)" />
<circle
r="9.3544331"
cy="59.798286"
cx="162.76715"
id="circle1204-6"
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<circle
style="fill:#dde9af;stroke:#677821;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1297"
cx="-19.427391"
cy="59.798286"
r="9.3544331" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="158.46623"
y="63.581081"
id="text1320"><tspan
sodipodi:role="line"
id="tspan1318"
x="158.46623"
y="63.581081"
style="fill:#008000;stroke-width:0.26458332">✓</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-26.217016"
y="61.710194"
id="text1324"><tspan
sodipodi:role="line"
id="tspan1322"
x="-26.217016"
y="61.710194"
style="font-size:5.64444447px;stroke-width:0.26458332">Start</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="37.644283"
y="63.046539"
id="text1328"><tspan
sodipodi:role="line"
id="tspan1326"
x="37.644283"
y="63.046539"
style="stroke-width:0.26458332">A</tspan></text>
<text
id="text1336"
y="63.046539"
x="98.314468"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="63.046539"
x="98.314468"
id="tspan1334"
sodipodi:role="line">B</tspan></text>
<path
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1422)"
d="M 108.59471,52.181103 C 123.11886,26.493635 80.296378,27.062848 95.765777,51.112025"
id="path1418"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1424"
d="M 47.657258,67.560954 C 62.181408,93.248422 19.358926,92.679209 34.828325,68.630032"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1428)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,464 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="239.37715mm"
height="109.66983mm"
viewBox="0 0 239.37715 109.6698"
version="1.1"
id="svg898"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="2019-10-24-CayugaUpdates.svg">
<defs
id="defs892">
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1428"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1426"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1422"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1420" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1264"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1262"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1246"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1244"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1240"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1238"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1234"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1232"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1226"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1224"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1222"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1194"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path1192"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1182"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1180"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path919"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path925"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path913"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="379.02707"
inkscape:cy="121.0703"
inkscape:document-units="mm"
inkscape:current-layer="g1468"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata895">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(66.755571,6.8066401)">
<circle
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path902"
cx="25.551773"
cy="59.798286"
r="9.3544331" />
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle906"
cx="102.09696"
cy="59.798286"
r="9.3544331" />
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1234)"
d="M 35.814117,59.66465 H 90.87164"
id="path908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1178"
d="m 111.45139,59.66465 h 39.82316"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1182)" />
<circle
r="9.3544331"
cy="59.798286"
cx="25.367809"
id="circle1206"
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1208"
d="M -25.680688,59.66465 H 14.14247"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1212"
d="M 31.247721,52.181103 C 45.771869,26.493635 2.9493866,27.062848 18.418785,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1194)" />
<circle
r="9.3544331"
cy="59.798286"
cx="162.76715"
id="circle1204-6"
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<circle
style="fill:#dde9af;stroke:#677821;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1297"
cx="-35.302391"
cy="59.798286"
r="9.3544331" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="158.46623"
y="63.581081"
id="text1320"><tspan
sodipodi:role="line"
id="tspan1318"
x="158.46623"
y="63.581081"
style="fill:#008000;stroke-width:0.26458332">✓</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-42.092018"
y="61.710194"
id="text1324"><tspan
sodipodi:role="line"
id="tspan1322"
x="-42.092018"
y="61.710194"
style="font-size:5.64444447px;stroke-width:0.26458332">Start</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="21.769283"
y="63.046539"
id="text1328"><tspan
sodipodi:role="line"
id="tspan1326"
x="21.769283"
y="63.046539"
style="stroke-width:0.26458332">A</tspan></text>
<text
id="text1336"
y="63.046539"
x="98.314468"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="63.046539"
x="98.314468"
id="tspan1334"
sodipodi:role="line">B</tspan></text>
<path
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1422)"
d="M 108.59471,52.181103 C 123.11886,26.493635 80.296378,27.062848 95.765777,51.112025"
id="path1418"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1424"
d="M 31.782257,67.560954 C 46.306407,93.248422 3.4839256,92.679209 18.953324,68.630032"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1428)" />
<g
id="g1468">
<text
transform="rotate(43.971758)"
id="text1432"
y="41.772774"
x="30.831915"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="1"><tspan
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="41.772774"
x="30.831913"
sodipodi:role="line"
id="tspan6192">MinPrice, MaxPrice ← e.Price</tspan><tspan
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="49.181107"
x="30.831919"
sodipodi:role="line"
id="tspan6205">Name_l, Name_r ← e.Name</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="88.848488"
y="-6.0277491"
id="text1436"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="4"><tspan
sodipodi:role="line"
x="88.848488"
y="-6.0277491"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
id="tspan5876">Name ← Name_l</tspan></text>
<text
transform="rotate(43.971758)"
id="text1442"
y="-59.101208"
x="141.55225"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="6"><tspan
style="font-size:5.64444447px;line-height:0.69999999em;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="-59.101208"
x="141.55225"
sodipodi:role="line"
id="tspan5884">No Change</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="90.133484"
y="-37.719891"
id="text1446"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="5"><tspan
sodipodi:role="line"
id="tspan1444"
x="90.133484"
y="-37.719891"
style="font-size:5.64444447px;text-align:end;text-anchor:end;stroke-width:0.26458332">No Change</tspan></text>
<text
transform="rotate(43.971758)"
id="text1450"
y="17.390469"
x="33.008698"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"
class="fragment"
data-fragment-index="2"><tspan
style="font-size:5.64444447px;text-align:end;text-anchor:end;stroke-width:0.26458332"
y="17.390469"
x="33.008698"
id="tspan1448"
sodipodi:role="line">No Change</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.69999999em;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="50.658726"
y="54.563694"
id="text1454"
transform="rotate(43.971758)"
class="fragment"
data-fragment-index="3"><tspan
sodipodi:role="line"
x="50.658726"
y="54.563694"
style="font-size:5.64444447px;line-height:0.69999999em;text-align:start;text-anchor:start;stroke-width:0.26458332"
id="tspan5888">Price ← e.Price</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,480 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="205.52034mm"
height="114.26322mm"
viewBox="0 0 205.52034 114.26322"
version="1.1"
id="svg898"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="2019-10-24-DFAExample.svg">
<defs
id="defs892">
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1264"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1262"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1246"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1244"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1240"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1238"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1234"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1232"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1226"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1224"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1222"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1194"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path1192"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1188"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1186"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1182"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1180"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path919"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path925"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path913"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="437.94251"
inkscape:cy="62.506133"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata895">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(32.898754,-21.747905)">
<circle
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path902"
cx="41.426773"
cy="59.798286"
r="9.3544331" />
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle906"
cx="102.09696"
cy="59.798286"
r="9.3544331" />
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1234)"
d="M 51.04848,59.66465 H 90.87164"
id="path908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1178"
d="m 111.45139,59.66465 h 39.82316"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1182)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1184"
d="M 107.97689,52.181103 C 122.50104,26.493635 79.678554,27.062848 95.147953,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1188)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="65.213768"
y="55.922878"
id="text1198"><tspan
sodipodi:role="line"
id="tspan1196"
x="65.213768"
y="55.922878"
style="stroke-width:0.26458332">i</tspan></text>
<circle
r="9.3544331"
cy="59.798286"
cx="41.242809"
id="circle1206"
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1208"
d="M -9.8056873,59.66465 H 30.017471"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1212"
d="M -13.012922,52.181103 C 1.5112262,26.493635 -41.311257,27.062848 -25.841858,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1194)" />
<text
id="text1216"
y="55.922878"
x="4.3595953"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="55.922878"
x="4.3595953"
id="tspan1214"
sodipodi:role="line">H</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-33.859936"
y="29.463196"
id="text1220"><tspan
sodipodi:role="line"
id="tspan1218"
x="-33.859936"
y="29.463196"
style="stroke-width:0.26458332">not H</tspan></text>
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1230"
cx="102.09696"
cy="97.060234"
r="9.3544331" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1236"
d="M 49.177593,65.811849 91.13891,92.806071"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1240)" />
<path
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1246)"
d="m 107.97689,104.5207 c 14.52415,25.68756 -28.298336,25.11834 -12.828937,1.06909"
id="path1242"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<text
id="text1250"
y="88.262497"
x="44.366745"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="88.262497"
x="44.366745"
id="tspan1248"
sodipodi:role="line">not i</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="80.448135"
y="133.80971"
id="text1254"><tspan
sodipodi:role="line"
id="tspan1252"
x="80.448135"
y="133.80971"
style="stroke-width:0.26458332">anything</tspan></text>
<text
id="text1258"
y="29.463198"
x="100.49335"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="29.463198"
x="100.49335"
id="tspan1256"
sodipodi:role="line">i</tspan></text>
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1264)"
d="M 101.96332,69.687257 V 85.990702"
id="path1260"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="105.03693"
y="80.778954"
id="text1268"><tspan
sodipodi:role="line"
id="tspan1266"
x="105.03693"
y="80.778954"
style="stroke-width:0.26458332">not i or !</tspan></text>
<text
id="text1280"
y="55.922878"
x="130.09344"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="55.922878"
x="130.09344"
id="tspan1278"
sodipodi:role="line">!</tspan></text>
<circle
r="9.3544331"
cy="59.798286"
cx="162.76715"
id="circle1204-6"
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<circle
style="fill:#dde9af;stroke:#677821;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1297"
cx="-19.427391"
cy="59.798286"
r="9.3544331" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
x="158.46623"
y="63.581081"
id="text1320"><tspan
sodipodi:role="line"
id="tspan1318"
x="158.46623"
y="63.581081"
style="stroke-width:0.26458332;fill:#008000;">✓</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-26.217016"
y="61.710194"
id="text1324"><tspan
sodipodi:role="line"
id="tspan1322"
x="-26.217016"
y="61.710194"
style="font-size:5.64444447px;stroke-width:0.26458332">Start</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="36.056782"
y="63.046539"
id="text1328"><tspan
sodipodi:role="line"
id="tspan1326"
x="36.056782"
y="63.046539"
style="stroke-width:0.26458332">S<tspan
style="font-size:64.99999762%;baseline-shift:sub"
id="tspan1330">1</tspan></tspan></text>
<text
id="text1336"
y="63.046539"
x="96.726967"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="63.046539"
x="96.726967"
id="tspan1334"
sodipodi:role="line">S<tspan
style="font-size:65%;baseline-shift:sub"
id="tspan1344">2</tspan></tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="96.726967"
y="99.929733"
id="text1342"><tspan
sodipodi:role="line"
id="tspan1340"
x="96.726967"
y="99.929733"
style="stroke-width:0.26458332">S<tspan
style="font-size:64.99999762%;baseline-shift:sub"
id="tspan1338">3</tspan></tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,430 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="214.13126mm"
height="85.225052mm"
viewBox="0 0 214.13125 85.225047"
version="1.1"
id="svg898"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="2019-10-24-NDFAExample.svg">
<defs
id="defs892">
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1264"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1262"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1246"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1244"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1240"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1238"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1234"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1232"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1226"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1224"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1222"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="marker1194"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path1192"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#216778;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker1182"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1180"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path919"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path925"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path913"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#2c89a0;fill-opacity:1;fill-rule:evenodd;stroke:#216778;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="470.48771"
inkscape:cy="114.15967"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata895">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(41.50967,-21.689612)">
<circle
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path902"
cx="41.426773"
cy="59.798286"
r="9.3544331" />
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle906"
cx="102.09696"
cy="59.798286"
r="9.3544331" />
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1234)"
d="M 51.04848,59.66465 H 90.87164"
id="path908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1178"
d="m 111.45139,59.66465 h 39.82316"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1182)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="65.213768"
y="55.922878"
id="text1198"><tspan
sodipodi:role="line"
id="tspan1196"
x="65.213768"
y="55.922878"
style="stroke-width:0.26458332">i</tspan></text>
<circle
r="9.3544331"
cy="59.798286"
cx="41.242809"
id="circle1206"
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1208"
d="M -9.8056873,59.66465 H 30.017471"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1212"
d="M -13.012922,52.181103 C 1.5112262,26.493635 -41.311257,27.062848 -25.841858,51.112025"
style="fill:none;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1194)" />
<text
id="text1216"
y="55.922878"
x="4.3595953"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="55.922878"
x="4.3595953"
id="tspan1214"
sodipodi:role="line">H</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-42.14529"
y="29.730465"
id="text1220"><tspan
sodipodi:role="line"
id="tspan1218"
x="-42.14529"
y="29.730465"
style="stroke-width:0.26458332">anything</tspan></text>
<circle
style="fill:#b7bec8;stroke:#535d6c;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1230"
cx="102.09696"
cy="97.060234"
r="9.3544331" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1236"
d="M 49.177593,65.811849 91.13891,92.806071"
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1240)" />
<text
id="text1250"
y="88.262497"
x="62.273804"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="88.262497"
x="62.273804"
id="tspan1248"
sodipodi:role="line">a</tspan></text>
<path
style="fill:#2c89a0;stroke:#216778;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1264)"
d="M 101.96332,87.961382 V 71.657937"
id="path1260"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<text
id="text1280"
y="55.922878"
x="130.09344"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="55.922878"
x="130.09344"
id="tspan1278"
sodipodi:role="line">!</tspan></text>
<circle
r="9.3544331"
cy="59.798286"
cx="162.76715"
id="circle1204-6"
style="fill:#b7c8b7;stroke:#536c53;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
<circle
style="fill:#dde9af;stroke:#677821;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="circle1297"
cx="-19.427391"
cy="59.798286"
r="9.3544331" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="158.46623"
y="63.581081"
id="text1320"><tspan
sodipodi:role="line"
id="tspan1318"
x="158.46623"
y="63.581081"
style="fill:#008000;stroke-width:0.26458332">✓</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-26.217016"
y="61.710194"
id="text1324"><tspan
sodipodi:role="line"
id="tspan1322"
x="-26.217016"
y="61.710194"
style="font-size:5.64444447px;stroke-width:0.26458332">Start</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="36.056782"
y="63.046539"
id="text1328"><tspan
sodipodi:role="line"
id="tspan1326"
x="36.056782"
y="63.046539"
style="stroke-width:0.26458332">S<tspan
style="font-size:64.99999762%;baseline-shift:sub"
id="tspan1330">1</tspan></tspan></text>
<text
id="text1336"
y="63.046539"
x="96.726967"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="63.046539"
x="96.726967"
id="tspan1334"
sodipodi:role="line">S<tspan
style="font-size:64.99999762%;baseline-shift:sub"
id="tspan1344">2</tspan></tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="96.726967"
y="99.929733"
id="text1342"><tspan
sodipodi:role="line"
id="tspan1340"
x="96.726967"
y="99.929733"
style="stroke-width:0.26458332">S<tspan
style="font-size:64.99999762%;baseline-shift:sub"
id="tspan1338">3</tspan></tspan></text>
<text
id="text1386"
y="82.917099"
x="106.106"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="stroke-width:0.26458332"
y="82.917099"
x="106.106"
id="tspan1384"
sodipodi:role="line">H</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB