Skip to content

Instantly share code, notes, and snippets.

@ch1bo
Last active March 25, 2020 15:52
Show Gist options
  • Save ch1bo/8ec03590ed26a0b2704a79cb761d7c58 to your computer and use it in GitHub Desktop.
Save ch1bo/8ec03590ed26a0b2704a79cb761d7c58 to your computer and use it in GitHub Desktop.
Interactive AWS profile selection and environment setup using a yubikey, fzf and constistent names in ~/.aws/credentials
#!/usr/bin/env bash
set -e
if [ -z "$(which aws)" ] || [ -z "$(which fzf)" ] || [ -z "$(which ykman)" ] || [ -z "$(which jq)" ]; then
>&2 echo "# This script requires 'aws', 'fzf', 'ykman' and 'jq' to be installed"
exit 1
fi
function clear-credentials {
>&2 echo "# Clearing credentials"
echo "unset AWS_ACCESS_KEY_ID"
echo "unset AWS_SECRET_ACCESS_KEY"
echo "unset AWS_SESSION_TOKEN"
echo "unset AWS_PROFILE"
>&2 echo "# To request new credentials, connect a yubikey and run with:"
>&2 echo "# eval \$($0)"
}
ykman oath info > /dev/null || (clear-credentials && exit 1)
PROFILE=$(ykman oath list | sed "1 i\[none]" - | fzf)
if [ ${PROFILE} = "[none]" ]; then
clear-credentials
exit 0
fi
export AWS_PROFILE=${PROFILE#aws-}
if [ ${PROFILE} = ${AWS_PROFILE} ]; then
>&2 echo "# Select a oath code with \"aws-\" prefix"
exit 1
fi
>&2 echo "# Loading AWS credentials with AWS_PROFILE=${AWS_PROFILE}"
SERIAL_NUMBER=$(AWS_PROFILE=${AWS_PROFILE} aws iam list-mfa-devices | jq -r '.MFADevices[0].SerialNumber')
>&2 echo "# Using first MFA device ${SERIAL_NUMBER}"
TOKEN_CODE=$(ykman oath code --single ${PROFILE})
>&2 echo "# Generated token code ${TOKEN_CODE}"
# Clear within session to retrieve new tokens
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
RESULT=$(aws sts get-session-token --serial-number ${SERIAL_NUMBER} --token-code ${TOKEN_CODE})
EXPIRATION=$(echo ${RESULT} | jq '.Credentials.Expiration')
ACCESS_KEY_ID=$(echo ${RESULT} | jq '.Credentials.AccessKeyId')
SECRET_ACCESS_KEY=$(echo ${RESULT} | jq '.Credentials.SecretAccessKey')
SESSION_TOKEN=$(echo ${RESULT} | jq '.Credentials.SessionToken')
>&2 echo "# Got credentials, valid until ${EXPIRATION}"
echo "export AWS_PROFILE=${AWS_PROFILE}"
echo "export AWS_ACCESS_KEY_ID=${ACCESS_KEY_ID}"
echo "export AWS_SECRET_ACCESS_KEY=${SECRET_ACCESS_KEY}"
echo "export AWS_SESSION_TOKEN=${SESSION_TOKEN}"
Display the source blob
Display the rendered blob
Raw
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="terminal" baseProfile="full" viewBox="0 0 735 472" width="735" version="1.1">
<defs>
<termtosvg:template_settings xmlns:termtosvg="https://github.com/nbedos/termtosvg">
<termtosvg:screen_geometry columns="86" rows="23"/>
<termtosvg:animation type="css"/>
</termtosvg:template_settings>
<style type="text/css" id="generated-style"><![CDATA[#screen {
font-family: 'DejaVu Sans Mono', monospace;
font-style: normal;
font-size: 14px;
}
text {
dominant-baseline: text-before-edge;
white-space: pre;
}
:root {
--animation-duration: 15829ms;
}
@keyframes roll {
0.000%{transform:translateY(0px)}
0.006%{transform:translateY(-408px)}
0.013%{transform:translateY(-816px)}
1.668%{transform:translateY(-1224px)}
1.763%{transform:translateY(-1632px)}
1.769%{transform:translateY(-2040px)}
3.753%{transform:translateY(-2448px)}
4.947%{transform:translateY(-2856px)}
5.288%{transform:translateY(-3264px)}
6.406%{transform:translateY(-3672px)}
7.537%{transform:translateY(-4080px)}
11.454%{transform:translateY(-4488px)}
12.168%{transform:translateY(-4896px)}
13.987%{transform:translateY(-5304px)}
15.686%{transform:translateY(-5712px)}
18.213%{transform:translateY(-6120px)}
18.839%{transform:translateY(-6528px)}
19.932%{transform:translateY(-6936px)}
22.490%{transform:translateY(-7344px)}
24.165%{transform:translateY(-7752px)}
25.535%{transform:translateY(-8160px)}
27.462%{transform:translateY(-8568px)}
29.339%{transform:translateY(-8976px)}
29.358%{transform:translateY(-9384px)}
32.775%{transform:translateY(-9792px)}
32.788%{transform:translateY(-10200px)}
32.940%{transform:translateY(-10608px)}
32.952%{transform:translateY(-11016px)}
34.077%{transform:translateY(-11424px)}
35.347%{transform:translateY(-11832px)}
36.168%{transform:translateY(-12240px)}
36.610%{transform:translateY(-12648px)}
39.099%{transform:translateY(-13056px)}
40.988%{transform:translateY(-13464px)}
41.077%{transform:translateY(-13872px)}
47.173%{transform:translateY(-14280px)}
50.445%{transform:translateY(-14688px)}
55.815%{transform:translateY(-15096px)}
55.859%{transform:translateY(-15504px)}
55.904%{transform:translateY(-15912px)}
55.942%{transform:translateY(-16320px)}
59.429%{transform:translateY(-16728px)}
64.243%{transform:translateY(-17136px)}
64.319%{transform:translateY(-17544px)}
67.541%{transform:translateY(-17952px)}
67.578%{transform:translateY(-18360px)}
67.749%{transform:translateY(-18768px)}
67.787%{transform:translateY(-19176px)}
68.886%{transform:translateY(-19584px)}
70.150%{transform:translateY(-19992px)}
70.958%{transform:translateY(-20400px)}
71.413%{transform:translateY(-20808px)}
79.733%{transform:translateY(-21216px)}
79.822%{transform:translateY(-21624px)}
79.885%{transform:translateY(-22032px)}
93.682%{transform:translateY(-22440px)}
100.000%{transform:translateY(-22440px)}
}
#screen_view {
animation-duration: 15829ms;
animation-iteration-count:infinite;
animation-name:roll;
animation-timing-function: steps(1,end);
animation-fill-mode: forwards;
}
]]></style>
<style type="text/css" id="user-style">
/* gjm8 color theme (source: https://terminal.sexy/) */
.foreground {fill: #f8f8f2}
.background {fill: #272822}
.color0 {fill: #272822}
.color1 {fill: #f92672}
.color2 {fill: #a6e22e}
.color3 {fill: #f4bf75}
.color4 {fill: #66d9ef}
.color5 {fill: #ae81ff}
.color6 {fill: #a1efe4}
.color7 {fill: #f8f8f2}
.color8 {fill: #75715e}
.color9 {fill: #fd971f}
.color10 {fill: #383830}
.color11 {fill: #49483e}
.color12 {fill: #a59f85}
.color13 {fill: #f5f4f1}
.color14 {fill: #cc6633}
.color15 {fill: #f9f8f5}
</style>
</defs>
<rect id="terminalui" class="background" width="100%" height="100%" ry="4.5826941"/>
<circle cx="24" cy="23" r="7" class="color1"/>
<circle cx="44" cy="23" r="7" class="color3"/>
<circle cx="64" cy="23" r="7" class="color2"/>
<svg id="screen" width="688" height="391" x="23" y="50" viewBox="0 0 688 391" preserveAspectRatio="xMidYMin slice">
<rect class="background" height="100%" width="100%" x="0" y="0"/><defs><g id="g1"><text class="background" textLength="8" x="0"> </text></g><g id="g2"><text class="background" textLength="8" x="0"> </text><text class="foreground" textLength="680" x="8"> </text></g><g id="g3"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="background" textLength="8" x="120"> </text><text class="foreground" textLength="560" x="128"> </text></g><g id="g4"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="8" x="120">e</text><text class="background" textLength="8" x="128"> </text><text class="foreground" textLength="552" x="136"> </text></g><g id="g5"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color9" font-weight="bold" textLength="16" x="120">ev</text><text class="background" textLength="8" x="136"> </text><text class="foreground" textLength="544" x="144"> </text></g><g id="g6"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color9" font-weight="bold" textLength="24" x="120">eva</text><text class="background" textLength="8" x="144"> </text><text class="foreground" textLength="536" x="152"> </text></g><g id="g7"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="background" textLength="8" x="152"> </text><text class="foreground" textLength="528" x="160"> </text></g><g id="g8"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="8" x="152"> </text><text class="background" textLength="8" x="160"> </text><text class="foreground" textLength="520" x="168"> </text></g><g id="g9"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="16" x="152"> $</text><text class="background" textLength="8" x="168"> </text><text class="foreground" textLength="512" x="176"> </text></g><g id="g10"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="24" x="152"> $(</text><text class="background" textLength="8" x="176"> </text><text class="foreground" textLength="504" x="184"> </text></g><g id="g11"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="32" x="152"> $(.</text><text class="background" textLength="8" x="184"> </text><text class="foreground" textLength="496" x="192"> </text></g><g id="g12"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="40" x="152"> $(./</text><text class="background" textLength="8" x="192"> </text><text class="foreground" textLength="488" x="200"> </text></g><g id="g13"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="48" x="152"> $(./a</text><text class="background" textLength="8" x="200"> </text><text class="foreground" textLength="480" x="208"> </text></g><g id="g14"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="56" x="152"> $(./aw</text><text class="background" textLength="8" x="208"> </text><text class="foreground" textLength="472" x="216"> </text></g><g id="g15"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="64" x="152"> $(./aws</text><text class="background" textLength="8" x="216"> </text><text class="foreground" textLength="464" x="224"> </text></g><g id="g16"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="72" x="152"> $(./aws-</text><text class="background" textLength="8" x="224"> </text><text class="foreground" textLength="456" x="232"> </text></g><g id="g17"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="80" x="152"> $(./aws-y</text><text class="background" textLength="8" x="232"> </text><text class="foreground" textLength="448" x="240"> </text></g><g id="g18"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="88" x="152"> $(./aws-yk</text><text class="background" textLength="8" x="240"> </text><text class="foreground" textLength="440" x="248"> </text></g><g id="g19"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="96" x="152"> $(./aws-yk)</text><text class="background" textLength="8" x="248"> </text><text class="foreground" textLength="432" x="256"> </text></g><g id="g20"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="color2" textLength="32" x="120">eval</text><text class="foreground" textLength="536" x="152"> $(./aws-yk) </text></g><g id="g21"><text class="foreground" textLength="472" x="0"> </text><text class="background" textLength="8" x="472"> </text><text class="foreground" textLength="208" x="480"> </text></g><g id="g22"><text class="foreground" textLength="688" x="0"> </text></g><g id="g23"><text fill="#87afd7" font-weight="bold" textLength="16" x="0">&gt; </text><text class="background" textLength="8" x="16"> </text><text class="foreground" textLength="664" x="24"> </text></g><g id="g24"><text fill="#afd700" font-weight="bold" textLength="8" x="0">|</text><text class="foreground" textLength="8" x="8"> </text><text fill="#afaf87" textLength="24" x="16">0/0</text><text class="foreground" textLength="648" x="40"> </text></g><g id="g25"><text fill="#afd700" font-weight="bold" textLength="8" x="0">/</text><text class="foreground" textLength="8" x="8"> </text><text fill="#afaf87" textLength="24" x="16">0/0</text><text class="foreground" textLength="648" x="40"> </text></g><g id="g26"><text fill="#afd700" font-weight="bold" textLength="8" x="0">-</text><text class="foreground" textLength="8" x="8"> </text><text fill="#afaf87" textLength="24" x="16">0/0</text><text class="foreground" textLength="648" x="40"> </text></g><g id="g27"><text class="foreground" textLength="16" x="0"> </text><text fill="#afaf87" textLength="24" x="16">4/4</text><text class="foreground" textLength="648" x="40"> </text></g><g id="g28"><text fill="#d7005f" font-weight="bold" textLength="8" x="0">&gt;</text><text fill="#e4e4e4" font-weight="bold" textLength="56" x="8"> [none]</text><text class="foreground" textLength="624" x="64"> </text></g><g id="g29"><text fill="#d7005f" font-weight="bold" textLength="8" x="0"> </text><text class="foreground" textLength="680" x="8"> aws-mindcurv-dev </text></g><g id="g30"><text fill="#d7005f" font-weight="bold" textLength="8" x="0"> </text><text class="foreground" textLength="680" x="8"> aws-mindcurv-prod </text></g><g id="g31"><text fill="#d7005f" font-weight="bold" textLength="8" x="0"> </text><text class="foreground" textLength="680" x="8"> aws-mindcurv-test </text></g><g id="g32"><text fill="#d7005f" font-weight="bold" textLength="8" x="0"> </text><text class="foreground" textLength="680" x="8"> [none] </text></g><g id="g33"><text fill="#d7005f" font-weight="bold" textLength="8" x="0">&gt;</text><text fill="#e4e4e4" font-weight="bold" textLength="136" x="8"> aws-mindcurv-dev</text><text class="foreground" textLength="544" x="144"> </text></g><g id="g34"><text class="foreground" textLength="688" x="0"># Loading AWS credentials with AWS_PROFILE=mindcurv-dev </text></g><g id="g35"><text class="foreground" textLength="688" x="0"># Using first MFA device arn:aws:iam::753976864083:mfa/sebastian.nagel </text></g><g id="g36"><text class="foreground" textLength="688" x="0"># Generated token code 333259 </text></g><g id="g37"><text class="foreground" textLength="688" x="0"># Got credentials, valid until "2020-03-26T03:43:15Z" </text></g><g id="g38"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="16" x="88">][</text><text class="color3" textLength="96" x="104">mindcurv-dev</text><text class="color8" font-weight="bold" textLength="8" x="200">]</text><text class="color6" textLength="24" x="208"> &#10140; </text><text class="background" textLength="8" x="232"> </text><text class="foreground" textLength="448" x="240"> </text></g><g id="g39"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="16" x="88">][</text><text class="color3" textLength="96" x="104">mindcurv-dev</text><text class="color8" font-weight="bold" textLength="8" x="200">]</text><text class="color6" textLength="24" x="208"> &#10140; </text><text class="color2" textLength="32" x="232">eval</text><text class="foreground" textLength="96" x="264"> $(./aws-yk)</text><text class="background" textLength="8" x="360"> </text><text class="foreground" textLength="320" x="368"> </text></g><g id="g40"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="16" x="88">][</text><text class="color3" textLength="96" x="104">mindcurv-dev</text><text class="color8" font-weight="bold" textLength="8" x="200">]</text><text class="color6" textLength="24" x="208"> &#10140; </text><text class="color2" textLength="32" x="232">eval</text><text class="foreground" textLength="424" x="264"> $(./aws-yk) </text></g><g id="g41"><text fill="#afd700" font-weight="bold" textLength="8" x="0">\</text><text class="foreground" textLength="8" x="8"> </text><text fill="#afaf87" textLength="24" x="16">0/0</text><text class="foreground" textLength="648" x="40"> </text></g><g id="g42"><text class="foreground" textLength="688" x="0"># Clearing credentials </text></g><g id="g43"><text class="foreground" textLength="688" x="0"># To request new credentials, connect a yubikey and run with: </text></g><g id="g44"><text class="foreground" textLength="688" x="0"># eval $(./aws-yk) </text></g><g id="g45"><text class="color8" font-weight="bold" textLength="8" x="0">[</text><text class="color5" textLength="56" x="8">nage_se</text><text class="color8" font-weight="bold" textLength="16" x="64">][</text><text class="color4" textLength="8" x="80">~</text><text class="color8" font-weight="bold" textLength="8" x="88">]</text><text class="color6" textLength="24" x="96"> &#10140; </text><text class="foreground" textLength="568" x="120"> </text></g></defs><g id="screen_view"><g><rect class="foreground" height="17" width="8" x="0" y="0"/><use y="0" xlink:href="#g1"/></g><g><rect class="foreground" height="17" width="8" x="0" y="408"/><use y="408" xlink:href="#g1"/></g><g><rect class="foreground" height="17" width="8" x="0" y="816"/><use y="816" xlink:href="#g1"/></g><g><rect class="foreground" height="17" width="8" x="0" y="1224"/><use y="1224" xlink:href="#g2"/></g><g><rect class="foreground" height="17" width="8" x="120" y="1632"/><use y="1632" xlink:href="#g3"/></g><g><rect class="foreground" height="17" width="8" x="120" y="2040"/><use y="2040" xlink:href="#g3"/></g><g><rect class="foreground" height="17" width="8" x="128" y="2448"/><use y="2448" xlink:href="#g4"/></g><g><rect class="foreground" height="17" width="8" x="136" y="2856"/><use y="2856" xlink:href="#g5"/></g><g><rect class="foreground" height="17" width="8" x="144" y="3264"/><use y="3264" xlink:href="#g6"/></g><g><rect class="foreground" height="17" width="8" x="152" y="3672"/><use y="3672" xlink:href="#g7"/></g><g><rect class="foreground" height="17" width="8" x="160" y="4080"/><use y="4080" xlink:href="#g8"/></g><g><rect class="foreground" height="17" width="8" x="168" y="4488"/><use y="4488" xlink:href="#g9"/></g><g><rect class="foreground" height="17" width="8" x="176" y="4896"/><use y="4896" xlink:href="#g10"/></g><g><rect class="foreground" height="17" width="8" x="184" y="5304"/><use y="5304" xlink:href="#g11"/></g><g><rect class="foreground" height="17" width="8" x="192" y="5712"/><use y="5712" xlink:href="#g12"/></g><g><rect class="foreground" height="17" width="8" x="200" y="6120"/><use y="6120" xlink:href="#g13"/></g><g><rect class="foreground" height="17" width="8" x="208" y="6528"/><use y="6528" xlink:href="#g14"/></g><g><rect class="foreground" height="17" width="8" x="216" y="6936"/><use y="6936" xlink:href="#g15"/></g><g><rect class="foreground" height="17" width="8" x="224" y="7344"/><use y="7344" xlink:href="#g16"/></g><g><rect class="foreground" height="17" width="8" x="232" y="7752"/><use y="7752" xlink:href="#g17"/></g><g><rect class="foreground" height="17" width="8" x="240" y="8160"/><use y="8160" xlink:href="#g18"/></g><g><rect class="foreground" height="17" width="8" x="248" y="8568"/><use y="8568" xlink:href="#g19"/></g><g><rect class="foreground" height="17" width="8" x="248" y="8976"/><use y="8976" xlink:href="#g19"/></g><g><use y="9384" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="0" y="9401"/><use y="9401" xlink:href="#g1"/></g><g><use y="9792" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="0" y="9809"/><use y="9809" xlink:href="#g2"/></g><g><use y="10200" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="0" y="10217"/><use y="10217" xlink:href="#g2"/></g><g><use y="10608" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="472" y="10625"/><use y="10625" xlink:href="#g21"/><use y="10642" xlink:href="#g22"/><use y="10659" xlink:href="#g22"/><use y="10676" xlink:href="#g22"/><use y="10693" xlink:href="#g22"/><use y="10710" xlink:href="#g22"/><use y="10727" xlink:href="#g22"/><use y="10744" xlink:href="#g22"/><use y="10761" xlink:href="#g22"/><use y="10778" xlink:href="#g22"/></g><g><use y="11016" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="11033"/><use y="11033" xlink:href="#g23"/><use y="11050" xlink:href="#g24"/><use y="11067" xlink:href="#g22"/><use y="11084" xlink:href="#g22"/><use y="11101" xlink:href="#g22"/><use y="11118" xlink:href="#g22"/><use y="11135" xlink:href="#g22"/><use y="11152" xlink:href="#g22"/><use y="11169" xlink:href="#g22"/><use y="11186" xlink:href="#g22"/></g><g><use y="11424" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="11441"/><use y="11441" xlink:href="#g23"/><use y="11458" xlink:href="#g25"/><use y="11475" xlink:href="#g22"/><use y="11492" xlink:href="#g22"/><use y="11509" xlink:href="#g22"/><use y="11526" xlink:href="#g22"/><use y="11543" xlink:href="#g22"/><use y="11560" xlink:href="#g22"/><use y="11577" xlink:href="#g22"/><use y="11594" xlink:href="#g22"/></g><g><use y="11832" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="11849"/><use y="11849" xlink:href="#g23"/><use y="11866" xlink:href="#g26"/><use y="11883" xlink:href="#g22"/><use y="11900" xlink:href="#g22"/><use y="11917" xlink:href="#g22"/><use y="11934" xlink:href="#g22"/><use y="11951" xlink:href="#g22"/><use y="11968" xlink:href="#g22"/><use y="11985" xlink:href="#g22"/><use y="12002" xlink:href="#g22"/></g><g><use y="12240" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="12257"/><use y="12257" xlink:href="#g23"/><use y="12274" xlink:href="#g27"/><rect fill="#303030" height="17" width="64" x="0" y="12291"/><use y="12291" xlink:href="#g28"/><rect fill="#303030" height="17" width="8" x="0" y="12308"/><use y="12308" xlink:href="#g29"/><rect fill="#303030" height="17" width="8" x="0" y="12325"/><use y="12325" xlink:href="#g30"/><rect fill="#303030" height="17" width="8" x="0" y="12342"/><use y="12342" xlink:href="#g31"/><use y="12359" xlink:href="#g22"/><use y="12376" xlink:href="#g22"/><use y="12393" xlink:href="#g22"/><use y="12410" xlink:href="#g22"/></g><g><use y="12648" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="12665"/><use y="12665" xlink:href="#g23"/><use y="12682" xlink:href="#g27"/><rect fill="#303030" height="17" width="64" x="0" y="12699"/><use y="12699" xlink:href="#g28"/><rect fill="#303030" height="17" width="8" x="0" y="12716"/><use y="12716" xlink:href="#g29"/><rect fill="#303030" height="17" width="8" x="0" y="12733"/><use y="12733" xlink:href="#g30"/><rect fill="#303030" height="17" width="8" x="0" y="12750"/><use y="12750" xlink:href="#g31"/><use y="12767" xlink:href="#g22"/><use y="12784" xlink:href="#g22"/><use y="12801" xlink:href="#g22"/><use y="12818" xlink:href="#g22"/></g><g><use y="13056" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="16" y="13073"/><use y="13073" xlink:href="#g23"/><use y="13090" xlink:href="#g27"/><rect fill="#303030" height="17" width="8" x="0" y="13107"/><use y="13107" xlink:href="#g32"/><rect fill="#303030" height="17" width="144" x="0" y="13124"/><use y="13124" xlink:href="#g33"/><rect fill="#303030" height="17" width="8" x="0" y="13141"/><use y="13141" xlink:href="#g30"/><rect fill="#303030" height="17" width="8" x="0" y="13158"/><use y="13158" xlink:href="#g31"/><use y="13175" xlink:href="#g22"/><use y="13192" xlink:href="#g22"/><use y="13209" xlink:href="#g22"/><use y="13226" xlink:href="#g22"/></g><g><use y="13464" xlink:href="#g20"/><rect class="foreground" height="17" width="8" x="0" y="13481"/><use y="13481" xlink:href="#g2"/><use y="13498" xlink:href="#g22"/><use y="13515" xlink:href="#g22"/><use y="13532" xlink:href="#g22"/><use y="13549" xlink:href="#g22"/><use y="13566" xlink:href="#g22"/><use y="13583" xlink:href="#g22"/><use y="13600" xlink:href="#g22"/><use y="13617" xlink:href="#g22"/><use y="13634" xlink:href="#g22"/></g><g><use y="13872" xlink:href="#g20"/><use y="13889" xlink:href="#g34"/><rect class="foreground" height="17" width="8" x="0" y="13906"/><use y="13906" xlink:href="#g2"/><use y="13923" xlink:href="#g22"/><use y="13940" xlink:href="#g22"/><use y="13957" xlink:href="#g22"/><use y="13974" xlink:href="#g22"/><use y="13991" xlink:href="#g22"/><use y="14008" xlink:href="#g22"/><use y="14025" xlink:href="#g22"/><use y="14042" xlink:href="#g22"/></g><g><use y="14280" xlink:href="#g20"/><use y="14297" xlink:href="#g34"/><use y="14314" xlink:href="#g35"/><rect class="foreground" height="17" width="8" x="0" y="14331"/><use y="14331" xlink:href="#g2"/><use y="14348" xlink:href="#g22"/><use y="14365" xlink:href="#g22"/><use y="14382" xlink:href="#g22"/><use y="14399" xlink:href="#g22"/><use y="14416" xlink:href="#g22"/><use y="14433" xlink:href="#g22"/><use y="14450" xlink:href="#g22"/></g><g><use y="14688" xlink:href="#g20"/><use y="14705" xlink:href="#g34"/><use y="14722" xlink:href="#g35"/><use y="14739" xlink:href="#g36"/><rect class="foreground" height="17" width="8" x="0" y="14756"/><use y="14756" xlink:href="#g2"/><use y="14773" xlink:href="#g22"/><use y="14790" xlink:href="#g22"/><use y="14807" xlink:href="#g22"/><use y="14824" xlink:href="#g22"/><use y="14841" xlink:href="#g22"/><use y="14858" xlink:href="#g22"/></g><g><use y="15096" xlink:href="#g20"/><use y="15113" xlink:href="#g34"/><use y="15130" xlink:href="#g35"/><use y="15147" xlink:href="#g36"/><use y="15164" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="0" y="15181"/><use y="15181" xlink:href="#g2"/><use y="15198" xlink:href="#g22"/><use y="15215" xlink:href="#g22"/><use y="15232" xlink:href="#g22"/><use y="15249" xlink:href="#g22"/><use y="15266" xlink:href="#g22"/></g><g><use y="15504" xlink:href="#g20"/><use y="15521" xlink:href="#g34"/><use y="15538" xlink:href="#g35"/><use y="15555" xlink:href="#g36"/><use y="15572" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="0" y="15589"/><use y="15589" xlink:href="#g2"/><use y="15606" xlink:href="#g22"/><use y="15623" xlink:href="#g22"/><use y="15640" xlink:href="#g22"/><use y="15657" xlink:href="#g22"/><use y="15674" xlink:href="#g22"/></g><g><use y="15912" xlink:href="#g20"/><use y="15929" xlink:href="#g34"/><use y="15946" xlink:href="#g35"/><use y="15963" xlink:href="#g36"/><use y="15980" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="232" y="15997"/><use y="15997" xlink:href="#g38"/><use y="16014" xlink:href="#g22"/><use y="16031" xlink:href="#g22"/><use y="16048" xlink:href="#g22"/><use y="16065" xlink:href="#g22"/><use y="16082" xlink:href="#g22"/></g><g><use y="16320" xlink:href="#g20"/><use y="16337" xlink:href="#g34"/><use y="16354" xlink:href="#g35"/><use y="16371" xlink:href="#g36"/><use y="16388" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="232" y="16405"/><use y="16405" xlink:href="#g38"/><use y="16422" xlink:href="#g22"/><use y="16439" xlink:href="#g22"/><use y="16456" xlink:href="#g22"/><use y="16473" xlink:href="#g22"/><use y="16490" xlink:href="#g22"/></g><g><use y="16728" xlink:href="#g20"/><use y="16745" xlink:href="#g34"/><use y="16762" xlink:href="#g35"/><use y="16779" xlink:href="#g36"/><use y="16796" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="360" y="16813"/><use y="16813" xlink:href="#g39"/><use y="16830" xlink:href="#g22"/><use y="16847" xlink:href="#g22"/><use y="16864" xlink:href="#g22"/><use y="16881" xlink:href="#g22"/><use y="16898" xlink:href="#g22"/></g><g><use y="17136" xlink:href="#g20"/><use y="17153" xlink:href="#g34"/><use y="17170" xlink:href="#g35"/><use y="17187" xlink:href="#g36"/><use y="17204" xlink:href="#g37"/><rect class="foreground" height="17" width="8" x="360" y="17221"/><use y="17221" xlink:href="#g39"/><use y="17238" xlink:href="#g22"/><use y="17255" xlink:href="#g22"/><use y="17272" xlink:href="#g22"/><use y="17289" xlink:href="#g22"/><use y="17306" xlink:href="#g22"/></g><g><use y="17544" xlink:href="#g20"/><use y="17561" xlink:href="#g34"/><use y="17578" xlink:href="#g35"/><use y="17595" xlink:href="#g36"/><use y="17612" xlink:href="#g37"/><use y="17629" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="0" y="17646"/><use y="17646" xlink:href="#g2"/><use y="17663" xlink:href="#g22"/><use y="17680" xlink:href="#g22"/><use y="17697" xlink:href="#g22"/><use y="17714" xlink:href="#g22"/></g><g><use y="17952" xlink:href="#g20"/><use y="17969" xlink:href="#g34"/><use y="17986" xlink:href="#g35"/><use y="18003" xlink:href="#g36"/><use y="18020" xlink:href="#g37"/><use y="18037" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="0" y="18054"/><use y="18054" xlink:href="#g2"/><use y="18071" xlink:href="#g22"/><use y="18088" xlink:href="#g22"/><use y="18105" xlink:href="#g22"/><use y="18122" xlink:href="#g22"/></g><g><use y="18360" xlink:href="#g20"/><use y="18377" xlink:href="#g34"/><use y="18394" xlink:href="#g35"/><use y="18411" xlink:href="#g36"/><use y="18428" xlink:href="#g37"/><use y="18445" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="0" y="18462"/><use y="18462" xlink:href="#g2"/><use y="18479" xlink:href="#g22"/><use y="18496" xlink:href="#g22"/><use y="18513" xlink:href="#g22"/><use y="18530" xlink:href="#g22"/></g><g><use y="18768" xlink:href="#g20"/><use y="18785" xlink:href="#g34"/><use y="18802" xlink:href="#g35"/><use y="18819" xlink:href="#g36"/><use y="18836" xlink:href="#g37"/><use y="18853" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="472" y="18870"/><use y="18870" xlink:href="#g21"/><use y="18887" xlink:href="#g22"/><use y="18904" xlink:href="#g22"/><use y="18921" xlink:href="#g22"/><use y="18938" xlink:href="#g22"/><use y="18955" xlink:href="#g22"/><use y="18972" xlink:href="#g22"/><use y="18989" xlink:href="#g22"/><use y="19006" xlink:href="#g22"/><use y="19023" xlink:href="#g22"/></g><g><use y="19176" xlink:href="#g20"/><use y="19193" xlink:href="#g34"/><use y="19210" xlink:href="#g35"/><use y="19227" xlink:href="#g36"/><use y="19244" xlink:href="#g37"/><use y="19261" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="16" y="19278"/><use y="19278" xlink:href="#g23"/><use y="19295" xlink:href="#g41"/><use y="19312" xlink:href="#g22"/><use y="19329" xlink:href="#g22"/><use y="19346" xlink:href="#g22"/><use y="19363" xlink:href="#g22"/><use y="19380" xlink:href="#g22"/><use y="19397" xlink:href="#g22"/><use y="19414" xlink:href="#g22"/><use y="19431" xlink:href="#g22"/></g><g><use y="19584" xlink:href="#g20"/><use y="19601" xlink:href="#g34"/><use y="19618" xlink:href="#g35"/><use y="19635" xlink:href="#g36"/><use y="19652" xlink:href="#g37"/><use y="19669" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="16" y="19686"/><use y="19686" xlink:href="#g23"/><use y="19703" xlink:href="#g24"/><use y="19720" xlink:href="#g22"/><use y="19737" xlink:href="#g22"/><use y="19754" xlink:href="#g22"/><use y="19771" xlink:href="#g22"/><use y="19788" xlink:href="#g22"/><use y="19805" xlink:href="#g22"/><use y="19822" xlink:href="#g22"/><use y="19839" xlink:href="#g22"/></g><g><use y="19992" xlink:href="#g20"/><use y="20009" xlink:href="#g34"/><use y="20026" xlink:href="#g35"/><use y="20043" xlink:href="#g36"/><use y="20060" xlink:href="#g37"/><use y="20077" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="16" y="20094"/><use y="20094" xlink:href="#g23"/><use y="20111" xlink:href="#g25"/><use y="20128" xlink:href="#g22"/><use y="20145" xlink:href="#g22"/><use y="20162" xlink:href="#g22"/><use y="20179" xlink:href="#g22"/><use y="20196" xlink:href="#g22"/><use y="20213" xlink:href="#g22"/><use y="20230" xlink:href="#g22"/><use y="20247" xlink:href="#g22"/></g><g><use y="20400" xlink:href="#g20"/><use y="20417" xlink:href="#g34"/><use y="20434" xlink:href="#g35"/><use y="20451" xlink:href="#g36"/><use y="20468" xlink:href="#g37"/><use y="20485" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="16" y="20502"/><use y="20502" xlink:href="#g23"/><use y="20519" xlink:href="#g27"/><rect fill="#303030" height="17" width="64" x="0" y="20536"/><use y="20536" xlink:href="#g28"/><rect fill="#303030" height="17" width="8" x="0" y="20553"/><use y="20553" xlink:href="#g29"/><rect fill="#303030" height="17" width="8" x="0" y="20570"/><use y="20570" xlink:href="#g30"/><rect fill="#303030" height="17" width="8" x="0" y="20587"/><use y="20587" xlink:href="#g31"/><use y="20604" xlink:href="#g22"/><use y="20621" xlink:href="#g22"/><use y="20638" xlink:href="#g22"/><use y="20655" xlink:href="#g22"/></g><g><use y="20808" xlink:href="#g20"/><use y="20825" xlink:href="#g34"/><use y="20842" xlink:href="#g35"/><use y="20859" xlink:href="#g36"/><use y="20876" xlink:href="#g37"/><use y="20893" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="16" y="20910"/><use y="20910" xlink:href="#g23"/><use y="20927" xlink:href="#g27"/><rect fill="#303030" height="17" width="64" x="0" y="20944"/><use y="20944" xlink:href="#g28"/><rect fill="#303030" height="17" width="8" x="0" y="20961"/><use y="20961" xlink:href="#g29"/><rect fill="#303030" height="17" width="8" x="0" y="20978"/><use y="20978" xlink:href="#g30"/><rect fill="#303030" height="17" width="8" x="0" y="20995"/><use y="20995" xlink:href="#g31"/><use y="21012" xlink:href="#g22"/><use y="21029" xlink:href="#g22"/><use y="21046" xlink:href="#g22"/><use y="21063" xlink:href="#g22"/></g><g><use y="21216" xlink:href="#g20"/><use y="21233" xlink:href="#g34"/><use y="21250" xlink:href="#g35"/><use y="21267" xlink:href="#g36"/><use y="21284" xlink:href="#g37"/><use y="21301" xlink:href="#g40"/><rect class="foreground" height="17" width="8" x="0" y="21318"/><use y="21318" xlink:href="#g2"/><use y="21335" xlink:href="#g22"/><use y="21352" xlink:href="#g22"/><use y="21369" xlink:href="#g22"/><use y="21386" xlink:href="#g22"/><use y="21403" xlink:href="#g22"/><use y="21420" xlink:href="#g22"/><use y="21437" xlink:href="#g22"/><use y="21454" xlink:href="#g22"/><use y="21471" xlink:href="#g22"/></g><g><use y="21624" xlink:href="#g20"/><use y="21641" xlink:href="#g34"/><use y="21658" xlink:href="#g35"/><use y="21675" xlink:href="#g36"/><use y="21692" xlink:href="#g37"/><use y="21709" xlink:href="#g40"/><use y="21726" xlink:href="#g42"/><use y="21743" xlink:href="#g43"/><use y="21760" xlink:href="#g44"/><rect class="foreground" height="17" width="8" x="0" y="21777"/><use y="21777" xlink:href="#g2"/><use y="21794" xlink:href="#g22"/><use y="21811" xlink:href="#g22"/><use y="21828" xlink:href="#g22"/><use y="21845" xlink:href="#g22"/><use y="21862" xlink:href="#g22"/><use y="21879" xlink:href="#g22"/></g><g><use y="22032" xlink:href="#g20"/><use y="22049" xlink:href="#g34"/><use y="22066" xlink:href="#g35"/><use y="22083" xlink:href="#g36"/><use y="22100" xlink:href="#g37"/><use y="22117" xlink:href="#g40"/><use y="22134" xlink:href="#g42"/><use y="22151" xlink:href="#g43"/><use y="22168" xlink:href="#g44"/><rect class="foreground" height="17" width="8" x="120" y="22185"/><use y="22185" xlink:href="#g3"/><use y="22202" xlink:href="#g22"/><use y="22219" xlink:href="#g22"/><use y="22236" xlink:href="#g22"/><use y="22253" xlink:href="#g22"/><use y="22270" xlink:href="#g22"/><use y="22287" xlink:href="#g22"/></g><g><use y="22440" xlink:href="#g20"/><use y="22457" xlink:href="#g34"/><use y="22474" xlink:href="#g35"/><use y="22491" xlink:href="#g36"/><use y="22508" xlink:href="#g37"/><use y="22525" xlink:href="#g40"/><use y="22542" xlink:href="#g42"/><use y="22559" xlink:href="#g43"/><use y="22576" xlink:href="#g44"/><use y="22593" xlink:href="#g45"/><rect class="foreground" height="17" width="8" x="0" y="22610"/><use y="22610" xlink:href="#g2"/><use y="22627" xlink:href="#g22"/><use y="22644" xlink:href="#g22"/><use y="22661" xlink:href="#g22"/><use y="22678" xlink:href="#g22"/><use y="22695" xlink:href="#g22"/></g></g></svg>
</svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment