GeoGuessr country-wise score

Adds an analysis tool to the GeoGuessr website

// ==UserScript==
// @name         GeoGuessr country-wise score
// @version      0.5
// @description  Adds an analysis tool to the GeoGuessr website
// @match        https://www.geoguessr.com/*
// @run-at document-start
// @author       eru
// @license      MIT
// @require      https://greasyfork.org/scripts/460322-geoguessr-styles-scan/code/Geoguessr%20Styles%20Scan.js?version=1151654
// @icon         https://www.google.com/s2/favicons?sz=64&domain=geoguessr.com
// @grant        none
// @namespace https://greasyfork.org/users/1348455
// ==/UserScript==

/* jshint esversion: 11 */

/*
                  THIS SCRIPT WAS SUPPOSED TO WORK FOR BOTH SOLO AND MULTIPLAYER
                  HOWEVER, I FOUND OUT THAT IT IS NOT ALLOWED TO QUERY THE API FROM A MULTIPLAYER GAME
                  SO IGNORE ALL CODE SNIPPETS RELATED TO MULTIPLAYER LIKE getDuelData
*/

const AUTOMATIC = true;
//                ^^^^ Replace with false for a manual counter

const API_Key = '';
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Replace INSERT_BIGDATACLOUD_API_KEY_HERE with your API key (keep the quote marks)
//               THIS IS OPTIONAL: if you don't provide an API key, the script will use another method to get the country

const statsServerUrl = 'https://ggstats.eu';

const DefaultCountryDict = {
    "AF":{"referent":"AF", "diag":1142.1295898452154, "alpha":175.3515519520104, "fullname":"Afghanistan"},
    "AX":{"referent":"FI", "diag":56.213877290220786, "alpha":25.63268878594707, "fullname":"Åland Islands"},
    "AL":{"referent":"AL", "diag":239.78323544401513, "alpha":46.309802998440105, "fullname":"Albania"},
    "DZ":{"referent":"DZ", "diag":2182.5402630879457, "alpha":318.79648181423624, "fullname":"Algeria"},
    "AS":{"referent":"US", "diag":19.949937343260004, "alpha":20.632857031043354, "fullname":"American Samoa"},
    "AD":{"referent":"AD", "diag":30.59411708155671, "alpha":22.100406004990372, "fullname":"Andorra"},
    "AO":{"referent":"AO", "diag":1579.0503475190396, "alpha":235.5912909817255, "fullname":"Angola"},
    "AI":{"referent":"GB", "diag":13.490737563232042, "alpha":19.742305364051706, "fullname":"Anguilla"},
    "AQ":{"referent":"AQ", "diag":5291.502622129181, "alpha":747.4396118842076, "fullname":"Antarctica"},
    "AG":{"referent":"AG", "diag":29.732137494637012, "alpha":21.981561971025414, "fullname":"Antigua and Barbuda"},
    "AR":{"referent":"AR", "diag":2358.1348561946156, "alpha":396.0216955729648, "fullname":"Argentina"},
    "AM":{"referent":"AM", "diag":243.89751946258085, "alpha":51.50926577625275, "fullname":"Armenia"},
    "AW":{"referent":"NL", "diag":18.973665961010276, "alpha":20.498255201636095, "fullname":"Aruba"},
    "AU":{"referent":"AU", "diag":3922.2503744661685, "alpha":512.8761793857648, "fullname":"Australia"},
    "AT":{"referent":"AT", "diag":409.56318193900194, "alpha":83.53194032530612, "fullname":"Austria"},
    "AZ":{"referent":"AZ", "diag":416.17304093369626, "alpha":75.26147317852835, "fullname":"Azerbaijan"},
    "BS":{"referent":"BS", "diag":166.99101772251106, "alpha":40.905906899060895, "fullname":"Bahamas"},
    "BH":{"referent":"BH", "diag":39.11521443121589, "alpha":23.275238446742815, "fullname":"Bahrain"},
    "BD":{"referent":"BD", "diag":543.2678897192434, "alpha":74.38755026777277, "fullname":"Bangladesh"},
    "BB":{"referent":"BB", "diag":29.32575659723036, "alpha":21.925532865572123, "fullname":"Barbados"},
    "BY":{"referent":"BY", "diag":644.3601477434805, "alpha":106.72239949695455, "fullname":"Belarus"},
    "BE":{"referent":"BE", "diag":247.09512338368802, "alpha":34.843829038514336, "fullname":"Belgium"},
    "BZ":{"referent":"BZ", "diag":214.31752144890066, "alpha":47.43097164728892, "fullname":"Belize"},
    "BJ":{"referent":"BJ", "diag":474.59877791667355, "alpha":83.31682666461928, "fullname":"Benin"},
    "BM":{"referent":"GB", "diag":10.392304845413264, "alpha":19.315113991144052, "fullname":"Bermuda"},
    "BT":{"referent":"BT", "diag":277.10647773013176, "alpha":54.93711090892961, "fullname":"Bhutan"},
    "BO":{"referent":"BO", "diag":1482.2826990827357, "alpha":163.17070120907988, "fullname":"Bolivia"},
    "BQ":{"referent":"NL", "diag":25.612496949731394, "alpha":37.47968185947722, "fullname":"Caribbean Netherlands"},
    "BA":{"referent":"BA", "diag":320.0281237641467, "alpha":62.005649055722614, "fullname":"Bosnia and Herzegovina"},
    "BW":{"referent":"BW", "diag":1078.8883167408942, "alpha":134.95197865270416, "fullname":"Botswana"},
    "BV":{"referent":"NO", "diag":9.899494936611665, "alpha":19.247168626278533, "fullname":"Bouvet Island"},
    "BR":{"referent":"BR", "diag":4126.927913109217, "alpha":591.9923561732209, "fullname":"Brazil"},
    "BN":{"referent":"BN", "diag":107.37783756436893, "alpha":32.68683661598056, "fullname":"Brunei"},
    "BG":{"referent":"BG", "diag":470.91188135361375, "alpha":60.05314384559996, "fullname":"Bulgaria"},
    "BF":{"referent":"BF", "diag":738.8734668398913, "alpha":119.75326968841003, "fullname":"Burkina Faso"},
    "BI":{"referent":"BI", "diag":235.9406705084988, "alpha":50.41222816457079, "fullname":"Burundi"},
    "KH":{"referent":"KH", "diag":601.7225274160841, "alpha":71.12785351923642, "fullname":"Cambodia"},
    "CM":{"referent":"CM", "diag":975.1328114672381, "alpha":152.3271426704479, "fullname":"Cameroon"},
    "CA":{"referent":"CA", "diag":4468.706748042436, "alpha":546.2232473698027, "fullname":"Canada"},
    "CV":{"referent":"CV", "diag":89.81091247727082, "alpha":30.26482538347385, "fullname":"Cape Verde"},
    "KY":{"referent":"UK", "diag":22.978250586152114, "alpha":21.050380795359988, "fullname":"Cayman Islands"},
    "CF":{"referent":"CF", "diag":1116.2293671105415, "alpha":171.78060085631307, "fullname":"Central African Republic"},
    "TD":{"referent":"TD", "diag":1602.4980499208104, "alpha":238.82410482432982, "fullname":"Chad"},
    "CL":{"referent":"CL", "diag":1229.7170406235737, "alpha":412.0259548379801, "fullname":"Chile"},
    "CN":{"referent":"CN", "diag":4406.123239311401, "alpha":625.3693691079427, "fullname":"China"},
    "CX":{"referent":"AU", "diag":16.431676725154983, "alpha":20.147782569025253, "fullname":"Christmas Island"},
    "CC":{"referent":"AU", "diag":5.291502622129181, "alpha":18.611849178529653, "fullname":"Cocos (Keeling) Islands"},
    "CO":{"referent":"CO", "diag":1511.1240849116264, "alpha":234.99234152503587, "fullname":"Colombia"},
    "KM":{"referent":"KM", "diag":61.02458520956943, "alpha":26.295957318100648, "fullname":"Comoros"},
    "CG":{"referent":"CG", "diag":827.0429251254133, "alpha":131.90949038570238, "fullname":"Republicofthe Congo"},
    "CD":{"referent":"CD", "diag":2165.575212270403, "alpha":316.45745301799496, "fullname":"DR Congo"},
    "CK":{"referent":"NZ", "diag":21.72556098240043, "alpha":20.877668253120067, "fullname":"Cook Islands"},
    "CR":{"referent":"CR", "diag":319.68734726291564, "alpha":61.95866504971907, "fullname":"Costa Rica"},
    "CI":{"referent":"CI", "diag":803.072848501305, "alpha":128.60465504657546, "fullname":"Ivory Coast"},
    "HR":{"referent":"HR", "diag":336.4342432036311, "alpha":65.25113670334214, "fullname":"Croatia"},
    "CU":{"referent":"CU", "diag":468.7941979163138, "alpha":82.51652963533552, "fullname":"Cuba"},
    "CW":{"referent":"NL", "diag":29.79932885150268, "alpha":21.990825870099904, "fullname":"Curaçao"},
    "CY":{"referent":"CY", "diag":136.02205703487945, "alpha":36.63611179988381, "fullname":"Cyprus"},
    "CZ":{"referent":"CZ", "diag":397.1523637094459, "alpha":58.35867535139994, "fullname":"Czechia"},
    "DK":{"referent":"DK", "diag":293.5779283256832, "alpha":55.4021156649218, "fullname":"Denmark"},
    "DJ":{"referent":"DJ", "diag":215.40659228538016, "alpha":47.58112551803583, "fullname":"Djibouti"},
    "DM":{"referent":"DM", "diag":38.7556447501522, "alpha":23.22566336162762, "fullname":"Dominica"},
    "DO":{"referent":"DO", "diag":311.9967948553318, "alpha":56.78039086631456, "fullname":"Dominican Republic"},
    "EC":{"referent":"EC", "diag":744.0981118105327, "alpha":176.45960606370554, "fullname":"Ecuador"},
    "EG":{"referent":"EG", "diag":1415.9449141827517, "alpha":213.1033945704463, "fullname":"Egypt"},
    "SV":{"referent":"SV", "diag":205.1389772812568, "alpha":46.16549479451749, "fullname":"El Salvador"},
    "GQ":{"referent":"GQ", "diag":236.85860761222085, "alpha":50.538787250177776, "fullname":"Equatorial Guinea"},
    "ER":{"referent":"ER", "diag":484.9742261192856, "alpha":84.74732471504213, "fullname":"Eritrea"},
    "EE":{"referent":"EE", "diag":300.7557148251717, "alpha":43.71043395836512, "fullname":"Estonia"},
    "ET":{"referent":"ET", "diag":1486.1359291801002, "alpha":222.7808666323886, "fullname":"Ethiopia"},
    "FK":{"referent":"GB", "diag":156.0320479901485, "alpha":39.39495676653159, "fullname":"Falkland Islands"},
    "FO":{"referent":"DK", "diag":52.78257288158659, "alpha":25.159603269918684, "fullname":"Faroe Islands"},
    "FJ":{"referent":"FJ", "diag":191.16485032557634, "alpha":44.23883476247862, "fullname":"Fiji"},
    "FI":{"referent":"FI", "diag":822.7077245291915, "alpha":123.88775064268542, "fullname":"Finland"},
    "FR":{"referent":"FR", "diag":1050.4237240275945, "alpha":151.68231721060795, "fullname":"France"},
    "GF":{"referent":"FR", "diag":408.7395258596849, "alpha":74.23658937461856, "fullname":"French Guiana"},
    "PF":{"referent":"FR", "diag":91.29074432821763, "alpha":30.46885479371177, "fullname":"French Polynesia"},
    "TF":{"referent":"FR", "diag":124.47489706764172, "alpha":35.04406589512031, "fullname":"French Southern and Antarctic Lands"},
    "GA":{"referent":"GA", "diag":731.6665907365185, "alpha":118.75963336406133, "fullname":"Gabon"},
    "GM":{"referent":"GM", "diag":146.21217459568817, "alpha":38.041057689416235, "fullname":"Gambia"},
    "GE":{"referent":"GE", "diag":373.3630940518894, "alpha":69.35912136131117, "fullname":"Georgia"},
    "DE":{"referent":"DE", "diag":845.1201098068842, "alpha":101.1560583838771, "fullname":"Germany"},
    "GH":{"referent":"GH", "diag":690.6996452872985, "alpha":109.92069520635856, "fullname":"Ghana"},
    "GI":{"referent":"UK", "diag":3.4641016151377544, "alpha":18.359899236050648, "fullname":"Gibraltar"},
    "GR":{"referent":"GR", "diag":513.7898403043797, "alpha":105.77687733352258, "fullname":"Greece"},
    "GL":{"referent":"DK", "diag":2081.3870375305023, "alpha":200.87644835734, "fullname":"Greenland"},
    "GD":{"referent":"GD", "diag":26.229754097208, "alpha":21.498676554991604, "fullname":"Grenada"},
    "GP":{"referent":"FR", "diag":57.06137047074842, "alpha":25.749535530185668, "fullname":"Guadeloupe"},
    "GU":{"referent":"US", "diag":33.13608305156178, "alpha":22.450875429859945, "fullname":"Guam"},
    "GT":{"referent":"GT", "diag":466.666904761844, "alpha":66.61979619942836, "fullname":"Guatemala"},
    "GG":{"referent":"GB", "diag":12.489995996796797, "alpha":19.604329747788466, "fullname":"Guernsey"},
    "GN":{"referent":"GN", "diag":701.2232169573394, "alpha":114.56230270528113, "fullname":"Guinea"},
    "GW":{"referent":"GW", "diag":268.79360111431225, "alpha":54.941772552876024, "fullname":"Guinea-Bissau"},
    "GY":{"referent":"GY", "diag":655.6965761691912, "alpha":108.28539113308017, "fullname":"Guyana"},
    "HT":{"referent":"HT", "diag":235.58437978779492, "alpha":50.363105160783604, "fullname":"Haiti"},
    "HM":{"referent":"AU", "diag":28.705400188814647, "alpha":21.84000223446333, "fullname":"Heard Island and McDonald Islands"},
    "VA":{"referent":"VA", "diag":0.938083151964686, "alpha":18.011628547754842, "fullname":"Vatican City"},
    "HN":{"referent":"HN", "diag":474.3247832445612, "alpha":83.27905009471802, "fullname":"Honduras"},
    "HK":{"referent":"CN", "diag":46.98936049788292, "alpha":24.360873532297592, "fullname":"Hong Kong"},
    "HU":{"referent":"HU", "diag":431.34209161638745, "alpha":59.582088688244326, "fullname":"Hungary"},
    "IS":{"referent":"IS", "diag":453.8722287164087, "alpha":56.83853033920002, "fullname":"Iceland"},
    "IN":{"referent":"IN", "diag":2564.2113797423176, "alpha":371.4187664244891, "fullname":"India"},
    "ID":{"referent":"ID", "diag":1951.7013091146914, "alpha":348.24172495205454, "fullname":"Indonesia"},
    "IR":{"referent":"IR", "diag":1815.5963207717732, "alpha":268.2046824194295, "fullname":"Iran"},
    "IQ":{"referent":"IQ", "diag":936.2873490547654, "alpha":146.9713877031756, "fullname":"Iraq"},
    "IE":{"referent":"IE", "diag":374.8946518690284, "alpha":69.57028240503124, "fullname":"Ireland"},
    "IM":{"referent":"GB", "diag":33.823069050575526, "alpha":22.54559250743251, "fullname":"Isleof Man"},
    "IL":{"referent":"IL", "diag":203.81364036786155, "alpha":42.81847201865375, "fullname":"Israel"},
    "IT":{"referent":"IT", "diag":776.3195218465139, "alpha":161.12895676195018, "fullname":"Italy"},
    "JM":{"referent":"JM", "diag":148.26327933780502, "alpha":38.32385042063267, "fullname":"Jamaica"},
    "JP":{"referent":"JP", "diag":869.4020933952253, "alpha":212.824360424015, "fullname":"Japan"},
    "JE":{"referent":"GB", "diag":15.231546211727817, "alpha":19.982316525902576, "fullname":"Jersey"},
    "JO":{"referent":"JO", "diag":422.71030268967894, "alpha":70.89211961461133, "fullname":"Jordan"},
    "KZ":{"referent":"KZ", "diag":2334.480670299071, "alpha":339.7450184028771, "fullname":"Kazakhstan"},
    "KE":{"referent":"KE", "diag":1077.3736584862284, "alpha":146.3362641686688, "fullname":"Kenya"},
    "KI":{"referent":"KI", "diag":40.27406113120453, "alpha":23.435012551215273, "fullname":"Kiribati"},
    "KR":{"referent":"KR", "diag":447.6829235072519, "alpha":65.55828785694067, "fullname":"South Korea"},
    "KW":{"referent":"KW", "diag":188.7749983445901, "alpha":43.90933780650718, "fullname":"Kuwait"},
    "KG":{"referent":"KG", "diag":632.3780514850274, "alpha":121.69263454224145, "fullname":"Kyrgyzstan"},
    "LA":{"referent":"LA", "diag":688.1860213634102, "alpha":143.57699299871368, "fullname":"Laos"},
    "LV":{"referent":"LV", "diag":359.32993195669076, "alpha":50.97009828511159, "fullname":"Latvia"},
    "LB":{"referent":"LB", "diag":144.58215657542254, "alpha":37.81632160528668, "fullname":"Lebanon"},
    "LS":{"referent":"LS", "diag":246.39399343328157, "alpha":34.56557529652339, "fullname":"Lesotho"},
    "LR":{"referent":"LR", "diag":471.9512686708237, "alpha":82.95180563220632, "fullname":"Liberia"},
    "LY":{"referent":"LY", "diag":1875.9211070831311, "alpha":276.52186424381057, "fullname":"Libya"},
    "LI":{"referent":"LI", "diag":17.88854381999832, "alpha":20.34864575085618, "fullname":"Liechtenstein"},
    "LT":{"referent":"LT", "diag":361.386219991853, "alpha":46.406637166782296, "fullname":"Lithuania"},
    "LU":{"referent":"LU", "diag":71.91661838546081, "alpha":27.797678681745545, "fullname":"Luxembourg"},
    "MO":{"referent":"CN", "diag":7.745966692414834, "alpha":18.950254421253778, "fullname":"Macau"},
    "MK":{"referent":"MK", "diag":226.77301426757109, "alpha":30.07702057954948, "fullname":"North Macedonia"},
    "MG":{"referent":"MG", "diag":1083.5506448708338, "alpha":202.3942422420552, "fullname":"Madagascar"},
    "MW":{"referent":"MW", "diag":486.7935907548496, "alpha":84.99816665587774, "fullname":"Malawi"},
    "MY":{"referent":"MY", "diag":813.3916645749451, "alpha":222.18464770088195, "fullname":"Malaysia"},
    "MV":{"referent":"MV", "diag":24.49489742783178, "alpha":21.25948601258391, "fullname":"Maldives"},
    "ML":{"referent":"ML", "diag":1574.9234902051592, "alpha":235.02230723985758, "fullname":"Mali"},
    "MT":{"referent":"MT", "diag":25.13961017995307, "alpha":21.348374734977615, "fullname":"Malta"},
    "MH":{"referent":"MH", "diag":19.026297590440446, "alpha":20.50551170196458, "fullname":"Marshall Islands"},
    "MQ":{"referent":"FR", "diag":47.49736834815167, "alpha":24.430914288630987, "fullname":"Martinique"},
    "MR":{"referent":"MR", "diag":1435.7576397150042, "alpha":215.8350418876499, "fullname":"Mauritania"},
    "MU":{"referent":"MU", "diag":63.874877690685246, "alpha":26.68893675934971, "fullname":"Mauritius"},
    "YT":{"referent":"FR", "diag":27.349588662354687, "alpha":21.653071924806586, "fullname":"Mayotte"},
    "MX":{"referent":"MX", "diag":1982.1074642914798, "alpha":367.3607466315442, "fullname":"Mexico"},
    "FM":{"referent":"FM", "diag":37.469987990390386, "alpha":23.048405526357506, "fullname":"Micronesia"},
    "MD":{"referent":"MD", "diag":260.1768629221284, "alpha":53.75375378547282, "fullname":"Moldova"},
    "MC":{"referent":"MC", "diag":2.009975124224178, "alpha":18.15941391053031, "fullname":"Monaco"},
    "MN":{"referent":"MN", "diag":1768.67747201122, "alpha":230.1442050070954, "fullname":"Mongolia"},
    "ME":{"referent":"ME", "diag":166.20469307453385, "alpha":28.331453632251147, "fullname":"Montenegro"},
    "MS":{"referent":"GB", "diag":14.2828568570857, "alpha":19.85151752370325, "fullname":"Montserrat"},
    "MA":{"referent":"MA", "diag":945.0396817065408, "alpha":148.17810133621796, "fullname":"Morocco"},
    "MZ":{"referent":"MZ", "diag":1266.1674454826266, "alpha":192.45306961206452, "fullname":"Mozambique"},
    "MM":{"referent":"MM", "diag":1163.2523371994573, "alpha":178.26381639782107, "fullname":"Myanmar"},
    "NA":{"referent":"NA", "diag":1285.0019455238191, "alpha":195.049845680286, "fullname":"Namibia"},
    "NR":{"referent":"NR", "diag":6.48074069840786, "alpha":18.77581344459162, "fullname":"Nauru"},
    "NP":{"referent":"NP", "diag":542.5513800553824, "alpha":92.68568119334317, "fullname":"Nepal"},
    "NL":{"referent":"NL", "diag":289.30952282978865, "alpha":57.77037190044235, "fullname":"Netherlands"},
    "NC":{"referent":"FR", "diag":192.74335267396384, "alpha":44.45646820711263, "fullname":"New Caledonia"},
    "NZ":{"referent":"NZ", "diag":735.4821547801143, "alpha":165.76579835292438, "fullname":"New Zealand"},
    "NI":{"referent":"NI", "diag":510.63294057473416, "alpha":88.2849782494345, "fullname":"Nicaragua"},
    "NE":{"referent":"NE", "diag":1591.8542646863123, "alpha":237.35661024195255, "fullname":"Niger"},
    "NG":{"referent":"NG", "diag":1359.2409646563776, "alpha":184.09473252281128, "fullname":"Nigeria"},
    "NU":{"referent":"NZ", "diag":22.80350850198276, "alpha":21.02628851463633, "fullname":"Niue"},
    "NF":{"referent":"AU", "diag":8.48528137423857, "alpha":19.052186230882164, "fullname":"Norfolk Island"},
    "MP":{"referent":"US", "diag":30.463092423455635, "alpha":22.082341193301204, "fullname":"Northern Mariana Islands"},
    "NO":{"referent":"NO", "diag":804.738466832548, "alpha":189.7558067445318, "fullname":"Norway"},
    "OM":{"referent":"OM", "diag":786.7655305108377, "alpha":126.35631009439152, "fullname":"Oman"},
    "PK":{"referent":"PK", "diag":1328.0903583717488, "alpha":200.99059053979585, "fullname":"Pakistan"},
    "PW":{"referent":"PW", "diag":30.298514815086232, "alpha":22.059650323150997, "fullname":"Palau"},
    "PS":{"referent":"IL", "diag":111.53474794878949, "alpha":33.259963876082836, "fullname":"Palestine"},
    "PA":{"referent":"PA", "diag":388.37353153890393, "alpha":69.64419635716979, "fullname":"Panama"},
    "PG":{"referent":"PG", "diag":962.1226533036212, "alpha":150.53338826819842, "fullname":"Papua New Guinea"},
    "PY":{"referent":"PY", "diag":901.9445659240927, "alpha":142.2364323205104, "fullname":"Paraguay"},
    "PE":{"referent":"PE", "diag":1603.256685624607, "alpha":212.25094932780146, "fullname":"Peru"},
    "PH":{"referent":"PH", "diag":827.4696369051858, "alpha":173.4537925435466, "fullname":"Philippines"},
    "PN":{"referent":"GB", "diag":9.695359714832659, "alpha":19.219023814500282, "fullname":"Pitcairn Islands"},
    "PL":{"referent":"PL", "diag":790.7958017086332, "alpha":93.6377393081947, "fullname":"Poland"},
    "PT":{"referent":"PT", "diag":429.1619740843776, "alpha":104.32658196010533, "fullname":"Portugal"},
    "PR":{"referent":"US", "diag":133.19159132617943, "alpha":34.953005904661474, "fullname":"Puerto Rico"},
    "QA":{"referent":"QA", "diag":152.22351986470423, "alpha":26.61177089955384, "fullname":"Qatar"},
    "RE":{"referent":"FR", "diag":70.8660708661063, "alpha":27.6528361507082, "fullname":"Réunion"},
    "RO":{"referent":"RO", "diag":690.4940260422244, "alpha":87.61241886754098, "fullname":"Romania"},
    "RU":{"referent":"RU", "diag":5847.775987501574, "alpha":714.131946328906, "fullname":"Russia"},
    "RW":{"referent":"RW", "diag":229.5125268912353, "alpha":47.34913940834831, "fullname":"Rwanda"},
    "BL":{"referent":"FR", "diag":6.48074069840786, "alpha":18.77581344459162, "fullname":"Saint Barthélemy"},
    "SH":{"referent":"GB", "diag":28.071337695236398, "alpha":21.752581899148893, "fullname":"Saint Helena, Ascension and Tristanda Cunha"},
    "KN":{"referent":"KN", "diag":22.847319317591726, "alpha":21.03232885960189, "fullname":"Saint Kitts and Nevis"},
    "LC":{"referent":"LC", "diag":35.09985754956849, "alpha":22.721627645668942, "fullname":"Saint Lucia"},
    "MF":{"referent":"FR", "diag":10.295630140987, "alpha":19.30178512346466, "fullname":"Saint Martin"},
    "PM":{"referent":"FR", "diag":22, "alpha":20.915506086432877, "fullname":"Saint Pierre and Miquelon"},
    "VC":{"referent":"VC", "diag":27.892651361962706, "alpha":21.727945811493335, "fullname":"Saint Vincent andthe Grenadines"},
    "WS":{"referent":"WS", "diag":75.39230729988306, "alpha":28.276883639340106, "fullname":"Samoa"},
    "SM":{"referent":"SM", "diag":11.045361017187261, "alpha":19.405153048955945, "fullname":"San Marino"},
    "ST":{"referent":"ST", "diag":43.9089968002003, "alpha":23.936173396160925, "fullname":"São Tomé and Príncipe"},
    "SA":{"referent":"SA", "diag":2073.4946346687275, "alpha":303.76199310448055, "fullname":"Saudi Arabia"},
    "SN":{"referent":"SN", "diag":627.2511458738039, "alpha":73.10745326166858, "fullname":"Senegal"},
    "RS":{"referent":"RS", "diag":420.3831585589508, "alpha":51.7064056273538, "fullname":"Serbia"},
    "SC":{"referent":"SC", "diag":30.066592756745816, "alpha":22.027674446463326, "fullname":"Seychelles"},
    "SL":{"referent":"SL", "diag":378.78753939378737, "alpha":70.10700794265969, "fullname":"Sierra Leone"},
    "SG":{"referent":"SG", "diag":37.68288736283355, "alpha":23.07775868115804, "fullname":"Singapore"},
    "SX":{"referent":"NL", "diag":8.246211251235321, "alpha":19.019224826401885, "fullname":"Sint Maarten"},
    "SK":{"referent":"SK", "diag":313.16768671112925, "alpha":45.22964025118811, "fullname":"Slovakia"},
    "SI":{"referent":"SI", "diag":201.36037346012247, "alpha":27.89763900562601, "fullname":"Slovenia"},
    "SB":{"referent":"SB", "diag":240.39966722106752, "alpha":51.027005085973144, "fullname":"Solomon Islands"},
    "SO":{"referent":"SO", "diag":1129.2980120411087, "alpha":173.58241902645614, "fullname":"Somalia"},
    "ZA":{"referent":"ZA", "diag":1562.7136653910723, "alpha":211.7170385175186, "fullname":"South Africa"},
    "GS":{"referent":"GB", "diag":88.35157044444654, "alpha":30.06362097359306, "fullname":"South Georgia"},
    "ES":{"referent":"ES", "diag":1005.9741547375856, "alpha":179.63389384946177, "fullname":"Spain"},
    "LK":{"referent":"LK", "diag":362.2430123549659, "alpha":70.56614661578718, "fullname":"Sri Lanka"},
    "SD":{"referent":"SD", "diag":1942.1987539899205, "alpha":285.6597870434162, "fullname":"Sudan"},
    "SR":{"referent":"SR", "diag":572.3984626114924, "alpha":96.80079916931417, "fullname":"Suriname"},
    "SJ":{"referent":"NO", "diag":349.413794805, "alpha":66.05715066928423, "fullname":"Svalbard and Jan Mayen"},
    "SZ":{"referent":"SZ", "diag":186.35450088473848, "alpha":30.704782861375946, "fullname":"Eswatini"},
    "SE":{"referent":"SE", "diag":948.9942044080143, "alpha":143.33914546925385, "fullname":"Sweden"},
    "CH":{"referent":"CH", "diag":287.34648075102643, "alpha":39.74273384806, "fullname":"Switzerland"},
    "SY":{"referent":"SY", "diag":608.5720992618706, "alpha":101.78818050403503, "fullname":"Syria"},
    "TW":{"referent":"TW", "diag":269.04646438858845, "alpha":46.64074741475143, "fullname":"Taiwan"},
    "TJ":{"referent":"TJ", "diag":534.9766350038102, "alpha":91.64132553591757, "fullname":"Tajikistan"},
    "TZ":{"referent":"TZ", "diag":1374.8359902184698, "alpha":207.4355685221141, "fullname":"Tanzania"},
    "TH":{"referent":"TH", "diag":1013.0350438163529, "alpha":182.84593457002995, "fullname":"Thailand"},
    "TL":{"referent":"TL", "diag":172.4760852988031, "alpha":41.66215167240456, "fullname":"Timor-Leste"},
    "TG":{"referent":"TG", "diag":337.0014836762592, "alpha":64.34582345486709, "fullname":"Togo"},
    "TK":{"referent":"NZ", "diag":4.898979485566356, "alpha":18.55773068931994, "fullname":"Tokelau"},
    "TO":{"referent":"TO", "diag":38.65229618017538, "alpha":23.211414345587176, "fullname":"Tonga"},
    "TT":{"referent":"TT", "diag":101.2916580968048, "alpha":31.84771451803763, "fullname":"Trinidad and Tobago"},
    "TN":{"referent":"TN", "diag":572.0314676658969, "alpha":128.11079046380638, "fullname":"Tunisia"},
    "TR":{"referent":"TR", "diag":1251.8482336130046, "alpha":172.31151042579748, "fullname":"Turkey"},
    "TM":{"referent":"TM", "diag":988.0283396745257, "alpha":154.10509265385716, "fullname":"Turkmenistan"},
    "TC":{"referent":"GB", "diag":43.54308211415448, "alpha":23.88572350380082, "fullname":"Turks and Caicos Islands"},
    "TV":{"referent":"TV", "diag":7.211102550927978, "alpha":18.8765108974371, "fullname":"Tuvalu"},
    "UG":{"referent":"UG", "diag":695.0539547402058, "alpha":93.43761686271378, "fullname":"Uganda"},
    "UA":{"referent":"UA", "diag":1098.6355173577815, "alpha":131.27558206096515, "fullname":"Ukraine"},
    "AE":{"referent":"AE", "diag":408.90096600521747, "alpha":74.25884767218167, "fullname":"United Arab Emirates"},
    "GB":{"referent":"GB", "diag":696.993543729065, "alpha":52.34154686594558, "fullname":"United Kingdom"},
    "US":{"referent":"US", "diag":4329.57503688295, "alpha":833.0938531816965, "fullname":"United States"},
    "UM":{"referent":"US", "diag":8.270429251254134, "alpha":19.02256384377593, "fullname":"United States Minor Outlying Islands"},
    "UY":{"referent":"UY", "diag":601.7208655182235, "alpha":68.601955692236, "fullname":"Uruguay"},
    "UZ":{"referent":"UZ", "diag":945.9386872308373, "alpha":148.30205026109445, "fullname":"Uzbekistan"},
    "VU":{"referent":"VU", "diag":156.13455735358525, "alpha":39.409090078334884, "fullname":"Vanuatu"},
    "VE":{"referent":"VE", "diag":1353.8426791913453, "alpha":204.54114989944085, "fullname":"Venezuela"},
    "VN":{"referent":"VN", "diag":813.8943420370975, "alpha":130.09665087203942, "fullname":"Vietnam"},
    "VG":{"referent":"GB", "diag":17.378147196982766, "alpha":20.278275646364467, "fullname":"British Virgin Islands"},
    "VI":{"referent":"US", "diag":26.343879744638983, "alpha":21.51441144306248, "fullname":"United States Virgin Islands"},
    "WF":{"referent":"FR", "diag":16.852299546352718, "alpha":20.205775256563825, "fullname":"Wallis and Futuna"},
    "EH":{"referent":"MA", "diag":729.3833011524188, "alpha":118.44482852528982, "fullname":"Western Sahara"},
    "YE":{"referent":"YE", "diag":1027.5874658636121, "alpha":159.55924285391046, "fullname":"Yemen"},
    "ZM":{"referent":"ZM", "diag":1226.8757068260827, "alpha":187.0357850332875, "fullname":"Zambia"},
    "ZW":{"referent":"ZW", "diag":884.0328048211786, "alpha":139.76687738302752, "fullname":"Zimbabwe"}
};

const estimate_score = (d, a) => 5000*Math.exp(-d/a);

const ERROR_RESP = -1000000;
let state = JSON.parse(localStorage.getItem("CountryData")) || DefaultCountryDict;

let userNick = null;
let userHexId = null;
let pinUrl = null;
let level = null;
let apiUrl = null;
let solo = null;
let ranked = null;
let mode = null;
let teams = null;
let countryMap = null;
let updateUI = true;

function checkGameMode() {
    if (location.pathname.includes("/game/")) {
        solo = true;
        ranked = false;
        teams = false;
        const gameTag = location.href.substring(location.href.lastIndexOf('/') + 1);
        apiUrl = "https://www.geoguessr.com/api/v3/games/"+gameTag;
        return true;
    }
    if (location.pathname.includes("/duels/")) {
        return false; // Not possible to query the game server api from a duel game
        solo = false;
        const gameTag = location.href.substring(location.href.lastIndexOf('/') + 1);
        apiUrl = "https://game-server.geoguessr.com/api/duels/"+gameTag;
        return true;
    }
    return false;
}

if (updateUI) {
    var style = document.createElement("style");
    document.head.appendChild(style);
    style.sheet.insertRule("div[class*='round-result_wrapper__'] { transform: translateX(0); justify-content: space-between }")
    style.sheet.insertRule("div[class*='round-result_distanceIndicatorWrapper__'] { animation-delay: 0s, 0s; animation-duration: 0s, 0s; margin-right: 28px  }")
    style.sheet.insertRule("div[class*='round-result_actions__'] { animation-delay: 0s; animation-duration: 0s; margin: 0px; margin-top: 10px; margin-bottom: 10px }")
    style.sheet.insertRule("div[class*='round-result_pointsIndicatorWrapper__'] { animation-delay: 0s, 0s; animation-duration: 0s, 0s; margin-right: 28px }")
}

function parseScore(number) {
    const numberString = Math.round(number).toString();
    if (number >= 1000) {
        const firstDigit = numberString[0];
        const restOfDigits = numberString.slice(1);
        return firstDigit + ',' + restOfDigits;
    } else {
        return numberString;
    }
}

const shadowStyle = `
    text-shadow:
        0 .25rem 0 #006400,
        .125rem .125rem .5rem #32CD32,
        0 -.25rem .5rem #7CFC00,
        -.25rem .5rem .5rem #20B2AA,
        0 .375rem 2rem #32CD32,
        0 0 0 #20B2AA,
        0 0 1.5rem rgba(102, 255, 102, .65),
        .25rem .25rem 1rem #66CDAA;
`;

const newFormat = (score) => `
    <div class="${cn("shadow-text_root__")} ${cn("shadow-text_sizeSmallMedium__")}" style="${shadowStyle}"">
      ${parseScore(score)}&nbsp;
    </div>
    <p class="${cn("round-result_label__")} ${cn("round-result_indicatorLabel__")}"> Country-wise </p>
`

function addCountryResult(score) {
    if (document.getElementById("results-row") == null && !!document.querySelector('div[class*="round-result_distanceIndicatorWrapper__"]')) {
        const resultsContainer = document.querySelector("div[class*='round-result_wrapper__']");
        const topRow = document.createElement("div");
        topRow.id = "results-row";
        topRow.style = "display: flex;flex-direction: row";
        const distanceIndicator = document.querySelector("div[class*='round-result_distanceIndicatorWrapper__']");
        distanceIndicator.parentNode.removeChild(distanceIndicator);
        distanceIndicator.style.marginRight = '3vw';
        const pointsIndicator = document.querySelector("div[class*='round-result_pointsIndicatorWrapper__']");
        pointsIndicator.parentNode.removeChild(pointsIndicator);
        pointsIndicator.style.marginRight = '3vw';
        const newDiv = document.createElement("div");
        newDiv.id = "country-wise";
        newDiv.className = cn("round-result_pointsIndicatorWrapper__");
        newDiv.innerHTML = newFormat(score);
        newDiv.style.marginRight = '3vw';
        topRow.appendChild(distanceIndicator);
        topRow.appendChild(pointsIndicator);
        topRow.appendChild(newDiv);
        resultsContainer.insertBefore(topRow, resultsContainer.firstChild);
        if (document.querySelector("span[class*='button_label__']").textContent == 'Next') {
            document.querySelector("span[class*='button_label__']").textContent += ' >';
        }
        const nextButton = document.querySelector("div[class*='round-result_actions__']");
        nextButton.style.transform = 'translateX(-2vw)';
        const clone = nextButton.cloneNode(true);
        clone.style.opacity = '0';
        resultsContainer.insertBefore(clone, resultsContainer.firstChild);
    }
}

async function updateState(guess, ans, dist) {
    if ((guess === ERROR_RESP) || (ans === ERROR_RESP)) {
        return;
    }
    let good = (guess == ans);
    //state[ans].occ += 1;
    let score = parseFloat(estimate_score(dist, state[ans].alpha).toFixed(1));
    if (updateUI) addCountryResult(score);
    if (!userNick) {
        console.warn("emergency setting of user info, please avoid refreshing during a game.");
        await checkModes();
    }
    const data = {
        username: userNick,
        player_hexid: userHexId,
        actualCountryCode: ans,
        guessedCountryCode: guess,
        mode: mode,
        score: score,
        distance: dist,
        isCountryMap: countryMap,
        pinUrl: pinUrl,
        level: level
    };
    fetch(statsServerUrl+'/guess', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    }).then(response => response.json()).then(data => console.log('Success:', data)).catch((error) => console.error('Error:', error));
    /*if (good) {
        state[ans].avgdist = (state[ans].avgdist*state[ans].right + dist)/(state[ans].right+1);
        console.log(score);
        state[ans].avgscore = (state[ans].avgscore*state[ans].right + score)/(state[ans].right+1);
        state[ans].right += 1;
    } else {
        if (!(guess in state[ans].wrong_guesses)) {
            state[ans].wrong_guesses[guess] = 0;
        }
        state[ans].wrong_guesses[guess] += 1;
    }
    console.log(state[ans]);
    localStorage.setItem("CountryData", JSON.stringify(state));*/
}

async function getCountryCode(coords) {
    if (coords[0] <= -85.05) return 'AQ';
    if (API_Key.toLowerCase().match("^(bdc_)?[a-f0-9]{32}$") != null) {
        const api = "https://api.bigdatacloud.net/data/reverse-geocode?latitude="+coords.lat+"&longitude="+coords.lng+"&localityLanguage=en&key="+API_Key;
        return await fetch(api)
            .then(res => (res.status !== 200) ? ERROR_RESP : res.json())
            .then(out => (out === ERROR_RESP) ? ERROR_RESP : out.countryCode);
    } else {
        const api = `https://nominatim.openstreetmap.org/reverse.php?lat=${coords.lat}&lon=${coords.lng}&zoom=21&format=jsonv2&accept-language=en`;
        return await fetch(api)
            .then(res => (res.status !== 200) ? ERROR_RESP : res.json())
            .then(out => (out === ERROR_RESP) ? ERROR_RESP : state[out?.address?.country_code?.toUpperCase()].referent);
    }
}

function deductMode(m, p, z) {
    if (m && p && z) {
        mode = 'move';
    } else if (!m && p && z) {
        mode = 'nm';
    } else if (!m && !p && !z) {
        mode = 'nmpz';
    } else {
        console.error("game mode not supported");
    }
}

async function getUserInfo() {
    try {
        const res = await fetch('https://www.geoguessr.com/api/v3/profiles');
        const out = await res.json();
        userHexId = out.user.id;
        userNick = out.user.nick;
        pinUrl = out.user.pin.url;
        level = out.user.br.level;
    } catch (err) {
        throw err;
    }
}

function checkModesSolo(out) {
    const m = !out.forbidMoving;
    const p = !out.forbidRotating;
    const z = !out.forbidZooming;
    deductMode(m, p, z);
}

function checkMap(out) {
    const mapName = out.mapName;
    for (const key in DefaultCountryDict) {
        if (mapName.toLowerCase().includes(DefaultCountryDict[key].fullname.toLowerCase())) {
            countryMap = true;
            return;
        }
    }
    countryMap = false;
}

function checkModesDuel(out) {
    const m = !out.movementOptions.forbidMoving;
    const p = !out.movementOptions.forbidRotating;
    const z = !out.movementOptions.forbidZooming;
    deductMode(m, p, z);
    teams = out.options.isTeamDuels;
    ranked = out.options.isRated;
}

async function checkGameParams() {
    try {
        const res = await fetch(apiUrl);
        const out = await res.json();
        if (solo) {
            checkMap(out);
            checkModesSolo(out);
        } else {
            checkModesDuel(out);
        }
    } catch (err) {
        throw err;
    }
}

async function checkModes() {
    await Promise.all([getUserInfo(), checkGameParams()]);
}

function getSoloData(out) {
    const guessCounter = out.player.guesses.length;
    const round = out.rounds[guessCounter-1];
    const guess = out.player.guesses[guessCounter-1];
    let dist = parseFloat(guess.distance.meters.amount);
    const unit = guess.distance.meters.unit;
    if (unit === 'm') {
        dist = dist/1000;
    }
    if (guess.lat == lastGuess.lat && guess.lng == lastGuess.lng) return;
    lastGuess = guess;
    const roundCountryCode = round.streakLocationCode.toUpperCase();
    getCountryCode(guess).then(guessCountryCode => {
        console.log(guessCountryCode);
        console.log(roundCountryCode);
        if (guessCountryCode == ERROR_RESP || roundCountryCode == ERROR_RESP) {
            updateState(ERROR_RESP, ERROR_RESP, false, dist);
        } else {
            updateState(guessCountryCode, roundCountryCode, dist);
        }
    });
}

function getDuelData(out) {
    const roundIdx = out.teams[0].roundResults.length - 1;
    const round = out.rounds[roundIdx].panorama;
    let guess = null;
    out.teams.forEach(team => {
        team.players.forEach(player => {
            if (player.playerId == userHexId) {
                guess = player.guesses[roundIdx];
            }
        });
    });
    let dist = parseFloat(guess.distance)/1000;
    const roundCountryCode = round.countryCode.toUpperCase();
    getCountryCode(guess).then(guessCountryCode => {
        console.log(guessCountryCode);
        console.log(roundCountryCode);
        if (guessCountryCode == ERROR_RESP || roundCountryCode == ERROR_RESP) {
            updateState(ERROR_RESP, ERROR_RESP, false, dist);
        } else {
            updateState(guessCountryCode, roundCountryCode, dist);
        }
    });
}

let lastGuess = { lat: 91, lng: 0 };
function run() {
    fetch(apiUrl)
    .then(res => res.json())
    .then((out) => {
        if (solo) {
            getSoloData(out);
        } else {
            getDuelData(out);
        }
    }).catch(err => { throw err });
}

let lastDoCheckCall = 0;
// Any changes in the DOM triggers the MutationObserver callback
new MutationObserver(async (mutations) => {
    // First make sure we are in a game
    if (!checkGameMode()) {
        sessionStorage.setItem("modesChecked", 0);
        return;
    }
    if (lastDoCheckCall >= (Date.now() - 50)) return;
    lastDoCheckCall = Date.now();
    await scanStyles();
    // Then check the different modes (solo, ranked, teams, nmpz)
    if ((sessionStorage.getItem("modesChecked") || 0) == 0) { // for team duels there should be a delay because it needs time to find opponents
        checkModes();
        sessionStorage.setItem("modesChecked", 1);
    }
    // Then make sure we are in the round results screen
    if (!document.querySelector('div[class*="result-layout_root__"]')) {
        sessionStorage.setItem("roundChecked", 0);
        return;
    } else if ((sessionStorage.getItem("roundChecked") || 0) == 0) {
        run();
        sessionStorage.setItem("roundChecked", 1);
    }
}).observe(document.body, { subtree: true, childList: true });

// document.addEventListener('keypress', (e) => {
//     if (e.key == '1') {
//         updateStreak(streak + 1);
//     } else if (e.key == '2') {
//         updateStreak(streak - 1);
//     } else if (e.key == '8') {
//         const streakBackup = parseInt(sessionStorage.getItem("StreakBackup") || 0, 10);
//         updateStreak(streakBackup + 1);
//     } else if (e.key == '0') {
//         updateStreak(0);
//         sessionStorage.setItem("StreakBackup", 0);
//     };
// });