### A Pluto.jl notebook ###
# v0.11.14
using Markdown
using InteractiveUtils
# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error).
macro bind(def, element)
quote
local el = $(esc(element))
global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : missing
el
end
end
# ╔═╡ 6747dc00-f6b7-11ea-0f15-87c36b36b915
begin
using PlutoUI
using Plots
using LinearAlgebra
# Returns true if row has all zeros.
function is_zero_row(A, row, tolerance=10e-16)
(m, n) = size(A)
return all([abs(A[row,col]) < tolerance for col=1:n])
end
# Returns first index of nonzero entry in row, or 0 if none exists.
function find_leading(A, row=1, tolerance=10e-16)
(m, n) = size(A)
for col=1:n
if abs(A[row, col]) > tolerance
return col
end
end
return 0
end
function find_nonzeros_in_column(A, row_start, col, tol=10e-12)
(m, n) = size(A)
return [i for i=row_start:m if abs(A[i,col]) > tol]
end
function columns(A)
(m, n) = size(A)
return n
end
function rowop_replace(A, source_row, target_row, scalar_factor)
@assert source_row != target_row
for j=1:columns(A)
A[target_row,j] += A[source_row,j] * scalar_factor
end
return A
end
function rowop_scale(A, target_row, scalar_factor)
@assert scalar_factor != 0
for j=1:columns(A)
A[target_row,j] *= scalar_factor
end
A
end
function rowop_swap(A, s, t)
for j=1:columns(A)
A[t,j], A[s,j] = A[s,j], A[t,j]
end
A
end
function RREF_with_rowop_count(A, tol=10e-12)
rowop_count = 0
A = float(copy(A))
(m, n) = size(A)
row = 1
for col=1:n
nonzeros = find_nonzeros_in_column(A, row, col, tol)
if length(nonzeros) == 0
continue
end
i = nonzeros[1]
if abs(A[i, col] - 1) < tol
A[i, col] = 1
else
A = rowop_scale(A, i, 1 / A[i, col])
rowop_count += 1
end
for j=nonzeros[2:end]
A = rowop_replace(A, i, j, -A[j, col])
rowop_count += 1
end
if i != row
A = rowop_swap(A, row, i)
rowop_count += 1
end
row += 1
end
for row=m:-1:1
l = find_leading(A, row, tol)
if l > 0
for k=1:row - 1
if abs(A[k,l]) > tol
rowop_replace(A, row, k, -A[k,l])
rowop_count += 1
end
end
end
end
# round entries to give nicer output; could omit this step
for row=1:m
for col=1:n
if abs(A[row,col] - round(A[row,col])) < tol
A[row,col] = round(A[row,col])
end
end
end
return A, rowop_count
end
function RREF_RowOpCount(A, tol=10e-12)
A, ops = RREF_with_rowop_count(A, tol)
return ops
end
function RREF(A, tol=10e-12)
A, ops = RREF_with_rowop_count(A, tol)
return A
end
md"# Notebook 3 -- Math 2121, Fall 2020
In today's notebook we'll try to get some feeling for vectors in $\mathbb{R}^2$ and $\mathbb{R}^3$ and their linear combinations. We'll also think about what a solution to a vector equation means. The code here involves a lot of new plotting functions in Julia."
end
# ╔═╡ 5ee83624-f6b7-11ea-2d58-87189f8d012d
md"## Running *this* notebook (optional)
If you have Pluto up and running, you can access the notebook we are currently viewing by entering [this link](http://www.math.ust.hk/~emarberg/teaching/2020/Math2121/julia/03_Math2121_Fall2020.jl) (right click -> Copy Link) in the *Open from file* menu in Pluto.
"
# ╔═╡ 3a8d2b70-f6b4-11ea-070a-d32002194d8b
md"## Vectors in $\mathbb{R}^2$
Let's start out by drawing some vectors in $\mathbb{R}^2$."
# ╔═╡ d967006e-f6a4-11ea-0e3c-5b6f279a1441
begin
u1_slider = @bind u1 Slider(-10:0.1:10, default=4, show_value=false)
u2_slider = @bind u2 Slider(-10:0.1:10, default=8, show_value=false)
v1_slider = @bind v1 Slider(-10:0.1:10, default=-10, show_value=false)
v2_slider = @bind v2 Slider(-10:0.1:10, default=6, show_value=false)
w1_slider = @bind w1 Slider(-10:0.1:10, default=2, show_value=false)
w2_slider = @bind w2 Slider(-10:0.1:10, default=-9, show_value=false)
md"""**Create some vectors in $$\mathbb{R}^2$$**
`u1` = $(u1_slider) `v1` = $(v1_slider) `w1` = $(w1_slider)
`u2` = $(u2_slider) `v2` = $(v2_slider) `w2` = $(w2_slider)
"""
end
# ╔═╡ 2db41822-f70a-11ea-021f-e5d09f5851d4
md"The vectors we created:"
# ╔═╡ 98dd602c-f6a6-11ea-144f-9b221eb88795
begin
s = [string(u1), string(v1), string(w1), string(u2), string(v2), string(w2)]
pad = maximum([4, maximum(map(length,s))])
for i=1:length(s)
s[i] = " "^(pad - length(s[i])) * s[i]
end
top = join(["u = [$(s[1])]", "v = [$(s[2])]", "w = [$(s[3])]"], " ")
bot = join([" [$(s[4])]", " [$(s[5])]", " [$(s[6])]"], " ")
Text(join([top, bot], "\n"))
end
# ╔═╡ 33895ef0-f6b1-11ea-0e3a-0b30a86db2d3
md"""**Display**:
`u` $(@bind uon html"") `v` $(@bind von html"") `w` $(@bind won html"")
"""
# ╔═╡ e1c4cf42-f6a5-11ea-2a1f-dff25e027eee
begin
lims = (
-(maximum([1, uon + von + won])) * 10,
maximum([1, uon + von + won]) * 10
)
p1 = scatter([0], [0], xlims = lims, ylims = lims,
legend = false, label = "origin", aspect_ratio=:equal,
title = "Vectors u, v, w")
if uon
quiver!(quiver = ([u1],[u2]), [0], [0], color = [:blue],)
end
if von
quiver!(quiver = ([v1],[v2]), [0], [0], color = [:orange],)
end
if won
quiver!(quiver = ([w1],[w2]), [0], [0], color = [:green],)
end
p2 = scatter([0], [0], xlims = lims, ylims = lims,
legend = false, label = "origin", aspect_ratio=:equal,
title = "Sum of vectors")
quiver!(
quiver = ([uon*u1 + von*v1 + won*w1],[uon*u2 + von*v2 + won*w2]),
[0], [0], color = [:black],
)
quiver!(
quiver = ([uon*u1],[uon*u2]),
[0], [0],
color = [:blue],
linestyle = :dashdot,
)
quiver!(
quiver = ([von*v1],[von*v2]),
[uon*u1], [uon*u2],
color = [:orange],
linestyle = :dashdot,
)
quiver!(
quiver = ([won*w1],[won*w2]),
[uon*u1 + von*v1], [uon*u2 + von*v2],
color = [:green],
linestyle = :dashdot,
)
plot(p1, p2, layout=2)
end
# ╔═╡ 5d6739a2-f70a-11ea-0737-3b3874765845
md"The vector $u$ is shown in blue, $v$ in orange, and $w$ in green.
The right hand graph shows the sum of the displayed vectors on the left as the solid arrow. The dotted arrows are just copies of u, v, and w moved around."
# ╔═╡ 14f5cc00-f6b4-11ea-2835-b76d6f1e37a3
md"## Linear combinations
Now that we have chosen some vectors $u$, $v$, $w$, let's think about the meaning of the linear combination $au + bv + cw$ where $a,b,c \in \mathbb{R}$ are scalars."
# ╔═╡ 4bc944f2-f6b2-11ea-37a2-53e73f307768
begin
a_slider = @bind a Slider(-10:0.1:10, default=1, show_value=false)
b_slider = @bind b Slider(-10:0.1:10, default=1, show_value=false)
c_slider = @bind c Slider(-10:0.1:10, default=1, show_value=false)
md"""**Choose some scalars in $$\mathbb{R}$$**
`a` = $(a_slider) `b` = $(b_slider) `c` = $(c_slider)
"""
end
# ╔═╡ bec5ac22-f70a-11ea-2599-7ff686c7f620
md"The scalars we chose:"
# ╔═╡ f1397f22-f6b4-11ea-32b8-0ffb8a145542
Text(join([string("a = ", a), string("b = ", b), string("c = ", c)], " "))
# ╔═╡ 771a53ba-f6b4-11ea-1356-d53f76f17153
begin
p3 = scatter([0], [0], xlims = lims, ylims = lims,
legend = false, label = "origin", aspect_ratio=:equal,
title = "a•u, b•v, and c•w")
if uon
quiver!(quiver = ([a*u1],[a*u2]), [0], [0], color = [:blue],)
end
if von
quiver!(quiver = ([b*v1],[b*v2]), [0], [0], color = [:orange],)
end
if won
quiver!(quiver = ([c*w1],[c*w2]), [0], [0], color = [:green],)
end
p4 = scatter([0], [0], xlims = lims, ylims = lims,
legend = false, label = "origin", aspect_ratio=:equal,
title = "a•u + b•v + c•w")
quiver!(
quiver = (
[a*uon*u1 + b*von*v1 + c*won*w1],
[a*uon*u2 + b*von*v2 + c*won*w2]
),
[0], [0], color = [:black],
)
quiver!(
quiver = ([a*uon*u1],[a*uon*u2]),
[0], [0],
color = [:blue],
linestyle = :dashdot,
)
quiver!(
quiver = ([b*von*v1],[b*von*v2]),
[a*uon*u1], [a*uon*u2],
color = [:orange],
linestyle = :dashdot,
)
quiver!(
quiver = ([c*won*w1],[c*won*w2]),
[a*uon*u1 + b*von*v1], [a*uon*u2 + b*von*v2],
color = [:green],
linestyle = :dashdot,
)
plot(p3, p4, layout=2)
end
# ╔═╡ c9c67d22-f70a-11ea-06dd-29444f52a98d
md"Varying $a$ among positive values scales the length of the arrow that represents the vector $u$.
If $a$ is negative then this scalaing reverses the direction of $u$.
The same thing happens to the arrows representing $v$ and $w$ when we change $b$ and $c$."
# ╔═╡ 63c9a0c0-f6b6-11ea-08e2-79dd64b9d659
md"## Vector equations
Let's now think of $a,b,c$ as the variables $x_1=a$ and $x_2=b$ and $x_3=c$.
Choose a target vector $t =\left[\begin{array}{l} t_1 \\ t_2\end{array}\right] \in \mathbb{R}^2$.
What does a solution to the equation $x_1 u + x_2 v + x_3 w = t$ mean?
We know that the solutions $x = \left[\begin{array}{l} x_1 \\ x_2 \\ x_3\end{array}\right]$ to this equation are the same as the solutions to the linear system whose augmented matrix is
$$A = \left[\begin{array}{ccc|c} u_1 & v_1 & w_1 & t_1 \\ u_2 & v_2 & w_2 & t_2 \end{array}\right]$$."
# ╔═╡ ca58c60e-f70b-11ea-15e4-252f5aedd5eb
md"Let's create a random target vector $t$."
# ╔═╡ bfb22812-f70b-11ea-2b93-294dd13f0173
target = rand(-20:0.1:20, 2, 1)
# ╔═╡ dcaf837e-f70b-11ea-2489-2fa42527ffc2
md"Here's our coefficient matrix."
# ╔═╡ 78fe315e-f6b6-11ea-0b1a-8d6ebd027af3
coefficient_matrix = [u1 v1 w1; u2 v2 w2]
# ╔═╡ ed69aba4-f70b-11ea-29e9-85532d4d171b
md"Here's our augmented matrix."
# ╔═╡ a126f008-f6b6-11ea-332e-2ddd7c48ff18
augmented_matrix = hcat(coefficient_matrix, target)
# ╔═╡ f2dfc3fc-f70b-11ea-320c-4fd9aafe03d2
md"To solve the corresponding linear system we compute `RREF(augmented_matrix)`."
# ╔═╡ a24ebc82-f6b7-11ea-128a-8bbc70971d7e
rref = RREF(augmented_matrix)
# ╔═╡ 0ba78366-f70c-11ea-0d41-4d3026d8c9ff
md"For typical values of $t$, the pivot positions are (1,1) and (2,2).
This means $x_1$ and $x_2$ are basic variables and $x_3$ is a free variable.
To get a solution, choose any value for $x_3$, then solve for $x_1$, $x_2$."
# ╔═╡ 0591f7bc-f6b8-11ea-3593-6f4d7893bde4
free_variable_value = 0
# ╔═╡ f29f1fc2-f6b7-11ea-0e1c-af44896f05d2
solution = (
rref[1,4] - free_variable_value * rref[1,3],
rref[2,4] - free_variable_value * rref[2, 3],
free_variable_value
)
# ╔═╡ 77c5fc44-f70c-11ea-14d5-8f1a3c63973d
md"The meaninng of this solution is that if we set $x_1$, $x_2$, and $x_3$ to the corresponding values, then the linear combination $x_1 u + x_2 v + x_3 w$ should match up with the target vector $t$.
We can see this visually below."
# ╔═╡ 117f228a-f6b7-11ea-328d-99c1bcad90a4
begin
md"""
`x1` = $(a_slider) `x2` = $(b_slider) `x3` = $(c_slider)
"""
end
# ╔═╡ 27222d80-f6b7-11ea-15fd-31403c3a4fc3
Text(join([string("x1 = ", a), string("x2 = ", b), string("x3 = ", c)], " "))
# ╔═╡ c126ab46-f6b6-11ea-0998-a5d507105e6c
begin
p5 = scatter([0 target[1]], [0 target[2]], xlims = (-20,20), ylims = (-20,20),
legend = true, label = ["origin" "target"],
# aspect_ratio=:equal,
title = "x1•u + x2•v + x3•w = ?",
)
quiver!(
quiver = ([a*uon*u1 + b*von*v1 + c*won*w1],[a*uon*u2 + b*von*v2 + c*won*w2]),
[0], [0], color = [:black],
)
quiver!(
quiver = ([a*uon*u1],[a*uon*u2]),
[0], [0],
color = [:blue],
linestyle = :dashdot,
)
quiver!(
quiver = ([b*von*v1],[b*von*v2]),
[a*uon*u1], [a*uon*u2],
color = [:orange],
linestyle = :dashdot,
)
quiver!(
quiver = ([c*won*w1],[c*won*w2]),
[a*uon*u1 + b*von*v1], [a*uon*u2 + b*von*v2],
color = [:green],
linestyle = :dashdot,
)
plot(p5)
end
# ╔═╡ 3e305304-f6b9-11ea-39bc-9bc8b5bccea8
md"## Vectors in $\mathbb{R}^3$
Let's also try to visualize vectors in $\mathbb{R}^3$ and think about their span.
This is a little more challenging to display."
# ╔═╡ 6d2d8fb4-f706-11ea-12e0-85e0428d422e
begin
p_slider = @bind _phi Slider(-360:12:360, default=0, show_value=true)
q_slider = @bind _psi Slider(-360:12:360, default=0, show_value=true)
md"""**Display parameters** (changing these rotates our view):"
`phi` = $(p_slider)
`psi` = $(q_slider)
"""
end
# ╔═╡ eadc8946-f662-11ea-0c60-5b32a7ff3686
begin
a1_slider = @bind a1 Slider(0:1:20, default=4, show_value=false)
a2_slider = @bind a2 Slider(0:1:20, default=8, show_value=false)
a3_slider = @bind a3 Slider(0:1:20, default=0, show_value=false)
b1_slider = @bind b1 Slider(0:1:20, default=10, show_value=false)
b2_slider = @bind b2 Slider(0:1:20, default=6, show_value=false)
b3_slider = @bind b3 Slider(0:1:20, default=0, show_value=false)
md"""**Create some vectors in $$\mathbb{R}^3$$**
`v1` = $(a1_slider) `w1` = $(b1_slider)
`v2` = $(a2_slider) `w2` = $(b2_slider)
`v3` = $(a3_slider) `w3` = $(b3_slider)
"""
end
# ╔═╡ 21f94354-f70d-11ea-298a-91b2b4f84497
md"The vectors we created:"
# ╔═╡ 54304a0a-f6bc-11ea-3784-ef7e2c75f3b5
begin
_s = [string(a1), string(b1), string(a2), string(b2), string(a3), string(b3)]
_pad = maximum([4, maximum(map(length,_s))])
for i=1:length(_s)
_s[i] = " "^(_pad - length(_s[i])) * _s[i]
end
_top = join(["v = [$(_s[1])]", "w = [$(_s[2])]"], " ")
_mid = join([" [$(_s[3])]", " [$(_s[4])]"], " ")
_bot = join([" [$(_s[5])]", " [$(_s[6])]"], " ")
Text(join([_top, _mid, _bot], "\n"))
end
# ╔═╡ ec16885a-f707-11ea-28bf-dffc2c6c367b
md"""show shadows in $xy$-plane:
$(@bind nothide html"")
"""
# ╔═╡ 5b41e866-f703-11ea-3040-93adc7fc1914
md"""draw span:
$(@bind span html"")
"""
# ╔═╡ 7a7dca26-f6bb-11ea-37b8-1f97f11903d9
begin
phi = (_phi - 90) / 360 * pi
psi = (_psi - 270) / 360 * pi
A = [ sin(psi) -cos(psi) 0
cos(phi) * cos(psi) cos(phi) * sin(psi) -sin(phi)]
md""
end
# ╔═╡ 2b9623ee-f662-11ea-30d4-dd9d4e7db44b
begin
nlims = (-20,20)
p6 = scatter([0], [0],
legend = false,
label = "origin",
aspect_ratio=:equal,
grid=nothing,
axis=nothing,
foreground_color_subplot="white",
)
for i=6:6:60
quiver!(
quiver = ([100 * A[1,2]], [100 * A[2,2]]),
[i * A[1,1]], [i * A[2,1]],
color=[:lightgray],
linestyle = :dashdot,
)
quiver!(
quiver = ([100 * A[1,1]], [100 * A[2,1]]),
[i * A[1,2]], [i * A[2,2]],
color=[:lightgray],
linestyle = :dashdot,
)
end
quiver!(
quiver = (100 * A[1:1,1:3], 100 * A[2:2,1:3]),
[0, 0, 0],
[0, 0, 0],
xlims = nlims,
ylims = nlims,
color = [:grey],
)
if nothide
x = A * [a1; a2; 0]
quiver!(
quiver = ([x[1]], [x[2]]), [0], [0],
color = [:blue],
linestyle = :dashdot,
)
y = A * [b1; b2; 0]
quiver!(
quiver = ([y[1]], [y[2]]), [0], [0],
color = [:orange],
linestyle = :dashdot,
)
end
x = A * [a1; a2; a3]
y = A * [b1; b2; b3]
if norm(x) != 0
nx = x / norm(x)
else
nx = x
end
if norm(y) != 0
ny = y / norm(y)
else
ny = y
end
if span
for i=0:20
for j=0:20
scatter!(
[i * nx[1] + j * ny[1]], [i * nx[2] + j * ny[2]],
color=[:lightgray],
)
end
end
end
quiver!(quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue],)
quiver!(quiver = ([y[1]], [y[2]]), [0], [0], color = [:orange],)
p7 = scatter([0], [0],
legend = false,
label = "origin",
aspect_ratio=:equal,
grid=nothing,
axis=nothing,
foreground_color_subplot="white"
)
for i=6:6:60
quiver!(
quiver = ([100 * A[1,2]], [100 * A[2,2]]),
[i * A[1,1]], [i * A[2,1]],
color=[:lightgray],
linestyle = :dashdot,
)
quiver!(
quiver = ([100 * A[1,1]], [100 * A[2,1]]),
[i * A[1,2]], [i * A[2,2]],
color=[:lightgray],
linestyle = :dashdot,
)
end
quiver!(
quiver = (100 * A[1:1,1:3], 100 * A[2:2,1:3]),
[0, 0, 0],
[0, 0, 0],
xlims = nlims,
ylims = nlims,
color = [:grey],
)
if nothide
x = A * [a1; a2; 0]
y = A * [b1; b2; 0]
quiver!(
quiver = ([x[1]], [x[2]]), [0], [0],
color = [:grey],
linestyle = :dashdot,)
quiver!(
quiver = ([y[1]], [y[2]]), [x[1]], [x[2]],
color = [:grey],
linestyle = :dashdot,)
quiver!(
quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0],
color = [:grey])
end
x = A * [a1; a2; a3]
y = A * [b1; b2; b3]
quiver!(
quiver = ([x[1]], [x[2]]), [0], [0],
color = [:blue],
linestyle = :dashdot)
quiver!(
quiver = ([y[1]], [y[2]]), [x[1]], [x[2]],
color = [:orange],
linestyle = :dashdot)
quiver!(
quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0],
color = [:black])
plot(p6, p7, layout=2)
end
# ╔═╡ 328a48f8-f70d-11ea-01ad-134d67559e56
md"The left picture shows that vectors $v$ and $w$.
The right picture shows their sum.
We can also display the span of the two vectors, denoted $\mathbb{R}\text{-span}\{v,w\}$.
For different inputs, we can get $\mathbb{R}\text{-span}\{v,w\}$ to be either a plane, a line, or a single point."
# ╔═╡ 13455000-f70f-11ea-039e-61a52527c5c4
md"## Some remarks
Of course, these pictures are not actually in $\mathbb{R}^3$!
On a flat surface like this screen, we can only draw vectors in $\mathbb{R}^2$.
Secretly, we are drawing many vectors $\mathbb{R}^2$ to simulate the appearance of $\mathbb{R}^3$. If we erase those extra vectors and display the usual axes, the plots below are what we are actually showing."
# ╔═╡ ed5c9554-f70d-11ea-3b03-834875727f59
begin
p8 = scatter([0], [0],
legend = false,
label = "origin",
aspect_ratio=:equal,
xlims = nlims,
ylims = nlims,
)
quiver!(quiver = ([x[1]], [x[2]]), [0], [0], color = [:blue],)
quiver!(quiver = ([y[1]], [y[2]]), [0], [0], color = [:orange],)
p9 = scatter([0], [0],
legend = false,
label = "origin",
aspect_ratio=:equal,
xlims = nlims,
ylims = nlims,
)
quiver!(
quiver = ([x[1]], [x[2]]), [0], [0],
color = [:blue],
linestyle = :dashdot)
quiver!(
quiver = ([y[1]], [y[2]]), [x[1]], [x[2]],
color = [:orange],
linestyle = :dashdot)
quiver!(
quiver = ([x[1] + y[1]], [x[2] + y[2]]), [0], [0],
color = [:black])
plot(p8, p9, layout=2)
end
# ╔═╡ c0c2ecb6-f70e-11ea-2eb7-0f49cce8ff48
md"How are these vectors in $\mathbb{R}^2$ computed from $v$ and $w$, which we chose to be in $\mathbb{R}^3$?
Some kind of transformation is used to change vectors in $\mathbb{R}^3$ to vectors in $\mathbb{R}^2$ that we can display. We'll talk about these kinds of transformations next lecture."
# ╔═╡ Cell order:
# ╟─6747dc00-f6b7-11ea-0f15-87c36b36b915
# ╟─5ee83624-f6b7-11ea-2d58-87189f8d012d
# ╟─3a8d2b70-f6b4-11ea-070a-d32002194d8b
# ╟─d967006e-f6a4-11ea-0e3c-5b6f279a1441
# ╟─2db41822-f70a-11ea-021f-e5d09f5851d4
# ╟─98dd602c-f6a6-11ea-144f-9b221eb88795
# ╟─33895ef0-f6b1-11ea-0e3a-0b30a86db2d3
# ╟─e1c4cf42-f6a5-11ea-2a1f-dff25e027eee
# ╟─5d6739a2-f70a-11ea-0737-3b3874765845
# ╟─14f5cc00-f6b4-11ea-2835-b76d6f1e37a3
# ╟─4bc944f2-f6b2-11ea-37a2-53e73f307768
# ╟─bec5ac22-f70a-11ea-2599-7ff686c7f620
# ╟─f1397f22-f6b4-11ea-32b8-0ffb8a145542
# ╟─771a53ba-f6b4-11ea-1356-d53f76f17153
# ╟─c9c67d22-f70a-11ea-06dd-29444f52a98d
# ╟─63c9a0c0-f6b6-11ea-08e2-79dd64b9d659
# ╟─ca58c60e-f70b-11ea-15e4-252f5aedd5eb
# ╠═bfb22812-f70b-11ea-2b93-294dd13f0173
# ╟─dcaf837e-f70b-11ea-2489-2fa42527ffc2
# ╠═78fe315e-f6b6-11ea-0b1a-8d6ebd027af3
# ╟─ed69aba4-f70b-11ea-29e9-85532d4d171b
# ╠═a126f008-f6b6-11ea-332e-2ddd7c48ff18
# ╟─f2dfc3fc-f70b-11ea-320c-4fd9aafe03d2
# ╠═a24ebc82-f6b7-11ea-128a-8bbc70971d7e
# ╟─0ba78366-f70c-11ea-0d41-4d3026d8c9ff
# ╠═0591f7bc-f6b8-11ea-3593-6f4d7893bde4
# ╠═f29f1fc2-f6b7-11ea-0e1c-af44896f05d2
# ╟─77c5fc44-f70c-11ea-14d5-8f1a3c63973d
# ╟─117f228a-f6b7-11ea-328d-99c1bcad90a4
# ╟─27222d80-f6b7-11ea-15fd-31403c3a4fc3
# ╟─c126ab46-f6b6-11ea-0998-a5d507105e6c
# ╟─3e305304-f6b9-11ea-39bc-9bc8b5bccea8
# ╟─6d2d8fb4-f706-11ea-12e0-85e0428d422e
# ╟─eadc8946-f662-11ea-0c60-5b32a7ff3686
# ╟─21f94354-f70d-11ea-298a-91b2b4f84497
# ╟─54304a0a-f6bc-11ea-3784-ef7e2c75f3b5
# ╟─ec16885a-f707-11ea-28bf-dffc2c6c367b
# ╟─5b41e866-f703-11ea-3040-93adc7fc1914
# ╟─7a7dca26-f6bb-11ea-37b8-1f97f11903d9
# ╟─2b9623ee-f662-11ea-30d4-dd9d4e7db44b
# ╟─328a48f8-f70d-11ea-01ad-134d67559e56
# ╟─13455000-f70f-11ea-039e-61a52527c5c4
# ╟─ed5c9554-f70d-11ea-3b03-834875727f59
# ╟─c0c2ecb6-f70e-11ea-2eb7-0f49cce8ff48