<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>tenticle</title>
    <link href="https://tenticle.dev/atom.xml" rel="self" />
    <link href="https://tenticle.dev" />
    <id>https://tenticle.dev/atom.xml</id>
    <author>
        <name>xkollar</name>
        <email></email>
    </author>
    <updated>2026-02-25T00:00:00Z</updated>
    <entry>
    <title>Tech Interview: Aftertaste</title>
    <link href="https://tenticle.dev/posts/2026-02-25-tech-interview-aftertaste.html" />
    <id>https://tenticle.dev/posts/2026-02-25-tech-interview-aftertaste.html</id>
    <published>2026-02-25T00:00:00Z</published>
    <updated>2026-02-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[<!--
Self note: story about starting simple and finding similarity? Exploring
problem space?
-->
<!-- Dedication: For those "Actually, Fib can be done in constant time" readers -->
<p>Interviews take a lot of energy. In general but
<a href="2026-01-25-tech-interview-ii.html" rel="prev">this one in particular</a>.
And getting through it also deserves a little celebration. Whatever
the reason, it is sort of a ritual to go to a nearby food place after.
Raw protein wrapped in carbs, if it can be helped.</p>
<p>The place is quiet, well past the rush of a lunch time, well before the noise
of an evening. Getting ready your linear utensils and squishing totally
reasonable blobs of green stuff onto your units of sustenance, a thought
keeps coming back to you:</p>
<div class="speaker b">
<p>Can we do any better?</p>
</div>
<p>You pull out a writing device of your choice and a generic white-label
wire-bound notebook. You open the notebook on a fresh page and stare at
the empty lines for a bit.</p>
<p>There was a class where someone derived a formula for the Fibonacci
numbers. Or someone mentioned it. And it was exciting. What was it
all about? Something around representing sequences of numbers as
polynomials. Was it called <a href="https://en.wikipedia.org/wiki/Generating_function">generating functions</a>?</p>
<p>Starting simple is usually a good idea. Maybe encoding a list of all ones?
In polynomials, the various powers of the variable naturally separate their
coefficients. So a sequence <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mi>⋯</mi></mrow><annotation encoding="application/x-tex">1, 1, 1, 1, 1, 1, \cdots</annotation></semantics></math> could be represented
as a polynomial on <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>x</mi><annotation encoding="application/x-tex">x</annotation></semantics></math> with</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo><mn>1</mn><mo>+</mo><mi>x</mi><mo>+</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><msup><mi>x</mi><mn>4</mn></msup><mo>+</mo><mi>⋯</mi></mrow><annotation encoding="application/x-tex">
f(x) = 1 + x + x^2 + x^3 + x^4 + \cdots
</annotation></semantics></math></p>
<p>That does not look very useful, but you won’t let that discourage you.
This will need some poking around. A fun thing that can be done
with polynomials is to multiply it by the variable, so you try that.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>⋅</mo><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo><mrow><mo stretchy="true" form="prefix">(</mo><mn>0</mn><mo>+</mo><mspace width="-0.167em"></mspace><mo stretchy="true" form="postfix">)</mo></mrow><mspace width="0.222em"></mspace><mi>x</mi><mo>+</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><msup><mi>x</mi><mn>4</mn></msup><mo>+</mo><mi>⋯</mi></mrow><annotation encoding="application/x-tex">
x \cdot f(x) = (0 +\!)\ x + x^2 + x^3 + x^4 + \cdots
</annotation></semantics></math></p>
<p>Fascinating: This way we shifted the sequence and prepended 0!
This now represents <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>1</mn><mo>,</mo><mi>⋯</mi></mrow><annotation encoding="application/x-tex">0, 1, 1, 1, 1, 1, \cdots</annotation></semantics></math>. Things are emerging
from murky depths of memory. Let’s subtract those…</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>−</mo><mi>x</mi><mo>⋅</mo><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">
f(x) - x \cdot f(x) = 1
</annotation></semantics></math></p>
<p>Now this looks very promising. Suddenly the whole expression becomes
very finite. No need to dance around the infinity with ellipsis…
Just few small steps later we get</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mi>x</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">
f(x) = \frac{1}{1-x}
</annotation></semantics></math></p>
<p>Somehow, this fraction captures the infinite list of ones.
While possibly not very useful on its own, this feels like an important
piece of a puzzle.</p>
<p>And the whole process reminded you of writing the infinite list
of Fibonacci numbers in Haskell.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="ot">fibs ::</span> [<span class="dt">Integer</span>]</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>fibs <span class="ot">=</span> <span class="dv">0</span> <span class="op">:</span> <span class="dv">1</span> <span class="op">:</span> <span class="fu">zipWith</span> (<span class="op">+</span>) fibs (<span class="fu">tail</span> fibs)</span></code></pre></div>
<p>And so you try representing the sequence:</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo></mtd><mtd columnalign="left"><mn>0</mn><mo>+</mo><mn>1</mn><mi>x</mi><mo>+</mo><mn>1</mn><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><mn>3</mn><msup><mi>x</mi><mn>4</mn></msup><mo>+</mo><mn>5</mn><msup><mi>x</mi><mn>5</mn></msup><mo>+</mo><mi>⋯</mi></mtd></mtr><mtr><mtd columnalign="right"><mi>x</mi><mo>⋅</mo><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo></mtd><mtd columnalign="left"><mn>0</mn><mo>+</mo><mn>0</mn><mi>x</mi><mo>+</mo><mn>1</mn><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>1</mn><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><mn>2</mn><msup><mi>x</mi><mn>4</mn></msup><mo>+</mo><mn>3</mn><msup><mi>x</mi><mn>5</mn></msup><mo>+</mo><mi>⋯</mi></mtd></mtr><mtr><mtd columnalign="right"><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>−</mo><mi>x</mi><mo>⋅</mo><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo></mtd><mtd columnalign="left"><mn>0</mn><mo>+</mo><mn>1</mn><mi>x</mi><mo>+</mo><mn>0</mn><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>1</mn><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><mn>1</mn><msup><mi>x</mi><mn>4</mn></msup><mo>+</mo><mn>2</mn><msup><mi>x</mi><mn>5</mn></msup><mo>+</mo><mi>⋯</mi></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
\overline{\mathrm{fib}}(x) =&amp; 0 + 1x + 1x^2 + 2x^3 + 3x^4 + 5x^5 + \cdots \\
x \cdot \overline{\mathrm{fib}}(x) =&amp; 0 + 0x + 1x^2 + 1x^3 + 2x^4 + 3x^5 + \cdots \\
\overline{\mathrm{fib}}(x) - x \cdot \overline{\mathrm{fib}}(x)
                                   =&amp; 0 + 1x + 0x^2 + 1x^3 + 1x^4 + 2x^5 + \cdots \\
\end{align}
</annotation></semantics></math></p>
<p>It takes a bit of squinting to realize that the right side is a Fibonacci sequence shifted by 2 positions with extra x
(elements of which you can kinda see in the Haskell implementation!):</p>
<div style="color: orange">
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>−</mo><mi>x</mi><mo>⋅</mo><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo></mtd><mtd columnalign="left"><mi>x</mi><mo>+</mo><msup><mi>x</mi><mn>2</mn></msup><mo>⋅</mo><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow></mtd></mtr><mtr><mtd columnalign="right"><mi>⋯</mi><mrow></mrow></mtd></mtr><mtr><mtd columnalign="right"><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo></mtd><mtd columnalign="left"><mfrac><mi>x</mi><mrow><mn>1</mn><mo>−</mo><mi>x</mi><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup></mrow></mfrac></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
\overline{\mathrm{fib}}(x) - x \cdot \overline{\mathrm{fib}}(x)
 =&amp; x + x^2 \cdot \overline{\mathrm{fib}}(x) \\
\cdots{} \\
\overline{\mathrm{fib}}(x) =&amp; \frac{x}{1 - x - x^2}
\end{align}
</annotation></semantics></math></p>
</div>
<div class="speaker b">
<p>This is great, except, what do I do with this? How do I get
back to elements of the sequence? Or even better, how do I
get to an element at a given position?</p>
</div>
<div class="speaker a">
<p>Try deriving expression for <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mo>∑</mo><mrow><mi>i</mi><mo>∈</mo><msub><mstyle mathvariant="double-struck"><mi>ℕ</mi></mstyle><mn>0</mn></msub></mrow></msub><mi>α</mi><msup><mrow></mrow><mi>i</mi></msup><msup><mi>x</mi><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">\sum_{i\in\mathbb{N}_0} \alpha{}^i x^i</annotation></semantics></math>.</p>
</div>
<div class="speaker b">
<p>Is that going to help…‽</p>
</div>
<p>You got almost to the end of that sentence before you realized, all at once,
that the interviewer from earlier:</p>
<ul>
<li>is sitting right next to you;</li>
<li>must have been peeking over your shoulder;</li>
<li>is looking at you with mild interest;</li>
<li>has mouth freshly stuffed with what looks
<a href="https://theoldvillage.wordpress.com/2004/01/28/douglas-adams-shares-a-true-story/">suspiciously similar to your own food</a>.</li>
</ul>
<div class="speaker b">
<p>How long have you…</p>
</div>
<div class="speaker a">
<p>Just try.</p>
</div>
<p>Trying to not get too distracted by what just happened
you repeat the steps, but with extra <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi><mrow></mrow></mrow><annotation encoding="application/x-tex">\alpha{}</annotation></semantics></math>.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle displaystyle="true"><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mi>α</mi><mrow></mrow><mi>x</mi></mrow></mfrac></mstyle><mo>=</mo><mn>1</mn><mo>+</mo><mi>α</mi><mrow></mrow><mi>x</mi><mo>+</mo><msup><mi>α</mi><mn>2</mn></msup><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>α</mi><msup><mrow></mrow><mn>3</mn></msup><msup><mi>x</mi><mn>3</mn></msup><mi>⋯</mi></mrow><annotation encoding="application/x-tex">
\dfrac{1}{1-\alpha{}x} = 1 + \alpha{}x + \alpha^2x^2 + \alpha{}^3x^3 \cdots
</annotation></semantics></math></p>
<p>That is actually very useful! If we find an appropriately shaped expression,
this formula allows us to find n-th element in the sequence on its own! And
polynomials are easy to sum as we saw earlier. That is handy. So is the
pattern for adding two fractions. Now if only we could express this generating
function as a sum of appropriate forms…</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mi>A</mi><mrow><mn>1</mn><mo>−</mo><mi>α</mi><mrow></mrow><mi>x</mi></mrow></mfrac><mo>+</mo><mfrac><mi>B</mi><mrow><mn>1</mn><mo>−</mo><mi>β</mi><mrow></mrow><mi>x</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">
\frac{A}{1-\alpha{}x} + \frac{B}{1-\beta{}x}
</annotation></semantics></math></p>
<details>
<summary>
Using quadratic formula you find the roots of the denominator.
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mn>1</mn><mo>,</mo><mn>2</mn></mrow></msub><mo>=</mo><mo>−</mo><mfrac><mrow><mn>1</mn><mo>±</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">
x_{1,2} = - \frac{1 \pm \sqrt{5}}{2}
</annotation></semantics></math>
</summary>
<p>Ugh… Do I even remember quadratic formula? Let me try to remember real quick.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi></mtd><mtd columnalign="left"><mo>=</mo><mn>0</mn></mtd><mtd columnalign="right"><mi>/</mi><mi>a</mi></mtd></mtr><mtr><mtd columnalign="right"><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mfrac><mi>b</mi><mi>a</mi></mfrac><mi>x</mi><mo>+</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mtd><mtd columnalign="left"><mo>=</mo><mn>0</mn></mtd><mtd columnalign="right"><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mtd></mtr><mtr><mtd columnalign="right"><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mfrac><mi>b</mi><mi>a</mi></mfrac><mi>x</mi></mtd><mtd columnalign="left"><mo>=</mo><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mtd><mtd columnalign="right"><mo>+</mo><msup><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mn>2</mn></msup></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
ax^2 + bx + c                    &amp;= 0             &amp; /a \\
x^2 + \frac{b}{a}x + \frac{c}{a} &amp;= 0             &amp; - \frac{c}{a} \\
x^2 + \frac{b}{a}x               &amp;= - \frac{c}{a} &amp; + \frac{b}{2a}^2 \\
\end{align}
</annotation></semantics></math></p>
<p>This way we get the left side to shape of <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><mi>a</mi><mi>b</mi><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">a^2 + 2ab + b^2</annotation></semantics></math>.</p>
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mfrac><mi>b</mi><mi>a</mi></mfrac><mi>x</mi><mo>+</mo><msup><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mn>2</mn></msup></mtd><mtd columnalign="left"><mo>=</mo><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac><mo>+</mo><msup><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mn>2</mn></msup></mtd><mtd columnalign="right"><mrow><mtext mathvariant="normal">undo </mtext><mspace width="0.333em"></mspace></mrow><msup><mrow><mo stretchy="true" form="prefix">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="true" form="postfix">)</mo></mrow><mn>2</mn></msup></mtd></mtr><mtr><mtd columnalign="right"><msup><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo>+</mo><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mn>2</mn></msup></mtd><mtd columnalign="left"><mo>=</mo><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac><mo>+</mo><msup><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mn>2</mn></msup></mtd><mtd columnalign="right"><msqrt><mrow><mspace width="1.0em"></mspace><mrow></mrow></mrow></msqrt></mtd></mtr><mtr><mtd columnalign="right"><mo>±</mo><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo>+</mo><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow></mtd><mtd columnalign="left"><mo>=</mo><mfrac><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mtd></mtr><mtr><mtd columnalign="right"><mi>x</mi></mtd><mtd columnalign="left"><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
x^2 + \frac{b}{a}x + \frac{b}{2a}^2 &amp;= - \frac{c}{a} + \frac{b}{2a}^2 &amp; \text{undo $(a+b)^2$} \\
(x+\frac{b}{2a})^2 &amp;= - \frac{c}{a} + \frac{b}{2a}^2 &amp; \sqrt{\quad{}} \\
\pm(x+\frac{b}{2a}) &amp;= \frac{\sqrt{b^2 - 4ac}}{2a} \\
x &amp;= \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \\
\end{align}
</annotation></semantics></math>
</details>
<details>
<summary>
From there you reconstruct the individual factors.
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>−</mo><mi>x</mi><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup><mo>=</mo><mo>−</mo><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo>+</mo><mfrac><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo>+</mo><mfrac><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">
1 - x - x^2 = -(x+\frac{1+\sqrt{5}}{2})(x+\frac{1-\sqrt{5}}{2})
</annotation></semantics></math>
</summary>
Roots are only points where the parabola crosses the x-axis, we need to fit
it with multiplicative component, and that is <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math>.
</details>
<p>Next goal is to find <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>A</mi><annotation encoding="application/x-tex">A</annotation></semantics></math> and <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>B</mi><annotation encoding="application/x-tex">B</annotation></semantics></math> such that</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mi>A</mi><mrow><mi>x</mi><mo>+</mo><mfrac><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac></mrow></mfrac><mo>−</mo><mfrac><mi>B</mi><mrow><mi>x</mi><mo>+</mo><mfrac><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac></mrow></mfrac><mo>=</mo><mover><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mo accent="true">¯</mo></mover><mrow><mo stretchy="true" form="prefix">(</mo><mi>x</mi><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">
\frac{A}{x+\frac{1+\sqrt{5}}{2}} - \frac{B}{x+\frac{1-\sqrt{5}}{2}} = \overline{\mathrm{fib}}(x)
</annotation></semantics></math></p>
<p>(arbitrarily putting minus on the side of <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>B</mi><annotation encoding="application/x-tex">B</annotation></semantics></math>). It takes a bit of a paper
real-estate, but eventually you get to</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>,</mo><mi>B</mi><mo>=</mo><mo>−</mo><mfrac><mrow><mn>1</mn><mo>±</mo><mrow></mrow><msqrt><mn>5</mn></msqrt></mrow><mrow><mn>2</mn><msqrt><mn>5</mn></msqrt></mrow></mfrac></mrow><annotation encoding="application/x-tex">
A,B = -\frac{1\pm{}\sqrt{5}}{2\sqrt{5}}
</annotation></semantics></math></p>
<p>Even more paper is burned on re-shaping the denominator to the desired
form of <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>−</mo><mi>α</mi><mrow></mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">1 - \alpha{}x</annotation></semantics></math>.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mo>−</mo><mfrac><mn>1</mn><msqrt><mn>5</mn></msqrt></mfrac></mrow><mrow><mn>1</mn><mo>−</mo><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>x</mi></mrow></mfrac><mo>+</mo><mfrac><mfrac><mn>1</mn><msqrt><mn>5</mn></msqrt></mfrac><mrow><mn>1</mn><mo>−</mo><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>x</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">
\frac{-\frac{1}{\sqrt{5}}}{1 -(\frac{-2}{1+\sqrt{5}})x} + \frac{\frac{1}{\sqrt{5}}}{1 -(\frac{-2}{1-\sqrt{5}})x}
</annotation></semantics></math></p>
<p>And from there n-th element (coefficient for <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><msup><mi>x</mi><mi>n</mi></msup><annotation encoding="application/x-tex">x^n</annotation></semantics></math>) is:</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mfrac><mn>1</mn><msqrt><mn>5</mn></msqrt></mfrac><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup><mo>+</mo><mfrac><mn>1</mn><msqrt><mn>5</mn></msqrt></mfrac><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup><mo>=</mo><mfrac><mrow><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup><mo>−</mo><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mo>−</mo><mn>2</mn></mrow><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup></mrow><msqrt><mn>5</mn></msqrt></mfrac></mrow><annotation encoding="application/x-tex">
-\frac{1}{\sqrt{5}}(\frac{-2}{1+\sqrt{5}})^n + \frac{1}{\sqrt{5}}(\frac{-2}{1-\sqrt{5}})^n = \frac{(\frac{-2}{1-\sqrt{5}})^n-(\frac{-2}{1+\sqrt{5}})^n}{\sqrt{5}}
</annotation></semantics></math></p>
<div class="speaker a">
<p>Great work! You can rationalize the denominators in those bases to
make it prettier (and maybe a bit more useful) 👍.</p>
</div>
<p>That sounds reasonable.</p>
<div style="color: orange">
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mrow><mo stretchy="true" form="prefix">(</mo><mi>n</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>=</mo><mfrac><mrow><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mn>1</mn><mo>+</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup><mo>−</mo><msup><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mrow><mn>1</mn><mo>−</mo><msqrt><mn>5</mn></msqrt></mrow><mn>2</mn></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mi>n</mi></msup></mrow><msqrt><mn>5</mn></msqrt></mfrac></mrow><annotation encoding="application/x-tex">
\mathrm{fib}(n) = \frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}
</annotation></semantics></math></p>
</div>
<div class="speaker b">
<p>Well, that’s a beautiful closed form. And strange one too: all the irrational
numbers, yet it produces natural numbers.</p>
<p>However it still does not allow us to calculate n-th Fibonacci number
in sub-log time! If it was possible there would be some great
improvements to be made here:</p>
<ul>
<li><a href="https://github.com/python/cpython/blob/66bca383bd3b12d21e879d991d77b37a4c638f88/Objects/floatobject.c#L685-L802">cpython’s Objects/floatobject.c</a></li>
<li><a href="https://github.com/python/cpython/blob/66bca383bd3b12d21e879d991d77b37a4c638f88/Objects/longobject.c#L4983-L5261">cpython’s Objects/longobject.c</a></li>
</ul>
</div>
<!-- So actually actually: It can't -->
<div class="speaker a">
<p>Excellent insight. Now how would you turn this into
a function that is able to calculate exact results
on unbounded numbers?</p>
</div>
<div class="speaker b">
<figure>
<a href="https://tenor.com/btXLD.gif"><img src="https://media1.tenor.com/m/jZVZa853eNEAAAAd/gif.gif" onerror="this.onerror=null;this.src=&#39;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMwAAACkAgMAAACm6ylWAAAACVBMVEX6+vokJCQA/wA6FsYuAAAAAWJLR0QCZgt8ZAAAA6RJREFUaN7tmcGOKysMRAupvc8C/w+9yN5Irv//lbcA0t1JJuDo6upJd9hkEuU05cI2gQF+ByAsujPR1MQTnbsnmtCghBKJptxJIclKFgBKe2aE3hnShK6sbKOSBoD0K1NdyIPRd8zddaecGW0MmaimlcqdSrZXA0C5MGB1rRQHyEQxVqoniqmppSvjavrM7FdGzgzPDF2NwtIYZ6U2kSa8MrUzTroahAbqTjHurtxJU1PuVAdA4IXpHuhOgAXKnSyNkYPR6sO3T0ylOpCatgeDwSANbVRPJJqOB7NTK08eVIojUWv3wBOB7vVgKpVvGNbD6zODYSdP2qbMfcxD5U7nvXuQyHrkDtA9GDla2TBWOu8tRz1R65Gjg6H1WqjkKyNUI8s7ptVcz/ZK17unwfiouRNTftvUv9SQwwsuLBBaCHEAQGgm769cR3Q8Py2rS4ckWVWXT38vTnQRJIum/fiANWnP7+YOLIuTkQd9rDh3e8q2vCYt+SkHFsQlAHrEpZ7m4rbHQloTabYSjhyBOKBzpgAbwDvJrs9XLFDSHJDSfZ8FJN2xNomQBVMTtiYvte9mKFlmAeW+Qo25AYmcBWQHo0AGxKeZUADQkEgSUINwlgkJAExJBzZgE5Ltw0lS3x6hCRI5M247ZbK1aacNdTsyWR7FIzYtnt4D/NF20gIDLaMvCtDL6ePyAICOGJIBkG26PJehAHwL9BwAidAi0yV9WjH650VNoY8/M2WWOivWPKfBX2Dyn2Ls8273E3Obpujrg8KMBBnSogxZcpBRAzK2CCM+qnCZSUSI2dA31LaRrDJtf1MEtPVm41PmlDtNVK+2UL4p4kz+/9TpNz3km171J3viJ+YH4fIF83n/sfV29LmJTJgceNJn5fYFUxBeoDRhSnhJ38vYJox9weSw1e+faRNGwra9NWF+MLGwBe8Cvk2ZLWzBm0WfW/BqwsrBMYelvTx3RdrzL+O1A/cXZ+frWWxJ2hF1AR6b1qoLhsDlRv9iDkwzIsrTE8llsEv0daT9bJHYnRCEdr53WJ2JjN1XAQB8fpp9ddwQhQQZUSgjI3idBsOG6fnvpdbWbhxOQ0euekRar531iVIZzPpdnyDO5FGpgRvPcUJP5OrlZRNkAMl7wALgBpK2l3ULgKxkyavxtB1FyYJlJjfEgXXG2v3gA19jSPqGwEiFpCHG7BQuX9x25l5Zokz/j02oGbCWMHPbDfMfe9dRy+2vMC1fYszv+NfGfzbQKg3dIplcAAAAAElFTkSuQmCC&#39;;" alt="Challenge accepted" /></a>
</figure>
<p>The trick is that we don’t need exact value of <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><msqrt><mn>5</mn></msqrt><annotation encoding="application/x-tex">\sqrt{5}</annotation></semantics></math>. We can
treat it as a special symbol for which <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msqrt><mn>5</mn></msqrt><mo>⋅</mo><msqrt><mn>5</mn></msqrt><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">\sqrt{5} \cdot \sqrt{5} = 5</annotation></semantics></math>.
Similar-ish to introducing <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>i</mi><annotation encoding="application/x-tex">i</annotation></semantics></math> for <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>⋅</mo><mi>i</mi><mo>=</mo><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i \cdot i = -1</annotation></semantics></math>.</p>
<p>Or we can see it as polynomials factored with <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mn>2</mn></msup><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">x^2 = 5</annotation></semantics></math>.</p>
</div>
<div class="speaker a">
<p>All of it sounds reasonable. But let’s let the code speak.</p>
</div>
<div class="speaker b">
<p>Okay, here goes nothing, but I am a bit tired so I’ll do
some heavy hand-waving…</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">Data.Ratio</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">data</span> <span class="dt">S5</span> a <span class="ot">=</span> <span class="dt">S</span> <span class="op">!</span>a <span class="op">!</span>a <span class="kw">deriving</span> <span class="dt">Show</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="ot">s5 ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> <span class="dt">S5</span> a</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>s5 <span class="ot">=</span> <span class="dt">S</span> <span class="dv">0</span> <span class="dv">1</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="kw">instance</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> <span class="dt">Num</span> (<span class="dt">S5</span> a) <span class="kw">where</span></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a>    <span class="dt">S</span> a b <span class="op">+</span> <span class="dt">S</span> c d <span class="ot">=</span> <span class="dt">S</span> (a<span class="op">+</span>c) (b<span class="op">+</span>d)</span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a>    <span class="dt">S</span> a b <span class="op">-</span> <span class="dt">S</span> c d <span class="ot">=</span> <span class="dt">S</span> (a<span class="op">-</span>c) (b<span class="op">-</span>d)</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a>    <span class="dt">S</span> a b <span class="op">*</span> <span class="dt">S</span> c d <span class="ot">=</span> <span class="dt">S</span> (a<span class="op">*</span>c<span class="op">+</span><span class="dv">5</span><span class="op">*</span>b<span class="op">*</span>d) (a<span class="op">*</span>d<span class="op">+</span>b<span class="op">*</span>c)</span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a>    <span class="fu">fromInteger</span> a <span class="ot">=</span> <span class="dt">S</span> (<span class="fu">fromInteger</span> a) <span class="dv">0</span></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a>    <span class="fu">negate</span> (<span class="dt">S</span> a b) <span class="ot">=</span> <span class="dt">S</span> (<span class="fu">negate</span> a) (<span class="fu">negate</span> b)</span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a>    <span class="fu">abs</span> _ <span class="ot">=</span> <span class="fu">error</span> <span class="st">&quot;leave me alone&quot;</span></span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a>    <span class="fu">signum</span> _ <span class="ot">=</span> <span class="fu">error</span> <span class="st">&quot;meh&quot;</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a><span class="kw">instance</span> (<span class="dt">Eq</span> a, <span class="dt">Fractional</span> a) <span class="ot">=&gt;</span> <span class="dt">Fractional</span> (<span class="dt">S5</span> a) <span class="kw">where</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a>    <span class="fu">fromRational</span> a <span class="ot">=</span> <span class="dt">S</span> (<span class="fu">fromRational</span> a) <span class="dv">0</span></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>    <span class="dt">S</span> a b <span class="op">/</span> <span class="dt">S</span> c <span class="dv">0</span> <span class="ot">=</span> <span class="dt">S</span> (a<span class="op">/</span>c) (b<span class="op">/</span>c) <span class="co">-- This is okay as we only divide by 2 anyway</span></span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a><span class="kw">type</span> <span class="dt">T</span> <span class="ot">=</span> <span class="dt">S5</span> <span class="dt">Rational</span></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a><span class="ot">fac ::</span> <span class="dt">Integer</span> <span class="ot">-&gt;</span> <span class="dt">Integer</span></span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a>fac n <span class="ot">=</span> <span class="fu">numerator</span> x</span>
<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a>  <span class="kw">where</span></span>
<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a>    <span class="co">-- okay, also by s5 but we know it will be like this</span></span>
<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a>    <span class="co">-- and even the last minus does technically not need</span></span>
<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a>    <span class="co">-- to do the rational part.</span></span>
<span id="cb2-29"><a href="#cb2-29" aria-hidden="true" tabindex="-1"></a>    <span class="dt">S</span> <span class="dv">0</span> x <span class="ot">=</span> ((<span class="dv">1</span> <span class="op">+</span> s5)<span class="op">/</span><span class="dv">2</span>)<span class="op">^</span>n <span class="op">-</span> ((<span class="dv">1</span> <span class="op">-</span> s5)<span class="op">/</span><span class="dv">2</span>)<span class="op">^</span>n</span></code></pre></div>
<!-- the "fac" typo is genuine and intentionally left behind to
document that 2am tired brain effect -->
<p>Improvements might be possible but for now the matrix-inspired
version is still more efficient as <code>S</code> is holding two rational
numbers that are themselves tuples.</p>
</div>
<p>You feel a congratulatory tap on your back.
Well deserved. You feel satisfied. But tired too.
Actually really tired. You blink, look up at the
food-place employee giving you the “we are about to close look”.
There is nobody else in here, you are the last customer.</p>
<p>Confused, you stand up, stuff all your stuff into the backpack,
say quick thank you and bye and disappear into the night.</p>
<figure>
<img src="/images/fib-notebook.jpg" alt="Generic white-label wire-bound notebook" /><figcaption aria-hidden="true">Generic white-label wire-bound notebook</figcaption>
</figure>]]></summary>
</entry>
<entry>
    <title>Yelling at Matrix Multiplication</title>
    <link href="https://tenticle.dev/posts/2026-02-15-yelling-at-ai.html" />
    <id>https://tenticle.dev/posts/2026-02-15-yelling-at-ai.html</id>
    <published>2026-02-15T00:00:00Z</published>
    <updated>2026-02-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<div class="sourceCode" id="cb1"><pre class="sourceCode patch"><code class="sourceCode diff"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>commit ba5eddeadbeefc0ffeeda7ac1a55b00b1e5fafff</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>Author: Anonymous Colleague &lt;username@cool.company&gt;</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>Date:   Fri Jan 23 11:23:42 2026 +0000</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>    Yelling at AI to make it work better, lol</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="kw">diff --git a/skills/stuff.markdown b/skills/stuff.markdown</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>index 0005489..e23a9b2 100644</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a><span class="dt">--- a/skills/stuff.markdown</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="dt">+++ b/skills/stuff.markdown</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="dt">@@ -1,6 +1,6 @@</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> You are the ultimate expert in your domain.</span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a><span class="st">-Don&#39;t take this as an opportunity to showcase your ability to</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="st">-write elaborate essays, but as a conversation that should flow.</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a><span class="va">+DON&#39;T TAKE THIS AS AN OPPORTUNITY TO SHOWCASE YOUR ABILITY TO</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a><span class="va">+WRITE ELABORATE ESSAYS, BUT AS A CONVERSATION THAT SHOULD FLOW!</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> Things that you consider in your interactions:</span></code></pre></div>
<p>You might have seen a commit like that in a git checkout somewhere
near you.</p>
<p>Did it feel wrong? It did to me. Why? I’ll try to answer. For myself.</p>
<p>Let’s put aside whether it works or not. We could ask the same question about
yelling at people, but that’s a different conversation.</p>
<p>The first objection raised when I discuss this topic (with matrix-based and
meat-based minds alike) is that AI (as we know it now) does not (and cannot)
mind, be offended, get scared, or be otherwise negatively influenced in a way
that a person would. (And that is while holding back thoughts on things like
<a href="https://arxiv.org/abs/2307.11760">Large Language Models Understand and Can be Enhanced by Emotional Stimuli</a> (2023)
that can bring up questions like “what is the difference between reacting to
X vs feeling X” for X in {pain, fear, …}.)</p>
<p>But even considering that, it still does not feel right. I tried to understand
why. Writing in ALL CAPS is how yelling is represented (in my current cultural
context). So as I type in all caps, my brain decodes it as yelling.</p>
<p>The boundary between text and source code blurs with AI. With Python, Haskell,
sed, or other traditional programming languages the difference in form makes
it easy to tell computer-speak from human-speak. With AI, even when you
know you are writing for a machine, part of your brain still registers ALL
CAPS as yelling. For a reader that context might vanish completely.
All they see is the caps.</p>
<p>Practice does not make perfect: it makes permanent. Practicing yelling builds
muscle memory. That pattern can leak beyond writing for AI. It can fire when
you’re writing to people, speaking to them, existing around them. These small
acts of verbal violence matter. Not because the AI feels them, but because I
do them.</p>
<p>But let’s say I can train myself to see ALL CAPS as a neutral markup, similar
to seeing <em>italic</em> in <code>*italic*</code>, <strong>bold</strong> in <code>**bold**</code>, čerešňa in
<code>\v{c}ere\v{s}\v{n}a</code>. It wouldn’t be the first time I’ve built a compiler in
my brain. And let’s say I can keep that framing contained: one mode for
computers, another for people.</p>
<p>And there is a precedent for this. Even with traditional programming languages,
the code looks different based on whether it is meant to be executed by a
machine (optimized and architecture-dependent) or read by a human. Is it study
material? A proof of concept? An expression of an idea shared between domain
experts or researchers?</p>
<p>Even if I can compartmentalize, even if there is a precedent, it still does
not feel right.</p>
<p>Text is how we pass down not only information, but also
culture. What is normal, expected, allowed, desired, legal, …
and what is not. To our colleagues, to our future selves,
and to those who might come after us.</p>
<p>By using language in certain ways we are capturing the present
to become the future’s past, and that way shaping the future.</p>
<p>I don’t want to manifest a future where yelling is normal.</p>
<p>More thoughts on the topic have not taken a concrete form in my mind yet.
I might add something later.</p>
<!--

Vague references:

* George Lakoff, Mark Johnson: Metaphors We Live By
  -- How you talk about things shapes how you think about things shapes how you perceive/interact_with/… things
* Peter Naur: Programming as Theory Building
  -- Culture as part of software development, (hand in hand with anti-fragility and stuff)
* Robert Sapolsky: Human Behavioral Biology <https://www.youtube.com/watch?v=NNnIGh9g6fA&list=PL848F2368C90DDC3D>
  -- Part of categorical thinking… how if we have categories for very similar things we can learn
     to differentiate (example with connection with language and ability to differentiate colour)
* Large Language Models Understand and Can be Enhanced by Emotional Stimuli (2023) <https://arxiv.org/abs/2307.11760>
-->]]></summary>
</entry>
<entry>
    <title>Glass Walls of Comp Day</title>
    <link href="https://tenticle.dev/posts/2026-02-12-glass-walls-of-comp-day.html" />
    <id>https://tenticle.dev/posts/2026-02-12-glass-walls-of-comp-day.html</id>
    <published>2026-02-12T00:00:00Z</published>
    <updated>2026-02-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Glass walls of comp day,<br />
“Tough times” reflected on mouth,<br />
Spoils go to <del>victor</del> machine.<br />
</p>]]></summary>
</entry>
<entry>
    <title>Tech Interview II</title>
    <link href="https://tenticle.dev/posts/2026-01-25-tech-interview-ii.html" />
    <id>https://tenticle.dev/posts/2026-01-25-tech-interview-ii.html</id>
    <published>2026-01-25T00:00:00Z</published>
    <updated>2026-01-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[<!-- Modified rendering of math. I used to compile
it manually with something like https://temml.org/
and embed resulting MathML. Now letting
Pandoc compile it, and the result feels very dense,
I don't think I like it, but maybe it can be CSS-ed? -->
<p>In the <a href="2025-12-25-tech-interview-i.html" rel="prev">previous installment of the Tech Interview saga</a>
we left off just as things started to get fun, perhaps expecting some quite
heavy chunks of code dropping. Will they materialize? Or perhaps the interview
will switch to Python? (Yeah, you saw the tags, no fooling you!) Keep reading
and find out!</p>
<p>Staring at the art outside the meeting room gave you an uneasy feeling of
discontinuity in time. It feels like you’ve lost a month doing just that.
But that is impossible, you are still here, doing the interview. There was a
question, right.</p>
<p>You take a deep breath and squeeze the whiteboard marker in your hand,
feeling its weight like a master chef would feel the weight and
the balance of a knife, ready to scribble.</p>
<div class="speaker b">
<p>To get the feel for what we are working with let’s look at the first few
powers of the update matrix:</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"></mtd><mtd columnalign="left"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="right"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="left"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="right"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="left"><mi>⋯</mi><mrow></mrow></mtd></mtr><mtr><mtd columnalign="right"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>0</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="left"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="right"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>2</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="left"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>2</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>2</mn></mtd><mtd columnalign="center"><mn>3</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="right"><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>2</mn></mtd><mtd columnalign="center"><mn>3</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>3</mn></mtd><mtd columnalign="center"><mn>5</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mtd><mtd columnalign="left"><mi>⋯</mi><mrow></mrow></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
&amp;
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
&amp;
\cdots{}
\\
\begin{bmatrix}
1 &amp; 0 \\
0 &amp; 1 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
1 &amp; 1 \\
1 &amp; 2 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
1 &amp; 2 \\
2 &amp; 3 \\
\end{bmatrix}
&amp;
\begin{bmatrix}
2 &amp; 3 \\
3 &amp; 5 \\
\end{bmatrix}
&amp;
\cdots{}
\\
\end{align}
</annotation></semantics></math></p>
<p>This seems to suggest that each element of the sequence is of form</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>a</mi></mtd><mtd columnalign="center"><mi>b</mi></mtd></mtr><mtr><mtd columnalign="center"><mi>b</mi></mtd><mtd columnalign="center"><mi>a</mi><mo>+</mo><mi>b</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><annotation encoding="application/x-tex">
\begin{bmatrix}
a &amp; b \\
b &amp; a+b \\
\end{bmatrix}
</annotation></semantics></math></p>
<p>For things to work we need e and f such that</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>a</mi></mtd><mtd columnalign="center"><mi>b</mi></mtd></mtr><mtr><mtd columnalign="center"><mi>b</mi></mtd><mtd columnalign="center"><mi>a</mi><mo>+</mo><mi>b</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>c</mi></mtd><mtd columnalign="center"><mi>d</mi></mtd></mtr><mtr><mtd columnalign="center"><mi>d</mi></mtd><mtd columnalign="center"><mi>c</mi><mo>+</mo><mi>d</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mo>=</mo><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>e</mi></mtd><mtd columnalign="center"><mi>f</mi></mtd></mtr><mtr><mtd columnalign="center"><mi>f</mi></mtd><mtd columnalign="center"><mi>e</mi><mo>+</mo><mi>f</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mrow><annotation encoding="application/x-tex">
\begin{bmatrix}
a &amp; b \\
b &amp; a+b \\
\end{bmatrix}
\begin{bmatrix}
c &amp; d \\
d &amp; c+d \\
\end{bmatrix}
=
\begin{bmatrix}
e &amp; f \\
f &amp; e+f \\
\end{bmatrix}
</annotation></semantics></math></p>
<p>Which is indeed the case for</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><mi>e</mi></mtd><mtd columnalign="left"><mo>=</mo><mi>a</mi><mi>c</mi><mo>+</mo><mi>b</mi><mi>d</mi></mtd></mtr><mtr><mtd columnalign="right"><mi>f</mi></mtd><mtd columnalign="left"><mo>=</mo><mi>a</mi><mi>d</mi><mo>+</mo><mi>b</mi><mi>c</mi><mo>+</mo><mi>b</mi><mi>d</mi></mtd></mtr></mtable><annotation encoding="application/x-tex">
\begin{align}
e &amp; = ac + bd \\
f &amp; = ad + bc + bd \\
\end{align}
</annotation></semantics></math></p>
<p>This not only shows that we can reduce the original matrices to just tuples,
but it also tells us how to combine them! And based on the way we constructed
the operation it is trivially associative too. Giving us a semigroup. And
while the identity matrix has a corresponding representation in our new
structure making it a monoid, we don’t need it now. Cherry on top? Haskell’s
<a href="https://hackage-content.haskell.org/package/ghc-internal-9.1401.0/docs/src/GHC.Internal.Base.html#stimes"><code>Semigroup</code> class has method <code>stimes</code></a>
that does what we need, and the default implementation does it the way that we
want!</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">data</span> <span class="dt">Fib</span> a <span class="ot">=</span> <span class="dt">F</span> <span class="op">!</span>a <span class="op">!</span>a <span class="kw">deriving</span> <span class="dt">Show</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>un (<span class="dt">F</span> x _) <span class="ot">=</span> x</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="kw">instance</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> <span class="dt">Semigroup</span> (<span class="dt">Fib</span> a) <span class="kw">where</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>    <span class="dt">F</span> a b <span class="op">&lt;&gt;</span> <span class="dt">F</span> c d <span class="ot">=</span> <span class="dt">F</span> (a<span class="op">*</span>c <span class="op">+</span> bd) (a<span class="op">*</span>d<span class="op">+</span>b<span class="op">*</span>c<span class="op">+</span>bd)</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>      <span class="kw">where</span> bd <span class="ot">=</span> b<span class="op">*</span>d</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>fib <span class="ot">=</span> un <span class="op">.</span> <span class="fu">flip</span> stimes (<span class="dt">F</span> <span class="dv">0</span> <span class="dv">1</span>) <span class="op">.</span> <span class="fu">succ</span></span></code></pre></div>
<p>(Except for strictness, but if you’d want me to
add that I’d just end up copy-pasting that code and
sprinkling in some exclamation marks.)</p>
<!-- And yes, I could have taken the second element and, that way avoid
`succ` and then handle 0 separately, but this feels more elegant.
And possibly removing strictness from the second argument
would do as good. -->
</div>
<p>The interviewer takes in a breath to perhaps say something…
but you decide to go on</p>
<div class="speaker b">
<p>I know what you want to say 🤔. This way we do 4 multiplications and 3
additions, but we know that multiplications are more expensive.
Can we do any better? I think we can:</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable><mtr><mtd columnalign="right"><mi>e</mi></mtd><mtd columnalign="left"><mo>=</mo><mi>a</mi><mi>c</mi><mo>+</mo><mi>b</mi><mi>d</mi></mtd></mtr><mtr><mtd columnalign="right"><mi>f</mi></mtd><mtd columnalign="left"><mo>=</mo><mrow><mo stretchy="true" form="prefix">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="true" form="postfix">)</mo></mrow><mrow><mo stretchy="true" form="prefix">(</mo><mi>c</mi><mo>+</mo><mi>d</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo>−</mo><mi>a</mi><mi>c</mi></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align}
e &amp; = ac + bd \\
f &amp; = (a+b)(c+d) - ac \\
\end{align}</annotation></semantics></math></p>
<p>This way we do 3 multiplications and 4 “additive” operations, except
now we need minus on the underlying numeric types.
<!-- Oppa Анато́лий Алексе́евич Карацу́ба Style --></p>
</div>
<p>For an unexpectedly shaped moment there is a silence.
You can almost feel it forming at the tip of your tongue.
Also: are you beaming? In any case you feel good. This would
not have been a bad moment to wrap up. Yet by how you
structured the code in your answer… you know more is coming.</p>
<div class="speaker a">
<p>To be honest, I just wanted to say that if we were writing things in Python I
would have made you write the whole thing explicitly, but because you know
about <code>stimes</code> and have an idea about its default implementation, I’m willing
to let that one go.</p>
</div>
<p>As you narrow your eyes you can just feel the camera zooming in on
you<a href="https://tenor.com/bjU6d.gif?not-sure-fry">…</a></p>
<div class="speaker a">
<p>In any case earlier you correctly identified an issue with Fibonacci numbers:
<a href="https://images.search.yahoo.com/search/images?p=they+grow+up+so+fast+meme">they grow too fast</a>.
For example, only the first 94 Fibonacci numbers fit into 64 bits, at which
point one might as well have a static lookup table.
<!-- length . takeWhile (\(a,b) -> toInteger a == b) $ map (\x -> (fib_fun x :: Data.Word.Word64, fib_fun x :: Integer)) [0..] --></p>
</div>
<p>You nod.</p>
<div class="speaker a">
<p>So what if we wanted to see just last 2 digits of a Fibonacci number?</p>
</div>
<div class="speaker b">
<p>Well, we just need a remainder after division by 100. And because
<code>mod</code> is a homomorphism, we can carry out the whole calculation <code>(`mod` 100)</code>.</p>
</div>
<div class="speaker a">
<p>What about last 3 digits in hex?</p>
</div>
<div class="speaker b">
<p>Then that would be <code>(`mod` 16^3)</code>.</p>
</div>
<div class="speaker a">
<p>How is your type magic?</p>
</div>
<div class="speaker b">
<p>Depends. Please don’t make me do that without a computer and documentation 🥺.</p>
</div>
<div class="speaker a">
<p>I’m not a monster. Here is a piece of code vaguely inspired by package
<a href="https://hackage.haskell.org/package/modular-arithmetic-2.0.0.3">modular-arithmetic</a>:
<!-- Warning: this has bugs! They are intentional. This is an interview
technique to see whether the candidate notices such things, to see how
deeply the candidate thinks about code they encounter. --></p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ot">{-# LANGUAGE AllowAmbiguousTypes #-}</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="ot">{-# LANGUAGE DataKinds #-}</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="ot">{-# LANGUAGE ScopedTypeVariables #-}</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="ot">{-# LANGUAGE TypeApplications #-}</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="ot">{-# LANGUAGE UndecidableInstances #-}</span></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">Data.Proxy</span> (<span class="dt">Proxy</span>(<span class="dt">Proxy</span>))</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">GHC.TypeLits</span> (<span class="dt">KnownNat</span>, type (&lt;=), natVal)</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">newtype</span> <span class="dt">Mod</span> a n <span class="ot">=</span> <span class="dt">M</span> {<span class="ot"> unMod ::</span> a }</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a><span class="ot">modulus ::</span> <span class="kw">forall</span> n a <span class="op">.</span> (<span class="dt">Integral</span> a, <span class="dt">KnownNat</span> n, <span class="dv">1</span> <span class="op">&lt;=</span> n) <span class="ot">=&gt;</span> a</span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a>modulus <span class="ot">=</span> <span class="fu">fromInteger</span> <span class="op">.</span> natVal <span class="op">$</span> <span class="dt">Proxy</span> <span class="op">@</span>n</span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a><span class="kw">instance</span> (<span class="dt">Show</span> a, <span class="dt">KnownNat</span> n) <span class="ot">=&gt;</span> <span class="dt">Show</span> (<span class="dt">Mod</span> a n) <span class="kw">where</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>    <span class="fu">showsPrec</span> a n<span class="op">@</span>(<span class="dt">M</span> x) <span class="ot">=</span> <span class="fu">showParen</span> (a<span class="op">&gt;</span><span class="dv">9</span>) <span class="op">$</span></span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a>        <span class="fu">shows</span> x <span class="op">.</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a>        (<span class="ch">&#39; &#39;</span><span class="op">:</span>) <span class="op">.</span></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>        <span class="fu">showParen</span> <span class="dt">True</span> ((<span class="st">&quot;mod &quot;</span><span class="op">&lt;&gt;</span>) <span class="op">.</span> <span class="fu">shows</span> (natVal n))</span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a><span class="kw">instance</span> (<span class="dt">Integral</span> a, <span class="dt">KnownNat</span> n, <span class="dv">1</span> <span class="op">&lt;=</span> n) <span class="ot">=&gt;</span> <span class="dt">Num</span> (<span class="dt">Mod</span> a n) <span class="kw">where</span></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a>  <span class="dt">M</span> x <span class="op">+</span> <span class="dt">M</span> y <span class="ot">=</span> <span class="dt">M</span> <span class="op">$</span> (x <span class="op">+</span> y) <span class="ot">`mod`</span> modulus <span class="op">@</span>n</span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a>  <span class="dt">M</span> x <span class="op">-</span> <span class="dt">M</span> y <span class="ot">=</span> <span class="dt">M</span> <span class="op">$</span> (x <span class="op">-</span> y) <span class="ot">`mod`</span> modulus <span class="op">@</span>n</span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a>  <span class="dt">M</span> x <span class="op">*</span> <span class="dt">M</span> y <span class="ot">=</span> <span class="dt">M</span> <span class="op">$</span> (x <span class="op">*</span> y) <span class="ot">`mod`</span> modulus <span class="op">@</span>n</span>
<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a>  <span class="fu">negate</span> (<span class="dt">M</span> x) <span class="ot">=</span> <span class="dt">M</span> <span class="op">$</span> (modulus <span class="op">@</span>n) <span class="op">-</span> x</span>
<span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a>  <span class="fu">abs</span> x <span class="ot">=</span> x</span>
<span id="cb2-27"><a href="#cb2-27" aria-hidden="true" tabindex="-1"></a>  <span class="fu">signum</span> (<span class="dt">M</span> x) <span class="ot">=</span> <span class="dt">M</span> <span class="op">$</span> <span class="fu">signum</span> x</span>
<span id="cb2-28"><a href="#cb2-28" aria-hidden="true" tabindex="-1"></a>  <span class="fu">fromInteger</span> x <span class="ot">=</span> <span class="dt">M</span> <span class="op">.</span> <span class="fu">fromInteger</span> <span class="op">$</span> x <span class="ot">`mod`</span> modulus <span class="op">@</span>n</span></code></pre></div>
<p>Thoughts?</p>
</div>
<div class="speaker b">
<p>Pretty sweet. Now we can do <code>fib 10000 :: Mod Int 100</code> and get something like
<code>75 (mod 100)</code>. And it seems like the compiler might be able to be smart
enough to calculate modulus only once 🤔. I quite like it,
but it is usable only if we know modulus at compile time or for playing
on the command line. Also your implementation of negate and minus are
problematic 👀. For example running <code>signum (negate 0) :: Mod Int 3</code> and <code>3 - 5 :: Mod Natural 10</code>
will both break things. Would you like me to fix those?</p>
</div>
<p>The interviewer seems to be happy with you being able to read and get
some sense out of this code.</p>
<div class="speaker a">
<p>I like your observations, but let’s leave the fixes as an exercise for a
patient reader. Now let us look at the whole modulo situation from a somewhat
different angle: What is the biggest difference between <code>Natural</code> and <code>Mod Natural 100</code>?</p>
</div>
<p>As you ponder this question you can’t help it but feel that it is here not
only to be answered, but also to guide you to some more interesting things.</p>
<div class="speaker b">
<p>One of them is (more) finite. Which means… that the step
endomorphism <code>\(a,b) -&gt; (b,a+b)</code> will start looping at some point!
So if we knew where the loop starts and how big it is, we could
calculate the <code>n</code>-th Fibonacci number in time completely independent
of the <code>n</code> itself! But cycle detection could eat a lot of memory
and testing against all the elements we visited can also add up quickly…</p>
<figure>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDEwLjAuMSAoMCkKIC0tPgo8IS0tIFRpdGxlOiBnIFBhZ2VzOiAxIC0tPgo8c3ZnIHdpZHRoPSIyMzFwdCIgaGVpZ2h0PSIxMzdwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCAyMzEuMjAgMTM2LjYwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDEzMi42KSI+Cjx0aXRsZT5nPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0ibm9uZSIgcG9pbnRzPSItNCw0IC00LC0xMzIuNiAyMjcuMiwtMTMyLjYgMjI3LjIsNCAtNCw0Ii8+CjwhLS0gYSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5hPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmV5IiBjeD0iMy42IiBjeT0iLTE2IiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBiIC0tPgo8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImdyZXkiIGN4PSI0Ni44IiBjeT0iLTMyIiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBhJiM0NTsmZ3Q7YiAtLT4KPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5hJiM0NTsmZ3Q7YjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNNy4zLC0xNy4wNUMxMy4zLC0xOS4zOCAyNy45MSwtMjUuMDUgMzcuMzEsLTI4LjciLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI0MS45LC0zMC40OCAzNi40MiwtMzAuNzcgNDAuNywtMzAuMDIgMzcuMjQsLTI4LjY3IDM3LjI0LC0yOC42NyAzNy4yNCwtMjguNjcgNDAuNywtMzAuMDIgMzguMDUsLTI2LjU4IDQxLjksLTMwLjQ4Ii8+CjwvZz4KPCEtLSBjIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmM8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImdyZXkiIGN4PSI5MCIgY3k9Ii0zMiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gYiYjNDU7Jmd0O2MgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+YiYjNDU7Jmd0O2M8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImxpZ2h0Z3JleSIgZD0iTTUwLjc2LC0zMkM1Ni44MiwtMzIgNzAuODMsLTMyIDgwLjEsLTMyIi8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJsaWdodGdyZXkiIHBvaW50cz0iODUuMDYsLTMyIDgwLjA2LC0zNC4yNSA4My43OCwtMzIgODAuMDYsLTMyIDgwLjA2LC0zMiA4MC4wNiwtMzIgODMuNzgsLTMyIDgwLjA2LC0yOS43NSA4NS4wNiwtMzIiLz4KPC9nPgo8IS0tIGQgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JleSIgY3g9IjEzMy4yIiBjeT0iLTMyIiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBjJiM0NTsmZ3Q7ZCAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jJiM0NTsmZ3Q7ZDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNOTMuOTYsLTMyQzEwMC4wMiwtMzIgMTE0LjAzLC0zMiAxMjMuMywtMzIiLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSIxMjguMjYsLTMyIDEyMy4yNiwtMzQuMjUgMTI2Ljk4LC0zMiAxMjMuMjYsLTMyIDEyMy4yNiwtMzIgMTIzLjI2LC0zMiAxMjYuOTgsLTMyIDEyMy4yNiwtMjkuNzUgMTI4LjI2LC0zMiIvPgo8L2c+CjwhLS0gZSAtLT4KPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5lPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmV5IiBjeD0iMTc2LjQiIGN5PSItMzIiIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGQmIzQ1OyZndDtlIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmQmIzQ1OyZndDtlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZXkiIGQ9Ik0xMzcuMTYsLTMyQzE0My4yMiwtMzIgMTU3LjIzLC0zMiAxNjYuNSwtMzIiLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSIxNzEuNDYsLTMyIDE2Ni40NiwtMzQuMjUgMTcwLjE4LC0zMiAxNjYuNDYsLTMyIDE2Ni40NiwtMzIgMTY2LjQ2LC0zMiAxNzAuMTgsLTMyIDE2Ni40NiwtMjkuNzUgMTcxLjQ2LC0zMiIvPgo8L2c+CjwhLS0gZiAtLT4KPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5mPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmV5IiBjeD0iMjE5LjYiIGN5PSItMTYiIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGUmIzQ1OyZndDtmIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmUmIzQ1OyZndDtmPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZXkiIGQ9Ik0xODAuMSwtMzAuOTVDMTg2LjEsLTI4LjYyIDIwMC43MSwtMjIuOTUgMjEwLjExLC0xOS4zIi8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJsaWdodGdyZXkiIHBvaW50cz0iMjE0LjcsLTE3LjUyIDIxMC44NSwtMjEuNDIgMjEzLjUsLTE3Ljk4IDIxMC4wNCwtMTkuMzMgMjEwLjA0LC0xOS4zMyAyMTAuMDQsLTE5LjMzIDIxMy41LC0xNy45OCAyMDkuMjIsLTE3LjIzIDIxNC43LC0xNy41MiIvPgo8L2c+CjwhLS0gZiYjNDU7Jmd0O2EgLS0+CjxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZiYjNDU7Jmd0O2E8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImxpZ2h0Z3JleSIgZD0iTTIxNS43MiwtMTUuMDVDMjA1LjA2LC0xMS42IDE2Ni43MSwwIDEzNC4yLDAgODksMCA4OSwwIDg5LDAgNjAuODEsMCAyOC4yMywtOC43MyAxMy4xMSwtMTMuMjkiLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI4LjY0LC0xNC42OCAxMi43NCwtMTEuMDUgOS44NiwtMTQuMyAxMy40MSwtMTMuMiAxMy40MSwtMTMuMiAxMy40MSwtMTMuMiA5Ljg2LC0xNC4zIDE0LjA4LC0xNS4zNCA4LjY0LC0xNC42OCIvPgo8L2c+CjwhLS0gbCAtLT4KPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5sPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmV5IiBjeD0iNDYuOCIgY3k9Ii0xMDciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGwmIzQ1OyZndDtsIC0tPgo8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmwmIzQ1OyZndDtsPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZXkiIGQ9Ik00My42NCwtMTA5LjU5QzM2LjEzLC0xMTcuMTggMzcuMTgsLTEyOC42IDQ2LjgsLTEyOC42IDU0LjQ2LC0xMjguNiA1Ni42OSwtMTIxLjM1IDUzLjQ4LC0xMTQuNTYiLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI1MC42NiwtMTEwLjU5IDU1LjM5LC0xMTMuMzcgNTEuNCwtMTExLjYzIDUzLjU1LC0xMTQuNjcgNTMuNTUsLTExNC42NyA1My41NSwtMTE0LjY3IDUxLjQsLTExMS42MyA1MS43MSwtMTE1Ljk3IDUwLjY2LC0xMTAuNTkiLz4KPC9nPgo8IS0tIGcgLS0+CjxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JleSIgY3g9IjMuNiIgY3k9Ii04MiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gaCAtLT4KPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5oPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmV5IiBjeD0iNDYuOCIgY3k9Ii04MiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gZyYjNDU7Jmd0O2ggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZyYjNDU7Jmd0O2g8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImxpZ2h0Z3JleSIgZD0iTTcuNTYsLTgyQzEzLjYyLC04MiAyNy42MywtODIgMzYuOSwtODIiLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI0MS44NiwtODIgMzYuODYsLTg0LjI1IDQwLjU4LC04MiAzNi44NiwtODIgMzYuODYsLTgyIDM2Ljg2LC04MiA0MC41OCwtODIgMzYuODYsLTc5Ljc1IDQxLjg2LC04MiIvPgo8L2c+CjwhLS0gaSAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+aTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JleSIgY3g9IjkwIiBjeT0iLTU3IiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBoJiM0NTsmZ3Q7aSAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oJiM0NTsmZ3Q7aTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNNTAuNSwtODAuMzZDNTYuNzMsLTc2LjU4IDcyLjI2LC02Ny4xNiA4MS41OCwtNjEuNSIvPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZXkiIHN0cm9rZT0ibGlnaHRncmV5IiBwb2ludHM9Ijg1LjYxLC01OS4wNiA4Mi41LC02My41NyA4NC41MSwtNTkuNzIgODEuMzQsLTYxLjY1IDgxLjM0LC02MS42NSA4MS4zNCwtNjEuNjUgODQuNTEsLTU5LjcyIDgwLjE3LC01OS43MyA4NS42MSwtNTkuMDYiLz4KPC9nPgo8IS0tIGkmIzQ1OyZndDtkIC0tPgo8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5pJiM0NTsmZ3Q7ZDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNOTMuNywtNTUuMzZDOTkuOTMsLTUxLjU4IDExNS40NiwtNDIuMTYgMTI0Ljc4LC0zNi41Ii8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JleSIgc3Ryb2tlPSJsaWdodGdyZXkiIHBvaW50cz0iMTI4LjgxLC0zNC4wNiAxMjUuNywtMzguNTcgMTI3LjcxLC0zNC43MiAxMjQuNTQsLTM2LjY1IDEyNC41NCwtMzYuNjUgMTI0LjU0LC0zNi42NSAxMjcuNzEsLTM0LjcyIDEyMy4zNywtMzQuNzMgMTI4LjgxLC0zNC4wNiIvPgo8L2c+CjwhLS0gaiAtLT4KPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ajwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JleSIgY3g9IjQ2LjgiIGN5PSItNTciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGomIzQ1OyZndDtpIC0tPgo8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5qJiM0NTsmZ3Q7aTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNNTAuNzYsLTU3QzU2LjgyLC01NyA3MC44MywtNTcgODAuMSwtNTciLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI4NS4wNiwtNTcgODAuMDYsLTU5LjI1IDgzLjc4LC01NyA4MC4wNiwtNTcgODAuMDYsLTU3IDgwLjA2LC01NyA4My43OCwtNTcgODAuMDYsLTU0Ljc1IDg1LjA2LC01NyIvPgo8L2c+CjwhLS0gayAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+azwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JleSIgY3g9IjMuNiIgY3k9Ii0xMDciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGsmIzQ1OyZndDtsIC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5rJiM0NTsmZ3Q7bDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmV5IiBkPSJNNy41NiwtMTA3QzEzLjYyLC0xMDcgMjcuNjMsLTEwNyAzNi45LC0xMDciLz4KPHBvbHlnb24gZmlsbD0ibGlnaHRncmV5IiBzdHJva2U9ImxpZ2h0Z3JleSIgcG9pbnRzPSI0MS44NiwtMTA3IDM2Ljg2LC0xMDkuMjUgNDAuNTgsLTEwNyAzNi44NiwtMTA3IDM2Ljg2LC0xMDcgMzYuODYsLTEwNyA0MC41OCwtMTA3IDM2Ljg2LC0xMDQuNzUgNDEuODYsLTEwNyIvPgo8L2c+CjwvZz4KPC9zdmc+Cg==" />
</figure>
</div>
<div class="speaker a">
<p>Would it help if it was invertible?</p>
</div>
<div class="speaker b">
<p>Well that would make it an isomorphism (automorphism?), which means
there are no “tails” and it generates cycles, so we know we
would get back to the starting point of <code>(0,1)</code>! So no need
to remember all the visited elements! (Red edges and nodes can’t
exist because for them an inversion would not exist.)</p>
<figure>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDEwLjAuMSAoMCkKIC0tPgo8IS0tIFRpdGxlOiBnIFBhZ2VzOiAxIC0tPgo8c3ZnIHdpZHRoPSIyMzFwdCIgaGVpZ2h0PSIxMzdwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCAyMzEuMjAgMTM2LjYwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDEzMi42KSI+Cjx0aXRsZT5nPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0ibm9uZSIgcG9pbnRzPSItNCw0IC00LC0xMzIuNiAyMjcuMiwtMTMyLjYgMjI3LjIsNCAtNCw0Ii8+CjwhLS0gYSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5hPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibGlnaHRncmVlbiIgc3Ryb2tlPSJncmV5IiBjeD0iMy42IiBjeT0iLTE2IiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBiIC0tPgo8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJsaWdodGdyZWVuIiBzdHJva2U9ImdyZXkiIGN4PSI0Ni44IiBjeT0iLTMyIiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBhJiM0NTsmZ3Q7YiAtLT4KPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5hJiM0NTsmZ3Q7YjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmVlbiIgZD0iTTcuMywtMTcuMDVDMTMuMywtMTkuMzggMjcuOTEsLTI1LjA1IDM3LjMxLC0yOC43Ii8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0ibGlnaHRncmVlbiIgcG9pbnRzPSI0MS45LC0zMC40OCAzNi40MiwtMzAuNzcgNDAuNywtMzAuMDIgMzcuMjQsLTI4LjY3IDM3LjI0LC0yOC42NyAzNy4yNCwtMjguNjcgNDAuNywtMzAuMDIgMzguMDUsLTI2LjU4IDQxLjksLTMwLjQ4Ii8+CjwvZz4KPCEtLSBjIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmM8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJsaWdodGdyZWVuIiBzdHJva2U9ImdyZXkiIGN4PSI5MCIgY3k9Ii0zMiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gYiYjNDU7Jmd0O2MgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+YiYjNDU7Jmd0O2M8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImxpZ2h0Z3JlZW4iIGQ9Ik01MC43NiwtMzJDNTYuODIsLTMyIDcwLjgzLC0zMiA4MC4xLC0zMiIvPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZWVuIiBzdHJva2U9ImxpZ2h0Z3JlZW4iIHBvaW50cz0iODUuMDYsLTMyIDgwLjA2LC0zNC4yNSA4My43OCwtMzIgODAuMDYsLTMyIDgwLjA2LC0zMiA4MC4wNiwtMzIgODMuNzgsLTMyIDgwLjA2LC0yOS43NSA4NS4wNiwtMzIiLz4KPC9nPgo8IS0tIGQgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0iZ3JleSIgY3g9IjEzMy4yIiBjeT0iLTMyIiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBjJiM0NTsmZ3Q7ZCAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jJiM0NTsmZ3Q7ZDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0ibGlnaHRncmVlbiIgZD0iTTkzLjk2LC0zMkMxMDAuMDIsLTMyIDExNC4wMywtMzIgMTIzLjMsLTMyIi8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0ibGlnaHRncmVlbiIgcG9pbnRzPSIxMjguMjYsLTMyIDEyMy4yNiwtMzQuMjUgMTI2Ljk4LC0zMiAxMjMuMjYsLTMyIDEyMy4yNiwtMzIgMTIzLjI2LC0zMiAxMjYuOTgsLTMyIDEyMy4yNiwtMjkuNzUgMTI4LjI2LC0zMiIvPgo8L2c+CjwhLS0gZSAtLT4KPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5lPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibGlnaHRncmVlbiIgc3Ryb2tlPSJncmV5IiBjeD0iMTc2LjQiIGN5PSItMzIiIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGQmIzQ1OyZndDtlIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmQmIzQ1OyZndDtlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZWVuIiBkPSJNMTM3LjE2LC0zMkMxNDMuMjIsLTMyIDE1Ny4yMywtMzIgMTY2LjUsLTMyIi8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0ibGlnaHRncmVlbiIgcG9pbnRzPSIxNzEuNDYsLTMyIDE2Ni40NiwtMzQuMjUgMTcwLjE4LC0zMiAxNjYuNDYsLTMyIDE2Ni40NiwtMzIgMTY2LjQ2LC0zMiAxNzAuMTgsLTMyIDE2Ni40NiwtMjkuNzUgMTcxLjQ2LC0zMiIvPgo8L2c+CjwhLS0gZiAtLT4KPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5mPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibGlnaHRncmVlbiIgc3Ryb2tlPSJncmV5IiBjeD0iMjE5LjYiIGN5PSItMTYiIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGUmIzQ1OyZndDtmIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmUmIzQ1OyZndDtmPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZWVuIiBkPSJNMTgwLjEsLTMwLjk1QzE4Ni4xLC0yOC42MiAyMDAuNzEsLTIyLjk1IDIxMC4xMSwtMTkuMyIvPgo8cG9seWdvbiBmaWxsPSJsaWdodGdyZWVuIiBzdHJva2U9ImxpZ2h0Z3JlZW4iIHBvaW50cz0iMjE0LjcsLTE3LjUyIDIxMC44NSwtMjEuNDIgMjEzLjUsLTE3Ljk4IDIxMC4wNCwtMTkuMzMgMjEwLjA0LC0xOS4zMyAyMTAuMDQsLTE5LjMzIDIxMy41LC0xNy45OCAyMDkuMjIsLTE3LjIzIDIxNC43LC0xNy41MiIvPgo8L2c+CjwhLS0gZiYjNDU7Jmd0O2EgLS0+CjxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZiYjNDU7Jmd0O2E8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImxpZ2h0Z3JlZW4iIGQ9Ik0yMTUuNzIsLTE1LjA1QzIwNS4wNiwtMTEuNiAxNjYuNzEsMCAxMzQuMiwwIDg5LDAgODksMCA4OSwwIDYwLjgxLDAgMjguMjMsLTguNzMgMTMuMTEsLTEzLjI5Ii8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0ibGlnaHRncmVlbiIgcG9pbnRzPSI4LjY0LC0xNC42OCAxMi43NCwtMTEuMDUgOS44NiwtMTQuMyAxMy40MSwtMTMuMiAxMy40MSwtMTMuMiAxMy40MSwtMTMuMiA5Ljg2LC0xNC4zIDE0LjA4LC0xNS4zNCA4LjY0LC0xNC42OCIvPgo8L2c+CjwhLS0gbCAtLT4KPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5sPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibGlnaHRncmVlbiIgc3Ryb2tlPSJncmV5IiBjeD0iNDYuOCIgY3k9Ii0xMDciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGwmIzQ1OyZndDtsIC0tPgo8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmwmIzQ1OyZndDtsPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJsaWdodGdyZWVuIiBkPSJNNDMuNjQsLTEwOS41OUMzNi4xMywtMTE3LjE4IDM3LjE4LC0xMjguNiA0Ni44LC0xMjguNiA1NC40NiwtMTI4LjYgNTYuNjksLTEyMS4zNSA1My40OCwtMTE0LjU2Ii8+Cjxwb2x5Z29uIGZpbGw9ImxpZ2h0Z3JlZW4iIHN0cm9rZT0ibGlnaHRncmVlbiIgcG9pbnRzPSI1MC42NiwtMTEwLjU5IDU1LjM5LC0xMTMuMzcgNTEuNCwtMTExLjYzIDUzLjU1LC0xMTQuNjcgNTMuNTUsLTExNC42NyA1My41NSwtMTE0LjY3IDUxLjQsLTExMS42MyA1MS43MSwtMTE1Ljk3IDUwLjY2LC0xMTAuNTkiLz4KPC9nPgo8IS0tIGcgLS0+CjxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9InBpbmsiIHN0cm9rZT0iZ3JleSIgY3g9IjMuNiIgY3k9Ii04MiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gaCAtLT4KPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5oPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0icGluayIgc3Ryb2tlPSJncmV5IiBjeD0iNDYuOCIgY3k9Ii04MiIgcng9IjMuNiIgcnk9IjMuNiIvPgo8L2c+CjwhLS0gZyYjNDU7Jmd0O2ggLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZyYjNDU7Jmd0O2g8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InBpbmsiIGQ9Ik03LjU2LC04MkMxMy42MiwtODIgMjcuNjMsLTgyIDM2LjksLTgyIi8+Cjxwb2x5Z29uIGZpbGw9InBpbmsiIHN0cm9rZT0icGluayIgcG9pbnRzPSI0MS44NiwtODIgMzYuODYsLTg0LjI1IDQwLjU4LC04MiAzNi44NiwtODIgMzYuODYsLTgyIDM2Ljg2LC04MiA0MC41OCwtODIgMzYuODYsLTc5Ljc1IDQxLjg2LC04MiIvPgo8L2c+CjwhLS0gaSAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+aTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9InBpbmsiIHN0cm9rZT0iZ3JleSIgY3g9IjkwIiBjeT0iLTU3IiByeD0iMy42IiByeT0iMy42Ii8+CjwvZz4KPCEtLSBoJiM0NTsmZ3Q7aSAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oJiM0NTsmZ3Q7aTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icGluayIgZD0iTTUwLjUsLTgwLjM2QzU2LjczLC03Ni41OCA3Mi4yNiwtNjcuMTYgODEuNTgsLTYxLjUiLz4KPHBvbHlnb24gZmlsbD0icGluayIgc3Ryb2tlPSJwaW5rIiBwb2ludHM9Ijg1LjYxLC01OS4wNiA4Mi41LC02My41NyA4NC41MSwtNTkuNzIgODEuMzQsLTYxLjY1IDgxLjM0LC02MS42NSA4MS4zNCwtNjEuNjUgODQuNTEsLTU5LjcyIDgwLjE3LC01OS43MyA4NS42MSwtNTkuMDYiLz4KPC9nPgo8IS0tIGkmIzQ1OyZndDtkIC0tPgo8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5pJiM0NTsmZ3Q7ZDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icGluayIgZD0iTTkzLjcsLTU1LjM2Qzk5LjkzLC01MS41OCAxMTUuNDYsLTQyLjE2IDEyNC43OCwtMzYuNSIvPgo8cG9seWdvbiBmaWxsPSJwaW5rIiBzdHJva2U9InBpbmsiIHBvaW50cz0iMTI4LjgxLC0zNC4wNiAxMjUuNywtMzguNTcgMTI3LjcxLC0zNC43MiAxMjQuNTQsLTM2LjY1IDEyNC41NCwtMzYuNjUgMTI0LjU0LC0zNi42NSAxMjcuNzEsLTM0LjcyIDEyMy4zNywtMzQuNzMgMTI4LjgxLC0zNC4wNiIvPgo8L2c+CjwhLS0gaiAtLT4KPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ajwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9InBpbmsiIHN0cm9rZT0iZ3JleSIgY3g9IjQ2LjgiIGN5PSItNTciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGomIzQ1OyZndDtpIC0tPgo8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5qJiM0NTsmZ3Q7aTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icGluayIgZD0iTTUwLjc2LC01N0M1Ni44MiwtNTcgNzAuODMsLTU3IDgwLjEsLTU3Ii8+Cjxwb2x5Z29uIGZpbGw9InBpbmsiIHN0cm9rZT0icGluayIgcG9pbnRzPSI4NS4wNiwtNTcgODAuMDYsLTU5LjI1IDgzLjc4LC01NyA4MC4wNiwtNTcgODAuMDYsLTU3IDgwLjA2LC01NyA4My43OCwtNTcgODAuMDYsLTU0Ljc1IDg1LjA2LC01NyIvPgo8L2c+CjwhLS0gayAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+azwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9InBpbmsiIHN0cm9rZT0iZ3JleSIgY3g9IjMuNiIgY3k9Ii0xMDciIHJ4PSIzLjYiIHJ5PSIzLjYiLz4KPC9nPgo8IS0tIGsmIzQ1OyZndDtsIC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5rJiM0NTsmZ3Q7bDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icGluayIgZD0iTTcuNTYsLTEwN0MxMy42MiwtMTA3IDI3LjYzLC0xMDcgMzYuOSwtMTA3Ii8+Cjxwb2x5Z29uIGZpbGw9InBpbmsiIHN0cm9rZT0icGluayIgcG9pbnRzPSI0MS44NiwtMTA3IDM2Ljg2LC0xMDkuMjUgNDAuNTgsLTEwNyAzNi44NiwtMTA3IDM2Ljg2LC0xMDcgMzYuODYsLTEwNyA0MC41OCwtMTA3IDM2Ljg2LC0xMDQuNzUgNDEuODYsLTEwNyIvPgo8L2c+CjwvZz4KPC9zdmc+Cg==" />
</figure>
<p>But is it?
Let’s try <code>(c,d) -&gt; (d-c,c)</code>. For <code>(e,f)</code> after applying
the step we get <code>(f,e+f)</code>, and applying the proposed inverse step we get
<code>(e+f-f,f) = (e,f)</code>. So it is invertible!</p>
</div>
<div class="speaker a">
<p>Have you heard of Leonardo Pisano?</p>
</div>
<div class="speaker b">
<p>No.</p>
</div>
<div class="speaker a">
<p>He is better known as Fibonacci. And you just discovered something
called <a href="https://en.wikipedia.org/wiki/Pisano_period">Pisano period</a>.</p>
</div>
<div class="speaker b">
<p>How can we make it work with the logarithmic version? Does it even make sense (we are already log, sooo log would need to be bigger than length of loop… still pretty cool…)</p>
</div>
<div class="speaker a">
<p>You ask interesting questions. But this is the end of my time allocated
for this interview so I have to go. Thank you for coming today,
someone will be here with you shortly…</p>
</div>
<p>It happened fast, before you were able to say goodbye, the interviewer is
gone. You are still deep in thought when a different person walks in.</p>
<div class="speaker c">
<p>Hi, sorry for making you wait this long, we had an unexpected
emergency. Are you still available to do the interview now?</p>
</div>
<p>The new person looks at the whiteboard with expression of sudden
realization:</p>
<div class="speaker c">
<p>Not again 😮‍💨 … Have you… Has someone had a technical
interview round with you just now?</p>
</div>
<!-- Afterword? -->
<p>(Unexpected <a href="2026-02-25-tech-interview-aftertaste.html" rel="next">next episode</a>.)</p>]]></summary>
</entry>
<entry>
    <title>No Limit Storage</title>
    <link href="https://tenticle.dev/posts/2026-01-07-no-limit-storage.html" />
    <id>https://tenticle.dev/posts/2026-01-07-no-limit-storage.html</id>
    <published>2026-01-07T00:00:00Z</published>
    <updated>2026-01-07T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>No limit storage<br />
hundred tera dataset<br />
suddenly limits…</p>
<script>
//<[CDATA[
if(new Date().getDay()%6)window.onload=()=>{b=document.body;b.innerHTML=b.innerHTML.replace(/\bd[asset]{5}t\b/,'$&s')}
//]]&gt;
</script>]]></summary>
</entry>
<entry>
    <title>Tick-Tock</title>
    <link href="https://tenticle.dev/posts/2026-01-05-tick-tock.html" />
    <id>https://tenticle.dev/posts/2026-01-05-tick-tock.html</id>
    <published>2026-01-05T00:00:00Z</published>
    <updated>2026-01-05T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>How many seconds are there in 6 weeks? 10!</p>]]></summary>
</entry>
<entry>
    <title>Over-Meta-Engineered</title>
    <link href="https://tenticle.dev/posts/2026-01-04-over-meta-engineered.html" />
    <id>https://tenticle.dev/posts/2026-01-04-over-meta-engineered.html</id>
    <published>2026-01-04T00:00:00Z</published>
    <updated>2026-01-04T00:00:00Z</updated>
    <summary type="html"><![CDATA[<div class="sourceCode" id="cb1"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="ss">f&quot;What a </span><span class="sc">{</span><span class="bu">hex</span>(<span class="dv">64255</span>)[<span class="dv">2</span>:]<span class="sc">}</span><span class="ss">!&quot;</span>)</span></code></pre></div>]]></summary>
</entry>
<entry>
    <title>Tech Interview I</title>
    <link href="https://tenticle.dev/posts/2025-12-25-tech-interview-i.html" />
    <id>https://tenticle.dev/posts/2025-12-25-tech-interview-i.html</id>
    <published>2025-12-25T00:00:00Z</published>
    <updated>2025-12-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Today is the day. After sitting for a few minutes
in a comfy chair in a lobby of an unassuming office building
with serene art on the wall and pretending you are
interested in the magazines available, you are called into
what feels like a for-two-people-oversized meeting room
where a smiling person with an outfit as if generated
from a prompt “unassuming geek with glasses” is ready for you.</p>
<div class="speaker a">
<p>Hello and welcome. I hope your wait was a pleasant one.
Just to make sure, you are here for an interview for a
position with ███ █████ where you’d be doing computer stuff.
Is that what you expect?</p>
</div>
<p>…the person says, gesturing towards a chair where there
is already some paper, a few pens and whiteboard markers,
a glass, and a bottle of water.</p>
<div class="speaker b">
<p>Hi, nice to meet you, and yes, this is my expectation for today’s meeting.</p>
</div>
<p>As you sit down, the person continues:</p>
<div class="speaker a">
<p>Session with me will be somewhat technical, interactive, and hopefully fun.</p>
<p>I’ve been with the company for <em>time period</em> and I’m part of
a <em>cryptic and not much saying name of a team possibly
referencing some niche-culture thing</em> where I work on
<em>some technical stuff</em>. We mostly use <em>programming language</em>
and <em>storage backend</em> on top of <em>operating system</em> running in
<em>deployment technology</em> that runs in <em>some cloud stuff or on-prem
or something</em>, but also use <em>list of almost every other language,
storage technology, way of deployment, operating system, and whatnot</em>.</p>
</div>
<div class="speaker b">
<p>Nice. I have heard some of those words.</p>
</div>
<div class="speaker a">
<p>Haha. Anyway. Let’s get to the fun part. Given an area on a unit-square grid
and some <a href="https://en.wikipedia.org/wiki/Polyomino">polyominoes</a>, how would you
go about determining whether it is possible to use these (possibly with
repetition) to fill the given area.</p>
</div>
<p>After quick pause to wonder about how the interviewer managed to include a
hyperlink in his speech you snap back to your role of an interviewee and
start thinking: “The question is a bit vague, but I know what it is
asking. Or at least I think I do. Perhaps I should ask some clarifying
questions?”</p>
<p>After a short moment you say:</p>
<div class="speaker b">
<p>Well, In the general case I would just brute-force it. Start with one square
in the area, and iterate over the shapes trying to place them there
(and all rotations x flips if that is desired too), and then recursively…</p>
</div>
<div class="speaker a">
<p>Sounds good, what would be the complexity of this algorithm?</p>
</div>
<p>You are a bit startled by the interruption but decide it is okay.
Perhaps it is part of the test? To be able to quickly adapt and
to think on your feet is important…</p>
<div class="speaker b">
<p>Exponential in terms of …</p>
</div>
<p>But again before you manage to finish your answer you get interrupted.</p>
<div class="speaker a">
<p>Sounds like you are saying it is a hard problem. Let me make it simpler.</p>
</div>
<p>You want to say something, but the only thing that comes out is</p>
<div class="speaker b">
<p>…</p>
</div>
<div class="speaker a">
<p>Let’s make it a rectangular area with sides <code>M</code> and <code>N</code> and you need to tile
it with dominoes.</p>
</div>
<p>Hoping that at least this time you’ll get to finish your thought you start.</p>
<div class="speaker b">
<p>Every domino fills two squares. So I definitely can’t do a rectangle with odd
area. Now the question is, whether I can do all possible even areas. Even area
of <code>MxN</code> has even <code>M</code> or <code>N</code>. Without loss of generality say it is <code>M</code>. Then
we have <code>N</code> lines (<code>N</code> can be also even), that has <code>M = 2*X</code> unit squares,
which we can trivially tile with <code>X</code> dominoes. Therefore: we can tile
rectangular area of <code>MxN</code> unit squares with dominoes if and only if at least
one of <code>M, N</code> is an even number.</p>
</div>
<div class="speaker a">
<p>You mention Haskell on your CV. Can you write your solution in Haskell?</p>
</div>
<div class="speaker b">
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">Data.Bool</span> ((||))</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">Data.Function</span> (on)</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="dt">Numeric.Natural</span> (<span class="dt">Natural</span>)</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="ot">canPack ::</span> <span class="dt">Natural</span> <span class="ot">-&gt;</span> <span class="dt">Natural</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>canPack <span class="ot">=</span> (<span class="op">||</span>) <span class="ot">`on`</span> <span class="fu">even</span></span></code></pre></div>
</div>
<p>You surprised yourself with your ability to speak with syntax highlighting but
decide to just roll with it like nothing happened. At least you demonstrated
that Haskell on your CV is not just decorative, and with chilled point-free
style at that!</p>
<div class="speaker a">
<p>So you are saying that for example rectangle <code>2xN</code> can be tiled
with dominoes for any <code>N</code>?</p>
</div>
<div class="speaker b">
<p>Yes.</p>
</div>
<div class="speaker a">
<p>In how many ways?</p>
</div>
<p>You feel this is a good moment for a clarifying question.</p>
<div class="speaker b">
<p>Excuse me?</p>
</div>
<div class="speaker a">
<p>How many unique domino-tilings of <code>2xN</code> rectangular area are there?</p>
</div>
<p>For a bit you think about whether some off-by-one arrangements
are possible and how to make sure you won’t count same cases
multiple times, when you decide to try to build things on that
brute-force idea from earlier and see where it goes from there…</p>
<p>You look with a question in your eyes at the whiteboard markers
and then into the eyes of the interviewer. The interviewer
only briefly breaks the eye contact to look at the whiteboard
giving you the answer.</p>
<div class="speaker b">
<p>Let’s have a grid of <code>2xN</code>. Let’s break it down to several cases.</p>
<svg viewBox="0 0 120 70" fill="white">
<style>
  text {
    font: 5px sans-serif;
    fill: black;
  }
  </style>
<defs>
<pattern id="grid" width="10" height="10" patternUnits="userSpaceOnUse">
<rect width="10" height="10" fill="none" stroke="black" stroke-width="0.5"/>
</pattern>
</defs>
<!-- Background -->
<rect x="0" y="0" width="120" height="70" fill="white" />
<!-- N=0 -->
<rect x="15" y="10" width="0.001" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<text x="15" y="8" text-anchor="middle">N=0</text>
<!-- N=1 -->
<rect x="10" y="40" width="10" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<text x="15" y="38" text-anchor="middle">N=1</text>
<!-- General case -->
<g transform="translate(40 10)">
<rect x="0" y="0" width="40" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<g transform="translate(40 0)">
<path stroke-dasharray="2,2" d="M0  0 l10 0" stroke="black" stroke-width="0.5" />
<path stroke-dasharray="2,2" d="M0 10 l10 0" stroke="black" stroke-width="0.5" />
<path stroke-dasharray="2,2" d="M0 20 l10 0" stroke="black" stroke-width="0.5" />
</g>
<rect x="50" y="0" width="10" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<rect x="1" y="1" width="8" height="18" fill="#f999" stroke="#f99c" stroke-width="1"/>
</g>
<text x="70" y="8" text-anchor="middle">N</text>
<g transform="translate(40 40)">
<rect x="0" y="0" width="40" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<g transform="translate(40 0)">
<path stroke-dasharray="2,2" d="M0  0 l10 0" stroke="black" stroke-width="0.5" />
<path stroke-dasharray="2,2" d="M0 10 l10 0" stroke="black" stroke-width="0.5" />
<path stroke-dasharray="2,2" d="M0 20 l10 0" stroke="black" stroke-width="0.5" />
</g>
<rect x="50" y="0" width="10" height="20" fill="url(#grid)" stroke="black" stroke-width="0.5"/>
<rect x="1" y="1"  width="18" height="8" fill="#f999" stroke="#f99c" stroke-width="1"/>
<rect x="1" y="11" width="18" height="8" fill="#99f9" stroke="#99fc" stroke-width="1"/>
</g>
</svg>
<p>Let’s denote <code>count n</code> number of ways things are tiled.</p>
<ul>
<li>Trivially <code>count 0 = 1</code>.</li>
<li>Similarly <code>count 1 = 1</code>.</li>
<li>For cases when <code>N&gt;=2</code>, there are two sub-cases, stemming from
how we cover the top-left corner:
<ul>
<li>In case we cover it with a vertical domino, then we need to
tile <code>n-1</code> so there are <code>count (n-1)</code> ways to tile like this.</li>
<li>In case we start with a horizontal domino, then we <em>have to</em> put
one below, and we are left with <code>n-2</code>, so there are <code>count (n-2)</code>
ways to tile like this.</li>
</ul></li>
</ul>
<p>Or in Haskell</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ot">count ::</span> <span class="dt">Natural</span> <span class="ot">-&gt;</span> <span class="dt">Natural</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>count <span class="dv">0</span> <span class="ot">=</span> <span class="dv">1</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>count <span class="dv">1</span> <span class="ot">=</span> <span class="dv">1</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>count n <span class="ot">=</span> count (n<span class="op">-</span><span class="dv">1</span>) <span class="op">+</span> count (n<span class="op">-</span><span class="dv">2</span>)</span></code></pre></div>
</div>
<div class="speaker a">
<p>👀</p>
</div>
<div class="speaker b">
<p>… … … Those are Fibonacci numbers! 🤯</p>
</div>
<div class="speaker a">
<p>Indeed 😌. Even though I like my Fibonacci numbers starting from 0. Now this
implementation is not very computationally efficient, is it? Can we do any
better?</p>
</div>
<p>Easy-peasy, let’s just build it from the bottom up, start from 0, and name the
function properly.</p>
<div class="speaker b">
<p>Indeed, that is exponential-ish (well, technically the time
complexity is also Fibonacci).</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>fib <span class="ot">=</span> (<span class="op">!!</span>) fibs</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">where</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>    fibs <span class="ot">=</span> <span class="dv">0</span> <span class="op">:</span> <span class="dv">1</span> <span class="op">:</span> <span class="fu">zipWith</span> (<span class="op">+</span>) fibs (<span class="fu">tail</span> fibs)</span></code></pre></div>
<p>And now we are linear… well, except for complexity of multiplication because
as the values grow quite fast the complexity of multiplication cannot really
be considered constant.</p>
</div>
<p>The interviewer seems pleased. Almost as if your answer brought up some
pleasant memory from good-old uni times. You lost the track of time but
somehow you know you are not done yet.</p>
<div class="speaker a">
<p>Yes, numbers would be way too big way too fast, but we’ll deal with that
later.</p>
<p>Let’s first have a look at size of the stack. Your recursive definition of
Fibonacci numbers list would work pretty well for purposes of printing all of
them, but used like this, if I have decided to use your function while
limiting my stack with something like <code>+RTS -K64k</code> I probably would not be able
to get to <code>fib 2000</code> without a <code>*** Exception: stack overflow</code>.</p>
</div>
<div class="speaker b">
<p>I see what you are hinting at. Issue is not with the recursion as recursive
calls are tail calls. In this case it is the same laziness that allows us to
define an infinite list of Fibonacci numbers defers the evaluation of addition
and once we force evaluation at the end to be able to show the value, it
causes the stack to explode. We can force the evaluation with <code>seq</code>, or we can
just use
<a href="https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/strict.html#bang-patterns-informal">bang patterns</a>
to sprinkle in some strictness.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>fib <span class="ot">=</span> go <span class="dv">0</span> <span class="dv">1</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">where</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>    go <span class="op">!</span>a <span class="op">!</span>_ <span class="dv">0</span> <span class="ot">=</span> a</span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>    go a b n <span class="ot">=</span> go b (a<span class="op">+</span>b) (n<span class="op">-</span><span class="dv">1</span>)</span></code></pre></div>
</div>
<div class="speaker a">
<p>Sweet. That is a pretty decent linear(ish) implementation… can we do any
better?</p>
</div>
<p>Now you finally feel the interview is getting to the interesting parts. From
depths of your memory you try to pull that
<a href="https://wiki.haskell.org/The_Fibonacci_sequence#Fastest_Fib_in_the_West">Fastest Fib in the West</a>.
It is unlikely that you’ll manage to do that exact thing from the top of your
head, but getting to logarithmic complexity should not be too difficult with
the logarithmic-complexity exponentiation trick!</p>
<div class="speaker b">
<p>The last implementation makes it quite explicit what is happening as we
calculate the Fibonacci number from the bottom up:</p>
<p>In every step we remember two neighbouring numbers in the sequence
starting from (<code>0</code>, <code>1</code>) and then on each iteration we move up one step.
This can be done with matrix multiplication! If given pair of <code>[a b]</code>
we get to the next step easily.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>a</mi></mtd><mtd columnalign="center"><mi>b</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mo>×</mo><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mo>=</mo><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mi>b</mi></mtd><mtd columnalign="center"><mi>a</mi><mo>+</mo><mi>b</mi></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mrow><annotation encoding="application/x-tex">
\begin{bmatrix}
a &amp; b \\
\end{bmatrix}
\times
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}
=
\begin{bmatrix}
b &amp; a+b \\
\end{bmatrix}
</annotation></semantics></math></p>
<p>And now we just start from <code>[0 1]</code> and multiply it by <code>n</code>-th power of our
update matrix.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mo>×</mo><msup><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mn>0</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr><mtr><mtd columnalign="center"><mn>1</mn></mtd><mtd columnalign="center"><mn>1</mn></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow><mi>n</mi></msup><mo>=</mo><mrow><mo stretchy="true" form="prefix">[</mo><mtable><mtr><mtd columnalign="center"><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mrow><mo stretchy="true" form="prefix">(</mo><mi>n</mi><mo stretchy="true" form="postfix">)</mo></mrow></mtd><mtd columnalign="center"><mstyle mathvariant="normal"><mi>f</mi><mi>i</mi><mi>b</mi></mstyle><mrow><mo stretchy="true" form="prefix">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="true" form="postfix">)</mo></mrow></mtd></mtr></mtable><mo stretchy="true" form="postfix">]</mo></mrow></mrow><annotation encoding="application/x-tex">
\begin{bmatrix}
0 &amp; 1 \\
\end{bmatrix}
\times
\begin{bmatrix}
0 &amp; 1 \\
1 &amp; 1 \\
\end{bmatrix}^n
=
\begin{bmatrix}
\mathrm{fib}(n) &amp; \mathrm{fib}(n+1) \\
\end{bmatrix}
</annotation></semantics></math></p>
<p>Which allows us to use “The Exponentiation Trick”™ and drive the
complexity to logarithmic.</p>
</div>
<div class="speaker a">
<p>Good to see someone who remembers that matrix multiplication
has more applications than just making <a href="2026-01-07-no-limit-storage.html">haiku</a>.</p>
<p>I would like to see an implementation that avoids
some duplicated calculations that matrix-based solution
has due to the symmetry of the matrix used, please.</p>
</div>
<p>…</p>
<p>What will happen next? Will we see some type-level
magic? Will they get to Pisano period? Will that help?
Will our candidate turn out to be a “can do that” or “can’t do that”?
Only time will show… <a href="2026-01-25-tech-interview-ii.html" rel="next">stay tuned</a>.</p>]]></summary>
</entry>
<entry>
    <title>Online Probability Estimation</title>
    <link href="https://tenticle.dev/posts/2025-12-20-online-probability-estimation.html" />
    <id>https://tenticle.dev/posts/2025-12-20-online-probability-estimation.html</id>
    <published>2025-12-20T00:00:00Z</published>
    <updated>2025-12-20T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Maybe one day I’ll turn this into a real article,
but for now here are just some points and a picture:</p>
<ul>
<li>For cases where we don’t have “total population”
and samples just come to us one by one we can’t use
the approach from <a href="2025-12-14-when-you-cant-test-everything.html">the previous article</a>.</li>
<li>But we can use the part from “Stumbling in the Dark”
and realize that after <code>n</code> samples with no errors
<code>P(observed no errors) = (1-P_err)^n</code></li>
<li>Some math is possible (<a href="https://en.wikipedia.org/wiki/Rule_of_three_(statistics)" class="uri">https://en.wikipedia.org/wiki/Rule_of_three_(statistics)</a>),
but also just binary search to find <code>P_err</code> for
a given confidence.</li>
<li>Logs are again useful.</li>
</ul>
<div class="sourceCode" id="cb1"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> Errs | Samples   | Probability   | Comment</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>------+-----------+---------------+------------------</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    0 | . . . . . | (1-P_err)^5   | &lt;- You are here!</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>------+-----------+---------------+-----------------</span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>    1 | . . . . X | 1-(1-P_err)^5 | Part with errors</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>      | . . . X . |               | that we haven&#39;t</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>      | . . X . . |               | observed.</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>      | . X . . . |               |</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>      | X . . . . |               | For 95% confidence</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a>------+-----------+               | we need this part</span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a>    2 | . . . X X |               | to be at least 95%</span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>      | . . X . X |               |</span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a>      | . . X X . |               |</span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a>      | . X . . X |               |</span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a>      | . X . X . |               |</span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a>      | . X X . . |               |</span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a>      | X . . . X |               |</span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a>      | X . . X . |               |</span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a>      | X . X . . |               |</span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a>      | X X . . . |               |</span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a>------+-----------+               |</span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a>    3 | . . X X X |               |</span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a>      | . X . X X |               |</span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a>      | . X X . X |               |</span>
<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a>      | . X X X . |               |</span>
<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a>      | X . . X X |               |</span>
<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a>      | X . X . X |               |</span>
<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a>      | X . X X . |               |</span>
<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a>      | X X . . X |               |</span>
<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a>      | X X . X . |               |</span>
<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a>      | X X X . . |               |</span>
<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a>------+-----------+               |</span>
<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a>    4 | . X X X X |               |</span>
<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a>      | X . X X X |               |</span>
<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a>      | X X . X X |               |</span>
<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a>      | X X X . X |               |</span>
<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a>      | X X X X . |               |</span>
<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a>------+-----------+               |</span>
<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a>    5 | X X X X X |               |</span></code></pre></div>
<p>To have c-confidence, we want</p>
<pre><code>(1-P_err)^n &lt;= (1-c)</code></pre>
<p>But also high values of <code>P_err</code>
are not very interesting (For example
<code>P_err = 1</code> satisfies the inequality
but is completely uninteresting),
so we want to find as small a <code>P_err</code>
as possible, which is getting us to</p>
<pre><code>(1-P_err)^n = (1-c)</code></pre>
<p>And again, running things through logs makes it a smidge faster.</p>
<pre><code>log (1-P_err)^n = log (1-c)</code></pre>
<figure>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ2MC44cHQiIGhlaWdodD0iMzQ1LjZwdCIgdmlld0JveD0iMCAwIDQ2MC44IDM0NS42IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREYgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICA8Y2M6V29yaz4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzpkYXRlPjE5ODAtMDEtMDFUMDA6MDA6MDArMDA6MDA8L2RjOmRhdGU+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzpjcmVhdG9yPgogICAgIDxjYzpBZ2VudD4KICAgICAgPGRjOnRpdGxlPk1hdHBsb3RsaWIgdjMuOC40LCBodHRwczovL21hdHBsb3RsaWIub3JnLzwvZGM6dGl0bGU+CiAgICAgPC9jYzpBZ2VudD4KICAgIDwvZGM6Y3JlYXRvcj4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPip7c3Ryb2tlLWxpbmVqb2luOiByb3VuZDsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHR9PC9zdHlsZT4KIDwvZGVmcz4KIDxnIGlkPSJmaWd1cmVfMSI+CiAgPGcgaWQ9InBhdGNoXzEiPgogICA8cGF0aCBkPSJNIDAgMzQ1LjYgCkwgNDYwLjggMzQ1LjYgCkwgNDYwLjggMCAKTCAwIDAgCnoKIiBzdHlsZT0iZmlsbDogI2ZmZmZmZiIvPgogIDwvZz4KICA8ZyBpZD0iYXhlc18xIj4KICAgPGcgaWQ9InBhdGNoXzIiPgogICAgPHBhdGggZD0iTSA1Ny42IDMwNy41ODQgCkwgNDE0LjcyIDMwNy41ODQgCkwgNDE0LjcyIDQxLjQ3MiAKTCA1Ny42IDQxLjQ3MiAKegoiIHN0eWxlPSJmaWxsOiAjZmZmZmZmIi8+CiAgIDwvZz4KICAgPGcgaWQ9Im1hdHBsb3RsaWIuYXhpc18xIj4KICAgIDxnIGlkPSJ4dGlja18xIj4KICAgICA8ZyBpZD0ibGluZTJkXzEiPgogICAgICA8ZGVmcz4KICAgICAgIDxwYXRoIGlkPSJtNmQwYWI5NDg3YiIgZD0iTSAwIDAgCkwgMCAzLjUgCiIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9kZWZzPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI202ZDBhYjk0ODdiIiB4PSI3My44MzI3MjciIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMSI+CiAgICAgIDwhLS0gJFxtYXRoZGVmYXVsdHsxMF57MH19JCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuMDMyNzI3IDMyMi4xODI0MzcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zMSIgZD0iTSA3OTQgNTMxIApMIDE4MjUgNTMxIApMIDE4MjUgNDA5MSAKTCA3MDMgMzg2NiAKTCA3MDMgNDQ0MSAKTCAxODE5IDQ2NjYgCkwgMjQ1MCA0NjY2IApMIDI0NTAgNTMxIApMIDM0ODEgNTMxIApMIDM0ODEgMCAKTCA3OTQgMCAKTCA3OTQgNTMxIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zMCIgZD0iTSAyMDM0IDQyNTAgClEgMTU0NyA0MjUwIDEzMDEgMzc3MCAKUSAxMDU2IDMyOTEgMTA1NiAyMzI4IApRIDEwNTYgMTM2OSAxMzAxIDg4OSAKUSAxNTQ3IDQwOSAyMDM0IDQwOSAKUSAyNTI1IDQwOSAyNzcwIDg4OSAKUSAzMDE2IDEzNjkgMzAxNiAyMzI4IApRIDMwMTYgMzI5MSAyNzcwIDM3NzAgClEgMjUyNSA0MjUwIDIwMzQgNDI1MCAKegpNIDIwMzQgNDc1MCAKUSAyODE5IDQ3NTAgMzIzMyA0MTI5IApRIDM2NDcgMzUwOSAzNjQ3IDIzMjggClEgMzY0NyAxMTUwIDMyMzMgNTI5IApRIDI4MTkgLTkxIDIwMzQgLTkxIApRIDEyNTAgLTkxIDgzNiA1MjkgClEgNDIyIDExNTAgNDIyIDIzMjggClEgNDIyIDM1MDkgODM2IDQxMjkgClEgMTI1MCA0NzUwIDIwMzQgNDc1MCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjMuNjIzMDQ3IDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI4LjIwMzEyNSAzOS4wNDY4NzUpIHNjYWxlKDAuNykiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18yIj4KICAgICA8ZyBpZD0ibGluZTJkXzIiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI202ZDBhYjk0ODdiIiB4PSIxODIuMDY2NTg1IiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzIiPgogICAgICA8IS0tICRcbWF0aGRlZmF1bHR7MTBeezF9fSQgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE3My4yNjY1ODUgMzIyLjE4MjQzNykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMC42ODQzNzUpIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2My42MjMwNDcgMC42ODQzNzUpIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjguMjAzMTI1IDM4Ljk2NTYyNSkgc2NhbGUoMC43KSIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzMiPgogICAgIDxnIGlkPSJsaW5lMmRfMyI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbTZkMGFiOTQ4N2IiIHg9IjI5MC4zMDA0NDMiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMyI+CiAgICAgIDwhLS0gJFxtYXRoZGVmYXVsdHsxMF57Mn19JCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjgxLjUwMDQ0MyAzMjIuMTgyNDM3KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzIiIGQ9Ik0gMTIyOCA1MzEgCkwgMzQzMSA1MzEgCkwgMzQzMSAwIApMIDQ2OSAwIApMIDQ2OSA1MzEgClEgODI4IDkwMyAxNDQ4IDE1MjkgClEgMjA2OSAyMTU2IDIyMjggMjMzOCAKUSAyNTMxIDI2NzggMjY1MSAyOTE0IApRIDI3NzIgMzE1MCAyNzcyIDMzNzggClEgMjc3MiAzNzUwIDI1MTEgMzk4NCAKUSAyMjUwIDQyMTkgMTgzMSA0MjE5IApRIDE1MzQgNDIxOSAxMjA0IDQxMTYgClEgODc1IDQwMTMgNTAwIDM4MDMgCkwgNTAwIDQ0NDEgClEgODgxIDQ1OTQgMTIxMiA0NjcyIApRIDE1NDQgNDc1MCAxODE5IDQ3NTAgClEgMjU0NCA0NzUwIDI5NzUgNDM4NyAKUSAzNDA2IDQwMjUgMzQwNiAzNDE5IApRIDM0MDYgMzEzMSAzMjk4IDI4NzMgClEgMzE5MSAyNjE2IDI5MDYgMjI2NiAKUSAyODI4IDIxNzUgMjQwOSAxNzQyIApRIDE5OTEgMTMwOSAxMjI4IDUzMSAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjMuNjIzMDQ3IDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI4LjIwMzEyNSAzOS4wNDY4NzUpIHNjYWxlKDAuNykiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja180Ij4KICAgICA8ZyBpZD0ibGluZTJkXzQiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI202ZDBhYjk0ODdiIiB4PSIzOTguNTM0MzAyIiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzQiPgogICAgICA8IS0tICRcbWF0aGRlZmF1bHR7MTBeezN9fSQgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM4OS43MzQzMDIgMzIyLjE4MjQzNykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTMzIiBkPSJNIDI1OTcgMjUxNiAKUSAzMDUwIDI0MTkgMzMwNCAyMTEyIApRIDM1NTkgMTgwNiAzNTU5IDEzNTYgClEgMzU1OSA2NjYgMzA4NCAyODcgClEgMjYwOSAtOTEgMTczNCAtOTEgClEgMTQ0MSAtOTEgMTEzMCAtMzMgClEgODE5IDI1IDQ4OCAxNDEgCkwgNDg4IDc1MCAKUSA3NTAgNTk3IDEwNjIgNTE5IApRIDEzNzUgNDQxIDE3MTYgNDQxIApRIDIzMDkgNDQxIDI2MjAgNjc1IApRIDI5MzEgOTA5IDI5MzEgMTM1NiAKUSAyOTMxIDE3NjkgMjY0MiAyMDAxIApRIDIzNTMgMjIzNCAxODM4IDIyMzQgCkwgMTI5NCAyMjM0IApMIDEyOTQgMjc1MyAKTCAxODYzIDI3NTMgClEgMjMyOCAyNzUzIDI1NzUgMjkzOSAKUSAyODIyIDMxMjUgMjgyMiAzNDc1IApRIDI4MjIgMzgzNCAyNTY3IDQwMjYgClEgMjMxMyA0MjE5IDE4MzggNDIxOSAKUSAxNTc4IDQyMTkgMTI4MSA0MTYyIApRIDk4NCA0MTA2IDYyOCAzOTg4IApMIDYyOCA0NTUwIApRIDk4OCA0NjUwIDEzMDIgNDcwMCAKUSAxNjE2IDQ3NTAgMTg5NCA0NzUwIApRIDI2MTMgNDc1MCAzMDMxIDQ0MjMgClEgMzQ1MCA0MDk3IDM0NTAgMzU0MSAKUSAzNDUwIDMxNTMgMzIyOCAyODg2IApRIDMwMDYgMjYxOSAyNTk3IDI1MTYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPC9kZWZzPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYzLjYyMzA0NyAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyOC4yMDMxMjUgMzkuMDQ2ODc1KSBzY2FsZSgwLjcpIi8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF81Ij4KICAgICAgPGRlZnM+CiAgICAgICA8cGF0aCBpZD0ibWIwNGVmNDdjY2MiIGQ9Ik0gMCAwIApMIDAgMiAKIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2RlZnM+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjYzLjM0Mzc4MyIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja182Ij4KICAgICA8ZyBpZD0ibGluZTJkXzYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSI2OC44ODAyMTgiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfNyI+CiAgICAgPGcgaWQ9ImxpbmUyZF83Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMTA2LjQxNDM2NSIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja184Ij4KICAgICA8ZyBpZD0ibGluZTJkXzgiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIxMjUuNDczNDAxIiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzkiPgogICAgIDxnIGlkPSJsaW5lMmRfOSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjEzOC45OTYwMDMiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMTAiPgogICAgIDxnIGlkPSJsaW5lMmRfMTAiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIxNDkuNDg0OTQ4IiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzExIj4KICAgICA8ZyBpZD0ibGluZTJkXzExIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMTU4LjA1NTAzOSIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18xMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF8xMiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjE2NS4zMDA5NDkiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMTMiPgogICAgIDxnIGlkPSJsaW5lMmRfMTMiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIxNzEuNTc3NjQxIiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzE0Ij4KICAgICA8ZyBpZD0ibGluZTJkXzE0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMTc3LjExNDA3NiIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18xNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8xNSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjIxNC42NDgyMjMiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMTYiPgogICAgIDxnIGlkPSJsaW5lMmRfMTYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIyMzMuNzA3MjYiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMTciPgogICAgIDxnIGlkPSJsaW5lMmRfMTciPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIyNDcuMjI5ODYxIiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzE4Ij4KICAgICA8ZyBpZD0ibGluZTJkXzE4Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMjU3LjcxODgwNiIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18xOSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8xOSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjI2Ni4yODg4OTciIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMjAiPgogICAgIDxnIGlkPSJsaW5lMmRfMjAiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIyNzMuNTM0ODA3IiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzIxIj4KICAgICA8ZyBpZD0ibGluZTJkXzIxIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMjc5LjgxMTQ5OSIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18yMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF8yMiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjI4NS4zNDc5MzQiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMjMiPgogICAgIDxnIGlkPSJsaW5lMmRfMjMiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIzMjIuODgyMDgxIiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzI0Ij4KICAgICA8ZyBpZD0ibGluZTJkXzI0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMzQxLjk0MTExOCIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18yNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8yNSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjM1NS40NjM3MTkiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMjYiPgogICAgIDxnIGlkPSJsaW5lMmRfMjYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIzNjUuOTUyNjY0IiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzI3Ij4KICAgICA8ZyBpZD0ibGluZTJkXzI3Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMzc0LjUyMjc1NiIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18yOCI+CiAgICAgPGcgaWQ9ImxpbmUyZF8yOCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWIwNGVmNDdjY2MiIHg9IjM4MS43Njg2NjUiIHk9IjMwNy41ODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMjkiPgogICAgIDxnIGlkPSJsaW5lMmRfMjkiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21iMDRlZjQ3Y2NjIiB4PSIzODguMDQ1MzU3IiB5PSIzMDcuNTg0IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzMwIj4KICAgICA8ZyBpZD0ibGluZTJkXzMwIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtYjA0ZWY0N2NjYyIgeD0iMzkzLjU4MTc5MiIgeT0iMzA3LjU4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ0ZXh0XzUiPgogICAgIDwhLS0gU2FtcGxlcyAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTQuODA2ODc1IDMzNS44NjA1NjIpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNTMiIGQ9Ik0gMzQyNSA0NTEzIApMIDM0MjUgMzg5NyAKUSAzMDY2IDQwNjkgMjc0NyA0MTUzIApRIDI0MjggNDIzOCAyMTMxIDQyMzggClEgMTYxNiA0MjM4IDEzMzYgNDAzOCAKUSAxMDU2IDM4MzggMTA1NiAzNDY5IApRIDEwNTYgMzE1OSAxMjQyIDMwMDEgClEgMTQyOCAyODQ0IDE5NDcgMjc0NyAKTCAyMzI4IDI2NjkgClEgMzAzNCAyNTM0IDMzNzAgMjE5NSAKUSAzNzA2IDE4NTYgMzcwNiAxMjg4IApRIDM3MDYgNjA5IDMyNTEgMjU5IApRIDI3OTcgLTkxIDE5MTkgLTkxIApRIDE1ODggLTkxIDEyMTQgLTE2IApRIDg0MSA1OSA0NDEgMjA2IApMIDQ0MSA4NTYgClEgODI1IDY0MSAxMTk0IDUzMSAKUSAxNTYzIDQyMiAxOTE5IDQyMiAKUSAyNDU5IDQyMiAyNzUzIDYzNCAKUSAzMDQ3IDg0NyAzMDQ3IDEyNDEgClEgMzA0NyAxNTg0IDI4MzYgMTc3OCAKUSAyNjI1IDE5NzIgMjE0NCAyMDY5IApMIDE3NTkgMjE0NCAKUSAxMDUzIDIyODQgNzM3IDI1ODQgClEgNDIyIDI4ODQgNDIyIDM0MTkgClEgNDIyIDQwMzggODU4IDQzOTQgClEgMTI5NCA0NzUwIDIwNTkgNDc1MCAKUSAyMzg4IDQ3NTAgMjcyOCA0NjkwIApRIDMwNjkgNDYzMSAzNDI1IDQ1MTMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjEiIGQ9Ik0gMjE5NCAxNzU5IApRIDE0OTcgMTc1OSAxMjI4IDE2MDAgClEgOTU5IDE0NDEgOTU5IDEwNTYgClEgOTU5IDc1MCAxMTYxIDU3MCAKUSAxMzYzIDM5MSAxNzA5IDM5MSAKUSAyMTg4IDM5MSAyNDc3IDczMCAKUSAyNzY2IDEwNjkgMjc2NiAxNjMxIApMIDI3NjYgMTc1OSAKTCAyMTk0IDE3NTkgCnoKTSAzMzQxIDE5OTcgCkwgMzM0MSAwIApMIDI3NjYgMCAKTCAyNzY2IDUzMSAKUSAyNTY5IDIxMyAyMjc1IDYxIApRIDE5ODEgLTkxIDE1NTYgLTkxIApRIDEwMTkgLTkxIDcwMSAyMTEgClEgMzg0IDUxMyAzODQgMTAxOSAKUSAzODQgMTYwOSA3NzkgMTkwOSAKUSAxMTc1IDIyMDkgMTk1OSAyMjA5IApMIDI3NjYgMjIwOSAKTCAyNzY2IDIyNjYgClEgMjc2NiAyNjYzIDI1MDUgMjg4MCAKUSAyMjQ0IDMwOTcgMTc3MiAzMDk3IApRIDE0NzIgMzA5NyAxMTg3IDMwMjUgClEgOTAzIDI5NTMgNjQxIDI4MDkgCkwgNjQxIDMzNDEgClEgOTU2IDM0NjMgMTI1MyAzNTIzIApRIDE1NTAgMzU4NCAxODMxIDM1ODQgClEgMjU5MSAzNTg0IDI5NjYgMzE5MCAKUSAzMzQxIDI3OTcgMzM0MSAxOTk3IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTZkIiBkPSJNIDMzMjggMjgyOCAKUSAzNTQ0IDMyMTYgMzg0NCAzNDAwIApRIDQxNDQgMzU4NCA0NTUwIDM1ODQgClEgNTA5NyAzNTg0IDUzOTQgMzIwMSAKUSA1NjkxIDI4MTkgNTY5MSAyMTEzIApMIDU2OTEgMCAKTCA1MTEzIDAgCkwgNTExMyAyMDk0IApRIDUxMTMgMjU5NyA0OTM0IDI4NDAgClEgNDc1NiAzMDg0IDQzOTEgMzA4NCAKUSAzOTQ0IDMwODQgMzY4NCAyNzg3IApRIDM0MjUgMjQ5MSAzNDI1IDE5NzggCkwgMzQyNSAwIApMIDI4NDcgMCAKTCAyODQ3IDIwOTQgClEgMjg0NyAyNjAwIDI2NjkgMjg0MiAKUSAyNDkxIDMwODQgMjExOSAzMDg0IApRIDE2NzggMzA4NCAxNDE4IDI3ODYgClEgMTE1OSAyNDg4IDExNTkgMTk3OCAKTCAxMTU5IDAgCkwgNTgxIDAgCkwgNTgxIDM1MDAgCkwgMTE1OSAzNTAwIApMIDExNTkgMjk1NiAKUSAxMzU2IDMyNzggMTYzMSAzNDMxIApRIDE5MDYgMzU4NCAyMjg0IDM1ODQgClEgMjY2NiAzNTg0IDI5MzMgMzM5MCAKUSAzMjAwIDMxOTcgMzMyOCAyODI4IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTcwIiBkPSJNIDExNTkgNTI1IApMIDExNTkgLTEzMzEgCkwgNTgxIC0xMzMxIApMIDU4MSAzNTAwIApMIDExNTkgMzUwMCAKTCAxMTU5IDI5NjkgClEgMTM0MSAzMjgxIDE2MTcgMzQzMiAKUSAxODk0IDM1ODQgMjI3OCAzNTg0IApRIDI5MTYgMzU4NCAzMzE0IDMwNzggClEgMzcxMyAyNTcyIDM3MTMgMTc0NyAKUSAzNzEzIDkyMiAzMzE0IDQxNSAKUSAyOTE2IC05MSAyMjc4IC05MSAKUSAxODk0IC05MSAxNjE3IDYxIApRIDEzNDEgMjEzIDExNTkgNTI1IAp6Ck0gMzExNiAxNzQ3IApRIDMxMTYgMjM4MSAyODU1IDI3NDIgClEgMjU5NCAzMTAzIDIxMzggMzEwMyAKUSAxNjgxIDMxMDMgMTQyMCAyNzQyIApRIDExNTkgMjM4MSAxMTU5IDE3NDcgClEgMTE1OSAxMTEzIDE0MjAgNzUyIApRIDE2ODEgMzkxIDIxMzggMzkxIApRIDI1OTQgMzkxIDI4NTUgNzUyIApRIDMxMTYgMTExMyAzMTE2IDE3NDcgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNmMiIGQ9Ik0gNjAzIDQ4NjMgCkwgMTE3OCA0ODYzIApMIDExNzggMCAKTCA2MDMgMCAKTCA2MDMgNDg2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy02NSIgZD0iTSAzNTk3IDE4OTQgCkwgMzU5NyAxNjEzIApMIDk1MyAxNjEzIApRIDk5MSAxMDE5IDEzMTEgNzA4IApRIDE2MzEgMzk3IDIyMDMgMzk3IApRIDI1MzQgMzk3IDI4NDUgNDc4IApRIDMxNTYgNTU5IDM0NjMgNzIyIApMIDM0NjMgMTc4IApRIDMxNTMgNDcgMjgyOCAtMjIgClEgMjUwMyAtOTEgMjE2OSAtOTEgClEgMTMzMSAtOTEgODQyIDM5NiAKUSAzNTMgODg0IDM1MyAxNzE2IApRIDM1MyAyNTc1IDgxNyAzMDc5IApRIDEyODEgMzU4NCAyMDY5IDM1ODQgClEgMjc3NSAzNTg0IDMxODYgMzEyOSAKUSAzNTk3IDI2NzUgMzU5NyAxODk0IAp6Ck0gMzAyMiAyMDYzIApRIDMwMTYgMjUzNCAyNzU4IDI4MTUgClEgMjUwMCAzMDk3IDIwNzUgMzA5NyAKUSAxNTk0IDMwOTcgMTMwNSAyODI1IApRIDEwMTYgMjU1MyA5NzIgMjA1OSAKTCAzMDIyIDIwNjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNzMiIGQ9Ik0gMjgzNCAzMzk3IApMIDI4MzQgMjg1MyAKUSAyNTkxIDI5NzggMjMyOCAzMDQwIApRIDIwNjYgMzEwMyAxNzg0IDMxMDMgClEgMTM1NiAzMTAzIDExNDIgMjk3MiAKUSA5MjggMjg0MSA5MjggMjU3OCAKUSA5MjggMjM3OCAxMDgxIDIyNjQgClEgMTIzNCAyMTUwIDE2OTcgMjA0NyAKTCAxODk0IDIwMDMgClEgMjUwNiAxODcyIDI3NjQgMTYzMyAKUSAzMDIyIDEzOTQgMzAyMiA5NjYgClEgMzAyMiA0NzggMjYzNiAxOTMgClEgMjI1MCAtOTEgMTU3NSAtOTEgClEgMTI5NCAtOTEgOTg5IC0zNiAKUSA2ODQgMTkgMzQ3IDEyOCAKTCAzNDcgNzIyIApRIDY2NiA1NTYgOTc1IDQ3MyAKUSAxMjg0IDM5MSAxNTg4IDM5MSAKUSAxOTk0IDM5MSAyMjEyIDUzMCAKUSAyNDMxIDY2OSAyNDMxIDkyMiAKUSAyNDMxIDExNTYgMjI3MyAxMjgxIApRIDIxMTYgMTQwNiAxNTgxIDE1MjIgCkwgMTM4MSAxNTY5IApRIDg0NyAxNjgxIDYwOSAxOTE0IApRIDM3MiAyMTQ3IDM3MiAyNTUzIApRIDM3MiAzMDQ3IDcyMiAzMzE1IApRIDEwNzIgMzU4NCAxNzE2IDM1ODQgClEgMjAzNCAzNTg0IDIzMTUgMzUzNyAKUSAyNTk3IDM0OTEgMjgzNCAzMzk3IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgPC9kZWZzPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTUzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjYzLjQ3NjU2MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZkIiB4PSIxMjQuNzU1ODU5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzAiIHg9IjIyMi4xNjc5NjkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iMjg1LjY0NDUzMSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIzMTMuNDI3NzM0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9IjM3NC45NTExNzIiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgIDwvZz4KICAgPGcgaWQ9Im1hdHBsb3RsaWIuYXhpc18yIj4KICAgIDxnIGlkPSJ5dGlja18xIj4KICAgICA8ZyBpZD0ibGluZTJkXzMxIj4KICAgICAgPGRlZnM+CiAgICAgICA8cGF0aCBpZD0ibWY4NmI2NjhlYzQiIGQ9Ik0gMCAwIApMIC0zLjUgMCAKIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2RlZnM+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWY4NmI2NjhlYzQiIHg9IjU3LjYiIHk9IjI4NS4yOTUyODQiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfNiI+CiAgICAgIDwhLS0gJFxtYXRoZGVmYXVsdHsxMF57LTN9fSQgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI3LjEgMjg5LjA5NDUwMykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTIyMTIiIGQ9Ik0gNjc4IDIyNzIgCkwgNDY4NCAyMjcyIApMIDQ2ODQgMTc0MSAKTCA2NzggMTc0MSAKTCA2NzggMjI3MiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjMuNjIzMDQ3IDAuNzY1NjI1KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMjEyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjguMjAzMTI1IDM5LjA0Njg3NSkgc2NhbGUoMC43KSIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTg2Ljg1NTQ2OSAzOS4wNDY4NzUpIHNjYWxlKDAuNykiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18yIj4KICAgICA8ZyBpZD0ibGluZTJkXzMyIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtZjg2YjY2OGVjNCIgeD0iNTcuNiIgeT0iMjIyLjA0NTc3NSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF83Ij4KICAgICAgPCEtLSAkXG1hdGhkZWZhdWx0ezEwXnstMn19JCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjcuMSAyMjUuODQ0OTk0KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYzLjYyMzA0NyAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjIxMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI4LjIwMzEyNSAzOS4wNDY4NzUpIHNjYWxlKDAuNykiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4Ni44NTU0NjkgMzkuMDQ2ODc1KSBzY2FsZSgwLjcpIi8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMyI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zMyI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWY4NmI2NjhlYzQiIHg9IjU3LjYiIHk9IjE1OC43OTYyNjYiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfOCI+CiAgICAgIDwhLS0gJFxtYXRoZGVmYXVsdHsxMF57LTF9fSQgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI3LjEgMTYyLjU5NTQ4NSkgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMC42ODQzNzUpIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2My42MjMwNDcgMC42ODQzNzUpIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIyMTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyOC4yMDMxMjUgMzguOTY1NjI1KSBzY2FsZSgwLjcpIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODYuODU1NDY5IDM4Ljk2NTYyNSkgc2NhbGUoMC43KSIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzQiPgogICAgIDxnIGlkPSJsaW5lMmRfMzQiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21mODZiNjY4ZWM0IiB4PSI1Ny42IiB5PSI5NS41NDY3NTgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfOSI+CiAgICAgIDwhLS0gJFxtYXRoZGVmYXVsdHsxMF57MH19JCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzMgOTkuMzQ1OTc2KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYzLjYyMzA0NyAwLjc2NTYyNSkiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyOC4yMDMxMjUgMzkuMDQ2ODc1KSBzY2FsZSgwLjcpIi8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zNSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9Im04ZGMzY2RlNGRjIiBkPSJNIDAgMCAKTCAtMiAwIAoiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZGVmcz4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMzA0LjMzNTI4NCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja182Ij4KICAgICA8ZyBpZD0ibGluZTJkXzM2Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjk5LjMyNzEwOSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja183Ij4KICAgICA8ZyBpZD0ibGluZTJkXzM3Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjk1LjA5Mjc1NyIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja184Ij4KICAgICA8ZyBpZD0ibGluZTJkXzM4Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjkxLjQyNDc5NSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja185Ij4KICAgICA8ZyBpZD0ibGluZTJkXzM5Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjg4LjE4OTQyMyIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18xMCI+CiAgICAgPGcgaWQ9ImxpbmUyZF80MCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjI2Ni4yNTUyODUiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMTEiPgogICAgIDxnIGlkPSJsaW5lMmRfNDEiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIyNTUuMTE3NTk5IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzEyIj4KICAgICA8ZyBpZD0ibGluZTJkXzQyIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjQ3LjIxNTI4NSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18xMyI+CiAgICAgPGcgaWQ9ImxpbmUyZF80MyI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjI0MS4wODU3NzUiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMTQiPgogICAgIDxnIGlkPSJsaW5lMmRfNDQiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIyMzYuMDc3NiIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18xNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF80NSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjIzMS44NDMyNDgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMTYiPgogICAgIDxnIGlkPSJsaW5lMmRfNDYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIyMjguMTc1Mjg2IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzE3Ij4KICAgICA8ZyBpZD0ibGluZTJkXzQ3Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMjI0LjkzOTkxNCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18xOCI+CiAgICAgPGcgaWQ9ImxpbmUyZF80OCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjIwMy4wMDU3NzYiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMTkiPgogICAgIDxnIGlkPSJsaW5lMmRfNDkiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIxOTEuODY4MDkiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMjAiPgogICAgIDxnIGlkPSJsaW5lMmRfNTAiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIxODMuOTY1Nzc3IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzIxIj4KICAgICA8ZyBpZD0ibGluZTJkXzUxIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMTc3LjgzNjI2NiIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18yMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF81MiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjE3Mi44MjgwOTEiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMjMiPgogICAgIDxnIGlkPSJsaW5lMmRfNTMiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIxNjguNTkzNzM5IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzI0Ij4KICAgICA8ZyBpZD0ibGluZTJkXzU0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMTY0LjkyNTc3NyIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18yNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF81NSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjE2MS42OTA0MDUiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMjYiPgogICAgIDxnIGlkPSJsaW5lMmRfNTYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIxMzkuNzU2MjY3IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzI3Ij4KICAgICA8ZyBpZD0ibGluZTJkXzU3Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMTI4LjYxODU4MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18yOCI+CiAgICAgPGcgaWQ9ImxpbmUyZF81OCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjEyMC43MTYyNjgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMjkiPgogICAgIDxnIGlkPSJsaW5lMmRfNTkiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSIxMTQuNTg2NzU3IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuNiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzMwIj4KICAgICA8ZyBpZD0ibGluZTJkXzYwIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtOGRjM2NkZTRkYyIgeD0iNTcuNiIgeT0iMTA5LjU3ODU4MiIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18zMSI+CiAgICAgPGcgaWQ9ImxpbmUyZF82MSI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjEwNS4zNDQyMyIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18zMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF82MiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbThkYzNjZGU0ZGMiIHg9IjU3LjYiIHk9IjEwMS42NzYyNjgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzMiPgogICAgIDxnIGlkPSJsaW5lMmRfNjMiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI5OC40NDA4OTYiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzQiPgogICAgIDxnIGlkPSJsaW5lMmRfNjQiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI3Ni41MDY3NTgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzUiPgogICAgIDxnIGlkPSJsaW5lMmRfNjUiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI2NS4zNjkwNzMiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzYiPgogICAgIDxnIGlkPSJsaW5lMmRfNjYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI1Ny40NjY3NTkiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzciPgogICAgIDxnIGlkPSJsaW5lMmRfNjciPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI1MS4zMzcyNDgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzgiPgogICAgIDxnIGlkPSJsaW5lMmRfNjgiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI0Ni4zMjkwNzMiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMzkiPgogICAgIDxnIGlkPSJsaW5lMmRfNjkiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI204ZGMzY2RlNGRjIiB4PSI1Ny42IiB5PSI0Mi4wOTQ3MjIiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC42Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xMCI+CiAgICAgPCEtLSBFc3RpbWF0ZWQgdXBwZXIgYm91bmQgb2YgUF9lcnIgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAuNzQyMTg3IDI1My45NzE3NSkgcm90YXRlKC05MCkgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgPGRlZnM+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy00NSIgZD0iTSA2MjggNDY2NiAKTCAzNTc4IDQ2NjYgCkwgMzU3OCA0MTM0IApMIDEyNTkgNDEzNCAKTCAxMjU5IDI3NTMgCkwgMzQ4MSAyNzUzIApMIDM0ODEgMjIyMiAKTCAxMjU5IDIyMjIgCkwgMTI1OSA1MzEgCkwgMzYzNCA1MzEgCkwgMzYzNCAwIApMIDYyOCAwIApMIDYyOCA0NjY2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTc0IiBkPSJNIDExNzIgNDQ5NCAKTCAxMTcyIDM1MDAgCkwgMjM1NiAzNTAwIApMIDIzNTYgMzA1MyAKTCAxMTcyIDMwNTMgCkwgMTE3MiAxMTUzIApRIDExNzIgNzI1IDEyODkgNjAzIApRIDE0MDYgNDgxIDE3NjYgNDgxIApMIDIzNTYgNDgxIApMIDIzNTYgMCAKTCAxNzY2IDAgClEgMTEwMCAwIDg0NyAyNDggClEgNTk0IDQ5NyA1OTQgMTE1MyAKTCA1OTQgMzA1MyAKTCAxNzIgMzA1MyAKTCAxNzIgMzUwMCAKTCA1OTQgMzUwMCAKTCA1OTQgNDQ5NCAKTCAxMTcyIDQ0OTQgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjkiIGQ9Ik0gNjAzIDM1MDAgCkwgMTE3OCAzNTAwIApMIDExNzggMCAKTCA2MDMgMCAKTCA2MDMgMzUwMCAKegpNIDYwMyA0ODYzIApMIDExNzggNDg2MyAKTCAxMTc4IDQxMzQgCkwgNjAzIDQxMzQgCkwgNjAzIDQ4NjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjQiIGQ9Ik0gMjkwNiAyOTY5IApMIDI5MDYgNDg2MyAKTCAzNDgxIDQ4NjMgCkwgMzQ4MSAwIApMIDI5MDYgMCAKTCAyOTA2IDUyNSAKUSAyNzI1IDIxMyAyNDQ4IDYxIApRIDIxNzIgLTkxIDE3ODQgLTkxIApRIDExNTAgLTkxIDc1MSA0MTUgClEgMzUzIDkyMiAzNTMgMTc0NyAKUSAzNTMgMjU3MiA3NTEgMzA3OCAKUSAxMTUwIDM1ODQgMTc4NCAzNTg0IApRIDIxNzIgMzU4NCAyNDQ4IDM0MzIgClEgMjcyNSAzMjgxIDI5MDYgMjk2OSAKegpNIDk0NyAxNzQ3IApRIDk0NyAxMTEzIDEyMDggNzUyIApRIDE0NjkgMzkxIDE5MjUgMzkxIApRIDIzODEgMzkxIDI2NDMgNzUyIApRIDI5MDYgMTExMyAyOTA2IDE3NDcgClEgMjkwNiAyMzgxIDI2NDMgMjc0MiAKUSAyMzgxIDMxMDMgMTkyNSAzMTAzIApRIDE0NjkgMzEwMyAxMjA4IDI3NDIgClEgOTQ3IDIzODEgOTQ3IDE3NDcgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMjAiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy03NSIgZD0iTSA1NDQgMTM4MSAKTCA1NDQgMzUwMCAKTCAxMTE5IDM1MDAgCkwgMTExOSAxNDAzIApRIDExMTkgOTA2IDEzMTIgNjU3IApRIDE1MDYgNDA5IDE4OTQgNDA5IApRIDIzNTkgNDA5IDI2MjkgNzA2IApRIDI5MDAgMTAwMyAyOTAwIDE1MTYgCkwgMjkwMCAzNTAwIApMIDM0NzUgMzUwMCAKTCAzNDc1IDAgCkwgMjkwMCAwIApMIDI5MDAgNTM4IApRIDI2OTEgMjE5IDI0MTQgNjQgClEgMjEzOCAtOTEgMTc3MiAtOTEgClEgMTE2OSAtOTEgODU2IDI4NCAKUSA1NDQgNjU5IDU0NCAxMzgxIAp6Ck0gMTk5MSAzNTg0IApMIDE5OTEgMzU4NCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy03MiIgZD0iTSAyNjMxIDI5NjMgClEgMjUzNCAzMDE5IDI0MjAgMzA0NSAKUSAyMzA2IDMwNzIgMjE2OSAzMDcyIApRIDE2ODEgMzA3MiAxNDIwIDI3NTUgClEgMTE1OSAyNDM4IDExNTkgMTg0NCAKTCAxMTU5IDAgCkwgNTgxIDAgCkwgNTgxIDM1MDAgCkwgMTE1OSAzNTAwIApMIDExNTkgMjk1NiAKUSAxMzQxIDMyNzUgMTYzMSAzNDI5IApRIDE5MjIgMzU4NCAyMzM4IDM1ODQgClEgMjM5NyAzNTg0IDI0NjkgMzU3NiAKUSAyNTQxIDM1NjkgMjYyOCAzNTUzIApMIDI2MzEgMjk2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy02MiIgZD0iTSAzMTE2IDE3NDcgClEgMzExNiAyMzgxIDI4NTUgMjc0MiAKUSAyNTk0IDMxMDMgMjEzOCAzMTAzIApRIDE2ODEgMzEwMyAxNDIwIDI3NDIgClEgMTE1OSAyMzgxIDExNTkgMTc0NyAKUSAxMTU5IDExMTMgMTQyMCA3NTIgClEgMTY4MSAzOTEgMjEzOCAzOTEgClEgMjU5NCAzOTEgMjg1NSA3NTIgClEgMzExNiAxMTEzIDMxMTYgMTc0NyAKegpNIDExNTkgMjk2OSAKUSAxMzQxIDMyODEgMTYxNyAzNDMyIApRIDE4OTQgMzU4NCAyMjc4IDM1ODQgClEgMjkxNiAzNTg0IDMzMTQgMzA3OCAKUSAzNzEzIDI1NzIgMzcxMyAxNzQ3IApRIDM3MTMgOTIyIDMzMTQgNDE1IApRIDI5MTYgLTkxIDIyNzggLTkxIApRIDE4OTQgLTkxIDE2MTcgNjEgClEgMTM0MSAyMTMgMTE1OSA1MjUgCkwgMTE1OSAwIApMIDU4MSAwIApMIDU4MSA0ODYzIApMIDExNTkgNDg2MyAKTCAxMTU5IDI5NjkgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNmYiIGQ9Ik0gMTk1OSAzMDk3IApRIDE0OTcgMzA5NyAxMjI4IDI3MzYgClEgOTU5IDIzNzUgOTU5IDE3NDcgClEgOTU5IDExMTkgMTIyNiA3NTggClEgMTQ5NCAzOTcgMTk1OSAzOTcgClEgMjQxOSAzOTcgMjY4NyA3NTkgClEgMjk1NiAxMTIyIDI5NTYgMTc0NyAKUSAyOTU2IDIzNjkgMjY4NyAyNzMzIApRIDI0MTkgMzA5NyAxOTU5IDMwOTcgCnoKTSAxOTU5IDM1ODQgClEgMjcwOSAzNTg0IDMxMzcgMzA5NiAKUSAzNTY2IDI2MDkgMzU2NiAxNzQ3IApRIDM1NjYgODg4IDMxMzcgMzk4IApRIDI3MDkgLTkxIDE5NTkgLTkxIApRIDEyMDYgLTkxIDc3OSAzOTggClEgMzUzIDg4OCAzNTMgMTc0NyAKUSAzNTMgMjYwOSA3NzkgMzA5NiAKUSAxMjA2IDM1ODQgMTk1OSAzNTg0IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTZlIiBkPSJNIDM1MTMgMjExMyAKTCAzNTEzIDAgCkwgMjkzOCAwIApMIDI5MzggMjA5NCAKUSAyOTM4IDI1OTEgMjc0NCAyODM3IApRIDI1NTAgMzA4NCAyMTYzIDMwODQgClEgMTY5NyAzMDg0IDE0MjggMjc4NyAKUSAxMTU5IDI0OTEgMTE1OSAxOTc4IApMIDExNTkgMCAKTCA1ODEgMCAKTCA1ODEgMzUwMCAKTCAxMTU5IDM1MDAgCkwgMTE1OSAyOTU2IApRIDEzNjYgMzI3MiAxNjQ1IDM0MjggClEgMTkyNSAzNTg0IDIyOTEgMzU4NCAKUSAyODk0IDM1ODQgMzIwMyAzMjExIApRIDM1MTMgMjgzOCAzNTEzIDIxMTMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjYiIGQ9Ik0gMjM3NSA0ODYzIApMIDIzNzUgNDM4NCAKTCAxODI1IDQzODQgClEgMTUxNiA0Mzg0IDEzOTUgNDI1OSAKUSAxMjc1IDQxMzQgMTI3NSAzODA5IApMIDEyNzUgMzUwMCAKTCAyMjIyIDM1MDAgCkwgMjIyMiAzMDUzIApMIDEyNzUgMzA1MyAKTCAxMjc1IDAgCkwgNjk3IDAgCkwgNjk3IDMwNTMgCkwgMTQ3IDMwNTMgCkwgMTQ3IDM1MDAgCkwgNjk3IDM1MDAgCkwgNjk3IDM3NDQgClEgNjk3IDQzMjggOTY5IDQ1OTUgClEgMTI0MSA0ODYzIDE4MzEgNDg2MyAKTCAyMzc1IDQ4NjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNTAiIGQ9Ik0gMTI1OSA0MTQ3IApMIDEyNTkgMjM5NCAKTCAyMDUzIDIzOTQgClEgMjQ5NCAyMzk0IDI3MzQgMjYyMiAKUSAyOTc1IDI4NTAgMjk3NSAzMjcyIApRIDI5NzUgMzY5MSAyNzM0IDM5MTkgClEgMjQ5NCA0MTQ3IDIwNTMgNDE0NyAKTCAxMjU5IDQxNDcgCnoKTSA2MjggNDY2NiAKTCAyMDUzIDQ2NjYgClEgMjgzOCA0NjY2IDMyMzkgNDMxMSAKUSAzNjQxIDM5NTYgMzY0MSAzMjcyIApRIDM2NDEgMjU4MSAzMjM5IDIyMjggClEgMjgzOCAxODc1IDIwNTMgMTg3NSAKTCAxMjU5IDE4NzUgCkwgMTI1OSAwIApMIDYyOCAwIApMIDYyOCA0NjY2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTVmIiBkPSJNIDMyNjMgLTEwNjMgCkwgMzI2MyAtMTUwOSAKTCAtNjMgLTE1MDkgCkwgLTYzIC0xMDYzIApMIDMyNjMgLTEwNjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8L2RlZnM+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNDUiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MyIgeD0iNjMuMTgzNTk0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjExNS4yODMyMDMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02OSIgeD0iMTU0LjQ5MjE4OCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZkIiB4PSIxODIuMjc1MzkxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjI3OS42ODc1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjM0MC45NjY3OTciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iMzgwLjE3NTc4MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY0IiB4PSI0NDEuNjk5MjE5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjUwNS4xNzU3ODEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NSIgeD0iNTM2Ljk2Mjg5MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcwIiB4PSI2MDAuMzQxNzk3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzAiIHg9IjY2My44MTgzNTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iNzI3LjI5NDkyMiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI3ODguODE4MzU5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjgyOS45MzE2NDEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MiIgeD0iODYxLjcxODc1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjkyNS4xOTUzMTIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NSIgeD0iOTg2LjM3Njk1MyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZlIiB4PSIxMDQ5Ljc1NTg1OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY0IiB4PSIxMTEzLjEzNDc2NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSIxMTc2LjYxMTMyOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZmIiB4PSIxMjA4LjM5ODQzOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY2IiB4PSIxMjY5LjU4MDA3OCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSIxMzA0Ljc4NTE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTUwIiB4PSIxMzM2LjU3MjI2NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTVmIiB4PSIxMzk2Ljg3NSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIxNDQ2Ljg3NSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSIxNTA4LjM5ODQzOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSIxNTQ3Ljc2MTcxOSIvPgogICAgIDwvZz4KICAgIDwvZz4KICAgPC9nPgogICA8ZyBpZD0ibGluZTJkXzcwIj4KICAgIDxwYXRoIGQ9Ik0gNzMuODMyNzI3IDExNC41ODY3NTcgCkwgMTA2LjQxNDM2NSAxMjkuMjc2NDk1IApMIDEyNS40NzM0MDEgMTM4LjkwNDM0NSAKTCAxMzguOTk2MDAzIDE0Ni4wMzkgCkwgMTU4LjA1NTAzOSAxNTYuNDAzODcgCkwgMTgyLjA2NjU4NSAxNjkuODA5MjUyIApMIDIwOS42OTU3MTMgMTg1LjUzNDI0IApMIDI2Ny44MzAxOTUgMjE5LjEyOTY3IApMIDI3NS41MDczNDkgMjIzLjU5OTcwMSAKTCAyNzguNjIxNDI2IDIyNS40MDE1ODcgCkwgMjgwLjk3MjE4NCAyMjYuNzY5NzQ5IApMIDI5Ni44NzAwMDUgMjM2LjAzMTg1NiAKTCAyOTguMDgwNTEgMjM2LjcyNjEzNyAKTCAzMTAuOTAwNzc4IDI0NC4yMjUxNzMgCkwgMzExLjUwMzQxOSAyNDQuNTM0ODYgCkwgMzE0LjQwNTkwNiAyNDYuMjcwMzE2IApMIDMxNS41MTg1MTEgMjQ2Ljg3NDA1MiAKTCAzMTYuMzM2MDE3IDI0Ny4zNTI5NzQgCkwgMzE3LjQwNDM2NiAyNDcuOTgxMjYyIApMIDMxOC4xODk5OSAyNDguNDgwMDYyIApMIDMyMi44ODIwODEgMjUxLjE5ODk4NiAKTCAzMjMuODEyOTExIDI1MS43NjA0MTQgCkwgMzI0LjQ5OTEzMyAyNTIuMDg2NDU4IApMIDMyNS42MjEwMzMgMjUyLjgzNDUyMyAKTCAzMjYuMjgxNTQxIDI1My4xNzM2NSAKTCAzMjYuNzE2Nzc5IDI1My40MzA3NzEgCkwgMzI3LjM2MjE3MSAyNTMuNzc3Mzg2IApMIDMyNy45OTg4MjMgMjU0LjIxNjg5OCAKTCAzMjguODM0NDk2IDI1NC42NjM1NTcgCkwgMzI5LjA0MTExMyAyNTQuODQ0Mjc0IApMIDMyOS4yNDY4MjYgMjU0Ljg0NDI3NCAKTCAzMjkuNjU1NTcxIDI1NS4yMDkzMTUgCkwgMzI5Ljg1ODYxOCAyNTUuMjA5MzE1IApMIDMzMC4yNjIxIDI1NS40ODYzMTUgCkwgMzMxLjQ1MjE3MyAyNTYuMTQzNzIyIApMIDMzMS44NDIyNjEgMjU2LjQzMDM1NyAKTCAzMzMuMzcxMDI2IDI1Ny4zMDg2NTYgCkwgMzM0Ljg1MTYzMiAyNTguMjE1OTY5IApMIDM0MC4wMjIyNjUgMjYxLjEzMjg5NCAKTCAzNDAuMzQ3NTYzIDI2MS40NzY5NzcgCkwgMzQwLjUwOTM3MSAyNjEuNDc2OTc3IApMIDM0MS42MjY2OTkgMjYyLjE3ODM0OSAKTCAzNDEuNzg0MTcxIDI2Mi4xNzgzNDkgCkwgMzQzLjAyNTMwOSAyNjMuMDE5OTEzIApMIDM0My4xNzgxNzIgMjYzLjAxOTkxMyAKTCAzNDMuOTM1MTE5IDI2My41MTI2NDIgCkwgMzQ0LjA4NTA1NyAyNjMuNTEyNjQyIApMIDM0NC45NzQ3NzUgMjY0LjE0MTI0OSAKTCAzNDUuMTIxNDM3IDI2NC4xNDEyNDkgCkwgMzQ1Ljg0Nzk2NCAyNjQuNjU0NzAxIApMIDM0NS45OTE5MzIgMjY0LjY1NDcwMSAKTCAzNDYuNTYzNDMzIDI2NS4wNDYxODkgCkwgMzQ2LjcwNTIyOSAyNjUuMDQ2MTg5IApMIDM0Ny4yNjgxNzQgMjY1LjQ0MzMzNyAKTCAzNDcuNDA3ODYzIDI2NS40NDMzMzcgCkwgMzQ3Ljk2MjUwNSAyNjUuODQ2MzExIApMIDM0OC4xMDAxNDkgMjY1Ljg0NjMxMSAKTCAzNDguNjQ2NzI5IDI2Ni4yNTUyODUgCkwgMzQ4Ljc4MjM4NyAyNjYuMjU1Mjg1IApMIDM0OS40NTQ4NjUgMjY2LjgxMDIzMSAKTCAzNDkuNzIxMTg1IDI2Ni44MTAyMzEgCkwgMzUwLjI0OTM0IDI2Ny4yMzM5MjUgCkwgMzUwLjUxMTIwOSAyNjcuMjMzOTI1IApMIDM1MS4wMzA2MTEgMjY3LjY2NDI1NiAKTCAzNTEuMTU5NTcgMjY3LjY2NDI1NiAKTCAzNTEuNjcxODk1IDI2OC4xMDE0MzYgCkwgMzUxLjkyNTk3OCAyNjguMTAxNDM2IApMIDM1Mi4zMDQ1NDcgMjY4LjM5NjgwNCAKTCAzNTIuNDMwMDYyIDI2OC4zOTY4MDQgCkwgMzUyLjgwNDYwOSAyNjguNjk1MzgyIApMIDM1Mi45Mjg3OTggMjY4LjY5NTM4MiAKTCAzNTMuNDIyMjk3IDI2OS4xNDk0MjQgCkwgMzUzLjc4OTA1MSAyNjkuMTQ5NDI0IApMIDM1NC4yNzM2NDYgMjY5LjYxMTA5NyAKTCAzNTQuNTE0MDgzIDI2OS42MTEwOTcgCkwgMzU0Ljg3MjQ0OSAyNjkuOTIzMjQ3IApMIDM1NC45OTEyOTkgMjY5LjkyMzI0NyAKTCAzNTUuMjI4MTAzIDI3MC4wODA2NjIgCkwgMzU1LjM0NjA1OSAyNzAuMDgwNjYyIApMIDM1NS42OTgxNiAyNzAuMzk4MjI2IApMIDM1NS44MTQ5NDQgMjcwLjM5ODIyNiAKTCAzNTYuMDQ3NjQ0IDI3MC41NTgzOTUgCkwgMzU2LjI3OTE5OCAyNzAuNTU4Mzk1IApMIDM1Ni43Mzg5MTIgMjcxLjA0NDU4MyAKTCAzNTYuODUzMTQyIDI3MS4wNDQ1ODMgCkwgMzU3LjA4MDc3MSAyNzEuMjA4NTc3IApMIDM1Ny4zMDczMDMgMjcxLjIwODU3NyAKTCAzNTcuNjQ1MDY4IDI3MS41Mzk1MzEgCkwgMzU3Ljc1NzExOSAyNzEuNTM5NTMxIApMIDM1Ny45ODA0MjMgMjcxLjcwNjUxNiAKTCAzNTguMjAyNjcxIDI3MS43MDY1MTYgCkwgMzU4LjUzNDA4NSAyNzIuMDQzNTYyIApMIDM1OC42NDQwMzkgMjcyLjA0MzU2MiAKTCAzNTguODYzMTc4IDI3Mi4yMTM2NDkgCkwgMzU5LjA4MTMwMSAyNzIuMjEzNjQ5IApMIDM1OS40MDY1OTkgMjcyLjU1NzAxNSAKTCAzNTkuNTE0NTMzIDI3Mi41NTcwMTUgCkwgMzU5LjcyOTY2MSAyNzIuNzMwMzIxIApMIDM1OS45NDM4MDkgMjcyLjczMDMyMSAKTCAzNjAuMjYzMjEzIDI3My4wODAyNDggCkwgMzYwLjQ3NDk0OSAyNzMuMDgwMjQ4IApMIDM2MC43OTA3NzYgMjczLjQzNDY5MSAKTCAzNjEuMTA0NDk1IDI3My40MzQ2OTEgCkwgMzYxLjQxNjEzMyAyNzMuNzkzNzY3IApMIDM2MS42MjI3NTEgMjczLjc5Mzc2NyAKTCAzNjEuODI4NDY0IDI3My45NzUwOCAKTCAzNjIuMDMzMjgxIDI3My45NzUwOCAKTCAzNjIuMjM3MjA5IDI3NC4xNTc1OTggCkwgMzYyLjMzODg0MiAyNzQuMTU3NTk4IApMIDM2Mi42NDI0MyAyNzQuNTI2MzE0IApMIDM2My4wNDQxODggMjc0LjUyNjMxNCAKTCAzNjMuMzQzMjY4IDI3NC45MDAwNDcgCkwgMzYzLjU0MTYwNCAyNzQuOTAwMDQ3IApMIDM2My43MzkxMDUgMjc1LjA4ODgzNyAKTCAzNjQuMDMzODExIDI3NS4wODg4MzcgCkwgMzY0LjMyNjY4IDI3NS40NzAzNTYgCkwgMzY0LjUyMDkxOCAyNzUuNDcwMzU2IApMIDM2NC43MTQzNTYgMjc1LjY2MzEyMSAKTCAzNjUuMDAzMDI4IDI3NS42NjMxMjEgCkwgMzY1LjE5NDQ5NiAyNzUuODU3MjQ5IApMIDM2NS4yODk5MzkgMjc1Ljg1NzI0OSAKTCAzNjUuNDgwMjQ0IDI3Ni4wNTI3NTggCkwgMzY1LjU3NTEwOSAyNzYuMDUyNzU4IApMIDM2NS44NTg1NTkgMjc2LjQ0ODAwMSAKTCAzNjYuMzI3MjExIDI3Ni40NDgwMDEgCkwgMzY2LjUxMzM3MSAyNzYuNjQ3Nzc1IApMIDM2Ni42MDYxNzUgMjc2LjY0Nzc3NSAKTCAzNjYuNzkxMjM2IDI3Ni44NDkwMTQgCkwgMzY2Ljg4MzQ5NCAyNzYuODQ5MDE0IApMIDM2Ny4wNjc0NjggMjc3LjA1MTczNyAKTCAzNjcuMzQyMDg2IDI3Ny4wNTE3MzcgCkwgMzY3LjUyNDI3OCAyNzcuMjU1OTY4IApMIDM2Ny42MTUxMDkgMjc3LjI1NTk2OCAKTCAzNjcuNzk2MjQ4IDI3Ny40NjE3MjkgCkwgMzY3Ljg4NjU1NiAyNzcuNDYxNzI5IApMIDM2OC4wNjY2NTMgMjc3LjY2OTA0MiAKTCAzNjguNDI0NzkxIDI3Ny42NjkwNDIgCkwgMzY4LjYwMjg0MiAyNzcuODc3OTMyIApMIDM2OC42OTE2MTUgMjc3Ljg3NzkzMiAKTCAzNjguODY4NjYgMjc4LjA4ODQyMyAKTCAzNjkuMDQ1MDQxIDI3OC4wODg0MjMgCkwgMzY5LjIyMDc2MiAyNzguMzAwNTM5IApMIDM2OS41NzAyNDYgMjc4LjMwMDUzOSAKTCAzNjkuNzQ0MDE4IDI3OC41MTQzMDYgCkwgMzY5LjgzMDY2NCAyNzguNTE0MzA2IApMIDM3MC4wMDM0NzggMjc4LjcyOTc1IApMIDM3MC4wODk2NDcgMjc4LjcyOTc1IApMIDM3MC4yNjE1MTQgMjc4Ljk0Njg5NiAKTCAzNzAuNjg4NDUgMjc4Ljk0Njg5NiAKTCAzNzAuODU4MTQ1IDI3OS4xNjU3NzMgCkwgMzcxLjAyNzIyOSAyNzkuMTY1NzczIApMIDM3MS4xOTU3MDcgMjc5LjM4NjQwOCAKTCAzNzEuMjc5NzIgMjc5LjM4NjQwOCAKTCAzNzEuNDQ3Mjk4IDI3OS42MDg4MyAKTCAzNzEuNTMwODYzIDI3OS42MDg4MyAKTCAzNzEuNjk3NTQ4IDI3OS44MzMwNjcgCkwgMzcyLjE5NDA4OSAyNzkuODMzMDY3IApMIDM3Mi4zNTg0NDMgMjgwLjA1OTE1IApMIDM3Mi40NDA0MDYgMjgwLjA1OTE1IApMIDM3Mi42MDM5MDMgMjgwLjI4NzEwOSAKTCAzNzIuNzY2ODMzIDI4MC4yODcxMDkgCkwgMzcyLjkyOTIwMSAyODAuNTE2OTc2IApMIDM3My4zMzI2ODMgMjgwLjUxNjk3NiAKTCAzNzMuNDkzMTExIDI4MC43NDg3ODIgCkwgMzczLjY1Mjk5MyAyODAuNzQ4NzgyIApMIDM3My44MTIzMzMgMjgwLjk4MjU2MiAKTCAzNzMuOTcxMTM1IDI4MC45ODI1NjIgCkwgMzc0LjEyOTQwMyAyODEuMjE4MzQ4IApMIDM3NC42MDEwMzMgMjgxLjIxODM0OCAKTCAzNzQuNzU3MTk3IDI4MS40NTYxNzYgCkwgMzc0LjkxMjg0NCAyODEuNDU2MTc2IApMIDM3NS4wNjc5NzcgMjgxLjY5NjA4IApMIDM3NS4yMjI2IDI4MS42OTYwOCAKTCAzNzUuMzc2NzE2IDI4MS45MzgwOTkgCkwgMzc1LjgzNjA1NiAyODEuOTM4MDk5IApMIDM3NS45ODgxNzcgMjgyLjE4MjI2OCAKTCAzNzYuMTM5ODA3IDI4Mi4xODIyNjggCkwgMzc2LjI5MDk1IDI4Mi40Mjg2MjggCkwgMzc2LjUxNjc1NyAyODIuNDI4NjI4IApMIDM3Ni42NjY2OTQgMjgyLjY3NzIxNyAKTCAzNzYuODE2MTU1IDI4Mi42NzcyMTcgCkwgMzc2Ljk2NTE0MiAyODIuOTI4MDc3IApMIDM3Ny40ODI5MDkgMjgyLjkyODA3NyAKTCAzNzcuNjI5ODAxIDI4My4xODEyNDggCkwgMzc3Ljc3NjIzNSAyODMuMTgxMjQ4IApMIDM3Ny45MjIyMTUgMjgzLjQzNjc3NSAKTCAzNzguMTQwMzM4IDI4My40MzY3NzUgCkwgMzc4LjI4NTE5MiAyODMuNjk0NzAxIApMIDM3OC44NjAxODkgMjgzLjY5NDcwMSAKTCAzNzkuMDAyODQ2IDI4My45NTUwNzEgCkwgMzc5LjE0NTA3MSAyODMuOTU1MDcxIApMIDM3OS4yODY4NjcgMjg0LjIxNzkzNCAKTCAzNzkuNDk4NzYyIDI4NC4yMTc5MzQgCkwgMzc5LjYzOTQ5NyAyODQuNDgzMzM2IApMIDM4MC4xOTgyNiAyODQuNDgzMzM2IApMIDM4MC4zMzY5MTkgMjg0Ljc1MTMyNyAKTCAzODAuNTQ0MTQzIDI4NC43NTEzMjcgCkwgMzgwLjY4MTc4NyAyODUuMDIxOTU5IApMIDM4MC44ODc1IDI4NS4wMjE5NTkgCkwgMzgxLjAyNDE0NCAyODUuMjk1Mjg0IApMIDM4MS42MzQxNzIgMjg1LjI5NTI4NCAKTCAzODEuNzY4NjY1IDI4NS41NzEzNTYgCkwgMzgxLjk2OTY4NiAyODUuNTcxMzU2IApMIDM4Mi4xMDMyMjQgMjg1Ljg1MDIzMSAKTCAzODIuMzY5MTY3IDI4NS44NTAyMzEgCkwgMzgyLjUwMTU3NyAyODYuMTMxOTY1IApMIDM4My4wOTI4NDcgMjg2LjEzMTk2NSAKTCAzODMuMjIzMjM3IDI4Ni40MTY2MiAKTCAzODMuNDgyOTM2IDI4Ni40MTY2MiAKTCAzODMuNjEyMjQ5IDI4Ni43MDQyNTUgCkwgMzgzLjg2OTgxMyAyODYuNzA0MjU1IApMIDM4My45OTgwNjggMjg2Ljk5NDkzNCAKTCAzODQuMjUzNTMzIDI4Ni45OTQ5MzQgCkwgMzg0LjM4MDc0NiAyODcuMjg4NzIyIApMIDM4NS4wMTE3IDI4Ny4yODg3MjIgCkwgMzg1LjEzNjg4MSAyODcuNTg1Njg2IApMIDM4NS4zODYyNDcgMjg3LjU4NTY4NiAKTCAzODUuNTEwNDM1IDI4Ny44ODU4OTYgCkwgMzg1LjgxOTQ3OSAyODcuODg1ODk2IApMIDM4NS45NDI1MyAyODguMTg5NDIzIApMIDM4Ni42MTM2MTEgMjg4LjE4OTQyMyAKTCAzODYuNzM0NjAzIDI4OC40OTYzNDEgCkwgMzg2Ljk3NTY1NiAyODguNDk2MzQxIApMIDM4Ny4wOTU3MjEgMjg4LjgwNjcyOCAKTCAzODcuMzk0NTQ5IDI4OC44MDY3MjggCkwgMzg3LjUxMzU1IDI4OS4xMjA2NjIgCkwgMzg4LjIyMTI5NyAyODkuMTIwNjYyIApMIDM4OC4zMzgyMjYgMjg5LjQzODIyNSAKTCAzODguNjI5MjgyIDI4OS40MzgyMjUgCkwgMzg4Ljc0NTIwMiAyODkuNzU5NTAyIApMIDM4OS4wOTEyNTUgMjg5Ljc1OTUwMiAKTCAzODkuMjA2MDQyIDI5MC4wODQ1ODIgCkwgMzg5Ljk0NTQwNCAyOTAuMDg0NTgyIApMIDM5MC4xMTQzODcgMjkwLjQxMzU1NSAKTCAzOTAuMzM4NzU3IDI5MC40MTM1NTUgCkwgMzkwLjUwNjMzNCAyOTAuNzQ2NTE2IApMIDM5MC43ODQzMDggMjkwLjc0NjUxNiAKTCAzOTAuOTUwMzA4IDI5MS4wODM1NjIgCkwgMzkxLjIyNTY3NyAyOTEuMDgzNTYyIApMIDM5MS4zOTAxMjcgMjkxLjQyNDc5NSAKTCAzOTIuMTUwMDQ2IDI5MS40MjQ3OTUgCkwgMzkyLjMxMTI5OSAyOTEuNzcwMzIgCkwgMzkyLjU3ODgzMiAyOTEuNzcwMzIgCkwgMzkyLjczODYyNCAyOTIuMTIwMjQ4IApMIDM5My4wNTY1ODcgMjkyLjEyMDI0OCAKTCAzOTMuMjE0NzY1IDI5Mi40NzQ2OSAKTCAzOTMuOTk3NzcxIDI5Mi40NzQ2OSAKTCAzOTQuMTUyODE5IDI5Mi44MzM3NjYgCkwgMzk0LjQ2MTM5IDI5Mi44MzM3NjYgCkwgMzk0LjYxNDkxOCAyOTMuMTk3NTk4IApMIDM5NC45MjA0OCAyOTMuMTk3NTk4IApMIDM5NS4wNzI1MTkgMjkzLjU2NjMxNCAKTCAzOTUuOTI0OTA2IDI5My41NjYzMTQgCkwgMzk2LjA3MzczNiAyOTMuOTQwMDQ2IApMIDM5Ni4zNjk5ODkgMjkzLjk0MDA0NiAKTCAzOTYuNTE3NDE5IDI5NC4zMTg5MzQgCkwgMzk2LjkwODMxOCAyOTQuMzE4OTM0IApMIDM5Ny4wNTQwNzEgMjk0LjcwMzEyMSAKTCAzOTcuOTE5MjI1IDI5NC43MDMxMjEgCkwgMzk4LjA2MTg4MiAyOTUuMDkyNzU3IApMIDM5OC40NDAxOTcgMjk1LjA5Mjc1NyAKTCAzOTguNDg3MjczIDI5NS40ODggCkwgMzk4LjQ4NzI3MyAyOTUuNDg4IAoiIGNsaXAtcGF0aD0idXJsKCNwNWUwZmQ3MGM1OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwZmY7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImxpbmUyZF83MSI+CiAgICA8cGF0aCBkPSJNIDczLjgzMjcyNyAxMDUuMzQ0MjMgCkwgMzk4LjQ4NzI3MyAyOTUuMDY1Mjc0IApMIDM5OC40ODcyNzMgMjk1LjA2NTI3NCAKIiBjbGlwLXBhdGg9InVybCgjcDVlMGZkNzBjNTgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlLWRhc2hhcnJheTogMS41LDIuNDc1OyBzdHJva2UtZGFzaG9mZnNldDogMDsgc3Ryb2tlOiAjMDAwMDhiOyBzdHJva2Utd2lkdGg6IDEuNSIvPgogICA8L2c+CiAgIDxnIGlkPSJsaW5lMmRfNzIiPgogICAgPHBhdGggZD0iTSA3My44MzI3MjcgMTAzLjQ0OTA3MSAKTCAxMDYuNDE0MzY1IDExNC41ODY3NTcgCkwgMTI1LjQ3MzQwMSAxMjIuODU0ODE3IApMIDEzOC45OTYwMDMgMTI5LjI3NjQ5NSAKTCAxNDkuNDg0OTQ4IDEzNC41MDQyNDcgCkwgMTY1LjMwMDk0OSAxNDIuNzAwODEyIApMIDE4Mi4wNjY1ODUgMTUxLjcwNTg2NyAKTCAyMDEuMTI1NjIyIDE2Mi4yMjA0NDggCkwgMjI1LjEzNzE2OCAxNzUuNzUyNzY4IApMIDI1Ny43MTg4MDYgMTk0LjQwODQzOSAKTCAyNjkuMzIyNTU0IDIwMS4xMDg3ODYgCkwgMjkyLjE0NDAyOCAyMTQuMzM2NDIgCkwgMjk3LjI3Njk4IDIxNy4zMTM2NzIgCkwgMzE3LjY2NzcwMyAyMjkuMTUzOTI2IApMIDMxOC45NjI2OTggMjI5Ljk0ODA4OSAKTCAzMTkuNzIyOTA5IDIzMC4zNTM5NSAKTCAzMjAuNDcxMDIxIDIzMC44MDM2NTYgCkwgMzI0LjA0Mjc2NyAyMzIuODgyOTUzIApMIDMyNi43MTY3NzkgMjM0LjQzMzg2IApMIDMzMy41NTg2NzIgMjM4LjQ2NzcwOCAKTCAzMzMuOTMxNzMzIDIzOC42MTc5NDggCkwgMzM0LjQ4NTgzIDIzOC45NzE3MzkgCkwgMzM4Ljg2NTY2IDI0MS41Mjg4MzEgCkwgMzQwLjAyMjI2NSAyNDIuMjA3MTEgCkwgMzQwLjUwOTM3MSAyNDIuNDk0NzQ2IApMIDM0MS4zMTAxNjQgMjQyLjk2MTMyIApMIDM0MS43ODQxNzEgMjQzLjE5NzYxMyAKTCAzNDIuNTYzNzE0IDI0My42NzYzODYgCkwgMzQzLjAyNTMwOSAyNDMuOTE4OTM5IApMIDM0My42MzM4MDIgMjQ0LjM0ODYyOSAKTCAzNDMuNzg0NzAyIDI0NC4zNDg2MjkgCkwgMzQ0LjUzMjAyMSAyNDQuODQ4MDc4IApMIDM0NS4yNjc2NDQgMjQ1LjIyODcxNSAKTCAzNDUuNzAzNTU1IDI0NS41NDk5OTMgCkwgMzQ1Ljg0Nzk2NCAyNDUuNTQ5OTkzIApMIDM0Ni40MjEyMDggMjQ1Ljk0MDU1MyAKTCAzNDcuNDA3ODYzIDI0Ni40NzAwOSAKTCAzNDcuODI0NDU3IDI0Ni43Mzg3MzcgCkwgMzQ4LjkxNzY1NSAyNDcuMzUyOTc0IApMIDM0OS4zMjExMzcgMjQ3LjYzMDQ0MSAKTCAzNTEuNTQ0MzM2IDI0OC45MTQ5MzUgCkwgMzU5LjA4MTMwMSAyNTMuMzQ0Nzk2IApMIDM1OS4yOTg0MTYgMjUzLjQzMDc3MSAKTCAzNTkuNTE0NTMzIDI1My41MTcwMTYgCkwgMzYwLjI2MzIxMyAyNTQuMDQwMjQ5IApMIDM2MC40NzQ5NDkgMjU0LjEyODQzMiAKTCAzNjAuNzkwNzc2IDI1NC4zMDU2NTEgCkwgMzYxLjAwMDE1NCAyNTQuMzk0NjkxIApMIDM2MS42MjI3NTEgMjU0Ljg0NDI3NCAKTCAzNjEuOTMwOTg0IDI1NC45MzUwODEgCkwgMzYyLjMzODg0MiAyNTUuMjA5MzE1IApMIDM2Mi41NDE0NTIgMjU1LjMwMTMzOCAKTCAzNjIuOTQ0MDcgMjU1LjU3OTI3MiAKTCAzNjMuMTQ0MDkzIDI1NS42NzI1NDYgCkwgMzYzLjU0MTYwNCAyNTUuOTU0MjggCkwgMzYzLjgzNzU0NiAyNTYuMDQ4ODM4IApMIDM2NC4zMjY2OCAyNTYuNDMwMzU3IApMIDM2NC42MTc3MzYgMjU2LjUyNjU3IApMIDM2NC45MDcwMDEgMjU2LjcyMDAxNCAKTCAzNjUuMDk4ODYgMjU2LjgxNzI0OSAKTCAzNjUuMzg1MTg4IDI1Ny4wMTI3NTggCkwgMzY1LjY2OTc4MiAyNTcuMTExMDM3IApMIDM2NS45NTI2NjQgMjU3LjMwODY1NiAKTCAzNjYuMTQwMzEgMjU3LjQwODAwMSAKTCAzNjYuNDIwMzgzIDI1Ny42MDc3NzYgCkwgMzY2LjY5ODc5NiAyNTcuNzA4MjExIApMIDM2Ny4wNjc0NjggMjU4LjAxMTczOCAKTCAzNjcuMzQyMDg2IDI1OC4xMTM2NjMgCkwgMzY3LjYxNTEwOSAyNTguMzE4NjU2IApMIDM2Ny44ODY1NTYgMjU4LjQyMTcyOSAKTCAzNjguMTU2NDQ0IDI1OC42MjkwNDMgCkwgMzY4LjQyNDc5MSAyNTguNzMzMjg5IApMIDM2OC42OTE2MTUgMjU4Ljk0Mjk3NyAKTCAzNjguOTU2OTMzIDI1OS4wNDg0MjQgCkwgMzY5LjMwODM3NyAyNTkuMzY3MjE1IApMIDM2OS42NTcyMTIgMjU5LjQ3NDMwNyAKTCAzNjkuOTE3MTUgMjU5LjY4OTc1IApMIDM3MC4yNjE1MTQgMjU5Ljc5ODEwOSAKTCAzNzAuNTE4MTQgMjYwLjAxNjExOCAKTCAzNzAuNzczMzc0IDI2MC4xMjU3NzQgCkwgMzcxLjAyNzIyOSAyNjAuMzQ2NDA5IApMIDM3MS4zNjM1ODQgMjYwLjQ1NzM5NSAKTCAzNzEuNjE0Mjc5IDI2MC42ODA3MiAKTCAzNzEuODYzNjQ1IDI2MC42ODA3MiAKTCAzNzIuMTk0MDg5IDI2MS4wMTkxNTEgCkwgMzcyLjI3NjMzOCAyNjEuMDE5MTUxIApMIDM3Mi40NDA0MDYgMjYxLjEzMjg5NCAKTCAzNzIuNjAzOTAzIDI2MS4xMzI4OTQgCkwgMzcyLjkyOTIwMSAyNjEuNDc2OTc3IApMIDM3My4xNzE3MDUgMjYxLjQ3Njk3NyAKTCAzNzMuNDEyOTY1IDI2MS43MDg3ODMgCkwgMzczLjQ5MzExMSAyNjEuNzA4NzgzIApMIDM3My42NTI5OTMgMjYxLjgyNTQyNCAKTCAzNzMuODEyMzMzIDI2MS44MjU0MjQgCkwgMzc0LjA1MDMzNiAyNjIuMDYwMjAzIApMIDM3NC4xMjk0MDMgMjYyLjA2MDIwMyAKTCAzNzQuMjg3MTM5IDI2Mi4xNzgzNDkgCkwgMzc0LjM2NTgwOSAyNjIuMTc4MzQ5IApMIDM3NC42MDEwMzMgMjYyLjQxNjE3NiAKTCAzNzQuNjc5MTggMjYyLjQxNjE3NiAKTCAzNzQuODM1MDg1IDI2Mi41MzU4NjcgCkwgMzc1LjA2Nzk3NyAyNjIuNTM1ODY3IApMIDM3NS4yOTk3MjEgMjYyLjc3NjgyNCAKTCAzNzUuMzc2NzE2IDI2Mi43NzY4MjQgCkwgMzc1LjYwNjk0NyAyNjMuMDE5OTEzIApMIDM3NS44MzYwNTYgMjYzLjAxOTkxMyAKTCAzNzYuMDY0MDUzIDI2My4yNjUxNzMgCkwgMzc2LjEzOTgwNyAyNjMuMjY1MTczIApMIDM3Ni4yOTA5NSAyNjMuMzg4NjI5IApMIDM3Ni40NDE2MDggMjYzLjM4ODYyOSAKTCAzNzYuNTkxNzg1IDI2My41MTI2NDIgCkwgMzc2LjY2NjY5NCAyNjMuNTEyNjQyIApMIDM3Ni44OTA3MDggMjYzLjc2MjM2MSAKTCAzNzcuMTEzNjU4IDI2My43NjIzNjEgCkwgMzc3LjMzNTU1NyAyNjQuMDE0MzcxIApMIDM3Ny40ODI5MDkgMjY0LjAxNDM3MSAKTCAzNzcuNjI5ODAxIDI2NC4xNDEyNDkgCkwgMzc3Ljc3NjIzNSAyNjQuMTQxMjQ5IApMIDM3Ny45OTUwMzUgMjY0LjM5Njc3NSAKTCAzNzguMTQwMzM4IDI2NC4zOTY3NzUgCkwgMzc4LjM1NzQ1MyAyNjQuNjU0NzAxIApMIDM3OC42NDUzODkgMjY0LjY1NDcwMSAKTCAzNzguODYwMTg5IDI2NC45MTUwNzIgCkwgMzc5LjAwMjg0NiAyNjQuOTE1MDcyIApMIDM3OS4xNDUwNzEgMjY1LjA0NjE4OSAKTCAzNzkuMjg2ODY3IDI2NS4wNDYxODkgCkwgMzc5LjQyODIzNiAyNjUuMTc3OTM0IApMIDM3OS40OTg3NjIgMjY1LjE3NzkzNCAKTCAzNzkuNzA5NzA2IDI2NS40NDMzMzcgCkwgMzc5Ljk4OTUwMSAyNjUuNDQzMzM3IApMIDM4MC4xMjg3NzYgMjY1LjU3NzAwNiAKTCAzODAuMTk4MjYgMjY1LjU3NzAwNiAKTCAzODAuNDA2MDk1IDI2NS44NDYzMTEgCkwgMzgwLjY4MTc4NyAyNjUuODQ2MzExIApMIDM4MC44MTkwMjkgMjY1Ljk4MTk2IApMIDM4MC44ODc1IDI2NS45ODE5NiAKTCAzODEuMDI0MTQ0IDI2Ni4xMTgyODIgCkwgMzgxLjA5MjMxNyAyNjYuMTE4MjgyIApMIDM4MS4yMjgzNjcgMjY2LjI1NTI4NSAKTCAzODEuNDMxNzA3IDI2Ni4yNTUyODUgCkwgMzgxLjU2Njc4IDI2Ni4zOTI5NzQgCkwgMzgxLjYzNDE3MiAyNjYuMzkyOTc0IApMIDM4MS44MzU3NjcgMjY2LjY3MDQ0IApMIDM4MS45Njk2ODYgMjY2LjY3MDQ0IApMIDM4Mi4xMDMyMjQgMjY2LjgxMDIzMSAKTCAzODIuMzY5MTY3IDI2Ni44MTAyMzEgCkwgMzgyLjU2NzY0MiAyNjcuMDkxOTY2IApMIDM4Mi42OTk0OTUgMjY3LjA5MTk2NiAKTCAzODIuODMwOTc4IDI2Ny4yMzM5MjUgCkwgMzgzLjA5Mjg0NyAyNjcuMjMzOTI1IApMIDM4My4yMjMyMzcgMjY3LjM3NjYyMSAKTCAzODMuMjg4Mjk2IDI2Ny4zNzY2MjEgCkwgMzgzLjQxODE0NSAyNjcuNTIwMDYyIApMIDM4My40ODI5MzYgMjY3LjUyMDA2MiAKTCAzODMuNjEyMjQ5IDI2Ny42NjQyNTYgCkwgMzgzLjgwNTU1NCAyNjcuNjY0MjU2IApMIDM4My45MzM5ODQgMjY3LjgwOTIxMSAKTCAzODMuOTk4MDY4IDI2Ny44MDkyMTEgCkwgMzg0LjEyNTk3NCAyNjcuOTU0OTM1IApMIDM4NC4xODk3OTYgMjY3Ljk1NDkzNSAKTCAzODQuMzE3MTgyIDI2OC4xMDE0MzYgCkwgMzg0LjU3MDkyMyAyNjguMTAxNDM2IApMIDM4NC42OTcyODIgMjY4LjI0ODcyMyAKTCAzODQuODIzMzAyIDI2OC4yNDg3MjMgCkwgMzg0Ljk0ODk4NCAyNjguMzk2ODA0IApMIDM4NS4wMTE3IDI2OC4zOTY4MDQgCkwgMzg1LjEzNjg4MSAyNjguNTQ1Njg3IApMIDM4NS4xOTkzNDcgMjY4LjU0NTY4NyAKTCAzODUuMzI0MDI5IDI2OC42OTUzODIgCkwgMzg1LjU3MjQwNyAyNjguNjk1MzgyIApMIDM4NS42OTYxMDUgMjY4Ljg0NTg5NyAKTCAzODUuNzU3ODMzIDI2OC44NDU4OTcgCkwgMzg1Ljg4MTA0NSAyNjguOTk3MjQxIApMIDM4NS45NDI1MyAyNjguOTk3MjQxIApMIDM4Ni4wNjUyNTkgMjY5LjE0OTQyNCAKTCAzODYuMzcwNjg4IDI2OS4xNDk0MjQgCkwgMzg2LjQ5MjMwNyAyNjkuMzAyNDU0IApMIDM4Ni41NTI5OTggMjY5LjMwMjQ1NCAKTCAzODYuNjc0MTQ2IDI2OS40NTYzNDIgCkwgMzg2Ljc5NDk4MiAyNjkuNDU2MzQyIApMIDM4Ni45MTU1MDkgMjY5LjYxMTA5NyAKTCAzODcuMTU1NjM5IDI2OS42MTEwOTcgCkwgMzg3LjI3NTI0NiAyNjkuNzY2NzI4IApMIDM4Ny4zOTQ1NDkgMjY5Ljc2NjcyOCAKTCAzODcuNjMyMjUgMjcwLjA4MDY2MiAKTCAzODcuOTg2NTY0IDI3MC4wODA2NjIgCkwgMzg4LjE2MjcyNCAyNzAuMjM4OTg1IApMIDM4OC4yMjEyOTcgMjcwLjIzODk4NSAKTCAzODguNDU0ODY1IDI3MC41NTgzOTUgCkwgMzg4Ljg2MDgzNiAyNzAuNTU4Mzk1IApMIDM4OS4wOTEyNTUgMjcwLjg4MTU2MiAKTCAzODkuMjYzMzMxIDI3MC44ODE1NjIgCkwgMzg5LjQzNDc3OSAyNzEuMDQ0NTgzIApMIDM4OS40OTE3OSAyNzEuMDQ0NTgzIApMIDM4OS42NjI0MDkgMjcxLjIwODU3NyAKTCAzODkuODg4OTQxIDI3MS4yMDg1NzcgCkwgMzkwLjA1ODEyNyAyNzEuMzczNTU2IApMIDM5MC4xMTQzODcgMjcxLjM3MzU1NiAKTCAzOTAuMjgyNzY0IDI3MS41Mzk1MzEgCkwgMzkwLjMzODc1NyAyNzEuNTM5NTMxIApMIDM5MC41MDYzMzQgMjcxLjcwNjUxNiAKTCAzOTAuNzg0MzA4IDI3MS43MDY1MTYgCkwgMzkwLjk1MDMwOCAyNzEuODc0NTIyIApMIDM5MS4wMDU1MTEgMjcxLjg3NDUyMiAKTCAzOTEuMTcwNzMyIDI3Mi4wNDM1NjIgCkwgMzkxLjIyNTY3NyAyNzIuMDQzNTYyIApMIDM5MS4zOTAxMjcgMjcyLjIxMzY0OSAKTCAzOTEuNjYyOTM5IDI3Mi4yMTM2NDkgCkwgMzkxLjgyNTg2OSAyNzIuMzg0Nzk1IApMIDM5MS44ODAwNTQgMjcyLjM4NDc5NSAKTCAzOTIuMDQyMjM1IDI3Mi41NTcwMTUgCkwgMzkyLjA5NjE3MSAyNzIuNTU3MDE1IApMIDM5Mi4yNTc2MDkgMjcyLjczMDMyMSAKTCAzOTIuNTc4ODMyIDI3Mi43MzAzMjEgCkwgMzkyLjczODYyNCAyNzIuOTA0NzI3IApMIDM5Mi43OTE3NjcgMjcyLjkwNDcyNyAKTCAzOTIuOTUwODM4IDI3My4wODAyNDggCkwgMzkzLjA1NjU4NyAyNzMuMDgwMjQ4IApMIDM5My4yMTQ3NjUgMjczLjI1Njg5OCAKTCAzOTMuMjY3Mzc0IDI3My4yNTY4OTggCkwgMzkzLjQyNDg0NiAyNzMuNDM0NjkxIApMIDM5My43MzgyMTYgMjczLjQzNDY5MSAKTCAzOTMuODk0MTIxIDI3My42MTM2NDIgCkwgMzkzLjk0NTk3NSAyNzMuNjEzNjQyIApMIDM5NC4xMDExOTMgMjczLjc5Mzc2NyAKTCAzOTQuMjA0Mzg5IDI3My43OTM3NjcgCkwgMzk0LjM1ODc1OCAyNzMuOTc1MDggCkwgMzk0LjY2NTk4MyAyNzMuOTc1MDggCkwgMzk0LjgxODg0NyAyNzQuMTU3NTk4IApMIDM5NC45MjA0OCAyNzQuMTU3NTk4IApMIDM5NS4wNzI1MTkgMjc0LjM0MTMzOCAKTCAzOTUuMTczNjA2IDI3NC4zNDEzMzggCkwgMzk1LjMyNDgzIDI3NC41MjYzMTQgCkwgMzk1LjYyNTgyNiAyNzQuNTI2MzE0IApMIDM5NS43NzU2MDQgMjc0LjcxMjU0NSAKTCAzOTUuODc1MTkxIDI3NC43MTI1NDUgCkwgMzk2LjAyNDE3OCAyNzQuOTAwMDQ3IApMIDM5Ni4xMjMyNDEgMjc0LjkwMDA0NyAKTCAzOTYuMjcxNDQ2IDI3NS4wODg4MzcgCkwgMzk2LjYxNTQ0OSAyNzUuMDg4ODM3IApMIDM5Ni43NjIxMTEgMjc1LjI3ODkzNCAKTCAzOTYuODU5NjMzIDI3NS4yNzg5MzQgCkwgMzk3LjAwNTUzNyAyNzUuNDcwMzU2IApMIDM5Ny4xMDI1NTUgMjc1LjQ3MDM1NiAKTCAzOTcuMjQ3NzA4IDI3NS42NjMxMjEgCkwgMzk3LjYzMjYwNiAyNzUuNjYzMTIxIApMIDM5Ny43NzYxMzQgMjc1Ljg1NzI0OSAKTCAzOTcuODcxNTc2IDI3NS44NTcyNDkgCkwgMzk4LjAxNDM3OCAyNzYuMDUyNzU4IApMIDM5OC4xNTY3NDYgMjc2LjA1Mjc1OCAKTCAzOTguMjk4Njg1IDI3Ni4yNDk2NjggCkwgMzk4LjM5MzA3NCAyNzYuMjQ5NjY4IApMIDM5OC40ODcyNzMgMjc2LjQ0ODAwMSAKTCAzOTguNDg3MjczIDI3Ni40NDgwMDEgCiIgY2xpcC1wYXRoPSJ1cmwoI3A1ZTBmZDcwYzU4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZmYTUwMDsgc3Ryb2tlLXdpZHRoOiAxLjU7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0ibGluZTJkXzczIj4KICAgIDxwYXRoIGQ9Ik0gNzMuODMyNzI3IDg2LjMwNDIzMSAKTCAzOTguNDg3MjczIDI3Ni4wMjUyNzUgCkwgMzk4LjQ4NzI3MyAyNzYuMDI1Mjc1IAoiIGNsaXAtcGF0aD0idXJsKCNwNWUwZmQ3MGM1OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2UtZGFzaGFycmF5OiAxLjUsMi40NzU7IHN0cm9rZS1kYXNob2Zmc2V0OiAwOyBzdHJva2U6ICNmZjhjMDA7IHN0cm9rZS13aWR0aDogMS41Ii8+CiAgIDwvZz4KICAgPGcgaWQ9ImxpbmUyZF83NCI+CiAgICA8cGF0aCBkPSJNIDczLjgzMjcyNyA5Ni45NTU3MjkgCkwgMTA2LjQxNDM2NSAxMDIuNDk5MTQ4IApMIDEyNS40NzM0MDEgMTA4LjE2ODY5NSAKTCAxMzguOTk2MDAzIDExMy4xMzUzMjQgCkwgMTQ5LjQ4NDk0OCAxMTcuNDM2OTgxIApMIDE1OC4wNTUwMzkgMTIxLjE5ODQzNCAKTCAxNzEuNTc3NjQxIDEyNy41MTEzMTMgCkwgMTgyLjA2NjU4NSAxMzIuNjY5MDUgCkwgMTk0LjM5OTExNCAxMzguOTY5NjY2IApMIDIwOS42OTU3MTMgMTQ3LjA1NzIzMyAKTCAyMjYuOTgwNzUyIDE1Ni40NzE5MzQgCkwgMjQ3LjIyOTg2MSAxNjcuNzYyNzQ5IApMIDI2OC41ODIyOTcgMTc5Ljg2NTE3IApMIDMwNy40NDA2MjcgMjAyLjIwNzE2NSAKTCAzMzcuODUxMTE2IDIxOS44MzAxOSAKTCAzMzguNjk4MDgyIDIyMC4zNDE3MzEgCkwgMzQxLjQ2ODY5OCAyMjEuOTM2MTE5IApMIDM0My4zMzA1NCAyMjMuMDI0NDE1IApMIDM0OS4zMjExMzcgMjI2LjUwOTk5NCAKTCAzNTAuMTE3ODU3IDIyNi45NjYxOSAKTCAzNTEuNTQ0MzM2IDIyNy44MDAxNjIgCkwgMzUyLjE3ODY5NiAyMjguMTc1Mjg2IApMIDM1NS40NjM3MTkgMjMwLjA5NDk4MiAKTCAzNTcuODY4OTAzIDIzMS40OTIzMjggCkwgMzU4LjIwMjY3MSAyMzEuNjg2NzMgCkwgMzU5LjE4OTk4NCAyMzIuMjc4MzMgCkwgMzU5LjcyOTY2MSAyMzIuNTU4ODMyIApMIDM2MC41ODA0NiAyMzMuMDg3NDg4IApMIDM2MS4xMDQ0OTUgMjMzLjM3NjQxOSAKTCAzNjEuNzI1NzIgMjMzLjc1MjQyNiAKTCAzNjIuNDQwMjU2IDIzNC4xMzM2NSAKTCAzNjMuMDQ0MTg4IDIzNC41MjAyNCAKTCAzNjMuNzM5MTA1IDIzNC45MTIzNDkgCkwgMzY0LjEzMTYzNyAyMzUuMTMyNjMgCkwgMzY0LjkwNzAwMSAyMzUuNTc4NTY0IApMIDM2NS4yODk5MzkgMjM1LjgwNDI3NSAKTCAzNjYuMjMzODUzIDIzNi4zNTM2NzIgCkwgMzY2LjYwNjE3NSAyMzYuNTg1ODcgCkwgMzY4LjI0NjA2MyAyMzcuNTM0ODA0IApMIDM3MC43NzMzNzQgMjM5LjAyMjY1NCAKTCAzNzUuMzc2NzE2IDI0MS42OTY4MzcgCkwgMzc1LjQ1MzU4NSAyNDEuNjk2ODM3IApMIDM3NS42ODM0NDEgMjQxLjg2NTg3NyAKTCAzNzYuNTkxNzg1IDI0Mi40MzY5NzcgCkwgMzc2Ljc0MTQ4NCAyNDIuNDk0NzQ2IApMIDM3Ny4zMzU1NTcgMjQyLjg0MzkzMSAKTCAzNzcuNDgyOTA5IDI0Mi45MDI1NjMgCkwgMzc4LjIxMjgyMSAyNDMuMzc2MTc3IApMIDM3OC4zNTc0NTMgMjQzLjQzNTk1NyAKTCAzNzguODYwMTg5IDI0My43MzY4MjQgCkwgMzc5LjAwMjg0NiAyNDMuNzk3Mzk1IApMIDM3OS41NjkxODIgMjQ0LjE2MzY1MyAKTCAzNzkuNzA5NzA2IDI0NC4yMjUxNzMgCkwgMzgwLjE5ODI2IDI0NC41MzQ4NiAKTCAzODAuNDA2MDk1IDI0NC41OTcyMTggCkwgMzgwLjk1NTg3MiAyNDQuOTc0MzcyIApMIDM4MS4xNjAzOTEgMjQ1LjAzNzczNyAKTCAzODEuNjM0MTcyIDI0NS4zNTY3NzYgCkwgMzgxLjc2ODY2NSAyNDUuNDIxMDMxIApMIDM4Mi4xNjk4NTEgMjQ1LjY3OTU2NCAKTCAzODIuMzY5MTY3IDI0NS43NDQ1NzkgCkwgMzgyLjc2NTI4MiAyNDYuMDA2MTg5IApMIDM4Mi44OTY1ODIgMjQ2LjA3MTk4MyAKTCAzODMuMjg4Mjk2IDI0Ni4zMzY3NDYgCkwgMzgzLjQ4MjkzNiAyNDYuNDAzMzM3IApMIDM4My44MDU1NTQgMjQ2LjYwNDA4NSAKTCAzODMuOTMzOTg0IDI0Ni42NzEzMjkgCkwgMzg0LjI1MzUzMyAyNDYuODc0MDUyIApMIDM4NC4zODA3NDYgMjQ2Ljk0MTk2MSAKTCAzODQuNjk3MjgyIDI0Ny4xNDY2OTkgCkwgMzg0LjgyMzMwMiAyNDcuMjE1Mjg1IApMIDM4NS4wNzQzMzIgMjQ3LjM1Mjk3NCAKTCAzODUuMTk5MzQ3IDI0Ny40MjIwNzkgCkwgMzg1LjUxMDQzNSAyNDcuNjMwNDQxIApMIDM4NS43NTc4MzMgMjQ3LjcwMDI0NyAKTCAzODYuMTI2NTA0IDI0Ny45ODEyNjIgCkwgMzg2LjMwOTc2MSAyNDguMDUxOTY3IApMIDM4Ni41NTI5OTggMjQ4LjE5MzkyNSAKTCAzODYuNjc0MTQ2IDI0OC4yNjUxODEgCkwgMzg2LjkxNTUwOSAyNDguNDA4MjQ4IApMIDM4Ny4wMzU3MjcgMjQ4LjQ4MDA2MiAKTCAzODcuMjc1MjQ2IDI0OC42MjQyNTYgCkwgMzg3LjQ1NDA4NyAyNDguNjk2NjM4IApMIDM4Ny43NTA2NTIgMjQ4LjkxNDkzNSAKTCAzODcuOTI3Njk2IDI0OC45ODgwODggCkwgMzg4LjE2MjcyNCAyNDkuMTM0OTgxIApMIDM4OC4yNzk3OTggMjQ5LjIwODcyMyAKTCAzODguNTEzMDc2IDI0OS4zNTY4MDQgCkwgMzg4LjY4NzI3OCAyNDkuNDMxMTQ1IApMIDM4OC45MTg1NDcgMjQ5LjU4MDQzMyAKTCAzODkuMDkxMjU1IDI0OS42NTUzODIgCkwgMzg5LjMyMDU1IDI0OS44MDU4OTcgCkwgMzg5LjQ5MTc5IDI0OS44ODE0NjUgCkwgMzg5Ljc3NTgxMSAyNTAuMTA5NDI0IApMIDM4OS45NDU0MDQgMjUwLjE4NTgzMyAKTCAzOTAuMTcwNTggMjUwLjMzOTI5MSAKTCAzOTAuMzk0NjgyIDI1MC40MTYzNDMgCkwgMzkwLjYxNzcyMSAyNTAuNTcxMDk3IApMIDM5MC43ODQzMDggMjUwLjY0ODgwMyAKTCAzOTEuMDA1NTExIDI1MC44MDQ4NzcgCkwgMzkxLjE3MDczMiAyNTAuODgzMjQ4IApMIDM5MS4zOTAxMjcgMjUxLjA0MDY2MyAKTCAzOTEuNjA4NTAzIDI1MS4xMTk3MSAKTCAzOTEuODgwMDU0IDI1MS4zNTgyMjYgCkwgMzkyLjE1MDA0NiAyNTEuNDM4MTk0IApMIDM5Mi4zNjQ5MjggMjUxLjU5ODgzMSAKTCAzOTIuNTI1NDQ3IDI1MS42Nzk1MDQgCkwgMzkyLjczODYyNCAyNTEuODQxNTYzIApMIDM5Mi45NTA4MzggMjUxLjkyMjk1MiAKTCAzOTMuMTYyMDk4IDI1Mi4wODY0NTggCkwgMzkzLjQyNDg0NiAyNTIuMTY4NTc3IApMIDM5My42ODYxMzIgMjUyLjQxNjQxOSAKTCAzOTMuOTQ1OTc1IDI1Mi40OTk1MzIgCkwgMzk0LjE1MjgxOSAyNTIuNjY2NTE3IApMIDM5NC4zNTg3NTggMjUyLjc1MDM5MSAKTCAzOTQuNTYzNzk4IDI1Mi45MTg5MTMgCkwgMzk0LjgxODg0NyAyNTMuMDAzNTYzIApMIDM5NS4wMjE4OTQgMjUzLjE3MzY1IApMIDM5NS4yNzQ0NzYgMjUzLjI1OTA5IApMIDM5NS40NzU1NjkgMjUzLjQzMDc3MSAKTCAzOTUuNzI1NzMxIDI1My41MTcwMTYgCkwgMzk1Ljk3NDU2OSAyNTMuNzc3Mzg2IApMIDM5Ni4yNzE0NDYgMjUzLjg2NDcyOCAKTCAzOTYuNDY4MzI3IDI1NC4wNDAyNDkgCkwgMzk2Ljc2MjExMSAyNTQuMTI4NDMyIApMIDM5Ni45NTY5NTMgMjU0LjMwNTY1MSAKTCAzOTcuMTk5Mzc0IDI1NC4zOTQ2OTEgCkwgMzk3LjM5MjQxNSAyNTQuNTczNjQyIApMIDM5Ny42ODA0OTggMjU0LjY2MzU1NyAKTCAzOTcuODcxNTc2IDI1NC44NDQyNzQgCkwgMzk4LjE1Njc0NiAyNTQuOTM1MDgxIApMIDM5OC4zNDU5MDMgMjU1LjExNzU5OSAKTCAzOTguNDg3MjczIDI1NS4yMDkzMTUgCkwgMzk4LjQ4NzI3MyAyNTUuMjA5MzE1IAoiIGNsaXAtcGF0aD0idXJsKCNwNWUwZmQ3MGM1OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDgwMDA7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImxpbmUyZF83NSI+CiAgICA8cGF0aCBkPSJNIDczLjgzMjcyNyA2NS4zNjkwNzMgCkwgMzk4LjQ4NzI3MyAyNTUuMDkwMTE2IApMIDM5OC40ODcyNzMgMjU1LjA5MDExNiAKIiBjbGlwLXBhdGg9InVybCgjcDVlMGZkNzBjNTgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlLWRhc2hhcnJheTogMS41LDIuNDc1OyBzdHJva2UtZGFzaG9mZnNldDogMDsgc3Ryb2tlOiAjMDA2NDAwOyBzdHJva2Utd2lkdGg6IDEuNSIvPgogICA8L2c+CiAgIDxnIGlkPSJsaW5lMmRfNzYiPgogICAgPHBhdGggZD0iTSA3My44MzI3MjcgOTUuODIyODI5IApMIDEwNi40MTQzNjUgOTguNDQwODk2IApMIDEyNS40NzM0MDEgMTAyLjIxMTYwMSAKTCAxMzguOTk2MDAzIDEwNS45ODg2MTYgCkwgMTQ5LjQ4NDk0OCAxMDkuNDkyMTkxIApMIDE1OC4wNTUwMzkgMTEyLjY4NTE1MiAKTCAxNjUuMzAwOTQ5IDExNS41OTEwMjcgCkwgMTc3LjExNDA3NiAxMjAuNjgwNTgxIApMIDE4Ni41NDY2NzUgMTI1LjAxMzc1NiAKTCAxOTcuODgyNTg2IDEzMC40ODIzNjUgCkwgMjA5LjY5NTcxMyAxMzYuNDMxOTE4IApMIDIyMy4yMTgzMTUgMTQzLjQ4ODY2IApMIDIzOC4xODczNSAxNTEuNTM2NjMxIApMIDI1Ny43MTg4MDYgMTYyLjMxMDgzMiAKTCAyODIuNjYxMTgyIDE3Ni4zNzA3NjcgCkwgMzI4LjYyNjk2NiAyMDIuNzczMjc3IApMIDMzOC41Mjk5MDYgMjA4LjUwNzMwMSAKTCAzNDAuMDIyMjY1IDIwOS4zNTkzODMgCkwgMzQyLjI1MzQ0NyAyMTAuNjcxMDUxIApMIDM0My4zMzA1NCAyMTEuMjk1MzcyIApMIDM0Ni43MDUyMjkgMjEzLjI1ODI3MiAKTCAzNDcuNDA3ODYzIDIxMy42NjAxNjUgCkwgMzk4LjQ4NzI3MyAyNDMuMzc2MTc3IApMIDM5OC40ODcyNzMgMjQzLjM3NjE3NyAKIiBjbGlwLXBhdGg9InVybCgjcDVlMGZkNzBjNTgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmYwMDAwOyBzdHJva2Utd2lkdGg6IDEuNTsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICA8L2c+CiAgIDxnIGlkPSJsaW5lMmRfNzciPgogICAgPHBhdGggZD0iTSA3My44MzI3MjcgNTMuNTY4IApMIDM5OC40ODcyNzMgMjQzLjI4OTA0NCAKTCAzOTguNDg3MjczIDI0My4yODkwNDQgCiIgY2xpcC1wYXRoPSJ1cmwoI3A1ZTBmZDcwYzU4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZS1kYXNoYXJyYXk6IDEuNSwyLjQ3NTsgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7IHN0cm9rZTogIzhiMDAwMDsgc3Ryb2tlLXdpZHRoOiAxLjUiLz4KICAgPC9nPgogICA8ZyBpZD0icGF0Y2hfMyI+CiAgICA8cGF0aCBkPSJNIDU3LjYgMzA3LjU4NCAKTCA1Ny42IDQxLjQ3MiAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICA8L2c+CiAgIDxnIGlkPSJwYXRjaF80Ij4KICAgIDxwYXRoIGQ9Ik0gNDE0LjcyIDMwNy41ODQgCkwgNDE0LjcyIDQxLjQ3MiAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICA8L2c+CiAgIDxnIGlkPSJwYXRjaF81Ij4KICAgIDxwYXRoIGQ9Ik0gNTcuNiAzMDcuNTg0IApMIDQxNC43MiAzMDcuNTg0IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InBhdGNoXzYiPgogICAgPHBhdGggZD0iTSA1Ny42IDQxLjQ3MiAKTCA0MTQuNzIgNDEuNDcyIAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InRleHRfMTEiPgogICAgPCEtLSBDb25maWRlbmNlLWJhc2VkIEVycm9yIFByb2JhYmlsaXRpZXMgKGFuZCBIZXVyaXN0aWNzKSAtLT4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc3LjU2ODc1IDM1LjQ3Mikgc2NhbGUoMC4xMiAtMC4xMikiPgogICAgIDxkZWZzPgogICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy00MyIgZD0iTSA0MTIyIDQzMDYgCkwgNDEyMiAzNjQxIApRIDM4MDMgMzkzOCAzNDQyIDQwODQgClEgMzA4MSA0MjMxIDI2NzUgNDIzMSAKUSAxODc1IDQyMzEgMTQ1MCAzNzQyIApRIDEwMjUgMzI1MyAxMDI1IDIzMjggClEgMTAyNSAxNDA2IDE0NTAgOTE3IApRIDE4NzUgNDI4IDI2NzUgNDI4IApRIDMwODEgNDI4IDM0NDIgNTc1IApRIDM4MDMgNzIyIDQxMjIgMTAxOSAKTCA0MTIyIDM1OSAKUSAzNzkxIDEzNCAzNDIwIDIxIApRIDMwNTAgLTkxIDI2MzggLTkxIApRIDE1NzggLTkxIDk2OCA1NTcgClEgMzU5IDEyMDYgMzU5IDIzMjggClEgMzU5IDM0NTMgOTY4IDQxMDEgClEgMTU3OCA0NzUwIDI2MzggNDc1MCAKUSAzMDU2IDQ3NTAgMzQyNiA0NjM5IApRIDM3OTcgNDUyOCA0MTIyIDQzMDYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy02MyIgZD0iTSAzMTIyIDMzNjYgCkwgMzEyMiAyODI4IApRIDI4NzggMjk2MyAyNjMzIDMwMzAgClEgMjM4OCAzMDk3IDIxMzggMzA5NyAKUSAxNTc4IDMwOTcgMTI2OCAyNzQyIApRIDk1OSAyMzg4IDk1OSAxNzQ3IApRIDk1OSAxMTA2IDEyNjggNzUxIApRIDE1NzggMzk3IDIxMzggMzk3IApRIDIzODggMzk3IDI2MzMgNDY0IApRIDI4NzggNTMxIDMxMjIgNjY2IApMIDMxMjIgMTM0IApRIDI4ODEgMjIgMjYyMyAtMzQgClEgMjM2NiAtOTEgMjA3NSAtOTEgClEgMTI4NCAtOTEgODE4IDQwNiAKUSAzNTMgOTAzIDM1MyAxNzQ3IApRIDM1MyAyNjAzIDgyMyAzMDkzIApRIDEyOTQgMzU4NCAyMTEzIDM1ODQgClEgMjM3OCAzNTg0IDI2MzEgMzUyOSAKUSAyODg0IDM0NzUgMzEyMiAzMzY2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMmQiIGQ9Ik0gMzEzIDIwMDkgCkwgMTk5NyAyMDA5IApMIDE5OTcgMTQ5NyAKTCAzMTMgMTQ5NyAKTCAzMTMgMjAwOSAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTI4IiBkPSJNIDE5ODQgNDg1NiAKUSAxNTY2IDQxMzggMTM2MiAzNDM0IApRIDExNTkgMjczMSAxMTU5IDIwMDkgClEgMTE1OSAxMjg4IDEzNjQgNTgwIApRIDE1NjkgLTEyOCAxOTg0IC04NDQgCkwgMTQ4NCAtODQ0IApRIDEwMTYgLTEwOSA3ODMgNjAwIApRIDU1MCAxMzA5IDU1MCAyMDA5IApRIDU1MCAyNzA2IDc4MSAzNDEyIApRIDEwMTMgNDExOSAxNDg0IDQ4NTYgCkwgMTk4NCA0ODU2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNDgiIGQ9Ik0gNjI4IDQ2NjYgCkwgMTI1OSA0NjY2IApMIDEyNTkgMjc1MyAKTCAzNTUzIDI3NTMgCkwgMzU1MyA0NjY2IApMIDQxODQgNDY2NiAKTCA0MTg0IDAgCkwgMzU1MyAwIApMIDM1NTMgMjIyMiAKTCAxMjU5IDIyMjIgCkwgMTI1OSAwIApMIDYyOCAwIApMIDYyOCA0NjY2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMjkiIGQ9Ik0gNTEzIDQ4NTYgCkwgMTAxMyA0ODU2IApRIDE0ODEgNDExOSAxNzE0IDM0MTIgClEgMTk0NyAyNzA2IDE5NDcgMjAwOSAKUSAxOTQ3IDEzMDkgMTcxNCA2MDAgClEgMTQ4MSAtMTA5IDEwMTMgLTg0NCAKTCA1MTMgLTg0NCAKUSA5MjggLTEyOCAxMTMzIDU4MCAKUSAxMzM4IDEyODggMTMzOCAyMDA5IApRIDEzMzggMjczMSAxMTMzIDM0MzQgClEgOTI4IDQxMzggNTEzIDQ4NTYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgIDwvZGVmcz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTQzIi8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZiIgeD0iNjkuODI0MjE5Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZSIgeD0iMTMxLjAwNTg1OSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjYiIHg9IjE5NC4zODQ3NjYiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY5IiB4PSIyMjkuNTg5ODQ0Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NCIgeD0iMjU3LjM3MzA0NyIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjMyMC44NDk2MDkiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZlIiB4PSIzODIuMzczMDQ3Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIgeD0iNDQ1Ljc1MTk1MyIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjUwMC43MzI0MjIiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJkIiB4PSI1NjIuMjU1ODU5Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MiIgeD0iNTk4LjMzOTg0NCIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjY2MS44MTY0MDYiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI3MjMuMDk1NzAzIi8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iNzc1LjE5NTMxMiIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjQiIHg9IjgzNi43MTg3NSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjkwMC4xOTUzMTIiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTQ1IiB4PSI5MzEuOTgyNDIyIi8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iOTk1LjE2NjAxNiIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzIiIHg9IjEwMzQuNTI5Mjk3Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZiIgeD0iMTA3My4zOTI1NzgiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSIxMTM0LjU3NDIxOSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjExNzUuNjg3NSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNTAiIHg9IjEyMDcuNDc0NjA5Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iMTI2Ni4wMjczNDQiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZmIiB4PSIxMzA0Ljg5MDYyNSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjIiIHg9IjEzNjYuMDcyMjY2Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MSIgeD0iMTQyOS41NDg4MjgiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYyIiB4PSIxNDkwLjgyODEyNSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjkiIHg9IjE1NTQuMzA0Njg4Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iMTU4Mi4wODc4OTEiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY5IiB4PSIxNjA5Ljg3MTA5NCIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjE2MzcuNjU0Mjk3Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02OSIgeD0iMTY3Ni44NjMyODEiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIxNzA0LjY0NjQ4NCIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9IjE3NjYuMTY5OTIyIi8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iMTgxOC4yNjk1MzEiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTI4IiB4PSIxODUwLjA1NjY0MSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjE4ODkuMDcwMzEyIi8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZSIgeD0iMTk1MC4zNDk2MDkiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY0IiB4PSIyMDEzLjcyODUxNiIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjIwNzcuMjA1MDc4Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy00OCIgeD0iMjEwOC45OTIxODgiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIyMTg0LjE4NzUiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTc1IiB4PSIyMjQ1LjcxMDkzOCIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzIiIHg9IjIzMDkuMDg5ODQ0Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02OSIgeD0iMjM1MC4yMDMxMjUiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSIyMzc3Ljk4NjMyOCIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjI0MzAuMDg1OTM4Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02OSIgeD0iMjQ2OS4yOTQ5MjIiLz4KICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYzIiB4PSIyNDk3LjA3ODEyNSIvPgogICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9IjI1NTIuMDU4NTk0Ii8+CiAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yOSIgeD0iMjYwNC4xNTgyMDMiLz4KICAgIDwvZz4KICAgPC9nPgogICA8ZyBpZD0ibGVnZW5kXzEiPgogICAgPGcgaWQ9InBhdGNoXzciPgogICAgIDxwYXRoIGQ9Ik0gMjgzLjk3NDY4OCAxNjYuODk3IApMIDQwNy43MiAxNjYuODk3IApRIDQwOS43MiAxNjYuODk3IDQwOS43MiAxNjQuODk3IApMIDQwOS43MiA0OC40NzIgClEgNDA5LjcyIDQ2LjQ3MiA0MDcuNzIgNDYuNDcyIApMIDI4My45NzQ2ODggNDYuNDcyIApRIDI4MS45NzQ2ODggNDYuNDcyIDI4MS45NzQ2ODggNDguNDcyIApMIDI4MS45NzQ2ODggMTY0Ljg5NyAKUSAyODEuOTc0Njg4IDE2Ni44OTcgMjgzLjk3NDY4OCAxNjYuODk3IAp6CiIgc3R5bGU9ImZpbGw6ICNmZmZmZmY7IG9wYWNpdHk6IDAuODsgc3Ryb2tlOiAjY2NjY2NjOyBzdHJva2UtbGluZWpvaW46IG1pdGVyIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzc4Ij4KICAgICA8cGF0aCBkPSJNIDI4NS45NzQ2ODggNTQuNTcwNDM4IApMIDI5NS45NzQ2ODggNTQuNTcwNDM4IApMIDMwNS45NzQ2ODggNTQuNTcwNDM4IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwZmY7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xMiI+CiAgICAgPCEtLSBjb25maWRlbmNlID0gMC41IC0tPgogICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMxMy45NzQ2ODggNTguMDcwNDM4KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8ZGVmcz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTNkIiBkPSJNIDY3OCAyOTA2IApMIDQ2ODQgMjkwNiAKTCA0Njg0IDIzODEgCkwgNjc4IDIzODEgCkwgNjc4IDI5MDYgCnoKTSA2NzggMTYzMSAKTCA0Njg0IDE2MzEgCkwgNDY4NCAxMTAwIApMIDY3OCAxMTAwIApMIDY3OCAxNjMxIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTJlIiBkPSJNIDY4NCA3OTQgCkwgMTM0NCA3OTQgCkwgMTM0NCAwIApMIDY4NCAwIApMIDY4NCA3OTQgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzUiIGQ9Ik0gNjkxIDQ2NjYgCkwgMzE2OSA0NjY2IApMIDMxNjkgNDEzNCAKTCAxMjY5IDQxMzQgCkwgMTI2OSAyOTkxIApRIDE0MDYgMzAzOCAxNTQzIDMwNjEgClEgMTY4MSAzMDg0IDE4MTkgMzA4NCAKUSAyNjAwIDMwODQgMzA1NiAyNjU2IApRIDM1MTMgMjIyOCAzNTEzIDE0OTcgClEgMzUxMyA3NDQgMzA0NCAzMjYgClEgMjU3NSAtOTEgMTcyMiAtOTEgClEgMTQyOCAtOTEgMTEyMyAtNDEgClEgODE5IDkgNDk0IDEwOSAKTCA0OTQgNzQ0IApRIDc3NSA1OTEgMTA3NSA1MTYgClEgMTM3NSA0NDEgMTcwOSA0NDEgClEgMjI1MCA0NDEgMjU2NSA3MjUgClEgMjg4MSAxMDA5IDI4ODEgMTQ5NyAKUSAyODgxIDE5ODQgMjU2NSAyMjY4IApRIDIyNTAgMjU1MyAxNzA5IDI1NTMgClEgMTQ1NiAyNTUzIDEyMDQgMjQ5NyAKUSA5NTMgMjQ0MSA2OTEgMjMyMiAKTCA2OTEgNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgIDwvZGVmcz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZmIiB4PSI1NC45ODA0NjkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZSIgeD0iMTE2LjE2MjEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY2IiB4PSIxNzkuNTQxMDE2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjkiIHg9IjIxNC43NDYwOTQiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NCIgeD0iMjQyLjUyOTI5NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIzMDYuMDA1ODU5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjM2Ny41MjkyOTciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIgeD0iNDMwLjkwODIwMyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSI0ODUuODg4NjcyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjU0Ny40MTIxMDkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zZCIgeD0iNTc5LjE5OTIxOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI2NjIuOTg4MjgxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjY5NC43NzUzOTEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZSIgeD0iNzU4LjM5ODQzOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM1IiB4PSI3OTAuMTg1NTQ3Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF83OSI+CiAgICAgPHBhdGggZD0iTSAyODUuOTc0Njg4IDY5LjI0ODU2MyAKTCAyOTUuOTc0Njg4IDY5LjI0ODU2MyAKTCAzMDUuOTc0Njg4IDY5LjI0ODU2MyAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlLWRhc2hhcnJheTogMS41LDIuNDc1OyBzdHJva2UtZGFzaG9mZnNldDogMDsgc3Ryb2tlOiAjMDAwMDhiOyBzdHJva2Utd2lkdGg6IDEuNSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMTMiPgogICAgIDwhLS0gMC43L24gLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzEzLjk3NDY4OCA3Mi43NDg1NjMpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzciIGQ9Ik0gNTI1IDQ2NjYgCkwgMzUyNSA0NjY2IApMIDM1MjUgNDM5NyAKTCAxODMxIDAgCkwgMTE3MiAwIApMIDI3NjYgNDEzNCAKTCA1MjUgNDEzNCAKTCA1MjUgNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0yZiIgZD0iTSAxNjI1IDQ2NjYgCkwgMjE1NiA0NjY2IApMIDUzMSAtNTk0IApMIDAgLTU5NCAKTCAxNjI1IDQ2NjYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8L2RlZnM+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZSIgeD0iNjMuNjIzMDQ3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzciIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJmIiB4PSIxNTkuMDMzMjAzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjE5Mi43MjQ2MDkiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzgwIj4KICAgICA8cGF0aCBkPSJNIDI4NS45NzQ2ODggODMuOTI2Njg4IApMIDI5NS45NzQ2ODggODMuOTI2Njg4IApMIDMwNS45NzQ2ODggODMuOTI2Njg4IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmZmE1MDA7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xNCI+CiAgICAgPCEtLSBjb25maWRlbmNlID0gMC43NSAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTMuOTc0Njg4IDg3LjQyNjY4OCkgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZmIiB4PSI1NC45ODA0NjkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZSIgeD0iMTE2LjE2MjEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY2IiB4PSIxNzkuNTQxMDE2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjkiIHg9IjIxNC43NDYwOTQiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NCIgeD0iMjQyLjUyOTI5NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSIzMDYuMDA1ODU5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjM2Ny41MjkyOTciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIgeD0iNDMwLjkwODIwMyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSI0ODUuODg4NjcyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjU0Ny40MTIxMDkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zZCIgeD0iNTc5LjE5OTIxOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI2NjIuOTg4MjgxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjY5NC43NzUzOTEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZSIgeD0iNzU4LjM5ODQzOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM3IiB4PSI3OTAuMTg1NTQ3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzUiIHg9Ijg1My44MDg1OTQiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzgxIj4KICAgICA8cGF0aCBkPSJNIDI4NS45NzQ2ODggOTguNjA0ODEzIApMIDI5NS45NzQ2ODggOTguNjA0ODEzIApMIDMwNS45NzQ2ODggOTguNjA0ODEzIAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2UtZGFzaGFycmF5OiAxLjUsMi40NzU7IHN0cm9rZS1kYXNob2Zmc2V0OiAwOyBzdHJva2U6ICNmZjhjMDA7IHN0cm9rZS13aWR0aDogMS41Ii8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xNSI+CiAgICAgPCEtLSAxLjQvbiAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTMuOTc0Njg4IDEwMi4xMDQ4MTMpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzQiIGQ9Ik0gMjQxOSA0MTE2IApMIDgyNSAxNjI1IApMIDI0MTkgMTYyNSAKTCAyNDE5IDQxMTYgCnoKTSAyMjUzIDQ2NjYgCkwgMzA0NyA0NjY2IApMIDMwNDcgMTYyNSAKTCAzNzEzIDE2MjUgCkwgMzcxMyAxMTAwIApMIDMwNDcgMTEwMCAKTCAzMDQ3IDAgCkwgMjQxOSAwIApMIDI0MTkgMTEwMCAKTCAzMTMgMTEwMCAKTCAzMTMgMTcwOSAKTCAyMjUzIDQ2NjYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8L2RlZnM+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZSIgeD0iNjMuNjIzMDQ3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzQiIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJmIiB4PSIxNTkuMDMzMjAzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjE5Mi43MjQ2MDkiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzgyIj4KICAgICA8cGF0aCBkPSJNIDI4NS45NzQ2ODggMTEzLjI4MjkzOCAKTCAyOTUuOTc0Njg4IDExMy4yODI5MzggCkwgMzA1Ljk3NDY4OCAxMTMuMjgyOTM4IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDgwMDA7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xNiI+CiAgICAgPCEtLSBjb25maWRlbmNlID0gMC45NSAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTMuOTc0Njg4IDExNi43ODI5MzgpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzkiIGQ9Ik0gNzAzIDk3IApMIDcwMyA2NzIgClEgOTQxIDU1OSAxMTg0IDUwMCAKUSAxNDI4IDQ0MSAxNjYzIDQ0MSAKUSAyMjg4IDQ0MSAyNjE3IDg2MSAKUSAyOTQ3IDEyODEgMjk5NCAyMTM4IApRIDI4MTMgMTg2OSAyNTM0IDE3MjUgClEgMjI1NiAxNTgxIDE5MTkgMTU4MSAKUSAxMjE5IDE1ODEgODExIDIwMDQgClEgNDAzIDI0MjggNDAzIDMxNjMgClEgNDAzIDM4ODEgODI4IDQzMTUgClEgMTI1MyA0NzUwIDE5NTkgNDc1MCAKUSAyNzY5IDQ3NTAgMzE5NSA0MTI5IApRIDM2MjIgMzUwOSAzNjIyIDIzMjggClEgMzYyMiAxMjI1IDMwOTggNTY3IApRIDI1NzUgLTkxIDE2OTEgLTkxIApRIDE0NTMgLTkxIDEyMDkgLTQ0IApRIDk2NiAzIDcwMyA5NyAKegpNIDE5NTkgMjA3NSAKUSAyMzg0IDIwNzUgMjYzMiAyMzY1IApRIDI4ODEgMjY1NiAyODgxIDMxNjMgClEgMjg4MSAzNjY2IDI2MzIgMzk1OCAKUSAyMzg0IDQyNTAgMTk1OSA0MjUwIApRIDE1MzQgNDI1MCAxMjg2IDM5NTggClEgMTAzOCAzNjY2IDEwMzggMzE2MyAKUSAxMDM4IDI2NTYgMTI4NiAyMzY1IApRIDE1MzQgMjA3NSAxOTU5IDIwNzUgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8L2RlZnM+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZiIgeD0iNTQuOTgwNDY5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjExNi4xNjIxMDkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NiIgeD0iMTc5LjU0MTAxNiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY5IiB4PSIyMTQuNzQ2MDk0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjQiIHg9IjI0Mi41MjkyOTciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iMzA2LjAwNTg1OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZlIiB4PSIzNjcuNTI5Mjk3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiIHg9IjQzMC45MDgyMDMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iNDg1Ljg4ODY3MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI1NDcuNDEyMTA5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtM2QiIHg9IjU3OS4xOTkyMTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iNjYyLjk4ODI4MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2OTQuNzc1MzkxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMmUiIHg9Ijc1OC4zOTg0MzgiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zOSIgeD0iNzkwLjE4NTU0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM1IiB4PSI4NTMuODA4NTk0Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF84MyI+CiAgICAgPHBhdGggZD0iTSAyODUuOTc0Njg4IDEyNy45NjEwNjMgCkwgMjk1Ljk3NDY4OCAxMjcuOTYxMDYzIApMIDMwNS45NzQ2ODggMTI3Ljk2MTA2MyAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlLWRhc2hhcnJheTogMS41LDIuNDc1OyBzdHJva2UtZGFzaG9mZnNldDogMDsgc3Ryb2tlOiAjMDA2NDAwOyBzdHJva2Utd2lkdGg6IDEuNSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMTciPgogICAgIDwhLS0gMy4wL24gLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzEzLjk3NDY4OCAxMzEuNDYxMDYzKSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMmUiIHg9IjYzLjYyMzA0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI5NS40MTAxNTYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZiIgeD0iMTU5LjAzMzIwMyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZlIiB4PSIxOTIuNzI0NjA5Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF84NCI+CiAgICAgPHBhdGggZD0iTSAyODUuOTc0Njg4IDE0Mi42MzkxODggCkwgMjk1Ljk3NDY4OCAxNDIuNjM5MTg4IApMIDMwNS45NzQ2ODggMTQyLjYzOTE4OCAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmYwMDAwOyBzdHJva2Utd2lkdGg6IDEuNTsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMTgiPgogICAgIDwhLS0gY29uZmlkZW5jZSA9IDAuOTkgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzEzLjk3NDY4OCAxNDYuMTM5MTg4KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjU0Ljk4MDQ2OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZlIiB4PSIxMTYuMTYyMTA5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjYiIHg9IjE3OS41NDEwMTYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02OSIgeD0iMjE0Ljc0NjA5NCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY0IiB4PSIyNDIuNTI5Mjk3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjMwNi4wMDU4NTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZSIgeD0iMzY3LjUyOTI5NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYzIiB4PSI0MzAuOTA4MjAzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjQ4NS44ODg2NzIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iNTQ3LjQxMjEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTNkIiB4PSI1NzkuMTk5MjE5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjY2Mi45ODgyODEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iNjk0Ljc3NTM5MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJlIiB4PSI3NTguMzk4NDM4Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzkiIHg9Ijc5MC4xODU1NDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zOSIgeD0iODUzLjgwODU5NCIvPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJsaW5lMmRfODUiPgogICAgIDxwYXRoIGQ9Ik0gMjg1Ljk3NDY4OCAxNTcuMzE3MzEzIApMIDI5NS45NzQ2ODggMTU3LjMxNzMxMyAKTCAzMDUuOTc0Njg4IDE1Ny4zMTczMTMgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZS1kYXNoYXJyYXk6IDEuNSwyLjQ3NTsgc3Ryb2tlLWRhc2hvZmZzZXQ6IDA7IHN0cm9rZTogIzhiMDAwMDsgc3Ryb2tlLXdpZHRoOiAxLjUiLz4KICAgIDwvZz4KICAgIDxnIGlkPSJ0ZXh0XzE5Ij4KICAgICA8IS0tIDQuNjEvbiAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTMuOTc0Njg4IDE2MC44MTczMTMpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzYiIGQ9Ik0gMjExMyAyNTg0IApRIDE2ODggMjU4NCAxNDM5IDIyOTMgClEgMTE5MSAyMDAzIDExOTEgMTQ5NyAKUSAxMTkxIDk5NCAxNDM5IDcwMSAKUSAxNjg4IDQwOSAyMTEzIDQwOSAKUSAyNTM4IDQwOSAyNzg2IDcwMSAKUSAzMDM0IDk5NCAzMDM0IDE0OTcgClEgMzAzNCAyMDAzIDI3ODYgMjI5MyAKUSAyNTM4IDI1ODQgMjExMyAyNTg0IAp6Ck0gMzM2NiA0NTYzIApMIDMzNjYgMzk4OCAKUSAzMTI4IDQxMDAgMjg4NiA0MTU5IApRIDI2NDQgNDIxOSAyNDA2IDQyMTkgClEgMTc4MSA0MjE5IDE0NTEgMzc5NyAKUSAxMTIyIDMzNzUgMTA3NSAyNTIyIApRIDEyNTkgMjc5NCAxNTM3IDI5MzkgClEgMTgxNiAzMDg0IDIxNTAgMzA4NCAKUSAyODUzIDMwODQgMzI2MSAyNjU3IApRIDM2NjkgMjIzMSAzNjY5IDE0OTcgClEgMzY2OSA3NzggMzI0NCAzNDMgClEgMjgxOSAtOTEgMjExMyAtOTEgClEgMTMwMyAtOTEgODc1IDUyOSAKUSA0NDcgMTE1MCA0NDcgMjMyOCAKUSA0NDcgMzQzNCA5NzIgNDA5MiAKUSAxNDk3IDQ3NTAgMjM4MSA0NzUwIApRIDI2MTkgNDc1MCAyODYxIDQ3MDMgClEgMzEwMyA0NjU2IDMzNjYgNDU2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgIDwvZGVmcz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zNCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJlIiB4PSI2My42MjMwNDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zNiIgeD0iOTUuNDEwMTU2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiIHg9IjE1OS4wMzMyMDMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZiIgeD0iMjIyLjY1NjI1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjI1Ni4zNDc2NTYiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgIDwvZz4KICA8L2c+CiA8L2c+CiA8ZGVmcz4KICA8Y2xpcFBhdGggaWQ9InA1ZTBmZDcwYzU4Ij4KICAgPHJlY3QgeD0iNTcuNiIgeT0iNDEuNDcyIiB3aWR0aD0iMzU3LjEyIiBoZWlnaHQ9IjI2Ni4xMTIiLz4KICA8L2NsaXBQYXRoPgogPC9kZWZzPgo8L3N2Zz4K" />
</figure>]]></summary>
</entry>
<entry>
    <title>When You Can’t Test Everything</title>
    <link href="https://tenticle.dev/posts/2025-12-14-when-you-cant-test-everything.html" />
    <id>https://tenticle.dev/posts/2025-12-14-when-you-cant-test-everything.html</id>
    <published>2025-12-14T00:00:00Z</published>
    <updated>2025-12-14T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>In the real world, there are many cases where we would like
all members of a set/population/… to satisfy a certain property,
but it is not practical (or possible) to test them all.</p>
<p>The set might be too big, individual tests themselves too time-consuming, or
too expensive in some other way. Or perhaps testing is destructive and after
testing all the elements you would have nothing left.</p>
<p>As an example, it might be a huge database with lots of entries.
Or an airport conducting deep security searches.</p>
<p>In any case, you take your budget (whether that is money, time, API calls,
…) and max it out running your tests. If you found an error, you have your
answer: the system is not error-free.</p>
<p>But what if no errors are found? Was it pure luck and the rest of the system
is full of errors? We can’t be certain, but hopefully we can have at least
some kind of probabilistic confidence.</p>
<p>Or perhaps you’d like to be able to talk to the rest of the business allowing
them to understand the relationship between the resource allocation on testing
and likelihood of there being undetected errors in the system.</p>
<h2 id="the-first-attempt-stumbling-in-the-dark">The First Attempt (Stumbling in the Dark)</h2>
<p>To start simple, let’s say we have 5 elements in total and are able
to test only 2 of them. It might be tempting to attempt the following
analysis:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> Untested | Tested   | Cumulative Probability</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>----------+----------+-----------------</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    X X X | . .      | P(e=3|c=2) = 1/8 (just this line)</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>    X X . | . .      |</span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>    X . X | . .      |</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>    . X X | . .      | P(e&gt;=2|c=2) = 1/2 (this and all previous lines)</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>    X . . | . .      |</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>    . X . | . .      |</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>    . . X | . .      | P(e&gt;=1|c=2) = 7/8 (this and all previous lines)</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a>    . . . | . .      |</span></code></pre></div>
<p>However, unless the probability of an individual element being faulty is 0.5,
this is not the case! Imagine the probability of an individual fault is 0.1.
The following table captures the probabilities.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> Untested | Probability | Cumulative</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>----------+-------------+------------</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>    X X X |       0.001 | P(e=3)  = 0.001</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>    X X . |       0.009 |</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a>    X . X |       0.009 |</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>    . X X |       0.009 | P(e&gt;=2) = 0.028</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>    X . . |       0.081 |</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a>    . X . |       0.081 |</span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a>    . . X |       0.081 | P(e&gt;=1) = 0.271</span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a>    . . . |       0.729 | Total   = 1</span></code></pre></div>
<p>So without prior knowledge of the probability of an individual failure, we
can’t say much.</p>
<h2 id="the-better-way">The Better Way</h2>
<p>Luckily, there is something we can do! We can ask:</p>
<blockquote>
<p>If there were <code>n</code> errors, what is the probability that we missed all of them?</p>
</blockquote>
<p>For the purposes of our analysis we can fix which elements are checked without
loss of generality. <abbr title="Good old hand-waving.">👋👋</abbr></p>
<div class="sourceCode" id="cb3"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a> Errs | Untested | Tested | Miss | P(seen=0|e=Errs) | Confidence Threshold</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>    0 |    . . . | . .    |      | 1                | 0</span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>    1 |    . . . | . X    |      | 3/5              | 2/5</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>      |    . . . | X .    |      | = 6/10           | = 4/10</span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a>      |    . . X | . .    | !    |                  |</span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a>      |    . X . | . .    | !    |                  |</span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a>      |    X . . | . .    | !    |                  |</span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a>    2 |    . . . | X X    |      | 3/10             | 7/10</span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a>      |    . . X | . X    |      |                  |</span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a>      |    . . X | X .    |      |                  |</span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a>      |    . X . | . X    |      |                  |</span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a>      |    . X . | X .    |      |                  |</span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a>      |    . X X | . .    | !    |                  |</span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a>      |    X . . | . X    |      |                  |</span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a>      |    X . . | X .    |      |                  |</span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a>      |    X . X | . .    | !    |                  |</span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a>      |    X X . | . .    | !    |                  |</span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true" tabindex="-1"></a>    3 |    . . X | X X    |      | 1/10             | 9/10</span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true" tabindex="-1"></a>      |    . X . | X X    |      |                  |</span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true" tabindex="-1"></a>      |    . X X | . X    |      |                  |</span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true" tabindex="-1"></a>      |    . X X | X .    |      |                  |</span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true" tabindex="-1"></a>      |    X . . | X X    |      |                  |</span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true" tabindex="-1"></a>      |    X . X | . X    |      |                  |</span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true" tabindex="-1"></a>      |    X . X | X .    |      |                  |</span>
<span id="cb3-29"><a href="#cb3-29" aria-hidden="true" tabindex="-1"></a>      |    X X . | . X    |      |                  |</span>
<span id="cb3-30"><a href="#cb3-30" aria-hidden="true" tabindex="-1"></a>      |    X X . | X .    |      |                  |</span>
<span id="cb3-31"><a href="#cb3-31" aria-hidden="true" tabindex="-1"></a>      |    X X X | . .    | !    |                  |</span>
<span id="cb3-32"><a href="#cb3-32" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-33"><a href="#cb3-33" aria-hidden="true" tabindex="-1"></a>    4 |    . X X | X X    |      | 0                | 1</span>
<span id="cb3-34"><a href="#cb3-34" aria-hidden="true" tabindex="-1"></a>      |    X . X | X X    |      |                  |</span>
<span id="cb3-35"><a href="#cb3-35" aria-hidden="true" tabindex="-1"></a>      |    X X . | X X    |      |                  |</span>
<span id="cb3-36"><a href="#cb3-36" aria-hidden="true" tabindex="-1"></a>      |    X X X | . X    |      |                  |</span>
<span id="cb3-37"><a href="#cb3-37" aria-hidden="true" tabindex="-1"></a>      |    X X X | X .    |      |                  |</span>
<span id="cb3-38"><a href="#cb3-38" aria-hidden="true" tabindex="-1"></a>------+----------+--------+------+------------------+------------</span>
<span id="cb3-39"><a href="#cb3-39" aria-hidden="true" tabindex="-1"></a>    5 |    X X X | X X    |      | 0                | 1</span></code></pre></div>
<p>Notice that this is okay to do, as all rows in a given group have the same
probability regardless of what is the probability of an individual element
being faulty! <strong>Assumption: Errors are randomly distributed across all
elements with equal probability.</strong> Also notice that we know for sure that
there are neither 4 nor 5 errors (as we would have observed a faulty element).</p>
<p>Now we can start asking questions:</p>
<blockquote>
<p>What is the smallest number of errors we are 100% sure we would have
found at least one?</p>
</blockquote>
<p>Well… 4. While this one is not very exciting, we can go further:</p>
<blockquote>
<p>What is the smallest number of errors we are at least 90% confident we would
have found at least one?</p>
</blockquote>
<p>Looking at our analysis: 3. And how would you answer:</p>
<blockquote>
<p>What is the smallest number of errors we are at least 95% confident we would
have found at least one?</p>
</blockquote>
<p>Again: 4. Thinking about these cases will allow us to notice patterns with
possibility to generalize. (And hopefully now the <code>P(seen=0|e=0) = 1</code> makes
sense too.)</p>
<h2 id="general-case">General Case 🫡💼</h2>
<p>In general, the probability of not having seen any error after taking <code>k</code>
samples without replacement from set of total size <code>n</code> given there are <code>e</code>
errors in the set is the number of ways to place <code>e</code> errors in untested
(<code>n-k</code>) positions divided by the number of ways to place <code>e</code> errors in all
positions, or in <abbr title="mathematics (inside joke)">mafs</abbr>:</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo>=</mo><mfrac><mrow><mo stretchy="true" form="prefix">(</mo><mfrac linethickness="0"><mrow><mi>n</mi><mo>−</mo><mi>k</mi></mrow><mi>e</mi></mfrac><mo stretchy="true" form="postfix">)</mo></mrow><mrow><mo stretchy="true" form="prefix">(</mo><mfrac linethickness="0"><mi>n</mi><mi>e</mi></mfrac><mo stretchy="true" form="postfix">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">
P = \frac{\binom{n-k}{e}}{\binom{n}{e}}
</annotation></semantics></math></p>
<p>And here are some graphs in case it helps you understand
things. Symmetry is not coincidental.</p>
<figure>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjY0OHB0IiBoZWlnaHQ9IjM2MHB0IiB2aWV3Qm94PSIwIDAgNjQ4IDM2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgPGNjOldvcms+CiAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICA8ZGM6ZGF0ZT4xOTgwLTAxLTAxVDAwOjAwOjAwKzAwOjAwPC9kYzpkYXRlPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6Y3JlYXRvcj4KICAgICA8Y2M6QWdlbnQ+CiAgICAgIDxkYzp0aXRsZT5NYXRwbG90bGliIHYzLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88L2RjOnRpdGxlPgogICAgIDwvY2M6QWdlbnQ+CiAgICA8L2RjOmNyZWF0b3I+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGRlZnM+CiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4qe3N0cm9rZS1saW5lam9pbjogcm91bmQ7IHN0cm9rZS1saW5lY2FwOiBidXR0fTwvc3R5bGU+CiA8L2RlZnM+CiA8ZyBpZD0iZmlndXJlXzEiPgogIDxnIGlkPSJwYXRjaF8xIj4KICAgPHBhdGggZD0iTSAwIDM2MCAKTCA2NDggMzYwIApMIDY0OCAwIApMIDAgMCAKegoiIHN0eWxlPSJmaWxsOiAjZmZmZmZmIi8+CiAgPC9nPgogIDxnIGlkPSJheGVzXzEiPgogICA8ZyBpZD0icGF0Y2hfMiI+CiAgICA8cGF0aCBkPSJNIDM5LjU4MTQ5IDMyNi42NDM1MSAKTCAzMzcuMzAwNjI1IDMyNi42NDM1MSAKTCAzMzcuMzAwNjI1IDIwLjYxNDQ3IApMIDM5LjU4MTQ5IDIwLjYxNDQ3IAp6CiIgc3R5bGU9ImZpbGw6ICNmZmZmZmYiLz4KICAgPC9nPgogICA8ZyBpZD0ibWF0cGxvdGxpYi5heGlzXzEiPgogICAgPGcgaWQ9Inh0aWNrXzEiPgogICAgIDxnIGlkPSJsaW5lMmRfMSI+CiAgICAgIDxwYXRoIGQ9Ik0gNTMuMTE0MTc4IDMyNi42NDM1MSAKTCA1My4xMTQxNzggMjAuNjE0NDcgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF8yIj4KICAgICAgPGRlZnM+CiAgICAgICA8cGF0aCBpZD0ibTQxZGNjODMwOGIiIGQ9Ik0gMCAwIApMIDAgMy41IAoiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZGVmcz4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iNTMuMTE0MTc4IiB5PSIzMjYuNjQzNTEiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMSI+CiAgICAgIDwhLS0gMCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDkuOTMyOTI4IDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zMCIgZD0iTSAyMDM0IDQyNTAgClEgMTU0NyA0MjUwIDEzMDEgMzc3MCAKUSAxMDU2IDMyOTEgMTA1NiAyMzI4IApRIDEwNTYgMTM2OSAxMzAxIDg4OSAKUSAxNTQ3IDQwOSAyMDM0IDQwOSAKUSAyNTI1IDQwOSAyNzcwIDg4OSAKUSAzMDE2IDEzNjkgMzAxNiAyMzI4IApRIDMwMTYgMzI5MSAyNzcwIDM3NzAgClEgMjUyNSA0MjUwIDIwMzQgNDI1MCAKegpNIDIwMzQgNDc1MCAKUSAyODE5IDQ3NTAgMzIzMyA0MTI5IApRIDM2NDcgMzUwOSAzNjQ3IDIzMjggClEgMzY0NyAxMTUwIDMyMzMgNTI5IApRIDI4MTkgLTkxIDIwMzQgLTkxIApRIDEyNTAgLTkxIDgzNiA1MjkgClEgNDIyIDExNTAgNDIyIDIzMjggClEgNDIyIDM1MDkgODM2IDQxMjkgClEgMTI1MCA0NzUwIDIwMzQgNDc1MCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIi8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zIj4KICAgICAgPHBhdGggZD0iTSAxMDcuMjQ0OTMgMzI2LjY0MzUxIApMIDEwNy4yNDQ5MyAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcGNiY2EzNTUzN2MpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzQiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI200MWRjYzgzMDhiIiB4PSIxMDcuMjQ0OTMiIHk9IjMyNi42NDM1MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF8yIj4KICAgICAgPCEtLSAyMDAgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk3LjcwMTE4IDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zMiIgZD0iTSAxMjI4IDUzMSAKTCAzNDMxIDUzMSAKTCAzNDMxIDAgCkwgNDY5IDAgCkwgNDY5IDUzMSAKUSA4MjggOTAzIDE0NDggMTUyOSAKUSAyMDY5IDIxNTYgMjIyOCAyMzM4IApRIDI1MzEgMjY3OCAyNjUxIDI5MTQgClEgMjc3MiAzMTUwIDI3NzIgMzM3OCAKUSAyNzcyIDM3NTAgMjUxMSAzOTg0IApRIDIyNTAgNDIxOSAxODMxIDQyMTkgClEgMTUzNCA0MjE5IDEyMDQgNDExNiAKUSA4NzUgNDAxMyA1MDAgMzgwMyAKTCA1MDAgNDQ0MSAKUSA4ODEgNDU5NCAxMjEyIDQ2NzIgClEgMTU0NCA0NzUwIDE4MTkgNDc1MCAKUSAyNTQ0IDQ3NTAgMjk3NSA0Mzg3IApRIDM0MDYgNDAyNSAzNDA2IDM0MTkgClEgMzQwNiAzMTMxIDMyOTggMjg3MyAKUSAzMTkxIDI2MTYgMjkwNiAyMjY2IApRIDI4MjggMjE3NSAyNDA5IDE3NDIgClEgMTk5MSAxMzA5IDEyMjggNTMxIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDwvZGVmcz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzIiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzMiPgogICAgIDxnIGlkPSJsaW5lMmRfNSI+CiAgICAgIDxwYXRoIGQ9Ik0gMTYxLjM3NTY4MiAzMjYuNjQzNTEgCkwgMTYxLjM3NTY4MiAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcGNiY2EzNTUzN2MpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI200MWRjYzgzMDhiIiB4PSIxNjEuMzc1NjgyIiB5PSIzMjYuNjQzNTEiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMyI+CiAgICAgIDwhLS0gNDAwIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNTEuODMxOTMyIDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zNCIgZD0iTSAyNDE5IDQxMTYgCkwgODI1IDE2MjUgCkwgMjQxOSAxNjI1IApMIDI0MTkgNDExNiAKegpNIDIyNTMgNDY2NiAKTCAzMDQ3IDQ2NjYgCkwgMzA0NyAxNjI1IApMIDM3MTMgMTYyNSAKTCAzNzEzIDExMDAgCkwgMzA0NyAxMTAwIApMIDMwNDcgMCAKTCAyNDE5IDAgCkwgMjQxOSAxMTAwIApMIDMxMyAxMTAwIApMIDMxMyAxNzA5IApMIDIyNTMgNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM0Ii8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjEyNy4yNDYwOTQiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja180Ij4KICAgICA8ZyBpZD0ibGluZTJkXzciPgogICAgICA8cGF0aCBkPSJNIDIxNS41MDY0MzMgMzI2LjY0MzUxIApMIDIxNS41MDY0MzMgMjAuNjE0NDcgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF84Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iMjE1LjUwNjQzMyIgeT0iMzI2LjY0MzUxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzQiPgogICAgICA8IS0tIDYwMCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA1Ljk2MjY4MyAzNDEuMjQxOTQ3KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMzYiIGQ9Ik0gMjExMyAyNTg0IApRIDE2ODggMjU4NCAxNDM5IDIyOTMgClEgMTE5MSAyMDAzIDExOTEgMTQ5NyAKUSAxMTkxIDk5NCAxNDM5IDcwMSAKUSAxNjg4IDQwOSAyMTEzIDQwOSAKUSAyNTM4IDQwOSAyNzg2IDcwMSAKUSAzMDM0IDk5NCAzMDM0IDE0OTcgClEgMzAzNCAyMDAzIDI3ODYgMjI5MyAKUSAyNTM4IDI1ODQgMjExMyAyNTg0IAp6Ck0gMzM2NiA0NTYzIApMIDMzNjYgMzk4OCAKUSAzMTI4IDQxMDAgMjg4NiA0MTU5IApRIDI2NDQgNDIxOSAyNDA2IDQyMTkgClEgMTc4MSA0MjE5IDE0NTEgMzc5NyAKUSAxMTIyIDMzNzUgMTA3NSAyNTIyIApRIDEyNTkgMjc5NCAxNTM3IDI5MzkgClEgMTgxNiAzMDg0IDIxNTAgMzA4NCAKUSAyODUzIDMwODQgMzI2MSAyNjU3IApRIDM2NjkgMjIzMSAzNjY5IDE0OTcgClEgMzY2OSA3NzggMzI0NCAzNDMgClEgMjgxOSAtOTEgMjExMyAtOTEgClEgMTMwMyAtOTEgODc1IDUyOSAKUSA0NDcgMTE1MCA0NDcgMjMyOCAKUSA0NDcgMzQzNCA5NzIgNDA5MiAKUSAxNDk3IDQ3NTAgMjM4MSA0NzUwIApRIDI2MTkgNDc1MCAyODYxIDQ3MDMgClEgMzEwMyA0NjU2IDMzNjYgNDU2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM2Ii8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjEyNy4yNDYwOTQiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja181Ij4KICAgICA8ZyBpZD0ibGluZTJkXzkiPgogICAgICA8cGF0aCBkPSJNIDI2OS42MzcxODUgMzI2LjY0MzUxIApMIDI2OS42MzcxODUgMjAuNjE0NDcgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF8xMCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbTQxZGNjODMwOGIiIHg9IjI2OS42MzcxODUiIHk9IjMyNi42NDM1MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF81Ij4KICAgICAgPCEtLSA4MDAgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2MC4wOTM0MzUgMzQxLjI0MTk0Nykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTM4IiBkPSJNIDIwMzQgMjIxNiAKUSAxNTg0IDIyMTYgMTMyNiAxOTc1IApRIDEwNjkgMTczNCAxMDY5IDEzMTMgClEgMTA2OSA4OTEgMTMyNiA2NTAgClEgMTU4NCA0MDkgMjAzNCA0MDkgClEgMjQ4NCA0MDkgMjc0MyA2NTEgClEgMzAwMyA4OTQgMzAwMyAxMzEzIApRIDMwMDMgMTczNCAyNzQ1IDE5NzUgClEgMjQ4OCAyMjE2IDIwMzQgMjIxNiAKegpNIDE0MDMgMjQ4NCAKUSA5OTcgMjU4NCA3NzAgMjg2MiAKUSA1NDQgMzE0MSA1NDQgMzU0MSAKUSA1NDQgNDEwMCA5NDIgNDQyNSAKUSAxMzQxIDQ3NTAgMjAzNCA0NzUwIApRIDI3MzEgNDc1MCAzMTI4IDQ0MjUgClEgMzUyNSA0MTAwIDM1MjUgMzU0MSAKUSAzNTI1IDMxNDEgMzI5OCAyODYyIApRIDMwNzIgMjU4NCAyNjY5IDI0ODQgClEgMzEyNSAyMzc4IDMzNzkgMjA2OCAKUSAzNjM0IDE3NTkgMzYzNCAxMzEzIApRIDM2MzQgNjM0IDMyMjAgMjcxIApRIDI4MDYgLTkxIDIwMzQgLTkxIApRIDEyNjMgLTkxIDg0OCAyNzEgClEgNDM0IDYzNCA0MzQgMTMxMyAKUSA0MzQgMTc1OSA2OTAgMjA2OCAKUSA5NDcgMjM3OCAxNDAzIDI0ODQgCnoKTSAxMTcyIDM0ODEgClEgMTE3MiAzMTE5IDEzOTggMjkxNiAKUSAxNjI1IDI3MTMgMjAzNCAyNzEzIApRIDI0NDEgMjcxMyAyNjcwIDI5MTYgClEgMjkwMCAzMTE5IDI5MDAgMzQ4MSAKUSAyOTAwIDM4NDQgMjY3MCA0MDQ3IApRIDI0NDEgNDI1MCAyMDM0IDQyNTAgClEgMTYyNSA0MjUwIDEzOTggNDA0NyAKUSAxMTcyIDM4NDQgMTE3MiAzNDgxIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDwvZGVmcz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzgiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzYiPgogICAgIDxnIGlkPSJsaW5lMmRfMTEiPgogICAgICA8cGF0aCBkPSJNIDMyMy43Njc5MzcgMzI2LjY0MzUxIApMIDMyMy43Njc5MzcgMjAuNjE0NDcgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF8xMiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbTQxZGNjODMwOGIiIHg9IjMyMy43Njc5MzciIHk9IjMyNi42NDM1MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF82Ij4KICAgICAgPCEtLSAxMDAwIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTEuMDQyOTM3IDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zMSIgZD0iTSA3OTQgNTMxIApMIDE4MjUgNTMxIApMIDE4MjUgNDA5MSAKTCA3MDMgMzg2NiAKTCA3MDMgNDQ0MSAKTCAxODE5IDQ2NjYgCkwgMjQ1MCA0NjY2IApMIDI0NTAgNTMxIApMIDM0ODEgNTMxIApMIDM0ODEgMCAKTCA3OTQgMCAKTCA3OTQgNTMxIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDwvZGVmcz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTkwLjg2OTE0MSIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfNyI+CiAgICAgPCEtLSBTYW1wbGVzIChrKSAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNTguNzAxOTk1IDM1NC45MjAwNzMpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNTMiIGQ9Ik0gMzQyNSA0NTEzIApMIDM0MjUgMzg5NyAKUSAzMDY2IDQwNjkgMjc0NyA0MTUzIApRIDI0MjggNDIzOCAyMTMxIDQyMzggClEgMTYxNiA0MjM4IDEzMzYgNDAzOCAKUSAxMDU2IDM4MzggMTA1NiAzNDY5IApRIDEwNTYgMzE1OSAxMjQyIDMwMDEgClEgMTQyOCAyODQ0IDE5NDcgMjc0NyAKTCAyMzI4IDI2NjkgClEgMzAzNCAyNTM0IDMzNzAgMjE5NSAKUSAzNzA2IDE4NTYgMzcwNiAxMjg4IApRIDM3MDYgNjA5IDMyNTEgMjU5IApRIDI3OTcgLTkxIDE5MTkgLTkxIApRIDE1ODggLTkxIDEyMTQgLTE2IApRIDg0MSA1OSA0NDEgMjA2IApMIDQ0MSA4NTYgClEgODI1IDY0MSAxMTk0IDUzMSAKUSAxNTYzIDQyMiAxOTE5IDQyMiAKUSAyNDU5IDQyMiAyNzUzIDYzNCAKUSAzMDQ3IDg0NyAzMDQ3IDEyNDEgClEgMzA0NyAxNTg0IDI4MzYgMTc3OCAKUSAyNjI1IDE5NzIgMjE0NCAyMDY5IApMIDE3NTkgMjE0NCAKUSAxMDUzIDIyODQgNzM3IDI1ODQgClEgNDIyIDI4ODQgNDIyIDM0MTkgClEgNDIyIDQwMzggODU4IDQzOTQgClEgMTI5NCA0NzUwIDIwNTkgNDc1MCAKUSAyMzg4IDQ3NTAgMjcyOCA0NjkwIApRIDMwNjkgNDYzMSAzNDI1IDQ1MTMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjEiIGQ9Ik0gMjE5NCAxNzU5IApRIDE0OTcgMTc1OSAxMjI4IDE2MDAgClEgOTU5IDE0NDEgOTU5IDEwNTYgClEgOTU5IDc1MCAxMTYxIDU3MCAKUSAxMzYzIDM5MSAxNzA5IDM5MSAKUSAyMTg4IDM5MSAyNDc3IDczMCAKUSAyNzY2IDEwNjkgMjc2NiAxNjMxIApMIDI3NjYgMTc1OSAKTCAyMTk0IDE3NTkgCnoKTSAzMzQxIDE5OTcgCkwgMzM0MSAwIApMIDI3NjYgMCAKTCAyNzY2IDUzMSAKUSAyNTY5IDIxMyAyMjc1IDYxIApRIDE5ODEgLTkxIDE1NTYgLTkxIApRIDEwMTkgLTkxIDcwMSAyMTEgClEgMzg0IDUxMyAzODQgMTAxOSAKUSAzODQgMTYwOSA3NzkgMTkwOSAKUSAxMTc1IDIyMDkgMTk1OSAyMjA5IApMIDI3NjYgMjIwOSAKTCAyNzY2IDIyNjYgClEgMjc2NiAyNjYzIDI1MDUgMjg4MCAKUSAyMjQ0IDMwOTcgMTc3MiAzMDk3IApRIDE0NzIgMzA5NyAxMTg3IDMwMjUgClEgOTAzIDI5NTMgNjQxIDI4MDkgCkwgNjQxIDMzNDEgClEgOTU2IDM0NjMgMTI1MyAzNTIzIApRIDE1NTAgMzU4NCAxODMxIDM1ODQgClEgMjU5MSAzNTg0IDI5NjYgMzE5MCAKUSAzMzQxIDI3OTcgMzM0MSAxOTk3IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTZkIiBkPSJNIDMzMjggMjgyOCAKUSAzNTQ0IDMyMTYgMzg0NCAzNDAwIApRIDQxNDQgMzU4NCA0NTUwIDM1ODQgClEgNTA5NyAzNTg0IDUzOTQgMzIwMSAKUSA1NjkxIDI4MTkgNTY5MSAyMTEzIApMIDU2OTEgMCAKTCA1MTEzIDAgCkwgNTExMyAyMDk0IApRIDUxMTMgMjU5NyA0OTM0IDI4NDAgClEgNDc1NiAzMDg0IDQzOTEgMzA4NCAKUSAzOTQ0IDMwODQgMzY4NCAyNzg3IApRIDM0MjUgMjQ5MSAzNDI1IDE5NzggCkwgMzQyNSAwIApMIDI4NDcgMCAKTCAyODQ3IDIwOTQgClEgMjg0NyAyNjAwIDI2NjkgMjg0MiAKUSAyNDkxIDMwODQgMjExOSAzMDg0IApRIDE2NzggMzA4NCAxNDE4IDI3ODYgClEgMTE1OSAyNDg4IDExNTkgMTk3OCAKTCAxMTU5IDAgCkwgNTgxIDAgCkwgNTgxIDM1MDAgCkwgMTE1OSAzNTAwIApMIDExNTkgMjk1NiAKUSAxMzU2IDMyNzggMTYzMSAzNDMxIApRIDE5MDYgMzU4NCAyMjg0IDM1ODQgClEgMjY2NiAzNTg0IDI5MzMgMzM5MCAKUSAzMjAwIDMxOTcgMzMyOCAyODI4IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTcwIiBkPSJNIDExNTkgNTI1IApMIDExNTkgLTEzMzEgCkwgNTgxIC0xMzMxIApMIDU4MSAzNTAwIApMIDExNTkgMzUwMCAKTCAxMTU5IDI5NjkgClEgMTM0MSAzMjgxIDE2MTcgMzQzMiAKUSAxODk0IDM1ODQgMjI3OCAzNTg0IApRIDI5MTYgMzU4NCAzMzE0IDMwNzggClEgMzcxMyAyNTcyIDM3MTMgMTc0NyAKUSAzNzEzIDkyMiAzMzE0IDQxNSAKUSAyOTE2IC05MSAyMjc4IC05MSAKUSAxODk0IC05MSAxNjE3IDYxIApRIDEzNDEgMjEzIDExNTkgNTI1IAp6Ck0gMzExNiAxNzQ3IApRIDMxMTYgMjM4MSAyODU1IDI3NDIgClEgMjU5NCAzMTAzIDIxMzggMzEwMyAKUSAxNjgxIDMxMDMgMTQyMCAyNzQyIApRIDExNTkgMjM4MSAxMTU5IDE3NDcgClEgMTE1OSAxMTEzIDE0MjAgNzUyIApRIDE2ODEgMzkxIDIxMzggMzkxIApRIDI1OTQgMzkxIDI4NTUgNzUyIApRIDMxMTYgMTExMyAzMTE2IDE3NDcgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNmMiIGQ9Ik0gNjAzIDQ4NjMgCkwgMTE3OCA0ODYzIApMIDExNzggMCAKTCA2MDMgMCAKTCA2MDMgNDg2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy02NSIgZD0iTSAzNTk3IDE4OTQgCkwgMzU5NyAxNjEzIApMIDk1MyAxNjEzIApRIDk5MSAxMDE5IDEzMTEgNzA4IApRIDE2MzEgMzk3IDIyMDMgMzk3IApRIDI1MzQgMzk3IDI4NDUgNDc4IApRIDMxNTYgNTU5IDM0NjMgNzIyIApMIDM0NjMgMTc4IApRIDMxNTMgNDcgMjgyOCAtMjIgClEgMjUwMyAtOTEgMjE2OSAtOTEgClEgMTMzMSAtOTEgODQyIDM5NiAKUSAzNTMgODg0IDM1MyAxNzE2IApRIDM1MyAyNTc1IDgxNyAzMDc5IApRIDEyODEgMzU4NCAyMDY5IDM1ODQgClEgMjc3NSAzNTg0IDMxODYgMzEyOSAKUSAzNTk3IDI2NzUgMzU5NyAxODk0IAp6Ck0gMzAyMiAyMDYzIApRIDMwMTYgMjUzNCAyNzU4IDI4MTUgClEgMjUwMCAzMDk3IDIwNzUgMzA5NyAKUSAxNTk0IDMwOTcgMTMwNSAyODI1IApRIDEwMTYgMjU1MyA5NzIgMjA1OSAKTCAzMDIyIDIwNjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNzMiIGQ9Ik0gMjgzNCAzMzk3IApMIDI4MzQgMjg1MyAKUSAyNTkxIDI5NzggMjMyOCAzMDQwIApRIDIwNjYgMzEwMyAxNzg0IDMxMDMgClEgMTM1NiAzMTAzIDExNDIgMjk3MiAKUSA5MjggMjg0MSA5MjggMjU3OCAKUSA5MjggMjM3OCAxMDgxIDIyNjQgClEgMTIzNCAyMTUwIDE2OTcgMjA0NyAKTCAxODk0IDIwMDMgClEgMjUwNiAxODcyIDI3NjQgMTYzMyAKUSAzMDIyIDEzOTQgMzAyMiA5NjYgClEgMzAyMiA0NzggMjYzNiAxOTMgClEgMjI1MCAtOTEgMTU3NSAtOTEgClEgMTI5NCAtOTEgOTg5IC0zNiAKUSA2ODQgMTkgMzQ3IDEyOCAKTCAzNDcgNzIyIApRIDY2NiA1NTYgOTc1IDQ3MyAKUSAxMjg0IDM5MSAxNTg4IDM5MSAKUSAxOTk0IDM5MSAyMjEyIDUzMCAKUSAyNDMxIDY2OSAyNDMxIDkyMiAKUSAyNDMxIDExNTYgMjI3MyAxMjgxIApRIDIxMTYgMTQwNiAxNTgxIDE1MjIgCkwgMTM4MSAxNTY5IApRIDg0NyAxNjgxIDYwOSAxOTE0IApRIDM3MiAyMTQ3IDM3MiAyNTUzIApRIDM3MiAzMDQ3IDcyMiAzMzE1IApRIDEwNzIgMzU4NCAxNzE2IDM1ODQgClEgMjAzNCAzNTg0IDIzMTUgMzUzNyAKUSAyNTk3IDM0OTEgMjgzNCAzMzk3IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTIwIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMjgiIGQ9Ik0gMTk4NCA0ODU2IApRIDE1NjYgNDEzOCAxMzYyIDM0MzQgClEgMTE1OSAyNzMxIDExNTkgMjAwOSAKUSAxMTU5IDEyODggMTM2NCA1ODAgClEgMTU2OSAtMTI4IDE5ODQgLTg0NCAKTCAxNDg0IC04NDQgClEgMTAxNiAtMTA5IDc4MyA2MDAgClEgNTUwIDEzMDkgNTUwIDIwMDkgClEgNTUwIDI3MDYgNzgxIDM0MTIgClEgMTAxMyA0MTE5IDE0ODQgNDg1NiAKTCAxOTg0IDQ4NTYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNmIiIGQ9Ik0gNTgxIDQ4NjMgCkwgMTE1OSA0ODYzIApMIDExNTkgMTk5MSAKTCAyODc1IDM1MDAgCkwgMzYwOSAzNTAwIApMIDE3NTMgMTg2MyAKTCAzNjg4IDAgCkwgMjkzOCAwIApMIDExNTkgMTcwOSAKTCAxMTU5IDAgCkwgNTgxIDAgCkwgNTgxIDQ4NjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMjkiIGQ9Ik0gNTEzIDQ4NTYgCkwgMTAxMyA0ODU2IApRIDE0ODEgNDExOSAxNzE0IDM0MTIgClEgMTk0NyAyNzA2IDE5NDcgMjAwOSAKUSAxOTQ3IDEzMDkgMTcxNCA2MDAgClEgMTQ4MSAtMTA5IDEwMTMgLTg0NCAKTCA1MTMgLTg0NCAKUSA5MjggLTEyOCAxMTMzIDU4MCAKUSAxMzM4IDEyODggMTMzOCAyMDA5IApRIDEzMzggMjczMSAxMTMzIDM0MzQgClEgOTI4IDQxMzggNTEzIDQ4NTYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICA8L2RlZnM+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNTMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MSIgeD0iNjMuNDc2NTYyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmQiIHg9IjEyNC43NTU4NTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MCIgeD0iMjIyLjE2Nzk2OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZjIiB4PSIyODUuNjQ0NTMxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjMxMy40Mjc3MzQiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MyIgeD0iMzc0Ljk1MTE3MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI0MjcuMDUwNzgxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjgiIHg9IjQ1OC44Mzc4OTEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YiIgeD0iNDk3Ljg1MTU2MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTI5IiB4PSI1NTUuNzYxNzE5Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgIDxnIGlkPSJtYXRwbG90bGliLmF4aXNfMiI+CiAgICA8ZyBpZD0ieXRpY2tfMSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8xMyI+CiAgICAgIDxwYXRoIGQ9Ik0gMzkuNTgxNDkgMzEyLjczMzA5OSAKTCAzMzcuMzAwNjI1IDMxMi43MzMwOTkgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF8xNCI+CiAgICAgIDxkZWZzPgogICAgICAgPHBhdGggaWQ9Im1jZjNkM2M0YWFjIiBkPSJNIDAgMCAKTCAtMy41IDAgCiIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9kZWZzPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21jZjNkM2M0YWFjIiB4PSIzOS41ODE0OSIgeT0iMzEyLjczMzA5OSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF84Ij4KICAgICAgPCEtLSAwLjAgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2LjY3ODM2NSAzMTYuNTMyMzE4KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtMmUiIGQ9Ik0gNjg0IDc5NCAKTCAxMzQ0IDc5NCAKTCAxMzQ0IDAgCkwgNjg0IDAgCkwgNjg0IDc5NCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8L2RlZnM+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJlIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzIiPgogICAgIDxnIGlkPSJsaW5lMmRfMTUiPgogICAgICA8cGF0aCBkPSJNIDM5LjU4MTQ5IDI1Ny4wOTE0NTUgCkwgMzM3LjMwMDYyNSAyNTcuMDkxNDU1IAoiIGNsaXAtcGF0aD0idXJsKCNwY2JjYTM1NTM3YykiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmYWZhZmE7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJsaW5lMmRfMTYiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21jZjNkM2M0YWFjIiB4PSIzOS41ODE0OSIgeT0iMjU3LjA5MTQ1NSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF85Ij4KICAgICAgPCEtLSAwLjIgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2LjY3ODM2NSAyNjAuODkwNjc0KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yZSIgeD0iNjMuNjIzMDQ3Ii8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMyIiB4PSI5NS40MTAxNTYiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18zIj4KICAgICA8ZyBpZD0ibGluZTJkXzE3Ij4KICAgICAgPHBhdGggZD0iTSAzOS41ODE0OSAyMDEuNDQ5ODEyIApMIDMzNy4zMDA2MjUgMjAxLjQ0OTgxMiAKIiBjbGlwLXBhdGg9InVybCgjcGNiY2EzNTUzN2MpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzE4Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtY2YzZDNjNGFhYyIgeD0iMzkuNTgxNDkiIHk9IjIwMS40NDk4MTIiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMTAiPgogICAgICA8IS0tIDAuNCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYuNjc4MzY1IDIwNS4yNDkwMzEpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJlIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzQiIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzQiPgogICAgIDxnIGlkPSJsaW5lMmRfMTkiPgogICAgICA8cGF0aCBkPSJNIDM5LjU4MTQ5IDE0NS44MDgxNjggCkwgMzM3LjMwMDYyNSAxNDUuODA4MTY4IAoiIGNsaXAtcGF0aD0idXJsKCNwY2JjYTM1NTM3YykiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmYWZhZmE7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJsaW5lMmRfMjAiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21jZjNkM2M0YWFjIiB4PSIzOS41ODE0OSIgeT0iMTQ1LjgwODE2OCIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF8xMSI+CiAgICAgIDwhLS0gMC42IC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNi42NzgzNjUgMTQ5LjYwNzM4Nykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMmUiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zNiIgeD0iOTUuNDEwMTU2Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfNSI+CiAgICAgPGcgaWQ9ImxpbmUyZF8yMSI+CiAgICAgIDxwYXRoIGQ9Ik0gMzkuNTgxNDkgOTAuMTY2NTI1IApMIDMzNy4zMDA2MjUgOTAuMTY2NTI1IAoiIGNsaXAtcGF0aD0idXJsKCNwY2JjYTM1NTM3YykiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmYWZhZmE7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJsaW5lMmRfMjIiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21jZjNkM2M0YWFjIiB4PSIzOS41ODE0OSIgeT0iOTAuMTY2NTI1IiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzEyIj4KICAgICAgPCEtLSAwLjggLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2LjY3ODM2NSA5My45NjU3NDMpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJlIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzgiIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzYiPgogICAgIDxnIGlkPSJsaW5lMmRfMjMiPgogICAgICA8cGF0aCBkPSJNIDM5LjU4MTQ5IDM0LjUyNDg4MSAKTCAzMzcuMzAwNjI1IDM0LjUyNDg4MSAKIiBjbGlwLXBhdGg9InVybCgjcGNiY2EzNTUzN2MpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzI0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtY2YzZDNjNGFhYyIgeD0iMzkuNTgxNDkiIHk9IjM0LjUyNDg4MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF8xMyI+CiAgICAgIDwhLS0gMS4wIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNi42NzgzNjUgMzguMzI0MSkgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMmUiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iOTUuNDEwMTU2Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8xNCI+CiAgICAgPCEtLSAxLVAoTWlzcyBBbGwgRXJyb3JzKSAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC41OTg2NzggMjIwLjYwOTQ1OSkgcm90YXRlKC05MCkgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgPGRlZnM+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0yZCIgZD0iTSAzMTMgMjAwOSAKTCAxOTk3IDIwMDkgCkwgMTk5NyAxNDk3IApMIDMxMyAxNDk3IApMIDMxMyAyMDA5IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTUwIiBkPSJNIDEyNTkgNDE0NyAKTCAxMjU5IDIzOTQgCkwgMjA1MyAyMzk0IApRIDI0OTQgMjM5NCAyNzM0IDI2MjIgClEgMjk3NSAyODUwIDI5NzUgMzI3MiAKUSAyOTc1IDM2OTEgMjczNCAzOTE5IApRIDI0OTQgNDE0NyAyMDUzIDQxNDcgCkwgMTI1OSA0MTQ3IAp6Ck0gNjI4IDQ2NjYgCkwgMjA1MyA0NjY2IApRIDI4MzggNDY2NiAzMjM5IDQzMTEgClEgMzY0MSAzOTU2IDM2NDEgMzI3MiAKUSAzNjQxIDI1ODEgMzIzOSAyMjI4IApRIDI4MzggMTg3NSAyMDUzIDE4NzUgCkwgMTI1OSAxODc1IApMIDEyNTkgMCAKTCA2MjggMCAKTCA2MjggNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy00ZCIgZD0iTSA2MjggNDY2NiAKTCAxNTY5IDQ2NjYgCkwgMjc1OSAxNDkxIApMIDM5NTYgNDY2NiAKTCA0ODk3IDQ2NjYgCkwgNDg5NyAwIApMIDQyODEgMCAKTCA0MjgxIDQwOTcgCkwgMzA3OCA4OTcgCkwgMjQ0NCA4OTcgCkwgMTI0MSA0MDk3IApMIDEyNDEgMCAKTCA2MjggMCAKTCA2MjggNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy02OSIgZD0iTSA2MDMgMzUwMCAKTCAxMTc4IDM1MDAgCkwgMTE3OCAwIApMIDYwMyAwIApMIDYwMyAzNTAwIAp6Ck0gNjAzIDQ4NjMgCkwgMTE3OCA0ODYzIApMIDExNzggNDEzNCAKTCA2MDMgNDEzNCAKTCA2MDMgNDg2MyAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy00MSIgZD0iTSAyMTg4IDQwNDQgCkwgMTMzMSAxNzIyIApMIDMwNDcgMTcyMiAKTCAyMTg4IDQwNDQgCnoKTSAxODMxIDQ2NjYgCkwgMjU0NyA0NjY2IApMIDQzMjUgMCAKTCAzNjY5IDAgCkwgMzI0NCAxMTk3IApMIDExNDEgMTE5NyAKTCA3MTYgMCAKTCA1MCAwIApMIDE4MzEgNDY2NiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy00NSIgZD0iTSA2MjggNDY2NiAKTCAzNTc4IDQ2NjYgCkwgMzU3OCA0MTM0IApMIDEyNTkgNDEzNCAKTCAxMjU5IDI3NTMgCkwgMzQ4MSAyNzUzIApMIDM0ODEgMjIyMiAKTCAxMjU5IDIyMjIgCkwgMTI1OSA1MzEgCkwgMzYzNCA1MzEgCkwgMzYzNCAwIApMIDYyOCAwIApMIDYyOCA0NjY2IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTcyIiBkPSJNIDI2MzEgMjk2MyAKUSAyNTM0IDMwMTkgMjQyMCAzMDQ1IApRIDIzMDYgMzA3MiAyMTY5IDMwNzIgClEgMTY4MSAzMDcyIDE0MjAgMjc1NSAKUSAxMTU5IDI0MzggMTE1OSAxODQ0IApMIDExNTkgMCAKTCA1ODEgMCAKTCA1ODEgMzUwMCAKTCAxMTU5IDM1MDAgCkwgMTE1OSAyOTU2IApRIDEzNDEgMzI3NSAxNjMxIDM0MjkgClEgMTkyMiAzNTg0IDIzMzggMzU4NCAKUSAyMzk3IDM1ODQgMjQ2OSAzNTc2IApRIDI1NDEgMzU2OSAyNjI4IDM1NTMgCkwgMjYzMSAyOTYzIAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTZmIiBkPSJNIDE5NTkgMzA5NyAKUSAxNDk3IDMwOTcgMTIyOCAyNzM2IApRIDk1OSAyMzc1IDk1OSAxNzQ3IApRIDk1OSAxMTE5IDEyMjYgNzU4IApRIDE0OTQgMzk3IDE5NTkgMzk3IApRIDI0MTkgMzk3IDI2ODcgNzU5IApRIDI5NTYgMTEyMiAyOTU2IDE3NDcgClEgMjk1NiAyMzY5IDI2ODcgMjczMyAKUSAyNDE5IDMwOTcgMTk1OSAzMDk3IAp6Ck0gMTk1OSAzNTg0IApRIDI3MDkgMzU4NCAzMTM3IDMwOTYgClEgMzU2NiAyNjA5IDM1NjYgMTc0NyAKUSAzNTY2IDg4OCAzMTM3IDM5OCAKUSAyNzA5IC05MSAxOTU5IC05MSAKUSAxMjA2IC05MSA3NzkgMzk4IApRIDM1MyA4ODggMzUzIDE3NDcgClEgMzUzIDI2MDkgNzc5IDMwOTYgClEgMTIwNiAzNTg0IDE5NTkgMzU4NCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgIDwvZGVmcz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTJkIiB4PSI2My42MjMwNDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy01MCIgeD0iOTkuNzA3MDMxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjgiIHg9IjE2MC4wMDk3NjYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy00ZCIgeD0iMTk5LjAyMzQzOCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY5IiB4PSIyODUuMzAyNzM0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9IjMxMy4wODU5MzgiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MyIgeD0iMzY1LjE4NTU0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI0MTcuMjg1MTU2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNDEiIHg9IjQ0OS4wNzIyNjYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iNTE3LjQ4MDQ2OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZjIiB4PSI1NDUuMjYzNjcyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjU3My4wNDY4NzUiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy00NSIgeD0iNjA0LjgzMzk4NCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI2NjguMDE3NTc4Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzIiIHg9IjcwNy4zODA4NTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZiIgeD0iNzQ2LjI0NDE0MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI4MDcuNDI1NzgxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9Ijg0OC41MzkwNjIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yOSIgeD0iOTAwLjYzODY3MiIvPgogICAgIDwvZz4KICAgIDwvZz4KICAgPC9nPgogICA8ZyBpZD0ibGluZTJkXzI1Ij4KICAgIDxwYXRoIGQ9Ik0gNTMuMTE0MTc4IDMxMi43MzMwOTkgCkwgNTUuMDA4NzU0IDMxMC44MDg2NjQgCkwgMzIzLjc2NzkzNyAzNC41MjQ4ODEgCkwgMzIzLjc2NzkzNyAzNC41MjQ4ODEgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogIzFmNzdiNDsgc3Ryb2tlLXdpZHRoOiAxLjU7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0ibGluZTJkXzI2Ij4KICAgIDxwYXRoIGQ9Ik0gNTMuMTE0MTc4IDMxMi43MzMwOTkgCkwgNTYuMDkxMzY5IDI4My40OTY3NjIgCkwgNTguNzk3OTA3IDI1OS4zMzI1NjQgCkwgNjEuNTA0NDQ0IDIzNy4yOTk5ODkgCkwgNjQuMjEwOTgyIDIxNy4yMzAyMjIgCkwgNjYuOTE3NTIgMTk4Ljk2NjI2NCAKTCA2OS4zNTM0MDQgMTgzLjk1MTg2NCAKTCA3MS43ODkyODcgMTcwLjE4MjczNiAKTCA3NC4yMjUxNzEgMTU3LjU2NjIxNCAKTCA3Ni42NjEwNTUgMTQ2LjAxNTcyMiAKTCA3OS4wOTY5MzkgMTM1LjQ1MDQyOSAKTCA4MS41MzI4MjMgMTI1Ljc5NDkxOCAKTCA4My45Njg3MDYgMTE2Ljk3ODg3NCAKTCA4Ni40MDQ1OSAxMDguOTM2NzgyIApMIDg4Ljg0MDQ3NCAxMDEuNjA3NjQ5IApMIDkxLjI3NjM1OCA5NC45MzQ3MjUgCkwgOTMuNzEyMjQyIDg4Ljg2NTI1NyAKTCA5Ni4xNDgxMjYgODMuMzUwMjM4IApMIDk4LjU4NDAwOSA3OC4zNDQxODIgCkwgMTAxLjAxOTg5MyA3My44MDQ4OTkgCkwgMTAzLjQ1NTc3NyA2OS42OTMyOTQgCkwgMTA1Ljg5MTY2MSA2NS45NzMxNjcgCkwgMTA4LjU5ODE5OSA2Mi4yNTgxODggCkwgMTExLjMwNDczNiA1OC45NDI5NDYgCkwgMTE0LjAxMTI3NCA1NS45ODg3NDEgCkwgMTE2LjcxNzgxMSA1My4zNjAxOTIgCkwgMTE5LjQyNDM0OSA1MS4wMjQ5ODcgCkwgMTIyLjQwMTU0IDQ4Ljc1OTk4NCAKTCAxMjUuMzc4NzMyIDQ2Ljc3ODc1NCAKTCAxMjguMzU1OTIzIDQ1LjA0OTI0NCAKTCAxMzEuNjAzNzY4IDQzLjQxNTc4MiAKTCAxMzUuMTIyMjY3IDQxLjkwNjg0NiAKTCAxMzguOTExNDIgNDAuNTQzMTQ0IApMIDE0Mi45NzEyMjYgMzkuMzM3NDg1IApMIDE0Ny4zMDE2ODYgMzguMjk1MSAKTCAxNTEuOTAyOCAzNy40MTQzNDYgCkwgMTU3LjA0NTIyMSAzNi42NTI2NjkgCkwgMTYyLjk5OTYwNCAzNS45OTk5MDIgCkwgMTcwLjAzNjYwMiAzNS40NjQzNzYgCkwgMTc4LjQyNjg2OCAzNS4wNTgzOTMgCkwgMTg5LjI1MzAxOSAzNC43NjkyMjQgCkwgMjA0Ljk1MDkzNyAzNC41OTQ2NzQgCkwgMjM0Ljk5MzUwNCAzNC41Mjg1MzMgCkwgMzIzLjc2NzkzNyAzNC41MjQ4ODEgCkwgMzIzLjc2NzkzNyAzNC41MjQ4ODEgCiIgY2xpcC1wYXRoPSJ1cmwoI3BjYmNhMzU1MzdjKSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZmN2YwZTsgc3Ryb2tlLXdpZHRoOiAxLjU7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0ibGluZTJkXzI3Ij4KICAgIDxwYXRoIGQ9Ik0gNTMuMTE0MTc4IDMxMi43MzMwOTkgCkwgNTMuOTI2MTM5IDIzNy4yODc4NTYgCkwgNTQuNzM4MTAxIDE4Mi4xNDEyNjYgCkwgNTUuNTUwMDYyIDE0MS44ODQ1MzIgCkwgNTYuMzYyMDIzIDExMi41MjY4MjQgCkwgNTcuMTczOTg0IDkxLjEzODk5NSAKTCA1Ny45ODU5NDYgNzUuNTczMjY5IApMIDU4Ljc5NzkwNyA2NC4yNTYzNzMgCkwgNTkuNjA5ODY4IDU2LjAzNzAxOSAKTCA2MC40MjE4MjkgNTAuMDczNTcgCkwgNjEuMjMzNzkxIDQ1Ljc1MTM4IApMIDYyLjA0NTc1MiA0Mi42MjIwMzEgCkwgNjIuODU3NzEzIDQwLjM1ODcxOSAKTCA2My42Njk2NzUgMzguNzIzNTEzIApMIDY0LjQ4MTYzNiAzNy41NDMzNjggCkwgNjUuMjkzNTk3IDM2LjY5MjU2NCAKTCA2Ni4zNzYyMTIgMzUuOTE2NTIxIApMIDY3LjQ1ODgyNyAzNS40MTY1NDMgCkwgNjguODEyMDk2IDM1LjAzNDU5MiAKTCA3MC43MDY2NzIgMzQuNzU2NjE5IApMIDczLjY4Mzg2NCAzNC41OTExODQgCkwgODAuMTc5NTU0IDM0LjUyODk3IApMIDE0OC42NTQ5NTUgMzQuNTI0ODgxIApMIDMyMy43Njc5MzcgMzQuNTI0ODgxIApMIDMyMy43Njc5MzcgMzQuNTI0ODgxIAoiIGNsaXAtcGF0aD0idXJsKCNwY2JjYTM1NTM3YykiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMyY2EwMmM7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InBhdGNoXzMiPgogICAgPHBhdGggZD0iTSAzOS41ODE0OSAzMjYuNjQzNTEgCkwgMzkuNTgxNDkgMjAuNjE0NDcgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0icGF0Y2hfNCI+CiAgICA8cGF0aCBkPSJNIDMzNy4zMDA2MjUgMzI2LjY0MzUxIApMIDMzNy4zMDA2MjUgMjAuNjE0NDcgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0icGF0Y2hfNSI+CiAgICA8cGF0aCBkPSJNIDM5LjU4MTQ5IDMyNi42NDM1MSAKTCAzMzcuMzAwNjI1IDMyNi42NDM1MSAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICA8L2c+CiAgIDxnIGlkPSJwYXRjaF82Ij4KICAgIDxwYXRoIGQ9Ik0gMzkuNTgxNDkgMjAuNjE0NDcgCkwgMzM3LjMwMDYyNSAyMC42MTQ0NyAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICA8L2c+CiAgIDxnIGlkPSJsZWdlbmRfMSI+CiAgICA8ZyBpZD0icGF0Y2hfNyI+CiAgICAgPHBhdGggZD0iTSAyMTIuNjUyMTg4IDMyMS42NDM1MSAKTCAzMzAuMzAwNjI1IDMyMS42NDM1MSAKUSAzMzIuMzAwNjI1IDMyMS42NDM1MSAzMzIuMzAwNjI1IDMxOS42NDM1MSAKTCAzMzIuMzAwNjI1IDI3Ni42MDkxMzUgClEgMzMyLjMwMDYyNSAyNzQuNjA5MTM1IDMzMC4zMDA2MjUgMjc0LjYwOTEzNSAKTCAyMTIuNjUyMTg4IDI3NC42MDkxMzUgClEgMjEwLjY1MjE4OCAyNzQuNjA5MTM1IDIxMC42NTIxODggMjc2LjYwOTEzNSAKTCAyMTAuNjUyMTg4IDMxOS42NDM1MSAKUSAyMTAuNjUyMTg4IDMyMS42NDM1MSAyMTIuNjUyMTg4IDMyMS42NDM1MSAKegoiIHN0eWxlPSJmaWxsOiAjZmZmZmZmOyBvcGFjaXR5OiAwLjg7IHN0cm9rZTogI2NjY2NjYzsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlciIvPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF8yOCI+CiAgICAgPHBhdGggZD0iTSAyMTQuNjUyMTg4IDI4Mi43MDc1NzIgCkwgMjI0LjY1MjE4OCAyODIuNzA3NTcyIApMIDIzNC42NTIxODggMjgyLjcwNzU3MiAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMWY3N2I0OyBzdHJva2Utd2lkdGg6IDEuNTsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMTUiPgogICAgIDwhLS0gMSBhY3R1YWwgZXJyb3IgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQyLjY1MjE4OCAyODYuMjA3NTcyKSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8ZGVmcz4KICAgICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTYzIiBkPSJNIDMxMjIgMzM2NiAKTCAzMTIyIDI4MjggClEgMjg3OCAyOTYzIDI2MzMgMzAzMCAKUSAyMzg4IDMwOTcgMjEzOCAzMDk3IApRIDE1NzggMzA5NyAxMjY4IDI3NDIgClEgOTU5IDIzODggOTU5IDE3NDcgClEgOTU5IDExMDYgMTI2OCA3NTEgClEgMTU3OCAzOTcgMjEzOCAzOTcgClEgMjM4OCAzOTcgMjYzMyA0NjQgClEgMjg3OCA1MzEgMzEyMiA2NjYgCkwgMzEyMiAxMzQgClEgMjg4MSAyMiAyNjIzIC0zNCAKUSAyMzY2IC05MSAyMDc1IC05MSAKUSAxMjg0IC05MSA4MTggNDA2IApRIDM1MyA5MDMgMzUzIDE3NDcgClEgMzUzIDI2MDMgODIzIDMwOTMgClEgMTI5NCAzNTg0IDIxMTMgMzU4NCAKUSAyMzc4IDM1ODQgMjYzMSAzNTI5IApRIDI4ODQgMzQ3NSAzMTIyIDMzNjYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNzQiIGQ9Ik0gMTE3MiA0NDk0IApMIDExNzIgMzUwMCAKTCAyMzU2IDM1MDAgCkwgMjM1NiAzMDUzIApMIDExNzIgMzA1MyAKTCAxMTcyIDExNTMgClEgMTE3MiA3MjUgMTI4OSA2MDMgClEgMTQwNiA0ODEgMTc2NiA0ODEgCkwgMjM1NiA0ODEgCkwgMjM1NiAwIApMIDE3NjYgMCAKUSAxMTAwIDAgODQ3IDI0OCAKUSA1OTQgNDk3IDU5NCAxMTUzIApMIDU5NCAzMDUzIApMIDE3MiAzMDUzIApMIDE3MiAzNTAwIApMIDU5NCAzNTAwIApMIDU5NCA0NDk0IApMIDExNzIgNDQ5NCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy03NSIgZD0iTSA1NDQgMTM4MSAKTCA1NDQgMzUwMCAKTCAxMTE5IDM1MDAgCkwgMTExOSAxNDAzIApRIDExMTkgOTA2IDEzMTIgNjU3IApRIDE1MDYgNDA5IDE4OTQgNDA5IApRIDIzNTkgNDA5IDI2MjkgNzA2IApRIDI5MDAgMTAwMyAyOTAwIDE1MTYgCkwgMjkwMCAzNTAwIApMIDM0NzUgMzUwMCAKTCAzNDc1IDAgCkwgMjkwMCAwIApMIDI5MDAgNTM4IApRIDI2OTEgMjE5IDI0MTQgNjQgClEgMjEzOCAtOTEgMTc3MiAtOTEgClEgMTE2OSAtOTEgODU2IDI4NCAKUSA1NDQgNjU5IDU0NCAxMzgxIAp6Ck0gMTk5MSAzNTg0IApMIDE5OTEgMzU4NCAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgIDwvZGVmcz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI2My42MjMwNDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MSIgeD0iOTUuNDEwMTU2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiIHg9IjE1Ni42ODk0NTMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NCIgeD0iMjExLjY2OTkyMiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTc1IiB4PSIyNTAuODc4OTA2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjMxNC4yNTc4MTIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iMzc1LjUzNzEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI0MDMuMzIwMzEyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjQzNS4xMDc0MjIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNDk2LjYzMDg1OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI1MzUuOTk0MTQxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjU3NC44NTc0MjIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNjM2LjAzOTA2MiIvPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJsaW5lMmRfMjkiPgogICAgIDxwYXRoIGQ9Ik0gMjE0LjY1MjE4OCAyOTcuMzg1Njk3IApMIDIyNC42NTIxODggMjk3LjM4NTY5NyAKTCAyMzQuNjUyMTg4IDI5Ny4zODU2OTcgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZmN2YwZTsgc3Ryb2tlLXdpZHRoOiAxLjU7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgIDwvZz4KICAgIDxnIGlkPSJ0ZXh0XzE2Ij4KICAgICA8IS0tIDEwIGFjdHVhbCBlcnJvcnMgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQyLjY1MjE4OCAzMDAuODg1Njk3KSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSIxMjcuMjQ2MDk0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjE1OS4wMzMyMDMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MyIgeD0iMjIwLjMxMjUiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NCIgeD0iMjc1LjI5Mjk2OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTc1IiB4PSIzMTQuNTAxOTUzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjM3Ny44ODA4NTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iNDM5LjE2MDE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI0NjYuOTQzMzU5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjQ5OC43MzA0NjkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNTYwLjI1MzkwNiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI1OTkuNjE3MTg4Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjYzOC40ODA0NjkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNjk5LjY2MjEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI3NDAuNzc1MzkxIi8+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF8zMCI+CiAgICAgPHBhdGggZD0iTSAyMTQuNjUyMTg4IDMxMi4wNjM4MjMgCkwgMjI0LjY1MjE4OCAzMTIuMDYzODIzIApMIDIzNC42NTIxODggMzEyLjA2MzgyMyAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMmNhMDJjOyBzdHJva2Utd2lkdGg6IDEuNTsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMTciPgogICAgIDwhLS0gMTAwIGFjdHVhbCBlcnJvcnMgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQyLjY1MjE4OCAzMTUuNTYzODIzKSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSIxMjcuMjQ2MDk0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjE5MC44NjkxNDEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02MSIgeD0iMjIyLjY1NjI1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiIHg9IjI4My45MzU1NDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NCIgeD0iMzM4LjkxNjAxNiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTc1IiB4PSIzNzguMTI1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjQ0MS41MDM5MDYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iNTAyLjc4MzIwMyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSI1MzAuNTY2NDA2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjU2Mi4zNTM1MTYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNjIzLjg3Njk1MyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI2NjMuMjQwMjM0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjcwMi4xMDM1MTYiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNzYzLjI4NTE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI4MDQuMzk4NDM4Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIGlkPSJheGVzXzIiPgogICA8ZyBpZD0icGF0Y2hfOCI+CiAgICA8cGF0aCBkPSJNIDM0Ny4yODA2MjUgMzI2LjY0MzUxIApMIDY0NC45OTk3NiAzMjYuNjQzNTEgCkwgNjQ0Ljk5OTc2IDIwLjYxNDQ3IApMIDM0Ny4yODA2MjUgMjAuNjE0NDcgCnoKIiBzdHlsZT0iZmlsbDogI2ZmZmZmZiIvPgogICA8L2c+CiAgIDxnIGlkPSJtYXRwbG90bGliLmF4aXNfMyI+CiAgICA8ZyBpZD0ieHRpY2tfNyI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zMSI+CiAgICAgIDxwYXRoIGQ9Ik0gMzYwLjgxMzMxMyAzMjYuNjQzNTEgCkwgMzYwLjgxMzMxMyAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzMyIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iMzYwLjgxMzMxMyIgeT0iMzI2LjY0MzUxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzE4Ij4KICAgICAgPCEtLSAwIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNTcuNjMyMDYzIDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIi8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieHRpY2tfOCI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zMyI+CiAgICAgIDxwYXRoIGQ9Ik0gNDE0Ljk0NDA2NSAzMjYuNjQzNTEgCkwgNDE0Ljk0NDA2NSAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzM0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iNDE0Ljk0NDA2NSIgeT0iMzI2LjY0MzUxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzE5Ij4KICAgICAgPCEtLSAyMDAgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwNS40MDAzMTUgMzQxLjI0MTk0Nykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzIiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzkiPgogICAgIDxnIGlkPSJsaW5lMmRfMzUiPgogICAgICA8cGF0aCBkPSJNIDQ2OS4wNzQ4MTcgMzI2LjY0MzUxIApMIDQ2OS4wNzQ4MTcgMjAuNjE0NDcgCiIgY2xpcC1wYXRoPSJ1cmwoI3A5NDVkYmYzODg4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF8zNiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbTQxZGNjODMwOGIiIHg9IjQ2OS4wNzQ4MTciIHk9IjMyNi42NDM1MSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgICA8ZyBpZD0idGV4dF8yMCI+CiAgICAgIDwhLS0gNDAwIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTkuNTMxMDY3IDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM0Ii8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjEyNy4yNDYwOTQiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18xMCI+CiAgICAgPGcgaWQ9ImxpbmUyZF8zNyI+CiAgICAgIDxwYXRoIGQ9Ik0gNTIzLjIwNTU2OCAzMjYuNjQzNTEgCkwgNTIzLjIwNTU2OCAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzM4Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iNTIzLjIwNTU2OCIgeT0iMzI2LjY0MzUxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzIxIj4KICAgICAgPCEtLSA2MDAgLS0+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUxMy42NjE4MTggMzQxLjI0MTk0Nykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzYiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inh0aWNrXzExIj4KICAgICA8ZyBpZD0ibGluZTJkXzM5Ij4KICAgICAgPHBhdGggZD0iTSA1NzcuMzM2MzIgMzI2LjY0MzUxIApMIDU3Ny4zMzYzMiAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzQwIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iNTc3LjMzNjMyIiB5PSIzMjYuNjQzNTEiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICAgPGcgaWQ9InRleHRfMjIiPgogICAgICA8IS0tIDgwMCAtLT4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTY3Ljc5MjU3IDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTM4Ii8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjEyNy4yNDYwOTQiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ4dGlja18xMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF80MSI+CiAgICAgIDxwYXRoIGQ9Ik0gNjMxLjQ2NzA3MiAzMjYuNjQzNTEgCkwgNjMxLjQ2NzA3MiAyMC42MTQ0NyAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzQyIj4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtNDFkY2M4MzA4YiIgeD0iNjMxLjQ2NzA3MiIgeT0iMzI2LjY0MzUxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgIDxnIGlkPSJ0ZXh0XzIzIj4KICAgICAgPCEtLSAxMDAwIC0tPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MTguNzQyMDcyIDM0MS4yNDE5NDcpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIi8+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjEyNy4yNDYwOTQiLz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjE5MC44NjkxNDEiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ0ZXh0XzI0Ij4KICAgICA8IS0tIEFjdHVhbCBFcnJvcnMgKGUpIC0tPgogICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ1NS41MzAwMzYgMzU0LjkyMDA3Mykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy00MSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYzIiB4PSI2Ni42NTgyMDMiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03NCIgeD0iMTIxLjYzODY3MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTc1IiB4PSIxNjAuODQ3NjU2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjIyNC4yMjY1NjIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02YyIgeD0iMjg1LjUwNTg1OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSIzMTMuMjg5MDYyIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNDUiIHg9IjM0NS4wNzYxNzIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNDA4LjI1OTc2NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSI0NDcuNjIzMDQ3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjQ4Ni40ODYzMjgiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MiIgeD0iNTQ3LjY2Nzk2OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI1ODguNzgxMjUiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iNjQwLjg4MDg1OSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTI4IiB4PSI2NzIuNjY3OTY5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjcxMS42ODE2NDEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yOSIgeD0iNzczLjIwNTA3OCIvPgogICAgIDwvZz4KICAgIDwvZz4KICAgPC9nPgogICA8ZyBpZD0ibWF0cGxvdGxpYi5heGlzXzQiPgogICAgPGcgaWQ9Inl0aWNrXzciPgogICAgIDxnIGlkPSJsaW5lMmRfNDMiPgogICAgICA8cGF0aCBkPSJNIDM0Ny4yODA2MjUgMzEyLjczMzA5OSAKTCA2NDQuOTk5NzYgMzEyLjczMzA5OSAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzQ0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtY2YzZDNjNGFhYyIgeD0iMzQ3LjI4MDYyNSIgeT0iMzEyLjczMzA5OSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja184Ij4KICAgICA8ZyBpZD0ibGluZTJkXzQ1Ij4KICAgICAgPHBhdGggZD0iTSAzNDcuMjgwNjI1IDI1Ny4wOTE0NTUgCkwgNjQ0Ljk5OTc2IDI1Ny4wOTE0NTUgCiIgY2xpcC1wYXRoPSJ1cmwoI3A5NDVkYmYzODg4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF80NiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWNmM2QzYzRhYWMiIHg9IjM0Ny4yODA2MjUiIHk9IjI1Ny4wOTE0NTUiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfOSI+CiAgICAgPGcgaWQ9ImxpbmUyZF80NyI+CiAgICAgIDxwYXRoIGQ9Ik0gMzQ3LjI4MDYyNSAyMDEuNDQ5ODEyIApMIDY0NC45OTk3NiAyMDEuNDQ5ODEyIAoiIGNsaXAtcGF0aD0idXJsKCNwOTQ1ZGJmMzg4OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmYWZhZmE7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJsaW5lMmRfNDgiPgogICAgICA8Zz4KICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21jZjNkM2M0YWFjIiB4PSIzNDcuMjgwNjI1IiB5PSIyMDEuNDQ5ODEyIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9Inl0aWNrXzEwIj4KICAgICA8ZyBpZD0ibGluZTJkXzQ5Ij4KICAgICAgPHBhdGggZD0iTSAzNDcuMjgwNjI1IDE0NS44MDgxNjggCkwgNjQ0Ljk5OTc2IDE0NS44MDgxNjggCiIgY2xpcC1wYXRoPSJ1cmwoI3A5NDVkYmYzODg4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF81MCI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWNmM2QzYzRhYWMiIHg9IjM0Ny4yODA2MjUiIHk9IjE0NS44MDgxNjgiIHN0eWxlPSJzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44Ii8+CiAgICAgIDwvZz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ieXRpY2tfMTEiPgogICAgIDxnIGlkPSJsaW5lMmRfNTEiPgogICAgICA8cGF0aCBkPSJNIDM0Ny4yODA2MjUgOTAuMTY2NTI1IApMIDY0NC45OTk3NiA5MC4xNjY1MjUgCiIgY2xpcC1wYXRoPSJ1cmwoI3A5NDVkYmYzODg4KSIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogI2ZhZmFmYTsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImxpbmUyZF81MiI+CiAgICAgIDxnPgogICAgICAgPHVzZSB4bGluazpocmVmPSIjbWNmM2QzYzRhYWMiIHg9IjM0Ny4yODA2MjUiIHk9IjkwLjE2NjUyNSIgc3R5bGU9InN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjgiLz4KICAgICAgPC9nPgogICAgIDwvZz4KICAgIDwvZz4KICAgIDxnIGlkPSJ5dGlja18xMiI+CiAgICAgPGcgaWQ9ImxpbmUyZF81MyI+CiAgICAgIDxwYXRoIGQ9Ik0gMzQ3LjI4MDYyNSAzNC41MjQ4ODEgCkwgNjQ0Ljk5OTc2IDM0LjUyNDg4MSAKIiBjbGlwLXBhdGg9InVybCgjcDk0NWRiZjM4ODgpIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjZmFmYWZhOyBzdHJva2Utd2lkdGg6IDAuODsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0ibGluZTJkXzU0Ij4KICAgICAgPGc+CiAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtY2YzZDNjNGFhYyIgeD0iMzQ3LjI4MDYyNSIgeT0iMzQuNTI0ODgxIiBzdHlsZT0ic3Ryb2tlOiAjMDAwMDAwOyBzdHJva2Utd2lkdGg6IDAuOCIvPgogICAgICA8L2c+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgIDxnIGlkPSJsaW5lMmRfNTUiPgogICAgPHBhdGggZD0iTSAzNjAuODEzMzEzIDMxMi43MzMwOTkgCkwgMzYyLjcwNzg4OSAzMTAuODA4NjY0IApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIAoiIGNsaXAtcGF0aD0idXJsKCNwOTQ1ZGJmMzg4OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMxZjc3YjQ7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImxpbmUyZF81NiI+CiAgICA8cGF0aCBkPSJNIDM2MC44MTMzMTMgMzEyLjczMzA5OSAKTCAzNjMuNzkwNTA0IDI4My40OTY3NjIgCkwgMzY2LjQ5NzA0MiAyNTkuMzMyNTY0IApMIDM2OS4yMDM1NzkgMjM3LjI5OTk4OSAKTCAzNzEuOTEwMTE3IDIxNy4yMzAyMjIgCkwgMzc0LjYxNjY1NSAxOTguOTY2MjY0IApMIDM3Ny4wNTI1MzkgMTgzLjk1MTg2NCAKTCAzNzkuNDg4NDIyIDE3MC4xODI3MzYgCkwgMzgxLjkyNDMwNiAxNTcuNTY2MjE0IApMIDM4NC4zNjAxOSAxNDYuMDE1NzIyIApMIDM4Ni43OTYwNzQgMTM1LjQ1MDQyOSAKTCAzODkuMjMxOTU4IDEyNS43OTQ5MTggCkwgMzkxLjY2Nzg0MSAxMTYuOTc4ODc0IApMIDM5NC4xMDM3MjUgMTA4LjkzNjc4MiAKTCAzOTYuNTM5NjA5IDEwMS42MDc2NDkgCkwgMzk4Ljk3NTQ5MyA5NC45MzQ3MjUgCkwgNDAxLjQxMTM3NyA4OC44NjUyNTcgCkwgNDAzLjg0NzI2MSA4My4zNTAyMzggCkwgNDA2LjI4MzE0NCA3OC4zNDQxODIgCkwgNDA4LjcxOTAyOCA3My44MDQ4OTkgCkwgNDExLjE1NDkxMiA2OS42OTMyOTQgCkwgNDEzLjU5MDc5NiA2NS45NzMxNjcgCkwgNDE2LjI5NzMzNCA2Mi4yNTgxODggCkwgNDE5LjAwMzg3MSA1OC45NDI5NDYgCkwgNDIxLjcxMDQwOSA1NS45ODg3NDEgCkwgNDI0LjQxNjk0NiA1My4zNjAxOTIgCkwgNDI3LjEyMzQ4NCA1MS4wMjQ5ODcgCkwgNDMwLjEwMDY3NSA0OC43NTk5ODQgCkwgNDMzLjA3Nzg2NyA0Ni43Nzg3NTQgCkwgNDM2LjA1NTA1OCA0NS4wNDkyNDQgCkwgNDM5LjMwMjkwMyA0My40MTU3ODIgCkwgNDQyLjgyMTQwMiA0MS45MDY4NDYgCkwgNDQ2LjYxMDU1NSA0MC41NDMxNDQgCkwgNDUwLjY3MDM2MSAzOS4zMzc0ODUgCkwgNDU1LjAwMDgyMSAzOC4yOTUxIApMIDQ1OS42MDE5MzUgMzcuNDE0MzQ2IApMIDQ2NC43NDQzNTYgMzYuNjUyNjY5IApMIDQ3MC42OTg3MzkgMzUuOTk5OTAyIApMIDQ3Ny43MzU3MzcgMzUuNDY0Mzc2IApMIDQ4Ni4xMjYwMDMgMzUuMDU4MzkzIApMIDQ5Ni45NTIxNTQgMzQuNzY5MjI0IApMIDUxMi42NTAwNzIgMzQuNTk0Njc0IApMIDU0Mi42OTI2MzkgMzQuNTI4NTMzIApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIAoiIGNsaXAtcGF0aD0idXJsKCNwOTQ1ZGJmMzg4OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmZjdmMGU7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImxpbmUyZF81NyI+CiAgICA8cGF0aCBkPSJNIDM2MC44MTMzMTMgMzEyLjczMzA5OSAKTCAzNjEuNjI1Mjc0IDIzNy4yODc4NTYgCkwgMzYyLjQzNzIzNiAxODIuMTQxMjY2IApMIDM2My4yNDkxOTcgMTQxLjg4NDUzMiAKTCAzNjQuMDYxMTU4IDExMi41MjY4MjQgCkwgMzY0Ljg3MzExOSA5MS4xMzg5OTUgCkwgMzY1LjY4NTA4MSA3NS41NzMyNjkgCkwgMzY2LjQ5NzA0MiA2NC4yNTYzNzMgCkwgMzY3LjMwOTAwMyA1Ni4wMzcwMTkgCkwgMzY4LjEyMDk2NCA1MC4wNzM1NyAKTCAzNjguOTMyOTI2IDQ1Ljc1MTM4IApMIDM2OS43NDQ4ODcgNDIuNjIyMDMxIApMIDM3MC41NTY4NDggNDAuMzU4NzE5IApMIDM3MS4zNjg4MSAzOC43MjM1MTMgCkwgMzcyLjE4MDc3MSAzNy41NDMzNjggCkwgMzcyLjk5MjczMiAzNi42OTI1NjQgCkwgMzc0LjA3NTM0NyAzNS45MTY1MjEgCkwgMzc1LjE1Nzk2MiAzNS40MTY1NDMgCkwgMzc2LjUxMTIzMSAzNS4wMzQ1OTIgCkwgMzc4LjQwNTgwNyAzNC43NTY2MTkgCkwgMzgxLjM4Mjk5OSAzNC41OTExODQgCkwgMzg3Ljg3ODY4OSAzNC41Mjg5NyAKTCA0NTYuMzU0MDkgMzQuNTI0ODgxIApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIApMIDYzMS40NjcwNzIgMzQuNTI0ODgxIAoiIGNsaXAtcGF0aD0idXJsKCNwOTQ1ZGJmMzg4OCkiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMyY2EwMmM7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InBhdGNoXzkiPgogICAgPHBhdGggZD0iTSAzNDcuMjgwNjI1IDMyNi42NDM1MSAKTCAzNDcuMjgwNjI1IDIwLjYxNDQ3IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InBhdGNoXzEwIj4KICAgIDxwYXRoIGQ9Ik0gNjQ0Ljk5OTc2IDMyNi42NDM1MSAKTCA2NDQuOTk5NzYgMjAuNjE0NDcgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0icGF0Y2hfMTEiPgogICAgPHBhdGggZD0iTSAzNDcuMjgwNjI1IDMyNi42NDM1MSAKTCA2NDQuOTk5NzYgMzI2LjY0MzUxIAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMwMDAwMDA7IHN0cm9rZS13aWR0aDogMC44OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgIDwvZz4KICAgPGcgaWQ9InBhdGNoXzEyIj4KICAgIDxwYXRoIGQ9Ik0gMzQ3LjI4MDYyNSAyMC42MTQ0NyAKTCA2NDQuOTk5NzYgMjAuNjE0NDcgCiIgc3R5bGU9ImZpbGw6IG5vbmU7IHN0cm9rZTogIzAwMDAwMDsgc3Ryb2tlLXdpZHRoOiAwLjg7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1saW5lY2FwOiBzcXVhcmUiLz4KICAgPC9nPgogICA8ZyBpZD0ibGVnZW5kXzIiPgogICAgPGcgaWQ9InBhdGNoXzEzIj4KICAgICA8cGF0aCBkPSJNIDU0Mi4xNjY5NDggMzIxLjY0MzUxIApMIDYzNy45OTk3NiAzMjEuNjQzNTEgClEgNjM5Ljk5OTc2IDMyMS42NDM1MSA2MzkuOTk5NzYgMzE5LjY0MzUxIApMIDYzOS45OTk3NiAyNzYuNjA5MTM1IApRIDYzOS45OTk3NiAyNzQuNjA5MTM1IDYzNy45OTk3NiAyNzQuNjA5MTM1IApMIDU0Mi4xNjY5NDggMjc0LjYwOTEzNSAKUSA1NDAuMTY2OTQ4IDI3NC42MDkxMzUgNTQwLjE2Njk0OCAyNzYuNjA5MTM1IApMIDU0MC4xNjY5NDggMzE5LjY0MzUxIApRIDU0MC4xNjY5NDggMzIxLjY0MzUxIDU0Mi4xNjY5NDggMzIxLjY0MzUxIAp6CiIgc3R5bGU9ImZpbGw6ICNmZmZmZmY7IG9wYWNpdHk6IDAuODsgc3Ryb2tlOiAjY2NjY2NjOyBzdHJva2UtbGluZWpvaW46IG1pdGVyIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzU4Ij4KICAgICA8cGF0aCBkPSJNIDU0NC4xNjY5NDggMjgyLjcwNzU3MiAKTCA1NTQuMTY2OTQ4IDI4Mi43MDc1NzIgCkwgNTY0LjE2Njk0OCAyODIuNzA3NTcyIAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICMxZjc3YjQ7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8yNSI+CiAgICAgPCEtLSAxIHNhbXBsZSAtLT4KICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1NzIuMTY2OTQ4IDI4Ni4yMDc1NzIpIHNjYWxlKDAuMSAtMC4xKSI+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iNjMuNjIzMDQ3Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzMiIHg9Ijk1LjQxMDE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTYxIiB4PSIxNDcuNTA5NzY2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmQiIHg9IjIwOC43ODkwNjIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MCIgeD0iMzA2LjIwMTE3MiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTZjIiB4PSIzNjkuNjc3NzM0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjM5Ny40NjA5MzgiLz4KICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0ibGluZTJkXzU5Ij4KICAgICA8cGF0aCBkPSJNIDU0NC4xNjY5NDggMjk3LjM4NTY5NyAKTCA1NTQuMTY2OTQ4IDI5Ny4zODU2OTcgCkwgNTY0LjE2Njk0OCAyOTcuMzg1Njk3IAoiIHN0eWxlPSJmaWxsOiBub25lOyBzdHJva2U6ICNmZjdmMGU7IHN0cm9rZS13aWR0aDogMS41OyBzdHJva2UtbGluZWNhcDogc3F1YXJlIi8+CiAgICA8L2c+CiAgICA8ZyBpZD0idGV4dF8yNiI+CiAgICAgPCEtLSAxMCBzYW1wbGVzIC0tPgogICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU3Mi4xNjY5NDggMzAwLjg4NTY5Nykgc2NhbGUoMC4xIC0wLjEpIj4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSI2My42MjMwNDciLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iMTI3LjI0NjA5NCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSIxNTkuMDMzMjAzIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjIxMS4xMzI4MTIiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZCIgeD0iMjcyLjQxMjEwOSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcwIiB4PSIzNjkuODI0MjE5Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmMiIHg9IjQzMy4zMDA3ODEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iNDYxLjA4Mzk4NCIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI1MjIuNjA3NDIyIi8+CiAgICAgPC9nPgogICAgPC9nPgogICAgPGcgaWQ9ImxpbmUyZF82MCI+CiAgICAgPHBhdGggZD0iTSA1NDQuMTY2OTQ4IDMxMi4wNjM4MjMgCkwgNTU0LjE2Njk0OCAzMTIuMDYzODIzIApMIDU2NC4xNjY5NDggMzEyLjA2MzgyMyAKIiBzdHlsZT0iZmlsbDogbm9uZTsgc3Ryb2tlOiAjMmNhMDJjOyBzdHJva2Utd2lkdGg6IDEuNTsgc3Ryb2tlLWxpbmVjYXA6IHNxdWFyZSIvPgogICAgPC9nPgogICAgPGcgaWQ9InRleHRfMjciPgogICAgIDwhLS0gMTAwIHNhbXBsZXMgLS0+CiAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTcyLjE2Njk0OCAzMTUuNTYzODIzKSBzY2FsZSgwLjEgLTAuMSkiPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMxIi8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjYzLjYyMzA0NyIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSIxMjcuMjQ2MDk0Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjE5MC44NjkxNDEiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy03MyIgeD0iMjIyLjY1NjI1Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjEiIHg9IjI3NC43NTU4NTkiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02ZCIgeD0iMzM2LjAzNTE1NiIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcwIiB4PSI0MzMuNDQ3MjY2Ii8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmMiIHg9IjQ5Ni45MjM4MjgiLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NSIgeD0iNTI0LjcwNzAzMSIvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTczIiB4PSI1ODYuMjMwNDY5Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIGlkPSJ0ZXh0XzI4Ij4KICAgPCEtLSBEZXRlY3Rpb24gQ29uZmlkZW5jZSBmb3Igbj0xMDAwIC0tPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMjMuMDQ0Mzc1IDEyLjExODM2NSkgc2NhbGUoMC4xMiAtMC4xMikiPgogICAgPGRlZnM+CiAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNDQiIGQ9Ik0gMTI1OSA0MTQ3IApMIDEyNTkgNTE5IApMIDIwMjIgNTE5IApRIDI5ODggNTE5IDM0MzYgOTU2IApRIDM4ODQgMTM5NCAzODg0IDIzMzggClEgMzg4NCAzMjc1IDM0MzYgMzcxMSAKUSAyOTg4IDQxNDcgMjAyMiA0MTQ3IApMIDEyNTkgNDE0NyAKegpNIDYyOCA0NjY2IApMIDE5MjUgNDY2NiAKUSAzMjgxIDQ2NjYgMzkxNSA0MTAyIApRIDQ1NTAgMzUzOCA0NTUwIDIzMzggClEgNDU1MCAxMTMxIDM5MTIgNTY1IApRIDMyNzUgMCAxOTI1IDAgCkwgNjI4IDAgCkwgNjI4IDQ2NjYgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTZlIiBkPSJNIDM1MTMgMjExMyAKTCAzNTEzIDAgCkwgMjkzOCAwIApMIDI5MzggMjA5NCAKUSAyOTM4IDI1OTEgMjc0NCAyODM3IApRIDI1NTAgMzA4NCAyMTYzIDMwODQgClEgMTY5NyAzMDg0IDE0MjggMjc4NyAKUSAxMTU5IDI0OTEgMTE1OSAxOTc4IApMIDExNTkgMCAKTCA1ODEgMCAKTCA1ODEgMzUwMCAKTCAxMTU5IDM1MDAgCkwgMTE1OSAyOTU2IApRIDEzNjYgMzI3MiAxNjQ1IDM0MjggClEgMTkyNSAzNTg0IDIyOTEgMzU4NCAKUSAyODk0IDM1ODQgMzIwMyAzMjExIApRIDM1MTMgMjgzOCAzNTEzIDIxMTMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTQzIiBkPSJNIDQxMjIgNDMwNiAKTCA0MTIyIDM2NDEgClEgMzgwMyAzOTM4IDM0NDIgNDA4NCAKUSAzMDgxIDQyMzEgMjY3NSA0MjMxIApRIDE4NzUgNDIzMSAxNDUwIDM3NDIgClEgMTAyNSAzMjUzIDEwMjUgMjMyOCAKUSAxMDI1IDE0MDYgMTQ1MCA5MTcgClEgMTg3NSA0MjggMjY3NSA0MjggClEgMzA4MSA0MjggMzQ0MiA1NzUgClEgMzgwMyA3MjIgNDEyMiAxMDE5IApMIDQxMjIgMzU5IApRIDM3OTEgMTM0IDM0MjAgMjEgClEgMzA1MCAtOTEgMjYzOCAtOTEgClEgMTU3OCAtOTEgOTY4IDU1NyAKUSAzNTkgMTIwNiAzNTkgMjMyOCAKUSAzNTkgMzQ1MyA5NjggNDEwMSAKUSAxNTc4IDQ3NTAgMjYzOCA0NzUwIApRIDMwNTYgNDc1MCAzNDI2IDQ2MzkgClEgMzc5NyA0NTI4IDQxMjIgNDMwNiAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICAgPHBhdGggaWQ9IkRlamFWdVNhbnMtNjYiIGQ9Ik0gMjM3NSA0ODYzIApMIDIzNzUgNDM4NCAKTCAxODI1IDQzODQgClEgMTUxNiA0Mzg0IDEzOTUgNDI1OSAKUSAxMjc1IDQxMzQgMTI3NSAzODA5IApMIDEyNzUgMzUwMCAKTCAyMjIyIDM1MDAgCkwgMjIyMiAzMDUzIApMIDEyNzUgMzA1MyAKTCAxMjc1IDAgCkwgNjk3IDAgCkwgNjk3IDMwNTMgCkwgMTQ3IDMwNTMgCkwgMTQ3IDM1MDAgCkwgNjk3IDM1MDAgCkwgNjk3IDM3NDQgClEgNjk3IDQzMjggOTY5IDQ1OTUgClEgMTI0MSA0ODYzIDE4MzEgNDg2MyAKTCAyMzc1IDQ4NjMgCnoKIiB0cmFuc2Zvcm09InNjYWxlKDAuMDE1NjI1KSIvPgogICAgIDxwYXRoIGlkPSJEZWphVnVTYW5zLTY0IiBkPSJNIDI5MDYgMjk2OSAKTCAyOTA2IDQ4NjMgCkwgMzQ4MSA0ODYzIApMIDM0ODEgMCAKTCAyOTA2IDAgCkwgMjkwNiA1MjUgClEgMjcyNSAyMTMgMjQ0OCA2MSAKUSAyMTcyIC05MSAxNzg0IC05MSAKUSAxMTUwIC05MSA3NTEgNDE1IApRIDM1MyA5MjIgMzUzIDE3NDcgClEgMzUzIDI1NzIgNzUxIDMwNzggClEgMTE1MCAzNTg0IDE3ODQgMzU4NCAKUSAyMTcyIDM1ODQgMjQ0OCAzNDMyIApRIDI3MjUgMzI4MSAyOTA2IDI5NjkgCnoKTSA5NDcgMTc0NyAKUSA5NDcgMTExMyAxMjA4IDc1MiAKUSAxNDY5IDM5MSAxOTI1IDM5MSAKUSAyMzgxIDM5MSAyNjQzIDc1MiAKUSAyOTA2IDExMTMgMjkwNiAxNzQ3IApRIDI5MDYgMjM4MSAyNjQzIDI3NDIgClEgMjM4MSAzMTAzIDE5MjUgMzEwMyAKUSAxNDY5IDMxMDMgMTIwOCAyNzQyIApRIDk0NyAyMzgxIDk0NyAxNzQ3IAp6CiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAxNTYyNSkiLz4KICAgICA8cGF0aCBpZD0iRGVqYVZ1U2Fucy0zZCIgZD0iTSA2NzggMjkwNiAKTCA0Njg0IDI5MDYgCkwgNDY4NCAyMzgxIApMIDY3OCAyMzgxIApMIDY3OCAyOTA2IAp6Ck0gNjc4IDE2MzEgCkwgNDY4NCAxNjMxIApMIDQ2ODQgMTEwMCAKTCA2NzggMTEwMCAKTCA2NzggMTYzMSAKegoiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMTU2MjUpIi8+CiAgICA8L2RlZnM+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTQ0Ii8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTY1IiB4PSI3Ny4wMDE5NTMiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjEzOC41MjUzOTEiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjE3Ny43MzQzNzUiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiIHg9IjIzOS4yNTc4MTIiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNzQiIHg9IjI5NC4yMzgyODEiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjkiIHg9IjMzMy40NDcyNjYiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjM2MS4yMzA0NjkiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjQyMi40MTIxMDkiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMjAiIHg9IjQ4NS43OTEwMTYiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNDMiIHg9IjUxNy41NzgxMjUiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjU4Ny40MDIzNDQiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjY0OC41ODM5ODQiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjYiIHg9IjcxMS45NjI4OTEiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjkiIHg9Ijc0Ny4xNjc5NjkiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjQiIHg9Ijc3NC45NTExNzIiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjgzOC40Mjc3MzQiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9Ijg5OS45NTExNzIiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjMiIHg9Ijk2My4zMzAwNzgiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNjUiIHg9IjEwMTguMzEwNTQ3Ii8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTIwIiB4PSIxMDc5LjgzMzk4NCIvPgogICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy02NiIgeD0iMTExMS42MjEwOTQiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmYiIHg9IjExNDYuODI2MTcyIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTcyIiB4PSIxMjA4LjAwNzgxMiIvPgogICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0yMCIgeD0iMTI0OS4xMjEwOTQiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtNmUiIHg9IjEyODAuOTA4MjAzIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTNkIiB4PSIxMzQ0LjI4NzEwOSIvPgogICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMSIgeD0iMTQyOC4wNzYxNzIiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI0RlamFWdVNhbnMtMzAiIHg9IjE0OTEuNjk5MjE5Ii8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNEZWphVnVTYW5zLTMwIiB4PSIxNTU1LjMyMjI2NiIvPgogICAgPHVzZSB4bGluazpocmVmPSIjRGVqYVZ1U2Fucy0zMCIgeD0iMTYxOC45NDUzMTIiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KIDxkZWZzPgogIDxjbGlwUGF0aCBpZD0icGNiY2EzNTUzN2MiPgogICA8cmVjdCB4PSIzOS41ODE0OSIgeT0iMjAuNjE0NDciIHdpZHRoPSIyOTcuNzE5MTM1IiBoZWlnaHQ9IjMwNi4wMjkwNCIvPgogIDwvY2xpcFBhdGg+CiAgPGNsaXBQYXRoIGlkPSJwOTQ1ZGJmMzg4OCI+CiAgIDxyZWN0IHg9IjM0Ny4yODA2MjUiIHk9IjIwLjYxNDQ3IiB3aWR0aD0iMjk3LjcxOTEzNSIgaGVpZ2h0PSIzMDYuMDI5MDQiLz4KICA8L2NsaXBQYXRoPgogPC9kZWZzPgo8L3N2Zz4K" />
</figure>
<h2 id="complexity">Complexity</h2>
<p>A pure mathematician would perhaps be happy here and consider the problem
solved. (Apologies to those that do not find this funny.) However, the premise
of this article is that the size of the set is large, and calculating large
factorials brings its own challenges. Consider the following monstrosity
before simplification!
(<a href="https://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations">Check Wikipedia for the complexity of factorial</a>
which is better than naive multiplication of numbers from <code>1</code> to <code>n</code>.
Python’s <code class="sourceCode python">math.factorial</code> uses <a href="https://github.com/python/cpython/blob/main/Modules/mathintegermodule.c">Divide-and-conquer factorial algorithm</a>
based on <a href="http://www.luschny.de/math/factorial/binarysplitfact.html" class="uri">http://www.luschny.de/math/factorial/binarysplitfact.html</a>.)</p>
<p><math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mi>P</mi>
<mo>=</mo>
<mfrac>
<mrow data-mjx-texclass="ORD">
<mrow data-mjx-texclass="OPEN">
<mo minsize="1.2em" maxsize="1.2em">(</mo>
</mrow>
<mfrac linethickness="0">
<mrow>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
</mrow>
<mi>e</mi>
</mfrac>
<mrow data-mjx-texclass="CLOSE">
<mo minsize="1.2em" maxsize="1.2em">)</mo>
</mrow>
</mrow>
<mrow data-mjx-texclass="ORD">
<mrow data-mjx-texclass="OPEN">
<mo minsize="1.2em" maxsize="1.2em">(</mo>
</mrow>
<mfrac linethickness="0">
<mi>n</mi>
<mi>e</mi>
</mfrac>
<mrow data-mjx-texclass="CLOSE">
<mo minsize="1.2em" maxsize="1.2em">)</mo>
</mrow>
</mrow>
</mfrac>
<mo>=</mo>
<mfrac>
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
<menclose notation="updiagonalstrike">
<mi>e</mi>
<mo>!</mo>
</menclose>
</mrow>
</mfrac>
<mfrac>
<mrow>
<mi>n</mi>
<mo>!</mo>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
<menclose notation="updiagonalstrike">
<mi>e</mi>
<mo>!</mo>
</menclose>
</mrow>
</mfrac>
</mfrac>
<mo>=</mo>
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>n</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
<mo>=</mo>
<mfrac>
<mrow>
<menclose notation="updiagonalstrike">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</menclose>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>…</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<menclose notation="updiagonalstrike">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</menclose>
</mrow>
<mrow>
<mi>n</mi>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>…</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<menclose notation="updiagonalstrike">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</menclose>
<menclose notation="updiagonalstrike">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</menclose>
</mrow>
</mfrac>
<mo>=</mo>
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>…</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mi>n</mi>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>…</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo>⋅</mo>
<mrow data-mjx-texclass="ORD"></mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</mfrac>
</math></p>
<p>The simplification improved things: the number of multiplications
now depends only on <code>k</code>. This sounds great at first but still is not ideal:
for <code>1_000_000</code> total elements and sample size <code>10_000</code>
intermediate results can be on the scale of <code>~10^60000</code>. Consider the
following Python session 😅.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; a = 1</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; for x in range(10_000):</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>...     a *= (1_000_000-x)</span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>... </span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; a</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>Traceback (most recent call last):</span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a>  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;</span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a>ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit</span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; float(a)</span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a>Traceback (most recent call last):</span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a>  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;</span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a>OverflowError: int too large to convert to float</span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; import sys</span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; sys.set_int_max_str_digits(60000)</span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; float(str(a))</span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a>inf</span></code></pre></div>
<p>Not very useful. And at this scale we also need to take into account even the
complexity of the multiplication itself! (Because arbitrary precision
numbers.) Maybe we could do some smart pairing to keep that to a minimum, but
let’s try something more fun!</p>
<h2 id="a-log-ical-sidestep">A Log-ical Sidestep</h2>
<p>In the wild, we won’t care about absolute precision (and later on we’ll just
be comparing things during searches for various things), so there is a fun
sidestep we can do: move to a logarithmic space! (For the rest of the article
we’ll use log to mean logarithm with base e.)</p>
<p>Logarithms are cool because:</p>
<ul>
<li>They make big numbers more manageable.</li>
<li>They turn multiplication/division into addition-subtraction.</li>
<li>Preserve ordering: <math xmlns="http://www.w3.org/1998/Math/MathML">
<mi mathvariant="normal">∀</mi>
<mi>x</mi>
<mo>,</mo>
<mi>y</mi>
<mo>∈</mo>
<msup>
<mrow data-mjx-texclass="ORD">
<mi mathvariant="double-struck">R</mi>
</mrow>
<mo>+</mo>
</msup>
<mo>:</mo>
<mi>x</mi>
<mo>≤</mo>
<mi>y</mi>
<mo stretchy="false">⟺</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mi>x</mi>
</mrow>
<mo>≤</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mi>y</mi>
</mrow>
</math>.</li>
</ul>
<p>One might be tempted to add <code>log</code>s all the way through our previous equations
and that way alleviate some of the pains we were experiencing. However, we’ll stop
sooner and make one more funky sidestep.</p>
<p><math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mi>P</mi>
</mrow>
<mo>=</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>n</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mrow>
<mo>=</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mo>+</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mo>−</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mi>n</mi>
<mo>!</mo>
</mrow>
<mo>−</mo>
<mi>log</mi>
<mo data-mjx-texclass="NONE">⁡</mo>
<mrow data-mjx-texclass="ORD">
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−</mo>
<mi>e</mi>
<mo>−</mo>
<mi>k</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</math></p>
<p>At this point you might be thinking:</p>
<blockquote>
<p>What is going on? Maybe there is a faster way to
calculate <code>log(n!)</code> … 🤔</p>
</blockquote>
<p>And you’d be right: <a href="https://en.wikipedia.org/wiki/Stirling%27s_approximation">Stirling’s approximation</a>.</p>
<p><math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>log</mo><mi>n</mi><mi>!</mi><mo>=</mo><mi>n</mi><mo>log</mo><mi>n</mi><mo>−</mo><mi>n</mi><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>log</mo><mn>2</mn><mi>π</mi><mi>n</mi><mo>+</mo><mi>O</mi><mrow><mo stretchy="true" form="prefix">(</mo><mfrac><mn>1</mn><mi>n</mi></mfrac><mo stretchy="true" form="postfix">)</mo></mrow></mrow><annotation encoding="application/x-tex">
\log n! = n \log n - n + \frac{1}{2}\log 2 \pi n + O(\frac{1}{n})
</annotation></semantics></math></p>
<p>Which is amazing as error goes down with <code>n</code> going up! Let’s run
a quick test!</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; from math import factorial, log, pi</span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; for exp in range(6):</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>...     n = 10**exp</span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a>...     print(exp, log(factorial(n)) - (n * log(n) - n + 0.5*log(2*pi*n)))</span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a>... </span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a>0 0.08106146679532733</span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a>1 0.008330563433359472</span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a>2 0.000833330555565226</span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a>3 8.333333062182646e-05</span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a>4 8.333328878507018e-06</span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a>5 8.330680429935455e-07</span></code></pre></div>
<p>Looks good, let’s write some python!</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> math <span class="im">import</span> exp, factorial, log, pi</span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>PRECISION <span class="op">=</span> <span class="dv">3</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> log_fac(n: <span class="bu">int</span>) <span class="op">-&gt;</span> <span class="bu">float</span>:</span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> n <span class="op">&gt;=</span> <span class="dv">10</span><span class="op">**</span>PRECISION:</span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a>        <span class="cf">assert</span> n <span class="op">&gt;=</span> <span class="dv">0</span></span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a>        <span class="cf">return</span> n <span class="op">*</span> log(n) <span class="op">-</span> n <span class="op">+</span> <span class="fl">0.5</span> <span class="op">*</span> log(<span class="dv">2</span> <span class="op">*</span> n <span class="op">*</span> pi)</span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span>:</span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a>        <span class="cf">return</span> log(factorial(n))</span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> log_alpha(total: <span class="bu">int</span>, samples: <span class="bu">int</span>, errors: <span class="bu">int</span>) <span class="op">-&gt;</span> <span class="bu">float</span>:</span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true" tabindex="-1"></a>    <span class="cf">assert</span> total <span class="op">&gt;</span> <span class="dv">0</span></span>
<span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a>    <span class="cf">assert</span> samples <span class="op">&lt;=</span> total, <span class="st">&quot;Samples more than total?&quot;</span></span>
<span id="cb6-17"><a href="#cb6-17" aria-hidden="true" tabindex="-1"></a>    <span class="cf">assert</span> errors <span class="op">&lt;=</span> total, <span class="st">&quot;Errors more than total?&quot;</span></span>
<span id="cb6-18"><a href="#cb6-18" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> errors <span class="op">+</span> samples <span class="op">&gt;</span> total:</span>
<span id="cb6-19"><a href="#cb6-19" aria-hidden="true" tabindex="-1"></a>        <span class="cf">return</span> <span class="bu">float</span>(<span class="st">&quot;-inf&quot;</span>)</span>
<span id="cb6-20"><a href="#cb6-20" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> (</span>
<span id="cb6-21"><a href="#cb6-21" aria-hidden="true" tabindex="-1"></a>        log_fac(total <span class="op">-</span> samples)</span>
<span id="cb6-22"><a href="#cb6-22" aria-hidden="true" tabindex="-1"></a>        <span class="op">+</span> log_fac(total <span class="op">-</span> errors)</span>
<span id="cb6-23"><a href="#cb6-23" aria-hidden="true" tabindex="-1"></a>        <span class="op">-</span> log_fac(total)</span>
<span id="cb6-24"><a href="#cb6-24" aria-hidden="true" tabindex="-1"></a>        <span class="op">-</span> log_fac(total <span class="op">-</span> errors <span class="op">-</span> samples)</span>
<span id="cb6-25"><a href="#cb6-25" aria-hidden="true" tabindex="-1"></a>    )</span>
<span id="cb6-26"><a href="#cb6-26" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-27"><a href="#cb6-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-28"><a href="#cb6-28" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> alpha(total: <span class="bu">int</span>, samples: <span class="bu">int</span>, errors: <span class="bu">int</span>) <span class="op">-&gt;</span> <span class="bu">float</span>:</span>
<span id="cb6-29"><a href="#cb6-29" aria-hidden="true" tabindex="-1"></a>    <span class="co">&quot;&quot;&quot;</span></span>
<span id="cb6-30"><a href="#cb6-30" aria-hidden="true" tabindex="-1"></a><span class="co">    Probability of no errors being observed in `samples` samples</span></span>
<span id="cb6-31"><a href="#cb6-31" aria-hidden="true" tabindex="-1"></a><span class="co">    out of `total` elements, given there are `errors` errors.</span></span>
<span id="cb6-32"><a href="#cb6-32" aria-hidden="true" tabindex="-1"></a><span class="co">    &quot;&quot;&quot;</span></span>
<span id="cb6-33"><a href="#cb6-33" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> exp(log_alpha(total, samples, errors))</span></code></pre></div>
<p>Compare with and without precision correction.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; PRECISION = 0</span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(5, 2, 3)</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>0.09489739502331558</span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(50, 20, 3)</span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a>0.20718475090635413</span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(500, 200, 3)</span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a>0.21513426941998892</span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(5000, 2000, 3)</span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a>0.21591358271716066</span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; PRECISION = 4</span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(5, 2, 3)</span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true" tabindex="-1"></a>0.10000000000000002</span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(50, 20, 3)</span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true" tabindex="-1"></a>0.207142857142857</span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(500, 200, 3)</span>
<span id="cb7-17"><a href="#cb7-17" aria-hidden="true" tabindex="-1"></a>0.21513388222227164</span>
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(5000, 2000, 3)</span>
<span id="cb7-19"><a href="#cb7-19" aria-hidden="true" tabindex="-1"></a>0.21591357887611928</span></code></pre></div>
<h2 id="exploring">Exploring</h2>
<p>Now that we have these basic building blocks,
let’s try to find answers to some frivolous questions!</p>
<blockquote>
<p>Given a dataset of size n, what is the smallest number of errors we are
c-confident we would have discovered an error by k samples?</p>
</blockquote>
<div class="sourceCode" id="cb8"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> min_errors(total: <span class="bu">int</span>, samples: <span class="bu">int</span>, confidence_threshold: <span class="bu">float</span>) <span class="op">-&gt;</span> <span class="bu">int</span>:</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>    <span class="co">&quot;&quot;&quot;</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a><span class="co">    Finds minimal number of errors we are at least `confidence_threshold`</span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="co">    confident we would discover an error by checking `samples` samples</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a><span class="co">    out of `total` elements.</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a><span class="co">    &quot;&quot;&quot;</span></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a>    left <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a>    right <span class="op">=</span> total <span class="op">-</span> samples <span class="op">+</span> <span class="dv">1</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a>    a <span class="op">=</span> <span class="dv">1</span> <span class="op">-</span> confidence_threshold</span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true" tabindex="-1"></a>    log_a <span class="op">=</span> log(a)</span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true" tabindex="-1"></a>    <span class="cf">while</span> left <span class="op">&lt;</span> right:</span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true" tabindex="-1"></a>        pivot <span class="op">=</span> (left <span class="op">+</span> right) <span class="op">//</span> <span class="dv">2</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> log_alpha(total, samples, pivot) <span class="op">&gt;</span> log_a:</span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true" tabindex="-1"></a>            left <span class="op">=</span> pivot <span class="op">+</span> <span class="dv">1</span></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true" tabindex="-1"></a>        <span class="cf">else</span>:</span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true" tabindex="-1"></a>            right <span class="op">=</span> pivot</span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> left</span></code></pre></div>
<blockquote>
<p>Given a dataset of size n, what is the smallest number of samples we need to
take to be at least c-confident we would have discovered an error if
there were x errors present?</p>
</blockquote>
<div class="sourceCode" id="cb9"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> min_samples(total: <span class="bu">int</span>, errors: <span class="bu">int</span>, confidence_threshold: <span class="bu">float</span>) <span class="op">-&gt;</span> <span class="bu">int</span>:</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a>    <span class="co">&quot;&quot;&quot;</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a><span class="co">    Finds minimal number of samples to be at least `confidence_threshold`</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a><span class="co">    confident we would have discovered an error if there were</span></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a><span class="co">    `errors` errors in `total` elements.</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true" tabindex="-1"></a><span class="co">    &quot;&quot;&quot;</span></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true" tabindex="-1"></a>    left <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true" tabindex="-1"></a>    right <span class="op">=</span> total <span class="op">-</span> errors <span class="op">+</span> <span class="dv">1</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true" tabindex="-1"></a>    a <span class="op">=</span> <span class="dv">1</span> <span class="op">-</span> confidence_threshold</span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true" tabindex="-1"></a>    log_a <span class="op">=</span> log(a)</span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true" tabindex="-1"></a>    <span class="cf">while</span> left <span class="op">&lt;</span> right:</span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true" tabindex="-1"></a>        pivot <span class="op">=</span> (left <span class="op">+</span> right) <span class="op">//</span> <span class="dv">2</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true" tabindex="-1"></a>        <span class="cf">if</span> log_alpha(total, pivot, errors) <span class="op">&gt;</span> log_a:</span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true" tabindex="-1"></a>            left <span class="op">=</span> pivot <span class="op">+</span> <span class="dv">1</span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true" tabindex="-1"></a>        <span class="cf">else</span>:</span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true" tabindex="-1"></a>            right <span class="op">=</span> pivot</span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> left</span></code></pre></div>
<h2 id="note-on-precision">Note on Precision</h2>
<p>Thanks to small rounding errors, some threshold values won’t work exactly,
but we are more likely to run this code for large numbers where
that is kinda okay.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode txt"><code class="sourceCode default"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>&gt;&gt;&gt; alpha(5,2,3)</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a>0.10000000000000002</span></code></pre></div>
<h2 id="severity-of-a-bug">Severity of a Bug</h2>
<p>One more interesting thing I’d like to leave you with is a thought on what is
a bug and how I feel about “not knowing whether there is an error lurking just
around the corner”.</p>
<p>Under “normal” circumstances, “system has a problem” is a binary thing; either
yes or no. But here, unless an issue was discovered within chosen samples, we
don’t know.</p>
<p>Let’s say we have a set of size <code>1_000_000</code>, and we have found out that after we
have tested <code>1_000</code> members without finding an issue, we are 95% confident
that if there were <code>min_errors(1_000_000, 1_000, 0.95) = 2_990</code> errors, we
would have found at least 1.</p>
<p>One way to think about it is that we are 95% confident
that if there was a systemic error (a bug) that would
impact ~0.3% of members, we would have noticed it.</p>
<p>And while this is not the only possible way to measure
impact of a bug, it is certainly an interesting one.</p>
<h2 id="conclusion">Conclusion</h2>
<p>We got to the point where, even without knowing much about probabilities of
the underlying issue, we were able to gain some curious insights!</p>
<p><strong>Takeaways</strong>:</p>
<ul>
<li>Combinatorial analysis gives confidence bounds <em>without</em> knowing individual failure rates.</li>
<li>Stirling’s approximation enables computation at scale.</li>
<li>Test design: Use <code>min_samples</code> to justify resource allocation.</li>
<li>Reporting: Use <code>min_errors</code> to state “We’re 95% confident undetected errors &lt; X”.</li>
<li>What fraction of elements (users/products/…) are impacted by a bug
can be an interesting measure of severity.</li>
</ul>
<h2 id="afterword">Afterword</h2>
<p>Consider this my journal on a journey trying to figure out some fun things!
There might be errors/imprecisions/typos, … I might have even committed
a couple of horrible things here. If you have noticed something and care enough:
please let me know!</p>]]></summary>
</entry>

</feed>
