diff --git a/GNUmakefile b/GNUmakefile
index 0baa09f8..cbb3a374 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -717,7 +717,7 @@ PACKAGE_DIRS := \
deps/prettier/ \
deps/lit/
-RAW_FILES := $(filter-out apps/blog% apps/gg% apps/issues% apps/welcome% apps/journal% %.map, $(shell find $(PACKAGE_DIRS) -type f))
+RAW_FILES := $(filter-out apps/blog% apps/issues% apps/welcome% apps/journal% %.map, $(shell find $(PACKAGE_DIRS) -type f))
out/apk/TildeFriends-arm-debug.unsigned.apk: BUILD_TYPE := debug
out/apk/TildeFriends-arm-release.unsigned.apk: BUILD_TYPE := release
@@ -855,7 +855,6 @@ dist: release-apk iosrelease-ipa
@mkdir -p dist/ out/tildefriends-$(VERSION_NUMBER)
@git archive main | tar -x -C out/tildefriends-$(VERSION_NUMBER)
@tar \
- --exclude=apps/gg* \
--exclude=apps/welcome* \
--exclude=deps/libbacktrace/Isaac.Newton-Opticks.txt \
--exclude=deps/libsodium/builds/msvc/vs* \
diff --git a/apps/gg.json b/apps/gg.json
deleted file mode 100644
index 16eba8e0..00000000
--- a/apps/gg.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "type": "tildefriends-app",
- "emoji": "๐บ",
- "previous": "&0XSp+xdQwVtQ88bXzvWdH15Ex63hv5zUKTa4zx7HBGM=.sha256"
-}
diff --git a/apps/gg/app.js b/apps/gg/app.js
deleted file mode 100644
index 2384e409..00000000
--- a/apps/gg/app.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import * as tfrpc from '/tfrpc.js';
-import * as strava from './strava.js';
-
-let g_database;
-let g_shared_database;
-
-tfrpc.register(async function createIdentity() {
- return ssb.createIdentity();
-});
-tfrpc.register(async function appendMessage(id, message) {
- print('APPEND', JSON.stringify(message));
- return ssb.appendMessageWithIdentity(id, message);
-});
-tfrpc.register(function url() {
- return core.url;
-});
-tfrpc.register(async function getUser() {
- return core.user;
-});
-tfrpc.register(function getIdentities() {
- return ssb.getIdentities();
-});
-tfrpc.register(async function databaseGet(key) {
- return g_database ? g_database.get(key) : undefined;
-});
-tfrpc.register(async function databaseSet(key, value) {
- return g_database ? g_database.set(key, value) : undefined;
-});
-tfrpc.register(async function databaseRemove(key, value) {
- return g_database ? g_database.remove(key, value) : undefined;
-});
-tfrpc.register(async function sharedDatabaseGet(key) {
- return g_shared_database ? g_shared_database.get(key) : undefined;
-});
-tfrpc.register(async function sharedDatabaseSet(key, value) {
- return g_shared_database ? g_shared_database.set(key, value) : undefined;
-});
-tfrpc.register(async function sharedDatabaseRemove(key, value) {
- return g_shared_database ? g_shared_database.remove(key, value) : undefined;
-});
-tfrpc.register(async function query(sql, args) {
- let result = [];
- await ssb.sqlAsync(sql, args, function callback(row) {
- result.push(row);
- });
- return result;
-});
-tfrpc.register(async function store_blob(blob) {
- if (typeof blob == 'string') {
- blob = utf8Encode(blob);
- }
- if (Array.isArray(blob)) {
- blob = Uint8Array.from(blob);
- }
- return await ssb.blobStore(blob);
-});
-
-tfrpc.register(async function get_blob(id) {
- return utf8Decode(await ssb.blobGet(id));
-});
-tfrpc.register(strava.refresh_token);
-
-async function main() {
- g_shared_database = await shared_database('state');
- if (core.user.credentials?.session?.name) {
- g_database = await database('state');
- }
-
- let attempt;
- if (core.user.credentials?.session?.name) {
- let shared_db = await shared_database('state');
- attempt = await shared_db.get(core.user.credentials.session.name);
- }
- app.setDocument(
- utf8Decode(getFile('index.html')).replace(
- '${data}',
- JSON.stringify({
- attempt: attempt,
- state: core.user?.credentials?.session?.name,
- })
- )
- );
-}
-
-main();
diff --git a/apps/gg/emojis.json b/apps/gg/emojis.json
deleted file mode 100644
index 9c28b6e2..00000000
--- a/apps/gg/emojis.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Smileys & Emotion":{"grinning face":"๐","grinning face with big eyes":"๐","grinning face with smiling eyes":"๐","beaming face with smiling eyes":"๐","grinning squinting face":"๐","grinning face with sweat":"๐
","rolling on the floor laughing":"๐คฃ","face with tears of joy":"๐","slightly smiling face":"๐","upside-down face":"๐","melting face":"๐ซ ","winking face":"๐","smiling face with smiling eyes":"๐","smiling face with halo":"๐","smiling face with hearts":"๐ฅฐ","smiling face with heart-eyes":"๐","star-struck":"๐คฉ","face blowing a kiss":"๐","kissing face":"๐","smiling face":"โบ๏ธ","kissing face with closed eyes":"๐","kissing face with smiling eyes":"๐","smiling face with tear":"๐ฅฒ","face savoring food":"๐","face with tongue":"๐","winking face with tongue":"๐","zany face":"๐คช","squinting face with tongue":"๐","money-mouth face":"๐ค","smiling face with open hands":"๐ค","face with hand over mouth":"๐คญ","face with open eyes and hand over mouth":"๐ซข","face with peeking eye":"๐ซฃ","shushing face":"๐คซ","thinking face":"๐ค","saluting face":"๐ซก","zipper-mouth face":"๐ค","face with raised eyebrow":"๐คจ","neutral face":"๐","expressionless face":"๐","face without mouth":"๐ถ","dotted line face":"๐ซฅ","face in clouds":"๐ถโ๐ซ๏ธ","smirking face":"๐","unamused face":"๐","face with rolling eyes":"๐","grimacing face":"๐ฌ","face exhaling":"๐ฎโ๐จ","lying face":"๐คฅ","shaking face":"๐ซจ","relieved face":"๐","pensive face":"๐","sleepy face":"๐ช","drooling face":"๐คค","sleeping face":"๐ด","face with medical mask":"๐ท","face with thermometer":"๐ค","face with head-bandage":"๐ค","nauseated face":"๐คข","face vomiting":"๐คฎ","sneezing face":"๐คง","hot face":"๐ฅต","cold face":"๐ฅถ","woozy face":"๐ฅด","face with crossed-out eyes":"๐ต","face with spiral eyes":"๐ตโ๐ซ","exploding head":"๐คฏ","cowboy hat face":"๐ค ","partying face":"๐ฅณ","disguised face":"๐ฅธ","smiling face with sunglasses":"๐","nerd face":"๐ค","face with monocle":"๐ง","confused face":"๐","face with diagonal mouth":"๐ซค","worried face":"๐","slightly frowning face":"๐","frowning face":"โน๏ธ","face with open mouth":"๐ฎ","hushed face":"๐ฏ","astonished face":"๐ฒ","flushed face":"๐ณ","pleading face":"๐ฅบ","face holding back tears":"๐ฅน","frowning face with open mouth":"๐ฆ","anguished face":"๐ง","fearful face":"๐จ","anxious face with sweat":"๐ฐ","sad but relieved face":"๐ฅ","crying face":"๐ข","loudly crying face":"๐ญ","face screaming in fear":"๐ฑ","confounded face":"๐","persevering face":"๐ฃ","disappointed face":"๐","downcast face with sweat":"๐","weary face":"๐ฉ","tired face":"๐ซ","yawning face":"๐ฅฑ","face with steam from nose":"๐ค","enraged face":"๐ก","angry face":"๐ ","face with symbols on mouth":"๐คฌ","smiling face with horns":"๐","angry face with horns":"๐ฟ","skull":"๐","skull and crossbones":"โ ๏ธ","pile of poo":"๐ฉ","clown face":"๐คก","ogre":"๐น","goblin":"๐บ","ghost":"๐ป","alien":"๐ฝ","alien monster":"๐พ","robot":"๐ค","grinning cat":"๐บ","grinning cat with smiling eyes":"๐ธ","cat with tears of joy":"๐น","smiling cat with heart-eyes":"๐ป","cat with wry smile":"๐ผ","kissing cat":"๐ฝ","weary cat":"๐","crying cat":"๐ฟ","pouting cat":"๐พ","see-no-evil monkey":"๐","hear-no-evil monkey":"๐","speak-no-evil monkey":"๐","love letter":"๐","heart with arrow":"๐","heart with ribbon":"๐","sparkling heart":"๐","growing heart":"๐","beating heart":"๐","revolving hearts":"๐","two hearts":"๐","heart decoration":"๐","heart exclamation":"โฃ๏ธ","broken heart":"๐","heart on fire":"โค๏ธโ๐ฅ","mending heart":"โค๏ธโ๐ฉน","red heart":"โค๏ธ","pink heart":"๐ฉท","orange heart":"๐งก","yellow heart":"๐","green heart":"๐","blue heart":"๐","light blue heart":"๐ฉต","purple heart":"๐","brown heart":"๐ค","black heart":"๐ค","grey heart":"๐ฉถ","white heart":"๐ค","kiss mark":"๐","hundred points":"๐ฏ","anger symbol":"๐ข","collision":"๐ฅ","dizzy":"๐ซ","sweat droplets":"๐ฆ","dashing away":"๐จ","hole":"๐ณ๏ธ","speech balloon":"๐ฌ","eye in speech bubble":"๐๏ธโ๐จ๏ธ","left speech bubble":"๐จ๏ธ","right anger bubble":"๐ฏ๏ธ","thought balloon":"๐ญ","ZZZ":"๐ค"},"People & Body":{"waving hand":"๐","raised back of hand":"๐ค","hand with fingers splayed":"๐๏ธ","raised hand":"โ","vulcan salute":"๐","rightwards hand":"๐ซฑ","leftwards hand":"๐ซฒ","palm down hand":"๐ซณ","palm up hand":"๐ซด","leftwards pushing hand":"๐ซท","rightwards pushing hand":"๐ซธ","OK hand":"๐","pinched fingers":"๐ค","pinching hand":"๐ค","victory hand":"โ๏ธ","crossed fingers":"๐ค","hand with index finger and thumb crossed":"๐ซฐ","love-you gesture":"๐ค","sign of the horns":"๐ค","call me hand":"๐ค","backhand index pointing left":"๐","backhand index pointing right":"๐","backhand index pointing up":"๐","middle finger":"๐","backhand index pointing down":"๐","index pointing up":"โ๏ธ","index pointing at the viewer":"๐ซต","thumbs up":"๐","thumbs down":"๐","raised fist":"โ","oncoming fist":"๐","left-facing fist":"๐ค","right-facing fist":"๐ค","clapping hands":"๐","raising hands":"๐","heart hands":"๐ซถ","open hands":"๐","palms up together":"๐คฒ","handshake":"๐ค","folded hands":"๐","writing hand":"โ๏ธ","nail polish":"๐
","selfie":"๐คณ","flexed biceps":"๐ช","mechanical arm":"๐ฆพ","mechanical leg":"๐ฆฟ","leg":"๐ฆต","foot":"๐ฆถ","ear":"๐","ear with hearing aid":"๐ฆป","nose":"๐","brain":"๐ง ","anatomical heart":"๐ซ","lungs":"๐ซ","tooth":"๐ฆท","bone":"๐ฆด","eyes":"๐","eye":"๐๏ธ","tongue":"๐
","mouth":"๐","biting lip":"๐ซฆ","baby":"๐ถ","child":"๐ง","boy":"๐ฆ","girl":"๐ง","person":"๐ง","person blond hair":"๐ฑ","man":"๐จ","person beard":"๐ง","man beard":"๐งโโ๏ธ","woman beard":"๐งโโ๏ธ","man red hair":"๐จโ๐ฆฐ","man curly hair":"๐จโ๐ฆฑ","man white hair":"๐จโ๐ฆณ","man bald":"๐จโ๐ฆฒ","woman":"๐ฉ","woman red hair":"๐ฉโ๐ฆฐ","person red hair":"๐งโ๐ฆฐ","woman curly hair":"๐ฉโ๐ฆฑ","person curly hair":"๐งโ๐ฆฑ","woman white hair":"๐ฉโ๐ฆณ","person white hair":"๐งโ๐ฆณ","woman bald":"๐ฉโ๐ฆฒ","person bald":"๐งโ๐ฆฒ","woman blond hair":"๐ฑโโ๏ธ","man blond hair":"๐ฑโโ๏ธ","older person":"๐ง","old man":"๐ด","old woman":"๐ต","person frowning":"๐","man frowning":"๐โโ๏ธ","woman frowning":"๐โโ๏ธ","person pouting":"๐","man pouting":"๐โโ๏ธ","woman pouting":"๐โโ๏ธ","person gesturing NO":"๐
","man gesturing NO":"๐
โโ๏ธ","woman gesturing NO":"๐
โโ๏ธ","person gesturing OK":"๐","man gesturing OK":"๐โโ๏ธ","woman gesturing OK":"๐โโ๏ธ","person tipping hand":"๐","man tipping hand":"๐โโ๏ธ","woman tipping hand":"๐โโ๏ธ","person raising hand":"๐","man raising hand":"๐โโ๏ธ","woman raising hand":"๐โโ๏ธ","deaf person":"๐ง","deaf man":"๐งโโ๏ธ","deaf woman":"๐งโโ๏ธ","person bowing":"๐","man bowing":"๐โโ๏ธ","woman bowing":"๐โโ๏ธ","person facepalming":"๐คฆ","man facepalming":"๐คฆโโ๏ธ","woman facepalming":"๐คฆโโ๏ธ","person shrugging":"๐คท","man shrugging":"๐คทโโ๏ธ","woman shrugging":"๐คทโโ๏ธ","health worker":"๐งโโ๏ธ","man health worker":"๐จโโ๏ธ","woman health worker":"๐ฉโโ๏ธ","student":"๐งโ๐","man student":"๐จโ๐","woman student":"๐ฉโ๐","teacher":"๐งโ๐ซ","man teacher":"๐จโ๐ซ","woman teacher":"๐ฉโ๐ซ","judge":"๐งโโ๏ธ","man judge":"๐จโโ๏ธ","woman judge":"๐ฉโโ๏ธ","farmer":"๐งโ๐พ","man farmer":"๐จโ๐พ","woman farmer":"๐ฉโ๐พ","cook":"๐งโ๐ณ","man cook":"๐จโ๐ณ","woman cook":"๐ฉโ๐ณ","mechanic":"๐งโ๐ง","man mechanic":"๐จโ๐ง","woman mechanic":"๐ฉโ๐ง","factory worker":"๐งโ๐ญ","man factory worker":"๐จโ๐ญ","woman factory worker":"๐ฉโ๐ญ","office worker":"๐งโ๐ผ","man office worker":"๐จโ๐ผ","woman office worker":"๐ฉโ๐ผ","scientist":"๐งโ๐ฌ","man scientist":"๐จโ๐ฌ","woman scientist":"๐ฉโ๐ฌ","technologist":"๐งโ๐ป","man technologist":"๐จโ๐ป","woman technologist":"๐ฉโ๐ป","singer":"๐งโ๐ค","man singer":"๐จโ๐ค","woman singer":"๐ฉโ๐ค","artist":"๐งโ๐จ","man artist":"๐จโ๐จ","woman artist":"๐ฉโ๐จ","pilot":"๐งโโ๏ธ","man pilot":"๐จโโ๏ธ","woman pilot":"๐ฉโโ๏ธ","astronaut":"๐งโ๐","man astronaut":"๐จโ๐","woman astronaut":"๐ฉโ๐","firefighter":"๐งโ๐","man firefighter":"๐จโ๐","woman firefighter":"๐ฉโ๐","police officer":"๐ฎ","man police officer":"๐ฎโโ๏ธ","woman police officer":"๐ฎโโ๏ธ","detective":"๐ต๏ธ","man detective":"๐ต๏ธโโ๏ธ","woman detective":"๐ต๏ธโโ๏ธ","guard":"๐","man guard":"๐โโ๏ธ","woman guard":"๐โโ๏ธ","ninja":"๐ฅท","construction worker":"๐ท","man construction worker":"๐ทโโ๏ธ","woman construction worker":"๐ทโโ๏ธ","person with crown":"๐ซ
","prince":"๐คด","princess":"๐ธ","person wearing turban":"๐ณ","man wearing turban":"๐ณโโ๏ธ","woman wearing turban":"๐ณโโ๏ธ","person with skullcap":"๐ฒ","woman with headscarf":"๐ง","person in tuxedo":"๐คต","man in tuxedo":"๐คตโโ๏ธ","woman in tuxedo":"๐คตโโ๏ธ","person with veil":"๐ฐ","man with veil":"๐ฐโโ๏ธ","woman with veil":"๐ฐโโ๏ธ","pregnant woman":"๐คฐ","pregnant man":"๐ซ","pregnant person":"๐ซ","breast-feeding":"๐คฑ","woman feeding baby":"๐ฉโ๐ผ","man feeding baby":"๐จโ๐ผ","person feeding baby":"๐งโ๐ผ","baby angel":"๐ผ","Santa Claus":"๐
","Mrs. Claus":"๐คถ","mx claus":"๐งโ๐","superhero":"๐ฆธ","man superhero":"๐ฆธโโ๏ธ","woman superhero":"๐ฆธโโ๏ธ","supervillain":"๐ฆน","man supervillain":"๐ฆนโโ๏ธ","woman supervillain":"๐ฆนโโ๏ธ","mage":"๐ง","man mage":"๐งโโ๏ธ","woman mage":"๐งโโ๏ธ","fairy":"๐ง","man fairy":"๐งโโ๏ธ","woman fairy":"๐งโโ๏ธ","vampire":"๐ง","man vampire":"๐งโโ๏ธ","woman vampire":"๐งโโ๏ธ","merperson":"๐ง","merman":"๐งโโ๏ธ","mermaid":"๐งโโ๏ธ","elf":"๐ง","man elf":"๐งโโ๏ธ","woman elf":"๐งโโ๏ธ","genie":"๐ง","man genie":"๐งโโ๏ธ","woman genie":"๐งโโ๏ธ","zombie":"๐ง","man zombie":"๐งโโ๏ธ","woman zombie":"๐งโโ๏ธ","troll":"๐ง","person getting massage":"๐","man getting massage":"๐โโ๏ธ","woman getting massage":"๐โโ๏ธ","person getting haircut":"๐","man getting haircut":"๐โโ๏ธ","woman getting haircut":"๐โโ๏ธ","person walking":"๐ถ","man walking":"๐ถโโ๏ธ","woman walking":"๐ถโโ๏ธ","person standing":"๐ง","man standing":"๐งโโ๏ธ","woman standing":"๐งโโ๏ธ","person kneeling":"๐ง","man kneeling":"๐งโโ๏ธ","woman kneeling":"๐งโโ๏ธ","person with white cane":"๐งโ๐ฆฏ","man with white cane":"๐จโ๐ฆฏ","woman with white cane":"๐ฉโ๐ฆฏ","person in motorized wheelchair":"๐งโ๐ฆผ","man in motorized wheelchair":"๐จโ๐ฆผ","woman in motorized wheelchair":"๐ฉโ๐ฆผ","person in manual wheelchair":"๐งโ๐ฆฝ","man in manual wheelchair":"๐จโ๐ฆฝ","woman in manual wheelchair":"๐ฉโ๐ฆฝ","person running":"๐","man running":"๐โโ๏ธ","woman running":"๐โโ๏ธ","woman dancing":"๐","man dancing":"๐บ","person in suit levitating":"๐ด๏ธ","people with bunny ears":"๐ฏ","men with bunny ears":"๐ฏโโ๏ธ","women with bunny ears":"๐ฏโโ๏ธ","person in steamy room":"๐ง","man in steamy room":"๐งโโ๏ธ","woman in steamy room":"๐งโโ๏ธ","person climbing":"๐ง","man climbing":"๐งโโ๏ธ","woman climbing":"๐งโโ๏ธ","person fencing":"๐คบ","horse racing":"๐","skier":"โท๏ธ","snowboarder":"๐","person golfing":"๐๏ธ","man golfing":"๐๏ธโโ๏ธ","woman golfing":"๐๏ธโโ๏ธ","person surfing":"๐","man surfing":"๐โโ๏ธ","woman surfing":"๐โโ๏ธ","person rowing boat":"๐ฃ","man rowing boat":"๐ฃโโ๏ธ","woman rowing boat":"๐ฃโโ๏ธ","person swimming":"๐","man swimming":"๐โโ๏ธ","woman swimming":"๐โโ๏ธ","person bouncing ball":"โน๏ธ","man bouncing ball":"โน๏ธโโ๏ธ","woman bouncing ball":"โน๏ธโโ๏ธ","person lifting weights":"๐๏ธ","man lifting weights":"๐๏ธโโ๏ธ","woman lifting weights":"๐๏ธโโ๏ธ","person biking":"๐ด","man biking":"๐ดโโ๏ธ","woman biking":"๐ดโโ๏ธ","person mountain biking":"๐ต","man mountain biking":"๐ตโโ๏ธ","woman mountain biking":"๐ตโโ๏ธ","person cartwheeling":"๐คธ","man cartwheeling":"๐คธโโ๏ธ","woman cartwheeling":"๐คธโโ๏ธ","people wrestling":"๐คผ","men wrestling":"๐คผโโ๏ธ","women wrestling":"๐คผโโ๏ธ","person playing water polo":"๐คฝ","man playing water polo":"๐คฝโโ๏ธ","woman playing water polo":"๐คฝโโ๏ธ","person playing handball":"๐คพ","man playing handball":"๐คพโโ๏ธ","woman playing handball":"๐คพโโ๏ธ","person juggling":"๐คน","man juggling":"๐คนโโ๏ธ","woman juggling":"๐คนโโ๏ธ","person in lotus position":"๐ง","man in lotus position":"๐งโโ๏ธ","woman in lotus position":"๐งโโ๏ธ","person taking bath":"๐","person in bed":"๐","people holding hands":"๐งโ๐คโ๐ง","women holding hands":"๐ญ","woman and man holding hands":"๐ซ","men holding hands":"๐ฌ","kiss":"๐","kiss woman, man":"๐ฉโโค๏ธโ๐โ๐จ","kiss man, man":"๐จโโค๏ธโ๐โ๐จ","kiss woman, woman":"๐ฉโโค๏ธโ๐โ๐ฉ","couple with heart":"๐","couple with heart woman, man":"๐ฉโโค๏ธโ๐จ","couple with heart man, man":"๐จโโค๏ธโ๐จ","couple with heart woman, woman":"๐ฉโโค๏ธโ๐ฉ","family":"๐ช","family man, woman, boy":"๐จโ๐ฉโ๐ฆ","family man, woman, girl":"๐จโ๐ฉโ๐ง","family man, woman, girl, boy":"๐จโ๐ฉโ๐งโ๐ฆ","family man, woman, boy, boy":"๐จโ๐ฉโ๐ฆโ๐ฆ","family man, woman, girl, girl":"๐จโ๐ฉโ๐งโ๐ง","family man, man, boy":"๐จโ๐จโ๐ฆ","family man, man, girl":"๐จโ๐จโ๐ง","family man, man, girl, boy":"๐จโ๐จโ๐งโ๐ฆ","family man, man, boy, boy":"๐จโ๐จโ๐ฆโ๐ฆ","family man, man, girl, girl":"๐จโ๐จโ๐งโ๐ง","family woman, woman, boy":"๐ฉโ๐ฉโ๐ฆ","family woman, woman, girl":"๐ฉโ๐ฉโ๐ง","family woman, woman, girl, boy":"๐ฉโ๐ฉโ๐งโ๐ฆ","family woman, woman, boy, boy":"๐ฉโ๐ฉโ๐ฆโ๐ฆ","family woman, woman, girl, girl":"๐ฉโ๐ฉโ๐งโ๐ง","family man, boy":"๐จโ๐ฆ","family man, boy, boy":"๐จโ๐ฆโ๐ฆ","family man, girl":"๐จโ๐ง","family man, girl, boy":"๐จโ๐งโ๐ฆ","family man, girl, girl":"๐จโ๐งโ๐ง","family woman, boy":"๐ฉโ๐ฆ","family woman, boy, boy":"๐ฉโ๐ฆโ๐ฆ","family woman, girl":"๐ฉโ๐ง","family woman, girl, boy":"๐ฉโ๐งโ๐ฆ","family woman, girl, girl":"๐ฉโ๐งโ๐ง","speaking head":"๐ฃ๏ธ","bust in silhouette":"๐ค","busts in silhouette":"๐ฅ","people hugging":"๐ซ","footprints":"๐ฃ"},"Animals & Nature":{"monkey face":"๐ต","monkey":"๐","gorilla":"๐ฆ","orangutan":"๐ฆง","dog face":"๐ถ","dog":"๐","guide dog":"๐ฆฎ","service dog":"๐โ๐ฆบ","poodle":"๐ฉ","wolf":"๐บ","fox":"๐ฆ","raccoon":"๐ฆ","cat face":"๐ฑ","cat":"๐","black cat":"๐โโฌ","lion":"๐ฆ","tiger face":"๐ฏ","tiger":"๐
","leopard":"๐","horse face":"๐ด","moose":"๐ซ","donkey":"๐ซ","horse":"๐","unicorn":"๐ฆ","zebra":"๐ฆ","deer":"๐ฆ","bison":"๐ฆฌ","cow face":"๐ฎ","ox":"๐","water buffalo":"๐","cow":"๐","pig face":"๐ท","pig":"๐","boar":"๐","pig nose":"๐ฝ","ram":"๐","ewe":"๐","goat":"๐","camel":"๐ช","two-hump camel":"๐ซ","llama":"๐ฆ","giraffe":"๐ฆ","elephant":"๐","mammoth":"๐ฆฃ","rhinoceros":"๐ฆ","hippopotamus":"๐ฆ","mouse face":"๐ญ","mouse":"๐","rat":"๐","hamster":"๐น","rabbit face":"๐ฐ","rabbit":"๐","chipmunk":"๐ฟ๏ธ","beaver":"๐ฆซ","hedgehog":"๐ฆ","bat":"๐ฆ","bear":"๐ป","polar bear":"๐ปโโ๏ธ","koala":"๐จ","panda":"๐ผ","sloth":"๐ฆฅ","otter":"๐ฆฆ","skunk":"๐ฆจ","kangaroo":"๐ฆ","badger":"๐ฆก","paw prints":"๐พ","turkey":"๐ฆ","chicken":"๐","rooster":"๐","hatching chick":"๐ฃ","baby chick":"๐ค","front-facing baby chick":"๐ฅ","bird":"๐ฆ","penguin":"๐ง","dove":"๐๏ธ","eagle":"๐ฆ
","duck":"๐ฆ","swan":"๐ฆข","owl":"๐ฆ","dodo":"๐ฆค","feather":"๐ชถ","flamingo":"๐ฆฉ","peacock":"๐ฆ","parrot":"๐ฆ","wing":"๐ชฝ","black bird":"๐ฆโโฌ","goose":"๐ชฟ","frog":"๐ธ","crocodile":"๐","turtle":"๐ข","lizard":"๐ฆ","snake":"๐","dragon face":"๐ฒ","dragon":"๐","sauropod":"๐ฆ","T-Rex":"๐ฆ","spouting whale":"๐ณ","whale":"๐","dolphin":"๐ฌ","seal":"๐ฆญ","fish":"๐","tropical fish":"๐ ","blowfish":"๐ก","shark":"๐ฆ","octopus":"๐","spiral shell":"๐","coral":"๐ชธ","jellyfish":"๐ชผ","snail":"๐","butterfly":"๐ฆ","bug":"๐","ant":"๐","honeybee":"๐","beetle":"๐ชฒ","lady beetle":"๐","cricket":"๐ฆ","cockroach":"๐ชณ","spider":"๐ท๏ธ","spider web":"๐ธ๏ธ","scorpion":"๐ฆ","mosquito":"๐ฆ","fly":"๐ชฐ","worm":"๐ชฑ","microbe":"๐ฆ ","bouquet":"๐","cherry blossom":"๐ธ","white flower":"๐ฎ","lotus":"๐ชท","rosette":"๐ต๏ธ","rose":"๐น","wilted flower":"๐ฅ","hibiscus":"๐บ","sunflower":"๐ป","blossom":"๐ผ","tulip":"๐ท","hyacinth":"๐ชป","seedling":"๐ฑ","potted plant":"๐ชด","evergreen tree":"๐ฒ","deciduous tree":"๐ณ","palm tree":"๐ด","cactus":"๐ต","sheaf of rice":"๐พ","herb":"๐ฟ","shamrock":"โ๏ธ","four leaf clover":"๐","maple leaf":"๐","fallen leaf":"๐","leaf fluttering in wind":"๐","empty nest":"๐ชน","nest with eggs":"๐ชบ","mushroom":"๐"},"Food & Drink":{"grapes":"๐","melon":"๐","watermelon":"๐","tangerine":"๐","lemon":"๐","banana":"๐","pineapple":"๐","mango":"๐ฅญ","red apple":"๐","green apple":"๐","pear":"๐","peach":"๐","cherries":"๐","strawberry":"๐","blueberries":"๐ซ","kiwi fruit":"๐ฅ","tomato":"๐
","olive":"๐ซ","coconut":"๐ฅฅ","avocado":"๐ฅ","eggplant":"๐","potato":"๐ฅ","carrot":"๐ฅ","ear of corn":"๐ฝ","hot pepper":"๐ถ๏ธ","bell pepper":"๐ซ","cucumber":"๐ฅ","leafy green":"๐ฅฌ","broccoli":"๐ฅฆ","garlic":"๐ง","onion":"๐ง
","peanuts":"๐ฅ","beans":"๐ซ","chestnut":"๐ฐ","ginger root":"๐ซ","pea pod":"๐ซ","bread":"๐","croissant":"๐ฅ","baguette bread":"๐ฅ","flatbread":"๐ซ","pretzel":"๐ฅจ","bagel":"๐ฅฏ","pancakes":"๐ฅ","waffle":"๐ง","cheese wedge":"๐ง","meat on bone":"๐","poultry leg":"๐","cut of meat":"๐ฅฉ","bacon":"๐ฅ","hamburger":"๐","french fries":"๐","pizza":"๐","hot dog":"๐ญ","sandwich":"๐ฅช","taco":"๐ฎ","burrito":"๐ฏ","tamale":"๐ซ","stuffed flatbread":"๐ฅ","falafel":"๐ง","egg":"๐ฅ","cooking":"๐ณ","shallow pan of food":"๐ฅ","pot of food":"๐ฒ","fondue":"๐ซ","bowl with spoon":"๐ฅฃ","green salad":"๐ฅ","popcorn":"๐ฟ","butter":"๐ง","salt":"๐ง","canned food":"๐ฅซ","bento box":"๐ฑ","rice cracker":"๐","rice ball":"๐","cooked rice":"๐","curry rice":"๐","steaming bowl":"๐","spaghetti":"๐","roasted sweet potato":"๐ ","oden":"๐ข","sushi":"๐ฃ","fried shrimp":"๐ค","fish cake with swirl":"๐ฅ","moon cake":"๐ฅฎ","dango":"๐ก","dumpling":"๐ฅ","fortune cookie":"๐ฅ ","takeout box":"๐ฅก","crab":"๐ฆ","lobster":"๐ฆ","shrimp":"๐ฆ","squid":"๐ฆ","oyster":"๐ฆช","soft ice cream":"๐ฆ","shaved ice":"๐ง","ice cream":"๐จ","doughnut":"๐ฉ","cookie":"๐ช","birthday cake":"๐","shortcake":"๐ฐ","cupcake":"๐ง","pie":"๐ฅง","chocolate bar":"๐ซ","candy":"๐ฌ","lollipop":"๐ญ","custard":"๐ฎ","honey pot":"๐ฏ","baby bottle":"๐ผ","glass of milk":"๐ฅ","hot beverage":"โ","teapot":"๐ซ","teacup without handle":"๐ต","sake":"๐ถ","bottle with popping cork":"๐พ","wine glass":"๐ท","cocktail glass":"๐ธ","tropical drink":"๐น","beer mug":"๐บ","clinking beer mugs":"๐ป","clinking glasses":"๐ฅ","tumbler glass":"๐ฅ","pouring liquid":"๐ซ","cup with straw":"๐ฅค","bubble tea":"๐ง","beverage box":"๐ง","mate":"๐ง","ice":"๐ง","chopsticks":"๐ฅข","fork and knife with plate":"๐ฝ๏ธ","fork and knife":"๐ด","spoon":"๐ฅ","kitchen knife":"๐ช","jar":"๐ซ","amphora":"๐บ"},"Travel & Places":{"globe showing Europe-Africa":"๐","globe showing Americas":"๐","globe showing Asia-Australia":"๐","globe with meridians":"๐","world map":"๐บ๏ธ","map of Japan":"๐พ","compass":"๐งญ","snow-capped mountain":"๐๏ธ","mountain":"โฐ๏ธ","volcano":"๐","mount fuji":"๐ป","camping":"๐๏ธ","beach with umbrella":"๐๏ธ","desert":"๐๏ธ","desert island":"๐๏ธ","national park":"๐๏ธ","stadium":"๐๏ธ","classical building":"๐๏ธ","building construction":"๐๏ธ","brick":"๐งฑ","rock":"๐ชจ","wood":"๐ชต","hut":"๐","houses":"๐๏ธ","derelict house":"๐๏ธ","house":"๐ ","house with garden":"๐ก","office building":"๐ข","Japanese post office":"๐ฃ","post office":"๐ค","hospital":"๐ฅ","bank":"๐ฆ","hotel":"๐จ","love hotel":"๐ฉ","convenience store":"๐ช","school":"๐ซ","department store":"๐ฌ","factory":"๐ญ","Japanese castle":"๐ฏ","castle":"๐ฐ","wedding":"๐","Tokyo tower":"๐ผ","Statue of Liberty":"๐ฝ","church":"โช","mosque":"๐","hindu temple":"๐","synagogue":"๐","shinto shrine":"โฉ๏ธ","kaaba":"๐","fountain":"โฒ","tent":"โบ","foggy":"๐","night with stars":"๐","cityscape":"๐๏ธ","sunrise over mountains":"๐","sunrise":"๐
","cityscape at dusk":"๐","sunset":"๐","bridge at night":"๐","hot springs":"โจ๏ธ","carousel horse":"๐ ","playground slide":"๐","ferris wheel":"๐ก","roller coaster":"๐ข","barber pole":"๐","circus tent":"๐ช","locomotive":"๐","railway car":"๐","high-speed train":"๐","bullet train":"๐
","train":"๐","metro":"๐","light rail":"๐","station":"๐","tram":"๐","monorail":"๐","mountain railway":"๐","tram car":"๐","bus":"๐","oncoming bus":"๐","trolleybus":"๐","minibus":"๐","ambulance":"๐","fire engine":"๐","police car":"๐","oncoming police car":"๐","taxi":"๐","oncoming taxi":"๐","automobile":"๐","oncoming automobile":"๐","sport utility vehicle":"๐","pickup truck":"๐ป","delivery truck":"๐","articulated lorry":"๐","tractor":"๐","racing car":"๐๏ธ","motorcycle":"๐๏ธ","motor scooter":"๐ต","manual wheelchair":"๐ฆฝ","motorized wheelchair":"๐ฆผ","auto rickshaw":"๐บ","bicycle":"๐ฒ","kick scooter":"๐ด","skateboard":"๐น","roller skate":"๐ผ","bus stop":"๐","motorway":"๐ฃ๏ธ","railway track":"๐ค๏ธ","oil drum":"๐ข๏ธ","fuel pump":"โฝ","wheel":"๐","police car light":"๐จ","horizontal traffic light":"๐ฅ","vertical traffic light":"๐ฆ","stop sign":"๐","construction":"๐ง","anchor":"โ","ring buoy":"๐","sailboat":"โต","canoe":"๐ถ","speedboat":"๐ค","passenger ship":"๐ณ๏ธ","ferry":"โด๏ธ","motor boat":"๐ฅ๏ธ","ship":"๐ข","airplane":"โ๏ธ","small airplane":"๐ฉ๏ธ","airplane departure":"๐ซ","airplane arrival":"๐ฌ","parachute":"๐ช","seat":"๐บ","helicopter":"๐","suspension railway":"๐","mountain cableway":"๐ ","aerial tramway":"๐ก","satellite":"๐ฐ๏ธ","rocket":"๐","flying saucer":"๐ธ","bellhop bell":"๐๏ธ","luggage":"๐งณ","hourglass done":"โ","hourglass not done":"โณ","watch":"โ","alarm clock":"โฐ","stopwatch":"โฑ๏ธ","timer clock":"โฒ๏ธ","mantelpiece clock":"๐ฐ๏ธ","twelve oโclock":"๐","twelve-thirty":"๐ง","one oโclock":"๐","one-thirty":"๐","two oโclock":"๐","two-thirty":"๐","three oโclock":"๐","three-thirty":"๐","four oโclock":"๐","four-thirty":"๐","five oโclock":"๐","five-thirty":"๐ ","six oโclock":"๐","six-thirty":"๐ก","seven oโclock":"๐","seven-thirty":"๐ข","eight oโclock":"๐","eight-thirty":"๐ฃ","nine oโclock":"๐","nine-thirty":"๐ค","ten oโclock":"๐","ten-thirty":"๐ฅ","eleven oโclock":"๐","eleven-thirty":"๐ฆ","new moon":"๐","waxing crescent moon":"๐","first quarter moon":"๐","waxing gibbous moon":"๐","full moon":"๐","waning gibbous moon":"๐","last quarter moon":"๐","waning crescent moon":"๐","crescent moon":"๐","new moon face":"๐","first quarter moon face":"๐","last quarter moon face":"๐","thermometer":"๐ก๏ธ","sun":"โ๏ธ","full moon face":"๐","sun with face":"๐","ringed planet":"๐ช","star":"โญ","glowing star":"๐","shooting star":"๐ ","milky way":"๐","cloud":"โ๏ธ","sun behind cloud":"โ
","cloud with lightning and rain":"โ๏ธ","sun behind small cloud":"๐ค๏ธ","sun behind large cloud":"๐ฅ๏ธ","sun behind rain cloud":"๐ฆ๏ธ","cloud with rain":"๐ง๏ธ","cloud with snow":"๐จ๏ธ","cloud with lightning":"๐ฉ๏ธ","tornado":"๐ช๏ธ","fog":"๐ซ๏ธ","wind face":"๐ฌ๏ธ","cyclone":"๐","rainbow":"๐","closed umbrella":"๐","umbrella":"โ๏ธ","umbrella with rain drops":"โ","umbrella on ground":"โฑ๏ธ","high voltage":"โก","snowflake":"โ๏ธ","snowman":"โ๏ธ","snowman without snow":"โ","comet":"โ๏ธ","fire":"๐ฅ","droplet":"๐ง","water wave":"๐"},"Activities":{"jack-o-lantern":"๐","Christmas tree":"๐","fireworks":"๐","sparkler":"๐","firecracker":"๐งจ","sparkles":"โจ","balloon":"๐","party popper":"๐","confetti ball":"๐","tanabata tree":"๐","pine decoration":"๐","Japanese dolls":"๐","carp streamer":"๐","wind chime":"๐","moon viewing ceremony":"๐","red envelope":"๐งง","ribbon":"๐","wrapped gift":"๐","reminder ribbon":"๐๏ธ","admission tickets":"๐๏ธ","ticket":"๐ซ","military medal":"๐๏ธ","trophy":"๐","sports medal":"๐
","1st place medal":"๐ฅ","2nd place medal":"๐ฅ","3rd place medal":"๐ฅ","soccer ball":"โฝ","baseball":"โพ","softball":"๐ฅ","basketball":"๐","volleyball":"๐","american football":"๐","rugby football":"๐","tennis":"๐พ","flying disc":"๐ฅ","bowling":"๐ณ","cricket game":"๐","field hockey":"๐","ice hockey":"๐","lacrosse":"๐ฅ","ping pong":"๐","badminton":"๐ธ","boxing glove":"๐ฅ","martial arts uniform":"๐ฅ","goal net":"๐ฅ
","flag in hole":"โณ","ice skate":"โธ๏ธ","fishing pole":"๐ฃ","diving mask":"๐คฟ","running shirt":"๐ฝ","skis":"๐ฟ","sled":"๐ท","curling stone":"๐ฅ","bullseye":"๐ฏ","yo-yo":"๐ช","kite":"๐ช","water pistol":"๐ซ","pool 8 ball":"๐ฑ","crystal ball":"๐ฎ","magic wand":"๐ช","video game":"๐ฎ","joystick":"๐น๏ธ","slot machine":"๐ฐ","game die":"๐ฒ","puzzle piece":"๐งฉ","teddy bear":"๐งธ","piรฑata":"๐ช
","mirror ball":"๐ชฉ","nesting dolls":"๐ช","spade suit":"โ ๏ธ","heart suit":"โฅ๏ธ","diamond suit":"โฆ๏ธ","club suit":"โฃ๏ธ","chess pawn":"โ๏ธ","joker":"๐","mahjong red dragon":"๐","flower playing cards":"๐ด","performing arts":"๐ญ","framed picture":"๐ผ๏ธ","artist palette":"๐จ","thread":"๐งต","sewing needle":"๐ชก","yarn":"๐งถ","knot":"๐ชข"},"Objects":{"glasses":"๐","sunglasses":"๐ถ๏ธ","goggles":"๐ฅฝ","lab coat":"๐ฅผ","safety vest":"๐ฆบ","necktie":"๐","t-shirt":"๐","jeans":"๐","scarf":"๐งฃ","gloves":"๐งค","coat":"๐งฅ","socks":"๐งฆ","dress":"๐","kimono":"๐","sari":"๐ฅป","one-piece swimsuit":"๐ฉฑ","briefs":"๐ฉฒ","shorts":"๐ฉณ","bikini":"๐","womanโs clothes":"๐","folding hand fan":"๐ชญ","purse":"๐","handbag":"๐","clutch bag":"๐","shopping bags":"๐๏ธ","backpack":"๐","thong sandal":"๐ฉด","manโs shoe":"๐","running shoe":"๐","hiking boot":"๐ฅพ","flat shoe":"๐ฅฟ","high-heeled shoe":"๐ ","womanโs sandal":"๐ก","ballet shoes":"๐ฉฐ","womanโs boot":"๐ข","hair pick":"๐ชฎ","crown":"๐","womanโs hat":"๐","top hat":"๐ฉ","graduation cap":"๐","billed cap":"๐งข","military helmet":"๐ช","rescue workerโs helmet":"โ๏ธ","prayer beads":"๐ฟ","lipstick":"๐","ring":"๐","gem stone":"๐","muted speaker":"๐","speaker low volume":"๐","speaker medium volume":"๐","speaker high volume":"๐","loudspeaker":"๐ข","megaphone":"๐ฃ","postal horn":"๐ฏ","bell":"๐","bell with slash":"๐","musical score":"๐ผ","musical note":"๐ต","musical notes":"๐ถ","studio microphone":"๐๏ธ","level slider":"๐๏ธ","control knobs":"๐๏ธ","microphone":"๐ค","headphone":"๐ง","radio":"๐ป","saxophone":"๐ท","accordion":"๐ช","guitar":"๐ธ","musical keyboard":"๐น","trumpet":"๐บ","violin":"๐ป","banjo":"๐ช","drum":"๐ฅ","long drum":"๐ช","maracas":"๐ช","flute":"๐ช","mobile phone":"๐ฑ","mobile phone with arrow":"๐ฒ","telephone":"โ๏ธ","telephone receiver":"๐","pager":"๐","fax machine":"๐ ","battery":"๐","low battery":"๐ชซ","electric plug":"๐","laptop":"๐ป","desktop computer":"๐ฅ๏ธ","printer":"๐จ๏ธ","keyboard":"โจ๏ธ","computer mouse":"๐ฑ๏ธ","trackball":"๐ฒ๏ธ","computer disk":"๐ฝ","floppy disk":"๐พ","optical disk":"๐ฟ","dvd":"๐","abacus":"๐งฎ","movie camera":"๐ฅ","film frames":"๐๏ธ","film projector":"๐ฝ๏ธ","clapper board":"๐ฌ","television":"๐บ","camera":"๐ท","camera with flash":"๐ธ","video camera":"๐น","videocassette":"๐ผ","magnifying glass tilted left":"๐","magnifying glass tilted right":"๐","candle":"๐ฏ๏ธ","light bulb":"๐ก","flashlight":"๐ฆ","red paper lantern":"๐ฎ","diya lamp":"๐ช","notebook with decorative cover":"๐","closed book":"๐","open book":"๐","green book":"๐","blue book":"๐","orange book":"๐","books":"๐","notebook":"๐","ledger":"๐","page with curl":"๐","scroll":"๐","page facing up":"๐","newspaper":"๐ฐ","rolled-up newspaper":"๐๏ธ","bookmark tabs":"๐","bookmark":"๐","label":"๐ท๏ธ","money bag":"๐ฐ","coin":"๐ช","yen banknote":"๐ด","dollar banknote":"๐ต","euro banknote":"๐ถ","pound banknote":"๐ท","money with wings":"๐ธ","credit card":"๐ณ","receipt":"๐งพ","chart increasing with yen":"๐น","envelope":"โ๏ธ","e-mail":"๐ง","incoming envelope":"๐จ","envelope with arrow":"๐ฉ","outbox tray":"๐ค","inbox tray":"๐ฅ","package":"๐ฆ","closed mailbox with raised flag":"๐ซ","closed mailbox with lowered flag":"๐ช","open mailbox with raised flag":"๐ฌ","open mailbox with lowered flag":"๐ญ","postbox":"๐ฎ","ballot box with ballot":"๐ณ๏ธ","pencil":"โ๏ธ","black nib":"โ๏ธ","fountain pen":"๐๏ธ","pen":"๐๏ธ","paintbrush":"๐๏ธ","crayon":"๐๏ธ","memo":"๐","briefcase":"๐ผ","file folder":"๐","open file folder":"๐","card index dividers":"๐๏ธ","calendar":"๐
","tear-off calendar":"๐","spiral notepad":"๐๏ธ","spiral calendar":"๐๏ธ","card index":"๐","chart increasing":"๐","chart decreasing":"๐","bar chart":"๐","clipboard":"๐","pushpin":"๐","round pushpin":"๐","paperclip":"๐","linked paperclips":"๐๏ธ","straight ruler":"๐","triangular ruler":"๐","scissors":"โ๏ธ","card file box":"๐๏ธ","file cabinet":"๐๏ธ","wastebasket":"๐๏ธ","locked":"๐","unlocked":"๐","locked with pen":"๐","locked with key":"๐","key":"๐","old key":"๐๏ธ","hammer":"๐จ","axe":"๐ช","pick":"โ๏ธ","hammer and pick":"โ๏ธ","hammer and wrench":"๐ ๏ธ","dagger":"๐ก๏ธ","crossed swords":"โ๏ธ","bomb":"๐ฃ","boomerang":"๐ช","bow and arrow":"๐น","shield":"๐ก๏ธ","carpentry saw":"๐ช","wrench":"๐ง","screwdriver":"๐ช","nut and bolt":"๐ฉ","gear":"โ๏ธ","clamp":"๐๏ธ","balance scale":"โ๏ธ","white cane":"๐ฆฏ","link":"๐","chains":"โ๏ธ","hook":"๐ช","toolbox":"๐งฐ","magnet":"๐งฒ","ladder":"๐ช","alembic":"โ๏ธ","test tube":"๐งช","petri dish":"๐งซ","dna":"๐งฌ","microscope":"๐ฌ","telescope":"๐ญ","satellite antenna":"๐ก","syringe":"๐","drop of blood":"๐ฉธ","pill":"๐","adhesive bandage":"๐ฉน","crutch":"๐ฉผ","stethoscope":"๐ฉบ","x-ray":"๐ฉป","door":"๐ช","elevator":"๐","mirror":"๐ช","window":"๐ช","bed":"๐๏ธ","couch and lamp":"๐๏ธ","chair":"๐ช","toilet":"๐ฝ","plunger":"๐ช ","shower":"๐ฟ","bathtub":"๐","mouse trap":"๐ชค","razor":"๐ช","lotion bottle":"๐งด","safety pin":"๐งท","broom":"๐งน","basket":"๐งบ","roll of paper":"๐งป","bucket":"๐ชฃ","soap":"๐งผ","bubbles":"๐ซง","toothbrush":"๐ชฅ","sponge":"๐งฝ","fire extinguisher":"๐งฏ","shopping cart":"๐","cigarette":"๐ฌ","coffin":"โฐ๏ธ","headstone":"๐ชฆ","funeral urn":"โฑ๏ธ","nazar amulet":"๐งฟ","hamsa":"๐ชฌ","moai":"๐ฟ","placard":"๐ชง","identification card":"๐ชช"},"Symbols":{"ATM sign":"๐ง","litter in bin sign":"๐ฎ","potable water":"๐ฐ","wheelchair symbol":"โฟ","menโs room":"๐น","womenโs room":"๐บ","restroom":"๐ป","baby symbol":"๐ผ","water closet":"๐พ","passport control":"๐","customs":"๐","baggage claim":"๐","left luggage":"๐
","warning":"โ ๏ธ","children crossing":"๐ธ","no entry":"โ","prohibited":"๐ซ","no bicycles":"๐ณ","no smoking":"๐ญ","no littering":"๐ฏ","non-potable water":"๐ฑ","no pedestrians":"๐ท","no mobile phones":"๐ต","no one under eighteen":"๐","radioactive":"โข๏ธ","biohazard":"โฃ๏ธ","up arrow":"โฌ๏ธ","up-right arrow":"โ๏ธ","right arrow":"โก๏ธ","down-right arrow":"โ๏ธ","down arrow":"โฌ๏ธ","down-left arrow":"โ๏ธ","left arrow":"โฌ
๏ธ","up-left arrow":"โ๏ธ","up-down arrow":"โ๏ธ","left-right arrow":"โ๏ธ","right arrow curving left":"โฉ๏ธ","left arrow curving right":"โช๏ธ","right arrow curving up":"โคด๏ธ","right arrow curving down":"โคต๏ธ","clockwise vertical arrows":"๐","counterclockwise arrows button":"๐","BACK arrow":"๐","END arrow":"๐","ON! arrow":"๐","SOON arrow":"๐","TOP arrow":"๐","place of worship":"๐","atom symbol":"โ๏ธ","om":"๐๏ธ","star of David":"โก๏ธ","wheel of dharma":"โธ๏ธ","yin yang":"โฏ๏ธ","latin cross":"โ๏ธ","orthodox cross":"โฆ๏ธ","star and crescent":"โช๏ธ","peace symbol":"โฎ๏ธ","menorah":"๐","dotted six-pointed star":"๐ฏ","khanda":"๐ชฏ","Aries":"โ","Taurus":"โ","Gemini":"โ","Cancer":"โ","Leo":"โ","Virgo":"โ","Libra":"โ","Scorpio":"โ","Sagittarius":"โ","Capricorn":"โ","Aquarius":"โ","Pisces":"โ","Ophiuchus":"โ","shuffle tracks button":"๐","repeat button":"๐","repeat single button":"๐","play button":"โถ๏ธ","fast-forward button":"โฉ","next track button":"โญ๏ธ","play or pause button":"โฏ๏ธ","reverse button":"โ๏ธ","fast reverse button":"โช","last track button":"โฎ๏ธ","upwards button":"๐ผ","fast up button":"โซ","downwards button":"๐ฝ","fast down button":"โฌ","pause button":"โธ๏ธ","stop button":"โน๏ธ","record button":"โบ๏ธ","eject button":"โ๏ธ","cinema":"๐ฆ","dim button":"๐
","bright button":"๐","antenna bars":"๐ถ","wireless":"๐","vibration mode":"๐ณ","mobile phone off":"๐ด","female sign":"โ๏ธ","male sign":"โ๏ธ","transgender symbol":"โง๏ธ","multiply":"โ๏ธ","plus":"โ","minus":"โ","divide":"โ","heavy equals sign":"๐ฐ","infinity":"โพ๏ธ","double exclamation mark":"โผ๏ธ","exclamation question mark":"โ๏ธ","red question mark":"โ","white question mark":"โ","white exclamation mark":"โ","red exclamation mark":"โ","wavy dash":"ใฐ๏ธ","currency exchange":"๐ฑ","heavy dollar sign":"๐ฒ","medical symbol":"โ๏ธ","recycling symbol":"โป๏ธ","fleur-de-lis":"โ๏ธ","trident emblem":"๐ฑ","name badge":"๐","Japanese symbol for beginner":"๐ฐ","hollow red circle":"โญ","check mark button":"โ
","check box with check":"โ๏ธ","check mark":"โ๏ธ","cross mark":"โ","cross mark button":"โ","curly loop":"โฐ","double curly loop":"โฟ","part alternation mark":"ใฝ๏ธ","eight-spoked asterisk":"โณ๏ธ","eight-pointed star":"โด๏ธ","sparkle":"โ๏ธ","copyright":"ยฉ๏ธ","registered":"ยฎ๏ธ","trade mark":"โข๏ธ","keycap #":"#๏ธโฃ","keycap *":"*๏ธโฃ","keycap 0":"0๏ธโฃ","keycap 1":"1๏ธโฃ","keycap 2":"2๏ธโฃ","keycap 3":"3๏ธโฃ","keycap 4":"4๏ธโฃ","keycap 5":"5๏ธโฃ","keycap 6":"6๏ธโฃ","keycap 7":"7๏ธโฃ","keycap 8":"8๏ธโฃ","keycap 9":"9๏ธโฃ","keycap 10":"๐","input latin uppercase":"๐ ","input latin lowercase":"๐ก","input numbers":"๐ข","input symbols":"๐ฃ","input latin letters":"๐ค","A button (blood type)":"๐
ฐ๏ธ","AB button (blood type)":"๐","B button (blood type)":"๐
ฑ๏ธ","CL button":"๐","COOL button":"๐","FREE button":"๐","information":"โน๏ธ","ID button":"๐","circled M":"โ๏ธ","NEW button":"๐","NG button":"๐","O button (blood type)":"๐
พ๏ธ","OK button":"๐","P button":"๐
ฟ๏ธ","SOS button":"๐","UP! button":"๐","VS button":"๐","Japanese โhereโ button":"๐","Japanese โservice chargeโ button":"๐๏ธ","Japanese โmonthly amountโ button":"๐ท๏ธ","Japanese โnot free of chargeโ button":"๐ถ","Japanese โreservedโ button":"๐ฏ","Japanese โbargainโ button":"๐","Japanese โdiscountโ button":"๐น","Japanese โfree of chargeโ button":"๐","Japanese โprohibitedโ button":"๐ฒ","Japanese โacceptableโ button":"๐","Japanese โapplicationโ button":"๐ธ","Japanese โpassing gradeโ button":"๐ด","Japanese โvacancyโ button":"๐ณ","Japanese โcongratulationsโ button":"ใ๏ธ","Japanese โsecretโ button":"ใ๏ธ","Japanese โopen for businessโ button":"๐บ","Japanese โno vacancyโ button":"๐ต","red circle":"๐ด","orange circle":"๐ ","yellow circle":"๐ก","green circle":"๐ข","blue circle":"๐ต","purple circle":"๐ฃ","brown circle":"๐ค","black circle":"โซ","white circle":"โช","red square":"๐ฅ","orange square":"๐ง","yellow square":"๐จ","green square":"๐ฉ","blue square":"๐ฆ","purple square":"๐ช","brown square":"๐ซ","black large square":"โฌ","white large square":"โฌ","black medium square":"โผ๏ธ","white medium square":"โป๏ธ","black medium-small square":"โพ","white medium-small square":"โฝ","black small square":"โช๏ธ","white small square":"โซ๏ธ","large orange diamond":"๐ถ","large blue diamond":"๐ท","small orange diamond":"๐ธ","small blue diamond":"๐น","red triangle pointed up":"๐บ","red triangle pointed down":"๐ป","diamond with a dot":"๐ ","radio button":"๐","white square button":"๐ณ","black square button":"๐ฒ"},"Flags":{"chequered flag":"๐","triangular flag":"๐ฉ","crossed flags":"๐","black flag":"๐ด","white flag":"๐ณ๏ธ","rainbow flag":"๐ณ๏ธโ๐","transgender flag":"๐ณ๏ธโโง๏ธ","pirate flag":"๐ดโโ ๏ธ","flag Ascension Island":"๐ฆ๐จ","flag Andorra":"๐ฆ๐ฉ","flag United Arab Emirates":"๐ฆ๐ช","flag Afghanistan":"๐ฆ๐ซ","flag Antigua & Barbuda":"๐ฆ๐ฌ","flag Anguilla":"๐ฆ๐ฎ","flag Albania":"๐ฆ๐ฑ","flag Armenia":"๐ฆ๐ฒ","flag Angola":"๐ฆ๐ด","flag Antarctica":"๐ฆ๐ถ","flag Argentina":"๐ฆ๐ท","flag American Samoa":"๐ฆ๐ธ","flag Austria":"๐ฆ๐น","flag Australia":"๐ฆ๐บ","flag Aruba":"๐ฆ๐ผ","flag ร
land Islands":"๐ฆ๐ฝ","flag Azerbaijan":"๐ฆ๐ฟ","flag Bosnia & Herzegovina":"๐ง๐ฆ","flag Barbados":"๐ง๐ง","flag Bangladesh":"๐ง๐ฉ","flag Belgium":"๐ง๐ช","flag Burkina Faso":"๐ง๐ซ","flag Bulgaria":"๐ง๐ฌ","flag Bahrain":"๐ง๐ญ","flag Burundi":"๐ง๐ฎ","flag Benin":"๐ง๐ฏ","flag St. Barthรฉlemy":"๐ง๐ฑ","flag Bermuda":"๐ง๐ฒ","flag Brunei":"๐ง๐ณ","flag Bolivia":"๐ง๐ด","flag Caribbean Netherlands":"๐ง๐ถ","flag Brazil":"๐ง๐ท","flag Bahamas":"๐ง๐ธ","flag Bhutan":"๐ง๐น","flag Bouvet Island":"๐ง๐ป","flag Botswana":"๐ง๐ผ","flag Belarus":"๐ง๐พ","flag Belize":"๐ง๐ฟ","flag Canada":"๐จ๐ฆ","flag Cocos (Keeling) Islands":"๐จ๐จ","flag Congo - Kinshasa":"๐จ๐ฉ","flag Central African Republic":"๐จ๐ซ","flag Congo - Brazzaville":"๐จ๐ฌ","flag Switzerland":"๐จ๐ญ","flag Cรดte dโIvoire":"๐จ๐ฎ","flag Cook Islands":"๐จ๐ฐ","flag Chile":"๐จ๐ฑ","flag Cameroon":"๐จ๐ฒ","flag China":"๐จ๐ณ","flag Colombia":"๐จ๐ด","flag Clipperton Island":"๐จ๐ต","flag Costa Rica":"๐จ๐ท","flag Cuba":"๐จ๐บ","flag Cape Verde":"๐จ๐ป","flag Curaรงao":"๐จ๐ผ","flag Christmas Island":"๐จ๐ฝ","flag Cyprus":"๐จ๐พ","flag Czechia":"๐จ๐ฟ","flag Germany":"๐ฉ๐ช","flag Diego Garcia":"๐ฉ๐ฌ","flag Djibouti":"๐ฉ๐ฏ","flag Denmark":"๐ฉ๐ฐ","flag Dominica":"๐ฉ๐ฒ","flag Dominican Republic":"๐ฉ๐ด","flag Algeria":"๐ฉ๐ฟ","flag Ceuta & Melilla":"๐ช๐ฆ","flag Ecuador":"๐ช๐จ","flag Estonia":"๐ช๐ช","flag Egypt":"๐ช๐ฌ","flag Western Sahara":"๐ช๐ญ","flag Eritrea":"๐ช๐ท","flag Spain":"๐ช๐ธ","flag Ethiopia":"๐ช๐น","flag European Union":"๐ช๐บ","flag Finland":"๐ซ๐ฎ","flag Fiji":"๐ซ๐ฏ","flag Falkland Islands":"๐ซ๐ฐ","flag Micronesia":"๐ซ๐ฒ","flag Faroe Islands":"๐ซ๐ด","flag France":"๐ซ๐ท","flag Gabon":"๐ฌ๐ฆ","flag United Kingdom":"๐ฌ๐ง","flag Grenada":"๐ฌ๐ฉ","flag Georgia":"๐ฌ๐ช","flag French Guiana":"๐ฌ๐ซ","flag Guernsey":"๐ฌ๐ฌ","flag Ghana":"๐ฌ๐ญ","flag Gibraltar":"๐ฌ๐ฎ","flag Greenland":"๐ฌ๐ฑ","flag Gambia":"๐ฌ๐ฒ","flag Guinea":"๐ฌ๐ณ","flag Guadeloupe":"๐ฌ๐ต","flag Equatorial Guinea":"๐ฌ๐ถ","flag Greece":"๐ฌ๐ท","flag South Georgia & South Sandwich Islands":"๐ฌ๐ธ","flag Guatemala":"๐ฌ๐น","flag Guam":"๐ฌ๐บ","flag Guinea-Bissau":"๐ฌ๐ผ","flag Guyana":"๐ฌ๐พ","flag Hong Kong SAR China":"๐ญ๐ฐ","flag Heard & McDonald Islands":"๐ญ๐ฒ","flag Honduras":"๐ญ๐ณ","flag Croatia":"๐ญ๐ท","flag Haiti":"๐ญ๐น","flag Hungary":"๐ญ๐บ","flag Canary Islands":"๐ฎ๐จ","flag Indonesia":"๐ฎ๐ฉ","flag Ireland":"๐ฎ๐ช","flag Israel":"๐ฎ๐ฑ","flag Isle of Man":"๐ฎ๐ฒ","flag India":"๐ฎ๐ณ","flag British Indian Ocean Territory":"๐ฎ๐ด","flag Iraq":"๐ฎ๐ถ","flag Iran":"๐ฎ๐ท","flag Iceland":"๐ฎ๐ธ","flag Italy":"๐ฎ๐น","flag Jersey":"๐ฏ๐ช","flag Jamaica":"๐ฏ๐ฒ","flag Jordan":"๐ฏ๐ด","flag Japan":"๐ฏ๐ต","flag Kenya":"๐ฐ๐ช","flag Kyrgyzstan":"๐ฐ๐ฌ","flag Cambodia":"๐ฐ๐ญ","flag Kiribati":"๐ฐ๐ฎ","flag Comoros":"๐ฐ๐ฒ","flag St. Kitts & Nevis":"๐ฐ๐ณ","flag North Korea":"๐ฐ๐ต","flag South Korea":"๐ฐ๐ท","flag Kuwait":"๐ฐ๐ผ","flag Cayman Islands":"๐ฐ๐พ","flag Kazakhstan":"๐ฐ๐ฟ","flag Laos":"๐ฑ๐ฆ","flag Lebanon":"๐ฑ๐ง","flag St. Lucia":"๐ฑ๐จ","flag Liechtenstein":"๐ฑ๐ฎ","flag Sri Lanka":"๐ฑ๐ฐ","flag Liberia":"๐ฑ๐ท","flag Lesotho":"๐ฑ๐ธ","flag Lithuania":"๐ฑ๐น","flag Luxembourg":"๐ฑ๐บ","flag Latvia":"๐ฑ๐ป","flag Libya":"๐ฑ๐พ","flag Morocco":"๐ฒ๐ฆ","flag Monaco":"๐ฒ๐จ","flag Moldova":"๐ฒ๐ฉ","flag Montenegro":"๐ฒ๐ช","flag St. Martin":"๐ฒ๐ซ","flag Madagascar":"๐ฒ๐ฌ","flag Marshall Islands":"๐ฒ๐ญ","flag North Macedonia":"๐ฒ๐ฐ","flag Mali":"๐ฒ๐ฑ","flag Myanmar (Burma)":"๐ฒ๐ฒ","flag Mongolia":"๐ฒ๐ณ","flag Macao SAR China":"๐ฒ๐ด","flag Northern Mariana Islands":"๐ฒ๐ต","flag Martinique":"๐ฒ๐ถ","flag Mauritania":"๐ฒ๐ท","flag Montserrat":"๐ฒ๐ธ","flag Malta":"๐ฒ๐น","flag Mauritius":"๐ฒ๐บ","flag Maldives":"๐ฒ๐ป","flag Malawi":"๐ฒ๐ผ","flag Mexico":"๐ฒ๐ฝ","flag Malaysia":"๐ฒ๐พ","flag Mozambique":"๐ฒ๐ฟ","flag Namibia":"๐ณ๐ฆ","flag New Caledonia":"๐ณ๐จ","flag Niger":"๐ณ๐ช","flag Norfolk Island":"๐ณ๐ซ","flag Nigeria":"๐ณ๐ฌ","flag Nicaragua":"๐ณ๐ฎ","flag Netherlands":"๐ณ๐ฑ","flag Norway":"๐ณ๐ด","flag Nepal":"๐ณ๐ต","flag Nauru":"๐ณ๐ท","flag Niue":"๐ณ๐บ","flag New Zealand":"๐ณ๐ฟ","flag Oman":"๐ด๐ฒ","flag Panama":"๐ต๐ฆ","flag Peru":"๐ต๐ช","flag French Polynesia":"๐ต๐ซ","flag Papua New Guinea":"๐ต๐ฌ","flag Philippines":"๐ต๐ญ","flag Pakistan":"๐ต๐ฐ","flag Poland":"๐ต๐ฑ","flag St. Pierre & Miquelon":"๐ต๐ฒ","flag Pitcairn Islands":"๐ต๐ณ","flag Puerto Rico":"๐ต๐ท","flag Palestinian Territories":"๐ต๐ธ","flag Portugal":"๐ต๐น","flag Palau":"๐ต๐ผ","flag Paraguay":"๐ต๐พ","flag Qatar":"๐ถ๐ฆ","flag Rรฉunion":"๐ท๐ช","flag Romania":"๐ท๐ด","flag Serbia":"๐ท๐ธ","flag Russia":"๐ท๐บ","flag Rwanda":"๐ท๐ผ","flag Saudi Arabia":"๐ธ๐ฆ","flag Solomon Islands":"๐ธ๐ง","flag Seychelles":"๐ธ๐จ","flag Sudan":"๐ธ๐ฉ","flag Sweden":"๐ธ๐ช","flag Singapore":"๐ธ๐ฌ","flag St. Helena":"๐ธ๐ญ","flag Slovenia":"๐ธ๐ฎ","flag Svalbard & Jan Mayen":"๐ธ๐ฏ","flag Slovakia":"๐ธ๐ฐ","flag Sierra Leone":"๐ธ๐ฑ","flag San Marino":"๐ธ๐ฒ","flag Senegal":"๐ธ๐ณ","flag Somalia":"๐ธ๐ด","flag Suriname":"๐ธ๐ท","flag South Sudan":"๐ธ๐ธ","flag Sรฃo Tomรฉ & Prรญncipe":"๐ธ๐น","flag El Salvador":"๐ธ๐ป","flag Sint Maarten":"๐ธ๐ฝ","flag Syria":"๐ธ๐พ","flag Eswatini":"๐ธ๐ฟ","flag Tristan da Cunha":"๐น๐ฆ","flag Turks & Caicos Islands":"๐น๐จ","flag Chad":"๐น๐ฉ","flag French Southern Territories":"๐น๐ซ","flag Togo":"๐น๐ฌ","flag Thailand":"๐น๐ญ","flag Tajikistan":"๐น๐ฏ","flag Tokelau":"๐น๐ฐ","flag Timor-Leste":"๐น๐ฑ","flag Turkmenistan":"๐น๐ฒ","flag Tunisia":"๐น๐ณ","flag Tonga":"๐น๐ด","flag Turkey":"๐น๐ท","flag Trinidad & Tobago":"๐น๐น","flag Tuvalu":"๐น๐ป","flag Taiwan":"๐น๐ผ","flag Tanzania":"๐น๐ฟ","flag Ukraine":"๐บ๐ฆ","flag Uganda":"๐บ๐ฌ","flag U.S. Outlying Islands":"๐บ๐ฒ","flag United Nations":"๐บ๐ณ","flag United States":"๐บ๐ธ","flag Uruguay":"๐บ๐พ","flag Uzbekistan":"๐บ๐ฟ","flag Vatican City":"๐ป๐ฆ","flag St. Vincent & Grenadines":"๐ป๐จ","flag Venezuela":"๐ป๐ช","flag British Virgin Islands":"๐ป๐ฌ","flag U.S. Virgin Islands":"๐ป๐ฎ","flag Vietnam":"๐ป๐ณ","flag Vanuatu":"๐ป๐บ","flag Wallis & Futuna":"๐ผ๐ซ","flag Samoa":"๐ผ๐ธ","flag Kosovo":"๐ฝ๐ฐ","flag Yemen":"๐พ๐ช","flag Mayotte":"๐พ๐น","flag South Africa":"๐ฟ๐ฆ","flag Zambia":"๐ฟ๐ฒ","flag Zimbabwe":"๐ฟ๐ผ","flag England":"๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","flag Scotland":"๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","flag Wales":"๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ"}}
\ No newline at end of file
diff --git a/apps/gg/gpx.js b/apps/gg/gpx.js
deleted file mode 100644
index 56875d17..00000000
--- a/apps/gg/gpx.js
+++ /dev/null
@@ -1,84 +0,0 @@
-function xml_parse(xml) {
- let result;
- let path = [];
- let tag_begin;
- let text_begin;
- for (let i = 0; i < xml.length; i++) {
- let c = xml.charAt(i);
- if (!tag_begin && c == '<') {
- if (i > text_begin && path.length) {
- let value = xml.substring(text_begin, i);
- if (!/^\s*$/.test(value)) {
- path[path.length - 1].value = value;
- }
- }
- tag_begin = i + 1;
- } else if (tag_begin && c == '>') {
- let tag = xml.substring(tag_begin, i).trim();
- if (tag.startsWith('?') && tag.endsWith('?')) {
- /* Ignore directives. */
- } else if (tag.startsWith('/')) {
- path.pop();
- } else {
- let parts = tag.split(' ');
- let attributes = {};
- for (let j = 1; j < parts.length; j++) {
- let eq = parts[j].indexOf('=');
- let value = parts[j].substring(eq + 1);
- if (value.startsWith('"') && value.endsWith('"')) {
- value = value.substring(1, value.length - 1);
- }
- attributes[parts[j].substring(0, eq)] = value;
- }
- let next = {name: parts[0], children: [], attributes: attributes};
- if (path.length) {
- path[path.length - 1].children.push(next);
- } else {
- result = next;
- }
- if (!tag.endsWith('/')) {
- path.push(next);
- }
- }
- tag_begin = undefined;
- text_begin = i + 1;
- }
- }
- return result;
-}
-
-function* xml_each(node, name) {
- for (let child of node.children) {
- if (child.name == name) {
- yield child;
- }
- }
-}
-
-export function gpx_parse(xml) {
- let result = {segments: []};
- let tree = xml_parse(xml);
- if (tree?.name == 'gpx') {
- for (let trk of xml_each(tree, 'trk')) {
- for (let trkseg of xml_each(trk, 'trkseg')) {
- let segment = [];
- for (let trkpt of xml_each(trkseg, 'trkpt')) {
- segment.push({
- lat: parseFloat(trkpt.attributes.lat),
- lon: parseFloat(trkpt.attributes.lon),
- });
- }
- result.segments.push(segment);
- }
- }
- }
- for (let metadata of xml_each(tree, 'metadata')) {
- for (let link of xml_each(metadata, 'link')) {
- result.link = link.attributes.href;
- }
- for (let time of xml_each(metadata, 'time')) {
- result.time = time.value;
- }
- }
- return result;
-}
diff --git a/apps/gg/handler.js b/apps/gg/handler.js
deleted file mode 100644
index 4f210ce5..00000000
--- a/apps/gg/handler.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import * as strava from './strava.js';
-
-async function main() {
- print('handler running');
- let r = await strava.authorization_code(request.query.code);
- print('state =', request.query.state);
- print('body = ', r.body);
- if (request.query.state && r.body) {
- let shared_db = await shared_database('state');
- await shared_db.set(request.query.state, utf8Decode(r.body));
- }
- await respond({
- data: r.body,
- content_type: 'text/plain',
- headers: {
- Location: 'https://tildefriends.net/~cory/gg/',
- },
- status_code: 307,
- });
-}
-main();
diff --git a/apps/gg/index.html b/apps/gg/index.html
deleted file mode 100644
index 66a7f723..00000000
--- a/apps/gg/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/gg/leaflet.css b/apps/gg/leaflet.css
deleted file mode 100644
index ea8c2f7d..00000000
--- a/apps/gg/leaflet.css
+++ /dev/null
@@ -1,661 +0,0 @@
-/* required styles */
-
-.leaflet-pane,
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-tile-container,
-.leaflet-pane > svg,
-.leaflet-pane > canvas,
-.leaflet-zoom-box,
-.leaflet-image-layer,
-.leaflet-layer {
- position: absolute;
- left: 0;
- top: 0;
- }
-.leaflet-container {
- overflow: hidden;
- }
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- -webkit-user-drag: none;
- }
-/* Prevents IE11 from highlighting tiles in blue */
-.leaflet-tile::selection {
- background: transparent;
-}
-/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
-.leaflet-safari .leaflet-tile {
- image-rendering: -webkit-optimize-contrast;
- }
-/* hack that prevents hw layers "stretching" when loading new tiles */
-.leaflet-safari .leaflet-tile-container {
- width: 1600px;
- height: 1600px;
- -webkit-transform-origin: 0 0;
- }
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
- display: block;
- }
-/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
-/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
-.leaflet-container .leaflet-overlay-pane svg {
- max-width: none !important;
- max-height: none !important;
- }
-.leaflet-container .leaflet-marker-pane img,
-.leaflet-container .leaflet-shadow-pane img,
-.leaflet-container .leaflet-tile-pane img,
-.leaflet-container img.leaflet-image-layer,
-.leaflet-container .leaflet-tile {
- max-width: none !important;
- max-height: none !important;
- width: auto;
- padding: 0;
- }
-
-.leaflet-container img.leaflet-tile {
- /* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
- mix-blend-mode: plus-lighter;
-}
-
-.leaflet-container.leaflet-touch-zoom {
- -ms-touch-action: pan-x pan-y;
- touch-action: pan-x pan-y;
- }
-.leaflet-container.leaflet-touch-drag {
- -ms-touch-action: pinch-zoom;
- /* Fallback for FF which doesn't support pinch-zoom */
- touch-action: none;
- touch-action: pinch-zoom;
-}
-.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
- -ms-touch-action: none;
- touch-action: none;
-}
-.leaflet-container {
- -webkit-tap-highlight-color: transparent;
-}
-.leaflet-container a {
- -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
-}
-.leaflet-tile {
- filter: inherit;
- visibility: hidden;
- }
-.leaflet-tile-loaded {
- visibility: inherit;
- }
-.leaflet-zoom-box {
- width: 0;
- height: 0;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- z-index: 800;
- }
-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
-.leaflet-overlay-pane svg {
- -moz-user-select: none;
- }
-
-.leaflet-pane { z-index: 400; }
-
-.leaflet-tile-pane { z-index: 200; }
-.leaflet-overlay-pane { z-index: 400; }
-.leaflet-shadow-pane { z-index: 500; }
-.leaflet-marker-pane { z-index: 600; }
-.leaflet-tooltip-pane { z-index: 650; }
-.leaflet-popup-pane { z-index: 700; }
-
-.leaflet-map-pane canvas { z-index: 100; }
-.leaflet-map-pane svg { z-index: 200; }
-
-.leaflet-vml-shape {
- width: 1px;
- height: 1px;
- }
-.lvml {
- behavior: url(#default#VML);
- display: inline-block;
- position: absolute;
- }
-
-
-/* control positioning */
-
-.leaflet-control {
- position: relative;
- z-index: 800;
- pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
- pointer-events: auto;
- }
-.leaflet-top,
-.leaflet-bottom {
- position: absolute;
- z-index: 1000;
- pointer-events: none;
- }
-.leaflet-top {
- top: 0;
- }
-.leaflet-right {
- right: 0;
- }
-.leaflet-bottom {
- bottom: 0;
- }
-.leaflet-left {
- left: 0;
- }
-.leaflet-control {
- float: left;
- clear: both;
- }
-.leaflet-right .leaflet-control {
- float: right;
- }
-.leaflet-top .leaflet-control {
- margin-top: 10px;
- }
-.leaflet-bottom .leaflet-control {
- margin-bottom: 10px;
- }
-.leaflet-left .leaflet-control {
- margin-left: 10px;
- }
-.leaflet-right .leaflet-control {
- margin-right: 10px;
- }
-
-
-/* zoom and fade animations */
-
-.leaflet-fade-anim .leaflet-popup {
- opacity: 0;
- -webkit-transition: opacity 0.2s linear;
- -moz-transition: opacity 0.2s linear;
- transition: opacity 0.2s linear;
- }
-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
- opacity: 1;
- }
-.leaflet-zoom-animated {
- -webkit-transform-origin: 0 0;
- -ms-transform-origin: 0 0;
- transform-origin: 0 0;
- }
-svg.leaflet-zoom-animated {
- will-change: transform;
-}
-
-.leaflet-zoom-anim .leaflet-zoom-animated {
- -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
- -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
- transition: transform 0.25s cubic-bezier(0,0,0.25,1);
- }
-.leaflet-zoom-anim .leaflet-tile,
-.leaflet-pan-anim .leaflet-tile {
- -webkit-transition: none;
- -moz-transition: none;
- transition: none;
- }
-
-.leaflet-zoom-anim .leaflet-zoom-hide {
- visibility: hidden;
- }
-
-
-/* cursors */
-
-.leaflet-interactive {
- cursor: pointer;
- }
-.leaflet-grab {
- cursor: -webkit-grab;
- cursor: -moz-grab;
- cursor: grab;
- }
-.leaflet-crosshair,
-.leaflet-crosshair .leaflet-interactive {
- cursor: crosshair;
- }
-.leaflet-popup-pane,
-.leaflet-control {
- cursor: auto;
- }
-.leaflet-dragging .leaflet-grab,
-.leaflet-dragging .leaflet-grab .leaflet-interactive,
-.leaflet-dragging .leaflet-marker-draggable {
- cursor: move;
- cursor: -webkit-grabbing;
- cursor: -moz-grabbing;
- cursor: grabbing;
- }
-
-/* marker & overlays interactivity */
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-image-layer,
-.leaflet-pane > svg path,
-.leaflet-tile-container {
- pointer-events: none;
- }
-
-.leaflet-marker-icon.leaflet-interactive,
-.leaflet-image-layer.leaflet-interactive,
-.leaflet-pane > svg path.leaflet-interactive,
-svg.leaflet-image-layer.leaflet-interactive path {
- pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
- pointer-events: auto;
- }
-
-/* visual tweaks */
-
-.leaflet-container {
- background: #ddd;
- outline-offset: 1px;
- }
-.leaflet-container a {
- color: #0078A8;
- }
-.leaflet-zoom-box {
- border: 2px dotted #38f;
- background: rgba(255,255,255,0.5);
- }
-
-
-/* general typography */
-.leaflet-container {
- font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
- font-size: 12px;
- font-size: 0.75rem;
- line-height: 1.5;
- }
-
-
-/* general toolbar styles */
-
-.leaflet-bar {
- box-shadow: 0 1px 5px rgba(0,0,0,0.65);
- border-radius: 4px;
- }
-.leaflet-bar a {
- background-color: #fff;
- border-bottom: 1px solid #ccc;
- width: 26px;
- height: 26px;
- line-height: 26px;
- display: block;
- text-align: center;
- text-decoration: none;
- color: black;
- }
-.leaflet-bar a,
-.leaflet-control-layers-toggle {
- background-position: 50% 50%;
- background-repeat: no-repeat;
- display: block;
- }
-.leaflet-bar a:hover,
-.leaflet-bar a:focus {
- background-color: #f4f4f4;
- }
-.leaflet-bar a:first-child {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- }
-.leaflet-bar a:last-child {
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- border-bottom: none;
- }
-.leaflet-bar a.leaflet-disabled {
- cursor: default;
- background-color: #f4f4f4;
- color: #bbb;
- }
-
-.leaflet-touch .leaflet-bar a {
- width: 30px;
- height: 30px;
- line-height: 30px;
- }
-.leaflet-touch .leaflet-bar a:first-child {
- border-top-left-radius: 2px;
- border-top-right-radius: 2px;
- }
-.leaflet-touch .leaflet-bar a:last-child {
- border-bottom-left-radius: 2px;
- border-bottom-right-radius: 2px;
- }
-
-/* zoom control */
-
-.leaflet-control-zoom-in,
-.leaflet-control-zoom-out {
- font: bold 18px 'Lucida Console', Monaco, monospace;
- text-indent: 1px;
- }
-
-.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
- font-size: 22px;
- }
-
-
-/* layers control */
-
-.leaflet-control-layers {
- box-shadow: 0 1px 5px rgba(0,0,0,0.4);
- background: #fff;
- border-radius: 5px;
- }
-.leaflet-control-layers-toggle {
- background-image: url(images/layers.png);
- width: 36px;
- height: 36px;
- }
-.leaflet-retina .leaflet-control-layers-toggle {
- background-image: url(images/layers-2x.png);
- background-size: 26px 26px;
- }
-.leaflet-touch .leaflet-control-layers-toggle {
- width: 44px;
- height: 44px;
- }
-.leaflet-control-layers .leaflet-control-layers-list,
-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
- display: none;
- }
-.leaflet-control-layers-expanded .leaflet-control-layers-list {
- display: block;
- position: relative;
- }
-.leaflet-control-layers-expanded {
- padding: 6px 10px 6px 6px;
- color: #333;
- background: #fff;
- }
-.leaflet-control-layers-scrollbar {
- overflow-y: scroll;
- overflow-x: hidden;
- padding-right: 5px;
- }
-.leaflet-control-layers-selector {
- margin-top: 2px;
- position: relative;
- top: 1px;
- }
-.leaflet-control-layers label {
- display: block;
- font-size: 13px;
- font-size: 1.08333em;
- }
-.leaflet-control-layers-separator {
- height: 0;
- border-top: 1px solid #ddd;
- margin: 5px -10px 5px -6px;
- }
-
-/* Default icon URLs */
-.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
- background-image: url(images/marker-icon.png);
- }
-
-
-/* attribution and scale controls */
-
-.leaflet-container .leaflet-control-attribution {
- background: #fff;
- background: rgba(255, 255, 255, 0.8);
- margin: 0;
- }
-.leaflet-control-attribution,
-.leaflet-control-scale-line {
- padding: 0 5px;
- color: #333;
- line-height: 1.4;
- }
-.leaflet-control-attribution a {
- text-decoration: none;
- }
-.leaflet-control-attribution a:hover,
-.leaflet-control-attribution a:focus {
- text-decoration: underline;
- }
-.leaflet-attribution-flag {
- display: inline !important;
- vertical-align: baseline !important;
- width: 1em;
- height: 0.6669em;
- }
-.leaflet-left .leaflet-control-scale {
- margin-left: 5px;
- }
-.leaflet-bottom .leaflet-control-scale {
- margin-bottom: 5px;
- }
-.leaflet-control-scale-line {
- border: 2px solid #777;
- border-top: none;
- line-height: 1.1;
- padding: 2px 5px 1px;
- white-space: nowrap;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- background: rgba(255, 255, 255, 0.8);
- text-shadow: 1px 1px #fff;
- }
-.leaflet-control-scale-line:not(:first-child) {
- border-top: 2px solid #777;
- border-bottom: none;
- margin-top: -2px;
- }
-.leaflet-control-scale-line:not(:first-child):not(:last-child) {
- border-bottom: 2px solid #777;
- }
-
-.leaflet-touch .leaflet-control-attribution,
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
- box-shadow: none;
- }
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
- border: 2px solid rgba(0,0,0,0.2);
- background-clip: padding-box;
- }
-
-
-/* popup */
-
-.leaflet-popup {
- position: absolute;
- text-align: center;
- margin-bottom: 20px;
- }
-.leaflet-popup-content-wrapper {
- padding: 1px;
- text-align: left;
- border-radius: 12px;
- }
-.leaflet-popup-content {
- margin: 13px 24px 13px 20px;
- line-height: 1.3;
- font-size: 13px;
- font-size: 1.08333em;
- min-height: 1px;
- }
-.leaflet-popup-content p {
- margin: 17px 0;
- margin: 1.3em 0;
- }
-.leaflet-popup-tip-container {
- width: 40px;
- height: 20px;
- position: absolute;
- left: 50%;
- margin-top: -1px;
- margin-left: -20px;
- overflow: hidden;
- pointer-events: none;
- }
-.leaflet-popup-tip {
- width: 17px;
- height: 17px;
- padding: 1px;
-
- margin: -10px auto 0;
- pointer-events: auto;
-
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- transform: rotate(45deg);
- }
-.leaflet-popup-content-wrapper,
-.leaflet-popup-tip {
- background: white;
- color: #333;
- box-shadow: 0 3px 14px rgba(0,0,0,0.4);
- }
-.leaflet-container a.leaflet-popup-close-button {
- position: absolute;
- top: 0;
- right: 0;
- border: none;
- text-align: center;
- width: 24px;
- height: 24px;
- font: 16px/24px Tahoma, Verdana, sans-serif;
- color: #757575;
- text-decoration: none;
- background: transparent;
- }
-.leaflet-container a.leaflet-popup-close-button:hover,
-.leaflet-container a.leaflet-popup-close-button:focus {
- color: #585858;
- }
-.leaflet-popup-scrolled {
- overflow: auto;
- }
-
-.leaflet-oldie .leaflet-popup-content-wrapper {
- -ms-zoom: 1;
- }
-.leaflet-oldie .leaflet-popup-tip {
- width: 24px;
- margin: 0 auto;
-
- -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
- filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
- }
-
-.leaflet-oldie .leaflet-control-zoom,
-.leaflet-oldie .leaflet-control-layers,
-.leaflet-oldie .leaflet-popup-content-wrapper,
-.leaflet-oldie .leaflet-popup-tip {
- border: 1px solid #999;
- }
-
-
-/* div icon */
-
-.leaflet-div-icon {
- background: #fff;
- border: 1px solid #666;
- }
-
-
-/* Tooltip */
-/* Base styles for the element that has a tooltip */
-.leaflet-tooltip {
- position: absolute;
- padding: 6px;
- background-color: #fff;
- border: 1px solid #fff;
- border-radius: 3px;
- color: #222;
- white-space: nowrap;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- pointer-events: none;
- box-shadow: 0 1px 3px rgba(0,0,0,0.4);
- }
-.leaflet-tooltip.leaflet-interactive {
- cursor: pointer;
- pointer-events: auto;
- }
-.leaflet-tooltip-top:before,
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
- position: absolute;
- pointer-events: none;
- border: 6px solid transparent;
- background: transparent;
- content: "";
- }
-
-/* Directions */
-
-.leaflet-tooltip-bottom {
- margin-top: 6px;
-}
-.leaflet-tooltip-top {
- margin-top: -6px;
-}
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-top:before {
- left: 50%;
- margin-left: -6px;
- }
-.leaflet-tooltip-top:before {
- bottom: 0;
- margin-bottom: -12px;
- border-top-color: #fff;
- }
-.leaflet-tooltip-bottom:before {
- top: 0;
- margin-top: -12px;
- margin-left: -6px;
- border-bottom-color: #fff;
- }
-.leaflet-tooltip-left {
- margin-left: -6px;
-}
-.leaflet-tooltip-right {
- margin-left: 6px;
-}
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
- top: 50%;
- margin-top: -6px;
- }
-.leaflet-tooltip-left:before {
- right: 0;
- margin-right: -12px;
- border-left-color: #fff;
- }
-.leaflet-tooltip-right:before {
- left: 0;
- margin-left: -12px;
- border-right-color: #fff;
- }
-
-/* Printing */
-
-@media print {
- /* Prevent printers from removing background-images of controls. */
- .leaflet-control {
- -webkit-print-color-adjust: exact;
- print-color-adjust: exact;
- }
- }
\ No newline at end of file
diff --git a/apps/gg/leaflet.js b/apps/gg/leaflet.js
deleted file mode 100644
index a3bf693d..00000000
--- a/apps/gg/leaflet.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/* @preserve
- * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com
- * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade
- */
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.xe.y&&n.y=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.late.lng&&n.lng","http://www.w3.org/2000/svg"===(Wt.firstChild&&Wt.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Wt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Ft=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Ft,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Ft,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=F(e),o=0,s=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!We(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;sthis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,i.noMoveStart||!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){if(!this._preventClick){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;se.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section,e=(this._preventClick=!0,S(t,"click",O),this.expand(),this);setTimeout(function(){k(t,"click",O),e._preventClick=!1})}})),qe=B.extend({options:{position:"topleft",zoomInText:'+',zoomInTitle:"Zoom in",zoomOutText:'−',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ge=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new qe,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280'+(b.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' | ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ke).addTo(this)}),B.Layers=Ve,B.Zoom=qe,B.Scale=Ge,B.Attribution=Ke,Ue.layers=function(t,e,i){return new Ve(t,e,i)},Ue.zoom=function(t){return new qe(t)},Ue.scale=function(t){return new Ge(t)},Ue.attribution=function(t){return new Ke(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Ye=b.touch?"touchstart mousedown":"mousedown",Xe=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xe._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xe._dragging===this&&this.finishDrag():Xe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xe._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1e&&(i.push(t[n]),o=n);oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ri(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||yi.prototype._containsPoint.call(this,t,!0)}});var wi=ci.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;e×',S(i,"click",function(t){O(t),this.close()},this))},_updateLayout:function(){var t=this._contentNode,e=t.style,i=(e.width="",e.whiteSpace="nowrap",t.offsetWidth),i=Math.min(i,this.options.maxWidth),i=(i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="",t.offsetHeight),n=this.options.maxHeight,o="leaflet-popup-scrolled";(n&&ns.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Ii=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Bi,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Bi,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ci||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof fi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Ai.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ai.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Di=Ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Wi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Vi("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Vi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Vi("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Vi("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},qi=b.vml?Vi:ct,Gi=Wi.extend({_initContainer:function(){this._container=qi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=qi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=qi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Ki(t){return b.svg||b.vml?new Gi(t):null}b.vml&&Gi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Ui(t)||Ki(t)}});var Yi=xi.extend({initialize:function(t,e){xi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Gi.create=qi,Gi.pointsToPath=dt,wi.geometryToLayer=bi,wi.coordsToLatLng=Li,wi.coordsToLatLngs=Ti,wi.latLngToCoords=Mi,wi.latLngsToCoords=zi,wi.getFeature=Ci,wi.asFeature=Zi,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)e.getMaxZoom()&&1new n("string"==typeof t?t:t+"",void 0,i),o=(t,...s)=>{const e=1===t.length?t[0]:s.reduce(((s,i,e)=>s+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[e+1]),t[0]);return new n(e,t,i)},h=(i,e)=>{if(s)i.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const s of e){const e=document.createElement("style"),n=t.litNonce;void 0!==n&&e.setAttribute("nonce",n),e.textContent=s.cssText,i.appendChild(e)}},c=s?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let s="";for(const i of t.cssRules)s+=i.cssText;return r(s)})(t):t
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */,{is:l,defineProperty:a,getOwnPropertyDescriptor:u,getOwnPropertyNames:d,getOwnPropertySymbols:f,getPrototypeOf:p}=Object,v=globalThis,y=v.trustedTypes,m=y?y.emptyScript:"",b=v.reactiveElementPolyfillSupport,g=(t,s)=>t,w={toAttribute(t,s){switch(s){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},_=(t,s)=>!l(t,s),S={attribute:!0,type:String,converter:w,reflect:!1,hasChanged:_};Symbol.metadata??=Symbol("metadata"),v.litPropertyMetadata??=new WeakMap;class $ extends HTMLElement{static addInitializer(t){this.o(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this.u&&[...this.u.keys()]}static createProperty(t,s=S){if(s.state&&(s.attribute=!1),this.o(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),e=this.getPropertyDescriptor(t,i,s);void 0!==e&&a(this.prototype,t,e)}}static getPropertyDescriptor(t,s,i){const{get:e,set:n}=u(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);n.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??S}static o(){if(this.hasOwnProperty(g("elementProperties")))return;const t=p(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(g("finalized")))return;if(this.finalized=!0,this.o(),this.hasOwnProperty(g("properties"))){const t=this.properties,s=[...d(t),...f(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this.u=new Map;for(const[t,s]of this.elementProperties){const i=this.p(t,s);void 0!==i&&this.u.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const s=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)s.unshift(c(t))}else void 0!==t&&s.push(c(t));return s}static p(t,s){const i=s.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this.v=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.m=null,this._()}_(){this.S=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this.$(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this.P??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this.P?.delete(t)}$(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this.v=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return h(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.P?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this.P?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}C(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor.p(t,i);if(void 0!==e&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:w).toAttribute(s,i.type);this.m=t,null==n?this.removeAttribute(e):this.setAttribute(e,n),this.m=null}}_$AK(t,s){const i=this.constructor,e=i.u.get(t);if(void 0!==e&&this.m!==e){const t=i.getPropertyOptions(e),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:w;this.m=e,this[e]=n.fromAttribute(s,t.type),this.m=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??_)(this[t],s))return;this.T(t,s,i)}!1===this.isUpdatePending&&(this.S=this.A())}T(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this.m!==t&&(this.M??=new Set).add(t)}async A(){this.isUpdatePending=!0;try{await this.S}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this.v){for(const[t,s]of this.v)this[t]=s;this.v=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.T(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this.P?.forEach((t=>t.hostUpdate?.())),this.update(s)):this.k()}catch(s){throw t=!1,this.k(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this.P?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}k(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.S}shouldUpdate(t){return!0}update(t){this.M&&=this.M.forEach((t=>this.C(t,this[t]))),this.k()}updated(t){}firstUpdated(t){}}$.elementStyles=[],$.shadowRootOptions={mode:"open"},$[g("elementProperties")]=new Map,$[g("finalized")]=new Map,b?.({ReactiveElement:$}),(v.reactiveElementVersions??=[]).push("2.0.4");
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-const T=globalThis,x=T.trustedTypes,E=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,C="$lit$",P=`lit$${(Math.random()+"").slice(9)}$`,A="?"+P,k=`<${A}>`,M=document,U=()=>M.createComment(""),V=t=>null===t||"object"!=typeof t&&"function"!=typeof t,O=Array.isArray,R=t=>O(t)||"function"==typeof t?.[Symbol.iterator],N="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,L=/-->/g,j=/>/g,H=RegExp(`>|${N}(?:([^\\s"'>=/]+)(${N}*=${N}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),I=/'/g,D=/"/g,B=/^(?:script|style|textarea|title)$/i,W=t=>(s,...i)=>({_$litType$:t,strings:s,values:i}),Z=W(1),q=W(2),F=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),J=new WeakMap,K=M.createTreeWalker(M,129);function Y(t,s){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==E?E.createHTML(s):s}const Q=(t,s)=>{const i=t.length-1,e=[];let n,r=2===s?"":"")),e]};class X{constructor({strings:t,_$litType$:s},i){let e;this.parts=[];let n=0,r=0;const o=t.length-1,h=this.parts,[c,l]=Q(t,s);if(this.el=X.createElement(c,i),K.currentNode=this.el.content,2===s){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(e=K.nextNode())&&h.length0){e.textContent=x?x.emptyScript:"";for(let i=0;i2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,s=this,i,e){const n=this.strings;let r=!1;if(void 0===n)t=tt(this,t,s,0),r=!V(t)||t!==this._$AH&&t!==F,r&&(this._$AH=t);else{const e=t;let o,h;for(t=n[0],o=0;o{const e=i?.renderBefore??s;let n=e._$litPart$;if(void 0===n){const t=i?.renderBefore??null;e._$litPart$=n=new it(s.insertBefore(U(),t),t,void 0,i??{})}return n._$AI(t),n};
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */class ut extends ${constructor(){super(...arguments),this.renderOptions={host:this},this.ht=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const s=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this.ht=at(s,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.ht?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.ht?.setConnected(!1)}render(){return F}}ut._$litElement$=!0,ut[("finalized","finalized")]=!0,globalThis.litElementHydrateSupport?.({LitElement:ut});const dt=globalThis.litElementPolyfillSupport;dt?.({LitElement:ut});const ft={_$AK:(t,s,i)=>{t._$AK(s,i)},_$AL:t=>t._$AL};(globalThis.litElementVersions??=[]).push("4.0.4");
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-const pt=!1,{Y:vt}=ct,yt=t=>null===t||"object"!=typeof t&&"function"!=typeof t,mt={HTML:1,SVG:2},bt=(t,s)=>void 0===s?void 0!==t?._$litType$:t?._$litType$===s,gt=t=>null!=t?._$litType$?.h,wt=t=>void 0!==t?._$litDirective$,_t=t=>t?._$litDirective$,St=t=>void 0===t.strings,$t=()=>document.createComment(""),Tt=(t,s,i)=>{const e=t._$AA.parentNode,n=void 0===s?t._$AB:s._$AA;if(void 0===i){const s=e.insertBefore($t(),n),r=e.insertBefore($t(),n);i=new vt(s,r,t,t.options)}else{const s=i._$AB.nextSibling,r=i._$AM,o=r!==t;if(o){let s;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(s=t._$AU)!==r._$AU&&i._$AP(s)}if(s!==n||o){let t=i._$AA;for(;t!==s;){const s=t.nextSibling;e.insertBefore(t,n),t=s}}}return i},xt=(t,s,i=t)=>(t._$AI(s,i),t),Et={},Ct=(t,s=Et)=>t._$AH=s,Pt=t=>t._$AH,At=t=>{t._$AP?.(!1,!0);let s=t._$AA;const i=t._$AB.nextSibling;for(;s!==i;){const t=s.nextSibling;s.remove(),s=t}},kt=t=>{t._$AR()},Mt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},Ut=t=>(...s)=>({_$litDirective$:t,values:s});class Vt{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,s,i){this.nt=t,this._$AM=s,this.rt=i}_$AS(t,s){return this.update(t,s)}update(t,s){return this.render(...s)}}
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */const Ot=(t,s)=>{const i=t._$AN;if(void 0===i)return!1;for(const t of i)t._$AO?.(s,!1),Ot(t,s);return!0},Rt=t=>{let s,i;do{if(void 0===(s=t._$AM))break;i=s._$AN,i.delete(t),t=s}while(0===i?.size)},Nt=t=>{for(let s;s=t._$AM;t=s){let i=s._$AN;if(void 0===i)s._$AN=i=new Set;else if(i.has(t))break;i.add(t),jt(s)}};function zt(t){void 0!==this._$AN?(Rt(this),this._$AM=t,Nt(this)):this._$AM=t}function Lt(t,s=!1,i=0){const e=this._$AH,n=this._$AN;if(void 0!==n&&0!==n.size)if(s)if(Array.isArray(e))for(let t=i;t{2==t.type&&(t._$AP??=Lt,t._$AQ??=zt)};class Ht extends Vt{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,s,i){super._$AT(t,s,i),Nt(this),this.isConnected=t._$AU}_$AO(t,s=!0){t!==this.isConnected&&(this.isConnected=t,t?this.reconnected?.():this.disconnected?.()),s&&(Ot(this,t),Rt(this))}setValue(t){if(St(this.nt))this.nt._$AI(t,this);else{const s=[...this.nt._$AH];s[this.rt]=t,this.nt._$AI(s,this,0)}}disconnected(){}reconnected(){}}
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */class It{constructor(t){this.ct=t}disconnect(){this.ct=void 0}reconnect(t){this.ct=t}deref(){return this.ct}}class Dt{constructor(){this.lt=void 0,this.ut=void 0}get(){return this.lt}pause(){this.lt??=new Promise((t=>this.ut=t))}resume(){this.ut?.(),this.lt=this.ut=void 0}}
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */class Bt extends Ht{constructor(){super(...arguments),this.dt=new It(this),this.ft=new Dt}render(t,s){return F}update(t,[s,i]){if(this.isConnected||this.disconnected(),s===this.vt)return F;this.vt=s;let e=0;const{dt:n,ft:r}=this;return(async(t,s)=>{for await(const i of t)if(!1===await s(i))return})(s,(async t=>{for(;r.get();)await r.get();const o=n.deref();if(void 0!==o){if(o.vt!==s)return!1;void 0!==i&&(t=i(t,e)),o.commitValue(t,e),e++}return!0})),F}commitValue(t,s){this.setValue(t)}disconnected(){this.dt.disconnect(),this.ft.pause()}reconnected(){this.dt.reconnect(this),this.ft.resume()}}const Wt=Ut(Bt),Zt=Ut(
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-class extends Bt{constructor(t){if(super(t),2!==t.type)throw Error("asyncAppend can only be used in child expressions")}update(t,s){return this.ht=t,super.update(t,s)}commitValue(t,s){0===s&&kt(this.ht);const i=Tt(this.ht);xt(i,t)}}),qt=t=>gt(t)?t._$litType$.h:t.strings,Ft=Ut(class extends Vt{constructor(t){super(t),this.yt=new WeakMap}render(t){return[t]}update(t,[s]){const i=bt(this.bt)?qt(this.bt):null,e=bt(s)?qt(s):null;if(null!==i&&(null===e||i!==e)){const s=Pt(t).pop();let e=this.yt.get(i);if(void 0===e){const t=document.createDocumentFragment();e=at(G,t),e.setConnected(!1),this.yt.set(i,e)}Ct(e,[s]),Tt(e,void 0,s)}if(null!==e){if(null===i||i!==e){const s=this.yt.get(e);if(void 0!==s){const i=Pt(s).pop();kt(t),Tt(t,void 0,i),Ct(t,[i])}}this.bt=s}else this.bt=void 0;return this.render(s)}}),Gt=(t,s,i)=>{for(const i of s)if(i[0]===t)return(0,i[1])();return i?.()},Jt=Ut(
-/**
- * @license
- * Copyright 2018 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-class extends Vt{constructor(t){if(super(t),1!==t.type||"class"!==t.name||t.strings?.length>2)throw Error("`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.")}render(t){return" "+Object.keys(t).filter((s=>t[s])).join(" ")+" "}update(t,[s]){if(void 0===this.gt){this.gt=new Set,void 0!==t.strings&&(this.wt=new Set(t.strings.join(" ").split(/\s/).filter((t=>""!==t))));for(const t in s)s[t]&&!this.wt?.has(t)&&this.gt.add(t);return this.render(s)}const i=t.element.classList;for(const t of this.gt)t in s||(i.remove(t),this.gt.delete(t));for(const t in s){const e=!!s[t];e===this.gt.has(t)||this.wt?.has(t)||(e?(i.add(t),this.gt.add(t)):(i.remove(t),this.gt.delete(t)))}return F}}),Kt={},Yt=Ut(class extends Vt{constructor(){super(...arguments),this._t=Kt}render(t,s){return s()}update(t,[s,i]){if(Array.isArray(s)){if(Array.isArray(this._t)&&this._t.length===s.length&&s.every(((t,s)=>t===this._t[s])))return F}else if(this._t===s)return F;return this._t=Array.isArray(s)?Array.from(s):s,this.render(s,i)}}),Qt=t=>t??G
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */;function*Xt(t,s){const i="function"==typeof s;if(void 0!==t){let e=-1;for(const n of t)e>-1&&(yield i?s(e):s),e++,yield n}}
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */const ts=Ut(class extends Vt{constructor(){super(...arguments),this.key=G}render(t,s){return this.key=t,s}update(t,[s,i]){return s!==this.key&&(Ct(t),this.key=s),i}}),ss=Ut(
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-class extends Vt{constructor(t){if(super(t),3!==t.type&&1!==t.type&&4!==t.type)throw Error("The `live` directive is not allowed on child or event bindings");if(!St(t))throw Error("`live` bindings can only contain a single expression")}render(t){return t}update(t,[s]){if(s===F||s===G)return s;const i=t.element,e=t.name;if(3===t.type){if(s===i[e])return F}else if(4===t.type){if(!!s===i.hasAttribute(e))return F}else if(1===t.type&&i.getAttribute(e)===s+"")return F;return Ct(t),s}});
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-function*is(t,s){if(void 0!==t){let i=0;for(const e of t)yield s(e,i++)}}
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */function*es(t,s,i=1){const e=void 0===s?0:t;s??=t;for(let t=e;i>0?tnew rs;class rs{}const os=new WeakMap,hs=Ut(class extends Ht{render(t){return G}update(t,[s]){const i=s!==this.ct;return i&&void 0!==this.ct&&this.St(void 0),(i||this.$t!==this.Tt)&&(this.ct=s,this.xt=t.options?.host,this.St(this.Tt=t.element)),G}St(t){if("function"==typeof this.ct){const s=this.xt??globalThis;let i=os.get(s);void 0===i&&(i=new WeakMap,os.set(s,i)),void 0!==i.get(this.ct)&&this.ct.call(this.xt,void 0),i.set(this.ct,t),void 0!==t&&this.ct.call(this.xt,t)}else this.ct.value=t}get $t(){return"function"==typeof this.ct?os.get(this.xt??globalThis)?.get(this.ct):this.ct?.value}disconnected(){this.$t===this.Tt&&this.St(void 0)}reconnected(){this.St(this.Tt)}}),cs=(t,s,i)=>{const e=new Map;for(let n=s;n<=i;n++)e.set(t[n],n);return e},ls=Ut(class extends Vt{constructor(t){if(super(t),2!==t.type)throw Error("repeat() can only be used in text expressions")}Et(t,s,i){let e;void 0===i?i=s:void 0!==s&&(e=s);const n=[],r=[];let o=0;for(const s of t)n[o]=e?e(s,o):o,r[o]=i(s,o),o++;return{values:r,keys:n}}render(t,s,i){return this.Et(t,s,i).values}update(t,[s,i,e]){const n=Pt(t),{values:r,keys:o}=this.Et(s,i,e);if(!Array.isArray(n))return this.Ct=o,r;const h=this.Ct??=[],c=[];let l,a,u=0,d=n.length-1,f=0,p=r.length-1;for(;u<=d&&f<=p;)if(null===n[u])u++;else if(null===n[d])d--;else if(h[u]===o[f])c[f]=xt(n[u],r[f]),u++,f++;else if(h[d]===o[p])c[p]=xt(n[d],r[p]),d--,p--;else if(h[u]===o[p])c[p]=xt(n[u],r[p]),Tt(t,c[p+1],n[u]),u++,p--;else if(h[d]===o[f])c[f]=xt(n[d],r[f]),Tt(t,n[u],n[d]),d--,f++;else if(void 0===l&&(l=cs(o,f,p),a=cs(h,u,d)),l.has(h[u]))if(l.has(h[d])){const s=a.get(o[f]),i=void 0!==s?n[s]:null;if(null===i){const s=Tt(t,n[u]);xt(s,r[f]),c[f]=s}else c[f]=xt(i,r[f]),Tt(t,n[u],i),n[s]=null;f++}else At(n[d]),d--;else At(n[u]),u++;for(;f<=p;){const s=Tt(t,c[p+1]);xt(s,r[f]),c[f++]=s}for(;u<=d;){const t=n[u++];null!==t&&At(t)}return this.Ct=o,Ct(t,c),F}}),as="important",us=" !"+as,ds=Ut(class extends Vt{constructor(t){if(super(t),1!==t.type||"style"!==t.name||t.strings?.length>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(t){return Object.keys(t).reduce(((s,i)=>{const e=t[i];return null==e?s:s+`${i=i.includes("-")?i:i.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${e};`}),"")}update(t,[s]){const{style:i}=t.element;if(void 0===this.Pt)return this.Pt=new Set(Object.keys(s)),this.render(s);for(const t of this.Pt)null==s[t]&&(this.Pt.delete(t),t.includes("-")?i.removeProperty(t):i[t]=null);for(const t in s){const e=s[t];if(null!=e){this.Pt.add(t);const s="string"==typeof e&&e.endsWith(us);t.includes("-")||s?i.setProperty(t,s?e.slice(0,-11):e,s?as:""):i[t]=e}}return F}}),fs=Ut(
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */
-class extends Vt{constructor(t){if(super(t),2!==t.type)throw Error("templateContent can only be used in child bindings")}render(t){return this.At===t?F:(this.At=t,document.importNode(t.content,!0))}});class ps extends Vt{constructor(t){if(super(t),this.bt=G,2!==t.type)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===G||null==t)return this.kt=void 0,this.bt=t;if(t===F)return t;if("string"!=typeof t)throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.bt)return this.kt;this.bt=t;const s=[t];return s.raw=s,this.kt={_$litType$:this.constructor.resultType,strings:s,values:[]}}}ps.directiveName="unsafeHTML",ps.resultType=1;const vs=Ut(ps);
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */class ys extends ps{}ys.directiveName="unsafeSVG",ys.resultType=2;const ms=Ut(ys),bs=t=>!yt(t)&&"function"==typeof t.then,gs=1073741823;
-/**
- * @license
- * Copyright 2017 Google LLC
- * SPDX-License-Identifier: BSD-3-Clause
- */class ws extends Ht{constructor(){super(...arguments),this.Mt=gs,this.Ut=[],this.dt=new It(this),this.ft=new Dt}render(...t){return t.find((t=>!bs(t)))??F}update(t,s){const i=this.Ut;let e=i.length;this.Ut=s;const n=this.dt,r=this.ft;this.isConnected||this.disconnected();for(let t=0;tthis.Mt);t++){const o=s[t];if(!bs(o))return this.Mt=t,o;t{for(;r.get();)await r.get();const s=n.deref();if(void 0!==s){const i=s.Ut.indexOf(o);i>-1&&i{if(t?.r===$s)return t?._$litStatic$},xs=t=>({_$litStatic$:t,r:$s}),Es=(t,...s)=>({_$litStatic$:s.reduce(((s,i,e)=>s+(t=>{if(void 0!==t._$litStatic$)return t._$litStatic$;throw Error(`Value passed to 'literal' function must be a 'literal' result: ${t}. Use 'unsafeStatic' to pass non-literal values, but\n take care to ensure page security.`)})(i)+t[e+1]),t[0]),r:$s}),Cs=new Map,Ps=t=>(s,...i)=>{const e=i.length;let n,r;const o=[],h=[];let c,l=0,a=!1;for(;l;\n\n/**\n * A single CSSResult, CSSStyleSheet, or an array or nested arrays of those.\n */\nexport type CSSResultGroup = CSSResultOrNative | CSSResultArray;\n\nconst constructionToken = Symbol();\n\nconst cssTagCache = new WeakMap();\n\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n // This property needs to remain unminified.\n ['_$cssResult$'] = true;\n readonly cssText: string;\n private _styleSheet?: CSSStyleSheet;\n private _strings: TemplateStringsArray | undefined;\n\n private constructor(\n cssText: string,\n strings: TemplateStringsArray | undefined,\n safeToken: symbol\n ) {\n if (safeToken !== constructionToken) {\n throw new Error(\n 'CSSResult is not constructable. Use `unsafeCSS` or `css` instead.'\n );\n }\n this.cssText = cssText;\n this._strings = strings;\n }\n\n // This is a getter so that it's lazy. In practice, this means stylesheets\n // are not created until the first element instance is made.\n get styleSheet(): CSSStyleSheet | undefined {\n // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n // constructable.\n let styleSheet = this._styleSheet;\n const strings = this._strings;\n if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n const cacheable = strings !== undefined && strings.length === 1;\n if (cacheable) {\n styleSheet = cssTagCache.get(strings);\n }\n if (styleSheet === undefined) {\n (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(\n this.cssText\n );\n if (cacheable) {\n cssTagCache.set(strings, styleSheet);\n }\n }\n }\n return styleSheet;\n }\n\n toString(): string {\n return this.cssText;\n }\n}\n\ntype ConstructableCSSResult = CSSResult & {\n new (\n cssText: string,\n strings: TemplateStringsArray | undefined,\n safeToken: symbol\n ): CSSResult;\n};\n\nconst textFromCSSResult = (value: CSSResultGroup | number) => {\n // This property needs to remain unminified.\n if ((value as CSSResult)['_$cssResult$'] === true) {\n return (value as CSSResult).cssText;\n } else if (typeof value === 'number') {\n return value;\n } else {\n throw new Error(\n `Value passed to 'css' function must be a 'css' function result: ` +\n `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n `to ensure page security.`\n );\n }\n};\n\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value: unknown) =>\n new (CSSResult as ConstructableCSSResult)(\n typeof value === 'string' ? value : String(value),\n undefined,\n constructionToken\n );\n\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (\n strings: TemplateStringsArray,\n ...values: (CSSResultGroup | number)[]\n): CSSResult => {\n const cssText =\n strings.length === 1\n ? strings[0]\n : values.reduce(\n (acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1],\n strings[0]\n );\n return new (CSSResult as ConstructableCSSResult)(\n cssText,\n strings,\n constructionToken\n );\n};\n\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (\n renderRoot: ShadowRoot,\n styles: Array\n) => {\n if (supportsAdoptingStyleSheets) {\n (renderRoot as ShadowRoot).adoptedStyleSheets = styles.map((s) =>\n s instanceof CSSStyleSheet ? s : s.styleSheet!\n );\n } else {\n for (const s of styles) {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = (global as any)['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = (s as CSSResult).cssText;\n renderRoot.appendChild(style);\n }\n }\n};\n\nconst cssResultFromStyleSheet = (sheet: CSSStyleSheet) => {\n let cssText = '';\n for (const rule of sheet.cssRules) {\n cssText += rule.cssText;\n }\n return unsafeCSS(cssText);\n};\n\nexport const getCompatibleStyle =\n supportsAdoptingStyleSheets ||\n (NODE_MODE && global.CSSStyleSheet === undefined)\n ? (s: CSSResultOrNative) => s\n : (s: CSSResultOrNative) =>\n s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\n\nimport {\n getCompatibleStyle,\n adoptStyles,\n CSSResultGroup,\n CSSResultOrNative,\n} from './css-tag.js';\nimport type {\n ReactiveController,\n ReactiveControllerHost,\n} from './reactive-controller.js';\n\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\n\nexport * from './css-tag.js';\nexport type {\n ReactiveController,\n ReactiveControllerHost,\n} from './reactive-controller.js';\n\n/**\n * Removes the `readonly` modifier from properties in the union K.\n *\n * This is a safer way to cast a value to a type with a mutable version of a\n * readonly field, than casting to an interface with the field re-declared\n * because it preserves the type of all the fields and warns on typos.\n */\ntype Mutable = Omit & {\n -readonly [P in keyof Pick]: P extends K ? T[P] : never;\n};\n\n// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022\nconst {\n is,\n defineProperty,\n getOwnPropertyDescriptor,\n getOwnPropertyNames,\n getOwnPropertySymbols,\n getPrototypeOf,\n} = Object;\n\nconst NODE_MODE = false;\n\n// Lets a minifier replace globalThis references with a minified name\nconst global = globalThis;\n\nif (NODE_MODE) {\n global.customElements ??= customElements;\n}\n\nconst DEV_MODE = true;\n\nlet issueWarning: (code: string, warning: string) => void;\n\nconst trustedTypes = (global as unknown as {trustedTypes?: {emptyScript: ''}})\n .trustedTypes;\n\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n ? (trustedTypes.emptyScript as unknown as '')\n : '';\n\nconst polyfillSupport = DEV_MODE\n ? global.reactiveElementPolyfillSupportDevMode\n : global.reactiveElementPolyfillSupport;\n\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings: Set = (global.litIssuedWarnings ??=\n new Set());\n\n // Issue a warning, if we haven't already.\n issueWarning = (code: string, warning: string) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n\n issueWarning(\n 'dev-mode',\n `Lit is in dev mode. Not recommended for production!`\n );\n\n // Issue polyfill support warning.\n if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n issueWarning(\n 'polyfill-support-missing',\n `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n `the \\`polyfill-support\\` module has not been loaded.`\n );\n }\n}\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ReactiveUnstable {\n /**\n * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n * we will emit 'lit-debug' events to window, with live details about the update and render\n * lifecycle. These can be useful for writing debug tooling and visualizations.\n *\n * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n * making certain operations that are normally very cheap (like a no-op render) much slower,\n * because we must copy data and dispatch events.\n */\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace DebugLog {\n export type Entry = Update;\n export interface Update {\n kind: 'update';\n }\n }\n}\n\ninterface DebugLoggingWindow {\n // Even in dev mode, we generally don't want to emit these events, as that's\n // another level of cost, so only emit them when DEV_MODE is true _and_ when\n // window.emitLitDebugEvents is true.\n emitLitDebugLogEvents?: boolean;\n}\n\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event: ReactiveUnstable.DebugLog.Entry) => {\n const shouldEmit = (global as unknown as DebugLoggingWindow)\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(\n new CustomEvent('lit-debug', {\n detail: event,\n })\n );\n }\n : undefined;\n\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = (\n prop: P,\n _obj: unknown\n): P => prop;\n\n/**\n * Converts property values to and from attribute values.\n */\nexport interface ComplexAttributeConverter {\n /**\n * Called to convert an attribute value to a property\n * value.\n */\n fromAttribute?(value: string | null, type?: TypeHint): Type;\n\n /**\n * Called to convert a property value to an attribute\n * value.\n *\n * It returns unknown instead of string, to be compatible with\n * https://github.com/WICG/trusted-types (and similar efforts).\n */\n toAttribute?(value: Type, type?: TypeHint): unknown;\n}\n\ntype AttributeConverter =\n | ComplexAttributeConverter\n | ((value: string | null, type?: TypeHint) => Type);\n\n/**\n * Defines options for a property accessor.\n */\nexport interface PropertyDeclaration {\n /**\n * When set to `true`, indicates the property is internal private state. The\n * property should not be set by users. When using TypeScript, this property\n * should be marked as `private` or `protected`, and it is also a common\n * practice to use a leading `_` in the name. The property is not added to\n * `observedAttributes`.\n */\n readonly state?: boolean;\n\n /**\n * Indicates how and whether the property becomes an observed attribute.\n * If the value is `false`, the property is not added to `observedAttributes`.\n * If true or absent, the lowercased property name is observed (e.g. `fooBar`\n * becomes `foobar`). If a string, the string value is observed (e.g\n * `attribute: 'foo-bar'`).\n */\n readonly attribute?: boolean | string;\n\n /**\n * Indicates the type of the property. This is used only as a hint for the\n * `converter` to determine how to convert the attribute\n * to/from a property.\n */\n readonly type?: TypeHint;\n\n /**\n * Indicates how to convert the attribute to/from a property. If this value\n * is a function, it is used to convert the attribute value a the property\n * value. If it's an object, it can have keys for `fromAttribute` and\n * `toAttribute`. If no `toAttribute` function is provided and\n * `reflect` is set to `true`, the property value is set directly to the\n * attribute. A default `converter` is used if none is provided; it supports\n * `Boolean`, `String`, `Number`, `Object`, and `Array`. Note,\n * when a property changes and the converter is used to update the attribute,\n * the property is never updated again as a result of the attribute changing,\n * and vice versa.\n */\n readonly converter?: AttributeConverter;\n\n /**\n * Indicates if the property should reflect to an attribute.\n * If `true`, when the property is set, the attribute is set using the\n * attribute name determined according to the rules for the `attribute`\n * property option and the value of the property converted using the rules\n * from the `converter` property option.\n */\n readonly reflect?: boolean;\n\n /**\n * A function that indicates if a property should be considered changed when\n * it is set. The function should take the `newValue` and `oldValue` and\n * return `true` if an update should be requested.\n */\n hasChanged?(value: Type, oldValue: Type): boolean;\n\n /**\n * Indicates whether an accessor will be created for this property. By\n * default, an accessor will be generated for this property that requests an\n * update when set. If this flag is `true`, no accessor will be created, and\n * it will be the user's responsibility to call\n * `this.requestUpdate(propertyName, oldValue)` to request an update when\n * the property changes.\n */\n readonly noAccessor?: boolean;\n\n /**\n * Whether this property is wrapping accessors. This is set by `@property`\n * to control the initial value change and reflection logic.\n *\n * @internal\n */\n wrapped?: boolean;\n}\n\n/**\n * Map of properties to PropertyDeclaration options. For each property an\n * accessor is made, and the property is processed according to the\n * PropertyDeclaration options.\n */\nexport interface PropertyDeclarations {\n readonly [key: string]: PropertyDeclaration;\n}\n\ntype PropertyDeclarationMap = Map;\n\ntype AttributeMap = Map;\n\n/**\n * A Map of property keys to values.\n *\n * Takes an optional type parameter T, which when specified as a non-any,\n * non-unknown type, will make the Map more strongly-typed, associating the map\n * keys with their corresponding value type on T.\n *\n * Use `PropertyValues` when overriding ReactiveElement.update() and\n * other lifecycle methods in order to get stronger type-checking on keys\n * and values.\n */\n// This type is conditional so that if the parameter T is not specified, or\n// is `any`, the type will include `Map`. Since T is not\n// given in the uses of PropertyValues in this file, all uses here fallback to\n// meaning `Map`, but if a developer uses\n// `PropertyValues` (or any other value for T) they will get a\n// strongly-typed Map type.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PropertyValues = T extends object\n ? PropertyValueMap\n : Map;\n\n/**\n * Do not use, instead prefer {@linkcode PropertyValues}.\n */\n// This type must be exported such that JavaScript generated by the Google\n// Closure Compiler can import a type reference.\nexport interface PropertyValueMap extends Map {\n get(k: K): T[K] | undefined;\n set(key: K, value: T[K]): this;\n has(k: K): boolean;\n delete(k: K): boolean;\n}\n\nexport const defaultConverter: ComplexAttributeConverter = {\n toAttribute(value: unknown, type?: unknown): unknown {\n switch (type) {\n case Boolean:\n value = value ? emptyStringForBooleanAttribute : null;\n break;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n value = value == null ? value : JSON.stringify(value);\n break;\n }\n return value;\n },\n\n fromAttribute(value: string | null, type?: unknown) {\n let fromValue: unknown = value;\n switch (type) {\n case Boolean:\n fromValue = value !== null;\n break;\n case Number:\n fromValue = value === null ? null : Number(value);\n break;\n case Object:\n case Array:\n // Do *not* generate exception when invalid JSON is set as elements\n // don't normally complain on being mis-configured.\n // TODO(sorvell): Do generate exception in *dev mode*.\n try {\n // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n fromValue = JSON.parse(value!) as unknown;\n } catch (e) {\n fromValue = null;\n }\n break;\n }\n return fromValue;\n },\n};\n\nexport interface HasChanged {\n (value: unknown, old: unknown): boolean;\n}\n\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual: HasChanged = (value: unknown, old: unknown): boolean =>\n !is(value, old);\n\nconst defaultPropertyDeclaration: PropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n\n/**\n * A string representing one of the supported dev mode warning categories.\n */\nexport type WarningKind =\n | 'change-in-update'\n | 'migration'\n | 'async-perform-update';\n\nexport type Initializer = (element: ReactiveElement) => void;\n\n// Temporary, until google3 is on TypeScript 5.2\ndeclare global {\n interface SymbolConstructor {\n readonly metadata: unique symbol;\n }\n}\n\n// Ensure metadata is enabled. TypeScript does not polyfill\n// Symbol.metadata, so we must ensure that it exists.\n(Symbol as {metadata: symbol}).metadata ??= Symbol('metadata');\n\ndeclare global {\n // This is public global API, do not change!\n // eslint-disable-next-line no-var\n var litPropertyMetadata: WeakMap<\n object,\n Map\n >;\n}\n\n// Map from a class's metadata object to property options\n// Note that we must use nullish-coalescing assignment so that we only use one\n// map even if we load multiple version of this module.\nglobal.litPropertyMetadata ??= new WeakMap<\n object,\n Map\n>();\n\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclasses to render updates as desired.\n * @noInheritDoc\n */\nexport abstract class ReactiveElement\n // In the Node build, this `extends` clause will be substituted with\n // `(globalThis.HTMLElement ?? HTMLElement)`.\n //\n // This way, we will first prefer any global `HTMLElement` polyfill that the\n // user has assigned, and then fall back to the `HTMLElement` shim which has\n // been imported (see note at the top of this file about how this import is\n // generated by Rollup). Note that the `HTMLElement` variable has been\n // shadowed by this import, so it no longer refers to the global.\n extends HTMLElement\n implements ReactiveControllerHost\n{\n // Note: these are patched in only in DEV_MODE.\n /**\n * Read or set all the enabled warning categories for this class.\n *\n * This property is only used in development builds.\n *\n * @nocollapse\n * @category dev-mode\n */\n static enabledWarnings?: WarningKind[];\n\n /**\n * Enable the given warning category for this class.\n *\n * This method only exists in development builds, so it should be accessed\n * with a guard like:\n *\n * ```ts\n * // Enable for all ReactiveElement subclasses\n * ReactiveElement.enableWarning?.('migration');\n *\n * // Enable for only MyElement and subclasses\n * MyElement.enableWarning?.('migration');\n * ```\n *\n * @nocollapse\n * @category dev-mode\n */\n static enableWarning?: (warningKind: WarningKind) => void;\n\n /**\n * Disable the given warning category for this class.\n *\n * This method only exists in development builds, so it should be accessed\n * with a guard like:\n *\n * ```ts\n * // Disable for all ReactiveElement subclasses\n * ReactiveElement.disableWarning?.('migration');\n *\n * // Disable for only MyElement and subclasses\n * MyElement.disableWarning?.('migration');\n * ```\n *\n * @nocollapse\n * @category dev-mode\n */\n static disableWarning?: (warningKind: WarningKind) => void;\n\n /**\n * Adds an initializer function to the class that is called during instance\n * construction.\n *\n * This is useful for code that runs against a `ReactiveElement`\n * subclass, such as a decorator, that needs to do work for each\n * instance, such as setting up a `ReactiveController`.\n *\n * ```ts\n * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n * target.addInitializer((instance: ReactiveElement) => {\n * // This is run during construction of the element\n * new MyController(instance);\n * });\n * }\n * ```\n *\n * Decorating a field will then cause each instance to run an initializer\n * that adds a controller:\n *\n * ```ts\n * class MyElement extends LitElement {\n * @myDecorator foo;\n * }\n * ```\n *\n * Initializers are stored per-constructor. Adding an initializer to a\n * subclass does not add it to a superclass. Since initializers are run in\n * constructors, initializers will run in order of the class hierarchy,\n * starting with superclasses and progressing to the instance's class.\n *\n * @nocollapse\n */\n static addInitializer(initializer: Initializer) {\n this.__prepare();\n (this._initializers ??= []).push(initializer);\n }\n\n static _initializers?: Initializer[];\n\n /*\n * Due to closure compiler ES6 compilation bugs, @nocollapse is required on\n * all static methods and properties with initializers. Reference:\n * - https://github.com/google/closure-compiler/issues/1776\n */\n\n /**\n * Maps attribute names to properties; for example `foobar` attribute to\n * `fooBar` property. Created lazily on user subclasses when finalizing the\n * class.\n * @nocollapse\n */\n private static __attributeToPropertyMap: AttributeMap;\n\n /**\n * Marks class as having been finalized, which includes creating properties\n * from `static properties`, but does *not* include all properties created\n * from decorators.\n * @nocollapse\n */\n protected static finalized: true | undefined;\n\n /**\n * Memoized list of all element properties, including any superclass\n * properties. Created lazily on user subclasses when finalizing the class.\n *\n * @nocollapse\n * @category properties\n */\n static elementProperties: PropertyDeclarationMap;\n\n /**\n * User-supplied object that maps property names to `PropertyDeclaration`\n * objects containing options for configuring reactive properties. When\n * a reactive property is set the element will update and render.\n *\n * By default properties are public fields, and as such, they should be\n * considered as primarily settable by element users, either via attribute or\n * the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the `state: true` option. Properties\n * marked as `state` do not reflect from the corresponding attribute\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating\n * public properties should typically not be done for non-primitive (object or\n * array) properties. In other cases when an element needs to manage state, a\n * private property set with the `state: true` option should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n * @nocollapse\n * @category properties\n */\n static properties: PropertyDeclarations;\n\n /**\n * Memoized list of all element styles.\n * Created lazily on user subclasses when finalizing the class.\n * @nocollapse\n * @category styles\n */\n static elementStyles: Array = [];\n\n /**\n * Array of styles to apply to the element. The styles should be defined\n * using the {@linkcode css} tag function, via constructible stylesheets, or\n * imported from native CSS module scripts.\n *\n * Note on Content Security Policy:\n *\n * Element styles are implemented with `
-
- (this.tab = 'map')} value="๐บ๏ธMap">
- (this.tab = 'news')} value="๐News">
- (this.tab = 'friends')} value="๐ซFriends">
- (this.tab = 'store')} value="๐๏ธStore">
-
- `;
-
- let content;
- switch (this.tab) {
- case 'map':
- content = html``;
- break;
- case 'news':
- content = this.render_news();
- break;
- case 'friends':
- content = html`Friends
`;
- break;
- case 'store':
- content = this.render_store();
- break;
- }
-
- return html`
-
-
-
- ${header}
-
${content}
- ${navigation}
-
- `;
- }
-}
-customElements.define('gg-app', GgAppElement);
diff --git a/apps/gg/strava.js b/apps/gg/strava.js
deleted file mode 100644
index 3955e403..00000000
--- a/apps/gg/strava.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const k_client_id = '28276';
-const k_client_secret = '3123f1f5afe132d9731111066d1d17bdb22ef27e';
-const k_access_token = 'f753e77764c26252bd2d80e7c5cc17ace51a8864';
-const k_refresh_token = 'f58d8e1b5a3ec3bf96e681589d5014f9a294f5a4';
-const k_redirect_url = 'https://tildefriends.net/~cory/gg/login';
-
-export async function refresh_token(token) {
- let r = await fetch('https://www.strava.com/api/v3/oauth/token', {
- method: 'POST',
- body: `client_id=${k_client_id}&client_secret=${k_client_secret}&refresh_token=${token.refresh_token}&grant_type=refresh_token`,
- });
- return r?.body ? JSON.parse(utf8Decode(r.body)) : undefined;
-}
-
-export async function authorization_code(code) {
- return await fetch('https://www.strava.com/api/v3/oauth/token', {
- method: 'POST',
- body: `client_id=${k_client_id}&client_secret=${k_client_secret}&code=${code}&grant_type=authorization_code`,
- });
-}