<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="favicon.png">
<title></title>
<meta name="description" content="" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="menu">
</div>
<div id="container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox='{{viewBox}}' style="--fs:0.16; --sw: 0.5;">
<style>
.interior {
stroke-width: 2;
stroke-linecap: round;
stroke: black;
fill: none;
cursor: pointer;
pointer-events: stroke;
}
.outline {
stroke: red;
fill: none;
}
text {
fill: white;
stroke: none;
stroke-width: calc(var(--fs) / 3);
text-shadow: 1px 1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, -1px -1px 0 #000, 2px 0px 0 #000, 0px 2px 0 #000, -2px 0px 0 #000, 0px -2px 0 #000;
font-size: calc(var(--fs) * 1rem);
pointer-events: none;
cursor: pointer;
}
</style>
{% for name,item in corners %}
<circle cx="{{item[0]}}" cy="{{item[1]}}" r="1" fill="gray" />
{% endfor %}
{% for name,item in borders %}
<path id="border-{{name}}" transform="translate({{item.x}},{{item.y}})" d="{{item.d}}" class="interior border-{{name}}" />
{% endfor %}
{% for name,item in outline %}
<path d="{{item}}" class="outline outline-{{name}}" />
{% endfor %}
</svg>
</div>
<script src="script.js" ></script>
<script>
var borders = {};
{% for name,item in borders %}
borders["border-{{name}}"]={x:{{item.x}},y:{{item.y}} };
document.getElementById('border-{{name}}').addEventListener('pointerdown',downBorder);
{% endfor %}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="favicon.png">
<title></title>
<meta name="description" content="" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="menu">
</div>
<div id="container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 185 200' style="--fs:0.16; --sw: 0.5;">
<style>
.interior {
stroke-width: 2;
stroke-linecap: round;
stroke: black;
fill: none;
cursor: pointer;
pointer-events: stroke;
}
.outline {
stroke: red;
fill: none;
}
text {
fill: white;
stroke: none;
stroke-width: calc(var(--fs) / 3);
text-shadow: 1px 1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, -1px -1px 0 #000, 2px 0px 0 #000, 0px 2px 0 #000, -2px 0px 0 #000, 0px -2px 0 #000;
font-size: calc(var(--fs) * 1rem);
pointer-events: none;
cursor: pointer;
}
</style>
<circle cx="106.65" cy="28.01" r="1" fill="gray" />
<circle cx="90.15" cy="28.0" r="1" fill="gray" />
<circle cx="89.88" cy="16.81" r="1" fill="gray" />
<circle cx="66.23" cy="17.09" r="1" fill="gray" />
<circle cx="66.07" cy="21.22" r="1" fill="gray" />
<circle cx="43.94" cy="23.59" r="1" fill="gray" />
<circle cx="44.05" cy="34.46" r="1" fill="gray" />
<circle cx="34.63" cy="34.49" r="1" fill="gray" />
<circle cx="25.17" cy="34.46" r="1" fill="gray" />
<circle cx="25.53" cy="16.89" r="1" fill="gray" />
<circle cx="50.38" cy="54.94" r="1" fill="gray" />
<circle cx="32.7" cy="62.55" r="1" fill="gray" />
<circle cx="34.64" cy="54.97" r="1" fill="gray" />
<circle cx="15.79" cy="34.5" r="1" fill="gray" />
<circle cx="72.47" cy="42.83" r="1" fill="gray" />
<circle cx="72.5" cy="54.98" r="1" fill="gray" />
<circle cx="69.46" cy="54.96" r="1" fill="gray" />
<circle cx="50.36" cy="38.67" r="1" fill="gray" />
<circle cx="66.17" cy="38.66" r="1" fill="gray" />
<circle cx="69.47" cy="56.92" r="1" fill="gray" />
<circle cx="66.15" cy="30.18" r="1" fill="gray" />
<circle cx="111.6" cy="58.78" r="1" fill="gray" />
<circle cx="109.74" cy="62.67" r="1" fill="gray" />
<circle cx="106.88" cy="70.33" r="1" fill="gray" />
<circle cx="97.71" cy="70.33" r="1" fill="gray" />
<circle cx="96.38" cy="67.97" r="1" fill="gray" />
<circle cx="95.91" cy="56.76" r="1" fill="gray" />
<circle cx="108.51" cy="32.31" r="1" fill="gray" />
<circle cx="106.01" cy="41.31" r="1" fill="gray" />
<circle cx="92.22" cy="40.42" r="1" fill="gray" />
<circle cx="90.14" cy="32.38" r="1" fill="gray" />
<circle cx="93.72" cy="42.83" r="1" fill="gray" />
<circle cx="95.93" cy="54.94" r="1" fill="gray" />
<circle cx="113.36" cy="55.13" r="1" fill="gray" />
<circle cx="112.12" cy="56.89" r="1" fill="gray" />
<circle cx="162.65" cy="34.23" r="1" fill="gray" />
<circle cx="168.01" cy="34.41" r="1" fill="gray" />
<circle cx="163.33" cy="31.29" r="1" fill="gray" />
<circle cx="165.94" cy="31.36" r="1" fill="gray" />
<circle cx="116.32" cy="62.75" r="1" fill="gray" />
<circle cx="124.35" cy="62.81" r="1" fill="gray" />
<circle cx="126.31" cy="77.86" r="1" fill="gray" />
<circle cx="128.47" cy="62.8" r="1" fill="gray" />
<circle cx="132.4" cy="62.83" r="1" fill="gray" />
<circle cx="116.69" cy="51.69" r="1" fill="gray" />
<circle cx="126.93" cy="35.83" r="1" fill="gray" />
<circle cx="126.88" cy="46.49" r="1" fill="gray" />
<circle cx="133.94" cy="49.29" r="1" fill="gray" />
<circle cx="135.88" cy="52.82" r="1" fill="gray" />
<circle cx="131.59" cy="56.24" r="1" fill="gray" />
<circle cx="131.43" cy="56.3" r="1" fill="gray" />
<circle cx="130.51" cy="56.52" r="1" fill="gray" />
<circle cx="136.81" cy="56.58" r="1" fill="gray" />
<circle cx="135.58" cy="56.64" r="1" fill="gray" />
<circle cx="140.47" cy="40.18" r="1" fill="gray" />
<circle cx="149.31" cy="45.61" r="1" fill="gray" />
<circle cx="143.76" cy="43.98" r="1" fill="gray" />
<circle cx="155.42" cy="43.97" r="1" fill="gray" />
<circle cx="156.62" cy="43.68" r="1" fill="gray" />
<circle cx="158.92" cy="37.19" r="1" fill="gray" />
<path id="border-WI-MN" transform="translate(-1.037841777863619,109.78769161982781)" d="M 104.18 13.63 104.18 13.63 103.35 13.89 103.38 16.46 103.28 16.45 102.5 16.96 101.82 17.39 101.37 18.23 102.04 19.07 101.8 20.2 101.79 21.41 101.7 22.4 102.62 23.25 103.0 23.29 104.02 23.92 104.37 24.22 104.59 24.69 105.39 25.45 106.46 26.1 106.56 26.46 106.57 27.52 106.65 28.01 " class="interior border-WI-MN" />
<path id="border-SD-MN" transform="translate(42.53087002787137,154.70080794920239)" d="M 90.15 28.0 90.19 23.91 89.81 19.64 89.26 19.29 88.95 18.59 89.12 17.98 89.82 17.47 89.88 16.81 " class="interior border-SD-MN" />
<path id="border-ND-MN" transform="translate(64.34225517632004,133.27134033419603)" d="M 89.88 16.81 89.88 15.98 89.68 15.29 89.42 14.55 89.26 13.61 89.23 12.56 89.12 12.31 88.99 10.95 88.98 10.32 88.92 9.76 88.76 8.81 88.38 7.84 88.01 6.98 87.95 6.12 87.91 5.19 88.02 4.58 88.04 4.02 87.75 3.33 87.7 2.86 " class="interior border-ND-MN" />
<path id="border-ND-MT" transform="translate(88.48599160166206,153.1049154101039)" d="M 66.02 2.83 66.07 11.51 66.23 17.09 " class="interior border-ND-MT" />
<path id="border-SD-MT" transform="translate(-2.220030353701631,147.89228083347388)" d="M 66.23 17.09 66.07 21.22 " class="interior border-SD-MT" />
<path id="border-WY-MT" transform="translate(22.834632449285863,150.44036750673328)" d="M 66.07 21.22 60.8 21.17 55.11 21.19 50.2 21.14 43.98 21.18 44.0 23.44 43.94 23.59 " class="interior border-WY-MT" />
<path id="border-SD-ND" transform="translate(70.5993921697683,158.8348035454056)" d="M 89.88 16.81 83.87 17.06 78.74 17.05 72.26 17.07 66.23 17.09 " class="interior border-SD-ND" />
<path id="border-MT-ID" transform="translate(24.251075673672563,168.82279201515536)" d="M 28.26 2.86 28.26 2.86 28.52 7.86 29.35 9.11 29.35 9.95 29.94 10.7 30.66 11.14 31.19 11.86 32.07 13.29 32.88 13.96 33.83 14.0 33.49 15.02 33.18 16.22 33.45 17.39 33.08 17.68 33.11 18.84 33.67 19.29 34.3 18.75 34.62 18.12 35.0 18.24 35.38 18.86 35.74 20.28 36.3 20.84 36.5 22.01 36.7 22.33 37.34 22.44 37.73 23.09 38.29 24.24 38.87 23.63 39.9 23.79 39.99 23.35 41.77 23.63 42.5 23.49 42.94 22.61 43.29 22.73 43.59 23.35 43.94 23.59 " class="interior border-MT-ID" />
<path id="border-WY-ID" transform="translate(55.57483469403387,158.4248070563411)" d="M 43.94 23.59 44.05 23.67 44.05 34.46 " class="interior border-WY-ID" />
<path id="border-UT-ID" transform="translate(115.67886152753569,80.58891641243665)" d="M 44.05 34.46 34.63 34.49 " class="interior border-UT-ID" />
<path id="border-NV-ID" transform="translate(46.24166539014616,113.41712025406846)" d="M 34.63 34.49 25.17 34.46 " class="interior border-NV-ID" />
<path id="border-OR-ID" transform="translate(71.2228755130065,137.49046181214956)" d="M 25.17 34.46 25.21 26.72 25.49 25.47 25.23 24.9 24.64 24.6 24.65 23.89 25.1 22.89 25.78 22.01 26.23 20.56 26.65 19.41 26.97 18.82 26.8 18.13 26.27 17.77 25.53 16.89 " class="interior border-OR-ID" />
<path id="border-WA-ID" transform="translate(29.7872335387148,166.78499834761664)" d="M 25.53 16.89 25.55 16.08 25.26 15.39 25.17 8.93 25.16 2.87 " class="interior border-WA-ID" />
<path id="border-CO-AZ" transform="translate(42.87087716783018,125.3470046480573)" d="M 50.38 54.94 50.38 54.94 " class="interior border-CO-AZ" />
<path id="border-NM-AZ" transform="translate(-12.110472433306242,102.83567306408082)" d="M 50.38 54.94 50.38 54.94 50.39 76.56 " class="interior border-NM-AZ" />
<path id="border-UT-AZ" transform="translate(35.921671758086305,68.65848406839284)" d="M 34.64 54.97 39.73 54.91 45.8 54.92 50.38 54.94 50.38 54.94 " class="interior border-UT-AZ" />
<path id="border-CA-AZ" transform="translate(39.59238042437728,87.13633636627664)" d="M 32.45 71.42 32.87 71.44 33.22 70.69 32.66 70.17 32.55 69.6 32.39 68.94 33.0 68.07 33.25 66.33 34.21 65.54 33.61 64.81 33.2 64.09 32.94 63.41 32.77 62.89 32.7 62.55 " class="interior border-CA-AZ" />
<path id="border-NV-AZ" transform="translate(10.12673510445444,79.49403372339022)" d="M 32.7 62.55 32.9 61.79 32.74 61.03 32.68 60.28 32.68 59.44 32.4 58.91 32.61 58.43 33.28 58.43 33.88 58.7 34.31 58.86 34.52 58.26 34.66 58.13 34.64 54.97 " class="interior border-NV-AZ" />
<path id="border-NV-CA" transform="translate(39.674628342395145,150.4971782070842)" d="M 15.79 34.5 15.78 46.95 21.74 52.38 27.4 57.61 32.7 62.55 32.7 62.55 " class="interior border-NV-CA" />
<path id="border-OR-CA" transform="translate(27.07990016704436,110.23368840097274)" d="M 2.48 34.47 15.79 34.5 " class="interior border-OR-CA" />
<path id="border-KS-CO" transform="translate(-23.2545740593321,119.46500751663989)" d="M 72.47 42.83 72.47 42.83 72.51 49.11 72.5 54.98 " class="interior border-KS-CO" />
<path id="border-NE-CO" transform="translate(75.61371623267767,129.14209894685962)" d="M 66.17 38.66 72.48 38.66 72.47 42.7 72.47 42.83 72.47 42.83 " class="interior border-NE-CO" />
<path id="border-OK-CO" transform="translate(87.05817228628968,114.59113333857303)" d="M 72.5 54.98 69.46 54.96 " class="interior border-OK-CO" />
<path id="border-NM-CO" transform="translate(-19.862203088484748,109.88309917271843)" d="M 69.46 54.96 65.68 54.96 60.32 54.95 55.33 54.94 50.38 54.94 " class="interior border-NM-CO" />
<path id="border-UT-CO" transform="translate(-22.36895083935424,108.04544455799504)" d="M 50.38 54.94 50.36 38.67 " class="interior border-UT-CO" />
<path id="border-WY-CO" transform="translate(8.271958070515524,89.64095080584725)" d="M 50.36 38.67 53.52 38.67 56.68 38.67 63.01 38.67 66.17 38.66 " class="interior border-WY-CO" />
<path id="border-OR-NV" transform="translate(57.938363287425794,142.07631512509346)" d="M 15.79 34.5 25.17 34.47 25.17 34.46 25.17 34.46 " class="interior border-OR-NV" />
<path id="border-UT-NV" transform="translate(102.5112956829119,84.60004895872953)" d="M 34.63 34.49 34.64 54.97 " class="interior border-UT-NV" />
<path id="border-UT-NM" transform="translate(31.615996388852444,111.35592352836156)" d="M 50.38 54.94 " class="interior border-UT-NM" />
<path id="border-OK-NM" transform="translate(-8.546848563585762,90.47598201977408)" d="M 69.46 54.96 69.47 56.92 " class="interior border-OK-NM" />
<path id="border-TX-NM" transform="translate(56.56566786611434,64.360423838413)" d="M 69.47 56.92 69.47 67.04 69.47 74.12 66.54 74.12 60.85 74.12 58.01 74.12 58.04 74.44 58.4 75.03 " class="interior border-TX-NM" />
<path id="border-WA-OR" transform="translate(161.58543283884143,131.36981228405634)" d="M 3.15 15.6 3.86 15.61 4.82 15.63 5.59 16.04 6.5 16.3 7.09 17.17 7.18 17.93 7.41 18.57 8.14 18.74 8.91 18.73 10.14 18.25 10.85 18.1 11.98 18.3 12.48 18.53 13.14 18.37 13.86 18.01 15.28 18.07 16.46 17.57 17.07 17.2 17.88 17.4 19.01 16.93 25.53 16.89 25.53 16.89 " class="interior border-WA-OR" />
<path id="border-WY-UT" transform="translate(25.860753535427506,107.99853728899652)" d="M 44.05 34.46 44.04 38.56 50.36 38.67 " class="interior border-WY-UT" />
<path id="border-MO-AR" transform="translate(-60.5031618388737,127.8192437235382)" d="M 95.91 56.76 99.75 56.81 103.24 56.82 106.58 56.82 110.18 57.07 110.44 57.55 110.08 57.97 109.73 58.39 109.54 58.78 111.6 58.78 111.6 58.78 " class="interior border-MO-AR" />
<path id="border-TN-AR" transform="translate(0.20189743402946192,88.13519297515373)" d="M 111.6 58.78 111.6 58.78 111.56 59.11 111.24 59.66 110.69 60.03 110.57 60.68 110.07 61.19 110.11 62.31 109.74 62.67 " class="interior border-TN-AR" />
<path id="border-MS-AR" transform="translate(-5.169269911514661,114.86572731262875)" d="M 109.74 62.67 109.68 62.98 109.12 63.27 109.11 63.82 108.69 64.85 108.32 65.07 107.76 65.59 107.43 66.37 106.74 67.7 106.67 68.6 107.03 69.59 106.88 70.33 " class="interior border-MS-AR" />
<path id="border-LA-AR" transform="translate(-25.167559981934687,75.88259608845705)" d="M 106.88 70.33 104.21 70.21 100.76 70.33 97.71 70.33 " class="interior border-LA-AR" />
<path id="border-TX-AR" transform="translate(52.06631625546491,98.36974636378754)" d="M 97.71 70.33 97.89 68.18 97.16 68.17 96.55 68.22 96.38 67.97 " class="interior border-TX-AR" />
<path id="border-OK-AR" transform="translate(-33.72779506897538,92.65715580452397)" d="M 96.38 67.97 96.47 64.63 96.54 60.88 95.91 56.76 " class="interior border-OK-AR" />
<path id="border-MN-IA" transform="translate(17.502930250428918,128.11501547692797)" d="M 90.15 28.0 90.15 28.0 93.6 28.01 97.89 27.95 102.51 27.93 106.65 28.01 " class="interior border-MN-IA" />
<path id="border-SD-IA" transform="translate(34.118115806618434,103.1262220236145)" d="M 90.14 32.38 90.15 31.99 89.64 31.51 89.89 30.8 90.06 30.11 90.13 29.64 89.73 29.07 89.73 28.01 90.15 28.0 90.15 28.0 " class="interior border-SD-IA" />
<path id="border-WI-IA" transform="translate(27.278597479448905,111.2400447325668)" d="M 106.65 28.01 106.7 28.24 107.11 28.93 106.83 29.26 106.84 30.17 106.96 30.56 107.17 31.24 108.2 31.65 108.51 32.31 " class="interior border-WI-IA" />
<path id="border-IL-IA" transform="translate(43.41132504512815,83.70739393129124)" d="M 108.51 32.31 108.69 32.63 109.06 32.85 109.21 33.31 109.71 33.66 110.04 34.02 109.87 35.16 109.28 36.12 109.07 36.43 108.35 36.67 107.27 36.88 106.98 37.6 107.38 37.93 107.51 38.58 107.1 39.3 106.89 39.93 106.08 40.55 106.01 41.31 " class="interior border-IL-IA" />
<path id="border-MO-IA" transform="translate(24.01390827688637,111.67158777630297)" d="M 106.01 41.31 105.58 40.96 104.98 40.29 101.52 40.38 97.89 40.41 95.06 40.42 92.22 40.42 " class="interior border-MO-IA" />
<path id="border-NE-IA" transform="translate(64.58048233768699,99.34752393478145)" d="M 92.22 40.42 92.02 39.66 92.11 38.92 92.04 38.19 91.71 36.98 91.5 36.48 91.28 36.34 91.25 35.36 91.05 34.66 90.48 33.86 90.49 33.51 90.29 32.8 90.14 32.38 " class="interior border-NE-IA" />
<path id="border-OK-KS" transform="translate(24.33204299105398,61.75080083189752)" d="M 95.93 54.94 93.16 54.95 87.48 54.95 81.79 54.96 78.63 54.97 75.48 54.97 72.5 54.98 72.5 54.98 " class="interior border-OK-KS" />
<path id="border-NE-KS" transform="translate(-46.775377207087445,101.9570174587166)" d="M 72.47 42.83 72.48 42.83 78.0 42.83 82.11 42.83 89.37 42.83 93.72 42.83 " class="interior border-NE-KS" />
<path id="border-MO-KS" transform="translate(-63.890166389291544,83.28274068761903)" d="M 93.72 42.83 94.47 43.38 94.88 43.37 94.97 43.97 94.53 44.72 94.77 45.11 95.16 45.97 95.99 46.36 95.95 50.69 95.93 54.94 " class="interior border-MO-KS" />
<path id="border-TN-MO" transform="translate(-96.86722516347658,104.44291548136114)" d="M 112.12 56.89 112.03 57.27 111.84 57.83 111.6 58.78 111.6 58.78 " class="interior border-TN-MO" />
<path id="border-OK-MO" transform="translate(-30.809196861238462,83.79286814694774)" d="M 95.91 56.76 95.95 54.94 95.93 54.94 " class="interior border-OK-MO" />
<path id="border-NE-MO" transform="translate(-51.1886774851066,88.32123985493358)" d="M 93.72 42.83 93.31 41.95 92.82 41.42 92.29 40.76 92.22 40.42 " class="interior border-NE-MO" />
<path id="border-WY-NE" transform="translate(67.6032912144422,108.058153434237)" d="M 66.17 38.66 66.15 30.18 " class="interior border-WY-NE" />
<path id="border-SD-NE" transform="translate(5.284908772790146,128.83500690447667)" d="M 66.15 30.18 72.32 30.18 77.05 30.18 83.39 30.18 84.2 30.72 85.37 31.07 85.64 30.87 86.39 30.89 87.52 30.84 88.33 31.4 89.2 31.76 89.34 32.11 89.61 32.32 90.14 32.38 " class="interior border-SD-NE" />
<path id="border-TX-OK" transform="translate(55.78604411759579,48.36848444633331)" d="M 96.38 67.97 95.02 67.22 94.14 66.82 93.42 67.08 92.31 67.04 91.65 67.04 91.11 67.35 90.58 67.51 90.12 67.33 89.07 67.53 88.59 66.9 88.09 67.45 87.23 67.2 86.35 66.61 85.4 66.99 84.99 66.07 83.52 66.16 82.57 65.96 81.52 65.69 81.05 64.89 80.21 65.15 79.7 64.84 78.95 64.42 78.95 60.74 78.95 56.92 75.79 56.92 72.63 56.92 69.47 56.92 " class="interior border-TX-OK" />
<path id="border-WY-SD" transform="translate(81.98927746627916,137.7089287207873)" d="M 66.15 30.18 66.07 21.22 " class="interior border-WY-SD" />
<path id="border-TX-LA" transform="translate(-30.461509789897363,93.93621392918149)" d="M 98.38 82.53 98.16 82.14 98.48 81.6 98.95 81.12 98.96 80.39 98.73 80.15 99.0 79.27 99.21 78.87 99.51 77.53 99.23 77.02 98.86 76.18 98.6 75.32 98.42 74.75 97.9 74.33 97.71 70.33 97.71 70.33 " class="interior border-TX-LA" />
<path id="border-MS-LA" transform="translate(9.506787153792587,68.02398992831378)" d="M 106.88 70.33 107.11 70.55 106.82 71.09 107.28 71.87 107.15 72.33 107.55 72.97 107.12 73.35 106.97 74.06 106.36 74.64 106.07 75.42 105.79 76.31 105.4 76.72 105.53 77.65 108.32 77.76 111.29 77.77 111.2 78.38 110.99 78.99 111.19 79.45 111.61 79.88 111.72 80.48 111.78 80.84 111.81 80.9 " class="interior border-MS-LA" />
<path id="border-MA-CT" transform="translate(-1.9381369028049846,125.49649144156498)" d="M 162.65 34.23 162.65 34.23 165.07 34.31 168.01 34.41 " class="interior border-MA-CT" />
<path id="border-NY-CT" transform="translate(-134.05844498039517,101.92843693272988)" d="M 162.17 38.87 162.18 38.87 162.15 38.74 162.03 38.23 162.72 37.82 162.47 37.47 162.65 34.23 162.65 34.23 " class="interior border-NY-CT" />
<path id="border-RI-CT" transform="translate(-31.721232069797566,117.91275090137304)" d="M 168.01 34.41 168.03 36.72 167.84 37.34 " class="interior border-RI-CT" />
<path id="border-RI-MA" transform="translate(-26.757672419046827,143.1911003127731)" d="M 170.16 36.6 170.07 35.96 169.57 35.47 169.34 34.36 168.01 34.41 168.01 34.41 " class="interior border-RI-MA" />
<path id="border-NY-MA" transform="translate(-126.73515191774116,96.84777084641439)" d="M 162.65 34.23 163.33 31.29 " class="interior border-NY-MA" />
<path id="border-VT-MA" transform="translate(-0.6511318915037805,97.90029438818641)" d="M 163.33 31.29 165.94 31.36 " class="interior border-VT-MA" />
<path id="border-NH-MA" transform="translate(-31.35523071121918,126.18831522173748)" d="M 165.94 31.36 169.75 31.39 170.08 30.97 170.75 30.68 171.12 30.76 " class="interior border-NH-MA" />
<path id="border-VT-NH" transform="translate(-37.21935133144379,90.22216821633782)" d="M 165.94 31.36 165.68 30.91 165.93 30.35 166.01 29.22 166.1 28.94 166.21 27.92 166.56 27.05 166.82 26.66 167.19 25.62 167.26 24.92 167.37 24.49 167.98 24.28 168.69 23.76 168.81 23.21 168.58 22.58 168.95 21.36 168.94 21.36 " class="interior border-VT-NH" />
<path id="border-MS-AL" transform="translate(-57.37224528068547,78.07037678633351)" d="M 115.53 80.08 115.43 74.44 115.98 68.45 116.55 63.5 116.32 62.75 116.32 62.75 " class="interior border-MS-AL" />
<path id="border-TN-AL" transform="translate(-40.811211773469324,75.76451253606703)" d="M 116.32 62.75 116.32 62.75 120.29 62.76 124.35 62.81 " class="interior border-TN-AL" />
<path id="border-GA-AL" transform="translate(-57.74725941389016,58.78174871478433)" d="M 124.35 62.81 125.17 67.56 125.91 71.31 126.37 72.48 126.64 73.15 126.12 73.81 125.95 74.99 126.12 75.69 126.04 76.34 125.95 76.95 126.15 77.42 126.31 77.86 " class="interior border-GA-AL" />
<path id="border-FL-AL" transform="translate(13.01926736508969,99.45179989178602)" d="M 126.31 77.86 119.86 77.88 118.06 78.09 118.01 78.37 118.73 79.26 118.56 79.98 118.33 80.49 " class="interior border-FL-AL" />
<path id="border-GA-FL" transform="translate(-25.691784540427236,84.01306759006228)" d="M 126.31 77.86 126.79 78.85 129.96 79.02 135.08 79.56 135.32 80.2 135.73 79.88 135.73 78.6 136.11 78.48 136.74 78.75 137.41 78.82 " class="interior border-GA-FL" />
<path id="border-TN-GA" transform="translate(-35.01380596294925,56.94471303716823)" d="M 124.35 62.81 126.78 62.84 128.47 62.8 " class="interior border-TN-GA" />
<path id="border-NC-GA" transform="translate(-105.33774997222703,107.53121332492928)" d="M 128.47 62.8 132.4 62.83 " class="interior border-NC-GA" />
<path id="border-SC-GA" transform="translate(-34.9828285229634,109.27338962770754)" d="M 132.4 62.83 132.05 63.15 131.55 63.88 132.4 64.52 132.95 64.75 133.53 65.96 133.91 66.64 135.01 67.54 135.23 68.01 135.98 68.63 136.34 69.53 137.35 70.29 137.58 71.15 137.77 71.57 137.66 71.84 138.25 72.25 138.56 72.95 138.55 73.66 138.84 73.8 139.38 73.99 " class="interior border-SC-GA" />
<path id="border-TN-MS" transform="translate(-91.48146739194817,111.54832844883454)" d="M 109.74 62.67 112.86 62.67 116.32 62.75 " class="interior border-TN-MS" />
<path id="border-MO-IL" transform="translate(0.6866377752507731,76.76495693079491)" d="M 113.36 55.13 112.8 54.52 112.46 54.62 112.06 53.65 112.18 53.05 111.94 52.09 111.62 51.97 110.79 51.09 110.44 51.08 109.81 50.51 109.36 49.9 109.57 49.2 109.86 48.61 110.04 47.86 109.44 47.21 108.84 47.47 108.48 47.3 108.43 46.62 108.16 45.85 107.87 45.66 107.15 45.11 106.54 44.42 106.02 43.57 105.74 42.34 106.01 41.31 106.01 41.31 " class="interior border-MO-IL" />
<path id="border-WI-IL" transform="translate(24.46975955535798,118.37408158857698)" d="M 108.51 32.31 111.73 32.31 115.03 32.32 117.46 32.36 117.46 32.34 117.47 32.34 " class="interior border-WI-IL" />
<path id="border-IN-IL" transform="translate(-18.367656764535468,99.40950858903601)" d="M 118.34 35.7 118.34 40.56 118.34 45.33 117.98 46.46 118.24 46.76 118.4 47.46 118.38 48.0 118.12 48.25 117.89 48.92 117.23 49.8 116.79 50.88 116.69 51.69 " class="interior border-IN-IL" />
<path id="border-KY-IL" transform="translate(-38.705353985252884,99.15324887547536)" d="M 116.69 51.69 116.71 51.98 116.35 52.54 116.62 52.91 116.07 53.2 115.35 53.54 115.47 54.4 115.06 54.73 114.3 54.36 113.46 54.15 113.24 54.53 113.36 55.13 " class="interior border-KY-IL" />
<path id="border-KY-IN" transform="translate(-8.933594338664278,95.77898451259571)" d="M 126.88 46.49 126.7 46.69 126.95 47.52 126.82 47.82 126.29 47.82 125.79 48.18 125.05 48.03 124.98 48.81 124.53 49.11 124.12 49.8 123.67 49.92 122.98 51.12 122.34 50.78 122.14 50.28 121.59 51.08 121.24 51.53 120.56 51.06 119.83 51.44 119.59 51.83 118.62 51.22 117.94 51.66 117.13 51.35 117.1 51.79 116.69 51.69 116.69 51.69 " class="interior border-KY-IN" />
<path id="border-MI-IN" transform="translate(-14.131803941767814,127.49063705542818)" d="M 120.56 35.5 123.96 35.52 126.93 35.5 126.93 35.83 " class="interior border-MI-IN" />
<path id="border-OH-IN" transform="translate(-15.849811888319792,126.91816924854375)" d="M 126.93 35.83 126.92 39.63 126.9 43.66 126.88 46.49 " class="interior border-OH-IN" />
<path id="border-MO-KY" transform="translate(22.121191928191735,88.60816166110975)" d="M 112.12 56.89 112.12 56.89 112.82 56.48 113.33 56.15 113.27 55.53 113.36 55.13 " class="interior border-MO-KY" />
<path id="border-TN-KY" transform="translate(-109.71559331069234,72.19299546977942)" d="M 131.59 56.24 131.43 56.3 130.51 56.52 128.37 56.65 125.59 56.48 124.68 56.53 122.87 56.42 121.02 56.39 119.32 56.37 117.35 56.48 117.24 56.3 116.62 56.31 116.63 56.93 112.12 56.89 112.12 56.89 " class="interior border-TN-KY" />
<path id="border-OH-KY" transform="translate(5.9727585038679365,114.06512617421487)" d="M 126.88 46.49 127.96 46.59 128.52 46.98 129.36 47.9 130.03 48.18 130.51 48.51 131.27 48.4 131.82 48.63 132.5 48.41 133.1 48.34 133.35 48.91 133.94 49.29 " class="interior border-OH-KY" />
<path id="border-WV-KY" transform="translate(-16.828628999401033,110.32562955615543)" d="M 133.94 49.29 134.0 49.68 133.96 50.51 134.34 51.13 134.49 51.74 134.95 52.26 135.27 52.74 135.88 52.82 " class="interior border-WV-KY" />
<path id="border-VA-KY" transform="translate(-109.75364047775913,80.49811743869202)" d="M 135.88 52.82 135.56 53.12 134.62 54.0 133.63 54.46 133.56 54.79 133.22 55.2 132.41 55.64 132.36 55.67 132.32 55.72 132.08 56.06 131.59 56.24 131.43 56.3 130.51 56.52 " class="interior border-VA-KY" />
<path id="border-SC-NC" transform="translate(-43.22582898850523,109.61378595834195)" d="M 146.68 67.11 143.15 63.49 139.64 63.45 139.65 63.01 139.15 62.35 138.84 62.61 138.81 62.27 137.33 62.09 134.42 62.06 132.71 62.72 132.4 62.83 132.4 62.83 " class="interior border-SC-NC" />
<path id="border-TN-NC" transform="translate(-60.66971101840542,60.38982070456947)" d="M 128.47 62.8 128.54 61.99 129.21 61.74 129.42 61.33 129.87 60.86 130.51 60.75 131.25 60.58 131.98 60.24 132.29 59.9 132.89 59.59 132.87 59.3 133.67 58.77 133.92 59.12 135.09 58.38 135.63 58.46 136.12 57.8 136.76 57.63 136.73 57.07 136.81 56.58 135.58 56.64 136.81 56.58 " class="interior border-TN-NC" />
<path id="border-VA-NC" transform="translate(-109.17065646008102,79.3468580488685)" d="M 136.81 56.58 135.58 56.64 136.81 56.58 142.14 56.75 148.43 56.77 151.77 56.73 154.77 56.72 155.16 56.71 " class="interior border-VA-NC" />
<path id="border-PA-OH" transform="translate(-8.903978840085557,147.02963193500125)" d="M 140.48 34.55 140.47 40.18 " class="interior border-PA-OH" />
<path id="border-WV-OH" transform="translate(16.988697128358893,77.77221244046092)" d="M 140.47 40.18 140.04 40.39 140.17 40.92 140.02 41.87 139.7 42.94 139.39 43.83 139.34 44.26 138.48 45.19 138.12 45.39 137.69 45.5 137.31 45.41 136.6 46.11 136.47 46.85 136.38 47.24 136.09 47.41 136.05 46.95 135.63 46.85 135.18 47.73 135.13 48.63 134.72 49.19 133.94 49.29 " class="interior border-WV-OH" />
<path id="border-VA-TN" transform="translate(-42.57348559126498,119.01161466275704)" d="M 130.51 56.52 131.43 56.3 131.59 56.24 131.43 56.3 130.51 56.52 135.21 56.66 135.58 56.64 136.81 56.58 " class="interior border-VA-TN" />
<path id="border-WV-VA" transform="translate(-29.40665473572801,71.20752951625201)" d="M 135.88 52.82 136.02 53.49 136.31 53.78 136.38 53.85 136.86 54.17 137.59 53.82 137.86 53.69 138.24 53.97 139.22 53.69 139.41 53.64 139.46 53.42 139.48 53.28 139.84 53.43 140.21 53.15 140.23 53.14 140.67 53.19 141.17 52.88 141.21 52.67 141.24 52.52 141.19 52.05 141.62 51.36 142.23 50.84 142.38 50.24 142.69 49.84 142.92 49.53 143.23 48.65 143.65 48.96 144.11 49.25 144.57 49.09 144.72 48.73 145.03 48.22 145.25 47.87 145.38 47.65 145.61 47.82 146.08 47.3 146.44 46.99 146.7 46.77 146.81 46.65 147.09 46.36 147.29 45.5 147.34 45.27 148.81 46.28 148.95 46.38 149.31 45.61 " class="interior border-WV-VA" />
<path id="border-MD-DE" transform="translate(-48.93369376694332,82.38543660253623)" d="M 157.75 49.16 157.75 49.16 155.65 49.16 155.42 43.97 " class="interior border-MD-DE" />
<path id="border-PA-DE" transform="translate(-89.3216867472537,104.796652892921)" d="M 155.42 43.97 155.66 43.65 155.94 43.46 156.62 43.68 " class="interior border-PA-DE" />
<path id="border-NJ-DE" transform="translate(-99.67355153021664,137.73866640352682)" d="M 156.62 43.68 156.15 44.1 156.24 44.89 " class="interior border-NJ-DE" />
<path id="border-VA-MD" transform="translate(-23.24954497797583,91.95368656435505)" d="M 156.71 50.9 156.71 50.9 155.98 50.96 155.62 51.22 M 151.62 50.0 151.58 49.88 151.44 49.43 150.92 49.61 150.5 49.39 150.86 48.49 151.28 48.2 151.4 48.11 151.46 47.78 M 151.21 47.2 150.62 46.74 149.96 46.5 150.01 46.4 150.19 46.06 149.77 45.75 149.39 45.64 149.31 45.61 " class="interior border-VA-MD" />
<path id="border-WV-MD" transform="translate(-76.71396373870346,79.3040965691995)" d="M 149.31 45.61 149.06 45.09 148.67 44.51 147.7 44.18 147.09 44.49 146.74 44.8 145.81 44.63 145.39 45.06 144.76 45.22 144.22 45.69 143.74 46.06 143.76 43.98 " class="interior border-WV-MD" />
<path id="border-PA-MD" transform="translate(-56.805787144033346,99.00759168882354)" d="M 143.76 43.98 146.69 43.99 147.69 43.98 149.94 43.96 152.64 43.98 155.42 43.97 " class="interior border-PA-MD" />
<path id="border-PA-NJ" transform="translate(-118.63485932251854,117.52179937756614)" d="M 156.62 43.68 157.27 43.3 157.5 43.04 158.25 42.5 158.65 42.05 157.66 40.97 157.6 40.54 157.26 40.41 157.28 39.74 157.65 39.23 157.48 38.68 157.98 38.31 158.53 37.37 158.92 37.19 " class="interior border-PA-NJ" />
<path id="border-NY-NJ" transform="translate(-128.87610498020774,109.40810105255537)" d="M 158.92 37.19 161.34 38.85 161.21 39.72 " class="interior border-NY-NJ" />
<path id="border-PA-NY" transform="translate(-29.074020543904027,132.0353769760757)" d="M 158.92 37.19 158.41 36.89 157.87 36.6 157.67 35.98 157.75 35.52 157.37 35.14 156.69 34.47 152.4 34.46 147.8 34.46 142.87 34.46 142.87 33.31 " class="interior border-PA-NY" />
<path id="border-VT-NY" transform="translate(-81.03687181699074,143.38754743690558)" d="M 163.12 21.37 163.06 22.27 162.93 22.84 163.01 24.16 163.18 24.83 162.86 25.74 163.15 26.88 162.95 27.52 163.01 27.68 163.46 27.72 163.33 31.29 " class="interior border-VT-NY" />
<path id="border-WV-PA" transform="translate(6.296557644417504,115.90322826789631)" d="M 143.76 43.98 140.47 43.98 140.47 40.18 140.47 40.18 " class="interior border-WV-PA" />
<path id="border-NH-ME" transform="translate(-35.833108067191205,146.7270667151321)" d="M 171.66 29.79 171.66 29.79 171.32 29.83 171.18 29.23 170.6 28.59 170.71 28.16 170.27 20.03 " class="interior border-NH-ME" />
<path id="border-OH-MI" transform="translate(-1.1271643619844838,144.62393803976508)" d="M 131.18 35.76 129.99 35.8 128.55 35.8 126.93 35.83 " class="interior border-OH-MI" />
<path id="border-WI-MI" transform="translate(-24.95218671997398,161.16023087167986)" d="M 118.15 20.94 118.07 20.9 118.07 20.91 117.65 20.38 117.88 19.66 117.18 19.62 117.33 18.89 117.52 18.52 117.24 17.89 116.49 17.6 116.32 16.86 115.71 16.8 114.81 16.79 112.99 15.97 110.23 15.15 109.97 14.33 109.48 14.18 109.47 14.16 109.28 14.26 109.25 14.23 109.28 14.26 " class="interior border-WI-MI" />
<path d="M 87.7 2.86 94.24 2.86 94.25 1.01 95.32 0.98 95.88 3.63 96.86 4.44 99.06 4.74 102.29 5.49 105.35 6.97 107.91 6.35 111.79 7.58 111.8 7.58 111.79 7.58 108.57 9.13 106.33 11.0 104.19 12.96 104.18 13.63 104.18 13.63 " class="outline outline-MN" />
<path d="M 28.26 2.86 37.7 2.86 47.14 2.85 56.58 2.84 66.02 2.83 " class="outline outline-MT" />
<path d="M 66.02 2.83 76.96 2.85 87.7 2.86 87.7 2.86 " class="outline outline-ND" />
<path d="M 25.16 2.87 28.26 2.86 28.26 2.86 " class="outline outline-ID" />
<path d="M 3.15 15.6 2.9 12.93 1.9 8.95 0.98 6.76 1.36 5.83 5.93 7.44 7.61 11.86 8.39 10.63 7.89 6.78 6.81 2.86 15.78 2.86 25.16 2.87 25.16 2.87 " class="outline outline-WA" />
<path d="M 50.39 76.56 44.13 76.59 36.93 73.97 32.16 72.16 32.45 71.42 " class="outline outline-AZ" />
<path d="M 32.45 71.42 28.44 71.83 24.86 72.12 24.32 70.2 22.28 68.02 20.8 67.57 20.46 66.48 18.69 66.29 17.56 65.25 14.62 64.88 13.82 64.26 13.43 62.15 10.37 58.24 7.74 52.75 7.85 51.83 6.46 50.51 4.01 47.12 3.58 43.79 1.89 41.54 2.59 38.08 2.48 34.47 " class="outline outline-CA" />
<path d="M 58.4 75.03 52.92 75.03 52.92 76.56 50.39 76.56 50.39 76.56 " class="outline outline-NM" />
<path d="M 2.48 34.47 1.47 31.19 2.7 27.1 3.47 19.05 3.15 15.6 " class="outline outline-OR" />
<path d="M 111.81 80.9 112.38 81.87 112.33 83.35 113.0 84.06 112.4 84.54 111.23 84.0 110.04 84.69 107.75 84.58 105.39 82.66 102.64 83.12 100.34 82.27 98.38 82.53 " class="outline outline-LA" />
<path d="M 98.38 82.53 95.72 83.38 92.84 86.06 89.71 87.61 87.98 89.32 87.25 90.92 87.22 93.37 87.38 95.06 87.98 96.26 86.75 96.36 84.51 95.59 82.04 94.5 81.16 92.84 80.46 90.35 78.6 88.32 77.51 86.21 75.92 83.74 73.7 82.29 71.12 82.36 69.13 85.22 66.51 84.14 64.87 83.04 64.09 81.04 63.04 79.13 61.16 77.51 59.55 76.35 58.4 75.03 58.4 75.03 " class="outline outline-TX" />
<path d="M 167.84 37.34 166.45 37.55 164.61 37.76 162.18 38.88 162.17 38.87 " class="outline outline-CT" />
<path d="M 171.12 30.76 171.09 33.04 172.13 35.29 173.44 35.4 173.11 33.85 174.06 34.79 173.81 36.0 171.68 36.69 170.16 36.6 " class="outline outline-MA" />
<path d="M 168.94 21.36 169.26 20.26 170.27 20.03 M 171.66 29.79 171.12 30.76 171.12 30.76 " class="outline outline-NH" />
<path d="M 170.16 36.6 167.84 37.34 167.84 37.34 " class="outline outline-RI" />
<path d="M 163.12 21.37 168.94 21.36 " class="outline outline-VT" />
<path d="M 118.33 80.49 115.53 80.08 " class="outline outline-AL" />
<path d="M 137.41 78.82 137.96 81.36 139.02 84.47 140.42 87.02 140.44 88.57 141.94 92.7 141.84 95.08 141.7 96.44 140.91 98.58 139.97 99.02 138.41 98.6 137.91 97.06 136.71 96.26 135.04 93.23 133.57 90.51 133.1 89.12 133.74 86.74 132.86 84.75 130.4 81.72 129.17 81.16 125.98 82.81 125.41 82.63 123.88 80.93 121.9 80.02 118.33 80.49 118.33 80.49 " class="outline outline-FL" />
<path d="M 139.38 73.99 137.89 76.19 137.41 78.82 " class="outline outline-GA" />
<path d="M 115.53 80.08 113.12 80.33 111.81 80.9 " class="outline outline-MS" />
<path d="M 146.68 67.11 145.08 68.51 144.63 69.78 141.16 72.21 139.38 73.99 139.38 73.99 " class="outline outline-SC" />
<path d="M 117.47 32.34 117.47 32.36 117.49 33.47 118.34 35.7 " class="outline outline-IL" />
<path d="M 118.34 35.7 118.63 35.99 119.71 35.96 120.56 35.5 " class="outline outline-IN" />
<path d="M 155.16 56.71 155.61 60.62 153.6 63.49 150.33 64.63 148.26 66.87 146.68 67.11 " class="outline outline-NC" />
<path d="M 131.18 35.76 133.12 36.63 134.7 36.85 136.99 36.29 138.86 35.12 140.48 34.55 " class="outline outline-OH" />
<path d="M 151.21 47.2 151.47 47.54 151.46 47.78 M 151.62 50.0 153.79 51.29 153.93 55.08 154.84 55.35 155.16 56.71 M 156.71 50.9 154.94 54.09 154.65 53.93 155.62 51.22 " class="outline outline-VA" />
<path d="M 104.18 13.63 107.34 12.67 109.25 14.23 M 118.15 20.94 118.12 20.98 116.88 22.59 117.31 23.11 119.63 20.24 120.11 20.22 118.47 23.65 117.76 26.72 117.16 29.18 117.55 31.3 117.47 32.34 " class="outline outline-WI" />
<path d="M 156.24 44.89 156.89 47.09 157.68 47.81 157.75 49.16 157.75 49.16 " class="outline outline-DE" />
<path d="M 155.62 51.22 154.01 49.68 153.64 46.32 153.03 48.07 153.71 50.63 151.62 50.0 M 151.46 47.78 151.87 47.42 151.47 47.0 151.21 47.2 M 157.75 49.16 157.73 49.34 156.71 50.9 156.71 50.9 " class="outline outline-MD" />
<path d="M 161.21 39.72 160.25 40.88 161.18 41.07 160.5 44.03 158.2 47.17 157.97 46.13 157.27 45.92 156.24 44.89 156.24 44.89 " class="outline outline-NJ" />
<path d="M 162.17 38.87 161.98 38.97 166.62 38.18 167.55 38.97 163.13 40.22 161.12 40.23 161.21 39.72 M 142.87 33.31 145.59 30.75 145.52 30.33 145.53 30.33 145.24 29.03 146.74 28.53 149.22 28.7 151.81 29.05 154.18 27.62 153.99 25.92 153.67 25.3 156.9 22.22 158.33 21.4 163.12 21.37 " class="outline outline-NY" />
<path d="M 140.48 34.55 142.86 33.32 142.87 33.31 " class="outline outline-PA" />
<path d="M 170.27 20.03 171.61 19.33 172.73 17.28 173.7 13.72 176.11 10.22 177.16 11.45 179.27 10.66 180.67 12.0 180.67 18.24 182.74 20.78 183.28 22.25 179.91 24.39 176.66 25.91 173.33 27.21 171.66 29.79 171.66 29.79 " class="outline outline-ME" />
<path d="M 120.56 35.5 121.2 34.91 122.48 32.84 122.57 30.0 121.52 27.31 121.68 25.46 122.5 23.29 123.29 21.8 124.55 20.73 124.85 22.22 125.41 20.02 126.1 19.56 126.54 17.84 129.23 18.75 131.57 20.5 131.82 22.53 131.53 24.55 129.8 26.31 129.96 27.41 130.59 27.45 132.54 25.52 133.71 25.96 134.28 28.49 134.44 30.27 134.44 30.27 132.95 32.63 132.26 34.12 131.18 35.76 M 109.28 14.26 111.72 13.09 114.25 11.59 117.04 10.04 116.02 12.5 117.81 13.08 120.04 14.84 122.84 13.81 125.94 13.41 126.61 14.7 127.57 14.88 127.76 14.43 127.76 14.43 127.77 14.43 127.57 14.88 128.42 15.03 129.99 16.85 127.21 17.26 127.1 17.23 124.62 16.76 122.15 17.66 120.01 18.07 118.15 20.94 " class="outline outline-MI" />
</svg>
</div>
<script src="script.js" ></script>
<script>
var borders = {};
borders["border-WI-MN"]={x:-1.037841777863619,y:109.78769161982781 };
document.getElementById('border-WI-MN').addEventListener('pointerdown',downBorder);
borders["border-SD-MN"]={x:42.53087002787137,y:154.70080794920239 };
document.getElementById('border-SD-MN').addEventListener('pointerdown',downBorder);
borders["border-ND-MN"]={x:64.34225517632004,y:133.27134033419603 };
document.getElementById('border-ND-MN').addEventListener('pointerdown',downBorder);
borders["border-ND-MT"]={x:88.48599160166206,y:153.1049154101039 };
document.getElementById('border-ND-MT').addEventListener('pointerdown',downBorder);
borders["border-SD-MT"]={x:-2.220030353701631,y:147.89228083347388 };
document.getElementById('border-SD-MT').addEventListener('pointerdown',downBorder);
borders["border-WY-MT"]={x:22.834632449285863,y:150.44036750673328 };
document.getElementById('border-WY-MT').addEventListener('pointerdown',downBorder);
borders["border-SD-ND"]={x:70.5993921697683,y:158.8348035454056 };
document.getElementById('border-SD-ND').addEventListener('pointerdown',downBorder);
borders["border-MT-ID"]={x:24.251075673672563,y:168.82279201515536 };
document.getElementById('border-MT-ID').addEventListener('pointerdown',downBorder);
borders["border-WY-ID"]={x:55.57483469403387,y:158.4248070563411 };
document.getElementById('border-WY-ID').addEventListener('pointerdown',downBorder);
borders["border-UT-ID"]={x:115.67886152753569,y:80.58891641243665 };
document.getElementById('border-UT-ID').addEventListener('pointerdown',downBorder);
borders["border-NV-ID"]={x:46.24166539014616,y:113.41712025406846 };
document.getElementById('border-NV-ID').addEventListener('pointerdown',downBorder);
borders["border-OR-ID"]={x:71.2228755130065,y:137.49046181214956 };
document.getElementById('border-OR-ID').addEventListener('pointerdown',downBorder);
borders["border-WA-ID"]={x:29.7872335387148,y:166.78499834761664 };
document.getElementById('border-WA-ID').addEventListener('pointerdown',downBorder);
borders["border-CO-AZ"]={x:42.87087716783018,y:125.3470046480573 };
document.getElementById('border-CO-AZ').addEventListener('pointerdown',downBorder);
borders["border-NM-AZ"]={x:-12.110472433306242,y:102.83567306408082 };
document.getElementById('border-NM-AZ').addEventListener('pointerdown',downBorder);
borders["border-UT-AZ"]={x:35.921671758086305,y:68.65848406839284 };
document.getElementById('border-UT-AZ').addEventListener('pointerdown',downBorder);
borders["border-CA-AZ"]={x:39.59238042437728,y:87.13633636627664 };
document.getElementById('border-CA-AZ').addEventListener('pointerdown',downBorder);
borders["border-NV-AZ"]={x:10.12673510445444,y:79.49403372339022 };
document.getElementById('border-NV-AZ').addEventListener('pointerdown',downBorder);
borders["border-NV-CA"]={x:39.674628342395145,y:150.4971782070842 };
document.getElementById('border-NV-CA').addEventListener('pointerdown',downBorder);
borders["border-OR-CA"]={x:27.07990016704436,y:110.23368840097274 };
document.getElementById('border-OR-CA').addEventListener('pointerdown',downBorder);
borders["border-KS-CO"]={x:-23.2545740593321,y:119.46500751663989 };
document.getElementById('border-KS-CO').addEventListener('pointerdown',downBorder);
borders["border-NE-CO"]={x:75.61371623267767,y:129.14209894685962 };
document.getElementById('border-NE-CO').addEventListener('pointerdown',downBorder);
borders["border-OK-CO"]={x:87.05817228628968,y:114.59113333857303 };
document.getElementById('border-OK-CO').addEventListener('pointerdown',downBorder);
borders["border-NM-CO"]={x:-19.862203088484748,y:109.88309917271843 };
document.getElementById('border-NM-CO').addEventListener('pointerdown',downBorder);
borders["border-UT-CO"]={x:-22.36895083935424,y:108.04544455799504 };
document.getElementById('border-UT-CO').addEventListener('pointerdown',downBorder);
borders["border-WY-CO"]={x:8.271958070515524,y:89.64095080584725 };
document.getElementById('border-WY-CO').addEventListener('pointerdown',downBorder);
borders["border-OR-NV"]={x:57.938363287425794,y:142.07631512509346 };
document.getElementById('border-OR-NV').addEventListener('pointerdown',downBorder);
borders["border-UT-NV"]={x:102.5112956829119,y:84.60004895872953 };
document.getElementById('border-UT-NV').addEventListener('pointerdown',downBorder);
borders["border-UT-NM"]={x:31.615996388852444,y:111.35592352836156 };
document.getElementById('border-UT-NM').addEventListener('pointerdown',downBorder);
borders["border-OK-NM"]={x:-8.546848563585762,y:90.47598201977408 };
document.getElementById('border-OK-NM').addEventListener('pointerdown',downBorder);
borders["border-TX-NM"]={x:56.56566786611434,y:64.360423838413 };
document.getElementById('border-TX-NM').addEventListener('pointerdown',downBorder);
borders["border-WA-OR"]={x:161.58543283884143,y:131.36981228405634 };
document.getElementById('border-WA-OR').addEventListener('pointerdown',downBorder);
borders["border-WY-UT"]={x:25.860753535427506,y:107.99853728899652 };
document.getElementById('border-WY-UT').addEventListener('pointerdown',downBorder);
borders["border-MO-AR"]={x:-60.5031618388737,y:127.8192437235382 };
document.getElementById('border-MO-AR').addEventListener('pointerdown',downBorder);
borders["border-TN-AR"]={x:0.20189743402946192,y:88.13519297515373 };
document.getElementById('border-TN-AR').addEventListener('pointerdown',downBorder);
borders["border-MS-AR"]={x:-5.169269911514661,y:114.86572731262875 };
document.getElementById('border-MS-AR').addEventListener('pointerdown',downBorder);
borders["border-LA-AR"]={x:-25.167559981934687,y:75.88259608845705 };
document.getElementById('border-LA-AR').addEventListener('pointerdown',downBorder);
borders["border-TX-AR"]={x:52.06631625546491,y:98.36974636378754 };
document.getElementById('border-TX-AR').addEventListener('pointerdown',downBorder);
borders["border-OK-AR"]={x:-33.72779506897538,y:92.65715580452397 };
document.getElementById('border-OK-AR').addEventListener('pointerdown',downBorder);
borders["border-MN-IA"]={x:17.502930250428918,y:128.11501547692797 };
document.getElementById('border-MN-IA').addEventListener('pointerdown',downBorder);
borders["border-SD-IA"]={x:34.118115806618434,y:103.1262220236145 };
document.getElementById('border-SD-IA').addEventListener('pointerdown',downBorder);
borders["border-WI-IA"]={x:27.278597479448905,y:111.2400447325668 };
document.getElementById('border-WI-IA').addEventListener('pointerdown',downBorder);
borders["border-IL-IA"]={x:43.41132504512815,y:83.70739393129124 };
document.getElementById('border-IL-IA').addEventListener('pointerdown',downBorder);
borders["border-MO-IA"]={x:24.01390827688637,y:111.67158777630297 };
document.getElementById('border-MO-IA').addEventListener('pointerdown',downBorder);
borders["border-NE-IA"]={x:64.58048233768699,y:99.34752393478145 };
document.getElementById('border-NE-IA').addEventListener('pointerdown',downBorder);
borders["border-OK-KS"]={x:24.33204299105398,y:61.75080083189752 };
document.getElementById('border-OK-KS').addEventListener('pointerdown',downBorder);
borders["border-NE-KS"]={x:-46.775377207087445,y:101.9570174587166 };
document.getElementById('border-NE-KS').addEventListener('pointerdown',downBorder);
borders["border-MO-KS"]={x:-63.890166389291544,y:83.28274068761903 };
document.getElementById('border-MO-KS').addEventListener('pointerdown',downBorder);
borders["border-TN-MO"]={x:-96.86722516347658,y:104.44291548136114 };
document.getElementById('border-TN-MO').addEventListener('pointerdown',downBorder);
borders["border-OK-MO"]={x:-30.809196861238462,y:83.79286814694774 };
document.getElementById('border-OK-MO').addEventListener('pointerdown',downBorder);
borders["border-NE-MO"]={x:-51.1886774851066,y:88.32123985493358 };
document.getElementById('border-NE-MO').addEventListener('pointerdown',downBorder);
borders["border-WY-NE"]={x:67.6032912144422,y:108.058153434237 };
document.getElementById('border-WY-NE').addEventListener('pointerdown',downBorder);
borders["border-SD-NE"]={x:5.284908772790146,y:128.83500690447667 };
document.getElementById('border-SD-NE').addEventListener('pointerdown',downBorder);
borders["border-TX-OK"]={x:55.78604411759579,y:48.36848444633331 };
document.getElementById('border-TX-OK').addEventListener('pointerdown',downBorder);
borders["border-WY-SD"]={x:81.98927746627916,y:137.7089287207873 };
document.getElementById('border-WY-SD').addEventListener('pointerdown',downBorder);
borders["border-TX-LA"]={x:-30.461509789897363,y:93.93621392918149 };
document.getElementById('border-TX-LA').addEventListener('pointerdown',downBorder);
borders["border-MS-LA"]={x:9.506787153792587,y:68.02398992831378 };
document.getElementById('border-MS-LA').addEventListener('pointerdown',downBorder);
borders["border-MA-CT"]={x:-1.9381369028049846,y:125.49649144156498 };
document.getElementById('border-MA-CT').addEventListener('pointerdown',downBorder);
borders["border-NY-CT"]={x:-134.05844498039517,y:101.92843693272988 };
document.getElementById('border-NY-CT').addEventListener('pointerdown',downBorder);
borders["border-RI-CT"]={x:-31.721232069797566,y:117.91275090137304 };
document.getElementById('border-RI-CT').addEventListener('pointerdown',downBorder);
borders["border-RI-MA"]={x:-26.757672419046827,y:143.1911003127731 };
document.getElementById('border-RI-MA').addEventListener('pointerdown',downBorder);
borders["border-NY-MA"]={x:-126.73515191774116,y:96.84777084641439 };
document.getElementById('border-NY-MA').addEventListener('pointerdown',downBorder);
borders["border-VT-MA"]={x:-0.6511318915037805,y:97.90029438818641 };
document.getElementById('border-VT-MA').addEventListener('pointerdown',downBorder);
borders["border-NH-MA"]={x:-31.35523071121918,y:126.18831522173748 };
document.getElementById('border-NH-MA').addEventListener('pointerdown',downBorder);
borders["border-VT-NH"]={x:-37.21935133144379,y:90.22216821633782 };
document.getElementById('border-VT-NH').addEventListener('pointerdown',downBorder);
borders["border-MS-AL"]={x:-57.37224528068547,y:78.07037678633351 };
document.getElementById('border-MS-AL').addEventListener('pointerdown',downBorder);
borders["border-TN-AL"]={x:-40.811211773469324,y:75.76451253606703 };
document.getElementById('border-TN-AL').addEventListener('pointerdown',downBorder);
borders["border-GA-AL"]={x:-57.74725941389016,y:58.78174871478433 };
document.getElementById('border-GA-AL').addEventListener('pointerdown',downBorder);
borders["border-FL-AL"]={x:13.01926736508969,y:99.45179989178602 };
document.getElementById('border-FL-AL').addEventListener('pointerdown',downBorder);
borders["border-GA-FL"]={x:-25.691784540427236,y:84.01306759006228 };
document.getElementById('border-GA-FL').addEventListener('pointerdown',downBorder);
borders["border-TN-GA"]={x:-35.01380596294925,y:56.94471303716823 };
document.getElementById('border-TN-GA').addEventListener('pointerdown',downBorder);
borders["border-NC-GA"]={x:-105.33774997222703,y:107.53121332492928 };
document.getElementById('border-NC-GA').addEventListener('pointerdown',downBorder);
borders["border-SC-GA"]={x:-34.9828285229634,y:109.27338962770754 };
document.getElementById('border-SC-GA').addEventListener('pointerdown',downBorder);
borders["border-TN-MS"]={x:-91.48146739194817,y:111.54832844883454 };
document.getElementById('border-TN-MS').addEventListener('pointerdown',downBorder);
borders["border-MO-IL"]={x:0.6866377752507731,y:76.76495693079491 };
document.getElementById('border-MO-IL').addEventListener('pointerdown',downBorder);
borders["border-WI-IL"]={x:24.46975955535798,y:118.37408158857698 };
document.getElementById('border-WI-IL').addEventListener('pointerdown',downBorder);
borders["border-IN-IL"]={x:-18.367656764535468,y:99.40950858903601 };
document.getElementById('border-IN-IL').addEventListener('pointerdown',downBorder);
borders["border-KY-IL"]={x:-38.705353985252884,y:99.15324887547536 };
document.getElementById('border-KY-IL').addEventListener('pointerdown',downBorder);
borders["border-KY-IN"]={x:-8.933594338664278,y:95.77898451259571 };
document.getElementById('border-KY-IN').addEventListener('pointerdown',downBorder);
borders["border-MI-IN"]={x:-14.131803941767814,y:127.49063705542818 };
document.getElementById('border-MI-IN').addEventListener('pointerdown',downBorder);
borders["border-OH-IN"]={x:-15.849811888319792,y:126.91816924854375 };
document.getElementById('border-OH-IN').addEventListener('pointerdown',downBorder);
borders["border-MO-KY"]={x:22.121191928191735,y:88.60816166110975 };
document.getElementById('border-MO-KY').addEventListener('pointerdown',downBorder);
borders["border-TN-KY"]={x:-109.71559331069234,y:72.19299546977942 };
document.getElementById('border-TN-KY').addEventListener('pointerdown',downBorder);
borders["border-OH-KY"]={x:5.9727585038679365,y:114.06512617421487 };
document.getElementById('border-OH-KY').addEventListener('pointerdown',downBorder);
borders["border-WV-KY"]={x:-16.828628999401033,y:110.32562955615543 };
document.getElementById('border-WV-KY').addEventListener('pointerdown',downBorder);
borders["border-VA-KY"]={x:-109.75364047775913,y:80.49811743869202 };
document.getElementById('border-VA-KY').addEventListener('pointerdown',downBorder);
borders["border-SC-NC"]={x:-43.22582898850523,y:109.61378595834195 };
document.getElementById('border-SC-NC').addEventListener('pointerdown',downBorder);
borders["border-TN-NC"]={x:-60.66971101840542,y:60.38982070456947 };
document.getElementById('border-TN-NC').addEventListener('pointerdown',downBorder);
borders["border-VA-NC"]={x:-109.17065646008102,y:79.3468580488685 };
document.getElementById('border-VA-NC').addEventListener('pointerdown',downBorder);
borders["border-PA-OH"]={x:-8.903978840085557,y:147.02963193500125 };
document.getElementById('border-PA-OH').addEventListener('pointerdown',downBorder);
borders["border-WV-OH"]={x:16.988697128358893,y:77.77221244046092 };
document.getElementById('border-WV-OH').addEventListener('pointerdown',downBorder);
borders["border-VA-TN"]={x:-42.57348559126498,y:119.01161466275704 };
document.getElementById('border-VA-TN').addEventListener('pointerdown',downBorder);
borders["border-WV-VA"]={x:-29.40665473572801,y:71.20752951625201 };
document.getElementById('border-WV-VA').addEventListener('pointerdown',downBorder);
borders["border-MD-DE"]={x:-48.93369376694332,y:82.38543660253623 };
document.getElementById('border-MD-DE').addEventListener('pointerdown',downBorder);
borders["border-PA-DE"]={x:-89.3216867472537,y:104.796652892921 };
document.getElementById('border-PA-DE').addEventListener('pointerdown',downBorder);
borders["border-NJ-DE"]={x:-99.67355153021664,y:137.73866640352682 };
document.getElementById('border-NJ-DE').addEventListener('pointerdown',downBorder);
borders["border-VA-MD"]={x:-23.24954497797583,y:91.95368656435505 };
document.getElementById('border-VA-MD').addEventListener('pointerdown',downBorder);
borders["border-WV-MD"]={x:-76.71396373870346,y:79.3040965691995 };
document.getElementById('border-WV-MD').addEventListener('pointerdown',downBorder);
borders["border-PA-MD"]={x:-56.805787144033346,y:99.00759168882354 };
document.getElementById('border-PA-MD').addEventListener('pointerdown',downBorder);
borders["border-PA-NJ"]={x:-118.63485932251854,y:117.52179937756614 };
document.getElementById('border-PA-NJ').addEventListener('pointerdown',downBorder);
borders["border-NY-NJ"]={x:-128.87610498020774,y:109.40810105255537 };
document.getElementById('border-NY-NJ').addEventListener('pointerdown',downBorder);
borders["border-PA-NY"]={x:-29.074020543904027,y:132.0353769760757 };
document.getElementById('border-PA-NY').addEventListener('pointerdown',downBorder);
borders["border-VT-NY"]={x:-81.03687181699074,y:143.38754743690558 };
document.getElementById('border-VT-NY').addEventListener('pointerdown',downBorder);
borders["border-WV-PA"]={x:6.296557644417504,y:115.90322826789631 };
document.getElementById('border-WV-PA').addEventListener('pointerdown',downBorder);
borders["border-NH-ME"]={x:-35.833108067191205,y:146.7270667151321 };
document.getElementById('border-NH-ME').addEventListener('pointerdown',downBorder);
borders["border-OH-MI"]={x:-1.1271643619844838,y:144.62393803976508 };
document.getElementById('border-OH-MI').addEventListener('pointerdown',downBorder);
borders["border-WI-MI"]={x:-24.95218671997398,y:161.16023087167986 };
document.getElementById('border-WI-MI').addEventListener('pointerdown',downBorder);
</script>
</body>
</html>
const fs = require('fs');
const nunjucks = require('nunjucks');
const { parse } = require('svg-parser');
var svg = parse(fs.readFileSync('usmap48.svg',{encoding:"utf8"})).children[0];
var borders = {};
var corners = {};
var outline = {};
var points = {};
for (var i=0;i<svg.children.length;i++){
if (svg.children[i].tagName == "g"){
//console.log(svg.children[i].properties);
var regionID = svg.children[i].properties.id;
if (regionID.substring(0,7) == "region-"){
regionID = regionID.substring(7);
}
else {continue;}
for (var ii=0;ii<svg.children[i].children.length;ii++){
var child = svg.children[i].children[ii];
var id = child.properties.id;
if (!id || id.substring(0,regionID.length) != regionID){
continue;
}
var path = child.properties.d.split("M")[1].trim();
var ps = path.split(" ");
var borderPath = {};
for (var iii=0;iii<ps.length;iii+=2){
var point = ps[iii]+"-"+ps[iii+1];
if (!points[point]){
points[point]=[regionID];
}
else {
var addRegion = true;
for (var iv=0;iv<points[point].length;iv++){
if (points[point][iv] == regionID){addRegion = false; continue;}
}
if (addRegion){points[point].push(regionID);}
}
}
}
}
}
for (var i=0;i<svg.children.length;i++){
if (svg.children[i].tagName == "g"){
//console.log(svg.children[i].properties);
var regionID = svg.children[i].properties.id;
if (regionID.substring(0,7) == "region-"){
regionID = regionID.substring(7);
}
else {continue;}
for (var ii=0;ii<svg.children[i].children.length;ii++){
var child = svg.children[i].children[ii];
var id = child.properties.id;
if (!id || id.substring(0,regionID.length) != regionID){
continue;
}
var path = child.properties.d.split("M")[1].trim();
var ps = path.split(" ");
var borderPath = {};
var lastState = {};
for (var iii=0;iii<ps.length;iii+=2){
var point = ps[iii]+"-"+ps[iii+1];
var outlineRegion = true;
var nextState = {};
if (points[point].length > 2){
corners[point]=[ps[iii],ps[iii+1]];
}
for (var iv=0;iv<points[point].length;iv++){
if (points[point][iv] == regionID){continue;}
var pair1 = regionID+"-"+points[point][iv];
//var pair2 = points[point][iv]+"-"+regionID;
if (!borderPath[pair1]){borderPath[pair1]=[]}
borderPath[pair1].push(iii/2);
if (lastState[pair1]){
outlineRegion = false;
}
nextState[pair1]=true;
//if (!borders[pair2]){borders[pair2]={}}
}
if (outlineRegion && iii > 0){
var pair1 = regionID+"-00";
if (!borderPath[pair1]){borderPath[pair1]=[]}
borderPath[pair1].push(iii/2-1);
}
lastState = {};
for (var ni in nextState){
lastState[ni]=true;
}
}
for (var iii=0;iii<1;iii+=2){
var point = ps[iii]+"-"+ps[iii+1];
var outlineRegion = true;
for (var iv=0;iv<points[point].length;iv++){
if (points[point][iv] == regionID){continue;}
if (lastState[pair1]){
outlineRegion = false;
}
}
if (outlineRegion){
var pair1 = regionID+"-00";
if (!borderPath[pair1]){borderPath[pair1]=[]}
borderPath[pair1].push(ps.length/2-1);
}
}
//console.log(borderPath);
for (var b in borderPath){
console.log(b);
var segments = [];
for (var iii=0;iii<borderPath[b].length;iii++){
if (segments.length == 0){
segments.push([borderPath[b][iii]]);
}
else if (borderPath[b][iii] == segments[segments.length-1][segments[segments.length-1].length-1]+1){
segments[segments.length-1].push(borderPath[b][iii]);
}
else {
segments.push([borderPath[b][iii]]);
}
}
if (segments.length > 1 && segments[0][0] == 0 && segments[segments.length-1][segments[segments.length-1].length-1] == ps.length/2 - 1){
for (var iii=0;iii<segments[segments.length-1].length;iii++){
segments[0].splice(iii,0,segments[segments.length-1][iii]);
}
segments.pop();
}
console.log(regionID,segments);
if (b == regionID+"-00"){
//console.log(regionID,segments);
for (var iii=0;iii<segments.length;iii++){
if (segments[iii][0] == 0){
//segments[iii].splice(0,0,ps.length/2 - 1);
}
else {
//segments[iii].splice(0,0,segments[iii][0]-1);
}
if (segments[iii][segments[iii].length-1] == ps.length/2 - 1) {
segments[iii].push(0);
}
else {
segments[iii].push(segments[iii][segments[iii].length-1]+1);
}
}
}
if (segments.length > 1){
//console.log(b,ps.length,segments, borderPath[b]);
}
var path = "";
for (var iii=0;iii<segments.length;iii++){
path += "M ";
for (var iv=0;iv<segments[iii].length;iv++){
path += ps[segments[iii][iv]*2] + " " + ps[segments[iii][iv]*2+1] + " ";
}
}
var s1 = b.split("-")[0];
var s2 = b.split("-")[1];
if (s2 != "00"){
if (s1 < s2){
if (borders[s2+"-"+s1]){
borders[s2+"-"+s1] += path;
}
else {
borders[s2+"-"+s1]=path;
}
}
}
else {
if (outline[s1]){
outline[s1]+=path;
}
else {
outline[s1]=path;
}
}
}
}
}
}
//console.log(borders);
fs.writeFileSync("borders.json",JSON.stringify(borders));
fs.writeFileSync("outline.json",JSON.stringify(outline));
var outborders = {};
for (var b in borders){
var xy = borders[b].split("M")[1].trim().split(" ").slice(0,2);
var x = 15 + Math.random()*150 - parseFloat(xy[0]);
var y = 115 + Math.random()*70 - parseFloat(xy[1]);
outborders[b] = {d:borders[b],x:x,y:y};
}
var html = nunjucks.render("genPuzzle.html", {borders: outborders,outline:outline,viewBox: "0 0 185 200",corners:corners});
fs.writeFileSync("index.html", html);
var svg = document.querySelector('svg');
svg.addEventListener('pointerup',upBorder);
svg.addEventListener('pointercancel',upBorder);
var initialMove = {x:0,y:0,px:0,py:0,id:false};
var bcr = svg.getBoundingClientRect();
function downBorder(evt){
bcr = svg.getBoundingClientRect();
var id = evt.currentTarget.id;
var el = evt.currentTarget;
svg.addEventListener('pointermove',moveBorder);
initialMove.x = borders[id].x;
initialMove.y = borders[id].y;
initialMove.px = (evt.clientX - bcr.left)/bcr.width*185;
initialMove.py = (evt.clientY - bcr.top)/bcr.height*200;
initialMove.id = id;
}
function moveBorder(evt){
if (!initialMove.id){
return;
}
var el = document.getElementById(initialMove.id);
var px = (evt.clientX - bcr.left)/bcr.width*185;
var py = (evt.clientY - bcr.top)/bcr.height*200;
var x = px - initialMove.px + initialMove.x;
var y = py - initialMove.py + initialMove.y;
el.setAttribute('transform','translate('+x+","+y+")");
}
function upBorder(evt){
if (!initialMove.id){
return;
}
var el = document.getElementById(initialMove.id);
var px = (evt.clientX - bcr.left)/bcr.width*185;
var py = (evt.clientY - bcr.top)/bcr.height*200;
var x = px - initialMove.px + initialMove.x;
var y = py - initialMove.py + initialMove.y;
el.setAttribute('transform','translate('+x+","+y+")");
borders[initialMove.id].x = x;
borders[initialMove.id].y = y;
svg.removeEventListener('pointermove',moveBorder);
initialMove.id = false;
if (x*x + y*y < 100){
el.removeEventListener('pointerdown',downBorder);
el.style.stroke = "gray";
el.style.strokeWidth = "1";
el.style.cursor = "pointer";
el.setAttribute('transform',"");
}
}
svg {
width: min(85vw,85vh);
}
This repl create a game where the goal is to put all of the border pieces into their correct locations. It is hard, but different maps may be easier if you wish less of a challenge.
To view this on TripleLog, click here.
The index.html file is regenerated each time makehtml.js is run. The genPuzzle.html is the template that be adjusted to change the html.
Add CSS by editing the style.css file that is linked to in the head section or inline edit the style section in the head.
npm install nunjucks and svg-parser Run the makehtml.js file to generate the borders and then the html from the genPuzzle.html template.
The border pairs are crudely parsed from the usmap48.svg file so adjustments might be needed for different maps.