From fc13e62f787cf96e182c9c4b2d85d486fe661cb2 Mon Sep 17 00:00:00 2001 From: pfych Date: Fri, 12 Sep 2025 20:41:45 +1000 Subject: [PATCH] Added all old scripts and stylesheets --- REWRITE_CHECKLIST.md | 24 +- .../site/assets/scripts/old/azur/azur.tsx | 16 + .../assets/scripts/old/azur/ship-data.http | 15 + .../site/assets/scripts/old/azur/ship-data.ts | 7048 +++++++++++++++++ packages/site/assets/scripts/old/bluesky.tsx | 113 + .../old/canvas-scratch/canvas-scratch.ts | 196 + .../assets/scripts/old/cat-count/assets/0.gif | Bin 0 -> 10337 bytes .../assets/scripts/old/cat-count/assets/1.gif | Bin 0 -> 6700 bytes .../assets/scripts/old/cat-count/assets/2.gif | Bin 0 -> 7060 bytes .../assets/scripts/old/cat-count/assets/3.gif | Bin 0 -> 10990 bytes .../assets/scripts/old/cat-count/assets/4.gif | Bin 0 -> 9918 bytes .../assets/scripts/old/cat-count/assets/5.gif | Bin 0 -> 9493 bytes .../assets/scripts/old/cat-count/assets/6.gif | Bin 0 -> 8464 bytes .../assets/scripts/old/cat-count/assets/7.gif | Bin 0 -> 8273 bytes .../assets/scripts/old/cat-count/assets/8.gif | Bin 0 -> 1347 bytes .../assets/scripts/old/cat-count/assets/9.gif | Bin 0 -> 5139 bytes .../assets/scripts/old/cat-count/cat-count.ts | 37 + .../site/assets/scripts/old/colour-mode.ts | 69 + .../assets/scripts/old/elements/element.ts | 37 + .../assets/scripts/old/elements/inputs.ts | 52 + .../site/assets/scripts/old/elements/state.ts | 9 + .../site/assets/scripts/old/external/count.js | 254 + .../assets/scripts/old/external/pako.min.js | 2 + .../site/assets/scripts/old/external/prism.js | 9 + .../site/assets/scripts/old/gallery-images.ts | 36 + packages/site/assets/scripts/old/games.ts | 113 + .../site/assets/scripts/old/import-goat.ts | 12 + .../site/assets/scripts/old/installation.ts | 257 + packages/site/assets/scripts/old/jsx.ts | 10 + .../site/assets/scripts/old/lastfm/auth.tsx | 84 + .../site/assets/scripts/old/lastfm/lastfm.ts | 28 + .../scripts/old/lastfm/scrobble-file.tsx | 124 + .../assets/scripts/old/lastfm/scrobbler.tsx | 19 + packages/site/assets/scripts/old/local-dev.ts | 44 + .../scripts/old/mahjong/parseHandString.ts | 48 + .../assets/scripts/old/mahjong/renderTiles.ts | 83 + .../assets/scripts/old/mahjong/scoring.ts | 312 + .../site/assets/scripts/old/mahjong/types.ts | 88 + .../site/assets/scripts/old/mahjong/utils.ts | 174 + .../assets/scripts/old/manual-updated.tsx | 61 + .../site/assets/scripts/old/mpszmahjong.ts | 54 + packages/site/assets/scripts/old/music.tsx | 98 + packages/site/assets/scripts/old/no-script.ts | 12 + .../site/assets/scripts/old/post-images.ts | 28 + .../site/assets/scripts/old/recent-posts.tsx | 137 + .../scripts/old/sandbox/create-nav-buttons.ts | 42 + .../scripts/old/sandbox/element-selectors.ts | 20 + .../scripts/old/sandbox/input-handlers.ts | 102 + .../scripts/old/sandbox/sandbox-utils.ts | 177 + .../assets/scripts/old/sandbox/sandbox.ts | 17 + packages/site/assets/scripts/old/script.ts | 41 + .../assets/scripts/old/setup-bar-graphs.ts | 66 + .../site/assets/scripts/old/setup-header.ts | 29 + .../site/assets/scripts/old/setup-mathjax.ts | 28 + .../scripts/old/setup-mermaid-diagrams.ts | 33 + .../site/assets/scripts/old/setup-tables.ts | 21 + .../site/assets/scripts/old/spreadsheet.ts | 165 + packages/site/assets/scripts/old/stripe.tsx | 95 + .../assets/scripts/old/sync-animations.ts | 3 + packages/site/assets/scripts/old/uptime.tsx | 54 + .../scripts/old/user-scripts/gitadora.user.js | 330 + packages/site/assets/scripts/old/utils.tsx | 265 + .../site/assets/scripts/old/webmentions.tsx | 35 + packages/site/assets/scripts/script.ts | 0 packages/site/assets/styles/old/_var.scss | 23 + .../site/assets/styles/old/base-images.scss | 65 + .../site/assets/styles/old/base-layout.scss | 514 ++ .../assets/styles/old/base-typeography.scss | 409 + packages/site/assets/styles/old/base.scss | 3 + packages/site/assets/styles/old/bluesky.scss | 52 + .../site/assets/styles/old/cat-count.scss | 7 + packages/site/assets/styles/old/gallery.scss | 18 + packages/site/assets/styles/old/graphs.scss | 136 + packages/site/assets/styles/old/iidx.scss | 358 + .../site/assets/styles/old/installation.scss | 62 + packages/site/assets/styles/old/mahjong.scss | 62 + packages/site/assets/styles/old/media.scss | 103 + packages/site/assets/styles/old/mermaid.scss | 91 + packages/site/assets/styles/old/prism.css | 3 + packages/site/assets/styles/old/sandbox.scss | 219 + packages/site/assets/styles/old/style.scss | 11 + packages/site/assets/styles/old/uptime.scss | 27 + packages/site/assets/styles/style.scss | 17 - packages/site/build/config.ts | 1 + packages/site/build/index.ts | 8 +- packages/site/build/steps/pages/pages.ts | 19 + .../build/steps/posts/create-post-object.ts | 2 +- packages/site/build/steps/scripts/scripts.ts | 5 +- packages/site/build/steps/styles/styles.ts | 2 +- packages/site/build/templates/post.hbs | 93 +- .../site/build/utils/create-script-path.ts | 2 +- packages/site/package.json | 3 +- packages/site/pages/index.html | 179 + packages/site/pages/sandbox.html | 84 + packages/site/posts/donate.md | 6 +- packages/site/posts/games/azur-lane.md | 6 +- .../games/crimson-clover-world-explosion.md | 4 +- packages/site/posts/games/deathsmiles.md | 4 +- packages/site/posts/games/dodonpachi.md | 4 +- packages/site/posts/games/games.md | 21 +- .../posts/games/iidx/iidx-retrospective.md | 4 +- .../site/posts/games/iidx/price-credits.md | 99 +- .../site/posts/games/mahjong/calculator.md | 6 +- packages/site/posts/games/mahjong/mahjong.md | 2 +- .../site/posts/games/mahjong/player-guide.md | 6 +- .../posts/games/mahjong/scoring-calculator.md | 6 +- .../posts/games/psyvariar-2-ultimate-final.md | 4 +- .../posts/games/touhou/mountain-of-faith.md | 4 +- packages/site/posts/music/music.md | 17 +- packages/site/posts/music/scrobbler.md | 6 +- .../site/posts/photography/installation.md | 2 +- .../site/posts/programming/4k-sunshine.md | 4 +- .../site/posts/programming/jsx-clientside.md | 6 +- .../posts/programming/projects/bms-ipfs.md | 2 +- .../posts/programming/projects/bms-sow.md | 4 +- .../programming/projects/mpsz-rendering.md | 6 +- .../posts/programming/projects/webmentions.md | 4 +- .../posts/programming/serverless-please.md | 4 +- packages/site/posts/programming/stripe.md | 6 +- packages/site/posts/uptime.md | 6 +- packages/site/tsconfig.json | 3 - pnpm-lock.yaml | 8 + tsconfig.json | 4 +- 123 files changed, 13910 insertions(+), 152 deletions(-) create mode 100644 packages/site/assets/scripts/old/azur/azur.tsx create mode 100644 packages/site/assets/scripts/old/azur/ship-data.http create mode 100644 packages/site/assets/scripts/old/azur/ship-data.ts create mode 100644 packages/site/assets/scripts/old/bluesky.tsx create mode 100644 packages/site/assets/scripts/old/canvas-scratch/canvas-scratch.ts create mode 100644 packages/site/assets/scripts/old/cat-count/assets/0.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/1.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/2.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/3.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/4.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/5.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/6.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/7.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/8.gif create mode 100644 packages/site/assets/scripts/old/cat-count/assets/9.gif create mode 100644 packages/site/assets/scripts/old/cat-count/cat-count.ts create mode 100644 packages/site/assets/scripts/old/colour-mode.ts create mode 100644 packages/site/assets/scripts/old/elements/element.ts create mode 100644 packages/site/assets/scripts/old/elements/inputs.ts create mode 100644 packages/site/assets/scripts/old/elements/state.ts create mode 100644 packages/site/assets/scripts/old/external/count.js create mode 100644 packages/site/assets/scripts/old/external/pako.min.js create mode 100644 packages/site/assets/scripts/old/external/prism.js create mode 100644 packages/site/assets/scripts/old/gallery-images.ts create mode 100644 packages/site/assets/scripts/old/games.ts create mode 100644 packages/site/assets/scripts/old/import-goat.ts create mode 100644 packages/site/assets/scripts/old/installation.ts create mode 100644 packages/site/assets/scripts/old/jsx.ts create mode 100644 packages/site/assets/scripts/old/lastfm/auth.tsx create mode 100644 packages/site/assets/scripts/old/lastfm/lastfm.ts create mode 100644 packages/site/assets/scripts/old/lastfm/scrobble-file.tsx create mode 100644 packages/site/assets/scripts/old/lastfm/scrobbler.tsx create mode 100644 packages/site/assets/scripts/old/local-dev.ts create mode 100644 packages/site/assets/scripts/old/mahjong/parseHandString.ts create mode 100644 packages/site/assets/scripts/old/mahjong/renderTiles.ts create mode 100644 packages/site/assets/scripts/old/mahjong/scoring.ts create mode 100644 packages/site/assets/scripts/old/mahjong/types.ts create mode 100644 packages/site/assets/scripts/old/mahjong/utils.ts create mode 100644 packages/site/assets/scripts/old/manual-updated.tsx create mode 100644 packages/site/assets/scripts/old/mpszmahjong.ts create mode 100644 packages/site/assets/scripts/old/music.tsx create mode 100644 packages/site/assets/scripts/old/no-script.ts create mode 100644 packages/site/assets/scripts/old/post-images.ts create mode 100644 packages/site/assets/scripts/old/recent-posts.tsx create mode 100644 packages/site/assets/scripts/old/sandbox/create-nav-buttons.ts create mode 100644 packages/site/assets/scripts/old/sandbox/element-selectors.ts create mode 100644 packages/site/assets/scripts/old/sandbox/input-handlers.ts create mode 100644 packages/site/assets/scripts/old/sandbox/sandbox-utils.ts create mode 100644 packages/site/assets/scripts/old/sandbox/sandbox.ts create mode 100644 packages/site/assets/scripts/old/script.ts create mode 100644 packages/site/assets/scripts/old/setup-bar-graphs.ts create mode 100644 packages/site/assets/scripts/old/setup-header.ts create mode 100644 packages/site/assets/scripts/old/setup-mathjax.ts create mode 100644 packages/site/assets/scripts/old/setup-mermaid-diagrams.ts create mode 100644 packages/site/assets/scripts/old/setup-tables.ts create mode 100644 packages/site/assets/scripts/old/spreadsheet.ts create mode 100644 packages/site/assets/scripts/old/stripe.tsx create mode 100644 packages/site/assets/scripts/old/sync-animations.ts create mode 100644 packages/site/assets/scripts/old/uptime.tsx create mode 100644 packages/site/assets/scripts/old/user-scripts/gitadora.user.js create mode 100644 packages/site/assets/scripts/old/utils.tsx create mode 100644 packages/site/assets/scripts/old/webmentions.tsx delete mode 100644 packages/site/assets/scripts/script.ts create mode 100644 packages/site/assets/styles/old/_var.scss create mode 100644 packages/site/assets/styles/old/base-images.scss create mode 100644 packages/site/assets/styles/old/base-layout.scss create mode 100644 packages/site/assets/styles/old/base-typeography.scss create mode 100644 packages/site/assets/styles/old/base.scss create mode 100644 packages/site/assets/styles/old/bluesky.scss create mode 100644 packages/site/assets/styles/old/cat-count.scss create mode 100644 packages/site/assets/styles/old/gallery.scss create mode 100644 packages/site/assets/styles/old/graphs.scss create mode 100644 packages/site/assets/styles/old/iidx.scss create mode 100644 packages/site/assets/styles/old/installation.scss create mode 100644 packages/site/assets/styles/old/mahjong.scss create mode 100644 packages/site/assets/styles/old/media.scss create mode 100644 packages/site/assets/styles/old/mermaid.scss create mode 100644 packages/site/assets/styles/old/prism.css create mode 100644 packages/site/assets/styles/old/sandbox.scss create mode 100644 packages/site/assets/styles/old/style.scss create mode 100644 packages/site/assets/styles/old/uptime.scss delete mode 100644 packages/site/assets/styles/style.scss create mode 100644 packages/site/build/steps/pages/pages.ts create mode 100644 packages/site/pages/index.html create mode 100644 packages/site/pages/sandbox.html diff --git a/REWRITE_CHECKLIST.md b/REWRITE_CHECKLIST.md index 71739df..5bbdac1 100644 --- a/REWRITE_CHECKLIST.md +++ b/REWRITE_CHECKLIST.md @@ -5,9 +5,21 @@ Complete list of components needed for 1:1 functionality with the original site. ## Implementation Priority - [x] Get posts rendering -- [ ] Get related scripts compiling & importing -- [ ] Get related stylesheets compiling & importing +- [x] Get related scripts compiling & importing +- [x] Get related stylesheets compiling & importing +- [ ] Migrate Old Content + - [x] Old Scripts + - [x] Old Stylesheets + - [ ] Sandbox +- [ ] Recreate build-time scripts + - [ ] RSS Page + - [ ] Auto images page + - [ ] Index Page + - [ ] Created/Updated/Published markers + - [ ] Robots.txt generation + - [ ] Sitemap txt & xml generation - [X] Hot reload + - [ ] Hot reload when runtime scripts change - [ ] Base design & stylesheet - [ ] Web components - [ ] Header @@ -17,13 +29,7 @@ Complete list of components needed for 1:1 functionality with the original site. - [ ] Game - [ ] Photo viewer - [ ] Updated at sparkle -- [ ] Recreate build-time scripts - - [ ] RSS Page - - [ ] Auto images page - - [ ] Index Page - - [ ] Created/Updated/Published markers - - [ ] Robots.txt generation - - [ ] Sitemap txt & xml generation + - [ ] Recreate run-time scripts - [ ] Theme toggler (Depends on if new design requires it) - [ ] LastFM Scrobbler diff --git a/packages/site/assets/scripts/old/azur/azur.tsx b/packages/site/assets/scripts/old/azur/azur.tsx new file mode 100644 index 0000000..25b33d7 --- /dev/null +++ b/packages/site/assets/scripts/old/azur/azur.tsx @@ -0,0 +1,16 @@ +import jsx from '../jsx'; +import { extractFromTable, getElementsByClassName } from '../utils'; + +document.addEventListener('DOMContentLoaded', async () => { + const target = getElementsByClassName('fleet')?.[0]; + + if (target) { + const table = target.getElementsByTagName('table')[0]; + const data = extractFromTable<{ id: string; name: string; level: string }>( + table, + ); + + target.innerHTML = + "At some point I'll make a cool graphic here showing my collection."; + } +}); diff --git a/packages/site/assets/scripts/old/azur/ship-data.http b/packages/site/assets/scripts/old/azur/ship-data.http new file mode 100644 index 0000000..8732a52 --- /dev/null +++ b/packages/site/assets/scripts/old/azur/ship-data.http @@ -0,0 +1,15 @@ +@offset = 0 +@limit = 10 + +# An invalid request gets all data? DON'T ABUSE THIS ENDPOINT ;_; !!!! +GET https://azurlane.koumakan.jp/w/index.php + ?title=Special:CargoExport + &tables=ships + &fields=ships.Name,+ships.Rarity,+ships.Type,+ships.Nationality,+ships.Class,+ships.ConstructTime,+ships.Remodel,+ships.ShipID,+ships.RemodelId + &limit={limit} + &offset={offset} + &format=json +Accept: application/json + +### + diff --git a/packages/site/assets/scripts/old/azur/ship-data.ts b/packages/site/assets/scripts/old/azur/ship-data.ts new file mode 100644 index 0000000..e24748a --- /dev/null +++ b/packages/site/assets/scripts/old/azur/ship-data.ts @@ -0,0 +1,7048 @@ +export interface Ship { + Name: number | string; + Rarity: + | 'Elite' + | 'Normal' + | 'Rare' + | 'Super Rare' + | 'Decisive' + | 'Ultra Rare' + | 'Priority'; + Type: + | 'Destroyer' + | 'Monitor' + | 'Light Cruiser' + | 'Heavy Cruiser' + | 'Aircraft Carrier' + | 'Sailing Frigate (Vanguard)' + | 'Large Cruiser' + | 'Battleship' + | 'Repair Ship' + | 'Submarine' + | 'Light Aircraft Carrier' + | 'Battlecruiser' + | 'Sailing Frigate (Submarine)' + | 'Sailing Frigate (Main)' + | 'Submarine Carrier' + | 'Munition Ship' + | 'Aviation Battleship'; + Nationality: + | 'Bilibili' + | 'Royal Navy' + | 'Sakura Empire' + | 'Iron Blood' + | 'META' + | 'Northern Parliament' + | 'Tempesta' + | 'SSSS' + | 'Eagle Union' + | 'Sardegna Empire' + | 'Vichya Dominion' + | 'Iris Libre' + | 'The Idolmaster' + | 'Dragon Empery' + | 'KizunaAI' + | 'Senran Kagura' + | 'Neptunia' + | 'Kingdom of Tulipa' + | 'Utawarerumono' + | 'To LOVE-Ru' + | 'Venus Vacation' + | 'Atelier Ryza' + | 'Hololive' + | 'Universal'; + Method: + | 'Cannot be constructed' + | 'Drop only' + | 'Research' + | 'META' + | 'Construction'; + Class?: string; + RemodelId?: number; + ShipId?: string | number; +} + +export const ShipData: Ship[] = [ + { + Name: 22, + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Bilibili', + Method: 'Cannot be constructed', + ShipId: 10021, + }, + { + Name: 33, + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Bilibili', + Method: 'Cannot be constructed', + ShipId: 10022, + }, + { + Name: 'Abercrombie', + Rarity: 'Elite', + Type: 'Monitor', + Nationality: 'Royal Navy', + Class: 'Roberts', + Method: 'Construction', + ShipId: 336, + }, + { + Name: 'Abukuma', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Drop only', + ShipId: 187, + RemodelId: 3187, + }, + { + Name: 'Acasta', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'A and B', + Method: 'Construction', + ShipId: 82, + RemodelId: 3082, + }, + { + Name: 'Achilles', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Leander', + Method: 'Construction', + ShipId: 105, + RemodelId: 3105, + }, + { + Name: 'Admiral Graf Spee', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Deutschland', + Method: 'Cannot be constructed', + ShipId: 246, + }, + { + Name: 'Admiral Hipper', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Cannot be constructed', + ShipId: 242, + }, + { + Name: 'Admiral Hipper µ', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Construction', + ShipId: 422, + }, + { + Name: 'Admiral Hipper META', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'Construction', + ShipId: 30042, + }, + { + Name: 'Admiral Nakhimov', + Rarity: 'Decisive', + Type: 'Aircraft Carrier', + Nationality: 'Northern Parliament', + Class: 'Admiral Nakhimov', + Method: 'Research', + ShipId: 20036, + }, + { + Name: 'Adventure Galley', + Rarity: 'Elite', + Type: 'Sailing Frigate (Vanguard)', + Nationality: 'Tempesta', + Class: 'Adventure Galley', + Method: 'Cannot be constructed', + ShipId: 612, + }, + { + Name: 'Agano', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Agano', + Method: 'Drop only', + ShipId: 321, + }, + { + Name: 'Ägir', + Rarity: 'Decisive', + Type: 'Large Cruiser', + Nationality: 'Iron Blood', + Class: 'Ägir', + Method: 'Research', + ShipId: 20020, + }, + { + Name: 'Ajax', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Leander', + Method: 'Construction', + ShipId: 106, + RemodelId: 3106, + }, + { + Name: 'Akagi', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Akagi', + Method: 'Drop only', + ShipId: 224, + }, + { + Name: 'Akagi µ', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Akagi', + Method: 'Construction', + ShipId: 419, + }, + { + Name: 'Akagi-chan', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Akagi', + Method: 'Construction', + ShipId: 384, + }, + { + Name: 'Akane Shinjo', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10082, + }, + { + Name: 'Akashi', + Rarity: 'Super Rare', + Type: 'Repair Ship', + Nationality: 'Sakura Empire', + Class: 'Akashi', + Method: 'Construction', + ShipId: 232, + }, + { + Name: 'Akatsuki', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Cannot be constructed', + ShipId: 159, + }, + { + Name: 'Alabama', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'South Dakota', + Method: 'Construction', + ShipId: 401, + }, + { + Name: 'Albacore', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Cannot be constructed', + ShipId: 358, + }, + { + Name: 'Albacore µ', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Construction', + ShipId: 477, + }, + { + Name: 'Albion', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Centaur', + Method: 'Construction', + ShipId: 570, + }, + { + Name: 'Alfredo Oriani', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Alfredo Oriani', + Method: 'Construction', + ShipId: 562, + }, + { + Name: 'Algérie', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Vichya Dominion', + Class: 'Algérie', + Method: 'Construction', + ShipId: 455, + }, + { + Name: 'Algérie META', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30023, + }, + { + Name: 'Allen M. Sumner', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Allen M. Sumner', + Method: 'Construction', + ShipId: 508, + }, + { + Name: 'Alsace', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Iris Libre', + Class: 'Alsace', + Method: 'Construction', + ShipId: 641, + }, + { + Name: 'Alvitr', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'O', + Method: 'Construction', + ShipId: 648, + }, + { + Name: 'Amagi', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Amagi', + Method: 'Construction', + ShipId: 367, + }, + { + Name: 'Amagi-chan', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Amagi', + Method: 'Construction', + ShipId: 510, + }, + { + Name: 'Amagi(CV)', + Rarity: 'Ultra Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Amagi(CV)', + Method: 'Construction', + ShipId: 660, + }, + { + Name: 'Amazon', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'Amazon', + Method: 'Construction', + ShipId: 81, + RemodelId: 3081, + }, + { + Name: 'Ami Futami', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10076, + }, + { + Name: 'Amity', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Submarine)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 666, + }, + { + Name: 'An Shan', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Anshan', + Method: 'Cannot be constructed', + ShipId: 253, + RemodelId: 3253, + }, + { + Name: 'Anchorage', + Rarity: 'Priority', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Anchorage', + Method: 'Research', + ShipId: 'Plan018', + }, + { + Name: 'Andrea Doria', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Andrea Doria', + Method: 'Construction', + ShipId: 595, + }, + { + Name: 'Andrea Doria META', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'META', + Method: 'Construction', + ShipId: 30044, + }, + { + Name: 'Anniversary Kizuna AI', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'KizunaAI', + Method: 'Construction', + ShipId: 'Collab043', + }, + { + Name: 'Aoba', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Aoba', + Method: 'Construction', + ShipId: 192, + }, + { + Name: 'Aquila', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sardegna Empire', + Class: 'Aquila', + Method: 'Construction', + ShipId: 502, + }, + { + Name: 'Arashio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Asashio', + Method: 'Cannot be constructed', + ShipId: 334, + }, + { + Name: 'Archerfish', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Balao', + Method: 'Construction', + ShipId: 513, + }, + { + Name: 'Ardent', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'A and B', + Method: 'Construction', + ShipId: 83, + RemodelId: 3083, + }, + { + Name: 'Arethusa', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Arethusa', + Method: 'Drop only', + ShipId: 116, + }, + { + Name: 'Argus', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Argus', + Method: 'Construction', + ShipId: 583, + }, + { + Name: 'Ariake', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Hatsuharu', + Method: 'Cannot be constructed', + ShipId: 175, + RemodelId: 3175, + }, + { + Name: 'Arizona', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Pennsylvania', + Method: 'Construction', + ShipId: 55, + }, + { + Name: 'Arizona META', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30017, + }, + { + Name: 'Ark Royal', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Ark Royal', + Method: 'Construction', + ShipId: 144, + RemodelId: 3144, + }, + { + Name: 'Ark Royal META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30002, + }, + { + Name: 'Arkhangelsk', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Revenge', + Method: 'Construction', + ShipId: 536, + }, + { + Name: 'Asanagi', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kamikaze', + Method: 'Cannot be constructed', + ShipId: 608, + }, + { + Name: 'Asashio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Asashio', + Method: 'Construction', + ShipId: 331, + }, + { + Name: 'Ashigara', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Myoukou', + Method: 'Construction', + ShipId: 198, + }, + { + Name: 'Astoria', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Cannot be constructed', + ShipId: 46, + }, + { + Name: 'Asuka', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Senran Kagura', + Method: 'Construction', + ShipId: 10101, + }, + { + Name: 'Atago', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Takao', + Method: 'Cannot be constructed', + ShipId: 201, + }, + { + Name: 'Atlanta', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Construction', + ShipId: 34, + }, + { + Name: 'Attilio Regolo', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Capitani Romani', + Method: 'Construction', + ShipId: 596, + }, + { + Name: 'August von Parseval', + Rarity: 'Priority', + Type: 'Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'August von Parseval', + Method: 'Research', + ShipId: 'Plan021', + }, + { + Name: 'Aulick', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 15, + }, + { + Name: 'Aurora', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Arethusa', + Method: 'Construction', + ShipId: 118, + }, + { + Name: 'Avrora', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Pallada', + Method: 'Construction', + ShipId: 262, + }, + { + Name: 'Ayanami', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Construction', + ShipId: 155, + RemodelId: 3155, + }, + { + Name: 'Ayase', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Sendai', + Method: 'Cannot be constructed', + ShipId: 662, + }, + { + Name: 'Aylwin', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Farragut', + Method: 'Drop only', + ShipId: 406, + }, + { + Name: 'Azuma', + Rarity: 'Decisive', + Type: 'Large Cruiser', + Nationality: 'Sakura Empire', + Class: 'Azuma', + Method: 'Research', + ShipId: 'Plan010', + }, + { + Name: 'Azusa Miura', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10074, + }, + { + Name: 'Bache', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 407, + }, + { + Name: 'Bailey', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Benson', + Method: 'Cannot be constructed', + ShipId: 263, + RemodelId: 3263, + }, + { + Name: 'Baltimore', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Baltimore', + Method: 'Construction', + ShipId: 50, + }, + { + Name: 'Baltimore µ', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Baltimore', + Method: 'Construction', + ShipId: 478, + }, + { + Name: 'Bartolomeo Colleoni', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Giussano', + Method: 'Construction', + ShipId: 681, + }, + { + Name: 'Bataan', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Independence', + Method: 'Cannot be constructed', + ShipId: 403, + }, + { + Name: 'Bayard', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Iris Libre', + Class: 'Bayard', + Method: 'Research', + ShipId: 20037, + }, + { + Name: 'Beagle', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'A and B', + Method: 'Construction', + ShipId: 86, + }, + { + Name: 'Béarn', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Iris Libre', + Class: 'Béarn', + Method: 'Cannot be constructed', + ShipId: 458, + }, + { + Name: 'Béarn META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'Construction', + ShipId: 30033, + }, + { + Name: 'Belfast', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 115, + }, + { + Name: 'Bell', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 659, + }, + { + Name: 'Bellona', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Cannot be constructed', + ShipId: 551, + }, + { + Name: 'Benson', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Benson', + Method: 'Cannot be constructed', + ShipId: 18, + }, + { + Name: 'Biloxi', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 428, + }, + { + Name: 'Birmingham', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 405, + }, + { + Name: 'Bismarck', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Bismarck', + Method: 'Construction', + ShipId: 250, + }, + { + Name: 'Bismarck Zwei', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Bismarck', + Method: 'Construction', + ShipId: 593, + }, + { + Name: 'Black Heart', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab006', + }, + { + Name: 'Black Prince', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Cannot be constructed', + ShipId: 408, + }, + { + Name: 'Blanc', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab003', + }, + { + Name: 'Blücher', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Construction', + ShipId: 243, + }, + { + Name: 'Bluegill', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Cannot be constructed', + ShipId: 446, + }, + { + Name: 'Bogue', + Rarity: 'Normal', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Bogue', + Method: 'Construction', + ShipId: 71, + RemodelId: 3071, + }, + { + Name: 'Boise', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 514, + }, + { + Name: 'Boise µ', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 638, + }, + { + Name: 'Bolzano', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Bolzano', + Method: 'Construction', + ShipId: 560, + }, + { + Name: 'Bolzano META', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30043, + }, + { + Name: 'Bremerton', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Baltimore', + Method: 'Construction', + ShipId: 443, + }, + { + Name: 'Brennus', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iris Libre', + Class: 'Brennus', + Method: 'Construction', + ShipId: 643, + }, + { + Name: 'Brest', + Rarity: 'Decisive', + Type: 'Large Cruiser', + Nationality: 'Iris Libre', + Class: 'Brest', + Method: 'Research', + ShipId: 20027, + }, + { + Name: 'Bristol', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Allen M. Sumner', + Method: 'Construction', + ShipId: 533, + }, + { + Name: 'Brooklyn', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 31, + }, + { + Name: 'Brünhilde', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'O', + Method: 'Construction', + ShipId: 566, + }, + { + Name: 'Bulldog', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'A and B', + Method: 'Construction', + ShipId: 87, + }, + { + Name: 'Bunker Hill', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Drop only', + ShipId: 380, + }, + { + Name: 'Bush', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Cannot be constructed', + ShipId: 355, + }, + { + Name: 'California', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Tennessee', + Method: 'Construction', + ShipId: 59, + }, + { + Name: 'Carabiniere', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Soldati', + Method: 'Cannot be constructed', + ShipId: 415, + }, + { + Name: 'Casablanca', + Rarity: 'Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Casablanca', + Method: 'Cannot be constructed', + ShipId: 447, + }, + { + Name: 'Cassin', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Mahan', + Method: 'Construction', + ShipId: 5, + RemodelId: 3005, + }, + { + Name: 'Cavalla', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Drop only', + ShipId: 402, + }, + { + Name: 'Centaur', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Centaur', + Method: 'Construction', + ShipId: 356, + }, + { + Name: 'Champagne', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Iris Libre', + Class: 'Champagne', + Method: 'Research', + ShipId: 'Plan017', + }, + { + Name: 'Chang Chun', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Anshan', + Method: 'Cannot be constructed', + ShipId: 255, + RemodelId: 3255, + }, + { + Name: 'Chang Feng', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Fei Yuen', + Method: 'Construction', + ShipId: 676, + }, + { + Name: 'Chao Ho', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Chao Ho', + Method: 'Construction', + ShipId: 494, + }, + { + Name: 'Chapayev', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Chapayev', + Method: 'Construction', + ShipId: 436, + }, + { + Name: 'Charles Ausburne', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Cannot be constructed', + ShipId: 13, + RemodelId: 3013, + }, + { + Name: 'Charybdis', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Construction', + ShipId: 530, + }, + { + Name: 'Chaser', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Attacker', + Method: 'Cannot be constructed', + ShipId: 376, + }, + { + Name: 'Chen Hai', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Dragon Empery', + Class: 'Chen Hai', + Method: 'Construction', + ShipId: 534, + RemodelId: 3534, + }, + { + Name: 'Cheshire', + Rarity: 'Priority', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'Cheshire', + Method: 'Research', + ShipId: 'Plan013', + }, + { + Name: 'Chi An', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Chi An', + Method: 'Construction', + ShipId: 622, + }, + { + Name: 'Chicago', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Northampton', + Method: 'Construction', + ShipId: 42, + }, + { + Name: 'Chien Wu', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Dragon Empery', + Class: 'Chien Wu', + Method: 'Construction', + ShipId: 674, + }, + { + Name: 'Chihaya Kisaragi', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10072, + }, + { + Name: 'Chikuma', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Tone', + Method: 'Construction', + ShipId: 195, + }, + { + Name: 'Chise Asukagawa', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10086, + }, + { + Name: 'Chitose', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Zuihou', + Method: 'Construction', + ShipId: 470, + }, + { + Name: 'Chiyoda', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Zuihou', + Method: 'Construction', + ShipId: 471, + }, + { + Name: 'Chkalov', + Rarity: 'Priority', + Type: 'Aircraft Carrier', + Nationality: 'Northern Parliament', + Class: 'Chkalov', + Method: 'Research', + ShipId: 20026, + }, + { + Name: 'Choukai', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Takao', + Method: 'Drop only', + ShipId: 203, + }, + { + Name: 'Clemenceau', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Vichya Dominion', + Class: 'Richelieu', + Method: 'Construction', + ShipId: 604, + }, + { + Name: 'Clevelad', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 391, + }, + { + Name: 'Cleveland', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Cannot be constructed', + ShipId: 37, + }, + { + Name: 'Cleveland µ', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 420, + }, + { + Name: 'Colorado', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Colorado', + Method: 'Cannot be constructed', + ShipId: 60, + RemodelId: 3060, + }, + { + Name: 'Columbia', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Drop only', + ShipId: 38, + }, + { + Name: 'Comet', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'C', + Method: 'Construction', + ShipId: 88, + RemodelId: 3088, + }, + { + Name: 'Concord', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Construction', + ShipId: 366, + }, + { + Name: 'Constellation', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Eagle Union', + Class: 'Lexington', + Method: 'Construction', + ShipId: 617, + }, + { + Name: 'Conte di Cavour', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Conte di Cavour', + Method: 'Cannot be constructed', + ShipId: 411, + }, + { + Name: 'Cooper', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Allen M. Sumner', + Method: 'Construction', + ShipId: 444, + }, + { + Name: 'Craven', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Gridley', + Method: 'Construction', + ShipId: 8, + }, + { + Name: 'Crescent', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'C', + Method: 'Construction', + ShipId: 89, + RemodelId: 3089, + }, + { + Name: 'Curacoa', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Ceres', + Method: 'Construction', + ShipId: 372, + RemodelId: 3372, + }, + { + Name: 'Curlew', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Ceres', + Method: 'Construction', + ShipId: 373, + RemodelId: 3373, + }, + { + Name: 'Cygnet', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'C', + Method: 'Construction', + ShipId: 90, + RemodelId: 3090, + }, + { + Name: 'Dace', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Cannot be constructed', + ShipId: 342, + }, + { + Name: 'Daisen', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Daisen', + Method: 'Research', + ShipId: 20034, + }, + { + Name: 'De Zeven Provinciën', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Kingdom of Tulipa', + Class: 'De Zeven Provinciën', + Method: 'Construction', + ShipId: 686, + }, + { + Name: 'Denver', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 330, + }, + { + Name: 'Deutschland', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Deutschland', + Method: 'Construction', + ShipId: 245, + }, + { + Name: 'Devonshire', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Cannot be constructed', + ShipId: 632, + }, + { + Name: 'Dewey', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Farragut', + Method: 'Drop only', + ShipId: 4, + }, + { + Name: 'Dido', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Construction', + ShipId: 107, + }, + { + Name: 'Dido µ', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Construction', + ShipId: 476, + }, + { + Name: 'Dolphin', + Rarity: 'Elite', + Type: 'Sailing Frigate (Submarine)', + Nationality: 'Tempesta', + Method: 'Cannot be constructed', + ShipId: 668, + }, + { + Name: 'Dorsetshire', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 124, + }, + { + Name: 'Downes', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Mahan', + Method: 'Construction', + ShipId: 6, + RemodelId: 3006, + }, + { + Name: 'Drake', + Rarity: 'Decisive', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'Drake', + Method: 'Research', + ShipId: 'Plan014', + }, + { + Name: 'Duca degli Abruzzi', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Duca degli Abruzzi', + Method: 'Construction', + ShipId: 501, + }, + { + Name: 'Duisburg', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'M (German)', + Method: 'Construction', + ShipId: 671, + }, + { + Name: 'Duke of York', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'King George V', + Method: 'Cannot be constructed', + ShipId: 136, + }, + { + Name: 'Dunkerque', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Vichya Dominion', + Class: 'Dunkerque', + Method: 'Construction', + ShipId: 352, + }, + { + Name: 'Dupleix', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Vichya Dominion', + Class: 'Suffren', + Method: 'Construction', + ShipId: 654, + }, + { + Name: 'Eagle', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Eagle', + Method: 'Construction', + ShipId: 143, + }, + { + Name: 'Echo', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'E', + Method: 'Construction', + ShipId: 389, + }, + { + Name: 'Edinburgh', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Cannot be constructed', + ShipId: 114, + }, + { + Name: 'Elbe', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Jade', + Method: 'Construction', + ShipId: 526, + }, + { + Name: 'Elbing', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Pillau', + Method: 'Construction', + ShipId: 548, + }, + { + Name: 'Eldridge', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Cannon', + Method: 'Cannot be constructed', + ShipId: 28, + RemodelId: 3028, + }, + { + Name: 'Elegant Kizuna AI', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'KizunaAI', + Method: 'Construction', + ShipId: 'Collab042', + }, + { + Name: 'Emanuele Pessagno', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Navigatori', + Method: 'Cannot be constructed', + ShipId: 563, + }, + { + Name: 'Emden', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Dresden', + Method: 'Construction', + ShipId: 547, + }, + { + Name: 'Émile Bertin', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Iris Libre', + Class: 'Émile Bertin', + Method: 'Cannot be constructed', + ShipId: 349, + RemodelId: 3349, + }, + { + Name: 'Enterprise', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Yorktown', + Method: 'Construction', + ShipId: 77, + }, + { + Name: 'Enterprise (Royal Navy)', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Emerald', + Method: 'Construction', + ShipId: 557, + }, + { + Name: 'Épée', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Hardi', + Method: 'Cannot be constructed', + ShipId: 646, + }, + { + Name: 'Erebus', + Rarity: 'Elite', + Type: 'Monitor', + Nationality: 'Royal Navy', + Class: 'Erebus', + Method: 'Construction', + ShipId: 149, + }, + { + Name: 'Erebus META', + Rarity: 'Elite', + Type: 'Monitor', + Nationality: 'META', + Method: 'META', + ShipId: 30027, + }, + { + Name: 'Eskimo', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'Tribal', + Method: 'Construction', + ShipId: 460, + }, + { + Name: 'Essex', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 357, + }, + { + Name: 'Evertsen', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Kingdom of Tulipa', + Class: 'Admiralen', + Method: 'Construction', + ShipId: 687, + }, + { + Name: 'Exeter', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'York', + Method: 'Construction', + ShipId: 126, + RemodelId: 3126, + }, + { + Name: 'Fancy', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Vanguard)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 665, + }, + { + Name: 'Fargo', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Fargo', + Method: 'Construction', + ShipId: 657, + }, + { + Name: 'Fei Yuen', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Fei Yuen', + Method: 'Cannot be constructed', + ShipId: 625, + }, + { + Name: 'Felix Schultz', + Rarity: 'Priority', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Felix Schultz', + Method: 'Research', + ShipId: 20030, + }, + { + Name: 'Fiji', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Crown Colony', + Method: 'Cannot be constructed', + ShipId: 327, + }, + { + Name: 'Flandre', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Vichya Dominion', + Class: 'Alsace', + Method: 'Research', + ShipId: 20032, + }, + { + Name: 'Flasher', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Construction', + ShipId: 620, + }, + { + Name: 'Fletcher', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 11, + }, + { + Name: 'Fleuret', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Hardi', + Method: 'Construction', + ShipId: 645, + }, + { + Name: 'Foch', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Vichya Dominion', + Class: 'Suffren', + Method: 'Construction', + ShipId: 524, + }, + { + Name: 'Foch META', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30034, + }, + { + Name: 'Foote', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 16, + }, + { + Name: 'Forbin', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'L'Adroit', + Method: 'Construction', + ShipId: 348, + RemodelId: 3348, + }, + { + Name: 'Formidable', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 147, + }, + { + Name: 'Formidable µ', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 633, + }, + { + Name: 'Fortune', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'F', + Method: 'Cannot be constructed', + ShipId: 92, + RemodelId: 3092, + }, + { + Name: 'Fortune META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30016, + }, + { + Name: 'Foxhound', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'F', + Method: 'Construction', + ShipId: 91, + RemodelId: 3091, + }, + { + Name: 'Franklin', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 682, + }, + { + Name: 'Friedrich Carl', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'P', + Method: 'Construction', + ShipId: 640, + }, + { + Name: 'Friedrich der Große', + Rarity: 'Decisive', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Friedrich der Große', + Method: 'Research', + ShipId: 20011, + }, + { + Name: 'Fritz Rumey', + Rarity: 'Ultra Rare', + Type: 'Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Fritz Rumey', + Method: 'Construction', + ShipId: 669, + }, + { + Name: 'Fu Po', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Fei Yuen', + Method: 'Cannot be constructed', + ShipId: 677, + }, + { + Name: 'Fu Shun', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Anshan', + Method: 'Cannot be constructed', + ShipId: 254, + RemodelId: 3254, + }, + { + Name: 'Fubuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Construction', + ShipId: 151, + }, + { + Name: 'Fubuki (Senran Kagura)', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Senran Kagura', + Method: 'Construction', + ShipId: 10105, + }, + { + Name: 'Fumiruiru', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Utawarerumono', + Method: 'Cannot be constructed', + ShipId: 'Collab036', + }, + { + Name: 'Fumizuki', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Construction', + ShipId: 277, + }, + { + Name: 'Furutaka', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Furutaka', + Method: 'Drop only', + ShipId: 190, + RemodelId: 3190, + }, + { + Name: 'Fusou', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Fusou', + Method: 'Drop only', + ShipId: 208, + RemodelId: 3208, + }, + { + Name: 'Fusou META', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30005, + }, + { + Name: 'Galatea', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Arethusa', + Method: 'Cannot be constructed', + ShipId: 117, + }, + { + Name: 'Gangut', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Gangut', + Method: 'Cannot be constructed', + ShipId: 437, + }, + { + Name: 'Ganj-i-Sawai', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Main)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 664, + }, + { + Name: 'Gascogne', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Vichya Dominion', + Class: 'Richelieu', + Method: 'Research', + ShipId: 'Plan012', + }, + { + Name: 'Gascogne µ', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Vichya Dominion', + Class: 'Richelieu', + Method: 'Construction', + ShipId: 418, + }, + { + Name: 'Georgia', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Georgia', + Method: 'Research', + ShipId: 'Plan008', + }, + { + Name: 'Giosuè Carducci', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Alfredo Oriani', + Method: 'Cannot be constructed', + ShipId: 680, + }, + { + Name: 'Giulio Cesare', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Conte di Cavour', + Method: 'Construction', + ShipId: 412, + }, + { + Name: 'Giulio Cesare META', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30040, + }, + { + Name: 'Giuseppe Garibaldi', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Duca degli Abruzzi', + Method: 'Construction', + ShipId: 559, + }, + { + Name: 'Glasgow', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 423, + }, + { + Name: 'Glorious', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Courageous', + Method: 'Cannot be constructed', + ShipId: 148, + }, + { + Name: 'Gloucester', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 113, + }, + { + Name: 'Glowworm', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'G', + Method: 'Cannot be constructed', + ShipId: 94, + }, + { + Name: 'Gneisenau', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Scharnhorst', + Method: 'Drop only', + ShipId: 249, + }, + { + Name: 'Gneisenau META', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30007, + }, + { + Name: 'Golden Darkness', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'To LOVE-Ru', + Method: 'Construction', + ShipId: 10114, + }, + { + Name: 'Golden Hind', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Vanguard)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 610, + }, + { + Name: 'Gorizia', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Zara', + Method: 'Construction', + ShipId: 597, + }, + { + Name: 'Graf Zeppelin', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Graf Zeppelin', + Method: 'Construction', + ShipId: 252, + }, + { + Name: 'Green Heart', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab008', + }, + { + Name: 'Gremyashchy', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Gnevny', + Method: 'Construction', + ShipId: 497, + }, + { + Name: 'Grenville', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'G', + Method: 'Construction', + ShipId: 93, + }, + { + Name: 'Gridley', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Gridley', + Method: 'Cannot be constructed', + ShipId: 7, + }, + { + Name: 'Gromky', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Gnevny', + Method: 'Cannot be constructed', + ShipId: 499, + }, + { + Name: 'Grozny', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Gnevny', + Method: 'Construction', + ShipId: 431, + }, + { + Name: 'Guam', + Rarity: 'Ultra Rare', + Type: 'Large Cruiser', + Nationality: 'Eagle Union', + Class: 'Alaska', + Method: 'Construction', + ShipId: 616, + }, + { + Name: 'Guichen', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iris Libre', + Class: 'De Grasse', + Method: 'Construction', + ShipId: 603, + }, + { + Name: 'Haguro', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Myoukou', + Method: 'Construction', + ShipId: 199, + }, + { + Name: 'Hai Chi', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Hai Chi', + Method: 'Cannot be constructed', + ShipId: 532, + }, + { + Name: 'Hai Tien', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Hai Chi', + Method: 'Cannot be constructed', + ShipId: 531, + }, + { + Name: 'Hai Yung', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Hai Yung', + Method: 'Construction', + ShipId: 675, + }, + { + Name: 'Hakuryuu', + Rarity: 'Decisive', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Hakuryuu', + Method: 'Research', + ShipId: 20019, + }, + { + Name: 'Halford', + Rarity: 'Priority', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Research', + ShipId: 20033, + }, + { + Name: 'Halsey Powell', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 427, + }, + { + Name: 'Hamakaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 318, + RemodelId: 3318, + }, + { + Name: 'Hammann', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Sims', + Method: 'Construction', + ShipId: 27, + RemodelId: 3027, + }, + { + Name: 'Hammann II', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Edsall', + Method: 'Construction', + ShipId: 576, + }, + { + Name: 'Hanazuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Construction', + ShipId: 449, + }, + { + Name: 'Harbin', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Harbin', + Method: 'Research', + ShipId: 20025, + }, + { + Name: 'Hardy', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'H', + Method: 'Construction', + ShipId: 96, + }, + { + Name: 'Haruka Amami', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10071, + }, + { + Name: 'Haruna', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Cannot be constructed', + ShipId: 206, + }, + { + Name: 'Haruna Sairenji', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'To LOVE-Ru', + Method: 'Construction', + ShipId: 10115, + }, + { + Name: 'Harutsuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Cannot be constructed', + ShipId: 296, + }, + { + Name: 'Hass', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10083, + }, + { + Name: 'Hatakaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kamikaze', + Method: 'Construction', + ShipId: 369, + }, + { + Name: 'Hatakaze META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30024, + }, + { + Name: 'Hatsuharu', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Hatsuharu', + Method: 'Construction', + ShipId: 171, + RemodelId: 3171, + }, + { + Name: 'Hatsushimo', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Hatsuharu', + Method: 'Cannot be constructed', + ShipId: 174, + RemodelId: 3174, + }, + { + Name: 'Hatsuzuki', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Construction', + ShipId: 607, + }, + { + Name: 'Hazelwood', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Cannot be constructed', + ShipId: 365, + }, + { + Name: 'Helena', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Cannot be constructed', + ShipId: 33, + RemodelId: 3033, + }, + { + Name: 'Helena META', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30003, + }, + { + Name: 'Hermes', + Rarity: 'Normal', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Hermes', + Method: 'Construction', + ShipId: 140, + RemodelId: 3140, + }, + { + Name: 'Hermione', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Construction', + ShipId: 463, + }, + { + Name: 'Hero', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'H', + Method: 'Cannot be constructed', + ShipId: 585, + }, + { + Name: 'Herring', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Gato', + Method: 'Cannot be constructed', + ShipId: 658, + }, + { + Name: 'Hibiki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Cannot be constructed', + ShipId: 160, + }, + { + Name: 'Hiei', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Construction', + ShipId: 205, + }, + { + Name: 'Hiei META', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'META', + Method: 'Construction', + ShipId: 30038, + }, + { + Name: 'Hiei-chan', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Construction', + ShipId: 383, + }, + { + Name: 'Hindenburg', + Rarity: 'Decisive', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Hindenburg', + Method: 'Research', + ShipId: 20031, + }, + { + Name: 'Hiryuu', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Hiryuu', + Method: 'Drop only', + ShipId: 227, + RemodelId: 3227, + }, + { + Name: 'Hiryuu META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30001, + }, + { + Name: 'Hiyou', + Rarity: 'Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Hiyou', + Method: 'Drop only', + ShipId: 218, + }, + { + Name: 'Hiyou META', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30006, + }, + { + Name: 'Hobby', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Benson', + Method: 'Construction', + ShipId: 362, + }, + { + Name: 'Homura', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Senran Kagura', + Method: 'Cannot be constructed', + ShipId: 10103, + }, + { + Name: 'Honoka', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10062, + }, + { + Name: 'Honolulu', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Drop only', + ShipId: 304, + }, + { + Name: 'Hood', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Royal Navy', + Class: 'Admiral', + Method: 'Construction', + ShipId: 129, + }, + { + Name: 'Hornet', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Yorktown', + Method: 'Construction', + ShipId: 78, + }, + { + Name: 'Hornet II', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 572, + }, + { + Name: 'Hornet META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30045, + }, + { + Name: 'Houshou', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Houshou', + Method: 'Drop only', + ShipId: 220, + }, + { + Name: 'Houshou META', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30039, + }, + { + Name: 'Houston', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Northampton', + Method: 'Construction', + ShipId: 43, + }, + { + Name: 'Houston II', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Drop only', + ShipId: 609, + }, + { + Name: 'Howe', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'King George V', + Method: 'Construction', + ShipId: 461, + }, + { + Name: 'Hu Pen', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Lung Wu', + Method: 'Construction', + ShipId: 624, + }, + { + Name: 'Huan Ch'ang', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Dragon Empery', + Class: 'Huan Ch'ang', + Method: 'Construction', + ShipId: 621, + }, + { + Name: 'Hunter', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'H', + Method: 'Cannot be constructed', + ShipId: 100, + }, + { + Name: 'Hunter META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30015, + }, + { + Name: 'Hwah Jah', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Dragon Empery', + Class: 'Hwah Jah', + Method: 'Construction', + ShipId: 579, + RemodelId: 3579, + }, + { + Name: 'Hyuuga', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Ise', + Method: 'Construction', + ShipId: 211, + RemodelId: 3211, + }, + { + Name: 'I-13', + Rarity: 'Super Rare', + Type: 'Submarine Carrier', + Nationality: 'Sakura Empire', + Class: 'Type AM', + Method: 'Construction', + ShipId: 381, + }, + { + Name: 'I-168', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Kaidai', + Method: 'Construction', + ShipId: 398, + }, + { + Name: 'I-19', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Type B1', + Method: 'Construction', + ShipId: 338, + }, + { + Name: 'I-25', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Type B1', + Method: 'Construction', + ShipId: 396, + }, + { + Name: 'I-26', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Type B1', + Method: 'Construction', + ShipId: 339, + }, + { + Name: 'I-56', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Type B3', + Method: 'Construction', + ShipId: 397, + }, + { + Name: 'I-58', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Sakura Empire', + Class: 'Type B3', + Method: 'Construction', + ShipId: 340, + }, + { + Name: 'Ibuki', + Rarity: 'Priority', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Ibuki', + Method: 'Research', + ShipId: 'Plan003', + }, + { + Name: 'Icarus', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'I', + Method: 'Cannot be constructed', + ShipId: 465, + }, + { + Name: 'Ikaruga', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Senran Kagura', + Method: 'Construction', + ShipId: 10102, + }, + { + Name: 'Ikazuchi', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Drop only', + ShipId: 161, + }, + { + Name: 'Illustrious', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 145, + }, + { + Name: 'Illustrious µ', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Cannot be constructed', + ShipId: 480, + }, + { + Name: 'Impero', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sardegna Empire', + Class: 'Vittorio Veneto', + Method: 'Construction', + ShipId: 540, + }, + { + Name: 'Implacable', + Rarity: 'Ultra Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Implacable', + Method: 'Construction', + ShipId: 581, + }, + { + Name: 'Inazuma', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Drop only', + ShipId: 162, + }, + { + Name: 'Independence', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Independence', + Method: 'Cannot be constructed', + ShipId: 377, + RemodelId: 3377, + }, + { + Name: 'Indiana', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'South Dakota', + Method: 'Construction', + ShipId: 66, + }, + { + Name: 'Indianapolis', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Portland', + Method: 'Construction', + ShipId: 45, + }, + { + Name: 'Indomitable', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 553, + }, + { + Name: 'Ingraham', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Allen M. Sumner', + Method: 'Construction', + ShipId: 518, + }, + { + Name: 'Intrepid', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 442, + }, + { + Name: 'Iori Minase', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10073, + }, + { + Name: 'Ise', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Ise', + Method: 'Construction', + ShipId: 210, + RemodelId: 3210, + }, + { + Name: 'Isokaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 317, + }, + { + Name: 'Isuzu', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Drop only', + ShipId: 183, + RemodelId: 3183, + }, + { + Name: 'Izumo', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Izumo', + Method: 'Research', + ShipId: 'Plan004', + }, + { + Name: 'Jade', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Jade', + Method: 'Cannot be constructed', + ShipId: 591, + }, + { + Name: 'Jamaica', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Crown Colony', + Method: 'Cannot be constructed', + ShipId: 328, + }, + { + Name: 'Janus', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Construction', + ShipId: 569, + }, + { + Name: 'Javelin', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Construction', + ShipId: 101, + RemodelId: 3101, + }, + { + Name: 'Jean Bart', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Vichya Dominion', + Class: 'Richelieu', + Method: 'Cannot be constructed', + ShipId: 353, + }, + { + Name: 'Jeanne d'Arc', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iris Libre', + Class: 'Jeanne d'Arc', + Method: 'Construction', + ShipId: 454, + }, + { + Name: 'Jenkins', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Drop only', + ShipId: 300, + }, + { + Name: 'Jersey', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Construction', + ShipId: 307, + }, + { + Name: 'Jervis', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Construction', + ShipId: 550, + }, + { + Name: 'Jintsuu', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Sendai', + Method: 'Drop only', + ShipId: 309, + RemodelId: 3309, + }, + { + Name: 'Jintsuu META', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30025, + }, + { + Name: 'Joffre', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Vichya Dominion', + Class: 'Joffre', + Method: 'Construction', + ShipId: 555, + }, + { + Name: 'Juneau', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Construction', + ShipId: 35, + RemodelId: 3035, + }, + { + Name: 'Juno', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Cannot be constructed', + ShipId: 102, + }, + { + Name: 'Junyou', + Rarity: 'Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Hiyou', + Method: 'Drop only', + ShipId: 219, + }, + { + Name: 'Junyou META', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30008, + }, + { + Name: 'Jupiter', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'J', + Method: 'Construction', + ShipId: 306, + }, + { + Name: 'Kaga', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Kaga', + Method: 'Drop only', + ShipId: 225, + }, + { + Name: 'Kaga (Battleship)', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Tosa', + Method: 'Construction', + ShipId: 368, + }, + { + Name: 'Kagerou', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Drop only', + ShipId: 167, + RemodelId: 3167, + }, + { + Name: 'Kako', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Furutaka', + Method: 'Drop only', + ShipId: 191, + RemodelId: 3191, + }, + { + Name: 'Kala Ideas', + Rarity: 'Super Rare', + Type: 'Large Cruiser', + Nationality: 'Atelier Ryza', + Method: 'Cannot be constructed', + ShipId: 10096, + }, + { + Name: 'Kalk', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Benson', + Method: 'Construction', + ShipId: 363, + }, + { + Name: 'Kamikaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kamikaze', + Method: 'Construction', + ShipId: 269, + RemodelId: 3269, + }, + { + Name: 'Karlsruhe', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Königsberg', + Method: 'Construction', + ShipId: 239, + RemodelId: 3239, + }, + { + Name: 'Kashino', + Rarity: 'Elite', + Type: 'Munition Ship', + Nationality: 'Sakura Empire', + Class: 'Kashino', + Method: 'Construction', + ShipId: 472, + }, + { + Name: 'Kasumi', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Asashio', + Method: 'Construction', + ShipId: 424, + RemodelId: 3424, + }, + { + Name: 'Kasumi (Venus Vacation)', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10063, + }, + { + Name: 'Kasumi META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30036, + }, + { + Name: 'Katsuragi', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Unryuu', + Method: 'Construction', + ShipId: 520, + }, + { + Name: 'Kawakaze', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Cannot be constructed', + ShipId: 288, + }, + { + Name: 'Kazagumo', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Yuugumo', + Method: 'Construction', + ShipId: 517, + }, + { + Name: 'Kazan', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Kazan', + Method: 'Construction', + ShipId: 685, + }, + { + Name: 'Kearsarge', + Rarity: 'Decisive', + Type: 'Aviation Battleship', + Nationality: 'Eagle Union', + Class: 'Kearsarge', + Method: 'Research', + ShipId: 20028, + }, + { + Name: 'Kent', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 121, + }, + { + Name: 'Kersaint', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Vauquelin', + Method: 'Cannot be constructed', + ShipId: 601, + }, + { + Name: 'Kiev', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Kiev', + Method: 'Construction', + ShipId: 535, + }, + { + Name: 'Kii', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Kii', + Method: 'Construction', + ShipId: 214, + }, + { + Name: 'Kimberly', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 374, + }, + { + Name: 'Kimberly META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30029, + }, + { + Name: 'King George V', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'King George V', + Method: 'Construction', + ShipId: 134, + }, + { + Name: 'Kinu', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Cannot be constructed', + ShipId: 186, + RemodelId: 3186, + }, + { + Name: 'Kinugasa', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Aoba', + Method: 'Construction', + ShipId: 193, + }, + { + Name: 'Kirishima', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Construction', + ShipId: 207, + }, + { + Name: 'Kirov', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Kirov', + Method: 'Construction', + ShipId: 435, + }, + { + Name: 'Kirov META', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30028, + }, + { + Name: 'Kisaragi', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Construction', + ShipId: 272, + RemodelId: 3272, + }, + { + Name: 'Kitakaze', + Rarity: 'Priority', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kitakaze', + Method: 'Research', + ShipId: 'Plan009', + }, + { + Name: 'Kiyonami', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Yuugumo', + Method: 'Construction', + ShipId: 293, + }, + { + Name: 'Kizuna AI', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'KizunaAI', + Method: 'Cannot be constructed', + ShipId: 'Collab041', + }, + { + Name: 'Klaudia Valentz', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Atelier Ryza', + Method: 'Construction', + ShipId: 10092, + }, + { + Name: 'Köln', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Königsberg', + Method: 'Construction', + ShipId: 240, + RemodelId: 3240, + }, + { + Name: 'Kongou', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Cannot be constructed', + ShipId: 204, + }, + { + Name: 'Kongou µ', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Sakura Empire', + Class: 'Kongou', + Method: 'Construction', + ShipId: 636, + }, + { + Name: 'Königsberg', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Königsberg', + Method: 'Construction', + ShipId: 238, + }, + { + Name: 'Kronshtadt', + Rarity: 'Ultra Rare', + Type: 'Large Cruiser', + Nationality: 'Northern Parliament', + Class: 'Kronshtadt', + Method: 'Construction', + ShipId: 539, + }, + { + Name: 'Kumano', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Mogami', + Method: 'Cannot be constructed', + ShipId: 469, + }, + { + Name: 'Kuon', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Utawarerumono', + Method: 'Construction', + ShipId: 'Collab031', + }, + { + Name: 'Kuroshio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 177, + }, + { + Name: 'Kursk', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Northern Parliament', + Class: 'Kursk', + Method: 'Construction', + ShipId: 586, + }, + { + Name: 'Kuybyshev', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Chapayev', + Method: 'Construction', + ShipId: 577, + }, + { + Name: 'L'Audacieux', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Fantasque', + Method: 'Construction', + ShipId: 653, + }, + { + Name: 'L'Indomptable', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Fantasque', + Method: 'Construction', + ShipId: 556, + }, + { + Name: 'L'Opiniâtre', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Le Hardi', + Method: 'Cannot be constructed', + ShipId: 395, + }, + { + Name: 'La Galissonnière', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Vichya Dominion', + Class: 'La Galissonnière', + Method: 'Cannot be constructed', + ShipId: 456, + }, + { + Name: 'La Galissonnière META', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30020, + }, + { + Name: 'Laffey', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Benson', + Method: 'Construction', + ShipId: 19, + RemodelId: 3019, + }, + { + Name: 'Laffey II', + Rarity: 'Ultra Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Allen M. Sumner', + Method: 'Cannot be constructed', + ShipId: 615, + }, + { + Name: 'Lala Satalin Deviluke', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'To LOVE-Ru', + Method: 'Construction', + ShipId: 10111, + }, + { + Name: 'Langley', + Rarity: 'Normal', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Langley', + Method: 'Construction', + ShipId: 72, + RemodelId: 3072, + }, + { + Name: 'Langley II', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Independence', + Method: 'Cannot be constructed', + ShipId: 573, + }, + { + Name: 'Le Malin', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Fantasque', + Method: 'Cannot be constructed', + ShipId: 394, + }, + { + Name: 'Le Malin µ', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Le Fantasque', + Method: 'Cannot be constructed', + ShipId: 481, + }, + { + Name: 'Le Mars', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'L'Adroit', + Method: 'Construction', + ShipId: 351, + RemodelId: 3351, + }, + { + Name: 'Le Téméraire', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Le Hardi', + Method: 'Cannot be constructed', + ShipId: 359, + }, + { + Name: 'Le Téméraire µ', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Le Hardi', + Method: 'Cannot be constructed', + ShipId: 637, + }, + { + Name: 'Le Terrible', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Le Fantasque', + Method: 'Construction', + ShipId: 522, + }, + { + Name: 'Le Triomphant', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Le Fantasque', + Method: 'Cannot be constructed', + ShipId: 347, + }, + { + Name: 'Leander', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Leander', + Method: 'Construction', + ShipId: 104, + RemodelId: 3104, + }, + { + Name: 'Leipzig', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Leipzig', + Method: 'Construction', + ShipId: 241, + RemodelId: 3241, + }, + { + Name: 'Lena', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 390, + }, + { + Name: 'Leonardo da Vinci', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Sardegna Empire', + Class: 'Marconi', + Method: 'Construction', + ShipId: 558, + }, + { + Name: 'Lexington', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Lexington', + Method: 'Construction', + ShipId: 73, + }, + { + Name: 'Li'l Sandy', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Cannot be constructed', + ShipId: 392, + }, + { + Name: 'Libeccio', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Maestrale', + Method: 'Construction', + ShipId: 505, + }, + { + Name: 'Lila Decyrus', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Atelier Ryza', + Method: 'Construction', + ShipId: 10094, + }, + { + Name: 'Little Anchorage', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Anchorage', + Method: 'Cannot be constructed', + ShipId: 693, + }, + { + Name: 'Little Bel', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 335, + }, + { + Name: 'Little Cheshire', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'Cheshire', + Method: 'Cannot be constructed', + ShipId: 552, + }, + { + Name: 'Little Enterprise', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Yorktown', + Method: 'Construction', + ShipId: 516, + }, + { + Name: 'Little Formidable', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Cannot be constructed', + ShipId: 589, + }, + { + Name: 'Little Friedrich', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Iron Blood', + Method: 'Cannot be constructed', + ShipId: 647, + }, + { + Name: 'Little Illustrious', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 459, + }, + { + Name: 'Little Prinz Eugen', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Cannot be constructed', + ShipId: 549, + }, + { + Name: 'Little Renown', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Royal Navy', + Class: 'Renown', + Method: 'Construction', + ShipId: 451, + }, + { + Name: 'Little Spee', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Deutschland', + Method: 'Cannot be constructed', + ShipId: 568, + }, + { + Name: 'Littorio', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Vittorio Veneto', + Method: 'Construction', + ShipId: 410, + }, + { + Name: 'Liverpool', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 631, + }, + { + Name: 'London', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 119, + RemodelId: 3119, + }, + { + Name: 'Long Island', + Rarity: 'Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Long Island', + Method: 'Construction', + ShipId: 70, + RemodelId: 3070, + }, + { + Name: 'Louisville', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Northampton', + Method: 'Cannot be constructed', + ShipId: 619, + }, + { + Name: 'Luna', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10068, + }, + { + Name: 'Lung Wu', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Lung Wu', + Method: 'Construction', + ShipId: 623, + }, + { + Name: 'Lützow', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Derfflinger', + Method: 'Construction', + ShipId: 544, + }, + { + Name: 'Lyon', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Iris Libre', + Class: 'Lyon', + Method: 'Construction', + ShipId: 602, + }, + { + Name: 'Maestrale', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Maestrale', + Method: 'Construction', + ShipId: 504, + }, + { + Name: 'Magdeburg', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'M (German)', + Method: 'Construction', + ShipId: 525, + }, + { + Name: 'Maggiore Baracca', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Sardegna Empire', + Class: 'Marconi', + Method: 'Construction', + ShipId: 679, + }, + { + Name: 'Maillé Brézé', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iris Libre', + Class: 'Vauquelin', + Method: 'Construction', + ShipId: 523, + }, + { + Name: 'Mainz', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Mainz', + Method: 'Research', + ShipId: 'Plan015', + }, + { + Name: 'Makinami', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Yuugumo', + Method: 'Cannot be constructed', + ShipId: 370, + }, + { + Name: 'Mami Futami', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'The Idolmaster', + Method: 'Construction', + ShipId: 10077, + }, + { + Name: 'Manchester', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 112, + }, + { + Name: 'Marblehead', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Construction', + ShipId: 448, + }, + { + Name: 'Marco Polo', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Marco Polo', + Method: 'Research', + ShipId: 'Plan022', + }, + { + Name: 'Marie Rose', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10061, + }, + { + Name: 'Marseillaise', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Vichya Dominion', + Class: 'La Galissonnière', + Method: 'Construction', + ShipId: 598, + }, + { + Name: 'Mary Celeste', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Submarine)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 611, + }, + { + Name: 'Maryland', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Colorado', + Method: 'Cannot be constructed', + ShipId: 61, + RemodelId: 3061, + }, + { + Name: 'Massachusetts', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'South Dakota', + Method: 'Cannot be constructed', + ShipId: 354, + }, + { + Name: 'Matchless', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'M', + Method: 'Cannot be constructed', + ShipId: 325, + }, + { + Name: 'Matsukaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kamikaze', + Method: 'Construction', + ShipId: 270, + RemodelId: 3270, + }, + { + Name: 'Maury', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Gridley', + Method: 'Construction', + ShipId: 10, + }, + { + Name: 'Maya', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Takao', + Method: 'Drop only', + ShipId: 202, + }, + { + Name: 'McCall', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Gridley', + Method: 'Construction', + ShipId: 9, + }, + { + Name: 'Memphis', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Cannot be constructed', + ShipId: 360, + }, + { + Name: 'Memphis META', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30011, + }, + { + Name: 'Michishio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Asashio', + Method: 'Cannot be constructed', + ShipId: 333, + }, + { + Name: 'Mikasa', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Mikasa', + Method: 'Cannot be constructed', + ShipId: 320, + }, + { + Name: 'Mikazuki', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Drop only', + ShipId: 280, + }, + { + Name: 'Mikuma', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Mogami', + Method: 'Cannot be constructed', + ShipId: 189, + }, + { + Name: 'Miller', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 684, + }, + { + Name: 'Minato Aqua', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Hololive', + Method: 'Construction', + ShipId: 'Collab053', + }, + { + Name: 'Minazuki', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Drop only', + ShipId: 276, + }, + { + Name: 'Minneapolis', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Cannot be constructed', + ShipId: 364, + }, + { + Name: 'Minsk', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Leningrad', + Method: 'Cannot be constructed', + ShipId: 432, + }, + { + Name: 'Misaki', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10064, + }, + { + Name: 'Miyuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Cannot be constructed', + ShipId: 154, + }, + { + Name: 'Mogador', + Rarity: 'Ultra Rare', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Mogador', + Method: 'Cannot be constructed', + ShipId: 642, + }, + { + Name: 'Mogami', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Mogami', + Method: 'Cannot be constructed', + ShipId: 188, + RemodelId: 3188, + }, + { + Name: 'Momo Belia Deviluke', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'To LOVE-Ru', + Method: 'Construction', + ShipId: 10113, + }, + { + Name: 'Monarch', + Rarity: 'Priority', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Monarch', + Method: 'Research', + ShipId: 'Plan002', + }, + { + Name: 'Monica', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10067, + }, + { + Name: 'Montpelier', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 329, + }, + { + Name: 'Morrison', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Cannot be constructed', + ShipId: 515, + }, + { + Name: 'Mujina', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'SSSS', + Method: 'Cannot be constructed', + ShipId: 10087, + }, + { + Name: 'Mullany', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 375, + }, + { + Name: 'Murasaki', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Senran Kagura', + Method: 'Cannot be constructed', + ShipId: 10106, + }, + { + Name: 'Murasaki Shion', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Hololive', + Method: 'Cannot be constructed', + ShipId: 'Collab056', + }, + { + Name: 'Murmansk', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Omaha', + Method: 'Construction', + ShipId: 498, + }, + { + Name: 'Musashi', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Yamato', + Method: 'Construction', + ShipId: 217, + }, + { + Name: 'Musketeer', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'M', + Method: 'Cannot be constructed', + ShipId: 326, + }, + { + Name: 'Mutsu', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Nagato', + Method: 'Cannot be constructed', + ShipId: 213, + }, + { + Name: 'Mutsuki', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Construction', + ShipId: 271, + RemodelId: 3271, + }, + { + Name: 'Myoukou', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Myoukou', + Method: 'Drop only', + ShipId: 196, + }, + { + Name: 'Nachi', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Myoukou', + Method: 'Drop only', + ShipId: 197, + RemodelId: 3197, + }, + { + Name: 'Naganami', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Yuugumo', + Method: 'Construction', + ShipId: 450, + }, + { + Name: 'Nagara', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Construction', + ShipId: 182, + }, + { + Name: 'Nagato', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Nagato', + Method: 'Cannot be constructed', + ShipId: 212, + }, + { + Name: 'Nagato META', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30037, + }, + { + Name: 'Nagatsuki', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Cannot be constructed', + ShipId: 278, + }, + { + Name: 'Nagisa', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10065, + }, + { + Name: 'Naka', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Sendai', + Method: 'Construction', + ShipId: 310, + }, + { + Name: 'Nakiri Ayame', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Hololive', + Method: 'Construction', + ShipId: 'Collab055', + }, + { + Name: 'Namiko', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10084, + }, + { + Name: 'Nana Astar Deviluke', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'To LOVE-Ru', + Method: 'Construction', + ShipId: 10112, + }, + { + Name: 'Napoli', + Rarity: 'Decisive', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Napoli', + Method: 'Research', + ShipId: 20035, + }, + { + Name: 'Natori', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Construction', + ShipId: 184, + }, + { + Name: 'Natsuiro Matsuri', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Hololive', + Method: 'Construction', + ShipId: 'Collab054', + }, + { + Name: 'Nautilus', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Eagle Union', + Class: 'Narwhal', + Method: 'Construction', + ShipId: 519, + }, + { + Name: 'Nekone', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Utawarerumono', + Method: 'Construction', + ShipId: 'Collab032', + }, + { + Name: 'Nelson', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Nelson', + Method: 'Construction', + ShipId: 132, + RemodelId: 3132, + }, + { + Name: 'Neptune', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Neptune', + Method: 'Research', + ShipId: 'Plan001', + }, + { + Name: 'Neptune (Neptunia)', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Neptunia', + Method: 'Cannot be constructed', + ShipId: 'Collab001', + }, + { + Name: 'Nevada', + Rarity: 'Normal', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Nevada', + Method: 'Construction', + ShipId: 52, + RemodelId: 3052, + }, + { + Name: 'Nevada META', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30046, + }, + { + Name: 'New Jersey', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Iowa', + Method: 'Construction', + ShipId: 68, + }, + { + Name: 'New Orleans', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Drop only', + ShipId: 521, + }, + { + Name: 'Newcastle', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Cannot be constructed', + ShipId: 361, + RemodelId: 3361, + }, + { + Name: 'Nicholas', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Drop only', + ShipId: 301, + RemodelId: 3301, + }, + { + Name: 'Nicoloso da Recco', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Navigatori', + Method: 'Construction', + ShipId: 506, + }, + { + Name: 'Niizuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Drop only', + ShipId: 295, + }, + { + Name: 'Ning Hai', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Ning Hai', + Method: 'Cannot be constructed', + ShipId: 258, + RemodelId: 3258, + }, + { + Name: 'Noire', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab002', + }, + { + Name: 'Norfolk', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 123, + }, + { + Name: 'North Carolina', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'North Carolina', + Method: 'Cannot be constructed', + ShipId: 63, + }, + { + Name: 'Northampton', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Northampton', + Method: 'Construction', + ShipId: 41, + }, + { + Name: 'Northampton II', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Oregon City', + Method: 'Construction', + ShipId: 575, + }, + { + Name: 'Noshiro', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Agano', + Method: 'Construction', + ShipId: 322, + }, + { + Name: 'Noshiro µ', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Agano', + Method: 'Construction', + ShipId: 635, + }, + { + Name: 'Nowaki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Cannot be constructed', + ShipId: 170, + }, + { + Name: 'Nubian', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'Tribal', + Method: 'Construction', + ShipId: 630, + }, + { + Name: 'Nürnberg', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'Leipzig', + Method: 'Construction', + ShipId: 486, + }, + { + Name: 'Nyotengu', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Venus Vacation', + Method: 'Cannot be constructed', + ShipId: 10066, + }, + { + Name: 'Odin', + Rarity: 'Priority', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Odin', + Method: 'Research', + ShipId: 'Plan016', + }, + { + Name: 'Ognevoy', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Ognevoy', + Method: 'Construction', + ShipId: 626, + }, + { + Name: 'Oite', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kamikaze', + Method: 'Construction', + ShipId: 507, + }, + { + Name: 'Oklahoma', + Rarity: 'Normal', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Nevada', + Method: 'Construction', + ShipId: 53, + RemodelId: 3053, + }, + { + Name: 'Oleg', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Bogatyr', + Method: 'Cannot be constructed', + ShipId: 688, + }, + { + Name: 'Omaha', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Construction', + ShipId: 29, + }, + { + Name: 'Ookami Mio', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Hololive', + Method: 'Cannot be constructed', + ShipId: 'Collab057', + }, + { + Name: 'Ooshio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Asashio', + Method: 'Construction', + ShipId: 332, + }, + { + Name: 'Otto von Alvensleben', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1937J', + Method: 'Construction', + ShipId: 590, + }, + { + Name: 'Owari', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Kii', + Method: 'Construction', + ShipId: 606, + }, + { + Name: 'Oyashio', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 178, + }, + { + Name: 'Painlevé', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Iris Libre', + Class: 'Joffre', + Method: 'Construction', + ShipId: 599, + }, + { + Name: 'Pamiat' Merkuria', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Bogatyr', + Method: 'Construction', + ShipId: 434, + RemodelId: 3434, + }, + { + Name: 'Pamiat' Merkuria META', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'Construction', + ShipId: 30030, + }, + { + Name: 'Patricia Abelheim', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Atelier Ryza', + Method: 'Construction', + ShipId: 10093, + }, + { + Name: 'Penelope', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Arethusa', + Method: 'Construction', + ShipId: 495, + }, + { + Name: 'Pennsylvania', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Pennsylvania', + Method: 'Construction', + ShipId: 54, + }, + { + Name: 'Pensacola', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Pensacola', + Method: 'Construction', + ShipId: 39, + }, + { + Name: 'Perseus', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Colossus', + Method: 'Construction', + ShipId: 462, + }, + { + Name: 'Peter Strasser', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Graf Zeppelin', + Method: 'Construction', + ShipId: 482, + }, + { + Name: 'Phoenix', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 32, + }, + { + Name: 'Ping Hai', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Ning Hai', + Method: 'Cannot be constructed', + ShipId: 259, + RemodelId: 3259, + }, + { + Name: 'Pittsburgh', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Baltimore', + Method: 'Construction', + ShipId: 655, + }, + { + Name: 'Plymouth', + Rarity: 'Decisive', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Plymouth', + Method: 'Research', + ShipId: 20023, + }, + { + Name: 'Pola', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Zara', + Method: 'Construction', + ShipId: 489, + }, + { + Name: 'Poltava', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Gangut', + Method: 'Construction', + ShipId: 628, + }, + { + Name: 'Pompeo Magno', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Capitani Romani', + Method: 'Construction', + ShipId: 541, + }, + { + Name: 'Portland', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Portland', + Method: 'Construction', + ShipId: 44, + RemodelId: 3044, + }, + { + Name: 'Portsmouth Adventure', + Rarity: 'Elite', + Type: 'Sailing Frigate (Vanguard)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 667, + }, + { + Name: 'Prince of Wales', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'King George V', + Method: 'Cannot be constructed', + ShipId: 135, + }, + { + Name: 'Princess Hime', + Rarity: 'Super Rare', + Type: 'Munition Ship', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10089, + }, + { + Name: 'Princeton', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Independence', + Method: 'Construction', + ShipId: 473, + }, + { + Name: 'Princeton META', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30026, + }, + { + Name: 'Prinz Adalbert', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'P', + Method: 'Construction', + ShipId: 527, + }, + { + Name: 'Prinz Eugen', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Construction', + ShipId: 244, + }, + { + Name: 'Prinz Eugen µ', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Admiral Hipper', + Method: 'Construction', + ShipId: 634, + }, + { + Name: 'Prinz Heinrich', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'P', + Method: 'Construction', + ShipId: 483, + }, + { + Name: 'Prinz Rupprecht', + Rarity: 'Priority', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Prinz Rupprecht', + Method: 'Research', + ShipId: 20024, + }, + { + Name: 'Prototype Bulin MKII', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Universal', + Class: 'Bulin', + Method: 'Cannot be constructed', + ShipId: 2, + }, + { + Name: 'Purple Heart', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab005', + }, + { + Name: 'Queen Elizabeth', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Queen Elizabeth', + Method: 'Construction', + ShipId: 130, + }, + { + Name: 'Queen Elizabeth META', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30019, + }, + { + Name: 'Quincy', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Cannot be constructed', + ShipId: 47, + }, + { + Name: 'Radford', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Drop only', + ShipId: 299, + }, + { + Name: 'Raffaello', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Raffaello', + Method: 'Construction', + ShipId: 678, + }, + { + Name: 'Raleigh', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Construction', + ShipId: 30, + }, + { + Name: 'Ranger', + Rarity: 'Normal', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Ranger', + Method: 'Construction', + ShipId: 75, + RemodelId: 3075, + }, + { + Name: 'Regensburg', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Iron Blood', + Class: 'M (German)', + Method: 'Construction', + ShipId: 592, + }, + { + Name: 'Reisalin Stout', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Atelier Ryza', + Method: 'Construction', + ShipId: 10091, + }, + { + Name: 'Reno', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Construction', + ShipId: 445, + }, + { + Name: 'Renown', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Royal Navy', + Class: 'Renown', + Method: 'Construction', + ShipId: 127, + }, + { + Name: 'Renown META', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30014, + }, + { + Name: 'Repulse', + Rarity: 'Rare', + Type: 'Battlecruiser', + Nationality: 'Royal Navy', + Class: 'Renown', + Method: 'Construction', + ShipId: 128, + }, + { + Name: 'Repulse META', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30012, + }, + { + Name: 'Revenge', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Revenge', + Method: 'Construction', + ShipId: 554, + }, + { + Name: 'Richelieu', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Iris Libre', + Class: 'Richelieu', + Method: 'Construction', + ShipId: 453, + }, + { + Name: 'Richmond', + Rarity: 'Normal', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Omaha', + Method: 'Drop only', + ShipId: 303, + }, + { + Name: 'Rikka Takarada', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10081, + }, + { + Name: 'Ritsuko Akizuki', + Rarity: 'Elite', + Type: 'Munition Ship', + Nationality: 'The Idolmaster', + Method: 'Cannot be constructed', + ShipId: 10075, + }, + { + Name: 'Rodney', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Nelson', + Method: 'Construction', + ShipId: 133, + }, + { + Name: 'Rodney META', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30031, + }, + { + Name: 'Roma', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Vittorio Veneto', + Method: 'Construction', + ShipId: 561, + }, + { + Name: 'Roon', + Rarity: 'Priority', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Roon', + Method: 'Research', + ShipId: 'Plan005', + }, + { + Name: 'Roon µ', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Roon', + Method: 'Cannot be constructed', + ShipId: 479, + }, + { + Name: 'Royal Fortune', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Submarine)', + Nationality: 'Tempesta', + Method: 'Cannot be constructed', + ShipId: 571, + }, + { + Name: 'Royal Oak', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Revenge', + Method: 'Construction', + ShipId: 582, + }, + { + Name: 'Rurutie', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Utawarerumono', + Method: 'Construction', + ShipId: 'Collab033', + }, + { + Name: 'Ryuuhou', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Zuihou', + Method: 'Construction', + ShipId: 426, + }, + { + Name: 'Ryuujou', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Ryuujou', + Method: 'Cannot be constructed', + ShipId: 223, + }, + { + Name: 'Saint Louis', + Rarity: 'Priority', + Type: 'Heavy Cruiser', + Nationality: 'Iris Libre', + Class: 'Saint Louis', + Method: 'Research', + ShipId: 'Plan006', + }, + { + Name: 'Sakawa', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Agano', + Method: 'Construction', + ShipId: 324, + }, + { + Name: 'Salt Lake City', + Rarity: 'Normal', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Pensacola', + Method: 'Drop only', + ShipId: 40, + }, + { + Name: 'San Diego', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Construction', + ShipId: 36, + RemodelId: 3036, + }, + { + Name: 'San Francisco', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Construction', + ShipId: 512, + }, + { + Name: 'San Jacinto', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Independence', + Method: 'Construction', + ShipId: 618, + }, + { + Name: 'San Juan', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Atlanta', + Method: 'Cannot be constructed', + ShipId: 404, + }, + { + Name: 'Santa Fe', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Cleveland', + Method: 'Construction', + ShipId: 683, + }, + { + Name: 'São Martinho', + Rarity: 'Super Rare', + Type: 'Sailing Frigate (Main)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 613, + }, + { + Name: 'Saraana', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Utawarerumono', + Method: 'Cannot be constructed', + ShipId: 'Collab035', + }, + { + Name: 'Saratoga', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Lexington', + Method: 'Construction', + ShipId: 74, + RemodelId: 3074, + }, + { + Name: 'Scharnhorst', + Rarity: 'Elite', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Scharnhorst', + Method: 'Cannot be constructed', + ShipId: 248, + }, + { + Name: 'Scharnhorst META', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30009, + }, + { + Name: 'Scylla', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Construction', + ShipId: 584, + }, + { + Name: 'Seattle', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Seattle', + Method: 'Research', + ShipId: 'Plan007', + }, + { + Name: 'Sendai', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Sendai', + Method: 'Drop only', + ShipId: 308, + RemodelId: 3308, + }, + { + Name: 'Serri Glaus', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Atelier Ryza', + Method: 'Construction', + ShipId: 10095, + }, + { + Name: 'Sevastopol', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Gangut', + Method: 'Construction', + ShipId: 587, + }, + { + Name: 'Seydlitz', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Iron Blood', + Class: 'Seydlitz', + Method: 'Construction', + ShipId: 543, + }, + { + Name: 'Shangri-La', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 378, + }, + { + Name: 'Sheffield', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Cannot be constructed', + ShipId: 111, + }, + { + Name: 'Sheffield µ', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Cannot be constructed', + ShipId: 421, + }, + { + Name: 'Sheffield META', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30018, + }, + { + Name: 'Shigure', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Drop only', + ShipId: 165, + RemodelId: 3165, + }, + { + Name: 'Shimakaze', + Rarity: 'Ultra Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shimakaze', + Method: 'Construction', + ShipId: 268, + }, + { + Name: 'Shimanto', + Rarity: 'Priority', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Shimanto', + Method: 'Research', + ShipId: 20029, + }, + { + Name: 'Shinano', + Rarity: 'Ultra Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Yamato', + Method: 'Construction', + ShipId: 231, + }, + { + Name: 'Shinano-chan', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Yamato', + Method: 'Cannot be constructed', + ShipId: 639, + }, + { + Name: 'Shirakami Fubuki', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Hololive', + Method: 'Construction', + ShipId: 'Collab051', + }, + { + Name: 'Shiranui', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Drop only', + ShipId: 168, + RemodelId: 3168, + }, + { + Name: 'Shiratsuyu', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Drop only', + ShipId: 163, + }, + { + Name: 'Shirayuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Construction', + ShipId: 152, + }, + { + Name: 'Shouhou', + Rarity: 'Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Shouhou', + Method: 'Cannot be constructed', + ShipId: 222, + RemodelId: 3222, + }, + { + Name: 'Shoukaku', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Shoukaku', + Method: 'Cannot be constructed', + ShipId: 228, + }, + { + Name: 'Shropshire', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 120, + RemodelId: 3120, + }, + { + Name: 'Sims', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Sims', + Method: 'Cannot be constructed', + ShipId: 26, + RemodelId: 3026, + }, + { + Name: 'Sirius', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Dido', + Method: 'Cannot be constructed', + ShipId: 371, + }, + { + Name: 'Smalley', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 417, + }, + { + Name: 'Soobrazitelny', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Storozhevoy', + Method: 'Cannot be constructed', + ShipId: 537, + }, + { + Name: 'Souryuu', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Souryuu', + Method: 'Drop only', + ShipId: 226, + RemodelId: 3226, + }, + { + Name: 'Souryuu META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30004, + }, + { + Name: 'South Dakota', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'South Dakota', + Method: 'Cannot be constructed', + ShipId: 65, + }, + { + Name: 'Southampton', + Rarity: 'Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Town', + Method: 'Construction', + ShipId: 110, + }, + { + Name: 'Sovetskaya Belorussiya', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Sovetsky Soyuz', + Method: 'Construction', + ShipId: 440, + }, + { + Name: 'Sovetskaya Rossiya', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Sovetsky Soyuz', + Method: 'Construction', + ShipId: 441, + }, + { + Name: 'Sovetsky Soyuz', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Northern Parliament', + Class: 'Sovetsky Soyuz', + Method: 'Construction', + ShipId: 438, + }, + { + Name: 'Specialized Bulin Custom MKIII', + Rarity: 'Ultra Rare', + Type: 'Destroyer', + Nationality: 'Universal', + Class: 'Bulin', + Method: 'Cannot be constructed', + ShipId: 3, + }, + { + Name: 'Spence', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 17, + }, + { + Name: 'St. Louis', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Eagle Union', + Class: 'Brooklyn', + Method: 'Construction', + ShipId: 305, + }, + { + Name: 'Stanly', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 409, + }, + { + Name: 'Stephen Potter', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Construction', + ShipId: 509, + }, + { + Name: 'Strasbourg', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Vichya Dominion', + Class: 'Dunkerque', + Method: 'Construction', + ShipId: 652, + }, + { + Name: 'Stremitelny', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Gnevny', + Method: 'Construction', + ShipId: 491, + }, + { + Name: 'Suffolk', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 122, + RemodelId: 3122, + }, + { + Name: 'Suffren', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iris Libre', + Class: 'Suffren', + Method: 'Construction', + ShipId: 600, + }, + { + Name: 'Super Gamer Kizuna AI', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'KizunaAI', + Method: 'Construction', + ShipId: 'Collab044', + }, + { + Name: 'Surcouf', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iris Libre', + Class: 'Surcouf', + Method: 'Construction', + ShipId: 350, + }, + { + Name: 'Suruga', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Kii', + Method: 'Construction', + ShipId: 425, + }, + { + Name: 'Sussex', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'County', + Method: 'Construction', + ShipId: 337, + }, + { + Name: 'Suzunami', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Yuugumo', + Method: 'Construction', + ShipId: 663, + }, + { + Name: 'Suzutsuki', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Construction', + ShipId: 468, + }, + { + Name: 'Suzuya', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Mogami', + Method: 'Construction', + ShipId: 382, + }, + { + Name: 'Svirepy', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Storozhevoy', + Method: 'Cannot be constructed', + ShipId: 627, + }, + { + Name: 'Swiftsure', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Royal Navy', + Class: 'Minotaur', + Method: 'Construction', + ShipId: 393, + }, + { + Name: 'Tai Yuan', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Dragon Empery', + Class: 'Anshan', + Method: 'Cannot be constructed', + ShipId: 256, + RemodelId: 3256, + }, + { + Name: 'Taihou', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Taihou', + Method: 'Construction', + ShipId: 230, + }, + { + Name: 'Taihou µ', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Taihou', + Method: 'Construction', + ShipId: 474, + }, + { + Name: 'Taihou META', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'META', + Method: 'META', + ShipId: 30041, + }, + { + Name: 'Taihou-chan', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Taihou', + Method: 'Cannot be constructed', + ShipId: 594, + }, + { + Name: 'Takao', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Takao', + Method: 'Construction', + ShipId: 200, + }, + { + Name: 'Tallinn', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Northern Parliament', + Class: 'Admiral Hipper', + Method: 'Construction', + ShipId: 496, + }, + { + Name: 'Tamaki', + Rarity: 'Super Rare', + Type: 'Battlecruiser', + Nationality: 'Venus Vacation', + Method: 'Construction', + ShipId: 10069, + }, + { + Name: 'Tanikaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 319, + RemodelId: 3319, + }, + { + Name: 'Tartu', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Vauquelin', + Method: 'Construction', + ShipId: 452, + }, + { + Name: 'Tashkent', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Tashkent', + Method: 'Construction', + ShipId: 433, + }, + { + Name: 'Tashkent µ', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Northern Parliament', + Class: 'Tashkent', + Method: 'Construction', + ShipId: 475, + }, + { + Name: 'Tennessee', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Tennessee', + Method: 'Construction', + ShipId: 58, + }, + { + Name: 'Terror', + Rarity: 'Elite', + Type: 'Monitor', + Nationality: 'Royal Navy', + Class: 'Erebus', + Method: 'Construction', + ShipId: 150, + }, + { + Name: 'Thatcher', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Eagle Union', + Class: 'Fletcher', + Method: 'Cannot be constructed', + ShipId: 14, + }, + { + Name: 'The 2nd', + Rarity: 'Super Rare', + Type: 'Aviation Battleship', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10088, + }, + { + Name: 'Theseus', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Colossus', + Method: 'Construction', + ShipId: 578, + }, + { + Name: 'Thüringen', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Helgoland', + Method: 'Cannot be constructed', + ShipId: 545, + }, + { + Name: 'Ticonderoga', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 511, + }, + { + Name: 'Ting An', + Rarity: 'Elite', + Type: 'Munition Ship', + Nationality: 'Dragon Empery', + Class: 'Ting An', + Method: 'Cannot be constructed', + ShipId: 580, + }, + { + Name: 'Tirpitz', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Bismarck', + Method: 'Cannot be constructed', + ShipId: 251, + }, + { + Name: 'Tokino Sora', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Hololive', + Method: 'Construction', + ShipId: 'Collab052', + }, + { + Name: 'Torricelli', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Sardegna Empire', + Class: 'Brin', + Method: 'Cannot be constructed', + ShipId: 503, + }, + { + Name: 'Tosa', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Tosa', + Method: 'Construction', + ShipId: 215, + }, + { + Name: 'Trento', + Rarity: 'Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Trento', + Method: 'Cannot be constructed', + ShipId: 414, + }, + { + Name: 'Trento META', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30013, + }, + { + Name: 'Trieste', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Trento', + Method: 'Construction', + ShipId: 542, + }, + { + Name: 'U-101', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIB', + Method: 'Construction', + ShipId: 399, + }, + { + Name: 'U-110', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type IXB', + Method: 'Construction', + ShipId: 416, + }, + { + Name: 'U-1206', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Cannot be constructed', + ShipId: 528, + }, + { + Name: 'U-31', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIA', + Method: 'Construction', + ShipId: 650, + }, + { + Name: 'U-37', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type IXA', + Method: 'Construction', + ShipId: 484, + }, + { + Name: 'U-410', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Cannot be constructed', + ShipId: 492, + }, + { + Name: 'U-47', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIB', + Method: 'Construction', + ShipId: 343, + }, + { + Name: 'U-522', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type IXC', + Method: 'Construction', + ShipId: 400, + }, + { + Name: 'U-556', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Construction', + ShipId: 386, + }, + { + Name: 'U-556 META', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'META', + Method: 'Construction', + ShipId: 30021, + }, + { + Name: 'U-557', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Cannot be constructed', + ShipId: 344, + }, + { + Name: 'U-73', + Rarity: 'Elite', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIB', + Method: 'Construction', + ShipId: 387, + }, + { + Name: 'U-81', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Construction', + ShipId: 341, + }, + { + Name: 'U-96', + Rarity: 'Super Rare', + Type: 'Submarine', + Nationality: 'Iron Blood', + Class: 'Type VIIC', + Method: 'Construction', + ShipId: 467, + }, + { + Name: 'Ulrich von Hutten', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Iron Blood', + Class: 'Ulrich von Hutten', + Method: 'Construction', + ShipId: 529, + }, + { + Name: 'Umikaze', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Construction', + ShipId: 286, + }, + { + Name: 'Unicorn', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Unicorn', + Method: 'Construction', + ShipId: 142, + RemodelId: 3142, + }, + { + Name: 'Universal Bulin', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Universal', + Class: 'Bulin', + Method: 'Cannot be constructed', + ShipId: 1, + }, + { + Name: 'Unzen', + Rarity: 'Ultra Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sakura Empire', + Class: 'Unzen', + Method: 'Construction', + ShipId: 605, + }, + { + Name: 'Urakaze', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Construction', + ShipId: 316, + }, + { + Name: 'Uranami', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Fubuki', + Method: 'Cannot be constructed', + ShipId: 429, + }, + { + Name: 'Uruuru', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Utawarerumono', + Method: 'Construction', + ShipId: 'Collab034', + }, + { + Name: 'Uzuki', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Mutsuki', + Method: 'Construction', + ShipId: 274, + }, + { + Name: 'Valiant', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Queen Elizabeth', + Method: 'Construction', + ShipId: 464, + }, + { + Name: 'Vampire', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Royal Navy', + Class: 'V', + Method: 'Cannot be constructed', + ShipId: 103, + }, + { + Name: 'Vampire META', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'META', + Method: 'META', + ShipId: 30032, + }, + { + Name: 'Vanguard', + Rarity: 'Ultra Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Vanguard', + Method: 'Construction', + ShipId: 137, + }, + { + Name: 'Vauquelin', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Vichya Dominion', + Class: 'Vauquelin', + Method: 'Construction', + ShipId: 457, + }, + { + Name: 'Vert', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Neptunia', + Method: 'Cannot be constructed', + ShipId: 'Collab004', + }, + { + Name: 'Vestal', + Rarity: 'Elite', + Type: 'Repair Ship', + Nationality: 'Eagle Union', + Class: 'Vestal', + Method: 'Construction', + ShipId: 80, + }, + { + Name: 'Vestal META', + Rarity: 'Elite', + Type: 'Repair Ship', + Nationality: 'META', + Method: 'META', + ShipId: 30022, + }, + { + Name: 'Victorious', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Royal Navy', + Class: 'Illustrious', + Method: 'Construction', + ShipId: 146, + }, + { + Name: 'Vincennes', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'New Orleans', + Method: 'Cannot be constructed', + ShipId: 48, + }, + { + Name: 'Vincenzo Gioberti', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sardegna Empire', + Class: 'Alfredo Oriani', + Method: 'Construction', + ShipId: 490, + }, + { + Name: 'Vittorio Veneto', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Sardegna Empire', + Class: 'Vittorio Veneto', + Method: 'Construction', + ShipId: 500, + }, + { + Name: 'Volga', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Northern Parliament', + Class: 'Volga', + Method: 'Construction', + ShipId: 538, + }, + { + Name: 'Voroshilov', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Northern Parliament', + Class: 'Kirov', + Method: 'Construction', + ShipId: 588, + }, + { + Name: 'Wakaba', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Hatsuharu', + Method: 'Construction', + ShipId: 173, + }, + { + Name: 'Wakatsuki', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Construction', + ShipId: 567, + }, + { + Name: 'Warspite', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Royal Navy', + Class: 'Queen Elizabeth', + Method: 'Construction', + ShipId: 131, + RemodelId: 3131, + }, + { + Name: 'Washington', + Rarity: 'Super Rare', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'North Carolina', + Method: 'Cannot be constructed', + ShipId: 64, + }, + { + Name: 'Wasp', + Rarity: 'Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Wasp', + Method: 'Cannot be constructed', + ShipId: 79, + }, + { + Name: 'Watarase', + Rarity: 'Super Rare', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Watarase', + Method: 'Construction', + ShipId: 661, + }, + { + Name: 'Weser', + Rarity: 'Elite', + Type: 'Light Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Weser', + Method: 'Construction', + ShipId: 485, + }, + { + Name: 'West Virginia', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'Eagle Union', + Class: 'Colorado', + Method: 'Cannot be constructed', + ShipId: 62, + RemodelId: 3062, + }, + { + Name: 'White Heart', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Neptunia', + Method: 'Construction', + ShipId: 'Collab007', + }, + { + Name: 'Whydah', + Rarity: 'Elite', + Type: 'Sailing Frigate (Submarine)', + Nationality: 'Tempesta', + Method: 'Construction', + ShipId: 614, + }, + { + Name: 'Wichita', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Eagle Union', + Class: 'Wichita', + Method: 'Construction', + ShipId: 49, + }, + { + Name: 'Wichita META', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'META', + Method: 'META', + ShipId: 30035, + }, + { + Name: 'Yamakaze', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Cannot be constructed', + ShipId: 287, + }, + { + Name: 'Yamashiro', + Rarity: 'Rare', + Type: 'Battleship', + Nationality: 'Sakura Empire', + Class: 'Fusou', + Method: 'Drop only', + ShipId: 209, + RemodelId: 3209, + }, + { + Name: 'Yamashiro META', + Rarity: 'Elite', + Type: 'Battleship', + Nationality: 'META', + Method: 'META', + ShipId: 30010, + }, + { + Name: 'Yat Sen', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Yat Sen', + Method: 'Construction', + ShipId: 257, + RemodelId: 3257, + }, + { + Name: 'Ying Swei', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Dragon Empery', + Class: 'Chao Ho', + Method: 'Construction', + ShipId: 493, + }, + { + Name: 'Yoizuki', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Akizuki', + Method: 'Cannot be constructed', + ShipId: 297, + }, + { + Name: 'Yorck', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Iron Blood', + Class: 'Roon (1903)', + Method: 'Construction', + ShipId: 546, + }, + { + Name: 'York', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Royal Navy', + Class: 'York', + Method: 'Construction', + ShipId: 125, + RemodelId: 3125, + }, + { + Name: 'Yorktown', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Yorktown', + Method: 'Construction', + ShipId: 76, + }, + { + Name: 'Yorktown II', + Rarity: 'Ultra Rare', + Type: 'Aircraft Carrier', + Nationality: 'Eagle Union', + Class: 'Essex', + Method: 'Construction', + ShipId: 574, + }, + { + Name: 'Yui Kotegawa', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'To LOVE-Ru', + Method: 'Cannot be constructed', + ShipId: 10116, + }, + { + Name: 'Yukikaze', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Kagerou', + Method: 'Cannot be constructed', + ShipId: 166, + }, + { + Name: 'Yume Minami', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'SSSS', + Method: 'Construction', + ShipId: 10085, + }, + { + Name: 'Yumi', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Senran Kagura', + Method: 'Construction', + ShipId: 10104, + }, + { + Name: 'Yura', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Nagara', + Method: 'Construction', + ShipId: 185, + }, + { + Name: 'Yuubari', + Rarity: 'Elite', + Type: 'Light Cruiser', + Nationality: 'Sakura Empire', + Class: 'Yuubari', + Method: 'Construction', + ShipId: 179, + RemodelId: 3179, + }, + { + Name: 'Yuudachi', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Shiratsuyu', + Method: 'Drop only', + ShipId: 164, + RemodelId: 3164, + }, + { + Name: 'Yuugure', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Sakura Empire', + Class: 'Hatsuharu', + Method: 'Construction', + ShipId: 176, + RemodelId: 3176, + }, + { + Name: 'Yūyaki', + Rarity: 'Elite', + Type: 'Heavy Cruiser', + Nationality: 'Senran Kagura', + Method: 'Construction', + ShipId: 10107, + }, + { + Name: 'Z1', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1934', + Method: 'Cannot be constructed', + ShipId: 233, + RemodelId: 3233, + }, + { + Name: 'Z11', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1934A', + Method: 'Construction', + ShipId: 673, + }, + { + Name: 'Z16', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1934A', + Method: 'Construction', + ShipId: 564, + }, + { + Name: 'Z18', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936', + Method: 'Cannot be constructed', + ShipId: 346, + }, + { + Name: 'Z19', + Rarity: 'Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936', + Method: 'Construction', + ShipId: 264, + }, + { + Name: 'Z2', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1934', + Method: 'Construction', + ShipId: 379, + }, + { + Name: 'Z20', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936', + Method: 'Drop only', + ShipId: 265, + }, + { + Name: 'Z21', + Rarity: 'Normal', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936', + Method: 'Drop only', + ShipId: 266, + }, + { + Name: 'Z23', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936A', + Method: 'Construction', + ShipId: 236, + RemodelId: 3236, + }, + { + Name: 'Z24', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936A', + Method: 'Cannot be constructed', + ShipId: 487, + }, + { + Name: 'Z25', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936A', + Method: 'Cannot be constructed', + ShipId: 237, + }, + { + Name: 'Z26', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936A', + Method: 'Construction', + ShipId: 466, + }, + { + Name: 'Z28', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936A', + Method: 'Cannot be constructed', + ShipId: 488, + }, + { + Name: 'Z35', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936B', + Method: 'Cannot be constructed', + ShipId: 345, + }, + { + Name: 'Z36', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936B', + Method: 'Construction', + ShipId: 388, + }, + { + Name: 'Z43', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936B', + Method: 'Cannot be constructed', + ShipId: 651, + }, + { + Name: 'Z46', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936C', + Method: 'Cannot be constructed', + ShipId: 267, + }, + { + Name: 'Z47', + Rarity: 'Super Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1936C', + Method: 'Construction', + ShipId: 649, + }, + { + Name: 'Z52', + Rarity: 'Ultra Rare', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1944', + Method: 'Cannot be constructed', + ShipId: 670, + }, + { + Name: 'Z9', + Rarity: 'Elite', + Type: 'Destroyer', + Nationality: 'Iron Blood', + Class: 'Type 1934A', + Method: 'Cannot be constructed', + ShipId: 672, + }, + { + Name: 'Zara', + Rarity: 'Super Rare', + Type: 'Heavy Cruiser', + Nationality: 'Sardegna Empire', + Class: 'Zara', + Method: 'Construction', + ShipId: 413, + }, + { + Name: 'Zeppy', + Rarity: 'Elite', + Type: 'Aircraft Carrier', + Nationality: 'Iron Blood', + Class: 'Graf Zeppelin', + Method: 'Construction', + ShipId: 385, + }, + { + Name: 'Zuihou', + Rarity: 'Super Rare', + Type: 'Light Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Zuihou', + Method: 'Construction', + ShipId: 221, + }, + { + Name: 'Zuikaku', + Rarity: 'Super Rare', + Type: 'Aircraft Carrier', + Nationality: 'Sakura Empire', + Class: 'Shoukaku', + Method: 'Cannot be constructed', + ShipId: 229, + }, +]; + +export const shipsKeyedByShipId = ShipData.reduce( + (acc, ship) => { + acc[ship.ShipId] = ship; + return acc; + }, + {} as Record, +); diff --git a/packages/site/assets/scripts/old/bluesky.tsx b/packages/site/assets/scripts/old/bluesky.tsx new file mode 100644 index 0000000..3aa42c8 --- /dev/null +++ b/packages/site/assets/scripts/old/bluesky.tsx @@ -0,0 +1,113 @@ +import jsx from './jsx'; +import { getElementsByClassName, skeleton } from './utils'; + +interface Reply { + post: { + uri: string; + author: { + displayName: string; + handle: string; + avatar: string; + }; + record: { + createdAt: string; + text: string; + facets: { + index: { + byteStart: number; + byteEnd: number; + }; + features: { + uri: string; // This only applies to app.bsky.richtext.facet#link - need to expand this to handle other items + }[]; + }[]; + }; + }; +} + +const Post = (reply: Reply) => { + const postRecord = reply.post; + + const postId = postRecord.uri.split('/').pop(); + let postText = postRecord.record.text; + if (postRecord.record.facets) { + postRecord.record.facets.forEach((facet) => { + const index = facet.index; + const feature = facet.features[0].uri; // Naive? + postText = + postText.substring(0, index.byteStart) + + feature + + postText.substring(index.byteEnd); + }); + } + + return ( +
+
+ +
+
+

+ + {postRecord.author.displayName} + + + {new Date(postRecord.record.createdAt).toLocaleString()} + +

+

+ {...postText.split('\n').map((chunk) => ( + + {chunk} +
+
+ ))} +

+
+
+ ); +}; + +export const setupBlueSkyComments = async () => { + const commentElement = getElementsByClassName('blueskyComments')?.[0]; + const renderTarget = getElementsByClassName( + 'blueskyCommentsRenderTarget', + )?.[0]; + + if (commentElement && renderTarget) { + renderTarget.append(skeleton('100%', '100px')); + const postId = commentElement.getAttribute('data-blueskyId'); + + if (postId) { + const ATURI = encodeURI( + `at://did:plc:lpxtxymhlfbs5foxba7mfewt/app.bsky.feed.post/${postId}`, + ); + + const request = await fetch( + `https://public.api.bsky.app/xrpc/app.bsky.feed.getPostThread?uri=${ATURI}`, + {}, + ); + + const response = await request.json(); + const replies = response?.thread?.replies as Reply[]; + + console.log('Replies', replies); + + if (replies) { + renderTarget.innerHTML = ''; + renderTarget.append(...replies.map((reply) => Post(reply))); + } else { + renderTarget.innerHTML = ''; + } + } + } +}; diff --git a/packages/site/assets/scripts/old/canvas-scratch/canvas-scratch.ts b/packages/site/assets/scripts/old/canvas-scratch/canvas-scratch.ts new file mode 100644 index 0000000..ece173f --- /dev/null +++ b/packages/site/assets/scripts/old/canvas-scratch/canvas-scratch.ts @@ -0,0 +1,196 @@ +// @ts-ignore + +let previousTimeStamp: number = 0; +export let keys: string[] = []; +export const setKeysDown = (newKeys: string[]) => (keys = newKeys); + +const timeToBottomMs = 1000; +let msPassed = 0; + +const noteHeight = 25; +const noteWidth = noteHeight * 2; +const endZone = 720 - noteHeight * 2; + +const timingWindows: Record = { + perfect: 27, + great: 48, + good: 72, + ok: 96, +} as const; +const worstWindow = + timingWindows[ + Object.keys(timingWindows)[Object.keys(timingWindows).length - 1] + ]; + +let score = 0; +const scorePerWindow: Record = { + perfect: 100, + great: 50, + good: 25, + ok: 10, + miss: 0, +}; + +let lastHit: { + window: string; + off: number; + hitTime: number; + lane: number; +}; + +const getTimingWindow = (hitWindow: number): string => { + for (let i = 0; i <= Object.keys(timingWindows).length; i++) { + const currentKey = Object.keys(timingWindows)[i]; + const previousKey = Object.keys(timingWindows)[i - 1]; + + const currentTimingWindow = timingWindows[currentKey]; + if (previousKey) { + const previousTimingWindow = timingWindows[previousKey]; + + if ( + (hitWindow <= currentTimingWindow && + hitWindow > previousTimingWindow) || + (hitWindow >= -currentTimingWindow && hitWindow < -previousTimingWindow) + ) { + return currentKey; + } + } else { + if ( + hitWindow >= -currentTimingWindow && + hitWindow <= currentTimingWindow + ) { + return currentKey; + } + } + } + + return 'miss'; +}; + +const notes = [ + { time: 1000, lane: 0 }, + { time: 1250, lane: 1 }, + { time: 1500, lane: 2 }, + { time: 3000, lane: 3 }, +]; + +const getCurrentNote = ( + notes: { time: number; lane: number }[], + msPassed: number, +): { time: number; lane: number } | null => { + for (let i = 0; i < notes.length; i++) { + if ( + msPassed + worstWindow > notes[i].time && + msPassed - worstWindow < notes[i].time + ) { + return notes[i]; + } + } + + return null; +}; + +const draw = ( + ctx: CanvasRenderingContext2D, + canvas: HTMLCanvasElement, + delta: number, +): void => { + ctx.font = '30px Arial'; + + msPassed += delta; + + const currentNote = getCurrentNote(notes, msPassed); + + // Render hit-zone + ctx.fillStyle = keys.includes(' ') ? 'green' : 'red'; + ctx.fillRect(0, endZone, canvas.width, noteHeight); + + if (keys.includes(' ')) { + if (currentNote) { + const hitWindow = currentNote.time - msPassed; + + const window = getTimingWindow(hitWindow); + score += scorePerWindow[window]; + lastHit = { + window: window, + off: hitWindow, + hitTime: msPassed, + lane: currentNote.lane, + }; + } + + setKeysDown([]); + } + + // Render Notes + ctx.fillStyle = 'grey'; + for (const note of notes) { + // Calculate noteY position, it should be equal to the endZone value when note.time is equal to msPassed + const noteY = endZone - (endZone / timeToBottomMs) * (note.time - msPassed); + + ctx.fillRect(note.lane * noteWidth, noteY, noteWidth, noteHeight); + } + + if (lastHit && lastHit.hitTime + 1000 > msPassed) { + ctx.fillStyle = 'black'; + ctx.fillText( + `${lastHit.window} ${Math.round(lastHit.off)}ms`, + noteWidth * lastHit.lane, + endZone - 40, + ); + } + + ctx.fillStyle = 'black'; + ctx.fillText(`Time: ${msPassed.toFixed(2)}`, 10, 40); + ctx.fillText(`Score: ${score}`, 10, 70); +}; + +// ############################################################# +// ############################################################# +// ## ## +// ## GENERAL RENDERER STRUCTURE - EDIT DRAW FUNCTION ABOVE ## +// ## ## +// ############################################################# +// ############################################################# + +const render = ( + timestamp: number, + canvas: HTMLCanvasElement, + ctx: CanvasRenderingContext2D, +): void => { + if (!previousTimeStamp) { + previousTimeStamp = timestamp; + } + + const delta = timestamp - previousTimeStamp; + previousTimeStamp = timestamp; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + draw(ctx, canvas, delta); + + window.requestAnimationFrame((timestamp: number) => + render(timestamp, canvas, ctx), + ); +}; + +document.addEventListener('DOMContentLoaded', () => { + console.log('Loading canvas scratch...'); + const canvas = document.getElementById('canvas') as HTMLCanvasElement; + const ctx = canvas.getContext('2d'); + + if (ctx) { + window.requestAnimationFrame((timestamp: number) => + render(timestamp, canvas, ctx), + ); + } else { + console.warn('NO CONTEXT!'); + } +}); + +window.addEventListener('keydown', (event) => + setKeysDown([...keys, event.key]), +); + +window.addEventListener('keyup', (event) => + setKeysDown([...keys.filter((key) => key !== event.key)]), +); diff --git a/packages/site/assets/scripts/old/cat-count/assets/0.gif b/packages/site/assets/scripts/old/cat-count/assets/0.gif new file mode 100644 index 0000000000000000000000000000000000000000..3512b00c225822eac239c2209d5503b65373e6fa GIT binary patch literal 10337 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 KR%Q6BGHU?q9|(>B literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/2.gif b/packages/site/assets/scripts/old/cat-count/assets/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d3a68a8019ad06d7691ea2509b06539609051c7 GIT binary patch literal 7060 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 IsC5Rc0lHPW8UO$Q literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/3.gif b/packages/site/assets/scripts/old/cat-count/assets/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b91cb3631515e7c29600f4e6b24cea99c0c1555 GIT binary patch literal 10990 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 SHdIIF7YEz?;s{=VV+{aC1vlyd literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/4.gif b/packages/site/assets/scripts/old/cat-count/assets/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..7dec2c237a2188ae963bc4e5a19a3ab8189a9694 GIT binary patch literal 9918 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 MQbq^E1sNEu0bg~6-v9sr literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/5.gif b/packages/site/assets/scripts/old/cat-count/assets/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..e89449debeac71e0e6c05a04ff5400c8ffa20340 GIT binary patch literal 9493 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 literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/8.gif b/packages/site/assets/scripts/old/cat-count/assets/8.gif new file mode 100644 index 0000000000000000000000000000000000000000..e75867aff411f686cbb692174b431a989f86be82 GIT binary patch literal 1347 zcmZ?wbhEHb)MZFv*v!xH|NsBLCumy6dauRnv%CK%X!NCI&dXS}F6Z?=11%1vTrLKK^K&QMP>s>se)>V(riGKzEt&F9 zJ^ehxL2dEjx%>fJ=dtkQtecfwvUf@3!U-K^jA?B$lE@du|9&er?*+!cp~qlDJ(2W3_UD88FMDjuVTq&Wn8j!*^1esb0@D` z-?Mhna<3W8%bD%A2{E`Zksx^%3s+c!iJa(Mv`t_Uh=Wn>X z;qY?ShsU4HY=1t9Yu-I>#x3t`4?kVa%XPzfdBR+S{67{P0;OjIj2f9mbq*|EKX;2< z#UI`qW}XU6EL{Ip^kzg{oV~sL!!?6DCj$GKm<=5D3><F> z;i5^_-MVit8#rakd0cH)jh)9THiL1(cLoM_joCBawv|OEu<(46GMFQ9N-8jjqx+dz1y`ga0}H_~0BAsK24`xS2ZBf?2O-_TFMBf7NmzJ=@OC`qk%q%UAXv zu{&`5+}wxE{#;yB4)>qGIOXpD$^*6s?pNuuE;vv-hu0#uk$v6s3r!Pr1!gz19cvdY zp5(KFfqBBj^m!I#0Y?HW^h!k+Ro`)Z(VOgZhCQ1a9x(o53E ze@*V^K#w`COP`hmS4}=WJGb@dfjQ+fN(5$ZVCA^RB!4b*!Th%$R30s8ZIkr1%Db20 zAf3vPno<5cgKbhkjf%lz#+qHq%RJY%9MKe?cZnlQs@<&Vq*=kSl!xv-XEHKYb4(SR zB*Rm}7QA+~SLcP*tTj>!zVd9@$NAQEaZdj)wpnOZ>m(uX4`2wI3Hxo-be zwmN4&!-?t*BAYlIlrx;}tUkPj!QJQaJX@0-!+pjAiUt8&A3gb~!H}%8?ufL04I|&D zxH;=jaZS#Nu$aEErtp-BzF~5&l?3CwbBg`D5AUA;>C|;Y=k%PCi>Ci$USHxibtpNc zki7Qra^2v&Ci~vY*}hvIy5dy$Rjc&7#oG@|%l)R1p=?upBw@#0vpc-ew)sc$R&$Bo zd$n|LxmY#R@6T#Z8EU5=psYk!*ef0YMXSP1l|;6$JcLJ`C~4h9Am`42PQSKHnQnls_qfgsHrj0{(cRQQ|Ya+rLs Sp1vS01u>WeHy9CegEasJ1w#7( literal 0 HcmV?d00001 diff --git a/packages/site/assets/scripts/old/cat-count/assets/9.gif b/packages/site/assets/scripts/old/cat-count/assets/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c592606809a6cc6693343a8dfde3db1f79ab389 GIT binary patch literal 5139 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 => { + const response = await makeApiRequest<{ count: number }>( + '/goatcounter/count', + 'GET', + ); + + return response.count; +}; + +const expectedDigits = 4; +export const setupCatCount = async () => { + const cats = getElementsByClassName('catCounter'); + cats.forEach((cat) => + cat.append(skeleton(`${expectedDigits * 35}px`, '75px')), + ); + + if (cats.length > 0) { + const count = await getStats(); + + for (const cat of cats) { + cat.innerHTML = ''; + + count + .toString() + .replaceAll(' ', '') + .split('') + .forEach((char) => { + cat.append( + e('img', { src: `/scripts/cat-count/assets/${char}.gif` }), + ); + }); + } + } +}; diff --git a/packages/site/assets/scripts/old/colour-mode.ts b/packages/site/assets/scripts/old/colour-mode.ts new file mode 100644 index 0000000..21c6f7b --- /dev/null +++ b/packages/site/assets/scripts/old/colour-mode.ts @@ -0,0 +1,69 @@ +import { createElement } from './utils'; + +const colours = { + light: '#fff', + subLight: '#eee', + dark: '#000', + subDark: '#111', +}; + +/** Thank you josh! https://www.joshwcomeau.com/react/dark-mode/ */ +export function getInitialColorMode() { + const persistedColorPreference = window.localStorage.getItem('color-mode'); + const hasPersistedPreference = typeof persistedColorPreference === 'string'; + + if (hasPersistedPreference) { + return persistedColorPreference; + } + + return 'light'; +} + +export let colourMode = getInitialColorMode() || 'light'; + +export const setColourMode = (override?: string) => { + colourMode = override || getInitialColorMode() || 'light'; + const root = document.documentElement; + + root.style.setProperty( + '--colour-text', + colourMode === 'light' ? colours.dark : colours.light, + ); + + root.style.setProperty( + '--colour-background', + colourMode === 'light' ? colours.light : colours.dark, + ); + + root.style.setProperty( + '--colour-background-sub', + colourMode === 'light' ? colours.subLight : colours.subDark, + ); + + root.style.setProperty( + '--invert-on-light', + colourMode === 'light' ? 'invert()' : '', + ); + + root.style.setProperty( + '--invert-on-dark', + colourMode === 'light' ? '' : 'invert()', + ); + + root.style.setProperty( + '--blend-mode', + colourMode === 'light' ? 'darken' : 'lighten', + ); + + root.style.setProperty( + '--background-opacity', + colourMode === 'light' ? '0' : '0.75', + ); + + root.style.setProperty('--tint', colourMode === 'light' ? '0.34' : '0.075'); +}; + +// Add background element to body to handle dark mode overlay +document.addEventListener('DOMContentLoaded', () => { + document.body.prepend(createElement('div', { className: 'background' })); +}); diff --git a/packages/site/assets/scripts/old/elements/element.ts b/packages/site/assets/scripts/old/elements/element.ts new file mode 100644 index 0000000..0a08834 --- /dev/null +++ b/packages/site/assets/scripts/old/elements/element.ts @@ -0,0 +1,37 @@ +export type Attributes = Omit< + Partial, + 'style' +> & { + style?: string; +}; + +/** @deprecated Use JSX instead */ +export const e = ( + tag: T, + attributes: Attributes | null, + children: (string | HTMLElement)[] | string | HTMLElement = [], +) => { + const element = document.createElement(tag); + + Object.entries(attributes || {}).forEach(([key, value]) => { + const castKey = key as keyof HTMLElementTagNameMap[T]; + + if (typeof castKey === 'string' && castKey.includes('data-')) { + element.dataset[castKey.replace('data-', '')] = value as string; + } else { + // Since we're replacing the style attribute this complains heaps + // @ts-ignore + element[castKey] = value; + } + }); + + if (Array.isArray(children)) { + children.forEach((child) => { + element.append(child); + }); + } else { + element.append(children); + } + + return element; +}; diff --git a/packages/site/assets/scripts/old/elements/inputs.ts b/packages/site/assets/scripts/old/elements/inputs.ts new file mode 100644 index 0000000..50dfe4a --- /dev/null +++ b/packages/site/assets/scripts/old/elements/inputs.ts @@ -0,0 +1,52 @@ +import { e } from './element'; + +export const changeWrapper = + (onChange: (value: T) => void) => + (e: Event) => { + onChange((e.target as HTMLInputElement).value as T); + }; + +export const createInput = (args: { + placeholder: string; + type: string; + value?: T; + onChange: (value: T) => void; + className?: string; +}) => { + const { placeholder, type, value, onChange, className } = args; + + return e('input', { + placeholder, + type, + value, + className, + onchange: changeWrapper(onChange), + }); +}; + +export const selectInput = (args: { + value: T; + options: T[]; + onChange: (value: T) => void; + className?: string; +}) => { + const { value, options, className } = args; + + return e( + 'select', + { + value, + className, + onchange: changeWrapper(args.onChange), + }, + options.map((option) => { + return e('option', {}, option); + }), + ); +}; + +export const createFormGroup = (label: string, children: HTMLElement[]) => + e('div', { className: 'formGroup' }, [ + e('label', {}, label), + ...('length' in children ? children : [children]), + ]); diff --git a/packages/site/assets/scripts/old/elements/state.ts b/packages/site/assets/scripts/old/elements/state.ts new file mode 100644 index 0000000..9627a52 --- /dev/null +++ b/packages/site/assets/scripts/old/elements/state.ts @@ -0,0 +1,9 @@ +export const useState = (initialValue: T): [() => T, (value: T) => void] => { + let state = initialValue; + const getState = () => state; + const setState = (value: T) => { + state = value; + }; + + return [getState, setState]; +}; diff --git a/packages/site/assets/scripts/old/external/count.js b/packages/site/assets/scripts/old/external/count.js new file mode 100644 index 0000000..e85f0bc --- /dev/null +++ b/packages/site/assets/scripts/old/external/count.js @@ -0,0 +1,254 @@ +// GoatCounter: https://www.goatcounter.com +// This file is released under the ISC license: https://opensource.org/licenses/ISC +;(function() { + 'use strict'; + + if (window.goatcounter && window.goatcounter.vars) // Compatibility with very old version; do not use. + window.goatcounter = window.goatcounter.vars + else + window.goatcounter = window.goatcounter || {} + + // Load settings from data-goatcounter-settings. + var s = document.querySelector('script[data-goatcounter]') + if (s && s.dataset.goatcounterSettings) { + try { var set = JSON.parse(s.dataset.goatcounterSettings) } + catch (err) { console.error('invalid JSON in data-goatcounter-settings: ' + err) } + for (var k in set) + if (['no_onload', 'no_events', 'allow_local', 'allow_frame', 'path', 'title', 'referrer', 'event'].indexOf(k) > -1) + window.goatcounter[k] = set[k] + } + + var enc = encodeURIComponent + + // Get all data we're going to send off to the counter endpoint. + var get_data = function(vars) { + var data = { + p: (vars.path === undefined ? goatcounter.path : vars.path), + r: (vars.referrer === undefined ? goatcounter.referrer : vars.referrer), + t: (vars.title === undefined ? goatcounter.title : vars.title), + e: !!(vars.event || goatcounter.event), + s: [window.screen.width, window.screen.height, (window.devicePixelRatio || 1)], + b: is_bot(), + q: location.search, + } + + var rcb, pcb, tcb // Save callbacks to apply later. + if (typeof(data.r) === 'function') rcb = data.r + if (typeof(data.t) === 'function') tcb = data.t + if (typeof(data.p) === 'function') pcb = data.p + + if (is_empty(data.r)) data.r = document.referrer + if (is_empty(data.t)) data.t = document.title + if (is_empty(data.p)) data.p = get_path() + + if (rcb) data.r = rcb(data.r) + if (tcb) data.t = tcb(data.t) + if (pcb) data.p = pcb(data.p) + return data + } + + // Check if a value is "empty" for the purpose of get_data(). + var is_empty = function(v) { return v === null || v === undefined || typeof(v) === 'function' } + + // See if this looks like a bot; there is some additional filtering on the + // backend, but these properties can't be fetched from there. + var is_bot = function() { + // Headless browsers are probably a bot. + var w = window, d = document + if (w.callPhantom || w._phantom || w.phantom) + return 150 + if (w.__nightmare) + return 151 + if (d.__selenium_unwrapped || d.__webdriver_evaluate || d.__driver_evaluate) + return 152 + if (navigator.webdriver) + return 153 + return 0 + } + + // Object to urlencoded string, starting with a ?. + var urlencode = function(obj) { + var p = [] + for (var k in obj) + if (obj[k] !== '' && obj[k] !== null && obj[k] !== undefined && obj[k] !== false) + p.push(enc(k) + '=' + enc(obj[k])) + return '?' + p.join('&') + } + + // Show a warning in the console. + var warn = function(msg) { + if (console && 'warn' in console) + console.warn('goatcounter: ' + msg) + } + + // Get the endpoint to send requests to. + var get_endpoint = function() { + var s = document.querySelector('script[data-goatcounter]') + if (s && s.dataset.goatcounter) + return s.dataset.goatcounter + return (goatcounter.endpoint || window.counter) // counter is for compat; don't use. + } + + // Get current path. + var get_path = function() { + var loc = location, + c = document.querySelector('link[rel="canonical"][href]') + if (c) { // May be relative or point to different domain. + var a = document.createElement('a') + a.href = c.href + if (a.hostname.replace(/^www\./, '') === location.hostname.replace(/^www\./, '')) + loc = a + } + return (loc.pathname + loc.search) || '/' + } + + // Run function after DOM is loaded. + var on_load = function(f) { + if (document.body === null) + document.addEventListener('DOMContentLoaded', function() { f() }, false) + else + f() + } + + // Filter some requests that we (probably) don't want to count. + goatcounter.filter = function() { + if ('visibilityState' in document && document.visibilityState === 'prerender') + return 'visibilityState' + if (!goatcounter.allow_frame && location !== parent.location) + return 'frame' + if (!goatcounter.allow_local && location.hostname.match(/(localhost$|^127\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.|^0\.0\.0\.0$)/)) + return 'localhost' + if (!goatcounter.allow_local && location.protocol === 'file:') + return 'localfile' + if (localStorage && localStorage.getItem('skipgc') === 't') + return 'disabled with #toggle-goatcounter' + return false + } + + // Get URL to send to GoatCounter. + window.goatcounter.url = function(vars) { + var data = get_data(vars || {}) + if (data.p === null) // null from user callback. + return + data.rnd = Math.random().toString(36).substr(2, 5) // Browsers don't always listen to Cache-Control. + + var endpoint = get_endpoint() + if (!endpoint) + return warn('no endpoint found') + + return endpoint + urlencode(data) + } + + // Count a hit. + window.goatcounter.count = function(vars) { + var f = goatcounter.filter() + if (f) + return warn('not counting because of: ' + f) + var url = goatcounter.url(vars) + if (!url) + return warn('not counting because path callback returned null') + navigator.sendBeacon(url) + } + + // Get a query parameter. + window.goatcounter.get_query = function(name) { + var s = location.search.substr(1).split('&') + for (var i = 0; i < s.length; i++) + if (s[i].toLowerCase().indexOf(name.toLowerCase() + '=') === 0) + return s[i].substr(name.length + 1) + } + + // Track click events. + window.goatcounter.bind_events = function() { + if (!document.querySelectorAll) // Just in case someone uses an ancient browser. + return + + var send = function(elem) { + return function() { + goatcounter.count({ + event: true, + path: (elem.dataset.goatcounterClick || elem.name || elem.id || ''), + title: (elem.dataset.goatcounterTitle || elem.title || (elem.innerHTML || '').substr(0, 200) || ''), + referrer: (elem.dataset.goatcounterReferrer || elem.dataset.goatcounterReferral || ''), + }) + } + } + + Array.prototype.slice.call(document.querySelectorAll("*[data-goatcounter-click]")).forEach(function(elem) { + if (elem.dataset.goatcounterBound) + return + var f = send(elem) + elem.addEventListener('click', f, false) + elem.addEventListener('auxclick', f, false) // Middle click. + elem.dataset.goatcounterBound = 'true' + }) + } + + // Add a "visitor counter" frame or image. + window.goatcounter.visit_count = function(opt) { + on_load(function() { + opt = opt || {} + opt.type = opt.type || 'html' + opt.append = opt.append || 'body' + opt.path = opt.path || get_path() + opt.attr = opt.attr || {width: '200', height: (opt.no_branding ? '60' : '80')} + + opt.attr['src'] = get_endpoint() + 'er/' + enc(opt.path) + '.' + enc(opt.type) + '?' + if (opt.no_branding) opt.attr['src'] += '&no_branding=1' + if (opt.style) opt.attr['src'] += '&style=' + enc(opt.style) + if (opt.start) opt.attr['src'] += '&start=' + enc(opt.start) + if (opt.end) opt.attr['src'] += '&end=' + enc(opt.end) + + var tag = {png: 'img', svg: 'img', html: 'iframe'}[opt.type] + if (!tag) + return warn('visit_count: unknown type: ' + opt.type) + + if (opt.type === 'html') { + opt.attr['frameborder'] = '0' + opt.attr['scrolling'] = 'no' + } + + var d = document.createElement(tag) + for (var k in opt.attr) + d.setAttribute(k, opt.attr[k]) + + var p = document.querySelector(opt.append) + if (!p) + return warn('visit_count: append not found: ' + opt.append) + p.appendChild(d) + }) + } + + // Make it easy to skip your own views. + if (location.hash === '#toggle-goatcounter') { + if (localStorage.getItem('skipgc') === 't') { + localStorage.removeItem('skipgc', 't') + alert('GoatCounter tracking is now ENABLED in this browser.') + } + else { + localStorage.setItem('skipgc', 't') + alert('GoatCounter tracking is now DISABLED in this browser until ' + location + ' is loaded again.') + } + } + + if (!goatcounter.no_onload) + on_load(function() { + // 1. Page is visible, count request. + // 2. Page is not yet visible; wait until it switches to 'visible' and count. + // See #487 + if (!('visibilityState' in document) || document.visibilityState === 'visible') + goatcounter.count() + else { + var f = function(e) { + if (document.visibilityState !== 'visible') + return + document.removeEventListener('visibilitychange', f) + goatcounter.count() + } + document.addEventListener('visibilitychange', f) + } + + if (!goatcounter.no_events) + goatcounter.bind_events() + }) +})(); diff --git a/packages/site/assets/scripts/old/external/pako.min.js b/packages/site/assets/scripts/old/external/pako.min.js new file mode 100644 index 0000000..2535eaf --- /dev/null +++ b/packages/site/assets/scripts/old/external/pako.min.js @@ -0,0 +1,2 @@ +/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +!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).pako={})}(this,(function(t){"use strict";function e(t){let e=t.length;for(;--e>=0;)t[e]=0}const a=256,i=286,n=30,s=15,r=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),o=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=new Array(576);e(d);const _=new Array(60);e(_);const f=new Array(512);e(f);const c=new Array(256);e(c);const u=new Array(29);e(u);const w=new Array(n);function m(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}let b,g,p;function k(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(w);const v=t=>t<256?f[t]:f[256+(t>>>7)],y=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},x=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{x(t,a[2*e],a[2*e+1])},A=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},E=(t,e,a)=>{const i=new Array(16);let n,r,o=0;for(n=1;n<=s;n++)o=o+a[n-1]<<1,i[n]=o;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=A(i[e]++,e))}},R=t=>{let e;for(e=0;e{t.bi_valid>8?y(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},U=(t,e,a,i)=>{const n=2*e,s=2*a;return t[n]{const i=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n{let n,s,l,h,d=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+d++],n+=(255&t.pending_buf[t.sym_buf+d++])<<8,s=t.pending_buf[t.sym_buf+d++],0===n?z(t,s,e):(l=c[s],z(t,l+a+1,e),h=r[l],0!==h&&(s-=u[l],x(t,s,h)),n--,l=v(n),z(t,l,i),h=o[l],0!==h&&(n-=w[l],x(t,n,h)))}while(d{const a=e.dyn_tree,i=e.stat_desc.static_tree,n=e.stat_desc.has_stree,r=e.stat_desc.elems;let o,l,h,d=-1;for(t.heap_len=0,t.heap_max=573,o=0;o>1;o>=1;o--)S(t,a,o);h=r;do{o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],S(t,a,1),l=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=l,a[2*h]=a[2*o]+a[2*l],t.depth[h]=(t.depth[o]>=t.depth[l]?t.depth[o]:t.depth[l])+1,a[2*o+1]=a[2*l+1]=h,t.heap[1]=h++,S(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,i=e.max_code,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,h=e.stat_desc.max_length;let d,_,f,c,u,w,m=0;for(c=0;c<=s;c++)t.bl_count[c]=0;for(a[2*t.heap[t.heap_max]+1]=0,d=t.heap_max+1;d<573;d++)_=t.heap[d],c=a[2*a[2*_+1]+1]+1,c>h&&(c=h,m++),a[2*_+1]=c,_>i||(t.bl_count[c]++,u=0,_>=l&&(u=o[_-l]),w=a[2*_],t.opt_len+=w*(c+u),r&&(t.static_len+=w*(n[2*_+1]+u)));if(0!==m){do{for(c=h-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[h]--,m-=2}while(m>0);for(c=h;0!==c;c--)for(_=t.bl_count[c];0!==_;)f=t.heap[--d],f>i||(a[2*f+1]!==c&&(t.opt_len+=(c-a[2*f+1])*a[2*f],a[2*f+1]=c),_--)}})(t,e),E(a,d,t.bl_count)},O=(t,e,a)=>{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=r,r=e[2*(i+1)+1],++o{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),i=0;i<=a;i++)if(n=r,r=e[2*(i+1)+1],!(++o{x(t,0+(i?1:0),3),Z(t),y(t,a),y(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var N=(t,e,i,n)=>{let s,r,o=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e{let e;for(O(t,t.dyn_ltree,t.l_desc.max_code),O(t,t.dyn_dtree,t.d_desc.max_code),T(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?L(t,e,i,n):4===t.strategy||r===s?(x(t,2+(n?1:0),3),D(t,d,_)):(x(t,4+(n?1:0),3),((t,e,a,i)=>{let n;for(x(t,e-257,5),x(t,a-1,5),x(t,i-4,4),n=0;n{F||((()=>{let t,e,a,h,k;const v=new Array(16);for(a=0,h=0;h<28;h++)for(u[h]=a,t=0;t<1<>=7;h(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(c[i]+a+1)]++,t.dyn_dtree[2*v(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{x(t,2,3),z(t,256,d),(t=>{16===t.bi_valid?(y(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var C=(t,e,a,i)=>{let n=65535&t|0,s=t>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{n=n+e[i++]|0,s=s+n|0}while(--r);n%=65521,s%=65521}return n|s<<16|0};const M=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var H=(t,e,a,i)=>{const n=M,s=i+a;t^=-1;for(let a=i;a>>8^n[255&(t^e[a])];return-1^t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},K={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:P,_tr_stored_block:Y,_tr_flush_block:G,_tr_tally:X,_tr_align:W}=B,{Z_NO_FLUSH:q,Z_PARTIAL_FLUSH:J,Z_FULL_FLUSH:Q,Z_FINISH:V,Z_BLOCK:$,Z_OK:tt,Z_STREAM_END:et,Z_STREAM_ERROR:at,Z_DATA_ERROR:it,Z_BUF_ERROR:nt,Z_DEFAULT_COMPRESSION:st,Z_FILTERED:rt,Z_HUFFMAN_ONLY:ot,Z_RLE:lt,Z_FIXED:ht,Z_DEFAULT_STRATEGY:dt,Z_UNKNOWN:_t,Z_DEFLATED:ft}=K,ct=258,ut=262,wt=42,mt=113,bt=666,gt=(t,e)=>(t.msg=j[e],e),pt=t=>2*t-(t>4?9:0),kt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},vt=t=>{let e,a,i,n=t.w_size;e=t.hash_size,i=e;do{a=t.head[--i],t.head[i]=a>=n?a-n:0}while(--e);e=n,i=e;do{a=t.prev[--i],t.prev[i]=a>=n?a-n:0}while(--e)};let yt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},zt=(t,e)=>{G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xt(t.strm)},At=(t,e)=>{t.pending_buf[t.pending++]=e},Et=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Rt=(t,e,a,i)=>{let n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=C(t.adler,e,n,a):2===t.state.wrap&&(t.adler=H(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},Zt=(t,e)=>{let a,i,n=t.max_chain_length,s=t.strstart,r=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-ut?t.strstart-(t.w_size-ut):0,h=t.window,d=t.w_mask,_=t.prev,f=t.strstart+ct;let c=h[s+r-1],u=h[s+r];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,h[a+r]===u&&h[a+r-1]===c&&h[a]===h[s]&&h[++a]===h[s+1]){s+=2,a++;do{}while(h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&sr){if(t.match_start=e,r=i,i>=o)break;c=h[s+r-1],u=h[s+r]}}}while((e=_[e&d])>l&&0!=--n);return r<=t.lookahead?r:t.lookahead},Ut=t=>{const e=t.w_size;let a,i,n;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-ut)&&(t.window.set(t.window.subarray(e,e+e-i),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),vt(t),i+=e),0===t.strm.avail_in)break;if(a=Rt(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=a,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=yt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=yt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead{let a,i,n,s=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,r=0,o=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_outi+t.strm.avail_in&&(a=i+t.strm.avail_in),a>n&&(a=n),a>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,xt(t.strm),i&&(i>a&&(i=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+i),t.strm.next_out),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i,t.block_start+=i,a-=i),a&&(Rt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===r);return o-=t.strm.avail_in,o&&(o>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=o&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-o,t.strm.next_in),t.strstart),t.strstart+=o,t.insert+=o>t.w_size-t.insert?t.w_size-t.insert:o),t.block_start=t.strstart),t.high_watern&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Rt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water>3,n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n,s=n>t.w_size?t.w_size:n,i=t.strstart-t.block_start,(i>=s||(i||e===V)&&e!==q&&0===t.strm.avail_in&&i<=n)&&(a=i>n?n:i,r=e===V&&0===t.strm.avail_in&&a===i?1:0,Y(t,t.block_start,a,r),t.block_start+=a,xt(t.strm)),r?3:1)},Dt=(t,e)=>{let a,i;for(;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ut&&(t.match_length=Zt(t,a)),t.match_length>=3)if(i=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=yt(t,t.ins_h,t.window[t.strstart+1]);else i=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2},Tt=(t,e)=>{let a,i,n;for(;;){if(t.lookahead=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,i=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,i&&(zt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(i=X(t,0,t.window[t.strstart-1]),i&&zt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2};function Ot(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}const It=[new Ot(0,0,0,0,St),new Ot(4,4,8,4,Dt),new Ot(4,5,16,8,Dt),new Ot(4,6,32,32,Dt),new Ot(4,4,16,16,Tt),new Ot(8,16,32,32,Tt),new Ot(8,16,128,128,Tt),new Ot(8,32,128,256,Tt),new Ot(32,128,258,1024,Tt),new Ot(32,258,258,4096,Tt)];function Ft(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ft,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),kt(this.dyn_ltree),kt(this.dyn_dtree),kt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),kt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),kt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Lt=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==wt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==mt&&e.status!==bt?1:0},Nt=t=>{if(Lt(t))return gt(t,at);t.total_in=t.total_out=0,t.data_type=_t;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?wt:mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,P(e),tt},Bt=t=>{const e=Nt(t);var a;return e===tt&&((a=t.state).window_size=2*a.w_size,kt(a.head),a.max_lazy_match=It[a.level].max_lazy,a.good_match=It[a.level].good_length,a.nice_match=It[a.level].nice_length,a.max_chain_length=It[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Ct=(t,e,a,i,n,s)=>{if(!t)return at;let r=1;if(e===st&&(e=6),i<0?(r=0,i=-i):i>15&&(r=2,i-=16),n<1||n>9||a!==ft||i<8||i>15||e<0||e>9||s<0||s>ht||8===i&&1!==r)return gt(t,at);8===i&&(i=9);const o=new Ft;return t.state=o,o.strm=t,o.status=wt,o.wrap=r,o.gzhead=null,o.w_bits=i,o.w_size=1<Ct(t,e,ft,15,8,dt),deflateInit2:Ct,deflateReset:Bt,deflateResetKeep:Nt,deflateSetHeader:(t,e)=>Lt(t)||2!==t.state.wrap?at:(t.state.gzhead=e,tt),deflate:(t,e)=>{if(Lt(t)||e>$||e<0)return t?gt(t,at):at;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===bt&&e!==V)return gt(t,0===t.avail_out?nt:at);const i=a.last_flush;if(a.last_flush=e,0!==a.pending){if(xt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&pt(e)<=pt(i)&&e!==V)return gt(t,nt);if(a.status===bt&&0!==t.avail_in)return gt(t,nt);if(a.status===wt&&0===a.wrap&&(a.status=mt),a.status===wt){let e=ft+(a.w_bits-8<<4)<<8,i=-1;if(i=a.strategy>=ot||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=i<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Et(a,e),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=H(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,3),a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){let e=a.pending,i=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+i>a.pending_buf_size;){let n=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+n),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=n,xt(t),0!==a.pending)return a.last_flush=-1,tt;e=0,i-=n}let n=new Uint8Array(a.gzhead.extra);a.pending_buf.set(n.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending+=i,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindexi&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindexi&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(xt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==bt){let i=0===a.level?St(a,e):a.strategy===ot?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Ut(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===lt?((t,e)=>{let a,i,n,s;const r=t.window;for(;;){if(t.lookahead<=ct){if(Ut(t),t.lookahead<=ct&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,i=r[n],i===r[++n]&&i===r[++n]&&i===r[++n])){s=t.strstart+ct;do{}while(i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):It[a.level].func(a,e);if(3!==i&&4!==i||(a.status=bt),1===i||3===i)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===i&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(kt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),xt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),xt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:t=>{if(Lt(t))return at;const e=t.state.status;return t.state=null,e===mt?gt(t,it):tt},deflateSetDictionary:(t,e)=>{let a=e.length;if(Lt(t))return at;const i=t.state,n=i.wrap;if(2===n||1===n&&i.status!==wt||i.lookahead)return at;if(1===n&&(t.adler=C(t.adler,e,a,0)),i.wrap=0,a>=i.w_size){0===n&&(kt(i.head),i.strstart=0,i.block_start=0,i.insert=0);let t=new Uint8Array(i.w_size);t.set(e.subarray(a-i.w_size,a),0),e=t,a=i.w_size}const s=t.avail_in,r=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Ut(i);i.lookahead>=3;){let t=i.strstart,e=i.lookahead-2;do{i.ins_h=yt(i,i.ins_h,i.window[t+3-1]),i.prev[t&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=t,t++}while(--e);i.strstart=t,i.lookahead=2,Ut(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=2,i.match_available=0,t.next_in=r,t.input=o,t.avail_in=s,i.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};const Ht=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var jt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Ht(a,e)&&(t[e]=a[e])}}return t},Kt=t=>{let e=0;for(let a=0,i=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Yt[254]=Yt[254]=1;var Gt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,i,n,s,r=t.length,o=0;for(n=0;n>>6,e[s++]=128|63&a):a<65536?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},Xt=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let i,n;const s=new Array(2*a);for(n=0,i=0;i4)s[n++]=65533,i+=r-1;else{for(e&=2===r?31:3===r?15:7;r>1&&i1?s[n++]=65533:e<65536?s[n++]=e:(e-=65536,s[n++]=55296|e>>10&1023,s[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Pt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let i=0;i{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Yt[t[a]]>e?a:e};var qt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Jt=Object.prototype.toString,{Z_NO_FLUSH:Qt,Z_SYNC_FLUSH:Vt,Z_FULL_FLUSH:$t,Z_FINISH:te,Z_OK:ee,Z_STREAM_END:ae,Z_DEFAULT_COMPRESSION:ie,Z_DEFAULT_STRATEGY:ne,Z_DEFLATED:se}=K;function re(t){this.options=jt({level:ie,method:se,chunkSize:16384,windowBits:15,memLevel:8,strategy:ne},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=Mt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==ee)throw new Error(j[a]);if(e.header&&Mt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Gt(e.dictionary):"[object ArrayBuffer]"===Jt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Mt.deflateSetDictionary(this.strm,t),a!==ee)throw new Error(j[a]);this._dict_set=!0}}function oe(t,e){const a=new re(e);if(a.push(t,!0),a.err)throw a.msg||j[a.err];return a.result}re.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize;let n,s;if(this.ended)return!1;for(s=e===~~e?e:!0===e?te:Qt,"string"==typeof t?a.input=Gt(t):"[object ArrayBuffer]"===Jt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),(s===Vt||s===$t)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Mt.deflate(a,s),n===ae)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Mt.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===ee;if(0!==a.avail_out){if(s>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},re.prototype.onData=function(t){this.chunks.push(t)},re.prototype.onEnd=function(t){t===ee&&(this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var le={Deflate:re,deflate:oe,deflateRaw:function(t,e){return(e=e||{}).raw=!0,oe(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,oe(t,e)},constants:K};const he=16209;var de=function(t,e){let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z,A;const E=t.state;a=t.next_in,z=t.input,i=a+(t.avail_in-5),n=t.next_out,A=t.output,s=n-(e-t.avail_out),r=n+(t.avail_out-257),o=E.dmax,l=E.wsize,h=E.whave,d=E.wnext,_=E.window,f=E.hold,c=E.bits,u=E.lencode,w=E.distcode,m=(1<>>24,f>>>=p,c-=p,p=g>>>16&255,0===p)A[n++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=u[(65535&g)+(f&(1<>>=p,c-=p),c<15&&(f+=z[a++]<>>24,f>>>=p,c-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=w[(65535&g)+(f&(1<o){t.msg="invalid distance too far back",E.mode=he;break t}if(f>>>=p,c-=p,p=n-s,v>p){if(p=v-p,p>h&&E.sane){t.msg="invalid distance too far back",E.mode=he;break t}if(y=0,x=_,0===d){if(y+=l-p,p2;)A[n++]=x[y++],A[n++]=x[y++],A[n++]=x[y++],k-=3;k&&(A[n++]=x[y++],k>1&&(A[n++]=x[y++]))}else{y=n-v;do{A[n++]=A[y++],A[n++]=A[y++],A[n++]=A[y++],k-=3}while(k>2);k&&(A[n++]=A[y++],k>1&&(A[n++]=A[y++]))}break}}break}}while(a>3,a-=k,c-=k<<3,f&=(1<{const l=o.bits;let h,d,_,f,c,u,w=0,m=0,b=0,g=0,p=0,k=0,v=0,y=0,x=0,z=0,A=null;const E=new Uint16Array(16),R=new Uint16Array(16);let Z,U,S,D=null;for(w=0;w<=_e;w++)E[w]=0;for(m=0;m=1&&0===E[g];g--);if(p>g&&(p=g),0===g)return n[s++]=20971520,n[s++]=20971520,o.bits=1,0;for(b=1;b0&&(0===t||1!==g))return-1;for(R[1]=0,w=1;w<_e;w++)R[w+1]=R[w]+E[w];for(m=0;m852||2===t&&x>592)return 1;for(;;){Z=w-v,r[m]+1=u?(U=D[r[m]-u],S=A[r[m]-u]):(U=96,S=0),h=1<>v)+d]=Z<<24|U<<16|S|0}while(0!==d);for(h=1<>=1;if(0!==h?(z&=h-1,z+=h):z=0,m++,0==--E[w]){if(w===g)break;w=e[a+r[m]]}if(w>p&&(z&f)!==_){for(0===v&&(v=p),c+=b,k=w-v,y=1<852||2===t&&x>592)return 1;_=z&f,n[_]=p<<24|k<<16|c-s|0}}return 0!==z&&(n[c+z]=w-v<<24|64<<16|0),o.bits=p,0};const{Z_FINISH:be,Z_BLOCK:ge,Z_TREES:pe,Z_OK:ke,Z_STREAM_END:ve,Z_NEED_DICT:ye,Z_STREAM_ERROR:xe,Z_DATA_ERROR:ze,Z_MEM_ERROR:Ae,Z_BUF_ERROR:Ee,Z_DEFLATED:Re}=K,Ze=16180,Ue=16190,Se=16191,De=16192,Te=16194,Oe=16199,Ie=16200,Fe=16206,Le=16209,Ne=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ce=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.mode16211?1:0},Me=t=>{if(Ce(t))return xe;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=Ze,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,ke},He=t=>{if(Ce(t))return xe;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Me(t)},je=(t,e)=>{let a;if(Ce(t))return xe;const i=t.state;return e<0?(a=0,e=-e):(a=5+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?xe:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,He(t))},Ke=(t,e)=>{if(!t)return xe;const a=new Be;t.state=a,a.strm=t,a.window=null,a.mode=Ze;const i=je(t,e);return i!==ke&&(t.state=null),i};let Pe,Ye,Ge=!0;const Xe=t=>{if(Ge){Pe=new Int32Array(512),Ye=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(me(1,t.lens,0,288,Pe,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;me(2,t.lens,0,32,Ye,0,t.work,{bits:5}),Ge=!1}t.lencode=Pe,t.lenbits=9,t.distcode=Ye,t.distbits=5},We=(t,e,a,i)=>{let n;const s=t.state;return null===s.window&&(s.wsize=1<=s.wsize?(s.window.set(e.subarray(a-s.wsize,a),0),s.wnext=0,s.whave=s.wsize):(n=s.wsize-s.wnext,n>i&&(n=i),s.window.set(e.subarray(a-i,a-i+n),s.wnext),(i-=n)?(s.window.set(e.subarray(a-i,a),0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whaveKe(t,15),inflateInit2:Ke,inflate:(t,e)=>{let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z=0;const A=new Uint8Array(4);let E,R;const Z=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Ce(t)||!t.output||!t.input&&0!==t.avail_in)return xe;a=t.state,a.mode===Se&&(a.mode=De),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,_=o,f=l,x=ke;t:for(;;)switch(a.mode){case Ze:if(0===a.wrap){a.mode=De;break}for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>>8&255,a.check=H(a.check,A,2,0),h=0,d=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=Le;break}if((15&h)!==Re){t.msg="unknown compression method",a.mode=Le;break}if(h>>>=4,d-=4,y=8+(15&h),0===a.wbits&&(a.wbits=y),y>15||y>a.wbits){t.msg="invalid window size",a.mode=Le;break}a.dmax=1<>8&1),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16182;case 16182:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<>>8&255,A[2]=h>>>16&255,A[3]=h>>>24&255,a.check=H(a.check,A,4,0)),h=0,d=0,a.mode=16183;case 16183:for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>8),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16184;case 16184:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[s++]<>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&(c=a.length,c>o&&(c=o),c&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(i.subarray(s,s+c),y)),512&a.flags&&4&a.wrap&&(a.check=H(a.check,i,c,s)),o-=c,s+=c,a.length-=c),a.length))break t;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===o)break t;c=0;do{y=i[s+c++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&c>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Se;break;case 16189:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<>>=7&d,d-=7&d,a.mode=Fe;break}for(;d<3;){if(0===o)break t;o--,h+=i[s++]<>>=1,d-=1,3&h){case 0:a.mode=16193;break;case 1:if(Xe(a),a.mode=Oe,e===pe){h>>>=2,d-=2;break t}break;case 2:a.mode=16196;break;case 3:t.msg="invalid block type",a.mode=Le}h>>>=2,d-=2;break;case 16193:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=Le;break}if(a.length=65535&h,h=0,d=0,a.mode=Te,e===pe)break t;case Te:a.mode=16195;case 16195:if(c=a.length,c){if(c>o&&(c=o),c>l&&(c=l),0===c)break t;n.set(i.subarray(s,s+c),r),o-=c,s+=c,l-=c,r+=c,a.length-=c;break}a.mode=Se;break;case 16196:for(;d<14;){if(0===o)break t;o--,h+=i[s++]<>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Le;break}a.have=0,a.mode=16197;case 16197:for(;a.have>>=3,d-=3}for(;a.have<19;)a.lens[Z[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,E={bits:a.lenbits},x=me(0,a.lens,0,19,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid code lengths set",a.mode=Le;break}a.have=0,a.mode=16198;case 16198:for(;a.have>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=m,d-=m,a.lens[a.have++]=g;else{if(16===g){for(R=m+2;d>>=m,d-=m,0===a.have){t.msg="invalid bit length repeat",a.mode=Le;break}y=a.lens[a.have-1],c=3+(3&h),h>>>=2,d-=2}else if(17===g){for(R=m+3;d>>=m,d-=m,y=0,c=3+(7&h),h>>>=3,d-=3}else{for(R=m+7;d>>=m,d-=m,y=0,c=11+(127&h),h>>>=7,d-=7}if(a.have+c>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Le;break}for(;c--;)a.lens[a.have++]=y}}if(a.mode===Le)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Le;break}if(a.lenbits=9,E={bits:a.lenbits},x=me(1,a.lens,0,a.nlen,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid literal/lengths set",a.mode=Le;break}if(a.distbits=6,a.distcode=a.distdyn,E={bits:a.distbits},x=me(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,E),a.distbits=E.bits,x){t.msg="invalid distances set",a.mode=Le;break}if(a.mode=Oe,e===pe)break t;case Oe:a.mode=Ie;case Ie:if(o>=6&&l>=258){t.next_out=r,t.avail_out=l,t.next_in=s,t.avail_in=o,a.hold=h,a.bits=d,de(t,f),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,a.mode===Se&&(a.back=-1);break}for(a.back=0;z=a.lencode[h&(1<>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,a.length=g,0===b){a.mode=16205;break}if(32&b){a.back=-1,a.mode=Se;break}if(64&b){t.msg="invalid literal/length code",a.mode=Le;break}a.extra=15&b,a.mode=16201;case 16201:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;z=a.distcode[h&(1<>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,64&b){t.msg="invalid distance code",a.mode=Le;break}a.offset=g,a.extra=15&b,a.mode=16203;case 16203:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Le;break}a.mode=16204;case 16204:if(0===l)break t;if(c=f-l,a.offset>c){if(c=a.offset-c,c>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Le;break}c>a.wnext?(c-=a.wnext,u=a.wsize-c):u=a.wnext-c,c>a.length&&(c=a.length),w=a.window}else w=n,u=r-a.offset,c=a.length;c>l&&(c=l),l-=c,a.length-=c;do{n[r++]=w[u++]}while(--c);0===a.length&&(a.mode=Ie);break;case 16205:if(0===l)break t;n[r++]=a.length,l--,a.mode=Ie;break;case Fe:if(a.wrap){for(;d<32;){if(0===o)break t;o--,h|=i[s++]<{if(Ce(t))return xe;let e=t.state;return e.window&&(e.window=null),t.state=null,ke},inflateGetHeader:(t,e)=>{if(Ce(t))return xe;const a=t.state;return 0==(2&a.wrap)?xe:(a.head=e,e.done=!1,ke)},inflateSetDictionary:(t,e)=>{const a=e.length;let i,n,s;return Ce(t)?xe:(i=t.state,0!==i.wrap&&i.mode!==Ue?xe:i.mode===Ue&&(n=1,n=C(n,e,a,0),n!==i.check)?ze:(s=We(t,e,a,a),s?(i.mode=16210,Ae):(i.havedict=1,ke)))},inflateInfo:"pako inflate (from Nodeca project)"};var Je=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Qe=Object.prototype.toString,{Z_NO_FLUSH:Ve,Z_FINISH:$e,Z_OK:ta,Z_STREAM_END:ea,Z_NEED_DICT:aa,Z_STREAM_ERROR:ia,Z_DATA_ERROR:na,Z_MEM_ERROR:sa}=K;function ra(t){this.options=jt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=qe.inflateInit2(this.strm,e.windowBits);if(a!==ta)throw new Error(j[a]);if(this.header=new Je,qe.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Gt(e.dictionary):"[object ArrayBuffer]"===Qe.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=qe.inflateSetDictionary(this.strm,e.dictionary),a!==ta)))throw new Error(j[a])}function oa(t,e){const a=new ra(e);if(a.push(t),a.err)throw a.msg||j[a.err];return a.result}ra.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize,n=this.options.dictionary;let s,r,o;if(this.ended)return!1;for(r=e===~~e?e:!0===e?$e:Ve,"[object ArrayBuffer]"===Qe.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),s=qe.inflate(a,r),s===aa&&n&&(s=qe.inflateSetDictionary(a,n),s===ta?s=qe.inflate(a,r):s===na&&(s=aa));a.avail_in>0&&s===ea&&a.state.wrap>0&&0!==t[a.next_in];)qe.inflateReset(a),s=qe.inflate(a,r);switch(s){case ia:case na:case aa:case sa:return this.onEnd(s),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||s===ea))if("string"===this.options.to){let t=Wt(a.output,a.next_out),e=a.next_out-t,n=Xt(a.output,t);a.next_out=e,a.avail_out=i-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(n)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(s!==ta||0!==o){if(s===ea)return s=qe.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},ra.prototype.onData=function(t){this.chunks.push(t)},ra.prototype.onEnd=function(t){t===ta&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var la={Inflate:ra,inflate:oa,inflateRaw:function(t,e){return(e=e||{}).raw=!0,oa(t,e)},ungzip:oa,constants:K};const{Deflate:ha,deflate:da,deflateRaw:_a,gzip:fa}=le,{Inflate:ca,inflate:ua,inflateRaw:wa,ungzip:ma}=la;var ba=ha,ga=da,pa=_a,ka=fa,va=ca,ya=ua,xa=wa,za=ma,Aa=K,Ea={Deflate:ba,deflate:ga,deflateRaw:pa,gzip:ka,Inflate:va,inflate:ya,inflateRaw:xa,ungzip:za,constants:Aa};t.Deflate=ba,t.Inflate=va,t.constants=Aa,t.default=Ea,t.deflate=ga,t.deflateRaw=pa,t.gzip=ka,t.inflate=ya,t.inflateRaw=xa,t.ungzip=za,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/packages/site/assets/scripts/old/external/prism.js b/packages/site/assets/scripts/old/external/prism.js new file mode 100644 index 0000000..f8a96c6 --- /dev/null +++ b/packages/site/assets/scripts/old/external/prism.js @@ -0,0 +1,9 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+scss+typescript */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); diff --git a/packages/site/assets/scripts/old/gallery-images.ts b/packages/site/assets/scripts/old/gallery-images.ts new file mode 100644 index 0000000..864dfe8 --- /dev/null +++ b/packages/site/assets/scripts/old/gallery-images.ts @@ -0,0 +1,36 @@ +export const handleGalleryImages = () => { + const images = document.querySelectorAll('.galleryImage'); + + const loadImage = (image: HTMLImageElement) => { + image.src = image.getAttribute('finalSrc') || ''; + }; + + const handleIntersection = (entries: IntersectionObserverEntry[]) => { + entries.forEach((entry) => { + if (entry.intersectionRatio > 0) { + loadImage(entry.target as HTMLImageElement); + } + }); + }; + + const observer = new IntersectionObserver(handleIntersection, { + root: null, + rootMargin: '0px', + threshold: 0.05, + }); + + images.forEach((img) => { + observer.observe(img); + + img.addEventListener('click', (event) => { + const image = event.target as HTMLImageElement; + + image.onerror = () => { + console.warn('Could not get LG version of image!'); + image.src = image.getAttribute('finalSrc') || ''; + }; + + image.src = image.getAttribute('hdSrc') || ''; + }); + }); +}; diff --git a/packages/site/assets/scripts/old/games.ts b/packages/site/assets/scripts/old/games.ts new file mode 100644 index 0000000..0934426 --- /dev/null +++ b/packages/site/assets/scripts/old/games.ts @@ -0,0 +1,113 @@ +import { + addHoverEffect, + createElement, + getElementsByClassName, + makeApiRequest, + skeleton, +} from './utils'; +import { e } from './elements/element'; + +interface Game { + link: string; + title: string; + console: string; + image: string; +} + +const createGameElement = (game: Game): Element => { + const imageElement = e( + 'div', + { + className: 'gameImage', + }, + [ + e('img', { + src: game.image || '/placeholder.svg', + alt: game.title, + style: !game.image ? 'object-fit: cover; width: 213px' : '', + }), + ], + ); + + addHoverEffect(imageElement); + + return createElement(game.link ? 'a' : 'div', { + href: game.link || undefined, + target: + game.link.includes('pfy.ch') || + game.link.includes('localhost') || + !game.link.includes('http') + ? '_self' + : '_blank', + className: 'game', + children: [ + e('div', { className: 'imageElementWrapper' }, imageElement), + createElement('div', { + className: 'main', + innerText: game.title, + }), + createElement('p', { + className: 'sub', + innerText: game.console, + }), + ], + }); +}; + +const getLatestPlays = async () => { + const renderTarget = getElementsByClassName('currentlyPlaying')?.[0]; + renderTarget?.append(skeleton('100%', '420px')); + + const json = await makeApiRequest< + { + gameId: string; + title: string; + consoleName: string; + imageBoxArt: string; + }[] + >('/retroacheivements/recent', 'GET'); + + if (renderTarget && json.length) { + renderTarget.innerHTML = ''; + json.slice(0, 3).forEach((game) => { + renderTarget.append( + createGameElement({ + link: `https://retroachievements.org/game/${game.gameId}`, + title: game.title, + console: game.consoleName, + image: `https://retroachievements.org/${game.imageBoxArt}`, + }), + ); + }); + } +}; + +document.addEventListener('DOMContentLoaded', async () => { + const recommendations = getElementsByClassName('recommendations'); + + recommendations?.forEach((recommendation) => { + const table = recommendation.querySelector('table') as HTMLTableElement; + + if (table) { + const data: Game[] = [...(table.querySelectorAll('tr') || [])] + .map((row, index) => { + if (index === 0) return; + + const cells = [...(row.children || [])] as HTMLTableCellElement[]; + return { + title: cells[0].innerText, + console: cells[1].innerText, + link: cells[2].innerText, + image: cells[3].innerText, + }; + }) + .filter((game) => game) as Game[]; + + const gameElements = data.map((game) => createGameElement(game)); + recommendation.innerHTML = ''; + recommendation.append(...gameElements); + } + }); + + await getLatestPlays(); +}); diff --git a/packages/site/assets/scripts/old/import-goat.ts b/packages/site/assets/scripts/old/import-goat.ts new file mode 100644 index 0000000..ea00b3e --- /dev/null +++ b/packages/site/assets/scripts/old/import-goat.ts @@ -0,0 +1,12 @@ +export const importGoat = () => { + const head = [...(document.getElementsByTagName('head') || [])]?.[0]; + + if (head && localStorage.getItem('no-goat') !== 'true') { + const goatScript = document.createElement('script'); + goatScript.src = '/scripts/external/count.js'; + goatScript.async = true; + goatScript.setAttribute('data-goatCounter', 'https://goat.pfy.ch/count'); + + head.append(goatScript); + } +}; diff --git a/packages/site/assets/scripts/old/installation.ts b/packages/site/assets/scripts/old/installation.ts new file mode 100644 index 0000000..94d3264 --- /dev/null +++ b/packages/site/assets/scripts/old/installation.ts @@ -0,0 +1,257 @@ +import { clamp, createElement, random } from './utils'; + +let frameRate = 24; +let timeBeforeEnd = 2; +const images: string[] = [ + 'https://assets.pfy.ch/og/000000400002.jpg', + 'https://assets.pfy.ch/og/000000410016.jpg', + 'https://assets.pfy.ch/og/000000410018.jpg', + 'https://assets.pfy.ch/og/000000410023.jpg', + 'https://assets.pfy.ch/og/000000410032.jpg', + 'https://assets.pfy.ch/og/000002030012.jpg', + 'https://assets.pfy.ch/og/000002030014.jpg', + 'https://assets.pfy.ch/og/000002040011.jpg', + 'https://assets.pfy.ch/og/000002040036.jpg', + 'https://assets.pfy.ch/og/000005590036.jpg', + 'https://assets.pfy.ch/og/000005600011.jpg', + 'https://assets.pfy.ch/og/000030050013.jpg', + 'https://assets.pfy.ch/og/000030050014.jpg', + 'https://assets.pfy.ch/og/000030050017.jpg', + 'https://assets.pfy.ch/og/000030050028.jpg', + 'https://assets.pfy.ch/og/000038520014.jpg', + 'https://assets.pfy.ch/og/000038520020.jpg', + 'https://assets.pfy.ch/og/000092310004.jpg', + 'https://assets.pfy.ch/og/000092310018.jpg', + 'https://assets.pfy.ch/og/A002110-R1-09-10.JPG', + 'https://assets.pfy.ch/og/A005698-R1-00-24A.JPG', + 'https://assets.pfy.ch/og/A005698-R1-12-12A.JPG', + 'https://assets.pfy.ch/og/CRO0022-R1-11-12.JPG', + 'https://assets.pfy.ch/og/CRO0169-R1-24-12A.JPG', + 'https://assets.pfy.ch/og/CRO0169-R1-25-11A-retouched.jpg', + 'https://assets.pfy.ch/og/CRO0543-R1-11-10.JPG', + 'https://assets.pfy.ch/og/CRO0579-R1-07-8A.JPG', + 'https://assets.pfy.ch/og/CRO0579-R1-11-12A.JPG', + 'https://assets.pfy.ch/og/CRO0579-R1-18-19A.JPG', + 'https://assets.pfy.ch/og/CRO0579-R1-32-33A.JPG', + 'https://assets.pfy.ch/og/CRO1678-R1-04-32A.JPG', + 'https://assets.pfy.ch/og/CRO1678-R1-07-29A.JPG', + 'https://assets.pfy.ch/og/CRO1679-R1-29-7A.JPG', + 'https://assets.pfy.ch/og/CRO1995-R1-18-6.JPG', + 'https://assets.pfy.ch/og/CRO2647-R1-00-36.JPG', + 'https://assets.pfy.ch/og/CRO2647-R1-07-29.JPG', + 'https://assets.pfy.ch/og/CRO2648-R1-02-35A.JPG', + 'https://assets.pfy.ch/og/CRO2648-R1-20-17A.JPG', + 'https://assets.pfy.ch/og/CRO2648-R1-31-6A.JPG', + 'https://assets.pfy.ch/og/CRO2648-R1-33-4A.JPG', + 'https://assets.pfy.ch/og/CRO2648-R1-35-2A.JPG', + 'https://assets.pfy.ch/og/CRO2698-R1-06-18A.JPG', + 'https://assets.pfy.ch/og/CRO2871-R1-10-14A.JPG', + 'https://assets.pfy.ch/og/CRO2871-R1-22-2A.JPG', + 'https://assets.pfy.ch/og/CRO3326-R1-02-22A.JPG', + 'https://assets.pfy.ch/og/CRO3326-R1-16-8A.JPG', + 'https://assets.pfy.ch/og/CRO3326-R1-18-6A.JPG', + 'https://assets.pfy.ch/og/CRO3326-R1-21-3A.JPG', + 'https://assets.pfy.ch/og/CRO3326-R1-22-2A.JPG', + 'https://assets.pfy.ch/og/CRO3745-R1-09-15A.JPG', + 'https://assets.pfy.ch/og/CRO3745-R1-12-12A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-05-31A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-07-29A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-11-25A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-18-18A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-34-2A.JPG', + 'https://assets.pfy.ch/og/CRO6452-R1-35-1A.JPG', + 'https://assets.pfy.ch/og/CRO7506-R1-10-14A.JPG', + 'https://assets.pfy.ch/og/CRO7506-R1-23-1A.JPG', + 'https://assets.pfy.ch/og/CRO0831-R1-22-24.png', + 'https://assets.pfy.ch/og/CRO7506-R1-23-1A.JPG', + 'https://assets.pfy.ch/og/CRO7506-R1-22-2A.JPG', + 'https://assets.pfy.ch/og/DSCF0076.JPG', +]; + +let target: HTMLDivElement; +let loadingBar: HTMLDivElement; +let progress = 0; + +let now = performance.now(); +let finish = performance.now() + timeBeforeEnd * 1000; +let then = performance.now(); +let frameInterval = 1000 / frameRate; +let lastRandom = 0; + +const uniqueRandom = (): number => { + let newRandom = random(0, images.length - 1); + + if (newRandom === lastRandom) { + return uniqueRandom(); + } + + lastRandom = newRandom; + + return newRandom; +}; + +export let elapsed = 0; +const render = async (newTime: number) => { + now = newTime; + elapsed = now - then; + + if (elapsed > frameInterval) { + then = now - (elapsed % frameInterval); + const images = [...target.querySelectorAll('img')]; + let current = uniqueRandom(); + + if (images) { + const percentComplete = Math.floor((now / finish) * 100); + const grayscale = clamp(percentComplete, 100, 0); + const saturate = clamp(300 * (percentComplete / 100), 400, 0); + const opacity = clamp(100 - percentComplete, 100, 1); + + images.forEach((image, index) => { + image.setAttribute( + 'style', + `filter: grayscale(${grayscale}%) saturate(${100 + saturate}%); opacity: ${opacity}%;`, + ); + if (index === current) { + image.className = ''; + } else { + image.className = 'hidden'; + } + }); + } + } + + requestAnimationFrame(render); +}; + +const preRender = () => { + if (progress === images.length) { + finish = performance.now() + timeBeforeEnd * 1000; + target.className = 'loaded'; + + target.appendChild(createElement('h1', { innerText: 'Do you remember?' })); + target.appendChild( + createElement('p', { + innerText: + "A point in the distance, fading.\nNervousness sets in.\nFear of the unknown.\nIt's all happened before.\nBut you dont remember.\nI'm so, so sorry.", + }), + ); + + requestAnimationFrame(render); + } +}; + +const handleImageLoaded = () => { + progress += 1; + loadingBar.style.width = `${(progress / images.length) * 100}%`; + preRender(); +}; + +const audio = () => { + const audioCtx = new AudioContext(); + + const chord = [220.5, 138.5, 164.5]; + + const oscillators = chord.map((note) => { + const oscillator = audioCtx.createOscillator(); + + oscillator.type = 'sine'; + oscillator.frequency.setValueAtTime(note, audioCtx.currentTime); // value in hertz + return oscillator; + }); + + const gainNode = audioCtx.createGain(); + + setInterval(() => { + const fade = audioCtx.createGain(); + + const drum = audioCtx.createOscillator(); + drum.type = 'square'; + drum.frequency.setValueAtTime(chord[0], audioCtx.currentTime); + drum.connect(fade); + drum.start(); + + fade.gain.setValueAtTime(0.075, audioCtx.currentTime); + fade.connect(gainNode); + + setTimeout(() => { + drum.stop(); + }, 100); + }, 1000); + + oscillators.forEach((oscillator) => { + oscillator.connect(gainNode); + + oscillator.start(); + }); + + gainNode.gain.setValueAtTime(0.05, audioCtx.currentTime); + gainNode.connect(audioCtx.destination); +}; + +const loadImages = () => { + audio(); + + const loadingWrapper = createElement('div', { + className: 'loading', + }); + loadingBar = createElement('div', { className: 'loadingBar' }); + loadingWrapper.appendChild(loadingBar); + target = document.getElementById('target') as HTMLDivElement; + + if (target) { + target.appendChild(loadingWrapper); + images.forEach((image) => { + const element = createElement('img', { + src: image, + onLoad: handleImageLoaded, + onError: () => console.error(`${image} failed to load`), + }) as HTMLImageElement; + + target.appendChild(element); + }); + } else { + console.error('Missing target element'); + } +}; + +const tillClose = () => { + const now = Date.now(); + const closingTime = new Date(); + const closingHourInput = document.getElementById( + 'closeHours', + ) as HTMLInputElement; + + closingTime.setHours(parseInt(closingHourInput.value || '17'), 0, 0, 0); + + const msDiff = closingTime.valueOf() - now; + const secDiff = msDiff / 1000; + const minDiff = Math.max(Math.floor(secDiff / 60), 0); + + console.log(minDiff); + + frameInterval = 1000 / 24; + timeBeforeEnd = minDiff * 60; + + loadImages(); +}; + +document.addEventListener('DOMContentLoaded', () => { + document + .getElementById('options') + ?.addEventListener('submit', function (event) { + event.preventDefault(); + + const formData = new FormData(event.target as HTMLFormElement); + const data = Object.fromEntries(formData); + + console.log(data); + + frameInterval = 1000 / parseFloat(data.framerate as unknown as string); + timeBeforeEnd = parseFloat(data.minutes as unknown as string) * 60; + + loadImages(); + }); + + // @ts-ignore - window assignment cause lazy non form buttons + window.tillClose = tillClose; +}); diff --git a/packages/site/assets/scripts/old/jsx.ts b/packages/site/assets/scripts/old/jsx.ts new file mode 100644 index 0000000..f0fc2ec --- /dev/null +++ b/packages/site/assets/scripts/old/jsx.ts @@ -0,0 +1,10 @@ +import { Attributes, e } from './elements/element'; + +/** @internal too be called by jsxFactory only */ +export default ( + tag: T, + props: Attributes | null, + ...children: (string | HTMLElement)[] +) => { + return e(tag, props, children); +}; diff --git a/packages/site/assets/scripts/old/lastfm/auth.tsx b/packages/site/assets/scripts/old/lastfm/auth.tsx new file mode 100644 index 0000000..ecc4f73 --- /dev/null +++ b/packages/site/assets/scripts/old/lastfm/auth.tsx @@ -0,0 +1,84 @@ +import jsx from '../jsx'; +import { API_KEY, makeRequest } from './lastfm'; +import { handleScrobbleFile } from './scrobble-file'; + +const initiateAuth = () => { + window.open( + `https://www.last.fm/api/auth/?api_key=${API_KEY}&cb=${window.location.href}`, + '_blank', + ); +}; + +export const handleToken = async (token: string) => { + const json = await makeRequest('GET', { + api_key: API_KEY, + method: 'auth.getSession', + token, + }); + + if (json.session) { + window.localStorage.setItem('lastfm-session', JSON.stringify(json.session)); + } + + window.location.search = ''; +}; + +const handleAuthed = async ( + target: Element, + session: { name: string; key: string }, +) => { + target.innerHTML = ''; + const newTarget: HTMLDivElement =
; + target.append( +
+
+ Logged in as {session.name} + +
+
+ {newTarget} +
, + ); + + const input: HTMLInputElement = ; + input.addEventListener( + 'change', + () => { + void (async () => { + const files = input.files; + + if (files.length === 1) { + await handleScrobbleFile(files[0], newTarget); + } + })(); + }, + false, + ); + + newTarget.append(input); +}; + +export const startAuth = async (target: Element) => { + const session = window.localStorage.getItem('lastfm-session'); + + if (session) { + const json = JSON.parse(session); + await handleAuthed(target, json); + } else { + const urlParams = new URLSearchParams(window.location.search); + + if (urlParams.get('token')) { + await handleToken(urlParams.get('token')); + } else { + target.innerHTML = ''; + target.append(); + } + } +}; diff --git a/packages/site/assets/scripts/old/lastfm/lastfm.ts b/packages/site/assets/scripts/old/lastfm/lastfm.ts new file mode 100644 index 0000000..0f10eec --- /dev/null +++ b/packages/site/assets/scripts/old/lastfm/lastfm.ts @@ -0,0 +1,28 @@ +export const SHARED_SECRET = '2743c377e96ca8ccb2895c3117ca4a74'; +export const API_KEY = '2835c32ebf9cabedf871b8c854ecbb74'; + +export const makeRequest = async ( + method: 'GET' | 'POST', + params: Record, +) => { + const stringParams = Object.keys(params) + .map((key) => `${key}=${params[key]}`) + .join('&'); + + const signature = `${stringParams.replaceAll(/=|&/g, '')}${SHARED_SECRET}`; + + // @ts-ignore + const md5Signature = CryptoJS.MD5(signature).toString(); + + const response = await fetch( + `https://ws.audioscrobbler.com/2.0/?${stringParams}&api_sig=${md5Signature}&format=json`, + { + method: method, + headers: { + Accept: 'application/json', + }, + }, + ); + + return response.json(); +}; diff --git a/packages/site/assets/scripts/old/lastfm/scrobble-file.tsx b/packages/site/assets/scripts/old/lastfm/scrobble-file.tsx new file mode 100644 index 0000000..f8ae69f --- /dev/null +++ b/packages/site/assets/scripts/old/lastfm/scrobble-file.tsx @@ -0,0 +1,124 @@ +import jsx from '../jsx'; +import { API_KEY, SHARED_SECRET } from './lastfm'; + +interface Song { + artist: string; + album: string; + track: string; + timestamp: string; +} + +interface ScrobbleParams { + album: string; + api_key: string; + artist: string; + method: 'track.scrobble'; + sk: string; + timestamp: string; + track: string; + api_sig?: string; // Should be appended after the signature is created +} + +export const scrobbleSong = async (song: Song, sessionKey: string) => { + console.log(song); + + const params: ScrobbleParams = { + album: song.album, + api_key: API_KEY, + artist: song.artist, + method: 'track.scrobble', + sk: sessionKey, + timestamp: song.timestamp, + track: song.track, + }; + + const signature = Object.keys(params) + .map((key) => `${key}${params[key]}`) + .sort((a, b) => a.localeCompare(b)) + .join(''); + + // Working with this API is really frustrating ... + // @ts-ignore + params.api_sig = CryptoJS.MD5(`${signature}${SHARED_SECRET}`).toString(); + + const response = await fetch( + 'https://ws.audioscrobbler.com/2.0/?format=json', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + // Doing this properly breaks the LastFM API? + // @ts-ignore + body: new URLSearchParams(params), + }, + ); + + console.log(response); + + return response; +}; + +export const scrobbleSongs = async (songs: Song[], target: Element) => { + target.innerHTML = ''; + target.append(

Scrobbling {songs.length} songs...

); + + const session = JSON.parse(window.localStorage.getItem('lastfm-session')); + const sessionKey = session.key; + + for (let i = 0; i < songs.length; i++) { + const song = songs[i]; + await scrobbleSong(song, sessionKey); + target.append( +

+ ({i + 1}/{songs.length}) Scrobbled {song.artist} - {song.track} +

, + ); + } + + target.append(
); + target.append(

Done! Remember to delete your .scrobbler.log file!

); +}; + +export const handleScrobbleFile = async (file: File, target: Element) => { + target.innerHTML = ''; + + target.append(
Scrobbling {file.name}...
); + + const fileContent = await file.text(); + const splitContent = fileContent.split('\n'); + + const songs: Song[] = splitContent + .filter((line) => !line.startsWith('#')) + .filter((line) => line.length > 0) + .map((rawSong) => rawSong.split('\t')) + .map((song) => { + const timestamp = parseInt(song[6]); + const offset = new Date().getTimezoneOffset(); + const actualTime = timestamp + offset * 60; + + return { + artist: song[0], + album: song[1], + track: song[2], + timestamp: actualTime.toString(), + }; + }); + + target.innerHTML = ''; + + target.append( +
+

The following songs will be scrobbled

+
    + {...songs.map((song) => ( +
  • + {song.artist} - {song.track} ({song.album}) @ {song.timestamp} +
  • + ))} +
+

Remember to delete your .scrobbler.log file!

+ +
, + ); +}; diff --git a/packages/site/assets/scripts/old/lastfm/scrobbler.tsx b/packages/site/assets/scripts/old/lastfm/scrobbler.tsx new file mode 100644 index 0000000..12390be --- /dev/null +++ b/packages/site/assets/scripts/old/lastfm/scrobbler.tsx @@ -0,0 +1,19 @@ +import jsx from '../jsx'; +import { getElementsByClassName, skeleton } from '../utils'; +import { startAuth } from './auth'; + +window.addEventListener('DOMContentLoaded', async () => { + const target = getElementsByClassName('scrobbler')?.[0]; + + if (target) { + target.innerHTML = ''; + target.append(skeleton('100%', '80px')); + + target.parentNode.append( + {{#each headScript}} {{/each}} {{#each stylesheet}} {{/each}} - - - + + + + + +
+
+ +
+ +

{{title}}

{{{content}}}
+
+ +
+ + +
+ + + +
{{#each footerScript}} diff --git a/packages/site/build/utils/create-script-path.ts b/packages/site/build/utils/create-script-path.ts index b777047..71da6c5 100644 --- a/packages/site/build/utils/create-script-path.ts +++ b/packages/site/build/utils/create-script-path.ts @@ -3,7 +3,7 @@ import { thisCyclesHash } from '../config'; export const createScriptPath = (script: string, cwd?: string): string => { const js = script .replaceAll('.tsx', '.ts') - .replaceAll('.ts', `-${thisCyclesHash}.js`) + .replaceAll('.ts', `.min.js`) .replaceAll(cwd || '', ''); return `/scripts/${js}`; diff --git a/packages/site/package.json b/packages/site/package.json index 25c4e64..5eb12f9 100644 --- a/packages/site/package.json +++ b/packages/site/package.json @@ -22,7 +22,8 @@ "marked-footnote": "1.4.0", "sass": "^1.92.0", "serve-static": "2.2.0", - "web-shared": "workspace:*" + "web-shared": "workspace:*", + "pfych-table": "1.0.6" }, "devDependencies": { "@types/serve-static": "1.15.8", diff --git a/packages/site/pages/index.html b/packages/site/pages/index.html new file mode 100644 index 0000000..fa68388 --- /dev/null +++ b/packages/site/pages/index.html @@ -0,0 +1,179 @@ + + + + + + + + Pfych + + + + + + + + + + + + + + + + + +
+
+ +
+

pfy.ch

+
+
+

+ Hey, I'm Pfych, a full time software + developer & hobbyist something or other in the Greater Sydney + region. +

+ +
+
+ +
+
+
+
+

+ The recent posts section below is only available when Javascript is + enabled since the one on my homepage is dynamic with user selectable + filters. If you'd like to see the full list of posts, you can view the + index which does not require Javascript. +

+
+
+
+
+ + +
+ +
+ + + +
+

Pfych

+ Ms. + Violet + pfych + + w, + e + Sydney, + + F +

+ Full time software developer & hobbyist something or other in the + Greater Sydney region +

+
+ + diff --git a/packages/site/pages/sandbox.html b/packages/site/pages/sandbox.html new file mode 100644 index 0000000..df7b53e --- /dev/null +++ b/packages/site/pages/sandbox.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + +
Press "Run Project" to execute Javascript!
+
+
+
+
+ HTML +
+
+ + +
+            
+          
+
+
+
+
+ SCSS +
+
+ +
+            
+          
+
+
+
+
+ + + +
+
+ +
+            
+          
+
+
+
+
+
+
+
+
+ + + + + diff --git a/packages/site/posts/donate.md b/packages/site/posts/donate.md index d5e7266..7474809 100644 --- a/packages/site/posts/donate.md +++ b/packages/site/posts/donate.md @@ -1,7 +1,7 @@ --- title: Donations summary: Support me via Stripe! -scripts: stripe.tsx +scripts: old/stripe.tsx publishedAt: 1737763200000 updatedAt: 1750492055000 --- @@ -14,9 +14,9 @@ Thank you for your donation!! Please contact me if you would like your name, sit If you would like to support me and what I do with this site and elsewhere online please click the following link to make a donation via Stripe, all purchases are in AUD and are completed via Stripe Checkout: -:::{.stripeProduct} +
flexi-donation -::: +
--- diff --git a/packages/site/posts/games/azur-lane.md b/packages/site/posts/games/azur-lane.md index 9d434bb..bc38b39 100644 --- a/packages/site/posts/games/azur-lane.md +++ b/packages/site/posts/games/azur-lane.md @@ -1,7 +1,7 @@ --- title: Azur Lane summary: The only ship-girl game I can play -scripts: azur/azur.tsx +scripts: old/azur/azur.tsx updatedAt: 1747540376000 --- @@ -17,13 +17,13 @@ Fun watching the number go up. ## Fleet -::: {.fleet} +
| id | Name | Level | |-------|-------|-------| | 10022 | Akagi | 1 | -::: +
## Playing on Linux diff --git a/packages/site/posts/games/crimson-clover-world-explosion.md b/packages/site/posts/games/crimson-clover-world-explosion.md index 930f224..dbd493c 100644 --- a/packages/site/posts/games/crimson-clover-world-explosion.md +++ b/packages/site/posts/games/crimson-clover-world-explosion.md @@ -7,10 +7,10 @@ updatedAt: 1717543017000 I picked this up on a [Steam sale](https://store.steampowered.com/app/1718160/Crimzon_Clover_World_EXplosion/). For some reason it only runs vertically for me, but it's still pretty fun! -:::{.sortable} +
| Date | Version | Mode | Ship | Stage | Continue | Total Score | |------------|--------------|----------|------|-------|----------|-------------| | 2023/03/30 | Novice 1.13f | Original | 1 | 3 | 0 | 547,249,322 | -::: +
diff --git a/packages/site/posts/games/deathsmiles.md b/packages/site/posts/games/deathsmiles.md index a8661b2..ab907c4 100644 --- a/packages/site/posts/games/deathsmiles.md +++ b/packages/site/posts/games/deathsmiles.md @@ -9,7 +9,7 @@ The first horizontal scrolling shooter I've played that doesn't suck. Theming is I'm playing the [Deathsmiles I・II](https://store.steampowered.com/app/1884300/Deathsmiles_III/) version released on Steam. -:::{.sortable} +
| Date | Version | Character | Stage | Level | Continue | Score | |------------|--------------|-----------|---------------|-------|----------|-----------| @@ -18,4 +18,4 @@ I'm playing the [Deathsmiles I・II](https://store.steampowered.com/app/1884300/ | 2023/03/17 | Normal | Rosa | 3-1 | 1 | 0 | 2,947,333 | | 2023/05/23 | Normal | Rosa | 5-1 | 1 | 0 | 5,628,290 | -::: +
diff --git a/packages/site/posts/games/dodonpachi.md b/packages/site/posts/games/dodonpachi.md index 2c8a462..71cb1ba 100644 --- a/packages/site/posts/games/dodonpachi.md +++ b/packages/site/posts/games/dodonpachi.md @@ -9,7 +9,7 @@ The first Shmup I played after being recommended it by an arcade regular while w I'm Playing the [Steam PC Release](https://store.steampowered.com/app/464450/DoDonPachi_Resurrection/) mostly, however if I played on an actual cabinet I'll denote it. -:::{.sortable} +
| Date | Version | Ship | Type | Area | Continue | Score | |------------|------------------------|------|------|------|----------|-------------------| @@ -27,6 +27,6 @@ I'm Playing the [Steam PC Release](https://store.steampowered.com/app/464450/DoD | 2023/06/11 | Ver 1.51 (PC) | B | BOM | 4 | 0 | 8,337,636,959[^1] | | 2023/07/16 | Ver 1.51 (PC) | B | BOM | 4 | 0 | 4,966,148,959 | -::: +
[^1]: I have no idea how or why this jump is so massive? I just got this score one day in Ver 1.51 on my Steam Deck while commuting and I Haven't had Sub 1,000,000,000 score since... No idea if something clicked or if I accidentally labeled all my previous plays wrong... diff --git a/packages/site/posts/games/games.md b/packages/site/posts/games/games.md index b3b3318..d0fa034 100644 --- a/packages/site/posts/games/games.md +++ b/packages/site/posts/games/games.md @@ -1,13 +1,11 @@ --- title: Games summary: We do a little gaming -scripts: games.ts +scripts: old/games.ts publishedAt: 1723361404683 updatedAt: 1750314316000 --- -# Games {.hidden} - I do a *little* gaming. This used to be one big long page, but I've split it out into game specific pages. These pages are used to keep track of any specific game achievements I think are notable or for any opinions on certain games. ## Current Rotation @@ -15,13 +13,13 @@ I do a *little* gaming. This used to be one big long page, but I've split it out Games I'm playing now or plan to play through soon. This will stay partially up to date as I play more games.

-:::{.noScript} +
With JS enabled, this renders way nicer! -::: +
-:::{.recommendations .threeByThree} +
| Title | Console | Link | Image | |-----------------------------|----------|----------------------|-----------------------------------------------| @@ -31,7 +29,8 @@ With JS enabled, this renders way nicer! | Monster Hunter Rise | PC | | https://assets.pfy.ch/covers/rise.jpg | | Final Fantasy XIV | PC | | https://assets.pfy.ch/covers/stormblood.png | | Riichi Mahjong | Tabletop | mahjong/mahjong.html | https://assets.pfy.ch/covers/mjs.png | -::: + +
## Recent Retro plays @@ -39,9 +38,9 @@ The last 3 games I've played that have registered on retroacheivements. You can Clicking on these games will take you to the game page on retroachievements.org.

-:::{.currentlyPlaying} +
-::: +
## Games with their own pages @@ -49,7 +48,7 @@ Below are games I've played that have their own pages - whether It's for score t Mostly Arcade titles & Arcade-style games where tracking score is important.

-:::{.recommendations} +
| Title | Console | Link | Image | |--------------------------------|---------------|-------------------------------------|-----------------------------------------------------------------| @@ -62,7 +61,7 @@ Mostly Arcade titles & Arcade-style games where tracking score is important. | Psyvariar 2 - Ultimate Final | PlayStation 2 | psyvariar-2-ultimate-final.html | https://assets.pfy.ch/covers/Psyvariar 2 - Ultimate Final.jpg | | Azur Lane | Mobile | azur-lane.html | https://assets.pfy.ch/covers/azur lane.png | -::: +
### Direct links to game pages diff --git a/packages/site/posts/games/iidx/iidx-retrospective.md b/packages/site/posts/games/iidx/iidx-retrospective.md index 5b4684c..540038f 100644 --- a/packages/site/posts/games/iidx/iidx-retrospective.md +++ b/packages/site/posts/games/iidx/iidx-retrospective.md @@ -7,7 +7,7 @@ publishedAt: 1683122400000 updatedAt: 1738303148000 --- -::: {.banner} + # IIDX Retrospective diff --git a/packages/site/posts/games/iidx/price-credits.md b/packages/site/posts/games/iidx/price-credits.md index a29a00b..ee7e22e 100644 --- a/packages/site/posts/games/iidx/price-credits.md +++ b/packages/site/posts/games/iidx/price-credits.md @@ -2,7 +2,7 @@ title: Arcade Pricing in Sydney summary: Pricing of credits in Sydney publishedAt: 1751701123284 -scripts: spreadsheet.ts +scripts: old/spreadsheet.ts updatedAt: 1752565107000 --- @@ -22,7 +22,7 @@ Since most venues offer "Bonuses", costs can vary. For a breakdown of this math, The following venues offer deals where the "Real Dollar Value" can get quite low! -:::{.sortable .spreadsheet data-name="venue-value"} +
| Venue | Top Up | Bonus | Total | Real Dollar Value | |-------------------------|--------|-------|-------------|-------------------| @@ -35,7 +35,7 @@ The following venues offer deals where the "Real Dollar Value" can get quite low | Timezone | $1 | $0 | = B7 C7 + $ | = D7 B7 / ^ $ | | Timezone Double Dollars | $1 | $1 | = B8 C8 + $ | = D8 B8 / ^ $ | -::: +
# The Games @@ -46,18 +46,18 @@ The following games have been logged, all tables can be sorted by clicking the h The cost of Beatmania IIDX at relevant venues: ### Credits to play -:::{.sortable .spreadsheet data-name="iidx-credits"} +
| Venue | Standard | Premium | Credit Cost | |-------|----------|---------|-------------| | Puri | 2 | 3 | $1 | | Koko | 2 | 3 | $1.45 | - -::: +
### Credit Breakdown -:::{.sortable .spreadsheet data-name="iidx-cost"} + +
| Venue | Real Credit Cost | $/Standard | $/Premium | @@ -69,14 +69,15 @@ The cost of Beatmania IIDX at relevant venues: | Koko $100 | = !venue-value:E5 !iidx-credits:D2 * ^ $ | = !iidx-credits:B2 B5 * ^ $ | = !iidx-credits:C2 B5 * ^ $ | | Koko $200 | = !venue-value:E6 !iidx-credits:D2 * ^ $ | = !iidx-credits:B2 B6 * ^ $ | = !iidx-credits:C2 B6 * ^ $ | -::: +
## Sound Voltex The cost of Sound Voltex at relevant venues: ### Credits to play -:::{.sortable .spreadsheet data-name="sdvx-credits"} + +
| Venue | Standard | Premium | Credit Cost | |----------|----------|---------|-------------| @@ -84,10 +85,11 @@ The cost of Sound Voltex at relevant venues: | Koko | 2 | 3 | $1.20 | | Timezone | 1 | 2 | $2.40 | -::: +
### Credit Breakdown -:::{.sortable .spreadsheet data-name="iidx-cost"} + +
| Venue | Real Credit Cost | $/Standard | $/Premium | @@ -101,71 +103,92 @@ The cost of Sound Voltex at relevant venues: | Timezone | = !venue-value:E7 !sdvx-credits:D3 * ^ $ | = !sdvx-credits:B3 B7 * ^ $ | = !sdvx-credits:C3 B7 * ^ $ | | Timezone DD | = !venue-value:E8 !sdvx-credits:D3 * ^ $ | = !sdvx-credits:B3 B8 * ^ $ | = !sdvx-credits:C3 B8 * ^ $ | -::: +
## Gitadora The cost of Gitadora at relevant venues ### Credits to play -:::{.sortable .spreadsheet data-name="dtx-credits"} + +
| Venue | Light | Standard | Credit Cost | |----------|-------|----------|-------------| | Timezone | 1 | 2 | $2.80 | -::: +
### Credit Breakdown -:::{.sortable .spreadsheet data-name="dtx-cost"} + +
| Venue | Real Credit Cost | $/Light | $/Standard | |-------------|-----------------------------------------|----------------------------|----------------------------| | Timezone | = !venue-value:E7 !dtx-credits:D1 * ^ $ | = !dtx-credits:B1 B1 * ^ $ | = !dtx-credits:C1 B1 * ^ $ | | Timezone DD | = !venue-value:E8 !dtx-credits:D1 * ^ $ | = !dtx-credits:B1 B2 * ^ $ | = !dtx-credits:C1 B2 * ^ $ | -::: - ---- +
-# The Math +[//]: # (---) - +[//]: # (# The Math) -This really isn't important for most people. but I wanted an excuse to setup MathJax on my website to render formulas :3 +[//]: # () +[//]: # () - +[//]: # () +[//]: # (This really isn't important for most people. but I wanted an excuse to setup MathJax on my website to render formulas :3) +[//]: # () +[//]: # ( ) -First you must find the "Real dollar value": +[//]: # () +[//]: # () +[//]: # (First you must find the "Real dollar value":) -$RealDollarValue = \frac{TopUp+Bonus}{TopUp}$ +[//]: # () +[//]: # ($RealDollarValue = \frac{TopUp+Bonus}{TopUp}$) -Using Koko's $200 top-up with a $140 bonus as an example: +[//]: # () +[//]: # (Using Koko's $200 top-up with a $140 bonus as an example:) -$\frac{\$200+\$140}{\$200} = \$0.59$ +[//]: # () +[//]: # ($\frac{\$200+\$140}{\$200} = \$0.59$) -You can then find the real cost-per-credit: +[//]: # () +[//]: # (You can then find the real cost-per-credit:) -$RealCreditCost = RealDollarValue * CreditCost$ +[//]: # () +[//]: # ($RealCreditCost = RealDollarValue * CreditCost$) -With the "Real Dollar Value" being $0.59, and the cost of a credit being $1.45, we can find the "Real Credit Cost": +[//]: # () +[//]: # (With the "Real Dollar Value" being $0.59, and the cost of a credit being $1.45, we can find the "Real Credit Cost":) -$\$0.59 * \$1.45 = \$0.85$ +[//]: # () +[//]: # ($\$0.59 * \$1.45 = \$0.85$) -You can then multiply the "Real Credit Cost" by the amount of credits required for a game-mode +[//]: # () +[//]: # (You can then multiply the "Real Credit Cost" by the amount of credits required for a game-mode) -$FinalCost = RealCreditCost * RequiredCredits$ +[//]: # () +[//]: # ($FinalCost = RealCreditCost * RequiredCredits$) -So for a standard IIDX play (2 Credits), with Koko's $200 top-up bonus costs $1.71: +[//]: # () +[//]: # (So for a standard IIDX play (2 Credits), with Koko's $200 top-up bonus costs $1.71:) -$\$0.85 * 2 = \$1.71$ +[//]: # () +[//]: # ($\$0.85 * 2 = \$1.71$) -The final formula is: +[//]: # () +[//]: # (The final formula is:) -$FinalCost = RequiredCredits(CreditCost(\frac{TopUp+Bonus}{TopUp}))$ +[//]: # () +[//]: # ($FinalCost = RequiredCredits(CreditCost(\frac{TopUp+Bonus}{TopUp}))$) -Or with the Koko $200 Bonus & Standard IIDX pricing (2 Credits) filled in: +[//]: # () +[//]: # (Or with the Koko $200 Bonus & Standard IIDX pricing (2 Credits) filled in:) -$2(\$1.45(\frac{\$200+\$140}{\$200})) = \$1.71$ +[//]: # () +[//]: # ($2(\$1.45(\frac{\$200+\$140}{\$200})) = \$1.71$) diff --git a/packages/site/posts/games/mahjong/calculator.md b/packages/site/posts/games/mahjong/calculator.md index f51c95c..9743f03 100644 --- a/packages/site/posts/games/mahjong/calculator.md +++ b/packages/site/posts/games/mahjong/calculator.md @@ -1,12 +1,12 @@ --- title: Mahjong Calculator summary: Fu/Han scoring calculator -scripts: mpszmahjong.ts +scripts: old/mpszmahjong.ts updatedAt: 1737266018000 --- This will log to the console for now! -:::{.mpszdemo} +
-::: +
diff --git a/packages/site/posts/games/mahjong/mahjong.md b/packages/site/posts/games/mahjong/mahjong.md index b138f3b..bc6aae9 100644 --- a/packages/site/posts/games/mahjong/mahjong.md +++ b/packages/site/posts/games/mahjong/mahjong.md @@ -1,7 +1,7 @@ --- title: Mahjong summary: Riichi Mahjong & MPSZ Rendering -scripts: mpszmahjong.ts +scripts: old/mpszmahjong.ts publishedAt: 1735595974939 updatedAt: 1738387079000 --- diff --git a/packages/site/posts/games/mahjong/player-guide.md b/packages/site/posts/games/mahjong/player-guide.md index be3cacc..c468a4b 100644 --- a/packages/site/posts/games/mahjong/player-guide.md +++ b/packages/site/posts/games/mahjong/player-guide.md @@ -1,7 +1,7 @@ --- title: Riichi Mahjong Player Guide summary: Simple guide to quickly share with new players -scripts: mpszmahjong.ts +scripts: old/mpszmahjong.ts publishedAt: 1736459293032 updatedAt: 1746238341000 --- @@ -17,7 +17,7 @@ This guide is primarily use as a quick refresher for new players I play with in- The Sticks suit (Usually call "souzu"), The 1 of sticks is usually a bird. -:::{.mpszhand} +
123456789s ::: @@ -116,7 +116,7 @@ Here's a few easy to remember Yakus: :::{.mpszhand} 111777m111z888p44s -::: +

diff --git a/packages/site/posts/games/mahjong/scoring-calculator.md b/packages/site/posts/games/mahjong/scoring-calculator.md index 3375833..ef1f568 100644 --- a/packages/site/posts/games/mahjong/scoring-calculator.md +++ b/packages/site/posts/games/mahjong/scoring-calculator.md @@ -1,7 +1,7 @@ --- title: Riichi Mahjong Scoring description: Quick scoring reference -scripts: mahjong/scoring.ts +scripts: old/mahjong/scoring.ts updatedAt: 1738387079000 --- @@ -9,6 +9,6 @@ updatedAt: 1738387079000 Below is a quick scoring calculator for riichi mahjong. It will not render without JavaScript enabled! -::: {.riichiScoring} +
-::: +
diff --git a/packages/site/posts/games/psyvariar-2-ultimate-final.md b/packages/site/posts/games/psyvariar-2-ultimate-final.md index 914343c..df121c0 100644 --- a/packages/site/posts/games/psyvariar-2-ultimate-final.md +++ b/packages/site/posts/games/psyvariar-2-ultimate-final.md @@ -11,10 +11,10 @@ The main gimmick (that I've picked out so far) is that you only do full damage w I've only played it once, but I know I'm really going to enjoy it. Not to sure how to lay out the score table right now but will try keep it simple. Might have to rework my highs-core table code for this one... -::: {.sortable} +
| Date | Area 1 | Area 2 | Area 3 | Total | | ---------- | -------------------- | ------------------- | -------------------- | --------- | | 2023/08/15 | 1,527,200 / 212 / 24 | 1,459,000 / 99 / 58 | 1,822,900 / 379 / 98 | 4,882,200 | -::: +
diff --git a/packages/site/posts/games/touhou/mountain-of-faith.md b/packages/site/posts/games/touhou/mountain-of-faith.md index e953f55..99a2e09 100644 --- a/packages/site/posts/games/touhou/mountain-of-faith.md +++ b/packages/site/posts/games/touhou/mountain-of-faith.md @@ -22,7 +22,7 @@ This game is still actively being played. This page tracks the scores as well as ## Scores -:::{.sortable} +
| Date | Difficulty | Character | Type | Stage | Total Score | |------------|-------------|-----------|---------------|-------|----------------| @@ -40,7 +40,7 @@ This game is still actively being played. This page tracks the scores as well as | 2023/08/02 | Normal | Reimu | Homing | 2 | 14,491,250 | | 2023/08/02 | Lunatic[^4] | Reimu | Homing | 2 | 3,561,020 | -::: +
[^1]: Learned to press shift lol [^2]: Learned about the "get item border line" & got greedy. Died way too early. diff --git a/packages/site/posts/music/music.md b/packages/site/posts/music/music.md index cb063b8..127d2ee 100644 --- a/packages/site/posts/music/music.md +++ b/packages/site/posts/music/music.md @@ -1,13 +1,11 @@ --- title: Music summary: Music I like and am currently listening to -scripts: music.tsx +scripts: old/music.tsx publishedAt: 1723096440000 updatedAt: 1746003301000 --- -# Music {.hidden} - I used to rotate through heaps of albums weekly when I was super into discovering new things. Nowadays, I'll usually pick a genre and stick to it for a while before trying out something else. - [Recommendations](#recommendations) @@ -17,13 +15,13 @@ I used to rotate through heaps of albums weekly when I was super into discoverin Albums that I've listened too and really like. Worth looking them up on your preferred music service! I'll be adding more albums as I go. Potentially having them link to a more detailed page with more information. The list is randomised so it's not necessarily in order of preference. -:::{.noScript} +
With JS enabled, this renders way nicer! -::: +
-:::{.recommendations} +
| Album | Artist | Image | |-----------------------------------------|----------------------------------|------------------------------------------------------------------------------------------------------------| @@ -43,14 +41,13 @@ With JS enabled, this renders way nicer! | The Rise and Fall of a Midwest Princess | Chappell Roan | https://upload.wikimedia.org/wikipedia/en/3/34/Chappell_Roan_-_The_Rise_and_Fall_of_a_Midwest_Princess.png | | Quarantine | Laurel Halo | https://f4.bcbits.com/img/a2439830317_10.jpg | -::: +
## Last 30 Days If the API isn't down - below should be the last few albums I've listened to over the last 30 days. I've been using an [iPod Classic](./ipod.md) lately though so this might not be _actually_ what I've listened to lately. The Last.fm API also kinda sucks now & sometimes returns no data at all - This may be why artwork/titles may be missing! -:::{.currentlyPlaying} - -::: +
+

diff --git a/packages/site/posts/music/scrobbler.md b/packages/site/posts/music/scrobbler.md index 5122958..d441e18 100644 --- a/packages/site/posts/music/scrobbler.md +++ b/packages/site/posts/music/scrobbler.md @@ -1,7 +1,7 @@ --- title: Rockbox Scrobbler summary: Rockbox .scrobbler.log parser -scripts: lastfm/scrobbler.tsx +scripts: old/lastfm/scrobbler.tsx publishedAt: 1742008783291 bluesky: 3lkf6kkmddk2h updatedAt: 1742535210000 @@ -11,9 +11,9 @@ A really basic lastfm scrobbler for RockBox scrobble files, It sends requests on If you are on a daily build of RockBox you will need to export your `.scrobbler.log` file manually from the LastFM Plugin. It will then be in it's the usual location. After uploading - delete the `.scrobbler.log` as usual. -::: {.scrobbler} +
-::: +
--- diff --git a/packages/site/posts/photography/installation.md b/packages/site/posts/photography/installation.md index 0c618d2..af832c8 100644 --- a/packages/site/posts/photography/installation.md +++ b/packages/site/posts/photography/installation.md @@ -1,6 +1,6 @@ --- title: Installation -scripts: installation.ts +scripts: old/installation.ts updatedAt: 1717543060000 --- diff --git a/packages/site/posts/programming/4k-sunshine.md b/packages/site/posts/programming/4k-sunshine.md index 4c1d691..03a3e9a 100644 --- a/packages/site/posts/programming/4k-sunshine.md +++ b/packages/site/posts/programming/4k-sunshine.md @@ -5,7 +5,7 @@ publishedAt: 1719921036925 updatedAt: 1719921723000 --- -:::{.banner} + ## Contents diff --git a/packages/site/posts/programming/jsx-clientside.md b/packages/site/posts/programming/jsx-clientside.md index d234dbe..1ba9be5 100644 --- a/packages/site/posts/programming/jsx-clientside.md +++ b/packages/site/posts/programming/jsx-clientside.md @@ -22,14 +22,14 @@ When I first was adding JS & Interactive pages to my site, pages would look some ```markdown --- title: example -scripts: example.ts +scripts: old/example.ts --- Hello World -::: {.example} +
-::: +
``` ```ts diff --git a/packages/site/posts/programming/projects/bms-ipfs.md b/packages/site/posts/programming/projects/bms-ipfs.md index efb97c8..ec0ec55 100644 --- a/packages/site/posts/programming/projects/bms-ipfs.md +++ b/packages/site/posts/programming/projects/bms-ipfs.md @@ -1,7 +1,7 @@ --- title: IPFS & Beatoraja summary: Downloading Beatoraja charts from a table in game via IPFS -scripts: todo-txt.ts +scripts: old/todo-txt.ts updatedAt: 1723438398000 --- diff --git a/packages/site/posts/programming/projects/bms-sow.md b/packages/site/posts/programming/projects/bms-sow.md index b4d3fbc..fba99bd 100644 --- a/packages/site/posts/programming/projects/bms-sow.md +++ b/packages/site/posts/programming/projects/bms-sow.md @@ -134,11 +134,11 @@ type TableBody = { ### TableMirror Objects -::: {.banner} + We should store basic metadata about the table to prevent spamming the table host when users view our site. When users view a table we should show extremely slim amounts of information as well as the related `localChart` objects in our system. If the user wishes to, they can load the remaining charts we do not have dedicated objects for. diff --git a/packages/site/posts/programming/projects/mpsz-rendering.md b/packages/site/posts/programming/projects/mpsz-rendering.md index deab5b1..8b02e1e 100644 --- a/packages/site/posts/programming/projects/mpsz-rendering.md +++ b/packages/site/posts/programming/projects/mpsz-rendering.md @@ -1,7 +1,7 @@ --- title: Mahjong MPSZ Rendering summary: Rendering a Mahjong Hand using MPSZ Notation -scripts: mpszmahjong.ts +scripts: old/mpszmahjong.ts publishedAt: 1735595974939 updatedAt: 1736459288000 --- @@ -11,7 +11,7 @@ I've written a fun script to render out tiles using [mpsz notation](https://tug. It takes the following plain text: `119p 19s 19m 1234567z` Then renders out the following: -:::{.mpszhand} +
119p 19s 19m 1234567z ::: @@ -25,7 +25,7 @@ Update the input below to view your hand. Use MPSZ notation. If you have Javascript enabled, the demo should render here. -::: +
### Code Sandbox diff --git a/packages/site/posts/programming/projects/webmentions.md b/packages/site/posts/programming/projects/webmentions.md index f00baa8..a779bb9 100644 --- a/packages/site/posts/programming/projects/webmentions.md +++ b/packages/site/posts/programming/projects/webmentions.md @@ -5,11 +5,11 @@ publishedAt: 1687751425000 updatedAt: 1742878465000 --- -::: {.banner} + I recently learned about the [W3 Spec for Webmentions](https://www.w3.org/TR/webmention/)! diff --git a/packages/site/posts/programming/serverless-please.md b/packages/site/posts/programming/serverless-please.md index 9e1b650..57e7e1f 100644 --- a/packages/site/posts/programming/serverless-please.md +++ b/packages/site/posts/programming/serverless-please.md @@ -5,7 +5,7 @@ publishedAt: 1688961025000 updatedAt: 1727330965000 --- -::: {.banner} + ## Serverless Framework? diff --git a/packages/site/posts/programming/stripe.md b/packages/site/posts/programming/stripe.md index fb3bc0f..3363449 100644 --- a/packages/site/posts/programming/stripe.md +++ b/packages/site/posts/programming/stripe.md @@ -1,6 +1,6 @@ --- title: Stripe -scripts: stripe.tsx +scripts: old/stripe.tsx publishedAt: 1727798876000 updatedAt: 1742177576000 --- @@ -11,8 +11,8 @@ It handles basic stock keeping - which was why I couldn't just use Stripe's host It's not really meant for scale, but it'll handle what I need just fine - I'm not expecting to be selling a billion thingamajigs anytime soon! ~~If you want to purchase the example below for $1, go ahead. I'll send you a nice email when the payment goes through. Be warned though, there's only 2 in stock! You really don't want to miss out! Haha.~~ Sold out! $2 Profit (minus tax ;_;) -:::{.stripeProduct} +
example -::: +
I currently use this on my [donations](../donate.md) page to accept variable donations as well - so it can handle more than just static product pricing & basic inventory management! diff --git a/packages/site/posts/uptime.md b/packages/site/posts/uptime.md index af7e7f0..d3de693 100644 --- a/packages/site/posts/uptime.md +++ b/packages/site/posts/uptime.md @@ -1,6 +1,6 @@ --- title: Uptime -scripts: uptime.tsx +scripts: old/uptime.tsx updatedAt: 1742880646000 --- @@ -11,9 +11,9 @@ This page tracks the uptime of services I run in various places. -:::{.uptime} +
-::: +


diff --git a/packages/site/tsconfig.json b/packages/site/tsconfig.json index 50b9f0a..4082f16 100644 --- a/packages/site/tsconfig.json +++ b/packages/site/tsconfig.json @@ -1,6 +1,3 @@ { - "compilerOptions": { - "target": "ESNext" - }, "extends": "../../tsconfig.json" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22f93dd..537ea44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,9 @@ importers: marked-footnote: specifier: 1.4.0 version: 1.4.0(marked@16.2.1) + pfych-table: + specifier: 1.0.6 + version: 1.0.6 sass: specifier: ^1.92.0 version: 1.92.0 @@ -868,6 +871,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + pfych-table@1.0.6: + resolution: {integrity: sha512-ZkHN8q3L5CN/f88nkbIyeRTn7s62tXytVscb/wjRyv62gUriV80MQ5M9IFcxdrnwJ+XRjVnJ40BBzMqrRFPJLQ==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -1998,6 +2004,8 @@ snapshots: parseurl@1.3.3: {} + pfych-table@1.0.6: {} + picomatch@2.3.1: {} pino-abstract-transport@2.0.0: diff --git a/tsconfig.json b/tsconfig.json index 30d842a..b3705de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,8 @@ "esModuleInterop": true, "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, - "isolatedModules": true + "isolatedModules": true, + "jsx": "react", + "jsxFactory": "jsx" } } -- 2.51.2