← Back to Demos Gallery
The live application below is running completely client-side in your browser using serverless Shinylive (WebAssembly). It provides an interactive Isle Royale Wolf-Moose Platform (IsleRoyaleApp()) featuring 100% offline spatial substrate mapping, continuous micro-step history tracking, side-by-side cowplot age class plots with per-species legends, custom time unit labeling (Steps vs Days ), tab-aware sidebar decluttering (show_habitat, show_landmarks, norm, total), and dynamic table discovery (inputApp).
#| '!! shinylive warning !!': |
#| shinylive does not work in self-contained HTML documents.
#| Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 880
#| components: [viewer]
library(shiny)
library(bslib)
library(ggplot2)
library(cowplot)
library(dplyr)
library(tidyr)
library(tibble)
library(rlang)
library(stats)
library(graphics)
# --- Auto-Included Isle Royale Datasets List ---
isle_royale_datasets <- list()
# --- Auto-Included Data Table: future.moose ---
future.moose <- structure(list(current = c("calf", "yearling", "adult", "senior",
"adult", "death", "predated"), future = c("yearling", "adult",
"senior", "death", "calf", "death", "death"), fid = c(2L, 3L,
4L, 5L, 6L, 7L, 7L), time = c(365L, 365L, 2920L, 2190L, 365L,
0L, 0L), pch = c("0", "1", "2", "3", "G", "D", "D"), color = c("lightgreen",
"green", "darkgreen", "brown", "black", "red", "red"), ageclass = c("calf",
"yearling", "adult", "senior", "adult", NA, NA), event = c("future",
"future", "future", "future", "birth", "death", "death"), init = c(50L,
50L, 400L, 100L, 50L, 0L, 0L)), class = "data.frame", row.names = c(NA,
-7L))
isle_royale_datasets[['future.moose']] <- future.moose
# --- Auto-Included Data Table: future.wolf ---
future.wolf <- structure(list(current = c("pup", "subadult", "adult", "adult",
"death"), future = c("subadult", "adult", "death", "pup", "death"
), fid = 2:6, time = c(365L, 365L, 2555L, 365L, 0L), pch = c("0",
"1", "2", "P", "D"), color = c("orange", "darkorange", "black",
"purple", "red"), ageclass = c("pup", "subadult", "adult", "adult",
NA), event = c("future", "future", "future", "birth", "death"
), init = c(5L, 10L, 15L, 5L, 0L)), class = "data.frame", row.names = c(NA,
-5L))
isle_royale_datasets[['future.wolf']] <- future.wolf
# --- Auto-Included Data Table: moose.wolf ---
moose.wolf <- structure(list(c("calf", "yearling", "adult", "senior", "death",
"predated"), feed = c(8, 3, 1, 6, 0, 0), offspring = c(1.5, 1,
0.5, 1.2, 0, 0), male = c(NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-6L))
isle_royale_datasets[['moose.wolf']] <- moose.wolf
# --- Auto-Included Data Table: organism.features ---
organism.features <- structure(list(c("moose", "wolf", "substrate"), units = c("DD",
"hr", NA), offspring = c("1.2", "moose", ""), attack = c(NA,
"moose", ""), birth = c("adult", NA, ""), substrate = c("substrate",
"substrate", ""), deplete = c(100L, 48L, NA), subclass = c("moose",
"adult", ""), parasite = c(NA, "ecto", ""), move = c("adult",
"adult", "")), class = "data.frame", row.names = c(NA, -3L))
isle_royale_datasets[['organism.features']] <- organism.features
# --- Auto-Included Data Table: substrate.moose ---
substrate.moose <- structure(list(c("calf", "yearling", "adult", "senior"), substrate = c(1.2,
1, 1, 0.8)), class = "data.frame", row.names = c(NA, -4L))
isle_royale_datasets[['substrate.moose']] <- substrate.moose
# --- Auto-Included Data Table: substrate.substrate ---
substrate.substrate <- structure(list("substrate", substrate = 1), class = "data.frame", row.names = c(NA,
-1L))
isle_royale_datasets[['substrate.substrate']] <- substrate.substrate
# --- Auto-Included Data Table: substrate.wolf ---
substrate.wolf <- structure(list(c("pup", "subadult", "adult"), substrate = c(1,
1, 1)), class = "data.frame", row.names = c(NA, -3L))
isle_royale_datasets[['substrate.wolf']] <- substrate.wolf
# --- Auto-Included Historical Census Data: wolf_moose ---
wolf_moose <- structure(list(Year = 1980:2019, Wolves = c(50L, 30L, 14L, 23L,
24L, 22L, 20L, 16L, 12L, 11L, 15L, 12L, 12L, 13L, 15L, 16L, 22L,
24L, 14L, 25L, 29L, 19L, 17L, 19L, 29L, 30L, 30L, 21L, 23L, 24L,
19L, 16L, 9L, 8L, 9L, 3L, 2L, 2L, 2L, 14L), Moose = c(664L, 650L,
700L, 900L, 811L, 1062L, 1025L, 1380L, 1653L, 1397L, 1216L, 1313L,
1600L, 1880L, 1800L, 2400L, 1200L, 500L, 700L, 750L, 850L, 900L,
1000L, 900L, 750L, 540L, 385L, 450L, 650L, 530L, 510L, 515L,
750L, 975L, 1050L, 1250L, 1300L, 1600L, 1500L, 2060L)), class = "data.frame", row.names = c(NA,
-40L))
isle_royale_datasets[['wolf_moose']] <- wolf_moose
# --- Auto-Included Spatial RDS Object: isle_royale_features ---
isle_royale_features <- structure(list(habitat_type = c("Lake/Pond", "Lake/Pond", "Lake/Pond",
"Forest", "Bog/Wetland"), id = c("041800000101", "041800000101",
"041800000101", "041800000101", "041800000101"), objectid = c(40556L,
40556L, 40556L, 40556L, 40556L), tnmid = c("{DB09E061-2929-491A-86D2-74A4F730D113}",
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}",
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}"
), metasourceid = c("{511D2AC8-11BA-45FC-AB98-F69D693D4C44}",
"{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}",
"{511D2AC8-11BA-45FC-AB98-F69D693D4C44}", "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}"
), sourcedatadesc = c("Watershed Boundary Dataset (WBD)", "Watershed Boundary Dataset (WBD)",
"Watershed Boundary Dataset (WBD)", "Watershed Boundary Dataset (WBD)",
"Watershed Boundary Dataset (WBD)"), sourceoriginator = c("Natural Resources and Conservation Service and U.S. Geological Survey",
"Natural Resources and Conservation Service and U.S. Geological Survey",
"Natural Resources and Conservation Service and U.S. Geological Survey",
"Natural Resources and Conservation Service and U.S. Geological Survey",
"Natural Resources and Conservation Service and U.S. Geological Survey"
), sourcefeatureid = c(NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_), loaddate = structure(c(1723704945,
1723704945, 1723704945, 1723704945, 1723704945), class = c("POSIXct",
"POSIXt"), tzone = ""), referencegnis_ids = c("1618306", "1618306",
"1618306", "1618306", "1618306"), areaacres = c(424470.78, 424470.78,
424470.78, 424470.78, 424470.78), areasqkm = c(1717.77, 1717.77,
1717.77, 1717.77, 1717.77), states = c("CN,MI,MN,WI", "CN,MI,MN,WI",
"CN,MI,MN,WI", "CN,MI,MN,WI", "CN,MI,MN,WI"), huc12 = c("041800000101",
"041800000101", "041800000101", "041800000101", "041800000101"
), name = c("Isle Royale", "Isle Royale", "Isle Royale", "Isle Royale",
"Isle Royale"), hutype = c("I", "I", "I", "I", "I"), humod = c("NM",
"NM", "NM", "NM", "NM"), tohuc = c("041800000200", "041800000200",
"041800000200", "041800000200", "041800000200"), noncontributingareaacres = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_),
noncontributingareasqkm = c(NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_), globalid = c("{DB09E061-2929-491A-86D2-74A4F730D113}",
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}",
"{DB09E061-2929-491A-86D2-74A4F730D113}", "{DB09E061-2929-491A-86D2-74A4F730D113}"
), place_id = c(374449614L, 374449614L, 374449614L, 374449614L,
374449614L), licence = c("Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright"
), osm_type = c("relation", "relation", "relation", "relation",
"relation"), osm_id = c(3671688L, 3671688L, 3671688L, 3671688L,
3671688L), lat = c("48.0073825", "48.0073825", "48.0073825",
"48.0073825", "48.0073825"), lon = c("-88.8289875", "-88.8289875",
"-88.8289875", "-88.8289875", "-88.8289875"), class = c("place",
"place", "place", "place", "place"), type = c("island", "island",
"island", "island", "island"), place_rank = c(17L, 17L, 17L,
17L, 17L), importance = c(0.377565444769677, 0.377565444769677,
0.377565444769677, 0.377565444769677, 0.377565444769677),
addresstype = c("island", "island", "island", "island", "island"
), name.1 = c("Isle Royale", "Isle Royale", "Isle Royale",
"Isle Royale", "Isle Royale"), display_name = c("Isle Royale, Keweenaw County, Michigan, United States",
"Isle Royale, Keweenaw County, Michigan, United States",
"Isle Royale, Keweenaw County, Michigan, United States",
"Isle Royale, Keweenaw County, Michigan, United States",
"Isle Royale, Keweenaw County, Michigan, United States"),
geometry = structure(list(structure(list(list(structure(c(-88.63,
-88.606, -88.606, -88.63, -88.63, 48.105, 48.105, 48.121,
48.121, 48.105), dim = c(5L, 2L)))), class = c("XY", "MULTIPOLYGON",
"sfg")), structure(list(list(structure(c(-88.943, -88.943,
-88.979, -88.979, -88.9775138036827, -88.9765932024271, -88.9759006689158,
-88.9747436019369, -88.974262801805, -88.9735376682912, -88.9719976678786,
-88.9714760677375, -88.9695646005501, -88.9661255985688,
-88.963892665655, -88.9624908652599, -88.960795663728, -88.9598177978466,
-88.9592390643652, -88.9592331684753, -88.9591942, -88.9588852,
-88.9583678, -88.9580081241565, -88.957601063993, -88.9572914639086,
-88.9556614644776, -88.9538438618706, -88.95197739572, -88.9511948621786,
-88.9502871751257, -88.9502561, -88.9501555, -88.9499397,
-88.9500551864452, -88.9499234618492, -88.9487743948966,
-88.9479796912414, -88.9476445, -88.9475116225945, -88.945332686448,
-88.9451531, -88.94467, -88.9441232, -88.9438542189297, -88.9433622602565,
-88.943, 47.8826923305099, 47.886, 47.886, 47.8726972028773,
47.873018697047, 47.8734740971732, 47.8737046305859, 47.8739902307048,
47.8740944974189, 47.8743744308407, 47.8747752310018, 47.8749014977217,
47.8753418979137, 47.87611583159, 47.8765386318016, 47.8767746319303,
47.8769778320746, 47.8772686321819, 47.877466232249, 47.8774693511414,
47.8775051, 47.8777288, 47.8779821, 47.8781173779748, 47.878332699148,
47.8784040991791, 47.8785906993166, 47.8788212994731, 47.879139499645,
47.8793534997283, 47.87964330869, 47.8796975, 47.879811,
47.8798274, 47.8797173770424, 47.8797594332051, 47.8802036333453,
47.8805232843974, 47.8806678, 47.8807115497066, 47.8815879124797,
47.8816809, 47.8819868, 47.8821825, 47.8822554279141, 47.8825617007096,
47.8826923305099), dim = c(47L, 2L)))), class = c("XY", "MULTIPOLYGON",
"sfg")), structure(list(list(structure(c(-88.4931645, -88.4933202160596,
-88.4880637674483, -88.4880643, -88.4880388, -88.4879932,
-88.4880106, -88.4878604, -88.4878685, -88.4878631, -88.4878162,
-88.4877704, -88.4877142, -88.4877236, -88.4876955, -88.4876154,
-88.4875788, -88.487552, -88.4875227, -88.4873055, -88.4871799,
-88.4870604, -88.4868974, -88.4868157, -88.4867245, -88.4866313323734,
-88.4861070935189, -88.4858204924077, -88.4853698922839,
-88.4849602921596, -88.4847881587637, -88.484583157636, -88.4844475872462,
-88.4844393, -88.4840852, -88.4839844611778, -88.4837059583434,
-88.4835995583013, -88.4835584916036, -88.4836074916037,
-88.4836653662082, -88.4836621, -88.483876, -88.4840974,
-88.4843776, -88.4846833, -88.4849167, -88.4851012, -88.4852937033422,
-88.483081756113, -88.4830001, -88.4829280461775, -88.4827795579647,
-88.4826486912859, -88.482697958002, -88.4826080913158, -88.4824522912651,
-88.4822130077488, -88.4820599941843, -88.4819643731899,
-88.4819438215351, -88.4819406957911, -88.4820376, -88.4819363111558,
-88.4819360911102, -88.4819193538607, -88.4818452, -88.4816127,
-88.4815991545039, -88.4814036920129, -88.480936957545, -88.4806747574821,
-88.4803553573974, -88.4800685573278, -88.48, -88.48, -88.4808247,
-88.4814489, -88.4821869, -88.4836221, -88.4849305, -88.485276,
-88.4859263, -88.4862021, -88.4862712, -88.4865497, -88.4868385,
-88.4870155, -88.4872355, -88.4875748, -88.4879382, -88.4883191,
-88.4886302, -88.4889346, -88.4892337, -88.4894657, -88.4896655,
-88.4897889, -88.4898131, -88.4898238, -88.4897836, -88.4896441,
-88.4894899, -88.4894845, -88.4895301, -88.4895971, -88.4897475,
-88.4897948945572, -88.48982665944, -88.489862, -88.4899083,
-88.489978, -88.4900303, -88.4900048, -88.4900157598636,
-88.49022129389, -88.490243873488, -88.4902718, -88.4902796195098,
-88.4901801594747, -88.4901822267746, -88.4901734, -88.4901913,
-88.4902961, -88.4906217, -88.4907961, -88.490953, -88.4910844,
-88.4912298, -88.4912699663266, -88.4913431597606, -88.4913310469136,
-88.491291, -88.4911783, -88.49113, -88.4911019, -88.4911689,
-88.4913661, -88.4915538, -88.4917385487709, -88.4917765608072,
-88.4923744932598, -88.4927962590975, -88.4929165, -88.4931645,
48.145085, 48.145, 48.145, 48.1450143, 48.1450832, 48.1451494,
48.1451941, 48.1452693, 48.1453131, 48.145357, 48.1453749,
48.1453813, 48.1453829, 48.1454304, 48.1454527, 48.1454784,
48.145476, 48.145502, 48.1455235, 48.1455832, 48.1456408,
48.145714, 48.1457783, 48.1457847, 48.1457883, 48.1457922801428,
48.1460907017624, 48.1462169017993, 48.1463213018445, 48.1463379018747,
48.1462777018781, 48.1461297018716, 48.1460103729073, 48.1460093,
48.1458733, 48.1458244721321, 48.1457187685413, 48.1456585685402,
48.1455379018597, 48.1454391685093, 48.1454003868823, 48.1453437,
48.1452881, 48.1452582, 48.145272, 48.1452935, 48.1452505,
48.1452167, 48.145, 48.145, 48.1450321, 48.1450272742566,
48.1451159685211, 48.1453025018891, 48.1455273019169, 48.1455821019305,
48.1455657686056, 48.1454194967365, 48.145400911376, 48.1454104792073,
48.1454202710932, 48.1454924994098, 48.1455467, 48.1455938172908,
48.1455989019786, 48.1456017054256, 48.1456362, 48.1456636,
48.1456696697607, 48.1457691020384, 48.146109168784, 48.1462299688185,
48.1463233021865, 48.1464495022235, 48.1464965100273, 48.1506344383766,
48.1502282, 48.1499688, 48.1496873, 48.1490216, 48.1481903,
48.147974, 48.1476924, 48.1476278, 48.1476298, 48.1475346,
48.1474115, 48.1473032, 48.1471717, 48.1470384, 48.1469301,
48.1468111, 48.146735, 48.1466885, 48.146633, 48.1466008,
48.1466008, 48.1466321, 48.1466858, 48.1467494, 48.1468218,
48.1468684, 48.1469534, 48.1470017, 48.1470437, 48.1470455,
48.1470344, 48.1470198059496, 48.1470015278956, 48.1469685,
48.1469086, 48.1468397, 48.146863, 48.1469274, 48.1469634951192,
48.1469989682741, 48.1469882173427, 48.1469629, 48.1469204236519,
48.1468181015853, 48.1468134840663, 48.1468093, 48.1467073,
48.1466612, 48.146565, 48.1464702, 48.1463735, 48.1463449,
48.1463318, 48.1463371209873, 48.1463295681052, 48.1462972580214,
48.1462778, 48.1461972, 48.1460594, 48.1458697, 48.1457427,
48.1456049, 48.1455324, 48.145498625033, 48.1454793679581,
48.1453201012287, 48.145231414186, 48.1451959, 48.145085), dim = c(145L,
2L))), list(structure(c(-88.48, -88.48, -88.5, -88.5, -88.4995530966614,
-88.4992828965952, -88.4991353632296, -88.4988241621158,
-88.4978578962542, -88.4970552950191, -88.4966703626424,
-88.4961707635611, -88.4957039624066, -88.4953681623151,
-88.4950240955677, -88.4949340955515, -88.4949023936406,
-88.4950259, -88.4958867, -88.4958892996846, -88.4958934959405,
-88.4959345626365, -88.4959345735406, -88.495952, -88.495934652055,
-88.4959346959925, -88.4958924143864, -88.4958568, -88.4956595174421,
-88.4955990959278, -88.4942066955917, -88.4939282965622,
-88.4936905621144, -88.4935757620763, -88.4934609620274,
-88.4933134963492, -88.4932233619505, -88.4931496942277,
-88.4930676952448, -88.4928298941028, -88.4927069617738,
-88.4926579617795, -88.492502361743, -88.4923466950366, -88.4917894948673,
-88.491371560357, -88.4910028946195, -88.4904129611235, -88.489601960919,
-88.4880702938715, -88.4877671604668, -88.4871856947, -88.486505760167,
-88.4859897610823, -88.4856375599624, -88.4853590921837,
-88.4851131598225, -88.4848346930846, -88.4846217597037,
-88.4843187596332, -88.4837124928213, -88.4829916926465,
-88.4822133601554, -88.4818610934022, -88.4814678933171,
-88.4810583578086, -88.4807446062768, -88.4806134, -88.4805403657046,
-88.4804930920344, -88.4801162919402, -88.48, 48.1548285529033,
48.157, 48.157, 48.1459812549131, 48.1462157008631, 48.1463309675641,
48.1464187675863, 48.1465779676295, 48.1469897677522, 48.1473521011904,
48.1475771012477, 48.1477857679773, 48.1479943680379, 48.1480767680722,
48.1482469014525, 48.1483237681359, 48.148451742789, 48.1485343,
48.1489177, 48.1489246325065, 48.1489265014871, 48.1490361014994,
48.1490482084308, 48.149102, 48.1491353839639, 48.1491841681865,
48.1492166649145, 48.1492852, 48.1493956634536, 48.1494421015784,
48.1500679017598, 48.1501667017924, 48.1501723018094, 48.1501559018149,
48.1500681684773, 48.1500189684805, 48.1500463684905, 48.1501013018365,
48.1501067685095, 48.1499313685014, 48.1499369685106, 48.1500741018662,
48.1501509685541, 48.1502059019056, 48.1502281019467, 48.1501899019699,
48.1502009686633, 48.150332902055, 48.1506403021528, 48.1512551690088,
48.1514033690499, 48.1516559024578, 48.1520015692185, 48.152221169284,
48.1524243026695, 48.1525285693695, 48.1525725027257, 48.152671369425,
48.1527921027895, 48.1529457028314, 48.1532257029114, 48.1535439030045,
48.1538185030955, 48.1539665698066, 48.1542081032001, 48.1544385032598,
48.1545329735159, 48.1545999, 48.1545944694915, 48.1546087033219,
48.1547569700347, 48.1548285529033), dim = c(72L, 2L)))), class = c("XY",
"MULTIPOLYGON", "sfg")), structure(list(list(structure(c(-89.161838,
-89.1620425960668, -89.121, -89.121, -89.171, -89.171, -89.1708659345758,
-89.1704663344708, -89.1699990252447, -89.1697737, -89.1693323,
-89.168886, -89.1687960331566, -89.1686144674725, -89.1683369341033,
-89.1680920674276, -89.1679370674068, -89.1676596673484,
-89.1670398671867, -89.166419867029, -89.1662240669873, -89.1661261336465,
-89.1661097336774, -89.166150467055, -89.1661757741975, -89.1661984,
-89.1663259, -89.1663848, -89.1663844508349, -89.1664274672236,
-89.166329333958, -89.1661333339463, -89.165872334938, -89.1656030661272,
-89.1647628659153, -89.1647576101403, -89.1646781, -89.1642023,
-89.1636825, -89.1631087, -89.162628, -89.1621376, -89.1618434,
-89.1615491, -89.1610341, -89.1605094, -89.1601661, -89.1599405,
-89.1595923, -89.1592195, -89.1589057, -89.1585329, -89.1581308,
-89.1575521, -89.1572302, -89.1568164, -89.1565663, -89.1562279,
-89.1559287, -89.1550999, -89.1546921037537, -89.1545270637028,
-89.153238263334, -89.1529689299289, -89.1527242632164, -89.1526263298472,
-89.1525692631513, -89.1525612631296, -89.152691929813, -89.1528342359029,
-89.1526317, -89.1525212, -89.1524614, -89.1524172, -89.1524779,
-89.1527348, -89.1530395, -89.1533351527743, -89.1541684635419,
-89.1548943304196, -89.1560280641033, -89.1567590496996,
-89.1570077, -89.157351, -89.157454, -89.1573804, -89.1573412,
-89.1571597, -89.1569341, -89.1565957, -89.1562818, -89.1562279,
-89.1561151, -89.1561445, -89.1563211, -89.1566153, -89.1568017,
-89.1568605, -89.1569243, -89.1571162, -89.1571234, -89.1571319,
-89.1571799, -89.1571765, -89.1572354, -89.157281, -89.15731,
-89.1573308, -89.1574435, -89.157551, -89.1576458, -89.1577747,
-89.1578502, -89.1579073, -89.1580365, -89.1581284, -89.1581527,
-89.158222, -89.1583451, -89.1584804, -89.1586354, -89.1587418,
-89.1587937, -89.1589099, -89.1590863, -89.1592955, -89.1595019,
-89.1596388, -89.1597481, -89.1599204, -89.1600136, -89.1601706,
-89.1602907, -89.1604918, -89.1608106, -89.1610828, -89.161534,
-89.161838, 47.9080693, 47.908, 47.908, 47.938, 47.938, 47.9118585815331,
47.9118870891401, 47.9120020891835, 47.9123391492649, 47.9126201,
47.9130047, 47.9133466, 47.91336122275, 47.9135534895254,
47.9138770229226, 47.9143100896659, 47.9144854897008, 47.9146608897442,
47.914847223146, 47.9150608898848, 47.915181489915, 47.9153294899422,
47.9155652233092, 47.9157736233352, 47.9158213291009, 47.9158316,
47.9160157, 47.9162227, 47.9162255024711, 47.9163218900585,
47.9169634234872, 47.9172812902113, 47.9174786902566, 47.9176212236281,
47.9179226237277, 47.9179232778767, 47.9179549, 47.9180568,
47.9180798, 47.9180601, 47.9180305, 47.9180503, 47.9179615,
47.9177807, 47.9175934, 47.9173896, 47.9173337, 47.9172318,
47.9171825, 47.9172121, 47.9172154, 47.9172581, 47.9174093,
47.9175375, 47.9175647, 47.9175244, 47.9174455, 47.9173764,
47.9172976, 47.9171957, 47.9171745115341, 47.9171800243304,
47.91735509111, 47.9174262911384, 47.9176180911817, 47.9175796911832,
47.9175028911765, 47.9173768911597, 47.9172232911295, 47.9171656229079,
47.9172064, 47.9172707, 47.9173271, 47.9172647, 47.9171293,
47.917028, 47.9170285, 47.9170071743006, 47.9168454909756,
47.9167690242483, 47.9167856241725, 47.9169109504792, 47.9169229,
47.9168966, 47.9167815, 47.9165711, 47.9164035, 47.9162819,
47.9160814, 47.915848, 47.915493, 47.9152268, 47.914977,
47.9146976, 47.9144938, 47.9142275, 47.9139119, 47.9135832,
47.9133696, 47.9130547, 47.9130414, 47.9130256, 47.9129109,
47.912876, 47.9128563, 47.912809, 47.9126982, 47.9126099,
47.9124332, 47.912274, 47.9121853, 47.9119939, 47.9118986,
47.9118319, 47.9116801, 47.9116418, 47.9115616, 47.9114581,
47.9113129, 47.9111292, 47.9109897, 47.9108692, 47.9107622,
47.9106454, 47.9104584, 47.9102735, 47.9100724, 47.9098539,
47.9096377, 47.9093431, 47.9090243, 47.9086906, 47.9084753,
47.908329, 47.9081958, 47.9081498, 47.9081301, 47.9080693
), dim = c(138L, 2L)))), class = c("XY", "MULTIPOLYGON",
"sfg")), structure(list(list(structure(c(-88.77, -88.73,
-88.73, -88.77, -88.77, 48.008, 48.008, 48.032, 48.032, 48.008
), dim = c(5L, 2L)))), class = c("XY", "MULTIPOLYGON", "sfg"
))), class = c("sfc_MULTIPOLYGON", "sfc"), precision = 0, bbox = structure(c(xmin = -89.171,
ymin = 47.8726972028773, xmax = -88.48, ymax = 48.157), class = "bbox"), crs = structure(list(
input = "EPSG:4326", wkt = "GEOGCRS[\"WGS 84\",\n ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n MEMBER[\"World Geodetic System 1984 (Transit)\"],\n MEMBER[\"World Geodetic System 1984 (G730)\"],\n MEMBER[\"World Geodetic System 1984 (G873)\"],\n MEMBER[\"World Geodetic System 1984 (G1150)\"],\n MEMBER[\"World Geodetic System 1984 (G1674)\"],\n MEMBER[\"World Geodetic System 1984 (G1762)\"],\n MEMBER[\"World Geodetic System 1984 (G2139)\"],\n MEMBER[\"World Geodetic System 1984 (G2296)\"],\n ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1]],\n ENSEMBLEACCURACY[2.0]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n CS[ellipsoidal,2],\n AXIS[\"geodetic latitude (Lat)\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n AXIS[\"geodetic longitude (Lon)\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n USAGE[\n SCOPE[\"Horizontal component of 3D system.\"],\n AREA[\"World.\"],\n BBOX[-90,-180,90,180]],\n ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = c(NA,
5L), class = c("sf", "data.frame"), sf_column = "geometry", agr = structure(c(habitat_type = NA_integer_,
id = NA_integer_, objectid = NA_integer_, tnmid = NA_integer_,
metasourceid = NA_integer_, sourcedatadesc = NA_integer_, sourceoriginator = NA_integer_,
sourcefeatureid = NA_integer_, loaddate = NA_integer_, referencegnis_ids = NA_integer_,
areaacres = NA_integer_, areasqkm = NA_integer_, states = NA_integer_,
huc12 = NA_integer_, name = NA_integer_, hutype = NA_integer_,
humod = NA_integer_, tohuc = NA_integer_, noncontributingareaacres = NA_integer_,
noncontributingareasqkm = NA_integer_, globalid = NA_integer_,
place_id = NA_integer_, licence = NA_integer_, osm_type = NA_integer_,
osm_id = NA_integer_, lat = NA_integer_, lon = NA_integer_, class = NA_integer_,
type = NA_integer_, place_rank = NA_integer_, importance = NA_integer_,
addresstype = NA_integer_, name.1 = NA_integer_, display_name = NA_integer_
), class = "factor", levels = c("constant", "aggregate", "identity"
)))
isle_royale_datasets[['isle_royale_features']] <- isle_royale_features
# --- Auto-Included Spatial RDS Object: isle_royale_landmarks ---
isle_royale_landmarks <- structure(list(name = c("Washington Creek (Windigo)", "Ojibway Lake",
"Feldtmann Lake", "Hidden Lake (Tobin Harbor)"), location = c("Windigo",
"Ojibway", "Feldtmann", "Tobin Harbor"), description = c("Feeding area along stream & forest cover",
"Aquatic vegetation feeding lake", "Major southwest inland lake habitat",
"Aquatic plant feeding area near Tobin Harbor"), geometry = structure(list(
structure(c(-89.146, 47.923), class = c("XY", "POINT", "sfg"
)), structure(c(-88.618, 48.113), class = c("XY", "POINT",
"sfg")), structure(c(-88.961, 47.876), class = c("XY", "POINT",
"sfg")), structure(c(-88.49, 48.151), class = c("XY", "POINT",
"sfg"))), n_empty = 0L, crs = structure(list(input = "EPSG:4326",
wkt = "GEOGCRS[\"WGS 84\",\n ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n MEMBER[\"World Geodetic System 1984 (Transit)\"],\n MEMBER[\"World Geodetic System 1984 (G730)\"],\n MEMBER[\"World Geodetic System 1984 (G873)\"],\n MEMBER[\"World Geodetic System 1984 (G1150)\"],\n MEMBER[\"World Geodetic System 1984 (G1674)\"],\n MEMBER[\"World Geodetic System 1984 (G1762)\"],\n MEMBER[\"World Geodetic System 1984 (G2139)\"],\n MEMBER[\"World Geodetic System 1984 (G2296)\"],\n ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1]],\n ENSEMBLEACCURACY[2.0]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n CS[ellipsoidal,2],\n AXIS[\"geodetic latitude (Lat)\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n AXIS[\"geodetic longitude (Lon)\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n USAGE[\n SCOPE[\"Horizontal component of 3D system.\"],\n AREA[\"World.\"],\n BBOX[-90,-180,90,180]],\n ID[\"EPSG\",4326]]"), class = "crs"), class = c("sfc_POINT",
"sfc"), precision = 0, bbox = structure(c(xmin = -89.146, ymin = 47.876,
xmax = -88.49, ymax = 48.151), class = "bbox"))), row.names = c(NA,
4L), sf_column = "geometry", agr = structure(c(name = NA_integer_,
location = NA_integer_, description = NA_integer_), class = "factor", levels = c("constant",
"aggregate", "identity")), class = c("sf", "data.frame"))
isle_royale_datasets[['isle_royale_landmarks']] <- isle_royale_landmarks
# --- Auto-Included Spatial RDS Object: isle_royale_layer ---
isle_royale_layer <- structure(list(id = "041800000101", objectid = 40556L, tnmid = "{DB09E061-2929-491A-86D2-74A4F730D113}",
metasourceid = "{511D2AC8-11BA-45FC-AB98-F69D693D4C44}",
sourcedatadesc = "Watershed Boundary Dataset (WBD)", sourceoriginator = "Natural Resources and Conservation Service and U.S. Geological Survey",
sourcefeatureid = NA_character_, loaddate = structure(1723704945, class = c("POSIXct",
"POSIXt"), tzone = ""), referencegnis_ids = "1618306", areaacres = 424470.78,
areasqkm = 1717.77, states = "CN,MI,MN,WI", huc12 = "041800000101",
name = "Isle Royale", hutype = "I", humod = "NM", tohuc = "041800000200",
noncontributingareaacres = NA_character_, noncontributingareasqkm = NA_character_,
globalid = "{DB09E061-2929-491A-86D2-74A4F730D113}", place_id = 374424026L,
licence = "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
osm_type = "relation", osm_id = 3671688L, lat = "48.0073825",
lon = "-88.8289875", class = "place", type = "island", place_rank = 17L,
importance = 0.377565444769677, addresstype = "island", name.1 = "Isle Royale",
display_name = "Isle Royale, Keweenaw County, Michigan, United States",
geometry = structure(list(structure(list(list(structure(c(-88.6826186579642,
-88.6827079489419, -88.6827407489319, -88.6827406662774,
-88.6825755, -88.682362, -88.682279, -88.6822827, -88.682498,
-88.6826186579642, 48.1174650291646, 48.1174141510419, 48.1172826843549,
48.1170210035476, 48.117125, 48.1172428, 48.1174054, 48.1174916,
48.1174975, 48.1174650291646), dim = c(10L, 2L))), list(structure(c(-89.2354705868803,
-89.2354248787861, -89.235383745376, -89.2352291445619, -89.2351971,
-89.235001, -89.234768, -89.2343928, -89.233846, -89.233331,
-89.2327254, -89.2321368, -89.2320069, -89.2313914, -89.2312344,
-89.2308617, -89.2307244, -89.2300133, -89.2296086, -89.229204,
-89.2287038, -89.2282305, -89.2276641, -89.2272815, -89.2268745,
-89.2262516, -89.2258397, -89.2253909, -89.2246773, -89.2239613,
-89.2233286, -89.2226813, -89.221514, -89.2211854, -89.2204596,
-89.2194714, -89.218976, -89.218596, -89.2182968, -89.2175366,
-89.2167078, -89.2161438, -89.2158005, -89.2154057, -89.2150599,
-89.2146553, -89.2143169, -89.2137039, -89.2132993, -89.2130933,
-89.2128334, -89.2124361, -89.2122767, -89.2118231, -89.2114626,
-89.2108741, -89.2102046, -89.2097019, -89.2088093, -89.2083116,
-89.207674, -89.2073626, -89.2070658, -89.2066073, -89.2059722,
-89.2053935, -89.2049202, -89.2041625, -89.2032331, -89.2027353,
-89.2022032, -89.2015558, -89.2009501, -89.2000723, -89.1993413,
-89.1987381, -89.1980883, -89.1977938469372, -89.1977886674548,
-89.1974790662832, -89.1970471327467, -89.1970070890447,
-89.196536, -89.1963420664254, -89.1955726653642, -89.1955719138143,
-89.1955657, -89.1951015, -89.1945743, -89.1942114, -89.1939441,
-89.1937251589567, -89.1934547310387, -89.1924853305817,
-89.1922084637419, -89.1920047302938, -89.1918418645481,
-89.191743929989, -89.1917766632891, -89.1918172632799, -89.1920614641916,
-89.1920451287183, -89.1919692103327, -89.191926, -89.1918997,
-89.1918663909882, -89.1918496629194, -89.191711129497, -89.191800729492,
-89.1921915295443, -89.1923952628918, -89.1925580618501,
-89.1925741294419, -89.1926555293727, -89.1925740636637,
-89.1925323305745, -89.1924949, -89.19236, -89.1921736, -89.1920044,
-89.19159, -89.1912467, -89.1910383, -89.1906214, -89.1903345,
-89.1900255, -89.1897828, -89.1896969, -89.1896626, -89.1896724,
-89.1896258, -89.1896626, -89.1897558, -89.1896283, -89.189437,
-89.1892482, -89.1890373, -89.1886842, -89.188439, -89.1882109,
-89.1882747, -89.1882183, -89.1879951, -89.1879338, -89.187951,
-89.1879118, -89.1878186, -89.1876641, -89.1875758, -89.1876151,
-89.1875636, -89.1874311, -89.1871344, -89.1867617, -89.1863595,
-89.1861241, -89.1859231, -89.1856214, -89.1853615, -89.1850746,
-89.185001, -89.1848392, -89.1846234, -89.1845596, -89.1844518,
-89.1840643, -89.1836254, -89.183439, -89.1833949, -89.1834267,
-89.1833777, -89.1830933, -89.1828554, -89.1825611, -89.1821026,
-89.18172, -89.1816023, -89.1814601, -89.1812296, -89.1807632169457,
-89.180628525326, -89.1800096584414, -89.1800089966587, -89.1798343,
-89.179518, -89.1789785, -89.1786671, -89.1783557, -89.1779658,
-89.1776028, -89.1771369, -89.1766097, -89.1758348, -89.1751531,
-89.1744837, -89.1738903, -89.173238, -89.1726838, -89.1721762,
-89.1718868, -89.1718574857061, -89.1718275219251, -89.1712658539698,
-89.1707856548036, -89.1706466405406, -89.1700477, -89.1698834,
-89.1695548, -89.1694077, -89.1692777, -89.1690325, -89.1687186,
-89.16839, -89.1679879, -89.1675489, -89.1669604, -89.1656657,
-89.1647093, -89.1641821, -89.1638952, -89.1638094, -89.1636721,
-89.1634955, -89.1631571, -89.1628629, -89.1626937, -89.1625097,
-89.1623577, -89.1621395, -89.1617962, -89.1616907, -89.1616539,
-89.1614847, -89.1612493, -89.1611537, -89.1610605, -89.1610188,
-89.1609134, -89.1608055, -89.1607589, -89.1606142, -89.1604597,
-89.1603641, -89.1601606, -89.1599301, -89.1597143, -89.1593612,
-89.1592949, -89.1592655, -89.1593146, -89.159241, -89.1591208,
-89.1589345, -89.158547, -89.1582013, -89.1580432535087,
-89.1579469172491, -89.1578979172607, -89.1577595161898,
-89.1576919429244, -89.1576544, -89.1574092, -89.1568992,
-89.1562003, -89.1551974, -89.1543759, -89.1539713, -89.1534294,
-89.1529904, -89.1525466, -89.1520341, -89.1513818, -89.1510606,
-89.1506731, -89.1502881, -89.149832, -89.1495942, -89.1494201,
-89.149143, -89.1488708, -89.1486035, -89.1479537, -89.1471199,
-89.1467128, -89.1465314, -89.1459282, -89.1452244, -89.1445697,
-89.1439689, -89.1433264, -89.1428679, -89.1425098, -89.1423921,
-89.1421077, -89.1419164, -89.1417963, -89.1415658, -89.1413917,
-89.1411857, -89.1411023, -89.1408963, -89.1406585, -89.1405457,
-89.140325, -89.1401214, -89.1399449, -89.1396972, -89.1396384,
-89.139501, -89.1393441, -89.1392411, -89.1391994, -89.1392117,
-89.1392926, -89.1392166, -89.1390817, -89.1389587034786,
-89.138948913002, -89.1389273642595, -89.1389395, -89.1389591,
-89.1389027, -89.1387875, -89.1386943, -89.138633, -89.1385128,
-89.1383779, -89.1382627, -89.138069, -89.1378998, -89.1377968,
-89.1376987, -89.1375614, -89.1375221, -89.1375025, -89.1374142,
-89.1373333, -89.1372622, -89.1372009, -89.1371543, -89.1369753,
-89.1367889, -89.1368306, -89.1368036, -89.136659, -89.1364628,
-89.1362544, -89.1360312, -89.1359675, -89.1358743, -89.1358743,
-89.135683, -89.1352735, -89.1352931, -89.1352367, -89.1348321,
-89.1348713, -89.1348419, -89.1347046, -89.13404, -89.1337556,
-89.1334981, -89.1333216, -89.1331916, -89.1329488, -89.1326031,
-89.1323873, -89.13212, -89.1319998, -89.1319042, -89.1318208,
-89.1316884, -89.1314996, -89.1313844, -89.1312716, -89.1311391,
-89.1310263, -89.1309062, -89.130916, -89.1307909, -89.1306634,
-89.1304721, -89.130477, -89.1303348, -89.130097, -89.1295845,
-89.1295109, -89.1294545, -89.129251, -89.1291161, -89.1288979,
-89.1287237, -89.1284516, -89.1282309, -89.1277257, -89.1273996,
-89.1272328, -89.1269925, -89.1263402, -89.1260288, -89.1252956,
-89.1240131, -89.1232873, -89.1221961, -89.1218062, -89.1214531,
-89.121214, -89.1210841, -89.1210007, -89.1210914, -89.1210949180037,
-89.1209274602443, -89.1206329, -89.1204588, -89.1202307,
-89.1200321, -89.1199659, -89.1196961, -89.1195122, -89.119245,
-89.1192354474582, -89.119431506055, -89.1194463522383, -89.119473,
-89.1196422, -89.119625, -89.1196397, -89.1195932, -89.119755,
-89.1197231, -89.1196618, -89.1195417, -89.1194068, -89.1192376,
-89.119088, -89.1190046, -89.1190316, -89.1191591, -89.1191787,
-89.119343, -89.1193896, -89.1193823, -89.1192597, -89.1191297,
-89.1189899, -89.118909, -89.1189164, -89.1188281, -89.11873,
-89.1185068, -89.1185338, -89.1182347, -89.1180655, -89.1178276,
-89.1175579, -89.1174402, -89.1173838, -89.1175603, -89.1174892,
-89.1175382, -89.1173494, -89.1171287, -89.1167952, -89.1164912,
-89.1160547, -89.1157751, -89.1155765, -89.1152283, -89.1144902,
-89.1138968, -89.1135314, -89.1133279, -89.1133132, -89.113041,
-89.1129036, -89.1127884, -89.1127271, -89.1126167, -89.1125898,
-89.1123617, -89.1122489, -89.1121435, -89.1119105, -89.1118443,
-89.1117928, -89.1115697, -89.1113539, -89.1113146, -89.111322,
-89.1110621, -89.1108487, -89.1106378, -89.1103632, -89.1103169,
-89.1101844, -89.1100226, -89.1099221, -89.1097896, -89.1095616,
-89.1093483, -89.1090785, -89.1087279, -89.1081908, -89.1072051,
-89.1067171, -89.1059667, -89.1054689, -89.1048191, -89.1042232,
-89.1036715, -89.1031271, -89.102595, -89.1020776, -89.1016681,
-89.101391, -89.1011457, -89.1009569, -89.1006798, -89.1004297,
-89.1001698, -89.0997946, -89.0993679, -89.0989069, -89.0986028,
-89.0982301, -89.0978623, -89.0976146, -89.097161, -89.0971095,
-89.0972321, -89.0972027, -89.0970727, -89.0967416, -89.096516,
-89.0965774, -89.0966117, -89.0965847, -89.0964744, -89.0962193,
-89.0958834, -89.0956848, -89.0955695, -89.0952703, -89.0950962,
-89.0952679, -89.0952409, -89.0951477, -89.0949638, -89.0944587,
-89.093701, -89.092671, -89.092416, -89.0921414, -89.0919231,
-89.0919071586303, -89.0916000328528, -89.0914524172272,
-89.0914278, -89.0913542, -89.0912537, -89.0911433, -89.0910428,
-89.0907069, -89.0903317, -89.0899835, -89.0898756, -89.0898437,
-89.0896769, -89.0894832, -89.0892699, -89.0891277, -89.0889413,
-89.0889588823438, -89.0886337983665, -89.088625, -89.0884803,
-89.0883013, -89.0876613, -89.0873106, -89.0872763, -89.0874136,
-89.0874038, -89.0873204, -89.0871806, -89.0872321, -89.0870801,
-89.0868864, -89.0868251, -89.0868888, -89.0868815, -89.0867662,
-89.0866044, -89.0863959, -89.0863175, -89.0861826, -89.0858859,
-89.0856186, -89.085241, -89.0847775, -89.0843288, -89.0838678,
-89.0833724, -89.0829825, -89.0826515, -89.0823891, -89.0821243,
-89.0816534, -89.0812807, -89.0812495546557, -89.081176429219,
-89.0807610968115, -89.0804641749576, -89.0802312, -89.079959,
-89.0796672, -89.0791964, -89.0788114, -89.0784043, -89.0781518,
-89.0781419723465, -89.0779918294057, -89.0777800959991,
-89.0775877565536, -89.0775878, -89.0776343, -89.0775828,
-89.0775019, -89.0774063, -89.0774038, -89.077291, -89.0771831,
-89.0772003, -89.0772935, -89.0772618923628, -89.0769412280466,
-89.0764686956216, -89.0757032287475, -89.0754180953466,
-89.0753228256263, -89.0753734, -89.0752214, -89.0749604298122,
-89.0748154285407, -89.0741882283673, -89.0738462272332,
-89.0736344292665, -89.0732229, -89.0732229, -89.073191,
-89.0730194, -89.0730365, -89.0729605, -89.0728036, -89.0724627,
-89.0719218888718, -89.071801694428, -89.0713294265805, -89.0710920039087,
-89.0710895, -89.0710779968785, -89.07095408144, -89.0709056,
-89.0707756, -89.0706622268491, -89.0706568633484, -89.0706285,
-89.0704593, -89.0703195, -89.0703367694809, -89.069928293888,
-89.0698831534232, -89.0697751, -89.0694564, -89.0691842,
-89.0688629, -89.0687796, -89.0683897, -89.0680709, -89.0680013570839,
-89.067997892298, -89.0677882637198, -89.0676761, -89.067561359892,
-89.0675172265379, -89.0673833838859, -89.0673573, -89.0672568,
-89.067193, -89.0670827, -89.0670459, -89.0669331, -89.0667859,
-89.0665285, -89.0663693110885, -89.0661229183565, -89.0659105,
-89.0656457, -89.0653563, -89.064991, -89.064952050887, -89.0647966924694,
-89.0644952923785, -89.064153092271, -89.0638495611041, -89.0637036,
-89.0634387, -89.0634000885165, -89.0630534252976, -89.0627605777715,
-89.0628012, -89.0626663, -89.0624996, -89.0622323, -89.0620361,
-89.061992, -89.0621023, -89.061987, -89.0619576, -89.061808,
-89.0615358, -89.0613299, -89.0610871, -89.0609844381885,
-89.0609680248519, -89.0609669394726, -89.0610233, -89.0610528,
-89.061043, -89.0609866, -89.0608027, -89.0606464737858,
-89.0602430247656, -89.0595994912722, -89.0592166255429,
-89.0588092243953, -89.0585188799812, -89.058299, -89.0581028,
-89.0580114013565, -89.0574570240425, -89.0571039710758,
-89.0570827, -89.0567615, -89.0565271574525, -89.0564304893949,
-89.0561208893223, -89.0558764903022, -89.0557134902679,
-89.0552572901545, -89.0549476900753, -89.0546788900027,
-89.0544256858303, -89.0542995, -89.0538496810342, -89.0536116886658,
-89.0525606894323, -89.0522918893589, -89.0520068226122,
-89.0517378902429, -89.051289823452, -89.0509802889928, -89.0507358222635,
-89.0504344211418, -89.0501574221051, -89.0498234220158,
-89.049554488605, -89.0493426218732, -89.0491064218091, -89.0488618884131,
-89.0486908883631, -89.0484790216447, -89.0481612882279,
-89.0479576204695, -89.0471672879701, -89.0469718222951,
-89.0465480878024, -89.0463688867174, -89.046157021039, -89.0451995876601,
-89.044996, -89.0443143, -89.0440865122353, -89.0438758204292,
-89.043557888049, -89.0433134869431, -89.0426292200764, -89.0421484855579,
-89.0408692862235, -89.0405842194693, -89.0400628859701,
-89.0398754192467, -89.0396310191666, -89.0395857631664,
-89.0391696, -89.0384634, -89.0378675, -89.0369063, -89.0362466,
-89.0358665, -89.0356851, -89.0351701, -89.0348464, -89.034687,
-89.0346012, -89.0346772, -89.0347107803191, -89.0346532176267,
-89.0345588391726, -89.0344786, -89.0344541, -89.0345497,
-89.0345571, -89.034486, -89.0343756, -89.0342113, -89.0340519,
-89.0340143916965, -89.0339768174697, -89.0338823208357,
-89.0338558, -89.0337572747094, -89.0335938840187, -89.0333494849895,
-89.0328051172605, -89.0327449, -89.0321638, -89.0318548,
-89.0312393, -89.0305748, -89.0303157691282, -89.0301962164217,
-89.0297236152507, -89.0294710162182, -89.0294077564837,
-89.0292113, -89.0292243816084, -89.0290636827465, -89.0290168447591,
-89.0288975, -89.0287810610661, -89.0287458816171, -89.0285830159562,
-89.0284442825994, -89.0284156529032, -89.0283899, -89.0282305,
-89.0279583, -89.0277793, -89.0277794886465, -89.0277760824183,
-89.0274828823332, -89.0272947344094, -89.0272128, -89.0270755,
-89.0269014, -89.0265164, -89.0259107, -89.0254650872537,
-89.0253804151355, -89.0253429835696, -89.0253247, -89.0249568,
-89.0246748, -89.0245836941953, -89.0244006198502, -89.0243021,
-89.0242243814906, -89.0241256147651, -89.0238728824041,
-89.0235144156315, -89.0230418144629, -89.0226426143512,
-89.0223526344399, -89.0223404, -89.0223062405071, -89.0219058224502,
-89.0218941, -89.0216587, -89.0216341, -89.0215287, -89.0214464521381,
-89.0213874817437, -89.0213033776112, -89.0213178, -89.0211511,
-89.0210167632037, -89.0210124139634, -89.0207924139075,
-89.0204908804881, -89.0201486793439, -89.0199168661937,
-89.0198661, -89.0198589868983, -89.0197900792395, -89.0193176134844,
-89.01882848106, -89.0186736810224, -89.0185268799497, -89.0184536132655,
-89.018449231886, -89.0184169, -89.018408857057, -89.0182826132155,
-89.0180462131503, -89.0178260797644, -89.0177446130818,
-89.0177192513424, -89.0177573, -89.0176494, -89.0175243,
-89.0175103144149, -89.0172802129524, -89.0171553202964,
-89.0170952, -89.017002, -89.016954216707, -89.0169296128664,
-89.0168070128893, -89.0166358138975, -89.0163342794456,
-89.0160652793813, -89.0158044793228, -89.0154618792706,
-89.0152498781871, -89.0149074114701, -89.014662811424, -89.0144426124154,
-89.0142064500463, -89.0140937, -89.0137283, -89.0133679,
-89.0130732442352, -89.0126822119611, -89.0120790774124,
-89.0119926607747, -89.0114527, -89.0110126204235, -89.0110034114844,
-89.0107588780834, -89.010581081535, -89.0102021, -89.0098564,
-89.009842257112, -89.0094470776771, -89.0088358108484, -89.0084852097165,
-89.008314, -89.008314, -89.0082428, -89.007853, -89.0074238,
-89.0073089325623, -89.0073030771538, -89.0069280780994,
-89.0064228758749, -89.0059338767731, -89.0056976100321,
-89.0055428766446, -89.0054206755563, -89.0052984098962,
-89.0051516765278, -89.0049642764793, -89.0047440764275,
-89.0045158763648, -89.0036844750993, -89.0035258730455,
-89.0033189, -89.003314, -89.0030271, -89.0027058, -89.002571,
-89.0024999, -89.0025030109682, -89.002104519807, -89.0020018,
-89.0016654, -89.0011852, -89.0007487, -89.0003098, -88.9995643,
-88.9984731, -88.9979311, -88.9978222360102, -88.9973752077444,
-88.9971916905022, -88.9969895, -88.9965481, -88.9961101854911,
-88.9955870245884, -88.9954275, -88.9948341, -88.9942995,
-88.9937723, -88.9933113, -88.9927939, -88.9927792188792,
-88.9917302063113, -88.9889440722551, -88.9862148038139,
-88.982597403893, -88.9822470704736, -88.981717604725, -88.9807890691111,
-88.9803818700775, -88.9799338699656, -88.9790374707676,
-88.9775138036827, -88.9765932024271, -88.9759006689158,
-88.9747436019369, -88.974262801805, -88.9735376682912, -88.9719976678786,
-88.9714760677375, -88.9695646005501, -88.9661255985688,
-88.963892665655, -88.9624908652599, -88.960795663728, -88.9598177978466,
-88.9592390643652, -88.9592331684753, -88.9591942, -88.9588852,
-88.9583678, -88.9580081241565, -88.957601063993, -88.9572914639086,
-88.9556614644776, -88.9538438618706, -88.95197739572, -88.9511948621786,
-88.9502871751257, -88.9502561, -88.9501555, -88.9499397,
-88.9500551864452, -88.9499234618492, -88.9487743948966,
-88.9479796912414, -88.9476445, -88.9475116225945, -88.945332686448,
-88.9451531, -88.94467, -88.9441232, -88.9438542189297, -88.9433622602565,
-88.9429057934745, -88.9419648811487, -88.9416808, -88.9413645,
-88.9411953, -88.9412158422971, -88.9391685199177, -88.9391723,
-88.9391477, -88.9390153, -88.9388633, -88.9387408399627,
-88.938292058937, -88.9374016997506, -88.9374386, -88.9373724,
-88.937365, -88.9374655, -88.937571, -88.9376347, -88.9377818878665,
-88.9378436578413, -88.9380311933081, -88.9382267912874,
-88.9383000590282, -88.9383164590465, -88.9382511923722,
-88.9380963923379, -88.9380152541571, -88.9379983, -88.9379094,
-88.9378808, -88.9378511, -88.9377859, -88.937717, -88.9377148205967,
-88.937672458929, -88.9374523922196, -88.9368001910156, -88.9363762596486,
-88.9345258580405, -88.9336046577797, -88.9325122585154,
-88.93203125629, -88.9299851910544, -88.9296264565732, -88.9266427890962,
-88.9242131874195, -88.9228597881006, -88.922625791818, -88.9225122,
-88.9224755059496, -88.9212944553881, -88.9209927876044,
-88.9205116316691, -88.9205063, -88.9205012186744, -88.9197778539788,
-88.9183998525756, -88.9176498534116, -88.9174733409322,
-88.917473, -88.9173406, -88.9172106, -88.9171970398854,
-88.9156032528917, -88.9140539858224, -88.9126741283662,
-88.912603, -88.9123382, -88.9122771880578, -88.912105185316,
-88.9114200518308, -88.9113687674363, -88.9114456, -88.9116712,
-88.9118281, -88.9121052, -88.9123185, -88.9125932, -88.912809,
-88.9130444, -88.9131026, -88.9132798, -88.9134613, -88.9136206,
-88.9137577229791, -88.9137517858813, -88.913865984864, -88.9144093063197,
-88.9144936, -88.9144372, -88.9144716, -88.9146791, -88.9148026,
-88.9148762, -88.9151484, -88.9156118, -88.9161562, -88.9166098,
-88.9169581, -88.9173676, -88.9176496, -88.9178261, -88.9180027,
-88.9181915, -88.9183043, -88.9183411, -88.9183092, -88.9181694,
-88.917802561889, -88.917592053636, -88.9171027868571, -88.9155453864569,
-88.9144119861498, -88.9135638526005, -88.9129195857946,
-88.9124678408622, -88.9124779, -88.9125515, -88.9128163,
-88.9130174, -88.9133558, -88.9136991, -88.9139738, -88.9140743,
-88.9141994, -88.9142263, -88.9141896, -88.9141528, -88.9138044021266,
-88.9138163860969, -88.9138163861085, -88.9136369850341,
-88.9133187859945, -88.9118917866637, -88.9094209849733,
-88.9087930504399, -88.9080641849032, -88.9081793, -88.9086967,
-88.9091013, -88.909555, -88.9100012, -88.9102563, -88.9104966,
-88.910602, -88.9106609, -88.9108227, -88.9109551, -88.9110704,
-88.9111415, -88.9111317, -88.9110434, -88.9109208, -88.9104353,
-88.9101925, -88.9098934, -88.9098250005908, -88.9094037862361,
-88.9074301847036, -88.9064434511074, -88.9048968982764,
-88.9050209, -88.905119, -88.9051631, -88.9051803, -88.905146,
-88.9050479, -88.9048394, -88.9048198562922, -88.9048198508054,
-88.9047220507879, -88.9038003849324, -88.9029114503196,
-88.9018021833624, -88.9007255831066, -88.8999424485405,
-88.8993143827787, -88.8991580955258, -88.8991774, -88.8992387,
-88.8993539, -88.8993319, -88.8993784, -88.8994667, -88.8995207,
-88.8995648, -88.8995575, -88.8994692, -88.8993147, -88.8993098,
-88.8994196, -88.8994594, -88.8996286, -88.8998713, -88.9000724,
-88.9003029, -88.9005457, -88.9008571, -88.9010876, -88.9014088,
-88.9018968, -88.9022548, -88.9025614, -88.9027257, -88.9027772,
-88.9031106, -88.9033068, -88.9035569, -88.9037433, -88.9039517,
-88.9041381, -88.9041872, -88.904295, -88.9044029, -88.9046285,
-88.9047977, -88.9049645, -88.9056094, -88.9062126, -88.9067497,
-88.9070635, -88.9072671, -88.9076987, -88.9080248, -88.9084098,
-88.9088095, -88.9092239, -88.909474, -88.9096408, -88.909783,
-88.9099841, -88.9101557, -88.9103078, -88.9107026, -88.9108914,
-88.9110287, -88.9111243, -88.9112469, -88.911426, -88.9116467,
-88.9118845, -88.9120782, -88.9122769, -88.9124363, -88.9126373,
-88.912733, -88.9128458, -88.9129488, -88.9130395, -88.9131744,
-88.9133436, -88.913552, -88.9137089, -88.914062, -88.9143906,
-88.9145476, -88.914729, -88.9148713, -88.9149816, -88.9151434,
-88.9153126, -88.9155382, -88.9157222, -88.9159061, -88.9160924,
-88.9163597, -88.9166147, -88.9169531, -88.9173455, -88.9177231,
-88.9180762, -88.9182038, -88.9185323, -88.9188732, -88.9191307,
-88.9194446, -88.9197069, -88.9200723, -88.920293, -88.9206486,
-88.9209649, -88.9212297, -88.9214136, -88.9216221, -88.9218796,
-88.9221836, -88.9227084, -88.923243, -88.924008, -88.9247314,
-88.9253126, -88.9256485, -88.9261488, -88.9266613, -88.9268109,
-88.9270438, -88.9275563, -88.928113, -88.9286941, -88.9291257,
-88.9293268, -88.929523, -88.929675, -88.9297927, -88.9303861,
-88.9311414, -88.9321125, -88.9330467, -88.9337284, -88.9343832,
-88.9348908, -88.9354989, -88.9363057, -88.9371247, -88.937929,
-88.9384194, -88.9391134, -88.9398491, -88.9402635, -88.94057,
-88.9411536, -88.9419236, -88.9427917, -88.9435739, -88.9443316,
-88.9451065, -88.945852, -88.9465459, -88.947208, -88.9477377,
-88.9485444, -88.9493022, -88.9497803, -88.9502119, -88.9505307,
-88.9509696, -88.9514895, -88.9518941, -88.9523281, -88.9526739,
-88.9531104, -88.9540054, -88.9547337, -88.9550084, -88.9552634,
-88.9555748, -88.9556435, -88.9558102, -88.9558887, -88.9559819,
-88.9561511, -88.9562516, -88.9564674, -88.956617, -88.9566783,
-88.9567739, -88.9569333, -88.9569873, -88.9571099, -88.9572129,
-88.9573674, -88.9574458, -88.9574434, -88.9573379, -88.9572766,
-88.9571614, -88.957105, -88.9571319, -88.9570903, -88.9571025,
-88.9571933, -88.9572374, -88.9573796, -88.9574949, -88.9577646,
-88.9583556, -88.9588975, -88.9592555, -88.9595841, -88.9599372,
-88.9602634, -88.9605061, -88.960744, -88.9610481, -88.9616636,
-88.9623673, -88.9629632, -88.9634218, -88.964025, -88.9647459,
-88.9654693, -88.9660554, -88.9664306, -88.9669259, -88.9673943,
-88.9678038, -88.9682967, -88.9687601, -88.9691083, -88.9695301,
-88.9697435, -88.9701015, -88.9704595, -88.9706655, -88.9706557,
-88.9706949, -88.9708715, -88.9710088, -88.9710456, -88.9711387,
-88.9714355, -88.9715948, -88.9718867, -88.9722692, -88.9727694,
-88.9734413, -88.9740568, -88.975045, -88.9760995, -88.9764256,
-88.9768253, -88.977149, -88.9775291, -88.9778234, -88.9781789,
-88.9786179, -88.9791009, -88.9798366, -88.9804153, -88.9808518,
-88.9814771, -88.9822152, -88.9829165, -88.9835418, -88.9840543,
-88.9843706, -88.9847949, -88.9852093, -88.9855894, -88.9857512,
-88.9862564, -88.9867051, -88.9869503, -88.9871833, -88.9876664,
-88.9878797, -88.9883309, -88.9887625, -88.9892088, -88.9896453,
-88.9899739, -88.9905256, -88.9908689, -88.9911803, -88.9914697,
-88.9918988, -88.9920967, -88.9922022735964, -88.9928716003392,
-88.992941, -88.9931887, -88.9936276, -88.9942652, -88.9945643,
-88.9949027, -88.9952411, -88.9954667, -88.9960185, -88.9963716,
-88.9966879, -88.9970214, -88.9972102, -88.9974719979568,
-88.9980256783084, -88.9983466443135, -88.9983406, -88.9983791,
-88.9988152, -88.9992149, -88.9999503, -89.0005121, -89.0008908,
-89.0011802, -89.0016215, -89.0023155, -89.002521, -89.0029653,
-89.0034582, -89.0038408, -89.0042331, -89.0045592, -89.0047039,
-89.004753, -89.0048192, -89.0048854, -89.0048903, -89.0048584,
-89.0049099, -89.0050104, -89.0050963, -89.0051232, -89.0051061,
-89.0050766, -89.0051232, -89.0053439, -89.0054126, -89.0054371,
-89.0054518, -89.0054813, -89.0054788, -89.0054813, -89.0054028,
-89.0053317, -89.005214, -89.0050742, -89.0044489, -89.0040001,
-89.00375, -89.0033797, -89.0029335, -89.0027373, -89.0024994,
-89.0023327, -89.0021945692375, -89.0017970817905, -89.0010548805366,
-89.0005328803911, -89.0003982509879, -89.000241, -88.9998609,
-88.9996696, -88.9993533, -88.9991596, -88.9987868, -88.9985833,
-88.9984141, -88.998213, -88.9979997, -88.9977152, -88.9975485,
-88.9974725, -88.9974578, -88.9974774, -88.9975313, -88.9976564,
-88.9977692, -88.9978991, -88.9980046, -88.9981468, -88.9983136,
-88.9984711017391, -88.9986694094817, -88.9986870776864,
-88.9988284792978, -88.9990296, -88.9994612, -88.9999859,
-89.0005892, -89.0012905, -89.0014818, -89.0016436, -89.0020311,
-89.0023817, -89.0025951, -89.0028305, -89.0030364, -89.0032204,
-89.0034107, -89.0034312, -89.0036495, -89.0037672, -89.0038236,
-89.0038726, -89.0039094, -89.0038679268285, -89.0038676158385,
-89.003793482569, -89.0036572974237, -89.0036421, -89.0036366431468,
-89.0036298159477, -89.0034988826165, -89.0032538159237,
-89.0031150825669, -89.0028050835324, -89.0020708822909,
-89.0016872821962, -89.0013610154376, -89.0010592153607,
-89.0008798153097, -89.0004718152109, -89.0000936151043,
-88.9991398804862, -88.9979334812338, -88.9960338807484,
-88.9945664126582, -88.9928624132612, -88.9920390130556,
-88.9903186126002, -88.9894624123721, -88.988378012098, -88.9872692785088,
-88.9865063198953, -88.986396, -88.9863014007596, -88.9861852116347,
-88.9856310115093, -88.9850682780397, -88.983641277671, -88.981276677065,
-88.9804284768425, -88.9791482098349, -88.9786752763828,
-88.9780364646981, -88.9779679, -88.9779216678905, -88.9775418761193,
-88.9763594758192, -88.9746297160039, -88.9745226, -88.9740763,
-88.973706, -88.9735171300143, -88.9730158082862, -88.9727757028287,
-88.9726982, -88.972502, -88.9723034, -88.9720533, -88.9718179,
-88.9715923, -88.97145, -88.9714818055478, -88.9714416745098,
-88.9705036742531, -88.9703573341082, -88.970224, -88.9700695,
-88.9700506073542, -88.9691369210508, -88.9691229, -88.9689954,
-88.9687993, -88.9687326970782, -88.9683750747361, -88.967976314004,
-88.9678944, -88.9674481, -88.9673814037518, -88.9661812075048,
-88.9657610550097, -88.9657389, -88.9655305, -88.9653343,
-88.9652150496001, -88.9651370738963, -88.9649251604863,
-88.9648071, -88.9647213, -88.964584, -88.9644491, -88.9642652,
-88.9640322, -88.9638312, -88.9635132, -88.9633585134825,
-88.9630088057667, -88.9626174056821, -88.9620300711607,
-88.9598604039335, -88.9590122047676, -88.9584086035645,
-88.9577640711029, -88.9572420043099, -88.9564836041491,
-88.9556188706406, -88.9554150705879, -88.9547134037188,
-88.9543544702843, -88.9540770702156, -88.9536919129497,
-88.953653, -88.9533343, -88.95304, -88.952958808111, -88.9528944032993,
-88.9526334032398, -88.9503330037156, -88.9488400689597,
-88.9481956031782, -88.9474696019948, -88.9467354018855,
-88.9464334695193, -88.9452260691879, -88.9431373998754,
-88.9413097993658, -88.9377932661007, -88.9371241992515,
-88.9356145988645, -88.9341132651327, -88.9334687982977,
-88.9325792647448, -88.9321793979759, -88.9305964642106,
-88.9292581971988, -88.9281018156957, -88.9279567, -88.9278266514295,
-88.9261164630845, -88.9256186619205, -88.9242558626053,
-88.9240437958925, -88.9239966364478, -88.923972, -88.9238396,
-88.9238128234684, -88.9235947947818, -88.9232927957547,
-88.9229173966975, -88.9228894585384, -88.9228808, -88.9229911,
-88.9230745, -88.9232412, -88.9234374, -88.9236728, -88.9239131,
-88.9241951, -88.9244158, -88.9246586, -88.9249259, -88.9252226,
-88.9255021, -88.9258675, -88.9263653, -88.9267871, -88.9272309,
-88.9276723, -88.9283074, -88.9288322, -88.9292025, -88.9295801,
-88.9300068, -88.9305389, -88.9309901, -88.9312794, -88.9315198,
-88.9317282, -88.931966, -88.9322971, -88.93279, -88.9333147,
-88.9338738, -88.9343447, -88.9347542, -88.935225, -88.9355658,
-88.9359067, -88.9363309, -88.9367429, -88.9371131, -88.9374393,
-88.9377924, -88.9380842, -88.9383294, -88.9385501, -88.9391019,
-88.9395519, -88.9399472, -88.9402038, -88.9402905, -88.9402975,
-88.9402281, -88.9402177, -88.9402801, -88.9407552, -88.941213,
-88.9417193, -88.9421979, -88.9425689, -88.943044, -88.9435989,
-88.9443202, -88.9451525, -88.9459085, -88.9463767, -88.9466714,
-88.9471431, -88.9474517, -88.9477257, -88.9479476, -88.9483152,
-88.9486551, -88.9489603, -88.949307, -88.9495186, -88.9497787,
-88.9500353, -88.9504757, -88.9507601, -88.950878, -88.9510999,
-88.9514225, -88.9517172, -88.9520606, -88.9522998, -88.9524351,
-88.952494, -88.9525634, -88.9527611, -88.9530142, -88.9534408,
-88.9536974, -88.9538118, -88.9538049, -88.9535691, -88.9535343086861,
-88.9536870031041, -88.9537930708425, -88.9538910042018,
-88.9540050709169, -88.9539480042426, -88.953393270777, -88.953181204066,
-88.9529854707082, -88.952855004078, -88.9525696040261, -88.951533470464,
-88.949812003382, -88.9485800697372, -88.9480334029357, -88.9471440693996,
-88.9466382026199, -88.9445902687732, -88.9443700020446,
-88.9441984686577, -88.9441170019643, -88.9432846026833,
-88.9428604014979, -88.9426156014267, -88.9423136680138,
-88.9420852012919, -88.9416282012171, -88.9412610678067,
-88.9404124675848, -88.9397432674072, -88.9391558005981,
-88.9383072670854, -88.9370750001538, -88.9364466666812,
-88.9344963984729, -88.9324152656775, -88.9309464653047,
-88.9281226656242, -88.9250947971449, -88.9217483952559,
-88.9188262622324, -88.9170060617697, -88.9153734603613,
-88.9143856611715, -88.9138142610272, -88.912989794141, -88.9109570602994,
-88.908067259569, -88.9067609925744, -88.9053974578854, -88.9039604585855,
-88.9016254580083, -88.8992412574243, -88.8985880583023,
-88.8968164567703, -88.8947511894961, -88.8939185892447,
-88.8933392546656, -88.8931453462904, -88.8927547, -88.8925300447676,
-88.892090455302, -88.8915844551336, -88.8913151883724, -88.891225388334,
-88.8904668546731, -88.8904622417346, -88.89046, -88.8902725,
-88.8898910125069, -88.8897252542516, -88.8895784541923,
-88.8893009884735, -88.8883214527594, -88.8874725858389,
-88.8864030532462, -88.8842802526692, -88.8829575856618,
-88.8815694519752, -88.8813080519147, -88.8812507852428,
-88.8812892360558, -88.8820269, -88.8822471, -88.8822504156058,
-88.8822539856699, -88.8823109846591, -88.8823107857324,
-88.8821554523878, -88.8817713856687, -88.8811994522175,
-88.8805705854063, -88.8801297863231, -88.8791743860571,
-88.8778516523673, -88.8763980509545, -88.8750915849704,
-88.8746778504853, -88.8735190501877, -88.8728337833492,
-88.8721156498481, -88.8717323831059, -88.8710230486341,
-88.870729382957, -88.8700359828068, -88.8693913826633, -88.8681837823723,
-88.8679062489777, -88.8666657809541, -88.8646579804043,
-88.8638826479047, -88.8625849808984, -88.8614586472741,
-88.8596547801461, -88.8585121808859, -88.8571652461461,
-88.8563735792607, -88.8556632446853, -88.854700045467, -88.8539816452682,
-88.8535735784784, -88.8533449794597, -88.853140845036, -88.8522187771436,
-88.8520230448292, -88.8519742448499, -88.852031644915, -88.852203378342,
-88.8522034450387, -88.8521545783777, -88.8519260439624,
-88.8510855781618, -88.8505713780592, -88.8502041779836,
-88.8496899768269, -88.8495185788841, -88.8495349778683,
-88.8495944669424, -88.8498957, -88.8505082, -88.8508021,
-88.850895, -88.85099, -88.8509908613341, -88.8509968450475,
-88.8510623784361, -88.8509482451067, -88.8507850461247,
-88.8505647783718, -88.8498954448865, -88.8491771780603,
-88.8485240445741, -88.8476671766726, -88.8471690442542,
-88.8469487775414, -88.8466711774858, -88.846116244074, -88.8458633773586,
-88.8451857771982, -88.8429324432974, -88.8413567762379,
-88.8403361759701, -88.8396094424537, -88.838768575593, -88.8383684421589,
-88.8374866429664, -88.8368743751095, -88.835959841566, -88.8347351735653,
-88.8324734407643, -88.8319753739808, -88.8307259747133,
-88.8297706401098, -88.8290031732491, -88.8281047729932,
-88.8269532393384, -88.8257935723294, -88.8246501719862,
-88.8243398385407, -88.823033038138, -88.8225756379813, -88.8220121711019,
-88.8214240375573, -88.8211546364277, -88.820950437409, -88.8207462373543,
-88.8205584383564, -88.8202889706301, -88.8200847716379,
-88.8197908372023, -88.8194477704516, -88.8189659703264,
-88.8180023701111, -88.8174714366466, -88.8169078364946,
-88.8161565696173, -88.8157807695306, -88.8155277694809,
-88.8152989694237, -88.8150375693523, -88.8146047692298,
-88.8126445686598, -88.812007435161, -88.8116889673803, -88.8111743683108,
-88.8106516348431, -88.8103739680992, -88.8100881690544,
-88.8096143678534, -88.8093040344269, -88.8083156341556,
-88.8078174329596, -88.8075887683099, -88.8069027670643,
-88.8067237831132, -88.8063409, -88.8060024456306, -88.805857166772,
-88.8054161666311, -88.8051057675671, -88.8050665177846,
-88.8042386, -88.8038452, -88.8036481, -88.8033456369586,
-88.8033169660257, -88.8028513648231, -88.8018877655278,
-88.8014794320395, -88.8011772308564, -88.8011725331584,
-88.8011704, -88.8008682, -88.8007904757909, -88.8006056316212,
-88.8004096315591, -88.8003939618508, -88.8003099, -88.8001767,
-88.8002028, -88.8002022, -88.799995, -88.7997589222805,
-88.7997477648283, -88.7991760313387, -88.7979426320277,
-88.7974526297933, -88.7972811641054, -88.7969136316747,
-88.7966522305475, -88.7960968303746, -88.795810964649, -88.794994363294,
-88.7945125631222, -88.7936059628277, -88.793197562706, -88.7928708292861,
-88.7925194302761, -88.7922498302037, -88.7919232290631,
-88.7915638299898, -88.7911636288073, -88.7903877619048,
-88.7901672285001, -88.7900937618, -88.7900938224629, -88.7900869,
-88.7900952, -88.7900649973834, -88.7899877606633, -88.7891463615121,
-88.7888768281073, -88.7884765613181, -88.7876271610404,
-88.787316826559, -88.787112560871, -88.7866469607433, -88.786508228408,
-88.786287760615, -88.7861161605613, -88.7859282271825, -88.7856177594251,
-88.7854054270779, -88.7852255603624, -88.7848662269133,
-88.7845884257935, -88.7840819610898, -88.7837552266291,
-88.7835674255328, -88.7832897598155, -88.7830856264035,
-88.7830846351188, -88.7830788, -88.7830543, -88.783078509272,
-88.7829877596409, -88.7825793595209, -88.7823915594613,
-88.7817791592267, -88.7814851591244, -88.7812238257072,
-88.780937958954, -88.7801046253912, -88.7786507572729, -88.7774009569051,
-88.7761430232197, -88.7758324241855, -88.7757098241693,
-88.7755217574971, -88.775451569002, -88.7748738, -88.7744317,
-88.774219, -88.7739136, -88.7735604, -88.7735488860987,
-88.7734548236346, -88.7729828297299, -88.7727517, -88.772663815338,
-88.7726137576887, -88.7721240230986, -88.7718531491589,
-88.771382, -88.7706832, -88.7694333, -88.7681806468208,
-88.7679416218871, -88.7678435551952, -88.7678190218609,
-88.7678435552118, -88.7677780229057, -88.7672716227687,
-88.766610021518, -88.7658424212572, -88.7655974211692, -88.7650748209681,
-88.7650722512069, -88.765068, -88.7650273, -88.7655671,
-88.7654342835324, -88.765280153141, -88.7645207539177, -88.7643738205241,
-88.7641943548113, -88.7638677536564, -88.7631816201132,
-88.7627651533131, -88.7624301532181, -88.7622014198134,
-88.7617606196616, -88.7615237529327, -88.761351952913, -88.7611230195266,
-88.7608045527742, -88.7607471527697, -88.7607551528013,
-88.7606161527892, -88.7604609527546, -88.7602565527024,
-88.759733820252, -88.7596838825432, -88.7592718, -88.7589258,
-88.7586833, -88.7586992162253, -88.7586723521748, -88.7586479521597,
-88.7587870188261, -88.7587948074294, -88.7586504, -88.7583336,
-88.758265, -88.7583208, -88.7580554, -88.7579369, -88.757986,
-88.7580777, -88.7581993, -88.7581563, -88.7575139, -88.7574018,
-88.7564546, -88.7562698, -88.7560944, -88.7558922, -88.7554754,
-88.7551038346836, -88.7550455185967, -88.7546019, -88.7544108,
-88.7537173, -88.7532249, -88.7531173, -88.7532989, -88.7538802,
-88.7542124, -88.754271, -88.7541601, -88.7537965968886,
-88.7537922189009, -88.7530160176473, -88.7520357517349,
-88.7515537516012, -88.7510225504172, -88.7507448170041,
-88.7505324169394, -88.7505382278308, -88.7505256, -88.7505747,
-88.7505381733952, -88.7503774168691, -88.7501812168178,
-88.7500827501179, -88.7498785500517, -88.7495764166393,
-88.749290616562, -88.7489721498138, -88.7479190151923, -88.7473476160985,
-88.7471026160371, -88.7467514159288, -88.7462530157643,
-88.7459426146286, -88.7454282155333, -88.7452485488121,
-88.7451178143993, -88.7447748153477, -88.7442441485465,
-88.7437868140529, -88.7437133484144, -88.7436971484285,
-88.7436481484193, -88.7430275482537, -88.7423497480646,
-88.7420639479865, -88.7418596135601, -88.7414433478492,
-88.7412800134313, -88.7410676144133, -88.7407655476576,
-88.7406347476157, -88.7400790140669, -88.7398911462973,
-88.7393029481951, -88.7387965470073, -88.7382248135217,
-88.7377022133764, -88.7363463463224, -88.7357909461661,
-88.7349661459367, -88.7343943457811, -88.7335694132683,
-88.7332998121452, -88.7330139443462, -88.7328833453484,
-88.7325975452736, -88.7321973451751, -88.7319359461453,
-88.7310540115448, -88.7305394114111, -88.7298697445528,
-88.7296165444872, -88.72938794443, -88.7287755453477, -88.7283510108991,
-88.7281877441921, -88.7280734108235, -88.7279181441039,
-88.7279123375311, -88.7279113, -88.7278703, -88.7278703,
-88.7279682, -88.7279926, -88.7279604315295, -88.7277786116578,
-88.7276805439126, -88.7273783427769, -88.7270515437211,
-88.725826343379, -88.7241846096091, -88.7234495427414, -88.7228370102875,
-88.7224368091357, -88.721938542322, -88.7215791432686, -88.7206315419504,
-88.7201577418209, -88.719716608364, -88.719373541609, -88.7188916081478,
-88.718336208003, -88.7177563411924, -88.717544007811, -88.7171929400301,
-88.7170295399855, -88.7167599409457, -88.7165476075511,
-88.7161553407575, -88.7158367406651, -88.7155673406077,
-88.7154121405939, -88.7153469395396, -88.7148812071309,
-88.7147670071156, -88.7147262071379, -88.7146283404544,
-88.7145138060515, -88.7142769403576, -88.7137622058296,
-88.7130108066586, -88.7119406063675, -88.7113852062145,
-88.7111973395032, -88.7109523394633, -88.7108298061188,
-88.7108702046211, -88.7110601, -88.7110614826299, -88.7110669395942,
-88.7110751396009, -88.7110016062491, -88.7108791405888,
-88.7104460060744, -88.7102336059839, -88.7101355392845,
-88.7099802059032, -88.7093104057091, -88.7090980066943,
-88.7089836056207, -88.7088447378687, -88.708705805525, -88.708542405468,
-88.7081665386779, -88.7079787386141, -88.7078234041928,
-88.7074885384753, -88.7074068061634, -88.7073496051124,
-88.7072680051088, -88.7072271384354, -88.7070392050607,
-88.7069331383771, -88.7069413383938, -88.7067698050183,
-88.7067698039916, -88.7068188050641, -88.7068188040266,
-88.7067535383907, -88.7066310039812, -88.7061653382166,
-88.7058711391767, -88.7053892057163, -88.7047275378495,
-88.7045560044799, -88.704274204418, -88.7041926044103, -88.7041436044301,
-88.7041190044299, -88.7039803366905, -88.7038004043616,
-88.7036943377062, -88.7036371387386, -88.703555404345, -88.7030163375395,
-88.7026976041178, -88.7021585373113, -88.7018398028455,
-88.7016356038233, -88.7014966027354, -88.7013251370434,
-88.701104403617, -88.7009328035558, -88.700785804547, -88.7005406034264,
-88.7002383366665, -88.6998380032229, -88.6995112031379,
-88.6989148030128, -88.6987187352581, -88.698048736123, -88.6973053359177,
-88.6971501358797, -88.6969703348084, -88.6968477368639,
-88.6966190024274, -88.6964555357119, -88.6961287356094,
-88.6959979355707, -88.6957284011267, -88.6955895354746,
-88.6954424021308, -88.6953771354515, -88.6952301354136,
-88.6949604009612, -88.6947888019507, -88.6944537351524,
-88.6942005350601, -88.6940534016822, -88.693693801592, -88.6930811337378,
-88.6927544013744, -88.6924847346461, -88.6922313345754,
-88.6919698011655, -88.691332534323, -88.6909486019336, -88.6907934008565,
-88.6903684007802, -88.6900907330103, -88.6896493995639,
-88.6893961338807, -88.6889956004637, -88.6888404004257,
-88.6887260003946, -88.6880315335269, -88.6875739334123,
-88.6873615333558, -88.6870999999443, -88.6868875332195,
-88.6854821338964, -88.6843787981857, -88.6841989991869,
-88.683970333517, -88.6838723324543, -88.6835045323573, -88.6831203989271,
-88.68213159869, -88.6817801986023, -88.6811019984429, -88.6806033983214,
-88.6803909315974, -88.6798843314518, -88.6796637324396,
-88.6792059979373, -88.6788871978664, -88.6787075311551,
-88.6785523311113, -88.6780701299382, -88.6765663972771,
-88.6763047972105, -88.6758553304375, -88.6749725969022,
-88.6746865301772, -88.6746211968387, -88.6745883968626,
-88.6743269290985, -88.6742615301366, -88.6742369311873,
-88.6743005908359, -88.6743934, -88.6746385, -88.6746423421899,
-88.6746453303216, -88.6746699303366, -88.6745555303263,
-88.6743103302722, -88.673893530161, -88.6736971967686, -88.6735419967116,
-88.6735358645707, -88.6735352, -88.6734127, -88.6734372,
-88.6735026, -88.6736826, -88.6737316, -88.6737316, -88.6736913116587,
-88.6736241965575, -88.6735341965238, -88.6734035308568,
-88.6729703963639, -88.6723735962071, -88.6721857294933,
-88.6719241961025, -88.6717933294261, -88.6717197960776,
-88.6715971960463, -88.6710413958781, -88.6707063957913,
-88.6703795290337, -88.6698401299121, -88.669554128793, -88.668524127494,
-88.6680583273867, -88.6679029283962, -88.6677885283842,
-88.6677719273831, -88.6676655950752, -88.6674203950236,
-88.6671507949645, -88.6670525293357, -88.6669135949394,
-88.6667827949131, -88.6665783938233, -88.6664475948371,
-88.6662431937547, -88.6659651947588, -88.6657527947048,
-88.6656627946862, -88.6655891280059, -88.665523728004, -88.6653601936042,
-88.6651395945928, -88.6649759945456, -88.6647879944859,
-88.6644447943633, -88.6643223276547, -88.6641179942565,
-88.6639545275436, -88.6633251273775, -88.6628183262151,
-88.6626385272103, -88.6623933271372, -88.6621235937122,
-88.6619193269799, -88.6616905279593, -88.6611509257418,
-88.6610609934381, -88.6610363278388, -88.660692926745, -88.6606683267582,
-88.6606109944547, -88.660537393406, -88.6604555933891, -88.6599651265984,
-88.6598425276222, -88.6597689265619, -88.6596135931832,
-88.6593929264674, -88.6591557264225, -88.6583953929217,
-88.6577821927614, -88.6572345259713, -88.6565639924924,
-88.6557465266706, -88.6548553920644, -88.6546755263955,
-88.6543485919337, -88.6539561251458, -88.653817191772, -88.6535065916919,
-88.6533185249855, -88.653023991621, -88.652860324942, -88.6526641248931,
-88.6525005915225, -88.6520507914285, -88.6517481913716,
-88.6510203912241, -88.6507095245163, -88.6505213244881,
-88.6503987244652, -88.650128924396, -88.6500879910583, -88.6500633243957,
-88.6499243910336, -88.6498017253873, -88.6497363243271,
-88.6496791243069, -88.6495239231899, -88.6494257908671,
-88.6490333241, -88.6489515897147, -88.6489023897037, -88.6486245906587,
-88.648550990641, -88.6484119239454, -88.6483137916235, -88.6480849249003,
-88.6479295904831, -88.647651590398, -88.6475289903626, -88.6470465891911,
-88.6467275912058, -88.6467277061079, -88.6468189, -88.6468188925707,
-88.6468257235411, -88.6468255902186, -88.6468882348871,
-88.6469903, -88.6469929198433, -88.6469971236373, -88.6470135236482,
-88.6469643236488, -88.6468497902925, -88.6467107913012,
-88.6466289225467, -88.6465635235715, -88.6461547901136,
-88.6455825899435, -88.6446751896832, -88.6443481229279,
-88.6439229228198, -88.643415989349, -88.6430643892637, -88.6424673224616,
-88.6420093890126, -88.6415759889111, -88.6411997877923,
-88.6409133887679, -88.6405127897083, -88.6400547219, -88.6396375895086,
-88.6394495884313, -88.6394331217737, -88.6395036422512,
-88.6395814, -88.6397203, -88.6400802, -88.6401946, -88.6402927,
-88.6402953101259, -88.6402995220704, -88.6403647231555,
-88.6404820451819, -88.6406356, -88.6409707, -88.6412568,
-88.6414041, -88.6415021, -88.6415077938754, -88.6415089235414,
-88.6415579891923, -88.6415495225571, -88.6414839892136,
-88.6411815224684, -88.6410261224312, -88.6410177880702,
-88.6410558463848, -88.641256, -88.6417056, -88.6420326,
-88.6422042, -88.6427358, -88.6432426, -88.6434307, -88.6438801,
-88.6455559, -88.6460136, -88.6464714, -88.6472396, -88.647444,
-88.6476729, -88.6479262, -88.6484414, -88.6491775, -88.6494228,
-88.6500034, -88.6504775, -88.6511399, -88.651843, -88.6528242,
-88.6533802, -88.6535274, -88.653781, -88.6538955, -88.6539773,
-88.6541081, -88.6543532, -88.6545166, -88.6546719, -88.6547946,
-88.655048, -88.6554406, -88.6556776, -88.6558329, -88.6559965,
-88.6561927, -88.6563153, -88.6564298, -88.6564350759822,
-88.6564365936111, -88.6566269778887, -88.6568219, -88.6569528,
-88.6573043, -88.6574106, -88.6574596, -88.657460102339,
-88.6574663939582, -88.6574822220224, -88.6575658, -88.6577456,
-88.6590702, -88.6595118, -88.6600516, -88.6603704, -88.6615479,
-88.662292, -88.662709, -88.6628154, -88.6628022876743, -88.6626913951503,
-88.6624051940469, -88.6615631282125, -88.6603859268506,
-88.6602223945051, -88.6601161277997, -88.6599199943917,
-88.6597239276404, -88.6597220254605, -88.6597171, -88.6596844,
-88.6597581, -88.659799, -88.6598263, -88.6603877, -88.6606411,
-88.6608455, -88.6611236, -88.6613525, -88.6616386, -88.6618676,
-88.6621293, -88.6623662, -88.6624318, -88.6624317017937,
-88.6623323281965, -88.6623321943627, -88.6623255, -88.6623173,
-88.6624564, -88.6624973, -88.6625055, -88.6625464, -88.6632087,
-88.6637482, -88.6640508, -88.6641734, -88.6646475, -88.6651218,
-88.6654896, -88.6661437, -88.6668141, -88.6670021, -88.6681386,
-88.6685394, -88.6688827, -88.6692833, -88.6696267, -88.6701171,
-88.6704032, -88.6707056, -88.6708609, -88.6713758, -88.6715474,
-88.6717599, -88.6721767, -88.6724955, -88.6727735, -88.6734356,
-88.6737544, -88.6741469, -88.6742694, -88.6744002, -88.6746618,
-88.6748416, -88.6751031, -88.675847, -88.6759124, -88.675986,
-88.6761495, -88.6765255, -88.6769587, -88.6771303, -88.6772692,
-88.6774246, -88.6774293381576, -88.6774313983005, -88.6774885316665,
-88.6774967306581, -88.6774231317261, -88.677406731751, -88.6774475317951,
-88.6775664681182, -88.677694, -88.6776947900191, -88.6777007985882,
-88.6777171308974, -88.6776517319338, -88.6772839308127,
-88.6769405984383, -88.6763521305932, -88.6758779304943,
-88.6756897981885, -88.6756817315584, -88.6758121983136,
-88.6758123316528, -88.6756569983197, -88.6756487508138,
-88.6757073, -88.676026, -88.6760274819918, -88.6760327995149,
-88.6760409984816, -88.6760163984881, -88.6758693317918,
-88.6753869983445, -88.6751989993564, -88.6748065305251,
-88.6743325314479, -88.6736621979359, -88.6731881311403,
-88.6722397985874, -88.6714633962802, -88.6709319971636,
-88.6707113960646, -88.6704333970404, -88.6701719313429,
-88.6698939302346, -88.6695669301694, -88.6692725967743,
-88.6688883966723, -88.6680873297865, -88.6672779962265,
-88.6669265294638, -88.6667465971316, -88.6662887959918,
-88.6660761292919, -88.6655201291842, -88.6645307956144,
-88.6640239954969, -88.6636315287507, -88.6635985954388,
-88.6635577964903, -88.663124328693, -88.662249395156, -88.6618079283987,
-88.6611863949225, -88.6611701949325, -88.6611909107665,
-88.6613595, -88.6613630897553, -88.6613663293872, -88.6613825273138,
-88.6613415283861, -88.6614192760947, -88.6615717, -88.6618414,
-88.6620457, -88.6621928, -88.662198368414, -88.6621995953868,
-88.6623573671565, -88.6624869, -88.6626749, -88.6631654,
-88.6633206, -88.6633155997721, -88.6633273968566, -88.6631883291194,
-88.6631393291076, -88.6628859290302, -88.6628451191548,
-88.662826, -88.6628024159486, -88.6627713956989, -88.6627303946513,
-88.6625997279575, -88.6620517955175, -88.6614795286982,
-88.6604819294975, -88.6604494709409, -88.6605241, -88.6607775,
-88.6608755, -88.6608761268682, -88.6608823286277, -88.6609067953169,
-88.6608577953159, -88.6606533286085, -88.6602689951756,
-88.6599829284256, -88.6597457950182, -88.6594597282524,
-88.6593533938462, -88.6591979948465, -88.6591163281521,
-88.6583235955624, -88.6581683278053, -88.6579475277404,
-88.6573997276053, -88.6569499951947, -88.6565411950751,
-88.65624679291, -88.6558869928296, -88.6556009271454, -88.6554289937888,
-88.6552245281281, -88.655044593705, -88.6548075269668, -88.6542435278268,
-88.65364679325, -88.6528541939712, -88.6522411270969, -88.6518487925949,
-88.6517821136898, -88.6512263, -88.6508152, -88.6504533691233,
-88.6502912922035, -88.6499878, -88.6495453, -88.6488828,
-88.6487508075234, -88.6487255916833, -88.6484060574162,
-88.6484521, -88.6482893, -88.6477585, -88.647278, -88.646807,
-88.6462326, -88.6460394, -88.6459181, -88.6458054386627,
-88.6457991241027, -88.645749990755, -88.6454965906726, -88.6453249916629,
-88.6448669227972, -88.6445315904302, -88.6444955503929,
-88.6442812, -88.6437653433442, -88.643730190245, -88.6436470125721,
-88.6434989, -88.6433136, -88.6430846, -88.6427841, -88.6427501,
-88.6420225, -88.6419027, -88.641728, -88.6413312, -88.6408387,
-88.6405379, -88.6404582, -88.640052, -88.6396969, -88.6394033,
-88.6395143, -88.6393438, -88.6391306, -88.6389278, -88.6387993,
-88.6386377, -88.6383932, -88.6378119944515, -88.6377299883298,
-88.6372395892225, -88.6367735213768, -88.6367139583468,
-88.6364709, -88.6362219, -88.6358638, -88.6355698, -88.6351858,
-88.6348419897052, -88.634810587565, -88.6346551875294, -88.6346162841326,
-88.6342922, -88.6332334, -88.6325336, -88.6321537367718,
-88.6321363212625, -88.6321033868907, -88.6321129863215,
-88.6322126, -88.6321798, -88.6320552, -88.6316777, -88.6309644,
-88.6298112, -88.6293559, -88.6285814713118, -88.6285369193839,
-88.6283405193515, -88.6283321860272, -88.6283479355436,
-88.6286009, -88.62845, -88.6281195053226, -88.6279883193332,
-88.627853842583, -88.6279923, -88.6278007, -88.6276596,
-88.6270473, -88.6267679, -88.6263121, -88.6259625, -88.6255689,
-88.6251553, -88.6249638718952, -88.6249547195245, -88.6249320205472,
-88.6247454, -88.6242795, -88.6238782, -88.6233235, -88.622956,
-88.6226406, -88.6219201, -88.6215679, -88.6212961, -88.6208425,
-88.6206563, -88.6206311, -88.620819, -88.6210641, -88.6213254,
-88.6214435, -88.6211763, -88.6209197, -88.6205299, -88.6200353061771,
-88.6200111840341, -88.6196679839572, -88.6194717849524,
-88.6193247172053, -88.6191203838089, -88.6184829836643,
-88.6182133836226, -88.6179355835634, -88.617322716754, -88.6168895166501,
-88.6167261166046, -88.6166687832502, -88.6166664256651,
-88.616662, -88.6166455, -88.6166373459297, -88.6166113831968,
-88.6163497164517, -88.6160635830433, -88.615867517376, -88.6158356143214,
-88.6160654, -88.6160666641678, -88.6160721831158, -88.6160887164651,
-88.6160151164465, -88.6159333164187, -88.615859716391, -88.6158023830408,
-88.6156797830121, -88.6155571829767, -88.6155163152507,
-88.6155101471203, -88.6155095, -88.6154504470683, -88.6153853818603,
-88.6152219161881, -88.6146577816638, -88.6143717826429,
-88.6141595149022, -88.6138895825322, -88.6137669825035,
-88.61370991687, -88.6137314755443, -88.6138749, -88.6138769420691,
-88.6138817158997, -88.6138981169547, -88.6138001158969,
-88.6136447825297, -88.6135303158319, -88.6133587157788,
-88.6131707157316, -88.6128925823131, -88.612753515596, -88.6125981811731,
-88.6125916239129, -88.6125914, -88.612475125057, -88.6121809820534,
-88.6116087162607, -88.6111671828027, -88.6110119140155,
-88.6108729150292, -88.6107587150131, -88.6106607150226,
-88.6106363160784, -88.6106855150686, -88.6106201817408,
-88.6104323139977, -88.6101787805969, -88.6099909159738,
-88.6097291815138, -88.6096311158668, -88.6095741137808,
-88.6096022917843, -88.6098127, -88.6098115075999, -88.6098195149141,
-88.609811180544, -88.6097459149079, -88.6097789139131, -88.6096971149395,
-88.6094681825837, -88.6090185147298, -88.608429580177, -88.6082579811615,
-88.6082522893382, -88.6082512, -88.6082184, -88.6082502973223,
-88.6082087800739, -88.6079961143857, -88.6077835143091,
-88.6076035142527, -88.6074645808797, -88.6074401142172,
-88.6073501131552, -88.6072357808299, -88.6070641141177,
-88.6069577807698, -88.6069499808214, -88.6067047140823,
-88.6066311151045, -88.6065903140586, -88.6065985140719,
-88.6065659130285, -88.6064513807064, -88.6063613140028,
-88.6062633139691, -88.6061405149737, -88.6058545138777,
-88.6058226162735, -88.605897, -88.6058979171876, -88.6059037805863,
-88.6059201806013, -88.6058385139177, -88.605666714913, -88.6053805804546,
-88.6051189803978, -88.6049473803548, -88.6047429125825,
-88.6045057802133, -88.6043423135003, -88.6040399123969,
-88.6039499801031, -88.6039337801305, -88.603949906406, -88.6041645,
-88.6041671822746, -88.6041713135863, -88.6042244017116,
-88.6043771, -88.6043835740232, -88.6043839126319, -88.6044083803529,
-88.60431038033, -88.6040651135959, -88.6039017135546, -88.6037053801672,
-88.6033865134054, -88.6032065800215, -88.6029939799657,
-88.6026669798905, -88.6024955131999, -88.6018087119851,
-88.6015471119242, -88.6011465118054, -88.601072913876, -88.6009831795024,
-88.6008195794651, -88.6007213783931, -88.6006723794113,
-88.6006721530861, -88.6006656, -88.6006492, -88.6006136584072,
-88.6005413793451, -88.6003369792877, -88.5994867124074,
-88.5991597123288, -88.5988571789294, -88.5980971121301,
-88.5979009787586, -88.5974921796914, -88.5970833129208,
-88.5969281108087, -88.5969037118802, -88.5967565785238,
-88.5966503785218, -88.5964461128569, -88.5961681107043,
-88.5956037782491, -88.5953421781757, -88.5950315114405,
-88.5948107124281, -88.594638978005, -88.5943609112524, -88.5942873112362,
-88.5942629112395, -88.594058377853, -88.5937967777796, -88.5931099776272,
-88.5923005774511, -88.5919899107109, -88.591801777336, -88.5916875096348,
-88.5915731117002, -88.5912787772584, -88.5901747769828,
-88.5891855767877, -88.5886541756308, -88.5884661766576,
-88.5883025755745, -88.5881473099032, -88.5881719099449,
-88.5880983099371, -88.5878529098804, -88.5876239775221,
-88.5873133097327, -88.5865935762326, -88.5863237761675,
-88.5858905094085, -88.5857433750138, -88.5854651759845,
-88.5851955092602, -88.5850891092407, -88.5850809092531,
-88.5851709749325, -88.5851465093183, -88.5849667092826,
-88.584835910318, -88.5846887092416, -88.5842061757766, -88.5831757088563,
-88.582423375361, -88.582235308657, -88.5822353086742, -88.5822859,
-88.5824249, -88.5824659, -88.5824657423134, -88.5824727098145,
-88.5824563087744, -88.5823663097933, -88.5818509752748,
-88.5816139085506, -88.5810413084169, -88.5808941750505,
-88.5808941750679, -88.580937874425, -88.5810756, -88.5810778059651,
-88.5810823751503, -88.5811069741262, -88.5810333084884,
-88.5808861751179, -88.5803789749494, -88.5803381082734,
-88.5803299739043, -88.5802727082724, -88.5800683082042,
-88.579978174843, -88.5799545432602, -88.5800451, -88.5800443785814,
-88.5800519082232, -88.5800355092698, -88.5797575081697,
-88.5793567747474, -88.5787025746341, -88.5782853745243,
-88.5779665088239, -88.5778355744268, -88.5776801754495,
-88.5775821077208, -88.5774183743419, -88.5773285743225,
-88.5771813076427, -88.5764125084841, -88.5762733740744,
-88.5762504468267, -88.5763239, -88.5770846, -88.5773055,
-88.57769, -88.5777635, -88.5778617, -88.5779599, -88.5781481,
-88.5782625, -88.5783771, -88.578508, -88.5785075490331,
-88.5785147747773, -88.5784821747906, -88.578670307187, -88.5786541082403,
-88.5783923748709, -88.5783763201092, -88.5784265, -88.5785819,
-88.5785804768824, -88.5785887093391, -88.5785723749682,
-88.5784661082878, -88.5776889757875, -88.5771163079204,
-88.5770755079194, -88.5770347079417, -88.5769611746023,
-88.5768465735435, -88.5764949078464, -88.5761021744066,
-88.575406906455, -88.5752433074461, -88.5751123730397, -88.5749651730134,
-88.5749323740574, -88.5749815074292, -88.5749815741009,
-88.5748833740755, -88.5746625740072, -88.5744907739466,
-88.5743107072226, -88.574130907177, -88.5740913273039, -88.5742795,
-88.5746558, -88.5746606715693, -88.5746625740438, -88.5746871084331,
-88.5746402819419, -88.5747214, -88.574844, -88.5750568,
-88.5752122, -88.5752105136217, -88.5752189742807, -88.5751863076132,
-88.5751617076255, -88.5750717742885, -88.5748591065269,
-88.5742209740587, -88.5739837729562, -88.5739265739893,
-88.5739511740319, -88.5739752672996, -88.5740999, -88.574198,
-88.574239, -88.5742391810302, -88.5742457741662, -88.5742536633691,
-88.5743372, -88.5744598, -88.5746398, -88.5747134, -88.5747191120852,
-88.5747201753803, -88.5747857733323, -88.5747857087605,
-88.5747203077128, -88.5745731076815, -88.5745654780611,
-88.5746645, -88.5748363, -88.5750817, -88.5752617, -88.5753763,
-88.5753758241936, -88.575383107976, -88.5753421746491, -88.5752359079629,
-88.5748841745409, -88.574810507863, -88.57467150682, -88.5745325078844,
-88.5745979746062, -88.5746389747262, -88.5741647069228,
-88.5740665079683, -88.5739927746496, -88.5740400237281,
-88.5743789, -88.5745179, -88.5745194229169, -88.5745247071715,
-88.5745575082383, -88.5745575749615, -88.5746054033279,
-88.5750501, -88.5752955, -88.5753005170823, -88.5753023086142,
-88.5753789043087, -88.5755165, -88.5756555, -88.5758109,
-88.5758040979945, -88.5758177087927, -88.5756951087815,
-88.5756377764879, -88.5756133754561, -88.5755233087733,
-88.5752205753522, -88.5750487753082, -88.5748443086008,
-88.5745005751878, -88.5744515751885, -88.57442710853, -88.5744920813477,
-88.574805, -88.5748055525704, -88.574811775398, -88.5748665744868,
-88.5750995, -88.5751018308785, -88.5751063088674, -88.5752209756119,
-88.5751555099833, -88.5749591755626, -88.5746809765191,
-88.5743619087071, -88.5734945750873, -88.5733309739967,
-88.5732001083403, -88.5731265083309, -88.573126508355, -88.5730855750249,
-88.573107761995, -88.5731934, -88.5735125, -88.5735189846173,
-88.5735193085215, -88.5735765762592, -88.5735683762733,
-88.5735357085757, -88.5737893753849, -88.5738221754233,
-88.5738059087616, -88.5737567754189, -88.5737241087529,
-88.5737319129533, -88.5738072, -88.5740282, -88.5741674,
-88.5743638, -88.5745765, -88.5749202, -88.5753702, -88.575542,
-88.5756402, -88.5756451153157, -88.5756469750408, -88.5757125084103,
-88.5757761635463, -88.5760086, -88.5760126551547, -88.5760153762647,
-88.5760481085756, -88.5760325266579, -88.576295, -88.5763017123377,
-88.5763017753557, -88.5764342249823, -88.576786, -88.5767920480059,
-88.5767927766016, -88.5771060659416, -88.5779236, -88.5779728,
-88.5779725173571, -88.5779795771052, -88.5779469104584,
-88.5779879115327, -88.577971509451, -88.5778895771423, -88.5778815094431,
-88.5779191441789, -88.5780548, -88.5783493, -88.5784231,
-88.5784245001671, -88.578429910686, -88.5784789107286, -88.5784545117728,
-88.5782499106745, -88.5780453772738, -88.5780371772812,
-88.5780682758286, -88.5782268, -88.5784478, -88.5786114,
-88.5787587, -88.5788323, -88.5788323, -88.5788391109, -88.5788391109071,
-88.5789305, -88.5792006, -88.5803216, -88.5807225, -88.5809844,
-88.5817208, -88.5824243, -88.5829233, -88.583095, -88.5835288,
-88.5840525, -88.5842979, -88.5845515, -88.5847315, -88.5847807,
-88.5847801945011, -88.5847875125003, -88.5847549350547,
-88.5848709, -88.5849937, -88.58528, -88.5856074, -88.5858364,
-88.5859347, -88.5860084, -88.5860141851684, -88.5860151796423,
-88.5861562318219, -88.5863111, -88.5865158, -88.5868348,
-88.5872685, -88.5879638, -88.588741, -88.5896654, -88.5900254,
-88.5904346, -88.5907128, -88.5915558, -88.5919486, -88.592513,
-88.5938466, -88.5950001, -88.5952619, -88.5956383, -88.5958019,
-88.5959574, -88.5962277, -88.5962290001956, -88.5962345169661,
-88.5963327826581, -88.5963411160106, -88.5962839149688,
-88.5961449159933, -88.5958831836499, -88.5954005825048,
-88.5950815824337, -88.5944925156049, -88.5941897821896,
-88.5939033821028, -88.5937151153704, -88.5934287152819,
-88.5928479151298, -88.5924959816985, -88.5919971149059,
-88.5912525147024, -88.5904343144652, -88.5898697809774,
-88.5893787808514, -88.5886343129428, -88.5868915801948,
-88.5864007134147, -88.5860979133302, -88.5857215132214,
-88.5851979130569, -88.5843139794678, -88.5835285125665,
-88.5830867124366, -88.5827839790213, -88.5823665799589,
-88.5819575788191, -88.581622178752, -88.5812295120181, -88.5810413119924,
-88.5808203786165, -88.5804685785327, -88.5802639128511,
-88.5792819781784, -88.5790283124948, -88.5789711114538,
-88.5789221114778, -88.5787747781206, -88.5784965780546,
-88.5771219120544, -88.5769337109696, -88.5768273109533,
-88.5768039894078, -88.5769024, -88.5773198, -88.5775407,
-88.5776308, -88.5776300387175, -88.5776375768605, -88.577629377908,
-88.5773183778301, -88.5766065120158, -88.5765493109739,
-88.576557110578, -88.5766979, -88.5768372, -88.5771318,
-88.5780238, -88.5785149, -88.5788913, -88.5790958, -88.5792759,
-88.5792749893904, -88.5792827118692, -88.579250111875, -88.5788407784334,
-88.5782927116155, -88.57794891153, -88.5775151780801, -88.5770897123302,
-88.5769179122812, -88.5768115122641, -88.5767461122672,
-88.5767783867155, -88.5769848, -88.5773287, -88.5775169,
-88.5778606, -88.578237, -88.5783843, -88.578378800443, -88.5783911118034,
-88.5783257117974, -88.5775811116229, -88.5775319116252,
-88.5775073783018, -88.5772619115792, -88.5771637782546,
-88.5769837782056, -88.5768691781768, -88.576869178185, -88.5770261,
-88.5776317, -88.5779181, -88.5782046, -88.5784993, -88.5786711,
-88.5790803, -88.5793831, -88.5796287, -88.580275, -88.5808642,
-88.5812406, -88.5827217, -88.5828118, -88.5828855, -88.5828872237748,
-88.5828923131862, -88.5829169142472, -88.5828759809095,
-88.5828759792478, -88.5830083, -88.5832047, -88.5833848,
-88.5835238, -88.5836384, -88.583640046116, -88.5836451800857,
-88.5836614395076, -88.583704, -88.5837858, -88.5839003,
-88.5839067952171, -88.5839071145676, -88.5840217802513,
-88.583980980252, -88.5838827135658, -88.5832935123719, -88.5831381800422,
-88.5828025799784, -88.5825245132416, -88.5822953809133,
-88.581738912017, -88.5817316002359, -88.5817976, -88.5818795,
-88.5820431, -88.5822068, -88.5822804, -88.5822805942711,
-88.5822871799124, -88.5822955132733, -88.5821973799313,
-88.5820991799134, -88.5820911132559, -88.5821811143462,
-88.5821239133169, -88.5810683130588, -88.5804953128882,
-88.5800615783866, -88.5797343126795, -88.5789485791332,
-88.578924179139, -88.5789405135341, -88.5788833124881, -88.5786213124145,
-88.5785662280855, -88.5786474, -88.5788973, -88.5790239,
-88.5790288426109, -88.5790307125762, -88.5790961792797,
-88.5790797792888, -88.5789325792808, -88.5788762235631,
-88.5791714, -88.579172137239, -88.5791781804601, -88.5791947127685,
-88.5791619794401, -88.5791619159633, -88.5795564, -88.5799492,
-88.5803257, -88.5806694, -88.5814388, -88.5819136, -88.5822899,
-88.5825599, -88.5828116, -88.5829066, -88.5830291, -88.5830907,
-88.5832661, -88.5836319, -88.5836789582258, -88.5838595807529,
-88.5841951808574, -88.5849155154818, -88.5850955801192,
-88.5853901802003, -88.5859205702343, -88.5860872, -88.5862251902391,
-88.5868303816056, -88.5873319381543, -88.5878586, -88.5881658,
-88.5888287, -88.5898189, -88.5901216, -88.5902688, -88.5904078,
-88.5906042, -88.5922735, -88.5930917, -88.5944337, -88.5950636,
-88.5961355, -88.5970929, -88.5975347, -88.5976246, -88.5976326,
-88.5977061, -88.5980988, -88.5987698, -88.5996534, -88.5998661,
-88.5999887, -88.5999313, -88.5999721, -88.6001355, -88.6004464,
-88.6013137, -88.6020908, -88.6031705, -88.6033257, -88.603432,
-88.6037511, -88.6043893, -88.6045774, -88.6047574, -88.6050189,
-88.6051824, -88.605755, -88.6060741, -88.6066631, -88.6075631,
-88.6082912, -88.6095182, -88.6102708, -88.6110234, -88.6121034,
-88.6129051, -88.6136167, -88.6143854, -88.6148843, -88.6155469,
-88.6159967, -88.6161275, -88.6162994, -88.6164631, -88.6165696,
-88.616815, -88.6170273, -88.6170021, -88.6170999, -88.6174184,
-88.6178681, -88.6189232, -88.619929, -88.6205913, -88.6208366,
-88.6209428, -88.6210323, -88.6211385, -88.6212774, -88.6222585,
-88.6224628, -88.6225526, -88.6225360107001, -88.6221167240167,
-88.622116682852, -88.6221099, -88.6220278, -88.6221581,
-88.6224109, -88.6227049, -88.6236366, -88.6237673, -88.6238652,
-88.6238568462757, -88.6235441228471, -88.6235437412716,
-88.6235373, -88.6234798, -88.6234795, -88.6235691, -88.6236998,
-88.6239858, -88.6242473, -88.6244267, -88.6246308, -88.6250752,
-88.6252227, -88.6255094, -88.6260826, -88.6263855, -88.6267619,
-88.627433, -88.6279402, -88.6282757, -88.6285211, -88.628734,
-88.6290534, -88.629348, -88.6295936, -88.6299455, -88.63024,
-88.6303872, -88.630518, -88.6308695, -88.6312456, -88.6313764,
-88.6315482, -88.6317774, -88.6322684, -88.632743, -88.6331602,
-88.6337411, -88.6339047, -88.6341011, -88.6344368, -88.634633,
-88.6354592, -88.6362033, -88.6367922, -88.6370292, -88.6371355,
-88.6371359644062, -88.6371423273582, -88.6371665930057,
-88.6371419930248, -88.6371418041917, -88.6372986, -88.6374376,
-88.6376667, -88.6379039, -88.6382885, -88.6387633, -88.6391725,
-88.639598, -88.6401544, -88.6408907, -88.6428788, -88.643525,
-88.6439176, -88.6440812, -88.6442773, -88.6442780111585,
-88.6442841283929, -88.6443087284197, -88.6442677273779,
-88.6441529950715, -88.6439155950223, -88.6434983282509,
-88.6433509948929, -88.6433263948953, -88.643326333542, -88.6434994,
-88.6437611, -88.6439903, -88.6445548, -88.6448248, -88.6450702,
-88.6453646, -88.6454801, -88.6457654, -88.6459533, -88.6459559520797,
-88.6459601290725, -88.6460173291093, -88.6460253957985,
-88.6459681291249, -88.6457389290808, -88.6454771290124,
-88.6453053289726, -88.6451249289761, -88.6448873966518,
-88.6446255955542, -88.6444373955094, -88.6442245287994,
-88.6439789277219, -88.6438723964523, -88.6433733275805,
-88.6432259963017, -88.6431603285981, -88.6431684997229,
-88.643227, -88.6433988, -88.6436442, -88.643816, -88.6439308,
-88.6439877, -88.644225, -88.6444213, -88.6447323, -88.6448633,
-88.644945, -88.6450514, -88.6450513940487, -88.6450581958712,
-88.6450581292162, -88.6449515958708, -88.6446731958165,
-88.6445915291378, -88.6445832669141, -88.6447479, -88.644928,
-88.6451325, -88.6453207, -88.6456071, -88.6457216, -88.645722830068,
-88.6457283961659, -88.6457447295192, -88.6457283295208,
-88.6456465295055, -88.6456301284696, -88.6455973961737,
-88.6455073294851, -88.6452945960843, -88.6451881960522,
-88.6450981960336, -88.6449753293581, -88.6449097949695,
-88.644705195958, -88.6446643969946, -88.6445741969942, -88.6443123292332,
-88.6442875959031, -88.6442875303006, -88.6442383959137,
-88.6439273958226, -88.6437639301563, -88.6435265290604,
-88.6433873956891, -88.642544395476, -88.6421597287263, -88.642077928716,
-88.6420695953959, -88.6421304025403, -88.6422181, -88.6423817,
-88.642537, -88.6425371894781, -88.6425437955909, -88.642551795615,
-88.6424863289439, -88.6421753288845, -88.6420279288531,
-88.6418805954817, -88.6414633287036, -88.6412667953228,
-88.6410375952778, -88.6409147963041, -88.6408655942189,
-88.6408407952921, -88.6407751952884, -88.6406279285913,
-88.6403087285184, -88.639449394952, -88.6390973948665, -88.6382135279792,
-88.6374603944697, -88.6368957276602, -88.6364865275646,
-88.6363143942047, -88.6361913942117, -88.6360517932194,
-88.6358467952835, -88.6356093941977, -88.6352983274631,
-88.6347581939929, -88.6341933928108, -88.6340131271459,
-88.6338821271279, -88.6338329271419, -88.6337507938056,
-88.6335625271066, -88.6332431937013, -88.6326373935473,
-88.6318599266787, -88.6314425932322, -88.6307715253322,
-88.6297239927359, -88.629093925891, -88.6286517934836, -88.6282261933853,
-88.627980392301, -88.627832725627, -88.627554392236, -88.627284326545,
-88.6268749264393, -88.6265557919739, -88.6261139262182,
-88.6259501240925, -88.625835591768, -88.6254593239374, -88.6253201249411,
-88.6250825905152, -88.6242603257416, -88.62377772457, -88.6224361898446,
-88.6215693229559, -88.6212503905924, -88.6210049915807,
-88.6209723895006, -88.6209971239116, -88.6209481249464,
-88.620800923871, -88.6201055236869, -88.6197865913158, -88.618747790019,
-88.6177663897823, -88.6163107227942, -88.6153783215569,
-88.6151329892044, -88.6148875214252, -88.6146337890534,
-88.6144293223252, -88.6137665888154, -88.6135539220822,
-88.6131447219507, -88.6129483219009, -88.6127683218594,
-88.6127031218734, -88.6124661228868, -88.6122453218078,
-88.6118445217155, -88.6111901215474, -88.6106419213972,
-88.6105273213684, -88.6102165213015, -88.6101757879756,
-88.6100613213002, -88.6097749879084, -88.6086381209778,
-88.6079101208312, -88.6075175874098, -88.6067077216078,
-88.6061105871049, -88.6045233867169, -88.6037953198701,
-88.6032471197181, -88.6030015196456, -88.6026331195183,
-88.6024327318722, -88.602296179603, -88.6022405861295, -88.6019707194136,
-88.6016597860091, -88.6011033858671, -88.600146185627, -88.5992709187665,
-88.5987307853153, -88.5981009185081, -88.5969635171714,
-88.5964889170505, -88.5963743180726, -88.5962517180614,
-88.5962273847739, -88.5961293181119, -88.5961183967256,
-88.5960849, -88.5960272, -88.5959575, -88.5958542, -88.5957603,
-88.5955834776378, -88.5954913846797, -88.5951393856234,
-88.5950715189383, -88.594811984493, -88.5945928883115, -88.5945506,
-88.5945426, -88.5945278, -88.5945319, -88.5945010996349,
-88.5945179845622, -88.5945099189397, -88.5943709189142,
-88.5941500808433, -88.5941047, -88.5940075, -88.5938278,
-88.593628, -88.5934992, -88.5933899, -88.5933168, -88.5929279,
-88.5926483, -88.5925403, -88.5922708, -88.5921823, -88.5920689,
-88.5919905, -88.5919344087617, -88.5918991521994, -88.5918295,
-88.5917611, -88.5917142, -88.5916693, -88.5916069, -88.5915908606379,
-88.5914941289148, -88.5914929, -88.5914908882955, -88.5914573837784,
-88.5913114387937, -88.5912857, -88.5911684, -88.591053,
-88.5910427133142, -88.5910261433423, -88.5910296, -88.5909605,
-88.5908995, -88.5908251, -88.5907473, -88.5906916, -88.5906386,
-88.5905769, -88.5904261, -88.5902752, -88.5900378, -88.5899299,
-88.589779, -88.5895483, -88.5894042, -88.5893498, -88.5893311,
-88.589262, -88.5891071, -88.5889448, -88.5886961, -88.5884795,
-88.5882146, -88.5876305, -88.587247, -88.5870666, -88.5867347,
-88.5866891, -88.5864873, -88.5863639, -88.5861828, -88.5861292,
-88.5860494, -88.5859414, -88.5857463, -88.5855391, -88.5853574,
-88.5852635, -88.5851515, -88.5848706, -88.5848453651944,
-88.5846777072806, -88.5846432, -88.5845777683358, -88.5841893817609,
-88.5840962036115, -88.5840357, -88.5838969, -88.583748,
-88.5836535, -88.5835623, -88.5835596, -88.5835764, -88.5835791,
-88.5835789131191, -88.5835181711435, -88.5834852, -88.5834396,
-88.5833745, -88.5833485376384, -88.5832727148241, -88.5833219148602,
-88.5832645825624, -88.5829945814598, -88.5829620496288,
-88.5828455, -88.5827462, -88.5826376, -88.5825129, -88.5824058022661,
-88.5823397812839, -88.5823317135856, -88.5822989135846,
-88.5822813310794, -88.5822326, -88.5820971, -88.5819107,
-88.5817777121861, -88.5815787144561, -88.5815638744953,
-88.5815634, -88.5814816, -88.5814662170195, -88.5813300668701,
-88.5813287, -88.5812977851487, -88.5812677143849, -88.5812244003187,
-88.5811745, -88.5811320396884, -88.5810174409412, -88.5810162,
-88.5809264, -88.5808137, -88.5807212, -88.5806674729347,
-88.5806619819467, -88.5804001808541, -88.5801668457092,
-88.5801646, -88.5801106304072, -88.5799583141091, -88.5798681807771,
-88.5798275141362, -88.5797619141293, -88.5795813374821,
-88.5795035, -88.5792071, -88.5785848, -88.5781634586156,
-88.5778057803143, -88.5773229135075, -88.576864380034, -88.5767520779041,
-88.5763827, -88.5762124, -88.5760877, -88.5757658, -88.5752274444437,
-88.5750389128919, -88.5749255635105, -88.5746741, -88.5743979,
-88.574393997907, -88.574302312709, -88.5737047792509, -88.5735819782138,
-88.5734593136283, -88.5733119792311, -88.5731145132629,
-88.5731131, -88.5727499509116, -88.5726081134584, -88.5721087789724,
-88.5720067988991, -88.5717291, -88.5715292, -88.5712955353453,
-88.5712081797796, -88.5708889776192, -88.5703661685962,
-88.5701224, -88.5695471, -88.569417, -88.5694029662801,
-88.5692109115326, -88.5690525161647, -88.5690227, -88.5688611,
-88.5687035, -88.5686599645346, -88.5685805113651, -88.5684167780211,
-88.5683267113392, -88.5681547113043, -88.5677209101651,
-88.5675686272834, -88.5674013, -88.5672008, -88.5669507,
-88.5669378706693, -88.5664355785725, -88.5663721473301,
-88.5663177, -88.5661119, -88.5659878, -88.5657047308762,
-88.5653578534279, -88.5653089011503, -88.5650029105109,
-88.564806378171, -88.5645035103781, -88.5639713768902, -88.563679680729,
-88.5634223, -88.5633315643824, -88.563136311036, -88.562808775558,
-88.5625877765613, -88.5621783764813, -88.5617527097155,
-88.5607857674979, -88.5605148, -88.5602682472904, -88.5601561093124,
-88.5593537757724, -88.5590446795764, -88.559012, -88.5588987,
-88.5587867, -88.5586665386757, -88.5581009754899, -88.5575115086792,
-88.5563651750495, -88.5556201081948, -88.5555036601987,
-88.5554139, -88.5553935102873, -88.5553907747947, -88.555177908063,
-88.5550387757349, -88.5547767079714, -88.5546395706818,
-88.5545837, -88.5544959, -88.55441, -88.5543485616887, -88.554277307856,
-88.5539743088456, -88.5535649066773, -88.5530350202324,
-88.5529844, -88.5528517, -88.5527886, -88.5527823702075,
-88.5522170007146, -88.5518975, -88.5516822, -88.5514073,
-88.5513537, -88.5513191166442, -88.5508871070871, -88.5500794105005,
-88.5500682, -88.5500535, -88.549975, -88.549798, -88.5496806,
-88.5495016, -88.5493266, -88.5491556, -88.5491420448612,
-88.5489953732959, -88.5468251728076, -88.5464569802995,
-88.546405, -88.5461918, -88.546, -88.5458525, -88.5456091566001,
-88.5455067068646, -88.5454645972404, -88.5453656, -88.545202,
-88.545021, -88.5448815, -88.5448238, -88.5447058, -88.5446401,
-88.5444872, -88.5441975, -88.5439427, -88.5438837, -88.5438113,
-88.5437620636372, -88.5436607322781, -88.5436571, -88.5435815656333,
-88.5435085042921, -88.5433145870471, -88.5432735, -88.5431542,
-88.5430495, -88.542957, -88.5428698, -88.5427854, -88.5427183,
-88.5427109817979, -88.5426809719119, -88.5424105718807,
-88.5424187052466, -88.5424915309459, -88.5424946496679,
-88.5428652162303, -88.5429031, -88.5431206, -88.5433929,
-88.543476, -88.5434864587684, -88.543509424704, -88.5435173,
-88.5435175655299, -88.543524105678, -88.5435813057249, -88.5435735188832,
-88.5435712, -88.5435404, -88.5434636479168, -88.5434419046776,
-88.542991372274, -88.5429482319488, -88.5428698, -88.5427357,
-88.5425131, -88.5423012, -88.5420571, -88.5419930166611,
-88.541377771903, -88.5401655716337, -88.5386829712865, -88.538363705576,
-88.5380851044624, -88.5373231709707, -88.5367089041573,
-88.5363319697056, -88.5352507038485, -88.5350787038077,
-88.5348739037468, -88.5347673037188, -88.5347673522926,
-88.5348031, -88.534809911246, -88.5349473704729, -88.5349555704838,
-88.5349145704853, -88.5347835037989, -88.5345459037445,
-88.5344147693315, -88.5341445702886, -88.5339071035542,
-88.5336777712091, -88.532858571003, -88.5325227032191, -88.5320393697653,
-88.5306055027832, -88.530400702754, -88.5299501026428, -88.5297699026104,
-88.5296551015632, -88.5295729692945, -88.5294745692832,
-88.5293353025876, -88.5290731025206, -88.5284015023193,
-88.5280165688802, -88.5278197688351, -88.5271853020168,
-88.5269067686089, -88.5265627685066, -88.5255961671673,
-88.5253013004127, -88.524924566981, -88.5245475679301, -88.5239411678099,
-88.5238675011255, -88.5236627010695, -88.523564302089, -88.523523167723,
-88.523342899983, -88.5231707676723, -88.5230723676535, -88.5229823009656,
-88.5227283665145, -88.5226217675306, -88.5223921008504,
-88.5219904997403, -88.5219983674911, -88.521932900825, -88.5217221108022,
-88.5217153, -88.521708531979, -88.5216213007736, -88.5213263673622,
-88.5212279673409, -88.52101490065, -88.5209657006372, -88.5208017672565,
-88.5207280995312, -88.5207035005745, -88.5207607683063,
-88.520785367279, -88.5207607672788, -88.5202445015248, -88.5202199004798,
-88.520226941072, -88.5203165, -88.5203546535769, -88.5204163672131,
-88.5204573005674, -88.5203753005638, -88.5203015005517,
-88.5201951005229, -88.5199083004316, -88.5197857218454,
-88.5197841, -88.519607, -88.5194877, -88.5194259659247,
-88.519425101337, -88.5194200978738, -88.5193791, -88.5192905,
-88.5192848185973, -88.5192400085341, -88.5192114, -88.5191480423899,
-88.5191219668631, -88.5190683277377, -88.5190505, -88.5189834,
-88.5189584000546, -88.5189060481517, -88.5189016, -88.5188193449731,
-88.51881050012, -88.5185648989989, -88.5184911000227, -88.5183845000206,
-88.5182369666516, -88.5179992999105, -88.5178764998775,
-88.5178026998688, -88.517565099806, -88.5174824148893, -88.5174827,
-88.5173674, -88.5170426793672, -88.5169421663232, -88.5168274996268,
-88.5168068123988, -88.5167357, -88.51667, -88.5165829, -88.5165143072459,
-88.5163603661772, -88.5162197473748, -88.5161886, -88.5160893274691,
-88.5159834994214, -88.5159331502767, -88.5159163, -88.5157326,
-88.5156620899993, -88.5156228993305, -88.5154803742571,
-88.5153933, -88.5152927, -88.5152853366302, -88.5149835648259,
-88.5147785658275, -88.5142623656951, -88.5138526989158,
-88.5137936453355, -88.5137102, -88.5136351, -88.513556,
-88.5135023, -88.5134541, -88.5134178, -88.5134514, -88.5134232,
-88.5133977, -88.5133559114808, -88.5132140986854, -88.5129189652832,
-88.512722098584, -88.5125500985474, -88.5119271661145, -88.5117714983663,
-88.5114765649483, -88.5111240971658, -88.5110135043483,
-88.5109395, -88.5109211340758, -88.5106732981062, -88.5103208980104,
-88.5100830969209, -88.5100622223099, -88.5100248, -88.5098978088872,
-88.5097635635087, -88.5095504978335, -88.5094683634522,
-88.5091814977651, -88.5089272977206, -88.5087714966582,
-88.508672897691, -88.5087137643953, -88.5086808977335, -88.5085332977053,
-88.5084842739646, -88.5084263, -88.5080481, -88.5077986,
-88.5075237, -88.5071763, -88.5071404895457, -88.5067791639721,
-88.5055332970071, -88.5050823635758, -88.5047134968249,
-88.5044021634068, -88.5039348966246, -88.5036970965768,
-88.5036716184995, -88.5035647, -88.5030987225534, -88.5029163419276,
-88.5028271, -88.5026568, -88.5023323, -88.5022719728013,
-88.501958695206, -88.5016389628445, -88.5015651473075, -88.5015638,
-88.5012567, -88.5011253, -88.5011026361608, -88.5010398961041,
-88.5009181956474, -88.5009, -88.5008940739246, -88.5008184971072,
-88.5006381626872, -88.5005733724292, -88.5004883, -88.5000443,
-88.49990713829, -88.4997423624403, -88.4993820956804, -88.4988252955331,
-88.4983993620929, -88.4979980953329, -88.4977360963117,
-88.4972037617961, -88.4968106950344, -88.4966060949919,
-88.4963603616016, -88.4959837604768, -88.4956315614286,
-88.4955936266868, -88.4955684, -88.4954886, -88.4954641480868,
-88.4954185613692, -88.4952311986276, -88.4951855, -88.4950045,
-88.4950015406202, -88.494910960218, -88.494767366419, -88.4947322,
-88.4946468966825, -88.494370494449, -88.4942882416586, -88.4942561,
-88.4941980049851, -88.4941493610638, -88.4941124060263,
-88.4941086, -88.4940990174835, -88.4939938954199, -88.4939530933489,
-88.4937893599841, -88.4934699609477, -88.4929948941582,
-88.4926999607435, -88.4922413606198, -88.4920201605655,
-88.4917827605195, -88.4914223614663, -88.4910209613528,
-88.4906524935454, -88.4903902934825, -88.4900218934018,
-88.4897187589496, -88.4894639245997, -88.4893222, -88.4892391774711,
-88.4891863598464, -88.4890734025243, -88.4889118, -88.4886289,
-88.488531, -88.4884371, -88.4883472, -88.4882559, -88.4881809,
-88.4881085, -88.4880616, -88.4880643, -88.4880388, -88.4879932,
-88.4880106, -88.4878604, -88.4878685, -88.4878631, -88.4878162,
-88.4877704, -88.4877142, -88.4877236, -88.4876955, -88.4876154,
-88.4875788, -88.487552, -88.4875227, -88.4873055, -88.4871799,
-88.4870604, -88.4868974, -88.4868157, -88.4867245, -88.4866313323734,
-88.4861070935189, -88.4858204924077, -88.4853698922839,
-88.4849602921596, -88.4847881587637, -88.484583157636, -88.4844475872462,
-88.4844393, -88.4840852, -88.4839844611778, -88.4837059583434,
-88.4835995583013, -88.4835584916036, -88.4836074916037,
-88.4836653662082, -88.4836621, -88.483876, -88.4840974,
-88.4843776, -88.4846833, -88.4849167, -88.4851012, -88.4853351,
-88.4853968, -88.4855416, -88.4856715064077, -88.4856075276025,
-88.4856055822317, -88.4854171586599, -88.48519504056, -88.4851546,
-88.4849272, -88.4848620237533, -88.4848356918315, -88.4848301617624,
-88.4846881, -88.4846884, -88.4846065963365, -88.4845814917311,
-88.4844750917031, -88.484417691702, -88.4842540927105, -88.4840781794193,
-88.4830001, -88.4829280461775, -88.4827795579647, -88.4826486912859,
-88.482697958002, -88.4826080913158, -88.4824522912651, -88.4822130077488,
-88.4820599941843, -88.4819643731899, -88.4819438215351,
-88.4819406957911, -88.4820376, -88.4819363111558, -88.4819360911102,
-88.4819193538607, -88.4818452, -88.4816127, -88.4815991545039,
-88.4814036920129, -88.480936957545, -88.4806747574821, -88.4803553573974,
-88.4800685573278, -88.4797164916304, -88.4795690905522,
-88.4793396904879, -88.4790939581309, -88.4787580903469,
-88.4787827580796, -88.4788319570699, -88.4787337570611,
-88.478398090318, -88.4780211568854, -88.4775870901085, -88.4769072910005,
-88.4764403565334, -88.4763094898504, -88.4761127564678,
-88.4759571564205, -88.4756211563222, -88.4753918896037,
-88.4751215562167, -88.4748757561589, -88.4746791561096,
-88.474457956042, -88.4741549559715, -88.4738435558967, -88.4736640556707,
-88.4737224, -88.473919, -88.4741403, -88.474142043426, -88.4741470893867,
-88.4741963560961, -88.4741227561167, -88.4740575551341,
-88.4739593551262, -88.4735252894084, -88.4731237559816,
-88.472812489236, -88.4725994902092, -88.4724846891187, -88.4723616890822,
-88.4720340900482, -88.4717636889328, -88.471345755475, -88.4710508887336,
-88.4709607564241, -88.4709772877059, -88.4707888887209,
-88.4706086876367, -88.4705430886581, -88.4704201552758,
-88.4702397552233, -88.4699859551597, -88.4697238884452,
-88.4694452883847, -88.469199554987, -88.4687979548633, -88.4685275547887,
-88.4684210881108, -88.468249088065, -88.4680522880041, -88.4679130869218,
-88.4676918879208, -88.467503354534, -88.467306754469, -88.466970688739,
-88.4668887543352, -88.4668395543158, -88.4667084886561,
-88.4665528875887, -88.4664217531839, -88.4661677541619,
-88.4659383551367, -88.4654056872692, -88.4651761538789,
-88.4650288871874, -88.4648977538577, -88.4647585538388,
-88.4646275538116, -88.4643816870787, -88.4640784869822,
-88.4638244869152, -88.4634311534875, -88.4631116867544,
-88.462882152325, -88.4626117532937, -88.4624070865745, -88.4621858865593,
-88.4622434866322, -88.462038687653, -88.4616944865231, -88.4614814864746,
-88.4613094853996, -88.4611701530865, -88.4610472863901,
-88.4607359529728, -88.4603344862085, -88.4602196861871,
-88.4601213538816, -88.4601428028868, -88.460295, -88.4603002650535,
-88.4603017529084, -88.4603918862922, -88.4603674873538,
-88.4602445519232, -88.4601953529638, -88.4601052862751,
-88.459933152891, -88.4598102861979, -88.4597529518134, -88.459671086184,
-88.4595317528183, -88.4593678861067, -88.4592612871228,
-88.4592285517094, -88.4587449526345, -88.4586385526075,
-88.4585401525744, -88.4585372330548, -88.4585334, -88.4584870117453,
-88.4583761514569, -88.4582123535053, -88.4581057524381,
-88.4579419513373, -88.4577779523282, -88.4576960856537,
-88.4577111867363, -88.4578122, -88.4578187376746, -88.4578189523776,
-88.4578600867737, -88.4577534857233, -88.4573929522948,
-88.4571881522556, -88.457016085559, -88.4567701521561, -88.4561882852991,
-88.4559915529506, -88.4557866841622, -88.4555080861717,
-88.4554098851171, -88.4554179518188, -88.4554016851546,
-88.4552787517882, -88.4550491517112, -88.4548607516745,
-88.4546968860004, -88.454524684897, -88.4543361525469, -88.4540411514188,
-88.4535821513158, -88.4533200845988, -88.4532298835442,
-88.4532523360089, -88.453469, -88.4534690067598, -88.4534757513546,
-88.4534758838218, -88.45351, -88.453715, -88.4537478, -88.4537464647783,
-88.4537545514727, -88.4536233514421, -88.45318908466, -88.4530579512894,
-88.4529104845679, -88.4526644855441, -88.4522957510757,
-88.4520251510052, -88.4518367499085, -88.4517711498848,
-88.4516891508902, -88.4515826841897, -88.4514269508156,
-88.4511319507417, -88.4503779505706, -88.4498697504423,
-88.4498288837804, -88.4497140837466, -88.4496813504064,
-88.4496977504232, -88.4495665503909, -88.4494600837004,
-88.449447755023, -88.4496009, -88.4498221, -88.4498877,
-88.4498818061521, -88.4498944838317, -88.4498370838223,
-88.4497141504575, -88.4494600837229, -88.449304349313, -88.4492589534494,
-88.4493632, -88.4496419, -88.4498387, -88.4503385, -88.4506664,
-88.4509614, -88.4511582, -88.4513057, -88.4513060965815,
-88.4513124843263, -88.4513289510222, -88.4512388843577,
-88.4509684842897, -88.4505995508529, -88.4505504841811,
-88.4505503508636, -88.4503782841536, -88.4503994299051,
-88.4505109, -88.4510764, -88.4513306, -88.4514043, -88.4515027,
-88.4516419, -88.4521665, -88.452601, -88.4528961, -88.4532485,
-88.4540598, -88.4543548, -88.4544942, -88.4551743, -88.4560348,
-88.4564693, -88.456797, -88.4569854, -88.4573051, -88.4583785,
-88.4591406, -88.4595668, -88.4600011, -88.4605501, -88.4610581,
-88.4614842, -88.462025, -88.4620659, -88.4621888, -88.4624919,
-88.4629099, -88.4640979, -88.4646879, -88.4651385, -88.4657367,
-88.4659251, -88.4659317090246, -88.4659318879529, -88.4659646869281,
-88.4659484890214, -88.4658910869328, -88.4658962132998,
-88.466212, -88.4663514, -88.466302, -88.4663102, -88.4665805,
-88.4670475, -88.4677277, -88.4684815, -88.4692435, -88.4696449,
-88.4697622, -88.4698577, -88.4701035, -88.4706689, -88.4714472,
-88.4720618, -88.4728566, -88.4731269, -88.4732828, -88.473373,
-88.4733731739043, -88.4733797564873, -88.4733875298088,
-88.4735042, -88.473578, -88.4737992, -88.4742662, -88.4746103,
-88.4748069, -88.4750608, -88.4756182, -88.4763392, -88.4766998,
-88.4776255, -88.4782072, -88.4785267, -88.4786249, -88.478764,
-88.479157, -88.4791646486897, -88.4791718912712, -88.479138956866,
-88.479048757873, -88.4788767578181, -88.4786308910827, -88.478458891037,
-88.4783440909981, -88.4781719575956, -88.4780954288549,
-88.4780831, -88.4781158, -88.4782795, -88.4789921, -88.4798194,
-88.4808247, -88.4814489, -88.4821869, -88.4836221, -88.4849305,
-88.485276, -88.4859263, -88.4862021, -88.4862712, -88.4865497,
-88.4868385, -88.4870155, -88.4872355, -88.4875748, -88.4879382,
-88.4883191, -88.4886302, -88.4889346, -88.4892337, -88.4894657,
-88.4896655, -88.4897889, -88.4898131, -88.4898238, -88.4897836,
-88.4896441, -88.4894899, -88.4894845, -88.4895301, -88.4895971,
-88.4897475, -88.4897948945572, -88.48982665944, -88.489862,
-88.4899083, -88.489978, -88.4900303, -88.4900048, -88.4900157598636,
-88.49022129389, -88.490243873488, -88.4902718, -88.4902796195098,
-88.4901801594747, -88.4901822267746, -88.4901734, -88.4901913,
-88.4902961, -88.4906217, -88.4907961, -88.490953, -88.4910844,
-88.4912298, -88.4912699663266, -88.4913431597606, -88.4913310469136,
-88.491291, -88.4911783, -88.49113, -88.4911019, -88.4911689,
-88.4913661, -88.4915538, -88.4917385487709, -88.4917765608072,
-88.4923744932598, -88.4927962590975, -88.4929165, -88.4931645,
-88.4933858, -88.4935239, -88.4936902, -88.4938189, -88.4940429,
-88.494236, -88.4945874, -88.4948261, -88.4952955, -88.4955423,
-88.4959674, -88.4961672, -88.4965937, -88.4968056, -88.497173,
-88.4975204, -88.4981065, -88.4984444, -88.4987837, -88.4992518,
-88.4998452, -88.4999505, -88.5001503, -88.5003193, -88.5004494,
-88.5006049, -88.5007793, -88.5008812, -88.5010676, -88.5013358,
-88.5015705, -88.5018709, -88.5022357, -88.5024516, -88.502622,
-88.5029478, -88.5032147, -88.5034803, -88.5036761, -88.5039912,
-88.504179, -88.5043895, -88.5046604, -88.5048173, -88.5050493,
-88.5051702, -88.5052961, -88.505504, -88.5056701, -88.506082,
-88.5063234, -88.506495401263, -88.5067511644324, -88.5080844770244,
-88.5082854, -88.5086214, -88.5086728117581, -88.5091282993643,
-88.5094644983842, -88.5097020984395, -88.5100462985311,
-88.5107345654042, -88.511447498925, -88.5121029657864, -88.5122586991588,
-88.5123133231786, -88.5123093, -88.5123116986283, -88.5122507657763,
-88.5122918980598, -88.5124230991187, -88.5128574992207,
-88.5143737662494, -88.5155947665583, -88.5159390999733,
-88.5164061001038, -88.5169549658937, -88.5172007670015,
-88.5176058687805, -88.517653, -88.5177523, -88.5177733583614,
-88.5178973671564, -88.5182907005981, -88.519003567458, -88.5190268433969,
-88.5191108, -88.5193536, -88.5194450514442, -88.5197327676522,
-88.5199211677047, -88.5201526196442, -88.5202079, -88.5205016,
-88.5205346623586, -88.5207731679794, -88.5214121681581,
-88.5218301693042, -88.5221293294793, -88.5221323, -88.5221162,
-88.5222222, -88.5223875386009, -88.5225431694624, -88.5228463018262,
-88.5232641686056, -88.5233090319109, -88.5233594, -88.5234399,
-88.5235499, -88.5236673, -88.5237050937553, -88.5239361677153,
-88.5242475021825, -88.5245669689498, -88.5247961690383,
-88.5249355034623, -88.5251977025002, -88.5253451025408,
-88.5257055692966, -88.5268283029008, -88.5269511706372,
-88.5271233029604, -88.5270989029186, -88.5271238848162,
-88.5271331, -88.5273211, -88.5276255, -88.5277636, -88.5277827889103,
-88.5278607697779, -88.5279919042051, -88.5281311032116,
-88.5281772526098, -88.5282035, -88.5283108, -88.5284261,
-88.5284127, -88.5285079, -88.5287185, -88.5289881, -88.5292389,
-88.5295098, -88.5300167, -88.5304418, -88.5310413, -88.5315697,
-88.5319532, -88.532259, -88.5322651301409, -88.5323507042761,
-88.5326949043543, -88.5328266715387, -88.5328491, -88.5331797,
-88.5332482173531, -88.5335141712213, -88.5335745206689,
-88.5337141, -88.5339206, -88.5341465, -88.5344168, -88.5346864,
-88.5348433, -88.5350941, -88.5352729800326, -88.5358409728106,
-88.535972106177, -88.5363650019285, -88.5366485, -88.5368362,
-88.5370682, -88.5371531, -88.5372022, -88.5372011434038,
-88.5372089721583, -88.5371925721615, -88.5369385710754,
-88.536799172104, -88.5367909054581, -88.536766171108, -88.5364959054293,
-88.5363811043805, -88.5362663710259, -88.5360451053507,
-88.5357419052727, -88.5346603716888, -88.5338493714936,
-88.5332839713545, -88.5326695045175, -88.5318421709322,
-88.5317275042334, -88.5313015041407, -88.5309901040651,
-88.5309325707265, -88.53096510519, -88.5308829708105, -88.5307519041207,
-88.5305551707415, -88.5300799706228, -88.5295883038497,
-88.528219902472, -88.5279823711584, -88.5274581689111, -88.5270073698357,
-88.5263847686163, -88.5260405685297, -88.5255325694475,
-88.525253969377, -88.5249835692991, -88.5248689026036, -88.5247459025856,
-88.5245327692046, -88.5236641012924, -88.5229595032042,
-88.5227545677391, -88.5226889021071, -88.5227040287755,
-88.5228459, -88.5228488229152, -88.5228527011429, -88.5228935688764,
-88.5228197022161, -88.5226393011402, -88.5220083020349,
-88.5212705685273, -88.5211231018216, -88.520910169464, -88.5204433026445,
-88.5202139004884, -88.5200745681636, -88.5200579681751,
-88.5200742674843, -88.5201739, -88.5201741414313, -88.5201807015791,
-88.5202053015967, -88.520172368269, -88.5200331015801, -88.5197297681887,
-88.519295300385, -88.518311767868, -88.5180495000935, -88.5174347010015,
-88.517041368608, -88.5157381672437, -88.5153119661034, -88.5151563004502,
-88.5150659671089, -88.5148609670813, -88.5147051670498,
-88.5141067658595, -88.5136643001066, -88.513287301054, -88.5128610999121,
-88.5125658998507, -88.5124675665094, -88.5122707664743,
-88.5120247664207, -88.5117378996835, -88.5112952995664,
-88.5110331661536, -88.5108118994142, -88.5105169660011,
-88.5101480992487, -88.5097955658203, -88.5089762989207,
-88.5086729644651, -88.508336965421, -88.5079270997025, -88.5076401652519,
-88.5070335661399, -88.5066564983473, -88.506566098341, -88.5065742048033,
-88.5067475, -88.5067471898808, -88.5067542984444, -88.5066664240855,
-88.5067391, -88.5069275, -88.5070666, -88.5071976, -88.5071981760643,
-88.5072043653189, -88.507220698674, -88.5072042986806, -88.5070893653325,
-88.5067203641999, -88.5064500984928, -88.5061305661022,
-88.5057698972538, -88.5054420982081, -88.5050486980954,
-88.5043602979089, -88.503950497802, -88.5030079642008, -88.5026474974216,
-88.5024670963282, -88.5021638972885, -88.5017949638584,
-88.5011964970556, -88.5007291625708, -88.5003356968431,
-88.5000733644894, -88.4995530966614, -88.4992828965952,
-88.4991353632296, -88.4988241621158, -88.4978578962542,
-88.4970552950191, -88.4966703626424, -88.4961707635611,
-88.4957039624066, -88.4953681623151, -88.4950240955677,
-88.4949340955515, -88.4949023936406, -88.4950259, -88.4958867,
-88.4958892996846, -88.4958934959405, -88.4959345626365,
-88.4959345735406, -88.495952, -88.495934652055, -88.4959346959925,
-88.4958924143864, -88.4958568, -88.4956595174421, -88.4955990959278,
-88.4942066955917, -88.4939282965622, -88.4936905621144,
-88.4935757620763, -88.4934609620274, -88.4933134963492,
-88.4932233619505, -88.4931496942277, -88.4930676952448,
-88.4928298941028, -88.4927069617738, -88.4926579617795,
-88.492502361743, -88.4923466950366, -88.4917894948673, -88.491371560357,
-88.4910028946195, -88.4904129611235, -88.489601960919, -88.4880702938715,
-88.4877671604668, -88.4871856947, -88.486505760167, -88.4859897610823,
-88.4856375599624, -88.4853590921837, -88.4851131598225,
-88.4848346930846, -88.4846217597037, -88.4843187596332,
-88.4837124928213, -88.4829916926465, -88.4822133601554,
-88.4818610934022, -88.4814678933171, -88.4810583578086,
-88.4807446062768, -88.4806134, -88.4805403657046, -88.4804930920344,
-88.4801162919402, -88.4793052917649, -88.4785353582607,
-88.4780437571135, -88.4773719579938, -88.4767903578453,
-88.4763723577325, -88.4759628909649, -88.475544957538, -88.4750780907642,
-88.4748164123184, -88.4747512, -88.4746682769691, -88.4744716906139,
-88.4740211571852, -88.4739286616952, -88.4737863, -88.4731963230376,
-88.4730752425899, -88.4726702, -88.4724990195067, -88.4723332901092,
-88.4720875556964, -88.4717270899806, -88.471415757605, -88.4711290908862,
-88.4708176887381, -88.4700310895845, -88.4697689561983,
-88.4697772905892, -88.4698359639432, -88.4698524, -88.4701885,
-88.4704588, -88.4705408, -88.4705417760872, -88.4705475553996,
-88.4705640887547, -88.4705395564697, -88.470391956444, -88.4701708897271,
-88.4697611552469, -88.4695233562249, -88.4693432895183,
-88.4692859561823, -88.4693429972022, -88.4693529, -88.4695414,
-88.4698939, -88.4704921, -88.4705905, -88.4705899945742,
-88.470597289916, -88.4705726899343, -88.4703843565802, -88.4700074898235,
-88.4694175563549, -88.4685981572128, -88.4682048894127,
-88.4677378893081, -88.4669347547426, -88.4661891556284,
-88.4648535553548, -88.4642308895986, -88.4637228884622,
-88.4635180884296, -88.4632476883659, -88.4627722882469,
-88.462542889245, -88.4622807548297, -88.4621741558475, -88.4620347547652,
-88.4619773558024, -88.4619939558226, -88.4620594881479,
-88.4618300880893, -88.4617152880721, -88.461715487228, -88.4618481,
-88.4620449, -88.462217, -88.4622745, -88.4622745420298,
-88.462281288321, -88.4622975550178, -88.4621173550003, -88.4619453549787,
-88.461748688257, -88.461617488213, -88.4611091546954, -88.4606910879008,
-88.4602485544479, -88.4599288876997, -88.4595765553539,
-88.4593306875978, -88.4590848864975, -88.4586585540912,
-88.4581339539412, -88.4577979538571, -88.4569374869947,
-88.456552286902, -88.4558063533968, -88.4555850866891, -88.4554704866786,
-88.4554622866936, -88.4555032867222, -88.4555115534165,
-88.4553229533797, -88.4551425543771, -88.4550934866637,
-88.4551098866838, -88.4550607533461, -88.4549378866463,
-88.4547000865643, -88.4539785530056, -88.4537409519028,
-88.4536507529366, -88.4536747432825, -88.4537588, -88.453972,
-88.4544721, -88.454636, -88.4546393570581, -88.4546427522534,
-88.454675553316, -88.4546839533412, -88.4545774877057, -88.4542986855777,
-88.4539626875878, -88.4532331530418, -88.4514625526316,
-88.4510363525254, -88.4506427524317, -88.4500854866599,
-88.4494050854324, -88.4492247520615, -88.4490279520289,
-88.448823085333, -88.4486836853032, -88.4484869519197, -88.448331152918,
-88.4481180851537, -88.4474950839598, -88.4469457515396,
-88.4466423514614, -88.4461095513005, -88.4459619523072,
-88.4455684845019, -88.4453717511243, -88.4450191510384,
-88.4445928842713, -88.4441337508365, -88.4438386851351,
-88.4434286839897, -88.4433218077938, -88.4431043858805,
-88.4429122838772, -88.4426006838299, -88.4424366838083,
-88.4421825504212, -88.4414364835658, -88.4408297500811,
-88.4403214832803, -88.4397393498015, -88.4389932840028,
-88.4377223504024, -88.4374189492925, -88.4369024824883,
-88.4366237490978, -88.4363530823789, -88.4362300834058,
-88.4360660823333, -88.4351558821212, -88.434393348615, -88.4340325495882,
-88.4335897494885, -88.4331469483496, -88.4327204815782,
-88.4319742813911, -88.4309246800824, -88.4302358809598,
-88.4296044808325, -88.4292271484772, -88.4285874806306,
-88.4282512815956, -88.4279969471777, -88.4278493471452,
-88.4275131470644, -88.4271604803017, -88.4269636792182,
-88.4268488802276, -88.426725880187, -88.4266766791342, -88.426676547905,
-88.4266109468581, -88.4265126791218, -88.4263567467893,
-88.4262911467856, -88.4263156791183, -88.4261762811751,
-88.426020480091, -88.4259220800588, -88.42569254663, -88.425626879943,
-88.4255202788867, -88.4254136799103, -88.425167546514, -88.4250937465036,
-88.4250854809012, -88.4250281454725, -88.4248394808408,
-88.4246918797733, -88.4245687464085, -88.4244129463543,
-88.4243310796631, -88.4242981463245, -88.4243309463464,
-88.4243474796983, -88.4242899453121, -88.4239290795869,
-88.4237323462034, -88.4236911462165, -88.423461679492, -88.4232483460967,
-88.423018679373, -88.422748079315, -88.422567679264, -88.4224035459007,
-88.4223296792445, -88.4224034792983, -88.4225264783199,
-88.4225504678011, -88.4227164, -88.4227984, -88.4227988480947,
-88.4228051451414, -88.42283787954, -88.4227476784779, -88.4226410805432,
-88.4225179461341, -88.4224441461196, -88.4224719328056,
-88.4226506, -88.4226506, -88.4226573462016, -88.4226573451683,
-88.422468680544, -88.4223784805427, -88.4223537461918, -88.4223996489505,
-88.4225356, -88.4228307, -88.4233064, -88.4243399, -88.4250698,
-88.4253568, -88.4255373, -88.4256767, -88.4257997, -88.4258735,
-88.4260128, -88.4262344, -88.426587, -88.426792, -88.4269725,
-88.4275629, -88.4285881, -88.4290145, -88.429195, -88.4295968,
-88.4301791, -88.4306056, -88.4315486, -88.4321719, -88.4333119,
-88.4338203, -88.4341811, -88.4362723, -88.4367397, -88.4375023,
-88.4378303, -88.4381338, -88.4385765, -88.4394622, -88.439946,
-88.4401099, -88.4401143527293, -88.4401166853202, -88.4401658843089,
-88.4401413509771, -88.4401479487416, -88.4402658, -88.4403477,
-88.4404543, -88.4406593, -88.4418402, -88.4419045092626,
-88.4418714837075, -88.4418704647479, -88.4418647, -88.4418565,
-88.4419221, -88.442332, -88.4425781, -88.4426846, -88.4427912,
-88.4432176, -88.4434883, -88.4436194, -88.4438899, -88.4443655,
-88.4447509, -88.4451445, -88.4454397, -88.4459562, -88.4465548,
-88.4471862, -88.4476452, -88.4479732, -88.4481782, -88.4481536,
-88.4480961, -88.4481207, -88.4483421, -88.4485224, -88.4485963,
-88.4486003988524, -88.4486030852598, -88.4486499017249,
-88.4486947, -88.4488832, -88.4490063, -88.44908, -88.4490143,
-88.4489898, -88.4491947, -88.4493259, -88.4494078, -88.4494121018164,
-88.4494145531453, -88.4494556854623, -88.4493519881416,
-88.4494244, -88.4497276, -88.4498753, -88.4500556, -88.4502524,
-88.4504081, -88.4505147, -88.4507197, -88.4509903, -88.4520478,
-88.4522035, -88.4521871, -88.4522445, -88.452433, -88.4528347,
-88.4530889, -88.4532446, -88.453302, -88.4534577, -88.4540725,
-88.4548431, -88.4551054, -88.4553678, -88.4556138, -88.4557203,
-88.4558597, -88.4560236, -88.4564089, -88.4566221, -88.4567777,
-88.4575236, -88.4582041, -88.4589582, -88.4592615, -88.4595485,
-88.4597863, -88.459901, -88.4600485, -88.4604666, -88.4607863,
-88.4610486, -88.4611879, -88.4616306, -88.4618929, -88.4621225,
-88.4622864, -88.4624831, -88.4628438, -88.4629503, -88.4630979,
-88.4634503, -88.4637618, -88.4644912, -88.4651305, -88.4655731,
-88.4661632, -88.4668189, -88.4671631, -88.4675565, -88.4681057,
-88.4683762, -88.4687368, -88.4691384, -88.4698105, -88.4708432,
-88.4716711, -88.4719581, -88.4722203, -88.4726545, -88.4731627,
-88.4738265, -88.4744658, -88.4748675, -88.4753101, -88.475892,
-88.4762444, -88.4768016, -88.4773262, -88.4776538, -88.4782274,
-88.4784866, -88.4783801, -88.478644, -88.478957, -88.4791369,
-88.4793243, -88.4796907, -88.4804022, -88.4809261, -88.4813245,
-88.4815788, -88.482005, -88.4823246, -88.4825702, -88.4828076,
-88.4833238, -88.4837088, -88.4839548, -88.4841516, -88.4843156,
-88.484455, -88.4847007, -88.4849628, -88.4853642, -88.48579,
-88.486265, -88.4870187, -88.4878868, -88.4889763, -88.4893695,
-88.4908031, -88.4927854, -88.4936291, -88.4940224, -88.4945548,
-88.4958653, -88.4979866, -88.4987238, -88.4995182, -88.500069,
-88.5013158, -88.5032592, -88.5040467, -88.5049734, -88.5055473,
-88.5065067, -88.5085647, -88.5103929, -88.5117947, -88.5124669,
-88.5136556, -88.5143442, -88.5152132, -88.5155411, -88.517246,
-88.5191478, -88.5198118, -88.520279, -88.520779, -88.5209266,
-88.5212544, -88.5214101, -88.5215166, -88.5215249, -88.5215824,
-88.5218119, -88.522238, -88.5228036, -88.5240739, -88.5247296,
-88.5258114, -88.5261638, -88.5273111, -88.5274996, -88.5276471,
-88.5279418, -88.5281058, -88.5282369, -88.5285156, -88.5287533,
-88.5289581, -88.5290318, -88.5290287470775, -88.52903857235,
-88.5289811723406, -88.5286533722516, -88.5283173044734,
-88.5280141054454, -88.5279422023373, -88.5281627, -88.5281650526895,
-88.5281695055353, -88.5282103722305, -88.5281611722428,
-88.5280053055529, -88.5276611054639, -88.526874171937, -88.5262595051234,
-88.5256447049864, -88.5246037047324, -88.522849504301, -88.5221281707928,
-88.5210051705243, -88.5208575704944, -88.5208575038377,
-88.5208770741627, -88.5210309, -88.5213669, -88.5220637,
-88.5224653, -88.5229981, -88.5233752, -88.5235473, -88.5237193,
-88.5237202948911, -88.5237261046202, -88.5237425046403,
-88.5236029723263, -88.5234553712515, -88.5224471710035,
-88.5221355709379, -88.5212667040689, -88.5211435707124,
-88.5211506795259, -88.5211941, -88.5215383, -88.5220055,
-88.5220874, -88.5221284, -88.5221286744956, -88.5221351710146,
-88.5221512264353, -88.5221938, -88.5223659, -88.5226035,
-88.5228494, -88.5238576, -88.5248658, -88.5249314, -88.5250214,
-88.5250787, -88.5255378, -88.5280048, -88.5288653, -88.5293244,
-88.5295129, -88.5297998, -88.5301114, -88.5302179, -88.5306113,
-88.5309392, -88.5312259, -88.5314554, -88.5315456, -88.5316276,
-88.5316240232299, -88.5316343735374, -88.5315523735354,
-88.5313801734996, -88.5312653734732, -88.5305523743233,
-88.5302081075793, -88.5297489731147, -88.5294949063885,
-88.529208106319, -88.5283885061044, -88.5277081726079, -88.5273065058353,
-88.526716305695, -88.5260441065962, -88.5255519710956, -88.5253633710514,
-88.5246421052473, -88.5238879050688, -88.523387771614, -88.5220599046154,
-88.5216335711859, -88.5211335043961, -88.5189527705318,
-88.5175917712538, -88.5170425034087, -88.5164029709674,
-88.5158701031407, -88.5156569697564, -88.5153455029999,
-88.5152307040119, -88.5151649696383, -88.514976302939, -88.5140907683624,
-88.5130411014624, -88.5120899022905, -88.5116225021816,
-88.5111961687437, -88.510655101937, -88.5101221684511, -88.5095561673193,
-88.5088835682311, -88.5084407681289, -88.508178301391, -88.5079161023565,
-88.5077109679338, -88.5072353011707, -88.5068827010882,
-88.5066367010195, -88.506448166586, -88.5063417665439, -88.5062679675627,
-88.5058497674523, -88.505505566314, -88.5053989683644, -88.5049647005114,
-88.5047435014712, -88.5045633003536, -88.5044813669815,
-88.5044817127656, -88.5044746, -88.5045322, -88.5046143,
-88.5048111, -88.5048523, -88.5048363498212, -88.5046952992333,
-88.5046945875642, -88.5046885, -88.5046743899093, -88.5044905002057,
-88.5042201001261, -88.5038099000266, -88.5035312999411,
-88.5031375654808, -88.5026210997225, -88.5025718997157,
-88.5025552997314, -88.5021042996225, -88.5017022985014,
-88.5010789660609, -88.5000792991694, -88.4992602979484,
-88.4985066988277, -88.4977040976177, -88.4973517652462,
-88.4969912984929, -88.496934098491, -88.4969587651771, -88.4969506985187,
-88.4968360984966, -88.4967623641146, -88.49675486327, -88.4968705,
-88.4972555, -88.4978455, -88.4990745, -88.5000658, -88.5004966,
-88.5008573, -88.501095, -88.5012343, -88.5013653, -88.5014799,
-88.5014801372415, -88.5014866997846, -88.5015601675458,
-88.5014945008822, -88.5011498997721, -88.5007313663635,
-88.5000752985153, -88.4995745661301, -88.4992469660604,
-88.4985915659101, -88.4974038989825, -88.4966749644628,
-88.4958640986635, -88.4952823651968, -88.4947417650886,
-88.4940291638931, -88.4934309647971, -88.4930460980471,
-88.492087365527, -88.4910878986301, -88.4904651641015, -88.4902602973722,
-88.4901782973493, -88.4899567639339, -88.4896451627682,
-88.4896420721528, -88.4896384, -88.4895644, -88.4895643,
-88.4896134, -88.4897281, -88.4909404, -88.4923819, -88.4931027,
-88.4931845, -88.4931682902256, -88.4930351643251, -88.4928465632234,
-88.4925106975077, -88.4921992974272, -88.4918797640191,
-88.4914947639249, -88.491093163818, -88.4908964970938, -88.4906095636741,
-88.4898965634774, -88.4894294966794, -88.4892655632961,
-88.4892245632809, -88.4892197770529, -88.4892178, -88.4891849,
-88.4891684, -88.4891076870011, -88.4889536964786, -88.4884374963403,
-88.4881505629357, -88.4874788971503, -88.4870199626598,
-88.4868642969991, -88.4867003625733, -88.4866955321194,
-88.4866936, -88.4866078001473, -88.4864787635162, -88.4862084957375,
-88.4859870946273, -88.4857248966419, -88.485257762159, -88.4841924952258,
-88.4836599617659, -88.4822012947217, -88.4817342946229,
-88.4816280316922, -88.481094, -88.4808058446996, -88.4805952943486,
-88.48018556092, -88.4799165579114, -88.4798857, -88.4795272,
-88.4791894, -88.4791125859771, -88.4789480939293, -88.4787733058272,
-88.4787669, -88.4785315, -88.4784061, -88.4781753, -88.4781687029274,
-88.478153293754, -88.4779320937038, -88.4775139602627, -88.47637495999,
-88.4758257598507, -88.4754734941425, -88.4753177597384,
-88.4752851717776, -88.475344, -88.4753439222542, -88.4753507587321,
-88.4753261608178, -88.4750147596988, -88.4750065597063,
-88.4750245669057, -88.475254, -88.4756474, -88.4759588,
-88.476008, -88.4761557, -88.4763605, -88.4765408, -88.4767539,
-88.4768769, -88.4768728731589, -88.4768836946229, -88.4767608925266,
-88.476318360122, -88.4759248944002, -88.4757282933235, -88.4756546943749,
-88.4754580922683, -88.4751138932442, -88.4745237587131,
-88.4739910939931, -88.4738863006828, -88.4735439, -88.4730597,
-88.4727987, -88.4724868, -88.4721979, -88.471826, -88.4716660904083,
-88.4713274912883, -88.4707292911513, -88.4699753586988,
-88.4692050929344, -88.4684837584028, -88.4683525573363,
-88.4683654452738, -88.4684526, -88.4684466226611, -88.4684593584228,
-88.4683199583888, -88.4682543594243, -88.468254358517, -88.4684034,
-88.4685757, -88.4689692, -88.4694855, -88.4703051, -88.4708543,
-88.4713051, -88.4716657, -88.471969, -88.4723706, -88.4728215,
-88.4734855, -88.4742641, -88.4752395, -88.4759116, -88.4763052,
-88.4770265, -88.4776822, -88.478551, -88.4791657, -88.4796001,
-88.4800345, -88.4802395, -88.4802886, -88.4804034, -88.4805019,
-88.4805024142178, -88.4805086939419, -88.4805251616779,
-88.4804923616895, -88.4804515606477, -88.4803695616748,
-88.4800418949334, -88.4795582948161, -88.4788943613255,
-88.478205960114, -88.4773289609349, -88.4760422949906, -88.4754604927738,
-88.4752310937878, -88.474952360389, -88.4743459602345, -88.4741163601818,
-88.4736574934197, -88.473239559997, -88.4729198932563, -88.472477159805,
-88.4719853596777, -88.4716493595953, -88.4711658928256,
-88.4709936927814, -88.4707230916609, -88.4704689592989,
-88.4702149592394, -88.4699772925257, -88.469739559143, -88.4690182912538,
-88.468788758911, -88.4676738919732, -88.4671411595574, -88.466575558378,
-88.4662312926814, -88.4659525582334, -88.4656410914819,
-88.4648950902684, -88.4645918912495, -88.4641819578158,
-88.4637392910463, -88.4633376909502, -88.4628128908101,
-88.4621160906443, -88.4616816895039, -88.4614192904784,
-88.4611077560261, -88.460566756956, -88.4602141568693, -88.4599026901186,
-88.4597960890607, -88.4595173556702, -88.4592222899763,
-88.45914028996, -88.4591470302083, -88.4592812, -88.4594778,
-88.4605026, -88.4610766, -88.4620931, -88.4623638, -88.4624375,
-88.4624412527048, -88.4624442908137, -88.4624771575014,
-88.4624033575153, -88.4624167070851, -88.4624704, -88.4626917,
-88.4630689, -88.4631508, -88.4631755, -88.4631304823899,
-88.4629689576096, -88.4628786898565, -88.462878501561, -88.4628719,
-88.4628473, -88.4629211, -88.4631588, -88.4636097, -88.4644869,
-88.4658149, -88.4662165, -88.4668395, -88.4676185, -88.4678809,
-88.4680448, -88.4681268, -88.4681185, -88.4680692, -88.4681758,
-88.4683397, -88.4686022, -88.4689301, -88.4693318, -88.470004,
-88.470291, -88.4705123, -88.4708813, -88.4710125, -88.4713732,
-88.4718816, -88.4723324, -88.4725373, -88.4725701, -88.4725542781112,
-88.4723880933715, -88.4723869496059, -88.4723813, -88.4723403,
-88.4724057, -88.4725943, -88.4728647, -88.4734385, -88.4738893,
-88.474496, -88.4748075, -88.4749879, -88.4751192, -88.475947,
-88.4764471, -88.476611, -88.4766438, -88.4766272, -88.4766354,
-88.4768648, -88.477619, -88.4784962, -88.4789962, -88.4795618,
-88.4803979, -88.480775, -88.4810782, -88.4813242, -88.4815619,
-88.4818082, -88.4818095788932, -88.4818149625666, -88.4818970959571,
-88.4818971626372, -88.4818890959747, -88.4817415626132,
-88.4815038958905, -88.4806842956817, -88.4804547633381,
-88.4800940955422, -88.4790366952648, -88.4785285628449,
-88.4780859616995, -88.4776514949124, -88.4773400958826,
-88.4767990946976, -88.4760776945166, -88.4760122945139,
-88.4757909611321, -88.4755696944069, -88.475413894372, -88.4754065526729,
-88.4754647, -88.475563, -88.4758746, -88.4765878, -88.476973,
-88.477678, -88.4781535, -88.4787437, -88.4795307, -88.479965,
-88.4808748, -88.4815143, -88.4823094, -88.4827929, -88.4835715,
-88.4838667, -88.4841781, -88.4842601, -88.4842615814307,
-88.4842668967642, -88.4842833644902, -88.4842261624117,
-88.4841687634406, -88.4840703634193, -88.4833082965742,
-88.4828656964663, -88.4821116962794, -88.4811197626914,
-88.4806854969678, -88.480423296915, -88.4803249625304, -88.4801282958204,
-88.4797922957388, -88.4792593612112, -88.4790545621994,
-88.4788002954699, -88.4787184954571, -88.4786869103387,
-88.4787773, -88.4790315, -88.4797448, -88.4801874, -88.4804496,
-88.4807201, -88.4815155, -88.4819252, -88.4821958, -88.482655,
-88.483286, -88.4838679, -88.4844581, -88.4850975, -88.4857042,
-88.4859829, -88.4861795, -88.4863597, -88.4865892, -88.4870401,
-88.4874417, -88.4878433, -88.4881465, -88.4883923, -88.4886543,
-88.4893671, -88.4905879, -88.4917433, -88.4919481, -88.4920709,
-88.4921117, -88.4920295, -88.4919637, -88.4920946, -88.4924714,
-88.4931107, -88.4937172, -88.4942501, -88.494373, -88.4943691771854,
-88.4943797659588, -88.4942869515558, -88.4944471, -88.4948323,
-88.4950616, -88.4952992, -88.4955777, -88.4960038, -88.4961347,
-88.4962247, -88.4963639, -88.4966837, -88.4968476, -88.496913,
-88.4968975238819, -88.4967310997939, -88.4967275876607,
-88.4967243, -88.4966503, -88.4967319, -88.4969282, -88.4974032,
-88.4982301, -88.4991064, -88.5000647, -88.5009157, -88.5009312100312,
-88.5008243670709, -88.5007013670295, -88.500537366987, -88.5002749669274,
-88.5000781002098, -88.4997843011803, -88.4990223666411,
-88.4983917665152, -88.4981705675017, -88.4978262997026,
-88.4976623652777, -88.497604967339, -88.4976024307287, -88.4975982,
-88.4975654, -88.4976388, -88.4979502, -88.4989412, -88.4991786,
-88.4995471, -88.4998255, -88.5000647, -88.5005323, -88.5012541,
-88.5021565, -88.5025174, -88.5033628, -88.503691, -88.5039866,
-88.5046509, -88.5053647, -88.5063408, -88.5066195, -88.5074891,
-88.5078252, -88.5080302, -88.5084483, -88.5087597, -88.5090219,
-88.5091942, -88.5098502, -88.5099652, -88.5099981, -88.5099656,
-88.5100807, -88.5102613, -88.5104909, -88.5107369, -88.5110403,
-88.5114746, -88.5118844, -88.511999, -88.511998312218, -88.5120057692528,
-88.5119563692592, -88.5119641693378, -88.5120234, -88.5121873,
-88.5125399, -88.5128516, -88.5133106, -88.5141634, -88.5143849,
-88.514467, -88.5145003, -88.5145496, -88.5146891, -88.5152876,
-88.5155336, -88.5160257, -88.516321, -88.5168294, -88.5180509,
-88.5189362, -88.5194689, -88.520461, -88.5214366, -88.5225434,
-88.523224, -88.5245683, -88.5247486, -88.5250847, -88.5255272,
-88.5257485, -88.5259286, -88.5259325676826, -88.5259353726145,
-88.5260909060361, -88.5261071727446, -88.5259923060583,
-88.523992105569, -88.5224261718651, -88.5216717717, -88.5215159716617,
-88.5211225715457, -88.5200485046307, -88.5194499701205,
-88.5191877044343, -88.5191875063854, -88.5192462, -88.5192459539118,
-88.5192529711454, -88.5192201711469, -88.518744704373, -88.5185149709828,
-88.5183591709478, -88.518342770952, -88.5184360167362, -88.5184916,
-88.5186064, -88.5188441, -88.5189588, -88.5190326, -88.5195737,
-88.5197869, -88.5198198, -88.5198855, -88.5200249, -88.5212954,
-88.5225006, -88.5229923, -88.5236072, -88.524263, -88.5250664,
-88.5251811, -88.5251858213429, -88.5251879060464, -88.5252207727324,
-88.5251879060648, -88.5246303049081, -88.5244171725629,
-88.5239089057723, -88.522957972202, -88.5227365054952, -88.5227287510998,
-88.5228607, -88.5231229, -88.5233031, -88.5235818, -88.5241147,
-88.5253116, -88.5261642, -88.5268611, -88.5273283, -88.5275825,
-88.5280333, -88.5286155, -88.5292139, -88.530017, -88.5308039,
-88.5316317, -88.5320907, -88.5326072, -88.533263, -88.5335088,
-88.5340908, -88.5346647, -88.5353695, -88.5365581, -88.5374679,
-88.5387139, -88.5396975, -88.5408859, -88.5417711, -88.5429186,
-88.5434595, -88.5442299, -88.5448773, -88.5456477, -88.5474588,
-88.547762, -88.5482619, -88.5489093, -88.5494665, -88.5502041,
-88.5507286, -88.551507, -88.5519331, -88.5526132, -88.5531131,
-88.5538424, -88.5543012, -88.5544815, -88.5546371, -88.5547683,
-88.5547682958853, -88.5547751134821, -88.5547749812029,
-88.5546603134766, -88.5543817144521, -88.553775313262, -88.553472114239,
-88.553308179835, -88.5532835798433, -88.5532902505288, -88.5533915,
-88.5538912, -88.5540224, -88.5540235556285, -88.554029180095,
-88.5540455134467, -88.5538569800768, -88.5535621133447,
-88.5534063122849, -88.5532835132961, -88.5528491131658,
-88.5524311797198, -88.5521033796434, -88.5519313796135,
-88.5519149796368, -88.5518739129642, -88.5513167117792,
-88.5511117794467, -88.5509233127543, -88.5509149794493,
-88.5507757127595, -88.5505873116704, -88.5504643793432,
-88.5502265792579, -88.5499891125143, -88.5496203124143,
-88.5492105789826, -88.5490465778952, -88.548448512075, -88.5481289119827,
-88.5477847785545, -88.5473749784535, -88.5470307783762,
-88.5464325115995, -88.5462521782212, -88.5458015114233,
-88.545383511319, -88.5446049788247, -88.5438837109498, -88.542187110539,
-88.5416545104209, -88.5414331103841, -88.5412525770325,
-88.5410313113556, -88.5404739768407, -88.5401543101068,
-88.5399903111194, -88.539826377772, -88.5396787100439, -88.5395065766723,
-88.5391459765799, -88.5388919098537, -88.5387525764965,
-88.5386377775335, -88.5385557764782, -88.5381705097147,
-88.5371541761101, -88.5360475758117, -88.5353263745785,
-88.5347363087882, -88.5345069097681, -88.5340559096769,
-88.5338919085961, -88.5334901751576, -88.5332279740598,
-88.5327033083074, -88.531334373612, -88.5307605078536, -88.5298093743101,
-88.5293667075355, -88.5289979074381, -88.5282929739056,
-88.5281781728392, -88.5280797082538, -88.5279073738455,
-88.5278501082137, -88.5278366518727, -88.5279252, -88.5280727,
-88.5282531, -88.528417, -88.5290073, -88.5295482, -88.5300235,
-88.5305071, -88.530794, -88.5309332, -88.5310562, -88.5310565066932,
-88.5310629747904, -88.5310711071012, -88.5308415081128,
-88.5308488684733, -88.5309411, -88.5311049, -88.5312443,
-88.5313346, -88.5316951, -88.5321625, -88.5325806, -88.5331298,
-88.5334412, -88.5337774, -88.5340398, -88.5342611, -88.5347283,
-88.5349907, -88.5351628, -88.5352119, -88.5353266, -88.5354578,
-88.535548, -88.5355484488159, -88.535554776006, -88.5355629093586,
-88.5354973093658, -88.5354397760255, -88.5353249760026,
-88.5348085758836, -88.5336443755991, -88.5332919755092,
-88.5331525765068, -88.5329559753926, -88.5327511086616,
-88.5325625752782, -88.5324805752628, -88.5324477086061,
-88.5322181752192, -88.5317509084237, -88.5312427072589,
-88.5307179748365, -88.5305787091842, -88.5305867081735,
-88.530512774844, -88.5303325081423, -88.5300455080793, -88.5296847746544,
-88.5291273078493, -88.5290125078288, -88.5290273634377,
-88.5291121, -88.5292433, -88.5294237, -88.5297599, -88.5300549,
-88.5302106, -88.530268, -88.5302669108516, -88.5302747748614,
-88.530258308203, -88.5300615748296, -88.5293563746555, -88.528561107806,
-88.528520107805, -88.5285263801409, -88.5286445, -88.5288494,
-88.5291445, -88.5297922, -88.5303907, -88.5305138, -88.5306366,
-88.530735, -88.5310711, -88.5315218, -88.5318744, -88.5320384,
-88.532317, -88.5328581, -88.5332597, -88.5335385, -88.533768,
-88.5338746, -88.5339565, -88.5339571197511, -88.5339633102852,
-88.5339713759227, -88.533954975936, -88.5338401759181, -88.5337009092225,
-88.5334629768738, -88.5328975090229, -88.532692375642, -88.5321431088662,
-88.5316429754098, -88.5308233085168, -88.5306429084793,
-88.5304625084527, -88.529954108342, -88.5297983749562, -88.5296919082642,
-88.529593307217, -88.5295277749117, -88.5293965748703, -88.5292325748253,
-88.5288553747486, -88.5282323079341, -88.5272321076778,
-88.527059907647, -88.5269451076223, -88.5268303065534, -88.5268646687262,
-88.5269546, -88.527299, -88.5273644, -88.5274055, -88.5274053293658,
-88.5274123077779, -88.5274039744587, -88.5272727744357,
-88.5269611754092, -88.5269037743614, -88.5268299066604,
-88.5266739743446, -88.5265099076455, -88.5265099086399,
-88.5266178, -88.5266195927231, -88.5266245743711, -88.5266573077271,
-88.5266409077388, -88.5260829743204, -88.5259189086806,
-88.5253859075206, -88.5252545741625, -88.5252053741749,
-88.5250413085283, -88.5250492656717, -88.5250836, -88.5253376,
-88.5259443, -88.5262476, -88.5266412, -88.5268215, -88.5269774,
-88.5271414, -88.5274447, -88.5282319, -88.5287157, -88.5292569,
-88.5299536, -88.5304375, -88.5309457, -88.5319952, -88.533561,
-88.5340529, -88.5348155, -88.5359633, -88.5369142, -88.5374061,
-88.5378899, -88.5388652, -88.539767, -88.5408491, -88.5416033,
-88.5419721, -88.5433492, -88.5451361, -88.5455459, -88.546087,
-88.5463656, -88.5470049, -88.5477017, -88.5482016, -88.5497426,
-88.5503245, -88.5508819, -88.5512506, -88.5517671, -88.5528407,
-88.5534472, -88.5541109, -88.5546929, -88.5555124, -88.5564058,
-88.5566926, -88.5572089, -88.5579137, -88.5581841, -88.5583972,
-88.5583972, -88.5583701741166, -88.5582073821175, -88.5579615153839,
-88.5561013148958, -88.5558143825229, -88.5555277147241,
-88.5554047146726, -88.555399083463, -88.5553979, -88.5553242,
-88.5553161205248, -88.5552737812478, -88.555068915556, -88.5549295155178,
-88.5544623799933, -88.5535691808145, -88.5531593807001,
-88.5529955129411, -88.5528479805911, -88.5528445282331,
-88.5528412, -88.5527839, -88.5528085, -88.5529860522741,
-88.5529137138571, -88.5527415804721, -88.5523645814096,
-88.5522581126266, -88.5521187802801, -88.5521148878095,
-88.552112, -88.5520465, -88.5520547, -88.5521039, -88.5522925,
-88.5522764376596, -88.5521763791618, -88.5519223134263,
-88.5517503133648, -88.5516027799841, -88.5514143799282,
-88.5511849132055, -88.5508243131224, -88.5496359794879,
-88.5494637794329, -88.5492837126989, -88.5492777440786,
-88.5492769, -88.5490393, -88.5489819, -88.5490639, -88.5491952,
-88.5494655, -88.5499572, -88.5505719, -88.5507194, -88.5511866,
-88.5513095, -88.5518339, -88.5519487, -88.5519812780747,
-88.5519473132276, -88.5518489809005, -88.5515703131042,
-88.5514637786845, -88.5514593949357, -88.551457, -88.5514161,
-88.55149, -88.5515595, -88.551621, -88.5517357, -88.5521127,
-88.5524568, -88.5530878, -88.553809, -88.5541368, -88.5552348,
-88.556464, -88.556841, -88.5570541, -88.5572589, -88.5577423,
-88.5577833, -88.557761088907, -88.5576343810799, -88.5574871143626,
-88.5573641153529, -88.5572821809407, -88.5572811666859,
-88.5572754, -88.5572508, -88.5572917, -88.5577752, -88.557808,
-88.5578408, -88.5582423, -88.5588568, -88.5590616, -88.5591599,
-88.5593894, -88.5594631, -88.5594634162221, -88.5594699148418,
-88.5594781148561, -88.5594617159069, -88.5592895815028,
-88.5592651148412, -88.5592815148604, -88.5593334491479,
-88.5594713, -88.5596187, -88.5597989, -88.5598482, -88.5597909,
-88.5597908, -88.5599793, -88.5601104, -88.5602087, -88.5602093019918,
-88.5602155151003, -88.5602319151187, -88.5602085064606,
-88.5602742, -88.5604791, -88.5605528, -88.5605593380233,
-88.5605595819069, -88.5606005152612, -88.5605620197796,
-88.5606101, -88.5607576, -88.560946, -88.5611509, -88.5615033,
-88.5620932, -88.5631583, -88.5640595, -88.5648789, -88.5651492,
-88.5652803, -88.565559, -88.5656491, -88.5657883, -88.5658621,
-88.5659358, -88.5664683, -88.5667634, -88.5686887, -88.5689018,
-88.5690082, -88.5691967, -88.5693442, -88.5698112, -88.570696,
-88.571761, -88.5722772, -88.5731702, -88.574309, -88.5753986,
-88.5762916, -88.576775, -88.5775942, -88.5778482, -88.5779711,
-88.5780449, -88.5780503030444, -88.5780517201978, -88.5780843868821,
-88.5780761868913, -88.5779615868676, -88.5778877868581,
-88.5778879202057, -88.5778305201963, -88.5775601857451,
-88.5772571200372, -88.5771177866691, -88.5770849866698,
-88.5770849866866, -88.5771835200721, -88.5771833867438,
-88.5770851867175, -88.5769703866795, -88.5766343865438,
-88.5764869864965, -88.5763231864466, -88.57615111973, -88.5758479206896,
-88.5756021862494, -88.5754465195496, -88.5752909195249,
-88.5751679851369, -88.5748075194304, -88.5743487859769,
-88.5736359868247, -88.5714893851797, -88.5707193849714,
-88.5700065181067, -88.5691461845489, -88.5673191173836,
-88.5656067169279, -88.5639189164924, -88.5630421162687,
-88.5622965160646, -88.5621653827007, -88.5621579276082,
-88.5622077, -88.5624208, -88.5626584, -88.5632647, -88.5637155,
-88.5641578, -88.5647069, -88.5658129, -88.5664193, -88.5669273,
-88.5671485, -88.5673124, -88.5674762, -88.567681, -88.5677712,
-88.5677754181356, -88.5677779832418, -88.5678353176504,
-88.5678681843539, -88.5677697853828, -88.5674913176099,
-88.5666637163539, -88.5652379836853, -88.5645907168392,
-88.5636729832569, -88.5631977820923, -88.5630339164342,
-88.5628043830591, -88.5624929829869, -88.5619439838887,
-88.5613213816251, -88.5611001826076, -88.5606575824998,
-88.5605593158136, -88.560534715816, -88.5605418436574, -88.5606181,
-88.5607574, -88.5609458, -88.5611917, -88.5615358, -88.5619946,
-88.5626994, -88.5630927, -88.5633549, -88.5634285, -88.5635761,
-88.5637071, -88.5637139101141, -88.5637139167132, -88.5637260460594,
-88.5638137, -88.5638137023996, -88.5638205167671, -88.5638287167856,
-88.5636157177788, -88.5633615833327, -88.5628945165524,
-88.5624111164412, -88.5622717830906, -88.5622799733188,
-88.562347, -88.5625026, -88.5629287, -88.5632237, -88.5633794,
-88.5635433, -88.5637154, -88.5638793, -88.563994, -88.5641578,
-88.5642398, -88.5644938, -88.5652067, -88.565387, -88.5657884,
-88.5660916, -88.566231, -88.5666161, -88.5671076, -88.5674846,
-88.568091, -88.5683614, -88.5685089, -88.569361, -88.5697789,
-88.5707375, -88.5709998, -88.5715979, -88.5725156, -88.572999,
-88.5737937, -88.5745229, -88.5761126, -88.5772842, -88.5774071,
-88.5775463, -88.5781117, -88.579062, -88.5801026, -88.5812415,
-88.5819214, -88.582413, -88.5828226, -88.5830848, -88.5832568,
-88.5837154, -88.5840268, -88.5852637, -88.5855914, -88.5863042,
-88.5868612, -88.5871398, -88.5879343, -88.5879916, -88.5879997,
-88.5881553, -88.5887616, -88.589294, -88.5896708, -88.589933,
-88.5900231, -88.590024217205, -88.5900299239889, -88.5900381906665,
-88.5899807917105, -88.5899881862225, -88.5902035, -88.590859,
-88.5914733, -88.5926528, -88.5939798, -88.5945369, -88.5948563,
-88.5950939, -88.5954463, -88.5957166, -88.5965358, -88.5966096,
-88.596613546383, -88.5966163925362, -88.5966491925564, -88.5965919936021,
-88.5963215924994, -88.5959447924045, -88.5958221257192,
-88.5958380944176, -88.5958973, -88.5961595, -88.5964708,
-88.5969541, -88.5979371, -88.5984204, -88.5985268, -88.5985585449211,
-88.5984925264617, -88.5981893263436, -88.5981155263116,
-88.5981163160798, -88.5981087, -88.5981742, -88.5982888,
-88.5984525, -88.598723, -88.5993293, -88.6005663, -88.6016311,
-88.6029662, -88.6036952, -88.6041619, -88.6045387, -88.6046616,
-88.6048334, -88.604907, -88.6050463, -88.6055377, -88.6057343,
-88.6069789, -88.6078139, -88.6080679, -88.6083545, -88.6086084,
-88.6088787, -88.6093538, -88.6096898, -88.6101975, -88.6106073,
-88.6109105, -88.611148, -88.611746, -88.612352, -88.6125487,
-88.613335, -88.6141707, -88.614523, -88.6151699, -88.615563,
-88.6158825, -88.616112, -88.6163168, -88.6177908, -88.6181184,
-88.618536, -88.6191257, -88.6193879, -88.6198545, -88.6204524,
-88.6212386, -88.6212959, -88.621295706214, -88.6212615335942,
-88.6211713991931, -88.6209831324757, -88.620401532295, -88.6201311311663,
-88.6200411332152, -88.619983598814, -88.6199839430491, -88.6199768,
-88.619993, -88.620083, -88.620304, -88.6207463, -88.6210737,
-88.6213278, -88.6214014, -88.6214014, -88.6213097991011,
-88.6213095966026, -88.621303, -88.6212947, -88.6213519,
-88.6214911, -88.6217533, -88.6221956, -88.6223594, -88.6227115,
-88.6229817, -88.6231455, -88.6233503, -88.6235797, -88.6236617,
-88.6236609109723, -88.623668533107, -88.6236441331145, -88.6235623341426,
-88.6230953996492, -88.6229645329521, -88.6228917714441,
-88.6229169, -88.6230562, -88.623957, -88.6244646, -88.6249149,
-88.6250684, -88.6256667, -88.6262159, -88.6263962, -88.6264946,
-88.6265017763215, -88.6264605338261, -88.626345800459, -88.6259771337034,
-88.6258541336662, -88.6256822002704, -88.6256783655035,
-88.6256754, -88.6256345, -88.625651, -88.6257658, -88.6263395,
-88.6265363, -88.6265447, -88.6264964621355, -88.626428800355,
-88.6262896003044, -88.6257653324364, -88.6256672001077,
-88.6256665043791, -88.6256604, -88.6256522, -88.6256935,
-88.6257429, -88.6258413, -88.6268739, -88.627464, -88.6283491,
-88.6288735, -88.6290537, -88.6292667, -88.6295205, -88.6298482,
-88.629971, -88.6300365, -88.6300375413725, -88.6300433334788,
-88.6300596012039, -88.6299612022269, -88.6296990000816,
-88.6296252011088, -88.6296093655149, -88.6296757, -88.629782,
-88.6299049, -88.6301753, -88.6302408, -88.6302455230773,
-88.6302476013148, -88.6302835445957, -88.6303882, -88.6309535,
-88.6318219, -88.6321824, -88.6324364, -88.6328053, -88.6331251,
-88.6332316, -88.63333, -88.6335429, -88.6337888, -88.6340184,
-88.6341985, -88.6343133, -88.6344115, -88.6345263, -88.6347147,
-88.6347476, -88.6347476, -88.634674, -88.6347805, -88.6355505,
-88.6359518, -88.6362548, -88.6369595, -88.6375986, -88.6381148,
-88.6383852, -88.6386883, -88.6390898, -88.6393192, -88.639688,
-88.6408434, -88.6415892, -88.6422447, -88.642507, -88.6429167,
-88.6435395, -88.6440187, -88.6446087, -88.6451493, -88.6455754,
-88.6461242, -88.6466976, -88.6473201, -88.6478525, -88.6485979,
-88.6491876, -88.6496135, -88.6501132, -88.6502935, -88.6505803,
-88.6510389, -88.6526691, -88.6542745, -88.6548889, -88.6556506,
-88.655831, -88.6558719, -88.6558966, -88.6561096, -88.6570024,
-88.6572809, -88.6573874, -88.6574774, -88.6580998, -88.6585338,
-88.6592052, -88.659795, -88.6603108, -88.6604664, -88.6612771,
-88.6614737, -88.6616701, -88.6616717726497, -88.6616769419653,
-88.6617587430591, -88.661758743075, -88.6616685430721, -88.6614882097015,
-88.6612998096533, -88.6610050095747, -88.6606610105192,
-88.6605218094353, -88.659924009248, -88.6592359423803, -88.6587037422266,
-88.6583595410952, -88.6582204098139, -88.6581711421045,
-88.6580891420876, -88.6579500097562, -88.6578108086724,
-88.6576551409268, -88.6575239419496, -88.657392941915, -88.6568687417504,
-88.6564265426712, -88.6562462082555, -88.6558776081608,
-88.6553779413597, -88.6550831412777, -88.6547391411738,
-88.6544278077509, -88.6541657420574, -88.6538709399039,
-88.6534695418848, -88.6525029405769, -88.6520933404678,
-88.6519868071099, -88.6519211404329, -88.6519323305501,
-88.6522173, -88.6522912, -88.6522891464102, -88.6522980072245,
-88.652281541602, -88.65220780721, -88.651896540463, -88.6516180070552,
-88.6514623393088, -88.6512329402895, -88.6502664066816,
-88.6501189410235, -88.6497831398973, -88.6496397398599,
-88.6493038053944, -88.6489762063406, -88.6487715396174,
-88.6486568073003, -88.6485256062389, -88.6484436062186,
-88.6482225394852, -88.6480832071555, -88.6480094060994,
-88.6480094050703, -88.6479357394317, -88.6477144060433,
-88.6473459392752, -88.6465594057145, -88.6463055389819,
-88.6450440042686, -88.6441263384016, -88.6434791392757,
-88.6430448047973, -88.6421600045722, -88.6410291366019,
-88.6407259375665, -88.6397181373217, -88.6388249370998,
-88.6385545370363, -88.6379316025355, -88.6377266035305,
-88.637505536803, -88.6374890045137, -88.6373579367724, -88.6367680032775,
-88.636014336407, -88.6353177362283, -88.6343262026477, -88.6335232024452,
-88.6330888023427, -88.6324167355283, -88.6320152020933,
-88.6318348020493, -88.6311711352141, -88.6303927339592,
-88.6295488014382, -88.6289425335624, -88.6284180011394,
-88.62794260103, -88.6277294009892, -88.6275491342851, -88.6271555998109,
-88.6262543339398, -88.6259347338559, -88.6257381338068,
-88.6254266004047, -88.6250741336532, -88.6242677334413,
-88.6237435999776, -88.6225317329956, -88.6220075995378,
-88.621786732828, -88.6214099327282, -88.6211235326597, -88.6209843326459,
-88.6207963316022, -88.6205181325879, -88.6198137990761,
-88.6192159322546, -88.6188229321691, -88.6186183321217,
-88.6180613986345, -88.6178483985795, -88.6177911329468,
-88.6177585319051, -88.6177665762556, -88.6178173, -88.6179649,
-88.6183498, -88.6189394, -88.6193981, -88.6196357, -88.6201108,
-88.6208233, -88.6215194, -88.6228541, -88.6236812, -88.6242869,
-88.624598, -88.6250741, -88.6256642, -88.6267787, -88.6271475,
-88.6275653, -88.628565, -88.6295236, -88.6299989, -88.6309331,
-88.6318264, -88.6325392, -88.6329819, -88.6330638, -88.6335472,
-88.6338996, -88.6343829, -88.6345222, -88.6349482, -88.6353415,
-88.6358412, -88.6365539, -88.6367997, -88.6371848, -88.6377749,
-88.6383812, -88.6391104, -88.6395611, -88.6398807, -88.6402331,
-88.6403725, -88.6405199, -88.6407004, -88.6409708, -88.6412822,
-88.6416263, -88.6423392, -88.6431094, -88.6432814, -88.6434535,
-88.6437728, -88.6442725, -88.6444937, -88.6446328, -88.6451326,
-88.6463861, -88.6468121, -88.647279, -88.6475493, -88.6476804,
-88.6477623, -88.647765769598, -88.6477691388539, -88.6477936055357,
-88.6474576054728, -88.6473674075424, -88.647373459174, -88.64768,
-88.6477619, -88.6477653982924, -88.6477687399717, -88.6477851399817,
-88.6477358066533, -88.6475800066276, -88.6475717399701,
-88.6476168853233, -88.6477941, -88.6479989, -88.6481791,
-88.648392, -88.6486622, -88.6489081, -88.6494078, -88.6501698,
-88.6507024, -88.6510628, -88.6513332, -88.6517181, -88.6521604,
-88.6524225, -88.6527009, -88.6528483, -88.6530201, -88.653020151478,
-88.6530269416673, -88.6530350093958, -88.6529531416814,
-88.6527891406091, -88.6525023426213, -88.6522728092362,
-88.6514697413674, -88.6512731413258, -88.6511254079903,
-88.6508877412761, -88.6506420078827, -88.6505190088888,
-88.6502568077753, -88.6495277419558, -88.6490606064231,
-88.6480282071998, -88.646332339023, -88.6457506065799, -88.6447508063326,
-88.6437838060988, -88.6431120059261, -88.642915205877, -88.6425711391315,
-88.6421121390154, -88.6417516055832, -88.6403096051798,
-88.6400064051027, -88.6395965393869, -88.6392606049239,
-88.6385313380768, -88.6372037377356, -88.6368758053668,
-88.6365151375929, -88.6361708031466, -88.6354169373243,
-88.634802337156, -88.6341305369648, -88.6340320046553, -88.6338844035972,
-88.6337614025284, -88.6336385368721, -88.633384403471, -88.6327207366258,
-88.632130737505, -88.6314669352498, -88.6312701362506, -88.6311142028967,
-88.6309831362045, -88.6307208028093, -88.6304996037917,
-88.6297293358585, -88.6294670024506, -88.6291966023762,
-88.6285491365978, -88.6284589355391, -88.62846693557, -88.6282455355233,
-88.6277209353952, -88.6268522007941, -88.6263931350555,
-88.6263193340019, -88.6263028006744, -88.6263273350745,
-88.6263107350878, -88.6262615350852, -88.6259746027206,
-88.6255319349163, -88.6250808014936, -88.6246206013837,
-88.6240883345842, -88.6237279334444, -88.6230645343161,
-88.6227862009218, -88.6224176008346, -88.6222703341399,
-88.6222540008141, -88.6222815575749, -88.6223947, -88.6227223,
-88.6230008, -88.6232383, -88.6233202, -88.6233202084258,
-88.6233270011133, -88.6233271334185, -88.6231962011013,
-88.6229096010353, -88.6225657342832, -88.6218451341173,
-88.6215011340293, -88.6209195995112, -88.6203546004075,
-88.6197403335885, -88.6194618001748, -88.6181349342047,
-88.6180203331385, -88.6180277786068, -88.6180955, -88.6181549146325,
-88.6183153332389, -88.6184955343288, -88.6190442875494,
-88.6194225, -88.6203563, -88.6214457, -88.6228135, -88.6239274,
-88.6248855, -88.6250725, -88.6253265, -88.6255641, -88.6259904,
-88.6261133, -88.6265066, -88.626695, -88.626941, -88.6276378,
-88.6279411, -88.6284083, -88.6293099, -88.6302197, -88.6312032,
-88.6315803, -88.6321623, -88.6329737, -88.6338752, -88.6344489,
-88.6348014, -88.6351537, -88.635629, -88.6359977, -88.6363665,
-88.6366123, -88.6380871, -88.638415, -88.6385871, -88.6388739,
-88.6395132, -88.6399229, -88.6403573, -88.6410867, -88.6415537,
-88.6425452, -88.6428238, -88.6430204, -88.6431023, -88.6431679,
-88.6431924, -88.6432991, -88.6436515, -88.644979, -88.6460196,
-88.6465276, -88.6473471, -88.6478798, -88.6494943, -88.6503628,
-88.6509774, -88.651379, -88.6517807, -88.6521413, -88.6526577,
-88.6528624, -88.6536327, -88.6556153, -88.6561971, -88.6569346,
-88.657541, -88.6579998, -88.6583603, -88.6586636, -88.6587455,
-88.6589422, -88.6592453, -88.659352, -88.6598272, -88.6599092,
-88.6599748, -88.660106, -88.6602944, -88.6608023, -88.6611791,
-88.6614413, -88.6616625, -88.6616552780705, -88.6616038106976,
-88.6615055440014, -88.6611124105649, -88.6599081435668,
-88.6592857433727, -88.6588517432267, -88.6586960098385,
-88.6584585420559, -88.6580653419436, -88.6577705418507,
-88.6575657438616, -88.6574101427558, -88.6572629416402,
-88.6572629189803, -88.6572561, -88.6572478, -88.6572807,
-88.6573709, -88.6575758, -88.657928, -88.658223, -88.6583706,
-88.6585917, -88.6589932, -88.659329, -88.6594355, -88.6594765,
-88.6594765940705, -88.6593360097544, -88.6591067430001,
-88.6589102095842, -88.6587792084945, -88.6586072094822,
-88.6584516094374, -88.6579520103438, -88.6574932102262,
-88.6566412089571, -88.6561661421569, -88.6558384087297,
-88.655297941901, -88.6551750085329, -88.6549373407712, -88.6547571417605,
-88.6546507417334, -88.6538886082272, -88.6535281414725,
-88.6528072079505, -88.6524796078568, -88.6522175411107,
-88.6521356077462, -88.6521356227403, -88.6521288, -88.6521289,
-88.6521862, -88.6524484, -88.6528089, -88.6534069, -88.6535463,
-88.6535953, -88.6536035993117, -88.653545008059, -88.6535447853421,
-88.6535382, -88.65353, -88.6535464, -88.6537513, -88.6540955,
-88.6542512, -88.6550949, -88.6552588, -88.6553817, -88.6557997,
-88.6558407, -88.6558217824171, -88.6554626073676, -88.6552660083569,
-88.6548154092986, -88.6542992081299, -88.6538731403207,
-88.653365341228, -88.6532260078507, -88.6531605411513, -88.6531605187329,
-88.6531537, -88.6531457, -88.6532112, -88.6533341, -88.6536126,
-88.6541042, -88.6543664, -88.6546449, -88.6548907, -88.6553086,
-88.6553987, -88.6554228899404, -88.6553811416396, -88.6552091415839,
-88.6550862082134, -88.654504608057, -88.6540704079437, -88.6534477411246,
-88.6529808076795, -88.6518420073884, -88.6510228071727,
-88.6506623393722, -88.6505149414149, -88.6503921403327,
-88.6503348080141, -88.6503354731655, -88.650328, -88.6503607,
-88.6507868, -88.650877, -88.6509427, -88.6509347, -88.6508938,
-88.6509184, -88.6511478, -88.6513118, -88.6515658, -88.6522744,
-88.6523481, -88.6524712, -88.6525449, -88.6526514, -88.6528151,
-88.6541338, -88.6543958, -88.6547399, -88.6552478, -88.6560259,
-88.6565993, -88.6572629, -88.6576233, -88.6580084, -88.6581557,
-88.6587537, -88.6591139, -88.6596136, -88.6601378, -88.6606948,
-88.6623821, -88.6629308, -88.6631027, -88.6638235, -88.6640528,
-88.6642248, -88.6643476, -88.664585, -88.6647898, -88.6650847,
-88.6652976, -88.6656088, -88.6662068, -88.666518, -88.6667719,
-88.6672224, -88.6676154, -88.6684263, -88.6694828, -88.671002,
-88.6719048619284, -88.671974159707, -88.6726509, -88.6729081,
-88.6732441, -88.6735671, -88.6740057, -88.674294, -88.6744923,
-88.6747953, -88.6752192, -88.675535, -88.675707, -88.6757807,
-88.6758093708006, -88.6758612139877, -88.6759186140038,
-88.6759991986571, -88.6760395, -88.6762198091422, -88.6762461474367,
-88.6762544130542, -88.6762053473982, -88.675943347292, -88.6759104500991,
-88.6757036, -88.6752278, -88.674801, -88.6745528217628,
-88.6744937468288, -88.6741743467276, -88.6736912132315,
-88.6733308131201, -88.6720942127671, -88.6713490125393,
-88.6709232124001, -88.6702517455015, -88.6700552110541,
-88.6698832109834, -88.6698765533609, -88.6698764, -88.6697273047687,
-88.6695967462629, -88.669457611834, -88.6692937451134, -88.6687124126403,
-88.6684667448426, -88.6682619437401, -88.6680899447337,
-88.6675330112508, -88.6668369454139, -88.666345545267, -88.666140810827,
-88.6659606107646, -88.6658542107158, -88.6658530952992,
-88.6658474, -88.665782, -88.6658312, -88.6659214, -88.6660442,
-88.6662572, -88.6670272, -88.6673629, -88.6675677, -88.6679773,
-88.6685341, -88.6688698, -88.6692548, -88.6696724, -88.6700492,
-88.6704257, -88.6707369, -88.6710153, -88.6712855, -88.6714984,
-88.6715043677623, -88.6715052122721, -88.6716710696219,
-88.6718013, -88.6719979, -88.672178, -88.6726284, -88.6734145,
-88.6739388, -88.6743564, -88.6745939, -88.6746513, -88.6746022,
-88.6746022, -88.6746923, -88.6749053, -88.6755604, -88.6758389,
-88.6759863, -88.6761829, -88.6766906, -88.6768513753537,
-88.6770740137701, -88.6771370031316, -88.6774107, -88.6777132,
-88.6778112, -88.6778151, -88.6781638, -88.6784829, -88.6785218,
-88.6787583, -88.6790522875321, -88.6794978156304, -88.6798008146648,
-88.6801038147283, -88.6804970147996, -88.6807018148521,
-88.6810157604515, -88.6811207, -88.6814127, -88.6817276,
-88.6817088, -88.6817116763115, -88.6821512153109, -88.6822903486889,
-88.6823063260918, -88.6823416, -88.6827459, -88.6828345185769,
-88.6830320971567, -88.6830369, -88.6832253, -88.6833562,
-88.6837494, -88.6839038, -88.6843307, -88.684354623326,
-88.6845504159537, -88.6845669492754, -88.6845505482136,
-88.6844604148214, -88.6844440147612, -88.6843785491059,
-88.6842667194734, -88.6841404, -88.6840937, -88.684138,
-88.6838593, -88.6834327, -88.6832645, -88.6818773, -88.6815804,
-88.6813622, -88.6813359544658, -88.6812422149521, -88.6808410137555,
-88.6806281480505, -88.6805708136444, -88.6805545479967,
-88.6806118146569, -88.6807265479972, -88.6808820146885,
-88.6816927481954, -88.6822660149941, -88.6830603484867,
-88.6832323495564, -88.6834288151953, -88.6835189485406,
-88.6835728301701, -88.6835755, -88.6836595, -88.6838969,
-88.6841017, -88.6842408, -88.6845684, -88.6845952565682,
-88.6848044165182, -88.6848863498535, -88.6848700154491,
-88.6848045487388, -88.6846407476214, -88.6844443485815,
-88.684362415217, -88.6842068151664, -88.6839938151047, -88.6837073473204,
-88.683330614934, -88.682954014836, -88.6825773480614, -88.6822089469108,
-88.6815948144294, -88.6808415485799, -88.6804403484618,
-88.6794249471389, -88.6792775470925, -88.6789746136605,
-88.6788026136074, -88.6784587458011, -88.6782867467896,
-88.6781148123573, -88.6778691466471, -88.6776809465764,
-88.6773779464594, -88.6771814130536, -88.6770177452896,
-88.676690146225, -88.6764773471951, -88.6762972117085, -88.6758305458891,
-88.6754048123856, -88.67524101233, -88.6747497455123, -88.6740456109147,
-88.6736363451657, -88.6732759450534, -88.6726291448393,
-88.6722197447144, -88.6714664111608, -88.6710570110367,
-88.6705657452573, -88.6703611441466, -88.6701318107282,
-88.6701318157013, -88.670125, -88.6701251, -88.6702398,
-88.6702563, -88.6704445, -88.6706984, -88.6709523, -88.6715417,
-88.6730975, -88.6736134, -88.6743913, -88.6746697, -88.6754803,
-88.6761025, -88.6766348, -88.6771097, -88.6782232, -88.6785017,
-88.678739, -88.6789192, -88.6792303, -88.6795988, -88.6796807,
-88.6799181, -88.68018, -88.6802291, -88.6802291, -88.6802359468985,
-88.680235946911, -88.6801377458499, -88.6797610124252, -88.6796463467765,
-88.6795563457221, -88.6793843467281, -88.6791632133399,
-88.67898314767, -88.67871294553, -88.678663746569, -88.6786228142839,
-88.6786392143066, -88.6787165724322, -88.6788206, -88.6790253,
-88.679181, -88.6795248, -88.6803272, -88.6807858, -88.6809741,
-88.6811567960777, -88.6819553475863, -88.6820372142791,
-88.6820622008639, -88.6820828, -88.682267, -88.6825077,
-88.6823548, -88.6823713410989, -88.682405614434, -88.6825692144829,
-88.6827821478736, -88.6830933489864, -88.6834782136728,
-88.6841660149069, -88.6843461482867, -88.6849847484406,
-88.6853941485428, -88.6856807475688, -88.6857789486283,
-88.6858035486233, -88.6857789486032, -88.6856970152403,
-88.6854924162179, -88.6854432151561, -88.6855416151589,
-88.6856152151741, -88.6858117485531, -88.6859754152511,
-88.6861147485966, -88.6861719485841, -88.6861474152222,
-88.6860655485245, -88.6859099495021, -88.6859099474112,
-88.6859509484564, -88.6860082151358, -88.686125609188, -88.6861324,
-88.6862306, -88.6863616, -88.6867465, -88.6869594, -88.6872459,
-88.6875734, -88.6877944, -88.6881956, -88.6886869, -88.6889079,
-88.689088, -88.6892354, -88.6893336, -88.6893418, -88.6893336764496,
-88.6892749481977, -88.6890866158361, -88.6889064157829,
-88.6886200157036, -88.6884644156681, -88.6883252156259,
-88.6881696155728, -88.688055148849, -88.6880550947661, -88.6880483,
-88.6880318, -88.68795, -88.68795, -88.6879909, -88.6881138,
-88.6884739, -88.6887605, -88.6897019, -88.6903405, -88.690537,
-88.690848, -88.6914292, -88.6919123, -88.6923788, -88.6928373,
-88.69296, -88.6932056, -88.6933119, -88.6933119, -88.6932628,
-88.6931703170321, -88.6929994172211, -88.6929984219998,
-88.6929926, -88.6929598, -88.6929844, -88.6930907, -88.6939338,
-88.6941222, -88.6942939, -88.6944003, -88.6948751, -88.6963156,
-88.6973633, -88.6980753, -88.6985419, -88.6987792, -88.699172,
-88.6995894, -88.7000805, -88.7004323, -88.7009723, -88.7012587,
-88.7016188, -88.7017578, -88.7019706, -88.7023224, -88.7026907,
-88.7029117, -88.7030098, -88.7030343, -88.7031978, -88.7035333,
-88.7038442, -88.7039914, -88.7040239179369, -88.7039900168609,
-88.7038426178537, -88.7036625511314, -88.7035888177686,
-88.7035862879189, -88.703582, -88.7035575, -88.7037619,
-88.703901, -88.7044737, -88.7046865, -88.7050219, -88.705292,
-88.705701, -88.7059056, -88.7058974, -88.70584, -88.7058646,
-88.7059381, -88.7059709, -88.7060854, -88.7062491, -88.7065029,
-88.7067156, -88.7068302, -88.7068701057066, -88.7068124183038,
-88.7068066720622, -88.7068056, -88.7066008, -88.706609,
-88.706658, -88.7067317, -88.7068135, -88.7071817, -88.7075499,
-88.7083926, -88.7085889, -88.7086709, -88.7088018, -88.7090146,
-88.7093256, -88.7094402, -88.7095711, -88.7096365, -88.7096447,
-88.7097264, -88.7098083, -88.7101437, -88.7103319, -88.7103891,
-88.7105118, -88.7110191, -88.7111419, -88.7112236, -88.7112726,
-88.7113626, -88.7115754, -88.7116981, -88.7118044, -88.7120336,
-88.7121073, -88.7121564, -88.712189, -88.712189, -88.7122298,
-88.7123116, -88.712418, -88.7125244, -88.7125252596206,
-88.7125312195167, -88.7125476195418, -88.7124905528893,
-88.7123678195447, -88.7122369528527, -88.7120814184322,
-88.7116805516342, -88.7115658182687, -88.7114759526302,
-88.7114349526318, -88.7113942203618, -88.7112633526398,
-88.7111651526203, -88.7110834192651, -88.7108460202385,
-88.7106824191521, -88.7104778191098, -88.7103797513955,
-88.7103142190961, -88.7099706190134, -88.7099051523423,
-88.7099298200817, -88.7099298190593, -88.7098563534283,
-88.7097254190179, -88.7095944189774, -88.708816952048, -88.7086532186633,
-88.7084895529886, -88.7082686185571, -88.7078023518082,
-88.7074013517187, -88.7073687517128, -88.7073686220145,
-88.7073946, -88.7077056, -88.7078529, -88.7080002, -88.7080821,
-88.7081721, -88.7082784, -88.7083194, -88.7084013, -88.7084667,
-88.7084656505265, -88.7084735520649, -88.7084408176931,
-88.7082772187119, -88.7082765603918, -88.7084114, -88.7084187998785,
-88.7086210178374, -88.708683824718, -88.7087797, -88.708919,
-88.7089354, -88.7089272, -88.7088454, -88.7084854, -88.7080844,
-88.70806, -88.70806, -88.7080814188896, -88.7081223512056,
-88.7081212475149, -88.7082401, -88.708281, -88.7082402,
-88.7080193, -88.7076102, -88.7073566, -88.7070539, -88.7068491,
-88.7067019, -88.7065301, -88.706391, -88.7060311, -88.7059085,
-88.7058269, -88.7057041, -88.7053107025498, -88.7052920186718,
-88.7052593520109, -88.705283952031, -88.7053330197679, -88.7053250187329,
-88.7051777530825, -88.7051530187107, -88.70519358966, -88.705261,
-88.7055065, -88.7059567, -88.7059896, -88.7061204, -88.7061263572542,
-88.7061272190978, -88.7062338191533, -88.7063567525672,
-88.7063567525948, -88.7063077525981, -88.70608675256, -88.7059149525286,
-88.7058821525444, -88.7058249525368, -88.7056694181329,
-88.7054484191072, -88.7053010190516, -88.7051537533744,
-88.704973752278, -88.7045972178001, -88.7036723509021, -88.7035659529643,
-88.703443351919, -88.7033206185619, -88.7031650174781, -88.7023466172654,
-88.7019373515516, -88.7013236170664, -88.7011681514235,
-88.700906350362, -88.7007016190814, -88.7004153513206, -88.6990403510514,
-88.6984264165511, -88.6976571507813, -88.6974689507507,
-88.6972642173934, -88.6969122183665, -88.6965604162313,
-88.6962576182847, -88.6962412182947, -88.6962985506367,
-88.696298549605, -88.6961349516721, -88.6961185506505, -88.6961346059454,
-88.6962509, -88.6962522559012, -88.6962577507302, -88.696274150742,
-88.6962660174204, -88.6959712173678, -88.6958484163124,
-88.6958566119547, -88.6961119, -88.6961152684769, -88.6961187508329,
-88.6961925508749, -88.6961515508756, -88.6959633518801,
-88.6948499516013, -88.6932291491343, -88.6927870167462,
-88.6923613499939, -88.6920993499448, -88.6919111488834,
-88.6915346165281, -88.6915346165399, -88.6916178, -88.6917324,
-88.6918634, -88.6919044, -88.6919036977042, -88.6919112166629,
-88.6918947500046, -88.6917638166567, -88.6917638166692,
-88.6917883500344, -88.691763816706, -88.6916083500072, -88.6912398165859,
-88.6908633498431, -88.6905194164261, -88.6902082163559,
-88.6900281507011, -88.6899955486203, -88.6900226653522,
-88.6902752, -88.6903243, -88.6903248074649, -88.6903311487499,
-88.6903475498084, -88.690314815435, -88.6902165497955, -88.6897417496797,
-88.6895042162956, -88.6893897485678, -88.6893077495991,
-88.6891441495704, -88.6884645494314, -88.6883825483845,
-88.6883744161029, -88.6884225138921, -88.6885477, -88.6885475685255,
-88.6885545495312, -88.6885381485071, -88.6880714171664,
-88.6880059494512, -88.6879732161262, -88.6879241494611,
-88.6875802160583, -88.6875639493958, -88.6875720150392,
-88.6875066150365, -88.6869497492955, -88.6868269503168,
-88.6868270159552, -88.6868778865643, -88.6870085, -88.6872623,
-88.6874588, -88.687688, -88.6880811, -88.6885723, -88.6890636,
-88.6897924, -88.6900953, -88.6902673, -88.6904064, -88.6904049596203,
-88.6904132169915, -88.6903559503348, -88.6902086169735,
-88.6899301502417, -88.6895126168077, -88.6888984166564,
-88.687334548551, -88.6870317505726, -88.6866305494211, -88.6864176149937,
-88.6861883493213, -88.6861391503603, -88.686160056557, -88.6864271,
-88.6864844, -88.6865745, -88.6867137, -88.686902, -88.6870739,
-88.6874342, -88.6880074, -88.6884906, -88.6890064, -88.6894075,
-88.6894567, -88.6895713, -88.6896778, -88.6897761, -88.689782472715,
-88.6897829513968, -88.6899070828207, -88.6900545, -88.6902182,
-88.690513, -88.6908159, -88.6908978, -88.6911762, -88.6913236,
-88.6915201, -88.691864, -88.6922406, -88.6924699, -88.6926254,
-88.6928056, -88.6930921, -88.6942466, -88.6945085, -88.6949671,
-88.6955319, -88.6959168, -88.69667, -88.6976032, -88.6985448,
-88.6990523, -88.7005914, -88.7013855, -88.7019258, -88.7023023,
-88.7030964, -88.7043161, -88.7052411, -88.7063298, -88.706952,
-88.7082699, -88.7089329, -88.7098004, -88.710046, -88.7105207,
-88.7115848, -88.7122968, -88.7128453, -88.7131154, -88.713803,
-88.7140077, -88.714204, -88.7145887, -88.7153417, -88.716283,
-88.7170113, -88.717707, -88.7183455, -88.7186402, -88.7192296,
-88.7195652, -88.719958, -88.7203427, -88.7210056, -88.7217994,
-88.7222332, -88.7226997, -88.7241402, -88.7247704, -88.7252615,
-88.7260554, -88.7263418, -88.7266363, -88.7267755, -88.7273071,
-88.727978, -88.7284282, -88.7287718, -88.7289028, -88.7292629,
-88.7294839, -88.7298277, -88.7304741, -88.7308751, -88.7312024,
-88.7313826, -88.7319472, -88.7332563, -88.7335509, -88.7341237,
-88.7343692, -88.734803, -88.735343, -88.7355885, -88.7358832,
-88.7362514, -88.7366196, -88.7368487, -88.7374133, -88.7375852,
-88.7381174, -88.7385511, -88.7389358, -88.7395167, -88.7400404,
-88.7405067, -88.7408013, -88.7414885, -88.7417422, -88.7418895,
-88.7423561, -88.7425607, -88.7431169, -88.7436078, -88.7442051,
-88.7443768, -88.7445648, -88.7447365, -88.744892, -88.7450721,
-88.7452112, -88.7454073, -88.7455464, -88.7459311, -88.7461929,
-88.7465447, -88.7466184, -88.7467, -88.746798, -88.7469453,
-88.747068, -88.7472563, -88.7475262, -88.7478289, -88.7482134,
-88.7493178, -88.7494405, -88.7495141, -88.7495796, -88.7495860992404,
-88.7495864321594, -88.7496619493045, -88.7497352, -88.7498416,
-88.7499316, -88.7500693, -88.7506588, -88.7509209, -88.7513139,
-88.7517559, -88.7519278, -88.7524765, -88.7529105, -88.7533854,
-88.753762, -88.7539995, -88.7549985, -88.7564149, -88.7575776,
-88.7581998, -88.7591168, -88.7597226, -88.7603366, -88.7607951,
-88.7612043, -88.7615483, -88.7618759, -88.7624081, -88.7628091,
-88.7631037, -88.763292, -88.7635376, -88.7643481, -88.7645283,
-88.7645207014399, -88.764404235896, -88.7642160347921, -88.7638150367575,
-88.7634303689387, -88.7628490354568, -88.7624152353363,
-88.7621862352581, -88.7618753684695, -88.7618741220339,
-88.7618685, -88.7618277, -88.761828, -88.7621228, -88.7624424,
-88.7627453, -88.7632118, -88.7640384, -88.7641775, -88.7642268,
-88.7642841, -88.7644233, -88.7646688, -88.7652582, -88.7658475,
-88.7666417, -88.7670592, -88.7674441, -88.7675508, -88.7677393,
-88.7679931, -88.7683289, -88.7685009, -88.7687301, -88.7692048,
-88.7697286, -88.7704244, -88.7709402, -88.7714313, -88.7719553,
-88.7720127, -88.7719398245481, -88.7717827715851, -88.7716028381744,
-88.7716034206941, -88.771596, -88.7716206, -88.7716628360333,
-88.7717339694181, -88.7717341704439, -88.7716441714486,
-88.7713823703202, -88.7711858369262, -88.770834036841, -88.7703264356694,
-88.7697781698919, -88.7691562363716, -88.7690171686178,
-88.7689025696157, -88.768690037235, -88.7686901953706, -88.7686832,
-88.7686916, -88.7687244, -88.7691421, -88.7696906, -88.7697971,
-88.7699526, -88.7706236, -88.7708692, -88.7711558, -88.7712948,
-88.7712578173815, -88.7711381699863, -88.7709090365839,
-88.7707371698759, -88.7704997698286, -88.7703442354081,
-88.7702870353845, -88.7702839450178, -88.7702802, -88.7702475,
-88.7702558, -88.7703542, -88.77087, -88.7710093, -88.7710421,
-88.7711977, -88.7721224, -88.7723599, -88.7726216, -88.7728835,
-88.7730717, -88.7734974, -88.7737428, -88.7737281919363,
-88.7736189704551, -88.7733652370451, -88.7728496358602,
-88.7723750367721, -88.7720478366702, -88.771941436634, -88.7718514365954,
-88.7718481897952, -88.7718446, -88.7717875, -88.7718204,
-88.7719923, -88.7721887, -88.7723524, -88.7725487, -88.772966,
-88.773146, -88.7733588, -88.7739319, -88.7743657, -88.7744387974567,
-88.7743317694068, -88.7741681703946, -88.7738572369737,
-88.7734235701949, -88.7728587700523, -88.7723678355425,
-88.7721551698477, -88.7720161697972, -88.7717708373813,
-88.7717711696438, -88.7718447696465, -88.7723814600085,
-88.7724521, -88.7726895, -88.7731271, -88.7737859, -88.7740559,
-88.7741694324631, -88.7741773702193, -88.7742837712704,
-88.774275636882, -88.7741447711998, -88.7739239700792, -88.7735393699654,
-88.7726066363652, -88.772459436313, -88.7723695696018, -88.7723687713791,
-88.7723627, -88.7722741140184, -88.7721079694667, -88.772107124832,
-88.7721011, -88.7719867, -88.7719379, -88.7719953, -88.7721426,
-88.7725847, -88.7730756, -88.7735011, -88.7737302, -88.7739428,
-88.7742864, -88.7745892, -88.7753503, -88.776496, -88.7771342,
-88.7775107, -88.7776582, -88.7776828, -88.7778057, -88.7780267,
-88.7784934, -88.7789189, -88.7792627, -88.7798272, -88.7803428,
-88.780981, -88.7814801, -88.7816929, -88.7820857, -88.7824458,
-88.7828222, -88.7835668, -88.7842621, -88.7849657, -88.7855467,
-88.7860867, -88.786643, -88.787265, -88.7875186, -88.7878132,
-88.7886069, -88.789245, -88.7900467, -88.7905212, -88.7916092,
-88.7924437, -88.7929672, -88.7931553, -88.7939, -88.794677,
-88.7952661, -88.7960269, -88.7966405, -88.7970985, -88.7974094,
-88.7976549, -88.7985302, -88.7985956, -88.7988411, -88.7997491,
-88.7999699, -88.8001745, -88.8004445, -88.8008453, -88.8014833,
-88.8019004, -88.802244, -88.8029639, -88.8034628, -88.8039945,
-88.8042154, -88.804338, -88.8045752, -88.8047552, -88.8049596,
-88.8052624, -88.8053208017446, -88.8055800444158, -88.8059807840405,
-88.8060476, -88.8066774, -88.8072745, -88.8081416, -88.8086895,
-88.8089431, -88.809442, -88.8100064, -88.8104481, -88.8108407,
-88.8110287, -88.8111351, -88.8112168, -88.8112176747179,
-88.8112236458656, -88.8112463908832, -88.811356, -88.811773,
-88.8127382, -88.8133106, -88.813556, -88.8138096, -88.8139159,
-88.8139732, -88.8139751596943, -88.8139800467083, -88.8142908469028,
-88.8143235802605, -88.8143316469447, -88.8142744469405,
-88.8141027802334, -88.813644646783, -88.8134729800784, -88.8132848467297,
-88.8120170464792, -88.8120169830362, -88.8120756, -88.8121901,
-88.8124682, -88.8129099, -88.8131553, -88.8132698, -88.8134333,
-88.8137033, -88.8139486, -88.8142268, -88.8143822, -88.8146521,
-88.8148974, -88.8150938, -88.8151347, -88.8151755, -88.8154046,
-88.8156336, -88.8159198, -88.8164023, -88.8170239, -88.8172285,
-88.8176128, -88.8179318, -88.8182426, -88.8184798, -88.818905,
-88.8192404, -88.8198211, -88.8207862, -88.8219066, -88.8223401,
-88.8230352, -88.8235259, -88.8238285, -88.8240001, -88.8240901,
-88.8242128, -88.8248751, -88.8249078, -88.8248528991336,
-88.8245547828571, -88.824260249428, -88.8239331826613, -88.8234506491901,
-88.8229762490479, -88.8226409812304, -88.822452782193, -88.8222729810575,
-88.822117447626, -88.8220519819373, -88.8220519819005, -88.8221830334772,
-88.822184, -88.8222577, -88.8225111, -88.8230263, -88.8238359,
-88.8248663, -88.8253324, -88.8258312, -88.8261255, -88.8267469,
-88.8269186, -88.8271148, -88.8275238, -88.828039, -88.8287503,
-88.8295927, -88.8308191, -88.831506, -88.8324218, -88.8328471,
-88.8331414, -88.8337546, -88.8344333, -88.835022, -88.835578,
-88.8365348, -88.8368783, -88.8379412, -88.8382438, -88.8392823,
-88.8397892, -88.8404024, -88.8407622, -88.8408603, -88.8410075,
-88.841012400474, -88.8410143859027, -88.8410470525878, -88.8409817869603,
-88.8408427869299, -88.8408203213306, -88.8409341, -88.8411876,
-88.8418743, -88.842095, -88.8423485, -88.8426101, -88.8428799,
-88.8431824, -88.8435257, -88.8439509, -88.844417, -88.8449811,
-88.8452919, -88.8455862, -88.8459786, -88.84651, -88.8478672,
-88.8483822, -88.8487584, -88.8491508, -88.8502708, -88.8517831,
-88.8520856, -88.8527069, -88.8533526, -88.8538021, -88.8545295,
-88.8552161, -88.8559682, -88.8565487, -88.8569984, -88.8572192,
-88.8572199532088, -88.8572260568563, -88.8572507912682,
-88.8572264579549, -88.8570385912596, -88.8566870578498,
-88.8563927911091, -88.8559105899423, -88.8551094574397,
-88.8540467905099, -88.853335790356, -88.8529516569461, -88.8527391902599,
-88.8526329891973, -88.8525104579178, -88.8522896568165,
-88.8520525900943, -88.8516030556076, -88.8510553898764,
-88.8500744552552, -88.849591989504, -88.8492568561025, -88.8490607883698,
-88.8489465894356, -88.8490283028698, -88.8492182, -88.8496352,
-88.8500686, -88.8504937, -88.8511641, -88.8516792, -88.8521451,
-88.852611, -88.8531915, -88.855178, -88.856151, -88.8572054,
-88.8576141, -88.8586687, -88.8589631, -88.8600749, -88.8610149,
-88.8615708, -88.8622329, -88.8627314, -88.8633198, -88.8639328,
-88.8643744, -88.8647586, -88.8649059, -88.8649794, -88.865094,
-88.8651001203671, -88.8651008593927, -88.8652563928041,
-88.8653616018789, -88.8654297, -88.8654340030046, -88.865436593944,
-88.8656577940582, -88.8656577940732, -88.8656251940791,
-88.8655353940698, -88.8652002606608, -88.8637943936437,
-88.8634183946021, -88.863091461189, -88.8628298600868, -88.862184259923,
-88.8617509941837, -88.8608599929202, -88.8600915927385,
-88.8593722592245, -88.858791859075, -88.858235858922, -88.8577943921427,
-88.8561512583966, -88.855930592722, -88.8558734583486, -88.8559056981061,
-88.8560303, -88.8560303018418, -88.856037191771, -88.856037391792,
-88.8559802584644, -88.8551710582995, -88.854517058139, -88.854190057009,
-88.8538875913159, -88.8535278568434, -88.8532989911663,
-88.8518600574622, -88.8513695917162, -88.8502167904028,
-88.849611791294, -88.8493174579025, -88.8491050568297, -88.8488434567666,
-88.8481484565901, -88.8476332564563, -88.8472899897081,
-88.8469220563007, -88.8464397905672, -88.8459736571228,
-88.8438967888704, -88.8431690553571, -88.8424496551863,
-88.8418362539899, -88.8416646549987, -88.8416883103328,
-88.8418461, -88.842075, -88.8425412, -88.8432689, -88.8437024,
-88.844095, -88.8446673, -88.8453214, -88.845951, -88.8465642,
-88.8472674, -88.8479869, -88.8484692, -88.8489924, -88.8495565,
-88.8505374, -88.8509707, -88.8514123, -88.8521646, -88.8526717,
-88.8529904, -88.8533666, -88.8537507, -88.854372, -88.8545436,
-88.8548542, -88.8552056, -88.8557043, -88.8562439, -88.8569552,
-88.8598246, -88.8601597, -88.8604456, -88.8606417, -88.860895,
-88.8612056, -88.8615817, -88.8619495, -88.8626363, -88.8635847,
-88.8647785, -88.8652282, -88.865686, -88.8662745, -88.8673289,
-88.8677295, -88.8687839, -88.8694869, -88.8701571, -88.8707292,
-88.8718899, -88.8728869, -88.8735898, -88.8742601, -88.8750776,
-88.8762605, -88.8768167, -88.8779047, -88.8790255, -88.8800399,
-88.8804735, -88.8815042, -88.8822895, -88.8827968, -88.8834755,
-88.8838436, -88.8841627, -88.8844163, -88.8849478, -88.8854303,
-88.8874013, -88.8882765, -88.8888244, -88.8909919, -88.8915808,
-88.8927096, -88.8939937, -88.8952781, -88.8958835, -88.8963991,
-88.8964809, -88.8965139, -88.896406, -88.8960709, -88.8958093,
-88.8955432, -88.8952985, -88.8950453, -88.8949421, -88.8939861,
-88.8937276463061, -88.8935694676094, -88.8934796675742,
-88.8934552685949, -88.8934653828982, -88.8934577, -88.8934729,
-88.8935385, -88.8940047, -88.8943075, -88.8943336543769,
-88.8945930871565, -88.8945941, -88.8946271, -88.8947658,
-88.8950283, -88.8955355, -88.8960506, -88.8965983, -88.8971625,
-88.8989533, -88.9021828, -88.9040306, -88.9045784, -88.9051915,
-88.9053306, -88.9054042, -88.9054454, -88.9054781, -88.9056907,
-88.9059851, -88.9063366, -88.9067209, -88.9073503, -88.9078244,
-88.9091812, -88.9097126, -88.9119443, -88.9123775, -88.9124919,
-88.9124911466031, -88.912498805514, -88.9122370044453, -88.9122814203357,
-88.9124753, -88.9141839, -88.9149031, -88.9163583, -88.9173229,
-88.9186636, -88.9195955, -88.92056, -88.921876, -88.922914,
-88.9245897, -88.9253171, -88.9264941, -88.9274257, -88.9281858,
-88.9292072, -88.9292089821949, -88.9292140770304, -88.9292386760072,
-88.9292058770923, -88.929213684436, -88.9292644, -88.9294034,
-88.9295423, -88.9299264, -88.930188, -88.930662, -88.9308092,
-88.9313569, -88.9325175, -88.9338661, -88.9347325, -88.9355988,
-88.9359094, -88.9364653, -88.9370046, -88.9375932, -88.938484,
-88.9390233, -88.940658, -88.9412055, -88.9416713, -88.9423415,
-88.9435428, -88.9443028, -88.944785, -88.9451855, -88.9469834,
-88.9470897, -88.947155, -88.947245, -88.947343, -88.9494107,
-88.9496966, -88.9498601, -88.9498927, -88.9500887, -88.9502357,
-88.9505298, -88.9508811, -88.9513795, -88.9517635, -88.9519188,
-88.952213, -88.9525316, -88.9537084, -88.9540189, -88.9544846,
-88.9549422, -88.9551302, -88.9553018, -88.9554489, -88.9555715,
-88.9555770569411, -88.9555784171847, -88.9556520172233,
-88.955684682891, -88.9557221159704, -88.9557841, -88.9560048,
-88.9578513, -88.9589708, -88.9600003, -88.9609807, -88.9616344,
-88.9623533, -88.9636689, -88.964682, -88.9658421, -88.9665612,
-88.9677293, -88.9680725, -88.9697555, -88.9704418, -88.9712015,
-88.9721738, -88.9732766, -88.973824, -88.9747553, -88.9758174,
-88.9771326, -88.977876, -88.9785377, -88.9812171, -88.9832267,
-88.9839129, -88.9858082, -88.9870581, -88.9874175, -88.9876461,
-88.9879809, -88.9888957, -88.9902841, -88.9913133, -88.992906,
-88.993347, -88.9949392, -88.9962945, -88.9978296, -88.998071,
-88.9987812, -89.000079, -89.0003168, -89.0003741, -89.0007665,
-89.0009871, -89.0013222, -89.0018044, -89.0027767, -89.0034876,
-89.0038798, -89.004223, -89.0049256, -89.0055791, -89.006339,
-89.0077772, -89.0081284, -89.0083408, -89.0087983, -89.0090433,
-89.0093048, -89.009542, -89.0097792, -89.0099998, -89.0119123,
-89.0122146, -89.0125251, -89.0129745, -89.0134483, -89.0140364,
-89.0143387, -89.0145022, -89.0145676, -89.0151888, -89.0157037,
-89.0160959, -89.0163165, -89.016431, -89.0164802, -89.0165373,
-89.0170029, -89.0171174, -89.0176814, -89.0181391, -89.0184415,
-89.0188826, -89.0193074, -89.0195933, -89.0198058, -89.0200021,
-89.0210566, -89.0213262, -89.0219553, -89.02238, -89.022568,
-89.0231236, -89.0239813, -89.0253045, -89.025909, -89.0270689,
-89.02751, -89.028139, -89.0288253, -89.0294134, -89.0297238,
-89.02983, -89.030018, -89.0305734, -89.0311698, -89.0315864,
-89.031807, -89.032093, -89.0324851, -89.032959, -89.0334246,
-89.0340293, -89.0343233, -89.0345276, -89.0349114, -89.0350911,
-89.0353117, -89.0356468, -89.0358512, -89.0359329, -89.0365457,
-89.036905, -89.0372482, -89.0378282, -89.0385389, -89.0401152,
-89.0404338, -89.0407443, -89.0412588, -89.0419857, -89.0425167,
-89.0428924, -89.0431783, -89.0434478, -89.0436602, -89.0442973,
-89.045057, -89.0454408, -89.0456859, -89.0459963, -89.046225,
-89.0471643, -89.0476053, -89.0484303, -89.048806, -89.0497127,
-89.0501047, -89.0512645, -89.0518851, -89.0529143, -89.0532736,
-89.0536575, -89.0543843, -89.0552499, -89.0560585, -89.0565322,
-89.0567853, -89.0577899, -89.0580593, -89.0583206, -89.0590964,
-89.060493, -89.060738, -89.0613177, -89.0616117, -89.0623467,
-89.0630245, -89.0633674, -89.0636125, -89.0638819, -89.0646251,
-89.0650252, -89.0657438, -89.0664297, -89.0669604, -89.067434,
-89.067826, -89.0681445, -89.0685201, -89.069206, -89.0699164,
-89.0702595, -89.0705453, -89.0708801, -89.0711903, -89.0724722,
-89.0730438, -89.0732398, -89.0737215, -89.0740237, -89.0750606,
-89.0755667, -89.0762036, -89.0765711, -89.0768731, -89.0779998,
-89.0783836, -89.0787265, -89.078947, -89.0799675, -89.0804327,
-89.0831677, -89.0833963, -89.0838454, -89.0840902, -89.0844169,
-89.0849802, -89.0852006, -89.0855353, -89.0860742, -89.0863762,
-89.0871436, -89.0877967, -89.0881069, -89.0886295, -89.0894866,
-89.0899356, -89.0901804, -89.0907681, -89.0917069, -89.0920988,
-89.0927843, -89.0940333, -89.0947271, -89.0961801, -89.09658,
-89.0970534, -89.0974941, -89.0980736, -89.0986287, -89.0988164,
-89.0990204, -89.0994285, -89.099706, -89.1001711, -89.1005466,
-89.1009956, -89.1014935, -89.1021955, -89.1027096, -89.1034769,
-89.1039829, -89.1042931, -89.1050439, -89.1054194, -89.1068721,
-89.1078759, -89.1082514, -89.108741, -89.1093775, -89.1100713,
-89.1101936, -89.110316, -89.1108955, -89.1111893, -89.1114177,
-89.1117194, -89.1119805, -89.1126986, -89.1128128, -89.1130576,
-89.1136126, -89.1144937, -89.1147222, -89.115269, -89.1158157,
-89.1160033, -89.1160767, -89.1160847, -89.1161254, -89.1166395,
-89.1175615, -89.1182878, -89.1188345, -89.1192834, -89.1196507,
-89.1202627, -89.1206951, -89.1213072, -89.1223923, -89.1227268,
-89.1230205, -89.1232489, -89.1235262, -89.1237219, -89.1239097,
-89.1241542, -89.1243745, -89.1247498, -89.1248964, -89.1250841,
-89.1261391, -89.1269964, -89.1279845, -89.1294136, -89.1301892,
-89.1305731, -89.1314796, -89.1317818, -89.1325658, -89.1331699,
-89.133472, -89.1339375, -89.1346808, -89.1358318, -89.136681,
-89.1373096, -89.1383139, -89.138665, -89.1398487, -89.1407958,
-89.1416041, -89.1420695, -89.1432939, -89.1442491, -89.145,
-89.1453675, -89.1460858, -89.1470246, -89.1477513, -89.1482248,
-89.1484698, -89.1486902, -89.1493186, -89.1495962, -89.1499391,
-89.1502166, -89.1503882, -89.1507309, -89.1510248, -89.1513269,
-89.1523473, -89.153139, -89.1535553, -89.1540288, -89.1544369,
-89.1552614, -89.1557185, -89.1562898, -89.1572773, -89.158371,
-89.1588607, -89.1593177, -89.1597912, -89.1600931, -89.1604686,
-89.1613256, -89.161652, -89.1625907, -89.1637088, -89.1643863,
-89.1649005, -89.1658798, -89.1664919, -89.1674631, -89.168426,
-89.1690789, -89.169691, -89.170401, -89.1721475, -89.1729635,
-89.1735592, -89.1739347, -89.1740326, -89.1741224, -89.1741306,
-89.174196, -89.1742858, -89.1744572, -89.1746692, -89.1748977,
-89.1749221, -89.1750202, -89.1749793, -89.1748162, -89.1748489,
-89.1749632, -89.1752978, -89.175771, -89.1759505, -89.1761871,
-89.1761922913844, -89.1761940720279, -89.1762674731097,
-89.1762592721082, -89.1762855157521, -89.1763828, -89.1764971,
-89.1768887, -89.1770029, -89.1772231, -89.1776555, -89.1778188,
-89.1779657, -89.178137, -89.1787245, -89.1791488, -89.1794262,
-89.1806176, -89.1807726, -89.1808706, -89.180993, -89.1815887,
-89.1818497, -89.1821598, -89.1826575, -89.1832695, -89.1836203,
-89.1840609, -89.1847217, -89.1852521, -89.1854724, -89.1856682,
-89.1863208, -89.1865085, -89.1868594, -89.1875935, -89.1880912,
-89.1887357, -89.1895923, -89.1903346, -89.1907833, -89.1912238,
-89.1916154, -89.1919253, -89.1922028, -89.1925127, -89.1930511,
-89.1934183, -89.1936874, -89.1943563, -89.1946826, -89.1955065,
-89.1962733, -89.1966239, -89.1972194, -89.1975457, -89.1983124,
-89.1987936, -89.1992259, -89.1994461, -89.1997152, -89.2004168,
-89.2008246, -89.2011589, -89.2014852, -89.2016646, -89.2016809,
-89.2016516683661, -89.2015654789605, -89.2012391455205,
-89.2000727441512, -89.1999503441136, -89.1997546784228,
-89.1996567450443, -89.1996564104133, -89.1996498, -89.1996253,
-89.199666, -89.1999107, -89.2009301, -89.2010444, -89.2010525,
-89.2010374881522, -89.2009452785368, -89.2007004784525,
-89.2006515450975, -89.2006495019103, -89.2006446, -89.200514,
-89.2004977, -89.2005385, -89.2007749, -89.2008808, -89.200872609035,
-89.2006511458863, -89.2006511178916, -89.2006442, -89.2006114,
-89.200905, -89.201321, -89.2027483, -89.2039633, -89.2050154,
-89.206361, -89.2069318, -89.2073478, -89.2077636, -89.2079267,
-89.2080082, -89.2080979, -89.2081876, -89.2084324, -89.2085384,
-89.2086852, -89.2089379, -89.2090847, -89.2092804, -89.2097044,
-89.2098512, -89.2099082, -89.209998, -89.2101447, -89.2101689745637,
-89.2100863470528, -89.2094338801702, -89.2092462790626,
-89.2092410139129, -89.2092393, -89.2090842, -89.2091168,
-89.2093206, -89.2097692, -89.210177, -89.2102912, -89.2102980508954,
-89.210298147019, -89.2104300822296, -89.2105279, -89.2106991,
-89.210903, -89.211058, -89.2111884, -89.2112862, -89.2114491,
-89.2115552, -89.2116856, -89.2120036, -89.2121423, -89.2122565,
-89.2122589496556, -89.2122634798338, -89.212350740924, -89.2126972,
-89.2126976836503, -89.2127041477417, -89.2127195829759,
-89.2127705, -89.2129173, -89.2136269, -89.2140671, -89.2144503,
-89.2151515, -89.2155674, -89.2158773, -89.2163502, -89.2166275,
-89.2169944, -89.217451, -89.2178505, -89.2180787, -89.2181684,
-89.2182418, -89.2183804, -89.2186414, -89.2187311, -89.2192284,
-89.219628, -89.2202393, -89.2205736, -89.2208345, -89.2209649,
-89.2209889882881, -89.220947283066, -89.2208738840776, -89.2206781496368,
-89.2200011494234, -89.2197238816233, -89.2196341482558,
-89.2196303518474, -89.2196272, -89.2195864, -89.2195863,
-89.2197493, -89.2198226, -89.2199285, -89.2201323, -89.2209065,
-89.2210451, -89.2212734, -89.2215425, -89.2216485, -89.2216566,
-89.2216485175674, -89.2215655495507, -89.2213534828115,
-89.2212556817398, -89.2210681483566, -89.2203098825359,
-89.219910282415, -89.2197389490375, -89.219633149006, -89.2195352823076,
-89.2192741488733, -89.2190457487598, -89.2190457462414,
-89.2190388, -89.2190304, -89.2191934, -89.2194217, -89.2200492,
-89.2210274, -89.2216634, -89.2225112, -89.2231145, -89.2232286,
-89.2232362714968, -89.2231539485784, -89.2226809494676,
-89.2226156827734, -89.2226141039714, -89.2226087, -89.2225436246109,
-89.2224768826882, -89.2222811492873, -89.2217103491291,
-89.2208951478592, -89.2202345476701, -89.2195333484985,
-89.2193294817601, -89.2190358816509, -89.2186932815006,
-89.2186918970369, -89.2186863, -89.2185964, -89.2187755,
-89.2188487, -89.2190034, -89.2197452, -89.2205602, -89.2207313,
-89.2207883, -89.2206742073341, -89.220476747117, -89.220476048625,
-89.2204698, -89.2204454, -89.2207876, -89.2211544, -89.2212114,
-89.2211792218609, -89.2211122815388, -89.220940882517, -89.2204353479838,
-89.2201826801904, -89.2200603478512, -89.2200579344365,
-89.2200534, -89.2199962, -89.220053, -89.2202811, -89.220444,
-89.2204438061057, -89.2202877466618, -89.2200593476243,
-89.219700679811, -89.2193745474311, -89.218918080637, -89.2185267471996,
-89.2178664803698, -89.2176137469707, -89.2175250440679,
-89.2176804, -89.2176803965117, -89.2176873480751, -89.2176872814167,
-89.2176466814135, -89.2175406803485, -89.216855879127, -89.2164481467204,
-89.2163177466762, -89.2159099465195, -89.2159084833758,
-89.215903, -89.2158867, -89.2163023, -89.2167914, -89.2169299,
-89.2172639, -89.2173862, -89.2175084, -89.2178263, -89.217965,
-89.2181444, -89.2182341, -89.2183727, -89.2185847, -89.2190167,
-89.2195709, -89.2198397, -89.2200434, -89.2200832351808,
-89.2199605473498, -89.2198790806548, -89.219455080519, -89.219324546089,
-89.2193228692825, -89.2193176, -89.2192768, -89.2193906,
-89.2194759413138, -89.2195606804143, -89.219829480439, -89.2201880805272,
-89.2205058816545, -89.2209054807336, -89.2216310820062,
-89.2219734821044, -89.222112081096, -89.2221600765045, -89.2222942,
-89.222309, -89.2224021, -89.2223188, -89.2222452, -89.2219755,
-89.2215978, -89.2212692, -89.2208769, -89.2205777, -89.2203521,
-89.2201609, -89.2198225, -89.2196704, -89.2197097, -89.2199058,
-89.2199941, -89.219999, -89.2200974424406, -89.2201781477935,
-89.2201781826479, -89.2199745, -89.2196949, -89.2192781,
-89.2189838, -89.2185669, -89.2181697, -89.2178019, -89.2173016,
-89.2168112, -89.2164532, -89.2159676, -89.2156832, -89.2155606,
-89.2156096, -89.2155459, -89.2153546, -89.2150554, -89.215043587428,
-89.2151650787123, -89.2152139454082, -89.2152121484134,
-89.2152908, -89.215281, -89.2151633, -89.2149672, -89.2146337,
-89.214256, -89.2139765, -89.213491, -89.2130201, -89.2126082,
-89.2124463, -89.2123777, -89.2123335, -89.2122453, -89.2120197,
-89.2117107, -89.2113478, -89.2109358, -89.2106808, -89.2104699,
-89.2103277, -89.2100481, -89.2096754, -89.2091948, -89.2086602,
-89.2086178115835, -89.2082443435732, -89.2080949632508,
-89.2080569, -89.2079294, -89.207591, -89.2075899769542,
-89.207567876792, -89.2075760229803, -89.2076891, -89.2076954347311,
-89.2077637435939, -89.2078697426048, -89.2078698769949,
-89.2078046780342, -89.2077098444631, -89.2076401, -89.2073851,
-89.2070957, -89.2066837, -89.2063257, -89.2061148, -89.2059383,
-89.205899, -89.205957355409, -89.205921276415, -89.205870445457,
-89.205747, -89.2055263, -89.2053105, -89.2049672, -89.2043836,
-89.2042218, -89.2040011, -89.2035842, -89.2028731, -89.2026965,
-89.2025886, -89.2024121, -89.2019609, -89.2013135, -89.2006023,
-89.200453957354, -89.2003040748907, -89.2002472666618, -89.2001659,
-89.1998226, -89.1993763, -89.1990575, -89.1986063, -89.1985976601826,
-89.1984044743935, -89.1981680743494, -89.1981191410237,
-89.1980910590094, -89.1981158, -89.1980374, -89.197851,
-89.1975028, -89.197184, -89.1968064, -89.1965317, -89.1964484,
-89.1964729, -89.1964466546067, -89.1963700814516, -89.1962522,
-89.1959383, -89.1955607, -89.1950801, -89.1949833381383,
-89.194719273377, -89.1945969389754, -89.1945337829232, -89.1945259,
-89.194423640465, -89.1943442733431, -89.1942953400056, -89.1942845823822,
-89.1942758, -89.1940845, -89.1938295, -89.1934665, -89.1931625,
-89.1929171726297, -89.1927461405781, -89.1922324737672,
-89.1917024725865, -89.1902021398973, -89.1894385289651,
-89.1893861, -89.1893131404503, -89.1890198729859, -89.1889302719619,
-89.1889302672448, -89.1890085, -89.1890281, -89.1890154016525,
-89.1891503388674, -89.1891748732833, -89.1891022744342,
-89.1890772, -89.1889644, -89.1886358, -89.1882091, -89.1878216,
-89.187694179373, -89.1874546912406, -89.1873312, -89.1871679265026,
-89.1863127381684, -89.1863059343991, -89.1862817, -89.1858354,
-89.1854185, -89.1851929, -89.1846632, -89.1840698, -89.1835107,
-89.1830203, -89.1827298972173, -89.1818679097836, -89.1818037014299,
-89.1810367366997, -89.1809077311245, -89.180627, -89.1801414,
-89.1796853, -89.1795529, -89.1794745247335, -89.1793042749782,
-89.1793028, -89.179342, -89.1794009, -89.1793764, -89.1791557,
-89.1788565, -89.1786898, -89.1785132, -89.1785132, -89.1786113,
-89.1787928, -89.1790576, -89.1793371, -89.1796069, -89.1798129,
-89.1799306, -89.1798864, -89.1797442, -89.1795971, -89.1795431,
-89.1793715, -89.1792881, -89.1791262, -89.1790309085081,
-89.1789608161124, -89.1789252, -89.1788222, -89.1786309,
-89.178371, -89.177959, -89.1775569, -89.1769683, -89.1762131,
-89.1754676, -89.1747663, -89.1744013590117, -89.174356468007,
-89.174032908386, -89.1738148, -89.1736383, -89.1734372,
-89.1731626, -89.1727653, -89.1726182, -89.1726084, -89.1726672,
-89.1726035, -89.1723681, -89.1717795, -89.1711329973726,
-89.1708659345758, -89.1704663344708, -89.1699990252447,
-89.1697737, -89.1693323, -89.168886, -89.1687960331566,
-89.1686144674725, -89.1683369341033, -89.1680920674276,
-89.1679370674068, -89.1676596673484, -89.1670398671867,
-89.166419867029, -89.1662240669873, -89.1661261336465, -89.1661097336774,
-89.166150467055, -89.1661757741975, -89.1661984, -89.1663259,
-89.1663848, -89.1663844508349, -89.1664274672236, -89.166329333958,
-89.1661333339463, -89.165872334938, -89.1656030661272, -89.1647628659153,
-89.1647576101403, -89.1646781, -89.1642023, -89.1636825,
-89.1631087, -89.162628, -89.1621376, -89.1618434, -89.1615491,
-89.1610341, -89.1605094, -89.1601661, -89.1599405, -89.1595923,
-89.1592195, -89.1589057, -89.1585329, -89.1581308, -89.1575521,
-89.1572302, -89.1568164, -89.1565663, -89.1562279, -89.1559287,
-89.1550999, -89.1546921037537, -89.1545270637028, -89.153238263334,
-89.1529689299289, -89.1527242632164, -89.1526263298472,
-89.1525692631513, -89.1525612631296, -89.152691929813, -89.1528342359029,
-89.1526317, -89.1525212, -89.1524614, -89.1524172, -89.1524779,
-89.1527348, -89.1530395, -89.1533351527743, -89.1541684635419,
-89.1548943304196, -89.1560280641033, -89.1567590496996,
-89.1570077, -89.157351, -89.157454, -89.1573804, -89.1573412,
-89.1571597, -89.1569341, -89.1565957, -89.1562818, -89.1562279,
-89.1561151, -89.1561445, -89.1563211, -89.1566153, -89.1568017,
-89.1568605, -89.1569243, -89.1571162, -89.1571234, -89.1571319,
-89.1571799, -89.1571765, -89.1572354, -89.157281, -89.15731,
-89.1573308, -89.1574435, -89.157551, -89.1576458, -89.1577747,
-89.1578502, -89.1579073, -89.1580365, -89.1581284, -89.1581527,
-89.158222, -89.1583451, -89.1584804, -89.1586354, -89.1587418,
-89.1587937, -89.1589099, -89.1590863, -89.1592955, -89.1595019,
-89.1596388, -89.1597481, -89.1599204, -89.1600136, -89.1601706,
-89.1602907, -89.1604918, -89.1608106, -89.1610828, -89.161534,
-89.161838, -89.1620857, -89.1622819, -89.1624143, -89.1625443,
-89.162711, -89.1629685, -89.163454, -89.1636551, -89.1639494,
-89.1643809, -89.1647855, -89.1652024, -89.1654231, -89.1657296,
-89.1658988, -89.1660533, -89.1661612, -89.166274, -89.1664996,
-89.166538, -89.1667546, -89.1672966, -89.1675761, -89.1678875,
-89.1682382, -89.16866, -89.1691921, -89.1697512, -89.170374,
-89.1708449, -89.1712764, -89.1717056, -89.1718429, -89.1721273,
-89.1723603, -89.1727257, -89.1729831, -89.1731793, -89.1735079,
-89.1738488, -89.1742117, -89.1745108, -89.1748958, -89.1752539,
-89.1755923, -89.1760385, -89.1763598, -89.1764928411171,
-89.1766672679532, -89.177379280072, -89.177397, -89.1776153,
-89.1778997, -89.1782941561888, -89.17843299569, -89.1786035,
-89.1789274003356, -89.1797050812518, -89.1798639, -89.1804672,
-89.1808791, -89.1814873, -89.1819605, -89.1824632, -89.1830444,
-89.1834269, -89.1835252628211, -89.1837039364315, -89.1842743647614,
-89.1844642, -89.1847756, -89.1851802, -89.1852624248864,
-89.1853184701924, -89.1857260703081, -89.1862967361065,
-89.1867371372799, -89.1873974707965, -89.1874205203036,
-89.1874485, -89.1875703697865, -89.1885796711416, -89.189174870285,
-89.1899575382274, -89.1906098707125, -89.1908568548653,
-89.190987, -89.1912322, -89.1915314, -89.191726804936, -89.1918001387725,
-89.1936655474388, -89.1940252, -89.1946554, -89.1950591987336,
-89.1958846731336, -89.1959478351788, -89.1962886, -89.1965681,
-89.1969531, -89.1974205432467, -89.1974618064503, -89.1978187,
-89.1980762, -89.198498, -89.1988045, -89.1991257, -89.1996848,
-89.2002145, -89.2007687, -89.2013008, -89.2016294, -89.2018893,
-89.2019482, -89.2022449, -89.2024288, -89.2025195, -89.2025146,
-89.2024263, -89.2023332, -89.2023332, -89.2026421, -89.2030247,
-89.2033778, -89.2038192, -89.2042777, -89.204587482491,
-89.2047534740451, -89.2048758751251, -89.2049980751801,
-89.2050226752278, -89.2054548764496, -89.2064250757354,
-89.2067591435437, -89.2073135416186, -89.2077699427751,
-89.2080470761759, -89.2086665429606, -89.2087683603951,
-89.2089638, -89.2091968, -89.2093758, -89.2095646, -89.2098515,
-89.209882543667, -89.210157876564, -89.2112111342622, -89.2113155,
-89.2114287897642, -89.2118650664527, -89.2119359, -89.2121075,
-89.2121574569755, -89.212187277044, -89.2124236771048, -89.213401744073,
-89.2137604775029, -89.2144043432952, -89.2150562778149,
-89.2153397954358, -89.21535497207, -89.2154523, -89.2154523,
-89.215364, -89.2152438, -89.2151507, -89.2149324, -89.2146896,
-89.2144837, -89.2140545, -89.2134464, -89.2127819, -89.2125244,
-89.2121664, -89.211801, -89.2115607, -89.2113424, -89.211161,
-89.211004, -89.210879, -89.2108299, -89.210825, -89.2110016,
-89.2110457, -89.2110261, -89.2111095, -89.2111365, -89.2110751,
-89.2109722, -89.2107907, -89.2106092, -89.2104744, -89.2103199,
-89.2101997, -89.2099275, -89.2095523, -89.2091821, -89.2089123,
-89.2086034, -89.2082184, -89.2075465, -89.2073822, -89.2072007,
-89.2067422, -89.2065166, -89.2061855, -89.2059697, -89.2057515,
-89.2050992, -89.2047829, -89.2042704, -89.2035053, -89.2031326,
-89.2027206, -89.2023283, -89.2019408, -89.2014798, -89.2010507,
-89.2007049, -89.2004989, -89.2003812, -89.2003199, -89.2003028,
-89.2003445, -89.2003905983985, -89.2003905392014, -89.2004393391662,
-89.2004504298488, -89.2004548, -89.2005308, -89.2006166,
-89.2007858, -89.2008062186348, -89.2015231392455, -89.201743072617,
-89.2019060736903, -89.2023298717044, -89.2026803395001,
-89.2029003395609, -89.20337313972, -89.2035197397666, -89.2036827398157,
-89.2037436680974, -89.2037701, -89.2041061, -89.2042826,
-89.2043734, -89.2044517843352, -89.2044486732169, -89.2044811398709,
-89.20464413886, -89.2053368733823, -89.2056545401255, -89.2059642745629,
-89.206257541271, -89.2070804737173, -89.2075693394512, -89.2083517406859,
-89.2095331409663, -89.2104701401233, -89.2107585944563,
-89.2108201, -89.2115509, -89.2122424, -89.2127696, -89.2131301,
-89.2132444916887, -89.2135878752487, -89.2135980844745,
-89.2136892, -89.2140079, -89.2144493, -89.2148981, -89.215234,
-89.2156411, -89.2160016, -89.2163424, -89.2164503157843,
-89.2166590759077, -89.2183371429317, -89.2190051430697,
-89.2194611431552, -89.2197951432208, -89.2201860766347,
-89.2205201433779, -89.2209928356511, -89.2210138, -89.2214405,
-89.2215337390921, -89.2219291426219, -89.2224665447881,
-89.2225800515154, -89.222593, -89.2225832, -89.222414, -89.2223036,
-89.2220584, -89.2219285, -89.2218107, -89.2218009, -89.2217102,
-89.2217593, -89.221877, -89.2220509770662, -89.2220816765379,
-89.2223341422069, -89.222619276645, -89.2228797433598, -89.2231646767337,
-89.2237671434681, -89.2242635435159, -89.224466943504, -89.2248412768486,
-89.2251912758423, -89.2255168769279, -89.225769144656, -89.2261110769906,
-89.2266402781419, -89.2272102761689, -89.2275846772627,
-89.2280650773448, -89.2290095452416, -89.2295877453745,
-89.2308254789802, -89.2314931447472, -89.2326169450097,
-89.2332439462017, -89.2341152787127, -89.234603879874, -89.2347178788573,
-89.2350190799337, -89.2352713455967, -89.235425678919, -89.2354416788763,
-89.2354767000503, -89.2354595, -89.2354705868803, 47.8534601555129,
47.853345076599, 47.8529230098768, 47.8526116529378, 47.8526076,
47.8524463, 47.8522917, 47.8521436, 47.8520234, 47.8518935,
47.8517454, 47.8516779, 47.8517141, 47.8516713, 47.8516943,
47.8516878, 47.8517223, 47.8516417, 47.8516104, 47.8516154,
47.8515578, 47.8515183, 47.8515479, 47.8516351, 47.8516943,
47.851724, 47.8517174, 47.8517108, 47.8516219, 47.8515627,
47.8514952, 47.8514788, 47.8514031, 47.8514261, 47.8514393,
47.8514179, 47.8513735, 47.8513126, 47.8513208, 47.8512287,
47.8511727, 47.8511085, 47.851069, 47.851069, 47.8511052,
47.8511793, 47.8511744, 47.8512056, 47.8512418, 47.8512846,
47.8512879, 47.8513438, 47.8513768, 47.8514031, 47.8514673,
47.8515364, 47.8515857, 47.8516005, 47.8516022, 47.851617,
47.8515808, 47.8515989, 47.8515808, 47.8515397, 47.8515249,
47.851464, 47.8513932, 47.8512204, 47.85099, 47.8508452,
47.8506461, 47.8503466, 47.8499731, 47.8494448, 47.8490248,
47.8486101, 47.8481147, 47.8478215915556, 47.8478182117602,
47.8475878784163, 47.8471218783815, 47.8470746848553, 47.8465267,
47.8462909075023, 47.8453840782424, 47.8453825628658, 47.8453754,
47.8448415, 47.8442704, 47.8439676, 47.843696, 47.8434279058424,
47.8431252780756, 47.8420728113299, 47.8414916112685, 47.8411462112347,
47.8406802111814, 47.8396658110477, 47.8393806776726, 47.8392382109834,
47.8378894107799, 47.8375494774006, 47.8372368504577, 47.8370976,
47.8369706, 47.8368514915368, 47.8367984106434, 47.8364914106104,
47.8362774772413, 47.8358334104862, 47.8355154104282, 47.8351864103715,
47.8343858769261, 47.8337662768348, 47.8333770767865, 47.8333032701288,
47.8332672, 47.8331965, 47.8331372, 47.8331109, 47.8329808,
47.8328837, 47.8328014, 47.8326746, 47.8326368, 47.8325495,
47.8324392, 47.8323602, 47.8322615, 47.8321693, 47.8321034,
47.8320573, 47.8320228, 47.8319651, 47.8319223, 47.8319092,
47.8319454, 47.8319684, 47.8318713, 47.831733, 47.8316606,
47.8315981, 47.8315569, 47.831654, 47.8317693, 47.8318351,
47.8318763, 47.8318812, 47.8319075, 47.8320145, 47.8320672,
47.8320919, 47.8320475, 47.8319553, 47.8319289, 47.8318614,
47.8318483, 47.8317874, 47.8316952, 47.8316046, 47.8315437,
47.8315026, 47.8314927, 47.8315585, 47.8315964, 47.831524,
47.8314779, 47.831547, 47.8316178, 47.8316771, 47.8317215,
47.8317808, 47.8317972, 47.8317742, 47.8316902, 47.8315981,
47.8316293, 47.8316359, 47.8315454, 47.8314077290859, 47.831387010666,
47.8312006106828, 47.8312003371415, 47.8311536, 47.8310828,
47.830905, 47.8307931, 47.8307075, 47.8305165, 47.8303074,
47.8300934, 47.8298646, 47.8295683, 47.8292835, 47.8289131,
47.8285509, 47.8281097, 47.827652, 47.8271614, 47.8268141,
47.8267725384708, 47.8267478772953, 47.8262542772655, 47.8258540105764,
47.8257296995744, 47.8254245, 47.8253241, 47.8251891, 47.8250969,
47.8250508, 47.825013, 47.8249734, 47.8249652, 47.8249981,
47.8249981, 47.8249339, 47.8247314, 47.8245404, 47.8243989,
47.8243346, 47.8242836, 47.8242507, 47.8242638, 47.8242474,
47.8242095, 47.8241255, 47.8239807, 47.8239379, 47.8239411,
47.8239148, 47.8238852, 47.8238275, 47.8237963, 47.8237732,
47.8238045, 47.8238621, 47.8239197, 47.823923, 47.8238967,
47.8238391, 47.823793, 47.8238127, 47.8238473, 47.8238473,
47.8238127, 47.82376, 47.823765, 47.823793, 47.8238374, 47.8238736,
47.8239181, 47.8239428, 47.8239411, 47.8238539, 47.8238391,
47.8238619047018, 47.8239656111974, 47.8241410778918, 47.8242286779134,
47.8242573078649, 47.8243034, 47.8244943, 47.8247841, 47.8251331,
47.825492, 47.825716, 47.8257769, 47.8258246, 47.8259053,
47.8260716, 47.8262197, 47.8263235, 47.8264124, 47.8264058,
47.8264107, 47.8264535, 47.8264897, 47.8265836, 47.8267169,
47.8267976, 47.826977, 47.8272635, 47.8276076, 47.8277446,
47.8278216, 47.8279582, 47.8280521, 47.828113, 47.8281377,
47.8281212, 47.8280455, 47.8279582, 47.8279138, 47.8279237,
47.8279665, 47.8280455, 47.8281229, 47.8281509, 47.8281509,
47.8280817, 47.8279879, 47.8279187, 47.8279303, 47.8278414,
47.8277821, 47.827759, 47.8276866, 47.8276273, 47.8276026,
47.8276175, 47.8276059, 47.8275631, 47.8275088, 47.827443,
47.8274051, 47.8273853, 47.8273986547758, 47.8274960129923,
47.827539520767, 47.8275483, 47.827601, 47.8276438, 47.82768,
47.8277541, 47.8278578, 47.8278249, 47.8278331, 47.8278825,
47.8278628, 47.8278232, 47.8277607, 47.8277294, 47.8277212,
47.8276734, 47.827624, 47.827624, 47.827685, 47.8277195,
47.8277047, 47.8276389, 47.8276487, 47.8276158, 47.8275714,
47.8275072, 47.8274874, 47.8275236, 47.8274973, 47.8275006,
47.8275697, 47.8275977, 47.8276603, 47.8276767, 47.827759,
47.8278364, 47.8278924, 47.8279335, 47.8280093, 47.8280702,
47.8281607, 47.8283715, 47.8284225, 47.8284324, 47.828406,
47.8283352, 47.8283649, 47.8283682, 47.8282875, 47.8282513,
47.8282694, 47.828383, 47.8283962, 47.8283748, 47.8283896,
47.8284258, 47.8283863, 47.8283994, 47.8284373, 47.828411,
47.8283385, 47.8283122, 47.8283188, 47.8283649, 47.8284455,
47.8284834, 47.8284587, 47.8285196, 47.8285476, 47.8285986,
47.828625, 47.8287534, 47.8287748, 47.828816, 47.8288077,
47.8287682, 47.82876, 47.8287336, 47.8286925, 47.8286859,
47.8287715, 47.8287797, 47.8287517, 47.8286546, 47.828569,
47.8283534, 47.8282579, 47.8281591, 47.8280689, 47.8279915,
47.827901, 47.8278878, 47.8278736202981, 47.8278293737666,
47.8278351, 47.8278187, 47.8278483, 47.8278483, 47.827901,
47.8279257, 47.8279092, 47.8279306, 47.8279540707394, 47.8280166810719,
47.8280532209026, 47.8280458, 47.8280837, 47.8281298, 47.8281759,
47.8282154, 47.8282582, 47.8284969, 47.8287208, 47.8288673,
47.8289562, 47.8290254, 47.8290451, 47.8290813, 47.8291176,
47.8291538, 47.8292526, 47.8294682, 47.8296081, 47.8297201,
47.829916, 47.8300263, 47.8300806, 47.8301481, 47.830186,
47.8302897, 47.8303473, 47.8306173, 47.830665, 47.8310058,
47.8310897, 47.8311539, 47.8312297, 47.8313103, 47.8313811,
47.8315556, 47.8316445, 47.8317038, 47.8320165, 47.8322651,
47.8325153, 47.832675, 47.832861, 47.8329581, 47.8330635,
47.8332018, 47.8334108, 47.833526, 47.8335919, 47.8336841,
47.8337351, 47.8338223, 47.8338898, 47.8338553, 47.8338092,
47.8338437, 47.8339096, 47.8339771, 47.8339639, 47.8340116,
47.8340166, 47.8340511, 47.8341384, 47.8341861, 47.834112,
47.8341713, 47.8342454, 47.8343458, 47.8344709, 47.8345466,
47.8345878, 47.8346633, 47.8347291, 47.834762, 47.8348147,
47.8349909, 47.8352411, 47.8354271, 47.8356032, 47.8357711,
47.835967, 47.8362945, 47.8364427, 47.8365735, 47.8366879,
47.8369002, 47.8370188, 47.8370994, 47.8372196, 47.8373002,
47.8373578, 47.8374089, 47.8374879, 47.8376409, 47.8378533,
47.8381035, 47.8382697, 47.8383866, 47.8384541, 47.8385429,
47.8387273, 47.8388606, 47.8389495, 47.8390186, 47.8391157,
47.8392211, 47.8392606, 47.8393001, 47.839361, 47.839435,
47.8395502, 47.8396144, 47.8396457, 47.8396934, 47.839751,
47.8398152, 47.8398942, 47.8399502, 47.8400111, 47.8400802,
47.8401049, 47.8401444, 47.8401592, 47.8402152, 47.8402827,
47.8403847, 47.8405542, 47.8408127, 47.8411336, 47.8411994,
47.8412241, 47.8412291, 47.8412201736453, 47.8412250848141,
47.8412052740444, 47.8412208, 47.8411978, 47.8412077, 47.8412422,
47.8412307, 47.8413229, 47.8414134, 47.8414595, 47.8415204,
47.8416274, 47.841685, 47.8417096, 47.8417755, 47.8417969,
47.8417788, 47.8417112708236, 47.8416931657174, 47.8416948,
47.8417574, 47.8417722, 47.8419088, 47.842001, 47.8420421,
47.8420898, 47.842154, 47.8422166, 47.842261, 47.8423384,
47.8424042, 47.8424355, 47.8424766, 47.8425457, 47.8426264,
47.8427548, 47.8428436, 47.8429012, 47.8430428, 47.8431876,
47.8434411, 47.8436435, 47.8438591, 47.8440533, 47.8442244,
47.8443429, 47.8445306, 47.8446853, 47.8448498, 47.844891,
47.844965, 47.8451099, 47.8451971, 47.8452008870337, 47.8452246194175,
47.8453014194566, 47.8453389384909, 47.8454028, 47.8455328,
47.8456447, 47.8457747, 47.8458866, 47.8459772, 47.8459969,
47.8459949914194, 47.8460310864145, 47.8459762864215, 47.8459402275242,
47.845941, 47.8459903, 47.8460381, 47.8460364, 47.8460644,
47.8461335, 47.8461549, 47.846117, 47.8460644, 47.8459887,
47.8459634139007, 47.8460642198246, 47.8461410198676, 47.846322086612,
47.8464536866497, 47.8465159459644, 47.8465482, 47.8466256,
47.8467015827375, 47.8467552867329, 47.8468816201268, 47.8469638201617,
47.8470624868566, 47.8471763459545, 47.8471917, 47.8472443,
47.8473135, 47.8473875, 47.847455, 47.8475142, 47.8475998,
47.8476898485688, 47.8477152204062, 47.8477536871106, 47.8477840110258,
47.8477858, 47.8477858000044, 47.8478016264117, 47.8478236,
47.8478631, 47.8478393080159, 47.847840085442, 47.8478862,
47.847924, 47.8479108, 47.8478864817567, 47.8479456872334,
47.8479532848404, 47.8480046, 47.8480836, 47.8481264, 47.8481396,
47.848184, 47.8482317, 47.8482548, 47.8482360914454, 47.8482364874062,
47.8482723368755, 47.848314, 47.8483111401723, 47.8483186874505,
47.8483700414852, 47.8484095, 47.8484374, 47.8485312, 47.8485691,
47.8486152, 47.8486399, 47.8486119, 47.8486662, 47.8486593513193,
47.848685849999, 47.8487337, 47.8488308, 47.8488982, 47.8489492,
47.8489480778276, 47.8489768210618, 47.848987821084, 47.8489714211052,
47.8490134365046, 47.8490825, 47.8491335, 47.849094132685,
47.8491742878755, 47.8492536929498, 47.8492998, 47.8493623,
47.8494034, 47.8495696, 47.8496009, 47.849642, 47.8496996,
47.8497556, 47.8498428, 47.8499646, 47.8500353, 47.8501357,
47.85032, 47.8504266104133, 47.8504572881964, 47.8504635612434,
47.8505126, 47.8505751, 47.8506919, 47.8508417, 47.8510424,
47.8511255454526, 47.8513564883709, 47.8516032884492, 47.851691021821,
47.8518170885331, 47.8518706732123, 47.8519211, 47.8519837,
47.8519990320356, 47.8522282886829, 47.8523091714947, 47.8523194,
47.8524345, 47.8524788064973, 47.8525078887921, 47.8526560221672,
47.8527436888628, 47.8528478222218, 47.853023288944, 47.8531274889797,
47.8531932223406, 47.8532272925687, 47.8532639, 47.8533466153265,
47.8534070224434, 47.8537194892255, 47.8537798225857, 47.8538290892788,
47.8538620226351, 47.8539496893447, 47.8540208893758, 47.8541032227373,
47.8541854227694, 47.8542292227945, 47.8543168894962, 47.8543498228525,
47.8543498228671, 47.8544046228909, 47.8544868895857, 47.854503222933,
47.8545910229598, 47.8546842229945, 47.8547662896865, 47.854996623106,
47.8550622897952, 47.8551444898356, 47.8552212898586, 47.8552980232171,
47.8555644061923, 47.8556448, 47.8557979, 47.8558346100174,
47.8558954234564, 47.8559556901532, 47.8560268901798, 47.8560926235692,
47.856120023606, 47.8562294237089, 47.8562294237285, 47.8561908904256,
47.8561964237725, 47.8561634237847, 47.8561507009558, 47.8561286,
47.8560973, 47.856099, 47.8561187, 47.8561385, 47.8561335,
47.8561779, 47.8562306, 47.856224, 47.8561845, 47.856122,
47.8561023, 47.8560814010832, 47.856085690782, 47.8560856556992,
47.8561023, 47.856145, 47.8561352, 47.8562076, 47.856247,
47.856247, 47.8563046, 47.8563853, 47.8563922240511, 47.8564200242081,
47.8564166042843, 47.8564215, 47.8564159768154, 47.856419890901,
47.8564472909216, 47.8565692197829, 47.8566041, 47.8567357,
47.8567802, 47.8569217, 47.8570796, 47.8571342056312, 47.8571648245706,
47.8572688912842, 47.8572906913045, 47.8572765070703, 47.8572754,
47.8571866572172, 47.8572028913203, 47.8572125792636, 47.8572507,
47.8572613482874, 47.8572686246845, 47.8573616913753, 47.8574878247356,
47.8575027092383, 47.8575782, 47.8576423, 47.8576703, 47.8576473,
47.8576467083949, 47.8576466248034, 47.8576794248281, 47.8577426839129,
47.8578414, 47.8579566, 47.8580438, 47.8581688, 47.858307,
47.8584120919454, 47.8584354917438, 47.858440888129, 47.8584452,
47.8585078, 47.8585193, 47.8585040286292, 47.8585117630161,
47.8585456, 47.8585258151473, 47.8585338251768, 47.8585886252017,
47.8586158918968, 47.8587364252792, 47.8588076253164, 47.8589017538596,
47.8589142, 47.858916813401, 47.8590467885727, 47.8590688,
47.8591445, 47.8591906, 47.8592268, 47.8592379656086, 47.859267692133,
47.8593264933583, 47.8593781, 47.8595032, 47.8595490079518,
47.8595526255315, 47.8596294255572, 47.8596730922507, 47.8596894922764,
47.8597141864056, 47.8597286, 47.8597203519794, 47.8597276923062,
47.8598262256856, 47.8599412924018, 47.8600070257549, 47.8601000924445,
47.8601330257874, 47.8601334459934, 47.8601481, 47.8601373182237,
47.8601494258014, 47.8601986924912, 47.8602972925199, 47.8603576258672,
47.8603973615979, 47.8604574, 47.8605002, 47.8604969, 47.8604806170522,
47.8604450925778, 47.8604706660927, 47.8605232, 47.8605677,
47.8605718009245, 47.8605874926216, 47.8609876926855, 47.8611138260481,
47.8612178260832, 47.8613384261183, 47.8614808928227, 47.8618316928947,
47.8619850929306, 47.8623468263375, 47.8625386263809, 47.8626536930787,
47.8627413775495, 47.8628101, 47.862973, 47.8630898, 47.8631374258967,
47.8632232266116, 47.8632998266636, 47.8633034820117, 47.8634188,
47.8634763163445, 47.8634802267624, 47.8635294934526, 47.8635194271829,
47.8635257, 47.8634797, 47.8634559898892, 47.8635070268728,
47.8636766936049, 47.8637916936448, 47.8638952880109, 47.8638959,
47.8639633, 47.8641838, 47.8643631, 47.8643972864927, 47.8643998271435,
47.8645258271867, 47.8646186939009, 47.8646624272738, 47.8646512939551,
47.8646072939597, 47.864547027293, 47.8645632939703, 47.8646290939895,
47.8646892940107, 47.8647934273736, 47.864842627396, 47.8650506274818,
47.8650666726697, 47.8651626, 47.8652597, 47.8653946, 47.865518,
47.8655147, 47.8654834, 47.8654801208741, 47.8655417829505,
47.8656046, 47.8657163, 47.8658609, 47.8659941, 47.8660895,
47.8661998, 47.8663198, 47.8663495, 47.8663544299316, 47.8664244281048,
47.8664749613453, 47.8665567, 47.8667031, 47.8668266355852,
47.8670641466388, 47.8671605, 47.8674089, 47.8676046, 47.8677593,
47.8678761, 47.8680455, 47.8680500121395, 47.8684122287673,
47.8692908290801, 47.8699884293639, 47.8709714964148, 47.8711142297919,
47.8713720965306, 47.8719536966749, 47.8722828300817, 47.872453030136,
47.8726890968969, 47.873018697047, 47.8734740971732, 47.8737046305859,
47.8739902307048, 47.8740944974189, 47.8743744308407, 47.8747752310018,
47.8749014977217, 47.8753418979137, 47.87611583159, 47.8765386318016,
47.8767746319303, 47.8769778320746, 47.8772686321819, 47.877466232249,
47.8774693511414, 47.8775051, 47.8777288, 47.8779821, 47.8781173779748,
47.878332699148, 47.8784040991791, 47.8785906993166, 47.8788212994731,
47.879139499645, 47.8793534997283, 47.87964330869, 47.8796975,
47.879811, 47.8798274, 47.8797173770424, 47.8797594332051,
47.8802036333453, 47.8805232843974, 47.8806678, 47.8807115497066,
47.8815879124797, 47.8816809, 47.8819868, 47.8821825, 47.8822554279141,
47.8825617007096, 47.8827263007637, 47.8830148389666, 47.8831577,
47.8832712, 47.8832744, 47.8832445298586, 47.8838723009043,
47.8838763, 47.8839471, 47.8840013, 47.8840227, 47.8840034340145,
47.8841410346092, 47.8843424743015, 47.8843796, 47.8844503,
47.8845243, 47.8846065, 47.8846328, 47.8847134, 47.8847779534344,
47.8846948347167, 47.884645434697, 47.8846618346859, 47.8847277013566,
47.884815434701, 47.8848977013836, 47.8849854347397, 47.884972826411,
47.8850075, 47.8850966, 47.8851397, 47.8851806, 47.8852132,
47.8852634, 47.885265798662, 47.8853473014855, 47.8855118348567,
47.8857640349364, 47.8858517016442, 47.8858681017732, 47.8860161018568,
47.886213501959, 47.8862518353306, 47.8860982354493, 47.8861256354777,
47.88683263578, 47.887572636049, 47.8879398361925, 47.8879996326065,
47.8880417, 47.8880380369785, 47.8883398363552, 47.8884549030584,
47.8886676558543, 47.8886715, 47.8886722601283, 47.8889921032161,
47.8894031033674, 47.8895674367749, 47.8896298356158, 47.8896302,
47.8896959, 47.8897288, 47.8897275098198, 47.890290903682,
47.8907785038556, 47.8911581038719, 47.8912071, 47.8913008,
47.8913093244272, 47.8913922374074, 47.8917814375083, 47.8918055660729,
47.8918533, 47.8919256, 47.8919092, 47.8919124, 47.8919355,
47.8920193, 47.8920621, 47.8920621, 47.8920495, 47.8920111,
47.8919519, 47.8918845, 47.8917968985378, 47.8917819040155,
47.8917107039978, 47.8915461235239, 47.8914817, 47.8914225,
47.8913616, 47.8912814, 47.8912482, 47.8912235, 47.8911413,
47.891013, 47.8907845, 47.8905904, 47.8904786, 47.8904425,
47.8903948, 47.8903422, 47.8903619, 47.8904441, 47.8905378,
47.8906266, 47.890745, 47.8908996, 47.8910304322329, 47.8911685036675,
47.891420703736, 47.8919412372481, 47.8922152373637, 47.8925111041295,
47.8929003042275, 47.8931211692843, 47.8931637, 47.8931982,
47.8931062, 47.8930009, 47.8928826, 47.8927329, 47.8926178,
47.8926293, 47.8926968, 47.8927691, 47.8928365, 47.8929302,
47.8930729617043, 47.8930759041905, 47.8931527042011, 47.893300704234,
47.8934103042709, 47.8938487044294, 47.8945828380337, 47.8948129047752,
47.8951648074559, 47.8951532, 47.8949986, 47.8948704, 47.8947652,
47.8946928, 47.894678, 47.8945958, 47.8945399, 47.8944725,
47.8945087, 47.8945827, 47.8947027, 47.8948474, 47.894992,
47.8951384, 47.8952436, 47.8954919, 47.8956579, 47.8958141,
47.8958280467037, 47.8960796382424, 47.8968468384839, 47.8971152385886,
47.897735375004, 47.8977706, 47.8978577, 47.8979613, 47.8980813,
47.8981997, 47.8983033, 47.8984134, 47.8984197810719, 47.8984198388806,
47.8985020388988, 47.8988526390104, 47.8990881057706, 47.8994222392262,
47.8999209060357, 47.9002496394682, 47.9006223062296, 47.9007218811351,
47.9007266, 47.9007134, 47.901006, 47.9010784, 47.9011145,
47.9011162, 47.9012428, 47.9015716, 47.9017359, 47.9018149,
47.9018823, 47.9019349, 47.9019505, 47.9019562, 47.9018823,
47.9018116, 47.9017803, 47.9017787, 47.9018592, 47.9020269,
47.9020417, 47.9019957, 47.9019349, 47.9019529, 47.9019003,
47.9017853, 47.9018247, 47.9016488, 47.9015337, 47.9014548,
47.9014318, 47.9013184, 47.9012559, 47.9013069, 47.9012937,
47.9011984, 47.9011721, 47.9011786, 47.901131, 47.9010784,
47.9009929, 47.9008088, 47.9006641, 47.9005211, 47.9004569,
47.9003698, 47.9003567, 47.9002876, 47.9001857, 47.9000953,
47.8999522, 47.8999046, 47.8999046, 47.8998404, 47.899727,
47.8996629, 47.899556, 47.8995412, 47.8995593, 47.8995018,
47.8995314, 47.8995199, 47.8994377, 47.8993078, 47.8991319,
47.8990727, 47.8990546, 47.8991154, 47.8991385, 47.8991105,
47.8990513, 47.8990891, 47.8991105, 47.8990743, 47.8989823,
47.8988425, 47.8987274, 47.8987357, 47.8987011, 47.8986288,
47.8985663, 47.8985729, 47.898642, 47.898665, 47.8986452,
47.8985482, 47.8984332, 47.8983559, 47.8983641, 47.8983066,
47.8982178, 47.8981783, 47.8980501, 47.8979564, 47.8978988,
47.8977854, 47.8977459, 47.8977509, 47.8976785, 47.897621,
47.8976243, 47.8977048, 47.8977509, 47.8977772, 47.8977607,
47.8977673, 47.8978084, 47.897764, 47.8976226, 47.8974549,
47.8973218, 47.8971311, 47.8969946, 47.8969469, 47.8968269,
47.8966822, 47.8966855, 47.8965918, 47.8964882, 47.8963534,
47.8962054, 47.8960953, 47.8961117, 47.8960344, 47.8960016,
47.8959341, 47.8957862, 47.8955659, 47.8953488, 47.8950841,
47.8949214, 47.8947734, 47.8945876, 47.8944363, 47.8942308,
47.8939842, 47.8937655, 47.893657, 47.8934416, 47.8932459,
47.8930634, 47.8930141, 47.8928431, 47.8926211, 47.892409,
47.8922298, 47.8920506, 47.8918385, 47.8916329, 47.8914241,
47.8912663, 47.8910936, 47.8909653, 47.8908634, 47.8908042,
47.8907171, 47.890648, 47.8906217, 47.8905395, 47.8904392,
47.8903027, 47.8902501, 47.8902221, 47.890278, 47.8903767,
47.8904803, 47.8906036, 47.8907549, 47.8908305, 47.890921,
47.8910147, 47.8910804, 47.8912712, 47.8913172, 47.8915359,
47.8917776, 47.8920045, 47.8921805, 47.892483, 47.892631,
47.8927642, 47.8928645, 47.8931785, 47.8934251, 47.8935764,
47.8936751, 47.8938, 47.8938839, 47.8939694, 47.8940401,
47.8941058, 47.8941502, 47.8941535, 47.8942028, 47.894188,
47.8942308, 47.8941996, 47.8940943, 47.8939694, 47.8939381,
47.8939447, 47.8938609, 47.8938378, 47.8937819, 47.89368,
47.8936372, 47.8934679, 47.8932755, 47.8931637, 47.893093,
47.8930256, 47.8929368, 47.8928464, 47.8928086, 47.8927724,
47.8927806, 47.8928332, 47.8928349, 47.8929269, 47.8930223,
47.8930552, 47.8931884, 47.8933216, 47.8936603, 47.8940401,
47.8942275, 47.8943114, 47.8943969, 47.8944561, 47.8945646,
47.8946599, 47.8947142, 47.8947668, 47.8948424, 47.8948457,
47.8948967, 47.8948687, 47.8948737, 47.8948507, 47.8948556,
47.8948835, 47.8949279, 47.8950266, 47.8950496, 47.8950282,
47.8950118, 47.8950019, 47.8949148, 47.8948408, 47.8946665,
47.8945037, 47.8943558, 47.8941897, 47.8940269, 47.8938395,
47.8936849, 47.893555, 47.8934597, 47.8933594, 47.893292,
47.8931703, 47.893167, 47.8930535, 47.8929352, 47.8928447,
47.892825, 47.8926951, 47.8926787, 47.8925521, 47.8924666,
47.8923712, 47.8922693, 47.8921821, 47.8920127, 47.8918976,
47.8918829, 47.8918089, 47.8917234, 47.891707, 47.8916982462978,
47.8915243457092, 47.8914981, 47.8913846, 47.8912745, 47.8912054,
47.8912284, 47.8912169, 47.891161, 47.8910788, 47.8909818,
47.890893, 47.8908108, 47.8907631, 47.8907894, 47.890850835123,
47.8908310981098, 47.890736996735, 47.8907238, 47.8907017,
47.8905681, 47.890499, 47.8904038, 47.8903945, 47.8904335,
47.890501, 47.8907443, 47.8911702, 47.8913189, 47.8916404,
47.8920532, 47.8924576, 47.893015, 47.8935691, 47.8939128,
47.893972, 47.8941462, 47.8943205, 47.8944389, 47.8945277,
47.8947464, 47.8949683, 47.8951278, 47.8953498, 47.8956622,
47.8960929, 47.8963231, 47.8968722, 47.8970728, 47.897257,
47.8974526, 47.897543, 47.8976318, 47.8979047, 47.8982122,
47.8984571, 47.8986955, 47.8988484, 47.8988977, 47.8989668,
47.8990292, 47.8990851, 47.8991345, 47.8991838, 47.8991969,
47.8992183, 47.8992138599597, 47.8992822990217, 47.899386099087,
47.8994844991365, 47.8994877814766, 47.8995405, 47.8995751,
47.8996671, 47.899723, 47.8998102, 47.899894, 47.8999959,
47.9000403, 47.9001143, 47.9002458, 47.9003576, 47.9004464,
47.9005319, 47.9006239, 47.9007291, 47.9008212, 47.9008968,
47.9009955, 47.9011138, 47.9011862, 47.901201, 47.9012651,
47.9012864419422, 47.9012919599173, 47.9012918373212, 47.9012798745325,
47.9012503, 47.9011681, 47.9011221, 47.9011023, 47.9010826,
47.901104, 47.9011812, 47.901464, 47.9017879, 47.9020427,
47.9023879, 47.9027282, 47.9031342, 47.9036978, 47.903754,
47.9045825, 47.9049622, 47.9053354, 47.9057973, 47.9061096,
47.9064498416099, 47.9066634999018, 47.9072336999858, 47.9076802735147,
47.9077485, 47.907763690134, 47.9078641000843, 47.908143700132,
47.9084671001936, 47.9085932335539, 47.9087191002593, 47.9088887003332,
47.909042033714, 47.9090967004107, 47.9092007004458, 47.9092281004619,
47.9094032338475, 47.9094667005488, 47.9097962339932, 47.9103013008126,
47.9109493010327, 47.9114051011965, 47.9119652347243, 47.9122781014908,
47.9127615016758, 47.9129922350998, 47.9133819018948, 47.9139417020484,
47.9145247280819, 47.9146238, 47.9146813169508, 47.9147701022374,
47.9150664356498, 47.9153078357218, 47.9157690358836, 47.916565036156,
47.9168175029158, 47.9171634363849, 47.9173391031083, 47.917654510093,
47.9177103, 47.9177111891042, 47.9178987032635, 47.9183158367357,
47.9188813448202, 47.9189297, 47.9190661, 47.9192025, 47.9192273419044,
47.9193807037792, 47.9194217567643, 47.9194737, 47.9195608,
47.9196084, 47.9196133, 47.9196577, 47.9196676, 47.9196643,
47.9196429762586, 47.9196498372578, 47.9198585040176, 47.9199018958847,
47.9199601, 47.9199963, 47.9199928437492, 47.9202637550776,
47.9202789, 47.9203611, 47.9204219, 47.9203836057452, 47.9204896375844,
47.9206213103203, 47.9206585, 47.9208146, 47.9208177487713,
47.9212140378351, 47.9213354817767, 47.9213684, 47.9214621,
47.9214933, 47.9214933000208, 47.9215158379485, 47.9216071591431,
47.9216757, 47.9217941, 47.9219124, 47.92208, 47.9222525,
47.9223906, 47.9224727, 47.9227438, 47.9228201660016, 47.9230515049738,
47.9232873050332, 47.9235123051046, 47.9242145053507, 47.9245657054575,
47.9247248388542, 47.9249113055909, 47.9251363056578, 47.9256133057759,
47.9262112392513, 47.9262770392744, 47.9263648393346, 47.9264253060343,
47.9265349060685, 47.9267380396157, 47.9267811, 47.9270243,
47.9272149, 47.9272416155306, 47.9272863062536, 47.9274234396238,
47.9283558399107, 47.9288714400844, 47.9291456401666, 47.9296830402907,
47.9304507071141, 47.9305713071514, 47.930834640604, 47.9313611074868,
47.9317067076599, 47.9324195079997, 47.9325730414002, 47.9330830415743,
47.9334997084015, 47.9336970418064, 47.9340534419167, 47.9341905086297,
47.9345522421217, 47.9349908422741, 47.9353526567085, 47.9354135,
47.9354541770968, 47.9362133093254, 47.9364162427209, 47.9368272428712,
47.9369533095699, 47.9370011135623, 47.9370679, 47.9371747,
47.9371874377623, 47.937408442997, 47.9375674430397, 47.9376770430806,
47.9376973546391, 47.9377316, 47.9377809, 47.9378876, 47.9379895,
47.9380536, 47.9380568, 47.9380043, 47.9379583, 47.9379599,
47.9379534, 47.9378926, 47.9378039, 47.9377151, 47.9376675,
47.9376576, 47.9375772, 47.9374375, 47.9373504, 47.9371237,
47.9369841, 47.9368362, 47.9367525, 47.9365685, 47.936442,
47.9363138, 47.9362695, 47.9361791, 47.9360411, 47.9359935,
47.935816, 47.9356715, 47.9355647, 47.935453, 47.9353708,
47.9353445, 47.9352624, 47.9351441, 47.9351014, 47.9349798,
47.934947, 47.9347876, 47.9346824, 47.9346299, 47.9346496,
47.9346923, 47.9346808, 47.9345362, 47.9343814, 47.9341723,
47.934091, 47.9340096, 47.933933, 47.933847, 47.9337239,
47.9335961, 47.9333103, 47.9329803, 47.9325551, 47.9323065,
47.9322113, 47.9319929, 47.9317884, 47.9316025, 47.9314491,
47.9313376, 47.9312935, 47.9313469, 47.931405, 47.9315165,
47.9315374, 47.931556, 47.9317187, 47.9318883, 47.9319255,
47.9320068, 47.9320974, 47.9320997, 47.9321392, 47.9321764,
47.9321671, 47.9322461, 47.9323321, 47.9323855, 47.9323762,
47.9322996, 47.9321718, 47.9319673, 47.9317349, 47.9315421,
47.9313701, 47.9312331, 47.9310797, 47.9310053, 47.9310588,
47.9311517, 47.9312563, 47.931268347812, 47.9312559067488,
47.9312394400726, 47.9312120400621, 47.9312997067331, 47.9313655067461,
47.9316178401524, 47.9317549068526, 47.9319907068987, 47.9324952403108,
47.932731040363, 47.9333233071827, 47.9340746407381, 47.9345189075507,
47.9347383076186, 47.9352044410774, 47.9354841078175, 47.9362519080642,
47.9362903080846, 47.9362849080956, 47.9362739080997, 47.935835308096,
47.9357476414464, 47.9357750414669, 47.9358627081664, 47.9359614415291,
47.9363946416204, 47.9366305083449, 47.9368882417721, 47.9370746418438,
47.9373269085856, 47.9378642420516, 47.93861544224, 47.9389718423324,
47.9396298425572, 47.940528909491, 47.9410497096638, 47.9420146433243,
47.9430725103449, 47.9442729107405, 47.9453746444266, 47.9460159113068,
47.9469093115424, 47.9473862450094, 47.9475944450774, 47.947819045165,
47.9485917120779, 47.9496383124209, 47.9501260459112, 47.950822046101,
47.9514851129579, 47.9524165132469, 47.9534027135467, 47.953649246959,
47.9540106471304, 47.9541962472976, 47.9542289140259, 47.9540586473753,
47.9540264902939, 47.9539776, 47.953949411734, 47.9539211141085,
47.9538386474651, 47.9537618474729, 47.9536905141359, 47.953070514102,
47.9530636324294, 47.9530618, 47.9527821, 47.9519734940179,
47.95179824731, 47.9517049139738, 47.9516500473185, 47.9516770473894,
47.9517260474543, 47.95191191422, 47.9524154477685, 47.9528535145864,
47.9533409147489, 47.953472314785, 47.9535546481337, 47.953658276176,
47.9541, 47.9543249, 47.9543300013883, 47.9543336481728,
47.9544213148477, 47.9546297148765, 47.9548709149206, 47.9553039150068,
47.9556875150991, 47.9560106485202, 47.956081715227, 47.9562677153181,
47.956601515455, 47.9571051156242, 47.9573896490865, 47.9575029157972,
47.9578929159305, 47.9581510493465, 47.958502316111, 47.958782116176,
47.9595830496688, 47.9598354497238, 47.9602525164957, 47.96061471659,
47.9611471167464, 47.9613063167874, 47.9617456502666, 47.9621962504664,
47.9623994505477, 47.9627948506913, 47.9631626508193, 47.9637830510287,
47.9641125178192, 47.9644420512904, 47.9646068513674, 47.9647277180995,
47.9649694515322, 47.9651176516019, 47.9651343182988, 47.9652001183235,
47.9652934516838, 47.9659518518381, 47.9661986518857, 47.9664344519216,
47.9667469186276, 47.967015518653, 47.9672129186804, 47.967350052036,
47.9675475187457, 47.9680961188792, 47.9684636522986, 47.9687105190245,
47.9689958524326, 47.9691713191353, 47.9693084524865, 47.969393020109,
47.9694695, 47.9695022, 47.9695679, 47.9696196, 47.9697104,
47.9697134284905, 47.9697191191099, 47.9699494524706, 47.9702071191808,
47.9703826525496, 47.9705362525859, 47.9708929193478, 47.9712989194532,
47.9716171195419, 47.9720834529984, 47.9722590530569, 47.9724017197583,
47.9725992531381, 47.9732080532603, 47.9734000533042, 47.9737182533946,
47.974552320331, 47.9751614538566, 47.9754687206356, 47.9757375207226,
47.9761654541727, 47.9763136542206, 47.9765606543152, 47.9768239210602,
47.9772956545215, 47.9778551213494, 47.979089321675, 47.9793306550758,
47.9798298552304, 47.9802632553558, 47.9805429221138, 47.9806802555276,
47.9808997223035, 47.9809985223965, 47.9810590558165, 47.9809493224892,
47.9809495225787, 47.9808453225955, 47.9805877225985, 47.9803904559447,
47.9803576559587, 47.9803740559749, 47.9804288559964, 47.9805495226927,
47.9809772561036, 47.9811691228109, 47.9813665228583, 47.9815092562348,
47.9816627229558, 47.9822001230961, 47.9824140564954, 47.9825566565537,
47.9826937232907, 47.9828856566763, 47.9830721233861, 47.9831598567473,
47.9832202567735, 47.983291456813, 47.9835163236449, 47.9837192570499,
47.9838891237619, 47.9842017238404, 47.9843772572338, 47.9844320572604,
47.9844429239481, 47.9843552573017, 47.9843717239919, 47.9845910574232,
47.9845855241233, 47.9846129241426, 47.9846622575297, 47.9846960488989,
47.9847907, 47.9848322309214, 47.9848596576286, 47.9848267243209,
47.9847608576664, 47.9847651803125, 47.9850996, 47.9851673,
47.9851926, 47.9850996880561, 47.9851008578358, 47.9849855245184,
47.9847223245479, 47.9845304578826, 47.9842123245259, 47.9842058454092,
47.9842036, 47.9837868, 47.9836405908787, 47.9835488578065,
47.9835378578184, 47.9835428376994, 47.9836735, 47.9838825,
47.9840697, 47.9843104, 47.9844739, 47.9844518809639, 47.9844589246578,
47.9845905247152, 47.9847713248246, 47.9847712581914, 47.984705458194,
47.9845354581956, 47.9845025248756, 47.9844915249121, 47.9844091249202,
47.9840032582532, 47.9838497249316, 47.98375092498, 47.983778258345,
47.9838714583802, 47.9842442584559, 47.9843154584842, 47.9843263251747,
47.9842989251955, 47.9841837252069, 47.984205525263, 47.9841834586083,
47.9841122586035, 47.9841102058519, 47.9841035, 47.9838238,
47.9837476449454, 47.9837009252205, 47.9841394586721, 47.9842161253678,
47.9842216587293, 47.9841172587729, 47.9840458587842, 47.9840458587982,
47.9841499255111, 47.9841444588532, 47.9840346588531, 47.9840291255307,
47.9841114588883, 47.9844183256186, 47.9844841256423, 47.9845279256607,
47.984495059014, 47.9845443257065, 47.9847799257738, 47.9848785258098,
47.984900459159, 47.9848565258385, 47.9847522591714, 47.9847464818967,
47.9847435, 47.9846009, 47.9843851816236, 47.9843191257848,
47.9843574591514, 47.9843463258293, 47.9840446591628, 47.9839678591722,
47.9839457258537, 47.9839566592081, 47.9841374592901, 47.9843892594244,
47.9845040595257, 47.984739526311, 47.9848709263505, 47.9850135263786,
47.9853588597726, 47.9853913925474, 47.9857681, 47.9859037,
47.9860463, 47.9861059, 47.9860806, 47.9860730914435, 47.9860710600125,
47.985816331357, 47.9857678, 47.9856850832354, 47.9856650600138,
47.9852426599888, 47.9851668030725, 47.9852244, 47.9852254,
47.9854876, 47.9857051961928, 47.9857566603459, 47.9857894603572,
47.9858333270316, 47.9858990603723, 47.9859374603821, 47.9860633271009,
47.9860302604748, 47.9858709271719, 47.9857885271772, 47.9855251271765,
47.9855185427068, 47.9855164, 47.9854122, 47.9846119, 47.9844280076788,
47.9843244603295, 47.9841212603532, 47.9840225270163, 47.9838086603323,
47.9837262603432, 47.9837369270582, 47.9837038604154, 47.9837585271125,
47.9837529271274, 47.9836485271431, 47.9837197271692, 47.9839389272113,
47.9840540605762, 47.9841362606093, 47.9842239272921, 47.9844157273181,
47.984618660689, 47.9847063273784, 47.9847774607356, 47.9847936607736,
47.9847826646387, 47.9847613, 47.9847174, 47.9845598, 47.9845317027409,
47.9845190608081, 47.9844696608029, 47.9841846607539, 47.984033637439,
47.9840044, 47.9839714, 47.984016, 47.9840704, 47.9842892,
47.9843267, 47.9844085, 47.9844286, 47.9846338, 47.9848257,
47.9851324, 47.9852844, 47.9857095, 47.9857077, 47.9859588,
47.9860982, 47.986105, 47.9860846502737, 47.9860923911876,
47.9863004, 47.9866646, 47.9869076, 47.9869522, 47.9870674,
47.9871351, 47.9872008, 47.9874454, 47.987638, 47.9878951,
47.9879630009288, 47.9879657282856, 47.988146261697, 47.9882444617776,
47.9883429284908, 47.9884851285468, 47.9885234619045, 47.9885288619197,
47.9885197789644, 47.9885201, 47.9884433, 47.9883645928094,
47.9883806619097, 47.9884409285982, 47.9884225286024, 47.9884007286133,
47.9884940619802, 47.9885655286763, 47.9886753287132, 47.9891913288567,
47.989460328933, 47.9895537289627, 47.9895539289867, 47.9894829290109,
47.989494062367, 47.9896369290886, 47.989642462435, 47.9896589291129,
47.9897413291477, 47.9899336625439, 47.9900818625957, 47.9901422626091,
47.9902683292944, 47.990306729303, 47.9904770627023, 47.9906089294336,
47.9906749294622, 47.9907518628202, 47.9910316628874, 47.9910810629054,
47.9911195295919, 47.9911470629497, 47.9911362629571, 47.9908458629549,
47.9908240629646, 47.9907968630011, 47.9908628630448, 47.9910221297726,
47.9911266631561, 47.9913300632769, 47.9914290633286, 47.9915938634077,
47.9917312634658, 47.9919508635526, 47.9919619302392, 47.9919456635898,
47.9919511302662, 47.9920390636312, 47.992203730348, 47.9922641303743,
47.9925715304771, 47.9927362638684, 47.9928351305945, 47.9929175306232,
47.993005330651, 47.9934333307521, 47.9938118641668, 47.9938776641871,
47.9938777308616, 47.993844864201, 47.9938363197998, 47.9938361,
47.9937758, 47.9937045, 47.9935565, 47.9934248, 47.9932903397234,
47.9931101307754, 47.993066330776, 47.9930609307959, 47.9930829308213,
47.993319264271, 47.9937803311137, 47.9939505311875, 47.9941263312537,
47.9942140646265, 47.9942581313333, 47.9943624647056, 47.9944669314515,
47.9945767314991, 47.9946591315406, 47.9947744649133, 47.9949116649652,
47.9950871316942, 47.995317665099, 47.9954329317962, 47.9956687318528,
47.9957071318692, 47.9957182652225, 47.9957456652408, 47.9957074652623,
47.9957458652894, 47.995915931998, 47.9961408653731, 47.9961901320511,
47.9963657321072, 47.9964973321332, 47.9967276655013, 47.9968154655201,
47.9968647322014, 47.9968923322214, 47.9969307322619, 47.997057065664,
47.9973150657729, 47.9974358658275, 47.9975236658525, 47.9977594659019,
47.9979349326012, 47.9982380525844, 47.9983812, 47.9983858200095,
47.9983899326481, 47.9984173326513, 47.9984448659935, 47.9984613326708,
47.9984230660284, 47.9982586660201, 47.9982421326912, 47.9982422660352,
47.9983246660923, 47.9983849327818, 47.9984069327926, 47.9984014661347,
47.9983411328025, 47.9982973328076, 47.9982480661597, 47.998209732834,
47.9982206661794, 47.9982920662122, 47.998324932889, 47.9983798662339,
47.9985224662592, 47.9985608662673, 47.9986704662953, 47.9987747329836,
47.9988678663293, 47.9989391330175, 47.9990378663646, 47.9991420663757,
47.9991695330461, 47.9992298663923, 47.9992518664036, 47.9992792664393,
47.9993396664677, 47.9994823331871, 47.9997840666074, 47.9998937333009,
48.0000591333431, 48.0001743333646, 48.0004046667332, 48.0004539334083,
48.0005307334285, 48.0006514667908, 48.0009420668383, 48.0009968668498,
48.0010407335281, 48.00122173359, 48.0012876669542, 48.001463133682,
48.0015125337106, 48.0015070670571, 48.0014852670636, 48.0013920670624,
48.0012274670547, 48.0011727337255, 48.0011397337309, 48.001117867078,
48.0011179337653, 48.0012057338048, 48.0013098671749, 48.0016992672695,
48.0017925339625, 48.0019900673689, 48.0021490674417, 48.0022149341281,
48.0023849341639, 48.0024506675147, 48.0025110675386, 48.002521934218,
48.0025110675721, 48.0025219342493, 48.0026152676139, 48.0027194676378,
48.0029497343464, 48.0029990676911, 48.0030484677079, 48.0030868677317,
48.0030923344108, 48.0029059344079, 48.0028127344122, 48.0028182677564,
48.0029553344666, 48.0032405345479, 48.0034324679302, 48.003574934635,
48.0036243346591, 48.0036517346807, 48.0037888680766, 48.0039259347885,
48.0040082681438, 48.0043701348896, 48.0045291349305, 48.0046826683153,
48.0048142683508, 48.0050774684146, 48.0051432684343, 48.0051706684459,
48.0052584685055, 48.0054339352277, 48.0054941352505, 48.0055107352707,
48.005559935292, 48.0060150687842, 48.0063221355688, 48.0064208689281,
48.0065908689672, 48.0066511356489, 48.0067607356892, 48.0069033357352,
48.0073529358649, 48.0074899359079, 48.0078189359997, 48.0080328693968,
48.0080875360855, 48.0081588694633, 48.0082520694913, 48.0083451362021,
48.0085261362489, 48.0085974696044, 48.0086248696188, 48.0087399363343,
48.0093648698568, 48.0094581365543, 48.0096718699479, 48.0101378700727,
48.0103352701195, 48.0104339368043, 48.0106587368377, 48.0108231368783,
48.0109328702313, 48.0110425369148, 48.0111816279249, 48.0112751,
48.0113629, 48.0113706000049, 48.0113716702659, 48.0114209369377,
48.0115854703016, 48.0117280703381, 48.0118430703825, 48.011853937064,
48.0117936703996, 48.011785158207, 48.0117849, 48.0116149,
48.011445, 48.0113682, 48.0110995, 48.0110063, 48.0108528,
48.0106795008923, 48.0106093368967, 48.0105708702308, 48.0105598702382,
48.0106639369488, 48.0108448703479, 48.0109161370373, 48.0110696704097,
48.0112725371134, 48.0113218704586, 48.0113656704731, 48.0113875371807,
48.0114971372188, 48.0115628705835, 48.01158473729, 48.0116560706527,
48.0120561374451, 48.0122972708436, 48.0124014708686, 48.0125550708977,
48.0128565376073, 48.0129661376297, 48.0131252710018, 48.0132841377089,
48.0134595377399, 48.0136021377692, 48.0136953377909, 48.0137940711519,
48.0138762711722, 48.0140242712067, 48.0143422712697, 48.0144189379615,
48.0144792713093, 48.0145395379893, 48.0146601380105, 48.0148301380452,
48.0149288714073, 48.0149507380881, 48.0149396714328, 48.0148299381076,
48.0148024714455, 48.014791471458, 48.0148188714729, 48.0150052715416,
48.0152408716089, 48.0153011382962, 48.0153174716485, 48.0152626716593,
48.0152461383376, 48.0153009383608, 48.0155146717606, 48.0156188717811,
48.0158381384799, 48.016194471886, 48.0163315385733, 48.0163699385826,
48.0164740719353, 48.0165288719485, 48.0167097386737, 48.0168413387003,
48.0168687387091, 48.0168850720553, 48.0170111387545, 48.0171975387965,
48.0176415389098, 48.0178332723116, 48.0181346723907, 48.0185402724927,
48.0189074725993, 48.0191978727003, 48.0192744727232, 48.0193676727584,
48.0193675394518, 48.0193839394635, 48.0194880728325, 48.0196086728621,
48.0200033396035, 48.0202555396496, 48.020332273007, 48.0204198730302,
48.0207158731019, 48.0209570731559, 48.0214667399429, 48.0218285400142,
48.0220258733877, 48.0221245400764, 48.022217673441, 48.0222725401181,
48.0223492734637, 48.0224424734861, 48.0225521401763, 48.0225630735157,
48.0225465401839, 48.0223655401695, 48.0223600735087, 48.0224970735544,
48.0225956735737, 48.0226230735809, 48.022617473599, 48.0226504736086,
48.0227435402976, 48.0227435403043, 48.0228366736662, 48.0228749403487,
48.0228803403685, 48.0228967403791, 48.0230226737628, 48.0232199404786,
48.0232530308397, 48.023299, 48.0233042970878, 48.023307740484,
48.0233790738272, 48.0235209023194, 48.0235842, 48.0235903342712,
48.0235929405118, 48.023631340516, 48.0237355405338, 48.0238176738864,
48.0238834739049, 48.0240205405962, 48.024042473937, 48.0240532739664,
48.0240969406781, 48.0242281407582, 48.0243102741252, 48.0244636741755,
48.0245895408942, 48.0247429409394, 48.0250663410249, 48.025236074413,
48.0254497411388, 48.0257073412001, 48.0258552745735, 48.026003141288,
48.0262771413572, 48.0264688747455, 48.0266168747789, 48.0267100747928,
48.0268786577342, 48.0269153, 48.0269262, 48.0268332, 48.0268332,
48.0268936, 48.0268997490266, 48.026902341427, 48.0270559414439,
48.0272451551336, 48.027294, 48.0272887, 48.0272175, 48.0272176,
48.0272615, 48.0272697683069, 48.0272702747288, 48.027341541402,
48.0275663414338, 48.0276321414474, 48.0277307414816, 48.0278019415021,
48.0279115415178, 48.0279986007625, 48.0281223, 48.0282212,
48.0282432, 48.0282159, 48.0280187, 48.0280573, 48.0280409,
48.0281946, 48.0283049, 48.0283435, 48.0284533, 48.0286565,
48.028673, 48.0286785, 48.0286567, 48.0284868, 48.0281033,
48.0280101, 48.0278677, 48.0277089, 48.0275063, 48.0273145,
48.0270297, 48.0268435, 48.0267613, 48.026531, 48.0264104,
48.0263776, 48.0263995, 48.026586, 48.0266299, 48.0266519,
48.0266355, 48.0265588, 48.0263396, 48.0262738, 48.0262575,
48.0261697, 48.026104, 48.0261205, 48.0261699, 48.0261780186028,
48.0261786735592, 48.0264716321456, 48.0264935, 48.0264716,
48.0263401, 48.0263347, 48.026362, 48.0263672391356, 48.0263707401822,
48.0265354809855, 48.0265815, 48.0265815, 48.0260226, 48.0257923,
48.0253647, 48.0251509, 48.0244878, 48.0240383, 48.0237368,
48.0236326, 48.0235973656586, 48.0235920727742, 48.023767472818,
48.0241016729217, 48.0243865397082, 48.0243646730497, 48.0243261397182,
48.0242329397187, 48.0240738730434, 48.0240690961445, 48.0240651,
48.0239829, 48.0238512, 48.0238129, 48.0237882, 48.0236376,
48.0235061, 48.0233799, 48.0231607, 48.0230182, 48.0229195,
48.0228154, 48.0227277, 48.022673, 48.0225962, 48.0225423829769,
48.0224294726377, 48.0224283083961, 48.0224207, 48.0223494,
48.0222398, 48.0221575, 48.0220643, 48.0219986, 48.0217684,
48.0215601, 48.0214012, 48.021319, 48.0211161, 48.0208914,
48.0206996, 48.0203213, 48.019998, 48.0198609, 48.0188686,
48.0183862, 48.0180627, 48.0177996, 48.0176242, 48.0175858,
48.017542, 48.0174379, 48.0174434, 48.0175202, 48.0175312,
48.0175093, 48.0174217, 48.0173175, 48.0171695, 48.0167583,
48.0165172, 48.0160511, 48.0159633, 48.0159524, 48.0159963,
48.0159853, 48.0158867, 48.0153713, 48.0152781, 48.0150917,
48.0149382, 48.0146915, 48.014379, 48.0143077, 48.0143022,
48.0143461, 48.0143542880654, 48.0143548704889, 48.0144535371654,
48.0146564705263, 48.0149799372427, 48.0151773372712, 48.0153857372973,
48.0155935035079, 48.0156951, 48.0156990840287, 48.0157038706574,
48.0157860706677, 48.0158847373524, 48.0161095374087, 48.0162630707867,
48.0165590708679, 48.0168715376102, 48.0171621376633, 48.0174198710328,
48.017737871068, 48.0177763377399, 48.0180942711279, 48.0181490106699,
48.0182226, 48.0183323, 48.0183392400633, 48.0183410711364,
48.0183794711412, 48.0184726711558, 48.0185768711803, 48.0188071379118,
48.0189935379504, 48.019256671347, 48.0194376714044, 48.0196239381426,
48.0197390715242, 48.0199472716178, 48.0200514716852, 48.0200896717268,
48.0201609384184, 48.0202924717889, 48.0203472718143, 48.0204733385174,
48.0207090719057, 48.020900938619, 48.0210105386604, 48.0211968720742,
48.0213501388174, 48.0214324721861, 48.0215311388787, 48.0218161389494,
48.0220299389935, 48.0224521390899, 48.0229070725538, 48.0231645392907,
48.0234387393554, 48.0236470727199, 48.0237950727432, 48.0240910728138,
48.0245295396008, 48.024831073006, 48.0251544730932, 48.0252531397747,
48.0252951371869, 48.0253706, 48.0253778903094, 48.0253793397788,
48.0254122731155, 48.0256973398245, 48.0258330316006, 48.0259354,
48.0259903, 48.0260561, 48.0261439, 48.0261519406519, 48.0261526731623,
48.0263804440203, 48.0264565, 48.0265333, 48.0265992, 48.0266705,
48.0266738510115, 48.0266792731583, 48.0267724731807, 48.0267943398537,
48.0267998732051, 48.0268545821532, 48.0268903, 48.0269343820427,
48.0270465399137, 48.0270904732559, 48.0271781399437, 48.02731514,
48.0274740733945, 48.0279068735225, 48.0279833403229, 48.0280737,
48.0281176, 48.0282163, 48.0282188253881, 48.0282250735392,
48.0283237402178, 48.0284169402341, 48.0285649402685, 48.0286910736455,
48.0287238736696, 48.028718273685, 48.0286469403613, 48.0286578737035,
48.0287017403868, 48.0286852737234, 48.0283341403956, 48.0283286737388,
48.0283504737568, 48.028575140492, 48.0287065405409, 48.0287503405748,
48.0288105406032, 48.0290134739892, 48.0292052740353, 48.029402540741,
48.0295834741134, 48.0296327407991, 48.0296436741502, 48.0295941408485,
48.0294787408732, 48.0289796741915, 48.0288587408833, 48.0288202742381,
48.0288207209202, 48.0289063, 48.0289456, 48.0289673756961,
48.0290157617411, 48.0291344, 48.0292214, 48.0291744, 48.0291639372006,
48.0291701411663, 48.0293765954097, 48.029429, 48.0296356,
48.0297388, 48.0295374, 48.0292403, 48.0291788, 48.0292142,
48.029159, 48.0291013260066, 48.0291033413567, 48.0291088746941,
48.0290813413743, 48.0290922747208, 48.0292619414422, 48.029448341491,
48.0294808811189, 48.0297834, 48.0298454545668, 48.0298592749359,
48.029924573944, 48.0300682, 48.0301934, 48.0302208, 48.0304018,
48.0305239, 48.0305927, 48.0303948, 48.0304521, 48.0303227,
48.0304884, 48.0304972, 48.0303911, 48.0304356, 48.0305542,
48.0303858, 48.0301842, 48.0299641, 48.0298823, 48.0297761,
48.0296482, 48.0295786, 48.0295219, 48.029452849549, 48.0294510752887,
48.0294672753244, 48.0295109420289, 48.02952543282, 48.0296325,
48.0298665, 48.0298887, 48.030048, 48.030183, 48.0303294344879,
48.0303544756129, 48.0304366756349, 48.0304465998073, 48.0306353,
48.0310946, 48.0313636, 48.0313282551828, 48.0313347425978,
48.0314224759455, 48.0314519113858, 48.0316842, 48.0318707,
48.0320169, 48.0320503, 48.0322875, 48.0327609, 48.0329847,
48.0331295890739, 48.0331479430944, 48.0333342764669, 48.0334110764781,
48.0335983903185, 48.0337631, 48.0339006, 48.0338845276898,
48.0339318765737, 48.0340061889886, 48.0341435, 48.0341751,
48.034046, 48.0340654, 48.0341423, 48.0342843, 48.0341762,
48.0344297, 48.0345212, 48.0344974791738, 48.0345042768598,
48.034509372033, 48.0346724, 48.0347073, 48.0349524, 48.0350395,
48.0351455, 48.0352654, 48.035618, 48.0358907, 48.0358629,
48.0360655, 48.0361674, 48.0362756, 48.0363723, 48.0364313,
48.0364, 48.0366691, 48.0367748, 48.0369085, 48.0371945,
48.0372113473158, 48.0372211442399, 48.0374132776233, 48.0375066776496,
48.0375505443323, 48.0375506776796, 48.037896477771, 48.0381706778273,
48.0383462778706, 48.0386536779549, 48.0388513446785, 48.0388842780276,
48.0388623446951, 48.0388552914863, 48.0388536, 48.0388043,
48.0386570295381, 48.0386266779997, 48.0386431446865, 48.0387310780515,
48.0388517447483, 48.0390449124123, 48.0391829, 48.0391883627445,
48.0391916781148, 48.0392629447901, 48.0392903447989, 48.0392739448023,
48.0392410781361, 48.0392465448074, 48.0393069448241, 48.0393235448348,
48.0392906781663, 48.0392824205446, 48.0392819, 48.0392028321964,
48.0391809448267, 48.0392029448409, 48.0393677449022, 48.0395378782786,
48.0397572783235, 48.0397903450132, 48.0398506783632, 48.0399110783754,
48.0399641865305, 48.0400229, 48.0400297235058, 48.0400316783804,
48.0400864783869, 48.0401796784065, 48.0402729450967, 48.0403004784416,
48.04030054512, 48.040371878476, 48.0403775451624, 48.0403281451651,
48.040328278509, 48.040319499856, 48.0403195, 48.0401638355294,
48.0401146785079, 48.0401751452219, 48.040252078596, 48.0403234786165,
48.0404221453063, 48.040548478665, 48.0408115453748, 48.0409541453962,
48.0410638787413, 48.0412338787693, 48.0413874788034, 48.0414588788306,
48.0415796788601, 48.0415522788742, 48.0416071455551, 48.0417059455727,
48.0417578719355, 48.0418012, 48.0418082969412, 48.0418099455703,
48.0418593455777, 48.0419196789239, 48.0421609456217, 48.0422267456364,
48.0422707456581, 48.0422270790161, 48.04225467906, 48.0422273457347,
48.0422187733047, 48.0422186, 48.0421692, 48.0420569253335,
48.0420244790432, 48.04204107906, 48.0419697457313, 48.0419643457428,
48.0419863457553, 48.0420631457677, 48.0421125457806, 48.04212354579,
48.0421729458085, 48.0422936791658, 48.0426500792157, 48.0426721459021,
48.0426940792435, 48.0427489459206, 48.0428201459298, 48.042875079273,
48.0429079459521, 48.0428476792832, 48.0428257459535, 48.0428313459627,
48.0430562793466, 48.0431582343046, 48.0432229, 48.04322657994,
48.0432316793676, 48.0432974793756, 48.0433523460554, 48.0433963460732,
48.0434292794306, 48.0435884794705, 48.043654346158, 48.0436488795045,
48.0436215461835, 48.0436489461984, 48.043857546248, 48.044027479611,
48.0442413463084, 48.0443804440005, 48.0445561, 48.0445614973863,
48.0445648796703, 48.0446716746271, 48.0446985, 48.0447072201175,
48.0447072796756, 48.0447402796784, 48.0447895463586, 48.044844546383,
48.0449049464024, 48.0449487464219, 48.04497087978, 48.0450038797968,
48.0450697464872, 48.0452398798663, 48.0454317465713, 48.0456897466538,
48.0458214800232, 48.0458544800551, 48.0459202800692, 48.046112280102,
48.0462000801253, 48.0462001467986, 48.0461452801277, 48.0461438421391,
48.0461365, 48.0460323, 48.0459753467753, 48.0459753467798,
48.046013746799, 48.0463375469018, 48.0464857469447, 48.0466667469904,
48.0473414804689, 48.0474895471695, 48.0476048805466, 48.047753080595,
48.0478791472897, 48.0481259473256, 48.0482740806894, 48.0484770807248,
48.0486305474266, 48.0487403474608, 48.0488117475092, 48.0488611475338,
48.0490422809134, 48.0491354809414, 48.0491684809576, 48.0491685476433,
48.0492123476544, 48.0492837476659, 48.0493496810223, 48.049399081047,
48.0497939478152, 48.0502822812713, 48.0504303479796, 48.050540081341,
48.0508197480542, 48.0509349480779, 48.0510940814534, 48.0515275482553,
48.0522569484238, 48.0525806818382, 48.0528658818904, 48.0529262819099,
48.052937281922, 48.0531620819515, 48.0532607486369, 48.0533868820044,
48.0534143486905, 48.0535131487253, 48.0538806821586, 48.0540013488604,
48.0542756822612, 48.0544456822948, 48.054544348994, 48.0547144823693,
48.0548022823887, 48.0549009490696, 48.0550763490878, 48.0551970824395,
48.05532868247, 48.0555535491767, 48.0556248825299, 48.0557400825788,
48.056167949375, 48.0566341494908, 48.0567712828559, 48.0568842002749,
48.0569325, 48.0569929, 48.0570421, 48.0570425221006, 48.0570508828784,
48.0570947495523, 48.057127749563, 48.0572319496126, 48.0573362829765,
48.057621483055, 48.0577037497431, 48.0578188830924, 48.057882266552,
48.0579691, 48.0579750005152, 48.0579778831015, 48.058043683109,
48.0581094831231, 48.0581643498074, 48.0580876831647, 48.0581095498372,
48.0581644831787, 48.0582357498591, 48.0582028832018, 48.058202883208,
48.0582822776322, 48.0583531, 48.0583559944756, 48.058361883225,
48.0584276832352, 48.0586086832792, 48.0588390833384, 48.0594258834642,
48.0595520835101, 48.0597055502198, 48.0598262835788, 48.0600181502826,
48.0600840836317, 48.0601169503141, 48.0601717503278, 48.0603856837008,
48.0606325504541, 48.0606873504711, 48.06075931832, 48.0607938,
48.0606511, 48.060673, 48.0606126, 48.0606126, 48.0606729,
48.06064, 48.0605522, 48.0605413, 48.0606235, 48.0607441,
48.0607462248072, 48.0607528836608, 48.0609064836843, 48.0612134837139,
48.0613231503969, 48.0616192837891, 48.0617105218927, 48.0617586,
48.0618244, 48.0618296646678, 48.0618331504719, 48.0618934838148,
48.0620194838394, 48.0622280839213, 48.062348683977, 48.0624255506571,
48.0626557506917, 48.0627654840453, 48.0628861507365, 48.0631274841272,
48.0632262841676, 48.0630398841892, 48.0630398842004, 48.0631002842176,
48.0632263509118, 48.0633085509254, 48.0634620842767, 48.0634950842812,
48.0635279509592, 48.0635279509742, 48.0634786843124, 48.0634676843232,
48.0635334843445, 48.0636182432157, 48.0637496, 48.0637605,
48.0637692290632, 48.063769284341, 48.063813151012, 48.0639545831841,
48.0639743, 48.0639689, 48.064084, 48.0641881, 48.0641912149042,
48.0641968843622, 48.0642572843728, 48.0643888843927, 48.0645478844208,
48.0646301511134, 48.0647672845092, 48.0648494845367, 48.064909884549,
48.0651401512458, 48.0652314274998, 48.0653672, 48.0653837,
48.0654165, 48.0654200102296, 48.0654252845986, 48.0655782577084,
48.0656139, 48.0656249, 48.0655755, 48.0655864, 48.0655949942667,
48.0655951512564, 48.0656938845989, 48.0657706846096, 48.0658638846269,
48.0659571513165, 48.066018374437, 48.0660744, 48.0661074,
48.0660909, 48.0661238, 48.0662389, 48.0662403669763, 48.0662476846349,
48.0663737513218, 48.0664615513412, 48.0665932847167, 48.066669951399,
48.0669441514465, 48.0673773515159, 48.0676076848767, 48.0683149516384,
48.0686549517178, 48.068879885089, 48.0691266851282, 48.0692846301285,
48.0694413, 48.069551, 48.0695555826883, 48.0695597518185,
48.0696584851633, 48.0700312852149, 48.0702181856236, 48.070516,
48.0706092, 48.0706172715129, 48.0706179519119, 48.0707411791805,
48.0707737, 48.0707462, 48.0707353, 48.0707450370002, 48.0707440852276,
48.0709195519269, 48.0710236852786, 48.0711388852961, 48.071215685313,
48.0712540853389, 48.0713143520256, 48.0714624853934, 48.0716379521077,
48.0717421521255, 48.0718463521416, 48.0720041526366, 48.0723804,
48.0723816700473, 48.0723891521905, 48.0725150626006, 48.0726765,
48.0726821819287, 48.0726852855447, 48.0729648855756, 48.0730745522619,
48.0731732856223, 48.073178885642, 48.0731459523259, 48.0730253523683,
48.073036352381, 48.0730966857316, 48.0731844857488, 48.0733434857708,
48.073447685788, 48.0735021862236, 48.0735595, 48.0736308,
48.0736394801202, 48.0736395524517, 48.0737162857917, 48.0738259524741,
48.0739630858287, 48.0743852858698, 48.0745716858934, 48.0746375525702,
48.0746758859122, 48.074747152591, 48.0748268068995, 48.0748974,
48.0749194, 48.0749577, 48.0751057, 48.0751715, 48.0751715,
48.0751275, 48.0751385, 48.0751878, 48.0751956194953, 48.0751965525221,
48.075300752532, 48.0755247086056, 48.0756375, 48.0756449654612,
48.0756462858925, 48.0757064858986, 48.0758055578065, 48.075928,
48.0759367231787, 48.0759367525798, 48.0761089116817, 48.0762734,
48.0762818119786, 48.0762821525942, 48.0767178797472, 48.0771232,
48.0771725, 48.0771742071006, 48.077181285971, 48.0773787526672,
48.0775103526826, 48.0775541526898, 48.0776090860363, 48.0776857527141,
48.0777766777073, 48.0778141, 48.077836, 48.0778853, 48.0778904692063,
48.0778940860389, 48.0780749527272, 48.0781408860713, 48.078184752758,
48.0781573527682, 48.0782231527779, 48.078317338714, 48.0784447,
48.078483, 48.0784775, 48.0784501, 48.078461, 48.0784687471795,
48.0784697527573, 48.0785167641332, 48.0786035, 48.078609,
48.0785156, 48.0784552, 48.0783346, 48.0780219, 48.077605,
48.0771498, 48.0770291, 48.0769084, 48.0769028, 48.0769138,
48.0768644, 48.0768588, 48.0768862, 48.0768908766673, 48.0768949521337,
48.0771963438459, 48.0773413, 48.0774126, 48.0774784, 48.0774837,
48.0774563, 48.0774563, 48.0775165, 48.0775244728049, 48.0775252854705,
48.0777196310737, 48.0777578, 48.0777578, 48.077659, 48.077445,
48.0771378, 48.0768854, 48.0764026, 48.0763696, 48.0763696,
48.0764133, 48.076616, 48.0766324, 48.0765116, 48.0761383,
48.0757487, 48.0757322, 48.075743, 48.0757814, 48.0758526,
48.0761267, 48.0761298903223, 48.0761354845812, 48.0763766846078,
48.0764863512891, 48.0766015513089, 48.0767715513419, 48.0769635513863,
48.0772652847944, 48.0774463515078, 48.0775780848996, 48.0776548849308,
48.0776659516185, 48.0776166849579, 48.0776167516441, 48.0777978850421,
48.077869285076, 48.0780557518025, 48.0782314852109, 48.0783358852812,
48.0784675520046, 48.0786377520617, 48.0788352854731, 48.0793785523338,
48.0796308857355, 48.0796912857645, 48.0797407524637, 48.0797243524972,
48.0798396859067, 48.0798946859679, 48.0799386860042, 48.0800154860354,
48.0801800860866, 48.0803664861404, 48.0806078861966, 48.0809643529393,
48.0811781529818, 48.0813482863537, 48.0815128864005, 48.0815566864205,
48.0815952864928, 48.0817268865283, 48.0818474865489, 48.0821052865879,
48.0822478866177, 48.0823795533216, 48.0827086867941, 48.0828074868207,
48.0829170868431, 48.0829743743108, 48.0830455, 48.0830508,
48.0830728, 48.0831166, 48.0831216876003, 48.0831253534833,
48.0831801534914, 48.0833008868627, 48.083503753606, 48.0836190869592,
48.083697273107, 48.0838021, 48.0838186, 48.0838186, 48.083802,
48.0838074, 48.0837909, 48.0838018, 48.0839389, 48.0839418078112,
48.0839476868181, 48.0840517535015, 48.0841724868794, 48.0842931536002,
48.0844303536426, 48.0845456870215, 48.0845894870565, 48.0846169537387,
48.0847211537604, 48.0848746871194, 48.0850743093986, 48.0852552,
48.0854746, 48.0854855, 48.085436, 48.0853099, 48.0853208,
48.0853286457127, 48.0853295537368, 48.0854228870875, 48.0857903538558,
48.0859054872084, 48.0860205538927, 48.086152287261, 48.0864100873033,
48.0864538873216, 48.0864977540022, 48.0865513413292, 48.0865986,
48.086467, 48.0863682, 48.0862914, 48.0863243, 48.0863572,
48.0862803, 48.0863296, 48.0863187, 48.0860663, 48.0856988,
48.0855616, 48.0852104, 48.0852104, 48.0852597, 48.0852650815486,
48.0852684867547, 48.0853452867636, 48.0854001534406, 48.0854352000039,
48.0854352, 48.0853803, 48.0852871, 48.0852597, 48.0852596,
48.0852683593459, 48.0852683533699, 48.0853546986844, 48.0854022,
48.0854077, 48.0854296, 48.0854382924061, 48.0854383533756,
48.0855918867223, 48.0856795534039, 48.0857508867538, 48.0859484868213,
48.0860141535077, 48.0862774869003, 48.0863816869337, 48.0866065536471,
48.0867766870419, 48.0868158120681, 48.0868502, 48.0868446,
48.0868062, 48.0868282, 48.086883, 48.0868868503256, 48.0868917536871,
48.0870562870426, 48.087198887069, 48.0872810870871, 48.0873578870983,
48.0874949537778, 48.0876923538089, 48.0881421539432, 48.0881861539884,
48.0882355540248, 48.0883616873979, 48.0885592874788, 48.0886469541592,
48.0887457541718, 48.0888334875212, 48.0888827542125, 48.0889409201885,
48.0890002, 48.0890693, 48.0891043, 48.0891125704015, 48.0891130875498,
48.0892226875605, 48.0893159542412, 48.0895626876186, 48.0896978625575,
48.0899597, 48.0899631270494, 48.089968487658, 48.0900451543342,
48.0901439543501, 48.090221031357, 48.0904312, 48.0905737,
48.0906339, 48.0906394, 48.0905789, 48.0904692, 48.090332,
48.089986, 48.0898978, 48.0897902, 48.0895148, 48.0893762,
48.0892689, 48.0892406, 48.0892443492404, 48.0892218872354,
48.0892272872133, 48.0894026871884, 48.0893915538413, 48.0893257538121,
48.0890777673468, 48.0889879, 48.0889595199959, 48.0887880869728,
48.0887101388236, 48.0885088, 48.0885707, 48.0884554, 48.0882139,
48.0880109, 48.0876435, 48.0875228, 48.0874241, 48.0869137,
48.0866009, 48.0862222, 48.0859313, 48.0855252, 48.0852672,
48.0850642, 48.0849929, 48.0846091, 48.0844719, 48.0842306,
48.084022, 48.0838243, 48.0837036, 48.0835006, 48.0833143,
48.0831387, 48.0828646, 48.0826451, 48.0823816, 48.0818713,
48.0813227, 48.0810375, 48.080873, 48.0807796, 48.0806752,
48.0805819, 48.0804448, 48.0800334, 48.0799017, 48.0795945,
48.0795176, 48.0794241, 48.0792099, 48.0790177, 48.0786005,
48.078304, 48.0780954, 48.077892, 48.0776229, 48.0772991,
48.0768546, 48.0766624, 48.076388, 48.0761739, 48.0761519,
48.0761738, 48.076245, 48.0763382, 48.0762668, 48.0757897,
48.0751865, 48.0748026, 48.0743199, 48.0740071, 48.0736392,
48.0731288, 48.0727117, 48.0724922, 48.0723221, 48.0718889,
48.0717079, 48.0715707, 48.0709506, 48.0707586, 48.0705886,
48.0704133130603, 48.0698792819496, 48.0698791390454, 48.0698705,
48.0695854, 48.0689712, 48.068335, 48.0679236, 48.0670622,
48.0668647, 48.0666728, 48.0664927971348, 48.0661333480006,
48.0661320029868, 48.0661246, 48.0659218, 48.0656257, 48.0652965,
48.0650991, 48.0648686, 48.0646054, 48.0641885, 48.0638759,
48.0635318, 48.0633949, 48.063066, 48.0626002, 48.0623865,
48.0622496, 48.062091, 48.0620199, 48.0619324, 48.0618448,
48.0617078, 48.0614338, 48.0612639, 48.0611653, 48.0610449,
48.0610341, 48.0610451, 48.0610781, 48.0612318, 48.0614952,
48.0615117, 48.0615118, 48.0614736, 48.061249, 48.0611066,
48.06103, 48.060959, 48.0609152, 48.0608386, 48.0605755,
48.0605756, 48.0607076, 48.0608779, 48.0610372, 48.0611853,
48.0613005, 48.0613023862956, 48.0613092797384, 48.061407946417,
48.0615834797764, 48.0616818695641, 48.0617503, 48.0617667,
48.0617559, 48.0617121, 48.0615697, 48.0613012, 48.0611094,
48.0609671, 48.0608083, 48.060655, 48.0602939, 48.0602339,
48.0602395, 48.0602779, 48.0604425, 48.0604461454189, 48.0604512791321,
48.0605773458146, 48.0606596791621, 48.0607966791889, 48.0609556792271,
48.0611144792776, 48.0612515459732, 48.0613172793173, 48.0613778440328,
48.0614676, 48.0614841, 48.0614239, 48.0612377, 48.0612323,
48.0612708, 48.0612984, 48.0613205, 48.0613752, 48.0615069,
48.0615127512811, 48.061515679165, 48.0616418791785, 48.0617734791961,
48.0618446792099, 48.0620200792498, 48.0621021459457, 48.0621898793029,
48.0625791460358, 48.0628477460891, 48.0630120794631, 48.063099879488,
48.0632477461897, 48.0635108795762, 48.0635985462622, 48.0638122796592,
48.0639218796845, 48.0640863463784, 48.0641464595427, 48.0642201,
48.064286, 48.0642916, 48.0642862, 48.0643302, 48.064352,
48.0643631, 48.0643358, 48.0641823, 48.0641495, 48.064144,
48.0642099, 48.0642144646961, 48.0642186796004, 48.0642953462777,
48.0644324796372, 48.064640679685, 48.0647284797027, 48.0649408068646,
48.0649829, 48.064972, 48.0648624, 48.0647912, 48.0647584,
48.0647859, 48.0647933407923, 48.0647946796343, 48.0648932796468,
48.0649371463207, 48.0650029463354, 48.0650742796796, 48.0651125463538,
48.0651509463653, 48.0651399463783, 48.0651453463864, 48.0652056797342,
48.0653975464357, 48.0654413464463, 48.0655070798027, 48.0655564798123,
48.0657373465102, 48.0659237465538, 48.0659949465654, 48.0661430799192,
48.0661648799255, 48.0661976799513, 48.0662579466375, 48.0663839466711,
48.0664168800185, 48.0667290801192, 48.0669646801781, 48.067063346864,
48.0671675468789, 48.067269575547, 48.0673124, 48.0673508,
48.067477, 48.0674803774568, 48.0674857468906, 48.0676283469098,
48.067732480262, 48.0679736803166, 48.0680667470062, 48.068116147023,
48.0682310804008, 48.068318747093, 48.0684885471321, 48.0686366804943,
48.0687243471765, 48.0689820805472, 48.0690917472335, 48.0691903472572,
48.0693601473025, 48.0695737473907, 48.0697270807692, 48.070072147544,
48.0704447476469, 48.0706528810476, 48.0708555477703, 48.0710308811396,
48.0713269478556, 48.0719355479493, 48.0722260813368, 48.0724179480462,
48.0726041480932, 48.0728013481573, 48.0730259482269, 48.0731299482537,
48.0732780816164, 48.073469948313, 48.073617948339, 48.0737878817087,
48.0739631484214, 48.0741821484931, 48.0744340819143, 48.0745379486239,
48.0746418820174, 48.0747674821063, 48.0748768821644, 48.0750137488802,
48.0752327489396, 48.07545208232, 48.0757041490316, 48.0758904824097,
48.076005482444, 48.0761423491576, 48.0761969491869, 48.0762351492224,
48.0762899492411, 48.0763063492513, 48.0762677492716, 48.0763005492856,
48.0764485493223, 48.0768693494366, 48.0769957494871, 48.0774186829705,
48.0777207497381, 48.0778964831175, 48.0780445498214, 48.078132283169,
48.0783187498598, 48.0783735498708, 48.0784504832248, 48.078653749967,
48.0787799500063, 48.0792136834704, 48.0796528835982, 48.0804979504811,
48.0811070839623, 48.0812058839928, 48.0812389506807, 48.0812279506965,
48.0812390840453, 48.0814258841164, 48.0814203507968, 48.0813877508203,
48.0814591508436, 48.0815524842021, 48.0817772842376, 48.0820734842947,
48.0822764843379, 48.0824849510607, 48.0827100844699, 48.0828364845248,
48.0828803512053, 48.0830724845864, 48.0832039512741, 48.0833795513062,
48.0835770846863, 48.0841532848436, 48.0846690849646, 48.0848885516885,
48.0853713518105, 48.0857444852362, 48.0864195521045, 48.0867158855285,
48.0868312855819, 48.0868532856017, 48.0867656856147, 48.0868377902097,
48.0870797631125, 48.0871990857014, 48.0874239524176, 48.0875884857949,
48.0877860858602, 48.0881537526431, 48.0886585527726, 48.0889822861875,
48.0893388862799, 48.0897121530758, 48.0898821531316, 48.0899864864872,
48.0901619531865, 48.0905129532367, 48.0907432866086, 48.0907606039185,
48.0909737, 48.091134, 48.0912155, 48.0912926, 48.0913239,
48.0913356014905, 48.0913904867416, 48.0914618867755, 48.0914789534491,
48.0915441534759, 48.0916951946542, 48.0918256, 48.0919169,
48.0920835, 48.0922802, 48.0924022382129, 48.0925971536415,
48.0926299536466, 48.092745153672, 48.0928583769647, 48.092892,
48.0929627, 48.093038, 48.0930841, 48.0931119, 48.0931643,
48.0931934, 48.0933112, 48.0933779, 48.0933972, 48.0934899,
48.0935006, 48.0935387, 48.0935607, 48.0935638722605, 48.0935715156734,
48.0936045, 48.0936234, 48.0936153, 48.0936381, 48.0936372,
48.0936383508933, 48.093659321375, 48.0936601, 48.0936600239075,
48.0936672873317, 48.0936655044912, 48.0936668, 48.0936663,
48.0936722, 48.0936622213003, 48.0936620188339, 48.093682,
48.0936896, 48.093687, 48.0936973, 48.0937322, 48.0937591,
48.0937617, 48.0937953, 48.0938294, 48.0938818, 48.0939767,
48.094, 48.0940488, 48.0941308, 48.0941845, 48.0941787, 48.0942092,
48.094232, 48.0942871, 48.0943332, 48.0943789, 48.0944376,
48.0944976, 48.0946122, 48.0946741, 48.0946857, 48.0947815,
48.0948187, 48.0948769, 48.0948859, 48.094911, 48.0949222,
48.0949047, 48.0949146, 48.0949172, 48.0949298, 48.0949571,
48.0949481, 48.0949719, 48.0950171, 48.0950177364113, 48.0950597933896,
48.0950735, 48.0950848629195, 48.0951822880371, 48.0951867626019,
48.0952119, 48.095224, 48.0952307, 48.0952164, 48.0952057,
48.0951882, 48.0951824, 48.0951698, 48.095166089081, 48.0951599294801,
48.0951649, 48.0951895, 48.0952115, 48.0952151957101, 48.0952702881119,
48.0954072881274, 48.0954839548086, 48.0956321548475, 48.0956373519178,
48.0957005, 48.0957417, 48.0957256, 48.0957453, 48.0957561214315,
48.0958077549165, 48.0958899549284, 48.0959502882723, 48.0959559249444,
48.0960212, 48.0960812, 48.0961162, 48.0961305440922, 48.0962958883692,
48.0963037426169, 48.096315, 48.0963553, 48.0963554290339,
48.0964274878592, 48.0964386, 48.0964445732292, 48.0964604884132,
48.0964722733349, 48.0965004, 48.0964974028079, 48.0965285826891,
48.0965291, 48.096598, 48.0966312, 48.0966177, 48.096633003684,
48.0967292884917, 48.0969266885368, 48.0970878858135, 48.0971005,
48.0971387620346, 48.0973105552867, 48.0975024886528, 48.0977547553571,
48.097842488707, 48.0979713027714, 48.0980428, 48.0982282,
48.098436, 48.0985325873607, 48.0986543556194, 48.0987147556607,
48.0987257556935, 48.0987480858134, 48.0988569, 48.0989187,
48.0989071, 48.0990701, 48.0992416524277, 48.0993126892325,
48.0993582695721, 48.0994866, 48.0995788, 48.0995720215104,
48.0996088893237, 48.1000037560857, 48.1002834894662, 48.1005192895071,
48.1006728895384, 48.1008021098275, 48.1008354, 48.1010406741752,
48.1011334896501, 48.1014186897236, 48.1014357681211, 48.1015196,
48.1015617, 48.1016546301395, 48.1017093564919, 48.1018519565334,
48.1019798251059, 48.1020677, 48.1021546, 48.1021788, 48.1021732911527,
48.1022304900335, 48.1022625471168, 48.1022746, 48.1023301,
48.1023561, 48.1023626207545, 48.1024114901015, 48.1026746901491,
48.1027568901666, 48.1028775568617, 48.1031187569247, 48.1031616468129,
48.1032271, 48.1032884, 48.1033368, 48.1033392940841, 48.1034807570624,
48.103496884366, 48.1035208, 48.1035866, 48.1036068, 48.1037025949325,
48.1038395997426, 48.1038628139072, 48.1040730905753, 48.1041553572668,
48.1042156906291, 48.1042814906745, 48.104331701733, 48.104385,
48.1044038995265, 48.104473490758, 48.1047366908168, 48.1049339575258,
48.1052410909295, 48.1054548909881, 48.105816938442, 48.1059419,
48.106010705579, 48.1060526911797, 48.1063267579389, 48.1064441624501,
48.1064578, 48.1065254, 48.1065746, 48.106630119467, 48.1070176914532,
48.1072698915283, 48.1076536916596, 48.107933291749, 48.1079472046429,
48.1079676, 48.1079603649434, 48.1079606917684, 48.1079661584504,
48.1080100917993, 48.1081800918407, 48.1082508303333, 48.1083285,
48.1083947, 48.1084086, 48.1084009381197, 48.1084376919103,
48.1087118919689, 48.1089859587014, 48.1091558430357, 48.1091796,
48.109241, 48.1092468, 48.1092392742331, 48.1095284477872,
48.1097286, 48.1098781, 48.1100129, 48.1100209, 48.1100355927009,
48.1102798923963, 48.1106024165252, 48.1106236, 48.1106419,
48.1106656, 48.1107637, 48.1108147, 48.1108917, 48.110975,
48.1110444, 48.1110477689739, 48.1111185593079, 48.112324692956,
48.1124900354031, 48.1125156, 48.1126347, 48.1127314, 48.1127878,
48.1128707550157, 48.1129167597944, 48.1129265320112, 48.1129785,
48.1130385, 48.1130949, 48.1131522, 48.1131478, 48.1132149,
48.1133027, 48.1134039, 48.1135167, 48.1135829, 48.1136179,
48.1136179, 48.1136238124519, 48.113659797788, 48.1136868,
48.1137069425144, 48.1137663600482, 48.1139861347259, 48.1141184,
48.1142957, 48.1143897, 48.1144559, 48.1145992, 48.1147254,
48.1148159, 48.1148190555597, 48.1148684935903, 48.1152138936565,
48.1154112936832, 48.1155088325678, 48.1155115754587, 48.1157744578022,
48.1157974, 48.1158079, 48.1158241, 48.1158688, 48.1159528611326,
48.1159804952588, 48.1159894, 48.1159902908284, 48.1159981603556,
48.1161900937115, 48.1162212285539, 48.1163156, 48.1164043,
48.1164186762704, 48.1164368937551, 48.1166176938109, 48.1166476124085,
48.1167311, 48.1168224, 48.116937, 48.117091, 48.1171805,
48.1171959882629, 48.1174619607043, 48.1181580942165, 48.1188925610858,
48.118980294453, 48.1190734944849, 48.1195832946074, 48.1198681613553,
48.1201313614174, 48.1208055615843, 48.1208877616074, 48.1209041616236,
48.1209369616354, 48.1209763658281, 48.1209837, 48.1210281959191,
48.1211454949853, 48.1212002949923, 48.121293495008, 48.1214305617026,
48.1215566950695, 48.1215730950808, 48.121567561765, 48.1216057617865,
48.1217209618181, 48.1220332952505, 48.1222196952991, 48.1224114953586,
48.1232555622397, 48.123480295618, 48.1236665623412, 48.123820095708,
48.1240174957432, 48.1243354957927, 48.1244615624835, 48.1245547625059,
48.12464789587, 48.1246915625885, 48.1247792959602, 48.1248833626547,
48.1251779627386, 48.1252545627682, 48.1252819627954, 48.1252924961962,
48.1253143628859, 48.1254349629283, 48.125593762976, 48.126037696412,
48.1260705630882, 48.1261198964423, 48.1261746964566, 48.1263171631458,
48.1264761631801, 48.1267009632228, 48.1267776965735, 48.1268215632524,
48.1268378966053, 48.126887163286, 48.1272654966873, 48.1276326967655,
48.1278958968012, 48.1280329634913, 48.128233200958, 48.1282439,
48.1282460999323, 48.1283289635535, 48.1284166969191, 48.1284768969341,
48.1287509636532, 48.1287673636588, 48.1287892970063, 48.1288275636833,
48.1288879636933, 48.1289262970281, 48.1289702970325, 48.1290195637077,
48.1292221637709, 48.1292496971096, 48.1292614600488, 48.1292513,
48.1292843709643, 48.1292881637683, 48.1293429637731, 48.1294855637983,
48.1295567638132, 48.1295841638242, 48.1295675638415, 48.1295897865569,
48.1295901, 48.1296304, 48.1296591, 48.1296550071459, 48.1296551638865,
48.1296546181033, 48.1296519, 48.1296492, 48.1296398616062,
48.1296349736103, 48.1296474, 48.1296249416513, 48.129622097236,
48.1296347438859, 48.1296429, 48.1296671, 48.1296688123295,
48.1296988117757, 48.1297092, 48.1297484955584, 48.129753563942,
48.1297315639558, 48.1297643639653, 48.129967297334, 48.1300329640198,
48.1300274973686, 48.1300602973815, 48.1301534973994, 48.1302246974254,
48.1302625095162, 48.1302695, 48.130351, 48.1304636001188,
48.1305095641739, 48.130547964187, 48.1305511433555, 48.1306123,
48.1306401, 48.1306249, 48.1306411754398, 48.1307340975779,
48.1307694045488, 48.1307967, 48.1308088914017, 48.1309149642953,
48.1309286237883, 48.1309373, 48.130999, 48.1310256909333,
48.1310518976721, 48.1310942300744, 48.1311485, 48.1311789,
48.1311842809371, 48.1315012977779, 48.1316547644797, 48.1318354978732,
48.131928497914, 48.1319205471837, 48.1319219, 48.1318959,
48.1318905, 48.1318458, 48.1317939, 48.1317536, 48.1317151,
48.1317088, 48.1317106, 48.1316963239936, 48.1317142979279,
48.1318622979685, 48.1320485646744, 48.1321581647012, 48.1324978981239,
48.1325526981421, 48.132596364835, 48.1328264982241, 48.1328883371884,
48.1329387, 48.132939986658, 48.1330785649564, 48.1331661649925,
48.1333359650322, 48.1333445579464, 48.1333907, 48.1334122375591,
48.1334674984055, 48.1335714984343, 48.1336976984574, 48.1338729651678,
48.1340976985496, 48.1342785652519, 48.1344210986116, 48.1345855652982,
48.1346842986474, 48.13479936534, 48.1348218914398, 48.1348666,
48.1350715, 48.1351709, 48.1353177, 48.1354895, 48.1355057507165,
48.1357415655899, 48.1363167657543, 48.1365907658229, 48.1367878992086,
48.1368644992404, 48.1370561659654, 48.1372260993384, 48.1372509149365,
48.1374433, 48.1378069728632, 48.1379701364899, 48.1380662,
48.1382783, 48.1384197, 48.1384424156417, 48.138601499647,
48.1387932996953, 48.1388571101628, 48.1388663, 48.1392162,
48.1394024, 48.1394310371195, 48.1395276998376, 48.1396361352962,
48.1396547, 48.1396576277513, 48.1397249665466, 48.1397961665688,
48.1398065398037, 48.1398346, 48.1398874, 48.1399269147156,
48.139997299991, 48.1401181666989, 48.1402829667596, 48.1404477001448,
48.1406509002002, 48.1407715669014, 48.1409309002931, 48.1411065670108,
48.1412437670437, 48.1413699670778, 48.1415895671339, 48.1417159005087,
48.1417237368292, 48.1417372, 48.1417542, 48.1417504835924,
48.1417599005293, 48.1418252642426, 48.1418545, 48.1419985,
48.1420004266985, 48.1420725672738, 48.1421134654471, 48.1421381,
48.142147777271, 48.1422265006652, 48.142267341997, 48.1422992,
48.1423121474584, 48.1423363006954, 48.142381940308, 48.1423968,
48.1423984751866, 48.1425283007326, 48.142692700758, 48.1428189007867,
48.1429561674941, 48.1431155008818, 48.143181500911, 48.1433023009589,
48.1433955676536, 48.1435765676948, 48.1436865010679, 48.1437579677718,
48.1438569011439, 48.1439775678451, 48.1441971012339, 48.1443069679364,
48.1443700228895, 48.1444192, 48.1444256326131, 48.1444387013242,
48.1444730890736, 48.1445677, 48.1447064, 48.1447816, 48.1448532,
48.1449033, 48.1449327, 48.1449194, 48.144906, 48.1449418,
48.1450143, 48.1450832, 48.1451494, 48.1451941, 48.1452693,
48.1453131, 48.145357, 48.1453749, 48.1453813, 48.1453829,
48.1454304, 48.1454527, 48.1454784, 48.145476, 48.145502,
48.1455235, 48.1455832, 48.1456408, 48.145714, 48.1457783,
48.1457847, 48.1457883, 48.1457922801428, 48.1460907017624,
48.1462169017993, 48.1463213018445, 48.1463379018747, 48.1462777018781,
48.1461297018716, 48.1460103729073, 48.1460093, 48.1458733,
48.1458244721321, 48.1457187685413, 48.1456585685402, 48.1455379018597,
48.1454391685093, 48.1454003868823, 48.1453437, 48.1452881,
48.1452582, 48.145272, 48.1452935, 48.1452505, 48.1452167,
48.1449534, 48.1447834, 48.1446402, 48.1444173194282, 48.1443650151785,
48.1443635224543, 48.1443143682306, 48.1443234108486, 48.1443359,
48.1444371, 48.1444322206911, 48.1444351682869, 48.1444298353835,
48.1444192, 48.1443152, 48.1442927525719, 48.1442927682846,
48.1443257016297, 48.1444353683154, 48.1445505683425, 48.1446082861222,
48.1450321, 48.1450272742566, 48.1451159685211, 48.1453025018891,
48.1455273019169, 48.1455821019305, 48.1455657686056, 48.1454194967365,
48.145400911376, 48.1454104792073, 48.1454202710932, 48.1454924994098,
48.1455467, 48.1455938172908, 48.1455989019786, 48.1456017054256,
48.1456362, 48.1456636, 48.1456696697607, 48.1457691020384,
48.146109168784, 48.1462299688185, 48.1463233021865, 48.1464495022235,
48.1466909022808, 48.1467513022992, 48.1467953023209, 48.1468665690142,
48.1470531690629, 48.1471629024097, 48.1472725024215, 48.1474151024479,
48.1475961691624, 48.1477115025374, 48.1478705692556, 48.1482711693573,
48.1486167694368, 48.1487759028011, 48.1488527028251, 48.1488583028365,
48.1488967028647, 48.1490229028978, 48.1492205029435, 48.1493411696436,
48.1494179696676, 48.1494235696834, 48.1495771697253, 48.1497199030996,
48.1499657938456, 48.1500292, 48.1500181, 48.1501222, 48.1501285972993,
48.1501309698023, 48.1503119031573, 48.1505971032018, 48.1511179699448,
48.1512661033054, 48.1515405033729, 48.1517435034282, 48.1518587701321,
48.1518423701443, 48.1517547034734, 48.1517657034833, 48.1519357701957,
48.1520015702233, 48.1520347035896, 48.1521443702915, 48.1522103036401,
48.1523857703299, 48.1525941037049, 48.152681970396, 48.1526819704004,
48.1526107037323, 48.1526327037477, 48.1527315037786, 48.1529509038267,
48.1531209705359, 48.1531977705633, 48.1532033705914, 48.1532637706181,
48.1534063706451, 48.1534557706637, 48.1534557706771, 48.1534723706889,
48.1536423707274, 48.1536753707448, 48.1536479707544, 48.1536425707766,
48.1536207041124, 48.1535931707787, 48.1536317041263, 48.153779770824,
48.1538511041761, 48.1539499042071, 48.1539773708932, 48.1540159042681,
48.1541091042966, 48.1542463043257, 48.1545369043747, 48.1546959710728,
48.1547837710939, 48.1548495711198, 48.1548331711381, 48.154909971166,
48.1550911045512, 48.1553049712692, 48.1554147713, 48.1554861046616,
48.1555573713521, 48.1559083714157, 48.156270304795, 48.1565501048477,
48.1566707715545, 48.1567859049182, 48.1569175716148, 48.157060171644,
48.1571151049933, 48.1571973716926, 48.1573729050775, 48.1574661050982,
48.15757590512, 48.1576332792537, 48.1576493, 48.157657948504,
48.1576581051191, 48.1578061051334, 48.1579869718267, 48.1581461051904,
48.1582393052066, 48.1582777052181, 48.1582941718988, 48.1583709719177,
48.1584259052626, 48.1585629719538, 48.1586343053065, 48.1586727053229,
48.158722105337, 48.158809772018, 48.1590291720813, 48.1590677054272,
48.1590511720982, 48.1590430427396, 48.1590424, 48.1589132294737,
48.1588867054201, 48.1589909054456, 48.1590403054597, 48.1589855054633,
48.1589855721411, 48.1591007721626, 48.159176461673, 48.1592181,
48.1592268169083, 48.159226905505, 48.1592817055097, 48.159440705539,
48.1595503722454, 48.1597095056146, 48.1598631056476, 48.1599069723371,
48.159841305701, 48.1598687723848, 48.1600333057549, 48.1601155057852,
48.1602307724745, 48.1604445725035, 48.1604939058447, 48.1605269058577,
48.160488505868, 48.1606311725672, 48.1606421059132, 48.1605873059174,
48.1605873059302, 48.1606203059549, 48.1608781060218, 48.1610809727343,
48.1611797060875, 48.1612496091506, 48.1613408, 48.1613467350835,
48.1613495727608, 48.1614367936702, 48.161478, 48.1615163,
48.1615492, 48.1615498696478, 48.1615579727706, 48.1616237727887,
48.1617499728357, 48.161771906181, 48.1617117061827, 48.161782972876,
48.1619201062534, 48.1620079062839, 48.1620297729665, 48.1620079063012,
48.161936706297, 48.1619311729701, 48.1619805729876, 48.1620957730236,
48.1625071064651, 48.1626991065263, 48.1628141732116, 48.162825173221,
48.1628471065596, 48.162923906569, 48.1629787732522, 48.1630391066011,
48.1630679719265, 48.1630577, 48.1629919, 48.1630083, 48.1630139371539,
48.1630171065685, 48.1630719732467, 48.1631157732611, 48.1631871066216,
48.1632749066443, 48.1633255321085, 48.1633703, 48.1634415,
48.1634361, 48.1632112, 48.1631508, 48.1631727, 48.163255,
48.1633701, 48.1633739216152, 48.1633789065219, 48.1635379065427,
48.1637353065761, 48.163839506609, 48.1639107733106, 48.1639767066564,
48.1640809066708, 48.1641467066916, 48.1641938138383, 48.1642311,
48.1642474, 48.1642091, 48.1641487, 48.1640062, 48.1639457,
48.1640225, 48.1640444, 48.1640279, 48.1639346, 48.1635726,
48.1634519, 48.1633093, 48.1630076, 48.1626071, 48.1624535,
48.1623164, 48.1620641, 48.1618118, 48.1612084, 48.1608958,
48.160786, 48.1605555, 48.1601496, 48.1599138, 48.1597766,
48.1595078, 48.1594091, 48.1591952, 48.1589813, 48.1587454,
48.1582681, 48.1579718, 48.1577195, 48.1574506, 48.1574287,
48.1574375254725, 48.157437504705, 48.1574813047088, 48.1575799047235,
48.1576623047389, 48.1576794321221, 48.1575546, 48.1574395,
48.1572202, 48.1570502, 48.1568801, 48.1567594, 48.1566111,
48.1563477, 48.1559636, 48.1556016, 48.1554364, 48.1553328,
48.1551628, 48.1549926, 48.1547786, 48.1545974, 48.1543888,
48.1543668, 48.1544435, 48.1545366, 48.1545385786955, 48.1545453704646,
48.1546338471335, 48.1547066, 48.1547175, 48.1546517, 48.1544321,
48.1543882, 48.1543333, 48.1542126, 48.1541521, 48.154108,
48.154031, 48.1537127, 48.1534657, 48.1532408, 48.1530927,
48.152813, 48.152429, 48.1524209481042, 48.1522841697574,
48.1521527030748, 48.152108903075, 48.1520979030852, 48.1521473031087,
48.1521967697939, 48.1521749031321, 48.1520707031294, 48.1518969438618,
48.1518756, 48.1516836, 48.1515136, 48.1510363, 48.1507234,
48.1502282, 48.1499688, 48.1496873, 48.1490216, 48.1481903,
48.147974, 48.1476924, 48.1476278, 48.1476298, 48.1475346,
48.1474115, 48.1473032, 48.1471717, 48.1470384, 48.1469301,
48.1468111, 48.146735, 48.1466885, 48.146633, 48.1466008,
48.1466008, 48.1466321, 48.1466858, 48.1467494, 48.1468218,
48.1468684, 48.1469534, 48.1470017, 48.1470437, 48.1470455,
48.1470344, 48.1470198059496, 48.1470015278956, 48.1469685,
48.1469086, 48.1468397, 48.146863, 48.1469274, 48.1469634951192,
48.1469989682741, 48.1469882173427, 48.1469629, 48.1469204236519,
48.1468181015853, 48.1468134840662, 48.1468093, 48.1467073,
48.1466612, 48.146565, 48.1464702, 48.1463735, 48.1463449,
48.1463318, 48.1463371209873, 48.1463295681052, 48.1462972580214,
48.1462778, 48.1461972, 48.1460594, 48.1458697, 48.1457427,
48.1456049, 48.1455324, 48.145498625033, 48.1454793679581,
48.1453201012287, 48.145231414186, 48.1451959, 48.145085,
48.1449642, 48.1448434, 48.1446644, 48.144531, 48.1443279,
48.1441982, 48.1440093, 48.1439825, 48.1439378, 48.1438841,
48.1437328, 48.1436478, 48.1434527, 48.1433516, 48.143255,
48.1432433, 48.1431717, 48.1431028, 48.1429955, 48.1427583,
48.1425109, 48.1424379, 48.1423377, 48.1422241, 48.1421032,
48.1419851, 48.1418616, 48.141714, 48.1415753, 48.1414142,
48.1412826, 48.1411967, 48.1410786, 48.1409757, 48.1409067,
48.1407269, 48.1405864, 48.1404333, 48.1403268, 48.1402543,
48.1402221, 48.1401264, 48.139976, 48.1399205, 48.1398579,
48.1398227, 48.1397747, 48.1396753, 48.1395981, 48.1392932,
48.139141, 48.1390262534601, 48.138823299351, 48.138192947821,
48.1380751, 48.1379271, 48.1379099753807, 48.1376454990261,
48.1373660989646, 48.1372455655984, 48.1371469655613, 48.1371033655084,
48.1368843654295, 48.1368298987106, 48.1367696986917, 48.1366861448762,
48.1366731, 48.1366671255215, 48.1364625653164, 48.136325498628,
48.1361719652645, 48.1359583652054, 48.1352515650043, 48.1347969648583,
48.1346326981455, 48.1345396981008, 48.1345070980588, 48.134441298033,
48.1341800561902, 48.1341365, 48.1340951, 48.1340955779906,
48.1340412979302, 48.1339537645579, 48.1337729644843, 48.1337663231286,
48.13372, 48.1336619, 48.1336469941566, 48.1335648977392,
48.1335265643877, 48.133564073769, 48.1335625, 48.1335858,
48.1336015819586, 48.1335981643395, 48.1334723642786, 48.1333080975607,
48.1331548146899, 48.1331311, 48.1330783, 48.1330326, 48.132998450146,
48.1328969641219, 48.1327544974149, 48.1326450973713, 48.1326245478674,
48.1325341, 48.1324365, 48.1323882, 48.1323622, 48.1323593036425,
48.1322723639406, 48.1322450972489, 48.1322561638954, 48.1323713638957,
48.1324097638915, 48.1323989638721, 48.1323660971908, 48.1322181638125,
48.1317140969996, 48.1316482969821, 48.1315056969507, 48.131280963588,
48.1312475723138, 48.1312174, 48.1310984, 48.1310026, 48.1309892,
48.1309959909618, 48.13099609683, 48.1310728968316, 48.1311058968267,
48.1311026343569, 48.1310841, 48.1310268, 48.1309865, 48.1309292,
48.1308325, 48.1307923, 48.1307672, 48.130726, 48.1305989,
48.1303644, 48.1301746, 48.1299464, 48.1297387, 48.1296143,
48.1295534, 48.1295525366032, 48.129516762986, 48.1293304962701,
48.1292820354359, 48.1292679, 48.1291409, 48.1291176910539,
48.1289797628324, 48.1289553796768, 48.1288203, 48.1287478,
48.1286696, 48.1285491, 48.1284372, 48.1283253, 48.1282716,
48.1282253379411, 48.1278453625169, 48.1277959625012, 48.1278038178752,
48.1277229, 48.1276298, 48.1275358, 48.1275791, 48.1276121,
48.1276156305811, 48.127620895726, 48.1276756957347, 48.1279003624497,
48.1280977624865, 48.1282512958416, 48.1284651625395, 48.1286624959185,
48.1288489626188, 48.1289421626395, 48.1290626960046, 48.1291667627063,
48.1297202961899, 48.130087496296, 48.1303231630338, 48.1304546964272,
48.130481763154, 48.1305036964982, 48.1307612965629, 48.130898296603,
48.1309804966183, 48.1314959633539, 48.1316329633785, 48.1317481634034,
48.1318467634304, 48.1320330968219, 48.132334496897, 48.1329098970699,
48.1329755637618, 48.1329644971294, 48.1331123638473, 48.1332108972367,
48.1333423639449, 48.1335615640099, 48.1336656973766, 48.1337038974004,
48.1337477640809, 48.1338792974408, 48.133999897472, 48.1344272975903,
48.1347340976807, 48.134832764375, 48.1349204977249, 48.1349816862946,
48.1350872, 48.1350930815721, 48.1350959644047, 48.1351782977466,
48.1353701644448, 48.1355125644768, 48.1358304978971, 48.1361865646632,
48.1362303646794, 48.1362303646939, 48.1361752980515, 48.1361642980656,
48.1362300980841, 48.1363396981005, 48.1364214544059, 48.1365448,
48.1365454457805, 48.1365535647883, 48.1366193647957, 48.1367235648124,
48.1368605648408, 48.137096164894, 48.1373537649593, 48.1378743650982,
48.1379729651297, 48.1383455652231, 48.1384769652681, 48.1390083654304,
48.1392275654898, 48.1393590988519, 48.1394905655429, 48.1397263655895,
48.1398358989485, 48.1400769656893, 48.1401370990611, 48.1402849657739,
48.1404931658318, 48.1406903658791, 48.1408384992397, 48.1410082992765,
48.1411562993137, 48.1412767660166, 48.1414081660649, 48.1414190994177,
48.1413914994289, 48.1414680994596, 48.1416544995105, 48.1417474995474,
48.1418840996222, 48.1419717663216, 48.1420921663612, 48.1423113664194,
48.1423989664511, 48.1426234998568, 48.1428371665787, 48.1429796999378,
48.1430663664325, 48.1432671, 48.1432676646043, 48.143275899966,
48.1434358248517, 48.1434699, 48.1435249, 48.1436127, 48.1437169,
48.1437207769562, 48.1437256999974, 48.1438353666781, 48.1439121666898,
48.1440491667166, 48.1442025667629, 48.1442133667828, 48.144213300138,
48.1443007668413, 48.1443939002099, 48.1444539669117, 48.1446291003162,
48.1447605003623, 48.144918967115, 48.1449133004722, 48.1449405671549,
48.145022767187, 48.1451377005613, 48.1454609006468, 48.1456909673771,
48.1458167674213, 48.1459427674565, 48.1462157008631, 48.1463309675641,
48.1464187675863, 48.1465779676295, 48.1469897677522, 48.1473521011904,
48.1475771012477, 48.1477857679773, 48.1479943680379, 48.1480767680722,
48.1482469014525, 48.1483237681359, 48.148451742789, 48.1485343,
48.1489177, 48.1489246325065, 48.1489265014871, 48.1490361014994,
48.1490482084308, 48.149102, 48.1491353839639, 48.1491841681865,
48.1492166649145, 48.1492852, 48.1493956634536, 48.1494421015784,
48.1500679017598, 48.1501667017924, 48.1501723018094, 48.1501559018149,
48.1500681684773, 48.1500189684805, 48.1500463684905, 48.1501013018365,
48.1501067685095, 48.1499313685014, 48.1499369685106, 48.1500741018662,
48.1501509685541, 48.1502059019056, 48.1502281019467, 48.1501899019699,
48.1502009686633, 48.150332902055, 48.1506403021528, 48.1512551690088,
48.1514033690499, 48.1516559024578, 48.1520015692185, 48.152221169284,
48.1524243026695, 48.1525285693695, 48.1525725027257, 48.152671369425,
48.1527921027895, 48.1529457028314, 48.1532257029114, 48.1535439030045,
48.1538185030955, 48.1539665698066, 48.1542081032001, 48.1544385032598,
48.1545329735159, 48.1545999, 48.1545944694915, 48.1546087033219,
48.1547569700347, 48.1552561701589, 48.1557007036062, 48.1560079703488,
48.1563153037704, 48.1565239038388, 48.1566337038825, 48.1568037706005,
48.157039703995, 48.1572865707275, 48.1573931587783, 48.1574371,
48.1574534974807, 48.157533570803, 48.1578243708739, 48.1578758044067,
48.1580276, 48.1582136114299, 48.1582563220475, 48.1584089,
48.1584504236422, 48.1585707044253, 48.1588229711436, 48.1589601711871,
48.1590425712197, 48.159283904606, 48.1594923046559, 48.1598105714202,
48.1599971047972, 48.1600847714753, 48.1601083749009, 48.1601089,
48.1600924, 48.1599662, 48.1599991, 48.1600055835981, 48.1600079047456,
48.1601175047596, 48.1602107714408, 48.160342371469, 48.1604631048342,
48.1606057715484, 48.1606717049071, 48.1607759716004, 48.1608747049513,
48.1609169957601, 48.1609206, 48.160937, 48.1609041, 48.1607558,
48.160827, 48.1608304927915, 48.1608357715232, 48.1610057715484,
48.1612527049287, 48.1614283049786, 48.1617409717286, 48.1622017718482,
48.1623993052356, 48.1626627053038, 48.1630467054116, 48.1635405055306,
48.1644619724156, 48.1648679058474, 48.1652793059388, 48.1654821726475,
48.1656139060174, 48.1658005060756, 48.1659813727829, 48.1662501728378,
48.1663105728535, 48.1663271061986, 48.1664147728813, 48.1665135062271,
48.1666011729014, 48.1666835062618, 48.1668041729529, 48.1669788093469,
48.1671353, 48.1672121, 48.1672066, 48.1672778, 48.1672782241676,
48.1672865729809, 48.1674511063359, 48.1677033730497, 48.1679117730902,
48.1679501731089, 48.1679283064482, 48.1677529731253, 48.1677641064886,
48.1678793065347, 48.167994373239, 48.1683563733131, 48.1685429066889,
48.1686581067216, 48.1687733734332, 48.1688557068137, 48.1689873735214,
48.1694535736445, 48.1696291736949, 48.1700187071329, 48.170199707173,
48.1703641738702, 48.1704793072199, 48.1705835072315, 48.1707479739204,
48.1708905739529, 48.1709673739758, 48.1710333073216, 48.1711319073341,
48.171203174014, 48.1712361073602, 48.1711813740355, 48.1711705074165,
48.1712527741108, 48.1713843741351, 48.1715013512203, 48.171573,
48.1716113, 48.1716387, 48.17171, 48.171717297517, 48.1717187741136,
48.1717901074546, 48.1719379741411, 48.1720861075022, 48.1723603742257,
48.1725633076099, 48.1729253077096, 48.1738357746228, 48.1740057746753,
48.1741923747278, 48.1743623747893, 48.1745269748584, 48.1746477082207,
48.1748341082598, 48.1750589083048, 48.1751467083265, 48.1752179750164,
48.1752509083649, 48.1753167750552, 48.175585508468, 48.1758597085434,
48.1759639752451, 48.1759915086185, 48.1760627753051, 48.1762271753546,
48.1763369087165, 48.1764905754284, 48.1766989754862, 48.1769675755546,
48.1770663089217, 48.1772199089708, 48.1772684268683, 48.1773929524802,
48.1775325090492, 48.1778561091151, 48.1780479758194, 48.1782125091928,
48.1784923092823, 48.1787335093569, 48.1788871094127, 48.1791173761509,
48.179495776254, 48.180329309789, 48.1804993098332, 48.1806473765555,
48.1808393099343, 48.1810477099815, 48.1812011766777, 48.1813327767071,
48.1817933768327, 48.1822101769422, 48.1824953103395, 48.1827419770704,
48.1830053104703, 48.1831861771909, 48.1834767772819, 48.1838605774064,
48.1841841108314, 48.1846337109364, 48.1849845776772, 48.1853793777754,
48.1855603111565, 48.1857961112064, 48.1858837778953, 48.1860373112727,
48.1861249779755, 48.1862511780064, 48.1862731113505, 48.1862565780233,
48.1862841113638, 48.1864211780494, 48.1865199114008, 48.1865363114098,
48.1865855780939, 48.1866951781135, 48.1869145781421, 48.1870241781668,
48.187062711516, 48.1870517115212, 48.1868927115149, 48.186892578186,
48.1870131782099, 48.1871119782308, 48.187199711593, 48.1872819116094,
48.1874463782993, 48.1874847783085, 48.1875505783305, 48.187682111692,
48.1877259783732, 48.1876877117118, 48.1876931117181, 48.1877259783916,
48.1878027783999, 48.1878905117443, 48.1879343117542, 48.1880111117894,
48.1880823118127, 48.188252311839, 48.1883399785333, 48.188367511885,
48.1884607119135, 48.1886305786221, 48.1886635119723, 48.1888005120023,
48.1890199120376, 48.1892227120606, 48.189387312075, 48.189618493107,
48.1897295, 48.1898282, 48.1898294017729, 48.1898369787848,
48.189924712128, 48.1899739788076, 48.1900727788285, 48.190100112174,
48.1901549121866, 48.1902016005964, 48.1902504, 48.1902573371751,
48.1902591788531, 48.1903141121941, 48.1904291122228, 48.1906045789198,
48.1908129789502, 48.190900050908, 48.1910016, 48.1910236,
48.1909524, 48.1906289, 48.1904207, 48.1903823, 48.1903439,
48.1902178, 48.1902068, 48.1902672, 48.190322, 48.1903001,
48.1901137, 48.1900643, 48.1899986, 48.1899108, 48.1895929,
48.18956, 48.1894942, 48.1893846, 48.1891598, 48.188913,
48.1885511, 48.1883593, 48.1879864, 48.187811, 48.1875916,
48.1867526, 48.1865936, 48.1864346, 48.18644, 48.1865387,
48.1864785, 48.1860946, 48.1858587, 48.1858478, 48.1858567326258,
48.1858565770557, 48.1859553103993, 48.186015577076, 48.186050926045,
48.1860561, 48.1860178, 48.185941, 48.1858313, 48.1854748,
48.185404894361, 48.1853739102028, 48.1853705132432, 48.1853651,
48.1853378, 48.1853213, 48.1852883, 48.1852171, 48.1851239,
48.1849099, 48.1846412, 48.1844055, 48.1841751, 48.1840051,
48.1838132, 48.1838132, 48.1838625, 48.1837528, 48.1834347,
48.1831769, 48.1829958, 48.182782, 48.1825901, 48.1823597,
48.1822829, 48.1821732, 48.1820691, 48.1818771, 48.1818278,
48.1818552, 48.1818629803201, 48.1818639759262, 48.1819529017297,
48.1819977, 48.1820087, 48.1819923, 48.1819319, 48.1817674,
48.1816029, 48.1813945, 48.1813616, 48.181367, 48.1813756141126,
48.1813757758035, 48.1814581091453, 48.1816341823421, 48.1816632,
48.1816357, 48.1815699, 48.1814382, 48.1812463, 48.1811915,
48.1812079, 48.1811695, 48.1810433, 48.1803522, 48.1802097,
48.1800233, 48.1799739, 48.1799245, 48.1797819, 48.1796502,
48.1794583, 48.179206, 48.1790525, 48.1787015, 48.1784765,
48.1784709, 48.1785312, 48.1784709, 48.1783283, 48.1780376,
48.1779115, 48.1778456, 48.1777359, 48.177522, 48.1771326,
48.1768363, 48.1765565, 48.1765619, 48.1766825, 48.1766277,
48.1765344, 48.1763315, 48.1760901, 48.1760407, 48.1760241,
48.175931, 48.1757499, 48.175717, 48.1757114, 48.1755907,
48.1754755, 48.1753932, 48.1753328, 48.1751683, 48.1750038,
48.1748885, 48.1745483, 48.1741863, 48.1739229, 48.1736925,
48.1734071, 48.1732426, 48.173078, 48.1729352, 48.17282,
48.1726335, 48.1724908, 48.1722329, 48.1719967, 48.1718759,
48.171821, 48.1716783, 48.171393, 48.171179, 48.1709485,
48.1707893, 48.1707069, 48.17063, 48.1704488, 48.170328,
48.1700646, 48.1699273, 48.1697534, 48.1696339, 48.1695113,
48.1693013, 48.1691303, 48.1690294, 48.16883, 48.1685702,
48.168327, 48.1680873, 48.167877, 48.1677329, 48.1677214,
48.1676225, 48.1674415, 48.167063, 48.1667997, 48.1664924,
48.1663606, 48.1663825, 48.1664976, 48.1665139, 48.166492,
48.1663602, 48.1661024, 48.1657513, 48.1653344, 48.1649229,
48.1643962, 48.1637377, 48.1631067, 48.1628653, 48.162053,
48.1609554, 48.1605162, 48.1603461, 48.1600936, 48.1592814,
48.1581013, 48.1576677, 48.1572999, 48.1570654, 48.156238,
48.1550588, 48.1546603, 48.1541124, 48.1538385, 48.1533291,
48.1524363, 48.1517133, 48.1512314, 48.1509137, 48.1504317,
48.1501852, 48.1498017, 48.1496428, 48.14898, 48.148257,
48.1480215, 48.1477749, 48.1475447, 48.1475119, 48.147512,
48.1474572, 48.1473695, 48.1472489, 48.1471777, 48.147101,
48.1469312, 48.146734, 48.146345, 48.1461643, 48.145907,
48.1458413, 48.1455456, 48.1455292, 48.1455786, 48.1457706,
48.1457651, 48.1456445, 48.1454966, 48.1454309, 48.1454419,
48.1454858, 48.1454887146405, 48.1454945654192, 48.1455493654306,
48.1456314987977, 48.1458561655183, 48.146015165561, 48.1461433181011,
48.1462806, 48.1462865939054, 48.1462893655882, 48.1463935655998,
48.1465745656282, 48.1467389656615, 48.1468540990342, 48.1471827658,
48.1474676992146, 48.147818499305, 48.1482676994381, 48.1490018996592,
48.1493196997523, 48.1498401665674, 48.1499443665919, 48.1500101666009,
48.1500452012049, 48.1500453, 48.1499686, 48.1497824, 48.1496455,
48.149388, 48.149251, 48.1492237, 48.149306, 48.1493119875569,
48.1493147663092, 48.149413499655, 48.1495504996835, 48.1496326997049,
48.1500545664986, 48.1502573665479, 48.150695700001, 48.1507943666897,
48.1508271199823, 48.1508514, 48.1508515, 48.1507092, 48.1507146,
48.1507531, 48.1507557941314, 48.150761899951, 48.1509194806717,
48.1509669, 48.1510053, 48.1509616, 48.150863, 48.1505288,
48.1501783, 48.1501673, 48.1502551, 48.1502715, 48.1501675,
48.1494829, 48.149187, 48.1489678, 48.1488637, 48.1487322,
48.1485294, 48.1484088, 48.1482608, 48.1482061, 48.1481459,
48.1480198, 48.147987, 48.1480034, 48.1480100955595, 48.1480121655897,
48.1481656989499, 48.1482807656442, 48.1483410989937, 48.1485328990688,
48.1487246991188, 48.1490699658644, 48.1491959658992, 48.1493219659362,
48.149579499361, 48.1498918994506, 48.1500122994946, 48.1502917662401,
48.1507357663473, 48.151185166443, 48.1512783664686, 48.151568766558,
48.1519304999927, 48.1521495667237, 48.1526699668862, 48.1529057002812,
48.1531137670107, 48.1540617006237, 48.1547301008089, 48.1549491675432,
48.1552669676307, 48.1555737677095, 48.155672501071, 48.1557161677649,
48.155754567778, 48.1558971011356, 48.1560669011718, 48.1565437012981,
48.1571463681196, 48.1576777682579, 48.1579133683223, 48.1580941683764,
48.1582749017715, 48.1583569018192, 48.1589159686017, 48.1594309687187,
48.159661102114, 48.1597267688076, 48.1597595688301, 48.1598637021918,
48.1601979022703, 48.1603731689853, 48.1604225023422, 48.1604223690217,
48.1603619690206, 48.1603619690256, 48.1604879024049, 48.1605535691041,
48.1605535024447, 48.1604875024652, 48.1603995691349, 48.1602679024622,
48.1601801691224, 48.1601790164921, 48.1601714, 48.1599794,
48.1598479, 48.1597767, 48.1597164, 48.1596150580158, 48.1594837690117,
48.1594806663263, 48.159475, 48.1594133657502, 48.1594453690203,
48.1594727023759, 48.1596533690955, 48.1596587024486, 48.1598997691753,
48.1600749692347, 48.1601297692457, 48.1602669025991, 48.1604695026578,
48.1607653693928, 48.1610557028087, 48.1616127696205, 48.1621013030771,
48.1625677698596, 48.1630947033204, 48.1632867700376, 48.1634515034183,
48.1635557034366, 48.1636325034456, 48.1637037034559, 48.1637915034758,
48.1638957034953, 48.1639760277509, 48.1639966, 48.1638867,
48.1636561, 48.1632716, 48.1629036, 48.1626368, 48.1625547,
48.1625384, 48.1625769, 48.1626373, 48.1627799, 48.1627805371655,
48.1627887030202, 48.1629861030424, 48.1631395697347, 48.1633915697931,
48.1637479032042, 48.1641643033064, 48.1645687033964, 48.1647771701142,
48.16512310354, 48.1658255703846, 48.1663579038412, 48.1668627706328,
48.1671701040483, 48.167559704139, 48.1679987709148, 48.1683115709988,
48.1685475710577, 48.1689977045186, 48.1695191046587, 48.1697771047368,
48.1697827047515, 48.169799171426, 48.1697115714291, 48.1695307714253,
48.1695241307094, 48.169522, 48.169363, 48.1692424, 48.1691984,
48.1690558, 48.168134, 48.1670915, 48.1664989, 48.166296,
48.1661451999853, 48.1660197040427, 48.1660087707208, 48.1660967707558,
48.1662011041248, 48.1663603041686, 48.1665249708842, 48.1666403042609,
48.1666623042773, 48.1666789042992, 48.1668383043698, 48.1669261710805,
48.1669317710924, 48.1669153710929, 48.1669073908217, 48.1669066,
48.1668518, 48.1667147, 48.1666133268674, 48.1665755043978,
48.1667183044527, 48.1668335711549, 48.1671465045772, 48.1673221712995,
48.1674045046547, 48.1674045046659, 48.1673957000014, 48.1673957,
48.1672393979695, 48.1672071713205, 48.1672951046844, 48.1672951713661,
48.1673775047287, 48.1676189714606, 48.1680361715908, 48.1682887049953,
48.1687773051623, 48.1690791052358, 48.1691146882671, 48.169353,
48.1694638520529, 48.1695949720513, 48.1698035054414, 48.1699317386336,
48.1699517, 48.170147, 48.1701799, 48.170169633895, 48.1701933055796,
48.1702394363011, 48.1702431, 48.1703482, 48.1705833, 48.1706445,
48.1706478539667, 48.1706597056982, 48.1707803723966, 48.1709231057782,
48.1714499059286, 48.1716529726607, 48.1718231060415, 48.1719493060696,
48.1720313080399, 48.172105, 48.1721052079545, 48.1721137727567,
48.1721795727674, 48.1723057728061, 48.1723715728157, 48.1723956800093,
48.1723682, 48.1722255, 48.1721706, 48.172176, 48.1722253,
48.1721869, 48.1721155, 48.1720606, 48.172099, 48.1721043942807,
48.1721077726513, 48.1722723060158, 48.1724315060679, 48.1725961061174,
48.172766172821, 48.1729801061889, 48.1732269062364, 48.173495706297,
48.1736713063614, 48.1738579730902, 48.173885582816, 48.1740127,
48.1741164, 48.1741165, 48.1742285, 48.1744167, 48.1748303,
48.1749435001875, 48.1751967734566, 48.1755149735414, 48.175992306992,
48.1766451071347, 48.1770839739111, 48.1771881072678, 48.177213725617,
48.177256, 48.1772585941886, 48.1772647739377, 48.1773253072889,
48.1774185073062, 48.1774812385913, 48.1774865, 48.1774645,
48.1773382, 48.1771242, 48.1768991, 48.1766467, 48.1763999,
48.1761859, 48.1760542, 48.1760101, 48.1758949, 48.1756753,
48.1754338, 48.1752196, 48.1750219, 48.1749561, 48.1747694,
48.1746375, 48.1744179, 48.174149, 48.1739842, 48.173869,
48.173836, 48.173814, 48.1738633, 48.1739291, 48.1739337123909,
48.1739379059902, 48.1740859060095, 48.1742285060314, 48.1743107727122,
48.174382106061, 48.1745577061076, 48.1747717061701, 48.175089972926,
48.1753753730123, 48.1757101731183, 48.176231573278, 48.1765389066935,
48.1768241067485, 48.1769613067864, 48.1771807735248, 48.1773015068904,
48.1776087069641, 48.177872107029, 48.1780367070735, 48.1781629071211,
48.178327573844, 48.17847030722, 48.1787775072954, 48.1788379073154,
48.1788709073385, 48.17892577403, 48.1790519740647, 48.1792275074385,
48.1793865741433, 48.1796665075645, 48.179798174265, 48.1802865077417,
48.1805553078152, 48.1808021745545, 48.1810325746098, 48.1811203746409,
48.1811971746727, 48.1815867747774, 48.1818061748283, 48.1819817748805,
48.1822067082751, 48.1823931749949, 48.1825413750511, 48.182870575144,
48.1831065085396, 48.183199775237, 48.1833259752756, 48.1836935086966,
48.1838415754078, 48.1839239087737, 48.1840335754627, 48.1842255755082,
48.1843737088822, 48.1844341088961, 48.1844746000031, 48.1844746,
48.1844361, 48.184063, 48.183871, 48.1833334, 48.1832895,
48.1833059, 48.183314032772, 48.1833147085163, 48.1833859751906,
48.1836271752289, 48.1836626462307, 48.1836678, 48.1834922,
48.1833661, 48.1833112, 48.1832509, 48.1831708179761, 48.1830953084502,
48.1829855751079, 48.1829848198549, 48.1829768, 48.1828781,
48.1827904, 48.1826806, 48.1824995, 48.1821813, 48.1815778,
48.1814461, 48.1812978, 48.1812209, 48.1811495, 48.1810946,
48.1810123, 48.1808972, 48.180804, 48.1807492, 48.1807327,
48.1807435, 48.1807325, 48.1806062, 48.1804251, 48.1803647,
48.1803536, 48.1804412, 48.1804303, 48.1803588, 48.1802929,
48.1802105, 48.1801556, 48.1801117, 48.1800059634826, 48.17987377403,
48.1798694928287, 48.179865, 48.1797115, 48.1795524, 48.1794537,
48.1792562, 48.1789271, 48.1788062, 48.1787457, 48.178762,
48.1788771, 48.1788716, 48.1785697, 48.1784874, 48.1783885,
48.1783447, 48.1781692, 48.1779937, 48.177862, 48.1777521,
48.1776531, 48.17745, 48.1773127, 48.1771534, 48.1771039,
48.1769941, 48.1769556, 48.1770432, 48.1772844, 48.1772879001527,
48.1772931730309, 48.1775015730541, 48.1775893063995, 48.1776331730728,
48.1777483730988, 48.1778635731309, 48.1781599732277, 48.1782861732607,
48.1784453733073, 48.1787749067583, 48.1789669068194, 48.1791865068799,
48.1792799069225, 48.179444373633, 48.1796035736919, 48.1798835071131,
48.1799987071334, 48.1801303738334, 48.1801963071909, 48.1802839738803,
48.1803545766533, 48.1803739, 48.1803794, 48.1803519, 48.1802475,
48.1801321, 48.1798632, 48.1798521, 48.1797038, 48.1794513,
48.1792811, 48.1789517, 48.1788089, 48.1785454, 48.1783423,
48.1780898, 48.1780074, 48.1779469, 48.1779689, 48.1779762802294,
48.1779777062915, 48.1780599063018, 48.1782079729928, 48.1782409063345,
48.1783011730162, 48.1786799064538, 48.1788721065106, 48.1791793732711,
48.1795251733864, 48.1797611734486, 48.1799477068256, 48.1800847735179,
48.1802001068805, 48.1803483069239, 48.1804307069716, 48.1804965736613,
48.1806009070264, 48.18068317371, 48.1807678295741, 48.1808333,
48.1808223, 48.180663, 48.180471, 48.1803118, 48.1802514,
48.1802018, 48.1800316, 48.1800205, 48.1799655, 48.179713,
48.179455, 48.1792793, 48.1791858, 48.1791252, 48.1790538,
48.1789331, 48.1787521, 48.1786423, 48.1785708, 48.1784939,
48.1783566, 48.1781974, 48.1779177, 48.1776489, 48.1771496,
48.1763484, 48.175794, 48.175591, 48.17541, 48.1752236, 48.1750865,
48.1748563, 48.1745984, 48.1743021, 48.174088, 48.1739726,
48.1739668, 48.1739942, 48.1740006103476, 48.1740029717198,
48.1741586930098, 48.1741586, 48.1740871, 48.1739445, 48.173736,
48.1735878, 48.1733133, 48.1731104, 48.1728965, 48.1728196,
48.1728304, 48.1728249, 48.1727042, 48.172632259506, 48.1725157046874,
48.1725092025158, 48.1725069, 48.1723699, 48.1720409, 48.1716678,
48.1711412, 48.1702853, 48.1695391, 48.1688421, 48.1683233,
48.1682464973238, 48.1682003704792, 48.1681785038179, 48.1682331705033,
48.1683755705408, 48.1684413038967, 48.1685715039347, 48.1690435040518,
48.1694989041577, 48.1695867041849, 48.1696911708895, 48.1696967042347,
48.1696693042349, 48.1696625195484, 48.1696605, 48.1695728,
48.1693645, 48.1691669, 48.1684644, 48.1682834, 48.1679267,
48.1676195, 48.1672206, 48.1668864, 48.1664317, 48.1659387,
48.1656483, 48.164711, 48.1644315, 48.1640314, 48.163648,
48.1631438, 48.1624863, 48.1623987, 48.1617466, 48.1615877,
48.1615604, 48.1614838, 48.1615718, 48.1615828, 48.1615006,
48.1611335, 48.1610185, 48.1608978, 48.1605195, 48.160185,
48.1599712, 48.1597685, 48.1596424, 48.1595659, 48.159577,
48.1596759, 48.1597802, 48.1597821839922, 48.1597889685551,
48.1599315019115, 48.1600135586011, 48.1600434, 48.1600105,
48.1598023, 48.1596708, 48.1594462, 48.1590902, 48.1589038,
48.1586791, 48.1581746, 48.1580485, 48.157917, 48.1576869,
48.157506, 48.1570895, 48.1568648, 48.156569, 48.1562349,
48.1560104, 48.1558461, 48.1554408, 48.1549257, 48.1542625,
48.1539283, 48.1534023, 48.1533476, 48.1533038, 48.1533314,
48.1533973, 48.153529, 48.1535357157536, 48.1535377667416,
48.1538009667673, 48.1540423001329, 48.1541465001551, 48.1550011004096,
48.1557519006201, 48.1562013007336, 48.1562669007533, 48.1563051674521,
48.1568585676018, 48.157187367688, 48.1573189010574, 48.1574003702378,
48.1574691, 48.1574696762073, 48.1574779010749, 48.1575547010878,
48.1578177011565, 48.1579109011851, 48.1579985012078, 48.1580587678839,
48.1582044209183, 48.158231, 48.1582201, 48.1581105, 48.1581435,
48.1581381, 48.1579079, 48.15776, 48.15759, 48.1575023, 48.157431,
48.1571684, 48.1566807, 48.1564999, 48.1562973, 48.1560617,
48.1556891, 48.1556946, 48.1557032677635, 48.1557033670916,
48.1557637670977, 48.1558241004416, 48.1562021671985, 48.1562843672244,
48.1565035672894, 48.1568815674064, 48.1570679674473, 48.1571561141141,
48.1572237, 48.1573006, 48.1573335, 48.1572898, 48.1570816,
48.1567037, 48.1563749, 48.1559968, 48.1557556, 48.1556022,
48.155394, 48.1550871, 48.1548186, 48.1546598, 48.154523,
48.1543368, 48.1541724, 48.1539477, 48.1536901, 48.153575,
48.1533778, 48.1530982, 48.1527969, 48.1522104, 48.1518158,
48.1511855, 48.1507196, 48.1501222, 48.1495959, 48.1490643,
48.1487957, 48.1484339, 48.1481708, 48.1477378, 48.1468607,
48.146751, 48.146636, 48.1465045, 48.1462523, 48.1458302,
48.1456108, 48.1453478, 48.1451833, 48.1447941, 48.1445364,
48.1443171, 48.1442404, 48.1442295, 48.1442679, 48.1443721,
48.1443754822732, 48.1443808968423, 48.1444630968536, 48.144578163544,
48.1447097635812, 48.1449674969915, 48.1451592970387, 48.1453018970696,
48.1454060970856, 48.1454372269277, 48.1454686, 48.1454742,
48.1455345, 48.1455407106268, 48.1455432970537, 48.1456308970647,
48.1457735637639, 48.1459434971408, 48.1461408971787, 48.1461901638605,
48.146217563894, 48.1463271639376, 48.1464916973161, 48.1466451640157,
48.1468315640425, 48.1468754973847, 48.1470672974493, 48.1472153641504,
48.1474292975261, 48.1476320975547, 48.1477636975823, 48.1478349642717,
48.1478513642824, 48.147774564288, 48.1477525643012, 48.1478457643392,
48.1480321643929, 48.148065097742, 48.1479991644404, 48.1480430978016,
48.1481197645024, 48.1482895645537, 48.1484815646038, 48.1489748980461,
48.1490462980682, 48.1491009647732, 48.1492653648244, 48.1495174982457,
48.1498902983464, 48.1506411652325, 48.1509481653113, 48.1511564986885,
48.1514031654015, 48.1515127654318, 48.1517265654993, 48.1519348988833,
48.1520773655808, 48.1523186989586, 48.1524885656588, 48.1525872990175,
48.1527132990596, 48.1528393657609, 48.1529653657879, 48.153168299157,
48.1532450991732, 48.1533929658866, 48.1536778993287, 48.1539682994443,
48.1541764995223, 48.1542914995784, 48.154351766269, 48.154669699677,
48.1547463663655, 48.1548723664103, 48.1550368997843, 48.1552670998518,
48.1559465667057, 48.156236966785, 48.1567905669263, 48.1569823003164,
48.1570919670233, 48.1572179004221, 48.1572891004398, 48.1574755004723,
48.1576069671688, 48.1576783005159, 48.1577095519951, 48.1577244,
48.1577189, 48.1576038, 48.1575271, 48.1573847, 48.1572917,
48.1573412, 48.1572975, 48.1572865, 48.1572976, 48.1573854,
48.157389549833, 48.1573941669241, 48.1575037669387, 48.1577723669914,
48.1578379967795, 48.1578843, 48.1578898, 48.1577748, 48.1577364,
48.1577365, 48.1574679, 48.1572761, 48.1571501, 48.1569967,
48.1566951, 48.1565198, 48.1564156, 48.1562787, 48.1561746,
48.1560813, 48.1561088, 48.1561856, 48.1561966, 48.156235,
48.1562410728798, 48.1562437664587, 48.1563533664733, 48.1565343665027,
48.1566055665165, 48.156687899869, 48.1569564999414, 48.1574551000896,
48.1575811667978, 48.1575757001399, 48.1574989001427, 48.1574933001559,
48.1575481001763, 48.157613900191, 48.1577455002114, 48.1578605669096,
48.1579645669559, 48.1581891670216, 48.1583975004195, 48.15850156711,
48.1586881004686, 48.1588635004978, 48.159000500529, 48.1591703672387,
48.1593019672815, 48.1595265673506, 48.1596253007054, 48.1597004310593,
48.1597262, 48.1597153, 48.1596166, 48.1594851, 48.1594139,
48.1594304, 48.1594523, 48.1594580955992, 48.1594611005966,
48.1595489006098, 48.1596859006421, 48.159976367397, 48.1603929008421,
48.1604695675222, 48.160494555683, 48.1605157, 48.1605157,
48.1604226, 48.1601157, 48.1598088, 48.1596992, 48.1596169,
48.1596115, 48.159639, 48.1596007, 48.1594473, 48.1593596,
48.1593323, 48.1592118, 48.1590749, 48.1589104, 48.1588172,
48.1587898, 48.1588392, 48.1588442345272, 48.1588479669268,
48.1589137669353, 48.1590343669531, 48.1591495669769, 48.1592427669992,
48.1593523670306, 48.1595659670987, 48.1596701671271, 48.1600703672198,
48.1602785672827, 48.1604593006969, 48.1605799007259, 48.1607717007647,
48.1610785675084, 48.1610511675152, 48.1611005008626, 48.1612649675587,
48.1613087675692, 48.1613033009108, 48.1613417009273, 48.161604767656,
48.1619007010727, 48.1622513011894, 48.1623993012215, 48.1624705012392,
48.1625253012546, 48.1625714327716, 48.1625824, 48.1624783,
48.1624948, 48.1625332, 48.1625354531988, 48.1625419678839,
48.1626515678996, 48.1627667012577, 48.1629531013047, 48.1630297679859,
48.1632271680182, 48.1633861680508, 48.163506701412, 48.163558658887,
48.1636515, 48.1636560119676, 48.1636603014253, 48.1637425681011,
48.1638523014507, 48.1644277682349, 48.1646635016119, 48.1649705016907,
48.1650745683807, 48.1652555684091, 48.1654473684467, 48.165501431329,
48.1655428, 48.1655648, 48.1654827, 48.1654006, 48.1652088,
48.1652089, 48.1651486, 48.165006, 48.1648362, 48.164502,
48.1642443, 48.1639869, 48.1637512, 48.163532, 48.1633513,
48.1629567, 48.1622827, 48.162047, 48.1616469, 48.1610824,
48.1605179, 48.1602821, 48.1600848, 48.1598603, 48.1594876,
48.1590546, 48.1586216, 48.1584626, 48.1579309, 48.1572843,
48.1570759, 48.1569006, 48.15678, 48.1564236, 48.1561331,
48.1558535, 48.1551792, 48.1549052, 48.1545543, 48.1543899,
48.1541267, 48.1536168, 48.153244, 48.1529534, 48.1527232,
48.1523669, 48.1519228, 48.1517363, 48.1512867, 48.1508646,
48.1506507, 48.1504533, 48.1503766, 48.1503358963904, 48.1503249640952,
48.1503852974537, 48.1509609643268, 48.1510102976865, 48.1509992977046,
48.1509114977009, 48.150903544783, 48.1509027, 48.1507986,
48.1506290307677, 48.1505770976637, 48.1505550976746, 48.1505879643553,
48.1508292977538, 48.1511964978655, 48.1512787645715, 48.1512787645827,
48.1511964979148, 48.1511895570462, 48.1511877, 48.1510726,
48.150919, 48.1506546400417, 48.1506207644974, 48.1506316978441,
48.1507138978812, 48.1507138978884, 48.150637164554, 48.1506299900614,
48.1506284, 48.1505077, 48.1504474, 48.1503542, 48.1502006,
48.1501307679979, 48.1500174977979, 48.1498090977865, 48.1497541644573,
48.1497432977992, 48.149759764481, 48.1498583645103, 48.1500447645606,
48.1504832980356, 48.1504722980458, 48.1503955647142, 48.1503871594727,
48.1503868, 48.1500522, 48.1499097, 48.1498055, 48.1496903,
48.1495478, 48.149334, 48.1491367, 48.1490544, 48.1486706,
48.1486049, 48.1485775, 48.1485446, 48.1484956335649, 48.1484547642644,
48.1484217642666, 48.1484107642841, 48.1483340976141, 48.1483270248071,
48.1483253, 48.1482594, 48.148084, 48.1479938, 48.147914,
48.1478647, 48.1478702, 48.1476893, 48.1474371, 48.1471959,
48.1470643, 48.1465216, 48.1458362, 48.1456114, 48.145414,
48.145096, 48.1449316, 48.1448109, 48.1447514898483, 48.1446825633554,
48.1446496966942, 48.1445618966905, 48.1444850966855, 48.1444817075976,
48.1444763, 48.1443941, 48.1443283, 48.1441639, 48.1441035,
48.1439006, 48.1437088, 48.1435717, 48.1435882, 48.1436375,
48.1436923, 48.1437582, 48.1437611578376, 48.1437669631036,
48.143843696447, 48.143936896461, 48.1440958964947, 48.1441781631744,
48.1442713631861, 48.144355983365, 48.1443723, 48.1443284,
48.1442133, 48.1441091, 48.1439282, 48.1438898, 48.1438459,
48.1438514, 48.1439392, 48.1439424155225, 48.1439479630777,
48.1440355630887, 48.1441607899914, 48.1441804, 48.1441475,
48.1441585, 48.144167260001, 48.1441672964178, 48.1442220964226,
48.1443045398837, 48.144323, 48.144323, 48.1442791, 48.1441859,
48.1440708, 48.1439282, 48.1437527, 48.1435828, 48.1433744,
48.1432593, 48.1432264, 48.1433086, 48.1433196, 48.1432921,
48.1432154, 48.1431989, 48.1432976, 48.1433195, 48.1431166,
48.1430453, 48.1429685, 48.1427656, 48.1427273, 48.1426559,
48.1424529, 48.142239, 48.1421184, 48.142036, 48.1418385,
48.1416081, 48.1413175, 48.1412132, 48.1411253, 48.1411199,
48.1411308, 48.1411637, 48.1411718624046, 48.1411724948098,
48.1412218948144, 48.1412985614922, 48.1413753615107, 48.1414631615278,
48.1415563615407, 48.1416111615522, 48.1416605615775, 48.1417318949413,
48.1417866949584, 48.1418579616372, 48.1419676949857, 48.1421102949986,
48.1421431616698, 48.1421705616803, 48.1421540950192, 48.1419458950134,
48.1419347616886, 48.1419403617006, 48.1419622950487, 48.14203909508,
48.1421103617733, 48.1422091617975, 48.1423626951627, 48.1425271618605,
48.1427245619123, 48.1428671619634, 48.1430427620363, 48.1434432955715,
48.1436406956514, 48.1437886957205, 48.1440629624837, 48.1445017626691,
48.1449897628534, 48.1455600963807, 48.1458725631504, 48.1460480965589,
48.1461138965769, 48.1461588090014, 48.1461873, 48.1461873,
48.1461051, 48.1460557, 48.1460502, 48.1459406, 48.1456938,
48.1452826, 48.1451181, 48.1449975, 48.1449864, 48.1450687,
48.1450687, 48.1450522, 48.1450906, 48.1450982706913, 48.1450993627203,
48.1452035627308, 48.1453789627527, 48.1454941627753, 48.145636762814,
48.1459109629084, 48.1463332963974, 48.1464703631272, 48.146700696555,
48.146859563276, 48.1469747633031, 48.1471666966786, 48.1473257633885,
48.1475231634533, 48.1476053635072, 48.1476656968639, 48.1478575635873,
48.1479288969371, 48.1479945636146, 48.1480375044707, 48.1480681,
48.1480516, 48.1479858, 48.1478708, 48.1478104, 48.1477611,
48.1476021, 48.147476, 48.1473224, 48.147295, 48.1473224,
48.1474156, 48.1474243586238, 48.1474243633187, 48.147439966897,
48.1475527, 48.1475527304922, 48.1475614966638, 48.1476656966776,
48.147780896708, 48.1478301633988, 48.1480330967921, 48.1482852968599,
48.1484552968929, 48.1486305538549, 48.1487152, 48.1487755,
48.1487865, 48.1487536, 48.1486987, 48.1485781, 48.1485068,
48.1484904, 48.1485398, 48.1486658, 48.1487097, 48.1487206,
48.1484903, 48.1484685, 48.1484739, 48.1483532, 48.1483259,
48.1483368, 48.148112, 48.1480681, 48.1479639, 48.1477993,
48.147739, 48.1476293, 48.1475526, 48.1473222, 48.1473003,
48.1472125, 48.1469876, 48.1468834, 48.1467627, 48.1466255,
48.1464335, 48.14634, 48.1462194, 48.1461426, 48.1459671,
48.1457696, 48.1455994, 48.1453471, 48.1451715, 48.1450343,
48.1448697, 48.1448039, 48.1447052, 48.1443213, 48.1441347,
48.1435533, 48.1434381, 48.1432845, 48.143213, 48.1431307,
48.1426206, 48.1424999, 48.142319, 48.1422038, 48.1420282,
48.1418362, 48.1417429, 48.1416935, 48.1417154, 48.1417227762517,
48.1417241607344, 48.1417789607413, 48.1419105607635, 48.141989746077,
48.141995, 48.1419729, 48.1417151, 48.14132, 48.1408371,
48.1407382, 48.1407163, 48.140749, 48.1408421, 48.1408256,
48.1406609, 48.1406828, 48.1406907168387, 48.1406915601418,
48.1407573601486, 48.1408999601722, 48.1410480935445, 48.1411907602566,
48.1413169602824, 48.1414236778033, 48.1414781, 48.1415055,
48.1415054, 48.141423, 48.1411815, 48.1410113, 48.140918,
48.1408119255151, 48.1407678933575, 48.1406088933562, 48.140548693353,
48.1405461125833, 48.1405399, 48.140326, 48.1401998, 48.1401394,
48.1401175, 48.1401447, 48.1400511, 48.1398369, 48.1394306,
48.1391507, 48.1389532, 48.1387611, 48.1386843, 48.1384704,
48.1383991, 48.1383497, 48.1382398, 48.1381465, 48.1373455,
48.136753, 48.1366158, 48.1364348, 48.1363743, 48.1363742,
48.1364344, 48.1364452, 48.1364176, 48.1365106, 48.1365599,
48.1365707, 48.1364992, 48.136329, 48.1363179, 48.136345,
48.136394, 48.1363499, 48.1361523, 48.1360425, 48.1360313,
48.1360915, 48.1360859, 48.1356192, 48.135471, 48.1353502,
48.1352895, 48.13524, 48.1350425, 48.1348502, 48.1346634,
48.134625, 48.1345505861868, 48.1345186909387, 48.1345296909464,
48.1345790909661, 48.1345738910051, 48.1345520910206, 48.1345082910207,
48.1344534910171, 48.1344515076443, 48.1344447, 48.1343514,
48.1341979, 48.1340717, 48.133885, 48.1337971, 48.133797,
48.133775, 48.1337385445401, 48.1336467574818, 48.1336446100248,
48.133638, 48.1335503, 48.1334571, 48.133435, 48.1334733,
48.1334511, 48.1334071, 48.133248, 48.1331711, 48.1331545,
48.1331489, 48.1332037, 48.1332639, 48.1332670949215, 48.1332726906022,
48.1333714906175, 48.1334482906337, 48.1336183573558, 48.1336842907071,
48.1337764948373, 48.1338017, 48.1338181, 48.1335654, 48.1333513,
48.1332029, 48.133084, 48.132876, 48.1325253, 48.1324486,
48.1323774, 48.132344198709, 48.1323257569473, 48.1323367569567,
48.1325010903379, 48.132506490347, 48.1324459570171, 48.1324382437088,
48.1324372, 48.132355, 48.1322947, 48.1322344, 48.131977,
48.1318126, 48.1316811, 48.1315625193484, 48.131486890167,
48.1314373568364, 48.1314536902078, 48.1314096902084, 48.1314036379524,
48.1314009, 48.1313296, 48.131061, 48.130891, 48.1308143,
48.1303762, 48.1300639, 48.1297464, 48.1295767, 48.1295713,
48.1295824, 48.1295825, 48.1295443, 48.1295608, 48.1296047,
48.1296096065963, 48.1296134896613, 48.1296902896709, 48.1297669563548,
48.1298929563901, 48.1299477564027, 48.1300004562548, 48.1300596,
48.1300871, 48.1300872, 48.1300105, 48.130027, 48.1300352336394,
48.1300357563723, 48.1300983952617, 48.1301038, 48.1300329,
48.1298524, 48.1297539, 48.1296498, 48.1293923, 48.1290908,
48.1290306, 48.1289977, 48.1289484, 48.1287731, 48.1286636,
48.1286308, 48.1286417, 48.1286637, 48.1286583, 48.1285651,
48.1285048, 48.12845, 48.1283294, 48.1282636, 48.1283023,
48.1282861, 48.1282314, 48.1279905, 48.1278482, 48.1276839,
48.1275743, 48.1274319, 48.127295, 48.1271526, 48.1269498,
48.1264075, 48.1260075, 48.1256021, 48.1254651, 48.1252185,
48.1248787, 48.1246194, 48.1243455, 48.1240769, 48.1239126,
48.1237428, 48.1236169, 48.1234965, 48.1234418, 48.1233982,
48.1233107, 48.1232176, 48.1230642, 48.122982, 48.1229109,
48.1227355, 48.1222151, 48.1217439, 48.1215357, 48.121344,
48.1212235, 48.1211522, 48.1210206, 48.1208945, 48.1204616,
48.1203684, 48.120352, 48.1203739, 48.1206099, 48.1207142,
48.1207472, 48.1207419, 48.1206762, 48.1206762, 48.1208354,
48.1209177, 48.1211151, 48.1211186906885, 48.1211238863262,
48.1212994863449, 48.1214036863592, 48.1215680863881, 48.1216886864171,
48.1217543531057, 48.1218366864706, 48.1218968865024, 48.1219022865127,
48.121885753218, 48.1219623532756, 48.1220334866552, 48.1221430866938,
48.1222197533806, 48.1223129533968, 48.12236775341, 48.1223896867559,
48.1223951534328, 48.1224664867866, 48.1226089534819, 48.1226472868295,
48.1226307535298, 48.1227347535743, 48.1228333536003, 48.1229594869763,
48.1230908870286, 48.1231511537237, 48.1231675537495, 48.1232112871102,
48.1232934871394, 48.1234304871785, 48.1235729538923, 48.1237864873212,
48.1239014873651, 48.1239562873799, 48.1240221540602, 48.1240407299184,
48.1240463, 48.1240683, 48.1240744483288, 48.1240770873753,
48.1241264873834, 48.1241647540603, 48.1242688874293, 48.1243454874589,
48.1244112874786, 48.12447695417, 48.1246356875914, 48.1247179542795,
48.1248439543199, 48.124889754336, 48.124977354371, 48.1250156877321,
48.1250593544188, 48.1251251544357, 48.1252621544636, 48.1252951544738,
48.1253059544904, 48.1253388878378, 48.1253936878504, 48.1254758878617,
48.1255361545418, 48.1256238879023, 48.1257059546055, 48.125809888007,
48.1258920880357, 48.1262314881688, 48.126505354936, 48.1267188883431,
48.1269215550675, 48.1272392885052, 48.1278145553285, 48.1279240886977,
48.1283623554938, 48.128718355604, 48.128849888974, 48.1292881557437,
48.1293978891062, 48.1294470891281, 48.1294963558027, 48.1295456891519,
48.1296825558777, 48.129874089289, 48.1301150893699, 48.1305038894914,
48.1308050895878, 48.1310132896463, 48.1314077564134, 48.1315555564612,
48.1316321564841, 48.1318731565627, 48.1320537566409, 48.1322616900606,
48.1323929567869, 48.1325955568507, 48.1328420902505, 48.1330064902879,
48.1331269569834, 48.1332748903641, 48.1334882904552, 48.1335866904906,
48.1336633571813, 48.1338441572275, 48.1340029572735, 48.1342483573625,
48.1344570907605, 48.1348469575639, 48.1350940909671, 48.1352586910049,
48.1353684910459, 48.1355001577503, 48.1356921577862, 48.1360596911832,
48.1362571578961, 48.1365152913132, 48.136712958048, 48.1369488914408,
48.1370532914692, 48.1371740915239, 48.1372454915483, 48.137311358228,
48.1373770915727, 48.137489258111, 48.1375329, 48.1375492,
48.1374778, 48.1372911, 48.1371921, 48.1371811, 48.1371369,
48.1369502, 48.1367415, 48.1362966, 48.1359507, 48.1355995,
48.1353581, 48.135036, 48.1348829, 48.1344941, 48.1344011,
48.1343135, 48.1341496, 48.1339801, 48.1338268, 48.1335038,
48.1331588, 48.1329124, 48.1327262, 48.1326988, 48.1325839,
48.1324634, 48.1323211, 48.1322883, 48.132283, 48.1322009,
48.1321902, 48.1321082, 48.13207, 48.1319604, 48.1317579,
48.1315224, 48.1312595, 48.131139, 48.1310021, 48.1307665,
48.1307117, 48.1306021, 48.1303883, 48.130213, 48.1301363,
48.1300377, 48.1297968, 48.129501, 48.1294462, 48.1294298,
48.129419, 48.1295234, 48.1295344, 48.129529, 48.1294634,
48.1291513, 48.1290364, 48.128883, 48.1288502, 48.1288612,
48.1289051, 48.128912081687, 48.1289138883526, 48.1289631550244,
48.1292317550844, 48.1293249551034, 48.1293492661914, 48.1293602,
48.1294041, 48.1294110965886, 48.1294128884214, 48.1294456884249,
48.1295773551131, 48.1297252884775, 48.1298020884886, 48.1298825303855,
48.1299799, 48.1299909, 48.130128, 48.1301555, 48.1301282,
48.1300789, 48.1299036, 48.1296133, 48.1294599, 48.1293668,
48.1293449, 48.1293451, 48.1293836, 48.129444, 48.1295703,
48.129658, 48.129861, 48.1298617314981, 48.1298697547915,
48.1299848881401, 48.1301109548298, 48.1302424881925, 48.1303575548947,
48.1304836882611, 48.1310590883954, 48.1311851550929, 48.1314702884757,
48.1316400885154, 48.1317442885466, 48.1317606885573, 48.1318208885835,
48.1320234886614, 48.1322097553856, 48.1325657555054, 48.132932555672,
48.1331187557375, 48.1335241558618, 48.1339514893203, 48.1341815560646,
48.1342581560887, 48.1344389561371, 48.1346088895253, 48.134690956228,
48.1349699563651, 48.1350794897343, 48.1353150897948, 48.1354191564988,
48.1357149565895, 48.1361694900764, 48.1363282901207, 48.1366297568536,
48.1368598902423, 48.137095356993, 48.1372375570546, 48.1373469571157,
48.1374291571337, 48.1376209571703, 48.1376922905219, 48.1377360905363,
48.1378071572302, 48.1379823572998, 48.1381136906915, 48.1383326907672,
48.1384641574654, 48.1386449575011, 48.138743690857, 48.1388696908923,
48.1389298909157, 48.1390172909804, 48.1390609576711, 48.1391211576979,
48.1394278911178, 48.1394990911338, 48.139685491159, 48.1398279578604,
48.1400524912606, 48.1403316913585, 48.1405178914156, 48.1405890914305,
48.1406604914415, 48.1407754914557, 48.1408961581402, 48.1409784914882,
48.1410824915222, 48.1413508915895, 48.1416795583323, 48.1418919583931,
48.1421006917916, 48.1421885584951, 48.1424191585722, 48.142583758614,
48.1427594919967, 48.1428747586894, 48.1429569587019, 48.1430029986428,
48.1430029, 48.1428438, 48.1427504, 48.1427174, 48.1427338,
48.1427411978695, 48.1427425585989, 48.142830358611, 48.1429290919669,
48.143077292007, 48.1432145587161, 48.1435876921502, 48.143708558857,
48.1439500922634, 48.1441423589953, 48.1443893590713, 48.144427892429,
48.1448562925789, 48.1449275592632, 48.1449868227142, 48.145012,
48.1450126127646, 48.1449877592514, 48.1449382925655, 48.1448252283585,
48.1447371, 48.1444955, 48.1442372, 48.1438472, 48.1434408,
48.1430784, 48.1429539, 48.1429047, 48.1428884, 48.1426748,
48.1426529, 48.1426531, 48.1426368, 48.1425327, 48.1421767,
48.1420343, 48.1418536, 48.1415525, 48.1411911, 48.1408352,
48.1406708, 48.1403696, 48.1400958, 48.1397452, 48.1395536,
48.1394605, 48.1393511, 48.1392361, 48.1391815, 48.1391651,
48.1391379, 48.1388424, 48.1387494, 48.1386946, 48.1385577,
48.1382893, 48.1380865, 48.1378948, 48.1376812, 48.1375663,
48.1373419, 48.1372927, 48.1373037, 48.1372982, 48.1372763,
48.137227, 48.1371119, 48.1369805, 48.1365751, 48.1362137,
48.1360603, 48.1357316, 48.1354522, 48.1346412, 48.1341918,
48.1339618, 48.1336768, 48.1333534, 48.133041, 48.1327177,
48.132619, 48.1323834, 48.1318083, 48.1315069, 48.1310959,
48.1307121, 48.1305259, 48.1302847, 48.129879, 48.1298406,
48.1297749, 48.1295557, 48.1294241, 48.1291391, 48.1290568,
48.1288375, 48.1286895, 48.1285854, 48.1283881, 48.1282895,
48.1281964, 48.1280483, 48.1280000363797, 48.1279802872773,
48.1279857539514, 48.128106353995, 48.1283747541144, 48.1283635541554,
48.1282866875079, 48.1282427541791, 48.128237287528, 48.1282974875632,
48.1282864875818, 48.1282260875875, 48.1281217542505, 48.1279353542348,
48.1279352349385, 48.1279266, 48.1278827, 48.1277237, 48.1275811,
48.1274496, 48.1272742, 48.1270441, 48.1269619, 48.1268577,
48.1267426, 48.126666, 48.1266222, 48.1265563, 48.1264893218233,
48.1263951538804, 48.126285353881, 48.1261427538747, 48.1260933538769,
48.1260878872213, 48.1261096872349, 48.1262356872865, 48.1263945540064,
48.1266301540972, 48.1267177541418, 48.126766954171, 48.1267997542125,
48.1268215542239, 48.1269531542584, 48.126975087607, 48.1270133542863,
48.1274243543951, 48.1275778877743, 48.1278023545213, 48.1278516878838,
48.1278625545699, 48.1278241545702, 48.1278185989449, 48.1278154,
48.127766, 48.1277003, 48.1275633, 48.1274318, 48.1272784,
48.1272072, 48.1271414, 48.1270871580705, 48.1270185543626,
48.1270175113974, 48.1270098, 48.1269714, 48.1269385, 48.126774,
48.1264123, 48.1263137, 48.1261055, 48.1260343, 48.1259631,
48.1255574, 48.1254533, 48.1254235723753, 48.1254289540121,
48.1254836873664, 48.1257412874328, 48.1259550874976, 48.1261577542214,
48.1263056876099, 48.1263000876186, 48.1262178876118, 48.1262176572635,
48.1262091, 48.1261269, 48.1260172, 48.1259679, 48.1259351,
48.1257762, 48.1256337, 48.1255022, 48.1253433, 48.1251076,
48.1250473, 48.1249610618815, 48.1249190872807, 48.1249025539568,
48.124907953966, 48.1250612873602, 48.1251982874089, 48.1254612874877,
48.1256749542158, 48.1260749543489, 48.1263213544389, 48.126447354481,
48.1264801544956, 48.1264636878351, 48.1264033544973, 48.1264024644404,
48.1263946, 48.1263508, 48.1260439, 48.1259343, 48.1257368,
48.1255833, 48.1254352, 48.125353, 48.1252215, 48.1250515,
48.1248761, 48.1245782, 48.124496, 48.1243261, 48.1242548,
48.1242219, 48.1241946, 48.1242224, 48.1242059, 48.1241567,
48.1240417, 48.1238226, 48.1235595, 48.1231924, 48.1230499,
48.1229677, 48.1229567, 48.1229679, 48.1229351, 48.1228584,
48.1227598, 48.1226393, 48.1222229, 48.1222285, 48.1222231,
48.1220861, 48.1220697, 48.1220917, 48.1221356, 48.1222891,
48.1223275, 48.1223441, 48.1223331, 48.1222619, 48.1220592,
48.1219002, 48.1218618, 48.1219003, 48.1218839, 48.1217853,
48.1215826, 48.1213242, 48.1211584282462, 48.1211404601882,
48.1208057, 48.1208331, 48.1208714, 48.1208835, 48.121011,
48.1210691, 48.1210655, 48.1210383, 48.1209552, 48.1209528,
48.1208759, 48.1207992, 48.1207641090859, 48.1206599519583,
48.1206489519529, 48.1206566869599, 48.1206402, 48.12066230687,
48.1206380852623, 48.1205722852527, 48.1204680852417, 48.1203035519036,
48.1202963771109, 48.1203089, 48.1202703, 48.1202248, 48.1202019654635,
48.1202046853224, 48.120188285342, 48.120100485363, 48.1201003520543,
48.1202921521654, 48.1203085522186, 48.1202591522409, 48.120099952265,
48.1200232856011, 48.119908085597, 48.1198994027165, 48.1198993,
48.1197048821543, 48.1195900855727, 48.119518752239, 48.1194967522472,
48.1194857522855, 48.1193978856235, 48.1194143523064, 48.1194472856561,
48.1195951523813, 48.1196169524319, 48.1196497524701, 48.1196387524825,
48.1195948858221, 48.1194907524817, 48.1194875721997, 48.119482,
48.1192955, 48.1190542, 48.1189062, 48.1188021, 48.1186869,
48.1183087, 48.1181717, 48.1180511, 48.1178976, 48.1177442,
48.1176894, 48.1176401, 48.1176401, 48.1176895, 48.1177829,
48.1179035, 48.1179694, 48.11809, 48.1182326, 48.1182407861856,
48.1182413519227, 48.1184688188868, 48.1185397, 48.1185946,
48.1186055, 48.1185617, 48.1184082, 48.1182329, 48.1180684,
48.1179368, 48.1178546, 48.117712, 48.1176133, 48.1174927,
48.117405, 48.1171638, 48.1169938, 48.116939, 48.1168896,
48.1168842, 48.1168459100114, 48.116777884673, 48.116777884685,
48.1167127, 48.1168044, 48.1169785, 48.117052, 48.1170652,
48.1171638, 48.1172411, 48.1173003, 48.117309076889, 48.1172331512366,
48.1171180845333, 48.1169206844854, 48.116591684413, 48.1165203510559,
48.1164557037985, 48.1164239, 48.1163918, 48.1164961, 48.1166476,
48.1166666229034, 48.1165917509665, 48.1166027509585, 48.1166070315534,
48.116594, 48.1166512, 48.1167709699366, 48.116720840296,
48.1167091, 48.1166269, 48.1165885, 48.1165238, 48.1165124,
48.1162211, 48.1162070136503, 48.115944750713, 48.1158350840301,
48.1157363506843, 48.1155335506625, 48.115171683947, 48.1151058839424,
48.1150793728353, 48.1150951, 48.1151322, 48.1152317, 48.1153132,
48.1154405, 48.1155481, 48.1161875, 48.116182, 48.1161294,
48.1160986558131, 48.1160817509584, 48.1158788842911, 48.1157856842929,
48.1156978842847, 48.1155827509366, 48.1154237509107, 48.1152372842104,
48.1150837508453, 48.1145793507202, 48.1142833506401, 48.1137185505078,
48.1135539504734, 48.1132469504175, 48.113142750397, 48.1130906238726,
48.1130352, 48.1129914, 48.1128544, 48.1127612, 48.1127173,
48.1124925, 48.1124840231695, 48.1123038835266, 48.1121503501664,
48.1119913501456, 48.1118377501289, 48.1116732834507, 48.1115362834453,
48.1114978834456, 48.1114813501206, 48.1115087501389, 48.1115909501699,
48.1117335502154, 48.1118542835911, 48.1119090836245, 48.1119418836542,
48.1119418836963, 48.1119966837553, 48.1120350837881, 48.1122488838871,
48.1122433505631, 48.1122104839126, 48.1122104839244, 48.1122652839554,
48.1122652839672, 48.1122377506419, 48.1121774839837, 48.1120951506519,
48.1119416839847, 48.1118648839876, 48.1118319506609, 48.1117990840121,
48.111760550688, 48.1116674840208, 48.1113383506741, 48.1110860840017,
48.111053150675, 48.1110586840427, 48.1110256840864, 48.1110420841166,
48.1110365508072, 48.1109432841719, 48.110954150868, 48.1110363509309,
48.1110527509612, 48.1110361509925, 48.1109977510012, 48.110904551004,
48.1108985702834, 48.1108958, 48.1107367, 48.1105668, 48.1104023,
48.1102707, 48.110194, 48.1101282, 48.1100845, 48.1098982,
48.1098543, 48.1097393, 48.1096735, 48.1094214, 48.1092624,
48.1090596, 48.1089225, 48.108654, 48.1086156, 48.1085772,
48.1085772, 48.1086924, 48.1087088, 48.1087198, 48.1088515,
48.1089611, 48.1090215, 48.1090218664535, 48.1090302833874,
48.1091124833987, 48.1091836834153, 48.1093481501304, 48.1094249501489,
48.109523683502, 48.1096387501963, 48.1097265502236, 48.1097977502457,
48.1099732836217, 48.1100554836365, 48.1101816836567, 48.1102967503381,
48.110410802978, 48.1105074, 48.1105676, 48.1105951, 48.110617,
48.1105129, 48.1104362, 48.1103814, 48.1103297906316, 48.1100556834112,
48.1100611500731, 48.110074019244, 48.1100682, 48.1100951,
48.1101328, 48.11025, 48.1103225264078, 48.1103298834183,
48.1103188834056, 48.1102640833834, 48.1100995500061, 48.1099954832987,
48.1098637499001, 48.1098034832129, 48.1095183497965, 48.1093593497465,
48.1092222830413, 48.1091400830232, 48.1090577496768, 48.1089755496672,
48.108948149669, 48.1089425496822, 48.1089097496811, 48.1087287496494,
48.1086794829708, 48.1085807496104, 48.1084546829152, 48.1082517495443,
48.1080543495132, 48.1079172828293, 48.1078788828296, 48.1077746828258,
48.107725282819, 48.1076650828079, 48.1076320827994, 48.1075927808007,
48.1075862, 48.1075466, 48.1075521, 48.1076179, 48.1076288,
48.107596, 48.1075192, 48.107426, 48.1072066, 48.1068283,
48.1066856, 48.106587, 48.1064554, 48.1063074, 48.1061977,
48.1061278178941, 48.1060638823594, 48.1059870823617, 48.106003549043,
48.1060638824042, 48.1061460824262, 48.1061516824365, 48.1061187491093,
48.1059761490974, 48.1059758623278, 48.1059674, 48.1058797,
48.1056932, 48.1056658, 48.1055233, 48.1053532, 48.1050736,
48.1048707, 48.1043005, 48.1037905, 48.103615, 48.1034066,
48.1029515, 48.1025951, 48.1022222, 48.1018054, 48.1015532,
48.1012077, 48.1009116, 48.1007635, 48.1006046, 48.1004806615424,
48.1003117479772, 48.1003087543247, 48.100303, 48.1002043,
48.0999466, 48.0997985, 48.0991788, 48.0989102, 48.0985702,
48.0984551, 48.0981479, 48.0972486, 48.0966179, 48.0961736,
48.0958665, 48.0956417, 48.095351, 48.0950878, 48.0946655,
48.0942871, 48.093481, 48.0931959, 48.0929381, 48.0927955,
48.092483, 48.0922087, 48.0918851, 48.0916, 48.0913258, 48.0910955,
48.0907885, 48.0903497, 48.0899055, 48.0895491, 48.089385014093,
48.0893440790442, 48.0893221457179, 48.0893221457302, 48.0892782790625,
48.0892720541369, 48.0892695, 48.0892093, 48.0889021, 48.088776,
48.088107, 48.0878272, 48.0875859, 48.0874159, 48.0871198,
48.0869113, 48.0868291, 48.0866921, 48.0865824, 48.0864562,
48.0864288, 48.0863904, 48.0864013, 48.0864506, 48.0864506,
48.0864067, 48.0863048817679, 48.0862565450914, 48.0862486983041,
48.0862478, 48.0859681, 48.0858365, 48.0857324, 48.0856446,
48.0855569, 48.0853539, 48.0852277, 48.0846628, 48.0845695,
48.0845586, 48.0846079, 48.084712, 48.0847777, 48.0847777,
48.0847612, 48.0847064, 48.0845638, 48.08435, 48.0842842,
48.0840867, 48.0839002, 48.0838564, 48.0837906, 48.0836807,
48.0835655, 48.0833078, 48.0832201, 48.0831214, 48.0830117,
48.0830117, 48.0830391, 48.0831322, 48.0831322, 48.0831212,
48.0830773, 48.0827757, 48.082688, 48.0826277, 48.0825837,
48.0826166, 48.0826235031896, 48.0826253441986, 48.0827570775489,
48.0829653442483, 48.0831409442809, 48.0832395443035, 48.0832561443164,
48.0832068776704, 48.0832287443479, 48.0833219443669, 48.083415277716,
48.0836400777498, 48.0838155444497, 48.0838868777996, 48.0839087444749,
48.0839417444957, 48.0839801445122, 48.0841173445451, 48.0842763445738,
48.0843586779229, 48.0845122779677, 48.0846163446532, 48.0847699446727,
48.0848960780235, 48.0850056780436, 48.0850386780572, 48.0850386780661,
48.0848907447656, 48.084885344776, 48.0848908781214, 48.0849676781471,
48.0853735449017, 48.0855983449602, 48.0856258782995, 48.0856951428176,
48.0857212, 48.0857431, 48.085743, 48.0858308, 48.0858472,
48.0858308, 48.0856718, 48.0856389, 48.0856388, 48.0856881,
48.0856909178572, 48.0856968782337, 48.0857846782481, 48.0859655449509,
48.0859690858989, 48.086238, 48.0862615950562, 48.0863657449827,
48.0864572208287, 48.0865066, 48.0867095, 48.086726, 48.0868028,
48.0868959, 48.0871483, 48.08745, 48.0874828, 48.0875173896512,
48.0875283451801, 48.087605145188, 48.0876084076597, 48.0876692,
48.087746, 48.0878666, 48.0880915, 48.0884589, 48.088777,
48.0890348, 48.0891773, 48.0893637, 48.0896708, 48.0899779,
48.0905592, 48.0909211, 48.0914146, 48.0915628, 48.0917312782425,
48.091750945954, 48.091855279304, 48.0919374793137, 48.0920251459891,
48.0920854793313, 48.0922171460263, 48.0922883460378, 48.0923968018043,
48.092477, 48.092603, 48.092751, 48.0927729, 48.0928442,
48.092852476473, 48.0928529460491, 48.0930010793956, 48.0932806794257,
48.0934615461174, 48.0935822794708, 48.0937796795131, 48.0939222795446,
48.0940922795703, 48.0941580795832, 48.094284146278, 48.0942897462939,
48.0942239462949, 48.0941800796323, 48.0941856796454, 48.0942733463499,
48.0946299464624, 48.0947067464803, 48.0949315465197, 48.0950248798743,
48.0950632798903, 48.0953265466493, 48.0955733467114, 48.0960943468253,
48.0962917468632, 48.0966920802697, 48.0969059469799, 48.0971417470321,
48.0981618806003, 48.0985840807006, 48.099192747504, 48.0993737475419,
48.0996315475914, 48.0998947476519, 48.1002676810608, 48.1006843478057,
48.1007830811537, 48.100996947846, 48.1010627478551, 48.1012875478973,
48.1014520812545, 48.1015754980155, 48.1016845, 48.101688129519,
48.1016932812783, 48.1017371479499, 48.1018303479633, 48.1020825480183,
48.102241681382, 48.1024195589915, 48.1026386, 48.1026443602014,
48.1026473480861, 48.1027735480985, 48.1028612814468, 48.1029983481452,
48.1034260816138, 48.1041938818307, 48.1044571485639, 48.104758681968,
48.1049671486814, 48.1052192820624, 48.1055648821359, 48.1056420339549,
48.1056876, 48.1056547, 48.1056492, 48.1056767, 48.1056804328149,
48.1056854821268, 48.1057731488067, 48.105943148839, 48.1060253488504,
48.1061844822041, 48.1062666822171, 48.1063708822421, 48.1065408822908,
48.1068040823529, 48.1069520823968, 48.1071220824416, 48.1072920824774,
48.1073743491576, 48.1074153549785, 48.1074862, 48.1075356,
48.1075379733302, 48.1075443491581, 48.1076210825009, 48.1076978825138,
48.1078020825349, 48.1080049492621, 48.1081529492987, 48.1082571493209,
48.1083558826735, 48.1084984827044, 48.1089644828152, 48.1090961495056,
48.1091784828509, 48.1092911242919, 48.1094273, 48.1094284872824,
48.1094360828741, 48.1095841495624, 48.1099350829761, 48.1100227496593,
48.1101434830115, 48.1102531496967, 48.1104943497536, 48.1105546830963,
48.1106588831101, 48.1107739497972, 48.1111414832193, 48.1112565499103,
48.1113442832557, 48.1114125850361, 48.1114891, 48.1115494,
48.1115604, 48.1115548, 48.1114891, 48.1113629, 48.1111984,
48.1108968, 48.1107926, 48.1107926, 48.1108639, 48.1108684473927,
48.1108726829452, 48.1110535496407, 48.1111687496667, 48.111305883038,
48.1114922830923, 48.1117445498358, 48.1123093500209, 48.1125177500703,
48.112610883444, 48.1126986834706, 48.1128521501742, 48.1129344835222,
48.1129811116887, 48.1130244, 48.1130408, 48.1131121, 48.1131834,
48.1131889, 48.1131834, 48.1130628, 48.1127996, 48.1125967,
48.1124048, 48.1121854, 48.1121744, 48.1121744, 48.1122348,
48.1123389, 48.1123471762827, 48.1123476831919, 48.1125089338583,
48.1125692, 48.1125801, 48.1125363, 48.1124321, 48.1124266,
48.1124595, 48.1124595, 48.1124376, 48.1123224, 48.1121743,
48.1120372, 48.1118398, 48.1117082, 48.1115437, 48.1112365,
48.1111214, 48.110902, 48.1105346, 48.1103207, 48.1099313,
48.109509, 48.1091306, 48.1088948, 48.1082366, 48.1078746,
48.1075674, 48.1074084, 48.1071067, 48.1065582, 48.1061796,
48.1057957, 48.1055269, 48.1048741, 48.1046053, 48.104172,
48.1040623, 48.1038757, 48.1034204, 48.1030584, 48.1028553,
48.1027785, 48.1026577, 48.1026028, 48.1024931, 48.1023559,
48.1020432, 48.1016208, 48.1013299, 48.1010885, 48.1009567,
48.1009182, 48.1009016, 48.1008466, 48.1007369, 48.1006052,
48.100298, 48.0999687, 48.0998151, 48.0996778, 48.0994251,
48.0992714, 48.0991176, 48.0988432, 48.098728, 48.0986237,
48.0985524, 48.0981026, 48.097702, 48.0974826, 48.0973453,
48.0973124, 48.0973068, 48.0972628, 48.097153, 48.096917,
48.0968236, 48.0968071, 48.0967796, 48.096582, 48.0960112,
48.0958685, 48.0956435, 48.0955776, 48.09555, 48.0953578,
48.0953413, 48.0952698, 48.0951601, 48.0949296, 48.0948527,
48.0947537, 48.0947482, 48.0948576, 48.094841, 48.094764,
48.0945719, 48.0943577, 48.0941985, 48.094012, 48.093732,
48.0936716, 48.0936605, 48.0936603, 48.0936218, 48.0934022,
48.0931113, 48.0929027, 48.0927929, 48.092579, 48.0924857,
48.0924691, 48.0924691, 48.0924087, 48.0921837, 48.0921508,
48.0921287, 48.0920628, 48.091909, 48.0918596, 48.0916238,
48.0914812, 48.0914373, 48.0914153, 48.0913987, 48.0913163,
48.0911352, 48.0910034, 48.0905916, 48.0904983, 48.0904708,
48.0904818, 48.0904904868087, 48.0904905427471, 48.0905914778343,
48.0906078, 48.0905967, 48.0905583, 48.0904504, 48.0902862,
48.0901439, 48.0900399, 48.0900291, 48.0900127, 48.0896402,
48.0894924, 48.0892897, 48.0892022, 48.0891255, 48.0886545,
48.0881507, 48.0876578, 48.0874662, 48.0871102, 48.0869405,
48.086694, 48.0864529, 48.0864257, 48.0861298, 48.085938,
48.0856805, 48.0856149, 48.0856534, 48.0855821, 48.0854342,
48.0852097, 48.0851166, 48.0850513256295, 48.084999140974,
48.0849716743165, 48.0850099410159, 48.0850645410498, 48.085267274451,
48.0853547411594, 48.0853053411683, 48.0851352744994, 48.0851295759517,
48.0851265, 48.08494, 48.0847974, 48.0844193, 48.0841342,
48.0839424, 48.0838056, 48.083784, 48.0837456, 48.083658,
48.0835867, 48.08351, 48.0834497, 48.0833513, 48.083198,
48.0828309, 48.082546, 48.0822117, 48.0818992, 48.0816579,
48.0814442, 48.0811208, 48.080918, 48.080792, 48.0807264,
48.0806388, 48.080321, 48.0800252, 48.0796963, 48.0793895,
48.0792469, 48.0788538504448, 48.078685339597, 48.0785427395897,
48.0785398821278, 48.078534, 48.0784133, 48.0783601575847,
48.0782357395383, 48.0781315395239, 48.0780711395218, 48.0780326728677,
48.0780326728812, 48.0781860729265, 48.0783613396521, 48.0784707397048,
48.0785034730852, 48.0784869397592, 48.0784320730928, 48.0782784730861,
48.0782747564393, 48.0782697, 48.0780723, 48.0778968, 48.0775516,
48.0772118, 48.0770364, 48.0769432, 48.0769161, 48.0767681,
48.0765269, 48.0764557, 48.0763811909127, 48.0763383393172,
48.0763492726678, 48.0764259393568, 48.0765957393965, 48.0766121394095,
48.0765737394081, 48.0765675141405, 48.076565, 48.0764992,
48.0763621, 48.0760825, 48.0756988, 48.0755508, 48.0753425,
48.0752165, 48.0750304, 48.0749044, 48.0748825, 48.0748387,
48.0747291, 48.0745867, 48.0744936, 48.0744293064941, 48.0743925388787,
48.0744035388976, 48.0745074722806, 48.0746169389949, 48.0746114723499,
48.0745893390208, 48.0745180723504, 48.0745121439207, 48.0745093,
48.0744051, 48.0742681, 48.0740598, 48.074005, 48.074005,
48.0740216, 48.0740272, 48.073967, 48.0738464, 48.0733696,
48.0731284, 48.0730196960502, 48.0729068719581, 48.072884938633,
48.0729396719952, 48.0730820720445, 48.0732901387786, 48.0733996721607,
48.0733722721715, 48.0733227388408, 48.0730047388138, 48.0728128721206,
48.0726812720974, 48.072144814801, 48.0720586, 48.0719106,
48.0717869, 48.0718287, 48.071763, 48.0717207341945, 48.0717169384711,
48.0715635384426, 48.0714922717667, 48.0713824717605, 48.0713111384324,
48.0713438717966, 48.0714807385461, 48.0714367385501, 48.0713270718745,
48.0713257085851, 48.0713183, 48.071166945093, 48.0709705385099,
48.0709689196494, 48.0709618, 48.0707425, 48.0704847, 48.0703093,
48.0701832, 48.0699476, 48.0697613, 48.0696847, 48.0696683,
48.0697342, 48.0698056, 48.0697837, 48.0694495, 48.068929,
48.068666, 48.0684687, 48.0682385, 48.0680685, 48.0678327,
48.0675367, 48.0672024, 48.0669503, 48.0667036, 48.0664845,
48.0662652, 48.066068, 48.0658817, 48.0657776, 48.065531,
48.0652843, 48.0650596, 48.0648076, 48.0647145, 48.0645776,
48.0643913, 48.0641556, 48.063898, 48.0636515, 48.063498,
48.0632568, 48.0628731, 48.0626649, 48.0624786, 48.0623362,
48.0621718, 48.0620569, 48.0619418, 48.0618596, 48.0613991,
48.0611305, 48.061021, 48.0608292, 48.0606154, 48.0603906,
48.0601988, 48.0600672, 48.0598096, 48.0597274, 48.0595464,
48.0592614, 48.0591353, 48.0589435, 48.0587187, 48.0586091,
48.0585434, 48.0584885, 48.058346, 48.0581596, 48.0580719,
48.0579952, 48.058039, 48.0580884, 48.058094, 48.0580556,
48.0579624, 48.0577705, 48.0577428725312, 48.0575598676978,
48.0573654112455, 48.0573209, 48.0570962, 48.0568659, 48.056493,
48.0562683, 48.0560489, 48.0558131, 48.0555171, 48.0554513,
48.0554568, 48.0554952, 48.0555664, 48.0556432, 48.0556463184099,
48.0556519337142, 48.0557330513973, 48.0557803, 48.0557638,
48.0554787, 48.0554074, 48.0554403, 48.0555061, 48.055539,
48.0555939, 48.0555979789669, 48.0556026668517, 48.0562495335864,
48.0563428669304, 48.0564414669435, 48.0565292669595, 48.0566115336493,
48.0567705337027, 48.0568692670614, 48.0571488671129, 48.058070067327,
48.0581744572845, 48.0582039, 48.0582093, 48.0581655, 48.058171,
48.0582532, 48.0582697, 48.0582313, 48.0580229, 48.0579461,
48.0579407, 48.0579681, 48.058171, 48.0582038, 48.0581106,
48.0580394, 48.0578912, 48.0575239, 48.0573484, 48.0571401,
48.0569098, 48.0566904, 48.0566026, 48.056164, 48.055972,
48.0559062, 48.0559392, 48.0559556, 48.0559281, 48.05578,
48.0554071, 48.0549903, 48.0548532, 48.0546064, 48.0543541,
48.0541621, 48.0540031, 48.0538058, 48.0535864, 48.0530599,
48.0529667, 48.0528198832427, 48.0526794657231, 48.0526465324054,
48.0526520657619, 48.0527234658049, 48.0527509325079, 48.0527125325256,
48.0525754658529, 48.0523232658304, 48.0519942657956, 48.0517091324274,
48.0514679323941, 48.0512454026976, 48.0512234, 48.051163,
48.0509217, 48.0507024, 48.0504391, 48.0501374, 48.0500332,
48.0498247, 48.0496273, 48.0491283, 48.0490351, 48.0489912,
48.0489527, 48.0488539, 48.0486729, 48.0484425, 48.0481462,
48.0479268, 48.047658, 48.0475866, 48.0475701, 48.0473945,
48.047175, 48.0470434, 48.0469829, 48.0469773, 48.0469278,
48.046659, 48.046626, 48.0465655, 48.0464995, 48.0463184,
48.0461538, 48.0461538, 48.0461922, 48.0462004124232, 48.0462009303666,
48.0462557303719, 48.0463708637256, 48.0464531304132, 48.0465133846384,
48.046554, 48.0465046, 48.0462413, 48.0461918, 48.0461206,
48.0460327, 48.0458463, 48.0456761, 48.0455116, 48.0454018,
48.0453358, 48.0453192, 48.0452588, 48.0451711, 48.0449681,
48.0448089, 48.0445508, 48.0444355, 48.0443367, 48.0441501,
48.0437495, 48.0432555, 48.0431074, 48.0428878, 48.0425531,
48.0423336, 48.0420482, 48.041708, 48.0414719, 48.0413566,
48.0414277, 48.0415318, 48.0415376518742, 48.0415405286111,
48.0417324619692, 48.0419133286625, 48.0421053287019, 48.0423138620881,
48.0424236621235, 48.0425773288445, 48.0428134622653, 48.0432360623966,
48.0436639291711, 48.0439382625686, 48.0442398626249, 48.0443167293095,
48.0443715293254, 48.0444265293481, 48.0445417293803, 48.0447173294354,
48.0451287295298, 48.0454964629811, 48.0456446630347, 48.0458750630895,
48.0461108631355, 48.0465002631971, 48.046740620124, 48.0469684,
48.047089, 48.0470887, 48.0469844, 48.0467484, 48.0464851,
48.0462985, 48.04609, 48.0459143, 48.0452666, 48.0450195,
48.0445968, 48.0444213, 48.0440863, 48.044004, 48.0437678,
48.0434768, 48.0432627, 48.0429444, 48.0426371, 48.0423791,
48.0421925, 48.042099, 48.0420824, 48.0421262, 48.0421755,
48.0422468, 48.0422550685862, 48.0422555281694, 48.0424528615193,
48.0426475522476, 48.0427237, 48.0427295631732, 48.0427324615456,
48.043033861572, 48.0431325282523, 48.0432367282689, 48.0433573282917,
48.0435385283397, 48.0440820618446, 48.0442959285666, 48.0444332619413,
48.0445648619774, 48.0447955287202, 48.0449218621007, 48.0452676622096,
48.0456297289789, 48.0458987290654, 48.0460909291318, 48.0462117291866,
48.0463654625714, 48.046980262769, 48.0471009294675, 48.0472270628221,
48.0473348562485, 48.0474705, 48.0474717625317, 48.0474792628457,
48.0476163295313, 48.0477698628898, 48.0483239296884, 48.0485928631038,
48.0486752631375, 48.048839863181, 48.0489276632178, 48.0490484632502,
48.0495259300815, 48.0497235301424, 48.0502722636306, 48.0505082637047,
48.0507221304211, 48.0509469304667, 48.0510622638338, 48.0513092639157,
48.0514738639737, 48.0516329306859, 48.0518908640801, 48.0521540641495,
48.0523681308777, 48.0529992644406, 48.0532900645307, 48.0536247312929,
48.0538496646993, 48.053981331396, 48.0541082215781, 48.0542138,
48.0542521, 48.0541862, 48.0540379, 48.0539281, 48.0538623,
48.0536482, 48.0533465, 48.0530393, 48.0527594, 48.052507,
48.0522162, 48.0520077, 48.0517443, 48.0514974, 48.0507623,
48.0506032, 48.0505208, 48.0504821, 48.0504107, 48.0503229,
48.0501089, 48.0499772, 48.0496972, 48.0494944, 48.0492146,
48.0489787, 48.0487262, 48.0485615, 48.0484461, 48.0473922,
48.0471727, 48.0467614, 48.0465804, 48.0464103, 48.0462457,
48.0461303, 48.0460425, 48.0459105, 48.045806, 48.045641,
48.0455694, 48.0454377, 48.045251, 48.0448667, 48.0447842,
48.0443122, 48.0440157, 48.0438235, 48.0436423, 48.0431317,
48.04272, 48.0424125, 48.0422586, 48.0421376, 48.0417564,
48.0415373, 48.0410444, 48.0405187, 48.0401189, 48.0398998,
48.0394781, 48.0390508, 48.0388152, 48.0386237, 48.0385307,
48.0382566, 48.0381471, 48.038087, 48.0379666, 48.0374082,
48.0370467, 48.0368605, 48.0358854, 48.0355402, 48.0350307,
48.0342581, 48.0332991, 48.03274, 48.032137, 48.0319287,
48.0317807, 48.0316246, 48.0313936, 48.0312823, 48.0312076,
48.0312234, 48.0313876, 48.0316389, 48.0318787, 48.0317497720609,
48.0317828581031, 48.0317334581025, 48.0316457247587, 48.031591468059,
48.0315873, 48.0315054, 48.031456, 48.031056, 48.0307655,
48.0307370612037, 48.0302358149101, 48.0302118, 48.02985,
48.02918, 48.0290495, 48.0286769, 48.0284523, 48.0281495,
48.0281785, 48.0275596, 48.0265078, 48.0258778, 48.025719,
48.0255054, 48.0254177, 48.0252696, 48.0249351, 48.0248475,
48.024694, 48.0245131, 48.0243487, 48.0242392, 48.0240859,
48.0240311, 48.0240424, 48.0239658, 48.0234783, 48.0234016,
48.0235168, 48.0235178098129, 48.0235255223302, 48.0238764557299,
48.0239559191805, 48.0239993, 48.0234788, 48.0234515, 48.0229145,
48.0225912, 48.0219883, 48.0216265, 48.0214293, 48.0210567,
48.0208758, 48.020569, 48.0204868, 48.0204431, 48.0205528,
48.020849, 48.0215618, 48.0215669654741, 48.0215705209122,
48.0216418542538, 48.0219927209711, 48.0220493085295, 48.0220883,
48.0220992, 48.0220883, 48.0219951, 48.0219677, 48.0219897,
48.0219842, 48.0218416, 48.0214853, 48.0210029, 48.0208165,
48.0206849, 48.0205917, 48.0203175, 48.0201147, 48.0199447,
48.0197857, 48.0196048, 48.0193141, 48.0191442, 48.0187768,
48.0181243, 48.0174224, 48.0170878, 48.0169124, 48.016874,
48.01683, 48.0168519, 48.0169287, 48.017, 48.0170164, 48.0167969,
48.0166433, 48.0164734, 48.0161718, 48.0157331, 48.0152451,
48.0146091, 48.0141046, 48.0136604, 48.0134794, 48.0134629,
48.0134848, 48.0134628, 48.0131886, 48.013172, 48.0131939,
48.0130074, 48.0129416, 48.0129525, 48.0129909, 48.0130676,
48.0130754673161, 48.0130763179284, 48.0131805179377, 48.0133944512983,
48.0134696184336, 48.0135008, 48.0134898, 48.0129412, 48.0125024,
48.0121841, 48.0116686, 48.011482, 48.0113283, 48.0110758,
48.0107959, 48.0103242, 48.0101539, 48.0096383, 48.0095066,
48.0090346, 48.0089247, 48.0086559, 48.0084144, 48.0080411,
48.0079258, 48.0076295, 48.0074208, 48.0070365, 48.0068389,
48.0065755, 48.0058288, 48.0053072, 48.0053124, 48.0049443,
48.0047573, 48.0046585, 48.0044391, 48.0042251, 48.0038738,
48.0034016, 48.0031599, 48.0026383, 48.0024736, 48.0015791,
48.0006956, 47.9999656, 47.9998841, 47.9993189, 47.99843,
47.9982513, 47.9981526, 47.9979554, 47.9979007, 47.9977693,
47.9976325, 47.9974684, 47.9972385, 47.9971783, 47.9971676,
47.9970912, 47.9971024, 47.9970041, 47.9966922, 47.996654,
47.9966486, 47.9966872, 47.9966654, 47.9965777, 47.9964298,
47.9961612, 47.9959914, 47.9950381, 47.9949286, 47.9948465,
47.9947864, 47.9947701, 47.9947649, 47.9947375, 47.9946664,
47.9945293, 47.9942006, 47.9938828, 47.9937513, 47.9936472,
47.9935375, 47.9934499, 47.9934225, 47.9934007, 47.9933624,
47.9929404, 47.9926171, 47.9924582, 47.992409, 47.9923379,
47.9922448, 47.9920913, 47.9917898, 47.9908691, 47.9907705,
47.990661, 47.9905679, 47.9904802, 47.9904037, 47.9902668,
47.9902398, 47.9901961, 47.9901472, 47.9901144, 47.9900323,
47.9899064, 47.9897804, 47.9897421, 47.9896708, 47.9896106,
47.9894902, 47.9893203, 47.9891724, 47.9890792, 47.9889861,
47.9887888, 47.9885312, 47.988323, 47.9880051, 47.9879064,
47.9878682, 47.9878682, 47.9878573, 47.9877641, 47.9873859,
47.9869418, 47.9868651, 47.9865965, 47.9864869, 47.9863499,
47.9861636, 47.9859773, 47.9856761, 47.9855884, 47.9855172,
47.9853747, 47.9851226, 47.985013, 47.9849527, 47.9849418,
47.9848925, 47.9848706, 47.9846513, 47.9843061, 47.9841636,
47.9840265, 47.9839004, 47.9837798, 47.9835881, 47.983473,
47.9831989, 47.9830015, 47.9826288, 47.982426, 47.9819765,
47.9817024, 47.9813351, 47.9812857, 47.9812529, 47.9812474,
47.9810884, 47.9808362, 47.9807047, 47.9806498, 47.9803154,
47.9801893, 47.9800906, 47.9798384, 47.9792518, 47.9791092,
47.9789063, 47.9788077, 47.9787089, 47.9785334, 47.9784128,
47.9783141, 47.9781715, 47.9777, 47.9774807, 47.9771846,
47.9769488, 47.9767349, 47.9766088, 47.9765594, 47.9765374,
47.9765923, 47.9766141, 47.9766524, 47.9766469, 47.9765975,
47.976455, 47.9763508, 47.9758133, 47.9756049, 47.97555,
47.9753745, 47.9752977, 47.9749467, 47.9747602, 47.9745024,
47.9742557, 47.9741679, 47.9739264, 47.9737838, 47.9736084,
47.9735371, 47.9730873, 47.9728569, 47.9718475, 47.9717708,
47.9716664, 47.9715677, 47.9714909, 47.9713318, 47.971255,
47.9711068, 47.9709533, 47.9708983, 47.9708159, 47.9706348,
47.9705251, 47.9703715, 47.9700422, 47.96979, 47.9696692,
47.9694607, 47.9692466, 47.9691369, 47.9687309, 47.9683248,
47.9681218, 47.9675511, 47.9673207, 47.9671067, 47.9669257,
47.9666623, 47.966536, 47.9664702, 47.9662946, 47.9660697,
47.9659874, 47.9658117, 47.9657019, 47.9656141, 47.9654823,
47.9652134, 47.9651035, 47.9648949, 47.9647467, 47.9646315,
47.9642692, 47.9641759, 47.9636709, 47.9633032, 47.9632098,
47.9629793, 47.9628091, 47.9625237, 47.9624578, 47.9623645,
47.9622327, 47.9621174, 47.9619693, 47.9617006, 47.9615195,
47.9611957, 47.9611078, 47.9610036, 47.9608224, 47.9603724,
47.960301, 47.9600979, 47.9599112, 47.9598014, 47.9596972,
47.9595711, 47.9594943, 47.959231, 47.9588796, 47.9586599,
47.9585061, 47.9585168, 47.9584344, 47.9582696, 47.9581159,
47.9579237, 47.9573967, 47.9572759, 47.9570949, 47.956985,
47.9567985, 47.9567271, 47.9566338, 47.9564363, 47.9563101,
47.9561235, 47.9559424, 47.9558382, 47.9554298, 47.9551999,
47.9548386, 47.9542416, 47.9540281, 47.9538693, 47.9533051,
47.9531736, 47.9527628, 47.9526095, 47.9525, 47.9522809,
47.9517987, 47.9514922, 47.9511965, 47.9510213, 47.9505557,
47.9504243, 47.9501232, 47.9498001, 47.9493618, 47.9492194,
47.94888, 47.9485842, 47.9483761, 47.9482173, 47.9480201,
47.9476257, 47.947297, 47.9469956, 47.9467983, 47.9467435,
47.946634, 47.946519, 47.9462724, 47.9461574, 47.946108,
47.9460314, 47.9458999, 47.9456697, 47.9452478, 47.9449958,
47.9448972, 47.9447603, 47.9445905, 47.9441795, 47.9440096,
47.9438398, 47.9436263, 47.9434127, 47.9432922, 47.9431443,
47.9428757, 47.9427716, 47.9426621, 47.9423717, 47.9421963,
47.941873, 47.9412975, 47.9409851, 47.9408207, 47.9405358,
47.9402727, 47.9399001, 47.9395603, 47.9392588, 47.9391054,
47.9388204, 47.9379708, 47.9375487, 47.9371979, 47.9369293,
47.9368142, 47.9366497, 47.9365236, 47.9361343, 47.9359863,
47.935948, 47.9359918, 47.9360028, 47.9359973, 47.9358768,
47.9356465, 47.9353997, 47.9352407, 47.9351585, 47.935005,
47.9349173, 47.9349064, 47.9349831, 47.9349912478042, 47.9349918252963,
47.9351070253071, 47.9353866253463, 47.9354219377426, 47.9354437,
47.9354109, 47.935219, 47.9352245, 47.9354218, 47.9356082,
47.9356412, 47.9356412, 47.9355973, 47.9353233, 47.9352136,
47.935115, 47.9342268, 47.9340459, 47.9336183, 47.9334648,
47.9330317, 47.9326259, 47.9324614, 47.9321434, 47.9315732,
47.931354, 47.9311072, 47.9307125, 47.9302904, 47.9300546,
47.9299285, 47.9295667, 47.9294515, 47.9291719, 47.9287991,
47.9285962, 47.9284152, 47.9282452, 47.9280095, 47.9278779,
47.9277134, 47.927527, 47.9274228, 47.9272912, 47.927198,
47.9270718, 47.9269238, 47.9267647, 47.9265344, 47.9263918,
47.9259367, 47.9256132, 47.9254377, 47.9250539, 47.9249113,
47.9245438, 47.9242148, 47.9237323, 47.9236171, 47.9235404,
47.9235074, 47.9233976, 47.9232331, 47.9230138, 47.9228054,
47.9226903, 47.9226263670188, 47.9225948218353, 47.9225510218517,
47.9227486219594, 47.9227486219679, 47.9227102219761, 47.9226114886359,
47.9226094644454, 47.9226028, 47.9224548, 47.9222739, 47.92206,
47.9214513, 47.9212539, 47.9211827, 47.9211220079345, 47.9210652883336,
47.9210050216755, 47.9209610883395, 47.9209568006968, 47.9209524,
47.9206783, 47.9204535, 47.9203329, 47.9200094, 47.9197846,
47.9195765295116, 47.9193054214442, 47.9193051687134, 47.9192967,
47.9190006, 47.9187428, 47.9185071, 47.9178764, 47.9174211,
47.9171194, 47.9165545, 47.9163625, 47.9161431, 47.915825,
47.9156111, 47.9155453, 47.9155179, 47.9155344, 47.9157536,
47.9157975, 47.915792, 47.9156603, 47.9154793, 47.9153532,
47.9151667, 47.9150625, 47.9150351, 47.9149967, 47.9149528,
47.9149093039454, 47.91481348684, 47.9147094868706, 47.9146546868759,
47.9146465006545, 47.914646, 47.9144048, 47.9142896, 47.9141854,
47.9141305, 47.9141304, 47.9141578, 47.9141664636732, 47.914166486736,
47.9143332918588, 47.9143826, 47.914388, 47.914344, 47.9143002,
47.9142069, 47.9140809, 47.9136915, 47.9136202, 47.9135599,
47.9135159, 47.9135598, 47.9136365, 47.9136421759216, 47.9136452198618,
47.9138474456546, 47.9140586, 47.9140633469519, 47.9140672865563,
47.9142187802894, 47.9142285, 47.9142065, 47.914009, 47.9138444,
47.9136689, 47.9132576, 47.9131258, 47.9130435, 47.9129447,
47.9128624, 47.9127252, 47.9125003, 47.9122809, 47.9120122,
47.9119464, 47.911908, 47.911875, 47.9118969, 47.9118914,
47.9117542, 47.9115896, 47.9111508, 47.9110082, 47.9108271,
47.9106956, 47.9105927311658, 47.9105506855021, 47.9105014188338,
47.9104630855086, 47.9104248855501, 47.9103810855632, 47.9103372855633,
47.9103301390316, 47.9103286, 47.9102518, 47.9101312, 47.9098625,
47.9096322, 47.9094896, 47.9093635, 47.9086724, 47.9085901,
47.9085352, 47.9084256, 47.9083597, 47.9082884, 47.9082073785435,
47.9081162184567, 47.9080670184646, 47.9080670184713, 47.9081164184911,
47.9083578185767, 47.9083688852725, 47.9084238186252, 47.9084292852999,
47.9084184186385, 47.9082814186376, 47.907996418614, 47.9079963676484,
47.9079877, 47.9078177, 47.9075819, 47.907368, 47.9069402,
47.9063259, 47.906057, 47.9058429, 47.905596, 47.9055137,
47.9054454236826, 47.905379884636, 47.9053306846618, 47.9052814179928,
47.9052767798792, 47.9052727, 47.9050814600766, 47.9050018179638,
47.9049524846372, 47.9050624180251, 47.905205218101, 47.9052930848254,
47.9053042182086, 47.9052440182144, 47.9051180182173, 47.9048220182,
47.9048181357707, 47.9048133, 47.9045611, 47.9040567, 47.9038044,
47.903448, 47.9028996, 47.9022633, 47.9021153, 47.9019233,
47.9013721508131, 47.9011810175742, 47.9011783494567, 47.9011723,
47.9010791, 47.9007775, 47.9005141, 47.9004265, 47.9002753513174,
47.9002104173963, 47.9001390840649, 47.9001174174302, 47.9000680841074,
47.9000022841068, 47.8999960396285, 47.8999936, 47.8998456,
47.8994344, 47.8991493, 47.8988147, 47.8986712182035, 47.8985768172276,
47.898516617235, 47.8985496172643, 47.8986264172974, 47.8987088173403,
47.8988130173816, 47.8990708841295, 47.8991478174909, 47.8992508422261,
47.8994022, 47.8994041115964, 47.8994108841888, 47.8994656841963,
47.8995260175408, 47.8995864175565, 47.899784017631, 47.8998498176682,
47.8998224176734, 47.8996142176728, 47.8996082995274, 47.8996055,
47.8995397, 47.899249, 47.8989638, 47.8988486, 47.8983441,
47.8981741, 47.8981028, 47.8980754, 47.8981082, 47.8982397,
47.8982562, 47.8982232, 47.8981464, 47.8979269, 47.897554,
47.8972743, 47.8971043, 47.8970185762566, 47.8969156170207,
47.8968936836899, 47.8968554837139, 47.8967568170426, 47.8967520852836,
47.8967481, 47.896633, 47.896156, 47.8960645365584, 47.8959562835824,
47.8955778835116, 47.8954352834672, 47.895358416768, 47.8953472834056,
47.8954020166964, 47.8953580166667, 47.8952976166488, 47.8952666456191,
47.8951062, 47.8949385, 47.8947807, 47.8945965, 47.8943828,
47.894248, 47.8941888, 47.8942085, 47.8943137, 47.8944255,
47.8944453, 47.8943861, 47.8942085, 47.8940408, 47.893906,
47.8936791, 47.8934028, 47.8931266, 47.8929466799966, 47.8925568830702,
47.8925564052125, 47.8924426, 47.8923999, 47.8924821, 47.8924919,
47.8924163, 47.8923111, 47.8921993, 47.8921335, 47.8922124,
47.8923144, 47.8924656, 47.8926334, 47.8928307, 47.893028,
47.8932055, 47.8933667, 47.8935081, 47.8935225620627, 47.8936326835646,
47.8937260169074, 47.8937468651301, 47.8938172, 47.8940145,
47.8942019, 47.8943466, 47.8944058, 47.8943828, 47.8943499,
47.8944255, 47.8945702, 47.8947675, 47.8949615, 47.8952476,
47.895537, 47.8957606, 47.8959086, 47.8959743, 47.8959645,
47.895925, 47.8958395, 47.8956258, 47.8955173, 47.8954745,
47.8955173, 47.8954942, 47.8955436, 47.8955559253024, 47.8957066843283,
47.8957946630027, 47.8959349, 47.8960894, 47.8962768, 47.8962775764853,
47.8963154177924, 47.8966666212903, 47.8967503, 47.8967589759731,
47.8968088845137, 47.8969404178579, 47.8970390178715, 47.8971542178919,
47.8971878063634, 47.897283, 47.8974376, 47.8975066, 47.8975001,
47.8975264, 47.8974935, 47.897408, 47.8972995, 47.8971933220773,
47.8971544846885, 47.8970102541117, 47.8969016, 47.8968589,
47.8969115, 47.8970397, 47.8971449, 47.8970923, 47.8971153,
47.897214, 47.8974902, 47.897625, 47.8978026, 47.8979209,
47.8980689, 47.8982037, 47.8983517, 47.8983875582745, 47.8984548185887,
47.8984735782917, 47.8985457, 47.8986904, 47.8988515, 47.8988909,
47.8989271, 47.8989297323081, 47.899014218797, 47.899200618839,
47.8993486855295, 47.8996325839087, 47.8996833, 47.8998477,
47.8999727, 47.9000549, 47.9000549, 47.8999793, 47.8998971,
47.8998017, 47.8996702, 47.899640057944, 47.8995802339438,
47.899542, 47.8995354, 47.8996143, 47.8996669, 47.899671313546,
47.8997600858207, 47.8998314191723, 47.8999264738825, 47.9000023,
47.9000943158563, 47.9002920192534, 47.9003632192666, 47.9003682816845,
47.9004527, 47.9005152, 47.9005316, 47.900479, 47.90041,
47.9003887829984, 47.9004018193787, 47.9004894860929, 47.900643019484,
47.9010542196442, 47.9014254219336, 47.9014753, 47.9015226566075,
47.9018274198325, 47.9021234198796, 47.9021344830861, 47.9023071,
47.9026326, 47.9027502024962, 47.9032474200197, 47.9034666200483,
47.9036196107885, 47.9037472, 47.9039346, 47.9041088, 47.9042666,
47.9042765, 47.9042247931353, 47.9042418800743, 47.9042699,
47.9042628480543, 47.9043714203706, 47.9043726430267, 47.9043817,
47.9044869, 47.904556, 47.9046316, 47.9046973, 47.9047598,
47.9048584, 47.9048913, 47.904929926835, 47.905091361813,
47.9051055230089, 47.9053526208698, 47.9053847749184, 47.9055127,
47.9056212, 47.905779, 47.9058546, 47.9058705366607, 47.9060244265163,
47.9060551, 47.9063017, 47.9064727, 47.9066568, 47.9067784,
47.9069066, 47.9070578, 47.9073472, 47.9075444, 47.9077088,
47.9078074, 47.9078534, 47.9079784, 47.9082151, 47.9085734,
47.908889, 47.9092309, 47.9096549, 47.9099607, 47.9102795,
47.910628, 47.9107957, 47.9109206, 47.9108954758275, 47.9109873010389,
47.9111178, 47.9114301, 47.9116405, 47.9117523, 47.9117753,
47.9117851, 47.9118772, 47.912035, 47.9121369, 47.9122585,
47.9123220030709, 47.9123370889617, 47.9123944496325, 47.9124524,
47.9125412, 47.9125675, 47.9125182, 47.9123801, 47.9122716,
47.9121632, 47.9120382, 47.9119331, 47.9118607, 47.9118213,
47.9118303008509, 47.9118870891401, 47.9120020891835, 47.912339149265,
47.9126201, 47.9130047, 47.9133466, 47.91336122275, 47.9135534895254,
47.9138770229226, 47.9143100896659, 47.9144854897008, 47.9146608897442,
47.914847223146, 47.9150608898848, 47.915181489915, 47.9153294899422,
47.9155652233092, 47.9157736233352, 47.9158213291009, 47.9158316,
47.9160157, 47.9162227, 47.9162255024711, 47.9163218900585,
47.9169634234872, 47.9172812902113, 47.9174786902566, 47.9176212236281,
47.9179226237277, 47.9179232778767, 47.9179549, 47.9180568,
47.9180798, 47.9180601, 47.9180305, 47.9180503, 47.9179615,
47.9177807, 47.9175934, 47.9173896, 47.9173337, 47.9172318,
47.9171825, 47.9172121, 47.9172154, 47.9172581, 47.9174093,
47.9175375, 47.9175647, 47.9175244, 47.9174455, 47.9173764,
47.9172976, 47.9171957, 47.9171745115341, 47.9171800243304,
47.91735509111, 47.9174262911384, 47.9176180911817, 47.9175796911832,
47.9175028911765, 47.9173768911597, 47.9172232911295, 47.9171656229079,
47.9172064, 47.9172707, 47.9173271, 47.9172647, 47.9171293,
47.917028, 47.9170285, 47.9170071743006, 47.9168454909756,
47.9167690242483, 47.9167856241725, 47.9169109504792, 47.9169229,
47.9168966, 47.9167815, 47.9165711, 47.9164035, 47.9162819,
47.9160814, 47.915848, 47.915493, 47.9152268, 47.914977,
47.9146976, 47.9144938, 47.9142275, 47.9139119, 47.9135832,
47.9133696, 47.9130547, 47.9130414, 47.9130256, 47.9129109,
47.912876, 47.9128563, 47.912809, 47.9126982, 47.9126099,
47.9124332, 47.912274, 47.9121853, 47.9119939, 47.9118986,
47.9118319, 47.9116801, 47.9116418, 47.9115616, 47.9114581,
47.9113129, 47.9111292, 47.9109897, 47.9108692, 47.9107622,
47.9106454, 47.9104584, 47.9102735, 47.9100724, 47.9098539,
47.9096377, 47.9093431, 47.9090243, 47.9086906, 47.9084753,
47.908329, 47.9081958, 47.9081498, 47.9081301, 47.9080693,
47.9079854, 47.9078835, 47.9077027, 47.907397, 47.9071323,
47.9068973, 47.906603, 47.9064386, 47.9061691, 47.9057811,
47.9054178, 47.9051269, 47.9050447, 47.9047685, 47.9045811,
47.9044743, 47.9044348, 47.9042984, 47.9040452, 47.9040172,
47.9038595, 47.9036162, 47.9034682, 47.9033778, 47.9032364,
47.9030276, 47.9028501, 47.9025608, 47.9022369, 47.9020101,
47.9017766, 47.9015432, 47.9013903, 47.901216, 47.9011355,
47.90093, 47.9007557, 47.9007607, 47.9006061, 47.9005042,
47.9004762, 47.9003809, 47.9002954, 47.9002395, 47.9002362,
47.9003266, 47.9004532, 47.9004873160812, 47.900500087167,
47.9004949874836, 47.9004664, 47.9004335, 47.900473, 47.9004622455515,
47.9004283281704, 47.9003776, 47.9002891303963, 47.8999753835437,
47.8998861, 47.8996986, 47.8995309, 47.8993485, 47.8991462,
47.8988618, 47.8985199, 47.8983472, 47.8983138958077, 47.8982252197012,
47.8980518555498, 47.8979329, 47.897859, 47.8978031, 47.8977955597394,
47.8977810861952, 47.8977208194921, 47.897709886118, 47.8976878860846,
47.897561819355, 47.8975595747051, 47.8975515, 47.897544981667,
47.8974466859243, 47.8974630858855, 47.8974246858262, 47.8973808857752,
47.897340688442, 47.8972605, 47.8972342, 47.8972539, 47.8972936784333,
47.8972930856811, 47.8967586624906, 47.8965897, 47.8963349,
47.896223219558, 47.8958180185291, 47.8957936172163, 47.8956279,
47.8954619, 47.8952859, 47.8951284734619, 47.8951094373642,
47.8948732, 47.8947088, 47.8945214, 47.8944326, 47.8944211,
47.8943224, 47.8941515, 47.8939541, 47.8937075, 47.8935184,
47.89328, 47.8931567, 47.8928936, 47.8926371, 47.8924037,
47.8922261, 47.8917969, 47.8916358, 47.8915503, 47.8912773,
47.8910406, 47.8909057, 47.8908317, 47.8907956, 47.8908068570745,
47.8907892838896, 47.8907948172152, 47.8909098838893, 47.891173083924,
47.8914856172707, 47.8916828172311, 47.8916662838725, 47.891589417157,
47.8914248837694, 47.8913096837344, 47.8908380169599, 47.8907422491423,
47.8904815, 47.8902546, 47.8899718, 47.8898139, 47.8897235,
47.8897177232829, 47.8896096166873, 47.8892694944316, 47.8892187,
47.8891760337529, 47.8888787598872, 47.8888026, 47.8887056,
47.8886942874637, 47.8886770830852, 47.8886002830583, 47.8886110163257,
47.8885232162888, 47.8883256828838, 47.8879636827889, 47.8877020974913,
47.8876795294734, 47.8875276399351, 47.887469, 47.887423,
47.8874197, 47.8873918, 47.8873983, 47.8874312, 47.8874493,
47.8875578, 47.887742, 47.8878769, 47.8879065, 47.8879081,
47.8877716, 47.8876368, 47.8874592, 47.8872701, 47.8870399,
47.88678, 47.886609, 47.8864298, 47.8862061, 47.8860664,
47.8859562, 47.8857687, 47.8855977, 47.8855451, 47.8855188,
47.8855829, 47.8856059, 47.8856618, 47.8856931, 47.8857786,
47.8858772, 47.8859562, 47.8859726, 47.885966, 47.8859808,
47.8860121, 47.8861519, 47.8861502, 47.8861272, 47.8860779,
47.886091, 47.8861601, 47.8861963, 47.8862818, 47.8863936,
47.8863673, 47.8862407, 47.8860779, 47.8859693, 47.8858148,
47.8856306, 47.8854004, 47.8850863, 47.8847459, 47.8843989,
47.8840979, 47.8837657, 47.8834599, 47.8831836, 47.88295,
47.8828188278061, 47.882818016422, 47.8824890163731, 47.8824580084456,
47.8824123, 47.8821788, 47.8820357, 47.8819156, 47.8819063585682,
47.8808276160688, 47.8806356826937, 47.8805150826659, 47.8803012826071,
47.880169615898, 47.8801256825435, 47.8802188825238, 47.8802298158485,
47.8802242825032, 47.8802100305662, 47.880197, 47.8798829,
47.8796214, 47.8793911, 47.8791411945413, 47.8791276156322,
47.8789796156094, 47.8788534822475, 47.8784258154739, 47.8782886820997,
47.8780748153822, 47.8777566819846, 47.8771150818392, 47.8768462817684,
47.876539081672, 47.8760016815163, 47.8754202813714, 47.8752897008934,
47.8752464, 47.8748649, 47.8745507, 47.8743336, 47.8742974,
47.8742682792536, 47.8740720143034, 47.87406743067, 47.8739487,
47.8737299, 47.873521, 47.8732628, 47.8730292, 47.8727726,
47.8725588, 47.8723844, 47.8723423323796, 47.8722180138354,
47.8711866802439, 47.8707478801371, 47.8703914133898, 47.8701500133334,
47.8698922132708, 47.8697222132243, 47.8694423905185, 47.8694219,
47.8691275, 47.8690788876629, 47.8687622129944, 47.8682246795497,
47.8680822350128, 47.86805, 47.867823, 47.8676124, 47.8673805,
47.8671436, 47.8669659, 47.8666896, 47.8665497, 47.8662668,
47.8659624, 47.8656351, 47.8654948406902, 47.8654396791912,
47.8652202791435, 47.8650612124352, 47.864852679055, 47.8645456123263,
47.8637778788452, 47.8630922787162, 47.8626042786347, 47.8619242785149,
47.8614526784256, 47.8610852116856, 47.8607068782826, 47.8603010115362,
47.859955411452, 47.8595330113543, 47.8591216112716, 47.8586938111793,
47.8580300776891, 47.8577392109424, 47.8570370107599, 47.8566254773237,
47.8560876771718, 47.8558132770907, 47.8555004769874, 47.8553028102597,
47.8552370102428, 47.8548584768363, 47.8546008101166, 47.8542168767195,
47.8539044100085, 47.8537695875252, 47.853562, 47.8534601555129
), dim = c(11432L, 2L)))), class = c("XY", "MULTIPOLYGON",
"sfg"))), class = c("sfc_MULTIPOLYGON", "sfc"), precision = 0, bbox = structure(c(xmin = -89.2354767000503,
ymin = 47.82376, xmax = -88.4223296792445, ymax = 48.1910236
), class = "bbox"), crs = structure(list(input = "EPSG:4326",
wkt = "GEOGCRS[\"WGS 84\",\n ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n MEMBER[\"World Geodetic System 1984 (Transit)\"],\n MEMBER[\"World Geodetic System 1984 (G730)\"],\n MEMBER[\"World Geodetic System 1984 (G873)\"],\n MEMBER[\"World Geodetic System 1984 (G1150)\"],\n MEMBER[\"World Geodetic System 1984 (G1674)\"],\n MEMBER[\"World Geodetic System 1984 (G1762)\"],\n MEMBER[\"World Geodetic System 1984 (G2139)\"],\n MEMBER[\"World Geodetic System 1984 (G2296)\"],\n ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1]],\n ENSEMBLEACCURACY[2.0]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n CS[ellipsoidal,2],\n AXIS[\"geodetic latitude (Lat)\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n AXIS[\"geodetic longitude (Lon)\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n USAGE[\n SCOPE[\"Horizontal component of 3D system.\"],\n AREA[\"World.\"],\n BBOX[-90,-180,90,180]],\n ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = 1L, class = c("sf",
"tbl_df", "tbl", "data.frame"), sf_column = "geometry", agr = structure(c(id = NA_integer_,
objectid = NA_integer_, tnmid = NA_integer_, metasourceid = NA_integer_,
sourcedatadesc = NA_integer_, sourceoriginator = NA_integer_,
sourcefeatureid = NA_integer_, loaddate = NA_integer_, referencegnis_ids = NA_integer_,
areaacres = NA_integer_, areasqkm = NA_integer_, states = NA_integer_,
huc12 = NA_integer_, name = NA_integer_, hutype = NA_integer_,
humod = NA_integer_, tohuc = NA_integer_, noncontributingareaacres = NA_integer_,
noncontributingareasqkm = NA_integer_, globalid = NA_integer_,
place_id = NA_integer_, licence = NA_integer_, osm_type = NA_integer_,
osm_id = NA_integer_, lat = NA_integer_, lon = NA_integer_, class = NA_integer_,
type = NA_integer_, place_rank = NA_integer_, importance = NA_integer_,
addresstype = NA_integer_, name.1 = NA_integer_, display_name = NA_integer_
), class = "factor", levels = c("constant", "aggregate", "identity"
)))
isle_royale_datasets[['isle_royale_layer']] <- isle_royale_layer
# --- Source: spline.R ---
## $Id: spline.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## Support routines for future.meanvalue
###########################################################################################
spline.rate <- function( meanvalue, x )
{
coeff <- stats::coef( meanvalue )
for( i in 2:ncol( coeff ))
coeff[,i-1] <- i * coeff[,i]
coeff[,ncol( coeff ) ] <- 0
meanvalue$coefficients <- coeff
if( missing( x ))
stats::predict( meanvalue )
else
stats::predict( meanvalue, x )
}
###########################################################################################
spline.deriv <- function( s )
{
s$coefficients <- s$coefficients[,-1]
for( i in seq( 2, ncol( s$coefficients )))
s$coefficients[,i] <- s$coefficients[,i] * i
s
}
###########################################################################################
splinesum <- function( xy, fit = splines::interpSpline( xy$x, xy$y ),
log2 = log( 2 ), tol = 1e-5 )
{
n <- nrow( xy )
## mean time to future event (assume linear off end )
maxx <- xy[n,"x"]
mean.y <- maxx * mean( exp( - stats::predict( fit )$y )) + xy[1,"x"]
rate <- spline.rate( fit, maxx )$y
if( rate > tol )
mean.y <- mean.y + exp( - xy[n,"y"] ) / rate
## median time to future event
adiff <- diff( stats::coef( fit )[,1] )
## undefined if mean value function not monotone
if( !( all( adiff < 0) || all( adiff > 0 )))
median.y <- NA
else {
invmvalue <- splines::backSpline( fit )
median.y <- stats::predict( invmvalue, log2 )$y
if( is.na( median.y ))
median.y <- spline.extrapolate( fit, invmvalue, log2 )
}
c( mean = mean.y, median = median.y )
}
###########################################################################################
summaryshow <- function( xy, fit, col = "black", sums = splinesum( xy, fit ))
{
tmpar <- graphics::par( col = col )
graphics::mtext( paste( "mean =", round( sums[1], 2 )), 3, at = graphics::par("usr")[1], adj = 0 )
medianshow <- if( is.na( sums[2] ))
"curve not monotone"
else
paste( "median =", round( sums[2], 2 ))
graphics::mtext( medianshow, 3, at = graphics::par("usr")[2] / 1.25, adj = 1 )
graphics::par( tmpar )
invisible( sums )
}
###########################################################################################
curve.plot <- function( xy = seq(0,1,by=.25), y = c(0,.1,.5,.9,1),
z = graphics::locator(1,"n"), n=5, action="add",
fit = splines::interpSpline( xy$x, xy$y ),
backfit = TRUE, save.ends = 3, col = c("blue","red"), lwd = 4,
f = function( x ) x, finv = function( x ) x )
{
if( !is.list( xy )) {
xy <- data.frame( x = xy )
xy$y <- y
}
else
xy <- as.data.frame( xy )
if( !match( action, c("refresh","finish"), nomatch = 0 )) {
z <- as.data.frame(z)
tmp <- z$x > max( xy$x )
if( any( tmp )) {
if( all( tmp ))
return( xy )
z$x <- z$x[!tmp]
z$y <- z$y[!tmp]
}
}
remove.points <- function( xy, finv, save.ends = TRUE ) {
## find closest point after standardizing distances
usr <- graphics::par( "usr" )
tmp <- (( xy$x - z$x ) / diff( usr[1:2] )) ^ 2 +
(( xy$y - z$y ) / diff( usr[3:4] )) ^ 2
if( save.ends )
tmp <- tmp[ - c( 1, nrow( xy )) ]
tmp <- save.ends + min( seq( tmp )[ tmp == min( tmp ) ] )
tmpd <- xy[tmp,"y"]
tmpd <- finv( tmpd )
graphics::points( xy[tmp,"x"], tmpd, lwd = lwd, col = "white" )
tmp
}
for( i in 1:n) {
switch( action,
noaction =
return( xy )
,
add = {
graphics::points(z$x,z$y, lwd = lwd )
z$y <- f( z$y )
xy <- rbind(xy,z)
xy <- xy[order(xy$x),]
fit <- splines::interpSpline( xy$x, xy$y )
},
replace = {
graphics::points(z$x,z$y, lwd = lwd )
z$y <- f( z$y )
tmp <- remove.points( xy, finv, save.ends == 3 )
tmpp <- ( tmp > 1 & tmp < length( xy$x ))
if( save.ends != 2 | tmpp )
xy$x[tmp] <- z$x
if( save.ends != 1 | tmpp )
xy$y[tmp] <- z$y
fit <- splines::interpSpline( xy$x, xy$y )
},
delete = {
z$y <- f( z$y )
tmp <- remove.points( xy, finv, save.ends > 0 )
xy <- xy[-tmp,]
fit <- splines::interpSpline( xy$x, xy$y )
},
refresh =, finish = {
xy
}
)
tmpp <- stats::predict( fit )
graphics::lines( tmpp$x, finv( tmpp$y ), col = col[1], lwd = lwd )
adiff <- diff( stats::coef( fit )[,1] )
if( backfit & ( all( adiff < 0) || all( adiff > 0 ))) {
## backspline (not quite a spline) fit to inverse
tmpback <- stats::predict( splines::backSpline( fit ))
graphics::lines( tmpback$y, finv( tmpback$x ), col = col[2], lwd = lwd )
}
}
list( xy = xy[order(xy$x),], fit = fit )
}
###########################################################################################
cdf.lines <- function( data, fig = "mean value", nspline = 8,
conf = c(50,80,90,95), rescale = 1,
col = c("green","blue","red","orange") )
{
rate <- fig == "mean value"
n <- length( data )
data <- sort( data )
prob <- seq( n ) / ( n + 1 )
f <- - rescale * log( 1 - prob )
ylab <- "prob"
if( rate )
ylab <- "cum rate"
else
f <- 1 - exp( -f )
graphics::lines( data, f, lwd = 2 )
conf <- conf / 100
for( i in seq( length( conf ))) {
## lower confidence
tmp <- stats::qbinom( conf[i], n, prob, lower.tail = TRUE ) / ( n + 1 )
tmp <- 1 - exp( rescale * log( 1 - tmp ))
tmpna <- is.na( tmp )
if( any( tmpna ))
tmp[tmpna] <- f[1]
if( rate )
tmp <- - log( 1 - tmp )
graphics::lines( data, tmp, lty = 2, col = col[i] )
## upper confidence
tmp <- stats::qbinom( conf[i], n, prob, lower.tail = FALSE ) / ( n + 1 )
tmp <- 1 - exp( rescale * log( 1 - tmp ))
tmpna <- is.na( tmp )
if( any( tmpna ))
tmp[tmpna] <- f[n]
if( rate )
tmp <- - log( 1 - tmp )
graphics::lines( data, tmp, lty = 2, col = col[i] )
}
}
###########################################################################################
rspline <- function( meantime = 1,
fivepar = c(dispersion = 1, location = 0, intensity = 1, truncation = 0,
rejection = Inf ),
fit = NULL,
meanvalue = fit$meanvalue, invmvalue = fit$invmvalue,
span = Inf )
{
## dispersion = a, location = b, intensity = c
## truncation = -log(1-d), rejection = -log(1-e)
## y = a M^-1( G(d)+cV ) + b if 1 - exp( -cV ) < G(e)
## y = span if 1 - exp( -cV ) >= G(e)
## this is not quite right for truncation, as we know event happened before b
## if 1-exp(-cV) < d, but I am not sure how to pass that information along yet
default <- is.null( meanvalue )
## V ~ exp(1)
## intensity: V/c
## truncation: (G(d)+V)/c
rate <- ( fivepar["truncation"] + rexp( 1 )) / fivepar["intensity"]
## mean value inverse: M^-1( G(d)+V/c )
if( default )
y <- rate
else {
y <- stats::predict( invmvalue, rate )$y
## kludge to linearly extrapolate beyond cubic spline fit
if( is.na( y ))
y <- spline.extrapolate( meanvalue, invmvalue, rate )
}
## dispersion and location: y = a M^-1( cV ) + b
y <- meantime * fivepar["dispersion"] * y + fivepar["location"]
## rejection: y >= e? then set y to span
if( y > fivepar["rejection"] )
y <- span
y
}
###########################################################################################
spline.extrapolate <- function( meanvalue, invmvalue, x )
{
## linear extrapolation of inverse spline beyond upper end
coeff <- stats::coef( invmvalue )
nr <- nrow( coeff ) - 1
xknot <- splines::splineKnots( invmvalue )[nr+(0:1)]
yknot <- splines::splineKnots( meanvalue )[nr+1]
tmpr <- ( xknot[2] - xknot[1] )
slope <- coeff[nr,2] + tmpr * ( 2 * coeff[nr,3] + tmpr * 3 * coeff[nr,4] )
yknot + slope * ( x - xknot[2] )
}
###########################################################################################
### spline.design() is a prototype for designing spline curves
### Ultimately, pieces of spline.design, spline.temp() and spline.meanvalue()
### will be pulled out as subroutines to reduce code overlap
###########################################################################################
spline.design <- function (y = yinit, x = xinit, nspline = 8, xy = data.frame(x = x,
y = y), n = 1, horizontal = FALSE)
{
is.data <- !missing(y)
if (is.data) {
data <- y
if (missing(x))
x <- as.numeric(names(y))
datax <- x
ndata <- length(data)
choose <- round(seq(1, ndata, length = nspline))
xinit <- x <- x[choose]
yinit <- y <- y[choose]
}
else {
tmp <- seq(0, nspline - 1)
if (missing(x))
xinit <- tmp
else xinit <- x
if (missing(y))
yinit <- rep(50, nspline)
else yinit <- y
}
## plot curve and surrounding axes
graphics::par( mfrow = c(1,1), mar = rep(4.1,4))
plotit <- function( xy, fig = "temp", fit = splines::interpSpline( xy$x, xy$y ),
horizontal = FALSE, strip = .25, margin = .1 )
{
switch( fig, {
y <- xy$y
ylim <- range(y)
}
)
xlim <- range(xy$x)
xlim <- xlim + c(-1,1) * margin * diff( xlim )
if( horizontal ) {
if( diff( ylim ) == 0 )
ylim <- ylim * c(.75,1.25)
separator <- ylim[2]
ylim[2] <- ylim[2] + strip * diff( ylim )
}
else {
separator <- xlim[2]
xlim[2] <- xlim[2] + strip * diff( xlim )
}
axt <- c("n","s")
tmpar <- graphics::par( xaxt = axt[1+horizontal], yaxt = axt[2-horizontal] )
plot( xy$x, y, xlim = xlim, ylim = ylim, type="n", xlab = "", ylab = "" )
graphics::par( xaxt = "s", yaxt = "s" )
graphics::points( xy$x, y, lwd = 4 )
graphics::title( fig )
graphics::mtext( "time", 1, 2 )
graphics::mtext( fig, 2, 2 )
if( horizontal ) {
p <- pretty( c(ylim[1],separator) )
graphics::axis( 2, p[ p <= separator ] )
graphics::abline( h = separator, lty = 2 )
}
else {
p <- pretty( c(xlim[1],separator) )
graphics::axis( 1, p[ p <= separator ] )
graphics::abline( v = separator, lty = 2 )
}
curve.plot( xy, n = n, action = "refresh", fit = fit, backfit = FALSE,
save.ends = 0 )
separator
}
## place commands along right strip of plot, highlighting current command
plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
horizontal = TRUE )
{
ans <- c( ans, fig )
tmp <- is.na( match( cmds, ans ))
if( any( tmp )) for( i in unique( cmdlocs$adj )) {
tmpi <- tmp & i == cmdlocs$adj
if( any( tmpi ))
graphics::text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = rest, adj = i )
}
if( any( !tmp )) for( i in unique( cmdlocs$adj )) {
tmpi <- !tmp & i == cmdlocs$adj
if( any( tmpi ))
graphics::text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = col, adj = i )
}
}
cmds <- c("add","delete","replace","","finish","restart","refresh","rescale",
"","data","temp")
newlocs <- if( horizontal )
function( cmds, data = FALSE, usr )
{
if( !data )
cmds <- cmds[ cmds != "data" ]
n <- length( cmds )
blank <- seq( n )[ cmds == "" | cmds == " " ]
tmp <- diff(usr[3:4]) / 20
m <- mean( usr[1:2] )
y <- usr[4] + 0.5 * tmp - c( tmp * seq( blank[1] - 1 ), 0,
tmp * seq( blank[2] - blank[1] - 1 ), 0,
tmp * seq( n - blank[2] ))
x <- c( rep( usr[1], blank[1] - 1 ), mean( m, usr[1] ),
rep( m, blank[2] - blank[1] - 1 ), mean( m, usr[2] ),
rep( usr[2], n - blank[2] ))
adj <- c( rep( 0, blank[1] ),
rep( 0.5, blank[2] - blank[1] ),
rep( 1, n - blank[2] ))
tmp <- data.frame( x = x, y = y, adj = adj )
cmds[blank[2]] <- " "
row.names( tmp ) <- cmds
tmp
}
else
function( cmds, data = FALSE, usr )
{
if( !data )
cmds <- cmds[ cmds != "data" ]
n <- length( cmds )
blank <- seq( n )[ cmds == "" ]
tmp <- diff(usr[3:4]) / 20
m <- mean( usr[3:4] )
tmp <- c( usr[4] - tmp * seq( blank[1] - 1 ),
mean( m, usr[4] ),
m + tmp * ( seq( blank[1] + 1, blank[2] - 1 ) - mean( blank )),
mean( m, usr[3] ),
usr[3] + tmp * seq( n - blank[2] ))
tmp <- data.frame( x = rep( usr[2], n ), y = tmp, adj = rep( 1, n ))
cmds[blank[2]] <- " "
row.names( tmp ) <- cmds
tmp
}
fig <- "temp"
newans <- ans <- "replace"
graphics::par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
fit <- splines::interpSpline( xy$x, xy$y )
separator <- plotit( xy, fig, fit, horizontal )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
cmds <- row.names( cmdlocs )
plotcmd( ans, fig, cmds, cmdlocs, usr )
use.data <- FALSE
rescale.data <- 1
repeat {
## get command from plot using cursor
z <- graphics::locator(1,"n")
if(( !horizontal & z$x > separator ) | ( horizontal * z$y > separator )) {
if( horizontal ) { # need to look at both z&y
x <- abs( z$x - cmdlocs$x )
x <- x == min( x )
newans <- cmds[x]
z <- abs( z$y - cmdlocs$y )[x]
newans <- newans[ z == min( z ) ][1]
}
else {
z <- abs(z$y - cmdlocs$y )
newans <- cmds[ z == min( z ) ][1]
}
switch( newans,
finish =, refresh = {
separator <- plotit( xy, fig, fit, horizontal )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
data = {
use.data <- is.data & !use.data
if( is.data & !use.data )
plotit( xy, fig, fit, horizontal )
},
temp = {
fig <- newans
separator <- plotit( xy, fig, fit, horizontal )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
rescale = {
cat( "enter new values followed by RETURN key\n" )
tmpy <- readline( paste( "maximum ", fig, "(",
round( max( xy$y ), 2 ), "):", sep = "" ))
if( tmpy != "" ) {
tmpy <- suppressWarnings(as.numeric( tmpy )) / max( xy$y )
xy$y <- tmpy * xy$y
if( is.data )
rescale.data <- rescale.data * tmpy
}
tmpx <- readline( paste( "maximum time(",
round( max( xy$x ), 2 ), "):", sep = "" ))
if( tmpx != "" ) {
tmpx <- suppressWarnings(as.numeric( tmpx )) / max( xy$x )
xy$x <- tmpx * xy$x
}
fit <- splines::interpSpline( xy$x, xy$y )
separator <- plotit( xy, fig, fit, horizontal )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
restart = {
if( is.data )
rescale.data <- 1
xy <- data.frame( x = xinit, y = yinit )
fit <- splines::interpSpline( xy$x, xy$y )
separator <- plotit( xy, fig, fit, horizontal )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
add =, delete =, replace = {
ans <- newans
}
)
if( use.data ) {
rx <- range( xy$x )
dx <- range( datax )
graphics::lines( rx[1] + ( datax - dx[1] ) * diff( rx ) / diff( dx ), data * rescale.data )
}
plotcmd( ans, fig, cmds, cmdlocs, usr )
}
else {
fit <- curve.plot( xy, n = n, action = ans, z = z, fit = fit, backfit = FALSE,
save.ends = 0 )
xy <- fit$xy
fit <- fit$fit
ans <- "replace"
plotcmd( ans, fig, cmds, cmdlocs, usr )
}
if( newans == "finish" )
break
}
plotcmd( newans, fig, cmds, cmdlocs, "red" )
tmp <- curve.plot( xy, n = n, action = "refresh", backfit = FALSE, save.ends = 0 )
tmp
}
# --- Source: triangle.R ---
## $Id: triangle.R,v 0.9 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## rtri( n, width )
##
## plot.current( x, species )
## text.current( x, species )
##
###########################################################################################
###########################################################################################
### Tridiagonal Coordinate System S3 Classes & Algebra
###########################################################################################
tricoord <- function(a, b = NULL, c = NULL) {
if (is.data.frame(a) && all(c("a", "b", "c") %in% names(a))) {
res <- a
} else if (is.matrix(a) && ncol(a) == 3) {
res <- as.data.frame(a)
names(res) <- c("a", "b", "c")
} else if (!is.null(b) && !is.null(c)) {
res <- data.frame(a = a, b = b, c = c)
} else if (is.numeric(a) && length(a) == 3) {
res <- data.frame(a = a[1], b = a[2], c = a[3])
} else {
stop("Invalid tricoord input format")
}
class(res) <- c("tricoord", "data.frame")
res
}
`+.tricoord` <- function(e1, e2) {
# Handle vector offsets cleanly
if (is.numeric(e2) && length(e2) == 3) {
tricoord(e1$a + e2[1], e1$b + e2[2], e1$c + e2[3])
} else if (inherits(e2, "tricoord")) {
tricoord(e1$a + e2$a, e1$b + e2$b, e1$c + e2$c)
} else {
stop("Invalid right hand operand for tricoord addition")
}
}
`-.tricoord` <- function(e1, e2) {
if (is.numeric(e2) && length(e2) == 3) {
tricoord(e1$a - e2[1], e1$b - e2[2], e1$c - e2[3])
} else if (inherits(e2, "tricoord")) {
tricoord(e1$a - e2$a, e1$b - e2$b, e1$c - e2$c)
} else {
stop("Invalid right hand operand for tricoord subtraction")
}
}
###########################################################################################
rtri <- function( n, width, tri = matrix(0,3,n), roundoff = TRUE )
{
tri <- as.matrix( tri )
if( n == 1 ) {
xy <- stats::runif( 2, 0, width )
if( roundoff )
xy <- round( xy )
i <- sample( 3, 1 )
i1 <- 1 + i%%3
i2 <- 1 + (i+1)%%3
tri[i1,] <- tri[i1,] + xy[1]
tri[i2,] <- tri[i2,] - xy[2]
tri[i,] <- - ( tri[i1,] + tri[i2,] )
return( tri )
}
else {
xy <- data.frame( x = stats::runif( n, 0, width ),
y = - stats::runif( n, 0, width ))
if( roundoff )
xy <- round( xy )
out <- sample( 3, n, replace = TRUE )
for( i in 1:3 ) {
outi <- out == i
if( any( outi )) {
i1 <- 1 + i%%3
i2 <- 1 + (i+1)%%3
tri[i1,outi] <- tri[i1,outi] + xy$x[outi]
tri[i2,outi] <- tri[i2,outi] + xy$y[outi]
tri[i,outi] <- - ( tri[i1,outi] + tri[i2,outi] )
}
}
}
tri
}
###########################################################################################
car2tri.default <- function(x,y)
car2tri( cbind( x, y ))
car2tri <- function( xy, xmult = ( 2 + sq3 ) / 4, ymult = ( 3 + 2 * sq3 ) / 12,
sq3 = sqrt( 3 ))
{
# if( !is.matrix( xy ))
# xy <- t( as.matrix( xy ))
aa <- xmult * xy[,1] - ymult * xy[,2]
bb <- - xmult * xy[,1] - ymult * xy[,2]
cc <- -( aa + bb )
rbind( a = aa, b = bb, c = cc )
}
###########################################################################################
tri2car.default <- function(aa,bb,cc=-(aa+bb))
tri2car( rbind( aa, bb, cc ))
tri2car <- function(tri, xmult = 2 / ( 2 + sq3 ), ymult = 6 / ( 3 + 2 * sq3 ),
sq3 = sqrt( 3 ))
{
if( inherits(tri, "tricoord") ) {
# If the user passes our S3 tricoord dataframe, map it correctly natively.
x <- ( tri$a - tri$b ) * xmult
y <- - ( tri$a + tri$b ) * ymult
} else {
if( !is.matrix( tri ))
tri <- as.matrix( tri )
x <- ( tri[1,] - tri[2,] ) * xmult
y <- - ( tri[1,] + tri[2,] ) * ymult
}
data.frame( x = x, y = y )
}
###########################################################################################
cardist <- function( xy )
sqrt( xy[,1]^2 + xy[,2]^2 )
###########################################################################################
tridist <- function( tri )
apply( tri, 1, max )
###########################################################################################
gasket <- function( aa, bb )
{
n <- length( aa )
pp <- c(-1,1,0,1)
dda <- diff( aa )
ddb <- diff( bb )
ss <- sign( sign( dda ) - sign( ddb ))
dda <- 2 - abs( dda )
ddb <- 2 - abs( ddb )
aa <- 2 * aa
aa <- c( aa[1], rbind( aa[-n] + pp[dda+1+ss], aa[-1] + pp[dda+1-ss], aa[-1] ))
bb <- 2 * bb
bb <- c( bb[1], rbind( bb[-n] + pp[ddb+1-ss], bb[-1] + pp[ddb+1+ss], bb[-1] ))
data.frame( aa = aa, bb = bb )
}
# --- Source: substrate_triangle.R ---
get_substrate_grid <- function(width, step = 1, orientation = "up") {
pts <- expand.grid(a = seq(0, width - step, by = step),
b = seq(0, width - step, by = step))
if (orientation == "up") {
pts <- subset(pts, a + b <= width - step)
pts$c <- -(pts$a + pts$b)
} else {
pts <- subset(pts, a + b <= width - step)
pts$a <- -pts$a
pts$b <- -pts$b
pts$c <- -(pts$a + pts$b)
}
return(pts)
}
substrate_topology <- function(width = 10, step = 1) {
W <- width - step
# Topology adjacency offsets
list(
fr2 = list(offset = c(0, 0, 0), dir = "down"),
fr1 = list(offset = c(-W, -W, 2*W), dir = "up"),
fr3 = list(offset = c(-W, 0, W), dir = "up"),
fr4 = list(offset = c(0, -W, W), dir = "up"),
tw1 = list(offset = c(-W, 0, W), dir = "down"),
twig = list(offset = c(-W, 0, W), dir = "down"),
tw2 = list(offset = c(-2*W, 0, 2*W), dir = "up"),
lftop = list(offset = c(-2*W, W, W), dir = "down"),
lfbot = list(offset = c(-3*W, W, 2*W), dir = "up")
)
}
create_substrate <- function(topology, width = 10, step = 1) {
W <- width - step
all_points <- data.frame()
labels_df <- data.frame()
poly_df <- data.frame()
for (sub in names(topology)) {
cfg <- topology[[sub]]
grid <- get_substrate_grid(width, step, cfg$dir)
o_a <- cfg$offset[1]
o_b <- cfg$offset[2]
o_c <- cfg$offset[3]
# Needs tricoord and tri2car which are presumably exported/available from R/triangle.R
grid_tri <- tricoord(grid$a, grid$b, grid$c)
grid_tri <- grid_tri + cfg$offset
car_pts <- tri2car(grid_tri)
car_pts$substrate <- sub
all_points <- rbind(all_points, car_pts)
# Determine bounds and midpoints for side labels 1,2,3
if (cfg$dir == "up") {
v_top <- c(o_a, o_b, o_c)
v_br <- c(o_a + W, o_b, o_c - W)
v_bl <- c(o_a, o_b + W, o_c - W)
m1 <- (v_top + v_bl) / 2
m2 <- (v_top + v_br) / 2
m3 <- (v_bl + v_br) / 2
centroid <- (v_top + v_br + v_bl) / 3
p_mat <- cbind(v_top, v_br, v_bl)
} else {
v_bot <- c(o_a, o_b, o_c)
v_tr <- c(o_a, o_b - W, o_c + W)
v_tl <- c(o_a - W, o_b, o_c + W)
m1 <- (v_bot + v_tr) / 2
m2 <- (v_bot + v_tl) / 2
m3 <- (v_tl + v_tr) / 2
centroid <- (v_bot + v_tr + v_tl) / 3
p_mat <- cbind(v_bot, v_tr, v_tl)
}
# Interpolate slightly towards the centroid to put text "just inside" the edges
w_in <- 0.25 # weight towards centroid
l1 <- m1 * (1 - w_in) + centroid * w_in
l2 <- m2 * (1 - w_in) + centroid * w_in
l3 <- m3 * (1 - w_in) + centroid * w_in
mat_l <- cbind(l1, l2, l3)
car_l <- tri2car(mat_l)
car_l$label <- c("1", "2", "3")
car_l$substrate <- sub
labels_df <- rbind(labels_df, car_l)
car_p <- tri2car(p_mat)
car_p$substrate <- sub
poly_df <- rbind(poly_df, car_p)
}
centers <- stats::aggregate(cbind(x,y) ~ substrate, data=all_points, mean)
obj <- list(
points = all_points,
labels = labels_df,
poly = poly_df,
centers = centers,
topology = topology
)
class(obj) <- "substrate"
return(obj)
}
autoplot.substrate <- function(object, ...) {
ggplot2::ggplot() +
# Draw the black boundary lines outlining the substrates exactly over outer dots
ggplot2::geom_polygon(data=object$poly, ggplot2::aes(x=x, y=y, group=substrate), fill=NA, color="black", linewidth=0.7) +
# Plot grid dots
ggplot2::geom_point(data=object$points, ggplot2::aes(x=x, y=y, color=substrate), size=1.5) +
# Plot Substrate Labels (Centers)
ggplot2::geom_text(data=object$centers, ggplot2::aes(x=x, y=y, label=substrate), color="black", fontface="bold", size=5) +
# Axis side numbers
ggplot2::geom_text(data=object$labels, ggplot2::aes(x=x, y=y, label=label), color="darkred", fontface="bold", size=4) +
ggplot2::theme_void() +
ggplot2::coord_fixed() +
ggplot2::ggtitle("Ewing Tridiagonal Substrate Network Mapping")
}
create_hex_overlay <- function(object, step = 1) {
pts <- if (inherits(object, "substrate")) object$points else object
if (is.null(pts) || nrow(pts) == 0) return(data.frame())
xmult <- 2 / (2 + sqrt(3))
ymult <- 6 / (3 + 2 * sqrt(3))
d <- step * sqrt(xmult^2 + ymult^2)
r <- d / sqrt(3)
angles <- (seq(0, 5) * 60 + 30) * pi / 180
dx <- r * cos(angles)
dy <- r * sin(angles)
n_pts <- nrow(pts)
hex_list <- vector("list", n_pts)
for (i in seq_len(n_pts)) {
px <- pts$x[i] + dx
py <- pts$y[i] + dy
sub <- pts$substrate[i]
hex_list[[i]] <- data.frame(
x = px,
y = py,
cell_id = i,
substrate = sub,
stringsAsFactors = FALSE
)
}
do.call(rbind, hex_list)
}
# --- Source: ewing_substrate.R ---
ewing_substrate <- function( community,
species,
headstuff = c( 0, "start", sum( to.plot )),
units = getOrgFeature( community, species[1], "units" ),
right = species[1], adj = c(0,.5,1),
show_sub = NULL,
step = 0,
layout = c("facet", "hex"),
width = 10,
step_density = 1,
rescale = TRUE,
x_var = c("step", "time"),
...)
{
x_var <- match.arg(x_var)
if (inherits(community, "isle_royale_sim")) {
p_map <- autoplot(community$habitat_overlay, show_landmarks = TRUE)
moose_sf <- sf::st_as_sf(community$moose_pop, coords = c("lon", "lat"), crs = sf::st_crs(community$habitat_overlay$layer))
wolf_sf <- sf::st_as_sf(community$wolf_pop, coords = c("lon", "lat"), crs = sf::st_crs(community$habitat_overlay$layer))
hdr_str <- if (x_var == "step") paste0("Step ", community$nstep) else paste0("Time Units ", community$nstep)
p_map <- p_map +
ggplot2::geom_sf(data = moose_sf, color = "#27ae60", shape = 21, fill = NA, stroke = 1.0, size = 0.8, alpha = 0.85) +
ggplot2::geom_sf(data = wolf_sf, color = "#e74c3c", shape = 21, fill = NA, stroke = 1.4, size = 1.5, alpha = 0.95) +
ggplot2::ggtitle(paste0("Isle Royale Substrate Plot (", hdr_str, ")"))
return(p_map)
}
layout <- match.arg(layout)
if (length(species) > 1) {
res_list <- lapply(species, function(sp) {
df <- ewing_substrate(community = community, species = sp, headstuff = headstuff,
units = units, right = right, adj = adj, show_sub = show_sub,
step = step, layout = layout, width = width, step_density = step_density,
rescale = rescale, ...)
if (!is.null(df) && nrow(df) > 0) {
df$species <- sp
}
df
})
res_list <- res_list[!sapply(res_list, is.null)]
if (length(res_list) == 0) return(NULL)
combined <- do.call(rbind, res_list)
attr(combined, "species") <- paste(species, collapse = " & ")
step_val <- if (!is.null(community$step)) community$step else if (!is.null(community$count$step)) community$count$step else if (!is.null(attr(community, "nstep"))) attr(community, "nstep") else step
attr(combined, "step") <- step_val
attr(combined, "layout") <- layout
attr(combined, "width") <- width
attr(combined, "step_density") <- step_density
class(combined) <- c("ewing_substrate", class(combined))
return(combined)
}
## plot current stages for species (except random parasites)
organism <- get.species( community, species )[,-1]
if(is.null(organism)) # species is not in community
return(NULL)
future <- getOrgFuture( community, species, c("color","pch") )
# Substrate names mapping (e.g. fr1, fr2, fr3, fr4, twig, lftop, lfbot)
substrate_feat <- getOrgFeature( community, species, "substrate")
sub_interact <- getOrgInteract(community, substrate_feat, species)
substrates <- rownames(sub_interact)
if (is.null(substrates) || length(substrates) == 0) {
substrates <- names(getOrgInteract(community, substrate_feat, substrate_feat))
}
if (is.null(show_sub)) show_sub <- substrates
position <- paste( "pos", letters[1:3], sep = "." )
if (layout == "hex") {
topo <- substrate_topology(width = width, step = step_density)
n_org <- ncol(organism)
gx <- numeric(n_org)
gy <- numeric(n_org)
sub_indices <- organism["sub.stage", ]
org_sub_names <- substrates[sub_indices]
# Process organisms per substrate patch to rescale local coordinates into substrate surface triangle
unique_subs <- unique(org_sub_names)
for (sub in unique_subs) {
idx <- which(org_sub_names == sub)
target_name <- sub
if (!target_name %in% names(topo)) {
if (target_name == "twig") target_name <- "tw1"
if (target_name == "tw1") target_name <- "twig"
}
cfg <- topo[[target_name]]
pa <- organism["pos.a", idx]
pb <- organism["pos.b", idx]
pc <- organism["pos.c", idx]
if (!is.null(cfg)) {
# Determine substrate surface width (allows substrates of different sizes in future)
W_sub <- if (!is.null(cfg$width)) (cfg$width - step_density) else (width - step_density)
if (rescale) {
amin <- min(pa); amax <- max(pa)
bmin <- min(pb); bmax <- max(pb)
u <- if (amax > amin) (pa - amin) / (amax - amin) else rep(0.5, length(idx))
v <- if (bmax > bmin) (pb - bmin) / (bmax - bmin) else rep(0.5, length(idx))
# 15% inner padding to ensure symbols sit comfortably inside substrate polygon borders
u_m <- 0.15 + 0.70 * u
v_m <- 0.15 + 0.70 * v
a_p <- u_m * W_sub
b_p <- v_m * (W_sub - a_p)
c_p <- -(a_p + b_p)
} else {
a_p <- pa
b_p <- pb
c_p <- pc
}
off <- cfg$offset
if (cfg$dir == "up") {
ga <- a_p + off[1]
gb <- b_p + off[2]
gc <- c_p + off[3]
} else {
ga <- -a_p + off[1]
gb <- -b_p + off[2]
gc <- -c_p + off[3]
}
car <- tri2car(tricoord(ga, gb, gc))
gx[idx] <- car$x
gy[idx] <- car$y
} else {
car <- tri2car(organism[position, idx, drop = FALSE])
gx[idx] <- car$x
gy[idx] <- car$y
}
}
xy <- data.frame(x = gx, y = gy)
} else {
xy <- tri2car( organism[position,] )
}
dat <- dplyr::filter(
dplyr::mutate(
tibble::tibble(xy),
stage = organism["stage",],
substrate = substrates[organism["sub.stage",]],
pchar = factor(as.character( future$pch[.data$stage + 1] ), levels = unique(as.character(future$pch))),
color = as.character( future$color[.data$stage + 1] ),
species = species),
.data$substrate %in% show_sub)
attr(dat, "species") <- species
step_val <- if (!is.null(community$step)) community$step else if (!is.null(community$count$step)) community$count$step else if (!is.null(attr(community, "nstep"))) attr(community, "nstep") else step
attr(dat, "step") <- step_val
attr(dat, "layout") <- layout
attr(dat, "width") <- width
attr(dat, "step_density") <- step_density
class(dat) <- c("ewing_substrate", class(dat))
dat
}
ggplot_ewing_substrate <- function(object,
xlab = "horizontal", ylab = "vertical",
layout = attr(object, "layout"),
width = attr(object, "width"),
step_density = attr(object, "step_density"),
layers = c("poly", "hex", "organisms", "centers", "labels"),
...)
{
if (inherits(object, "ggplot")) return(object)
if (is.null(layout)) layout <- "facet"
if (is.null(width)) width <- 10
if (is.null(step_density)) step_density <- 1
species <- attr(object, "species")
step <- attr(object, "step")
# Allows same color for different pchar, but only one color per pchar.
tmp <- dplyr::arrange(
dplyr::distinct(
dplyr::distinct(object, .data$pchar, .data$color),
.data$pchar, .keep_all = TRUE),
.data$pchar)
col.palate <- tmp$color
names(col.palate) <- as.character(tmp$pchar)
if (layout == "hex") {
topo <- substrate_topology(width = width, step = step_density)
sub_obj <- create_substrate(topo, width = width, step = step_density)
hex_overlay <- create_hex_overlay(sub_obj, step = step_density)
p <- ggplot2::ggplot()
if ("poly" %in% layers && nrow(sub_obj$poly) > 0) {
p <- p + ggplot2::geom_polygon(data = sub_obj$poly, ggplot2::aes(x = x, y = y, group = substrate),
fill = NA, color = "black", linewidth = 0.7)
}
if ("hex" %in% layers && nrow(hex_overlay) > 0) {
p <- p + ggplot2::geom_polygon(data = hex_overlay, ggplot2::aes(x = x, y = y, group = cell_id),
fill = NA, color = "gray75", linewidth = 0.3)
}
if ("organisms" %in% layers && nrow(object) > 0) {
p <- p + ggplot2::geom_text(data = object, ggplot2::aes(x = x, y = y, label = pchar, color = pchar),
fontface = "bold", size = 4) +
ggplot2::scale_color_manual(name = "Stage", values = col.palate) +
ggplot2::guides(color = ggplot2::guide_legend(override.aes = list(label = names(col.palate))))
}
if ("centers" %in% layers && nrow(sub_obj$centers) > 0) {
p <- p + ggplot2::geom_text(data = sub_obj$centers, ggplot2::aes(x = x, y = y, label = substrate),
color = "black", fontface = "bold", size = 4.5)
}
if ("labels" %in% layers && nrow(sub_obj$labels) > 0) {
p <- p + ggplot2::geom_text(data = sub_obj$labels, ggplot2::aes(x = x, y = y, label = label),
color = "darkred", fontface = "bold", size = 3.5)
}
return(p + ggplot2::theme_void() +
ggplot2::theme(plot.margin = ggplot2::margin(2, 2, 2, 2, "pt")) +
ggplot2::coord_fixed() +
ggplot2::ggtitle(paste(species, "on Hex Substrate Grid at", step, "steps")))
}
# Default Facet View by Substrate Component
ggplot2::ggplot(object) +
ggplot2::aes(.data$x, .data$y, label = .data$pchar, col = .data$pchar) +
ggplot2::geom_text() +
ggplot2::facet_wrap(~ substrate) +
ggplot2::xlab(xlab) +
ggplot2::ylab(ylab) +
ggplot2::scale_color_manual(name = "Stage", values = col.palate) +
ggplot2::guides(color = ggplot2::guide_legend(override.aes = list(label = names(col.palate)))) +
ggplot2::ggtitle(paste(species, "on substrate at", step, "steps"))
}
autoplot.ewing_substrate <- function(object, ...)
ggplot_ewing_substrate(object, ...)
# --- Source: ewing_ageclass.R ---
ewing_ageclass <- function(community, substrate = TRUE, total = TRUE,
normalize = TRUE, ...) {
nsim_val <- NULL
nstep_val <- NULL
if (inherits(community, "isle_royale_sim")) {
if (is.null(community$history) || nrow(community$history) == 0) return(NULL)
out <- community$history
if (!substrate) {
out <- dplyr::filter(out, .data$Type != "substrate")
}
if (total) {
tot <- dplyr::mutate(
dplyr::ungroup(
dplyr::summarize(
dplyr::group_by(out, .data$Species, .data$step, .data$time, .data$Type),
Count = sum(.data$Count),
.groups = "drop"
)
),
State = "total"
)
out <- dplyr::bind_rows(out, tot)
}
if (normalize) {
out <- dplyr::ungroup(
dplyr::mutate(
dplyr::group_by(out, .data$Species, .data$State, .data$Type),
Count = {
m <- max(.data$Count, na.rm = TRUE)
if (!is.na(m) && m > 0) .data$Count / m else 0
}
)
)
}
ordered_levels <- unique(c("calf", "yearling", "adult", "senior", "pup", "subadult", "total"))
out$State <- factor(out$State, levels = ordered_levels[ordered_levels %in% unique(out$State)])
attr(out, "nstep") <- community$nstep
attr(out, "units") <- "days"
class(out) <- c("ewing_ageclass", class(out))
return(out)
}
if (inherits(community, "ewing_discrete")) {
nsim_val <- attr(community, "nsim")
nstep_val <- attr(community, "nstep")
community <- community[[1]]
}
count <- readCount(community)
if(!length(count)) return(NULL)
species <- names(count)
if(is.null(species)) return(NULL)
ageclass <- list()
for( i in species ) {
ageclass[[i]] <- levels( getOrgFuture( community, i, "ageclass" ))
}
substrates <- list()
for( i in species ) {
substrates[[i]] <- levels( getOrgInteract( community,, i, "substrate" ))
}
out <- list()
for(i in species) {
out[[i]] <- dplyr::mutate(
tidyr::pivot_longer(
tibble::tibble(
as.data.frame(count[[i]])),
dplyr::any_of(c(ageclass[[i]], substrates[[i]])),
names_to = "State",
values_to = "Count"),
Type = ifelse(.data$State %in% substrates[[i]], "substrate", "ageclass"))
}
out <- dplyr::bind_rows(out, .id = "Species")
if(!substrate) {
out <- dplyr::filter(out, .data$Type != "substrate")
}
if(total) {
tot <- dplyr::mutate(
dplyr::ungroup(
dplyr::summarize(
dplyr::group_by(
out,
.data$Species, .data$step, .data$time, .data$future, .data$Type),
Count = sum(.data$Count),
.groups = "drop")
),
State = "total")
out <- dplyr::bind_rows(out, tot)
}
if(normalize) {
out <- dplyr::ungroup(
dplyr::mutate(
dplyr::group_by(
out,
.data$Species, .data$State, .data$Type),
Count = {
m <- max(.data$Count, na.rm = TRUE)
if (!is.na(m) && m > 0) .data$Count / m else 0
}))
}
subs <- if (substrate) unlist(substrates) else NULL
if (length(species) > 1) {
ordered_levels <- unique(c(ageclass[[species[1]]], "total", unlist(ageclass[species[-1]]), subs))
} else {
ordered_levels <- unique(c(unlist(ageclass), "total", subs))
}
out$State <- factor(out$State, levels = ordered_levels)
attr(out, "nstep") <- if (!is.null(nstep_val)) nstep_val else attr(community, "nstep")
if (is.null(attr(out, "nstep")) && !is.null(out$step)) {
attr(out, "nstep") <- max(out$step, na.rm = TRUE)
}
attr(out, "nsim") <- if (!is.null(nsim_val)) nsim_val else attr(community, "nsim")
attr(out, "units") <- if (inherits(community, "isle_royale_sim")) "days" else tryCatch(getOrgFeature(community, species[1], "units"), error = function(e) "time")
class(out) <- c("ewing_ageclass", class(out))
out
}
ggplot_ewing_ageclass <- function(object, main = NULL, title = NULL, x_var = c("step", "time"), time_unit = NULL, ... )
{
x_var <- match.arg(x_var)
if (is.null(time_unit)) {
time_unit <- attr(object, "units")
}
if (is.null(time_unit) || is.na(time_unit) || time_unit == "NA") {
time_unit <- "time"
}
if (is.null(title)) title <- main
if (is.null(title)) {
nstep <- attr(object, "nstep")
if (is.null(nstep) && !is.null(object$step)) {
nstep <- max(object$step, na.rm = TRUE)
}
nsim <- attr(object, "nsim")
unit_str <- if (x_var == "step") "steps" else time_unit
time_hdr <- if (x_var == "step") "Steps" else paste0(toupper(substring(time_unit, 1, 1)), substring(time_unit, 2))
if (!is.null(nstep)) {
if (!is.null(nsim) && nsim > 1) {
title <- paste0("Age Classes over ", time_hdr, " (", nstep, " ", unit_str, ", nsim = ", nsim, ")")
} else {
title <- paste0("Age Classes over ", time_hdr, " (", nstep, " ", unit_str, ")")
}
} else {
title <- paste0("Age Classes over ", time_hdr)
}
}
species_vec <- unique(as.character(object$Species))
if (length(species_vec) == 0) species_vec <- "Organism"
p_list <- list()
for (sp in species_vec) {
df_sp <- object[object$Species == sp, , drop = FALSE]
if (is.factor(df_sp$State)) {
df_sp$State <- droplevels(df_sp$State)
}
x_col <- if (x_var == "step" && "step" %in% names(df_sp)) "step" else "time"
x_lbl <- if (x_var == "step") "steps" else time_unit
sp_title <- paste(toupper(substring(sp, 1, 1)), substring(sp, 2), " Age Classes", sep = "")
p_sub <- ggplot2::ggplot(df_sp, ggplot2::aes(x = .data[[x_col]], y = .data$Count, col = .data$State, group = .data$State)) +
ggplot2::geom_step(na.rm = TRUE, linewidth = 0.8) +
ggplot2::geom_point(size = 2, na.rm = TRUE) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = sp_title,
x = x_lbl,
y = "Count",
color = "Age Class"
) +
ggplot2::theme(
plot.title = ggplot2::element_text(size = 11, face = "bold", hjust = 0.5),
legend.position = "right"
)
p_list[[sp]] <- p_sub
}
if (length(p_list) == 1) {
return(p_list[[1]] + ggplot2::ggtitle(title))
}
grid_plots <- cowplot::plot_grid(plotlist = p_list, ncol = length(p_list), align = "h")
title_widget <- cowplot::ggdraw() +
cowplot::draw_label(title, fontface = 'bold', x = 0.5, hjust = 0.5, size = 13)
cowplot::plot_grid(title_widget, grid_plots, ncol = 1, rel_heights = c(0.12, 1))
}
autoplot.ewing_ageclass <- function(object, x_var = c("step", "time"), ...) {
x_var <- match.arg(x_var)
ggplot_ewing_ageclass(object, x_var = x_var, ...)
}
# --- Source: ewing_envelope.R ---
ewing_envelope <- function(object, species, item, ordinate = "time", increment = 0.5) {
# Pull out `ordinate` and `item` for each run
pulled <-
tidyr::fill(
dplyr::arrange(
tidyr::pivot_wider(
dplyr::bind_rows(
purrr::map(
object,
function(x) {
dplyr::distinct(
as.data.frame(x[[species]][,c(ordinate, item)]),
.data[[ordinate]],
.keep_all = TRUE)
}),
.id = "run"),
names_from = "run",
values_from = item),
.data[[ordinate]]),
-dplyr::matches(ordinate))
out <- GET::create_curve_set(list(r = as.matrix(pulled)[,1],
obs = as.matrix(pulled[,-1])))
class(out) <- c("ewing_envelope", class(out))
attr(out, "count") <- attr(object, "count")
attr(out, "nstep") <- attr(object, "nstep")
attr(out, "nsim") <- attr(object, "nsim")
attr(out, "species") <- species
attr(out, "item") <- item
attr(out, "ordinate") <- ordinate
out
}
ewing_envelopes <- function(object) {
species <- attr(object, "species")
items <- attr(object, "items")
ordinate <- attr(object, "ordinate")
nstep <- attr(object, "nstep")
count <- attr(object, "count")
nsim <- attr(object, "nsim")
confidence <- (nsim > 2)
envs <- as.list(species)
names(envs) <- species
if(confidence) {
confs <- envs
} else {
confs <- NULL
}
for(specy in species) {
env1 <- as.list(items[[specy]])
if(confidence) {
conf1 <- env1
}
for(item in items[[specy]]) {
env1[[item]] <- ewing_envelope(object, specy, item, ordinate)
if(confidence) {
conf1[[item]] <- GET::fBoxplot(env1[[item]], type = 'area')
}
}
envs[[specy]] <- env1
if(confidence) {
confs[[specy]] <- conf1
}
}
object <- list(env = envs, conf = confs)
class(object) <- c("ewing_envelopes", class(object))
attr(object, "species") <- species
attr(object, "items") <- items
attr(object, "ordinate") <- ordinate
attr(object, "nstep") <- nstep
attr(object, "count") <- count
attr(object, "nsim") <- nsim
attr(object, "confidence") <- confidence
object
}
summary.ewing_envelopes <- function(object, species = NULL, verbose = TRUE, ...) {
# object$conf[[specy]][[item]] is time by 6-num boxplot summary
if(verbose) {
nstep <- attr(object, "nstep")
count <- attr(object, "count")
nsim <- attr(object, "nsim")
cat(nsim, "Runs of ",
nstep, "Steps for",
paste(names(count), count, sep = "=", collapse = ", "), "\n")
}
out <- print(object, species, ...)
if(!is.null(out)) {
out <- dplyr::ungroup(
dplyr::filter(
dplyr::group_by(
out,
.data$species, .data$item),
(.data$r == 0) | (.data$r == max(.data$r))))
}
out
}
print.ewing_envelopes <- function(x, species = NULL, ...) {
# x$conf[[specy]][[item]] is time by 6-num boxplot summary
if(is.null(x$conf)) {
return(NULL)
}
out <- dplyr::bind_rows(
purrr::map(
x$conf,
function(x) {
# somehow get summary across species and items using as.data.frame
x <- x[names(x) != ""]
dplyr::bind_rows(
purrr::map(
x,
as.data.frame),
.id = "item")
}),
.id = "species")
if(!is.null(species)) {
if(species %in% unique(out$species)) {
sp <- species
out <- dplyr::filter(out, species == sp)
}
}
dplyr::mutate(out, dplyr::across(where(is.numeric), function(x) pmax(x,0)))
out
}
ggplot_ewing_envelopes <- function(object, confidence = FALSE, main = "", ...) {
if(inherits(object, "ewing_discrete")) {
object <- ewing_envelopes(object)
}
species <- attr(object, "species")
items <- attr(object, "items")
ordinate <- attr(object, "ordinate")
nstep <- attr(object, "nstep")
count <- attr(object, "count")
nsim <- attr(object, "nsim")
confidence <- confidence & attr(object, "confidence")
patch <- list()
for(specy in species) {
p <- list()
for(item in items[[specy]]) {
if(confidence) {
p[[item]] <- plot(object$conf[[specy]][[item]], main = main) +
ggplot2::labs(x = "time", y = item) +
ggplot2::ggtitle(main) +
ggplot2::ylim(0, NA)
} else {
p[[item]] <- ggplot_ewing_envelope(object$env[[specy]][[item]])
}
}
patch[[specy]] <- cowplot::plot_grid(plotlist = p, nrow = length(p))
}
# NEED TO get attribute count and nstep in here
patch <- cowplot::plot_grid(plotlist = patch, ncol = length(patch))
# Add a title. <https://wilkelab.org/cowplot/articles/plot_grid.html>
title <- cowplot::ggdraw() +
cowplot::draw_label(
paste(nsim, "Runs of ", nstep, "Steps for",
paste(species, count, sep = "=", collapse = ", ")),
x = 0, hjust = 0
) +
ggplot2::theme(
# add margin on the left of the drawing canvas,
# so title is aligned with left edge of first plot
plot.margin = ggplot2::margin(0, 0, 0, 7)
)
cowplot::plot_grid(title, patch, ncol = 1, rel_heights = c(0.1, 1))
}
ggplot_ewing_envelope <- function(object, cols = c("#21908CFF", "#440154FF", "#5DC863FF"),
main = "", ...) {
# Kludge. GET::forder needs at least 3 points; cols can be at most length(object).
lcols <- length(cols)
nsim <- ncol(object$funcs)
if(nsim >= min(3, lcols)) {
A <- GET::forder(object, measure = 'area')
lcols <- min(lcols, length(object))
idx <- order(A)[seq_len(lcols)]
cols <- cols[seq_len(lcols)]
} else {
lcols <- nsim
idx <- seq_len(lcols)
cols <- cols[seq_len(lcols)]
}
item <- attr(object, "item")
species <- attr(object, "species")
ordinate <- attr(object, "ordinate")
if(length(object) >= 50) {
p <- plot(object, idx = idx, col_idx = cols, main = main)
} else {
p <- plot(object)
}
p +
ggplot2::labs(x = ordinate, y = item) +
ggplot2::ggtitle(paste(species, item))
}
autoplot.ewing_envelope <- function(object, ...) {
ggplot_ewing_envelope(object, ...)
}
# --- Source: ewing_snapshot.R ---
ewing_snapshot <- function(object, step = 0, ...)
{
out <- list(step = step,
ageclass = ewing_ageclass(object, ...))
species <- get.species(object)
subs <- list()
for(j in species) {
subs[[j]] <- ewing_substrate(object, j, step = step, ...)
}
out$substrate <- subs
class(out) <- c("ewing_snapshot", "ewing", "list")
out
}
# --- Source: temp.R ---
## $Id: temp.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## initTemp( community, lo.hour, hi.hour ) ### creates Temperature object
## activeTemp( community, lo.hour, hi.hour ) ### updates Temperature object
## checkTime( ) # check if activeTemp needs updating to cover time interval
##
## temp.design( )
## temp.plot( )
###########################################################################################
rescale.temp <- function( low, high, newry = ry, newrx = rx,
ry = range( c( stats::predict( low, low$knots )$y, stats::predict( high, high$knots )$y )))
{
if( max( abs( ry - newry )) > 0 ) {
tmpy <- diff( newry ) / diff( ry )
low$coefficients <- low$coefficients * tmpy
high$coefficients <- high$coefficients * tmpy
tmpy <- newry[1] - ry[1] * tmpy
low$coefficients[,1] <- tmpy + low$coefficients[,1]
high$coefficients[,1] <- tmpy + high$coefficients[,1]
}
rx <- range( low$knots, high$knots )
if( max( abs( rx - newrx )) > 0 ) {
newx <- diff( newrx ) / diff( rx )
low$knots <- newrx[1] + newx * low$knots
high$knots <- newrx[1] + newx * high$knots
tmp <- 1
for( i in seq( 2, ncol( low$coefficients ))) {
tmp <- tmp * newx
low$coefficients[,i] <- low$coefficients[,i] / tmp
high$coefficients[,i] <- high$coefficients[,i] / tmp
}
}
list( low = low, high = high )
}
###########################################################################################
### Temperature data structure
### Min minimum temperature for degree-day computations
### Time list of hours when temperature changes through a day
### Base list of temperature shifts through a day
### list names indicate first day Hour and Base applies
### Low spline fit for daily low temperatures
### High spline fit for daily high temperatures
### DegreeDay spline fit (hour->DD) for currently active days
### Hour ramped backspline fit (DD->hour) for currently active days
### Idea is that DegreeDay and Hour are updated whenever a future event is scheduled
### past the latest future event already scheduled. At that time, the first
### and last time of fit are both adjusted. This can be done without rebuilding
### the whole spline fit by appropriate adjustment of knots and coefficents.
### Steps: (1) combine Hour, Low and High to get knots
### (2) build spline coefficients
###########################################################################################
temp.spline <- function( community, hour, temp, start = 0,
mintemp = getTemp( community, "Min" ), cumulative = TRUE,
mult = getTemp( community, "Unit" ) )
{
if( is.data.frame( hour ) & missing( temp )) {
temp <- hour$temp
hour <- hour$hour
}
## drop low value if ones on either side are low
low <- temp <= mintemp
toolow <- low & c(FALSE,low[-length(low)]) & c(low[-1],FALSE)
hour <- hour[!toolow]
temp <- temp[!toolow]
lh <- length( hour )
## expand single low in middle to two
low <- temp <= mintemp
toolow <- low & c(FALSE,!low[-length(low)]) & c(!low[-1],FALSE)
if( any( toolow )) {
hour <- c(hour,hour[toolow])
temp <- c(temp,temp[toolow])
temp <- temp[ order( hour ) ]
hour <- sort( hour )
}
## truncate on left
low <- temp <= mintemp & c(temp[-1] > mintemp,FALSE)
low1 <- c(FALSE,low[-lh])
if( any( low ))
hour[low] <- hour[low] + ( hour[low1] - hour[low] ) * ( mintemp - temp[low] ) /
( temp[low1] - temp[low] )
## truncate on right
low <- temp <= mintemp & c(FALSE,temp[-lh] > mintemp)
low1 <- c(low[-1],FALSE)
if( any( low ))
hour[low] <- hour[low] + ( hour[low1] - hour[low] ) * ( mintemp - temp[low] ) /
( temp[low1] - temp[low] )
temp[ temp < mintemp ] <- mintemp
temp <- temp[ !duplicated( hour ) ]
hour <- unique( hour )
## linear interpolating spline for temp
lh <- length( hour ) - 1
h0 <- 1:lh
aa <- ( temp[1+h0] - temp[h0] ) / ( hour[1+h0]-hour[h0] )
aa <- c( aa, aa[lh] )
bb <- temp - mintemp
s <- list( knots = hour, coefficients = cbind( bb,aa,0,0) )
dimnames( s$coefficients ) <- list( paste( floor( hour / mult ), round( hour %% mult ),
sep = "." ), c("const","linear","quad","cubic") )
attr(s,"formula") <- temp ~ hour
class( s ) <- c("npolySpline","polySpline","spline")
if( !cumulative )
return( s )
## quadratic spline for cumulative temp
aa <- s$coefficients[,3] <- s$coefficients[,2] / 2 / mult / mult
lh <- length( aa ) - 1
h0 <- 1:lh
h1 <- 1 + h0
hour <- s$knots
bb <- s$coefficients[,2] <- s$coefficients[,1] / mult
cc <- ( hour[h1] - hour[h0] ) * ( bb[h0] + aa[h0] *
( hour[h1] - hour[h0] ))
s$coefficients[,1] <- start + c( 0, cumsum( cc ))
s
}
###########################################################################################
temp.repeat <- function( community, period = range( days ))
{
lodays <- range( getTemp( community, "Low" )$knots )
hidays <- range( getTemp( community, "High" )$knots )
days <- c( max( lodays[1], hidays[1] ), min( lodays[2], hidays[2] ))
lodays <- period[1] >= days[1] & period[1] <= days[2]
if( lodays )
days[1] <- period[1]
hidays <- period[2] <= days[2] & period[2] >= days[1]
if( hidays )
days[2] <- period[2]
if( !( lodays & hidays )) {
stop( paste( "\nSimulation period is outside of Temperature days:\n period =",
paste( round( period ), collapse = "," ), "; days =",
paste( round( days ), collapse = "," ), "\nNeed to run temp.design() and start over!" ))
}
period <- days
days <- seq( days[1], days[2] )
low <- stats::predict( getTemp( community, "Low" ), days )$y
high <- stats::predict( getTemp( community, "High" ), days )$y
periods <- c( as.numeric( names( getTemp( community, "Time" ))), Inf )
temps <- hours <- numeric( )
period[2] <- period[2] + 1
for( i in seq( length( periods ) - 1 )) {
day <- max( period[1], periods[i] )
this.period <- days >= day & days < min( period[2], periods[i+1] )
n <- sum( this.period )
if( n ) {
if( !is.null( getTemp( community, "Time", i ))) {
time <- getTemp( community, "Time", i )
base <- getTemp( community, "Base", i )
}
h <- length( time )
lotemp <- rep( low[this.period], rep(h,n) )
hitemp <- rep( high[this.period], rep(h,n) )
temp <- ( base - min( base )) / diff( range( base ))
temps <- c( temps, rep( temp, n ) * ( hitemp - lotemp ) + lotemp )
hours <- c( hours, rep( time, n ) + rep( getTemp( community, "Unit" ) *
seq( day, day + n - 1 ), rep(h,n) ))
}
}
day <- days == period[2]
if( any( day )) {
temps <- c( temps, low[day] + temp[1] * ( high[day] -
getTemp( community, "Low" )[day] ))
hours <- c( hours, getTemp( community, "Unit" ) * period[2] )
}
data.frame( hour = hours, temp = temps )
}
##########################################################################################
showTemp <- function( community )
{
cat( "Temperature set for days",
paste( range( getTemp( community, "Low" )$knots ), collapse = " to " ), "\n" )
cat( "Daily low temperature range:",
paste( round( range( stats::predict( getTemp( community, "Low" ))$y )),
collapse = " to " ), "\n" )
cat( "Daily high temperature range:",
paste( round( range( stats::predict( getTemp( community, "High" ))$y )),
collapse = " to " ), "\n" )
if( !is.null( getTemp( community, "DegreeDay" ) ))
cat( "Active temperature range:",
paste( round( range( getTemp( community, "DegreeDay", "knots" ) )),
collapse = " to " ), "\n" )
cat( "Run temp.design() to adjust temperature range\n" )
}
##########################################################################################
activeTemp <- function( community,
lo.hour = min( getTemp( community, "DegreeDay", "knots" ) ),
hi.hour = max( getTemp( community, "DegreeDay", "knots" ) ),
degreeday, messages = TRUE )
{
unit <- getTemp( community, "Unit" )
if( missing( hi.hour )) {
hi.hour <- if( length( lo.hour ) > 1 )
lo.hour[2]
else
lo.hour + unit
}
## period is in units of hours
period <- c( floor( lo.hour[1] / unit ), ceiling( hi.hour / unit ))
if( missing( degreeday )) {
degreeday <- if( is.null( getTemp( community, "DegreeDay" ) ))
0
else
getDegreeDay( community, lo.hour[1] )
}
if( is.na( degreeday ))
degreeday <- 0
community <- setTemp( community, "DegreeDay",
temp.spline( community, temp.repeat( community, period ),
start = degreeday ))
community <- setTemp( community, "Hour",
break.backSpline( getTemp( community, "DegreeDay" )))
if(messages) {
tmp <- period * unit
names( tmp ) <- c("lo.hour","hi.hour")
print( tmp )
}
community
}
###########################################################################################
updateTemp <- function( community,
period = range( getTemp( community, "DegreeDay", "knots" ) ))
{
## period is in units of hours
first <- period[1]
last <- period[2]
s <- getTemp( community, "DegreeDay" )
knots <- s$knots
## drop earlier times that are now in the past
drop <- sum( knots < first ) - 1
nk <- length( knots )
change <- drop > 0
if( change ) {
s$knots <- knots[ - seq( drop ) ]
s$coefficients <- s$coefficients[ - seq( drop ), ]
}
## add new days to include last
period <- ceiling( c( knots[nk], last ) / getTemp( community, "Unit" ) )
if( period[1] <= period[2] ) {
change <- TRUE
news <- temp.spline( community, temp.repeat( community, period ),
start = getHour( getTemp( community, "Unit" ) * period[1] ))
nk <- length( s$knots )
if( s$knots[nk] == news$knots[1] ) {
s$knots <- s$knots[-nk]
s$coefficients <- s$coefficients[-nk,]
}
else
s$coefficients[nk,] <- news$coefficients[1,]
s$knots <- c( s$knots, news$knots )
s$coefficients <- rbind( s$coefficients, news$coefficients )
}
if( change ) {
community <- setTemp( community, "DegreeDay", s )
community <- setTemp( community, "Hour", break.backSpline( s ))
}
community
}
###########################################################################################
ramp.backSpline <- function( s )
{
## ramped backspline is a trick to get backSpline when curve is flat in spots
## if tmp <- stats::predict( ramp.backSpline( s ))
## then plot tmp$y versus tmp$x-tmp$y to "recover" original curve.
## problem is that one cannot recover particular x this way!
s$coefficients[,1] <- s$coefficients[,1] + s$knots
s$coefficients[,2] <- s$coefficients[,2] + 1
splines::backSpline( s )
}
###########################################################################################
break.backSpline <- function( tmp )
{
## alternative to ramped backSpline that first removes flat regions (slope 0)
## problem remains that leftover may still have slope 0 at a point
## this can cause anomolous results!
## find flat regions and cut out
tmpc <- diff(tmp$coefficients[,1]) == 0
tmpk <- cumsum( diff(tmp$knots) * ( tmpc ))
tmpk <- c(tmpk,tmpk[length(tmpk)])
tmp$knots <- tmp$knots - tmpk
tmpc <- c(!tmpc,TRUE)
tmp$knots <- tmp$knots[tmpc]
tmp$coefficients <- tmp$coefficients[tmpc,]
tmp$breaks
nb <- dim( tmp$coefficients )
## kludge for backspline: cannot handle slope of zero
tmpn <- tmp$coefficients[,2] == 0
if( any( tmpn )) {
tmpn <- seq( tmpn )[ tmpn ]
tmp$coefficients[ tmpn, 2:nb[2] ] <-
( tmp$coefficients[ pmin( nb[1], tmpn + 1 ), 2:nb[2] ] +
tmp$coefficients[ pmax( 1, tmpn - 1 ), 2:nb[2] ] ) / 2
}
## back spline
tmpb <- splines::backSpline(tmp )
if( any( tmpc )) {
## shift back spline based on breaks
tmpb$coefficients[,1] <- tmpb$coefficients[,1] + tmpk[tmpc]
}
tmpb
}
###########################################################################################
getDegreeDay <- function( community, hour )
{
stats::predict( getTemp( community, "DegreeDay" ), hour )$y
}
###########################################################################################
getHour <- function( community, dd )
{
stats::predict( getTemp( community, "Hour" ), dd )$y
}
###########################################################################################
getTime <- function( community, species, x )
{
if( is.na(x)){
cat("getTime missing value\n")
browser()
}
switch( getOrgFeature( community, species, "units" ),
## organisms on hour basis assumed to be active only 6am-6pm
hr = getDegreeDay( community,
( getTemp( community, "Unit" ) / 2 + x + floor( x / getTemp( community, "Unit" ) )) / 2 ),
DD = x )
}
###########################################################################################
checkTime <- function( community, x, base, units )
{
## NOTE: Sometimes base can be negative!! (reset to 0)
if( units == "hr" ) {
x <- max( x )
# print( c( base = base, x = x, knots = range( getTemp( community, "DegreeDay", "knots" ))))
if( x > max( getTemp( community, "DegreeDay", "knots" )))
community <- activeTemp( community, max( base, 0 ),
x + getTemp( community, "Unit" ), messages = FALSE )
}
community
}
###########################################################################################
transTime <- function( community, org1name, org2name, x,
unit1 = getOrgFeature( community, org1name, "units" ),
unit2 = getOrgFeature( community, org2name, "units" ))
{
if( is.na(x)){
cat("transTime missing value\n")
browser()
}
if( unit1 == unit2 )
return( x )
switch( unit1,
## organisms on hour basis assumed to be active only 6am-6pm
hr = getDegreeDay( community,
( getTemp( community, "Unit" ) / 2 + x + floor( x / getTemp( community, "Unit" ))) / 2 ),
DD = getHour( x ))
}
###########################################################################################
### To do:
### 1. interactive designer for hourly temp fluctation over one day
### 2. interactive designer for daily lows and highs over season: temp.design() DONE
### 3. check future event trees hour vs. DD
### 4. schedule interaction events with hour-DD translation
### 5. make aphytis dormant at night
###########################################################################################
# --- Source: initTemp.R ---
##########################################################################################
### simulation temperature administration
##########################################################################################
initTemp <- function( community, lo.hour = 0, hi.hour = getTemp( community, "Unit" ),
days = TemperaturePar["Days"],
messages = TRUE, datafile = "", ... )
{
if(messages) {
cat( "Initializing Temperature Profile ...\n" )
}
Temperature <- list()
TemperaturePar <- getOrgData(community, "temperature", "par", messages, datafile)
# mydata( "TemperaturePar", getOrgInfo( community, "package" ), messages = messages)
TemperaturePar <- array( TemperaturePar[,"value"],
dimnames = list( row.names( TemperaturePar )))
Temperature$Unit <- TemperaturePar["Unit"]
Temperature$Min <- TemperaturePar["Min"]
## set up daily temperature base
TemperatureBase <- getOrgData(community, "temperature", "base", messages, datafile)
# mydata( "TemperatureBase", getOrgInfo( community, "package" ), messages = messages)
Temperature$Time <- split( TemperatureBase$Time, TemperatureBase$Day )
Temperature$Base <- split( TemperatureBase$Base, TemperatureBase$Day )
community$temp <- Temperature
tmp <- seq( lo.hour / Temperature$Unit,
days + 1 + ( hi.hour / Temperature$Unit ),
length = TemperaturePar["Length"] )
tmp0 <- seq( 0, 1, length = TemperaturePar["Length"] )
tmp1 <- 0.25 * ( TemperaturePar["HighBeg"] - TemperaturePar["LowBeg"] )
Temperature$Low <- splines::interpSpline( tmp, TemperaturePar["LowBeg"] * ( 1 - tmp0 ) +
TemperaturePar["LowEnd"] * tmp0 +
sin( pi * 4 * tmp0 ) * tmp1 )
Temperature$High <- splines::interpSpline( tmp, TemperaturePar["HighBeg"] * ( 1 - tmp0 ) +
TemperaturePar["HighEnd"] * tmp0 +
sin( pi * ( 0.125 + 4 * tmp0 )) * tmp1 )
Temperature$DegreeDay <- NULL
if(messages) {
cat( "Base daily temperature fluctuation:\n" )
}
for( i in names( Temperature$time )) {
cat( "From day", i, ":\n" )
tmp <- Temperature$Base[[i]]
names( tmp ) <- Temperature$Time[[i]]
print( tmp )
}
community$temp <- Temperature
if(messages) {
showTemp( community )
cat( "Initial active temperature:\n" )
}
activeTemp( community, lo.hour, hi.hour, getTemp( community, "Time", 1 )[1],
messages = messages)
}
###########################################################################################
getTemp <- function( community, element, sub )
{
tempelem <- community$temp[[element]]
if( !missing( sub ))
tempelem <- tempelem[[sub]]
tempelem
}
###########################################################################################
setTemp <- function( community, element, value )
{
community$temp[[element]] <- value
community
}
# --- Source: temp.design.R ---
temp.design <- function( community, nspline = 8, n = 1, horizontal = TRUE,
col = c(low="blue",high="red") )
{
low <- getTemp( community, "Low" )
high <- getTemp( community, "High" )
is.data <- !is.null( low )
if( !is.data ) {
tmp <- seq( 0, 60, length = nspline )
low <- interpSpline( tmp, 60 + 0.125 * tmp + sin( 0.25 * tmp ))
high <- interpSpline( tmp, 70 + 0.15 * tmp + sin(( pi / 8 ) + 0.225 * tmp ))
}
## plot curve and surrounding axes
par( mfrow = c(1,1), mar = rep(4.1,4))
cat( "Switch to Graphic Screen to Adjust High and Low Temperatures\n" )
plotit <- function( low, high, fig = fig, horizontal = FALSE, strip = .25, margin = 0 )
{
lowpred <- stats::predict( low, low$knots )
highpred <- stats::predict( high, high$knots )
ylim <- range( c( lowpred$y, highpred$y ))
xlim <- range( c( lowpred$x, highpred$x))
xlim <- xlim + c(-1,1) * margin * diff( xlim )
if( horizontal ) {
if( diff( ylim ) == 0 )
ylim <- ylim * c(.75,1.25)
separator <- ylim[2]
ylim[2] <- ylim[2] + strip * diff( ylim )
}
else {
separator <- xlim[2]
xlim[2] <- xlim[2] + strip * diff( xlim )
}
axt <- c("n","s")
tmpar <- par( xaxt = axt[1+horizontal], yaxt = axt[2-horizontal] )
plot( xlim, ylim, xlim = xlim, ylim = ylim, type="n", xlab = "", ylab = "" )
par( xaxt = "s", yaxt = "s" )
title( fig )
mtext( "day", 1, 2 )
mtext( "temp", 2, 2 )
if( horizontal ) {
p <- pretty( c(ylim[1],separator) )
axis( 2, p[ p <= separator ] )
abline( h = separator, lty = 2 )
}
else {
p <- pretty( c(xlim[1],separator) )
axis( 1, p[ p <= separator ] )
abline( v = separator, lty = 2 )
}
points( highpred$x, highpred$y, lwd = 4 )
curve.plot( highpred, n = n, action = "refresh", fit = high, backfit = FALSE,
save.ends = 3, col = "red", lwd = 2 * ( 1 + ( fig == "high" )))
points( lowpred$x, lowpred$y, lwd = 4 )
curve.plot( lowpred, n = n, action = "refresh", fit = low, backfit = FALSE,
save.ends = 3, col = "blue", lwd = 2 * ( 1 + ( fig == "low" )))
separator
}
## place commands along right strip of plot, highlighting current command
plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
horizontal = TRUE, data = FALSE )
{
ans <- c( ans, fig )
if( data )
ans <- c( ans, "data" )
tmp <- is.na( match( cmds, ans ))
if( any( tmp )) for( i in unique( cmdlocs$adj )) {
tmpi <- tmp & i == cmdlocs$adj
if( any( tmpi ))
text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = rest, adj = i )
}
if( any( !tmp )) for( i in unique( cmdlocs$adj )) {
tmpi <- !tmp & i == cmdlocs$adj
if( any( tmpi ))
text( cmdlocs$x[tmpi], cmdlocs$y[tmpi], cmds[tmpi], col = col, adj = i )
}
}
cmds <- c("add","delete","replace","rescale","","finish","refresh","restart",
"","data","high","low")
newlocs <- if( horizontal )
function( cmds, data = FALSE, usr )
{
if( !data )
cmds <- cmds[ cmds != "data" ]
n <- length( cmds )
blank <- seq( n )[ cmds == "" | cmds == " " ]
tmp <- diff(usr[3:4]) / 20
m <- mean( usr[1:2] )
y <- usr[4] + 0.5 * tmp - c( tmp * seq( blank[1] - 1 ), 0,
tmp * seq( blank[2] - blank[1] - 1 ), 0,
tmp * seq( n - blank[2] ))
x <- c( rep( usr[1], blank[1] - 1 ), mean( m, usr[1] ),
rep( m, blank[2] - blank[1] - 1 ), mean( m, usr[2] ),
rep( usr[2], n - blank[2] ))
adj <- c( rep( 0, blank[1] ),
rep( 0.5, blank[2] - blank[1] ),
rep( 1, n - blank[2] ))
tmp <- data.frame( x = x, y = y, adj = adj )
cmds[blank[2]] <- " "
row.names( tmp ) <- cmds
tmp
}
else
function( cmds, data = FALSE, usr )
{
if( !data )
cmds <- cmds[ cmds != "data" ]
n <- length( cmds )
blank <- seq( n )[ cmds == "" | cmds == " " ]
tmp <- diff(usr[3:4]) / 20
m <- mean( usr[3:4] )
tmp <- c( usr[4] - tmp * seq( blank[1] - 1 ),
mean( m, usr[4] ),
m + tmp * ( seq( blank[1] + 1, blank[2] - 1 ) - mean( blank )),
mean( m, usr[3] ),
usr[3] + tmp * seq( n - blank[2] ))
tmp <- data.frame( x = rep( usr[2], n ), y = tmp, adj = rep( 1, n ))
cmds[blank[2]] <- " "
row.names( tmp ) <- cmds
tmp
}
newans <- ans <- "replace"
par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
fig <- "low"
fit <- low
separator <- plotit( low, high, fig, horizontal )
usr <- par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
cmds <- row.names( cmdlocs )
use.data <- FALSE
plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
rescale.data <- c( range( stats::predict( low, low$knots )$y,
stats::predict( high, high$knots )$y ), range( low$knots, high$knots ))
repeat {
## get command from plot using cursor
z <- locator(1,"n")
if(( !horizontal & z$x > separator ) | ( horizontal & z$y > separator )) {
if( horizontal ) { # need to look at both z&y
x <- abs( z$x - cmdlocs$x )
x <- x == min( x )
newans <- cmds[x]
z <- abs( z$y - cmdlocs$y )[x]
newans <- newans[ z == min( z ) ][1]
}
else {
z <- abs(z$y - cmdlocs$y )
newans <- cmds[ z == min( z ) ][1]
}
switch( newans,
finish =, refresh = {
separator <- plotit( low, high, fig, horizontal )
usr <- par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
data = {
use.data <- is.data & !use.data
if( is.data & !use.data )
plotit( low, high, fig, horizontal )
},
high =, low = {
if( newans != fig )
fig <- newans
separator <- plotit( low, high, fig, horizontal )
usr <- par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
rescale = {
tmpcmds <- cmds
tmpans <- tmpcmds[ cmds == "rescale" ] <-
"rescale: Switch to Character Screen"
plotcmd( tmpans, fig, tmpcmds, cmdlocs, usr, data = use.data )
ry <- range( c( stats::predict( low, low$knots )$y, stats::predict( high, high$knots )$y ))
cat( "\nEnter new minimum/maximum followed by RETURN key\n" )
newry <- ry
show <- c("minimum","maximum")
change <- FALSE
for( i in 1:2 ) {
tmpy <- readline( paste( show[i], " temp (",
round( ry[i], 2 ), "):", sep = "" ))
tmpy <- if( tmpy == "" ) NA
else as.numeric( tmpy )
if( is.na( tmpy ))
tmpy <- ry[i]
else
change <- TRUE
rescale.data[i] <- tmpy
}
tmp <- range( c( low$knots, high$knots ))
for( i in 1:2 ) {
tmpx <- readline( paste( show[i], " time (",
round( tmp[i], 2 ), "):", sep = "" ))
tmpx <- if( tmpx == "" ) NA
else as.numeric( tmpx )
if( is.na( tmpx ))
tmpx <- tmp[i]
else
change <- TRUE
rescale.data[2+i] <- tmpx
}
cat( "Switch to Graphic Screen to Adjust High and Low Temperatures\n" )
if( change ) {
tmp <- rescale.temp( low, high, rescale.data[1:2],
rescale.data[3:4], ry )
low <- tmp$low
high <- tmp$high
}
separator <- plotit( low, high, fig, horizontal )
usr <- par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
restart = {
low <- getTemp( community, "Low" )
high <- getTemp( community, "High" )
if( is.data )
rescale.data <- c( range( stats::predict( low, low$knots )$y,
stats::predict( high, high$knots )$y ), range( low$knots, high$knots ))
separator <- plotit( low, high, fig, horizontal )
usr <- par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
add =, delete =, replace = {
ans <- newans
}
)
if( use.data ) {
tmp <- rescale.temp( getTemp( community, "Low" ), getTemp( community, "High" ),
rescale.data[1:2], rescale.data[3:4] )
for( i in c("low","high") ) {
datax <- tmp[[i]]$knots
lines( datax, stats::predict( tmp[[i]], datax )$y )
}
}
plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
}
else { # modify the curve knots
fit <- get( fig )
if( z$x >= min( fit$knots ) & z$x <= max( fit$knots )) {
fit <- curve.plot( as.data.frame( stats::predict( fit, fit$knots )), n = n, action = ans,
z = z, fit = fit, backfit = FALSE, save.ends = 2, col = col[fig] )
assign( fig, fit$fit )
}
ans <- "replace"
plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
}
if( newans == "finish" )
break
}
plotcmd( newans, fig, cmds, cmdlocs, "red", data = use.data )
community <- setTemp( community, "Low", low )
community <- setTemp( community, "High", high )
activeTemp( community )
}
# --- Source: temp.plot.R ---
temp.plot <- function( community, lo.hour = s$knots[1], hi.hour = max( s$knots ),
length = 201,
col = NULL, derivative = FALSE, ..., printit = FALSE )
{
s <- getTemp( community, "DegreeDay" )
x <- seq( lo.hour, hi.hour, length = length )
## make sure to pick up knots to plot in this region
x <- unique( sort( c( x, s$knots[ s$knots >= lo.hour & s$knots <= hi.hour ] )))
ylab <- "degree-days"
if( derivative ) {
ylab <- "degrees above min"
s$coefficients <- s$coefficients[,-1]
for( i in seq( 2, ncol( s$coefficients )))
s$coefficients[,i] <- s$coefficients[,i] * i
}
y <- stats::predict( s, x )$y
plot( x / getTemp( community, "Unit" ), y, type = "l", xlab = "day",
ylab = ylab, ... )
if( printit )
print( cbind( hi.hour, stats::predict( s, hi.hour )$y ))
if( !is.null( col ))
points( s$knots, coef(s)[,1], col = col )
if( !derivative ) {
s <- getTemp( community, "Hour" )
x <- seq( min( y ), max( y ), length = length )
tmp <- stats::predict( s, x )
lines( tmp$y / getTemp( community, "Unit" ), tmp$x, col = "blue" )
}
}
###########################################################################################
temp.lines <- function( s, mult = 24, col = "red" )
{
x <- seq( s$knots[1], max( s$knots ), length = 51 )
x <- unique( sort( c( x, s$knots )))
p <- stats::predict( s, x )
lines( p$x, p$y, col = col )
if( !is.null( col ))
points( s$knots / mult, coef(s)[,1], col = col )
}
# --- Source: my.R ---
###########################################################################################
## System files
###########################################################################################
my.read <- function(dataname, stringsAsFactors = TRUE)
{
switch(tools::file_ext(dataname),
"txt" =, "tsv" = read.table(dataname, header = TRUE, fill = TRUE,
stringsAsFactors = stringsAsFactors),
"csv" = read.csv(dataname, fill = TRUE,
stringsAsFactors = stringsAsFactors),
"xls" = readxl::read_xls(dataname),
"xlsx" = readxl::read_xlsx(dataname))
}
###########################################################################################
my.eval <- function(species, extension, element, checkdata = FALSE )
{
if( !missing( extension ))
species <- paste( species, extension, sep = ".")
if( exists( species ))
organism <- get( species )
else {
if( checkdata ) {
organism <- utils::data( list = species )
if( organism == species )
organism <- NULL
}
else
organism <- NULL
}
if(!( missing(element) | is.null( organism )))
organism <- organism[[element]]
organism
}
###########################################################################################
mydata <- function( dataname, package, restart = FALSE, messages = TRUE )
{
edata <- exists( dataname )
if( restart & edata ) {
remove( list = dataname, pos = 1 )
edata <- !edata
}
if( !edata ) {
utils::data( list = dataname, package = eval( package ))
if(messages) {
cat( "Data", dataname, "loaded\n" )
}
}
else
if(messages) {
cat( "Data", dataname, "already loaded\n" )
}
}
# --- Source: Org.R ---
###########################################################################################
### Organism Features
###########################################################################################
getOrgFeature <- function( community, species, feature = names( OrgFeature ))
{
OrgFeature <- getOrgInfo( community, "Feature" )
if (!is.null(OrgFeature)) {
if( missing( species ))
return( row.names( OrgFeature ))
f <- OrgFeature[ species, feature ]
if( length( feature ) == 1 ) {
if( any( is.na( f )))
return( NA )
f <- as.character( f )
}
else {
f <- apply( f, 2, as.character )
}
f <- c( unlist( f ))
numf <- suppressWarnings(as.numeric( f ))
if( all( !is.na( numf )))
f <- numf
return(f)
}
# Fallback for webR standalone adapter objects
if (missing(species)) return(c("host", "parasite"))
if (missing(feature) || is.null(feature)) return(c(substrate = "substrate", units = "units"))
if (length(feature) == 1) {
if (feature == "substrate") return("substrate")
if (feature == "units") return("units")
return(NA)
}
res <- rep("substrate", length(feature))
names(res) <- feature
res
}
##########################################################################################
getOrgHosts <- function( community, species,
feature = c("offspring","attack","substrate") ###HOST SPECIFIC###
)
{
# This seems overly complicated and adds substrate; maybe function name is wrong
f <- unique( getOrgFeature( community, species, feature ))
# f[match(species, f, nomatch = 0)] # this would only get species
o <- getOrgFeature( community )
o[ match( f, o, nomatch = 0 ) ]
}
###########################################################################################
getOrgFuture <- function( community, species, feature, current,
future = OrgFuture[[species]] )
{
OrgFuture <- getOrgInfo( community, "Future" )
if (!is.null(OrgFuture) && !is.null(OrgFuture[[species]])) {
future <- OrgFuture[[species]]
if( missing( current )) {
if( missing( feature ))
return( future )
future <- future[,feature]
}
else {
if( !is.numeric( current ))
current <- match( current, future$current, nomatch = 0 )
if( missing( feature ))
future <- future[ current, ]
else
future <- future[ current, feature ]
}
if( is.null( future ))
return( NA )
if(is.character( future ))
future <- as.factor(future)
return(future)
}
# Fallback for webR standalone adapter objects
if (!is.null(community$pop[[species]])) {
pch_vec <- community$pop[[species]]$pch
col_vec <- community$pop[[species]]$col
fut <- data.frame(pch = pch_vec, color = col_vec, stringsAsFactors = FALSE)
if (missing(feature)) return(fut)
if (length(feature) == 1) return(fut[[feature]])
return(fut[, feature, drop = FALSE])
}
NULL
}
###########################################################################################
get.interact <- function( community, species, host, avail, event )
{
id <- get.species.element( community, host, "stage", avail )
interact <- getOrgInteract( community, host, species, event )[id]
interact[ is.na( interact ) ] <- 0
interact
}
###########################################################################################
getOrgInteract <- function( community,
org1name = getOrgFeature( community, org2name, "substrate" ),
org2name, event = NULL )
{
OrgInteract <- getOrgInfo( community, "Interact" )
if (!is.null(OrgInteract) && !is.null(OrgInteract[[org1name]][[org2name]])) {
tmp <- OrgInteract[[org1name]][[org2name]]
if( is.null( event ))
return( tmp )
event <- as.character( event )
inter <- tmp[,event]
if( length( event ) == 1 )
names( inter ) <- row.names( tmp )
if(is.character(inter))
inter <- factor(inter)
return(inter)
}
# Fallback for webR standalone adapter objects
sub_names <- if (!is.null(community$sub_names)) community$sub_names else c("fr1", "fr2", "fr3", "fr4", "twig", "lftop", "lfbot")
mat <- matrix(1, nrow = length(sub_names), ncol = 1, dimnames = list(sub_names, "substrate"))
as.data.frame(mat)
}
###########################################################################################
getOrgMeanValue <- function( community, species )
{
OrgMeanValue <- getOrgInfo( community, "MeanValue" )
## The global org$MeanValue[[species]] contains mean value information.
OrgMeanValue[[species]]
}
###########################################################################################
copyOrgInfo <- function( fromname, toname )
{
out <- list()
for( i in c("sim")) {
from <- paste( fromname, i, sep = "." )
if( exists( from )) {
toto <- paste( toname, i, sep = "." )
out[[toto]] <- get( from )
cat( "copied", from, "to", toto, "into list\n" )
}
}
return(out)
}
###########################################################################################
get.alive <- function( community, species, substrate )
{
alive <- getOrgAlive( community, species )
alive <- seq_along( alive )[alive]
alive[ substrate == get.species.element( community, species, "sub.stage", alive ) ]
}
###########################################################################################
getOrgAlive <- function( community, species, element )
{
organism <- get.species( community, species )
## identify dead organisms (free nodes for leftist tree)
tmp <- c( FALSE, apply( organism[c("dist","up","left","right"),-1], 2,
function( x ) any( x > 1 )))
if( !any( tmp )) {
tmpp <- organism["up",1]
if( tmpp > 1 )
tmp[tmpp] <- TRUE
}
if( !missing( element ))
tmp <- organism[ element, tmp ]
tmp
}
###########################################################################################
getOrgAgeClass <- function( community, species, stage = seq_len( nrow( future )),
future = getOrgFuture( community, species ))
{
ageclass <- future$ageclass[stage]
tmp <- !is.na( ageclass )
if( any( tmp ))
ageclass[ !is.na( ageclass ) ]
else
NA
}
###########################################################################################
getOrgSubstrate <- function( community, species, elements = seq_len( nrow( inter )),
substrate = getOrgFeature( community, species, "substrate" ),
inter = getOrgInteract( community, substrate, species ))
{
sites <- inter$substrate[elements]
tmp <- !is.na( sites )
if( any( tmp ))
sites[ !is.na( sites ) ]
else
NA
}
###########################################################################################
sampleOrgSubstrate <- function( community, species, elements = seq_len( nrow( inter )),
substrate.name = getOrgFeature( community, species, "substrate" ),
inter = getOrgInteract( community, substrate.name, species ))
{
if( is.na( substrate.name ))
return( elements )
newsub <- as.matrix( cbind( elements, inter[ elements, levels( factor(inter$substrate) ) ] ))
apply( newsub, 1, function( x, is ) {
ns <- sample( levels( factor(is) ), 1, prob = x[-1] / sum( x[-1] ))
sub <- seq_len( nrow( inter ))[ ns == is ]
if( length( sub ) > 1 ) {
newsub <- getOrgInteract( community, substrate.name, substrate.name )[x[1],sub]
sample( sub, 1, prob = newsub / sum( newsub ))
}
else
sub
}, inter$substrate )
}
##########################################################################################
### simulation organism administration
##########################################################################################
initOrgInfo <- function( package, messages = TRUE, datafile = "", ... )
{
community <- list( pop = list( ))
community$org <- list( )
community$org$package <- package
## Get data
community$org$Feature <- getOrgData(community, "organism", "features",
messages, datafile)
community$pop <- list()
community
}
##########################################################################################
setOrgInfo <- function( community, species, hosts, package, messages = TRUE,
datafile = "", ... )
{
Organism <- community$org
if( is.null( Organism$Future ))
Organism$Future <- list( )
if( is.null( Organism$Interact ))
Organism$Interact <- list( )
for( j in hosts )
if( is.null( Organism$Interact[[j]] ))
Organism$Interact[[j]] <- list( )
## Do not reset MeanValue as it may have important spline fits!
if( is.null( Organism$MeanValue ))
Organism$MeanValue <- list( )
for( i in species ) {
future <- getOrgData(community, "future", i,
messages, datafile)
# Check that future agrees with organism.feature information
subclass <- Organism$Feature[i,"subclass"]
if(!(subclass %in% unique(future$ageclass))) {
stop(paste("Future table", paste("future", i, sep = "."),
"does not include", subclass))
}
level.ageclass <- unique( future$ageclass )
level.ageclass <- as.character( level.ageclass[ !is.na( level.ageclass ) ] )
future$ageclass <- ordered( future$ageclass, level.ageclass )
Organism$Future[[i]] <- future
for( j in hosts )
if( i != j ) {
Organism$Interact[[j]][[i]] <- getOrgData(community, j, i,
messages, datafile)
# Check that interaction agrees with host current stage information
# This is messy!
if(j %in% species) {
if(!all(row.names(Organism$Interact[[j]][[i]]) %in%
c(as.character(Organism$Future[[j]]$current), i))) {
stop(paste("Interaction table", paste(j, i, sep = "."),
"does not match", j, "current stages"))
}
}
}
if( is.null( Organism$MeanValue[[i]] ))
Organism$MeanValue[[i]] <- list( )
else
cat( "Keeping Mean Value information for", i, "if any\n" )
}
for( i in unique( getOrgFeature( community, species, "substrate" ))) {
Organism$Interact[[i]][[i]] <- getOrgData(community, i, i,
messages, datafile)
}
community$org <- Organism
community
}
###########################################################################################
getOrgData <- function(community, left, right,
messages = TRUE, datafile = "")
{
# Get Organism Data from
# package data
# global data supplied by user
# external data file supplied by user
sheet <- paste( left, right, sep = "." )
data_exists <- FALSE
if (is.character(datafile) && length(datafile) == 1 && nzchar(datafile)) {
if (dir.exists(datafile)) {
extensions <- c(".txt", ".tsv", ".csv", ".xls", ".xlsx")
datafile_paths <- file.path(datafile, paste0(sheet, extensions))
exist_idx <- file.exists(datafile_paths)
if (any(exist_idx)) {
datafile <- datafile_paths[exist_idx][1]
data_exists <- TRUE
} else {
data_exists <- FALSE
}
sheet <- ""
} else if (file.exists(datafile)) {
data_exists <- TRUE
}
}
if (!data_exists && (is.null(datafile) || datafile == "")) {
def_file <- get_site_cache_file(paste0(sheet, ".txt"), site = "default")
if (def_file != "" && file.exists(def_file)) {
datafile <- def_file
data_exists <- TRUE
sheet <- ""
}
}
if(!data_exists) {
# Load package data or get user-provided global data.
mydata( sheet, getOrgInfo( community, "package" ), messages = messages)
my.eval( sheet )
} else {
# Read data file from user if provided.
if(sheet == "")
my.read(datafile)
else {
out <- as.data.frame(readxl::read_excel(datafile, sheet = sheet, .name_repair = "none"))
if(names(out)[1] == "") { # first column is actual row names
rownames(out) <- out[[1]]
out[[1]] <- NULL
}
out
}
}
}
###########################################################################################
getOrgNames <- function(datafile = "") {
if(datafile == "") {
c("organism.features", "future.host", "future.parasite",
"substrate.host", "substrate.parasite", "substrate.substrate",
"temperature.base", "temperature.par")
} else {
readxl::excel_sheets(datafile)
}
}
###########################################################################################
getOrgDataSimple <- function(community, dataname, datafile = ""){
out <- getOrgData(
community,
left = stringr::str_remove(dataname, "\\..*"),
right = stringr::str_remove(dataname, ".*\\."),
messages = FALSE, datafile = datafile)
# Kludge to reinstate rownames as a column
if(!identical(rownames(out), as.character(seq_len(nrow(out))))) {
out <- data.frame(rownames = rownames(out), out)
}
out
}
###########################################################################################
getOrgInfo <- function( community, element )
{
community$org[[element]]
}
###########################################################################################
setOrgMeanValue <- function( community, species, stage, mvalue )
{
## The global Organism$MeanValue[[species]] contains mean value information.
community$org$MeanValue[[species]][[stage]] <- mvalue
community
}
# --- Source: organism.features.R ---
NULL
# --- Source: future.R ---
## $Id: future.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
##
## future.events( community )
##
###############################################################################
###############################################################################
### Get birth and future event
###############################################################################
get.future <- function (community, species,
individuals = get.individual(community, species, id),
id = get.base(community, species))
{
## NOTE: This is the slow routine. For every event, it has to check if there
## is a mean value function and then call rspline.
## the structure future.species is set up to handle competing risks!
future <- getOrgFuture(community, species, c("current", "future", "time"))
future$fid <- match(future$future, future$current)
individuals <- as.matrix(individuals)
rownames <- dimnames(individuals)[[1]]
for (i in seq(ncol(individuals))) {
individual <- individuals[,i]
current <- individual["stage"]
individual["location"] <- individual["time"]
## competing risks based on potential future event times
futures <- future$current == future$current[current]
times <- rep( individual["time"], sum( futures ))
cur <- seq(nrow(future))[futures]
for( j in seq( sum( futures ))) {
meantime <- future[cur[j], "time"]
if( meantime > 0 ) {
for.stage <- as.character(future$current[future$fid[ cur[j] ]])
times[j] <- rspline( meantime, individual,
getOrgMeanValue(community, species)[[for.stage]])
}
}
individual["time"] <- min( times )
current <- cur[ times == individual["time"] ][1]
individual["future"] <- future$fid[current]
if (individual["time"] == individual["rejection"])
individual["future"] <- future$fid[future$current == "death"]
individuals[,i] <- individual
}
individuals
}
###############################################################################
event.death <- function( community, species,
id = get.base( community, species ))
{
## remove dead individual from leftist tree
community <- put.species( community, species,
leftist.remove( get.species( community, species ), id ))
## free up individual for reuse
community <- put.base( community, species, id )
community
}
###############################################################################
update_mintime <- function( object, species, ... )
{
base <- get.base( object, species )
mintime <- max( getCount( object, species, "mintime" ),
getTime( object, species,
get.species.element( object, species, "time", base )))
setCount( object, species, list( base = base, mintime = mintime ))
}
###############################################################################
set.birth <- function( community, species, neworg )
{
## merge immediate new births (if any)
newbirths <- ncol( neworg )
if( newbirths > 0 ) {
neworg[c("dist","left","right","up"),] <- 1
community <- checkTime( community, neworg["time",],
getCount( community, species, "mintime" ),
getOrgFeature( community, species, "units" ))
oldbase <- getCount( community, species, "base" )
tmp <- leftist.birth( get.species( community, species ), neworg,
getCount( community, species, "free" ))
community <- put.species( community, species, tmp$tree )
community <- put.base( community, species, free = tmp$free )
community <- updateCounts( community, species, newbirths )
}
community
}
# --- Source: future.host.R ---
NULL
# --- Source: future.meanvalue.R ---
###########################################################################################
## init.meanvalue( organism, stage )
## spline.meanvalue( x, y )
## spline.meanvalue( data = data )
##
## five.show( )
## five.plot( )
##
###########################################################################################
# Curve Designing routines -- under development
###########################################################################################
future.meanvalue <- function( community, species, event = future$current[1],
data )
{
future <- getOrgFuture( community, species )
mvalue <- getOrgMeanValue( community, species )[[event]]
if( missing( data )) {
if( !is.null( mvalue )) {
mvalue <- stats::predict( mvalue$meanvalue, mvalue$meanvalue$knots )
mvalue <- spline.meanvalue( mvalue$x, mvalue$y )$fit
}
else
mvalue <- spline.meanvalue( )$fit
}
else
mvalue <- spline.meanvalue( data = data )$fit
setOrgMeanValue( community, species, event, mvalue )
}
###########################################################################################
spline.meanvalue <- function( x = xinit, y = yinit, data, nspline = 8,
xy = data.frame( x = x, y = y ),
tol = 1e-5, n = 1 )
{
is.data <- !missing( data )
if( !is.data ) {
tmp <- - log( 1 - seq( 0, 1 - exp( -5 ), length = nspline ))
if( missing( x ))
xinit <- tmp
else
xinit <- x
if( missing( y ))
yinit <- tmp
else
yinit <- y
data <- NULL
}
else {
xinit <- sort( data )
ndata <- length( data )
yinit <- seq( ndata ) / ( 1 + ndata )
choose <- round( seq( 1, ndata, length = nspline ))
xinit <- xinit[choose]
yinit <- - log( 1 - yinit[choose] )
}
fs <- list( probability = function( x ) { - log( 1 - x ) } )
finvs <- list( probability = function( x ) { 1 - exp( - x ) } )
for( i in c("mean value","rate","density") )
fs[[i]] <- finvs[[i]] <- function( x ) x
## plot curve and surrounding axes
graphics::par( mfrow = c(1,1), mar = rep(4.1,4))
plotit <- function( xy, fig = "mean value", fit = splines::interpSpline( xy$x, xy$y ))
{
switch( fig, {
y <- xy$y
ylim <- range(c(0,y))
},
probability = {
y <- 1 - exp( - xy$y )
ylim <- range(c(0,y))
},
rate = {
y <- spline.rate( fit, xy$x )$y
tmp <- spline.rate( fit )
ylim <- range(c(0,tmp$y))
},
density = {
y <- spline.rate( fit, xy$x )$y * exp( - stats::predict( fit, xy$x )$y )
tmp <- spline.rate( fit )
tmp$y <- tmp$y * exp( - stats::predict( fit )$y )
ylim <- range(c(0,tmp$y))
}
)
plot(xy$x,y,xlim=1.25*range(c(0,xy$x)), ylim = ylim,
type="n", xlab = "", ylab = "" )
graphics::points( xy$x, y, lwd = 4 )
graphics::title( fig )
graphics::mtext( "time", 1, 2 )
graphics::mtext( fig, 2, 2 )
graphics::abline( v = max( xy$x ), lty = 2 )
switch( fig, {
if( fig == "probability" ) {
tmp <- c(.1,.2,.5,1:10)
ltmp <- 1-exp(-tmp)
graphics::mtext( "mean value", 4, 2 )
}
else {
tmp <- c(seq(0,.9,,by=.1),.95,.98,.99,.999)
ltmp <- -log(1-tmp)
graphics::mtext( "probability", 4, 2 )
}
usr <- graphics::par("usr")
s <- ltmp <= usr[4] & ltmp >= usr[3]
tmpar <- graphics::par( cex = .75 )
graphics::axis(4,ltmp[s],tmp[s])
graphics::par( tmpar )
summaryshow( xy, fit, "white" )
tmp <- curve.plot( xy, n = n, action = "refresh", fit = fit,
f = fs[[fig]], finv = finvs[[fig]] )
summaryshow( xy, tmp$fit )
},
rate =, density = {
graphics::lines( tmp$x, tmp$y )
summaryshow( xy, fit )
}
)
}
## place commands along right strip of plot, highlighting current command
plotcmd <- function( ans, fig, cmds, cmdlocs, usr, col = "green", rest = "black",
data = FALSE )
{
ans <- c( ans, fig )
if( data )
ans <- c( ans, "data" )
tmp <- is.na( match( cmds, ans ))
if( any( tmp ))
graphics::text( rep(usr[2],sum(tmp)), cmdlocs[tmp], cmds[tmp], col = rest, adj = 1 )
if( any( !tmp ))
graphics::text( rep(usr[2],sum(!tmp)), cmdlocs[!tmp], cmds[!tmp], col = col, adj = 1 )
}
fig <- "mean value"
newans <- ans <- "replace"
graphics::par( mar = c(4.1,4.1,3.1,4.1),omi=rep(.25,4))
fit <- splines::interpSpline( xy$x, xy$y )
sums <- plotit( xy, fig, fit )
cmds <- c("refresh","add","delete","replace","rescale","shrink to 1","finish","restart",
"","data","mean value","probability","rate","density")
newlocs <- function( cmds, data = FALSE, usr )
{
if( !data )
cmds <- cmds[ cmds != "data" ]
n <- length( cmds )
blank <- seq( n )[ cmds == "" ]
tmp <- diff(usr[3:4]) / 20
tmp <- c( usr[4] - tmp * seq( blank - 1 ), mean( usr[3:4] ),
usr[3] + tmp * seq( n - blank ))
names( tmp ) <- cmds
tmp
}
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
cmds <- names( cmdlocs )
use.data <- FALSE
plotcmd( ans, fig, cmds, cmdlocs, usr )
rescale.data <- 1
repeat {
## get command from plot using cursor
z <- graphics::locator(1,"n")
if( z$x > max( xy$x )) {
z <- abs(z$y - cmdlocs )
newans <- cmds[z==min(z)][1]
switch( newans,
finish =, refresh = {
sums <- plotit( xy, fig, fit )
},
data = {
use.data <- is.data & !use.data
if( is.data & !use.data & match( fig, c("mean value","probability"),
nomatch = 0 ))
sums <- plotit( xy, fig, fit )
},
"mean value" =, probability =, rate =, density = {
fig <- newans
sums <- plotit( xy, fig, fit )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
"shrink to 1" = {
while( abs( sums[1] - 1 ) > tol ) {
xy$y <- xy$y * sums[1]
if( is.data )
rescale.data <- rescale.data * sums[1]
fit <- splines::interpSpline( xy$x, xy$y )
sums <- splinesum( xy, fit, tol )
}
sums <- plotit( xy, fig, fit )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
rescale = {
cat( "enter new values followed by RETURN key\n" )
tmpy <- readline( paste( "maximum mean value(",
round( max( xy$y ), 2 ), "):", sep = "" ))
if( tmpy != "" ) {
tmpy <- as.numeric( tmpy ) / max( xy$y )
xy$y <- tmpy * xy$y
if( is.data )
rescale.data <- rescale.data * tmpy
}
tmpx <- readline( paste( "maximum time(",
round( max( xy$x ), 2 ), "):", sep = "" ))
if( tmpx != "" ) {
tmpx <- as.numeric( tmpx ) / max( xy$x )
xy$x <- tmpx * xy$x
if( is.data )
data <- data * tmpx
}
fit <- splines::interpSpline( xy$x, xy$y )
sums <- plotit( xy, fig, fit )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
restart = {
if( is.data )
rescale.data <- 1
xy <- data.frame( x = xinit, y = yinit )
fit <- splines::interpSpline( xy$x, xy$y )
sums <- plotit( xy, fig, fit )
usr <- graphics::par("usr")
cmdlocs <- newlocs( cmds, data = is.data, usr = usr)
},
add =, delete =, replace = {
ans <- newans
}
)
if( use.data & match( fig, c("mean value","probability"), nomatch = 0 ))
cdf.lines( data, fig, rescale = rescale.data )
plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
}
else {
if( is.na( match( fig, c("rate","density") ))) {
summaryshow( xy, fit, "white", sums )
fit <- curve.plot( xy, n = n, action = ans, z = z, fit = fit,
f = fs[[fig]], finv = finvs[[fig]] )
xy <- fit$xy
fit <- fit$fit
sums <- summaryshow( xy, fit )
ans <- "replace"
plotcmd( ans, fig, cmds, cmdlocs, usr, data = use.data )
}
}
if( newans == "finish" )
break
}
plotcmd( newans, fig, cmds, cmdlocs, "red", data = use.data )
summaryshow( xy, fit, "white", sums )
tmp <- curve.plot( xy, n = n, action = "refresh",
f = fs[[fig]], finv = finvs[[fig]] )
tmp$meanvalue <- tmp$fit
tmp$fit <- NULL
tmp$invmvalue <- splines::backSpline( tmp$meanvalue )
sums <- summaryshow( xy, tmp$meanvalue )
tmp$mean <- sums[1]
tmp$median <- sums[2]
tmp
}
# --- Source: substrate.host.R ---
NULL
# --- Source: host.parasite.R ---
NULL
# --- Source: simdata.R ---
NULL
# --- Source: redscale.R ---
NULL
# --- Source: init.simulation.R ---
init.simulation <- function( package = "ewing",
count = 200,
interact = FALSE,
messages = TRUE,
...)
{
community <- initOrgInfo( package, messages = messages, ... )
community <- initTemp( community, messages = messages, ... )
species <- getOrgFeature( community )[1:2]
hosts <- getOrgHosts( community, species )
if(messages) {
cat( "Creating simulation organism set using species:\n",
paste( species, collapse = ", " ), "\n\n" )
}
community <- setOrgInfo( community, species, hosts, package,
messages = messages, ... )
if(messages) {
cat( "\n" )
}
species <- unique( species )
num <- numeric( length( species ))
names( num ) <- species
count <- rep_len(count, length(species))
names(count) <- species
for( i in species ) {
num[i] <- reuse <- count[i]
if(messages | (interact & interactive())) {
cat( paste( "Initialize ", i, " at size ", reuse, sep = "" ))
}
if(interact & interactive()) {
cat(" :")
r <- readline( )
if( r != "" & is.na( pmatch( substring( r, 1, 1 ), c("y","Y") )))
reuse <- suppressWarnings(as.numeric( r ))
if( is.na( reuse ))
reuse <- count[i]
}
if( reuse ) {
if(messages) {
cat( "...\n" )
}
community <- init.population( community, i, n = reuse, messages = messages, ... )
num[i] <- reuse
}
}
class( community ) <- c("ewing", "list")
attr(community, "count") <- count
community
}
# --- Source: init.population.R ---
init.population <- function( community, species, n = 200, width = 100,
units = getOrgFeature( community, species, "units" ),
timeit = FALSE,
reject = Inf,
position = rtri( n, width ),
colnames = c(leftistnames,paramnames,posnames,eventnames),
init.stage = istage,
init.weight = getOrgFuture( community, species, "init" ),
messages = TRUE,
...)
{
leftistnames <- c("dist","left","right","up")
paramnames <- c("dispersion","location","intensity","truncation","rejection")
posnames <- paste("pos",letters[1:3], sep = ".")
eventnames <- c("time","stage","future","offspring","sex","sub.stage","sub.future")
organism <- matrix( 0, length( colnames ), n+1,
dimnames = list( colnames, NULL ))
organism["time",1] <- Inf
## 5-parameter initialization
organism[c("dispersion","intensity"),-1] <- 1
organism["rejection",-1] <- if( reject == Inf )
rep( Inf, n )
else
reject * stats::rexp( n )
## triangular coordinates
organism[posnames,-1] <- position
## substrate
substrate.name <- getOrgFeature( community, species, "substrate" )
if( !is.na( substrate.name )) {
substrate <- getOrgInteract( community, substrate.name, species, "init" )
organism["sub.stage",-1] <- organism["sub.future",-1] <- sample( length( substrate ),
n, replace = TRUE, prob = substrate / sum( substrate ))
}
## randomly generate events proportional to future time units
nstage <- length( init.weight )
istage <- sample( nstage, n, replace = TRUE, prob = init.weight / sum( init.weight ))
init.stage <- array( init.stage, n )
organism["stage",-1] <- init.stage
## schedule future events
if( timeit )
proctime <- proc.time()
organism[,-1] <- get.future( community, species, organism[,-1] )
if( timeit ) {
tmp <- proc.time() - proctime
cat( "future time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
}
## create leftist tree
if( timeit )
proctime <- proc.time()
community <- put.species( community, species, leftist.create( organism ))
if( timeit ) {
tmp <- proc.time() - proctime
cat( "leftist time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
}
## mean number of offspring
if( timeit )
proctime <- proc.time()
#***This is where parasite is crashing--no offspring?**
community <- initOffspring( community, species )
if( timeit ) {
tmp <- proc.time() - proctime
cat( "offspring time: user=", tmp[1], "system=", tmp[2], "total=", tmp[3], "\n" )
}
if(messages) {
cat( "Initializing events for", species, "with", ncol( organism ) - 1, "individuals\n" )
}
community
}
# --- Source: init.timing.R ---
###########################################################################################
### Timing of simulation run
###########################################################################################
init.timing <- function( community )
{
## initialize timing
events <- NULL
for( species in get.species( community ))
events <- c( events, levels( getOrgFuture( community, species, "event" )))
events <- sort( unique( events ))
tmp <- c("total",events,"refresh","other")
cpu <- matrix( 0, 3, length( tmp ),
dimnames = list( c("user","system","total"), tmp ))
community$cpu <- cpu
community <- set.timing( community, "total" )
community
}
###########################################################################################
set.timing <- function( community, string, flag = -1 ) {
if( !is.null( community$cpu ))
community$cpu[,string] <- community$cpu[,string] + flag * proc.time()[1:3]
community
}
###########################################################################################
fini.timing <- function( community )
{
if( !is.null( community$cpu )) {
community <- set.timing( community, "total", 1 )
community$cpu[,"other"] <- community$cpu[,"total"] - apply( community$cpu[,-1], 1, sum )
}
community
}
# --- Source: initCount.R ---
###########################################################################################
### Simulation count object administration
###########################################################################################
initCount <- function( community, species, debugit = FALSE, file = NULL, append = FALSE,
messages = TRUE, ... )
{
if(messages) {
cat( "initial" )
for( i in species)
cat( ":", i, sum( apply( get.species( community, i ), 2,
function(x) !all(x[c("dist","left","right","up")]==1))) - 1 )
cat( "\n" )
}
old_counts <- if (append) getCount( community, , "counts" ) else NULL
old_step <- if (append) getCount( community, , "step" ) else 0
count <- list()
## leftist tree counters
count$mintime <- numeric( length( species ))
count$base <- numeric( length( species ))
names( count$base ) <- names( count$mintime ) <- species
count$free <- list()
## initialize lists to keep track of events
count$events <- count$countage <- count$countsub <- count$nameage <- count$namesub <- list()
## Set up hour to degreeday spline based on range of hours if any
simmin <- c(hr=Inf,DD=Inf)
for( i in species ) {
if( is.null( get.species( community, i )))
stop( paste( "Missing species", i ))
count$free[[i]] <- 1
count$base[i] <- get.base( community, i )
units <- getOrgFeature( community, i, "units" )
tmp <- get.individual( community, i )["time"]
if( tmp < simmin[units] )
simmin[units]<- tmp
}
if( max( simmin ) < Inf ) {
community <- activeTemp( community, simmin["hr"], , simmin["DD"], messages = messages )
}
esums <- c("initial","during","final")
tmpfn <- function( counter )
{
rownames <- levels( counter )
array( 0, length( rownames ), dimnames = list( rownames ))
}
subclass <- getOrgFeature( community, species, "subclass" )
names( subclass ) <- species
for( i in species ) {
species.time <- get.individual( community, i )["time"]
count$mintime[i] <- getTime( community, i, species.time )
future <- getOrgFuture( community, i )
## possible future events
count$events[[i]] <- matrix( 0, nrow( future ), length( esums ),
dimnames = list( as.character( future$current ), esums ))
## current record of future events
count$countage[[i]] <- tmpfn( getOrgFuture( community, i, "ageclass" ))
count$countsub[[i]] <- tmpfn( getOrgInteract( community,, i, "substrate" ))
if( species.time < Inf ) {
## count by age groups
stage <- getOrgAlive( community, i, "stage" )
if( length( stage )) {
classes <- getOrgAgeClass( community, i, stage )
tmp <- table( classes )
count$countage[[i]][ names( tmp ) ] <- tmp
}
## count by substrate
substage <- getOrgAlive( community, i, "sub.stage" )
## only for individuals of class = subclass[i]
substage <- substage[ subclass[i] == getOrgAgeClass( community, i, stage ) ]
if( length( substage )) {
classes <- getOrgInteract( community,, i, "substrate" )
tmp <- table( classes[substage] )
count$countsub[[i]][ names( tmp ) ] <- tmp
}
}
}
count$debug <- debugit
# If file is NULL, then don't write to file; keep counts internal
count$file <- file
if (append && !is.null(old_counts)) {
count$counts <- old_counts
count$step <- old_step
}
community$count <- count
## Put counts in file
community <- putCount( community, append )
## tally events at start of simulation
setEvents( community, "initial" )
}
###########################################################################################
getCount <- function( community, species, element )
{
count <- community$count[[element]]
if( !missing( species ))
count <- count[[species]]
count
}
###########################################################################################
set.step <- function( community, step )
setCount( community,, list( step = step ))
###########################################################################################
setCount <- function( community, species, elements )
{
count <- community$count
for( i in names( elements )) {
if( missing( species ))
count[[i]] <- elements[[i]]
else
count[[i]][[species]] <- elements[[i]]
}
community$count <- count
community
}
# --- Source: future.events.R ---
future.events <- function( community,
nstep = 4000,
species = get.species( community ),
refresh = nstep / 20, cex = 0.5,
substrate.plot = TRUE, extinct = TRUE,
timeit = TRUE, debugit = FALSE,
messages = TRUE, append = NULL, ... )
{
## Integrity check of dataset, and initialization of tallies.
if( missing( community ))
stop( "Must specify a community." )
if (is.null(append)) {
append <- !is.null(community$count$counts) && nrow(community$count$counts) > 0
}
if( debugit ) cat( "initialization\n" )
community <- initCount( community, species, debugit = debugit, file = NULL,
append = append, messages = messages )
if( timeit )
community <- init.timing( community )
mintime <- getCount( community, , "mintime" )
species.now <- species[ mintime == min( mintime ) ][1]
future <- getOrgFuture( community, species.now )
# Set up list for plot information.
p <- list()
pstep <- 0
if (!is.null(community$plot)) {
p <- community$plot
pstep <- length(p)
}
start_step <- if (append && !is.null(community$count$step)) community$count$step else 0
## for nstep steps schedule future events and process immediate events
for( istep in seq( nstep )) {
## stop if any extinct and extinct flag on, or all extinct
omintime <- mintime
mintime <- getCount( community, , "mintime" )
if( debugit ) print( mintime )
if( min( mintime ) < min( omintime )) {
cat( "time reversal!\n" ) # should not happen
browser()
}
tmp <- mintime == Inf
if( any( tmp )) {
if( extinct | all( tmp )) {
for( i in names( mintime )[tmp] )
cat( "***", i, "is extinct ***\n" )
if( plotit )
plot.ewing( community, substrate = substrate.plot, cex = cex, ...)
break
}
}
## each species is always sorted so 1st element is next future event
species.prev <- species.now
species.now <- species[ mintime == min( mintime ) ][1]
individual <- get.individual( community, species.now )
if( is.na( individual["time"] ) | individual["time"] == Inf ) {
cat( "No more finite future events. End of simulation.\n" )
break
}
if( all( individual[c("dist","left","right","up")] == 1 )) {
cat( individual["time"], ": last", species.now, "alive",
getCount( community, species.now, "base" ), "\n" )
}
if( species.now != species.prev )
future <- getOrgFuture( community, species.now )
## make future event the current stage
current <- individual["stage"]
stage <- as.character( future$current[current] )
if(!length(stage))
stop(paste("no stage", current))
community <- updateCount( community, species.now, individual, stage == "death",
start_step + istep )
individual["stage"] <- current
individual["sub.stage"] <- individual["sub.future"]
community <- put.individual( community, species.now, individual )
if( debugit ) {
cat( species.now, istep, "base",
getCount( community, species.now, "base" ), "\n" )
print( c( step = istep,
countage = sum( getCount( community, species.now, "countage" )),
countsub = sum( getCount( community, species.now, "countsub" )),
round( individual["time"], 2 ), current, stage ))
}
## processing of immediate, pending and future events
## this is the main show--all the rest is setup
event.type <- as.character( future[ current, "event" ] )
if( debugit ) cat( "do", event.type, istep, stage,
as.character( future$current[ individual["future"] ] ),
individual["time"], "\n" )
community <- set.timing( community, event.type )
if( event.type == "death" )
community <- event.death( community, species.now )
else {
if( event.type != "future" ) {
## this routine could be user supplied
## generic routines are event.birth, event.attack
event.parsed <- get( paste( "event", event.type, sep = "." ))
community <- event.parsed( community, species.now )
}
community <- event.future( community, species.now )
}
community <- set.timing( community, event.type, 1 )
## refresh plot
if( refresh & ! ( istep %% refresh )) {
community <- set.timing( community, "refresh" )
# Save the ewing_ageclass and ewing_substrate objects.
pstep <- pstep + 1
p[[pstep]] <- ewing_snapshot(community, start_step + istep, ...)
if(messages) {
cat( "refresh", istep )
for( j in get.species( community ))
cat( ":", j, sum( getCount( community, j, "countage" ), na.rm = TRUE ))
cat( "\n" )
}
community <- set.timing( community, "refresh", 1 )
}
## periodic browser if in debug mode
if( debugit ) {
cat( "done", istep, "\n" )
if( refresh & !( istep %% refresh )) {
cat( "Type \"c\" to continue or \"Q\" to quit.\n" )
browser()
}
}
}
community <- set.timing( community, "refresh" )
## end of main loop on future events
if( debugit ) cat("done\n")
if( sum( getOrgAlive( community, species.now )) > 1 ) {
## tally events at end of simulation
community <- setEvents( community, "final" )
}
community <- set.timing( community, "refresh", 1 )
community <- fini.timing( community )
community$step <- start_step + nstep
attr(community, "nstep") <- start_step + nstep
if( !refresh | (nstep%%refresh)) {
pstep <- pstep + 1
p[[pstep]] <- ewing_snapshot(community, start_step + istep, ...)
}
community$plot <- p
community
}
# --- Source: event.R ---
## $Id: event.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
##
## event.birth( community, species )
## event.attack( community, species )
##
## Issues to resolve:
## 2. search strategy for predator/parasite/parasitoid
## 3. generic calls to do.x
###############################################################################
event.birth <- function( community, species )
{
## now only one offspring at a time,
## but could depend on individual
offspring <- get.offspring( community, species)
## update parent based on anticipated offspring
community <- parent.birth( community, species, offspring )
if( offspring ) {
## get new births
newbirths <- get.birth( community, species, offspring )
## merge births into community
community <- set.birth( community, species, newbirths )
}
community
}
###############################################################################
parent.birth <- function( community, species, offspring )
{
## get individual record
individual <- get.individual( community, species )
individual["offspring"] <- individual["offspring"] - offspring
## female starves when egg load depleted (less than or equal to 0)
if( individual["offspring"] <= 0 )
individual["stage"] <- set.future( community, species, "starved" )
community <- put.individual( community, species, individual )
}
###############################################################################
get.birth <- function( community, species, offspring )
{
## get individual record
individual <- get.individual( community, species )
## matrix of new offspring for community
newbirths <- matrix( individual, length( individual ), offspring )
dimnames( newbirths ) <- list( names( individual ), NULL )
if( offspring ) {
## assumes newborn is stage 1, and next stage is 2
newbirths["stage",] <- 1
newbirths["future",] <- 2
## set up as unlinked node for leftist tree
newbirths[c("dist","left","right","up"),] <- 1
## disperse offspring across substrate types
newbirths <- event.move( community, species, newbirths )
}
if( getCount( community,, "debug" ))
cat( round( individual["time"] ),
getOrgFeature( community, species, "units" ),
":", species, "offspring", individual["offspring"], "\n" )
if( offspring ) {
## get future events for new organisms
get.future( community, species, newbirths)
}
else
community
}
###############################################################################
get.deplete <- function( community, species )
{
## get individual record of attacker
individual <- get.individual( community, species )
## Deplete reserves based on time spent searching for host.
individual["offspring"] <- individual["offspring"] -
( individual["time"] - individual["location"] ) /
getOrgFeature( community, species, "deplete" )
community <- put.individual( community, species, individual )
}
###############################################################################
set.future <- function( community, species, stage )
{
current <- getOrgFuture( community, species, "current" )
seq( length( current ))[ current == stage ]
}
###############################################################################
### Interaction Events (only attack for now)
###############################################################################
event.attack <- function( community, species )
{
## dyadic event: attack of host by adult parasitoid
## deplete individual based on time spent searching for host
community <- get.deplete( community, species )
## get individual record of attacker
individual <- get.individual( community, species )
## find a host if parasite has offspring reserve left
if( individual["offspring"] > 0 ) {
## get name of host for attacker
host <- getOrgFeature( community, species, "attack" )
## get attack parasite and event types
attack <- get.attack( community, species, individual )
## find host located on the same substrate
found <- event.find( community, species, host, attack["event"] )
if( length( found )) {
## host-parasite interaction
event.parsed <- get( paste( "event", attack["event"], sep="." ))
community <- event.parsed( community, species, host, found )
event.parsed <- get( paste( "host", attack["parasite"], sep="." ))
community <- event.parsed( community, species, host, found )
individual <- get.individual( community, species )
}
}
if( individual["offspring"] > 0 ) {
## parasite moves along substrate
individual <- event.move( community, species, individual )
}
else {
## parasite dies if it does not feed enough
individual["stage"] <- set.future( community, species, "starved" )
}
## put updated individual back in community
community <- put.individual( community, species, individual )
}
###############################################################################
get.attack <- function( community, species, individual )
{
## get parasite type ("ecto" or "endo") and current event ("feed" or "ovip")
parasite <- getOrgFeature( community, species, "parasite" )
event <- getOrgFuture( community, species, "current", individual["future"] )
event <- as.character( event )
if( parasite=="endo" )
event <- "ovip"
else if( individual["offspring"] < 1 ) {
## must feed if depleted
event <- "feed"
}
c( event = event, parasite = parasite )
}
###############################################################################
host.ecto <- function( community, species, host, dead )
{
## ectoparasites effectively kill their host
## get individual doing the attack
individual <- get.individual( community, species )
## get host individual that is attacked
hostindiv <- get.individual( community, host, dead )
## set host time to now, which may involve hr-DD translation
hostindiv["time"] <- transTime( community, species, host, individual["time"] )
## schedule immediate death of host
hostindiv["future"] <- set.future( community, host, "death" )
## update host record in community
community <- put.individual( community, host, hostindiv, dead )
## update leftist tree and mintime
community <- put.species( community, host,
leftist.update( get.species( community, host ), dead ))
update_mintime( community, host )
}
###############################################################################
host.endo <- function( community, species, host, dead, harm )
{
## endoparasites reduces capacity of host (assumed by half here)
## get host individual that is attacked
hostindiv <- get.individual( community, host, harm )
## schedule harm for hosts (reduce egg capacity by half)
hostindiv["offspring"] <- floor( hostindiv["offspring"] / 2 )
if( hostindiv["offspring"] == 0 ) {
## get individual doing the attack
individual <- get.individual( community, species )
## set host time to now, which may involve hr-DD translation
hostindiv["time"] <- transTime( community, species, host, individual["time"] )
## schedule immediate death of host
hostindiv["future"] <- set.future( community, host, "death" )
}
## update host record in community
community <- put.individual( community, host, hostindiv, harm )
if( hostindiv["offspring"] == 0 ) {
## update leftist tree and mintime
community <- put.species( community, host,
leftist.update( get.species( community, host ), dead ))
community <- update_mintime( community, host )
}
community
}
###############################################################################
event.feed <- function( community, species, host, dead )
{
## feed: adult parasite feeds on host
interact <- get.interact( community, species, host, dead, "feed" )
## host-parasite interaction: feeding
if( interact ) {
individual <- get.individual( community, species )
individual["offspring"] <- individual["offspring"] + interact
community <- put.individual( community, species, individual )
}
community
}
###############################################################################
event.ovip <- function( community, species, host, dead, gender=TRUE )
{
## ovip: adult lays egg in the host to emerge later as adult
offspring <- get.offspring( community, species )
interact <- get.interact( community, species, host, dead, "ovip" )
## host-parasite interaction: feeding
if( interact ) {
## update parent individual, depleting energy after egg laying
community <- parent.birth( community, species, offspring )
## get new births
newbirths <- get.birth( community, species, offspring )
## gender preference for offspring
if( get.interact( community, species, host, dead, "male" ) < stats::runif( 1 ) |
!gender ){
## set offspring for female eggs based on dead host
newbirths["offspring", ] <- set.offspring( community, species, host, dead )
}
else {
## produce male and put on queue for immediate death
newbirths <- set.male( community, species, host, newbirths )
}
community <- set.birth( community, species, newbirths )
}
community
}
###############################################################################
set.male <- function( community, species, host, newbirths )
{
## produce male offspring, which is queued for immediate death
newbirths["future",1] <- set.future( community, species, "male" )
newbirths["time",1] <- get.individual( community, species )["time"]
newbirths
}
# --- Source: event.future.R ---
event.future <- function( community, species )
{
## schedule future event based on current stage
individual <- get.future( community, species )
## move if appropriate
individual <- event.move( community, species, individual )
## update time translation if needed
community <- checkTime( community, individual["time"],
getCount( community, species, "mintime"),
getOrgFeature( community, species, "units" ))
## put updated individual back in community
community <- put.individual( community, species, individual )
## reprioritize the leftist tree if time has changed
if( individual["time"] > individual["location"] ) {
## and time is longer than next scheduled time
if( individual["time"] >
min( get.species.element( community, species, "time",
individual[c("left","right")] ))) {
## remove individual from leftist tree
community <- put.species( community, species,
leftist.update( get.species( community, species )))
}
community <- update_mintime( community, species )
}
community
}
# --- Source: Events.R ---
###########################################################################################
updateEvents <- function( community, species, event, increment = 1 )
{
community$count$events[[species]][event,"during"] <-
community$count$events[[species]][event,"during"] + increment
community
}
###########################################################################################
setEvents <- function( community, period )
{
count <- community$count
for( species in get.species( community )) {
current <- getOrgFuture( community, species, "current" )
events <- rep( 0, length( current ))
names( events ) <- as.character( current )
stage <- getOrgAlive( community, species, "stage" )
if( length( stage )) {
tmp <- tapply( stage, current[stage], length )
tmp[ is.na( tmp ) ] <- 0
events[ names( tmp ) ] <- tmp
}
count$events[[species]][,period] <- events
}
community$count <- count
community
}
# --- Source: leftist.R ---
## $Id: leftist.R,v 1.0 2002/12/11 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## This version has list structure for individuals.
## In addition it will keep species separate.
###########################################################################################
## Triply linked leftist trees
###########################################################################################
leftist.tree <- function( x,
tree = data.frame( root = empty ),
key = "time",
empty = c( time = NA, dist = 1, left = 1, right = 1, up = 1 ))
{
node <- empty
node[key] <- Inf
node[c("right","left")] <- 2
node["dist"] <- 0
if( missing( tree ))
names( tree ) <- NULL
node <- empty
node[key] <- x[1]
base <- 2
tree[[base]] <- node
for( i in 1 + seq( 2, length( x ))) {
node <- empty
node[key] <- x[i-1]
if( node[key] <= tree[[base]][key] ) {
## insert at root
node["left"] <- base
tree[[base]]["up"] <- i
base <- i
tree[[base]] <- node
}
else {
tree[[i]] <- node
## insert in tree (e.g. merge two trees)
tree <- as.data.frame( leftist.merge( as.matrix( tree ), i, base ))
base <- tree["up",1]
}
}
tree[[1]][c("right","left","up")] <- base
tree
}
###########################################################################################
leftist.create <- function( tree, key = "time" )
{
## assume 1st element of tree is for base
## and keys are in place already
base <- 2
tree[c("right","left","up"),] <- 1
tree["dist",-1] <- 1
ntree <- ncol( tree )
for( i in seq( 3, ntree )) {
if( tree[key,i] <= tree[key,base] ) {
## insert at root
tree["left",i] <- base
tree["up",base] <- i
base <- i
}
else {
## insert in tree (e.g. merge two trees)
tree <- leftist.merge( tree, i, base )
base <- tree["up",1]
}
}
## set 1st element to point to base
tree[c("right","left","up"),1] <- base
tree
}
###########################################################################################
leftist.merge <- function( tree, P = 1, Q = 1, R = 1, key = "time" )
{
while( TRUE ) {
if( P == 1 ) {
P <- Q
Q <- 1
}
if( Q == 1 ) {
D <- tree["dist",P]
while( R > 1 ) {
Q <- tree["right",R]
temp <- tree["left",R]
if( tree["dist",temp] < D ) {
D <- tree["dist",temp] + 1
tree["right",R] <- tree["left",R]
tree["left",R] <- P
}
else {
D <- D + 1
tree["right",R] <- P
}
tree["up",P] <- R
tree["dist",R] <- D
P <- R
R <- Q
}
tree["up",P] <- 1
tree[c("left","right","up"),1] <- P
return( tree )
}
## merge two right lists
if( tree[key,P] <= tree[key,Q] ) {
temp <- tree["right",P]
tree["right",P] <- R
tree["up",R] <- P
R <- P
P <- temp
}
else {
temp <- tree["right",Q]
tree["right",Q] <- R
tree["up",R] <- Q
R <- Q
Q <- temp
}
}
tree["up",1] <- P
tree[c("left","right","up"),P] <- 1
tree
}
###########################################################################################
leftist.remove <- function( tree, P )
{
oldbase <- tree["up",1]
up <- tree["up",P]
## merge the subtrees below P
tree <- leftist.merge( tree, tree["left",P], tree["right",P] )
## reset node to empty
tree[c("up","left","right","dist"),P] <- 1
## return if base node removed
if( oldbase == P )
return( tree )
## make up node leftist
if( tree["left",up] == P )
tree["left",up] <- tree["right",up]
tree["right",up] <- 1
tree["dist",up] <- 1
## traverse back up the tree to make sure it is leftist to base
upup <- tree["up",up]
left <- tree["left",upup]
right <- tree["right",upup]
while( tree["dist",left] < tree["dist",right] ) {
tree["dist",upup] <- tree["dist",left] + 1
tree["left",upup] <- right
tree["right",upup] <- left
upup <- tree["up",upup]
left <- tree["left",upup]
right <- tree["right",upup]
}
## merge down and up trees
leftist.merge( tree, oldbase, tree["up",1] )
}
###########################################################################################
leftist.birth <- function( organism, neworg, free )
{
newbase <- organism["up",1]
norganism <- ncol( neworg )
j <- norganism
nfree <- free[1]
while( j > 0 & nfree > 1 ) {
newbabe <- free[nfree]
organism[,newbabe] <- neworg[,j]
organism <- leftist.merge( organism, newbase, newbabe )
newbase <- organism["up",1]
nfree <- nfree - 1
free[1] <- nfree
j <- j - 1
}
if( j > 0 ) {
norganism <- ncol( organism )
js <- 1:j
organism <- cbind( organism, neworg[,js] )
for( i in norganism + js ) {
organism <- leftist.merge( organism, newbase, i )
newbase <- organism["up",1]
}
}
list( tree = organism, base = newbase, free = free )
}
###########################################################################################
leftist.free <- function( free, id )
{
free[1] <- tmp <- free[1] + 1
free[tmp] <- id
free
}
###########################################################################################
leftist.update <- function( tree, P = tree["up",1] )
{
tree <- leftist.remove( tree, P )
leftist.merge( tree, tree["up",1], P )
}
# --- Source: community.R ---
get.organisms <- function(datafile = "") {
org <- list(species = c("host", "parasite"), substrates = "substrate")
if(datafile != "") {
if(tools::file_ext(datafile) %in% c("xls","xlsx")){
sheets <- readxl::excel_sheets(datafile)
species <- stringr::str_remove(
sheets[stringr::str_detect(sheets, "future\\.")],
"future\\.")
substrates <- unique(stringr::str_remove(
sheets[stringr::str_detect(sheets, paste("\\.", species, sep = "", collapse = "|")) &
!stringr::str_detect(sheets, paste(c("future", species), "\\.", sep = "", collapse = "|"))],
"\\..*"))
org <- list(species = species, substrates = substrates)
}
}
org
}
###########################################################################################
get.species <- function( community, species ) {
if( missing( species ))
return( names( community$pop ))
if( is.numeric( species ))
species <- names( community$pop )[species]
if( is.null( species ) || !species %in% names( community$pop ))
return( NULL )
ans <- community$pop[[species]]
if (is.list(ans) && !is.matrix(ans) && !is.data.frame(ans) && !is.null(ans$org)) {
ans <- ans$org
}
if (is.matrix(ans) || is.data.frame(ans)) {
if (!"up" %in% rownames(ans) && (is.null(colnames(ans)) || colnames(ans)[1] != "dummy")) {
dummy <- ans[, 1, drop = FALSE]
colnames(dummy) <- "dummy"
return(cbind(dummy, ans))
}
}
ans
}
###########################################################################################
get.species.element <- function( community, species, rows, cols )
community$pop[[species]][rows,cols]
###########################################################################################
put.species <- function( community, species, value )
{
community$pop[[species]] <- value
community
}
###############################################################################
put.individual <- function( community, species, individual,
id = get.base( community, species ))
{
community$pop[[species]][,id] <- individual
community
}
###############################################################################
get.individual <- function( community, species,
id = get.base( community, species ))
community$pop[[species]][,id]
###############################################################################
get.base <- function( community, species )
community$pop[[species]]["up",1]
# --- Source: c.ewing.R ---
c.ewing <- function(...) {
communities <- list(...)
if(length(communities) < 2) {
if(length(communities) == 1)
return(communities[[1]])
return(NULL)
}
community <- communities[[1]]
# *** need to verify that all communities have save structure
# Elements org, temp should be identical
for(comi in seq(2, length(communities))) {
# Element pop
for(species in names(community$pop)) {
community$pop[[species]] <-
cbind(community$pop[[species]], communities[[comi]]$pop[[species]])
}
# Element cpu
community$cpu <- community$cpu + communities[[comi]]$cpu
}
# Element plot is more complicated as it contains items for plots
# Probably want some form of appendX functions
}
# --- Source: move.R ---
## $Id: move.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###############################################################################
event.move <- function( community, species, individual )
{
individual <- as.matrix( individual )
## move only if individual is in stage that moves
if( all( is.move( community, species, individual ))) {
## move among substrates?
individual["sub.future",] <-
sampleOrgSubstrate( community, species, individual["sub.stage",] )
## move to new position in substrate
position <- paste( "pos", letters[1:3], sep = "." )
individual[position,] <- rtri( ncol( individual ), 10, individual[position,] )
}
if( ncol( individual ) == 1 )
individual <- individual[,1]
individual
}
###############################################################################
is.move <- function( community, species, individual )
{
!is.na( match( getOrgFeature( community, species, "move" ),
getOrgFuture( community, species, "current" )[ individual["stage",] ] ))
}
###############################################################################
event.find <- function( community, species, host, event )
{
individual <- get.individual( community, species )
substrate <- individual["sub.stage"]
## pending event: need to find available hosts on substrate
avail <- get.alive( community, host, substrate )
navail <- length( avail )
if( !navail )
return( avail )
## preferences based on schedule
interact <- get.interact( community, species, host, avail, event )
if( length( event ) > 1 )
interact <- apply( interact, 1, sum )
sinteract <- sum( interact )
if( sinteract ) {
if( navail > 1 ) {
found <- sample( avail, 1, prob = interact / sinteract )
}
else
found <- avail
found
}
else
numeric(0)
}
# --- Source: offspring.R ---
## $Id: init.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## Offspring Information
##########################################################################################
getOffspring <- function( community, species,
offspring = getOrgFeature( community, species, "offspring" ))
{
if( is.na( offspring ))
return( 0 )
if( is.numeric( offspring ))
return( offspring )
getOrgInteract( community, offspring, species, "offspring" )
}
##########################################################################################
initOffspring <- function( community, species )
{
hostname <- getOrgFeature( community, species, "offspring" )
## find if there is offspring load based on host
orgoffspring <- getOffspring( community, species, hostname )
norganism <- sum( getOrgAlive( community, species ))
if( length( orgoffspring ) == 1 ) {
## mean offspring does not depend on any host
offspring <- stats::rpois( norganism, orgoffspring )
}
else {
orgoffspring <- orgoffspring[ orgoffspring > 0 ]
if(!length(orgoffspring))
return(community)
## figure out initial offspring load based on host distribution
## mean offspring depends on host stages and events
host <- get.species( community, hostname )
if( is.null( host ))
stop( paste( "Host", hostname, "not initiated yet" ))
## get weights of host stages in terms of future event times
host <- host[ , getOrgAlive( community, hostname ) ]
## find host stages that are preferred by parasite
## need to take subset of current that are actually in host
hoststages <- match( names( orgoffspring ), getOrgFuture( community, hostname )$current,
nomatch = 0 )
host <- as.matrix( host[ , !is.na( match( host["stage",], hoststages )) ] )
if( ncol( host ) == 0 )
return( community )
tmp <- !is.na( match( hoststages, host["stage",] ))
hoststages <- hoststages[tmp]
orgoffspring <- orgoffspring[tmp]
if(!length(orgoffspring))
return(community)
dd <- tapply( host["time",], host["stage",], sum )
dd[ as.character( hoststages[
is.na( match( hoststages, names( dd ))) ] ) ] <- 0
dd[ is.na( dd ) ] <- 0
sdd <- sum( dd )
if( length( dd ) > 1 & sdd > 0)
offspring <- as.vector( sample( orgoffspring, norganism, replace = TRUE,
prob = dd / sdd ))
else
offspring <- rep( ( sdd > 0 ) * orgoffspring[1], norganism )
offspring[ is.na( offspring ) ] <- 0
}
organism <- get.species( community, species )
organism["offspring",-1] <- offspring
put.species( community, species, organism )
}
###############################################################################
get.offspring <- function( community, species )
{
individual <- get.individual( community, species )
if( individual["offspring"] > 0 )
1
else
0
}
###########################################################################################
set.offspring <- function( community, species, host, dead )
{
stage <- get.species.element( community, host, "stage", dead )
current <- getOrgFuture( community, host, "current", stage )
offspring <- getOrgInteract( community, host, species, "offspring")
offspring <- as.vector( offspring[ as.character( current ) ] )
offspring[ is.na( offspring ) ] <- 0
offspring
}
# --- Source: sim.R ---
## $Id: sim.R,v 0.9 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
### migrate count$count* to writeCount and then retrieve with readCount
###########################################################################################
updateCount <- function(community, species, individual, is.death = FALSE, step) {
community <- updateEvents(community, species, individual["future"])
if (!missing(step)) {
community <- setCount(community, elements = list(step = step))
}
## move individual through age classes or drop if it dies
countage <- getCount( community, species, "countage" )
ageclass <- getOrgAgeClass( community, species, individual["stage"] )
if( !is.na( ageclass )) {
ageclass <- as.character( ageclass )
countage[ageclass] <- max(countage[ageclass] - 1, 0)
}
ageclass <- getOrgAgeClass( community, species, individual["future"] )
if( !is.na( ageclass )) {
ageclass <- as.character( ageclass )
countage[ageclass] <- countage[ageclass] + 1
}
## move individual across substrate elements or drop if it dies
countsub <- getCount( community, species, "countsub" )
substrate <- getOrgFeature( community, species, "substrate" )
elements <- getOrgInteract( community, substrate, species, "substrate" )
element <- elements[ individual["sub.stage"] ]
subclass <- getOrgFeature( community, species, "subclass" )
include <- subclass == getOrgAgeClass( community, species, individual[c("stage","future")] )
# need 2 values; if only one, replicate it.
include <- rep_len(include, 2)
## leave old substrate
if (!is.na(element) && include[1]) {
element <- as.character( element )
countsub[element] <- max(countsub[element] - 1, 0)
}
if (!is.death && include[2]) {
## move to new substrate
newsub <- individual["sub.future"]
if( !is.na( newsub )) {
element <- elements[newsub]
if( !is.na( element )) {
element <- as.character( element )
countsub[element] <- countsub[element] + 1
}
}
}
## record counts
community <- setCount( community, species,
list( countage = countage, countsub = countsub ))
community <- writeCount( community, species, individual["time"], individual["future"],
countage, countsub )
}
###########################################################################################
updateCounts <- function( community, species, newbirths )
{
community <- updateEvents( community, species, 1, newbirths )
countage <- getCount( community, species, "countage" )
countsub <- getCount( community, species, "countsub" )
subclass <- getOrgFeature( community, species, "subclass" )
ageclass <- getOrgAgeClass( community, species, 1 )
individual <- get.individual( community, species )
if( !is.na( ageclass[1] )) {
ageclass <- as.character( ageclass )
countage[ageclass] <- newbirths + countage[ageclass]
if( subclass == ageclass ) {
substrate <- getOrgSubstrate( community, species, individual["sub.stage"] )
if( !is.na( substrate[1] )) {
substrate <- as.character( substrate )
countsub[substrate] <- newbirths + countsub[substrate]
}
}
}
community <- setCount( community, species,
list( countage = countage, countsub = countsub ))
community <- writeCount( community, species, individual["time"], 1, countage, countsub )
}
###########################################################################################
put.base <- function( community, species, id,
free = getCount( community, species, "free" ))
{
base <- get.base( community, species )
if( !missing( id ))
free <- leftist.free( free, id )
mintime <- max( getCount( community, species, "mintime" ),
getTime( community, species,
get.species.element( community, species, "time", base )))
setCount( community, species, list( base = base, free = free, mintime = mintime ))
}
# --- Source: simple.R ---
simpleServer <- function(id) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
})
}
simpleInput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::h4("Simulation Settings"),
shiny::sliderInput(ns("steps"),
label = "Simulation steps:",
min = 1000,
max = 10000,
value = 1000,
step = 500),
shiny::radioButtons(ns("nsim"),
"Number of Simulations",
c(1,10,20,50,100,200),
1, inline = TRUE),
shiny::actionButton(ns("go"), "Start Simulation"),
shiny::HTML("<hr style='height:1px;border:none;color:#333;background-color:#333;' />"),
shiny::h4("Save Files"),
shiny::uiOutput(ns("version"))
)
}
simpleOutput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::radioButtons(ns("button"), "", c("Plots", "Input Data"),
"Plots", inline = TRUE),
)
}
simpleApp <- function(title = "Population Ethology") {
ui <- shiny::fluidPage(
shiny::titlePanel(title),
shiny::sidebarLayout(
shiny::sidebarPanel(
simpleInput("simple")
),
shiny::mainPanel(
simpleOutput("simple")
)))
server <- function(input, output, server) {
simpleServer("simple")
}
shiny::shinyApp(ui = ui, server = server)
}
# --- Source: ring.R ---
## $Id: ring.R,v 1.0 2002/12/09 yandell@stat.wisc.edu Exp $
##
## Functions for Bland Ewing's modeling.
##
## Copyright (C) 2000,2001,2002 Brian S. Yandell.
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## These functions are distributed in the hope that they will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## The text of the GNU General Public License, version 2, is available
## as http://www.gnu.org/copyleft or by writing to the Free Software
## Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
###########################################################################################
## Doubly linked rings
###########################################################################################
ring.add <- function( ring = data.frame( root = c( key = NA, left = 1 + nx, right = 2 )),
x )
{
nx <- length( x )
n1 <- ring["left","root"]
ring[[ as.character( n1 + 1 ) ]] <- c(
key = x[1],
left = suppressWarnings(as.numeric( ring["left","root"] )),
right = 1 )
if( nx > 1 ) for( i in seq( 2, nx ))
{
ring[[ as.character( n1 + i ) ]] <- c(
key = x[i],
left = n1+i-1,
right = 1 )
ring[ "right", as.character( n1 + i - 1 ) ] <- n1+i
}
ring["left","root"] <- n1 + nx
ring
}
###########################################################################################
ring.remove <- function( ring, P )
{
aP <- as.character( P )
if( is.na( match( aP, names( ring ))))
{
cat( paste( "Warning:", aP, "not found in ring\n" ))
return( ring )
}
left <- ring["left",aP]
right <- ring["right",aP]
ring[ "right", as.character( left ) ] <- right
ring[ "left", as.character( right ) ] <- left
ring[[aP]] <- NULL
ring
}
# --- Source: sierpinski.R ---
sierpinski <- function( stage = 5, reset = TRUE )
{
if( reset )
tmpar <- graphics::par( pty = "s", bty = "n", xaxt = "n", yaxt = "n", omi = rep(0,4),
mar = rep(0,4) )
aa <- 0:1
bb <- - aa
for( i in seq( stage )) {
tmp <- gasket( aa, bb )
aa <- tmp$aa
bb <- tmp$bb
tri <- tri2car.default( aa, bb )
r <- range( unlist( tri ))
plot( r, r, type = "n", xlab = "", ylab = "" )
graphics::lines(tri )
graphics::mtext( paste( "(", letters[1+i], ") Gasket of Order ", i, sep = "" ), 3, -2 )
# graphics::mtext( paste( "Gasket of order", i ), 3, -2 )
}
if( reset )
graphics::par( tmpar )
invisible( tri )
}
# --- Source: fileCount.R ---
putCount <- function( community, append = FALSE )
{
species <- get.species( community )
countage <- getCount( community,, "countage")
countsub <- getCount( community,, "countsub")
countbase <- getCount( community,, "base")
step_now <- if (append) (getCount( community,, "step" ) %||% 0) else 0
cnames <- c("step", "time", "future",
paste( "count",
seq( max( unlist( lapply( countage, length )) +
unlist( lapply( countsub, length )))),
sep = "" ))
cnums <- list()
for( i in species ) {
cnums[[i]] <- c(
step_now,
get.species.element( community, i, c("time","stage"), countbase[i] ),
countage[[i]],
countsub[[i]])
}
file <- getCount( community,, "file" )
if(!is.null(file) && is.character(file) && length(file) > 0) {
if( !( file.exists( file ) & append ))
cat( "species", cnames, "\n", file = file )
for( i in species ) {
cat( i, cnums[[i]], "\n", file = file, append = TRUE )
}
community
} else {
if(append) {
counts <- getCount( community,, "counts")
} else {
counts <- NULL
}
newcounts <- matrix(NA, length(species), length(cnames),
dimnames = list(species, cnames))
for(i in species) {
newcounts[i, seq_along(cnums[[i]])] <- cnums[[i]]
}
newcounts <- tibble::tibble(
data.frame(
species = species,
newcounts))
counts <- dplyr::bind_rows(
counts,
newcounts)
setCount( community,, list(counts = counts))
}
}
###########################################################################################
writeCount <- function( community, species, time, future, countage, countsub)
{
nstep <- getCount( community,, "step" )
cnums <- c(nstep, time, future, countage, countsub)
file <- getCount( community,, "file" )
if(!is.null(file) && is.character(file) && length(file) > 0) {
cat( species, cnums, "\n", file = file, append = TRUE )
community
} else {
counts <- getCount( community,, "counts")
cnames <- names(counts)[-1]
newcounts <- matrix(NA, 1, length(cnames),
dimnames = list(species, cnames))
newcounts[1, seq_along(cnums)] <- cnums
newcounts <- tibble::tibble(
data.frame(
species = species,
newcounts))
counts <- dplyr::bind_rows(
counts,
newcounts)
setCount( community,, list(counts = counts))
}
}
###########################################################################################
readCount <- function( community, species = unique(counts$species) )
{
file <- getCount( community,, "file" )
if(!is.null(file)) {
counts <- utils::read.table( file, header = TRUE, fill = TRUE )
} else {
counts <- getCount( community,, "counts")
}
count <- list()
for( i in species ) {
colnames <- c( levels( getOrgFuture( community, i, "ageclass" )),
levels( getOrgInteract( community,, i, "substrate" )))
count[[i]] <- as.matrix( counts[ counts$species == i, seq( 2, 4 + length( colnames )) ] )
dimnames( count[[i]] ) <- list( count[[i]][,"step"],
c( "step", "time", "future", colnames ))
}
count
}
# --- Source: count.join.R ---
count.join <- function( ... )
{
x <- list( ... )
numnum <- list()
for( i in seq( length( x ))) {
for( j in names( x[[i]] )) {
if( is.null( numnum[[j]] ))
numnum[[j]] <- x[[i]][[j]]
else
numnum[[j]] <- cbind( numnum[[j]], x[[i]][[j]] )
}
}
numnum
}
# --- Source: summary.ewing.R ---
summary.ewing <- function(object, ...) {
out <- list()
out$package <- object$org$package
out$species <- names(object$org$Future)
out$interact <- names(object$org$Interact)
out$meanvalue <- list()
for(i in out$species) {
out$meanvalue <- names(object$org$MeanValue[[i]])
}
if(length(object$pop)) {
out$stage <- list()
for(i in out$species)
out$stage[[i]] <-
table(object$org$Future[[i]]$current[getOrgAlive(object, i, "stage")])
}
if(!is.null(object$count)) {
out$events <- object$count$events
for( i in seq( length(out$events)))
out$events[[i]] <- apply(out$events[[i]], 2, function(x) {
tmp <- sum(x, na.rm = TRUE)
if(tmp > 0)
c(round(100 * x / tmp, 1), total = tmp)
else
c(x, total = 0)
})
}
out$cpu <- signif(object$cpu, 4)
class(out) <- c("summary.ewing", class(out))
out
}
print.summary.ewing <- function(x, ...) {
cat("Data initialization package:", x$package, "\n")
cat("Community species:", paste(x$species, collapse = ", " ), "\n")
cat("Community hosts:", paste(x$interact, collapse = ", "), "\n")
cat("Mean Value curves by species:")
mv <- FALSE
for(i in x$species) {
meanvalue <- x$meanvalue[[i]]
mv <- mv | !is.null(meanvalue)
if( !is.null(meanvalue)) {
cat("\n ", i, ":", paste( meanvalue, collapse = ", " ), "\n")
}
}
if(!mv)
cat(" none\n")
if(!is.null(x$stage)) {
cat("\nSimulation community has following counts:\n",
paste(x$species, lapply(x$stage, sum), sep = "=", collapse = ", "),
"\n")
print(x$stage)
}
if( !is.null( x$temp )) {
# ** later
}
if(!is.null(x$events)) {
print(x$events)
}
if(!is.null(x$cpu)) {
cat( "CPU timing by event in simulation\n" )
print(x$cpu)
}
}
# --- Source: summary_simobj.R ---
summary_simobj <- function(object) {
out <- sapply(object, function(x) {
if(is.list(x)) {
x <- names(x)
}
paste(x, collapse=",")
})
paste(paste(names(out), out, sep = ": "), collapse = "<br>")
}
# --- Source: ewing_discrete.R ---
ewing_discrete <- function(nsim, verbose = FALSE, ...) {
sims <- seq_len(nsim)
object <- as.list(sims)
names(object) <- sims
for(i in sims) {
if(verbose) cat(".")
object[[i]] <- ewing_discrete1(...)
}
make_ewing_discrete(object)
}
ewing_discrete1 <- function(siminit = init.simulation(interact = FALSE,
messages = FALSE, ...),
increment = 0.5, ...)
{
# Make sure increment is 1,2,5 x power of 10
incr <- pretty(increment)
increment <- incr[which.min(abs(incr - increment))[1]]
out <- future.events(siminit, refresh = 1000,
plotit = FALSE, messages = FALSE, ...)
attrs <- attributes(out)
# Get age classes used later for summaries and plots
items <- purrr::map(out$org$Future, function(x) levels(factor(x$ageclass)))
out <- readCount(out)
out <- purrr::map(
out,
function(x) {
purrr::map_df(
dplyr::distinct(
purrr::map_df(
dplyr::mutate(
as.data.frame(x),
time = ifelse(.data$step == 0, 0,
increment * ceiling(.data$time / increment))),
rev),
.data$time, .keep_all = TRUE),
rev)
})
attr(out, "count") <- attrs$count
attr(out, "nstep") <- attrs$nstep
attr(out, "items") <- items
out
}
summary.ewing_discrete <- function(object, ...) {
summary(ewing_envelopes(object), ...)
}
# --- Source: make_ewing_discrete.R ---
make_ewing_discrete <- function(object) {
nsim <- length(object)
class(object) <- c("ewing_discrete", class(object))
attr(object, "species") <- species <- names(object[[1]])
attr(object, "ordinate") <- "time"
attr(object, "count") <- attr(object[[1]], "count")
attr(object, "nstep") <- attr(object[[1]], "nstep")
attr(object, "items") <- attr(object[[1]], "items")
attr(object, "nsim") <- nsim
object
}
# --- Source: ggplot_ewing.R ---
ggplot_ewing <- function(object, step = 0, ageclass = TRUE,
substrate = !ageclass, ...)
{
if(!inherits(object, "ewing_snapshot")) {
object <- ewing_snapshot(object, step, ...)
}
step <- object$step
p <- list()
i <- 0
if(ageclass) {
i <- i + 1
p[[i]] <- ggplot2::autoplot(object$ageclass, ...)
}
if(substrate) {
species <- names(object$substrate)
for(j in species) {
i <- i + 1
p[[i]] <- ggplot2::autoplot(object$substrate[[j]], ...)
}
}
if(length(p) == 1) p <- p[[1]]
p
}
autoplot.ewing <- function(object, ...) {
ggplot_ewing(object, ...)
}
plot.ewing <- function(x, ...) {
ggplot_ewing(x, ...)
}
# --- Source: ggplot_current.R ---
ggplot_current <- function( x,
species,
col = as.character( future$color[stage] ),
headstuff = c( 0, "start"),
units = getOrgFeature( x, species, "units" ),
right = species, adj = c(0,.5,1),
position = paste( "pos", letters[1:3], sep = "." ),
pch = as.character( future$pch[stage] ), cex = 0.5,
stage = organism["stage",],
xlab = "horizontal", ylab = "vertical",
future = getOrgFuture( x, species, c("color","pch") ),
facet = TRUE, ...)
{
## plot current stages for species (except random parasites)
organism <- get.species( x, species )[,-1]
if(is.null(organism))
return(NULL)
tri_coord <- tri2car( organism[position,] )
tri_coord$col <- NA
tri_coord$label <- pch
values <- future$color
names(values) <- future$pch
values <- unique(values)
# Facet by Substrate.
# This needs to use generic function to get substrate names.
tmp <- names(x$org$Interact$substrate$substrate)
tri_coord$substrate <- tmp[organism["sub.stage",]]
p <- ggplot2::ggplot(tri_coord) +
ggplot2::aes(x, y, col = label, label = label) +
ggplot2::geom_text(size=3) +
ggplot2::xlab(xlab) +
ggplot2::ylab(ylab) +
ggplot2::ggtitle(paste(units, "future event", right),
subtitle = paste(headstuff, collapse = " ")) +
ggplot2::scale_color_manual(values = values)
if(facet) {
p <- p + ggplot2::facet_wrap(~substrate)
}
p
}
# --- Source: plot_null.R ---
plot_null <- function(msg = "no data") {
ggplot2::ggplot(data.frame(x = 1, y = 1),
ggplot2::aes(.data$x, .data$y, label = msg)) +
ggplot2::geom_text(size = 10) +
ggplot2::theme_void()
}
# --- Source: step_controls.R ---
step_size_choices <- c(1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000)
step_size_slider <- function(inputId, label = "Steps per click:", selected = 50) {
idx <- match(selected, step_size_choices)
if (is.na(idx)) idx <- 6
sl <- shiny::sliderInput(inputId, label, min = 1, max = length(step_size_choices), value = idx, step = 1, ticks = TRUE)
sl$children[[2]]$attribs[['data-values']] <- paste(step_size_choices, collapse = ",")
sl
}
parse_step_size <- function(val) {
if (is.null(val)) return(50)
num <- round(as.numeric(val))
if (is.na(num)) return(50)
# Direct large values (e.g., 20, 50, 100, 200, 500, 1000, 2000)
if (num %in% step_size_choices && num > 10) {
return(num)
}
# 0-based JavaScript index from ion.rangeSlider (0 to 10)
if (num >= 0 && num < length(step_size_choices)) {
return(step_size_choices[num + 1])
}
# Fallback for direct value
if (num %in% step_size_choices) {
return(num)
}
50
}
axisUnitInput <- function(id, time_label = "Time", selected = "step") {
ns <- shiny::NS(id)
choices <- c("Steps" = "step")
choices[time_label] <- "time"
shiny::radioButtons(ns("x_var"), "Display Units:",
choices = choices,
selected = selected, inline = TRUE)
}
axisUnitServer <- function(id) {
shiny::moduleServer(id, function(input, output, session) {
shiny::reactive({ if (!is.null(input$x_var)) input$x_var else "step" })
})
}
ageClassControlInput <- function(id, time_label = "Time") {
ns <- shiny::NS(id)
shiny::tagList(
axisUnitInput(ns("axis_unit"), time_label = time_label),
shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
shiny::checkboxInput(ns("total"), "Include Total in Plot", TRUE)
)
}
ageClassControlServer <- function(id) {
shiny::moduleServer(id, function(input, output, session) {
x_var <- axisUnitServer("axis_unit")
list(
x_var = x_var,
norm = shiny::reactive({ if (!is.null(input$norm)) input$norm else TRUE }),
total = shiny::reactive({ if (!is.null(input$total)) input$total else TRUE })
)
})
}
# --- Source: initParApp.R ---
initParApp <- function(title = "Population Ethology") {
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
initParInput("init_par")),
initParUI("init_par"),
initParOutput("init_par")
)
server <- function(input, output, server) {
init_par <- initParServer("init_par")
}
shiny::shinyApp(ui = ui, server = server)
}
initParServer <- function(id, simres = shiny::reactiveVal(NULL), datafile = shiny::reactiveVal("")) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
species <- shiny::reactive({
get.organisms()$species
})
output$sppsize <- shiny::renderUI({
shiny::req(species()) # "host", "parasite"
lapply(species(), function(x) {
shiny::sliderInput(ns(x),
label = paste0("Number of ", x, "s:"),
min = 0,
max = 500,
value = 100,
step = 20)
})
})
datanames <- shiny::reactive({
getOrgNames()
})
output$inputfiles <- shiny::renderUI({
shiny::tagList(
shiny::selectInput(ns("dataname"), "", datanames(), "organism.features"),
DT::dataTableOutput(ns("org_table")))
})
output$org_table <- DT::renderDataTable({
getOrgDataSimple(simres(), shiny::req(input$dataname), datafile())
}, escape = FALSE, options = list(scrollX = TRUE, pageLength = 10))
# Show parameters
output$show_par <- shiny::renderUI({
nlist <- names(input)
# Remove any internal inputs, which have numbers.
glist <- grep("[0-9]", names(input))
if(length(glist))
nlist <- nlist[-glist]
# Construct output string.
out <- paste0("inputs: ", paste(nlist, collapse = ", "))
for(i in nlist) {
out <- paste(out, "<br>",
paste(i, input[[i]], sep = " = "))
}
shiny::HTML(out)
})
# Return.
input
})
}
initParInput <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("sppsize"))
}
initParUI <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("show_par"))
}
initParOutput <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("inputfiles"))
}
# --- Source: initApp.R ---
initApp <- function(title = "Population Ethology") {
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
initParInput("init_par")),
initOutput("init"),
substrateOutput("substrate")
)
server <- function(input, output, server) {
init_par <- initParServer("init_par")
siminit <- initServer("init", init_par)
substrateServer("substrate", siminit)
}
shiny::shinyApp(ui = ui, server = server)
}
initServer <- function(id, init_par) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
siminit <- shiny::reactive({
init.simulation(count = as.numeric(c(shiny::req(init_par$host),
shiny::req(init_par$parasite))))
})
output$init <- shiny::renderUI({
out <- summary_simobj(shiny::req(siminit()))
shiny::HTML(out)
})
# Return.
siminit
})
}
initOutput <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("init"))
}
# --- Source: substrateApp.R ---
substrateApp <- function(title = "Substrate Organism Movement Explorer") {
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
initParInput("init_par"),
shiny::hr(),
substrateInput("substrate")),
substrateOutput("substrate")
)
server <- function(input, output, server) {
init_par <- initParServer("init_par")
siminit <- initServer("init", init_par)
substrateServer("substrate", siminit)
}
shiny::shinyApp(ui = ui, server = server)
}
substrateInput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::div(
style = "font-size: 0.85rem;",
shiny::h4("Substrate Display & Stepping", style = "font-size: 1rem; font-weight: 600; margin-bottom: 8px;"),
shiny::checkboxGroupInput(ns("show_species"), "Species to Display:",
choices = c("Host" = "host", "Parasite" = "parasite"),
selected = c("host", "parasite"),
inline = TRUE),
shiny::radioButtons(ns("species_mode"), "Species Mode:",
choices = c("Overlay (1 Map)" = "overlay", "Separate (Adjacent Maps)" = "separate"),
selected = "overlay", inline = TRUE),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
shiny::radioButtons(ns("layout"), "Layout View:",
choices = c("Hex Substrate Overlay" = "hex", "Faceted Substrates" = "facet"),
selected = "hex", inline = TRUE),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
shiny::span("Simulation Stepping:", style = "font-weight: 600; color: #1a73e8; display: block; margin-bottom: 4px;"),
shiny::div(
style = "display: flex; gap: 4px; margin-bottom: 8px;",
shiny::actionButton(ns("step1"), "+1 Step", class = "btn-sm btn-outline-primary flex-fill"),
shiny::actionButton(ns("step10"), "+10 Steps", class = "btn-sm btn-outline-primary flex-fill"),
shiny::actionButton(ns("step100"), "+100 Steps", class = "btn-sm btn-outline-primary flex-fill"),
shiny::actionButton(ns("reset_sim"), "Reset", class = "btn-sm btn-outline-secondary")
),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
shiny::checkboxGroupInput(ns("layers"), "Display Layers:",
choices = c("Substrate Boundaries" = "poly",
"Hex Grid Overlay" = "hex",
"Organisms" = "organisms",
"Substrate Names" = "centers",
"Side Numbers" = "labels"),
selected = c("poly", "hex", "organisms", "centers", "labels")),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 6px 0;"),
shiny::div(
style = "display: flex; gap: 8px;",
shiny::numericInput(ns("width"), "Radius:", value = 10, min = 2, max = 30, step = 1),
shiny::numericInput(ns("step_density"), "Step Density:", value = 1, min = 0.5, max = 5, step = 0.5)
)
)
)
}
substrateServer <- function(id, simres, width = 10, step_density = 1) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
current_sim <- shiny::reactiveVal(NULL)
shiny::observeEvent(simres(), {
current_sim(simres())
})
shiny::observeEvent(input$step1, {
sim <- current_sim()
if (!is.null(sim)) {
res <- future.events(sim, nstep = 1, plotit = FALSE)
current_sim(res)
}
})
shiny::observeEvent(input$step10, {
sim <- current_sim()
if (!is.null(sim)) {
res <- future.events(sim, nstep = 10, plotit = FALSE)
current_sim(res)
}
})
shiny::observeEvent(input$step100, {
sim <- current_sim()
if (!is.null(sim)) {
res <- future.events(sim, nstep = 100, plotit = FALSE)
current_sim(res)
}
})
shiny::observeEvent(input$reset_sim, {
current_sim(simres())
})
available_species <- shiny::reactive({
sim <- current_sim()
if (!is.null(sim) && !is.null(sim$pop)) names(sim$pop) else NULL
})
selected_species <- shiny::reactive({
avail <- available_species()
if (is.null(avail)) return(NULL)
sel <- input$show_species
if (is.null(sel) || length(sel) == 0) avail else intersect(sel, avail)
})
sppplot <- shiny::reactive({
spp <- selected_species()
shiny::req(spp)
sim <- current_sim()
shiny::req(sim)
layout_val <- if (!is.null(input$layout)) input$layout else "hex"
mode_val <- if (!is.null(input$species_mode)) input$species_mode else "overlay"
w_val <- if (!is.null(input$width)) input$width else width
sd_val <- if (!is.null(input$step_density)) input$step_density else step_density
layers_val <- if (!is.null(input$layers)) input$layers else c("poly", "hex", "organisms", "centers", "labels")
sim_single <- if (inherits(sim, "ewing_discrete") && is.list(sim) && length(sim) > 0) sim[[1]] else sim
if (inherits(sim_single, "ewing")) {
if (mode_val == "overlay" && layout_val == "hex") {
sub_data <- ewing_substrate(sim_single, spp, layout = layout_val, width = w_val, step_density = sd_val)
if (!is.null(sub_data)) {
p_obj <- ggplot_ewing_substrate(sub_data, layout = layout_val, width = w_val, step_density = sd_val, layers = layers_val)
list(p_obj)
} else {
list()
}
} else {
p <- lapply(spp, function(x) {
sub_data <- ewing_substrate(sim_single, x, layout = layout_val, width = w_val, step_density = sd_val)
if (!is.null(sub_data)) {
p_obj <- ggplot_ewing_substrate(sub_data, layout = layout_val, width = w_val, step_density = sd_val, layers = layers_val)
p_obj
} else {
NULL
}
})
p[!sapply(p, is.null)]
}
} else {
list()
}
})
output$sppPlot <- shiny::renderPlot({
plots <- sppplot()
if (!is.null(plots) && length(plots) > 0) {
cowplot::plot_grid(plotlist = plots, ncol = length(plots), align = "h")
} else {
ggplot2::ggplot() + ggplot2::theme_void() + ggplot2::ggtitle("No active species selected to plot")
}
})
output$substrate_plot <- shiny::renderUI({
plots <- sppplot()
h_px <- 500
shiny::plotOutput(ns("sppPlot"), height = paste0(h_px, "px"))
})
# Return current simulation state for downstream composition
current_sim
})
}
substrateOutput <- function(id) {
ns <- shiny::NS(id)
shiny::uiOutput(ns("substrate_plot"))
}
# --- Source: distPlotApp.R ---
distPlotApp <- function(title = "Population Ethology") {
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
initParInput("init_par"),
distPlotInput("dist_plot"),
futureInput("future")),
distPlotOutput("dist_plot")
)
server <- function(input, output, server) {
init_par <- initParServer("init_par")
siminit <- initServer("init", init_par)
simres <- futureServer("future", siminit)
distPlotServer("dist_plot", simres)
}
shiny::shinyApp(ui = ui, server = server)
}
distPlotServer <- function(id, simres, x_var = NULL, total = NULL, norm = NULL) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
dist_plot <- shiny::reactive({
sim <- if (is.reactive(simres)) simres() else simres
shiny::req(sim)
tot_val <- if (is.reactive(total)) total() else if (!is.null(total)) total else if (!is.null(input$total)) input$total else TRUE
norm_val <- if (is.reactive(norm)) norm() else if (!is.null(norm)) norm else if (!is.null(input$norm)) input$norm else TRUE
xv_val <- if (is.reactive(x_var)) x_var() else if (!is.null(x_var)) x_var else if (!is.null(input$x_var)) input$x_var else "step"
if (is.null(tot_val)) tot_val <- TRUE
if (is.null(norm_val)) norm_val <- TRUE
if (is.null(xv_val) || !xv_val %in% c("step", "time")) xv_val <- "step"
object <- tryCatch({
ewing_ageclass(sim, total = tot_val, normalize = norm_val)
}, error = function(e) NULL)
if (is.null(object)) return(plot_null("no simulation"))
ggplot2::autoplot(object, x_var = xv_val)
})
output$dist_plot <- shiny::renderPlot({
dist_plot()
})
# Return.
dist_plot
})
}
distPlotInput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
shiny::checkboxInput(ns("total"), "Include Total", TRUE))
}
distPlotOutput <- function(id) {
ns <- shiny::NS(id)
shiny::plotOutput(ns("dist_plot"), height = "400px")
}
# --- Source: multApp.R ---
multApp <- function(title = "Population Ethology") {
ui <- shiny::fluidPage(
shiny::titlePanel(title),
shiny::sidebarLayout(
shiny::sidebarPanel(
multInput("ewing")
),
shiny::mainPanel(
multOutput("ewing")
)))
server <- function(input, output, server) {
multServer("ewing")
}
shiny::shinyApp(ui = ui, server = server)
}
multServer <- function(id) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
simres <- shiny::reactive({
nsim <- as.integer(shiny::req(input$nsim))
shiny::withProgress(
message = paste('Ewing Discrete', nsim, 'Simulations ...'),
value = 0,
{
out <- as.list(seq_len(nsim))
inc <- 1 / nsim
for(i in seq_len(nsim)) {
shiny::incProgress(inc)
out[[i]] <- ewing_discrete1(
count = as.numeric(c(input$host, input$parasite)),
nstep = input$steps)
}
}
)
})
distplot <- shiny::reactive({
if(inherits(simres(), "ewing")) {
ggplot2::autoplot(ewing_ageclass(simres(), total = input$total,
normalize = input$norm))
} else {
NULL
}
})
output$distPlot <- shiny::renderPlot({
distplot()
})
# *** This is not right. Need to get each species name here and in `ewing_substrate`
# species <- ewing:::getOrgFeature(simres)
# gives list but includes substrates.
# can figure out what substrate goes to species with
# ewing:::getOrgFeature(simres, species[i], "substrate")
# if it is NA (or "NA"), then that is a substrate.
# So cycle through species generating plots.
# put as much in `ewing_substrate` as possible.
species <- shiny::reactive({
get.organisms(datafile())$species
})
substrates <- shiny::reactive({
get.organisms(datafile())$substrates
})
output$sppsize <- shiny::renderUI({
shiny::req(species())
lapply(species(), function(x) {
shiny::sliderInput(ns(x),
label = paste0("Number of ", x, "s:"),
min = 0,
max = 500,
value = 100,
step = 20)
})
})
sppplot <- shiny::reactive({
shiny::req(species(), simres())
if(inherits(simres(), "ewing")) {
if(!is.null(simres())) {
p <- lapply(species(), function(x) {
p <- ggplot2::autoplot(ewing_substrate(simres(), x))
if(inherits(p, "ggplot"))
p <- p + ggplot2::ggtitle(paste(x, "on", substrates()[1]))
p
})
if(any(unlist(purrr::map(p, is.null))))
p <- NULL
p
}
} else {
ggplot2::ggplot()
}
})
output$sppPlot <- shiny::renderPlot({
if(!is.null(sppplot())) {
spp <- length(species())
cowplot::plot_grid(plotlist = sppplot(), nrow = spp)
} else {
ggplot2::ggplot()
}
})
envdata <- shiny::reactive({
shiny::req(simres())
if(inherits(simres(), "ewing_discrete")) {
ewing_envelopes(simres())
} else {
NULL
}
})
envelopePlot <- shiny::reactive({
shiny::req(envdata())
nsim <- as.integer(shiny::req(input$nsim))
conf <- (nsim >= 10) & input$conf
if(inherits(simres(), "ewing_discrete")) {
ggplot_ewing_envelopes(envdata(), conf)
} else {
NULL
}
})
output$envPlot <- shiny::renderPlot({
envelopePlot()
})
output$plots <- shiny::renderUI({
nsim <- as.integer(shiny::req(input$nsim), simres())
if(nsim == 1) {
shiny::req(species())
shiny::tagList(
shiny::plotOutput(ns("distPlot"), height = "400px"),
shiny::plotOutput(ns("sppPlot"), height = paste0(200 * length(species()), "px")))
} else {
shiny::plotOutput(ns("envPlot"))
}
})
data <- reactive({
nsim <- as.integer(shiny::req(input$nsim))
species <- shiny::req(input$species)
if(nsim == 1) {
readCount(simres())[[species]]
} else {
shiny::req(envdata())
print(envdata(), species = species)
}
})
params <- shiny::reactive({
nsim <- shiny::req(input$nsim)
paste(shiny::req(input$host), shiny::req(input$parasite),
shiny::req(input$steps), nsim, sep = "_")
})
output$downloadRun <- shiny::downloadHandler(
filename = function() {
paste0(paste(shiny::req(input$outfile), shiny::req(input$species), params(), sep = "_"), ".csv") },
content = function(file) {
utils::write.csv(data(), file, row.names = FALSE)
}
)
output$downloadPlot <- shiny::downloadHandler(
filename = function() {
paste0(paste(shiny::req(input$plotfile), params(), sep = "_"), ".pdf") },
content = function(file) {
grDevices::pdf(file, width = 9)
nsim <- as.integer(shiny::req(input$nsim))
if(nsim == 1) {
print(distplot())
for(i in species()) {
print(sppplot()[[i]])
}
} else {
print(envelopePlot())
}
grDevices::dev.off()
}
)
datanames <- shiny::reactive({
getOrgNames(datafile())
})
output$inputfiles <- shiny::renderUI({
shiny::tagList(
shiny::selectInput(ns("dataname"), "", datanames(), "organism.features"),
DT::renderDataTable({
getOrgDataSimple(simres(),shiny::req(input$dataname), datafile())
}, escape = FALSE,
options = list(scrollX = TRUE, pageLength = 10)))
})
datafile <- shiny::reactive({
if(shiny::isTruthy(input$datafile)) {
input$datafile$datapath
} else {
""
}
})
output$outs <- shiny::renderUI({
switch(input$button,
Plots = shiny::uiOutput(ns("plots")),
"Input Data" = shiny::uiOutput(ns("inputfiles")))
})
output$plottype <- shiny::renderUI({
if(input$nsim == 1) {
shiny::tagList(
shiny::checkboxInput(ns("norm"), "Normalize Plot", TRUE),
shiny::checkboxInput(ns("total"), "Include Total", TRUE))
} else {
shiny::checkboxInput(ns("conf"), "Confidence band", FALSE)
}
})
output$version <- shiny::renderText({
paste("Ewing package version ", utils::packageVersion("ewing"))
})
})
}
multInput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::h4("Simulation Settings"),
shiny::uiOutput(ns("sppsize")),
shiny::sliderInput(ns("steps"),
label = "Simulation steps:",
min = 1000,
max = 10000,
value = 1000,
step = 500),
shiny::radioButtons(ns("nsim"),
"Number of Simulations",
c(1,10,20,50,100,200),
1, inline = TRUE),
shiny::fileInput(ns("datafile"), "Optional XLSX Input Data File",
multiple = FALSE,
accept = c(".xls", ".xlsx")),
shiny::actionButton(ns("go"), "Start Simulation"),
shiny::HTML("<hr style='height:1px;border:none;color:#333;background-color:#333;' />"),
shiny::uiOutput(ns("plottype")),
shiny::h4("Save Files"),
shiny::fluidRow(
shiny::column(6, shiny::textInput(ns("outfile"), "Species Table", "mysim")),
shiny::column(3, shiny::selectInput(ns("species"), "", c("host", "parasite"), "host")),
shiny::column(3, shiny::downloadButton(ns("downloadRun"), "Table"))),
shiny::fluidRow(
shiny::column(9, shiny::textInput(ns("plotfile"), "Plot File", "myplot")),
shiny::column(3, shiny::downloadButton(ns("downloadPlot"), "Plots"))),
shiny::HTML("<hr style='height:1px;border:none;color:#333;background-color:#333;' />"),
shiny::HTML("See <a href='https://github.com/byandell/ewing'>ewing package on github</a>"),
shiny::uiOutput(ns("version"))
)
}
multOutput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::radioButtons(ns("button"), "", c("Plots", "Input Data"),
"Plots", inline = TRUE),
shiny::uiOutput(ns("outs"))
)
}
# --- Source: inputApp.R ---
inputApp <- function(title = "Input Data Explorer") {
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
inputAppInput("input_app")
),
bslib::card(
inputAppOutput("input_app")
)
)
server <- function(input, output, session) {
inputAppServer("input_app")
}
shiny::shinyApp(ui = ui, server = server)
}
discover_dataset_tables <- function(datafile = "", sim = NULL) {
found <- character(0)
# 1. Inspect datafile directory
d_path <- if (is.character(datafile) && datafile != "") datafile else if (!is.null(sim) && !is.null(sim$datafile)) sim$datafile else ""
if (d_path != "" && file.exists(d_path)) {
if (dir.exists(d_path)) {
files <- list.files(d_path, pattern = "\\.(txt|csv|tsv)$", full.names = FALSE)
if (length(files) > 0) {
found <- tools::file_path_sans_ext(files)
}
} else if (grepl("\\.xlsx$", d_path, ignore.case = TRUE)) {
sheets <- tryCatch(readxl::excel_sheets(d_path), error = function(e) character(0))
if (length(sheets) > 0) found <- sheets
}
}
# 2. Inspect sim$datasets if present
if (!is.null(sim) && !is.null(sim$datasets)) {
found <- unique(c(found, names(sim$datasets)))
}
if (!is.null(sim) && !is.null(sim$community) && !is.null(sim$community$datasets)) {
found <- unique(c(found, names(sim$community$datasets)))
}
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets)) {
found <- unique(c(found, names(isle_royale_datasets)))
}
# Filter out any .rds spatial layers or non-table objects
found <- found[!grepl("\\.rds$", found, ignore.case = TRUE) & !found %in% c("isle_royale_features", "isle_royale_landmarks", "isle_royale_layer", "huc_features")]
# 3. Default fallback choices if nothing found
if (length(found) == 0) {
found <- c(
"organism.features", "future.moose", "future.wolf",
"substrate.moose", "substrate.wolf", "substrate.substrate",
"moose.wolf", "future.host", "future.parasite"
)
}
unique(found)
}
inputAppInput <- function(id, choices = NULL) {
ns <- shiny::NS(id)
default_choices <- if (!is.null(choices)) choices else c(
"organism.features", "future.moose", "future.wolf",
"substrate.moose", "substrate.wolf", "substrate.substrate",
"moose.wolf", "future.host", "future.parasite"
)
shiny::tagList(
shiny::selectInput(ns("dataname"), "Select Dataset Table:",
choices = default_choices,
selected = default_choices[1]
)
)
}
inputAppOutput <- function(id) {
ns <- shiny::NS(id)
shiny::tableOutput(ns("org_table"))
}
inputAppServer <- function(id, simres = shiny::reactiveVal(NULL), datafile = shiny::reactiveVal("")) {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
# Dynamically update select choices based on folder / simulation contents
shiny::observe({
sim <- if (is.reactive(simres)) simres() else simres
dfile <- if (is.reactive(datafile)) datafile() else datafile
discovered <- discover_dataset_tables(dfile, sim)
if (length(discovered) > 0) {
current_sel <- input$dataname
sel <- if (!is.null(current_sel) && current_sel %in% discovered) current_sel else discovered[1]
shiny::updateSelectInput(session, "dataname", choices = discovered, selected = sel)
}
})
output$org_table <- shiny::renderTable(
{
name <- input$dataname %||% "organism.features"
sim <- if (is.reactive(simres)) simres() else simres
dfile <- if (is.reactive(datafile)) datafile() else datafile
res <- NULL
# 0. Check direct file in datafile directory if points to folder
if (is.character(dfile) && dfile != "" && dir.exists(dfile)) {
txt_path <- file.path(dfile, paste0(name, ".txt"))
if (file.exists(txt_path)) res <- tryCatch(utils::read.table(txt_path, header = TRUE, sep = "\t", stringsAsFactors = FALSE, fill = TRUE), error = function(e) NULL)
if (is.null(res)) {
csv_path <- file.path(dfile, paste0(name, ".csv"))
if (file.exists(csv_path)) res <- tryCatch(utils::read.csv(csv_path, fill = TRUE, stringsAsFactors = FALSE), error = function(e) NULL)
}
}
# 1. Check if dataset is stored in sim$datasets or sim$community$datasets or global isle_royale_datasets
if (is.null(res) && !is.null(sim)) {
if (!is.null(sim$datasets) && !is.null(sim$datasets[[name]])) {
res <- sim$datasets[[name]]
} else if (!is.null(sim$community) && !is.null(sim$community$datasets) && !is.null(sim$community$datasets[[name]])) {
res <- sim$community$datasets[[name]]
}
}
if (is.null(res) && exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[name]])) {
res <- isle_royale_datasets[[name]]
}
# 2. Extract dynamically via getOrgDataSimple or getOrg* package routines
if (is.null(res) && !is.null(sim) && inherits(sim, "ewing")) {
sim_single <- if (inherits(sim, "ewing_discrete")) sim[[1]] else sim
res <- tryCatch({
getOrgDataSimple(sim_single, name, datafile = dfile)
}, error = function(e) NULL)
}
# 3. Dynamic fallback to extracting from sim_single$org state structures
if ((is.null(res) || !is.data.frame(res) || nrow(res) == 0) && !is.null(sim) && inherits(sim, "ewing")) {
sim_single <- if (inherits(sim, "ewing_discrete")) sim[[1]] else sim
res <- tryCatch({
left <- stringr::str_remove(name, "\\..*")
right <- stringr::str_remove(name, ".*\\.")
if (left == "organism" && right == "features") {
if (!is.null(sim_single$org$Feature)) as.data.frame(sim_single$org$Feature) else NULL
} else if (left == "future") {
if (!is.null(sim_single$org$Future[[right]])) sim_single$org$Future[[right]] else getOrgFuture(sim_single, right)
} else if (!is.null(sim_single$org$Interact[[left]][[right]])) {
sim_single$org$Interact[[left]][[right]]
} else if (!is.null(sim_single$org[[left]][[right]])) {
sim_single$org[[left]][[right]]
} else {
NULL
}
}, error = function(e) NULL)
}
if (is.null(res) || !is.data.frame(res) || nrow(res) == 0) {
res <- data.frame(Info = paste("Dataset", name, "is not available in current simulation instance."))
}
res
},
striped = TRUE,
hover = TRUE,
bordered = TRUE
)
})
}
# --- Source: habitat.R ---
if (!exists("safe_st_intersects", mode = "function")) {
safe_st_intersects <- function(x, y) {
tryCatch(
sf::st_intersects(x, y),
error = function(e) {
old_s2 <- sf::sf_use_s2(FALSE)
on.exit(sf::sf_use_s2(old_s2), add = TRUE)
x_val <- tryCatch(sf::st_make_valid(x), error = function(e2) x)
y_val <- tryCatch(sf::st_make_valid(y), error = function(e2) y)
sf::st_intersects(x_val, y_val)
}
)
}
}
get_habitat_features <- function(watershed_obj = NULL,
categories = c("lakes", "waterways", "forests", "bogs"),
use_cache = TRUE,
site = "isle_royale") {
huc_layer <- if (is.null(watershed_obj)) {
NULL
} else if (inherits(watershed_obj, "sf") || inherits(watershed_obj, "sfc")) {
watershed_obj
} else if (is.list(watershed_obj) && "layer" %in% names(watershed_obj)) {
watershed_obj$layer
} else {
NULL
}
if (use_cache) {
cached_sf <- NULL
feat_key <- paste0(site, "_features")
feat_file <- paste0(site, "_features.rds")
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[feat_key]])) {
cached_sf <- isle_royale_datasets[[feat_key]]
} else if (exists(feat_key) && inherits(get(feat_key), "sf")) {
cached_sf <- get(feat_key)
} else {
cache_file <- get_site_cache_file(feat_file, site = site)
if (file.exists(cache_file)) {
cached_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
}
}
if (!is.null(cached_sf) && inherits(cached_sf, "sf")) {
if (is.null(huc_layer)) return(cached_sf)
cached_sf <- sf::st_transform(cached_sf, sf::st_crs(huc_layer))
clipped <- suppressWarnings(sf::st_intersection(cached_sf, huc_layer))
if (nrow(clipped) > 0) return(clipped)
return(cached_sf)
}
}
# Query OpenStreetMap if osmdata package is installed
if (!requireNamespace("osmdata", quietly = TRUE)) {
warning("The 'osmdata' package is not installed. Returning fallback habitat geometries.")
return(get_fallback_habitat_features(huc_layer))
}
bbox <- sf::st_bbox(sf::st_transform(huc_layer, 4326))
bbox_str <- paste(bbox["ymin"], bbox["xmin"], bbox["ymax"], bbox["xmax"], sep = ",")
old_url <- osmdata::get_overpass_url()
osmdata::set_overpass_url("https://lz4.overpass-api.de/api/interpreter")
features_list <- list()
old_s2 <- sf::sf_use_s2()
sf::sf_use_s2(FALSE)
on.exit({
sf::sf_use_s2(old_s2)
osmdata::set_overpass_url(old_url)
}, add = TRUE)
# Extract Inland Lakes & Waterbodies
if ("lakes" %in% categories) {
ql_lakes <- paste0(
"[out:xml][timeout:30];\n(\n",
" natural[\"water\"](", bbox_str, ");\n",
" waterway[\"riverbank\"](", bbox_str, ");\n",
");\nout body;\n>;\nout skel qt;\n"
)
res_lakes <- tryCatch(osmdata::osmdata_sf(ql_lakes), error = function(e) NULL)
if (!is.null(res_lakes$osm_polygons) && nrow(res_lakes$osm_polygons) > 0) {
poly <- res_lakes$osm_polygons
poly$habitat_type <- "Lake/Pond"
features_list$lakes <- poly[, "habitat_type"]
}
}
# Extract Waterways & Streams
if ("waterways" %in% categories) {
ql_water <- paste0(
"[out:xml][timeout:30];\n(\n",
" waterway[\"stream\"](", bbox_str, ");\n",
" waterway[\"river\"](", bbox_str, ");\n",
" waterway[\"drain\"](", bbox_str, ");\n",
");\nout body;\n>;\nout skel qt;\n"
)
res_water <- tryCatch(osmdata::osmdata_sf(ql_water), error = function(e) NULL)
if (!is.null(res_water$osm_lines) && nrow(res_water$osm_lines) > 0) {
line <- res_water$osm_lines
line$habitat_type <- "Waterway"
features_list$waterways <- line[, "habitat_type"]
}
}
# Combine extracted geometries
if (length(features_list) == 0) {
return(get_fallback_habitat_features(huc_layer))
}
combined <- do.call(rbind, features_list)
if (is.null(combined) || nrow(combined) == 0) {
return(get_fallback_habitat_features(huc_layer))
}
combined <- sf::st_transform(combined, sf::st_crs(huc_layer))
clipped <- suppressWarnings(sf::st_intersection(combined, huc_layer))
if (nrow(clipped) > 0) return(clipped)
return(combined)
}
get_fallback_habitat_features <- function(huc_layer = NULL) {
if (is.null(huc_layer)) {
pts <- matrix(c(-89.17, 47.87, -88.48, 47.87, -88.48, 48.16, -89.17, 48.16, -89.17, 47.87), ncol = 2, byrow = TRUE)
huc_layer <- sf::st_sfc(sf::st_polygon(list(pts)), crs = 4326)
}
bbox <- sf::st_bbox(huc_layer)
xmin <- bbox["xmin"]; xmax <- bbox["xmax"]
ymin <- bbox["ymin"]; ymax <- bbox["ymax"]
l1 <- sf::st_polygon(list(matrix(c(xmin+0.1, ymin+0.1, xmin+0.15, ymin+0.1, xmin+0.15, ymin+0.15, xmin+0.1, ymin+0.15, xmin+0.1, ymin+0.1), ncol=2, byrow=TRUE)))
l2 <- sf::st_polygon(list(matrix(c(xmax-0.2, ymax-0.1, xmax-0.1, ymax-0.1, xmax-0.1, ymax-0.05, xmax-0.2, ymax-0.05, xmax-0.2, ymax-0.1), ncol=2, byrow=TRUE)))
sfc <- sf::st_sfc(l1, l2, crs = sf::st_crs(huc_layer))
sf::st_sf(habitat_type = c("Lake/Pond", "Lake/Pond"), geometry = sfc)
}
get_moose_landmarks <- function(watershed_obj = NULL, use_cache = TRUE, site = "isle_royale") {
huc_layer <- if (is.null(watershed_obj)) {
NULL
} else if (inherits(watershed_obj, "sf") || inherits(watershed_obj, "sfc")) {
watershed_obj
} else if (is.list(watershed_obj) && "layer" %in% names(watershed_obj)) {
watershed_obj$layer
} else {
NULL
}
if (use_cache) {
cached_sf <- NULL
lm_key <- paste0(site, "_landmarks")
lm_file <- paste0(site, "_landmarks.rds")
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[lm_key]])) {
cached_sf <- isle_royale_datasets[[lm_key]]
} else if (exists(lm_key) && inherits(get(lm_key), "sf")) {
cached_sf <- get(lm_key)
} else {
cache_file <- get_site_cache_file(lm_file, site = site)
if (file.exists(cache_file)) {
cached_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
}
}
if (!is.null(cached_sf) && inherits(cached_sf, "sf")) {
if (is.null(huc_layer)) return(cached_sf)
cached_sf <- sf::st_transform(cached_sf, sf::st_crs(huc_layer))
return(cached_sf)
}
}
# Fallback coordinate table for notable Isle Royale moose sighting locations
landmarks <- data.frame(
name = c("Washington Creek", "Ojibway Lake", "Feldtmann Lake", "Hidden Lake"),
lon = c(-89.145, -88.618, -88.948, -88.647),
lat = c(47.922, 48.113, 47.887, 48.148),
description = c("Major feeding stream near Windigo",
"Highland lake surrounded by moose browse",
"SW inland lake with heavy aquatic vegetation",
"Shaded lake near Tobin Harbor"),
stringsAsFactors = FALSE
)
pts <- sf::st_as_sf(landmarks, coords = c("lon", "lat"), crs = 4326)
if (!is.null(huc_layer)) {
pts <- sf::st_transform(pts, sf::st_crs(huc_layer))
}
return(pts)
}
add_watershed_hex_overlay <- function(huc_info, hex_diameter = 0.01) {
huc_layer <- huc_info$layer
hex_mesh <- sf::st_make_grid(huc_layer, square = FALSE, cellsize = c(hex_diameter, hex_diameter))
hex_overlay <- hex_mesh[lengths(safe_st_intersects(hex_mesh, huc_layer)) > 0]
huc_info$hex_overlay <- hex_overlay
huc_info$hex_diameter <- hex_diameter
class(huc_info) <- "watershed_hex_overlay"
return(huc_info)
}
autoplot.watershed_hex_overlay <- function(object, ...) {
huc_str <- if (!is.null(object$huc_id) && length(object$huc_id) > 1) {
paste0(length(object$huc_id), " Combined Regions")
} else if (!is.null(object$huc_id)) {
paste("Region:", object$huc_id)
} else {
"Substrate Grid"
}
title_txt <- paste("Geographic Hexagonal Grid (", huc_str, ")",
"\nHexagon Extent Diameter:", object$hex_diameter)
if (!is.null(object$feature_name) && object$feature_name != "") {
title_txt <- paste0(title_txt, " - Restricted to: ", object$feature_name)
}
p <- ggplot2::ggplot()
if (!is.null(object$individual_hucs) && nrow(object$individual_hucs) > 1) {
p <- p + ggplot2::geom_sf(data = object$individual_hucs, fill = NA, color = "purple", linetype = "dashed", linewidth = 0.4)
}
p +
ggplot2::geom_sf(data = object$layer, fill = "lightblue", alpha = 0.3, color = "blue", linewidth = 0.7) +
ggplot2::geom_sf(data = object$hex_overlay, fill = NA, color = "darkred", linewidth = 0.7) +
ggplot2::theme_minimal() +
ggplot2::ggtitle(title_txt) +
ggplot2::labs(x = "Longitude", y = "Latitude")
}
create_isle_royale_hex_overlay <- function(hex_diameter = 0.01, features = NULL, layer = NULL, site = "isle_royale") {
boundary_layer <- layer
layer_key <- paste0(site, "_layer")
layer_file <- paste0(site, "_layer.rds")
feat_key <- paste0(site, "_features")
feat_file <- paste0(site, "_features.rds")
if (is.null(boundary_layer)) {
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[layer_key]])) {
boundary_layer <- isle_royale_datasets[[layer_key]]
} else if (exists(layer_key) && inherits(get(layer_key), c("sf", "sfc"))) {
boundary_layer <- get(layer_key)
} else {
cache_file <- get_site_cache_file(layer_file, site = site)
if (file.exists(cache_file)) {
boundary_layer <- tryCatch(readRDS(cache_file), error = function(e) NULL)
}
}
}
habitat_sf <- features
if (is.character(habitat_sf) && file.exists(habitat_sf)) {
habitat_sf <- tryCatch(readRDS(habitat_sf), error = function(e) NULL)
}
if (is.null(habitat_sf)) {
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets) && !is.null(isle_royale_datasets[[feat_key]])) {
habitat_sf <- isle_royale_datasets[[feat_key]]
} else if (exists(feat_key) && inherits(get(feat_key), "sf")) {
habitat_sf <- get(feat_key)
} else {
cache_file <- get_site_cache_file(feat_file, site = site)
if (file.exists(cache_file)) {
habitat_sf <- tryCatch(readRDS(cache_file), error = function(e) NULL)
}
}
}
if (is.null(boundary_layer) && !is.null(habitat_sf) && inherits(habitat_sf, "sf")) {
boundary_layer <- suppressWarnings(sf::st_union(sf::st_geometry(habitat_sf)))
}
if (is.null(boundary_layer)) {
pts <- matrix(c(-89.17, 47.87, -88.48, 47.87, -88.48, 48.16, -89.17, 48.16, -89.17, 47.87), ncol = 2, byrow = TRUE)
boundary_layer <- sf::st_sfc(sf::st_polygon(list(pts)), crs = 4326)
} else if (inherits(boundary_layer, "sf")) {
boundary_layer <- sf::st_geometry(boundary_layer)
}
cent <- suppressWarnings(sf::st_centroid(boundary_layer))
coords <- sf::st_coordinates(cent)
hex_mesh <- sf::st_make_grid(boundary_layer, square = FALSE, cellsize = c(hex_diameter, hex_diameter))
hex_overlay <- hex_mesh[lengths(safe_st_intersects(hex_mesh, boundary_layer)) > 0]
res <- list(
huc_id = "Isle Royale",
feature_name = "Isle Royale",
lon = as.numeric(coords[1, "X"]),
lat = as.numeric(coords[1, "Y"]),
layer = boundary_layer,
hex_overlay = hex_overlay,
hex_diameter = hex_diameter
)
class(res) <- "watershed_hex_overlay"
return(res)
}
add_habitat_hex_overlay <- function(hex_obj, habitat_sf = NULL, landmarks_sf = NULL,
features = NULL, landmarks = NULL, site = "isle_royale") {
if (is.null(habitat_sf)) habitat_sf <- features
if (is.null(landmarks_sf)) landmarks_sf <- landmarks
if (is.character(habitat_sf) && file.exists(habitat_sf)) {
habitat_sf <- tryCatch(readRDS(habitat_sf), error = function(e) NULL)
}
if (is.character(landmarks_sf) && file.exists(landmarks_sf)) {
landmarks_sf <- tryCatch(readRDS(landmarks_sf), error = function(e) NULL)
}
if (is.null(habitat_sf)) {
habitat_sf <- get_habitat_features(hex_obj, site = site)
}
if (is.null(landmarks_sf)) {
landmarks_sf <- get_moose_landmarks(hex_obj, site = site)
}
hex_mesh <- hex_obj$hex_overlay
scores <- numeric(length(hex_mesh))
types_list <- character(length(hex_mesh))
if (!is.null(habitat_sf) && nrow(habitat_sf) > 0) {
inter <- safe_st_intersects(hex_mesh, habitat_sf)
for (i in seq_along(inter)) {
indices <- inter[[i]]
if (length(indices) > 0) {
sub_types <- habitat_sf$habitat_type[indices]
score <- 1
if ("Lake/Pond" %in% sub_types) score <- score + 2
if ("Waterway" %in% sub_types) score <- score + 1.5
if ("Bog/Wetland" %in% sub_types) score <- score + 1.8
if ("Forest" %in% sub_types) score <- score + 1
scores[i] <- score
types_list[i] <- paste(unique(sub_types), collapse = ", ")
} else {
scores[i] <- 1
types_list[i] <- "Upland/Open"
}
}
} else {
scores[] <- 1
types_list[] <- "General"
}
hex_sf <- sf::st_sf(
hex_id = seq_along(hex_mesh),
habitat_score = scores,
habitat_type = types_list,
geometry = hex_mesh
)
res <- hex_obj
res$habitat_sf <- habitat_sf
res$landmarks_sf <- landmarks_sf
res$hex_habitat_sf <- hex_sf
class(res) <- c("habitat_hex_overlay", class(hex_obj))
return(res)
}
autoplot.habitat_hex_overlay <- function(object, show_landmarks = TRUE, ...) {
p <- ggplot2::ggplot() +
ggplot2::geom_sf(data = object$layer, fill = "#eef4f8", color = "#2c3e50", linewidth = 0.8)
if (!is.null(object$habitat_sf) && nrow(object$habitat_sf) > 0) {
p <- p + ggplot2::geom_sf(data = object$habitat_sf, ggplot2::aes(fill = .data$habitat_type), alpha = 0.5, color = NA)
}
if (!is.null(object$hex_habitat_sf)) {
p <- p + ggplot2::geom_sf(data = object$hex_habitat_sf, ggplot2::aes(color = .data$habitat_score), fill = NA, linewidth = 0.6) +
ggplot2::scale_color_viridis_c(option = "viridis", name = "Habitat Weight")
}
if (show_landmarks && !is.null(object$landmarks_sf) && nrow(object$landmarks_sf) > 0) {
p <- p + ggplot2::geom_sf(data = object$landmarks_sf, color = "#d35400", size = 3, shape = 18) +
ggplot2::geom_sf_text(data = object$landmarks_sf, ggplot2::aes(label = .data$name), color = "#900c3f", size = 3, fontface = "bold", vjust = -0.7)
}
title_txt <- "Isle Royale Moose Habitat & Substrate Overlay Model"
if (!is.null(object$feature_name) && object$feature_name != "") {
title_txt <- paste0(title_txt, " (", object$feature_name, ")")
}
p +
ggplot2::theme_minimal() +
ggplot2::ggtitle(title_txt) +
ggplot2::labs(
x = "Longitude", y = "Latitude",
caption = "Habitats: Inland Lakes, Beaver Ponds/Waterways, Shaded Forests & Bogs"
)
}
# --- Source: ecosystem_sim.R ---
init_ecosystem_sim <- function(ecosystem = "isle_royale",
year = 1980,
n_hosts = NULL,
n_predators = NULL,
hex_diameter = 0.01,
datafile = "",
features_rds = NULL,
landmarks_rds = NULL) {
# Load historical benchmark time series data if available for this ecosystem
csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
if (csv_path == "" || !file.exists(csv_path)) {
csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
}
hist_data <- NULL
if (file.exists(csv_path)) {
hist_data <- utils::read.csv(csv_path, stringsAsFactors = FALSE)
}
# Lookup baseline population counts for start year if not explicitly provided
if (!is.null(hist_data) && year %in% hist_data$Year) {
row_match <- hist_data[hist_data$Year == year, ]
if (is.null(n_hosts) && "Moose" %in% names(row_match)) n_hosts <- as.numeric(row_match$Moose[1])
if (is.null(n_predators) && "Wolves" %in% names(row_match)) n_predators <- as.numeric(row_match$Wolves[1])
}
if (is.null(n_hosts)) n_hosts <- 664
if (is.null(n_predators)) n_predators <- 50
# 1. Initialize Base Spatial Geography & Habitat Overlay for Target Ecosystem
hex_obj <- create_isle_royale_hex_overlay(hex_diameter = hex_diameter, features = features_rds, site = ecosystem)
habitat_overlay <- add_habitat_hex_overlay(hex_obj, features = features_rds, landmarks = landmarks_rds, site = ecosystem)
# 2. Setup Configuration Data Directory
if (datafile == "") {
pkg_dir <- system.file(file.path("extdata", ecosystem), package = "ewing")
if (pkg_dir != "" && dir.exists(pkg_dir)) {
datafile <- pkg_dir
} else if (dir.exists(file.path("inst", "extdata", ecosystem))) {
datafile <- file.path("inst", "extdata", ecosystem)
}
}
# 3. Initialize ewing Community Core
community <- NULL
tryCatch({
community <- init.simulation(package = "ewing", count = c(n_hosts, n_predators), datafile = datafile, messages = FALSE)
}, error = function(e) {
community <<- list(pop = list())
})
# 4. Spatially Sample Initial Positions Weighted by Substrate Habitat Score
hex_sf <- habitat_overlay$hex_habitat_sf
probs <- hex_sf$habitat_score / sum(hex_sf$habitat_score)
sampled_moose_hex <- sample(seq_len(nrow(hex_sf)), size = n_hosts, replace = TRUE, prob = probs)
sampled_wolf_hex <- sample(seq_len(nrow(hex_sf)), size = n_predators, replace = TRUE, prob = probs)
centroids <- sf::st_centroid(sf::st_geometry(hex_sf))
moose_pts <- centroids[sampled_moose_hex]
wolf_pts <- centroids[sampled_wolf_hex]
moose_coords <- sf::st_coordinates(moose_pts)
wolf_coords <- sf::st_coordinates(wolf_pts)
moose_df <- data.frame(
id = paste0("M", seq_len(n_hosts)),
species = "Moose",
ageclass = sample(c("calf", "yearling", "adult", "senior"), size = n_hosts, replace = TRUE, prob = c(0.15, 0.15, 0.55, 0.15)),
hex_id = sampled_moose_hex,
lon = moose_coords[, 1],
lat = moose_coords[, 2],
stringsAsFactors = FALSE
)
wolf_df <- data.frame(
id = paste0("W", seq_len(n_predators)),
species = "Wolf",
ageclass = sample(c("pup", "subadult", "adult"), size = n_predators, replace = TRUE, prob = c(0.20, 0.25, 0.55)),
hex_id = sampled_wolf_hex,
lon = wolf_coords[, 1],
lat = wolf_coords[, 2],
stringsAsFactors = FALSE
)
m_counts <- table(factor(moose_df$ageclass, levels = c("calf", "yearling", "adult", "senior")))
w_counts <- table(factor(wolf_df$ageclass, levels = c("pup", "subadult", "adult")))
hist_df <- data.frame(
step = 0,
time = 0,
Species = c(rep("moose", 4), rep("wolf", 3)),
State = c(names(m_counts), names(w_counts)),
Type = "ageclass",
Count = c(as.numeric(m_counts), as.numeric(w_counts)),
stringsAsFactors = FALSE
)
ds_list <- list()
if (exists("isle_royale_datasets") && is.list(isle_royale_datasets)) {
ds_list <- isle_royale_datasets
} else if (is.character(datafile) && datafile != "" && dir.exists(datafile)) {
txt_files <- list.files(datafile, pattern = "\\.(txt|csv)$", full.names = TRUE)
for (f in txt_files) {
tbl_name <- tools::file_path_sans_ext(basename(f))
df_f <- tryCatch({
if (endsWith(f, ".csv")) utils::read.csv(f, stringsAsFactors = FALSE)
else utils::read.table(f, header = TRUE, sep = "\t", fill = TRUE,
check.names = FALSE, stringsAsFactors = FALSE)
}, error = function(e) NULL)
if (!is.null(df_f)) ds_list[[tbl_name]] <- df_f
}
}
res <- list(
community = community,
habitat_overlay = habitat_overlay,
start_year = year,
ecosystem = ecosystem,
moose_pop = moose_df,
wolf_pop = wolf_df,
historical_data = hist_data,
history = hist_df,
datafile = datafile,
datasets = ds_list,
nstep = 0
)
class(res) <- c(paste0(ecosystem, "_sim"), "ecosystem_sim", "ewing")
return(res)
}
run_ecosystem_sim <- function(sim_obj, nstep = 1000, refresh = 10, ...) {
if (!inherits(sim_obj, "ecosystem_sim") && !inherits(sim_obj, "isle_royale_sim")) {
stop("Input must be an object of class 'ecosystem_sim' or 'isle_royale_sim'.")
}
hex_sf <- sim_obj$habitat_overlay$hex_habitat_sf
n_hex <- nrow(hex_sf)
centroids <- sf::st_coordinates(sf::st_centroid(sf::st_geometry(hex_sf)))
move_pop <- function(pop_df, move_prob = 0.5) {
if (is.null(pop_df) || nrow(pop_df) == 0) return(pop_df)
n <- nrow(pop_df)
movers <- which(stats::runif(n) < move_prob)
if (length(movers) > 0) {
new_hex <- sample(seq_len(n_hex), size = length(movers), replace = TRUE, prob = hex_sf$habitat_score / sum(hex_sf$habitat_score))
pop_df$hex_id[movers] <- new_hex
pop_df$lon[movers] <- centroids[new_hex, 1]
pop_df$lat[movers] <- centroids[new_hex, 2]
}
return(pop_df)
}
update_demographics <- function(moose_df, wolf_df) {
if (!is.null(moose_df) && nrow(moose_df) > 0) {
n_m <- nrow(moose_df)
calf_idx <- which(moose_df$ageclass == "calf")
if (length(calf_idx) > 0) {
trans <- calf_idx[stats::runif(length(calf_idx)) < 0.002]
if (length(trans) > 0) moose_df$ageclass[trans] <- "yearling"
}
yearling_idx <- which(moose_df$ageclass == "yearling")
if (length(yearling_idx) > 0) {
trans <- yearling_idx[stats::runif(length(yearling_idx)) < 0.002]
if (length(trans) > 0) moose_df$ageclass[trans] <- "adult"
}
adult_idx <- which(moose_df$ageclass == "adult")
if (length(adult_idx) > 0) {
trans <- adult_idx[stats::runif(length(adult_idx)) < 0.0003]
if (length(trans) > 0) moose_df$ageclass[trans] <- "senior"
n_births <- sum(stats::runif(length(adult_idx)) < 0.0012)
if (n_births > 0) {
parent_hexes <- sample(moose_df$hex_id[adult_idx], n_births, replace = TRUE)
max_id <- suppressWarnings(max(as.numeric(gsub("[^0-9]", "", moose_df$id)), na.rm = TRUE))
if (!is.finite(max_id)) max_id <- nrow(moose_df)
new_ids <- paste0("M", seq(max_id + 1, length.out = n_births))
new_calves <- data.frame(
id = new_ids,
species = "Moose",
ageclass = "calf",
hex_id = parent_hexes,
lon = centroids[parent_hexes, 1],
lat = centroids[parent_hexes, 2],
stringsAsFactors = FALSE
)
moose_df <- rbind(moose_df, new_calves)
}
}
senior_idx <- which(moose_df$ageclass == "senior")
if (length(senior_idx) > 0) {
deaths <- senior_idx[stats::runif(length(senior_idx)) < 0.0008]
if (length(deaths) > 0) moose_df <- moose_df[-deaths, ]
}
}
if (!is.null(wolf_df) && nrow(wolf_df) > 0) {
pup_idx <- which(wolf_df$ageclass == "pup")
if (length(pup_idx) > 0) {
trans <- pup_idx[stats::runif(length(pup_idx)) < 0.002]
if (length(trans) > 0) wolf_df$ageclass[trans] <- "subadult"
}
subadult_idx <- which(wolf_df$ageclass == "subadult")
if (length(subadult_idx) > 0) {
trans <- subadult_idx[stats::runif(length(subadult_idx)) < 0.002]
if (length(trans) > 0) wolf_df$ageclass[trans] <- "adult"
}
adult_w_idx <- which(wolf_df$ageclass == "adult")
if (length(adult_w_idx) > 0) {
n_w_births <- sum(stats::runif(length(adult_w_idx)) < 0.0008)
if (n_w_births > 0) {
p_hexes <- sample(wolf_df$hex_id[adult_w_idx], n_w_births, replace = TRUE)
max_wid <- suppressWarnings(max(as.numeric(gsub("[^0-9]", "", wolf_df$id)), na.rm = TRUE))
if (!is.finite(max_wid)) max_wid <- nrow(wolf_df)
new_wids <- paste0("W", seq(max_wid + 1, length.out = n_w_births))
new_pups <- data.frame(
id = new_wids,
species = "Wolf",
ageclass = "pup",
hex_id = p_hexes,
lon = centroids[p_hexes, 1],
lat = centroids[p_hexes, 2],
stringsAsFactors = FALSE
)
wolf_df <- rbind(wolf_df, new_pups)
}
w_deaths <- adult_w_idx[stats::runif(length(adult_w_idx)) < 0.0005]
if (length(w_deaths) > 0) wolf_df <- wolf_df[-w_deaths, ]
}
}
list(moose = moose_df, wolf = wolf_df)
}
curr_step <- sim_obj$nstep
for (s in seq_len(nstep)) {
curr_step <- curr_step + 1
sim_obj$moose_pop <- move_pop(sim_obj$moose_pop, move_prob = 0.6)
sim_obj$wolf_pop <- move_pop(sim_obj$wolf_pop, move_prob = 0.8)
if (!is.null(sim_obj$wolf_pop) && !is.null(sim_obj$moose_pop) && nrow(sim_obj$wolf_pop) > 0 && nrow(sim_obj$moose_pop) > 0) {
wolf_hexes <- unique(sim_obj$wolf_pop$hex_id)
vulnerable_idx <- which(sim_obj$moose_pop$hex_id %in% wolf_hexes & sim_obj$moose_pop$ageclass %in% c("calf", "senior"))
if (length(vulnerable_idx) > 0) {
pred_remove <- vulnerable_idx[stats::runif(length(vulnerable_idx)) < 0.0015]
if (length(pred_remove) > 0) {
sim_obj$moose_pop <- sim_obj$moose_pop[-pred_remove, ]
}
}
}
demog_res <- update_demographics(sim_obj$moose_pop, sim_obj$wolf_pop)
sim_obj$moose_pop <- demog_res$moose
sim_obj$wolf_pop <- demog_res$wolf
m_curr <- table(factor(sim_obj$moose_pop$ageclass, levels = c("calf", "yearling", "adult", "senior")))
w_curr <- table(factor(sim_obj$wolf_pop$ageclass, levels = c("pup", "subadult", "adult")))
step_df <- data.frame(
step = curr_step,
time = curr_step,
Species = c(rep("moose", 4), rep("wolf", 3)),
State = c(names(m_curr), names(w_curr)),
Type = "ageclass",
Count = c(as.numeric(m_curr), as.numeric(w_curr)),
stringsAsFactors = FALSE
)
sim_obj$history <- rbind(sim_obj$history, step_df)
}
sim_obj$nstep <- curr_step
return(sim_obj)
}
ggplot_ecosystem_sim <- function(x, ...) {
if (!inherits(x, "ecosystem_sim") && !inherits(x, "isle_royale_sim")) {
stop("Input must be an object of class 'ecosystem_sim' or 'isle_royale_sim'.")
}
p_map <- autoplot(x$habitat_overlay, ...)
if (!is.null(x$moose_pop) && nrow(x$moose_pop) > 0) {
moose_sf <- sf::st_as_sf(x$moose_pop, coords = c("lon", "lat"), crs = sf::st_crs(x$habitat_overlay$layer))
p_map <- p_map +
ggplot2::geom_sf(data = moose_sf, color = "#27ae60", shape = 21, fill = NA, stroke = 1.0, size = 0.8, alpha = 0.85) +
ggplot2::geom_sf(data = moose_sf, color = "#27ae60", alpha = 0.4, size = 0.5)
}
if (!is.null(x$wolf_pop) && nrow(x$wolf_pop) > 0) {
wolf_sf <- sf::st_as_sf(x$wolf_pop, coords = c("lon", "lat"), crs = sf::st_crs(x$habitat_overlay$layer))
p_map <- p_map +
ggplot2::geom_sf(data = wolf_sf, color = "#e74c3c", shape = 24, fill = "#e74c3c", size = 1.2, alpha = 0.9)
}
eco_title <- if (!is.null(x$ecosystem)) paste0(toupper(substr(x$ecosystem, 1, 1)), substring(x$ecosystem, 2)) else "Ecosystem"
p_map <- p_map + ggplot2::ggtitle(paste(eco_title, "Simulation (Step", x$nstep, ")"))
if (!is.null(x$historical_data)) {
df_hist <- x$historical_data
p_hist <- ggplot2::ggplot(df_hist, ggplot2::aes(x = .data$Year)) +
ggplot2::geom_line(ggplot2::aes(y = .data$Moose, color = "Historical Moose"), linewidth = 1.0) +
ggplot2::geom_line(ggplot2::aes(y = .data$Wolves * 40, color = "Historical Wolves (x40)"), linewidth = 1.0, linetype = "dashed") +
ggplot2::scale_color_manual(
name = "Empirical Benchmarks",
values = c("Historical Moose" = "#27ae60", "Historical Wolves (x40)" = "#e74c3c")
) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = paste(eco_title, "Census Trajectories"),
x = "Year", y = "Moose Abundance (Wolves x40)"
)
if (requireNamespace("cowplot", quietly = TRUE)) {
return(cowplot::plot_grid(p_map, p_hist, ncol = 1, rel_heights = c(1.2, 1)))
}
}
return(p_map)
}
plot.ecosystem_sim <- function(x, ...) {
print(ggplot_ecosystem_sim(x, ...))
}
get_site_cache_file <- function(filename, site = "isle_royale") {
pkg_dir <- system.file(file.path("extdata", site), package = "ewing")
if (pkg_dir != "") {
fp <- if (filename == "") pkg_dir else file.path(pkg_dir, filename)
if (file.exists(fp) || dir.exists(fp)) return(fp)
}
dev_fp <- if (filename == "") file.path("inst", "extdata", site) else file.path("inst", "extdata", site, filename)
if (file.exists(dev_fp) || dir.exists(dev_fp)) return(dev_fp)
if (pkg_dir != "") file.path(pkg_dir, filename) else dev_fp
}
get_isle_royale_cache_file <- function(filename) {
get_site_cache_file(filename, site = "isle_royale")
}
# --- Source: ecosystemApp.R ---
ecosystemApp <- function(ecosystem = "isle_royale", title = NULL) {
if (is.null(title)) {
title <- paste(paste0(toupper(substr(ecosystem, 1, 1)), substring(ecosystem, 2)), "Predator-Prey Simulation Platform")
}
ui <- bslib::page_sidebar(
title = title,
sidebar = bslib::sidebar(
width = 340,
ecosystemInput("eco", ecosystem = ecosystem)
),
ecosystemOutput("eco")
)
server <- function(input, output, session) {
ecosystemServer("eco", ecosystem = ecosystem)
}
shiny::shinyApp(ui = ui, server = server)
}
ecosystemInput <- function(id, ecosystem = "isle_royale") {
ns <- shiny::NS(id)
csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
if (csv_path == "" || !file.exists(csv_path)) {
csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
}
years <- 1980:2019
if (file.exists(csv_path)) {
df <- tryCatch(utils::read.csv(csv_path), error = function(e) NULL)
if (!is.null(df) && "Year" %in% names(df)) years <- df$Year
}
shiny::tagList(
shiny::tags$style(shiny::HTML(sprintf("
#%s .form-group { margin-bottom: 4px; }
#%s .irs { margin-bottom: 0px; }
#%s .irs-with-grid { height: 34px; }
#%s .checkbox { margin-top: 1px; margin-bottom: 2px; }
#%s .radio-inline, #%s .checkbox-inline { margin-right: 10px; }
#%s label { font-size: 0.82rem; margin-bottom: 1px; }
#%s div.shiny-options-group { margin-top: -2px; }
", id, id, id, id, id, id, id, id))),
# 1. Top Section: Step size & Action Buttons (Run / Reset on same line)
step_size_slider(ns("step_size"), "Steps per click:", selected = 200),
shiny::div(
style = "display: flex; gap: 8px; margin: 4px 0 6px 0;",
shiny::actionButton(ns("step_sim"), "Run", class = "btn-primary", style = "flex: 1; font-weight: 600; padding: 3px 6px; font-size: 0.85rem;"),
shiny::actionButton(ns("reset_sim"), "Reset", class = "btn-warning", style = "flex: 1; font-weight: 600; padding: 3px 6px; font-size: 0.85rem;")
),
# 2. Population & Hexagon Extent Sliders
shiny::sliderInput(ns("n_hosts"), "Initial Hosts:", min = 50, max = 3000, value = 664, step = 50),
shiny::sliderInput(ns("n_predators"), "Initial Predators:", min = 0, max = 60, value = 50, step = 2),
shiny::sliderInput(ns("hex_diameter"), "Hex Diameter:", min = 0.005, max = 0.03, value = 0.01, step = 0.001),
# 3. Conditional Map Overlay Options (Substrate Plot & Census Benchmarks)
shiny::conditionalPanel(
condition = sprintf("input['%s'] == 'Substrate Plot' || input['%s'] == 'Census Benchmarks'", ns("tabset"), ns("tabset")),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),
shiny::div(
style = "display: flex; gap: 12px; align-items: center; margin-bottom: 2px;",
shiny::checkboxInput(ns("show_habitat"), "Habitat Features", value = TRUE),
shiny::checkboxInput(ns("show_landmarks"), "Landmarks", value = TRUE)
)
),
# 4. Conditional Substrate Plot Axis Units
shiny::conditionalPanel(
condition = sprintf("input['%s'] == 'Substrate Plot'", ns("tabset")),
axisUnitInput(ns("substrate_axis"), time_label = "Days")
),
# 5. Conditional Age Classes Options (Age Classes tab)
shiny::conditionalPanel(
condition = sprintf("input['%s'] == 'Age Classes'", ns("tabset")),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),
ageClassControlInput(ns("age_ctrls"), time_label = "Days")
),
shiny::div(style = "border-top: 1px solid rgba(0,0,0,0.1); margin: 4px 0 2px 0;"),
# 6. Bottom Section: Baseline Year & Status
shiny::selectInput(ns("start_year"), "Baseline Year:", choices = years, selected = 1980),
shiny::uiOutput(ns("status"))
)
}
ecosystemOutput <- function(id) {
ns <- shiny::NS(id)
shiny::tagList(
shiny::tabsetPanel(
id = ns("tabset"),
type = "tabs",
shiny::tabPanel(
"Substrate Plot",
shiny::plotOutput(ns("substrate_plot"), height = "650px")
),
shiny::tabPanel(
"Age Classes",
distPlotOutput(ns("dist_plot"))
),
shiny::tabPanel(
"Census Benchmarks",
shiny::plotOutput(ns("autoplot"), height = "650px")
),
shiny::tabPanel(
"Live Demographics",
shiny::br(),
shiny::h4("Live Organism Population Summary (Updates Live on Simulation Step)"),
shiny::tableOutput(ns("summary_table"))
),
shiny::tabPanel(
"Input Data",
shiny::br(),
inputAppInput(ns("input_data")),
inputAppOutput(ns("input_data"))
)
)
)
}
ecosystemServer <- function(id, ecosystem = "isle_royale") {
shiny::moduleServer(id, function(input, output, session) {
ns <- session$ns
status_msg <- shiny::reactiveVal("")
sim_state <- shiny::reactiveVal(NULL)
sub_x_var <- axisUnitServer("substrate_axis")
age_ctrls <- ageClassControlServer("age_ctrls")
shiny::observeEvent(input$start_year, {
yr <- as.numeric(input$start_year)
csv_path <- system.file(file.path("doc", ecosystem, "wolf_moose.csv"), package = "ewing")
if (csv_path == "" || !file.exists(csv_path)) {
csv_path <- file.path("inst", "doc", ecosystem, "wolf_moose.csv")
}
if (file.exists(csv_path)) {
df <- tryCatch(utils::read.csv(csv_path), error = function(e) NULL)
if (!is.null(df) && "Year" %in% names(df) && yr %in% df$Year) {
row_match <- df[df$Year == yr, ]
if ("Moose" %in% names(row_match)) shiny::updateSliderInput(session, "n_hosts", value = as.numeric(row_match$Moose[1]))
if ("Wolves" %in% names(row_match)) shiny::updateSliderInput(session, "n_predators", value = as.numeric(row_match$Wolves[1]))
}
}
})
shiny::observeEvent(list(input$reset_sim, input$start_year),
{
yr <- as.numeric(input$start_year)
nh <- input$n_hosts
np <- input$n_predators
hd <- input$hex_diameter
shiny::req(yr, nh, np, hd)
sim <- init_ecosystem_sim(
ecosystem = ecosystem,
year = yr,
n_hosts = nh,
n_predators = np,
hex_diameter = hd
)
steps <- parse_step_size(input$step_size)
if (is.null(steps) || steps <= 0) steps <- 200
sim <- run_ecosystem_sim(sim, nstep = steps)
sim_state(sim)
status_msg(paste0("<div style='color:green;'><b>Simulation Initialized:</b> Year ", yr, " with ", nh, " Hosts and ", np, " Predators (Executed ", steps, " initial steps).</div>"))
},
ignoreNULL = FALSE
)
shiny::observeEvent(input$step_sim, {
sim <- sim_state()
shiny::req(sim)
steps <- parse_step_size(input$step_size)
if (is.null(steps) || steps <= 0) steps <- 200
updated_sim <- run_ecosystem_sim(sim, nstep = steps)
sim_state(updated_sim)
status_msg(paste0("<div style='color:blue;'><b>Executed ", steps, " steps:</b> Total Steps = ", updated_sim$nstep, "</div>"))
})
output$substrate_plot <- shiny::renderPlot({
sim <- sim_state()
shiny::req(sim)
ewing_substrate(sim, x_var = sub_x_var())
})
distPlotServer("dist_plot", simres = sim_state, x_var = age_ctrls$x_var, total = age_ctrls$total, norm = age_ctrls$norm)
output$autoplot <- shiny::renderPlot({
sim <- sim_state()
shiny::req(sim)
ggplot_ecosystem_sim(sim)
})
output$summary_table <- shiny::renderTable({
sim <- sim_state()
shiny::req(sim)
moose_counts <- table(sim$moose_pop$ageclass)
wolf_counts <- table(sim$wolf_pop$ageclass)
df_moose <- data.frame(
Species = "Moose",
AgeClass = names(moose_counts),
Count = as.numeric(moose_counts),
stringsAsFactors = FALSE
)
df_wolf <- data.frame(
Species = "Wolf",
AgeClass = names(wolf_counts),
Count = as.numeric(wolf_counts),
stringsAsFactors = FALSE
)
rbind(df_moose, df_wolf)
})
pkg_dir <- get_site_cache_file("", site = ecosystem)
inputAppServer("input_data", simres = sim_state, datafile = shiny::reactiveVal(pkg_dir))
output$status <- shiny::renderUI({
shiny::HTML(status_msg())
})
})
}
# --- Source: isle_royale_sim.R ---
init_isle_royale_sim <- function(year = 1980,
n_moose = NULL,
n_wolves = NULL,
hex_diameter = 0.01,
datafile = "",
features_rds = NULL,
landmarks_rds = NULL) {
init_ecosystem_sim(
ecosystem = "isle_royale",
year = year,
n_hosts = n_moose,
n_predators = n_wolves,
hex_diameter = hex_diameter,
datafile = datafile,
features_rds = features_rds,
landmarks_rds = landmarks_rds
)
}
run_isle_royale_sim <- function(sim_obj, nstep = 1000, refresh = 10, ...) {
run_ecosystem_sim(sim_obj = sim_obj, nstep = nstep, refresh = refresh, ...)
}
ggplot_isle_royale_sim <- function(x, ...) {
ggplot_ecosystem_sim(x, ...)
}
plot.isle_royale_sim <- function(x, ...) {
print(ggplot_isle_royale_sim(x, ...))
}
# --- Source: IsleRoyaleApp.R ---
IsleRoyaleApp <- function(title = "Isle Royale Wolf-Moose Simulation Platform") {
ecosystemApp(ecosystem = "isle_royale", title = title)
}
IsleRoyaleInput <- function(id) {
ecosystemInput(id, ecosystem = "isle_royale")
}
IsleRoyaleOutput <- function(id) {
ecosystemOutput(id)
}
IsleRoyaleServer <- function(id) {
ecosystemServer(id, ecosystem = "isle_royale")
}
# --- Launch Application ---
IsleRoyaleApp()
Programmatic Application Usage
Launch the interactive application natively in R using exported package functions:
library (ewing)
# Launch interactive offline Shiny app
IsleRoyaleApp ()
Executable Workflow: Isle Royale Spatial Predator-Prey Model
Below is an executable simulation workflow displaying spatial individual organism distributions on the Isle Royale substrate map, step-by-step demographic tallies, and historical 40-year empirical census benchmarks (1980–2019).
library (ewing)
library (ggplot2)
# 1. Initialize Isle Royale spatial simulation with 1980 baseline counts (664 Moose, 50 Wolves)
sim <- init_isle_royale_sim (year = 1980 )
# 2. Run simulation steps (e.g. 200 days)
sim <- run_isle_royale_sim (sim, nstep = 200 )
# 3. Visualize spatial landscape & benchmark trajectories
ggplot_isle_royale_sim (sim)
Age Classes Demographic Dynamics
# Plot side-by-side per-species age class dynamics over time (days)
autoplot (ewing_ageclass (sim), x_var = "time" )
Technical Features
100% Offline GIS Substrate Mapping : Renders habitat features (lakes, bogs, shaded forests, waterways) and landmark POIs using pre-computed local sf layers (inst/extdata/isle_royale/) with 0 API calls .
Dynamic Habitat-Weighted Movement : Organisms evaluate adjacent hexagonal substrate cells, moving with probability proportional to habitat suitability scores.
Continuous Demographic Stepping : Tallies births, aging (Calf \(\rightarrow\) Yearling \(\rightarrow\) Adult \(\rightarrow\) Senior; Pup \(\rightarrow\) Subadult \(\rightarrow\) Adult), and wolf predation at micro-step increments.
Tab-Aware Sidebar Decluttering : Displays plot-specific controls (show_habitat, show_landmarks, norm, total, Steps vs Days) strictly when their target tab is active.
Shared Modular Architecture : Peer application wrapper composing step_controls, distPlotApp, inputApp, and substrateApp.