diff --git a/+secret b/+secret
index abe7cce035ba0..c12c7e07a1795 160000
--- a/+secret
+++ b/+secret
@@ -1 +1 @@
-Subproject commit abe7cce035ba094c167fd35fbd3e18f1cef692d4
+Subproject commit c12c7e07a1795da6d45cf0c58e1122401b1fc93b
diff --git a/.github/CODE_GUIDELINES.md b/.github/CODE_GUIDELINES.md
index 32a5ec4f0387b..e93556f21b944 100644
--- a/.github/CODE_GUIDELINES.md
+++ b/.github/CODE_GUIDELINES.md
@@ -118,7 +118,7 @@ It's also faster (~6%), for internal bytecode reasons (which don't really matter
 
 ## Abstract types and typesof
 
-Some types exist just as a parent and should never be created in-game (e.g. `/obj/item`). Mark those using the `ABSTRACT_TYPE(type)` macro. You can check if a type is abstract using the `IS_ABSTRACT(type)` macro.
+Some types exist just as a parent and should never be created in-game (e.g. `/obj/item`). Mark those using the `ABSTRACT_TYPE(/type)` macro. You can check if a type is abstract using the `IS_ABSTRACT(/type)` macro.
 
 To get a list of all concrete (non-abstract) subtypes of a type you should use `concrete_typesof(type)`, the result is cached so no need to store it yourself. (As a consequence please `.Copy` the list if you want to make changes to it locally.) Proper usage of `ABSTRACT_TYPE` + `concrete_typesof` is preferred to using `typesof` and `childrentypesof` *usually* though exceptions apply.
 
diff --git a/.github/workflows/automaton.yml b/.github/workflows/automaton.yml
index 4e1ebc522a633..5b06e526b63c6 100644
--- a/.github/workflows/automaton.yml
+++ b/.github/workflows/automaton.yml
@@ -11,7 +11,6 @@ on:
       - "master"
 
 jobs:
-
   runtime:
     name: Runtime Checker
     runs-on: ubuntu-22.04
@@ -19,10 +18,25 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        map: ["COGMAP", "COGMAP2", "CLARION", "DONUT3", "DONUT2", "OSHAN", "KONDARU", "NADIR", "ATLAS", "SPACE_PREFAB", "UNDERWATER_PREFAB", "RANDOM_ROOMS", "FULL"]
+        map:
+          [
+            "COGMAP",
+            "COGMAP2",
+            "CLARION",
+            "DONUT3",
+            "DONUT2",
+            "OSHAN",
+            "KONDARU",
+            "NADIR",
+            "ATLAS",
+            "SPACE_PREFAB",
+            "UNDERWATER_PREFAB",
+            "RANDOM_ROOMS",
+            "FULL",
+          ]
         compiletype: ["default"]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - name: Install Dependencies
         run: |
@@ -32,7 +46,7 @@ jobs:
           sudo apt install -o APT::Immediate-Configure=false libssl-dev:i386 libgcc-s1:i386
 
       - name: Cache BYOND
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: ~/BYOND
           key: ${{ runner.os }}-byond-${{ hashFiles('buildByond.conf')}}
@@ -95,14 +109,28 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        map: ["COGMAP", "COGMAP2", "CLARION", "DONUT3", "DONUT2", "OSHAN", "KONDARU", "NADIR", "ATLAS", "SPACE_PREFAB", "UNDERWATER_PREFAB", "FULL"]
+        map:
+          [
+            "COGMAP",
+            "COGMAP2",
+            "CLARION",
+            "DONUT3",
+            "DONUT2",
+            "OSHAN",
+            "KONDARU",
+            "NADIR",
+            "ATLAS",
+            "SPACE_PREFAB",
+            "UNDERWATER_PREFAB",
+            "FULL",
+          ]
         compiletype: ["default"]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           submodules: true
-          token: '${{ secrets.ROBUDDYBOT_PAT }}'
+          token: "${{ secrets.ROBUDDYBOT_PAT }}"
 
       - name: Install Dependencies
         run: |
@@ -112,7 +140,7 @@ jobs:
           sudo apt install -o APT::Immediate-Configure=false libssl-dev:i386 libgcc-s1:i386
 
       - name: Cache BYOND
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: ~/BYOND
           key: ${{ runner.os }}-byond-${{ hashFiles('buildByond.conf')}}
@@ -167,7 +195,7 @@ jobs:
     runs-on: ubuntu-22.04
     if: "!contains(github.event.head_commit.message, 'skip ci')"
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - name: Install Dependencies
         run: |
@@ -177,7 +205,7 @@ jobs:
           sudo apt install -o APT::Immediate-Configure=false libssl-dev:i386 libgcc-s1:i386
 
       - name: Cache BYOND
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: ~/BYOND
           key: ${{ runner.os }}-byond-${{ hashFiles('buildByond.conf')}}
diff --git a/.github/workflows/beepsky.yml b/.github/workflows/beepsky.yml
index 50c16f7cedebf..fc97895265aac 100644
--- a/.github/workflows/beepsky.yml
+++ b/.github/workflows/beepsky.yml
@@ -17,13 +17,13 @@ jobs:
       - uses: actions/checkout@v4
 
       - name: Cache SpacemanDMM
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: $HOME/SpacemanDMM
           key: ${{ runner.os }}-spacemandmm
 
       - name: Setup Rust
-        uses: hecrj/setup-rust-action@v1.4.1
+        uses: hecrj/setup-rust-action@v2.0.0
 
       - name: Install Dependencies
         run: |
@@ -33,15 +33,26 @@ jobs:
           tools/bootstrap/python -c ''
           touch +secret/__secret.dme
 
+      - name: Check TGUI
+        run: |
+          tools/ci/build_tgui.sh
+
       - name: Misc Checks
         run: |
           tools/ci/check_filedirs.sh goonstation.dme
-          tools/ci/build_tgui.sh
           tools/ci/check_grep.sh
           tools/bootstrap/python tools/ci/validate_dme.py <goonstation.dme
+
+      - name: Check Maps
+        run: |
           tools/bootstrap/python -m dmi.test
           tools/bootstrap/python -m mapmerge2.dmm_test
 
+      - name: Check Duplicate DMI Icon States
+        uses: spacestation13/dmi-duplicate-state-checker@v1
+        with:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
       - name: Run Linter
         id: linter
         run: |
@@ -62,7 +73,7 @@ jobs:
         uses: actions/setup-dotnet@v3
         with:
           dotnet-version: "7.0"
-      - uses: actions/cache@v3
+      - uses: actions/cache@v4
         with:
           path: ~/.nuget/packages
           key: ${{ runner.os }}-nuget-od-${{ hashFiles('OpenDream/**/*.csproj') }}
@@ -82,7 +93,7 @@ jobs:
       - uses: actions/checkout@v4
 
       - name: Cache BYOND
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: $HOME/BYOND
           key: ${{ runner.os }}-byond
@@ -109,7 +120,7 @@ jobs:
       #     cp goonstation.rsc artifacts
 
       # - name: Upload Artifacts
-      #   uses: actions/upload-artifact@v1
+      #   uses: actions/upload-artifact@v4
       #   with:
       #     name: DMB + RSC
       #     path: ${{github.workspace}}/artifacts
@@ -126,7 +137,7 @@ jobs:
           token: "${{ secrets.ROBUDDYBOT_PAT }}"
 
       - name: Cache BYOND
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: $HOME/BYOND
           key: ${{ runner.os }}-byond
@@ -142,7 +153,7 @@ jobs:
           echo "MANPATH=/home/runner/BYOND/byond/man:$MANPATH" >> $GITHUB_ENV
 
       - name: Cache SpacemanDMM
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: $HOME/SpacemanDMM
           key: ${{ runner.os }}-spacemandmm
diff --git a/.github/workflows/final_review_labeler.yml b/.github/workflows/final_review_labeler.yml
index 0bf13c5bee6a1..89da3a0245da9 100644
--- a/.github/workflows/final_review_labeler.yml
+++ b/.github/workflows/final_review_labeler.yml
@@ -16,7 +16,7 @@ jobs:
     if: ${{ github.event.workflow_run.conclusion == 'success' }}
     steps:
       - name: "Download artifact"
-        uses: actions/github-script@v6
+        uses: actions/github-script@v7
         with:
           script: |
             let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
@@ -39,7 +39,7 @@ jobs:
       - name: "Unzip artifact"
         run: unzip pr_number.zip
 
-      - uses: actions/github-script@v6
+      - uses: actions/github-script@v7
         id: set-pr-number
         with:
           script: |
@@ -67,7 +67,7 @@ jobs:
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 
-      - uses: actions/github-script@v6
+      - uses: actions/github-script@v7
         with:
           # Only on totalCount == 2 or 3 so maintainers can remove the label and it won't get re-applied (3 for fast approvals due to script delay)
           script: |
diff --git a/.github/workflows/final_review_labeler_dummy.yml b/.github/workflows/final_review_labeler_dummy.yml
index c79ecc987a89b..66e3b594f71a9 100644
--- a/.github/workflows/final_review_labeler_dummy.yml
+++ b/.github/workflows/final_review_labeler_dummy.yml
@@ -18,7 +18,7 @@ jobs:
         run: |
           mkdir -p ./pr
           echo $PR_NUMBER > ./pr/pr_number
-      - uses: actions/upload-artifact@v3
+      - uses: actions/upload-artifact@v4
         with:
           name: pr_number
           path: pr/
diff --git a/.github/workflows/forum_pr_poster.yml b/.github/workflows/forum_pr_poster.yml
index 8eed5546661bf..3708daa74c743 100644
--- a/.github/workflows/forum_pr_poster.yml
+++ b/.github/workflows/forum_pr_poster.yml
@@ -8,40 +8,39 @@ jobs:
     runs-on: ubuntu-latest
     if: ${{ github.repository == 'goonstation/goonstation' && (github.event.action == 'labeled' && github.event.label.name == 'E-Input-Wanted' || github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'E-Input-Wanted')) }}
     steps:
+      - name: Get The Script
+        run: |
+          wget "https://raw.githubusercontent.com/${{ github.repository }}/master/.github/post_to_forums.py"
 
-    - name: Get The Script
-      run: |
-        wget "https://raw.githubusercontent.com/${{ github.repository }}/master/.github/post_to_forums.py"
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: 3.8
 
-    - name: Set up Python
-      uses: actions/setup-python@v4
-      with:
-        python-version: 3.8
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install pygithub requests
 
-    - name: Install dependencies
-      run: |
-        python -m pip install --upgrade pip
-        pip install pygithub requests
-
-    - name: Post the thread
-      run: |
-        python post_to_forums.py
-      env:
-        TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        REPO: ${{ github.repository }}
-        FORUM_URL: "https://forum.ss13.co"
-        FORUM_PASSWORD: ${{ secrets.FORUM_PASSWORD }}
-        FORUM_USERNAME: "github_bot"
-        SUBFORUM_ID: 8 # Ideas & Suggestions
-        POST_ICON: 11 # ℹ
-        POST_ICON_CLOSED: 18 # 👎
-        POST_ICON_MERGED: 19 # 👍
-        SUBJECT_PREFIX: "[PR] "
-        SUBJECT_PREFIX_CLOSED: "[CLOSED PR] "
-        SUBJECT_PREFIX_MERGED: "[MERGED PR] "
-        PR_TITLE: ${{ github.event.pull_request.title }}
-        PR_BODY: ${{ github.event.pull_request.body }}
-        PR_URL: ${{ github.event.pull_request.html_url }}
-        PR_NUM: ${{ github.event.pull_request.number }}
-        PR_STATE: ${{ github.event.pull_request.state }}
-        PR_MERGED: ${{ github.event.pull_request.merged }}
+      - name: Post the thread
+        run: |
+          python post_to_forums.py
+        env:
+          TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          REPO: ${{ github.repository }}
+          FORUM_URL: "https://forum.ss13.co"
+          FORUM_PASSWORD: ${{ secrets.FORUM_PASSWORD }}
+          FORUM_USERNAME: "github_bot"
+          SUBFORUM_ID: 8 # Ideas & Suggestions
+          POST_ICON: 11 # ℹ
+          POST_ICON_CLOSED: 18 # 👎
+          POST_ICON_MERGED: 19 # 👍
+          SUBJECT_PREFIX: "[PR] "
+          SUBJECT_PREFIX_CLOSED: "[CLOSED PR] "
+          SUBJECT_PREFIX_MERGED: "[MERGED PR] "
+          PR_TITLE: ${{ github.event.pull_request.title }}
+          PR_BODY: ${{ github.event.pull_request.body }}
+          PR_URL: ${{ github.event.pull_request.html_url }}
+          PR_NUM: ${{ github.event.pull_request.number }}
+          PR_STATE: ${{ github.event.pull_request.state }}
+          PR_MERGED: ${{ github.event.pull_request.merged }}
diff --git a/.github/workflows/merge_upstream.yml b/.github/workflows/merge_upstream.yml
index 66bc142ad0134..c6937e64f197c 100644
--- a/.github/workflows/merge_upstream.yml
+++ b/.github/workflows/merge_upstream.yml
@@ -1,41 +1,40 @@
 name: merge_upstream
 on:
   issue_comment:
-    types: [ created ]
+    types: [created]
 
 jobs:
   merge-upstream:
     if: ${{ github.event.issue.pull_request && github.event.comment.body == '!merge_upstream' }}
     runs-on: ubuntu-22.04
     steps:
+      - name: PR Data
+        run: |
+          curl -H "Authorization: token ${{ github.token }}" ${{ github.event.issue.pull_request.url }} > pr.json
+          echo "PR_REPO=`jq -r '.head.repo.full_name' < pr.json`" >> $GITHUB_ENV
+          echo "PR_BRANCH=`jq -r '.head.ref' < pr.json`" >> $GITHUB_ENV
 
-    - name: PR Data
-      run: |
-        curl -H "Authorization: token ${{ github.token }}" ${{ github.event.issue.pull_request.url }} > pr.json
-        echo "PR_REPO=`jq -r '.head.repo.full_name' < pr.json`" >> $GITHUB_ENV
-        echo "PR_BRANCH=`jq -r '.head.ref' < pr.json`" >> $GITHUB_ENV
+      - uses: actions/checkout@v4
+        with:
+          repository: ${{ env.PR_REPO }}
+          ref: ${{ env.PR_BRANCH }}
+          fetch-depth: 0
 
-    - uses: actions/checkout@v3
-      with:
-        repository: ${{ env.PR_REPO }}
-        ref: ${{ env.PR_BRANCH }}
-        fetch-depth: 0
+      - name: Perform Merge
+        run: |
+          bash tools/hooks/install.sh
+          bash tools/ci/install_build_tools.sh
+          bash tgui/bin/tgui --install-git-hooks
+          chmod +x tools/hooks/*.merge tgui/bin/tgui
+          git config user.name github-actions
+          git config user.email github-actions@github.com
+          git remote add upstream "https://github.com/${{ github.repository }}.git"
+          git fetch upstream master
+          git merge upstream/master && git push origin
 
-    - name: Perform Merge
-      run: |
-        bash tools/hooks/install.sh
-        bash tools/ci/install_build_tools.sh
-        bash tgui/bin/tgui --install-git-hooks
-        chmod +x tools/hooks/*.merge tgui/bin/tgui
-        git config user.name github-actions
-        git config user.email github-actions@github.com
-        git remote add upstream "https://github.com/${{ github.repository }}.git"
-        git fetch upstream master
-        git merge upstream/master && git push origin
-
-    - name: Notify Failure
-      if: failure()
-      run: |
-        curl -s -H "Authorization: token ${{ github.token }}" \
-          -X POST -d '{"body": "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"}' \
-          "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments"
+      - name: Notify Failure
+        if: failure()
+        run: |
+          curl -s -H "Authorization: token ${{ github.token }}" \
+            -X POST -d '{"body": "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"}' \
+            "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments"
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index e63dd0391e006..f50961f904314 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -1,26 +1,26 @@
 name: "Close stale PRs"
 on:
   schedule:
-  - cron: "0 0 * * *"
+    - cron: "0 0 * * *"
 
 jobs:
   stale:
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/stale@v6
-      with:
-        repo-token: ${{ secrets.GITHUB_TOKEN }}
+      - uses: actions/stale@v9
+        with:
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
 
-        stale-pr-message: "This PR has been inactive for two weeks, and has been automatically marked as stale. This means it is at risk of being auto closed in another week. Please address any outstanding review items and ensure your PR is finished. If you are auto-staled anyway, ask developers if your PR will be merged. Once you have done any of the previous actions then you should request a developer remove the stale label on your PR, to reset the stale timer. If you feel no developer will respond in that time, you may wish to close this PR youself, while you seek developer comment, as you will then be able to reopen the PR yourself."
-        days-before-pr-stale: 14
-        days-before-pr-close: 7
-        stale-pr-label: 'S-Stale'
-        exempt-pr-labels: 'E-Certified-Organic,E-Contest,S-Testmerged'
+          stale-pr-message: "This PR has been inactive for two weeks, and has been automatically marked as stale. This means it is at risk of being auto closed in another week. Please address any outstanding review items and ensure your PR is finished. If you are auto-staled anyway, ask developers if your PR will be merged. Once you have done any of the previous actions then you should request a developer remove the stale label on your PR, to reset the stale timer. If you feel no developer will respond in that time, you may wish to close this PR youself, while you seek developer comment, as you will then be able to reopen the PR yourself."
+          days-before-pr-stale: 14
+          days-before-pr-close: 7
+          stale-pr-label: "S-Stale"
+          exempt-pr-labels: "E-Certified-Organic,E-Contest,S-Testmerged"
 
-        close-issue-message: "This issue has been marked as 'Needs Reproducing' for a month, and is being closed automatically. If you find a way to reproduce this bug, make another issue with more detailed reproduction steps."
-        days-before-issue-stale: -1
-        days-before-issue-close: 30
-        only-issue-labels: 'S-Needs-Reproducing'
-        exempt-issue-labels: 'E-Verified'
-        ignore-issue-updates: true
-        close-issue-reason: 'not_planned'
+          close-issue-message: "This issue has been marked as 'Needs Reproducing' for a month, and is being closed automatically. If you find a way to reproduce this bug, make another issue with more detailed reproduction steps."
+          days-before-issue-stale: -1
+          days-before-issue-close: 30
+          only-issue-labels: "S-Needs-Reproducing"
+          exempt-issue-labels: "E-Verified"
+          ignore-issue-updates: true
+          close-issue-reason: "not_planned"
diff --git a/.github/workflows/update_changelog.yml b/.github/workflows/update_changelog.yml
index 4514f832d0c4a..687b09a6f9476 100644
--- a/.github/workflows/update_changelog.yml
+++ b/.github/workflows/update_changelog.yml
@@ -9,24 +9,24 @@ jobs:
     runs-on: ubuntu-latest
     if: github.repository == 'goonstation/goonstation'
     steps:
-    - name: Get The Script
-      run: |
-        wget "https://raw.githubusercontent.com/${{ github.repository }}/master/.github/update_changelog.py"
-    - name: Set up Python
-      uses: actions/setup-python@v4
-      with:
-        python-version: 3.8
-    - name: Install dependencies
-      run: |
-        python -m pip install --upgrade pip
-        pip install pygithub pytz
-    - name: Update Changelog
-      run: |
-        python update_changelog.py
-      env:
-        REPO: ${{ github.repository }}
-        TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        CHANGELOG_PATH: strings/changelog.txt
-        ASS_CHANGELOG_PATH: strings/ass_changelog.txt
-        GIT_EMAIL: "65057909+robuddybot@users.noreply.github.com"
-        GIT_NAME: "robuddybot"
+      - name: Get The Script
+        run: |
+          wget "https://raw.githubusercontent.com/${{ github.repository }}/master/.github/update_changelog.py"
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: 3.8
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install pygithub pytz
+      - name: Update Changelog
+        run: |
+          python update_changelog.py
+        env:
+          REPO: ${{ github.repository }}
+          TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          CHANGELOG_PATH: strings/changelog.txt
+          ASS_CHANGELOG_PATH: strings/ass_changelog.txt
+          GIT_EMAIL: "65057909+robuddybot@users.noreply.github.com"
+          GIT_NAME: "robuddybot"
diff --git a/_std/__odlint.dm b/_std/__odlint.dme
similarity index 100%
rename from _std/__odlint.dm
rename to _std/__odlint.dme
diff --git a/_std/__std.dme b/_std/__std.dme
index fcd0b319c9dea..37fde8b7ccca2 100644
--- a/_std/__std.dme
+++ b/_std/__std.dme
@@ -55,6 +55,7 @@
 #include "defines\economy.dm"
 #include "defines\ephemeral.dm"
 #include "defines\events.dm"
+#include "defines\faith.dm"
 #include "defines\floors.dm"
 #include "defines\fluid.dm"
 #include "defines\food.dm"
@@ -70,6 +71,7 @@
 #include "defines\lighting.dm"
 #include "defines\living.dm"
 #include "defines\logging.dm"
+#include "defines\manufacturing.dm"
 #include "defines\materials.dm"
 #include "defines\mechanics.dm"
 #include "defines\medals.dm"
diff --git a/_std/color.dm b/_std/color.dm
index 1c6325b64a4e5..d1cda3dacd23d 100644
--- a/_std/color.dm
+++ b/_std/color.dm
@@ -295,6 +295,19 @@ proc/hsv_transform_color_matrix(h=0.0, s=1.0, v=1.0)
 		0, 0, 0, 0
 	)
 
+
+var/global/list/list/icon_state_average_color_cache = list(list())
+
+/atom/proc/get_average_color()
+	if(!icon_state_average_color_cache[src.icon] || !icon_state_average_color_cache[src.icon][src.icon_state])
+		if(!icon_state_average_color_cache[src.icon])
+			icon_state_average_color_cache[src.icon] = list()
+		var/icon/I = icon(src.icon, src.icon_state)
+		icon_state_average_color_cache[src.icon][src.icon_state] = global.get_average_color(I)
+
+	return icon_state_average_color_cache[src.icon][src.icon_state]
+
+
 /**
  * Takes an icon and optionally two non-zero Pixel Intervals and returns the average color of the icon.
  *
diff --git a/_std/defines/chemistry.dm b/_std/defines/chemistry.dm
index 6cc8a4f014f75..4d9d5ad2d6a3c 100644
--- a/_std/defines/chemistry.dm
+++ b/_std/defines/chemistry.dm
@@ -25,6 +25,12 @@
 #define RC_FULLNESS 4		// can estimate fullness of container
 #define RC_SPECTRO	8		// spectroscopic glasses can analyse contents
 
+/// The minimum alpha value that a reagent's fluid overlay can display.
+#define RC_MINIMUM_REAGENT_ALPHA 100
+
+#define RC_FLUID_OVERLAY_SCALING_LINEAR "linear"
+#define RC_FLUID_OVERLAY_SCALING_SPHERICAL "spherical"
+
 // Meal Times used to identify when a food product might TYPICALLY be consumed
 #define MEAL_TIME_BREAKFAST (1<<0)
 #define MEAL_TIME_LUNCH	(1<<1)
diff --git a/_std/defines/component_defines/component_defines_atom.dm b/_std/defines/component_defines/component_defines_atom.dm
index 2acd1a7620109..82a9cdc8dad73 100644
--- a/_std/defines/component_defines/component_defines_atom.dm
+++ b/_std/defines/component_defines/component_defines_atom.dm
@@ -82,6 +82,8 @@
 	#define COMSIG_MOVABLE_CONTRABAND_CHANGED "mov_contraband_changed"
 	/// get contraband level of movable (check_nonfirearms, check_firearms)
 	#define COMSIG_MOVABLE_GET_CONTRABAND "mov_get_contraband"
+	/// when an AM is revealed from under a floor tile (turf revealed from)
+	#define COMSIG_MOVABLE_FLOOR_REVEALED "mov_floor_revealed"
 
 	// ---- complex ----
 
diff --git a/_std/defines/faith.dm b/_std/defines/faith.dm
new file mode 100644
index 0000000000000..063b9c388ee30
--- /dev/null
+++ b/_std/defines/faith.dm
@@ -0,0 +1,11 @@
+#define FAITH_STARTING 1000
+
+//lifeprocess faith generation
+#define FAITH_GEN_BASE 5
+
+// bible healing
+#define FAITH_HEAL_CHANCE 40
+#define FAITH_HEAL_CHANCE_MOD 0.02 // multiplied by faith, then added to the base
+#define FAITH_HEAL_USE_FRACTION 0.025
+#define FAITH_HEAL_CAP 125 // in used faith
+#define FAITH_HEAL_BONUS 0.2 // multiplied by used faith
diff --git a/_std/defines/item.dm b/_std/defines/item.dm
index 475e71f07411d..e610deab2deb3 100644
--- a/_std/defines/item.dm
+++ b/_std/defines/item.dm
@@ -3,66 +3,66 @@
 /// unused
 //#define							 (1<<0)
 /// can pass by a table or rack
-#define TABLEPASS						 (1<<1)
+#define TABLEPASS					(1<<1)
 /// thing doesn't drift in space
-#define NODRIFT							 (1<<2)
+#define NODRIFT						(1<<2)
 /// put this on either a thing you don't want to be hit rapidly, or a thing you don't want people to hit other stuff rapidly with
-#define USEDELAY						 (1<<3)
+#define USEDELAY					(1<<3)
 /// 1 second extra delay on use
-#define EXTRADELAY					 (1<<4)
+#define EXTRADELAY					(1<<4)
 /// weapon not affected by shield. MBC also put this flag on cloak/shield device to minimize istype checking, so consider this more SHIELD_ACT (rename? idk)
-#define NOSHIELD						 (1<<5)
+#define NOSHIELD					(1<<5)
 /// conducts electricity (metal etc.)
-#define CONDUCT							 (1<<6)
+#define CONDUCT						(1<<6)
 /// can mousedrop reagents into from a reagent_container
-#define ACCEPTS_MOUSEDROP_REAGENTS		 (1<<7)
+#define ACCEPTS_MOUSEDROP_REAGENTS	(1<<7)
 /// takes a fingerprint
-#define FPRINT							 (1<<8)
+#define FPRINT						(1<<8)
 /// item has priority to check when entering or leaving
-#define ON_BORDER						 (1<<9)
+#define ON_BORDER					(1<<9)
 /// can pass through a closed door
-#define DOORPASS						 (1<<10)
+#define DOORPASS					(1<<10)
 /// automagically talk into this object when a human is holding it (Phone handset!)
-#define TALK_INTO_HAND 			 (1<<11)
+#define TALK_INTO_HAND				(1<<11)
 /// is an open container for chemistry purposes. don't check this flag directly, use obj.is_open_container()
-#define OPENCONTAINER				 (1<<12)
+#define OPENCONTAINER				(1<<12)
 /// No beaker etc. splashing. For Chem machines etc.
-#define NOSPLASH 						 (1<<13)
+#define NOSPLASH					(1<<13)
 /// No attack when hitting stuff with this item.
-#define SUPPRESSATTACK 			 (1<<14)
+#define SUPPRESSATTACK				(1<<14)
 /// gets an overlay when submerged in fluid
-#define FLUID_SUBMERGE 			 (1<<15)
+#define FLUID_SUBMERGE				(1<<15)
 /// gets a perspective overlay from adjacent fluids
-#define IS_PERSPECTIVE_FLUID (1<<16)
+#define IS_PERSPECTIVE_FLUID		(1<<16)
 /// specifically note this object as solid
-#define ALWAYS_SOLID_FLUID	 (1<<17)
+#define ALWAYS_SOLID_FLUID			(1<<17)
 /// Calls equipment_click from hand_range_attack on items worn with this flag set.
-#define HAS_EQUIP_CLICK			 (1<<18)
+#define HAS_EQUIP_CLICK				(1<<18)
 /// Has the possibility for a TGUI interface
-#define TGUI_INTERACTIVE		 (1<<19)
+#define TGUI_INTERACTIVE			(1<<19)
 /// Has a click delay for attack_self()
-#define ATTACK_SELF_DELAY		 (1<<20)
+#define ATTACK_SELF_DELAY			(1<<20)
 /// Counts as dense for purposes of fluids. *scream.
-#define FLUID_DENSE		 (1<<21)
+#define FLUID_DENSE					(1<<21)
 /// If click delay should be applied even if atom is in user's contents (e.g.: postit notes)
-#define CLICK_DELAY_IN_CONTENTS  (1<<22)
+#define CLICK_DELAY_IN_CONTENTS		(1<<22)
 /// If an item cannot be crushed by the crusher
-#define UNCRUSHABLE              (1<<23)
+#define UNCRUSHABLE					(1<<23)
 
 //Item function flags
 
 /// apply to an item's flags to use the item's intent_switch_trigger() proc. This will be called when intent is switched while this item is in hand.
-#define USE_INTENT_SWITCH_TRIGGER (1<<0)
+#define USE_INTENT_SWITCH_TRIGGER	(1<<0)
 /// allows special attacks to be performed on help and grab intent with this item
-#define USE_SPECIALS_ON_ALL_INTENTS (1<<1)
+#define USE_SPECIALS_ON_ALL_INTENTS	(1<<1)
 /// prevents items from creating smoke while burning
-#define SMOKELESS (1<<2)
+#define SMOKELESS					(1<<2)
 /// makes items immune to acid
-#define IMMUNE_TO_ACID (1<<3)
+#define IMMUNE_TO_ACID				(1<<3)
 /// prevents items from heating anything up while burning
-#define COLD_BURN (1<<4)
+#define COLD_BURN					(1<<4)
 /// Prevents an item from being placed inside of a storage container, regardless of the item's `w_class` or the storage's `can_hold` list.
-#define UNSTORABLE (1<<5)
+#define UNSTORABLE					(1<<5)
 
 //tool flags
 #define TOOL_CLAMPING 1
diff --git a/_std/defines/landmarks.dm b/_std/defines/landmarks.dm
index babcdf73e122b..f6f0465cde1b2 100644
--- a/_std/defines/landmarks.dm
+++ b/_std/defines/landmarks.dm
@@ -37,6 +37,7 @@
 #define LANDMARK_PIRATE "Pirate-Spawn"
 #define LANDMARK_PIRATE_FIRST_MATE "Pirate-First-Mate-Spawn"
 #define LANDMARK_PIRATE_CAPTAIN "Pirate-Captain-Spawn"
+#define LANDMARK_PIRATES_TELE "Priate-Tele"
 
 // Salvagers
 #define LANDMARK_SALVAGER "Salvager-Spawn"
diff --git a/_std/defines/manufacturing.dm b/_std/defines/manufacturing.dm
new file mode 100644
index 0000000000000..3b2ff4f44cd69
--- /dev/null
+++ b/_std/defines/manufacturing.dm
@@ -0,0 +1,15 @@
+// Material costs for robot parts
+
+#define ROBOT_FRAME_COST 1.8
+#define ROBOT_HEAD_COST 1.2
+#define ROBOT_CHEST_COST 1.2
+#define ROBOT_LIMB_COST 0.6
+
+#define ROBOT_LIGHT_COST_MOD 0.5 // multiplier
+
+#define ROBOT_STURDY_COST 0.2 // 2 pieces of plate
+#define ROBOT_HEAVY_COST ROBOT_STURDY_COST + 0.3 // extra 2 pieces of plate and 2 rods
+
+#define ROBOT_TREAD_METAL_COST 0.6
+#define ROBOT_SCREEN_METAL_COST 0.6
+#define ROBOT_THRUSTER_COST 2.5
diff --git a/_std/defines/minimap.dm b/_std/defines/minimap.dm
index b2699208214b5..defe89f4e37cb 100644
--- a/_std/defines/minimap.dm
+++ b/_std/defines/minimap.dm
@@ -31,6 +31,7 @@
 #define MAPC_MEDICAL "#1ba7e9"
 #define MAPC_MEDLOBBY "#78c5e9"
 #define MAPC_ROBOTICS "#5b6eb1"
+#define MAPC_MORGUE "#2b6a92"
 #define MAPC_MEDRESEARCH "#3fb583"
 #define MAPC_PATHOLOGY "#167970"
 
diff --git a/_std/defines/pod_door_access_levels.dm b/_std/defines/pod_door_access_levels.dm
index b72aab1f10793..cf6cdbef1705a 100644
--- a/_std/defines/pod_door_access_levels.dm
+++ b/_std/defines/pod_door_access_levels.dm
@@ -3,3 +3,4 @@
 #define POD_ACCESS_SYNDICATE (-1)
 #define POD_ACCESS_WIZARDS (-2)
 #define POD_ACCESS_SALVAGER (-3)
+#define POD_ACCESS_PIRATE (-4)
diff --git a/_std/defines/robot.dm b/_std/defines/robot.dm
index 70904c71ac011..3dc3396c19d2a 100644
--- a/_std/defines/robot.dm
+++ b/_std/defines/robot.dm
@@ -12,4 +12,4 @@
 /// Amount an arm on the same side as a missing leg will offset the missing leg penalty
 #define ROBOT_MISSING_LEG_ARM_OFFSET -1
 /// Amount a missing arm will speed you up (as long as you have legs)
-#define ROBOT_MISSING_ARM_MOVEMENT_ADJUST -0.4
+#define ROBOT_MISSING_ARM_MOVEMENT_ADJUST -0.1
diff --git a/_std/macros/atom_properties.dm b/_std/macros/atom_properties.dm
index 3bc52ecd78151..422fcc08e2136 100644
--- a/_std/macros/atom_properties.dm
+++ b/_std/macros/atom_properties.dm
@@ -285,6 +285,7 @@ To remove:
 #define PROP_MOB_NO_MIASMA(x) x("no_miasma", APPLY_ATOM_PROPERTY_SIMPLE, REMOVE_ATOM_PROPERTY_SIMPLE)
 #define PROP_MOB_NO_DECOMPOSITION(x) x("no_decomposition", APPLY_ATOM_PROPERTY_SIMPLE, REMOVE_ATOM_PROPERTY_SIMPLE)
 #define PROP_MOB_HEARD_PITCH(x) x("heard_pitch", APPLY_ATOM_PROPERTY_PRODUCT, REMOVE_ATOM_PROPERTY_PRODUCT)
+#define PROP_MOB_BLOOD_ABSORPTION_RATE(x) x("blood_absorption_rate", APPLY_ATOM_PROPERTY_SUM, REMOVE_ATOM_PROPERTY_SUM)
 
 /// Hides med/sec HUDs and name tags from the mob
 #define PROP_MOB_HIDE_ICONS(x) x("hide_icons", APPLY_ATOM_PROPERTY_SIMPLE, REMOVE_ATOM_PROPERTY_SIMPLE, PROP_UPDATE_HIDE_ICONS)
diff --git a/_std/packets.dm b/_std/packets.dm
index 4cd1343bf3eb2..d37a5b60c53c0 100644
--- a/_std/packets.dm
+++ b/_std/packets.dm
@@ -51,6 +51,7 @@ proc/get_radio_connection_by_id(atom/movable/AM, id)
 //Signal frequencies
 
 #define FREQ_PDA 1149
+#define FREQ_PUMP_CONTROL 1225 //frequency for the control of pumps
 #define FREQ_AIRLOCK 1411
 #define FREQ_FREE 1419 /// frequency for "free packet communication", default for nerd stuff
 #define FREQ_NAVBEACON 1445
diff --git a/_std/rust_g.dm b/_std/rust_g.dm
index 677784e693175..bfaad1035450e 100644
--- a/_std/rust_g.dm
+++ b/_std/rust_g.dm
@@ -135,7 +135,7 @@
 #define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname)
 
 #define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname)
-#define rustg_file_exists(fname) RUSTG_CALL(RUST_G, "file_exists")(fname)
+#define rustg_file_exists(fname) (RUSTG_CALL(RUST_G, "file_exists")(fname) == "true")
 #define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname)
 #define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname)
 #define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname))
@@ -146,7 +146,13 @@
 	#define text2file(text, fname) rustg_file_append(text, "[fname]")
 #endif
 
+/// Returns the git hash of the given revision, ex. "HEAD".
 #define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev)
+
+/**
+ * Returns the date of the given revision in the format YYYY-MM-DD.
+ * Returns null if the revision is invalid.
+ */
 #define rustg_git_commit_date(rev) RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev)
 
 #define rustg_hash_string(algorithm, text) RUSTG_CALL(RUST_G, "hash_string")(algorithm, text)
@@ -161,6 +167,11 @@
 #define RUSTG_HASH_XXH64 "xxh64"
 #define RUSTG_HASH_BASE64 "base64"
 
+/// Encode a given string into base64
+#define rustg_encode_base64(str) rustg_hash_string(RUSTG_HASH_BASE64, str)
+/// Decode a given base64 string
+#define rustg_decode_base64(str) RUSTG_CALL(RUST_G, "decode_base64")(str)
+
 #ifdef RUSTG_OVERRIDE_BUILTINS
 	#define md5(thing) (isfile(thing) ? rustg_hash_file(RUSTG_HASH_MD5, "[thing]") : rustg_hash_string(RUSTG_HASH_MD5, thing))
 #endif
@@ -233,24 +244,6 @@
 /proc/rustg_unix_timestamp()
 	return RUSTG_CALL(RUST_G, "unix_timestamp")()
 
-#define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null")
-
-/proc/rustg_read_toml_file(path)
-	var/list/output = rustg_raw_read_toml_file(path)
-	if (output["success"])
-		return json_decode(output["content"])
-	else
-		CRASH(output["content"])
-
-#define rustg_raw_toml_encode(value) json_decode(RUSTG_CALL(RUST_G, "toml_encode")(json_encode(value)))
-
-/proc/rustg_toml_encode(value)
-	var/list/output = rustg_raw_toml_encode(value)
-	if (output["success"])
-		return output["content"]
-	else
-		CRASH(output["content"])
-
 #define rustg_url_encode(text) RUSTG_CALL(RUST_G, "url_encode")("[text]")
 #define rustg_url_decode(text) RUSTG_CALL(RUST_G, "url_decode")(text)
 
diff --git a/_std/spatial_hashing.dm b/_std/spatial_hashing.dm
index c6768a443ad3f..e6a9d8c1b743c 100644
--- a/_std/spatial_hashing.dm
+++ b/_std/spatial_hashing.dm
@@ -215,6 +215,8 @@ ABSTRACT_TYPE(/datum/spatial_hashmap/by_type/alive_mob)
 	update_cooldown = 5
 	type_to_track = /obj/shrub
 
+/datum/spatial_hashmap/manual/near_station
+
 /datum/spatial_hashmap/manual/proc/add_target(atom/A)
 	var/turf/T = get_turf(A)
 	if (world.maxz > src.zlevels)
diff --git a/assets/maps/allocated/pirate_ship.dmm b/assets/maps/allocated/pirate_ship.dmm
index 65bc237b34c9b..4204ba300bdb6 100644
--- a/assets/maps/allocated/pirate_ship.dmm
+++ b/assets/maps/allocated/pirate_ship.dmm
@@ -1,10 +1,10 @@
 //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
 "ai" = (
 /obj/lattice{
-	icon_state = "lattice-dir"
+	icon_state = "lattice-dir-b"
 	},
 /turf/space,
-/area/pirate_ship)
+/area/pirate_ship_space)
 "ak" = (
 /obj/item/storage/wall/office,
 /turf/simulated/floor/orange/side,
@@ -38,7 +38,7 @@
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/miniputt/indyputt{
 	dir = 1;
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Dreadful"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -53,7 +53,7 @@
 	dir = 1
 	},
 /obj/machinery/vehicle/miniputt/indyputt{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Deathly"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -66,6 +66,7 @@
 /obj/decal/stage_edge/alt{
 	color = "#555555"
 	},
+/obj/storage/crate/chest,
 /turf/simulated/floor,
 /area/pirate_ship)
 "bu" = (
@@ -102,16 +103,33 @@
 	dir = 6
 	},
 /area/pirate_ship)
+"bJ" = (
+/turf/unsimulated/wall/generic{
+	icon = 'icons/obj/singularity.dmi';
+	icon_state = "TheSingMain";
+	name = "cloaking field"
+	},
+/area/space)
+"bV" = (
+/obj/machinery/light/incandescent/warm{
+	dir = 8
+	},
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "cx" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/pod_smooth/black{
 	dir = 1;
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Waking Nightmare"
 	},
 /turf/simulated/floor/shuttlebay,
 /area/pirate_ship)
+"cI" = (
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/orange,
+/area/pirate_ship)
 "cK" = (
 /obj/indestructible/shuttle_corner{
 	dir = 8;
@@ -150,10 +168,7 @@
 /turf/simulated/floor/orange,
 /area/pirate_ship)
 "dk" = (
-/obj/machinery/r_door_control/podbay{
-	access_type = -1;
-	id = "peregrine_podbay"
-	},
+/obj/machinery/r_door_control/podbay/pirate,
 /turf/unsimulated/wall/auto/adventure/shuttle/dark,
 /area/pirate_ship)
 "dt" = (
@@ -193,7 +208,7 @@
 	},
 /obj/machinery/vehicle/pod_smooth/industrial{
 	dir = 1;
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Vehement"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -279,11 +294,15 @@
 	},
 /turf/simulated/floor/black,
 /area/pirate_ship)
-"gH" = (
-/obj/machinery/light/incandescent/warm,
-/turf/simulated/floor/grey/side{
-	dir = 4
+"gc" = (
+/obj/submachine/chef_sink/chem_sink{
+	pixel_y = 12
 	},
+/turf/simulated/floor/black,
+/area/pirate_ship)
+"gH" = (
+/obj/mapping_helper/wingrille_spawn/auto/crystal,
+/turf/simulated/floor/black,
 /area/pirate_ship)
 "gJ" = (
 /turf/simulated/floor/blackwhite{
@@ -315,7 +334,7 @@
 	dir = 1
 	},
 /obj/machinery/vehicle/miniputt/wizard{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Brimstone"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -511,38 +530,10 @@
 /turf/simulated/floor/orange,
 /area/pirate_ship)
 "mu" = (
-/obj/rack,
-/obj/item/clothing/mask/breath{
-	pixel_x = 10
-	},
-/obj/item/clothing/suit/space/emerg{
-	pixel_x = 14
-	},
-/obj/item/clothing/head/emerg{
-	pixel_x = 11;
-	pixel_y = 10
-	},
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/suit/space/emerg{
-	pixel_x = 4
-	},
-/obj/item/clothing/head/emerg{
-	pixel_x = 1;
-	pixel_y = 10
-	},
-/obj/item/clothing/mask/breath{
-	pixel_x = -10
-	},
-/obj/item/clothing/suit/space/emerg{
-	pixel_x = -6
-	},
-/obj/item/clothing/head/emerg{
-	pixel_x = -9;
-	pixel_y = 10
-	},
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/machinery/vending/air_vendor/pod_wars,
 /turf/simulated/floor/black,
 /area/pirate_ship)
 "mx" = (
@@ -564,6 +555,7 @@
 	pixel_y = -2;
 	pixel_x = -8
 	},
+/obj/machinery/light/incandescent/warm,
 /turf/simulated/floor/black,
 /area/pirate_ship)
 "nu" = (
@@ -578,7 +570,7 @@
 "nC" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/pod_smooth{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Retribution"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -646,19 +638,8 @@
 /turf/simulated/floor/black,
 /area/pirate_ship)
 "oO" = (
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/computer3/terminal{
-	dir = 8
-	},
-/turf/simulated/floor/orangeblack/side{
-	dir = 4
-	},
+/obj/stool/bar,
+/turf/simulated/floor,
 /area/pirate_ship)
 "pb" = (
 /obj/machinery/power/terminal,
@@ -683,7 +664,7 @@
 "pO" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/pod_smooth/gold{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Cannonade"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -774,6 +755,14 @@
 	dir = 8
 	},
 /area/pirate_ship)
+"te" = (
+/obj/item/storage/toilet,
+/obj/decoration/toiletholder{
+	dir = 8;
+	pixel_x = -10
+	},
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "tB" = (
 /obj/item/bandage,
 /obj/item/bandage,
@@ -794,10 +783,8 @@
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 1
 	},
-/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose{
-	dir = 4;
-	id = "peregrine_podbay";
-	name = "Cargo Bay Door"
+/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose/pirate_podbay{
+	dir = 4
 	},
 /turf/simulated/floor/shuttlebay,
 /area/pirate_ship)
@@ -838,7 +825,7 @@
 	dir = 1
 	},
 /obj/machinery/vehicle/miniputt/black{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Black Flag"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -1043,6 +1030,10 @@
 	dir = 1
 	},
 /area/pirate_ship)
+"vt" = (
+/obj/stool/bed,
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "vv" = (
 /obj/decal/poster/wallsign/stencil/left/y{
 	pixel_x = -12;
@@ -1061,12 +1052,6 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/pirate_ship)
-"vz" = (
-/obj/machinery/light/incandescent/warm,
-/turf/simulated/floor/orange/side{
-	dir = 8
-	},
-/area/pirate_ship)
 "vN" = (
 /obj/decoration/bullethole{
 	pixel_x = 10;
@@ -1126,14 +1111,20 @@
 	},
 /turf/unsimulated/wall/auto/adventure/shuttle/dark,
 /area/pirate_ship)
+"xh" = (
+/obj/machinery/light/incandescent/warm{
+	dir = 4
+	},
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "xs" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
 /obj/machinery/door_control{
 	id = "peregrine_podbay";
 	name = "Podbay Door Control";
 	pixel_x = -24;
 	pixel_y = 12
 	},
+/obj/machinery/vending/air_vendor/plasma/pod_wars,
 /turf/simulated/floor/black,
 /area/pirate_ship)
 "xG" = (
@@ -1232,6 +1223,11 @@
 	},
 /turf/simulated/floor/black,
 /area/pirate_ship)
+"zP" = (
+/obj/lattice/auto,
+/obj/machinery/light/runway_light/delay2,
+/turf/space,
+/area/pirate_ship_space)
 "zX" = (
 /obj/stool/chair/office/yellow{
 	dir = 4
@@ -1240,6 +1236,9 @@
 	dir = 4
 	},
 /area/pirate_ship)
+"As" = (
+/turf/cordon,
+/area/cordon)
 "Au" = (
 /obj/table/nanotrasen/auto,
 /obj/machinery/recharger/wall{
@@ -1313,6 +1312,10 @@
 /obj/machinery/light/incandescent/warm,
 /turf/simulated/floor/black,
 /area/pirate_ship)
+"Bg" = (
+/obj/lattice/auto,
+/turf/space,
+/area/pirate_ship_space)
 "Bp" = (
 /obj/item/storage/toolbox/mechanical{
 	pixel_x = 3;
@@ -1343,6 +1346,10 @@
 	},
 /turf/simulated/floor/black,
 /area/pirate_ship)
+"CO" = (
+/obj/machinery/light/incandescent/warm,
+/turf/simulated/floor,
+/area/pirate_ship)
 "Df" = (
 /obj/storage/closet/emergency,
 /turf/unsimulated/floor/plating/random,
@@ -1363,6 +1370,11 @@
 	dir = 8
 	},
 /area/pirate_ship)
+"DL" = (
+/obj/lattice/auto,
+/obj/machinery/light/runway_light/delay3,
+/turf/space,
+/area/pirate_ship_space)
 "DP" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -1461,10 +1473,8 @@
 	powerlevel = 1
 	},
 /obj/decal/tile_edge/stripe/extra_big,
-/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose{
-	dir = 4;
-	id = "peregrine_podbay";
-	name = "Cargo Bay Door"
+/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose/pirate_podbay{
+	dir = 4
 	},
 /turf/simulated/floor/shuttlebay,
 /area/pirate_ship)
@@ -1564,7 +1574,7 @@
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/miniputt{
 	dir = 1;
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Inglorious"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -1619,6 +1629,16 @@
 	},
 /turf/simulated/floor/orange,
 /area/pirate_ship)
+"Jv" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/decal/fakeobjects/teleport_pad{
+	name = "prototype receiver pad"
+	},
+/obj/landmark/pirate_tele,
+/turf/simulated/floor/orange,
+/area/pirate_ship)
 "Jy" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -1733,6 +1753,14 @@
 /obj/decoration/bustedmantapc,
 /turf/simulated/floor/orange,
 /area/pirate_ship)
+"Mg" = (
+/obj/decal/tile_edge/stripe{
+	dir = 6;
+	icon_state = "delivery2"
+	},
+/obj/machinery/light/incandescent/warm,
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "Mw" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -1793,6 +1821,11 @@
 	},
 /turf/space,
 /area/pirate_ship)
+"Or" = (
+/obj/lattice/auto,
+/obj/warp_beacon/pirate,
+/turf/space,
+/area/pirate_ship_space)
 "Ox" = (
 /obj/decal/tile_edge/stripe{
 	dir = 6;
@@ -1809,11 +1842,10 @@
 	},
 /area/pirate_ship)
 "OK" = (
-/obj/lattice{
-	icon_state = "lattice-dir-b"
-	},
-/turf/space,
-/area/space)
+/obj/table/reinforced/bar/auto,
+/obj/machinery/light/small/floor,
+/turf/simulated/floor/orange,
+/area/pirate_ship)
 "ON" = (
 /obj/table/syndicate/auto,
 /obj/item/storage/firstaid/toxin{
@@ -1832,6 +1864,21 @@
 	},
 /turf/unsimulated/wall/auto/adventure/shuttle/dark,
 /area/pirate_ship)
+"OR" = (
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/obj/cable{
+	icon_state = "0-8"
+	},
+/obj/machinery/computer3/terminal{
+	dir = 8
+	},
+/turf/simulated/floor/orange/side{
+	dir = 4
+	},
+/area/pirate_ship)
 "OU" = (
 /obj/table/syndicate/auto,
 /obj/item/storage/box/donkpocket_w_kit{
@@ -1910,10 +1957,8 @@
 /area/pirate_ship)
 "Qd" = (
 /obj/mapping_helper/wingrille_spawn/auto/crystal,
-/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose{
-	dir = 4;
-	id = "peregrine_armoury";
-	name = "Cargo Bay Door"
+/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose/pirate_armory{
+	dir = 8
 	},
 /turf/unsimulated/floor/plating/random,
 /area/pirate_ship)
@@ -2052,7 +2097,7 @@
 	dir = 1
 	},
 /obj/machinery/vehicle/miniputt{
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Spectre"
 	},
 /turf/simulated/floor/shuttlebay,
@@ -2101,6 +2146,14 @@
 /obj/machinery/light/incandescent/warm,
 /turf/simulated/floor/black,
 /area/pirate_ship)
+"Ve" = (
+/obj/item/storage/toilet,
+/obj/decoration/toiletholder{
+	dir = 4;
+	pixel_x = 10
+	},
+/turf/simulated/floor/black,
+/area/pirate_ship)
 "Vf" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -2114,15 +2167,13 @@
 /turf/simulated/floor,
 /area/pirate_ship)
 "Vj" = (
-/obj/lattice{
-	icon_state = "lattice-dir-b"
-	},
 /turf/space,
-/area/pirate_ship)
+/area/pirate_ship_space)
 "Vm" = (
 /obj/decal/stage_edge/alt{
 	color = "#555555"
 	},
+/obj/storage/crate/chest,
 /turf/simulated/floor,
 /area/pirate_ship)
 "Vo" = (
@@ -2181,14 +2232,17 @@
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/vehicle/miniputt/nanoputt/security{
 	dir = 1;
-	init_comms_type = /obj/item/shipcomponent/communications/syndicate;
+	init_comms_type = /obj/item/shipcomponent/communications/pirate;
 	name = "The Betrayal"
 	},
 /turf/simulated/floor/shuttlebay,
 /area/pirate_ship)
 "Wl" = (
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
 /turf/space,
-/area/space)
+/area/pirate_ship_space)
 "Wp" = (
 /obj/machinery/vending/snack,
 /turf/simulated/floor/orange/side,
@@ -2220,6 +2274,14 @@
 	},
 /turf/simulated/floor/black,
 /area/pirate_ship)
+"XJ" = (
+/obj/machinery/light/runway_light,
+/obj/lattice{
+	dir = 4;
+	icon_state = "lattice-dir"
+	},
+/turf/space,
+/area/pirate_ship_space)
 "Yb" = (
 /obj/machinery/light/incandescent/warm,
 /obj/submachine/weapon_vendor/pirate,
@@ -2301,109 +2363,306 @@
 /area/pirate_ship)
 
 (1,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-cK
-nu
-nu
-Qd
-Qd
-Qd
-Qd
-Qd
-Qd
-Qd
-Oi
-Wl
-Wl
-Wl
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
 "}
 (2,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-cK
-TC
-TC
-TC
-TC
-nu
-ek
-nu
-nu
-nu
-KF
-fM
-JM
-JM
-JM
-zM
-GY
-nu
-Ke
-MM
-Wl
+As
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+As
 "}
 (3,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-nu
-tB
-yw
-zX
-Eo
-lN
-TL
-YQ
-yl
-OQ
-wG
-JM
-JM
-lY
-JM
-Ox
-Yb
-nu
-Ke
-MM
-Wl
-"}
-(4,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-cK
-nu
-nu
-Fp
-uq
-zp
-zp
-EA
-nu
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(4,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(5,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+cK
+nu
+nu
+Qd
+Qd
+Qd
+Qd
+Qd
+Qd
+Qd
+Oi
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(6,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+cK
+TC
+TC
+TC
+TC
+nu
+ek
+nu
+nu
+nu
+KF
+fM
+JM
+JM
+JM
+zM
+GY
+nu
+Ke
+MM
+Vj
+Vj
+bJ
+As
+"}
+(7,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+nu
+nu
+nu
+nu
+nu
+tB
+yw
+zX
+Eo
+lN
+TL
+YQ
+yl
+OQ
+wG
+JM
+JM
+lY
+JM
+Ox
+Yb
+nu
+Ke
+MM
+Vj
+Vj
+bJ
+As
+"}
+(8,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+cK
+nu
+nu
+nu
+te
+bV
+vt
+Fp
+uq
+zp
+zp
+EA
+nu
 Ub
 zp
 rG
@@ -2418,17 +2677,27 @@ GY
 nu
 nu
 hg
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(5,1,1) = {"
-Wl
-Wl
-Wl
-OK
+(9,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+ai
 TC
 oE
 mL
 nu
+gc
+JM
+JM
+nu
 ak
 yM
 zp
@@ -2448,17 +2717,27 @@ GY
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(6,1,1) = {"
+(10,1,1) = {"
+As
+bJ
 Vj
 ai
+Wl
 cS
 fy
 Zt
 vX
 qq
 nu
+JM
+JM
+JM
+nu
 uI
 zp
 zp
@@ -2478,16 +2757,26 @@ Yb
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(7,1,1) = {"
-Wl
+(11,1,1) = {"
+As
+bJ
+Vj
+Vj
 cK
 nu
 nu
 Pf
 fh
-vz
+AJ
+nu
+gH
+Jy
+gH
 nu
 vl
 zp
@@ -2507,17 +2796,27 @@ Xy
 GY
 nu
 Oi
-Wl
-Wl
+Vj
+Vj
+Vj
+bJ
+As
 "}
-(8,1,1) = {"
-Wl
+(12,1,1) = {"
+As
+bJ
+Vj
+Vj
 nu
 Kn
 VJ
 Vm
 cP
 cP
+cP
+cP
+cP
+CO
 nu
 nu
 JF
@@ -2537,16 +2836,26 @@ nu
 hS
 at
 nu
-Wl
-Wl
+Vj
+Vj
+Vj
+bJ
+As
 "}
-(9,1,1) = {"
-Wl
-TC
+(13,1,1) = {"
+As
+bJ
+Vj
+Vj
+TC
 LU
 tS
 wp
 cP
+oO
+oO
+oO
+cP
 cP
 nu
 vm
@@ -2568,15 +2877,25 @@ JM
 Be
 TC
 nu
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(10,1,1) = {"
-Wl
+(14,1,1) = {"
+As
+bJ
+Vj
+Vj
 TC
 zp
 nv
 WB
 zp
+OK
+cI
+OK
+zp
 zp
 Vr
 dd
@@ -2599,20 +2918,30 @@ rt
 TC
 qM
 vh
+Vj
+bJ
+As
 "}
-(11,1,1) = {"
-Wl
+(15,1,1) = {"
+As
+bJ
+Vj
+Vj
 zs
 PY
 mh
 Mw
 nW
 Io
-Ph
 Io
 Io
 Io
 Io
+Ph
+Io
+Jv
+Io
+Io
 Mw
 Io
 Io
@@ -2629,14 +2958,24 @@ mu
 pb
 yQ
 DS
+Vj
+bJ
+As
 "}
-(12,1,1) = {"
-Wl
+(16,1,1) = {"
+As
+bJ
+Vj
+Vj
 TC
 zp
 nv
 WB
 nv
+OK
+cI
+OK
+zp
 zp
 SY
 dd
@@ -2659,14 +2998,24 @@ rt
 TC
 qM
 qg
+Vj
+bJ
+As
 "}
-(13,1,1) = {"
-Wl
+(17,1,1) = {"
+As
+bJ
+Vj
+Vj
 TC
 Re
 dC
 bG
 oe
+oO
+oO
+oO
+cP
 cP
 nu
 JA
@@ -2688,16 +3037,26 @@ JM
 Be
 TC
 nu
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(14,1,1) = {"
-Wl
+(18,1,1) = {"
+As
+bJ
+Vj
+Vj
 nu
 Tb
 Yy
 be
 Vf
 cP
+cP
+cP
+cP
+CO
 nu
 nu
 DP
@@ -2717,16 +3076,26 @@ Sw
 ip
 nu
 nu
-Wl
-Wl
+Vj
+Vj
+Vj
+bJ
+As
 "}
-(15,1,1) = {"
-Wl
+(19,1,1) = {"
+As
+bJ
+Vj
+Vj
 bB
 nu
 nu
 hn
-oO
+OR
+ph
+nu
+gH
+Jy
 gH
 nu
 vo
@@ -2747,17 +3116,27 @@ JM
 UX
 nu
 ku
-Wl
-Wl
+Vj
+Vj
+Vj
+bJ
+As
 "}
-(16,1,1) = {"
+(20,1,1) = {"
+As
+bJ
 Vj
 ai
+Wl
 cS
 xG
 nu
 GP
 sl
+nu
+JM
+JM
+JM
 Nj
 vp
 zo
@@ -2778,16 +3157,26 @@ dN
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(17,1,1) = {"
-Wl
-Wl
-Wl
-OK
+(21,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+ai
 TC
 Df
-zM
+Mg
+nu
+gc
+JM
+JM
 nu
 vp
 VL
@@ -2808,17 +3197,27 @@ nV
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(18,1,1) = {"
-Wl
-Wl
-Wl
-Wl
+(22,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
 bB
 nu
 sl
 nu
+Ve
+xh
+vt
+nu
 Rp
 Hs
 Du
@@ -2838,16 +3237,26 @@ nV
 nu
 nu
 hg
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(19,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
+(23,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+nu
+nu
+nu
+nu
 nu
 Kf
 zF
@@ -2868,16 +3277,26 @@ cx
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(20,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
+(24,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
 bB
 nu
 nK
@@ -2898,23 +3317,33 @@ KZ
 nu
 Ke
 MM
-Wl
+Vj
+Vj
+bJ
+As
 "}
-(21,1,1) = {"
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
-Wl
+(25,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
 bB
 dk
 tH
@@ -2926,7 +3355,330 @@ FT
 tH
 FT
 ku
-Wl
-Wl
-Wl
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(26,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+XJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(27,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Bg
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(28,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+zP
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(29,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Bg
+Or
+Bg
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(30,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+DL
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(31,1,1) = {"
+As
+bJ
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+Vj
+bJ
+As
+"}
+(32,1,1) = {"
+As
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+bJ
+As
+"}
+(33,1,1) = {"
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
+As
 "}
diff --git a/assets/maps/engine_rooms/cogmap/singularity_100.dmm b/assets/maps/engine_rooms/cogmap/singularity_100.dmm
index a36f3e908fb45..616b0fb11b004 100644
--- a/assets/maps/engine_rooms/cogmap/singularity_100.dmm
+++ b/assets/maps/engine_rooms/cogmap/singularity_100.dmm
@@ -178,6 +178,7 @@
 /obj/cable/orange{
 	icon_state = "2-4"
 	},
+/obj/machinery/atmospherics/pipe/simple/insulated,
 /turf/simulated/floor/plating/jen,
 /area/station/engine/inner)
 "pl" = (
@@ -330,6 +331,7 @@
 /obj/cable/orange{
 	icon_state = "1-2"
 	},
+/obj/machinery/atmospherics/pipe/simple/insulated/cold,
 /turf/simulated/floor/plating/jen,
 /area/station/engine/inner)
 "Gn" = (
diff --git a/assets/maps/prefabs/planet/prefab_planet_lost_cargo.dmm b/assets/maps/prefabs/planet/prefab_planet_lost_cargo.dmm
index f3be244311c9a..c4bfb0bcc592c 100644
--- a/assets/maps/prefabs/planet/prefab_planet_lost_cargo.dmm
+++ b/assets/maps/prefabs/planet/prefab_planet_lost_cargo.dmm
@@ -3,7 +3,7 @@
 /turf/variableTurf/clear,
 /area/allowGenerate)
 "p" = (
-/obj/storage/crate/loot/puzzle,
+/obj/storage/crate/loot,
 /turf/variableTurf/clear,
 /area/allowGenerate)
 
diff --git a/assets/maps/prefabs/space/prefab_candy_shop.dmm b/assets/maps/prefabs/space/prefab_candy_shop.dmm
index 8350063af53c0..d776511dadf38 100644
--- a/assets/maps/prefabs/space/prefab_candy_shop.dmm
+++ b/assets/maps/prefabs/space/prefab_candy_shop.dmm
@@ -345,14 +345,14 @@
 /area/prefab/candy_shop)
 "Ag" = (
 /obj/table/wood/round/auto,
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup{
 	pixel_x = 6;
 	rand_pos = 0
 	},
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup{
 	rand_pos = 0
 	},
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup{
 	pixel_x = -4;
 	pixel_y = 6;
 	rand_pos = 0
@@ -485,15 +485,15 @@
 /obj/machinery/light/incandescent/cool/very{
 	dir = 8
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_y = 8;
 	rand_pos = 0
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_y = 4;
 	rand_pos = 0
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	rand_pos = 0
 	},
 /turf/simulated/floor/wood/four,
diff --git a/assets/maps/prefabs/space/prefab_drug_den.dmm b/assets/maps/prefabs/space/prefab_drug_den.dmm
index 6ca04a3baf9c7..1402524e88aad 100644
--- a/assets/maps/prefabs/space/prefab_drug_den.dmm
+++ b/assets/maps/prefabs/space/prefab_drug_den.dmm
@@ -109,7 +109,7 @@
 	desc = "A black countertop table for storing kitchen-y objects.";
 	name = "kitchen counter"
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/prefab/drug_den)
 "gy" = (
diff --git a/assets/maps/prefabs/space/prefab_outpost.dmm b/assets/maps/prefabs/space/prefab_outpost.dmm
index 5a9a8281d8083..499421d53fe2d 100644
--- a/assets/maps/prefabs/space/prefab_outpost.dmm
+++ b/assets/maps/prefabs/space/prefab_outpost.dmm
@@ -100,7 +100,9 @@
 /turf/simulated/floor/sanitary/white,
 /area/mining/miningoutpost)
 "at" = (
-/obj/machinery/door/unpowered/wood/stall,
+/obj/machinery/door/unpowered/wood/stall{
+	dir = 4
+	},
 /turf/simulated/floor/sanitary/white,
 /area/mining/miningoutpost)
 "au" = (
@@ -139,8 +141,7 @@
 "aB" = (
 /obj/stool/chair/yellow,
 /obj/cable{
-	icon_state = "4-8";
-	
+	icon_state = "4-8"
 	},
 /obj/machinery/light/incandescent/warm/very,
 /turf/simulated/floor/specialroom/medbay,
@@ -590,15 +591,13 @@
 	icon_state = "1-8"
 	},
 /obj/cable{
-	icon_state = "2-4";
-	
+	icon_state = "2-4"
 	},
 /turf/simulated/floor/plating,
 /area/mining/miningoutpost)
 "bY" = (
 /obj/cable{
-	icon_state = "1-2";
-	
+	icon_state = "1-2"
 	},
 /turf/simulated/floor/plating,
 /area/mining/miningoutpost)
@@ -608,8 +607,7 @@
 	dir = 1
 	},
 /obj/cable{
-	icon_state = "0-2";
-	
+	icon_state = "0-2"
 	},
 /obj/cable{
 	icon_state = "0-8"
@@ -644,8 +642,7 @@
 "cd" = (
 /obj/machinery/door/airlock/pyro,
 /obj/cable{
-	icon_state = "1-2";
-	
+	icon_state = "1-2"
 	},
 /turf/simulated/floor/plating,
 /area/mining/miningoutpost)
diff --git a/assets/maps/prefabs/space/prefab_sequestered_cloner.dmm b/assets/maps/prefabs/space/prefab_sequestered_cloner.dmm
index 7ae7ec5ad4c06..181bd97bcaacc 100644
--- a/assets/maps/prefabs/space/prefab_sequestered_cloner.dmm
+++ b/assets/maps/prefabs/space/prefab_sequestered_cloner.dmm
@@ -268,6 +268,9 @@
 /obj/item_dispenser/idcarddispenser{
 	pixel_x = 7
 	},
+/obj/storage/secure/closet/command/chief_engineer/puzzle{
+	pixel_x = -8
+	},
 /turf/simulated/floor/yellow/side{
 	dir = 1
 	},
@@ -367,6 +370,14 @@
 /turf/simulated/floor/red/redblackchecker,
 /area/prefab/sequestered_cloner)
 "xI" = (
+/obj/machinery/power/apc/puzzle_apc{
+	autoname_on_spawn = 0;
+	desc = "A note is attached: To leave, power this APC and press the neighboring button. The APC can be a little slow.";
+	name = "Engine Test APC";
+	pixel_x = -24;
+	pixel_y = -2;
+	start_charge = 0
+	},
 /obj/cable,
 /obj/machinery/light/incandescent/netural,
 /turf/simulated/floor/yellow,
diff --git a/assets/maps/prefabs/space/prefab_silverglass.dmm b/assets/maps/prefabs/space/prefab_silverglass.dmm
index d9375b26bf3b1..6508c2919f0d9 100644
--- a/assets/maps/prefabs/space/prefab_silverglass.dmm
+++ b/assets/maps/prefabs/space/prefab_silverglass.dmm
@@ -360,7 +360,7 @@
 /area/prefab/silverglass)
 "lb" = (
 /obj/rack,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/head/helmet/EOD,
 /turf/simulated/floor/airless/darkblue,
 /area/prefab/silverglass/research)
diff --git a/assets/maps/prefabs/space/prefab_space_casino.dmm b/assets/maps/prefabs/space/prefab_space_casino.dmm
index 4184c67de7f25..91dd520f678f5 100644
--- a/assets/maps/prefabs/space/prefab_space_casino.dmm
+++ b/assets/maps/prefabs/space/prefab_space_casino.dmm
@@ -63,7 +63,7 @@
 /area/prefab/space_casino)
 "fz" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/light/incandescent{
 	dir = 1
 	},
diff --git a/assets/maps/prefabs/underwater/nadir/prefab_water_nadirelevator.dmm b/assets/maps/prefabs/underwater/nadir/prefab_water_nadirelevator.dmm
index e3e2f14cf13ca..0bce15e97ff1e 100644
--- a/assets/maps/prefabs/underwater/nadir/prefab_water_nadirelevator.dmm
+++ b/assets/maps/prefabs/underwater/nadir/prefab_water_nadirelevator.dmm
@@ -490,7 +490,7 @@
 /area/shuttle/sea_elevator)
 "sR" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/light/incandescent/warm{
 	dir = 4;
 	nostick = 1;
diff --git a/assets/maps/prefabs/underwater/nadir_unsafe/prefab_water_honk.dmm b/assets/maps/prefabs/underwater/nadir_unsafe/prefab_water_honk.dmm
index 0b8be8bcd0395..cedcd29a8cbf5 100644
--- a/assets/maps/prefabs/underwater/nadir_unsafe/prefab_water_honk.dmm
+++ b/assets/maps/prefabs/underwater/nadir_unsafe/prefab_water_honk.dmm
@@ -244,7 +244,7 @@
 	},
 /area/prefab/slimy_honk)
 "aY" = (
-/obj/item/reagent_containers/food/snacks/candy/caramel,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/caramel,
 /turf/simulated/floor/carpet/purple,
 /area/prefab/slimy_honk)
 "aZ" = (
@@ -252,7 +252,7 @@
 /turf/simulated/floor/carpet/purple,
 /area/prefab/slimy_honk)
 "bb" = (
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 /obj/item/mousetrap/armed,
 /turf/simulated/floor/carpet,
 /area/prefab/slimy_honk)
diff --git a/assets/maps/random_rooms/3x3/hosroom.dmm b/assets/maps/random_rooms/3x3/hosroom.dmm
index 45773698f3851..4e5c7eb90c863 100644
--- a/assets/maps/random_rooms/3x3/hosroom.dmm
+++ b/assets/maps/random_rooms/3x3/hosroom.dmm
@@ -15,7 +15,7 @@
 /obj/item/clothing/shoes/swat,
 /obj/item/clothing/head/danberet,
 /obj/item/clothing/suit/gimmick/guncoat/dirty{
-	name = "Old And Diry Coats"
+	name = "Dirty Old Coat"
 	},
 /obj/item/reagent_containers/food/drinks/bottle/vintage,
 /turf/simulated/floor/plating/damaged1,
diff --git a/assets/maps/random_rooms/3x3/junkstorage_firefighting.dmm b/assets/maps/random_rooms/3x3/junkstorage_firefighting.dmm
index b62040c5ea4af..bae8f7805f31d 100644
--- a/assets/maps/random_rooms/3x3/junkstorage_firefighting.dmm
+++ b/assets/maps/random_rooms/3x3/junkstorage_firefighting.dmm
@@ -34,8 +34,8 @@
 /area/dmm_suite/clear_area)
 "J" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/tank/air,
 /obj/item/clothing/head/helmet/firefighter,
diff --git a/assets/maps/random_rooms/3x3/nope_no_room_30.dmm b/assets/maps/random_rooms/3x3/nope_no_room_30.dmm
new file mode 100644
index 0000000000000..b4cc02a8d372a
--- /dev/null
+++ b/assets/maps/random_rooms/3x3/nope_no_room_30.dmm
@@ -0,0 +1,27 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/simulated/wall/auto/reinforced,
+/area/dmm_suite/clear_area)
+"G" = (
+/obj/decal/cleanable/writing{
+	words = "FUCK YOU!!!";
+	desc = "Someone's scribbled something here in furious, block-letter text."
+	},
+/turf/simulated/wall/auto/reinforced,
+/area/dmm_suite/clear_area)
+
+(1,1,1) = {"
+a
+G
+a
+"}
+(2,1,1) = {"
+G
+a
+G
+"}
+(3,1,1) = {"
+a
+G
+a
+"}
diff --git a/browserassets/html/how_to_build_a_pod.html b/browserassets/html/how_to_build_a_pod.html
index 659ced42a1889..c961702053e0a 100644
--- a/browserassets/html/how_to_build_a_pod.html
+++ b/browserassets/html/how_to_build_a_pod.html
@@ -10,15 +10,10 @@ <h1 class="center">Making a Space Pod!</h1>
 
 <h3>You will need:</h3>
 <ul>
-<li>A pod frame kit</li>
-<li>A box of pod circuitry</li>
-<li>A pod control interface</li>
-<li>An engine manifold</li>
+<li>A preassembled pod kit</li>
 <li>A set of pod armour</li>
 <li>(Optional: a paint job kit)</li>
-<li>4 lengths of cable coil</li>
-<li>5 metal sheets</li>
-<li>5 reinforced glass sheets</li>
+<li>A screwdriver</li>
 <li>A wrench</li>
 <li>A welder</li>
 </ul>
@@ -27,33 +22,24 @@ <h3>To make:</h3>
 <ol>
 <li>Deploy the frame kit by clicking on the box.</li>
 <li>Wrench the jumble of metal. It should look less like a pile of junk.</li>
-<li>Wrench again. It should look like a functional but unsecured frame of a space pod.</li>
-<li>Use the welder.</li>
-<li>Insert wires.</li>
-<li>Place the circuitry inside the frame.</li>
-<li>Add metal to the frame.</li>
-<li>Install the engine manifold.</li>
+<li>Weld it. It should look like a functional but unsecured frame of a space pod.</li>
+<li>Use the screwdriver.</li>
 <li>Put armor on the pod frame.</li>
+<li>Wrench the now armored frame</li>
 <li>Use the welder.</li>
-<li>Install the control interface.</li>
-<li>Add the reinforced glass sheets.</li>
+<li>Use a screwdriver to close up the final parts</li>
 <li>Optionally, use the paint job kit on the finished pod.</li>
 </ol>
 
 <h1 class="center">Making a Mini Putt!</h1>
-<p>Some of the key components are slightly different, but the construction plan is otherwise the same. And as with space pods, you can rename the finished craft with a champagne bottle.</p>
+<p>The main preassembled kit is the only thing different, but the construction plan is otherwise the same. And as with space pods, you can rename the finished craft with a champagne bottle.</p>
 
 <h3>You will need:</h3>
 <ul>
-<li>A MiniPutt frame kit</li>
-<li>A box of MiniPutt circuitry</li>
-<li>A MiniPutt control interface</li>
-<li>A MiniPutt engine manifold</li>
+<li>A preassembled mini-putt kit</li>
 <li>A set of pod armour</li>
 <li>(Optional: a paint job kit)</li>
-<li>2 lengths of cable coil</li>
-<li>3 metal sheets</li>
-<li>3 reinforced glass sheets</li>
+<li>A screwdriver</li>
 <li>A wrench</li>
 <li>A welder</li>
 </ul>
diff --git a/browserassets/html/polymorph.html b/browserassets/html/polymorph.html
index 9f041ab57dcef..b2cf74066e943 100644
--- a/browserassets/html/polymorph.html
+++ b/browserassets/html/polymorph.html
@@ -2,5 +2,7 @@
 <div class="traitor-tips">
   <h1 class="center">You have been polymorphed!</h1>
 
-  <p>A wizard has polymorphed you into another form! You are reduced in your capacity but you can still fight the wizard! However, <b>you should not randomly attack the crew</b> unless you were somehow already an antagonist. If the crew thinks you're a regular critter, talk to them first!</p>
+  <p>A wizard has polymorphed you into another form! The spell will wear off in <b>eight minutes</b> and return your previous body.</p>
+
+	<p>You are reduced in your capacity but you can still fight the wizard! However, <b>you should not randomly attack the crew</b> unless you were somehow already an antagonist. If the crew thinks you're a regular critter, talk to them first!</p>
 </div>
diff --git a/browserassets/html/traitorTips/vampiricthrallTips.html b/browserassets/html/traitorTips/vampiricthrallTips.html
index 2fa8f0fbb5bc2..6c4626f1dd392 100644
--- a/browserassets/html/traitorTips/vampiricthrallTips.html
+++ b/browserassets/html/traitorTips/vampiricthrallTips.html
@@ -2,6 +2,7 @@
 <div class="traitor-tips">
     <h1 class="center">You have been revived as a thrall!</h1>
     <p>You feel an <em>unwavering loyalty</em> to your new master! (As such, <em>do not reveal their identity</em> or otherwise act against their best interests.)</p>
-	<p>You will slowly lose blood points over time. Your max health will decrease as blood points are lost. You can regain blood points by drinking the blood of humans or taking an additional donation from your master.
+	<p>You <em>MUST</em> stay close to your master! Your new unlife is fragile and straying too far from their power will result in your swift demise.</p>
+	<p>You will slowly lose blood points over time. Your max health will decrease as blood points are lost. You can regain blood points by drinking the blood of humans or taking an additional donation from your master.</p>
 	<p>For more information, consult <a href='?src={ref};wiki=Thrall'>the wiki</a></p>
 </div>
diff --git a/browserassets/js/browserOutput.js b/browserassets/js/browserOutput.js
index ffed406372848..91d014e5f9133 100644
--- a/browserassets/js/browserOutput.js
+++ b/browserassets/js/browserOutput.js
@@ -1008,7 +1008,7 @@ $(function() {
             '</div>');
     }
 
-    runByond('?action=ehjax&type=datum&datum=chatOutput&proc=doneLoading&param[ua]='+escaper(navigator.userAgent));
+    runByond('?action=ehjax&type=datum&datum=chatOutput&proc=doneLoading');
     if ($('#loading').is(':visible')) {
         $('#loading').remove();
     }
diff --git a/browserassets/tgui/tgui.bundle.css b/browserassets/tgui/tgui.bundle.css
index 6c852e42b225b..66905f2c6bfcf 100644
--- a/browserassets/tgui/tgui.bundle.css
+++ b/browserassets/tgui/tgui.bundle.css
@@ -1,11 +1,11 @@
 @import url(https://fonts.googleapis.com/css2?family=Anton&display=swap);
-html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.centered-image{position:absolute;height:100%;left:50%;top:50%;transform:translateX(-50%) translateY(-50%) scale(0.8)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}@media all and (min-width: 100px){.fit-text{font-size:.1em}}@media all and (min-width: 200px){.fit-text{font-size:.2em}}@media all and (min-width: 300px){.fit-text{font-size:.3em}}@media all and (min-width: 400px){.fit-text{font-size:.4em}}@media all and (min-width: 500px){.fit-text{font-size:.5em}}@media all and (min-width: 600px){.fit-text{font-size:.6em}}@media all and (min-width: 700px){.fit-text{font-size:.7em}}@media all and (min-width: 800px){.fit-text{font-size:.8em}}@media all and (min-width: 900px){.fit-text{font-size:.9em}}@media all and (min-width: 1000px){.fit-text{font-size:1em}}@media all and (min-width: 1100px){.fit-text{font-size:1.1em}}@media all and (min-width: 1200px){.fit-text{font-size:1.2em}}@media all and (min-width: 1300px){.fit-text{font-size:1.3em}}@media all and (min-width: 1400px){.fit-text{font-size:1.4em}}@media all and (min-width: 1500px){.fit-text{font-size:1.5em}}@media all and (min-width: 1600px){.fit-text{font-size:1.6em}}@media all and (min-width: 1700px){.fit-text{font-size:1.7em}}@media all and (min-width: 1800px){.fit-text{font-size:1.8em}}@media all and (min-width: 1900px){.fit-text{font-size:1.9em}}a:link,a:visited{color:#2185d0}a:hover,a:active{color:#4972a1}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dimmer--full{position:fixed;top:32px}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.GeneIcon{display:inline-block;width:1em;height:1em;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAACS3pUWHREZXNjcmlwdGlvbgAAeJyVl01u3DAMhdfjUxjJti2S/gDdzKZIUGSRXCGgLXrEmBJVSo47OX0XKZpp0QFpeGMD33uiSEqWLvtvt9/vHvqb+7vuGbWS5H7ff/5w1e1WCi32+/7Tx24XkQ6xvX7UBg37fX9x0e0Cae33/XW3mxQSvr7/ARqmwtDQBAPojBnVBEcRDrLm/4Nfu11AhmO/76/f/fW8OSx5zmcNTkfSo8yUsVI12QStoSI0xwyellSOJlWEj0m0RKrJkWbGAi3atpgKtGhilJK46paQmwnVpaBOoDaJRxwQkp1wCIoZmLIjRApgG5YozV1uVBzc8ESKg6In7YES5kqSa6TJzlZEYMqHJstoe0dgXkbK0Ejs5h9U1pzF0QFtdi3ukQVscoyQkNETIB3KMtvhUbZHzeJoo1oQHWlmegENttuPhWxKBRxDTioHG2Kojv0hrKCTXSawm3NgcKS+zsjYHPVOkme04x9ldS3IR0V75Y7CwQW2iJqAXSwyjj5T+enigH1+Cr7JvO5VjNVhiQe0SxfhxXEAQHCsmqaS7V6PC9udpxBIBgWyJ4BHO37X782xVw6eNESR9siUBrs5SgGlRpLfX22Br014FZ3pXDE85zAoBRTaWY8v//Hodoor5fBPvTHJGFUSwaMu1fPjfBMMKtnRn6eSg7BdpFMBU9o2gjA9b1M8QdgmaAi8STDKAI7D3qmEcqCDbJKURQtvm8kzCeO2wKaljpFgk8Z7b4DfAsexg87eFi7724eb/ub+rvsFmer4u2pZeMcAACAASURBVHic7L19YBXVnf//nvBMIPIUQBsCrfKryIIu94KtLaWl2lCJrVtpdV23PtTea2zTNbBru63QVijutou4m231Rqtl11p/rfZJoqTGtCnWr8IdKliNfhFMYqwhAYyEAHm68/1j7jlz5syZ57m5iTlvHO+9M+fO687cue98zvmcM0cpr6gCALTv3a8BwNzlFyrIoew4+eZLSUmNPo0FdFNYsGA+AKB5736NmMOha7ZrpOC5j1YpAHDbvd+k6+6p2OqrnB0n33wpKanRKaW0dJm2YsWFppXNzS3o2daApvo4Fl2apo/VqzpRW6JibVuMPlY2Fnsq94341SDmQ7Rnz34AQD75S9eukiYoJTVKVQDohtPc3GLaUL2qE+VHVyoAUH50pVK9qhOVjcU4eEWdAgAHr6hTKhuLPZdjxfPyzZeSkhqdUsorqnCgtlGbPXsaXblgwXw0N7fg39L/P11XW6Ji+413YNGlabquqT6Oqoe2YG1bzLFc4YbVdJ9EHR1dNPrKN19KSmp0SiFJkAO1jRoAECPq6OjCVZmttOD2tjX6k41x492bdZOpKtnlWK50R8a0XwAW88k3X6Sd9xpti2FUXlEljVZKahiKGuCha7Zr1as6cVNpGd3Y2rovEkhp6TL6/MHWOlQ2FtNkBVG++byiMj8iaYJSUsNPSnlFFQ5ds11rqo+j/OhK5bZ7v6nVlqhGJMUr5bA3FUCNeFNVyS6sbYvhnoqtys5Zu7VFl6apCfniB5QTn1fU5kckTVBKanipgDxZdGna1J1EKCfzA4CYe5lD12zX2PY5X/wIZMeXkpIafRpLnpAIDIA3E0oK1qWgR4EOOvfRKhqBsfLNDyg7vpSU1OjTWCDbefia7dptq57yVv0UmZ+LtretAUp24bZ7v6kd4trgfPMDyIkvJSU1OkUjQNJ/rqk+Dmy2Ke1kfG7VYwDbb7wDu7Idle+p2Gra5okfUk78kaYnfnS3KVK+4tb1Q2roki/57wV+AaAPG6stUXHuo1XKokvT5q4mbkrBMD+HJAg26qM0zn20SqktUU1D1ULxvcqBP9LEf/l264aCf8Wt65Urbl2vSP7Q8gk333x23Ujk0yTI2raYf1Ngoz4n82N0273f1NiOy6H4AWTHHyly+qKH4iK0YwzVj1Dy9R//cOOTbSONTw2wtkSlNw3wJRV61diD+QH6jQlqS6yZksB8n7LjjwR5+YJzeRG67TvXP0LJt//xDwc+KTOS+AWAbgpr22K0Px4ZYRGpNus3Kzh0zXaN9Mcjm/LNl5KSGp2iSRByY4HaEhXbEX0WFoA+bndzjIzEMG3LN18qmIay7Wc4aKgb+4e7+PMx0q6HAsAYiUEiMXZsbVRiR2KQSIxsyzdfSkpqdMrfSJAIJEeCBJeX6COXEcpw53tpIwrLd0tCSX7++KSMn31SA2yqj/vvHOwj+UF07qNVSlO9tZtLIH4A2fFHitwawUcrP9c/PpZv1w1J8vPHJ9v87s9yN5hcjcQAjGqo091g8sVnNRJuhvBe6Ygq+ZKfTz41wNvu/aZmjMTwWEUk/QC9Do3baNyyns/CBuL7lQOf1UgwQCkpqfAKPhKE7QSd8ECSI0GkpKSGmWg3mLVtMeDemFZ5zfacAu2MJ998KSmp0afgI0FItdfjEDgiORJESkpquMjSBli4YTXdmE43RAKJx4199mxrcGwDzBefl7wlvpTUe1/UANv37tcA0Llzm5tbsLL9dlowzKRE8aeKTPsFAH5S8nzzRZKTIklJvbc1FtBnZOMnJwdgmm4SJbus01LCOi2lqByeMiIwYkR7ahs1dlrMfPLtJI1LSuq9rQIyJy87WTiZk/eeiq1KZWMxHaJGsqjVqzppxpYML3Mq17OtwbTv5uYWzJ49DQdqG7V88/Nz2qWkpIaDCvgVzc0t6OjoQmVjMXbO2q0BwM5ZuzVys4KFT5RpALDwiTKN3MXZS7mOji7TxOR2yjdfSkpq9Egpr6gCicIAfeJwUjVkx+aSkRNsNxKSSPBazo6Tb76UlNToFE2CkOpgrk3BjpNvvpSU1OgT7Qg9VIZgxyGRWa5lxyFZaC/Z4TCy40i+5Ev+0PNpBJhPte/dr7HdVMiHi7oKbMeRfMmX/NHJz7sBirrANDe3oGdbA5rq9fG75JHcLWZtW4w+khsouJX7Rvxq2gWGaM+e/QAAyZd8yR+dfEsWOB9iu8AQVa/qRPnRlQoAlB9dqZCM78Er6hQAOHhFnUIyvl7KOfEkX/Ilf3Ty8x4BAubsLKB3ViZ9AYlqS1RrR+h6a0doUbnCDavpPonsstCSL/mSP3r4w8IAASM7y3ZTuSqzlW4PMxSudEfGtF/APgtty59Tpj+5fLnxpif3AgmganMdw8+e5I33R8vP9/FL/qjmn5/db5LZb3pzGiqAVxn++LY1+DyA+Ag5/mFjgOSO0DeVltF1ra37Itl3aeky+vzB1jrHO1Kb+N9SEUsAKnO3G/q6BvoTsiKW0O+LyK7Pvi7tNP5C+eLn+/glf1TzW4p1vqrqN30CgBiAWAz4hgp8Hsb6w9nHf4sBSAA1SWPdz4bx8Q8LAySzwpUfXamQm6Pa3hY/JV4NwPHWXOyscDtn7dbIcDlb/sYyxBJAGgB7e1by2mKCCQdzBFBVMt8fP+JpAXwff0i+phmjDBVFGXI+r6Hgp5hj5vXqvLqc87XUa7bb1m9+wxf/H9rWIJY1M9QYJhiD8UjE3lwuxr0GdCPsG6bf/1j3tw6NFl2axiGkNdz7TftCTuYH6Gc/Bcdb9B+6Zru2yAOfeFc8a4JExPxiiewXXZMtWJPIvoYRMnIm6IefK71X+JrAbBRFEZTMDZ9XStOQdOCTalqu+FrqNSjJD0bPr4H+x70ma26Mu8WIC7IRYkwvEzPvBa9mHyM9fnINkJ9X0v/3P2wMkPwFAODtBgUik0vB+ueH07mPVtG/AE78NAzzi4N7TBiPvAmKq8UJ4EidL36uNBR8kTlFyU+n9feyhqdpGtLpNOJx5+kUcnH8xPxSaYcI8Mrcff/E/LTUT23LrN8MX/xYClCTjMmRSJDfcdYcyQZifuR9KveGyI+fYXsRzx8WVWDA46xwbpMwEQN0qQa7zkrHVX/5CNC2Gsw3FnLV4qojdYFmxdMEc0QpAaZNyeWsfF4isij46XQasVgMiqJYqtmapkFVVVsTzMXxs+aXjDtHILngs+anJP8hEv75bWssEVwsBfq7UlXGGJk2Ikt0mNBNFABNlgQ+fk3T+WyUl9KMnasAVP/nP3AEGPW0eKT/jj4rnE0hp9nn3KrHALbfeAd2GbPC2fNRJt6BndhIjzVDrlq8feP93vjM8YvMj6z3a4Kej9/u/LuINyVN00wmGAU/lv3l2UWZsRj/0zUU9fHz5pdKOQcvybblkfJ589N+7/wjUBq8HX8qyzdFcdmqMGoY8yMiyT8w78tOlMYmSUKdf7dpN1zMDzb8QB2h7SZGDrIvIOSscCkY5uc0P4mfWenalluqvoC1KhxLwJgRj3CJGcYSxnq1Bth4v+9Z8ezMDwgQAeZ4Vj7X9rcc8nnjHQq+yPySScV+aVseKV9kfsonkvZLg/frj+3qggRneAnn56ayzG/x36M4/yqARPZtKY2J/ARl+T9GNnzfEaCT0YWZHT7QrHDsHzyPkzN5nZWOVHHZJEiaWy/KBANMggTWz+SVH6n5BeD7FW9AxJT4KHC4zgroh29nfqmEvQknsTwyvp35aftutn2P8qsXffHV7P9igH7hk+vYzgDBtReSaJHjRPL9O5xnaow2XsDzfRmglygvqAnWlqhk+Iq/SDLArHQLnyjTTLfRF/CJpwm7wdiYHwn6SBny8VCTAHC/L76dePMjxiOKwETbwvJZxWIxJBIJJBLiiaFFnylKPmG4Rn8R8p3ML1njcNlno5qwfCfzU5Y9EBnfviGBE2uMpJrMPI/VmNsGAx+/CqBGMcyP73sT89YeyPN9JUG8VnODGCCZFU5vA3AIf1i5JD0s2mgMlrablU7nf9maxMhK2NcvAUvSRJgsuXy5R37aU+JDFHU5bvN8/O7nX2R+hG9ryhHwSRKEZbLH6pQECct3M79UzPnnkfTx/YvkZn7aG8uE7yNSHizwxNee5PisqQFms+PXsc+ZpIkKfRRJ4ONPaLoBkud2ckqGCPjD4mYIAEAGNlc9tCVnjKqHttDGVkc+TWIw5pVdhJnf7Ho2YyzKFHvm24g3RdZgeLMRbQvLJ+LNLx6Po6bG+CvBGyFRVHxWfqK/MHwv5pdUFcclDN+L+Snv3+e4+OKL2rftlGAeucoAO4ok1PfPRtc1irUndo1iLiOQiD8sDJD0BCeTGrFj+6IS2xO8qT5uuoeYhX+kzmRuUGuMMNAu2eHKn++d73D8IhO0S0Cw23wdvwOfmF8ymYSiKIjH4/Q1/YwCU4qKz0d3/LG7dYEJwvdqfilotksYvlfzy/TAdvHDX39kl7k6CzCvs29LAIDGRWMa7Gqwr0b0/bvKpu5ud/y+DNBL1TZoEmTRpWnTScmVDl2z3dIJU8gn5kYiPSbJYfnLmLC2FwozxT74TokOpwSJmzwfv0Cs+YleA4b51dTUCI05DJ/IrqrveSSID74f80tCsV2C8v2YX0Gh/RKIL0p86J9K8Jqss34HCcaUovj+aaJDJJcokOf7zgJfcet6xa4tMExfwEA9wZ36BdrIc094dpQHl921ZHmzPeTj3IViqgL75AO6CUbZD9Avn5UX8wMgjAij4BORareqqqa2QFVV6Ta2Oh6G79f8Ug6VgVef9M/3a35R801yNUGAmh/5TWSrv6oKoCQkn0hkfrHs5/HQFzCykSBRd4QOOxLBizz3xJ9TZs5ksdldmCM9k8GxRknWMe2FI3UkSCwWg8qk8vjX7Hon8wszEoIMfyNcYnjks9TU1FBDJI98ddgPP0rzI3r1Se/8KM3PL/8fsuefdmim+3aLTcQGCJhviBBqJIxdAoSAHExQ9P0Pm6FwgbPAgPdIMGAWmDU80XM+yjNlxNgUcrYzdBRZ2ECKIAsb1PzC8NPptJDJm7LoM5lM0CM/defeyM0PAJJzvPG1kp9Gbn5++KnNadqU5s8ErQZIbp3VBuCnYa4/p2ovEbtdZITDNQscaCQA2wnaywXgqyf6/bbZXSLheGCy8ImTWCLQSJBIFaAnPunIzC6qqiKVSiGVMr4AYj5OVc+gIzHszI/l2g1/U1WVRo5++MlNy4X786rEP91veU7MxwtfaXMe05trfnJj3Dqig361LhU97hKoyX51Pw06EiSRTbR4ueFBDEYSJKYZfQOB6EaC5ErDbiQAN57XbkSI6fZXfKdBsi4B/U+gH36O5HkkCjeCg4hdT0yQjfr4drmgfEBv7yP74E3OLgrly5Cqcg32+eL7jf4S/3Q/av7zy8Zn5177PX6/0V/UfFp9JTc+MDXziJrq2G4qxvsPg176vvjGvgR9/7yYoU1VONRIkFzK90iAJPx3hIaPnuheOjmziRIS8fE3RiC3ybrcJz9H8sp36lpDTJAYH2uEdtVSsjbo8bNtfHwCxE+ZXJx/EmWxkRe/PvloakTxfwHgA3AzQU5c2x8xv7eYIoGP3yW761WhRoLkUqQNoHDDarounW6IZN/xuLHPnm0Njm0QJv6Xn/HfBsiOHslGh/G4MbmLL36+j1/ADxIBBuV/+ctXm/YlMjcvz++/P/j5d4sAtZd1k1EWf5k+Z18ri78c6vy7RYC55H8y+/1/AOZ7/Nk2OXEjP4gBvhbh9RdETsc/bAyQzNjOTly8sv12uj3MpCjxp4pM+wXsZ6a34//xzTKkAShM+1Dszr1Qa7hJkUgGuc0oFwU/38d/95v6LcLY4x9K/vkb9fcl24wfearky1BVFYVPfs6xXC7Pv/by/VhfNi/nx59vPrlHIDvZERkyt/6I8f3/Q9saOuxtKI4fCHf9DYsqsGhydACm6e5Qsss6LR6s0+KJyuEp4y8AORF7ahs1dlo+V/68OijcftVNy6181GF7Ww74eT7+9fPq8sqv3QzLfpP1QNWTW1zL5fL8ry+bNzTXX575tSW7kOT2qwi+/58O8fGHvf7yngUmc4KykxWTOUHvqdiqVDYW0yEyJItTvaqTZozI8Bancj3bGkz7bm5uwezZ03CgtlGTfMmX/NHLz7sB8mpubkFHRxcqG4uxc9ZuDQB2ztqtkcHSC58o0wBg4RNlGhnY7KVcR0eXZfZ5yZd8yR/d/GHRBsjODM/OGM+ODSQ9t9k0NmnI9FrOjiP5ki/5o5M/LAwQMGaG52eMHyqO5Eu+5I8+Pk2CkCwMn52JWnYc4sy5lh1H8iVf8kcfXymvqEL73v0amyYm5hR1CGrHkXzJl3zJzwdfKS1dZklBNze3oGdbA5rq9fFz5JHcrWFtW4w+kgHMbuW+Eb+apqCJ9uzZDwCQfMmXfMnPB7+AAPkMSfWqTnJ/LpQfXamQjEt2uAoOXlGnkIyLl3L8AbI8yZd8yZf8fPCV8ooqU3YE0DsLkr44RLUlqrUjYr21I6KoXOGG1XSfRHZZIMmXfMmX/KHi0ywwyY6waeKrMsbs7Qd2/hoA8Mzjxo4/eZU+3GRp+ZWO5Up3ZEz7BeyzQHb8MENhcsXXsvz1eeIP5fHfvHkNipcCs3/NHP+d9wFQsX7efFO5jteAT4yL+PgvL9MHmF7ODsX7MmKI4WMlR03lYgDUOUa5KPh3/3oNoAJKG3Orrs1pqNDnuyBqzZ7/xyP//vWhiNjIHv9eAEBVSZ1juUiOXzAUct+dV6IYy3H3PNrchvVv6rudt+lbER9/bq5/aoDkjqw3lZbRNy787VwApdlXH4I/PQ+gFQBw8DPtdO2DrXWOd4Rl+S2t+mB6xe0eZDYi00XMn29MF+iH39q6T7xfG57dpywtjZbP3ouP6LnnnsOOHTsi5X/9nH0ongcUnwvM/iBQvBQoXgZkJ0zJLmQi1hp07gM6DwAdrwGdh4DON4HOduDBTDB+8S9VuntyVxJA1W/5pgIqVMQQA2LkbjMx8p/x8WJA53wjQvB1/bWooN+qyi0w3/FYeJf27OPnAn//DMz7TL0WlZYGO/4/tdxFn5fgU2jD79CJvSjGcnRiL/biDiyHMYsbWc8+luBTmB/w/LPXfwrGDaD8zoThdP0r5RVVdFam8qMrFXJzQhLJsca3ZsZ5AIBdx1+nz0Xadfz17LPnyaFgafnX6LAVck9+8iFE/LvbjBMRxACNuXI0AArWz9vliy+6LTdvfIrLelbsrFRB+SLj42VnhH7555Ws8WB+rAHamyAAvN7mj//HX5e5mh/5SbiaIICPXVnn7/p7cw0sE/24mCAr9o7KqqqPkfX3/ZfBvGd2LmQNmmUQl+jPsmHP7KyEXvgkkiNGRp6zpkeeP3nXz9Dd0Iurn76BriOPxATXz/N3/oNOiyGatgKwv/5pP8BFl6ZxCGkN934zu8ZqfHavAbMprplxXtYErVHjoWu2a4sEH9zCZ253r0HzZYK8+QXis/vjXvPGx7/m14fli4wvEdP/Dtao5m2XXHIJLrnkElsj9Mon5hdG7Ptfb/PHZ00msATvD3L+6XUkCMKIIVvW2wRs3vnkBLC3ObYzP0B8k1LyByoI32x4xASJ9uIOAMCTd/3Msq+9uCP7p8kcIfrlB1Gce+TF8+mZbKqPW8JSQGx2IolM0lhnGOG5j1YpTfXWj2fHh3vQY5LI/Nh7e/rhazBfUgqMy0wTlCPb7d7vlw8Y5kdmPHMSMUVAN8Lrr7/eUsYrn0R+JPrzo+KlzHvPNRuh5+NXGQ/0a4T8e5n3+zv//LcJc/CbXWKChfOtAPzwVV+RfP/+siJmKFJ3Q2/O+VGJ51vaAPXqr9FmR6I5r0ZIRN6jR4J6eyCpBju1AdDqbwrGH7Ds79otCnQzP7+zktlFePC5nrwOMitaKpUymR+Zd4M1uxo1JYwI+SjQK//mzTqfNb5i2oziXAUGgE6m6bLzgP7Y8Rrw24c9Hv/l2eYPk/HRCq5LFZiWMj2NAfjYk95m5bt74xrOwPg/gzAbq6ipjjk15CbZP/X8/f8S5nNsHL+iLLOJANnPyX8Y/YOQarAbf/2bCjU80u5GqrVgnh/+dtYTngM+8PTrdH3nXYvR3dBL1/HVYC/Xv7XuZj1SL26ZSCRQU1ODRCKBwic/Z+HTM0n6z2y/8Q7ohqW33xntef4kMsztN94B0neHl5nPyUMU6GZ+Qfh2ER+/3i7y49f75ZNjopMNqYrJ+IhE6wBrFOiVX7zUaPMjS5YE/oeZyfwt81o3avZ9ZF+zP+jj+C3hm5356SvUbMhnvgE/04CYffB1/k2Ro0MkyD5nXzMi1WHvfIcQ0pfMoXPg3x8nYoRTJ04AngN6TveZ1gPGujB8DebfHv+al6axPqCL/HZqamqE/ALAOiuT3oWlFbwRkoW8ZiV6zUZ/zzze4X1WLDbVn3Cv/3gxv0CzoiHCKnDAWbFoZMfMuGYxvJjdJRHs+Gf/Os4kPNjF+oMsKGCjkZjlPcQIFx/2cfyXLwdJeJisQHgpMBPCqNYaKnWyOct9zMoWB/tWXR5NkD9N2fVxv7MSsgfFRHSapkBRMoLzwF4DfGSu+pqVkO3CYqfOuxYDb+vPlzzbiiT0P0mddy1G92G9Ssy2/ymbvJ9/9voXRXlukR9vggDcZ4XjZ2Wag14AB3EEE5i96G15oqiQjfjMWeDW7L50hZkVTZQM8WR+jILw7aq61s/nXt7PrGxkT4lY0pLsoCLmF9MgmgnrkksuAQDswMu++GLDE4c4mczfosD2zpKk+u5vVjaR4al0BR/xGltiqvmzkeiLbPd8/CT/YHrOJhpsEiNs3sFce/XHt+1Yw/+ZBbOefC72g5gbQb3ySfV3y9cW4/D0Xiz/rlE2CeDrh3uBZr3qS76NLVnz62nqw38/24olgiSIVz5fw7JbZyfiC4qiP1c2ifnUAC2zgrV3QJs7G3PQiyNohdEf8HmIsrtWUzTMT2nvALJG6nlWKP6vqKADkF/z88WHd+Pj5ZQFDjorll01F6pia34ieeeLqmDiKpkeBcaQyWQcjHCfP77K2hqRXQ8wY0Yqi20QQwwyKx9rZE4mSMrwYte1+eWzcNb8yB9HOykwz2JNDFDxyQe2XLkYKAV6+ozqbBLAV/+1FGg2U7dkI8KeJnPVdy/uwOUwOmoH+f3xR2cnanaKTRQo4NMkCDsz+6dnd2HGwkkAAG3ubCYKLGV29SGHqA8gnaCJAR4/eBpPdUzzNDO8VrI3+70zl3NNDEgaiZAg5ieaGV7EJz3M/RqfnSjIB59GgD4zoKJIkSZDPPL1ER5ANBlII1OgbLrf4/GT+Wz9dnkVST8fMcSgbrzF2/E/yRgICWAtwa8gMQLBdxYD9Welzev3r4GvzM+d+z4fx6yhvf07sESAHr//fXdeqSczrlyM7uJedJ7Vg4v/Q6/vvvSvpSg8Oh49TX1Y8qz+G++8azEAoL22GwDw38+2mjouk0TIvE3f8vX7Cyo2+mPXKZusx0//XpPGwaqHtuDEW704fvA0fbNRhW0FMTZWfJWXRH6s+Z14qxdVD22hjZ28WL5Z2faAbBSoQfNtflr2XzB+dMo137aa7JvP9/jVl0xG1PZkSN8ufi+geubHsv/0nw+7uHUFSljeQ/cV83H8vNlZk7GcuIqZqRFSo8+9n3+z+S1aFMf06Wf7WM7BokU/sjD8Xn/dxb2Y2mk0gR3+9nl6JNsMFE4aj8OXnYeX/rEU3Yd7LeYH6FEhzRT75JMo1znaFUtRrH6gKGJ+AWD0xCaTiqx4mJlftL0DAGuCbBSoy9zfz9jOmt+Kh++nPbGb6uOme3jx/PXMNJNUsWwLt8b9tQUARYPtv5QGpID1JXWe+WRsYY3NYien8mxPdK/8KOWHr4/ttRpYQcGfITJCYnxku2hZP+9znvkfKzmq96/j/hltIbwREuPj3xGjPvKxI0e9H/+Tu2xaANjaqegvriZY9HbC9Vf6+f6NaT5XrPg0pk49x2UpFqwrxYoVrwX6/v93nh50TJ2km9/p/gEc/uF5etb3DaAn3oeeeB+wAChsH4/OP/cA0JMhKegR4eFvn6cnSZ7TGXfP03xd/2TuacW1WudNdsdvOxKErQIDECZDrHreZr2hYD3Bs4NbYgLzq9Hcu8kkAZT451uT9c7yUj5XPeHdoj///BrYRVx6O1+MeU2MD7CGSORPwOd88VXAMpqCtOdZgzBikLCYFin7seyj5+Pno0DroAwf0oBsO5jf73/ChNkAJkJRCrB794/w0Y/eInj3GQATAQC7d6ewciVpOphO1xMFuf5mHp+EqScmoLuhF4WTxgNpoGduH3pK+lB4znhMPjwOS/63lVaF8TYwtXUC2o9246ZnzddQ2OufRIS8Mdqt51MHPJ8aIBmLB6Zxw2p+1ujPrA+BmOARTMCcubMxAx2mEuc+WkXH4rES8c0iqXHG/FTN/YLkfi1++O3wJy/lvfIVRbFtyPUj0v5XVfL3vvid+4DiZXy8a2SG9YRHAZf4MDpDE3Vy93Pwfv5jliRIjM2wIgGLScfE5qirzh+fNUBTVxgvOUhW5i/Rz/F//OOPAJgFYKq+J03BmDFnc/vvBjAl+3wqABVjxpDXZ+PjH/+/+MMfgvCB7tO9mAo96mtHN+Yumqqv65ygX+wTgZ4zfSicOB6Hf3gecFjf1t2j1xZvejbB9A3c5ZvPi60Oa5pGzc5uPWBtReb5wpEgHQ/8CwCgpvcS4Qf5zPwPCzs63/rn/xWWX9f6jKka7N4Tv4xJgrDGBxgXn0tDqcr8GrJngVSDvY7EuMpm14/ZrF9ns/7x7KPvkSgaPCdB7CJAdjSIHAnicSTIm/xAfNb0gv9V8j4SogVADCtXPp3dOgO7d8ey6/g/Ssezy4xsuQQANfve4wCA3bvfhT4S5Hue+P/4ZlpPgnwtG9G1Au1HuzF31lR0PwBinAAAIABJREFUF+vmRoyuZ66e9S2cqCdGCieNxweeNvcIIcmQV+f5HwlFxEd4vAHyZiiqOouuf5uRILr59bc2C5fftvwfy85v/fP/Csv2Nu3HY6WfBBC0J7qd0cW5JSs1Zpgf6Z2ZlV/+EZvFTm7lfY9EUeCpyuXF/PzwO17L3s3lgGFgfCRnJ1KOvJfu65B3Pq1pmqqcXuuejOPFYNqXv/PPtuNFIz/8FSv2obd3Jnp7Z2ZNTVdv79ncMhO9vVOyjyQ6jGH37suy66dgxYoCX/y9uAOHL+MCnPcD7VO7jaRIaXa0xxvAqb5+9MzSza9nbh9tAzz87fPQeddibMkaaVQjUYLK80iQn/5pAvpbmzE+M4DxmQGMO9VFn0+cPBWZ7h5TtEfMj5Rll4mTCtHbtB9/GjfHR0/87EgQU6dWvgNoWl9ULbswxkdCAcYXlI3+e6I/a7PYybF8kJEoUdSBA/A/MS6OzkMwGaEf8cbXeQj4wvne+eqc5Rbz8iX+vTFAbfMxEmST6F4i4czQ30iI+9HdPSO7LAMb23Z3n4Pu7r7s4znZMpOzj+fA+AHE0N29OLutANioeOYns8fffbpXX3p6MXf6VBROHK+3gjUD7e906+2BACa/NU7f0QIAbwB4AZi6fwJ6nulDd0Mviv/rZSQ3+b/+RXdB0jRN+LuwW0/ldyTIuFNdRnfPvjPQ+s5AGT8RGQCDp8aiYGqh9UOcOWl6feb0aUyaOAUTJxUCPe/SgxV9Ptue+GoMiPFRIIn60kZfQZX5y8+KawUNMxIlCvkbCQLo3Sic+wPyI0Wee05PvYluh+WVT+7jF+aWWOz9AHG+P75ztxOPYiPINp/8HMkr/7XXjqG4+FwcOQKww1KamoA5c6YBOBtAE4Bp0BMdb+PIkQVgmyWamhZgzpy3ceTIgG8+ABrtdUM3wqmTJqD7NHPnlwVAYfN4PRLcDXSe6cHkieNoGyDpJ8i2w/nhJ5PGO/U2cc302ss2Xp5HghDDO/1uFyZOMjJJ2pmTGD9xCga7e/DVg3XInOxAwZTZGJ95HRpgKj9x0iRoZ05CmTiFvt9zT3DScEBMEGA6RpPbHcaN1zHBL6XGGjoEHYkRlbzyyZfKfpnCNkHmtZPx+eV32mR09MQIm9kz2v/s7ggdhG9qxlOzl4CqJ0ZiMT0jrHq5GSrZz2988nMkr/xMRs2an1VHjhyCbnyHsmteyj6Ozz6qTNmXEGQkyNRCI5kxtXACupt70b0ga34LADQBPe/vA7LdhYnZsUoCwKvBjl8kJ2Pz2l3GdSRI4YbVtPAfPnsM2kA/fd3bP4iJkyaioGgWAKCvYCwyp7tRMGkqxp3S77WfOdVtfKixemj88d/MpOt6tjU49gRn+XvTzxjVWJqV4weIutSP4sDy+CcD8dPpBuEu7b4hu68gHjf2GQnfpseLYjNwIij/xrENkdwSf+esYHztvmfo7lWA/o9NhHgxQGV5sO9/795nxCfUp5YH5KfTbDscf77Z9DQ/bI79jaiIx88KxL/yfUdMJth+tBt4v5HwICI3Q6BiTa8NiP9rtNe/Xzld/9QA2/fu1wCAnTh4Zfvt9I2bk1+HNtCPqZnJdN3xwrFAQQE2/9cmuu5bX/wnTBg3xlQu/lSRab8A6OTHRG58khlWfmPcKUb7rD4pzPor68zlAKMdMSJ+mEmRcsX3OilMFPzPXLcGsz+o39WFHv+dXwbp5MyWI21+UfL/eHmZ/rNmJjuKbb6PdnJmy5E2vyj5okmBtDuz19+8Osdy0Xz/2XsEsneK2az/Ka4q+R5XTgU2GruPgj/+/K8CAP79w8bsbak79evv1XnM9ff0Gr254Y8j4/ofC+gzMvGTEwMwTTe3MfXvlunmZgimpfve//ynpRyeMhyYfJA9tY0aOy2eG3/95jrLfpXfLLfwReWi4KNkl5UP6/GLyuWK3zSE/N8+LDj+TbDwReUiOf4n66By+1Vxi/X4n6zD9jk5uP7mCa6/TYLrT1Aumu8fHr9/YPuN+yLn1+K/LfzkJgH/spF1/ReQOTnZyYLJnJz3VGxVKhuL6RAVkkWpXtVJMzZkeIlTuZ5tDaZ9Nze3YPbsaThQ26hJvuRLvuTni2+5eVFzcws6OrpQ2ViMnbN2awCwc9ZujfSfWfhEmQYAC58o00jfHS/lOjq6LLO/iyT5ki/5kj9UfKW8oso0Mzs7Yzs7YJn0nGbTyKQh0Ws5O47kS77kS34++DQJQmZm52dsj1p2HMmXfMmX/KHm036AxBlzLTuO5Et+Pvm5/uG5cfJ9/KOVr5RXVKF9736NTROTFHHUIagdR/IlP5/8fCvfxz+a+Upp6TJLCrq5uQU92xrQVK+PnyOP5G4Na9ti9JHcxtqt3DfiV9MUNNGePfsBAJIv+fniD1XkZydRF5DRdP7zzS8gQD5DUr2qk9yfC+VHVyok45IdroKDV9QpJOPipRx/gCxP8iU/n/x8K9/HP5r5liwwoHcWJH1xiGpLVGtHREFHaFG5wg2r6T6J7LJAki/5Q83Pt/J9/KOZb8kCs2niqzJb6RvCDEUp3ZEx7RewzwINV/75bfoQpyQzafsPNu/EAHrRUdJE101om4ZB9OMHG6si5T9+/WYAQGuBcTeO970LIAN84dfGRDY/u/R2aBkNR+YbUxi8F85/mKFoXvj51nA//+9VvuWO0DeVltE3trZ6vAumi0pL6e2E8WBrneMdYYcT/1ut5hsvDKIPg+hHP3oxiH4MoBcD6MMA83oQ/WjC02jCMziEP4Xi4x8nmfjaYAYYyEAbyEDLaEBGX6f1Z/TbAQ1q0DIazrzRhTNvdKG3rTsUP9/nv6UlzL2wDM2fb0QIdvx8azie/9HAt8wK92BrHa7KbI0MDugHclVmKx5srXOdFWq48L2a3yD6OfOrN5lfUL5n8xvUHM1vpJ5/P+b3oQ+JJ+ki61taVEd+vjUcz/9o4dvOCudHiewf2BoP12zoWdFiMaTSYlAyHgNU5w8RhO9kfvpz1vzqTeYXBd/R/AYzjuYXBT9KRcFfsWIFAGDPnj2O5vf889ZZCu34+dZIOv/vJT4dC9xUHw9dLUjE3Muc+2iV0lRvveW4F34iDaTSKpKKbnamRdG3JVzmSvLLNyK8PmHkl8FA9vkABtBn2W9YPjU/8veSMT9k9EXLZI3Qg8Kc/ygUhM+b3J49e7Bnzx5hGfIoMj8nfr41nM+/SAsqJ9MlH/yaS16mSxi+cFY40axMTkrEgO7sb3/qePtI0O+saCZGGqhJZiO8WAyJlErnjVVV67YawTXulU8SHrqx9WXb+fos5jeIPvTjTNb8evF/0YiD+KNtBOiVTxIeJvMbzEAb0I1O0zSAPCdRYEbD6dffQd/bJ20jwKDnXxP8UVECeIhXPklkEIlMbcWKFRYTdJPTrGz5luP5Dzg3DH+X5DC/P1YLKidj1urx9PXRhj40V59y/TxR8WsueRnnrzOyxq8+1oXEc4sD8WkVmPSfaaqPA5td9yXUz14C/n4J8LH5wB8F3ay233gHdmU7Kt5TsdW0zZEfi0FVVUBVEUsBsZhqGF52eyKlQlUBNak/ImatDnvlpzaX+TY/PTo8gwH0wk5e+aWZCb7NL9M36PTVBD7/IvMj6/2aoFf+3Sgzmd7zzz+PD33oQ6ZqbUGB5UZGJolM04mfb9mef01DTQ0/FaY38VMqBP79MSLm13csg/EzC9B3LEPN0M0Eo+Dz5gcA56+bhhq87GqCIr5wVjhTqtmnfvaSzYYAs6IRxRIq1JoYkADUmpge3bHmpuoRH1smluDCUB/85MblWfNjq75u5udS/fXBby3o9WV+2qARIWgDNlXhILPSOTQn+I4AffCVTcstVVjymq8OE2Nkq8CidkGnWdnyLS+/v5qaGpMR8qbotA1AqN8fERv5Hbj5hOlx1urxztXhCPis+X1s/ftMj+evm+ZcHfY7K1wYiaI/oiCzcqkq+Z8R1SUSCcSydWBVVfUvnSljlwvxyh/IGp2e/DhjMr8B2ubXy5hjH87B36APpzCIAbThxVB8P+ZHEiHjZhcikzXAvvaecHwv5pcyT49Ef3Y2c5P44QPm6I01NRIJisyQf59Xfr7l9vtLJBLUBBOJhLCM0zaisLPiDfZoGFOoIP4r3YjI42CPt9Malt9z5AwK50zEU1/XJ4Qijz1HzgTi03pEbYlqmagkF7qnYqtSW2J1J0e+yjT2QZ8vNBaLmRY6hyhxPpvJkrzySfV3EH3IYNBkfmzml5R5Hc+iGXtwGC9Ec/w+za/3rW70/rUb/W+fhOaQDwl0/hkpKnTj48zPJJtJm4Lw+aowv14kO2N04udbbuefRHXECMkj2UaMz626HOb7b64+hXde6Mdgj4aTrwyg71gGJ18ZwGCPhnde6PfUDhiGn3huMd7cfQY9R86g57je5NNzfBA9R87gzd1nPLUD8nzLrHB6Hdwllcp/sGwSxLb6S7TRGKxsNyuUG580CPNfOnnuOD2eR/5/bK6lxkYMz/yczQbr5vcGXnCM/PzwS7oV/+b3pl4VsYv8/PCxOS1OfHjwjQSYSBAwR4Me+WSEBys7w8tkDLcn7YIkOmSjxOeff55Wg0X8fMvu+g/TBphIJMy/hwh+fwCEVV0v5heW/+8rf4MP/10cHU09mL1In5ecmOHsRYX4P79K4+u7P+uLTyNAMrC46qEt9jsIqaqHttDGTl5e+Jqm6ckQgD6yz1VVdcyYeeUHMb8WpJ3NzwffYn6a5mp+fe09zubng28nzUM3JzJrMI0OmWgwKN8uCmTNj7zmq8ZseSd+vuV2/kVtgKKFbBMp7Pe/oHIy3l85GdMvHoeiC8fSZfrF4/B+D11iwvKnD56HVx/rQuGMMeho6kFHUw96jg+icMYYvPpYF6YPnmf7Xju+ZSTI2raYaWydnV7eeT9+vn4Nfr5eT1m/dcK5PElBu/UEt+MT86upqUEymTS1dSQSCSSTSdTU1NiaoB/+kZKXPZmf0Q9wwPV8+eF/4ddbTOYHG/PL9Gdom1+UfKfvn5igyeQ4WX5+KX98dmwvYE6AEHPjzQ/QI0BRO+Dzzz9Pu8AM95EgbuefNbdEImFanBT2+ycJkJmrx2NMoYIxE5mlUMHM1eMdEyFh+SQBcv66aSicMxGFM8YYy5yJdJtdIsSOH2gkyMs778fLDY+jvtHdKHkF7Qmuqipt7yNGyLd7sNvD8r2Y3yH8CYfxgmvkF+j4WfMbEJsfafNzi/yC8JW4QxeYmF4dJj85S7WXXZ+EKQr0+/2zXV8ymQz27NlDR4IAuumxBslni/mEyEgdCcIbnMjwyDonMwzy+2Ozv1MAvNuj4axCowZLXp8EXLvEBOGLur4Uzpko3L9blxieTw2wqT5O7qvl+JcxjPkBek/snbN2a+ztarzw4/E40um0NfObFWt+8bh9Hw2vfDfzG0AvMnDvexeUz5ofP+wt029EP04JjzB8wJsJkloxb4KkKowU9HbAEv98wGxgpI2PPJIoUJQhdhoJIuLnW3bHryiKsEbDJkXsJGoP93v+TZ2ej2WAmQU4q1DBu0zWl5phdruTCfrls+ZHMsB2ItudTJDn+x4J8vP1a4Tm9+pR5+4vQDQ9wUkGWCRVVZFM2vfB8Mqf1DbTZH5Gtte4+8sbeAHNHtr9gvB/VvZ1V/MLEv1FPhKEiezIz9ASCTIRYNXmcCNBAHN12C4i5MsSjdSRILxIYsRT4o9RkO///ZWTMXP1eLzT0Ieii8dR8xNFgO/2aDjxQj+mrx6PYw19eIMzwCB8YoCvPtaFGYvH0eSHSB1NPTj+cj8tzxugiE+vFtI4uP3GO7ycy0DafuMdtLGTl1e+qqrCKq7d+iB8N/Pz1PE5BN/O/LSM/seRjhLxGf0FPf9K3LoA0M0t+/emBmbzo22EKaNcUD4xMr6qS8yPDIljq8OiCNCJn295vf5JNOjX/AD/539B1vwGj2WgATjxQj9OHstQsyPLWYUKTh7L4MQL/dAADB7LYKagPdAvn5hfR5P+R/74y/30OS9ifuS5qD1QxPc9EuQLdweL/qLoCQ4YoT+pApPEB7stLP/7G78mND+2MzQA+uhJPvjt88YLzY+8pjc+8HgDBL983yOBktakiOmbSPnjszczBcRte+RRZH7sdqKRPhIEMMxPURS6eFaI779r/wAOV58CudqI6ZGFVIczAA5Xn0LXfkFSMAT/+Mv9nvr4AXpfQWKEXvg0AlzbFvN8UZCbHbx61KP5Mbrt3m9q7C2sg/CJ4ZF2P3ZdVHyR+ZHESAv2oQVpvI1XPDGD8J3Mr7+9B31/PYn+Y6dzxvermmwkaDHBpHldED6f0bVr4xONH+Zlx8+3vJx/36YnUJDzz64cBIQR4KBN+Sj4UYrnBx4JUqPqxufH/IDwIxHCyitfbH66KWYg+AuT1XTMi4TvGPll7K+TMUXjbbf54YcS2wybMswxDN9uDDCRU+KD1UgdCRKVgpz/ogvHmqqzdhEgoFebiy4cK9pNYP6MxeM83/aq5pKXMWPxOM98y0iQwg2r6cZ0usET1E3xuLHPnm0Njj3BvfDZccBEfFY4Cv6S9A2c+fXiTfwZb2K/MPqbjnnIIIN38VYk/DfOedNifv1/1RMfouhvTNF4QAMGu81V86jPv5MSKW5McAqI3x+Mv3fvM775Ii1f/klXfr41HH9/Rz/8PGatHo/BHg2DZzR07x/AtAvH4qyZBZYs8LvHMujaP4CpF47F+JkFpuFxQfmJ8dU4f900Otrj+Mv9tokQ0gY4Y/E4FM4YQ8snnlvsyKcG2L53vwYA7MTBK9tvp28MMylJ/Kki034BWCalDsJPHNHv9V/45Odyzm9tOwAAeHzjzx2P/8G2L+kGGDH/oUW3QDsziHc/PseR/1/vfkY3wCE4/7bffwpAW7T8MJMieeHnW8P99/erv/scFABvTLuArvv4stcBAH9b+aip3PSLx+HPry2MlL+oVK9ZJT55PV33x+m/0Zl3v2QqN2/lRHx6/NWe+GMB8eTMAEzTzaFkl3VaOlinpROVw1OGA5MPsqe2UWOnxQvCr6nHkPFrS+Dx+H+cm+PHfR75v8X224bm/Nt+/23R89fPq7PwlU3LLXxROTd+vjUifn+/+qVlv38QTEuJX/0S26fl4PcH63SXH6v/rHVaTKhIjPfOLyBzcrKTBZM5Oe+p2KpUNhbTISoki1K9qpNmbMjwEqdyPdsaTPtubm7B7NnTcKC2UZN8yc8n3/KrG2Ll+/hHO99yW93m5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJT+f/Hwr38c/2vhKeUWVaWZ2dsZ2dsAy6TnNpqpJQ6LXcnYcyZf8fPLzrXwf/2jm0yQIqQ7k+qKw40i+5OeTn2/l+/hHK5922CHOmGvZcSRf8vPJJ1nIXGeH7Tj5Pv7RylfKK6rQvne/xqaJyZcTdQhqx5F8yZd8yc8HXyktXWZJQTc3t6BnWwOa6vXxc+SR3K1hbVuMPpLbWLuV+0b8apqCJtqzZz8AQPIlX/IlPx/8AgLkMyTVqzrJ/blQfnSlQjIuB6+oUwDg4BV1Csm4eCnHHyDLk3zJl3zJzwffkgUG9M6CpC8OUW2JtSNik6AjpKhc4YbVdJ9EdlkgyZd8yZf8oeJbssBsmviqjDF7e5ihOKU7Mqb9AvZZIMmXfMmX/KHiW+4IfVOpcTfe1tZ9iEKlpcvo8wdb6xzvCCv5ki/5kj9k/PKKKixqhIaNca28ogr16NSqSnZp0G/rFdlSVbJLq0enVl5RBWyMa4saoZVXVEm+5Eu+5HviH/vO0sj5nmeFW7VQb0hsPGh/O3EvZYLOCheVJF/yJX9k8md+5wB9fnKzkTmeslHPJh/7zlJTGS98Oha4qT5uO1HMqoXFaDzYicaDndTkgpQB9H46TfXWW3478XlNriyzLF4VBR8Aupe/SBc/ioofVGH4l53/Ucd9u20Py2f1wgsv0MWPRvL5zyd/1aI5dpt8lYvi+In5FW7cj8KN++lr1vyOfWepJ77rrHDE2Fjx67yUAaKZFQ6JDwAbqjHtlXq6quuCS4FtlUDNYfv3RcWHbn5Tbiilr0/+pBVT917k+J4o+UEVlr/9Cx/BkwcUPP3qsyazI68vX6qh6ud/yhmf6IUXXkBJSQl93dbWhosvvtjxPVHyAWDdunX0+WOPPeZaPmp+EIXhs8bWfGoibr/9dixdqpvMgQMH8PP/vpNub2w6Eimfj+xObr4QhdmoDwB6Nl9Io0C/x+86K5xddbbxn8vw/b+7CNd/aL54u+B9oWeFS3wAv6s4BLzbja4LLqUL3u3W1yc+YP/eKPiwmh8ATLmh1FMkGAU/jMLynzyg4PKlGi47/6NYfM4ZuhDze/KA8x/wKI6fNz8AKCkp8RQJRnX+161bh0ceeYQurBkOBT+owvCJqTWf0ufl/f73vw8AWLJkCZYuXUrX25lfGD4xPzaq68lGfT1MVdgu6nPi+54VDgDu/OwybPqNnqFpPnYKC2ZOdiwPIPCsUGw194/3vIQf/P1K/G7c1Zj2Sj1dfjfuavzg71fij/e8ZF8tjmBWNNb8lK/MMD26mmAuZ2Xzogj4i885Q01w/qwJdCHmt/icMznli8yPyNUEIzr/xPxYeTLB98D3f6DdPNXCddddh5deesl2e9T8CWMUU9sfa37sej98mgRZ2xYD7o1plddsd9xP1y8+iGmfr0PXLz6Iz37zLfxm6wxM+/xr2fWvOX8ImMfosbLjn6quw5TvfR6Z9hO44pf/jHerdmNv83oMvNJGy3wB69FVtRt7fnkrAKBgbhFOfusXkfB59bafxIS5U3BmYysA0Mfe9pOO74uKT3TiPuOW70W37PX0nrD8l/86MWtyE/DwJ/+E6575CH1cfM4ZvPzXiTnlA8Dp06cxadIk4Xoviur8f+QjH8Gf/vQn+uhVUfGDKhf86667bsj4hTZV3Z7NF2LCGPcmRJ7va1Y4ktzo+sUHTevJa6fkB5HfWaEmV5Yh034CBXOL0P/CYZxVeCsyx7pRMOcsumSOdeOswlvR/8JhFMwtQqb9hG1iJMysaFP3XoT+XcfR234Sgx19OPmTVgx29KG3/ST6dx331A4YxaxsJ+5bjqnLbqALa4ZDwe85vxzXPfMRAMB1z3wEPeeXDwn/4osvxrFjxyxmd/r0aRw7dsxTO2BUs+J95StfMT16VRT8mGAZSn5zczN9ft1115le54LvVrUFzMboVN51Vrim+jjtYc2r8Z/LsOk3+7D2b96H2r+8RavC5PWCmZOx4/kW4XsB0DC0epX9rFAiPokAAWD86gtM0R/R2AtK0Negz9RmGwEG5PPqXv4ixq2ZQV97Nb8o+MT8LJ9p30/cI8EI+Jed/1G8f3oPSi/7Aj7/2uv4xQfPQ+vTP8cb7xTi6VefzTkf0KvCM2fOxKRJk3yZX1T8devWYdu2bfje976Hb33rW9iwYYO3REhIvpZOIB6vwRfXAF/bYsy2/F931OB/dgHpdAJKXDwzYhT86dOno6ioCADw2C0Gf919OvPEiRN45513csbnkx+8XJMhAj6NAEnjYNVDW2zfv+o/6kzm98KhI1gwc7I384M+gRFp7OTlxM+0n8Cp6jqcqq7DwCttGHtBiWUZeKWNliFmGRWfiHR7GbdmBgY7+ugybs0MT11iwvJZ84v/+SumRy+RYFg+oGd833inEEeffRz3du7H0Wcf92Z+EfBJt5eioiJaDZ40aRKKioo8dYmJ4vgBPeu7YcMGXHLJJd7NLwI+a35KXI/7lHgMX9uSwBfX6NtzyX/nnXdw4sQJk/kBuhm6ml8E/CBio0ERvwDQU9BN9XE6qQg7to5o1cJirFpYjNt/pf/IXzh0BLV/Mea/3fF8Cy0jEklB31OxVWmqj5vu4eXGP1WtT3s4ubIMBXOM9h82EiyYM4lWe0n5qPiAkQCZckMpJsydgjGzx9NlwtwpdJudCYblE53pbgcAPHveRtMjWW+nKPiXnf9RmvE9dXqQLiQz7NQPMCyfJEBKSkpoFEJUVFREt9mZYBTHv27dOroAwCc+8Qnh+lzxqVQVWlqvxmlpFVDdJ3qP6vh/+9vfAgAe2fN70+Nvf/vbyI/fS9XXTSSDbMf3NBJk1cJiGvEBwLe//S/47nd/AEDPApPXbBm77jNBe4JPrizDqa9+DdNe+TW0njNQCgcw9oJpAE5C6xmLgpkTcOqrX8NkiA0wDF/U9WXC3CnC/U+5oRTdeNG2ShymJ3zRLXtx4j4AC9dAO9mB052NwKRFOAOg/+AuT8mQoHzS9WX+rAlYuXI+Lp9qHH9390kALWg52gvgo47RYBC+U/aXFzFBuypx2JEQ27ZtAwBs2LABZ599tmWdm8LwVQDYBUzsVJFggrCaGhX/o2a354g/ffp0fOITn8CSJUuAJUtwbXb9tSs+gYUVX8FLL72EZ555BtOnT3eMBP3w3UZ1BBHPpwbYVB8n99USZmlIxPftb/8L2l77M750zaX48aP1ptebHq3H2r95n+MHOPfRKmXnrN0ae7saN75hfvUYeKULYy+YBq2HfnQohQMYeKUL01CPLhcT9MtnzY9kgO1EtjuZYJDjZ0VMcNzCNcCU2QC8m19QPm9+U6dOQfG5TFeFQ2msXDkf2N0C4AycTNAvn5gfSXzwGeD+gQGMG6tfC6SMkwkGPf+k3W/Dhg0oLy9Hebme+CkvL8fvf/977Ny5kxqhU5U47PcPADUq+R/z2qOC8Enb3/e//33a+XlJhZH8eemll3DdddeZInM7Ewxz/FOYUR92293E8z2NBGEjPmJ4AEwGeOD1v2Jv+hVa5rvf/UEkI0EmV34K41cvBgD0NbyEgrnTMfaCaei64EpaZtorv8bAK13ItL+D8auXZMu+jFPVvwvNJwZ48ietKFg2BZOXzsDJn7RaRoJMuaEUpw4cR2b215XPAAAgAElEQVTfSVqeN8CwIwFIG9+4bARIpEyZjf6DerXByQiD8Fnzaznai4ovLjObX1adh9K493/20XIv/3WixQSD8IkBtrW1oaioyFL9NZ2fEydw4sQJWp43wKDnnzW/Rx55BNdeq8c/oueknMgEw37/MQAJh5RvjUsUGITPJj5YPfzww1iyZAk1P37bZz7zGYsJRjUS5iSX7OBf2ynQSJA7P7sM3/3uD/Clay51BQDAl665lFaHeQXrCa4gc6wLfQ1/wfjVS2j0d9benXTResZi7AXTMH71EvQ1/AWZY10ArBl1v3xifqcOHAcAZPadxKkDx00ZYAAYt2YGNT8AOHXguLA9MExPfLbry8Spc6FMmU2XiVPneuoSE5Q/f9YEPHlAwanTg+juPonOQ+a/3p2H0ujuPolTpwfx5AEF82dNiIRPzO/EiRO4+OKLqcEJz092Gyknag8Mc/43bNiAlpYWXHvttZYIsLy8HNdeey1aWlocq8Fh+DEAX1yjm9wZrpn9TLG+/otrnLvEDMVIlIcffjivfCf5HgnS+M9leOHQEaz9m/fhx4/qY29JJHjg9b8CAI0GSfT340fraVugaZhcgJ7gpOo7sP+vGHuh3gZEqr5K4QBd2PVjLyzBwP6/6u2BbF/AED3RM/tOmqI5vhrMvp669yJqhCaF4Iu6vkycOpcurGxNMACfJDya3jwFAHjjnULUPNJk3TeAmkea8MY7hQCApjdP0cRIJMdvY3p2EpYPyCfRHwDMnz8f27Ztw86dO7Fz504AoM+3bduG+fP1633btm3WhEDEI0HOFBuLJwXgs9HfiRMn8PDDD9NlyZIljriioiJMnz49Z8fvWzZ8GgGubYtZekmT4W61f3mL3ulFJGKGpAw7TI7Xbfd+U2NvYe3EB2C66UHmWBeUwol4d3k5ui64ki7vLi+HUjgxG/lZ3xeGH7X88lnz4zO9dq+dIsEgx++1mwtgdJOx00g6/2zVl1RpRW2A5eXlNPIjXWSEJuiTT0SiP14TBT9HtyjQL//hhx/G7bffjnfeeQef+cxn6HoyBG7JkiU06jtx4gRWrlxpKheWH7V4vuNIkC9dcyk1P8BoDyTRIADa9vftb/+L6X6AtX95S1htDtMTvWDmNHRdcCmKdj9mWbouuBQFM93nFg3CL1g2xfNtr7qXv4iCZfaJkqDH373vJ9BOdqB7308AAKffPmB65LdHzY9KQfikn58XkX6CUfJZsRHg22+/bYoAvSgMnze8M8XmdSJDDMPfsmULvdkB0XXXXYfrrrsOfX9ogFr9n1Cr/9NkguR9UfDtxLf3eWn/s+NbRoIUblhNNxa++xLW/s37aN8/YoBtr/0ZP85mfNnM8I8fradmSUaNNB7sRDxu7LNnW4NjT3CW/8qHx2HshedgYH8bgAKMX60nHtgMMD2QbFW4r6EVQMaoClfXBeb/XrkbU24opUPfMvtO0kQIoLf1sc/J9jGzx9PyU/deFJjfcHM3pi67AaffPoCBt/eZkh+k7e9Md7tpXf/BXRh79jJMOnspHR0SlD/9ZB+tApOo7v3Te7AhudyUCOk8lMa21F5TmUXzJtNbZwXl//CHd6GoqAjjxo1Df38/Tpw4YZsIIW2AfPmLL744MD+dbsC6detMCY1169ahpaWFVodJ2+D8+fMt5cjrMHzASH6QJEdKEOKVPd6MqxYsMJUjCsrfvv27NNGxcuVKWiV+8OabMGPa2Rg42YmxU4pxvOttxCr/iZb74Q9/iKVLl9JESNjjDysnPjVAMmM9O3HwyvbbjZPRtka/x981Rrve9U93ovnYKSw7/b+O5eJPFZn2C4BOfkzkxn/w336D/hcO49S0Y3TdtGV/CwC4sfIqUzkAePc1IxsaBf/Os/W2tqlrbqbrtLl6lnn9XXtM5catmYGJ+Fyk/O/esRHjFq7BpD88ZfCvuFHnf+5cUzkAKHrLqE1Ewe+Z9696Vfjzxh1fjn9K74y2+e9LTeUWzZuMqg/2Rsq/5nG9PeninUb3i7du0b/r/7j4JVO5mTNn4rwd10TKf/NDD+iGxrRPtdz8ODZs2IB5z99sKldeXo4bDv13pPy7N34LAKC0GW9r/pJusP/50VdN5f7rVyr+abnxOaM6/meeeQbvfNW41v48O4GLpvx/WL/xjKlc58u70bhuXqT8MJMiOfHHAvqMTPzkxABM082hZBe2X2Oebm4HrNPSicrhKcOByQfZU9uosdPiufK/AcG0eLDyBeWi4G+Cdbo9pf5TFv4mqNiOmyPnf3vLZiv/Cevxi8pFwa/FXXia2++M31n5tbgLVZdGz3/0Kuv5f999n7Xw9XJfif74nwewsdm03/kPXIWq57dYyt2wKPrjX7/5e5bjX/DjdZbjF5WL6vjf+ar5+P+2Hqj6d+vxP3Zjc/S//5Jd1t+/nf/4OP4CMicnO1kwmZPznoqtSmVjMR2iQrIo1as6acaGDC9xKtezrcG07+bmFsyePQ0Hahs1yZd8yZf8fPFpEoSoubkFHR1dqGwsxs5ZuzUA2Dlrt0b6zyx8okwDgIVPlGmk746Xch0dXZbZ30WSfMmXfMkfKr5SXlFlmpmdnbGdHbBMek6zqWrSkOi1nB1H8iVf8iU/H3yaBCEzs/MztkctO47kS77kS/5Q82l/EuKMuZYdR/IlX/Ilf6j5SnlFFdr37tfYNDFJEUcdgtpxJF/yJV/y88FXSkuXWVLQzc0t6NnWgKZ6ffwceSR3a1jbFqOP5DbWbuW+Eb+apqCJ9uzRe3BLvuRLvuTng19AgHyGpHpVJ7k/F8qPrlRIxuXgFXUKABy8ok4hGRcv5fgDZHmSL/mSL/n54FuywIDeWZD0xSGqLbF2RG2qt3ZEFJUr3LCa7pPILgsk+ZIv+ZI/VHxLFphNE1+V2UrfEGYoSumOjGm/gH0WSPIlX/Ilf6j4ljtC31Rq3EOvtXUfolBpqXFz1Adb6xzvCCv5ki/5kj9k/PKKKixqhIaNca28ogr16NSqSnZp0O/Nb1piKU243stSVbJLq0enVl5RBWyMa4saoZVXVPniH/vO0rzyO9Rg7Kj40PLMZ5bBwUHTMtT8fB9/vvlLHygyLaPt+KPie5oVjkhNGqYdS2mW9bGUZiojUphZsdhZosjkKKtmvzhk/NnMmOsO1bq+QzWXiZpvusu/JlivQTQTQHR8Tg888AAA4Oabb3YpmRt+EL0X+EsfKMKBm0+4rssVP4zC8jVNs92mKC4Xv4BPxwI31cctYamdiPmpSX0xXosNktW5j1YpTfXWW1774RPzm7Lxxbzwifm9/At9Ia/tDDJqPjG/i26ai4tummuYoZ1BRs3PKplMIplM+nlLpPwgCsqPaRpd8sEXiYQ3+eCnUinh81zxNU2DpmnU5BRFMS1sGT9811nhAGtkpb9mt8M18gKCzwp17DtLLdFfYfYusAq0nPP5yK5D1Y2PaPHn3SO/MHxLZKfp5kf04oPtrpFfKL5Ag4ODGDNmjOV5TvhBPEdwPoLyRaanMtGGnSmqXEQS1fkn0R77d89LBBgVP5VK0T98xPySyaRpfdR81vzcZFc20KxwgLmKSxRLmR/57SIFnRWKmB87U3zP5gup+eWaz1ZxiRZ/3vzIb4+Sb6riZvXig+2mR357pPysBgcH6fLAAw8glUohlUrhgQceMG3LCT/pY4mQT8xNVRS6sOudxJcZjrOi+eGT75t9TWoB5DlfJkq+H4kiQd+zwokkMkF+vVARzAo1YYximhj55GZjprah4ANiE+TX55IvMkF+fS74JMojC7nwycJuE5pgLmYF817zCsRnzY8Vb4KsObImmavjF0V6ru1/EZ9/PgpkTZA8j4rPR3TE3Oyqu8JI0YZPkyBr22LAvTGt8prtjgeu2vyFjXm8GO1mfvLKL2QmQFEgNuNc8tmqLyvWDHPJZ6u+rExmGDHfaxWXiJig6D1hj58qBT3aI48eFRk/oPzylz5gnv/Ezejcygc5fr6a+9xzzwEArr/+ero+nU6juroa6XQaqqraVoWjOP+KorhWie3K8HzHWeGIXKMrgGsTtC8fZFYoturLSmMaenLJd43uYDZGp/KBZsXy0AZmMkaH8iNxVjihktzjUPMDyg+ftOuxi5v48rwhhjn+66+/nppfZWWlaX11dTUAIB6P47nnnkM6nUY6nbbsI4rzT4yNjwDdIkMR3zIrXFN9nPaw5sUnP6zbXZIRG43BynazQjnx2eQHPQAuCswln09+8HJNhoTk88kPXq7JkIB8vxGg7XuCHr8GsdHZRX8piM+DT75dFVi0zS1REoTPJzv8ypIcCXD+2YivsrKSGh15zq7jVVlZiXicqc4G/P6DJkAs7xPwaQRIGgerHrKf0zOI2Gis6qEttLGT13uVz0aD+eCzv56wfPIX3esjr8iOnzR3JLnXLsrV+fdkfjnke1UQ/nPPPYfKykpqdDt27EBlZSVUVcWOHTvouksuuQQA6KPIGMMev1s3F1FkyD4X8QsAPQXdVB+nk4qQsXVeqr5uIhEZSUHfU7FVaaqPm+7hZce3q/oOFd9L1ddNJCIMwg/8p5+VEoLPKR6PI51O07/qbq9ZheIrsJpcintk1zt0gQlz/G5ySoKE4Ss2i9ftQflsIoOYGWn3I9VcvhwxTGKMURw/Pc5snz87I2T7CPLr7PiOI0G89K3zKz89wdm+fyIpARzCD99L375c8r307cspnxMxNy+PueBTJW2ee5AfvqootPOzqN+fMNsbIV/Uhhc2CRLk/Kuqaqnyso/kOydVZbsqcVA+L7aKy69zE8+nBthUHyf31bJ1FTWpOEaFXgzz3EerlJ2zdmvs7Wq88qds3G/qBhObPbT82THnqNCLYYbhQwFe1ByyvR6ugTB8NtJze7TrDxiYT7Y4GZ5d218IPmuC/HpeXqrCfvleEh9+yvvl79ixAzt27EAqlTJFdMTkqqurTUkQtkwUfCJROyCb6SVm6GaEPN/TSBBe4pEhuRuJwevk5gsxhUmGDDVfNDIkpyNBeAlGhuRyJEhUSZBIjt8pIeJyDsLwWXPzan582ZE6EoTv58dWeb2MAAnLB+wTIawB8tv5dYFHgkSlkd4TXvKHAZ+0B7JtgB7MLyzfsZMzxJ2h+bIj9fyLzI0dB+51PHjY47dLgHgxPzu+75EggZWLkQCSPzr5pJU/BXGLf675QfQe4Ps1vCj5dgkQ9mYIREKjjGokSFiNtJ74kj+M+QGSRO+l4w+SIxvpx++UBebLeeFTA6wtUclEIq6pVb69zU+2+J6KrcrCJ8o09j7+fvlTuM7QQ83n2/v8ZIuj4FuufB+/hKB8p5sc+FEkxz/K+UGyw1HywygKvteMrxe+ZSRI4YbVtHA63RAYxCoeN/bZs63BsSe45Eu+5Ev+UPGpAbbv3a8BADtx8Mr22+kbw0xKEn+qyLRfAHTyYyLJl3zJl/yh5o8F9BmZ+MmJAZimm0PJLuu0dLBOSycqh6cMByYfZE9to8ZOiyf5ki/5kj/U/AIyJyc7WTCZk/Oeiq1KZWMxHaJCsijVqzppxoYML3Eq17OtwbTv5uYWzJ49DQdqGzXJl3zJl/x88Wk/QKLm5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJV/yJX+o+Ep5RZVpZnZ2xnZ2wDLpOc2mkUlDotdydhzJl3zJl/x88GkShMzMzs/YHrXsOJIv+ZIv+UPNp/0AiTPmWnYcyZd8yZf8oeYr5RVVaN+7X2PTxCRFHHUIaseRfMmXfMnPB18pLV1mSUE3N7egZ1sDmur18XPkkdytYW1bjD6S21i7lftG/Gqagibas0cf0SH5ki/5kp8PfgEB8hmS6lWd5P5cKD+6UiEZl+xwFRy8ok4hGRcv5fgDZHmSL/mSL/n54FuywIDeWZD0xSGqLVGtHRHrrR0RReUKN6ym+ySyywJJvuRLvuQPFd+SBWbTxFdlttI3hBmKUrojY9ovYJ8FknzJl3zJHyq+5Y7QN5WW0Te2tu5DFCotXUafP9ha53hHWMmX/CjZ/GcYKccv+UPEL6+owqJGaNgY18orqlCPTq2qZJcG/bY0kS1VJbu0enRq5RVVwMa4tqgRWnlF1cjhO/0bDccv+XTRYjHH5b1+/MOBH0trpsegfMdZ4XKhSGYFG2q+Bud77rltD8uPUCOZn3K5CSYAJF3uFReGr8XM97BTVFW4XovF6LYo+VEoV3ynaSpzwVfjCmJpDWrc4w/Phk/HAjfVxy1hqV+RO7U63a313EerlKZ66y2vo+DjaWaJis+am+hvC2DMWOZBOT3+IeR/uvo84fNc8FOaRs0vqSiOC1s2Kj5gNjlFVU0GR16z67VYzGKMYfhuan7x35B+Zjt9zr7ONZ9Mg0puT0+MTzQ96nC7/gPNCicSOwmJ3QxOkc2KJtLTAC4TPA/D581P9PV4KROUH7Gi4n+6+jw8Vfk6fQ4AT1W+blofFZ81Pj9KaZrlPUGP3y7ycxJvmGH4XtT84r9Z1h09NgHxT1bR17ngp9NpxGIx09SUgHHrelVV6XSpw/H6j2RWODvD45WzWbFsDC8yvl0UCPiK/qI6fjbS5pdc8j9dfZ4l8nuq8nVqfqIyYfhBzY+8h48Egxy/KIrzIpFJDuWscEePTRgSfix7fuyuvRhz/vzyY2kNsbS+X+VHA6bydtc8Kce+14kvZ4XzwydGSBaPxhcVn3zhbFWDr3bYGmHE518UBQKwGGJQvsj8SPXWaWFlMsEQx89Xee2qt7xMJpjD65+N/o4em0DNj43+hvL3x0eDQflqXKFtfctWjLGYoIX7owEsWzGGtg2a2gdzOSucaGZ2u6gwJ7NSXQaj3c+lGjxSZ8Xiz69IvAlGdf75au7b+04CAC66cS5dj6eBix6ZCzwNfPpV+6qwHz5vfvw6XnxbYVi+W9KDPLpVibVYjFYgor7+ePMDOOPjNBKvfzWuQPnRALRbqV0JJ0PXbh2LfVw5Nz6tAteWqJaJSvyI/SBOP9J7KrYqtSXWCyYs32R2DtXhSPh+Ir8I+HbmZ1sNyNH5v+jGudT8Xry23bT+okd0M8Rl0MvYJKO88nnzI0kOJ7FlWCNkI8Movn/e8JyiQb6sX35zkaWosc2n+QXh+5Uw+ouAz5oae83z17+T+Yn4llnhmurjtIe1X7kmQjYag5XtZoUKw3dNhETE99rmaVFAvojn1u1AaJoB+GzE9+K17dToyHN2Ha8Xr203fwcBj59NaDj9uBSBaZrkk+8lwhMlO0RlFFUNdPzEABdws14GMb9c/P5IEoSIN0A2CRKWz17TmqYhmUwilUoJa6Bej59GgKRxsOqhLY4H7LfhnVXVQ1toYycvr3xTVxeXLi854YdQEH5QsxVm4QPw3953Ei9e224Y3kP680+/eh5efMhYd/ayKQBAH0XGGITPRm9O7Z+iyINvE8zF9893fXFSEP6CE2bzay4yzM+2vS9CvkjpdBrpdFr423fyA798ksggyYyCewfpda0oCjU/8lpRFFM7If9+Eb8A0FPQTfVxOqkIO7ZOdHCihnc3kRT0PRVblab6uOkeXl75pnY+srDrc80PoaB8O/Pj14siRHZdED6byCBmRtr9aDWXK0cMkxhj2OMPkgEWaai+fz5BQp6H4VuqwR/7hr5k5cn8Ijz+WCxmivpUtk8k933xXWD88Ekiw2sihE2CsIkQNa7Y8n2PBBH98PxEgqF7gvPVWpIA8RgJRtETXVVVYSdPwPjCo+Tbhfd25uj0XQThf/rV8/DUta+bqrzs44vZ7+CifVmTtKkSB+UHNUHR+3I1EsIuQRKG31xkrfouOKF/vy1nKegq34hLT5/09TmjPn5ihKqqIhaLWfoCRsXnEyFsGyANxDwkQQKPBHGqivERoZMC9wR36uvHR4S54GeVTqcRj8fpAuimR/4K2hljGL6XSJttknD6LvzyX3yoXc/+MlVeAKZHNgny4kPtdImCH1R2pumH77VqK3qPnfzwifnxJqgoChacgG/z88vnRa4v1UNHcFVVkUgkkEgkouNzxia6xt2SIIFHgvhpi7KLWEL1BPfY2ZmWhbV82J7oxPxSqRRtgAX0v4LkoiB/EUWRYBQ94e1M0Mt3E5RP+vyxj0ReRoCE5bMSjTZgX0fN95LksP2sXBJlOI6E8MrnExuAOfpzq/mE5fOfhU/40bZAhwgw9EgQpxEIfFJEdDGG7okuSoDYJUUEZhlFT3je/JLJpGm704UQBd+pE7SbgvJF5kY6PNttj5LPSnS8Xs9BED7fAdqL2HZA9v1e+WQsL2n74//oOXWNcVKY889GfbFYDPF4nJ53L+YXlg9YR4OItpM2QK98zyNBnLJvnn6QYXuiX+ZziZqfFTE83viSyaTJGHPFD6wI+H4NL2q+Xc8DTz0SQo4EoaysudmZoa1J+uAvePwx07HxWnDCbIKeDDHE8ZPPQEwwTBewIHyS1CBJEDbaYz+PdutY7NszSJMmJiPM5UgQPxqJPdFZsdVgAKZH3hRzwQ+rkc53SgR5ScQF5YvaA/10gA7KbzlLwev9U4T7IkkSvo3QSUGPn9zwIKz88ImBkSFtbPWWRHt80oM8t7tNFs+n76wtUclEIiHGObjrnoqtysInyjT2Pv4jhU9Cfb6an06nnaO/iPhRSPLD8f22A4bi/zHb2fnD1r55fBSYE35WURhfED5vYhajS2uuSQ83vmUkSOGG1bRwOt3ga+d2iseNffZsa3DsCT6S+F67wrxXjz+XfBHbLRHntJ18hpFy/ADw2AOfos9f//CWQFnfMPx8H78b3+sNUZ341ADb9+7XAH1GJkCfOm5l++30jWEmJYk/VWTaLwA6+TGR5Eu+G1/TNCiblo/K4/+HHc8i/skto/r7zwV/LKDPyMRPTgzANN0cSnZZp6WDdVo6UTk8ZTgw+SB7ahs1dlo8yZd8N76yafmoPf6fXg/akD8ajz9X/AIyJyc7WTCZk/Oeiq1KZWMxHaJCsijVqzppxoYML3Eq17OtwbTv5uYWzJ49DQdqGzXJl3zJl/x88Wk/QKLm5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJV/yJX+o+Ep5RZVpZnZ2xnZ2wDLpOc2mkUlDotdydhzJl3zJl/x88GkShMzMzs/YHrXsOJIv+ZIv+UPNpwYoJSUlNdpkaQOUkpKSGi2SBiglJTVqJQ1QSkpq1EoaoJSU1KiVNEApKalRK2mAUlJSo1bSAKWkpEatpAFKSUmNWvm7m6CUlNSo1s57ezSn7eUVhTkdyRG1pAFKSUl50s57ezTcdx+gaUBBAUCmgLjvPuDMGb3MbbdpuTZBOxMOwg1sgE/86G7Th7ji1vVD6vySL/mSP3T8nff2aCBTPojuuj1pkv6YSmFnMpkzE6QmrCgWAw5ivoHaAPmTb7cuV2JZV9y6Xrni1vWK5A8tn3DzzWfXjSa+l3VRyWR+XnTffa5V5VCfw86AUynfXN8G6HSih+IisGMM1Y9Q8vUf/3Djk22jgR9kW+RiZ0C85RbjuaZByWQix1lM2I7v03x9GaCXE5zLL8Ft37n+EUq+/Y9/OPBJmfcyP4oyodTfr5tPLAWkskssZRiSokAbMyavfD+SSRApKSl38XNeJ7jnSUGZXH6GiPgj3gCHNOwfBhrqxvbhLv58jLbrQSqcRrwBSklJDYH49rcaGFFYjU2ZXH0GN74Ptq82QC/RRy4jlOHO99JGFJbv1ggu+fnjkzK55EdRJrRSKUBN6kaTTOrP/WSJhxHfdxbYrRE80Kd4D/Bz/eNj+XbdICQ/f3yybSj4QbZFLtZwhsD8yisKFVNkZ8dPJn11iA48J8ho6wgq+ZI/mvnCvoDEkATrc9oRmq/qplL66JRbbvHNlZMiSUlJeZJtX7xUCshk9C4oAUwo0OcQKAhXGqCUlJRnyZshSElJjVqNNINzk7wfoJSU1KiVNEApKalRK2mAUlJSo1bSAKWkpEatpAFKSUmNWkkDlJKSGrWSBiglJTVqJQ1QSkpq1Eoa4DBR+979Wvve/Tm/l50dR/IlfzTy5VC4YaD2vfu1BQvmAwCam1swd/mFCgAcumY7/aLOfbRKAYDb7v0mXXdPxVZf5ew4ki/5o5UvDTDPOlDbqK1YcaFpXXNzC3q2NaCpPo5Fl6bpY/WqTtSWqFjbFqOPlY3Fnsp9I341yJdPtGfPfgCA5Ev+aOXLKvAwUHNzC5qbW0zrqld1ovzoSgUAyo+uVKpXdaKysRgHr6j7f+2dX2xT1x3HvzdrUJNoTlsgK51JO6XQpg9MdYyygQIW5U+lpNMkHprS9IGuJVg0UQyiK6xISKNhEqLOQNUNbTVUNeuyhz6RiFAiFJPRzZBYItJqjS6SCZGGAl3BUggia84enHNyr32vfa997Wtyf190Ffuck/O5xs7P55zf75yfBADfvnJOagstN9wuHY/4xHcqn0aARaCx/hCrqnpMPH/mmacRi13HH0b+Ksr63aMI7nwftZtHRFl00IvA6SNonKxL265i3ybRJ9fU1B2sadwoEZ/4TuaTASwSjfWHGADwD8LU1B1sn+sU9cHJlxMPDnkXfun3iTc54B5I2676szlVvwDEh4/4xHcynwxgkWi8OchObryFN6u3ibKJiYglfVdXe8TjP02cQ1touVgsJj7xncwnA1gEGm8OsuigF023G6QO+SDrd48ufJPpaM2nLtXzsbfiadsH3ANonKxDl79T6ls2zGo3j4gPAfGJ71Q+HYhaJKrdPIJxjDDIBzO2XfOpK+UN1yrT0nhzkNUSn/jEB0CB0EWj6KA3ZVqQSRtKJGwoMXdAb01vQIoOelPKs+HveyZx2cU/cTBx2cU/eqkERy+Z+xOyku/dIsG7xb73HztWJy67+LveTlw58HMaAfL8AIvtmOxCq6Y3IKE5yDo2nm0X/loAAAxkSURBVDU0/M9GwcmXAfcAOuSDbDxpDYb4xHcqP+sRoDI5SqZEKflSnzzN7GJbLR6/FNz5ft4YwZ3vg8dOEZ/4xM/SAPbJ0wzd3Yl0eN3dQFdXwY3gYjLAfOG3pjcg1W4eUbv6NaS11pFx/eNQIkq+pjcg9btHVVuFiE98p/JNT4E1EySXlQGnTqGvtZUVYjosDLAkJRIi37+Pvo6OgrBT7sEiduNkHSDXsbbmoKrcrLcrU3vlB4/4xHc635QBTJsYGQC6u9G3e3deDVHKPUhSwgAXgJ1yD4rXn6vx73eP8u074g0y6tlSKpN3rMvfKa06s40po+eJT3yn8g3HAYqp3qlTwOws8M47QN28IRptXTCC80YhH4ZIdQ8A8PF8xS7kna26B278lK+/uxvYvTtrdod8kPGN3TzCnb95Zj29XBfnmPoDcGhhszg/IcMI36ynl+t4DJbwzXp6udo7reGb9fRyHVg/ZwnfrKeXa+S8Ne+/WU+v0BfXrOGb9PQKffxJRn5272xpaXY3tJgl5WZz+eJs4PQRi24oVYHTR8RiM/GJT3wTU+Amf4WkWvBPmgImt83xXo3dwy7tNvlgq+6htTVlCozW1qzZPBK+y98pdcgHGdwDqlCAi3PafhY+MtSrV0oZCR8d9DI0B1lyJL4e/3hMu08+MtSrt4rf3qndJx8Z6tVbxT+wfk6zTz4y1Ku3ij9yXvv95SNDvXqr+PjimnanfGSoV28V/+NPtDvlI0O9egN8U2uAqj9+IMXw5WIETN9DkhMEHR0Fi0dU/T8wZsnr1oqEH3srbvkisJlIfOITf7HzTXuBU4wgkDACOax/ZXUPu3ez5LJCsFX30NpqWSA43wsJxSIwYMC9n6RM7Wt6A2IvJPGJ73R+1ochJMe/2bEbZDHtROGnYRjdCK50jqQ4O3TEpwHpTuMww1dOge3gK6fAdvCVU2A7+MopsB185RTYFr5iCpwtP+udIEqjY5cBavJXSIvB+AHOjcQnPvHt5Od0GMJiMkB2ymwkfFayMBKf+MRfLHw6DqtIpBcJn05GvL/JMhuJn05GvL/55Bvx/uaTb8T7m0++Ee9vPvlGvL955Rvw/mbikwEsEmlFwuspG+8Yl5lIfOITf7Hz6UToIhGPhK/Yt0mUjYxcsKRvr3ehz+njF9JG4hOf+E7ikwEsEvFs9crEzQ033xX1uSSF8Z51qfoFIJJPE5/4TubTFLgIpJUcHYAq3R/cA6lpAZGaFlCrHc4ufAPyD8Ll/hBTpiUkPvGdyKcj8W0Wz4mqTNbMc6J2+TulttBydPk7pcbJOuHFOrnxlvCY8e096dpNH7+g6jsWu46qqscw1h9ixCe+k/lkAItMsdh1TE3dQVtoOfqWDTMA6Fs2zHj80qoz2xgArDqzjfHYKSPtpqbuqBJDE5/4xKc1wKIQ/xYEFjLWA4noeN6GR64r3fh8IddoOz0O8YnvVD4ZwCLRWH+IAQsZ6wvNIT7xncgXThDuhUn2zlgtPY7T+fybKd/S4xDfmfw+WQQeSwAwIUfyfQt6HFv4UpM/gJtXrjKlm5j/cVo9BNXjEJ/4xLeHrzCAjpRUXe1JcUHHYtcxffwCooOJ/XP8Jz+toXGyTvzkx1hnavee91Xhgua6fPkqAID4xCe+PfyJiUheZzzFrhJgwTWs1MmNt/j5XGi63SBxj8v8dhV8+8o5iXtcjLRTKplHfOIT3z6+kyU1+QMq7wiQCBbksThc/e7R1EDEwdRARK12Ffs2iT659LxAxCc+8QvHd/wUmHuBuXdE6SbePrdw3EYuW1GqP5tT9Qvoe4GIT3ziF45PBnDeAPITWd+s3iYqJyas8chUV3vE4z9NnEt7IizxiU/8wvHJAPoDIitT0+0GiR9OaORYaqWMHkfd5e8UZ/InZ4UiPvEfFr5ZFSvf6QZQxAHWamRl0pPW+ftGs7ibyQpFfOIXIz8XFSvfqRJ7gaOD3pRheUbVHkhcJlTTG5Cig6lHXmfDX7mkHSuXtNvG34q92Iq9tvH3z/+zi98urUO7tM42/p6SddhTYg8/HA6LazHwnapHgPngyeYg69h4Ni/Db2B+cdY9gA75IBtPWgMhPvGz4ZfPrce9kksF54fDYbjdbtXz+vr6h5bvZIkRoFOzQhH/4eVfxQ8on1tfUH6y8QEAt9ttaCRWzHynqgQwn5VJa60l4/qLhVmhiE98AIgu+R+u4oeC8bWMD1dGI1TEfCdLOEH0sjKZ9bZlam82KxTxia/X342aCmB8GniQP36yZmZmUFZWplluRMXKd6qEAdTKymTUs6ZUJu+cmaxQxCd+Wn7DbdzAMiCaH36y6uvrEQ6HsXTpUpURmpmZwXfffZdxHa6Y+U6VCITmWZmig14RYS4+PCY9vULRo+oP4KGFzdp6WaG0+GY9vVw3HpywhG/W08v1FT60hG/W08t1DMcs4Zv19HKdYF9bwt9QImFtNcPTO4DpxhJ8eZhhtGo12J//Bex6GxhehpXj06h98Ah+jh8Jx8hHc7nx9aQ0QmaMTzHynR4HKJwgfHE0cPpI3mCB00fEYm+yiE/8dPwrExKufwFU9M9h+2EJdVPXIL3+XCI5dsNt3KipEGuCeo6RXF9/i6sSLa5KRCIRMQIrKytDJBIRdfl6/QAgyzJkWdbk87ps+Y5Vkz+A2hAYDnlZkz+AQdxiAfcAA8DWfOpiSAzJta/aA4krTRveR8A9wAZxizX5A8AhL6sNgTX5AznxVy5pZyuXtNvG34q9bCv22sbfj/1sP/bbxm+X1rF2aZ1tfO8WiUmvP5c3vvJqcVWyP/5kBWtxVTJZltmLT+5gLzWeYS8+uYPJsqyq17qPXPmyLLNoNMpkWRZXOBxWPef1ZvhOV9qdINlkYM/U3kwkPPGJn66/7Ycl4PA1KCeMVvK5WlyVWFtWvvD8jRa0vNGCDc+24uK/TwEALv32PQAQ7XridzUo2fFlWYbP51PxAaDn8x7VYwDw+XyQZRl+v98U36kSBpDvRUTSImyui+DJqukNiL2IShGf+Gb5ielwCUbOM0Pts+EnG7+1ZeXwP+XGfxp68ETda/j1q0NYMdyCCqlU1QbQNoJm+cnGz+fzoefzHng8Hng8Hnzzz28QiagPTUhnBPX4TlUJABF/lO1GdL0ypYKTL4PHHyk3ghOf+Nny+ZpgIfhXZu7h7n112X9H/yIev/BoKe7eT7TLB39oaAjxuNq4Kw2fz+dDPB7H0NCQab6TRTtBiP/Q8rljJF/8FlclVkvlwqhdY4mfa8vKsWK4BU/UvYYVwy1ixMfrr8zcw2qpPMUpYpYvyzI8Ho8watzg+Xw+RCIReDweRCIRMULk9UNDQ/B4PClOEdoJkqqsdoJkJQt3AhCf+FxXJgwOZHLk8+ksHwWuLSvHs3/bKYwfL9db+8uVz6ezfBTIjSA3frxcb+2PdoJoK+NOkLSKHjUNzDUSXqkbD07Yyv8KH9rKP4ZjtvJPsK9t5V+cM/83bJbPR3Va+uXj5bg7M6tZp/d7ZvnJ63tKbdmyBbOz2ny93yPDp1banSB6ysY7yJVLJDzxiV9Iftv5r+B2uxGPx9EWj+Pklq2q3/n79/fwwqOlqrJwOAyXywWXy4XJyUn0JAUom+F7PB7BD4fDKUbt/PnzKgeJFt/o63eqUnaCVOzbJCpHRi5YAvF6F/qcPn4hbSQ88YlfLPyPPjoKl8uF0tJSzM7O4oP6X2C1VI7KRxP1lWWlYgR4935i1Pe78D9E+3g8jvr6esv4fG3P5UoYf14OJKbAfEpshu/0nSDCAN68cpUBgDJxcsPNd0XDXJKyeM+6VP0CEMmfuYhP/GLmN3/5OE7vegndv3pelLWeiOGnKMX3Pz6tard06VI8+1mz5XwAqO/bI8rkp34Dj8eD3u3fZ813ugF8BEhkpEpOzgxAlW4P7oHUtHxITcun1Q5nF76B+BtxuT/ElGkBiU/8Yub3bh9F987nVf2e0uD3bh9FcOeevPCTX5d/EAh88LOc+U5WCc9JqkyWzHOSdvk7pbbQcnT5O6XGyTrhRTq58ZbwWPFEK+naTR+/oOo7FruOqqrHMNYfYsQnPvHt41tvUh4ulSQXxGLXMTV1B22h5ehbNswAoG/ZMOPxQ6vObGMAsOrMNsZjl4y0m5q6YygbPfGJT3z7+E6T1OQPqDLTKzPWjzcHxTcEjxxXutH5QqrRdnoc4hOf+Pbwnb4GKJwgfDic73UBPQ7xiU/8wvOdbgD/DzTnuApHWW9CAAAAAElFTkSuQmCC);background-size:1000% 1000%;background-position:0% 0%}.GeneIcon--template{background-position:11.1111111111% 0%}.GeneIcon--unknown{background-position:11.1111111111% 11.1111111111%}.GeneIcon--cryokinesis{background-position:22.2222222222% 11.1111111111%}.GeneIcon--mattereater{background-position:33.3333333333% 11.1111111111%}.GeneIcon--jumpy{background-position:44.4444444444% 11.1111111111%}.GeneIcon--polymorphism{background-position:55.5555555556% 11.1111111111%}.GeneIcon--telepathy{background-position:66.6666666667% 11.1111111111%}.GeneIcon--empath{background-position:77.7777777778% 11.1111111111%}.GeneIcon--immolate{background-position:88.8888888889% 11.1111111111%}.GeneIcon--melt{background-position:100% 11.1111111111%}.GeneIcon--superfart{background-position:0% 22.2222222222%}.GeneIcon--eyebeams{background-position:11.1111111111% 22.2222222222%}.GeneIcon--adrenaline{background-position:22.2222222222% 22.2222222222%}.GeneIcon--midas{background-position:33.3333333333% 22.2222222222%}.GeneIcon--photokinesis{background-position:44.4444444444% 22.2222222222%}.GeneIcon--erebokinesis{background-position:55.5555555556% 22.2222222222%}.GeneIcon--firebreath{background-position:66.6666666667% 22.2222222222%}.GeneIcon--dimensionshift{background-position:77.7777777778% 22.2222222222%}.GeneIcon--healingtouch{background-position:88.8888888889% 22.2222222222%}.GeneIcon--hallucination{background-position:100% 22.2222222222%}.GeneIcon--brownnote{background-position:0% 33.3333333333%}.GeneIcon--tk{background-position:11.1111111111% 33.3333333333%}.GeneIcon--darkcloak{background-position:22.2222222222% 33.3333333333%}.GeneIcon--chameleon{background-position:33.3333333333% 33.3333333333%}.GeneIcon--bigpuke{background-position:44.4444444444% 33.3333333333%}.GeneIcon--ink{background-position:55.5555555556% 33.3333333333%}.GeneIcon--none{background-position:66.6666666667% 33.3333333333%}.GeneIcon--speech{background-position:77.7777777778% 33.3333333333%}.GeneIcon--lizard{background-position:88.8888888889% 33.3333333333%}.GeneIcon--squid{background-position:100% 33.3333333333%}.GeneIcon--roach{background-position:0% 44.4444444444%}.GeneIcon--frog{background-position:11.1111111111% 44.4444444444%}.GeneIcon--flashy{background-position:22.2222222222% 44.4444444444%}.GeneIcon--dwarf{background-position:33.3333333333% 44.4444444444%}.GeneIcon--cat{background-position:44.4444444444% 44.4444444444%}.GeneIcon--blank{background-position:55.5555555556% 44.4444444444%}.GeneIcon--skeleton{background-position:66.6666666667% 44.4444444444%}.GeneIcon--monkey{background-position:77.7777777778% 44.4444444444%}.GeneIcon--cow{background-position:88.8888888889% 44.4444444444%}.GeneIcon--fire_res{background-position:100% 44.4444444444%}.GeneIcon--cold_res{background-position:0% 55.5555555556%}.GeneIcon--thermal_res{background-position:11.1111111111% 55.5555555556%}.GeneIcon--elec_res{background-position:22.2222222222% 55.5555555556%}.GeneIcon--tox_res{background-position:33.3333333333% 55.5555555556%}.GeneIcon--alc_res{background-position:44.4444444444% 55.5555555556%}.GeneIcon--rad_res{background-position:55.5555555556% 55.5555555556%}.GeneIcon--breathless{background-position:66.6666666667% 55.5555555556%}.GeneIcon--regen{background-position:77.7777777778% 55.5555555556%}.GeneIcon--haze{background-position:88.8888888889% 55.5555555556%}.GeneIcon--dead{background-position:100% 55.5555555556%}.GeneIcon--strong{background-position:0% 66.6666666667%}.GeneIcon--hulk{background-position:11.1111111111% 66.6666666667%}.GeneIcon--radiobrain{background-position:22.2222222222% 66.6666666667%}.GeneIcon--eye{background-position:33.3333333333% 66.6666666667%}.GeneIcon--fart{background-position:44.4444444444% 66.6666666667%}.GeneIcon--bad{background-position:66.6666666667% 66.6666666667%}.GeneIcon--shoot_limb{background-position:77.7777777778% 66.6666666667%}.GeneIcon--apparition-0{background-position:88.8888888889% 66.6666666667%}.GeneIcon--apparition-1{background-position:100% 66.6666666667%}.GeneIcon--hemochromia_rust{background-position:33.3333333333% 88.8888888889%}.GeneIcon--hemochromia_bronze{background-position:44.4444444444% 88.8888888889%}.GeneIcon--hemochromia_gold{background-position:55.5555555556% 88.8888888889%}.GeneIcon--hemochromia_lime{background-position:66.6666666667% 88.8888888889%}.GeneIcon--hemochromia_olive{background-position:77.7777777778% 88.8888888889%}.GeneIcon--hemochromia_jade{background-position:88.8888888889% 88.8888888889%}.GeneIcon--hemochromia_teal{background-position:100% 88.8888888889%}.GeneIcon--hemochromia_cobalt{background-position:0% 100%}.GeneIcon--hemochromia_indigo{background-position:11.1111111111% 100%}.GeneIcon--hemochromia_purple{background-position:22.2222222222% 100%}.GeneIcon--hemochromia_violet{background-position:33.3333333333% 100%}.GeneIcon--hemochromia_fuchsia{background-position:44.4444444444% 100%}.GeneIcon--hemochromia_unknown{background-position:55.5555555556% 100%}.GeneIcon--achromia{background-position:66.6666666667% 100%}.GeneIcon--noir{background-position:77.7777777778% 100%}.IconStack>.Icon{position:absolute;width:100%;text-align:center}.IconStack{position:relative;display:inline-block;height:1.2em;line-height:2em;vertical-align:middle}.IconStack:after{color:transparent;content:"."}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#252525;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out;align-items:center}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.RoundGauge{font-size:1rem;width:2.6em;height:1.3em;margin:0 auto .2em}.RoundGauge__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:10;stroke-dasharray:157.08;stroke-dashoffset:157.08}.RoundGauge__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:10;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.RoundGauge__needle,.RoundGauge__ringFill{transition:transform 50ms ease-in-out}.RoundGauge__needleLine,.RoundGauge__needleMiddle{fill:#db2828}.RoundGauge__alert{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:rgba(255,255,255,.1)}.RoundGauge__alert.max{fill:#db2828}.RoundGauge--color--black.RoundGauge__ringFill{stroke:#1a1a1a}.RoundGauge--color--white.RoundGauge__ringFill{stroke:#fff}.RoundGauge--color--red.RoundGauge__ringFill{stroke:#df3e3e}.RoundGauge--color--orange.RoundGauge__ringFill{stroke:#f37f33}.RoundGauge--color--yellow.RoundGauge__ringFill{stroke:#fbda21}.RoundGauge--color--olive.RoundGauge__ringFill{stroke:#cbe41c}.RoundGauge--color--green.RoundGauge__ringFill{stroke:#25ca4c}.RoundGauge--color--teal.RoundGauge__ringFill{stroke:#00d6cc}.RoundGauge--color--blue.RoundGauge__ringFill{stroke:#2e93de}.RoundGauge--color--violet.RoundGauge__ringFill{stroke:#7349cf}.RoundGauge--color--purple.RoundGauge__ringFill{stroke:#ad45d0}.RoundGauge--color--pink.RoundGauge__ringFill{stroke:#e34da1}.RoundGauge--color--brown.RoundGauge__ringFill{stroke:#b97447}.RoundGauge--color--grey.RoundGauge__ringFill{stroke:#848484}.RoundGauge--color--light-grey.RoundGauge__ringFill{stroke:#b3b3b3}.RoundGauge--color--good.RoundGauge__ringFill{stroke:#68c22d}.RoundGauge--color--average.RoundGauge__ringFill{stroke:#f29a29}.RoundGauge--color--bad.RoundGauge__ringFill{stroke:#df3e3e}.RoundGauge--color--label.RoundGauge__ringFill{stroke:#8b9bb0}.RoundGauge__alert--black{fill:#1a1a1a;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--white{fill:#fff;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--red{fill:#df3e3e;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--orange{fill:#f37f33;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--yellow{fill:#fbda21;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--olive{fill:#cbe41c;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--green{fill:#25ca4c;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--teal{fill:#00d6cc;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--blue{fill:#2e93de;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--violet{fill:#7349cf;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--purple{fill:#ad45d0;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--pink{fill:#e34da1;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--brown{fill:#b97447;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--grey{fill:#848484;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--light-grey{fill:#b3b3b3;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--good{fill:#68c22d;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--average{fill:#f29a29;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--bad{fill:#df3e3e;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--label{fill:#8b9bb0;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}@keyframes RoundGauge__alertAnim{0%{opacity:.1}50%{opacity:1}100%{opacity:.1}}.Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.SectionEx .Section__title{display:flex}.SectionEx .Section__titleText{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:auto}.SectionEx .Section__buttons{position:inherit;right:inherit;flex:none}.SectionEx__capitalize .Section__titleText{text-transform:capitalize}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(even){background-color:rgba(0,0,0,.33)}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.TooltipOverflow{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-search-interface__search-option.Button--color--transparent{transition:initial}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.AccessPanel-wires-btn.Button--selected{background-color:#cd7a0d !important}.Airlock-hack-button{font-family:monospace;border-width:.1666666667em;border-style:outset;border-color:#0a0;outline:.0833333333em solid #007a00}.Airlock-hack-button.Button--disabled{background-color:#4a6a4a}.Airlock-hack-button.Button--color--default{background-color:lime}.AlertModal__Message{text-align:center;justify-content:center}.AlertModal__Buttons{justify-content:center}.AlertModal__Loader{width:100%;position:relative;height:4px}.AlertModal__LoaderProgress{position:absolute;transition:background-color 500ms ease-out,width 500ms ease-out;background-color:#3e6189;height:100%}.cashreg__ownerbutton,.cashreg__pay,.cashreg__tip{display:flex;justify-content:center;align-items:center}.cashreg__ownerbutton>*,.cashreg__pay>*,.cashreg__tip>*{padding:.5em .1em}.cashreg__centerpart{font-size:1.5rem}.cashreg__amount:hover{background-color:#439de1}.cashreg__table{width:80%}.cashreg__table_cellright{text-align:right}.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;user-select:none;cursor:default}.react-colorful__saturation_value{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top, black, rgba(0, 0, 0, 0)),linear-gradient(to right, white, rgba(255, 255, 255, 0))}.react-colorful__pointer-fill,.react-colorful__alpha-gradient{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation_value{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__hue,.react-colorful__r,.react-colorful__g,.react-colorful__b,.react-colorful__alpha,.react-colorful__saturation,.react-colorful__value{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)}.react-colorful__r{background:linear-gradient(to right, #000, #f00)}.react-colorful__g{background:linear-gradient(to right, #000, #0f0)}.react-colorful__b{background:linear-gradient(to right, #000, #00f)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%, -50%);background-color:#cfcfcf;border:2px solid #cfcfcf;border-radius:50%;box-shadow:0 2px 5px rgba(0,0,0,.4)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%, -50%) scale(1.1);background-color:#fff;border-color:#fff}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><rect x="8" width="8" height="8"/><rect y="8" width="8" height="8"/></svg>')}.react-colorful__saturation-pointer,.react-colorful__value-pointer,.react-colorful__hue-pointer,.react-colorful__r-pointer,.react-colorful__g-pointer,.react-colorful__b-pointer{z-index:1;width:20px;height:20px}.react-colorful__saturation_value-pointer{z-index:3}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ComUplink .Button--color--Main{transition:color 50ms,background-color 50ms;background-color:#db2828;color:#fff}.ComUplink .Button--color--Main:hover{transition:color 0ms,background-color 0ms}.ComUplink .Button--color--Main:focus{transition:color 100ms,background-color 100ms}.ComUplink .Button--color--Main:hover,.ComUplink .Button--color--Main:focus{background-color:#e66b6b;color:#fff}.ComUplink .Button--color--Main:active{background-color:#f1acac}.ComUplink__Points--Main{color:#db2828}.ComUplink__Row:not(:last-child){border-bottom:2px solid #3e6189}.boardgame__titlebar{position:fixed;top:4px;right:80px;padding:2px;z-index:2}.boardgame__titlebar>*{margin:0 4px}.boardgame__window{height:calc(100% - 0.25px);display:flex;flex-direction:row;background-color:#211913}.boardgame__window*{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.boardgame__helpmodal{z-index:20}.boardgame__helpmodal>.Dimmer__inner{background-color:rgba(0,0,0,.8);padding:15px;width:60%}.boardgame__wrapper{width:100%;overflow:hidden}.boardgame__heldpiece{position:fixed;z-index:4;pointer-events:none}.boardgame__palettes{width:100px;background-color:#cecece}.boardgame__palettes-header{font-size:10px;background-color:#242424}.boardgame__palettes-set{width:100%;overflow-y:auto;display:flex;flex-wrap:wrap;background-color:#e6e6e6}.boardgame__palettes-set-piece{transition:.3s all;padding:2px;width:50%;cursor:pointer}.boardgame__palettes-set-piece>img{width:100%;height:auto}.boardgame__palettes-set-toggle{width:100%}.boardgame__palettes-set-minimized .boardgame__palettes-set-piece{width:25%}.boardgame__notations{font-weight:bold;text-align:center;justify-content:center;align-items:center;z-index:0}.boardgame__notations-horizontal{height:20px;padding-left:20px;padding-right:20px}.boardgame__notations-vertical{width:20px;flex-direction:column}.boardgame__notations-number,.boardgame__notations-letter{display:flex;justify-content:center;align-items:center}.boardgame__board{z-index:0;flex-grow:1}.boardgame__board-pieces{z-index:1}.boardgame__board-overlay{z-index:2}.boardgame__board-inner{transition:1s all;flex-grow:1;display:flex;flex-direction:column;height:calc(100% - 0.25px)}.boardgame__board-checkerboard{position:relative;width:100%;height:100%}.boardgame__board-ggrenderer{position:absolute;top:0;left:0;pointer-events:none}.boardgame__board-gprenderer{position:absolute;top:0;left:0}.boardgame__board-gprenderer-piece{position:absolute}.boardgame__board-gprenderer-piece>span{padding:2px 6px;background-color:rgba(0,0,0,.5);position:absolute;text-align:center;left:50%;top:50%;transform:translate(-50%, -50%);font-size:14px;font-weight:bolder;text-shadow:0 0 2px #000;z-index:1;font-family:Arial}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.chem-dispenser__buttons{text-transform:capitalize}.chem-dispenser__labels{text-transform:capitalize}.chem-dispenser__dispense-buttons{text-overflow:ellipsis;text-transform:capitalize;white-space:nowrap}.chem-dispenser-dispense:hover{overflow:visible}@keyframes ChemHeater__heating{to{box-shadow:0 0 15px 0 #f2711c;border-color:#f2711c}}@keyframes ChemHeater__cooling{to{box-shadow:0 0 15px 0 #2185d0;border-color:#2185d0}}@keyframes ChemHeater__heating_fill{to{color:#f2711c}}@keyframes ChemHeater__cooling_fill{to{color:#2185d0}}.ChemHeater__TemperatureNumber{transition:color 500ms ease-out}.ChemHeater__TemperatureArrow{color:#aaa;transition:transform 500ms ease-out}.ChemHeater__TemperatureArrow__heating{animation:ChemHeater__heating_fill 2s ease infinite alternate}.ChemHeater__TemperatureArrow__cooling{animation:ChemHeater__cooling_fill 2s ease infinite alternate}.ChemHeater__TemperatureBox{box-shadow:0 0 15px rgba(0,0,0,0);border-color:#aaa;border-style:solid;border-radius:4px;height:3em;text-align:center}.ChemHeater__TemperatureBox__heating{animation:ChemHeater__heating 2s ease infinite alternate}.ChemHeater__TemperatureBox__cooling{animation:ChemHeater__cooling 2s ease infinite alternate}.cloning-console__flex__table{position:relative;display:flex;overflow:none;width:100vw;flex-direction:column}.cloning-console__flex__head{display:flex;height:25px;flex:0 0 auto;padding:0 5px;font-size:12px}.cloning-console__head__row{display:flex;flex:1 1 auto;align-items:center;justify-content:space-between;text-transform:uppercase}.cloning-console__head__item{display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:space-between;padding:0 5px}.cloning-console__body__row{display:flex;height:30px;flex:0 0 auto;align-items:center;justify-content:space-around;border-bottom:2px solid rgba(51,51,51,.4)}.cloning-console__body__item{display:flex;overflow:hidden;height:30px;align-items:baseline;justify-content:center;text-overflow:ellipsis}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.clothingbooth__dropdown{margin-bottom:0 !important;margin-right:0 !important}.clothingbooth__boothitem{padding-left:.5rem;padding-right:.5rem}.clothingbooth__boothitem>div{pointer-events:none}.clothingbooth__boothitem:hover,.clothingbooth__boothitem-selected{background-color:#1b9638}.clothingbooth__boothitem:active{background-color:#67e484}.clothingbooth__preview{width:64px;height:128px}.cyborg-module-rewriter-interface-empty-placeholder{color:#8b9bb0}.cyborg-module-rewriter-interface-module-view__tool-label{margin-left:.5em;color:#8b9bb0}.gameclock__window{display:flex;flex-direction:column;padding:5px}.gameclock__help{position:fixed;top:4px;right:50px;padding:2px;z-index:20}.gameclock__helpbutton{height:20px;width:20px}.gameclock__helpbutton>i{display:flex;justify-content:center;align-items:center;height:100%}.gameclock__configmodal{z-index:20}.gameclock__configmodal>.Dimmer__inner{background-color:rgba(0,0,0,.8);padding:15px;width:180px;height:130px}.gameclock__configmodalbuttoncontainer{padding-top:12px}.gameclock__teamicon{text-align:center;font-size:24px;margin:5px}.gameclock__sidepart{flex-grow:1;padding:5px}.gameclock__timebutton{width:100%;height:100%;text-align:center}.gameclock__timebutton>div{display:flex;justify-content:center;align-items:center;height:100%}.gameclock__timeflex{flex-direction:column;display:flex;justify-content:center;align-items:center;height:100%;font-size:2em}.gameclock__mid{padding:5px;display:flex;flex-direction:column;align-items:center;justify-content:space-around}.gameclock__utilbutton{display:flex;flex-direction:column;justify-content:center;align-items:center;height:30px;width:30px}.gameclock__utilbutton>div{display:flex;justify-content:center;align-items:center;height:100%;padding-right:2px}.gas-canister-detonator-utility__list-item{line-height:1.7em}.gas-canister-detonator-utility__attachment-item{text-transform:capitalize}.IDComputer__DeptBox .Section__title{text-shadow:1px 1px 1px #000,1px -1px 1px #000,-1px -1px 1px #000,-1px 1px 1px #000;background-color:#767676}.mode-light .IDComputer__DeptBox .Section__title{text-shadow:1px 1px 1px #fff,1px -1px 1px #fff,-1px -1px 1px #fff,-1px 1px 1px #fff}.IDComputer__DeptBox_color_blue .Section__title{background-color:#2185d0}.IDComputer__DeptBox_color_yellow .Section__title{background-color:#fbd608}.IDComputer__DeptBox_color_purple .Section__title{background-color:#a333c8}.IDComputer__DeptBox_color_red .Section__title{background-color:#db2828}.IDComputer__DeptBox_color_green .Section__title{background-color:#20b142}.instrument__keyboardwrapper{border-top-left-radius:30px;border-top-right-radius:30px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;margin:10px;padding-top:20px;background:#49504a;background:linear-gradient(180deg, #49504a 0%, #49504a 22%, #575e57 100%);border-left:5px solid #3d3d3d;border-bottom:5px solid #333;overflow-x:auto;display:flex;justify-content:space-between;align-items:center;flex-direction:column}.instruments__piano{display:flex;justify-content:center;list-style-type:none;padding:0 10px 10px 10px;overflow-x:auto}.instrument__outerpanel{display:flex;width:100%;padding:0 40px;justify-content:space-between;flex-direction:row}.instrument__speaker{border-top-left-radius:30%;width:360px;height:100px;margin:0px 20px;border-radius:10px;box-shadow:0px 0px 5px #4d4d4d inset;background:#646464;background-image:linear-gradient(#3d3d3d 0.1em, transparent 0.1em),linear-gradient(90deg, #3d3d3d 0.1em, transparent 0.1em);background-size:2px 2px}.instruments__piano-key{display:flex;align-items:flex-end;justify-content:center;font-size:12px;background:green;font-weight:bold;text-align:center;padding:2px 2px 10px 2px;user-select:none;-ms-user-select:none}.instruments__piano-key-white{height:16em;width:4em;min-width:4em;z-index:1;color:#383838;border:1px solid #d6d6d6;border-radius:0 0 5px 5px;box-shadow:-1px 0 0 rgba(255,255,255,.8) inset,0 0 5px #ccc inset,0 0 3px rgba(0,0,0,.2);background:linear-gradient(to bottom, #eee 0%, #fff 100%);transition:.05s all}.instruments__piano-key-black{height:9em;width:3em;min-width:3em;z-index:10;color:#cecece;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border:1px solid #3b3b3b;margin:0 0 0 -1.5em;box-shadow:-1px -1px 2px rgba(255,255,255,.2) inset,0 -5px 2px 3px rgba(0,0,0,.6) inset,0 2px 12px rgba(0,0,0,.5);background:linear-gradient(0deg, #222 0%, #555 100%);transition:.05s all}.instruments__piano-key-white:active,.instruments__piano-key-white-active{border:1px solid #b4b4b4;box-shadow:2px 0 3px rgba(0,0,0,.1) inset,-5px 5px 20px rgba(0,0,0,.2) inset,0 0 3px rgba(0,0,0,.2);background:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%)}.instruments__piano-key-black:active,.instruments__piano-key-black-active{border:1px solid #222;box-shadow:-1px -1px 2px rgba(255,255,255,.2) inset,0 -2px 2px 3px rgba(0,0,0,.6) inset,0 1px 2px rgba(0,0,0,.5);background:linear-gradient(to bottom, #444 0%, #222 100%)}.instruments__piano-key-white-offset{margin-left:-1.5em}.instruments__piano-key:first-child{margin-left:10px;border-top-left-radius:10px;border-bottom-left-radius:10px}.instruments__piano-key:last-child{margin-right:10px;border-top-right-radius:10px;border-bottom-right-radius:10px}.instruments__notedetails{display:flex;flex-direction:column;user-select:none;pointer-events:none}.instruments__notename{font-size:10px}.instruments__notekey{font-size:15px;padding-bottom:10px}.instruments__piano-key-white>.instruments__notename{font-size:14px;text-shadow:0px 0px 1px 5px #fff}.instrument__keybind-indicator{border-radius:20px;width:20px;height:10px}.instrument__panel{display:flex;justify-content:center;flex-direction:row;align-items:center;border-radius:10px;padding:6px;background:#333}.instrument__keyboardsupport{padding-right:5px;display:flex;flex-direction:column;justify-content:center;align-items:center}.instrument__panel-input{text-align:center;font-size:9px;font-weight:bold;padding:0px 5px}.instrument__toggle-keyboard-button{width:100%;text-align:center;margin-bottom:4px}.instrument_panel-info{flex-grow:1;text-align:center;color:#000;padding:0 10px;margin:0 10px;background:#fff;border-radius:5px}.instrument__instructions{width:100%;text-align:center}.instrument__input_keyorder{width:100%}.ListInput__Section{font-family:Segoe UI Emoji}.ListInput__Section .Section__title{flex-shrink:0}.ListInput__Section .Section__titleText{font-size:1em}.ListInput__Loader{width:100%;position:relative;height:4px}.ListInput__LoaderProgress{position:absolute;transition:background-color 500ms ease-out,width 500ms ease-out;background-color:#3e6189;height:100%}.minimap-controller__number-inputs{width:70px}.minimap-controller__buttons{font-size:1.7rem}.minimap-controller__marker-list{background-color:rgba(0,0,0,.2);justify-content:space-between;padding:5px;padding-bottom:1px;margin-bottom:4px}.paper__stamp,.paper__stamp-text{position:absolute;pointer-events:none;user-select:none}.paper__stamp-text{overflow:hidden;height:40px;padding:.55rem .5rem;box-shadow:inset 0px 0px 0px 3px #525252;color:#5c5c5c;font-family:"Anton";font-size:1.5rem;font-weight:500;text-align:center;text-transform:uppercase;white-space:nowrap}.paper__page{word-break:break-word;word-wrap:break-word}.phone__button>div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.port-atmos-pressure-bar__text{text-shadow:1px 1px 1px #000,-1px 1px 1px #000,1px -1px 1px #000,-1px -1px 1px #000}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.WeaponVendor .Button--color--sidearm{transition:color 50ms,background-color 50ms;background-color:#00b5ad;color:#fff}.WeaponVendor .Button--color--sidearm:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--sidearm:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--sidearm:hover,.WeaponVendor .Button--color--sidearm:focus{background-color:#13e3da;color:#fff}.WeaponVendor .Button--color--sidearm:active{background-color:#41f8ef}.WeaponVendor .Button--color--loadout{transition:color 50ms,background-color 50ms;background-color:#fbd608;color:#000}.WeaponVendor .Button--color--loadout:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--loadout:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--loadout:hover,.WeaponVendor .Button--color--loadout:focus{background-color:#fce354;color:#000}.WeaponVendor .Button--color--loadout:active{background-color:#fdefa0}.WeaponVendor .Button--color--utility{transition:color 50ms,background-color 50ms;background-color:#2185d0;color:#fff}.WeaponVendor .Button--color--utility:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--utility:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--utility:hover,.WeaponVendor .Button--color--utility:focus{background-color:#59a8e3;color:#fff}.WeaponVendor .Button--color--utility:active{background-color:#99c9ee}.WeaponVendor .Button--color--ammo{transition:color 50ms,background-color 50ms;background-color:#f2711c;color:#fff}.WeaponVendor .Button--color--ammo:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--ammo:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--ammo:hover,.WeaponVendor .Button--color--ammo:focus{background-color:#f6a067;color:#fff}.WeaponVendor .Button--color--ammo:active{background-color:#fbceb1}.WeaponVendor .Button--color--assistant{transition:color 50ms,background-color 50ms;background-color:#767676;color:#fff}.WeaponVendor .Button--color--assistant:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--assistant:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--assistant:hover,.WeaponVendor .Button--color--assistant:focus{background-color:#9b9b9b;color:#fff}.WeaponVendor .Button--color--assistant:active{background-color:silver}.WeaponVendor .Button--color--fishing{transition:color 50ms,background-color 50ms;background-color:#2185d0;color:#fff}.WeaponVendor .Button--color--fishing:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--fishing:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--fishing:hover,.WeaponVendor .Button--color--fishing:focus{background-color:#59a8e3;color:#fff}.WeaponVendor .Button--color--fishing:active{background-color:#99c9ee}.WeaponVendor__Credits--sidearm{color:#00b5ad}.WeaponVendor__Credits--loadout{color:#fbd608}.WeaponVendor__Credits--utility{color:#2185d0}.WeaponVendor__Credits--ammo{color:#f2711c}.WeaponVendor__Credits--assistant{color:#767676}.WeaponVendor__Credits--fishing{color:#2185d0}.WeaponVendor__Row:not(:last-child){border-bottom:2px solid #3e6189}.Layout,.Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.NtosHeader__left{position:absolute;left:12px}.NtosHeader__right{position:absolute;right:12px}.NtosHeader__icon{margin-top:-9px;margin-bottom:-6px;vertical-align:middle}.NtosWindow__header{position:absolute;top:0;left:0;right:0;height:28px;line-height:27px;background-color:rgba(0,0,0,.5);font-family:Consolas,monospace;font-size:14px;user-select:none;-ms-user-select:none}.NtosWindow__content .Layout__content{margin-top:28px;font-family:Consolas,monospace;font-size:14px}.TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color 250ms ease-out,background-color 250ms ease-out}.TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom, #2a2a2a 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjEiPg0KICA8cGF0aCBkPSJtIDE3OC4wMDM5OSwwLjAzODY5IC03MS4yMDM5MywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNCw2LjAyNTU1IGwgMCwxODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzQsNi4wMjU1NCBsIDUzLjEwNzIsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNSwtNi4wMjU1NCBsIDAsLTEwMS41NDQwMTggNzIuMjE2MjgsMTA0LjY5OTM5OCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNS43NjAxNSwyLjg3MDE2IGwgNzMuNTU0ODcsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNSwtNi4wMjU1NCBsIDAsLTE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzUsLTYuMDI1NTUgbCAtNTQuNzE2NDQsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzMsNi4wMjU1NSBsIDAsMTAyLjYxOTM1IEwgMTgzLjc2NDEzLDIuOTA4ODYgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC01Ljc2MDE0LC0yLjg3MDE3IHoiIC8+DQogIDxwYXRoIGQ9Ik0gNC44NDQ2MzMzLDIyLjEwODc1IEEgMTMuNDEyMDM5LDEyLjUwMTg0MiAwIDAgMSAxMy40Nzc1ODgsMC4wMzkyNCBsIDY2LjExODMxNSwwIGEgNS4zNjQ4MTU4LDUuMDAwNzM3IDAgMCAxIDUuMzY0ODIzLDUuMDAwNzMgbCAwLDc5Ljg3OTMxIHoiIC8+DQogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+DQo8L3N2Zz4NCjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPg0KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPg0K);background-size:70%;background-position:center;background-repeat:no-repeat}
-.theme-genetek .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-genetek .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-genetek .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-genetek .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-genetek .ProgressBar--color--default{border:.0833333333em solid #1b676b}.theme-genetek .ProgressBar--color--default .ProgressBar__fill{background-color:#1b676b}.theme-genetek .Section{position:relative;margin-bottom:.5em;background-color:#0a2628;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-genetek .Section:last-child{margin-bottom:0}.theme-genetek .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #2eafb6}.theme-genetek .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-genetek .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-genetek .Section__rest{position:relative}.theme-genetek .Section__content{padding:.66em .5em}.theme-genetek .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-genetek .Section--fill{display:flex;flex-direction:column;height:100%}.theme-genetek .Section--fill>.Section__rest{flex-grow:1}.theme-genetek .Section--fill>.Section__rest>.Section__content{height:100%}.theme-genetek .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-genetek .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-genetek .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-genetek .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-genetek .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-genetek .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-genetek .Section .Section:first-child{margin-top:-0.5em}.theme-genetek .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-genetek .Section .Section .Section .Section__titleText{font-size:1em}.theme-genetek .Layout,.theme-genetek .Layout *{scrollbar-base-color:#0b2a2c;scrollbar-face-color:#185a5e;scrollbar-3dlight-color:#0f393b;scrollbar-highlight-color:#0f393b;scrollbar-track-color:#0b2a2c;scrollbar-arrow-color:#51cdd3;scrollbar-shadow-color:#185a5e}.theme-genetek .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-genetek .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-genetek .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#0f393b;background-image:linear-gradient(to bottom, #114043 0%, #0d3133 100%)}.theme-genetek .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-genetek .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-genetek .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-genetek .Window__contentPadding:after{height:0}.theme-genetek .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-genetek .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(36,85,87,.25);pointer-events:none}.theme-genetek .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-genetek .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-genetek .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-genetek .TitleBar{background-color:#144d50;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-genetek .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#144d50;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-genetek .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-genetek .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-genetek .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-genetek .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-genetek .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-genetek .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-genetek .Layout__content{background-position-x:-60%;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDAgNTciIG9wYWNpdHk9Ii4xIj4NCiAgPGVsbGlwc2UgY3g9IjIwIiBjeT0iNi40OCIgcng9IjE0LjIiIHJ5PSI2LjY0IiAvPg0KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSIyMi45IiByeD0iMTAiIHJ5PSI0LjcxIiAvPg0KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSI0Ny41IiByeD0iMjAiIHJ5PSI5LjQiIC8+DQogIDxwYXRoIGQ9Im05LjIgNi40OGgtMi42MmwzLjQyIDE0LjctOS44MiAyNC42aDIuM2wxMC4xLTI0LjZ6IiAvPg0KICA8cGF0aCBkPSJtMzAuNyA2LjQ4LTMuNiAxNC43IDEwLjEgMjQuNmgyLjNsLTkuOC0yNC42IDMuNi0xNC43eiIgLz4NCjwvc3ZnPg0KPCEtLSBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gLS0+DQo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+DQo=)}.theme-genetek .color-label{color:#bfcc90 !important}.theme-genetek .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-genetek .Button:last-child{margin-right:0;margin-bottom:0}.theme-genetek .Button .fa,.theme-genetek .Button .fa-solid,.theme-genetek .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-genetek .Button--hasContent .fa,.theme-genetek .Button--hasContent .fa-solid,.theme-genetek .Button--hasContent .fa-regular{margin-right:.25em}.theme-genetek .Button--hasContent.Button--iconPosition--right .fa,.theme-genetek .Button--hasContent.Button--iconPosition--right .fas,.theme-genetek .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-genetek .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-genetek .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-genetek .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-genetek .Button--circular{border-radius:50%}.theme-genetek .Button--compact{padding:0 .25em;line-height:1.333em}.theme-genetek .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#1b676b;color:#fff}.theme-genetek .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--default:hover,.theme-genetek .Button--color--default:focus{background-color:#328a8e;color:#fff}.theme-genetek .Button--color--default:active{background-color:#49acb1}.theme-genetek .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-genetek .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--caution:hover,.theme-genetek .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-genetek .Button--color--caution:active{background-color:#f9e572}.theme-genetek .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-genetek .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--danger:hover,.theme-genetek .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-genetek .Button--color--danger:active{background-color:#e78484}.theme-genetek .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#0f393b;color:#fff;background-color:rgba(15,57,59,0);color:rgba(234,253,230,.75)}.theme-genetek .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--transparent:hover,.theme-genetek .Button--color--transparent:focus{background-color:#245557;color:#fff}.theme-genetek .Button--color--transparent:active{background-color:#3a7073}.theme-genetek .Button--disabled{background-color:#999 !important}.theme-genetek .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-genetek .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--selected:hover,.theme-genetek .Button--selected:focus{background-color:#32c154;color:#fff}.theme-genetek .Button--selected:active{background-color:#59da78}.theme-genetek .Button--flex{display:inline-flex;flex-direction:column}.theme-genetek .Button--flex--fluid{width:100%}.theme-genetek .Button--verticalAlignContent--top{justify-content:flex-start}.theme-genetek .Button--verticalAlignContent--middle{justify-content:center}.theme-genetek .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-genetek .Button__content{display:block;align-self:stretch}
-.theme-genetek-disabled .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-genetek-disabled .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-genetek-disabled .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-genetek-disabled .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-genetek-disabled .ProgressBar--color--default{border:.0833333333em solid #36645d}.theme-genetek-disabled .ProgressBar--color--default .ProgressBar__fill{background-color:#36645d}.theme-genetek-disabled .Section{position:relative;margin-bottom:.5em;background-color:#142522;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-genetek-disabled .Section:last-child{margin-bottom:0}.theme-genetek-disabled .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #559e93}.theme-genetek-disabled .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-genetek-disabled .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-genetek-disabled .Section__rest{position:relative}.theme-genetek-disabled .Section__content{padding:.66em .5em}.theme-genetek-disabled .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-genetek-disabled .Section--fill{display:flex;flex-direction:column;height:100%}.theme-genetek-disabled .Section--fill>.Section__rest{flex-grow:1}.theme-genetek-disabled .Section--fill>.Section__rest>.Section__content{height:100%}.theme-genetek-disabled .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-genetek-disabled .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-genetek-disabled .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-genetek-disabled .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-genetek-disabled .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-genetek-disabled .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-genetek-disabled .Section .Section:first-child{margin-top:-0.5em}.theme-genetek-disabled .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-genetek-disabled .Section .Section .Section .Section__titleText{font-size:1em}.theme-genetek-disabled .Layout,.theme-genetek-disabled .Layout *{scrollbar-base-color:#162926;scrollbar-face-color:#2d534d;scrollbar-3dlight-color:#1e3733;scrollbar-highlight-color:#1e3733;scrollbar-track-color:#162926;scrollbar-arrow-color:#75b4ab;scrollbar-shadow-color:#2d534d}.theme-genetek-disabled .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-genetek-disabled .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-genetek-disabled .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1e3733;background-image:linear-gradient(to bottom, #213e39 0%, #1a302d 100%)}.theme-genetek-disabled .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-genetek-disabled .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-genetek-disabled .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-genetek-disabled .Window__contentPadding:after{height:0}.theme-genetek-disabled .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-genetek-disabled .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(54,83,78,.25);pointer-events:none}.theme-genetek-disabled .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-genetek-disabled .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-genetek-disabled .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-genetek-disabled .TitleBar{background-color:#294b46;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-genetek-disabled .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#294b46;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-genetek-disabled .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-genetek-disabled .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-genetek-disabled .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-genetek-disabled .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-genetek-disabled .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-genetek-disabled .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-genetek-disabled .Layout__content{background-position-x:-60%;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDAgNTciIG9wYWNpdHk9Ii4xIj4NCiAgPGVsbGlwc2UgY3g9IjIwIiBjeT0iNi40OCIgcng9IjE0LjIiIHJ5PSI2LjY0IiAvPg0KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSIyMi45IiByeD0iMTAiIHJ5PSI0LjcxIiAvPg0KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSI0Ny41IiByeD0iMjAiIHJ5PSI5LjQiIC8+DQogIDxwYXRoIGQ9Im05LjIgNi40OGgtMi42MmwzLjQyIDE0LjctOS44MiAyNC42aDIuM2wxMC4xLTI0LjZ6IiAvPg0KICA8cGF0aCBkPSJtMzAuNyA2LjQ4LTMuNiAxNC43IDEwLjEgMjQuNmgyLjNsLTkuOC0yNC42IDMuNi0xNC43eiIgLz4NCjwvc3ZnPg0KPCEtLSBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gLS0+DQo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+DQo=)}.theme-genetek-disabled .color-label{color:#bfcc90 !important}.theme-genetek-disabled .Button{background-color:#999 !important}
+html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.centered-image{position:absolute;height:100%;left:50%;top:50%;transform:translateX(-50%) translateY(-50%) scale(0.8)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}@media all and (min-width: 100px){.fit-text{font-size:.1em}}@media all and (min-width: 200px){.fit-text{font-size:.2em}}@media all and (min-width: 300px){.fit-text{font-size:.3em}}@media all and (min-width: 400px){.fit-text{font-size:.4em}}@media all and (min-width: 500px){.fit-text{font-size:.5em}}@media all and (min-width: 600px){.fit-text{font-size:.6em}}@media all and (min-width: 700px){.fit-text{font-size:.7em}}@media all and (min-width: 800px){.fit-text{font-size:.8em}}@media all and (min-width: 900px){.fit-text{font-size:.9em}}@media all and (min-width: 1000px){.fit-text{font-size:1em}}@media all and (min-width: 1100px){.fit-text{font-size:1.1em}}@media all and (min-width: 1200px){.fit-text{font-size:1.2em}}@media all and (min-width: 1300px){.fit-text{font-size:1.3em}}@media all and (min-width: 1400px){.fit-text{font-size:1.4em}}@media all and (min-width: 1500px){.fit-text{font-size:1.5em}}@media all and (min-width: 1600px){.fit-text{font-size:1.6em}}@media all and (min-width: 1700px){.fit-text{font-size:1.7em}}@media all and (min-width: 1800px){.fit-text{font-size:1.8em}}@media all and (min-width: 1900px){.fit-text{font-size:1.9em}}a:link,a:visited{color:#2185d0}a:hover,a:active{color:#4972a1}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dimmer--full{position:fixed;top:32px}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.GeneIcon{display:inline-block;width:1em;height:1em;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAYAAADNkKWqAAACS3pUWHREZXNjcmlwdGlvbgAAeJyVl01u3DAMhdfjUxjJti2S/gDdzKZIUGSRXCGgLXrEmBJVSo47OX0XKZpp0QFpeGMD33uiSEqWLvtvt9/vHvqb+7vuGbWS5H7ff/5w1e1WCi32+/7Tx24XkQ6xvX7UBg37fX9x0e0Cae33/XW3mxQSvr7/ARqmwtDQBAPojBnVBEcRDrLm/4Nfu11AhmO/76/f/fW8OSx5zmcNTkfSo8yUsVI12QStoSI0xwyellSOJlWEj0m0RKrJkWbGAi3atpgKtGhilJK46paQmwnVpaBOoDaJRxwQkp1wCIoZmLIjRApgG5YozV1uVBzc8ESKg6In7YES5kqSa6TJzlZEYMqHJstoe0dgXkbK0Ejs5h9U1pzF0QFtdi3ukQVscoyQkNETIB3KMtvhUbZHzeJoo1oQHWlmegENttuPhWxKBRxDTioHG2Kojv0hrKCTXSawm3NgcKS+zsjYHPVOkme04x9ldS3IR0V75Y7CwQW2iJqAXSwyjj5T+enigH1+Cr7JvO5VjNVhiQe0SxfhxXEAQHCsmqaS7V6PC9udpxBIBgWyJ4BHO37X782xVw6eNESR9siUBrs5SgGlRpLfX22Br014FZ3pXDE85zAoBRTaWY8v//Hodoor5fBPvTHJGFUSwaMu1fPjfBMMKtnRn6eSg7BdpFMBU9o2gjA9b1M8QdgmaAi8STDKAI7D3qmEcqCDbJKURQtvm8kzCeO2wKaljpFgk8Z7b4DfAsexg87eFi7724eb/ub+rvsFmer4u2pZeMcAACAASURBVHic7L19YBXVnf//nvBMIPIUQBsCrfKryIIu94KtLaWl2lCJrVtpdV23PtTea2zTNbBru63QVijutou4m231Rqtl11p/rfZJoqTGtCnWr8IdKliNfhFMYqwhAYyEAHm68/1j7jlz5syZ57m5iTlvHO+9M+fO687cue98zvmcM0cpr6gCALTv3a8BwNzlFyrIoew4+eZLSUmNPo0FdFNYsGA+AKB5736NmMOha7ZrpOC5j1YpAHDbvd+k6+6p2OqrnB0n33wpKanRKaW0dJm2YsWFppXNzS3o2daApvo4Fl2apo/VqzpRW6JibVuMPlY2Fnsq94341SDmQ7Rnz34AQD75S9eukiYoJTVKVQDohtPc3GLaUL2qE+VHVyoAUH50pVK9qhOVjcU4eEWdAgAHr6hTKhuLPZdjxfPyzZeSkhqdUsorqnCgtlGbPXsaXblgwXw0N7fg39L/P11XW6Ji+413YNGlabquqT6Oqoe2YG1bzLFc4YbVdJ9EHR1dNPrKN19KSmp0SiFJkAO1jRoAECPq6OjCVZmttOD2tjX6k41x492bdZOpKtnlWK50R8a0XwAW88k3X6Sd9xpti2FUXlEljVZKahiKGuCha7Zr1as6cVNpGd3Y2rovEkhp6TL6/MHWOlQ2FtNkBVG++byiMj8iaYJSUsNPSnlFFQ5ds11rqo+j/OhK5bZ7v6nVlqhGJMUr5bA3FUCNeFNVyS6sbYvhnoqtys5Zu7VFl6apCfniB5QTn1fU5kckTVBKanipgDxZdGna1J1EKCfzA4CYe5lD12zX2PY5X/wIZMeXkpIafRpLnpAIDIA3E0oK1qWgR4EOOvfRKhqBsfLNDyg7vpSU1OjTWCDbefia7dptq57yVv0UmZ+LtretAUp24bZ7v6kd4trgfPMDyIkvJSU1OkUjQNJ/rqk+Dmy2Ke1kfG7VYwDbb7wDu7Idle+p2Gra5okfUk78kaYnfnS3KVK+4tb1Q2roki/57wV+AaAPG6stUXHuo1XKokvT5q4mbkrBMD+HJAg26qM0zn20SqktUU1D1ULxvcqBP9LEf/l264aCf8Wt65Urbl2vSP7Q8gk333x23Ujk0yTI2raYf1Ngoz4n82N0273f1NiOy6H4AWTHHyly+qKH4iK0YwzVj1Dy9R//cOOTbSONTw2wtkSlNw3wJRV61diD+QH6jQlqS6yZksB8n7LjjwR5+YJzeRG67TvXP0LJt//xDwc+KTOS+AWAbgpr22K0Px4ZYRGpNus3Kzh0zXaN9Mcjm/LNl5KSGp2iSRByY4HaEhXbEX0WFoA+bndzjIzEMG3LN18qmIay7Wc4aKgb+4e7+PMx0q6HAsAYiUEiMXZsbVRiR2KQSIxsyzdfSkpqdMrfSJAIJEeCBJeX6COXEcpw53tpIwrLd0tCSX7++KSMn31SA2yqj/vvHOwj+UF07qNVSlO9tZtLIH4A2fFHitwawUcrP9c/PpZv1w1J8vPHJ9v87s9yN5hcjcQAjGqo091g8sVnNRJuhvBe6Ygq+ZKfTz41wNvu/aZmjMTwWEUk/QC9Do3baNyyns/CBuL7lQOf1UgwQCkpqfAKPhKE7QSd8ECSI0GkpKSGmWg3mLVtMeDemFZ5zfacAu2MJ998KSmp0afgI0FItdfjEDgiORJESkpquMjSBli4YTXdmE43RAKJx4199mxrcGwDzBefl7wlvpTUe1/UANv37tcA0Llzm5tbsLL9dlowzKRE8aeKTPsFAH5S8nzzRZKTIklJvbc1FtBnZOMnJwdgmm4SJbus01LCOi2lqByeMiIwYkR7ahs1dlrMfPLtJI1LSuq9rQIyJy87WTiZk/eeiq1KZWMxHaJGsqjVqzppxpYML3Mq17OtwbTv5uYWzJ49DQdqG7V88/Nz2qWkpIaDCvgVzc0t6OjoQmVjMXbO2q0BwM5ZuzVys4KFT5RpALDwiTKN3MXZS7mOji7TxOR2yjdfSkpq9Egpr6gCicIAfeJwUjVkx+aSkRNsNxKSSPBazo6Tb76UlNToFE2CkOpgrk3BjpNvvpSU1OgT7Qg9VIZgxyGRWa5lxyFZaC/Z4TCy40i+5Ev+0PNpBJhPte/dr7HdVMiHi7oKbMeRfMmX/NHJz7sBirrANDe3oGdbA5rq9fG75JHcLWZtW4w+khsouJX7Rvxq2gWGaM+e/QAAyZd8yR+dfEsWOB9iu8AQVa/qRPnRlQoAlB9dqZCM78Er6hQAOHhFnUIyvl7KOfEkX/Ilf3Ty8x4BAubsLKB3ViZ9AYlqS1RrR+h6a0doUbnCDavpPonsstCSL/mSP3r4w8IAASM7y3ZTuSqzlW4PMxSudEfGtF/APgtty59Tpj+5fLnxpif3AgmganMdw8+e5I33R8vP9/FL/qjmn5/db5LZb3pzGiqAVxn++LY1+DyA+Ag5/mFjgOSO0DeVltF1ra37Itl3aeky+vzB1jrHO1Kb+N9SEUsAKnO3G/q6BvoTsiKW0O+LyK7Pvi7tNP5C+eLn+/glf1TzW4p1vqrqN30CgBiAWAz4hgp8Hsb6w9nHf4sBSAA1SWPdz4bx8Q8LAySzwpUfXamQm6Pa3hY/JV4NwPHWXOyscDtn7dbIcDlb/sYyxBJAGgB7e1by2mKCCQdzBFBVMt8fP+JpAXwff0i+phmjDBVFGXI+r6Hgp5hj5vXqvLqc87XUa7bb1m9+wxf/H9rWIJY1M9QYJhiD8UjE3lwuxr0GdCPsG6bf/1j3tw6NFl2axiGkNdz7TftCTuYH6Gc/Bcdb9B+6Zru2yAOfeFc8a4JExPxiiewXXZMtWJPIvoYRMnIm6IefK71X+JrAbBRFEZTMDZ9XStOQdOCTalqu+FrqNSjJD0bPr4H+x70ma26Mu8WIC7IRYkwvEzPvBa9mHyM9fnINkJ9X0v/3P2wMkPwFAODtBgUik0vB+ueH07mPVtG/AE78NAzzi4N7TBiPvAmKq8UJ4EidL36uNBR8kTlFyU+n9feyhqdpGtLpNOJx5+kUcnH8xPxSaYcI8Mrcff/E/LTUT23LrN8MX/xYClCTjMmRSJDfcdYcyQZifuR9KveGyI+fYXsRzx8WVWDA46xwbpMwEQN0qQa7zkrHVX/5CNC2Gsw3FnLV4qojdYFmxdMEc0QpAaZNyeWsfF4isij46XQasVgMiqJYqtmapkFVVVsTzMXxs+aXjDtHILngs+anJP8hEv75bWssEVwsBfq7UlXGGJk2Ikt0mNBNFABNlgQ+fk3T+WyUl9KMnasAVP/nP3AEGPW0eKT/jj4rnE0hp9nn3KrHALbfeAd2GbPC2fNRJt6BndhIjzVDrlq8feP93vjM8YvMj6z3a4Kej9/u/LuINyVN00wmGAU/lv3l2UWZsRj/0zUU9fHz5pdKOQcvybblkfJ589N+7/wjUBq8HX8qyzdFcdmqMGoY8yMiyT8w78tOlMYmSUKdf7dpN1zMDzb8QB2h7SZGDrIvIOSscCkY5uc0P4mfWenalluqvoC1KhxLwJgRj3CJGcYSxnq1Bth4v+9Z8ezMDwgQAeZ4Vj7X9rcc8nnjHQq+yPySScV+aVseKV9kfsonkvZLg/frj+3qggRneAnn56ayzG/x36M4/yqARPZtKY2J/ARl+T9GNnzfEaCT0YWZHT7QrHDsHzyPkzN5nZWOVHHZJEiaWy/KBANMggTWz+SVH6n5BeD7FW9AxJT4KHC4zgroh29nfqmEvQknsTwyvp35aftutn2P8qsXffHV7P9igH7hk+vYzgDBtReSaJHjRPL9O5xnaow2XsDzfRmglygvqAnWlqhk+Iq/SDLArHQLnyjTTLfRF/CJpwm7wdiYHwn6SBny8VCTAHC/L76dePMjxiOKwETbwvJZxWIxJBIJJBLiiaFFnylKPmG4Rn8R8p3ML1njcNlno5qwfCfzU5Y9EBnfviGBE2uMpJrMPI/VmNsGAx+/CqBGMcyP73sT89YeyPN9JUG8VnODGCCZFU5vA3AIf1i5JD0s2mgMlrablU7nf9maxMhK2NcvAUvSRJgsuXy5R37aU+JDFHU5bvN8/O7nX2R+hG9ryhHwSRKEZbLH6pQECct3M79UzPnnkfTx/YvkZn7aG8uE7yNSHizwxNee5PisqQFms+PXsc+ZpIkKfRRJ4ONPaLoBkud2ckqGCPjD4mYIAEAGNlc9tCVnjKqHttDGVkc+TWIw5pVdhJnf7Ho2YyzKFHvm24g3RdZgeLMRbQvLJ+LNLx6Po6bG+CvBGyFRVHxWfqK/MHwv5pdUFcclDN+L+Snv3+e4+OKL2rftlGAeucoAO4ok1PfPRtc1irUndo1iLiOQiD8sDJD0BCeTGrFj+6IS2xO8qT5uuoeYhX+kzmRuUGuMMNAu2eHKn++d73D8IhO0S0Cw23wdvwOfmF8ymYSiKIjH4/Q1/YwCU4qKz0d3/LG7dYEJwvdqfilotksYvlfzy/TAdvHDX39kl7k6CzCvs29LAIDGRWMa7Gqwr0b0/bvKpu5ud/y+DNBL1TZoEmTRpWnTScmVDl2z3dIJU8gn5kYiPSbJYfnLmLC2FwozxT74TokOpwSJmzwfv0Cs+YleA4b51dTUCI05DJ/IrqrveSSID74f80tCsV2C8v2YX0Gh/RKIL0p86J9K8Jqss34HCcaUovj+aaJDJJcokOf7zgJfcet6xa4tMExfwEA9wZ36BdrIc094dpQHl921ZHmzPeTj3IViqgL75AO6CUbZD9Avn5UX8wMgjAij4BORareqqqa2QFVV6Ta2Oh6G79f8Ug6VgVef9M/3a35R801yNUGAmh/5TWSrv6oKoCQkn0hkfrHs5/HQFzCykSBRd4QOOxLBizz3xJ9TZs5ksdldmCM9k8GxRknWMe2FI3UkSCwWg8qk8vjX7Hon8wszEoIMfyNcYnjks9TU1FBDJI98ddgPP0rzI3r1Se/8KM3PL/8fsuefdmim+3aLTcQGCJhviBBqJIxdAoSAHExQ9P0Pm6FwgbPAgPdIMGAWmDU80XM+yjNlxNgUcrYzdBRZ2ECKIAsb1PzC8NPptJDJm7LoM5lM0CM/defeyM0PAJJzvPG1kp9Gbn5++KnNadqU5s8ErQZIbp3VBuCnYa4/p2ovEbtdZITDNQscaCQA2wnaywXgqyf6/bbZXSLheGCy8ImTWCLQSJBIFaAnPunIzC6qqiKVSiGVMr4AYj5OVc+gIzHszI/l2g1/U1WVRo5++MlNy4X786rEP91veU7MxwtfaXMe05trfnJj3Dqig361LhU97hKoyX51Pw06EiSRTbR4ueFBDEYSJKYZfQOB6EaC5ErDbiQAN57XbkSI6fZXfKdBsi4B/U+gH36O5HkkCjeCg4hdT0yQjfr4drmgfEBv7yP74E3OLgrly5Cqcg32+eL7jf4S/3Q/av7zy8Zn5177PX6/0V/UfFp9JTc+MDXziJrq2G4qxvsPg176vvjGvgR9/7yYoU1VONRIkFzK90iAJPx3hIaPnuheOjmziRIS8fE3RiC3ybrcJz9H8sp36lpDTJAYH2uEdtVSsjbo8bNtfHwCxE+ZXJx/EmWxkRe/PvloakTxfwHgA3AzQU5c2x8xv7eYIoGP3yW761WhRoLkUqQNoHDDarounW6IZN/xuLHPnm0Njm0QJv6Xn/HfBsiOHslGh/G4MbmLL36+j1/ADxIBBuV/+ctXm/YlMjcvz++/P/j5d4sAtZd1k1EWf5k+Z18ri78c6vy7RYC55H8y+/1/AOZ7/Nk2OXEjP4gBvhbh9RdETsc/bAyQzNjOTly8sv12uj3MpCjxp4pM+wXsZ6a34//xzTKkAShM+1Dszr1Qa7hJkUgGuc0oFwU/38d/95v6LcLY4x9K/vkb9fcl24wfearky1BVFYVPfs6xXC7Pv/by/VhfNi/nx59vPrlHIDvZERkyt/6I8f3/Q9saOuxtKI4fCHf9DYsqsGhydACm6e5Qsss6LR6s0+KJyuEp4y8AORF7ahs1dlo+V/68OijcftVNy6181GF7Ww74eT7+9fPq8sqv3QzLfpP1QNWTW1zL5fL8ry+bNzTXX575tSW7kOT2qwi+/58O8fGHvf7yngUmc4KykxWTOUHvqdiqVDYW0yEyJItTvaqTZozI8Bancj3bGkz7bm5uwezZ03CgtlGTfMmX/NHLz7sB8mpubkFHRxcqG4uxc9ZuDQB2ztqtkcHSC58o0wBg4RNlGhnY7KVcR0eXZfZ5yZd8yR/d/GHRBsjODM/OGM+ODSQ9t9k0NmnI9FrOjiP5ki/5o5M/LAwQMGaG52eMHyqO5Eu+5I8+Pk2CkCwMn52JWnYc4sy5lh1H8iVf8kcfXymvqEL73v0amyYm5hR1CGrHkXzJl3zJzwdfKS1dZklBNze3oGdbA5rq9fFz5JHcrWFtW4w+kgHMbuW+Eb+apqCJ9uzZDwCQfMmXfMnPB7+AAPkMSfWqTnJ/LpQfXamQjEt2uAoOXlGnkIyLl3L8AbI8yZd8yZf8fPCV8ooqU3YE0DsLkr44RLUlqrUjYr21I6KoXOGG1XSfRHZZIMmXfMmX/KHi0ywwyY6waeKrMsbs7Qd2/hoA8Mzjxo4/eZU+3GRp+ZWO5Up3ZEz7BeyzQHb8MENhcsXXsvz1eeIP5fHfvHkNipcCs3/NHP+d9wFQsX7efFO5jteAT4yL+PgvL9MHmF7ODsX7MmKI4WMlR03lYgDUOUa5KPh3/3oNoAJKG3Orrs1pqNDnuyBqzZ7/xyP//vWhiNjIHv9eAEBVSZ1juUiOXzAUct+dV6IYy3H3PNrchvVv6rudt+lbER9/bq5/aoDkjqw3lZbRNy787VwApdlXH4I/PQ+gFQBw8DPtdO2DrXWOd4Rl+S2t+mB6xe0eZDYi00XMn29MF+iH39q6T7xfG57dpywtjZbP3ouP6LnnnsOOHTsi5X/9nH0ongcUnwvM/iBQvBQoXgZkJ0zJLmQi1hp07gM6DwAdrwGdh4DON4HOduDBTDB+8S9VuntyVxJA1W/5pgIqVMQQA2LkbjMx8p/x8WJA53wjQvB1/bWooN+qyi0w3/FYeJf27OPnAn//DMz7TL0WlZYGO/4/tdxFn5fgU2jD79CJvSjGcnRiL/biDiyHMYsbWc8+luBTmB/w/LPXfwrGDaD8zoThdP0r5RVVdFam8qMrFXJzQhLJsca3ZsZ5AIBdx1+nz0Xadfz17LPnyaFgafnX6LAVck9+8iFE/LvbjBMRxACNuXI0AArWz9vliy+6LTdvfIrLelbsrFRB+SLj42VnhH7555Ws8WB+rAHamyAAvN7mj//HX5e5mh/5SbiaIICPXVnn7/p7cw0sE/24mCAr9o7KqqqPkfX3/ZfBvGd2LmQNmmUQl+jPsmHP7KyEXvgkkiNGRp6zpkeeP3nXz9Dd0Iurn76BriOPxATXz/N3/oNOiyGatgKwv/5pP8BFl6ZxCGkN934zu8ZqfHavAbMprplxXtYErVHjoWu2a4sEH9zCZ253r0HzZYK8+QXis/vjXvPGx7/m14fli4wvEdP/Dtao5m2XXHIJLrnkElsj9Mon5hdG7Ptfb/PHZ00msATvD3L+6XUkCMKIIVvW2wRs3vnkBLC3ObYzP0B8k1LyByoI32x4xASJ9uIOAMCTd/3Msq+9uCP7p8kcIfrlB1Gce+TF8+mZbKqPW8JSQGx2IolM0lhnGOG5j1YpTfXWj2fHh3vQY5LI/Nh7e/rhazBfUgqMy0wTlCPb7d7vlw8Y5kdmPHMSMUVAN8Lrr7/eUsYrn0R+JPrzo+KlzHvPNRuh5+NXGQ/0a4T8e5n3+zv//LcJc/CbXWKChfOtAPzwVV+RfP/+siJmKFJ3Q2/O+VGJ51vaAPXqr9FmR6I5r0ZIRN6jR4J6eyCpBju1AdDqbwrGH7Ds79otCnQzP7+zktlFePC5nrwOMitaKpUymR+Zd4M1uxo1JYwI+SjQK//mzTqfNb5i2oziXAUGgE6m6bLzgP7Y8Rrw24c9Hv/l2eYPk/HRCq5LFZiWMj2NAfjYk95m5bt74xrOwPg/gzAbq6ipjjk15CbZP/X8/f8S5nNsHL+iLLOJANnPyX8Y/YOQarAbf/2bCjU80u5GqrVgnh/+dtYTngM+8PTrdH3nXYvR3dBL1/HVYC/Xv7XuZj1SL26ZSCRQU1ODRCKBwic/Z+HTM0n6z2y/8Q7ohqW33xntef4kMsztN94B0neHl5nPyUMU6GZ+Qfh2ER+/3i7y49f75ZNjopMNqYrJ+IhE6wBrFOiVX7zUaPMjS5YE/oeZyfwt81o3avZ9ZF+zP+jj+C3hm5356SvUbMhnvgE/04CYffB1/k2Ro0MkyD5nXzMi1WHvfIcQ0pfMoXPg3x8nYoRTJ04AngN6TveZ1gPGujB8DebfHv+al6axPqCL/HZqamqE/ALAOiuT3oWlFbwRkoW8ZiV6zUZ/zzze4X1WLDbVn3Cv/3gxv0CzoiHCKnDAWbFoZMfMuGYxvJjdJRHs+Gf/Os4kPNjF+oMsKGCjkZjlPcQIFx/2cfyXLwdJeJisQHgpMBPCqNYaKnWyOct9zMoWB/tWXR5NkD9N2fVxv7MSsgfFRHSapkBRMoLzwF4DfGSu+pqVkO3CYqfOuxYDb+vPlzzbiiT0P0mddy1G92G9Ssy2/ymbvJ9/9voXRXlukR9vggDcZ4XjZ2Wag14AB3EEE5i96G15oqiQjfjMWeDW7L50hZkVTZQM8WR+jILw7aq61s/nXt7PrGxkT4lY0pLsoCLmF9MgmgnrkksuAQDswMu++GLDE4c4mczfosD2zpKk+u5vVjaR4al0BR/xGltiqvmzkeiLbPd8/CT/YHrOJhpsEiNs3sFce/XHt+1Yw/+ZBbOefC72g5gbQb3ySfV3y9cW4/D0Xiz/rlE2CeDrh3uBZr3qS76NLVnz62nqw38/24olgiSIVz5fw7JbZyfiC4qiP1c2ifnUAC2zgrV3QJs7G3PQiyNohdEf8HmIsrtWUzTMT2nvALJG6nlWKP6vqKADkF/z88WHd+Pj5ZQFDjorll01F6pia34ieeeLqmDiKpkeBcaQyWQcjHCfP77K2hqRXQ8wY0Yqi20QQwwyKx9rZE4mSMrwYte1+eWzcNb8yB9HOykwz2JNDFDxyQe2XLkYKAV6+ozqbBLAV/+1FGg2U7dkI8KeJnPVdy/uwOUwOmoH+f3xR2cnanaKTRQo4NMkCDsz+6dnd2HGwkkAAG3ubCYKLGV29SGHqA8gnaCJAR4/eBpPdUzzNDO8VrI3+70zl3NNDEgaiZAg5ieaGV7EJz3M/RqfnSjIB59GgD4zoKJIkSZDPPL1ER5ANBlII1OgbLrf4/GT+Wz9dnkVST8fMcSgbrzF2/E/yRgICWAtwa8gMQLBdxYD9Welzev3r4GvzM+d+z4fx6yhvf07sESAHr//fXdeqSczrlyM7uJedJ7Vg4v/Q6/vvvSvpSg8Oh49TX1Y8qz+G++8azEAoL22GwDw38+2mjouk0TIvE3f8vX7Cyo2+mPXKZusx0//XpPGwaqHtuDEW704fvA0fbNRhW0FMTZWfJWXRH6s+Z14qxdVD22hjZ28WL5Z2faAbBSoQfNtflr2XzB+dMo137aa7JvP9/jVl0xG1PZkSN8ufi+geubHsv/0nw+7uHUFSljeQ/cV83H8vNlZk7GcuIqZqRFSo8+9n3+z+S1aFMf06Wf7WM7BokU/sjD8Xn/dxb2Y2mk0gR3+9nl6JNsMFE4aj8OXnYeX/rEU3Yd7LeYH6FEhzRT75JMo1znaFUtRrH6gKGJ+AWD0xCaTiqx4mJlftL0DAGuCbBSoy9zfz9jOmt+Kh++nPbGb6uOme3jx/PXMNJNUsWwLt8b9tQUARYPtv5QGpID1JXWe+WRsYY3NYien8mxPdK/8KOWHr4/ttRpYQcGfITJCYnxku2hZP+9znvkfKzmq96/j/hltIbwREuPj3xGjPvKxI0e9H/+Tu2xaANjaqegvriZY9HbC9Vf6+f6NaT5XrPg0pk49x2UpFqwrxYoVrwX6/v93nh50TJ2km9/p/gEc/uF5etb3DaAn3oeeeB+wAChsH4/OP/cA0JMhKegR4eFvn6cnSZ7TGXfP03xd/2TuacW1WudNdsdvOxKErQIDECZDrHreZr2hYD3Bs4NbYgLzq9Hcu8kkAZT451uT9c7yUj5XPeHdoj///BrYRVx6O1+MeU2MD7CGSORPwOd88VXAMpqCtOdZgzBikLCYFin7seyj5+Pno0DroAwf0oBsO5jf73/ChNkAJkJRCrB794/w0Y/eInj3GQATAQC7d6ewciVpOphO1xMFuf5mHp+EqScmoLuhF4WTxgNpoGduH3pK+lB4znhMPjwOS/63lVaF8TYwtXUC2o9246ZnzddQ2OufRIS8Mdqt51MHPJ8aIBmLB6Zxw2p+1ujPrA+BmOARTMCcubMxAx2mEuc+WkXH4rES8c0iqXHG/FTN/YLkfi1++O3wJy/lvfIVRbFtyPUj0v5XVfL3vvid+4DiZXy8a2SG9YRHAZf4MDpDE3Vy93Pwfv5jliRIjM2wIgGLScfE5qirzh+fNUBTVxgvOUhW5i/Rz/F//OOPAJgFYKq+J03BmDFnc/vvBjAl+3wqABVjxpDXZ+PjH/+/+MMfgvCB7tO9mAo96mtHN+Yumqqv65ygX+wTgZ4zfSicOB6Hf3gecFjf1t2j1xZvejbB9A3c5ZvPi60Oa5pGzc5uPWBtReb5wpEgHQ/8CwCgpvcS4Qf5zPwPCzs63/rn/xWWX9f6jKka7N4Tv4xJgrDGBxgXn0tDqcr8GrJngVSDvY7EuMpm14/ZrF9ns/7x7KPvkSgaPCdB7CJAdjSIHAnicSTIm/xAfNb0gv9V8j4SogVADCtXPp3dOgO7d8ey6/g/Ssezy4xsuQQANfve4wCA3bvfhT4S5Hue+P/4ZlpPgnwtG9G1Au1HuzF31lR0PwBinAAAIABJREFUF+vmRoyuZ66e9S2cqCdGCieNxweeNvcIIcmQV+f5HwlFxEd4vAHyZiiqOouuf5uRILr59bc2C5fftvwfy85v/fP/Csv2Nu3HY6WfBBC0J7qd0cW5JSs1Zpgf6Z2ZlV/+EZvFTm7lfY9EUeCpyuXF/PzwO17L3s3lgGFgfCRnJ1KOvJfu65B3Pq1pmqqcXuuejOPFYNqXv/PPtuNFIz/8FSv2obd3Jnp7Z2ZNTVdv79ncMhO9vVOyjyQ6jGH37suy66dgxYoCX/y9uAOHL+MCnPcD7VO7jaRIaXa0xxvAqb5+9MzSza9nbh9tAzz87fPQeddibMkaaVQjUYLK80iQn/5pAvpbmzE+M4DxmQGMO9VFn0+cPBWZ7h5TtEfMj5Rll4mTCtHbtB9/GjfHR0/87EgQU6dWvgNoWl9ULbswxkdCAcYXlI3+e6I/a7PYybF8kJEoUdSBA/A/MS6OzkMwGaEf8cbXeQj4wvne+eqc5Rbz8iX+vTFAbfMxEmST6F4i4czQ30iI+9HdPSO7LAMb23Z3n4Pu7r7s4znZMpOzj+fA+AHE0N29OLutANioeOYns8fffbpXX3p6MXf6VBROHK+3gjUD7e906+2BACa/NU7f0QIAbwB4AZi6fwJ6nulDd0Mviv/rZSQ3+b/+RXdB0jRN+LuwW0/ldyTIuFNdRnfPvjPQ+s5AGT8RGQCDp8aiYGqh9UOcOWl6feb0aUyaOAUTJxUCPe/SgxV9Ptue+GoMiPFRIIn60kZfQZX5y8+KawUNMxIlCvkbCQLo3Sic+wPyI0Wee05PvYluh+WVT+7jF+aWWOz9AHG+P75ztxOPYiPINp/8HMkr/7XXjqG4+FwcOQKww1KamoA5c6YBOBtAE4Bp0BMdb+PIkQVgmyWamhZgzpy3ceTIgG8+ABrtdUM3wqmTJqD7NHPnlwVAYfN4PRLcDXSe6cHkieNoGyDpJ8i2w/nhJ5PGO/U2cc302ss2Xp5HghDDO/1uFyZOMjJJ2pmTGD9xCga7e/DVg3XInOxAwZTZGJ95HRpgKj9x0iRoZ05CmTiFvt9zT3DScEBMEGA6RpPbHcaN1zHBL6XGGjoEHYkRlbzyyZfKfpnCNkHmtZPx+eV32mR09MQIm9kz2v/s7ggdhG9qxlOzl4CqJ0ZiMT0jrHq5GSrZz2988nMkr/xMRs2an1VHjhyCbnyHsmteyj6Ozz6qTNmXEGQkyNRCI5kxtXACupt70b0ga34LADQBPe/vA7LdhYnZsUoCwKvBjl8kJ2Pz2l3GdSRI4YbVtPAfPnsM2kA/fd3bP4iJkyaioGgWAKCvYCwyp7tRMGkqxp3S77WfOdVtfKixemj88d/MpOt6tjU49gRn+XvTzxjVWJqV4weIutSP4sDy+CcD8dPpBuEu7b4hu68gHjf2GQnfpseLYjNwIij/xrENkdwSf+esYHztvmfo7lWA/o9NhHgxQGV5sO9/795nxCfUp5YH5KfTbDscf77Z9DQ/bI79jaiIx88KxL/yfUdMJth+tBt4v5HwICI3Q6BiTa8NiP9rtNe/Xzld/9QA2/fu1wCAnTh4Zfvt9I2bk1+HNtCPqZnJdN3xwrFAQQE2/9cmuu5bX/wnTBg3xlQu/lSRab8A6OTHRG58khlWfmPcKUb7rD4pzPor68zlAKMdMSJ+mEmRcsX3OilMFPzPXLcGsz+o39WFHv+dXwbp5MyWI21+UfL/eHmZ/rNmJjuKbb6PdnJmy5E2vyj5okmBtDuz19+8Osdy0Xz/2XsEsneK2az/Ka4q+R5XTgU2GruPgj/+/K8CAP79w8bsbak79evv1XnM9ff0Gr254Y8j4/ofC+gzMvGTEwMwTTe3MfXvlunmZgimpfve//ynpRyeMhyYfJA9tY0aOy2eG3/95jrLfpXfLLfwReWi4KNkl5UP6/GLyuWK3zSE/N8+LDj+TbDwReUiOf4n66By+1Vxi/X4n6zD9jk5uP7mCa6/TYLrT1Aumu8fHr9/YPuN+yLn1+K/LfzkJgH/spF1/ReQOTnZyYLJnJz3VGxVKhuL6RAVkkWpXtVJMzZkeIlTuZ5tDaZ9Nze3YPbsaThQ26hJvuRLvuTni2+5eVFzcws6OrpQ2ViMnbN2awCwc9ZujfSfWfhEmQYAC58o00jfHS/lOjq6LLO/iyT5ki/5kj9UfKW8oso0Mzs7Yzs7YJn0nGbTyKQh0Ws5O47kS77kS34++DQJQmZm52dsj1p2HMmXfMmX/KHm036AxBlzLTuO5Et+Pvm5/uG5cfJ9/KOVr5RXVKF9736NTROTFHHUIagdR/IlP5/8fCvfxz+a+Upp6TJLCrq5uQU92xrQVK+PnyOP5G4Na9ti9JHcxtqt3DfiV9MUNNGePfsBAJIv+fniD1XkZydRF5DRdP7zzS8gQD5DUr2qk9yfC+VHVyok45IdroKDV9QpJOPipRx/gCxP8iU/n/x8K9/HP5r5liwwoHcWJH1xiGpLVGtHREFHaFG5wg2r6T6J7LJAki/5Q83Pt/J9/KOZb8kCs2niqzJb6RvCDEUp3ZEx7RewzwINV/75bfoQpyQzafsPNu/EAHrRUdJE101om4ZB9OMHG6si5T9+/WYAQGuBcTeO970LIAN84dfGRDY/u/R2aBkNR+YbUxi8F85/mKFoXvj51nA//+9VvuWO0DeVltE3trZ6vAumi0pL6e2E8WBrneMdYYcT/1ut5hsvDKIPg+hHP3oxiH4MoBcD6MMA83oQ/WjC02jCMziEP4Xi4x8nmfjaYAYYyEAbyEDLaEBGX6f1Z/TbAQ1q0DIazrzRhTNvdKG3rTsUP9/nv6UlzL2wDM2fb0QIdvx8azie/9HAt8wK92BrHa7KbI0MDugHclVmKx5srXOdFWq48L2a3yD6OfOrN5lfUL5n8xvUHM1vpJ5/P+b3oQ+JJ+ki61taVEd+vjUcz/9o4dvOCudHiewf2BoP12zoWdFiMaTSYlAyHgNU5w8RhO9kfvpz1vzqTeYXBd/R/AYzjuYXBT9KRcFfsWIFAGDPnj2O5vf889ZZCu34+dZIOv/vJT4dC9xUHw9dLUjE3Muc+2iV0lRvveW4F34iDaTSKpKKbnamRdG3JVzmSvLLNyK8PmHkl8FA9vkABtBn2W9YPjU/8veSMT9k9EXLZI3Qg8Kc/ygUhM+b3J49e7Bnzx5hGfIoMj8nfr41nM+/SAsqJ9MlH/yaS16mSxi+cFY40axMTkrEgO7sb3/qePtI0O+saCZGGqhJZiO8WAyJlErnjVVV67YawTXulU8SHrqx9WXb+fos5jeIPvTjTNb8evF/0YiD+KNtBOiVTxIeJvMbzEAb0I1O0zSAPCdRYEbD6dffQd/bJ20jwKDnXxP8UVECeIhXPklkEIlMbcWKFRYTdJPTrGz5luP5Dzg3DH+X5DC/P1YLKidj1urx9PXRhj40V59y/TxR8WsueRnnrzOyxq8+1oXEc4sD8WkVmPSfaaqPA5td9yXUz14C/n4J8LH5wB8F3ay233gHdmU7Kt5TsdW0zZEfi0FVVUBVEUsBsZhqGF52eyKlQlUBNak/ImatDnvlpzaX+TY/PTo8gwH0wk5e+aWZCb7NL9M36PTVBD7/IvMj6/2aoFf+3Sgzmd7zzz+PD33oQ6ZqbUGB5UZGJolM04mfb9mef01DTQ0/FaY38VMqBP79MSLm13csg/EzC9B3LEPN0M0Eo+Dz5gcA56+bhhq87GqCIr5wVjhTqtmnfvaSzYYAs6IRxRIq1JoYkADUmpge3bHmpuoRH1smluDCUB/85MblWfNjq75u5udS/fXBby3o9WV+2qARIWgDNlXhILPSOTQn+I4AffCVTcstVVjymq8OE2Nkq8CidkGnWdnyLS+/v5qaGpMR8qbotA1AqN8fERv5Hbj5hOlx1urxztXhCPis+X1s/ftMj+evm+ZcHfY7K1wYiaI/oiCzcqkq+Z8R1SUSCcSydWBVVfUvnSljlwvxyh/IGp2e/DhjMr8B2ubXy5hjH87B36APpzCIAbThxVB8P+ZHEiHjZhcikzXAvvaecHwv5pcyT49Ef3Y2c5P44QPm6I01NRIJisyQf59Xfr7l9vtLJBLUBBOJhLCM0zaisLPiDfZoGFOoIP4r3YjI42CPt9Malt9z5AwK50zEU1/XJ4Qijz1HzgTi03pEbYlqmagkF7qnYqtSW2J1J0e+yjT2QZ8vNBaLmRY6hyhxPpvJkrzySfV3EH3IYNBkfmzml5R5Hc+iGXtwGC9Ec/w+za/3rW70/rUb/W+fhOaQDwl0/hkpKnTj48zPJJtJm4Lw+aowv14kO2N04udbbuefRHXECMkj2UaMz626HOb7b64+hXde6Mdgj4aTrwyg71gGJ18ZwGCPhnde6PfUDhiGn3huMd7cfQY9R86g57je5NNzfBA9R87gzd1nPLUD8nzLrHB6Hdwllcp/sGwSxLb6S7TRGKxsNyuUG580CPNfOnnuOD2eR/5/bK6lxkYMz/yczQbr5vcGXnCM/PzwS7oV/+b3pl4VsYv8/PCxOS1OfHjwjQSYSBAwR4Me+WSEBys7w8tkDLcn7YIkOmSjxOeff55Wg0X8fMvu+g/TBphIJMy/hwh+fwCEVV0v5heW/+8rf4MP/10cHU09mL1In5ecmOHsRYX4P79K4+u7P+uLTyNAMrC46qEt9jsIqaqHttDGTl5e+Jqm6ckQgD6yz1VVdcyYeeUHMb8WpJ3NzwffYn6a5mp+fe09zubng28nzUM3JzJrMI0OmWgwKN8uCmTNj7zmq8ZseSd+vuV2/kVtgKKFbBMp7Pe/oHIy3l85GdMvHoeiC8fSZfrF4/B+D11iwvKnD56HVx/rQuGMMeho6kFHUw96jg+icMYYvPpYF6YPnmf7Xju+ZSTI2raYaWydnV7eeT9+vn4Nfr5eT1m/dcK5PElBu/UEt+MT86upqUEymTS1dSQSCSSTSdTU1NiaoB/+kZKXPZmf0Q9wwPV8+eF/4ddbTOYHG/PL9Gdom1+UfKfvn5igyeQ4WX5+KX98dmwvYE6AEHPjzQ/QI0BRO+Dzzz9Pu8AM95EgbuefNbdEImFanBT2+ycJkJmrx2NMoYIxE5mlUMHM1eMdEyFh+SQBcv66aSicMxGFM8YYy5yJdJtdIsSOH2gkyMs778fLDY+jvtHdKHkF7Qmuqipt7yNGyLd7sNvD8r2Y3yH8CYfxgmvkF+j4WfMbEJsfafNzi/yC8JW4QxeYmF4dJj85S7WXXZ+EKQr0+/2zXV8ymQz27NlDR4IAuumxBslni/mEyEgdCcIbnMjwyDonMwzy+2Ozv1MAvNuj4axCowZLXp8EXLvEBOGLur4Uzpko3L9blxieTw2wqT5O7qvl+JcxjPkBek/snbN2a+ztarzw4/E40um0NfObFWt+8bh9Hw2vfDfzG0AvMnDvexeUz5ofP+wt029EP04JjzB8wJsJkloxb4KkKowU9HbAEv98wGxgpI2PPJIoUJQhdhoJIuLnW3bHryiKsEbDJkXsJGoP93v+TZ2ej2WAmQU4q1DBu0zWl5phdruTCfrls+ZHMsB2ItudTJDn+x4J8vP1a4Tm9+pR5+4vQDQ9wUkGWCRVVZFM2vfB8Mqf1DbTZH5Gtte4+8sbeAHNHtr9gvB/VvZ1V/MLEv1FPhKEiezIz9ASCTIRYNXmcCNBAHN12C4i5MsSjdSRILxIYsRT4o9RkO///ZWTMXP1eLzT0Ieii8dR8xNFgO/2aDjxQj+mrx6PYw19eIMzwCB8YoCvPtaFGYvH0eSHSB1NPTj+cj8tzxugiE+vFtI4uP3GO7ycy0DafuMdtLGTl1e+qqrCKq7d+iB8N/Pz1PE5BN/O/LSM/seRjhLxGf0FPf9K3LoA0M0t+/emBmbzo22EKaNcUD4xMr6qS8yPDIljq8OiCNCJn295vf5JNOjX/AD/539B1vwGj2WgATjxQj9OHstQsyPLWYUKTh7L4MQL/dAADB7LYKagPdAvn5hfR5P+R/74y/30OS9ifuS5qD1QxPc9EuQLdweL/qLoCQ4YoT+pApPEB7stLP/7G78mND+2MzQA+uhJPvjt88YLzY+8pjc+8HgDBL983yOBktakiOmbSPnjszczBcRte+RRZH7sdqKRPhIEMMxPURS6eFaI779r/wAOV58CudqI6ZGFVIczAA5Xn0LXfkFSMAT/+Mv9nvr4AXpfQWKEXvg0AlzbFvN8UZCbHbx61KP5Mbrt3m9q7C2sg/CJ4ZF2P3ZdVHyR+ZHESAv2oQVpvI1XPDGD8J3Mr7+9B31/PYn+Y6dzxvermmwkaDHBpHldED6f0bVr4xONH+Zlx8+3vJx/36YnUJDzz64cBIQR4KBN+Sj4UYrnBx4JUqPqxufH/IDwIxHCyitfbH66KWYg+AuT1XTMi4TvGPll7K+TMUXjbbf54YcS2wybMswxDN9uDDCRU+KD1UgdCRKVgpz/ogvHmqqzdhEgoFebiy4cK9pNYP6MxeM83/aq5pKXMWPxOM98y0iQwg2r6cZ0usET1E3xuLHPnm0Njj3BvfDZccBEfFY4Cv6S9A2c+fXiTfwZb2K/MPqbjnnIIIN38VYk/DfOedNifv1/1RMfouhvTNF4QAMGu81V86jPv5MSKW5McAqI3x+Mv3fvM775Ii1f/klXfr41HH9/Rz/8PGatHo/BHg2DZzR07x/AtAvH4qyZBZYs8LvHMujaP4CpF47F+JkFpuFxQfmJ8dU4f900Otrj+Mv9tokQ0gY4Y/E4FM4YQ8snnlvsyKcG2L53vwYA7MTBK9tvp28MMylJ/Kki034BWCalDsJPHNHv9V/45Odyzm9tOwAAeHzjzx2P/8G2L+kGGDH/oUW3QDsziHc/PseR/1/vfkY3wCE4/7bffwpAW7T8MJMieeHnW8P99/erv/scFABvTLuArvv4stcBAH9b+aip3PSLx+HPry2MlL+oVK9ZJT55PV33x+m/0Zl3v2QqN2/lRHx6/NWe+GMB8eTMAEzTzaFkl3VaOlinpROVw1OGA5MPsqe2UWOnxQvCr6nHkPFrS+Dx+H+cm+PHfR75v8X224bm/Nt+/23R89fPq7PwlU3LLXxROTd+vjUifn+/+qVlv38QTEuJX/0S26fl4PcH63SXH6v/rHVaTKhIjPfOLyBzcrKTBZM5Oe+p2KpUNhbTISoki1K9qpNmbMjwEqdyPdsaTPtubm7B7NnTcKC2UZN8yc8n3/KrG2Ll+/hHO99yW93m5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJT+f/Hwr38c/2vhKeUWVaWZ2dsZ2dsAy6TnNpqpJQ6LXcnYcyZf8fPLzrXwf/2jm0yQIqQ7k+qKw40i+5OeTn2/l+/hHK5922CHOmGvZcSRf8vPJJ1nIXGeH7Tj5Pv7RylfKK6rQvne/xqaJyZcTdQhqx5F8yZd8yc8HXyktXWZJQTc3t6BnWwOa6vXxc+SR3K1hbVuMPpLbWLuV+0b8apqCJtqzZz8AQPIlX/IlPx/8AgLkMyTVqzrJ/blQfnSlQjIuB6+oUwDg4BV1Csm4eCnHHyDLk3zJl3zJzwffkgUG9M6CpC8OUW2JtSNik6AjpKhc4YbVdJ9EdlkgyZd8yZf8oeJbssBsmviqjDF7e5ihOKU7Mqb9AvZZIMmXfMmX/KHiW+4IfVOpcTfe1tZ9iEKlpcvo8wdb6xzvCCv5ki/5kj9k/PKKKixqhIaNca28ogr16NSqSnZp0G/rFdlSVbJLq0enVl5RBWyMa4saoZVXVEm+5Eu+5HviH/vO0sj5nmeFW7VQb0hsPGh/O3EvZYLOCheVJF/yJX9k8md+5wB9fnKzkTmeslHPJh/7zlJTGS98Oha4qT5uO1HMqoXFaDzYicaDndTkgpQB9H46TfXWW3478XlNriyzLF4VBR8Aupe/SBc/ioofVGH4l53/Ucd9u20Py2f1wgsv0MWPRvL5zyd/1aI5dpt8lYvi+In5FW7cj8KN++lr1vyOfWepJ77rrHDE2Fjx67yUAaKZFQ6JDwAbqjHtlXq6quuCS4FtlUDNYfv3RcWHbn5Tbiilr0/+pBVT917k+J4o+UEVlr/9Cx/BkwcUPP3qsyazI68vX6qh6ud/yhmf6IUXXkBJSQl93dbWhosvvtjxPVHyAWDdunX0+WOPPeZaPmp+EIXhs8bWfGoibr/9dixdqpvMgQMH8PP/vpNub2w6Eimfj+xObr4QhdmoDwB6Nl9Io0C/x+86K5xddbbxn8vw/b+7CNd/aL54u+B9oWeFS3wAv6s4BLzbja4LLqUL3u3W1yc+YP/eKPiwmh8ATLmh1FMkGAU/jMLynzyg4PKlGi47/6NYfM4ZuhDze/KA8x/wKI6fNz8AKCkp8RQJRnX+161bh0ceeYQurBkOBT+owvCJqTWf0ufl/f73vw8AWLJkCZYuXUrX25lfGD4xPzaq68lGfT1MVdgu6nPi+54VDgDu/OwybPqNnqFpPnYKC2ZOdiwPIPCsUGw194/3vIQf/P1K/G7c1Zj2Sj1dfjfuavzg71fij/e8ZF8tjmBWNNb8lK/MMD26mmAuZ2Xzogj4i885Q01w/qwJdCHmt/icMznli8yPyNUEIzr/xPxYeTLB98D3f6DdPNXCddddh5deesl2e9T8CWMUU9sfa37sej98mgRZ2xYD7o1plddsd9xP1y8+iGmfr0PXLz6Iz37zLfxm6wxM+/xr2fWvOX8ImMfosbLjn6quw5TvfR6Z9hO44pf/jHerdmNv83oMvNJGy3wB69FVtRt7fnkrAKBgbhFOfusXkfB59bafxIS5U3BmYysA0Mfe9pOO74uKT3TiPuOW70W37PX0nrD8l/86MWtyE/DwJ/+E6575CH1cfM4ZvPzXiTnlA8Dp06cxadIk4Xoviur8f+QjH8Gf/vQn+uhVUfGDKhf86667bsj4hTZV3Z7NF2LCGPcmRJ7va1Y4ktzo+sUHTevJa6fkB5HfWaEmV5Yh034CBXOL0P/CYZxVeCsyx7pRMOcsumSOdeOswlvR/8JhFMwtQqb9hG1iJMysaFP3XoT+XcfR234Sgx19OPmTVgx29KG3/ST6dx331A4YxaxsJ+5bjqnLbqALa4ZDwe85vxzXPfMRAMB1z3wEPeeXDwn/4osvxrFjxyxmd/r0aRw7dsxTO2BUs+J95StfMT16VRT8mGAZSn5zczN9ft1115le54LvVrUFzMboVN51Vrim+jjtYc2r8Z/LsOk3+7D2b96H2r+8RavC5PWCmZOx4/kW4XsB0DC0epX9rFAiPokAAWD86gtM0R/R2AtK0Negz9RmGwEG5PPqXv4ixq2ZQV97Nb8o+MT8LJ9p30/cI8EI+Jed/1G8f3oPSi/7Aj7/2uv4xQfPQ+vTP8cb7xTi6VefzTkf0KvCM2fOxKRJk3yZX1T8devWYdu2bfje976Hb33rW9iwYYO3REhIvpZOIB6vwRfXAF/bYsy2/F931OB/dgHpdAJKXDwzYhT86dOno6ioCADw2C0Gf919OvPEiRN45513csbnkx+8XJMhAj6NAEnjYNVDW2zfv+o/6kzm98KhI1gwc7I384M+gRFp7OTlxM+0n8Cp6jqcqq7DwCttGHtBiWUZeKWNliFmGRWfiHR7GbdmBgY7+ugybs0MT11iwvJZ84v/+SumRy+RYFg+oGd833inEEeffRz3du7H0Wcf92Z+EfBJt5eioiJaDZ40aRKKioo8dYmJ4vgBPeu7YcMGXHLJJd7NLwI+a35KXI/7lHgMX9uSwBfX6NtzyX/nnXdw4sQJk/kBuhm6ml8E/CBio0ERvwDQU9BN9XE6qQg7to5o1cJirFpYjNt/pf/IXzh0BLV/Mea/3fF8Cy0jEklB31OxVWmqj5vu4eXGP1WtT3s4ubIMBXOM9h82EiyYM4lWe0n5qPiAkQCZckMpJsydgjGzx9NlwtwpdJudCYblE53pbgcAPHveRtMjWW+nKPiXnf9RmvE9dXqQLiQz7NQPMCyfJEBKSkpoFEJUVFREt9mZYBTHv27dOroAwCc+8Qnh+lzxqVQVWlqvxmlpFVDdJ3qP6vh/+9vfAgAe2fN70+Nvf/vbyI/fS9XXTSSDbMf3NBJk1cJiGvEBwLe//S/47nd/AEDPApPXbBm77jNBe4JPrizDqa9+DdNe+TW0njNQCgcw9oJpAE5C6xmLgpkTcOqrX8NkiA0wDF/U9WXC3CnC/U+5oRTdeNG2ShymJ3zRLXtx4j4AC9dAO9mB052NwKRFOAOg/+AuT8mQoHzS9WX+rAlYuXI+Lp9qHH9390kALWg52gvgo47RYBC+U/aXFzFBuypx2JEQ27ZtAwBs2LABZ599tmWdm8LwVQDYBUzsVJFggrCaGhX/o2a354g/ffp0fOITn8CSJUuAJUtwbXb9tSs+gYUVX8FLL72EZ555BtOnT3eMBP3w3UZ1BBHPpwbYVB8n99USZmlIxPftb/8L2l77M750zaX48aP1ptebHq3H2r95n+MHOPfRKmXnrN0ae7saN75hfvUYeKULYy+YBq2HfnQohQMYeKUL01CPLhcT9MtnzY9kgO1EtjuZYJDjZ0VMcNzCNcCU2QC8m19QPm9+U6dOQfG5TFeFQ2msXDkf2N0C4AycTNAvn5gfSXzwGeD+gQGMG6tfC6SMkwkGPf+k3W/Dhg0oLy9Hebme+CkvL8fvf/977Ny5kxqhU5U47PcPADUq+R/z2qOC8Enb3/e//33a+XlJhZH8eemll3DdddeZInM7Ewxz/FOYUR92293E8z2NBGEjPmJ4AEwGeOD1v2Jv+hVa5rvf/UEkI0EmV34K41cvBgD0NbyEgrnTMfaCaei64EpaZtorv8bAK13ItL+D8auXZMu+jFPVvwvNJwZ48ietKFg2BZOXzsDJn7RaRoJMuaEUpw4cR2b215XPAAAgAElEQVTfSVqeN8CwIwFIG9+4bARIpEyZjf6DerXByQiD8Fnzaznai4ovLjObX1adh9K493/20XIv/3WixQSD8IkBtrW1oaioyFL9NZ2fEydw4sQJWp43wKDnnzW/Rx55BNdeq8c/oueknMgEw37/MQAJh5RvjUsUGITPJj5YPfzww1iyZAk1P37bZz7zGYsJRjUS5iSX7OBf2ynQSJA7P7sM3/3uD/Clay51BQDAl665lFaHeQXrCa4gc6wLfQ1/wfjVS2j0d9benXTResZi7AXTMH71EvQ1/AWZY10ArBl1v3xifqcOHAcAZPadxKkDx00ZYAAYt2YGNT8AOHXguLA9MExPfLbry8Spc6FMmU2XiVPneuoSE5Q/f9YEPHlAwanTg+juPonOQ+a/3p2H0ujuPolTpwfx5AEF82dNiIRPzO/EiRO4+OKLqcEJz092Gyknag8Mc/43bNiAlpYWXHvttZYIsLy8HNdeey1aWlocq8Fh+DEAX1yjm9wZrpn9TLG+/otrnLvEDMVIlIcffjivfCf5HgnS+M9leOHQEaz9m/fhx4/qY29JJHjg9b8CAI0GSfT340fraVugaZhcgJ7gpOo7sP+vGHuh3gZEqr5K4QBd2PVjLyzBwP6/6u2BbF/AED3RM/tOmqI5vhrMvp669yJqhCaF4Iu6vkycOpcurGxNMACfJDya3jwFAHjjnULUPNJk3TeAmkea8MY7hQCApjdP0cRIJMdvY3p2EpYPyCfRHwDMnz8f27Ztw86dO7Fz504AoM+3bduG+fP1633btm3WhEDEI0HOFBuLJwXgs9HfiRMn8PDDD9NlyZIljriioiJMnz49Z8fvWzZ8GgGubYtZekmT4W61f3mL3ulFJGKGpAw7TI7Xbfd+U2NvYe3EB2C66UHmWBeUwol4d3k5ui64ki7vLi+HUjgxG/lZ3xeGH7X88lnz4zO9dq+dIsEgx++1mwtgdJOx00g6/2zVl1RpRW2A5eXlNPIjXWSEJuiTT0SiP14TBT9HtyjQL//hhx/G7bffjnfeeQef+cxn6HoyBG7JkiU06jtx4gRWrlxpKheWH7V4vuNIkC9dcyk1P8BoDyTRIADa9vftb/+L6X6AtX95S1htDtMTvWDmNHRdcCmKdj9mWbouuBQFM93nFg3CL1g2xfNtr7qXv4iCZfaJkqDH373vJ9BOdqB7308AAKffPmB65LdHzY9KQfikn58XkX6CUfJZsRHg22+/bYoAvSgMnze8M8XmdSJDDMPfsmULvdkB0XXXXYfrrrsOfX9ogFr9n1Cr/9NkguR9UfDtxLf3eWn/s+NbRoIUblhNNxa++xLW/s37aN8/YoBtr/0ZP85mfNnM8I8fradmSUaNNB7sRDxu7LNnW4NjT3CW/8qHx2HshedgYH8bgAKMX60nHtgMMD2QbFW4r6EVQMaoClfXBeb/XrkbU24opUPfMvtO0kQIoLf1sc/J9jGzx9PyU/deFJjfcHM3pi67AaffPoCBt/eZkh+k7e9Md7tpXf/BXRh79jJMOnspHR0SlD/9ZB+tApOo7v3Te7AhudyUCOk8lMa21F5TmUXzJtNbZwXl//CHd6GoqAjjxo1Df38/Tpw4YZsIIW2AfPmLL744MD+dbsC6detMCY1169ahpaWFVodJ2+D8+fMt5cjrMHzASH6QJEdKEOKVPd6MqxYsMJUjCsrfvv27NNGxcuVKWiV+8OabMGPa2Rg42YmxU4pxvOttxCr/iZb74Q9/iKVLl9JESNjjDysnPjVAMmM9O3HwyvbbjZPRtka/x981Rrve9U93ovnYKSw7/b+O5eJPFZn2C4BOfkzkxn/w336D/hcO49S0Y3TdtGV/CwC4sfIqUzkAePc1IxsaBf/Os/W2tqlrbqbrtLl6lnn9XXtM5catmYGJ+Fyk/O/esRHjFq7BpD88ZfCvuFHnf+5cUzkAKHrLqE1Ewe+Z9696Vfjzxh1fjn9K74y2+e9LTeUWzZuMqg/2Rsq/5nG9PeninUb3i7du0b/r/7j4JVO5mTNn4rwd10TKf/NDD+iGxrRPtdz8ODZs2IB5z99sKldeXo4bDv13pPy7N34LAKC0GW9r/pJusP/50VdN5f7rVyr+abnxOaM6/meeeQbvfNW41v48O4GLpvx/WL/xjKlc58u70bhuXqT8MJMiOfHHAvqMTPzkxABM082hZBe2X2Oebm4HrNPSicrhKcOByQfZU9uosdPiufK/AcG0eLDyBeWi4G+Cdbo9pf5TFv4mqNiOmyPnf3vLZiv/Cevxi8pFwa/FXXia2++M31n5tbgLVZdGz3/0Kuv5f999n7Xw9XJfif74nwewsdm03/kPXIWq57dYyt2wKPrjX7/5e5bjX/DjdZbjF5WL6vjf+ar5+P+2Hqj6d+vxP3Zjc/S//5Jd1t+/nf/4OP4CMicnO1kwmZPznoqtSmVjMR2iQrIo1as6acaGDC9xKtezrcG07+bmFsyePQ0Hahs1yZd8yZf8fPFpEoSoubkFHR1dqGwsxs5ZuzUA2Dlrt0b6zyx8okwDgIVPlGmk746Xch0dXZbZ30WSfMmXfMkfKr5SXlFlmpmdnbGdHbBMek6zqWrSkOi1nB1H8iVf8iU/H3yaBCEzs/MztkctO47kS77kS/5Q82l/EuKMuZYdR/IlX/Ilf6j5SnlFFdr37tfYNDFJEUcdgtpxJF/yJV/y88FXSkuXWVLQzc0t6NnWgKZ6ffwceSR3a1jbFqOP5DbWbuW+Eb+apqCJ9uzRe3BLvuRLvuTng19AgHyGpHpVJ7k/F8qPrlRIxuXgFXUKABy8ok4hGRcv5fgDZHmSL/mSL/n54FuywIDeWZD0xSGqLbF2RG2qt3ZEFJUr3LCa7pPILgsk+ZIv+ZI/VHxLFphNE1+V2UrfEGYoSumOjGm/gH0WSPIlX/Ilf6j4ljtC31Rq3EOvtXUfolBpqXFz1Adb6xzvCCv5ki/5kj9k/PKKKixqhIaNca28ogr16NSqSnZp0O/Nb1piKU243stSVbJLq0enVl5RBWyMa4saoZVXVPniH/vO0rzyO9Rg7Kj40PLMZ5bBwUHTMtT8fB9/vvlLHygyLaPt+KPie5oVjkhNGqYdS2mW9bGUZiojUphZsdhZosjkKKtmvzhk/NnMmOsO1bq+QzWXiZpvusu/JlivQTQTQHR8Tg888AAA4Oabb3YpmRt+EL0X+EsfKMKBm0+4rssVP4zC8jVNs92mKC4Xv4BPxwI31cctYamdiPmpSX0xXosNktW5j1YpTfXWW1774RPzm7Lxxbzwifm9/At9Ia/tDDJqPjG/i26ai4tummuYoZ1BRs3PKplMIplM+nlLpPwgCsqPaRpd8sEXiYQ3+eCnUinh81zxNU2DpmnU5BRFMS1sGT9811nhAGtkpb9mt8M18gKCzwp17DtLLdFfYfYusAq0nPP5yK5D1Y2PaPHn3SO/MHxLZKfp5kf04oPtrpFfKL5Ag4ODGDNmjOV5TvhBPEdwPoLyRaanMtGGnSmqXEQS1fkn0R77d89LBBgVP5VK0T98xPySyaRpfdR81vzcZFc20KxwgLmKSxRLmR/57SIFnRWKmB87U3zP5gup+eWaz1ZxiRZ/3vzIb4+Sb6riZvXig+2mR357pPysBgcH6fLAAw8glUohlUrhgQceMG3LCT/pY4mQT8xNVRS6sOudxJcZjrOi+eGT75t9TWoB5DlfJkq+H4kiQd+zwokkMkF+vVARzAo1YYximhj55GZjprah4ANiE+TX55IvMkF+fS74JMojC7nwycJuE5pgLmYF817zCsRnzY8Vb4KsObImmavjF0V6ru1/EZ9/PgpkTZA8j4rPR3TE3Oyqu8JI0YZPkyBr22LAvTGt8prtjgeu2vyFjXm8GO1mfvLKL2QmQFEgNuNc8tmqLyvWDHPJZ6u+rExmGDHfaxWXiJig6D1hj58qBT3aI48eFRk/oPzylz5gnv/Ezejcygc5fr6a+9xzzwEArr/+ero+nU6juroa6XQaqqraVoWjOP+KorhWie3K8HzHWeGIXKMrgGsTtC8fZFYoturLSmMaenLJd43uYDZGp/KBZsXy0AZmMkaH8iNxVjihktzjUPMDyg+ftOuxi5v48rwhhjn+66+/nppfZWWlaX11dTUAIB6P47nnnkM6nUY6nbbsI4rzT4yNjwDdIkMR3zIrXFN9nPaw5sUnP6zbXZIRG43BynazQjnx2eQHPQAuCswln09+8HJNhoTk88kPXq7JkIB8vxGg7XuCHr8GsdHZRX8piM+DT75dFVi0zS1REoTPJzv8ypIcCXD+2YivsrKSGh15zq7jVVlZiXicqc4G/P6DJkAs7xPwaQRIGgerHrKf0zOI2Gis6qEttLGT13uVz0aD+eCzv56wfPIX3esjr8iOnzR3JLnXLsrV+fdkfjnke1UQ/nPPPYfKykpqdDt27EBlZSVUVcWOHTvouksuuQQA6KPIGMMev1s3F1FkyD4X8QsAPQXdVB+nk4qQsXVeqr5uIhEZSUHfU7FVaaqPm+7hZce3q/oOFd9L1ddNJCIMwg/8p5+VEoLPKR6PI51O07/qbq9ZheIrsJpcintk1zt0gQlz/G5ySoKE4Ss2i9ftQflsIoOYGWn3I9VcvhwxTGKMURw/Pc5snz87I2T7CPLr7PiOI0G89K3zKz89wdm+fyIpARzCD99L375c8r307cspnxMxNy+PueBTJW2ee5AfvqootPOzqN+fMNsbIV/Uhhc2CRLk/Kuqaqnyso/kOydVZbsqcVA+L7aKy69zE8+nBthUHyf31bJ1FTWpOEaFXgzz3EerlJ2zdmvs7Wq88qds3G/qBhObPbT82THnqNCLYYbhQwFe1ByyvR6ugTB8NtJze7TrDxiYT7Y4GZ5d218IPmuC/HpeXqrCfvleEh9+yvvl79ixAzt27EAqlTJFdMTkqqurTUkQtkwUfCJROyCb6SVm6GaEPN/TSBBe4pEhuRuJwevk5gsxhUmGDDVfNDIkpyNBeAlGhuRyJEhUSZBIjt8pIeJyDsLwWXPzan582ZE6EoTv58dWeb2MAAnLB+wTIawB8tv5dYFHgkSlkd4TXvKHAZ+0B7JtgB7MLyzfsZMzxJ2h+bIj9fyLzI0dB+51PHjY47dLgHgxPzu+75EggZWLkQCSPzr5pJU/BXGLf675QfQe4Ps1vCj5dgkQ9mYIREKjjGokSFiNtJ74kj+M+QGSRO+l4w+SIxvpx++UBebLeeFTA6wtUclEIq6pVb69zU+2+J6KrcrCJ8o09j7+fvlTuM7QQ83n2/v8ZIuj4FuufB+/hKB8p5sc+FEkxz/K+UGyw1HywygKvteMrxe+ZSRI4YbVtHA63RAYxCoeN/bZs63BsSe45Eu+5Ev+UPGpAbbv3a8BADtx8Mr22+kbw0xKEn+qyLRfAHTyYyLJl3zJl/yh5o8F9BmZ+MmJAZimm0PJLuu0dLBOSycqh6cMByYfZE9to8ZOiyf5ki/5kj/U/AIyJyc7WTCZk/Oeiq1KZWMxHaJCsijVqzppxoYML3Eq17OtwbTv5uYWzJ49DQdqGzXJl3zJl/x88Wk/QKLm5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJV/yJX+o+Ep5RZVpZnZ2xnZ2wDLpOc2mkUlDotdydhzJl3zJl/x88GkShMzMzs/YHrXsOJIv+ZIv+UPNp/0AiTPmWnYcyZd8yZf8oeYr5RVVaN+7X2PTxCRFHHUIaseRfMmXfMnPB18pLV1mSUE3N7egZ1sDmur18XPkkdytYW1bjD6S21i7lftG/Gqagibas0cf0SH5ki/5kp8PfgEB8hmS6lWd5P5cKD+6UiEZl+xwFRy8ok4hGRcv5fgDZHmSL/mSL/n54FuywIDeWZD0xSGqLVGtHRHrrR0RReUKN6ym+ySyywJJvuRLvuQPFd+SBWbTxFdlttI3hBmKUrojY9ovYJ8FknzJl3zJHyq+5Y7QN5WW0Te2tu5DFCotXUafP9ha53hHWMmX/CjZ/GcYKccv+UPEL6+owqJGaNgY18orqlCPTq2qZJcG/bY0kS1VJbu0enRq5RVVwMa4tqgRWnlF1cjhO/0bDccv+XTRYjHH5b1+/MOBH0trpsegfMdZ4XKhSGYFG2q+Bud77rltD8uPUCOZn3K5CSYAJF3uFReGr8XM97BTVFW4XovF6LYo+VEoV3ynaSpzwVfjCmJpDWrc4w/Phk/HAjfVxy1hqV+RO7U63a313EerlKZ66y2vo+DjaWaJis+am+hvC2DMWOZBOT3+IeR/uvo84fNc8FOaRs0vqSiOC1s2Kj5gNjlFVU0GR16z67VYzGKMYfhuan7x35B+Zjt9zr7ONZ9Mg0puT0+MTzQ96nC7/gPNCicSOwmJ3QxOkc2KJtLTAC4TPA/D581P9PV4KROUH7Gi4n+6+jw8Vfk6fQ4AT1W+blofFZ81Pj9KaZrlPUGP3y7ycxJvmGH4XtT84r9Z1h09NgHxT1bR17ngp9NpxGIx09SUgHHrelVV6XSpw/H6j2RWODvD45WzWbFsDC8yvl0UCPiK/qI6fjbS5pdc8j9dfZ4l8nuq8nVqfqIyYfhBzY+8h48Egxy/KIrzIpFJDuWscEePTRgSfix7fuyuvRhz/vzyY2kNsbS+X+VHA6bydtc8Kce+14kvZ4XzwydGSBaPxhcVn3zhbFWDr3bYGmHE518UBQKwGGJQvsj8SPXWaWFlMsEQx89Xee2qt7xMJpjD65+N/o4em0DNj43+hvL3x0eDQflqXKFtfctWjLGYoIX7owEsWzGGtg2a2gdzOSucaGZ2u6gwJ7NSXQaj3c+lGjxSZ8Xiz69IvAlGdf75au7b+04CAC66cS5dj6eBix6ZCzwNfPpV+6qwHz5vfvw6XnxbYVi+W9KDPLpVibVYjFYgor7+ePMDOOPjNBKvfzWuQPnRALRbqV0JJ0PXbh2LfVw5Nz6tAteWqJaJSvyI/SBOP9J7KrYqtSXWCyYs32R2DtXhSPh+Ir8I+HbmZ1sNyNH5v+jGudT8Xry23bT+okd0M8Rl0MvYJKO88nnzI0kOJ7FlWCNkI8Movn/e8JyiQb6sX35zkaWosc2n+QXh+5Uw+ouAz5oae83z17+T+Yn4llnhmurjtIe1X7kmQjYag5XtZoUKw3dNhETE99rmaVFAvojn1u1AaJoB+GzE9+K17dToyHN2Ha8Xr203fwcBj59NaDj9uBSBaZrkk+8lwhMlO0RlFFUNdPzEABdws14GMb9c/P5IEoSIN0A2CRKWz17TmqYhmUwilUoJa6Bej59GgKRxsOqhLY4H7LfhnVXVQ1toYycvr3xTVxeXLi854YdQEH5QsxVm4QPw3953Ei9e224Y3kP680+/eh5efMhYd/ayKQBAH0XGGITPRm9O7Z+iyINvE8zF9893fXFSEP6CE2bzay4yzM+2vS9CvkjpdBrpdFr423fyA798ksggyYyCewfpda0oCjU/8lpRFFM7If9+Eb8A0FPQTfVxOqkIO7ZOdHCihnc3kRT0PRVblab6uOkeXl75pnY+srDrc80PoaB8O/Pj14siRHZdED6byCBmRtr9aDWXK0cMkxhj2OMPkgEWaai+fz5BQp6H4VuqwR/7hr5k5cn8Ijz+WCxmivpUtk8k933xXWD88Ekiw2sihE2CsIkQNa7Y8n2PBBH98PxEgqF7gvPVWpIA8RgJRtETXVVVYSdPwPjCo+Tbhfd25uj0XQThf/rV8/DUta+bqrzs44vZ7+CifVmTtKkSB+UHNUHR+3I1EsIuQRKG31xkrfouOKF/vy1nKegq34hLT5/09TmjPn5ihKqqIhaLWfoCRsXnEyFsGyANxDwkQQKPBHGqivERoZMC9wR36uvHR4S54GeVTqcRj8fpAuimR/4K2hljGL6XSJttknD6LvzyX3yoXc/+MlVeAKZHNgny4kPtdImCH1R2pumH77VqK3qPnfzwifnxJqgoChacgG/z88vnRa4v1UNHcFVVkUgkkEgkouNzxia6xt2SIIFHgvhpi7KLWEL1BPfY2ZmWhbV82J7oxPxSqRRtgAX0v4LkoiB/EUWRYBQ94e1M0Mt3E5RP+vyxj0ReRoCE5bMSjTZgX0fN95LksP2sXBJlOI6E8MrnExuAOfpzq/mE5fOfhU/40bZAhwgw9EgQpxEIfFJEdDGG7okuSoDYJUUEZhlFT3je/JLJpGm704UQBd+pE7SbgvJF5kY6PNttj5LPSnS8Xs9BED7fAdqL2HZA9v1e+WQsL2n74//oOXWNcVKY889GfbFYDPF4nJ53L+YXlg9YR4OItpM2QK98zyNBnLJvnn6QYXuiX+ZziZqfFTE83viSyaTJGHPFD6wI+H4NL2q+Xc8DTz0SQo4EoaysudmZoa1J+uAvePwx07HxWnDCbIKeDDHE8ZPPQEwwTBewIHyS1CBJEDbaYz+PdutY7NszSJMmJiPM5UgQPxqJPdFZsdVgAKZH3hRzwQ+rkc53SgR5ScQF5YvaA/10gA7KbzlLwev9U4T7IkkSvo3QSUGPn9zwIKz88ImBkSFtbPWWRHt80oM8t7tNFs+n76wtUclEIiHGObjrnoqtysInyjT2Pv4jhU9Cfb6an06nnaO/iPhRSPLD8f22A4bi/zHb2fnD1r55fBSYE35WURhfED5vYhajS2uuSQ83vmUkSOGG1bRwOt3ga+d2iseNffZsa3DsCT6S+F67wrxXjz+XfBHbLRHntJ18hpFy/ADw2AOfos9f//CWQFnfMPx8H78b3+sNUZ341ADb9+7XAH1GJkCfOm5l++30jWEmJYk/VWTaLwA6+TGR5Eu+G1/TNCiblo/K4/+HHc8i/skto/r7zwV/LKDPyMRPTgzANN0cSnZZp6WDdVo6UTk8ZTgw+SB7ahs1dlo8yZd8N76yafmoPf6fXg/akD8ajz9X/AIyJyc7WTCZk/Oeiq1KZWMxHaJCsijVqzppxoYML3Eq17OtwbTv5uYWzJ49DQdqGzXJl3zJl/x88Wk/QKLm5hZ0dHShsrEYO2ft1gBg56zdGuk/s/CJMg0AFj5RppG+O17KdXR0WWZ/F0nyJV/yJX+o+Ep5RZVpZnZ2xnZ2wDLpOc2mkUlDotdydhzJl3zJl/x88GkShMzMzs/YHrXsOJIv+ZIv+UPNpwYoJSUlNdpkaQOUkpKSGi2SBiglJTVqJQ1QSkpq1EoaoJSU1KiVNEApKalRK2mAUlJSo1bSAKWkpEatpAFKSUmNWvm7m6CUlNSo1s57ezSn7eUVhTkdyRG1pAFKSUl50s57ezTcdx+gaUBBAUCmgLjvPuDMGb3MbbdpuTZBOxMOwg1sgE/86G7Th7ji1vVD6vySL/mSP3T8nff2aCBTPojuuj1pkv6YSmFnMpkzE6QmrCgWAw5ivoHaAPmTb7cuV2JZV9y6Xrni1vWK5A8tn3DzzWfXjSa+l3VRyWR+XnTffa5V5VCfw86AUynfXN8G6HSih+IisGMM1Y9Q8vUf/3Djk22jgR9kW+RiZ0C85RbjuaZByWQix1lM2I7v03x9GaCXE5zLL8Ft37n+EUq+/Y9/OPBJmfcyP4oyodTfr5tPLAWkskssZRiSokAbMyavfD+SSRApKSl38XNeJ7jnSUGZXH6GiPgj3gCHNOwfBhrqxvbhLv58jLbrQSqcRrwBSklJDYH49rcaGFFYjU2ZXH0GN74Ptq82QC/RRy4jlOHO99JGFJbv1ggu+fnjkzK55EdRJrRSKUBN6kaTTOrP/WSJhxHfdxbYrRE80Kd4D/Bz/eNj+XbdICQ/f3yybSj4QbZFLtZwhsD8yisKFVNkZ8dPJn11iA48J8ho6wgq+ZI/mvnCvoDEkATrc9oRmq/qplL66JRbbvHNlZMiSUlJeZJtX7xUCshk9C4oAUwo0OcQKAhXGqCUlJRnyZshSElJjVqNNINzk7wfoJSU1KiVNEApKalRK2mAUlJSo1bSAKWkpEatpAFKSUmNWkkDlJKSGrWSBiglJTVqJQ1QSkpq1Eoa4DBR+979Wvve/Tm/l50dR/IlfzTy5VC4YaD2vfu1BQvmAwCam1swd/mFCgAcumY7/aLOfbRKAYDb7v0mXXdPxVZf5ew4ki/5o5UvDTDPOlDbqK1YcaFpXXNzC3q2NaCpPo5Fl6bpY/WqTtSWqFjbFqOPlY3Fnsp9I341yJdPtGfPfgCA5Ev+aOXLKvAwUHNzC5qbW0zrqld1ovzoSgUAyo+uVKpXdaKysRgHr6j7f+2dX2xT1x3HvzdrUJNoTlsgK51JO6XQpg9MdYyygQIW5U+lpNMkHprS9IGuJVg0UQyiK6xISKNhEqLOQNUNbTVUNeuyhz6RiFAiFJPRzZBYItJqjS6SCZGGAl3BUggia84enHNyr32vfa997Wtyf190Ffuck/O5xs7P55zf75yfBADfvnJOagstN9wuHY/4xHcqn0aARaCx/hCrqnpMPH/mmacRi13HH0b+Ksr63aMI7nwftZtHRFl00IvA6SNonKxL265i3ybRJ9fU1B2sadwoEZ/4TuaTASwSjfWHGADwD8LU1B1sn+sU9cHJlxMPDnkXfun3iTc54B5I2676szlVvwDEh4/4xHcynwxgkWi8OchObryFN6u3ibKJiYglfVdXe8TjP02cQ1touVgsJj7xncwnA1gEGm8OsuigF023G6QO+SDrd48ufJPpaM2nLtXzsbfiadsH3ANonKxDl79T6ls2zGo3j4gPAfGJ71Q+HYhaJKrdPIJxjDDIBzO2XfOpK+UN1yrT0nhzkNUSn/jEB0CB0EWj6KA3ZVqQSRtKJGwoMXdAb01vQIoOelPKs+HveyZx2cU/cTBx2cU/eqkERy+Z+xOyku/dIsG7xb73HztWJy67+LveTlw58HMaAfL8AIvtmOxCq6Y3IKE5yDo2nm0X/loAAAxkSURBVDU0/M9GwcmXAfcAOuSDbDxpDYb4xHcqP+sRoDI5SqZEKflSnzzN7GJbLR6/FNz5ft4YwZ3vg8dOEZ/4xM/SAPbJ0wzd3Yl0eN3dQFdXwY3gYjLAfOG3pjcg1W4eUbv6NaS11pFx/eNQIkq+pjcg9btHVVuFiE98p/JNT4E1EySXlQGnTqGvtZUVYjosDLAkJRIi37+Pvo6OgrBT7sEiduNkHSDXsbbmoKrcrLcrU3vlB4/4xHc635QBTJsYGQC6u9G3e3deDVHKPUhSwgAXgJ1yD4rXn6vx73eP8u074g0y6tlSKpN3rMvfKa06s40po+eJT3yn8g3HAYqp3qlTwOws8M47QN28IRptXTCC80YhH4ZIdQ8A8PF8xS7kna26B278lK+/uxvYvTtrdod8kPGN3TzCnb95Zj29XBfnmPoDcGhhszg/IcMI36ynl+t4DJbwzXp6udo7reGb9fRyHVg/ZwnfrKeXa+S8Ne+/WU+v0BfXrOGb9PQKffxJRn5272xpaXY3tJgl5WZz+eJs4PQRi24oVYHTR8RiM/GJT3wTU+Amf4WkWvBPmgImt83xXo3dwy7tNvlgq+6htTVlCozW1qzZPBK+y98pdcgHGdwDqlCAi3PafhY+MtSrV0oZCR8d9DI0B1lyJL4e/3hMu08+MtSrt4rf3qndJx8Z6tVbxT+wfk6zTz4y1Ku3ij9yXvv95SNDvXqr+PjimnanfGSoV28V/+NPtDvlI0O9egN8U2uAqj9+IMXw5WIETN9DkhMEHR0Fi0dU/T8wZsnr1oqEH3srbvkisJlIfOITf7HzTXuBU4wgkDACOax/ZXUPu3ez5LJCsFX30NpqWSA43wsJxSIwYMC9n6RM7Wt6A2IvJPGJ73R+1ochJMe/2bEbZDHtROGnYRjdCK50jqQ4O3TEpwHpTuMww1dOge3gK6fAdvCVU2A7+MopsB185RTYFr5iCpwtP+udIEqjY5cBavJXSIvB+AHOjcQnPvHt5Od0GMJiMkB2ymwkfFayMBKf+MRfLHw6DqtIpBcJn05GvL/JMhuJn05GvL/55Bvx/uaTb8T7m0++Ee9vPvlGvL955Rvw/mbikwEsEmlFwuspG+8Yl5lIfOITf7Hz6UToIhGPhK/Yt0mUjYxcsKRvr3ehz+njF9JG4hOf+E7ikwEsEvFs9crEzQ033xX1uSSF8Z51qfoFIJJPE5/4TubTFLgIpJUcHYAq3R/cA6lpAZGaFlCrHc4ufAPyD8Ll/hBTpiUkPvGdyKcj8W0Wz4mqTNbMc6J2+TulttBydPk7pcbJOuHFOrnxlvCY8e096dpNH7+g6jsWu46qqscw1h9ixCe+k/lkAItMsdh1TE3dQVtoOfqWDTMA6Fs2zHj80qoz2xgArDqzjfHYKSPtpqbuqBJDE5/4xKc1wKIQ/xYEFjLWA4noeN6GR64r3fh8IddoOz0O8YnvVD4ZwCLRWH+IAQsZ6wvNIT7xncgXThDuhUn2zlgtPY7T+fybKd/S4xDfmfw+WQQeSwAwIUfyfQt6HFv4UpM/gJtXrjKlm5j/cVo9BNXjEJ/4xLeHrzCAjpRUXe1JcUHHYtcxffwCooOJ/XP8Jz+toXGyTvzkx1hnavee91Xhgua6fPkqAID4xCe+PfyJiUheZzzFrhJgwTWs1MmNt/j5XGi63SBxj8v8dhV8+8o5iXtcjLRTKplHfOIT3z6+kyU1+QMq7wiQCBbksThc/e7R1EDEwdRARK12Ffs2iT659LxAxCc+8QvHd/wUmHuBuXdE6SbePrdw3EYuW1GqP5tT9Qvoe4GIT3ziF45PBnDeAPITWd+s3iYqJyas8chUV3vE4z9NnEt7IizxiU/8wvHJAPoDIitT0+0GiR9OaORYaqWMHkfd5e8UZ/InZ4UiPvEfFr5ZFSvf6QZQxAHWamRl0pPW+ftGs7ibyQpFfOIXIz8XFSvfqRJ7gaOD3pRheUbVHkhcJlTTG5Cig6lHXmfDX7mkHSuXtNvG34q92Iq9tvH3z/+zi98urUO7tM42/p6SddhTYg8/HA6LazHwnapHgPngyeYg69h4Ni/Db2B+cdY9gA75IBtPWgMhPvGz4ZfPrce9kksF54fDYbjdbtXz+vr6h5bvZIkRoFOzQhH/4eVfxQ8on1tfUH6y8QEAt9ttaCRWzHynqgQwn5VJa60l4/qLhVmhiE98AIgu+R+u4oeC8bWMD1dGI1TEfCdLOEH0sjKZ9bZlam82KxTxia/X342aCmB8GniQP36yZmZmUFZWplluRMXKd6qEAdTKymTUs6ZUJu+cmaxQxCd+Wn7DbdzAMiCaH36y6uvrEQ6HsXTpUpURmpmZwXfffZdxHa6Y+U6VCITmWZmig14RYS4+PCY9vULRo+oP4KGFzdp6WaG0+GY9vVw3HpywhG/W08v1FT60hG/W08t1DMcs4Zv19HKdYF9bwt9QImFtNcPTO4DpxhJ8eZhhtGo12J//Bex6GxhehpXj06h98Ah+jh8Jx8hHc7nx9aQ0QmaMTzHynR4HKJwgfHE0cPpI3mCB00fEYm+yiE/8dPwrExKufwFU9M9h+2EJdVPXIL3+XCI5dsNt3KipEGuCeo6RXF9/i6sSLa5KRCIRMQIrKytDJBIRdfl6/QAgyzJkWdbk87ps+Y5Vkz+A2hAYDnlZkz+AQdxiAfcAA8DWfOpiSAzJta/aA4krTRveR8A9wAZxizX5A8AhL6sNgTX5AznxVy5pZyuXtNvG34q9bCv22sbfj/1sP/bbxm+X1rF2aZ1tfO8WiUmvP5c3vvJqcVWyP/5kBWtxVTJZltmLT+5gLzWeYS8+uYPJsqyq17qPXPmyLLNoNMpkWRZXOBxWPef1ZvhOV9qdINlkYM/U3kwkPPGJn66/7Ycl4PA1KCeMVvK5WlyVWFtWvvD8jRa0vNGCDc+24uK/TwEALv32PQAQ7XridzUo2fFlWYbP51PxAaDn8x7VYwDw+XyQZRl+v98U36kSBpDvRUTSImyui+DJqukNiL2IShGf+Gb5ielwCUbOM0Pts+EnG7+1ZeXwP+XGfxp68ETda/j1q0NYMdyCCqlU1QbQNoJm+cnGz+fzoefzHng8Hng8Hnzzz28QiagPTUhnBPX4TlUJABF/lO1GdL0ypYKTL4PHHyk3ghOf+Nny+ZpgIfhXZu7h7n112X9H/yIev/BoKe7eT7TLB39oaAjxuNq4Kw2fz+dDPB7H0NCQab6TRTtBiP/Q8rljJF/8FlclVkvlwqhdY4mfa8vKsWK4BU/UvYYVwy1ixMfrr8zcw2qpPMUpYpYvyzI8Ho8watzg+Xw+RCIReDweRCIRMULk9UNDQ/B4PClOEdoJkqqsdoJkJQt3AhCf+FxXJgwOZHLk8+ksHwWuLSvHs3/bKYwfL9db+8uVz6ezfBTIjSA3frxcb+2PdoJoK+NOkLSKHjUNzDUSXqkbD07Yyv8KH9rKP4ZjtvJPsK9t5V+cM/83bJbPR3Va+uXj5bg7M6tZp/d7ZvnJ63tKbdmyBbOz2ny93yPDp1banSB6ysY7yJVLJDzxiV9Iftv5r+B2uxGPx9EWj+Pklq2q3/n79/fwwqOlqrJwOAyXywWXy4XJyUn0JAUom+F7PB7BD4fDKUbt/PnzKgeJFt/o63eqUnaCVOzbJCpHRi5YAvF6F/qcPn4hbSQ88YlfLPyPPjoKl8uF0tJSzM7O4oP6X2C1VI7KRxP1lWWlYgR4935i1Pe78D9E+3g8jvr6esv4fG3P5UoYf14OJKbAfEpshu/0nSDCAN68cpUBgDJxcsPNd0XDXJKyeM+6VP0CEMmfuYhP/GLmN3/5OE7vegndv3pelLWeiOGnKMX3Pz6tard06VI8+1mz5XwAqO/bI8rkp34Dj8eD3u3fZ813ugF8BEhkpEpOzgxAlW4P7oHUtHxITcun1Q5nF76B+BtxuT/ElGkBiU/8Yub3bh9F987nVf2e0uD3bh9FcOeevPCTX5d/EAh88LOc+U5WCc9JqkyWzHOSdvk7pbbQcnT5O6XGyTrhRTq58ZbwWPFEK+naTR+/oOo7FruOqqrHMNYfYsQnPvHt41tvUh4ulSQXxGLXMTV1B22h5ehbNswAoG/ZMOPxQ6vObGMAsOrMNsZjl4y0m5q6YygbPfGJT3z7+E6T1OQPqDLTKzPWjzcHxTcEjxxXutH5QqrRdnoc4hOf+Pbwnb4GKJwgfDic73UBPQ7xiU/8wvOdbgD/DzTnuApHWW9CAAAAAElFTkSuQmCC);background-size:1000% 1000%;background-position:0% 0%}.GeneIcon--template{background-position:11.1111111111% 0%}.GeneIcon--unknown{background-position:11.1111111111% 11.1111111111%}.GeneIcon--cryokinesis{background-position:22.2222222222% 11.1111111111%}.GeneIcon--mattereater{background-position:33.3333333333% 11.1111111111%}.GeneIcon--jumpy{background-position:44.4444444444% 11.1111111111%}.GeneIcon--polymorphism{background-position:55.5555555556% 11.1111111111%}.GeneIcon--telepathy{background-position:66.6666666667% 11.1111111111%}.GeneIcon--empath{background-position:77.7777777778% 11.1111111111%}.GeneIcon--immolate{background-position:88.8888888889% 11.1111111111%}.GeneIcon--melt{background-position:100% 11.1111111111%}.GeneIcon--superfart{background-position:0% 22.2222222222%}.GeneIcon--eyebeams{background-position:11.1111111111% 22.2222222222%}.GeneIcon--adrenaline{background-position:22.2222222222% 22.2222222222%}.GeneIcon--midas{background-position:33.3333333333% 22.2222222222%}.GeneIcon--photokinesis{background-position:44.4444444444% 22.2222222222%}.GeneIcon--erebokinesis{background-position:55.5555555556% 22.2222222222%}.GeneIcon--firebreath{background-position:66.6666666667% 22.2222222222%}.GeneIcon--dimensionshift{background-position:77.7777777778% 22.2222222222%}.GeneIcon--healingtouch{background-position:88.8888888889% 22.2222222222%}.GeneIcon--hallucination{background-position:100% 22.2222222222%}.GeneIcon--brownnote{background-position:0% 33.3333333333%}.GeneIcon--tk{background-position:11.1111111111% 33.3333333333%}.GeneIcon--darkcloak{background-position:22.2222222222% 33.3333333333%}.GeneIcon--chameleon{background-position:33.3333333333% 33.3333333333%}.GeneIcon--bigpuke{background-position:44.4444444444% 33.3333333333%}.GeneIcon--ink{background-position:55.5555555556% 33.3333333333%}.GeneIcon--none{background-position:66.6666666667% 33.3333333333%}.GeneIcon--speech{background-position:77.7777777778% 33.3333333333%}.GeneIcon--lizard{background-position:88.8888888889% 33.3333333333%}.GeneIcon--squid{background-position:100% 33.3333333333%}.GeneIcon--roach{background-position:0% 44.4444444444%}.GeneIcon--frog{background-position:11.1111111111% 44.4444444444%}.GeneIcon--flashy{background-position:22.2222222222% 44.4444444444%}.GeneIcon--dwarf{background-position:33.3333333333% 44.4444444444%}.GeneIcon--cat{background-position:44.4444444444% 44.4444444444%}.GeneIcon--blank{background-position:55.5555555556% 44.4444444444%}.GeneIcon--skeleton{background-position:66.6666666667% 44.4444444444%}.GeneIcon--monkey{background-position:77.7777777778% 44.4444444444%}.GeneIcon--cow{background-position:88.8888888889% 44.4444444444%}.GeneIcon--fire_res{background-position:100% 44.4444444444%}.GeneIcon--cold_res{background-position:0% 55.5555555556%}.GeneIcon--thermal_res{background-position:11.1111111111% 55.5555555556%}.GeneIcon--elec_res{background-position:22.2222222222% 55.5555555556%}.GeneIcon--tox_res{background-position:33.3333333333% 55.5555555556%}.GeneIcon--alc_res{background-position:44.4444444444% 55.5555555556%}.GeneIcon--rad_res{background-position:55.5555555556% 55.5555555556%}.GeneIcon--breathless{background-position:66.6666666667% 55.5555555556%}.GeneIcon--regen{background-position:77.7777777778% 55.5555555556%}.GeneIcon--haze{background-position:88.8888888889% 55.5555555556%}.GeneIcon--dead{background-position:100% 55.5555555556%}.GeneIcon--strong{background-position:0% 66.6666666667%}.GeneIcon--hulk{background-position:11.1111111111% 66.6666666667%}.GeneIcon--radiobrain{background-position:22.2222222222% 66.6666666667%}.GeneIcon--eye{background-position:33.3333333333% 66.6666666667%}.GeneIcon--fart{background-position:44.4444444444% 66.6666666667%}.GeneIcon--bad{background-position:66.6666666667% 66.6666666667%}.GeneIcon--shoot_limb{background-position:77.7777777778% 66.6666666667%}.GeneIcon--apparition-0{background-position:88.8888888889% 66.6666666667%}.GeneIcon--apparition-1{background-position:100% 66.6666666667%}.GeneIcon--hemochromia_rust{background-position:33.3333333333% 88.8888888889%}.GeneIcon--hemochromia_bronze{background-position:44.4444444444% 88.8888888889%}.GeneIcon--hemochromia_gold{background-position:55.5555555556% 88.8888888889%}.GeneIcon--hemochromia_lime{background-position:66.6666666667% 88.8888888889%}.GeneIcon--hemochromia_olive{background-position:77.7777777778% 88.8888888889%}.GeneIcon--hemochromia_jade{background-position:88.8888888889% 88.8888888889%}.GeneIcon--hemochromia_teal{background-position:100% 88.8888888889%}.GeneIcon--hemochromia_cobalt{background-position:0% 100%}.GeneIcon--hemochromia_indigo{background-position:11.1111111111% 100%}.GeneIcon--hemochromia_purple{background-position:22.2222222222% 100%}.GeneIcon--hemochromia_violet{background-position:33.3333333333% 100%}.GeneIcon--hemochromia_fuchsia{background-position:44.4444444444% 100%}.GeneIcon--hemochromia_unknown{background-position:55.5555555556% 100%}.GeneIcon--achromia{background-position:66.6666666667% 100%}.GeneIcon--noir{background-position:77.7777777778% 100%}.IconStack>.Icon{position:absolute;width:100%;text-align:center}.IconStack{position:relative;display:inline-block;height:1.2em;line-height:2em;vertical-align:middle}.IconStack:after{color:transparent;content:"."}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#252525;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out;align-items:center}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.RoundGauge{font-size:1rem;width:2.6em;height:1.3em;margin:0 auto .2em}.RoundGauge__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:10;stroke-dasharray:157.08;stroke-dashoffset:157.08}.RoundGauge__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:10;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.RoundGauge__needle,.RoundGauge__ringFill{transition:transform 50ms ease-in-out}.RoundGauge__needleLine,.RoundGauge__needleMiddle{fill:#db2828}.RoundGauge__alert{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:rgba(255,255,255,.1)}.RoundGauge__alert.max{fill:#db2828}.RoundGauge--color--black.RoundGauge__ringFill{stroke:#1a1a1a}.RoundGauge--color--white.RoundGauge__ringFill{stroke:#fff}.RoundGauge--color--red.RoundGauge__ringFill{stroke:#df3e3e}.RoundGauge--color--orange.RoundGauge__ringFill{stroke:#f37f33}.RoundGauge--color--yellow.RoundGauge__ringFill{stroke:#fbda21}.RoundGauge--color--olive.RoundGauge__ringFill{stroke:#cbe41c}.RoundGauge--color--green.RoundGauge__ringFill{stroke:#25ca4c}.RoundGauge--color--teal.RoundGauge__ringFill{stroke:#00d6cc}.RoundGauge--color--blue.RoundGauge__ringFill{stroke:#2e93de}.RoundGauge--color--violet.RoundGauge__ringFill{stroke:#7349cf}.RoundGauge--color--purple.RoundGauge__ringFill{stroke:#ad45d0}.RoundGauge--color--pink.RoundGauge__ringFill{stroke:#e34da1}.RoundGauge--color--brown.RoundGauge__ringFill{stroke:#b97447}.RoundGauge--color--grey.RoundGauge__ringFill{stroke:#848484}.RoundGauge--color--light-grey.RoundGauge__ringFill{stroke:#b3b3b3}.RoundGauge--color--good.RoundGauge__ringFill{stroke:#68c22d}.RoundGauge--color--average.RoundGauge__ringFill{stroke:#f29a29}.RoundGauge--color--bad.RoundGauge__ringFill{stroke:#df3e3e}.RoundGauge--color--label.RoundGauge__ringFill{stroke:#8b9bb0}.RoundGauge__alert--black{fill:#1a1a1a;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--white{fill:#fff;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--red{fill:#df3e3e;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--orange{fill:#f37f33;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--yellow{fill:#fbda21;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--olive{fill:#cbe41c;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--green{fill:#25ca4c;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--teal{fill:#00d6cc;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--blue{fill:#2e93de;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--violet{fill:#7349cf;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--purple{fill:#ad45d0;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--pink{fill:#e34da1;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--brown{fill:#b97447;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--grey{fill:#848484;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--light-grey{fill:#b3b3b3;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--good{fill:#68c22d;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--average{fill:#f29a29;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--bad{fill:#df3e3e;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}.RoundGauge__alert--label{fill:#8b9bb0;transition:opacity .6s cubic-bezier(0.25, 1, 0.5, 1);animation:RoundGauge__alertAnim 1s cubic-bezier(0.34, 1.56, 0.64, 1) infinite}@keyframes RoundGauge__alertAnim{0%{opacity:.1}50%{opacity:1}100%{opacity:.1}}.Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.SectionEx .Section__title{display:flex}.SectionEx .Section__titleText{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:auto}.SectionEx .Section__buttons{position:inherit;right:inherit;flex:none}.SectionEx__capitalize .Section__titleText{text-transform:capitalize}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(even){background-color:rgba(0,0,0,.33)}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.TooltipOverflow{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-search-interface__search-option.Button--color--transparent{transition:initial}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.AccessPanel-wires-btn.Button--selected{background-color:#cd7a0d !important}.Airlock-hack-button{font-family:monospace;border-width:.1666666667em;border-style:outset;border-color:#0a0;outline:.0833333333em solid #007a00}.Airlock-hack-button.Button--disabled{background-color:#4a6a4a}.Airlock-hack-button.Button--color--default{background-color:lime}.AlertModal__Message{text-align:center;justify-content:center}.AlertModal__Buttons{justify-content:center}.AlertModal__Loader{width:100%;position:relative;height:4px}.AlertModal__LoaderProgress{position:absolute;transition:background-color 500ms ease-out,width 500ms ease-out;background-color:#3e6189;height:100%}.Layout__content{background-image:none !important}.CurrentBan{background-color:rgba(0,255,0,.2);font-weight:bold}.ExpiredBan{background-color:rgba(255,0,0,.2);font-style:italic}.BanText{padding:.25rem}a.NoColor{color:inherit}.cashreg__ownerbutton,.cashreg__pay,.cashreg__tip{display:flex;justify-content:center;align-items:center}.cashreg__ownerbutton>*,.cashreg__pay>*,.cashreg__tip>*{padding:.5em .1em}.cashreg__centerpart{font-size:1.5rem}.cashreg__amount:hover{background-color:#439de1}.cashreg__table{width:80%}.cashreg__table_cellright{text-align:right}.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;user-select:none;cursor:default}.react-colorful__saturation_value{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top, black, rgba(0, 0, 0, 0)),linear-gradient(to right, white, rgba(255, 255, 255, 0))}.react-colorful__pointer-fill,.react-colorful__alpha-gradient{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation_value{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__hue,.react-colorful__r,.react-colorful__g,.react-colorful__b,.react-colorful__alpha,.react-colorful__saturation,.react-colorful__value{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)}.react-colorful__r{background:linear-gradient(to right, #000, #f00)}.react-colorful__g{background:linear-gradient(to right, #000, #0f0)}.react-colorful__b{background:linear-gradient(to right, #000, #00f)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%, -50%);background-color:#cfcfcf;border:2px solid #cfcfcf;border-radius:50%;box-shadow:0 2px 5px rgba(0,0,0,.4)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%, -50%) scale(1.1);background-color:#fff;border-color:#fff}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><rect x="8" width="8" height="8"/><rect y="8" width="8" height="8"/></svg>')}.react-colorful__saturation-pointer,.react-colorful__value-pointer,.react-colorful__hue-pointer,.react-colorful__r-pointer,.react-colorful__g-pointer,.react-colorful__b-pointer{z-index:1;width:20px;height:20px}.react-colorful__saturation_value-pointer{z-index:3}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ComUplink .Button--color--Main{transition:color 50ms,background-color 50ms;background-color:#db2828;color:#fff}.ComUplink .Button--color--Main:hover{transition:color 0ms,background-color 0ms}.ComUplink .Button--color--Main:focus{transition:color 100ms,background-color 100ms}.ComUplink .Button--color--Main:hover,.ComUplink .Button--color--Main:focus{background-color:#e66b6b;color:#fff}.ComUplink .Button--color--Main:active{background-color:#f1acac}.ComUplink__Points--Main{color:#db2828}.ComUplink__Row:not(:last-child){border-bottom:2px solid #3e6189}.boardgame__titlebar{position:fixed;top:4px;right:80px;padding:2px;z-index:2}.boardgame__titlebar>*{margin:0 4px}.boardgame__window{height:calc(100% - 0.25px);display:flex;flex-direction:row;background-color:#211913}.boardgame__window*{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.boardgame__helpmodal{z-index:20}.boardgame__helpmodal>.Dimmer__inner{background-color:rgba(0,0,0,.8);padding:15px;width:60%}.boardgame__wrapper{width:100%;overflow:hidden}.boardgame__heldpiece{position:fixed;z-index:4;pointer-events:none}.boardgame__palettes{width:100px;background-color:#cecece}.boardgame__palettes-header{font-size:10px;background-color:#242424}.boardgame__palettes-set{width:100%;overflow-y:auto;display:flex;flex-wrap:wrap;background-color:#e6e6e6}.boardgame__palettes-set-piece{transition:.3s all;padding:2px;width:50%;cursor:pointer}.boardgame__palettes-set-piece>img{width:100%;height:auto}.boardgame__palettes-set-toggle{width:100%}.boardgame__palettes-set-minimized .boardgame__palettes-set-piece{width:25%}.boardgame__notations{font-weight:bold;text-align:center;justify-content:center;align-items:center;z-index:0}.boardgame__notations-horizontal{height:20px;padding-left:20px;padding-right:20px}.boardgame__notations-vertical{width:20px;flex-direction:column}.boardgame__notations-number,.boardgame__notations-letter{display:flex;justify-content:center;align-items:center}.boardgame__board{z-index:0;flex-grow:1}.boardgame__board-pieces{z-index:1}.boardgame__board-overlay{z-index:2}.boardgame__board-inner{transition:1s all;flex-grow:1;display:flex;flex-direction:column;height:calc(100% - 0.25px)}.boardgame__board-checkerboard{position:relative;width:100%;height:100%}.boardgame__board-ggrenderer{position:absolute;top:0;left:0;pointer-events:none}.boardgame__board-gprenderer{position:absolute;top:0;left:0}.boardgame__board-gprenderer-piece{position:absolute}.boardgame__board-gprenderer-piece>span{padding:2px 6px;background-color:rgba(0,0,0,.5);position:absolute;text-align:center;left:50%;top:50%;transform:translate(-50%, -50%);font-size:14px;font-weight:bolder;text-shadow:0 0 2px #000;z-index:1;font-family:Arial}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.chem-dispenser__buttons{text-transform:capitalize}.chem-dispenser__labels{text-transform:capitalize}.chem-dispenser__dispense-buttons{text-overflow:ellipsis;text-transform:capitalize;white-space:nowrap}.chem-dispenser-dispense:hover{overflow:visible}@keyframes ChemHeater__heating{to{box-shadow:0 0 15px 0 #f2711c;border-color:#f2711c}}@keyframes ChemHeater__cooling{to{box-shadow:0 0 15px 0 #2185d0;border-color:#2185d0}}@keyframes ChemHeater__heating_fill{to{color:#f2711c}}@keyframes ChemHeater__cooling_fill{to{color:#2185d0}}.ChemHeater__TemperatureNumber{transition:color 500ms ease-out}.ChemHeater__TemperatureArrow{color:#aaa;transition:transform 500ms ease-out}.ChemHeater__TemperatureArrow__heating{animation:ChemHeater__heating_fill 2s ease infinite alternate}.ChemHeater__TemperatureArrow__cooling{animation:ChemHeater__cooling_fill 2s ease infinite alternate}.ChemHeater__TemperatureBox{box-shadow:0 0 15px rgba(0,0,0,0);border-color:#aaa;border-style:solid;border-radius:4px;height:3em;text-align:center}.ChemHeater__TemperatureBox__heating{animation:ChemHeater__heating 2s ease infinite alternate}.ChemHeater__TemperatureBox__cooling{animation:ChemHeater__cooling 2s ease infinite alternate}.cloning-console__flex__table{position:relative;display:flex;overflow:none;width:100vw;flex-direction:column}.cloning-console__flex__head{display:flex;height:25px;flex:0 0 auto;padding:0 5px;font-size:12px}.cloning-console__head__row{display:flex;flex:1 1 auto;align-items:center;justify-content:space-between;text-transform:uppercase}.cloning-console__head__item{display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:space-between;padding:0 5px}.cloning-console__body__row{display:flex;height:30px;flex:0 0 auto;align-items:center;justify-content:space-around;border-bottom:2px solid rgba(51,51,51,.4)}.cloning-console__body__item{display:flex;overflow:hidden;height:30px;align-items:baseline;justify-content:center;text-overflow:ellipsis}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.clothingbooth__dropdown{margin-bottom:0 !important;margin-right:0 !important}.clothingbooth__boothitem{padding-left:.5rem;padding-right:.5rem}.clothingbooth__boothitem>div{pointer-events:none}.clothingbooth__boothitem:hover,.clothingbooth__boothitem-selected{background-color:#1b9638}.clothingbooth__boothitem:active{background-color:#67e484}.clothingbooth__preview{width:64px;height:128px}.cyborg-module-rewriter-interface-empty-placeholder{color:#8b9bb0}.cyborg-module-rewriter-interface-module-view__tool-label{margin-left:.5em;color:#8b9bb0}.gameclock__window{display:flex;flex-direction:column;padding:5px}.gameclock__help{position:fixed;top:4px;right:50px;padding:2px;z-index:20}.gameclock__helpbutton{height:20px;width:20px}.gameclock__helpbutton>i{display:flex;justify-content:center;align-items:center;height:100%}.gameclock__configmodal{z-index:20}.gameclock__configmodal>.Dimmer__inner{background-color:rgba(0,0,0,.8);padding:15px;width:180px;height:130px}.gameclock__configmodalbuttoncontainer{padding-top:12px}.gameclock__teamicon{text-align:center;font-size:24px;margin:5px}.gameclock__sidepart{flex-grow:1;padding:5px}.gameclock__timebutton{width:100%;height:100%;text-align:center}.gameclock__timebutton>div{display:flex;justify-content:center;align-items:center;height:100%}.gameclock__timeflex{flex-direction:column;display:flex;justify-content:center;align-items:center;height:100%;font-size:2em}.gameclock__mid{padding:5px;display:flex;flex-direction:column;align-items:center;justify-content:space-around}.gameclock__utilbutton{display:flex;flex-direction:column;justify-content:center;align-items:center;height:30px;width:30px}.gameclock__utilbutton>div{display:flex;justify-content:center;align-items:center;height:100%;padding-right:2px}.gas-canister-detonator-utility__list-item{line-height:1.7em}.gas-canister-detonator-utility__attachment-item{text-transform:capitalize}.IDComputer__DeptBox .Section__title{text-shadow:1px 1px 1px #000,1px -1px 1px #000,-1px -1px 1px #000,-1px 1px 1px #000;background-color:#767676}.mode-light .IDComputer__DeptBox .Section__title{text-shadow:1px 1px 1px #fff,1px -1px 1px #fff,-1px -1px 1px #fff,-1px 1px 1px #fff}.IDComputer__DeptBox_color_blue .Section__title{background-color:#2185d0}.IDComputer__DeptBox_color_yellow .Section__title{background-color:#fbd608}.IDComputer__DeptBox_color_purple .Section__title{background-color:#a333c8}.IDComputer__DeptBox_color_red .Section__title{background-color:#db2828}.IDComputer__DeptBox_color_green .Section__title{background-color:#20b142}.instrument__keyboardwrapper{border-top-left-radius:30px;border-top-right-radius:30px;border-bottom-left-radius:10px;border-bottom-right-radius:10px;margin:10px;padding-top:20px;background:#49504a;background:linear-gradient(180deg, #49504a 0%, #49504a 22%, #575e57 100%);border-left:5px solid #3d3d3d;border-bottom:5px solid #333;overflow-x:auto;display:flex;justify-content:space-between;align-items:center;flex-direction:column}.instruments__piano{display:flex;justify-content:center;list-style-type:none;padding:0 10px 10px 10px;overflow-x:auto}.instrument__outerpanel{display:flex;width:100%;padding:0 40px;justify-content:space-between;flex-direction:row}.instrument__speaker{border-top-left-radius:30%;width:360px;height:100px;margin:0px 20px;border-radius:10px;box-shadow:0px 0px 5px #4d4d4d inset;background:#646464;background-image:linear-gradient(#3d3d3d 0.1em, transparent 0.1em),linear-gradient(90deg, #3d3d3d 0.1em, transparent 0.1em);background-size:2px 2px}.instruments__piano-key{display:flex;align-items:flex-end;justify-content:center;font-size:12px;background:green;font-weight:bold;text-align:center;padding:2px 2px 10px 2px;user-select:none;-ms-user-select:none}.instruments__piano-key-white{height:16em;width:4em;min-width:4em;z-index:1;color:#383838;border:1px solid #d6d6d6;border-radius:0 0 5px 5px;box-shadow:-1px 0 0 rgba(255,255,255,.8) inset,0 0 5px #ccc inset,0 0 3px rgba(0,0,0,.2);background:linear-gradient(to bottom, #eee 0%, #fff 100%);transition:.05s all}.instruments__piano-key-black{height:9em;width:3em;min-width:3em;z-index:10;color:#cecece;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border:1px solid #3b3b3b;margin:0 0 0 -1.5em;box-shadow:-1px -1px 2px rgba(255,255,255,.2) inset,0 -5px 2px 3px rgba(0,0,0,.6) inset,0 2px 12px rgba(0,0,0,.5);background:linear-gradient(0deg, #222 0%, #555 100%);transition:.05s all}.instruments__piano-key-white:active,.instruments__piano-key-white-active{border:1px solid #b4b4b4;box-shadow:2px 0 3px rgba(0,0,0,.1) inset,-5px 5px 20px rgba(0,0,0,.2) inset,0 0 3px rgba(0,0,0,.2);background:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%)}.instruments__piano-key-black:active,.instruments__piano-key-black-active{border:1px solid #222;box-shadow:-1px -1px 2px rgba(255,255,255,.2) inset,0 -2px 2px 3px rgba(0,0,0,.6) inset,0 1px 2px rgba(0,0,0,.5);background:linear-gradient(to bottom, #444 0%, #222 100%)}.instruments__piano-key-white-offset{margin-left:-1.5em}.instruments__piano-key:first-child{margin-left:10px;border-top-left-radius:10px;border-bottom-left-radius:10px}.instruments__piano-key:last-child{margin-right:10px;border-top-right-radius:10px;border-bottom-right-radius:10px}.instruments__notedetails{display:flex;flex-direction:column;user-select:none;pointer-events:none}.instruments__notename{font-size:10px}.instruments__notekey{font-size:15px;padding-bottom:10px}.instruments__piano-key-white>.instruments__notename{font-size:14px;text-shadow:0px 0px 1px 5px #fff}.instrument__keybind-indicator{border-radius:20px;width:20px;height:10px}.instrument__panel{display:flex;justify-content:center;flex-direction:row;align-items:center;border-radius:10px;padding:6px;background:#333}.instrument__keyboardsupport{padding-right:5px;display:flex;flex-direction:column;justify-content:center;align-items:center}.instrument__panel-input{text-align:center;font-size:9px;font-weight:bold;padding:0px 5px}.instrument__toggle-keyboard-button{width:100%;text-align:center;margin-bottom:4px}.instrument_panel-info{flex-grow:1;text-align:center;color:#000;padding:0 10px;margin:0 10px;background:#fff;border-radius:5px}.instrument__instructions{width:100%;text-align:center}.instrument__input_keyorder{width:100%}.ListInput__Section{font-family:Segoe UI Emoji}.ListInput__Section .Section__title{flex-shrink:0}.ListInput__Section .Section__titleText{font-size:1em}.ListInput__Loader{width:100%;position:relative;height:4px}.ListInput__LoaderProgress{position:absolute;transition:background-color 500ms ease-out,width 500ms ease-out;background-color:#3e6189;height:100%}.minimap-controller__number-inputs{width:70px}.minimap-controller__buttons{font-size:1.7rem}.minimap-controller__marker-list{background-color:rgba(0,0,0,.2);justify-content:space-between;padding:5px;padding-bottom:1px;margin-bottom:4px}.paper__stamp,.paper__stamp-text{position:absolute;pointer-events:none;user-select:none}.paper__stamp-text{overflow:hidden;height:40px;padding:.55rem .5rem;box-shadow:inset 0px 0px 0px 3px #525252;color:#5c5c5c;font-family:"Anton";font-size:1.5rem;font-weight:500;text-align:center;text-transform:uppercase;white-space:nowrap}.paper__page{word-break:break-word;word-wrap:break-word}.phone__button>div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.port-atmos-pressure-bar__text{text-shadow:1px 1px 1px #000,-1px 1px 1px #000,1px -1px 1px #000,-1px -1px 1px #000}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fa-solid,.Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fa-solid,.Button--hasContent .fa-regular{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--black:active{background-color:#262626}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--white:active{background-color:#fbfbfb}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--red:active{background-color:#e78484}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--orange:active{background-color:#f5b082}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--yellow:active{background-color:#f9e572}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--olive:active{background-color:#d6e761}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--green:active{background-color:#59da78}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--teal:active{background-color:#26eee5}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--blue:active{background-color:#73b3e5}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--violet:active{background-color:#a389dd}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--purple:active{background-color:#c785dd}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--pink:active{background-color:#ee96c7}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--brown:active{background-color:#ca9c7e}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--grey:active{background-color:#a8a8a8}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--light-grey:active{background-color:#e2e2e2}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--good:active{background-color:#8ed55f}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--average:active{background-color:#f3bd76}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--bad:active{background-color:#e78484}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--label:active{background-color:#bec7d3}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--default:active{background-color:#89a6c6}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--caution:active{background-color:#f9e572}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--danger:active{background-color:#e78484}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.Button--color--transparent:active{background-color:#565656}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--selected:active{background-color:#59da78}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.WeaponVendor .Button--color--sidearm{transition:color 50ms,background-color 50ms;background-color:#00b5ad;color:#fff}.WeaponVendor .Button--color--sidearm:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--sidearm:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--sidearm:hover,.WeaponVendor .Button--color--sidearm:focus{background-color:#13e3da;color:#fff}.WeaponVendor .Button--color--sidearm:active{background-color:#41f8ef}.WeaponVendor .Button--color--loadout{transition:color 50ms,background-color 50ms;background-color:#fbd608;color:#000}.WeaponVendor .Button--color--loadout:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--loadout:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--loadout:hover,.WeaponVendor .Button--color--loadout:focus{background-color:#fce354;color:#000}.WeaponVendor .Button--color--loadout:active{background-color:#fdefa0}.WeaponVendor .Button--color--utility{transition:color 50ms,background-color 50ms;background-color:#2185d0;color:#fff}.WeaponVendor .Button--color--utility:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--utility:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--utility:hover,.WeaponVendor .Button--color--utility:focus{background-color:#59a8e3;color:#fff}.WeaponVendor .Button--color--utility:active{background-color:#99c9ee}.WeaponVendor .Button--color--ammo{transition:color 50ms,background-color 50ms;background-color:#f2711c;color:#fff}.WeaponVendor .Button--color--ammo:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--ammo:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--ammo:hover,.WeaponVendor .Button--color--ammo:focus{background-color:#f6a067;color:#fff}.WeaponVendor .Button--color--ammo:active{background-color:#fbceb1}.WeaponVendor .Button--color--assistant{transition:color 50ms,background-color 50ms;background-color:#767676;color:#fff}.WeaponVendor .Button--color--assistant:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--assistant:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--assistant:hover,.WeaponVendor .Button--color--assistant:focus{background-color:#9b9b9b;color:#fff}.WeaponVendor .Button--color--assistant:active{background-color:silver}.WeaponVendor .Button--color--fishing{transition:color 50ms,background-color 50ms;background-color:#2185d0;color:#fff}.WeaponVendor .Button--color--fishing:hover{transition:color 0ms,background-color 0ms}.WeaponVendor .Button--color--fishing:focus{transition:color 100ms,background-color 100ms}.WeaponVendor .Button--color--fishing:hover,.WeaponVendor .Button--color--fishing:focus{background-color:#59a8e3;color:#fff}.WeaponVendor .Button--color--fishing:active{background-color:#99c9ee}.WeaponVendor__Credits--sidearm{color:#00b5ad}.WeaponVendor__Credits--loadout{color:#fbd608}.WeaponVendor__Credits--utility{color:#2185d0}.WeaponVendor__Credits--ammo{color:#f2711c}.WeaponVendor__Credits--assistant{color:#767676}.WeaponVendor__Credits--fishing{color:#2185d0}.WeaponVendor__Row:not(:last-child){border-bottom:2px solid #3e6189}.Layout,.Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.NtosHeader__left{position:absolute;left:12px}.NtosHeader__right{position:absolute;right:12px}.NtosHeader__icon{margin-top:-9px;margin-bottom:-6px;vertical-align:middle}.NtosWindow__header{position:absolute;top:0;left:0;right:0;height:28px;line-height:27px;background-color:rgba(0,0,0,.5);font-family:Consolas,monospace;font-size:14px;user-select:none;-ms-user-select:none}.NtosWindow__content .Layout__content{margin-top:28px;font-family:Consolas,monospace;font-size:14px}.TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color 250ms ease-out,background-color 250ms ease-out}.TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom, #2a2a2a 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMSI+CiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPgogIDxwYXRoIGQ9Ik0gNC44NDQ2MzMzLDIyLjEwODc1IEEgMTMuNDEyMDM5LDEyLjUwMTg0MiAwIDAgMSAxMy40Nzc1ODgsMC4wMzkyNCBsIDY2LjExODMxNSwwIGEgNS4zNjQ4MTU4LDUuMDAwNzM3IDAgMCAxIDUuMzY0ODIzLDUuMDAwNzMgbCAwLDc5Ljg3OTMxIHoiIC8+CiAgPHBhdGggZD0ibSA0MjAuMTU1MzUsMTc3Ljg5MTE5IGEgMTMuNDEyMDM4LDEyLjUwMTg0MiAwIDAgMSAtOC42MzI5NSwyMi4wNjk1MSBsIC02Ni4xMTgzMiwwIGEgNS4zNjQ4MTUyLDUuMDAwNzM3IDAgMCAxIC01LjM2NDgyLC01LjAwMDc0IGwgMCwtNzkuODc5MzEgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==);background-size:70%;background-position:center;background-repeat:no-repeat}
+.theme-genetek .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-genetek .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-genetek .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-genetek .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-genetek .ProgressBar--color--default{border:.0833333333em solid #1b676b}.theme-genetek .ProgressBar--color--default .ProgressBar__fill{background-color:#1b676b}.theme-genetek .Section{position:relative;margin-bottom:.5em;background-color:#0a2628;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-genetek .Section:last-child{margin-bottom:0}.theme-genetek .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #2eafb6}.theme-genetek .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-genetek .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-genetek .Section__rest{position:relative}.theme-genetek .Section__content{padding:.66em .5em}.theme-genetek .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-genetek .Section--fill{display:flex;flex-direction:column;height:100%}.theme-genetek .Section--fill>.Section__rest{flex-grow:1}.theme-genetek .Section--fill>.Section__rest>.Section__content{height:100%}.theme-genetek .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-genetek .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-genetek .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-genetek .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-genetek .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-genetek .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-genetek .Section .Section:first-child{margin-top:-0.5em}.theme-genetek .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-genetek .Section .Section .Section .Section__titleText{font-size:1em}.theme-genetek .Layout,.theme-genetek .Layout *{scrollbar-base-color:#0b2a2c;scrollbar-face-color:#185a5e;scrollbar-3dlight-color:#0f393b;scrollbar-highlight-color:#0f393b;scrollbar-track-color:#0b2a2c;scrollbar-arrow-color:#51cdd3;scrollbar-shadow-color:#185a5e}.theme-genetek .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-genetek .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-genetek .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#0f393b;background-image:linear-gradient(to bottom, #114043 0%, #0d3133 100%)}.theme-genetek .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-genetek .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-genetek .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-genetek .Window__contentPadding:after{height:0}.theme-genetek .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-genetek .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(36,85,87,.25);pointer-events:none}.theme-genetek .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-genetek .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-genetek .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-genetek .TitleBar{background-color:#144d50;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-genetek .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#144d50;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-genetek .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-genetek .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-genetek .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-genetek .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-genetek .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-genetek .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-genetek .Layout__content{background-position-x:-60%;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MCA1NyIgb3BhY2l0eT0iLjEiPgogIDxlbGxpcHNlIGN4PSIyMCIgY3k9IjYuNDgiIHJ4PSIxNC4yIiByeT0iNi42NCIgLz4KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSIyMi45IiByeD0iMTAiIHJ5PSI0LjcxIiAvPgogIDxlbGxpcHNlIGN4PSIyMCIgY3k9IjQ3LjUiIHJ4PSIyMCIgcnk9IjkuNCIgLz4KICA8cGF0aCBkPSJtOS4yIDYuNDhoLTIuNjJsMy40MiAxNC43LTkuODIgMjQuNmgyLjNsMTAuMS0yNC42eiIgLz4KICA8cGF0aCBkPSJtMzAuNyA2LjQ4LTMuNiAxNC43IDEwLjEgMjQuNmgyLjNsLTkuOC0yNC42IDMuNi0xNC43eiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==)}.theme-genetek .color-label{color:#bfcc90 !important}.theme-genetek .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-genetek .Button:last-child{margin-right:0;margin-bottom:0}.theme-genetek .Button .fa,.theme-genetek .Button .fa-solid,.theme-genetek .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-genetek .Button--hasContent .fa,.theme-genetek .Button--hasContent .fa-solid,.theme-genetek .Button--hasContent .fa-regular{margin-right:.25em}.theme-genetek .Button--hasContent.Button--iconPosition--right .fa,.theme-genetek .Button--hasContent.Button--iconPosition--right .fas,.theme-genetek .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-genetek .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-genetek .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-genetek .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-genetek .Button--circular{border-radius:50%}.theme-genetek .Button--compact{padding:0 .25em;line-height:1.333em}.theme-genetek .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#1b676b;color:#fff}.theme-genetek .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--default:hover,.theme-genetek .Button--color--default:focus{background-color:#328a8e;color:#fff}.theme-genetek .Button--color--default:active{background-color:#49acb1}.theme-genetek .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-genetek .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--caution:hover,.theme-genetek .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-genetek .Button--color--caution:active{background-color:#f9e572}.theme-genetek .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-genetek .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--danger:hover,.theme-genetek .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-genetek .Button--color--danger:active{background-color:#e78484}.theme-genetek .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#0f393b;color:#fff;background-color:rgba(15,57,59,0);color:rgba(234,253,230,.75)}.theme-genetek .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--color--transparent:hover,.theme-genetek .Button--color--transparent:focus{background-color:#245557;color:#fff}.theme-genetek .Button--color--transparent:active{background-color:#3a7073}.theme-genetek .Button--disabled{background-color:#999 !important}.theme-genetek .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-genetek .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-genetek .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-genetek .Button--selected:hover,.theme-genetek .Button--selected:focus{background-color:#32c154;color:#fff}.theme-genetek .Button--selected:active{background-color:#59da78}.theme-genetek .Button--flex{display:inline-flex;flex-direction:column}.theme-genetek .Button--flex--fluid{width:100%}.theme-genetek .Button--verticalAlignContent--top{justify-content:flex-start}.theme-genetek .Button--verticalAlignContent--middle{justify-content:center}.theme-genetek .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-genetek .Button__content{display:block;align-self:stretch}
+.theme-genetek-disabled .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-genetek-disabled .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-genetek-disabled .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-genetek-disabled .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-genetek-disabled .ProgressBar--color--default{border:.0833333333em solid #36645d}.theme-genetek-disabled .ProgressBar--color--default .ProgressBar__fill{background-color:#36645d}.theme-genetek-disabled .Section{position:relative;margin-bottom:.5em;background-color:#142522;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-genetek-disabled .Section:last-child{margin-bottom:0}.theme-genetek-disabled .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #559e93}.theme-genetek-disabled .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-genetek-disabled .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-genetek-disabled .Section__rest{position:relative}.theme-genetek-disabled .Section__content{padding:.66em .5em}.theme-genetek-disabled .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-genetek-disabled .Section--fill{display:flex;flex-direction:column;height:100%}.theme-genetek-disabled .Section--fill>.Section__rest{flex-grow:1}.theme-genetek-disabled .Section--fill>.Section__rest>.Section__content{height:100%}.theme-genetek-disabled .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-genetek-disabled .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-genetek-disabled .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-genetek-disabled .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-genetek-disabled .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-genetek-disabled .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-genetek-disabled .Section .Section:first-child{margin-top:-0.5em}.theme-genetek-disabled .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-genetek-disabled .Section .Section .Section .Section__titleText{font-size:1em}.theme-genetek-disabled .Layout,.theme-genetek-disabled .Layout *{scrollbar-base-color:#162926;scrollbar-face-color:#2d534d;scrollbar-3dlight-color:#1e3733;scrollbar-highlight-color:#1e3733;scrollbar-track-color:#162926;scrollbar-arrow-color:#75b4ab;scrollbar-shadow-color:#2d534d}.theme-genetek-disabled .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-genetek-disabled .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-genetek-disabled .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1e3733;background-image:linear-gradient(to bottom, #213e39 0%, #1a302d 100%)}.theme-genetek-disabled .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-genetek-disabled .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-genetek-disabled .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-genetek-disabled .Window__contentPadding:after{height:0}.theme-genetek-disabled .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-genetek-disabled .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(54,83,78,.25);pointer-events:none}.theme-genetek-disabled .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-genetek-disabled .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-genetek-disabled .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-genetek-disabled .TitleBar{background-color:#294b46;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-genetek-disabled .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#294b46;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-genetek-disabled .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-genetek-disabled .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-genetek-disabled .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-genetek-disabled .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-genetek-disabled .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-genetek-disabled .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-genetek-disabled .Layout__content{background-position-x:-60%;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MCA1NyIgb3BhY2l0eT0iLjEiPgogIDxlbGxpcHNlIGN4PSIyMCIgY3k9IjYuNDgiIHJ4PSIxNC4yIiByeT0iNi42NCIgLz4KICA8ZWxsaXBzZSBjeD0iMjAiIGN5PSIyMi45IiByeD0iMTAiIHJ5PSI0LjcxIiAvPgogIDxlbGxpcHNlIGN4PSIyMCIgY3k9IjQ3LjUiIHJ4PSIyMCIgcnk9IjkuNCIgLz4KICA8cGF0aCBkPSJtOS4yIDYuNDhoLTIuNjJsMy40MiAxNC43LTkuODIgMjQuNmgyLjNsMTAuMS0yNC42eiIgLz4KICA8cGF0aCBkPSJtMzAuNyA2LjQ4LTMuNiAxNC43IDEwLjEgMjQuNmgyLjNsLTkuOC0yNC42IDMuNi0xNC43eiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==)}.theme-genetek-disabled .color-label{color:#bfcc90 !important}.theme-genetek-disabled .Button{background-color:#999 !important}
 .theme-ntos .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-ntos .Button:last-child{margin-right:0;margin-bottom:0}.theme-ntos .Button .fa,.theme-ntos .Button .fa-solid,.theme-ntos .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-ntos .Button--hasContent .fa,.theme-ntos .Button--hasContent .fa-solid,.theme-ntos .Button--hasContent .fa-regular{margin-right:.25em}.theme-ntos .Button--hasContent.Button--iconPosition--right .fa,.theme-ntos .Button--hasContent.Button--iconPosition--right .fas,.theme-ntos .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-ntos .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos .Button--circular{border-radius:50%}.theme-ntos .Button--compact{padding:0 .25em;line-height:1.333em}.theme-ntos .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#384e68;color:#fff}.theme-ntos .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-ntos .Button--color--default:hover,.theme-ntos .Button--color--default:focus{background-color:#546d8b;color:#fff}.theme-ntos .Button--color--default:active{background-color:#6f8cad}.theme-ntos .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-ntos .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-ntos .Button--color--caution:hover,.theme-ntos .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-ntos .Button--color--caution:active{background-color:#f9e572}.theme-ntos .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-ntos .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-ntos .Button--color--danger:hover,.theme-ntos .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-ntos .Button--color--danger:active{background-color:#e78484}.theme-ntos .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#1f2b39;color:#fff;background-color:rgba(31,43,57,0);color:rgba(227,240,255,.75)}.theme-ntos .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-ntos .Button--color--transparent:hover,.theme-ntos .Button--color--transparent:focus{background-color:#374555;color:#fff}.theme-ntos .Button--color--transparent:active{background-color:#4e5e71}.theme-ntos .Button--disabled{background-color:#999 !important}.theme-ntos .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-ntos .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-ntos .Button--selected:hover,.theme-ntos .Button--selected:focus{background-color:#32c154;color:#fff}.theme-ntos .Button--selected:active{background-color:#59da78}.theme-ntos .Button--flex{display:inline-flex;flex-direction:column}.theme-ntos .Button--flex--fluid{width:100%}.theme-ntos .Button--verticalAlignContent--top{justify-content:flex-start}.theme-ntos .Button--verticalAlignContent--middle{justify-content:center}.theme-ntos .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-ntos .Button__content{display:block;align-self:stretch}.theme-ntos .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-ntos .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-ntos .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-ntos .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-ntos .ProgressBar--color--default{border:.0833333333em solid #384e68}.theme-ntos .ProgressBar--color--default .ProgressBar__fill{background-color:#384e68}.theme-ntos .Section{position:relative;margin-bottom:.5em;background-color:#151d26;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-ntos .Section:last-child{margin-bottom:0}.theme-ntos .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-ntos .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-ntos .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-ntos .Section__rest{position:relative}.theme-ntos .Section__content{padding:.66em .5em}.theme-ntos .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-ntos .Section--fill{display:flex;flex-direction:column;height:100%}.theme-ntos .Section--fill>.Section__rest{flex-grow:1}.theme-ntos .Section--fill>.Section__rest>.Section__content{height:100%}.theme-ntos .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-ntos .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-ntos .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-ntos .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-ntos .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-ntos .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-ntos .Section .Section:first-child{margin-top:-0.5em}.theme-ntos .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-ntos .Section .Section .Section .Section__titleText{font-size:1em}.theme-ntos .SectionEx .Section__title{display:flex}.theme-ntos .SectionEx .Section__titleText{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:auto}.theme-ntos .SectionEx .Section__buttons{position:inherit;right:inherit;flex:none}.theme-ntos .SectionEx__capitalize .Section__titleText{text-transform:capitalize}.theme-ntos .Layout,.theme-ntos .Layout *{scrollbar-base-color:#17202b;scrollbar-face-color:#2e3f55;scrollbar-3dlight-color:#1f2b39;scrollbar-highlight-color:#1f2b39;scrollbar-track-color:#17202b;scrollbar-arrow-color:#7693b5;scrollbar-shadow-color:#2e3f55}.theme-ntos .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-ntos .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-ntos .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1f2b39;background-image:linear-gradient(to bottom, #223040 0%, #1b2633 100%)}.theme-ntos .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-ntos .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-ntos .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-ntos .Window__contentPadding:after{height:0}.theme-ntos .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-ntos .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,69,85,.25);pointer-events:none}.theme-ntos .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-ntos .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-ntos .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-ntos .TitleBar{background-color:#2a3b4e;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#2a3b4e;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-ntos .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-ntos .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-ntos .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-ntos .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-ntos .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}
 .theme-paper .color-black{color:#000 !important}.theme-paper .color-white{color:#e6e6e6 !important}.theme-paper .color-red{color:#c82121 !important}.theme-paper .color-orange{color:#e6630d !important}.theme-paper .color-yellow{color:#e5c304 !important}.theme-paper .color-olive{color:#a3b816 !important}.theme-paper .color-green{color:#1d9f3b !important}.theme-paper .color-teal{color:#00a39c !important}.theme-paper .color-blue{color:#1e78bb !important}.theme-paper .color-violet{color:#5a30b5 !important}.theme-paper .color-purple{color:#932eb4 !important}.theme-paper .color-pink{color:#db228a !important}.theme-paper .color-brown{color:#955d39 !important}.theme-paper .color-grey{color:#6a6a6a !important}.theme-paper .color-light-grey{color:#999 !important}.theme-paper .color-good{color:#529923 !important}.theme-paper .color-average{color:#da810e !important}.theme-paper .color-bad{color:#c82121 !important}.theme-paper .color-label{color:#6d819b !important}.theme-paper .color-bg-black{background-color:#404040 !important}.theme-paper .color-bg-white{background-color:#fff !important}.theme-paper .color-bg-red{background-color:#e45e5e !important}.theme-paper .color-bg-orange{background-color:#f59555 !important}.theme-paper .color-bg-yellow{background-color:#fce046 !important}.theme-paper .color-bg-olive{background-color:#d3e942 !important}.theme-paper .color-bg-green{background-color:#40dc65 !important}.theme-paper .color-bg-teal{background-color:#08fff4 !important}.theme-paper .color-bg-blue{background-color:#51a5e3 !important}.theme-paper .color-bg-violet{background-color:#8b67d7 !important}.theme-paper .color-bg-purple{background-color:#bb64d8 !important}.theme-paper .color-bg-pink{background-color:#e86bb1 !important}.theme-paper .color-bg-brown{background-color:#c58b66 !important}.theme-paper .color-bg-grey{background-color:#989898 !important}.theme-paper .color-bg-light-grey{background-color:#bfbfbf !important}.theme-paper .color-bg-good{background-color:#80d547 !important}.theme-paper .color-bg-average{background-color:#f4ab4d !important}.theme-paper .color-bg-bad{background-color:#e45e5e !important}.theme-paper .color-bg-label{background-color:#9eacbd !important}.theme-paper .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-paper .Tabs--fill{height:100%}.theme-paper .Section .Tabs{background-color:transparent}.theme-paper .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-paper .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-paper .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-paper .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-paper .Tabs--horizontal:last-child{margin-bottom:0}.theme-paper .Tabs__Tab{flex-grow:0}.theme-paper .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-paper .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.theme-paper .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-paper .Tab--selected{background-color:rgba(255,255,255,.125);color:#fafafa}.theme-paper .Tab__text{flex-grow:1;margin:0 .5em}.theme-paper .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-paper .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-paper .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-paper .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #f9f9f9}.theme-paper .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-paper .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #f9f9f9}.theme-paper .Tab--selected.Tab--color--black{color:#404040}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-paper .Tab--selected.Tab--color--white{color:#ececec}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-paper .Tab--selected.Tab--color--red{color:#e14d4d}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-paper .Tab--selected.Tab--color--orange{color:#f48942}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-paper .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-paper .Tab--selected.Tab--color--olive{color:#d0e732}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-paper .Tab--selected.Tab--color--green{color:#33da5a}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-paper .Tab--selected.Tab--color--teal{color:#00faef}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-paper .Tab--selected.Tab--color--blue{color:#419ce1}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-paper .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-paper .Tab--selected.Tab--color--purple{color:#b455d4}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-paper .Tab--selected.Tab--color--pink{color:#e558a7}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-paper .Tab--selected.Tab--color--brown{color:#c0825a}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-paper .Tab--selected.Tab--color--grey{color:#8f8f8f}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#6a6a6a}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#6a6a6a}.theme-paper .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-paper .Tab--selected.Tab--color--good{color:#77d23b}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-paper .Tab--selected.Tab--color--average{color:#f3a23a}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-paper .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-paper .Tab--selected.Tab--color--label{color:#91a1b4}.theme-paper .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#6d819b}.theme-paper .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#6d819b}.theme-paper .Section{position:relative;margin-bottom:.5em;background-color:#d6d6d6;background-color:rgba(0,0,0,.1);box-sizing:border-box}.theme-paper .Section:last-child{margin-bottom:0}.theme-paper .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-paper .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-paper .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-paper .Section__rest{position:relative}.theme-paper .Section__content{padding:.66em .5em}.theme-paper .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-paper .Section--fill{display:flex;flex-direction:column;height:100%}.theme-paper .Section--fill>.Section__rest{flex-grow:1}.theme-paper .Section--fill>.Section__rest>.Section__content{height:100%}.theme-paper .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-paper .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-paper .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-paper .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-paper .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-paper .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-paper .Section .Section:first-child{margin-top:-0.5em}.theme-paper .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-paper .Section .Section .Section .Section__titleText{font-size:1em}.theme-paper .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-paper .Button:last-child{margin-right:0;margin-bottom:0}.theme-paper .Button .fa,.theme-paper .Button .fa-solid,.theme-paper .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-paper .Button--hasContent .fa,.theme-paper .Button--hasContent .fa-solid,.theme-paper .Button--hasContent .fa-regular{margin-right:.25em}.theme-paper .Button--hasContent.Button--iconPosition--right .fa,.theme-paper .Button--hasContent.Button--iconPosition--right .fas,.theme-paper .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-paper .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-paper .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-paper .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-paper .Button--circular{border-radius:50%}.theme-paper .Button--compact{padding:0 .25em;line-height:1.333em}.theme-paper .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#404040;color:#fff}.theme-paper .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--black:hover,.theme-paper .Button--color--black:focus{background-color:#5d5d5d;color:#fff}.theme-paper .Button--color--black:active{background-color:#797979}.theme-paper .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#fff;color:#000}.theme-paper .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--white:hover,.theme-paper .Button--color--white:focus{background-color:#fff;color:#000}.theme-paper .Button--color--white:active{background-color:#fff}.theme-paper .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#e45e5e;color:#fff}.theme-paper .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--red:hover,.theme-paper .Button--color--red:focus{background-color:#f1a8a8;color:#fff}.theme-paper .Button--color--red:active{background-color:#fcefef}.theme-paper .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#f59555;color:#000}.theme-paper .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--orange:hover,.theme-paper .Button--color--orange:focus{background-color:#fac9a8;color:#000}.theme-paper .Button--color--orange:active{background-color:#fef5ee}.theme-paper .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#fce046;color:#000}.theme-paper .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--yellow:hover,.theme-paper .Button--color--yellow:focus{background-color:#feee9b;color:#000}.theme-paper .Button--color--yellow:active{background-color:#fffced}.theme-paper .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#d3e942;color:#000}.theme-paper .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--olive:hover,.theme-paper .Button--color--olive:focus{background-color:#e5f28c;color:#000}.theme-paper .Button--color--olive:active{background-color:#f5fbd6}.theme-paper .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#40dc65;color:#000}.theme-paper .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--green:hover,.theme-paper .Button--color--green:focus{background-color:#84e99c;color:#000}.theme-paper .Button--color--green:active{background-color:#c9f6d3}.theme-paper .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#08fff4;color:#000}.theme-paper .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--teal:hover,.theme-paper .Button--color--teal:focus{background-color:#56fff8;color:#000}.theme-paper .Button--color--teal:active{background-color:#a4fffb}.theme-paper .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#51a5e3;color:#fff}.theme-paper .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--blue:hover,.theme-paper .Button--color--blue:focus{background-color:#9acbef;color:#fff}.theme-paper .Button--color--blue:active{background-color:#e3f0fb}.theme-paper .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#8b67d7;color:#fff}.theme-paper .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--violet:hover,.theme-paper .Button--color--violet:focus{background-color:#bface9;color:#fff}.theme-paper .Button--color--violet:active{background-color:#f3effb}.theme-paper .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#bb64d8;color:#fff}.theme-paper .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--purple:hover,.theme-paper .Button--color--purple:focus{background-color:#d9a9e9;color:#fff}.theme-paper .Button--color--purple:active{background-color:#f7edfa}.theme-paper .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#e86bb1;color:#fff}.theme-paper .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--pink:hover,.theme-paper .Button--color--pink:focus{background-color:#f4b7d9;color:#fff}.theme-paper .Button--color--pink:active{background-color:#fdf0f7}.theme-paper .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#c58b66;color:#fff}.theme-paper .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--brown:hover,.theme-paper .Button--color--brown:focus{background-color:#dbb9a2;color:#fff}.theme-paper .Button--color--brown:active{background-color:#f3e6df}.theme-paper .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#989898;color:#fff}.theme-paper .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--grey:hover,.theme-paper .Button--color--grey:focus{background-color:#c2c2c2;color:#fff}.theme-paper .Button--color--grey:active{background-color:#ededed}.theme-paper .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-paper .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--light-grey:hover,.theme-paper .Button--color--light-grey:focus{background-color:#efefef;color:#000}.theme-paper .Button--color--light-grey:active{background-color:#f9f9f9}.theme-paper .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#80d547;color:#000}.theme-paper .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--good:hover,.theme-paper .Button--color--good:focus{background-color:#aee489;color:#000}.theme-paper .Button--color--good:active{background-color:#dbf3cb}.theme-paper .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#f4ab4d;color:#000}.theme-paper .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--average:hover,.theme-paper .Button--color--average:focus{background-color:#f9d29e;color:#000}.theme-paper .Button--color--average:active{background-color:#fef7ed}.theme-paper .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#e45e5e;color:#fff}.theme-paper .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--bad:hover,.theme-paper .Button--color--bad:focus{background-color:#f1a8a8;color:#fff}.theme-paper .Button--color--bad:active{background-color:#fcefef}.theme-paper .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#9eacbd;color:#000}.theme-paper .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--label:hover,.theme-paper .Button--color--label:focus{background-color:#d4dae2;color:#000}.theme-paper .Button--color--label:active{background-color:#f5f7f9}.theme-paper .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000}.theme-paper .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--default:hover,.theme-paper .Button--color--default:focus{background-color:#fbfaf6;color:#000}.theme-paper .Button--color--default:active{background-color:#fdfcfa}.theme-paper .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-paper .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--caution:hover,.theme-paper .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-paper .Button--color--caution:active{background-color:#f2a75d}.theme-paper .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-paper .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--danger:hover,.theme-paper .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-paper .Button--color--danger:active{background-color:#eef226}.theme-paper .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-paper .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--color--transparent:hover,.theme-paper .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-paper .Button--color--transparent:active{background-color:#fdfdfd}.theme-paper .Button--disabled{background-color:#363636 !important}.theme-paper .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-paper .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-paper .Button--selected:hover,.theme-paper .Button--selected:focus{background-color:#c81c1c;color:#fff}.theme-paper .Button--selected:active{background-color:#ec3737}.theme-paper .Button--flex{display:inline-flex;flex-direction:column}.theme-paper .Button--flex--fluid{width:100%}.theme-paper .Button--verticalAlignContent--top{justify-content:flex-start}.theme-paper .Button--verticalAlignContent--middle{justify-content:center}.theme-paper .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-paper .Button__content{display:block;align-self:stretch}.theme-paper .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#000;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-paper .Input--fluid{display:block;width:auto}.theme-paper .Input__baseline{display:inline-block;color:transparent}.theme-paper .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-paper .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paper .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-paper .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#ddd;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-paper .TextArea--fluid{display:block;width:auto;height:auto}.theme-paper .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-paper .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paper .Layout,.theme-paper .Layout *{scrollbar-base-color:#b3b3b3;scrollbar-face-color:#f0f0f0;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#b3b3b3;scrollbar-arrow-color:#f7f7f7;scrollbar-shadow-color:#f0f0f0}.theme-paper .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-paper .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-paper .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-paper .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-paper .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-paper .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-paper .Window__contentPadding:after{height:0}.theme-paper .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-paper .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-paper .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-paper .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-paper .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-paper .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-paper .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-paper .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-paper .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-paper .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-paper .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-paper .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-paper .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-paper .PaperInput{position:relative;display:inline-block;width:120px;border:none;background:transparent;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .PaperInput__baseline{display:inline-block;color:transparent}.theme-paper .PaperInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-paper .PaperInput__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paper .Layout__content{background-image:none}.theme-paper .Window{background-image:none;color:#000}.theme-paper .paper-text input:disabled{position:relative;display:inline-block;border:none;background:transparent;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .paper-text input{position:relative;display:inline-block;border:none;background:transparent;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .paper-field{position:relative;display:inline-block;border:none;background:transparent;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .paper-field input:disabled{position:relative;display:inline-block;border:none;background:transparent;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .artifactType3{background-color:#c9acac}.theme-paper .artifactType2{background-color:#ccc6b0}.theme-paper .artifactType1{background-color:#adc2d3}
 .theme-retro-dark .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-retro-dark .Button:last-child{margin-right:0;margin-bottom:0}.theme-retro-dark .Button .fa,.theme-retro-dark .Button .fa-solid,.theme-retro-dark .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-retro-dark .Button--hasContent .fa,.theme-retro-dark .Button--hasContent .fa-solid,.theme-retro-dark .Button--hasContent .fa-regular{margin-right:.25em}.theme-retro-dark .Button--hasContent.Button--iconPosition--right .fa,.theme-retro-dark .Button--hasContent.Button--iconPosition--right .fas,.theme-retro-dark .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-retro-dark .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-retro-dark .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-retro-dark .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-retro-dark .Button--circular{border-radius:50%}.theme-retro-dark .Button--compact{padding:0 .25em;line-height:1.333em}.theme-retro-dark .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#fdc185;color:#000}.theme-retro-dark .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-retro-dark .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-retro-dark .Button--color--default:hover,.theme-retro-dark .Button--color--default:focus{background-color:#fff1e4;color:#000}.theme-retro-dark .Button--color--default:active{background-color:#fff9f3}.theme-retro-dark .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-retro-dark .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-retro-dark .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-retro-dark .Button--color--caution:hover,.theme-retro-dark .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-retro-dark .Button--color--caution:active{background-color:#f2a75d}.theme-retro-dark .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-retro-dark .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-retro-dark .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-retro-dark .Button--color--danger:hover,.theme-retro-dark .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-retro-dark .Button--color--danger:active{background-color:#eef226}.theme-retro-dark .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#301f0a;color:#fff;background-color:rgba(48,31,10,0);color:#fda751}.theme-retro-dark .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-retro-dark .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-retro-dark .Button--color--transparent:hover,.theme-retro-dark .Button--color--transparent:focus{background-color:#4a371f;color:#fff}.theme-retro-dark .Button--color--transparent:active{background-color:#654f33}.theme-retro-dark .Button--disabled{background-color:#5e5e5e !important}.theme-retro-dark .Button--selected{transition:color 50ms,background-color 50ms;background-color:#226d0f;color:#fff}.theme-retro-dark .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-retro-dark .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-retro-dark .Button--selected:hover,.theme-retro-dark .Button--selected:focus{background-color:#3a9125;color:#fff}.theme-retro-dark .Button--selected:active{background-color:#52b43a}.theme-retro-dark .Button--flex{display:inline-flex;flex-direction:column}.theme-retro-dark .Button--flex--fluid{width:100%}.theme-retro-dark .Button--verticalAlignContent--top{justify-content:flex-start}.theme-retro-dark .Button--verticalAlignContent--middle{justify-content:center}.theme-retro-dark .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-retro-dark .Button__content{display:block;align-self:stretch}.theme-retro-dark .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(68,46,26,.5);transition:border-color 900ms ease-out;align-items:center}.theme-retro-dark .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-retro-dark .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-retro-dark .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-retro-dark .ProgressBar--color--default{border:.0833333333em solid #fc8e1f}.theme-retro-dark .ProgressBar--color--default .ProgressBar__fill{background-color:#fc8e1f}.theme-retro-dark .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-retro-dark .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-retro-dark .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-retro-dark .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-retro-dark .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-retro-dark .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-retro-dark .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-retro-dark .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-retro-dark .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-retro-dark .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-retro-dark .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-retro-dark .Knob__ringFill{fill:transparent;stroke:#fda751;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-retro-dark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #fda751;border:.0833333333em solid rgba(253,167,81,.75);border-radius:.16em;color:#fdc185;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-retro-dark .Input--fluid{display:block;width:auto}.theme-retro-dark .Input__baseline{display:inline-block;color:transparent}.theme-retro-dark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fdc185;color:inherit}.theme-retro-dark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-retro-dark .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-retro-dark .BlockQuote{color:#fda751;border-left:.1666666667em solid #fda751;padding-left:.5em;margin-bottom:.5em}.theme-retro-dark .BlockQuote:last-child{margin-bottom:0}.theme-retro-dark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #fda751;border:.0833333333em solid rgba(253,167,81,.75);border-radius:.16em;color:#fdc185;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-retro-dark .Input--fluid{display:block;width:auto}.theme-retro-dark .Input__baseline{display:inline-block;color:transparent}.theme-retro-dark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fdc185;color:inherit}.theme-retro-dark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-retro-dark .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-retro-dark .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #fdb062;border:.0833333333em solid rgba(253,176,98,.75);border-radius:.16em;color:#fdb062;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-retro-dark .NumberInput--fluid{display:block}.theme-retro-dark .NumberInput__content{margin-left:.5em}.theme-retro-dark .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-retro-dark .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #fdb062;background-color:#fdb062}.theme-retro-dark .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fdc185;text-align:right}.theme-retro-dark .Section{position:relative;margin-bottom:.5em;background-color:#201507;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-retro-dark .Section:last-child{margin-bottom:0}.theme-retro-dark .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fda751}.theme-retro-dark .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fdc185}.theme-retro-dark .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-retro-dark .Section__rest{position:relative}.theme-retro-dark .Section__content{padding:.66em .5em}.theme-retro-dark .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-retro-dark .Section--fill{display:flex;flex-direction:column;height:100%}.theme-retro-dark .Section--fill>.Section__rest{flex-grow:1}.theme-retro-dark .Section--fill>.Section__rest>.Section__content{height:100%}.theme-retro-dark .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-retro-dark .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-retro-dark .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-retro-dark .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-retro-dark .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-retro-dark .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-retro-dark .Section .Section:first-child{margin-top:-0.5em}.theme-retro-dark .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-retro-dark .Section .Section .Section .Section__titleText{font-size:1em}.theme-retro-dark .Layout,.theme-retro-dark .Layout *{scrollbar-base-color:#241708;scrollbar-face-color:#553712;scrollbar-3dlight-color:#301f0a;scrollbar-highlight-color:#301f0a;scrollbar-track-color:#241708;scrollbar-arrow-color:#d89644;scrollbar-shadow-color:#553712}.theme-retro-dark .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-retro-dark .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-retro-dark .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fdc185;background-color:#301f0a;background-image:linear-gradient(to bottom, #38240c 0%, #281a08 100%)}.theme-retro-dark .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-retro-dark .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-retro-dark .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-retro-dark .Window__contentPadding:after{height:0}.theme-retro-dark .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-retro-dark .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(74,55,31,.25);pointer-events:none}.theme-retro-dark .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-retro-dark .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-retro-dark .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-retro-dark .TitleBar{background-color:#302a23;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-retro-dark .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#302a23;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-retro-dark .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-retro-dark .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-retro-dark .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-retro-dark .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-retro-dark .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-retro-dark .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}
-.theme-syndicate .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0;margin-bottom:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .fa-solid,.theme-syndicate .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .fa-solid,.theme-syndicate .Button--hasContent .fa-regular{margin-right:.25em}.theme-syndicate .Button--hasContent.Button--iconPosition--right .fa,.theme-syndicate .Button--hasContent.Button--iconPosition--right .fas,.theme-syndicate .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--circular{border-radius:50%}.theme-syndicate .Button--compact{padding:0 .25em;line-height:1.333em}.theme-syndicate .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#397439;color:#fff}.theme-syndicate .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--default:hover,.theme-syndicate .Button--color--default:focus{background-color:#595;color:#fff}.theme-syndicate .Button--color--default:active{background-color:#76b776}.theme-syndicate .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-syndicate .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--caution:hover,.theme-syndicate .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-syndicate .Button--color--caution:active{background-color:#f2a75d}.theme-syndicate .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-syndicate .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--danger:hover,.theme-syndicate .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-syndicate .Button--color--danger:active{background-color:#eef226}.theme-syndicate .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#550202;color:#fff;background-color:rgba(85,2,2,0);color:rgba(255,255,255,.5)}.theme-syndicate .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--transparent:hover,.theme-syndicate .Button--color--transparent:focus{background-color:#751616;color:#fff}.theme-syndicate .Button--color--transparent:active{background-color:#952929}.theme-syndicate .Button--disabled{background-color:#363636 !important}.theme-syndicate .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-syndicate .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--selected:hover,.theme-syndicate .Button--selected:focus{background-color:#c81c1c;color:#fff}.theme-syndicate .Button--selected:active{background-color:#ec3737}.theme-syndicate .Button--flex{display:inline-flex;flex-direction:column}.theme-syndicate .Button--flex--fluid{width:100%}.theme-syndicate .Button--verticalAlignContent--top{justify-content:flex-start}.theme-syndicate .Button--verticalAlignContent--middle{justify-content:center}.theme-syndicate .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-syndicate .Button__content{display:block;align-self:stretch}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-syndicate .NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#87ce87;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:.5em}.theme-syndicate .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-syndicate .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-syndicate .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-syndicate .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-syndicate .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:.0833333333em solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .Section{position:relative;margin-bottom:.5em;background-color:#390101;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #397439}.theme-syndicate .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-syndicate .Section__rest{position:relative}.theme-syndicate .Section__content{padding:.66em .5em}.theme-syndicate .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-syndicate .Section--fill{display:flex;flex-direction:column;height:100%}.theme-syndicate .Section--fill>.Section__rest{flex-grow:1}.theme-syndicate .Section--fill>.Section__rest>.Section__content{height:100%}.theme-syndicate .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-syndicate .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-syndicate .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-syndicate .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-syndicate .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-syndicate .Section .Section:first-child{margin-top:-0.5em}.theme-syndicate .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-syndicate .Section .Section .Section .Section__titleText{font-size:1em}.theme-syndicate .Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#4a0202;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.theme-syndicate .Layout,.theme-syndicate .Layout *{scrollbar-base-color:#400202;scrollbar-face-color:#7e0303;scrollbar-3dlight-color:#550202;scrollbar-highlight-color:#550202;scrollbar-track-color:#400202;scrollbar-arrow-color:#fa3030;scrollbar-shadow-color:#7e0303}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#550202;background-image:linear-gradient(to bottom, #730303 0%, #370101 100%)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-syndicate .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-syndicate .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-syndicate .Window__contentPadding:after{height:0}.theme-syndicate .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(117,22,22,.25);pointer-events:none}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#910101;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-syndicate .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-syndicate .Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4xIj4NCiAgPHBhdGggZD0ibSA5My41Mzc2NzcsMCBjIC0xOC4xMTMxMjUsMCAtMzQuMjIwMTMzLDMuMTExNjQgLTQ4LjMyMzQ4NCw5LjMzNDM3IC0xMy45NjUwOTIsNi4yMjE2NyAtMjQuNjEyNDQyLDE1LjA3MTE0IC0zMS45NDA2NTEsMjYuNTQ3MSAtNy4xODk5Mzk4LDExLjMzNzg5IC0xMC4zMDEyMjY2LDI0Ljc0OTExIC0xMC4zMDEyMjY2LDQwLjIzNDc4IDAsMTAuNjQ2NjIgMi43MjUwMDI2LDIwLjQ2NDY1IDguMTc1MTExNiwyOS40NTI1OCA1LjYxNTI3Nyw4Ljk4Njg2IDE0LjAzODI3NywxNy4zNTIwNCAyNS4yNjg4MjEsMjUuMDk0MzYgMTEuMjMwNTQ0LDcuNjA1MzEgMjYuNTA3NDIxLDE1LjQxODM1IDQ1LjgzMDUxNCwyMy40Mzc4MiAxOS45ODM3NDgsOC4yOTU1NyAzNC44NDg4NDgsMTUuNTU0NzEgNDQuNTkyOTk4LDIxLjc3NjM4IDkuNzQ0MTQsNi4yMjI3MyAxNi43NjE3LDEyLjg1ODUgMjEuMDU1NzIsMTkuOTA5NTEgNC4yOTQwNCw3LjA1MjA4IDYuNDQxOTMsMTUuNzY0MDggNi40NDE5MywyNi4xMzQ1OSAwLDE2LjE3NzAyIC01LjIwMTk2LDI4LjQ4MjIyIC0xNS42MDY3MywzNi45MTY4MiAtMTAuMjM5Niw4LjQzNDcgLTI1LjAyMjAzLDEyLjY1MjMgLTQ0LjM0NTE2OSwxMi42NTIzIC0xNC4wMzgxNzEsMCAtMjUuNTE1MjQ3LC0xLjY1OTQgLTM0LjQzMzYxOCwtNC45Nzc3IC04LjkxODM3LC0zLjQ1NjYgLTE2LjE4NTU3MiwtOC43MTEzIC0yMS44MDA4MzksLTE1Ljc2MzMgLTUuNjE1Mjc3LC03LjA1MjEgLTEwLjA3NDc5NSwtMTYuNjYwODggLTEzLjM3Nzg5OSwtMjguODI4MTIgbCAtMjQuNzczMTYyNjI5Mzk0NSwwIDAsNTYuODI2MzIgQyAzMy44NTY3NjksMjg2LjA3NjAxIDYzLjc0OTA0LDI4OS43NDIwMSA4OS42NzgzODMsMjg5Ljc0MjAxIGMgMTYuMDIwMDI3LDAgMzAuNzE5Nzg3LC0xLjM4MjcgNDQuMDk3MzM3LC00LjE0NzkgMTMuNTQyNzIsLTIuOTA0MyAyNS4xMDQxLC03LjQ2NzYgMzQuNjgzMDksLTEzLjY4OTMgOS43NDQxMywtNi4zNTk3IDE3LjM0MDQyLC0xNC41MTk1IDIyLjc5MDUyLC0yNC40NzQ4IDUuNDUwMSwtMTAuMDkzMzIgOC4xNzUxMSwtMjIuMzk5NTkgOC4xNzUxMSwtMzYuOTE2ODIgMCwtMTIuOTk3NjQgLTMuMzAyMSwtMjQuMzM1MzkgLTkuOTA4MjksLTM0LjAxNDYgLTYuNDQxMDUsLTkuODE3MjUgLTE1LjUyNTQ1LC0xOC41MjcwNyAtMjcuMjUxNDYsLTI2LjEzMTMzIC0xMS41NjA4NSwtNy42MDQyNyAtMjcuOTEwODMsLTE1LjgzMTQyIC00OS4wNTA2NiwtMjQuNjgwMjIgLTE3LjUwNjQ0LC03LjE5MDEyIC0zMC43MTk2NjgsLTEzLjY4OTQ4IC0zOS42MzgwMzgsLTE5LjQ5NzAxIC04LjkxODM3MSwtNS44MDc1MiAtMTguNjA3NDc0LC0xMi40MzQwOSAtMjQuMDk2NTI0LC0xOC44NzQxNyAtNS40MjYwNDMsLTYuMzY2MTYgLTkuNjU4ODI2LC0xNS4wNzAwMyAtOS42NTg4MjYsLTI0Ljg4NzI5IDAsLTkuMjY0MDEgMi4wNzU0MTQsLTE3LjIxMzQ1IDYuMjIzNDU0LC0yMy44NTAzMyAxMS4wOTgyOTgsLTE0LjM5NzQ4IDQxLjI4NjYzOCwtMS43OTUwNyA0NS4wNzU2MDksMjQuMzQ3NjIgNC44MzkzOTIsNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NzI5IDEyLjAyOTUxNSwyOC40MTU2IGwgMjAuNTMyMzQsMCAwLC01NS45OTk2NyBjIC00LjQ3ODI1LC01LjkyNDQ4IC05Ljk1NDg4LC0xMC42MzIyMiAtMTUuOTA4MzcsLTE0LjM3NDExIDEuNjQwNTUsMC40NzkwNSAzLjE5MDM5LDEuMDIzNzYgNC42Mzg2NSwxLjY0MDI0IDYuNDk4NjEsMi42MjYwNyAxMi4xNjc5Myw3LjMyNzQ3IDE3LjAwNzMsMTQuMTAzNDUgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ1NjcgMTIuMDI5NTIsMjguNDEzOTcgMCwwIDguNDgxMjgsLTAuMTI4OTQgOC40ODk3OCwtMC4wMDIgMC40MTc3Niw2LjQxNDk0IC0xLjc1MzM5LDkuNDUyODYgLTQuMTIzNDIsMTIuNTYxMDQgLTIuNDE3NCwzLjE2OTc4IC01LjE0NDg2LDYuNzg5NzMgLTQuMDAyNzgsMTMuMDAyOSAxLjUwNzg2LDguMjAzMTggMTAuMTgzNTQsMTAuNTk2NDIgMTQuNjIxOTQsOS4zMTE1NCAtMy4zMTg0MiwtMC40OTkxMSAtNS4zMTg1NSwtMS43NDk0OCAtNS4zMTg1NSwtMS43NDk0OCAwLDAgMS44NzY0NiwwLjk5ODY4IDUuNjUxMTcsLTEuMzU5ODEgLTMuMjc2OTUsMC45NTU3MSAtMTAuNzA1MjksLTAuNzk3MzggLTExLjgwMTI1LC02Ljc2MzEzIC0wLjk1NzUyLC01LjIwODYxIDAuOTQ2NTQsLTcuMjk1MTQgMy40MDExMywtMTAuNTE0ODIgMi40NTQ2MiwtMy4yMTk2OCA1LjI4NDI2LC02Ljk1ODMxIDQuNjg0MywtMTQuNDg4MjQgbCAwLjAwMywwLjAwMiA4LjkyNjc2LDAgMCwtNTUuOTk5NjcgYyAtMTUuMDcxMjUsLTMuODcxNjggLTI3LjY1MzE0LC02LjM2MDQyIC0zNy43NDY3MSwtNy40NjU4NiAtOS45NTUzMSwtMS4xMDc1NSAtMjAuMTg4MjMsLTEuNjU5ODEgLTMwLjY5NjYxMywtMS42NTk4MSB6IG0gNzAuMzIxNjAzLDE3LjMwODkzIDAuMjM4MDUsNDAuMzA0OSBjIDEuMzE4MDgsMS4yMjY2NiAyLjQzOTY1LDIuMjc4MTUgMy4zNDA4MSwzLjEwNjAyIDQuODM5MzksNi43NzQ5MSA4Ljg0OTM0LDE2LjI0NTY2IDEyLjAyOTUxLDI4LjQxMzk3IGwgMjAuNTMyMzQsMCAwLC01NS45OTk2NyBjIC02LjY3NzMxLC00LjU5MzgxIC0xOS44MzY0MywtMTAuNDczMDkgLTM2LjE0MDcxLC0xNS44MjUyMiB6IG0gLTI4LjEyMDQ5LDUuNjA1NTEgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzNywtNi40NjY5NyAtMTMuODQ2NzgsLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNSwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAxNS4yMjE5NSwyNC4wMDg0OCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4LC02LjQ2Njk3IC0xMy44NDY3OSwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA0LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIC05OS4xMTM4NCwyLjIwNzY0IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgyLC02LjQ2Njk3IC0xMy44NDY3ODIsLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTU0MiwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHoiIC8+DQo8L3N2Zz4NCjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPg0KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPg0K)}
+.theme-syndicate .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0;margin-bottom:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .fa-solid,.theme-syndicate .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .fa-solid,.theme-syndicate .Button--hasContent .fa-regular{margin-right:.25em}.theme-syndicate .Button--hasContent.Button--iconPosition--right .fa,.theme-syndicate .Button--hasContent.Button--iconPosition--right .fas,.theme-syndicate .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--circular{border-radius:50%}.theme-syndicate .Button--compact{padding:0 .25em;line-height:1.333em}.theme-syndicate .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#397439;color:#fff}.theme-syndicate .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--default:hover,.theme-syndicate .Button--color--default:focus{background-color:#595;color:#fff}.theme-syndicate .Button--color--default:active{background-color:#76b776}.theme-syndicate .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-syndicate .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--caution:hover,.theme-syndicate .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-syndicate .Button--color--caution:active{background-color:#f2a75d}.theme-syndicate .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-syndicate .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--danger:hover,.theme-syndicate .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-syndicate .Button--color--danger:active{background-color:#eef226}.theme-syndicate .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#550202;color:#fff;background-color:rgba(85,2,2,0);color:rgba(255,255,255,.5)}.theme-syndicate .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--color--transparent:hover,.theme-syndicate .Button--color--transparent:focus{background-color:#751616;color:#fff}.theme-syndicate .Button--color--transparent:active{background-color:#952929}.theme-syndicate .Button--disabled{background-color:#363636 !important}.theme-syndicate .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-syndicate .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-syndicate .Button--selected:hover,.theme-syndicate .Button--selected:focus{background-color:#c81c1c;color:#fff}.theme-syndicate .Button--selected:active{background-color:#ec3737}.theme-syndicate .Button--flex{display:inline-flex;flex-direction:column}.theme-syndicate .Button--flex--fluid{width:100%}.theme-syndicate .Button--verticalAlignContent--top{justify-content:flex-start}.theme-syndicate .Button--verticalAlignContent--middle{justify-content:center}.theme-syndicate .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-syndicate .Button__content{display:block;align-self:stretch}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-syndicate .NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#87ce87;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:.5em}.theme-syndicate .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-syndicate .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-syndicate .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-syndicate .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-syndicate .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:.0833333333em solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .Section{position:relative;margin-bottom:.5em;background-color:#390101;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #397439}.theme-syndicate .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-syndicate .Section__rest{position:relative}.theme-syndicate .Section__content{padding:.66em .5em}.theme-syndicate .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-syndicate .Section--fill{display:flex;flex-direction:column;height:100%}.theme-syndicate .Section--fill>.Section__rest{flex-grow:1}.theme-syndicate .Section--fill>.Section__rest>.Section__content{height:100%}.theme-syndicate .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-syndicate .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-syndicate .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-syndicate .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-syndicate .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-syndicate .Section .Section:first-child{margin-top:-0.5em}.theme-syndicate .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-syndicate .Section .Section .Section .Section__titleText{font-size:1em}.theme-syndicate .Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#4a0202;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.theme-syndicate .Layout,.theme-syndicate .Layout *{scrollbar-base-color:#400202;scrollbar-face-color:#7e0303;scrollbar-3dlight-color:#550202;scrollbar-highlight-color:#550202;scrollbar-track-color:#400202;scrollbar-arrow-color:#fa3030;scrollbar-shadow-color:#7e0303}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#550202;background-image:linear-gradient(to bottom, #730303 0%, #370101 100%)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-syndicate .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-syndicate .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-syndicate .Window__contentPadding:after{height:0}.theme-syndicate .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(117,22,22,.25);pointer-events:none}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#910101;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-syndicate .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-syndicate .Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPgo8L3N2Zz4KPCEtLSBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gLS0+CjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4K)}
 .theme-flock{color:26FFE7}.theme-flock .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-flock .Button:last-child{margin-right:0;margin-bottom:0}.theme-flock .Button .fa,.theme-flock .Button .fa-solid,.theme-flock .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-flock .Button--hasContent .fa,.theme-flock .Button--hasContent .fa-solid,.theme-flock .Button--hasContent .fa-regular{margin-right:.25em}.theme-flock .Button--hasContent.Button--iconPosition--right .fa,.theme-flock .Button--hasContent.Button--iconPosition--right .fas,.theme-flock .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-flock .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-flock .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-flock .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-flock .Button--circular{border-radius:50%}.theme-flock .Button--compact{padding:0 .25em;line-height:1.333em}.theme-flock .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#14aa94;color:#fff}.theme-flock .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-flock .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-flock .Button--color--default:hover,.theme-flock .Button--color--default:focus{background-color:#2ad7bd;color:#fff}.theme-flock .Button--color--default:active{background-color:#5ee6d2}.theme-flock .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-flock .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-flock .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-flock .Button--color--caution:hover,.theme-flock .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-flock .Button--color--caution:active{background-color:#f9e572}.theme-flock .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-flock .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-flock .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-flock .Button--color--danger:hover,.theme-flock .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-flock .Button--color--danger:active{background-color:#e78484}.theme-flock .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#0b5e51;color:#fff;background-color:rgba(11,94,81,0);color:rgba(227,240,255,.75)}.theme-flock .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-flock .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-flock .Button--color--transparent:hover,.theme-flock .Button--color--transparent:focus{background-color:#207f71;color:#fff}.theme-flock .Button--color--transparent:active{background-color:#35a090}.theme-flock .Button--disabled{background-color:#999 !important}.theme-flock .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-flock .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-flock .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-flock .Button--selected:hover,.theme-flock .Button--selected:focus{background-color:#32c154;color:#fff}.theme-flock .Button--selected:active{background-color:#59da78}.theme-flock .Button--flex{display:inline-flex;flex-direction:column}.theme-flock .Button--flex--fluid{width:100%}.theme-flock .Button--verticalAlignContent--top{justify-content:flex-start}.theme-flock .Button--verticalAlignContent--middle{justify-content:center}.theme-flock .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-flock .Button__content{display:block;align-self:stretch}.theme-flock .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color 900ms ease-out;align-items:center}.theme-flock .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-flock .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-flock .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-flock .ProgressBar--color--default{border:.0833333333em solid #14aa94}.theme-flock .ProgressBar--color--default .ProgressBar__fill{background-color:#14aa94}.theme-flock .Section{position:relative;margin-bottom:.5em;background-color:#073f36;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-flock .Section:last-child{margin-bottom:0}.theme-flock .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-flock .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.theme-flock .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-flock .Section__rest{position:relative}.theme-flock .Section__content{padding:.66em .5em}.theme-flock .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-flock .Section--fill{display:flex;flex-direction:column;height:100%}.theme-flock .Section--fill>.Section__rest{flex-grow:1}.theme-flock .Section--fill>.Section__rest>.Section__content{height:100%}.theme-flock .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-flock .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-flock .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-flock .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-flock .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-flock .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-flock .Section .Section:first-child{margin-top:-0.5em}.theme-flock .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-flock .Section .Section .Section .Section__titleText{font-size:1em}.theme-flock .Layout,.theme-flock .Layout *{scrollbar-base-color:#08463d;scrollbar-face-color:#0f8271;scrollbar-3dlight-color:#0b5e51;scrollbar-highlight-color:#0b5e51;scrollbar-track-color:#08463d;scrollbar-arrow-color:#4aead2;scrollbar-shadow-color:#0f8271}.theme-flock .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-flock .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-flock .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#0b5e51;background-image:linear-gradient(to bottom, #0c6759 0%, #0a5449 100%)}.theme-flock .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-flock .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-flock .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-flock .Window__contentPadding:after{height:0}.theme-flock .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-flock .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(32,127,113,.25);pointer-events:none}.theme-flock .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-flock .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-flock .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-flock .TitleBar{background-color:#0f806f;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-flock .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#0f806f;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-flock .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-flock .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-flock .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-flock .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-flock .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-flock .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-flock .Layout__content{background-image:none}
 .theme-nanotrasen.mode-light .color-black{color:#000 !important}.theme-nanotrasen.mode-light .color-white{color:#9e9e9e !important}.theme-nanotrasen.mode-light .color-red{color:#c82121 !important}.theme-nanotrasen.mode-light .color-orange{color:#e6630d !important}.theme-nanotrasen.mode-light .color-yellow{color:#ad9300 !important}.theme-nanotrasen.mode-light .color-olive{color:#7e8e12 !important}.theme-nanotrasen.mode-light .color-green{color:#1d9f3b !important}.theme-nanotrasen.mode-light .color-teal{color:#00a39c !important}.theme-nanotrasen.mode-light .color-blue{color:#1e78bb !important}.theme-nanotrasen.mode-light .color-violet{color:#5a30b5 !important}.theme-nanotrasen.mode-light .color-purple{color:#932eb4 !important}.theme-nanotrasen.mode-light .color-pink{color:#db228a !important}.theme-nanotrasen.mode-light .color-brown{color:#955d39 !important}.theme-nanotrasen.mode-light .color-grey{color:#6a6a6a !important}.theme-nanotrasen.mode-light .color-light-grey{color:#999 !important}.theme-nanotrasen.mode-light .color-good{color:#428515 !important}.theme-nanotrasen.mode-light .color-average{color:#a65f03 !important}.theme-nanotrasen.mode-light .color-bad{color:#971919 !important}.theme-nanotrasen.mode-light .color-label{color:#3b4b5f !important}.theme-nanotrasen.mode-light .color-bg-black{background-color:#404040 !important}.theme-nanotrasen.mode-light .color-bg-white{background-color:#c3c3c3 !important}.theme-nanotrasen.mode-light .color-bg-red{background-color:#e45e5e !important}.theme-nanotrasen.mode-light .color-bg-orange{background-color:#f59555 !important}.theme-nanotrasen.mode-light .color-bg-yellow{background-color:#ffdb11 !important}.theme-nanotrasen.mode-light .color-bg-olive{background-color:#cae322 !important}.theme-nanotrasen.mode-light .color-bg-green{background-color:#40dc65 !important}.theme-nanotrasen.mode-light .color-bg-teal{background-color:#08fff4 !important}.theme-nanotrasen.mode-light .color-bg-blue{background-color:#51a5e3 !important}.theme-nanotrasen.mode-light .color-bg-violet{background-color:#8b67d7 !important}.theme-nanotrasen.mode-light .color-bg-purple{background-color:#bb64d8 !important}.theme-nanotrasen.mode-light .color-bg-pink{background-color:#e86bb1 !important}.theme-nanotrasen.mode-light .color-bg-brown{background-color:#c58b66 !important}.theme-nanotrasen.mode-light .color-bg-grey{background-color:#989898 !important}.theme-nanotrasen.mode-light .color-bg-light-grey{background-color:#bfbfbf !important}.theme-nanotrasen.mode-light .color-bg-good{background-color:#6ddd23 !important}.theme-nanotrasen.mode-light .color-bg-average{background-color:#fb9511 !important}.theme-nanotrasen.mode-light .color-bg-bad{background-color:#dd3535 !important}.theme-nanotrasen.mode-light .color-bg-label{background-color:#627d9e !important}.theme-nanotrasen.mode-light .Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#e6e6e6;color:#000;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.theme-nanotrasen.mode-light .Divider--horizontal{margin:.5em 0}.theme-nanotrasen.mode-light .Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .Divider--vertical{height:100%;margin:0 .5em}.theme-nanotrasen.mode-light .Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .Divider--horizontal{margin:.5em 0}.theme-nanotrasen.mode-light .Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .Divider--vertical{height:100%;margin:0 .5em}.theme-nanotrasen.mode-light .Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .Stack--fill{height:100%}.theme-nanotrasen.mode-light .Stack--horizontal>.Stack__item{margin-left:.5em}.theme-nanotrasen.mode-light .Stack--horizontal>.Stack__item:first-child{margin-left:0}.theme-nanotrasen.mode-light .Stack--vertical>.Stack__item{margin-top:.5em}.theme-nanotrasen.mode-light .Stack--vertical>.Stack__item:first-child{margin-top:0}.theme-nanotrasen.mode-light .Stack--zebra>.Stack__item:nth-child(even){background-color:rgba(255,255,255,.33)}.theme-nanotrasen.mode-light .Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-nanotrasen.mode-light .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(255,255,255,.5);transition:border-color 900ms ease-out;align-items:center}.theme-nanotrasen.mode-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-nanotrasen.mode-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-nanotrasen.mode-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-nanotrasen.mode-light .ProgressBar--color--default{border:.0833333333em solid #fff}.theme-nanotrasen.mode-light .ProgressBar--color--default .ProgressBar__fill{background-color:#fff}.theme-nanotrasen.mode-light .ProgressBar--color--black{border-color:#404040 !important}.theme-nanotrasen.mode-light .ProgressBar--color--black .ProgressBar__fill{background-color:#404040}.theme-nanotrasen.mode-light .ProgressBar--color--white{border-color:#c3c3c3 !important}.theme-nanotrasen.mode-light .ProgressBar--color--white .ProgressBar__fill{background-color:#c3c3c3}.theme-nanotrasen.mode-light .ProgressBar--color--red{border-color:#e45e5e !important}.theme-nanotrasen.mode-light .ProgressBar--color--red .ProgressBar__fill{background-color:#e45e5e}.theme-nanotrasen.mode-light .ProgressBar--color--orange{border-color:#f59555 !important}.theme-nanotrasen.mode-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#f59555}.theme-nanotrasen.mode-light .ProgressBar--color--yellow{border-color:#ffdb11 !important}.theme-nanotrasen.mode-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#ffdb11}.theme-nanotrasen.mode-light .ProgressBar--color--olive{border-color:#cae322 !important}.theme-nanotrasen.mode-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#cae322}.theme-nanotrasen.mode-light .ProgressBar--color--green{border-color:#40dc65 !important}.theme-nanotrasen.mode-light .ProgressBar--color--green .ProgressBar__fill{background-color:#40dc65}.theme-nanotrasen.mode-light .ProgressBar--color--teal{border-color:#08fff4 !important}.theme-nanotrasen.mode-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#08fff4}.theme-nanotrasen.mode-light .ProgressBar--color--blue{border-color:#51a5e3 !important}.theme-nanotrasen.mode-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#51a5e3}.theme-nanotrasen.mode-light .ProgressBar--color--violet{border-color:#8b67d7 !important}.theme-nanotrasen.mode-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#8b67d7}.theme-nanotrasen.mode-light .ProgressBar--color--purple{border-color:#bb64d8 !important}.theme-nanotrasen.mode-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#bb64d8}.theme-nanotrasen.mode-light .ProgressBar--color--pink{border-color:#e86bb1 !important}.theme-nanotrasen.mode-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#e86bb1}.theme-nanotrasen.mode-light .ProgressBar--color--brown{border-color:#c58b66 !important}.theme-nanotrasen.mode-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#c58b66}.theme-nanotrasen.mode-light .ProgressBar--color--grey{border-color:#989898 !important}.theme-nanotrasen.mode-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#989898}.theme-nanotrasen.mode-light .ProgressBar--color--light-grey{border-color:#bfbfbf !important}.theme-nanotrasen.mode-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:#bfbfbf}.theme-nanotrasen.mode-light .ProgressBar--color--good{border-color:#6ddd23 !important}.theme-nanotrasen.mode-light .ProgressBar--color--good .ProgressBar__fill{background-color:#6ddd23}.theme-nanotrasen.mode-light .ProgressBar--color--average{border-color:#fb9511 !important}.theme-nanotrasen.mode-light .ProgressBar--color--average .ProgressBar__fill{background-color:#fb9511}.theme-nanotrasen.mode-light .ProgressBar--color--bad{border-color:#dd3535 !important}.theme-nanotrasen.mode-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#dd3535}.theme-nanotrasen.mode-light .ProgressBar--color--label{border-color:#627d9e !important}.theme-nanotrasen.mode-light .ProgressBar--color--label .ProgressBar__fill{background-color:#627d9e}.theme-nanotrasen.mode-light .Section{position:relative;margin-bottom:.5em;background-color:#e6e6e6;background-color:rgba(0,0,0,.1);box-sizing:border-box}.theme-nanotrasen.mode-light .Section:last-child{margin-bottom:0}.theme-nanotrasen.mode-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #ccc}.theme-nanotrasen.mode-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-nanotrasen.mode-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-nanotrasen.mode-light .Section__rest{position:relative}.theme-nanotrasen.mode-light .Section__content{padding:.66em .5em}.theme-nanotrasen.mode-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-nanotrasen.mode-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-nanotrasen.mode-light .Section--fill>.Section__rest{flex-grow:1}.theme-nanotrasen.mode-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-nanotrasen.mode-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-nanotrasen.mode-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-nanotrasen.mode-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-nanotrasen.mode-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-nanotrasen.mode-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-nanotrasen.mode-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-nanotrasen.mode-light .Section .Section:first-child{margin-top:-0.5em}.theme-nanotrasen.mode-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-nanotrasen.mode-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-nanotrasen.mode-light .SectionEx .Section__title{display:flex}.theme-nanotrasen.mode-light .SectionEx .Section__titleText{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:auto}.theme-nanotrasen.mode-light .SectionEx .Section__buttons{position:inherit;right:inherit;flex:none}.theme-nanotrasen.mode-light .SectionEx__capitalize .Section__titleText{text-transform:capitalize}.theme-nanotrasen.mode-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-nanotrasen.mode-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-nanotrasen.mode-light .Button .fa,.theme-nanotrasen.mode-light .Button .fa-solid,.theme-nanotrasen.mode-light .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-nanotrasen.mode-light .Button--hasContent .fa,.theme-nanotrasen.mode-light .Button--hasContent .fa-solid,.theme-nanotrasen.mode-light .Button--hasContent .fa-regular{margin-right:.25em}.theme-nanotrasen.mode-light .Button--hasContent.Button--iconPosition--right .fa,.theme-nanotrasen.mode-light .Button--hasContent.Button--iconPosition--right .fas,.theme-nanotrasen.mode-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-nanotrasen.mode-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-nanotrasen.mode-light .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-nanotrasen.mode-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-nanotrasen.mode-light .Button--circular{border-radius:50%}.theme-nanotrasen.mode-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-nanotrasen.mode-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#404040;color:#fff}.theme-nanotrasen.mode-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--black:hover,.theme-nanotrasen.mode-light .Button--color--black:focus{background-color:#5d5d5d;color:#fff}.theme-nanotrasen.mode-light .Button--color--black:active{background-color:#797979}.theme-nanotrasen.mode-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#c3c3c3;color:#000}.theme-nanotrasen.mode-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--white:hover,.theme-nanotrasen.mode-light .Button--color--white:focus{background-color:#f4f4f4;color:#000}.theme-nanotrasen.mode-light .Button--color--white:active{background-color:#f9f9f9}.theme-nanotrasen.mode-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#e45e5e;color:#fff}.theme-nanotrasen.mode-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--red:hover,.theme-nanotrasen.mode-light .Button--color--red:focus{background-color:#f1a8a8;color:#fff}.theme-nanotrasen.mode-light .Button--color--red:active{background-color:#fcefef}.theme-nanotrasen.mode-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#f59555;color:#000}.theme-nanotrasen.mode-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--orange:hover,.theme-nanotrasen.mode-light .Button--color--orange:focus{background-color:#fac9a8;color:#000}.theme-nanotrasen.mode-light .Button--color--orange:active{background-color:#fef5ee}.theme-nanotrasen.mode-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#ffdb11;color:#000}.theme-nanotrasen.mode-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--yellow:hover,.theme-nanotrasen.mode-light .Button--color--yellow:focus{background-color:#ffe760;color:#000}.theme-nanotrasen.mode-light .Button--color--yellow:active{background-color:#fff3ae}.theme-nanotrasen.mode-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#cae322;color:#000}.theme-nanotrasen.mode-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--olive:hover,.theme-nanotrasen.mode-light .Button--color--olive:focus{background-color:#dbec66;color:#000}.theme-nanotrasen.mode-light .Button--color--olive:active{background-color:#ebf5ac}.theme-nanotrasen.mode-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#40dc65;color:#000}.theme-nanotrasen.mode-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--green:hover,.theme-nanotrasen.mode-light .Button--color--green:focus{background-color:#84e99c;color:#000}.theme-nanotrasen.mode-light .Button--color--green:active{background-color:#c9f6d3}.theme-nanotrasen.mode-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#08fff4;color:#000}.theme-nanotrasen.mode-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--teal:hover,.theme-nanotrasen.mode-light .Button--color--teal:focus{background-color:#56fff8;color:#000}.theme-nanotrasen.mode-light .Button--color--teal:active{background-color:#a4fffb}.theme-nanotrasen.mode-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#51a5e3;color:#fff}.theme-nanotrasen.mode-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--blue:hover,.theme-nanotrasen.mode-light .Button--color--blue:focus{background-color:#9acbef;color:#fff}.theme-nanotrasen.mode-light .Button--color--blue:active{background-color:#e3f0fb}.theme-nanotrasen.mode-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#8b67d7;color:#fff}.theme-nanotrasen.mode-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--violet:hover,.theme-nanotrasen.mode-light .Button--color--violet:focus{background-color:#bface9;color:#fff}.theme-nanotrasen.mode-light .Button--color--violet:active{background-color:#f3effb}.theme-nanotrasen.mode-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#bb64d8;color:#fff}.theme-nanotrasen.mode-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--purple:hover,.theme-nanotrasen.mode-light .Button--color--purple:focus{background-color:#d9a9e9;color:#fff}.theme-nanotrasen.mode-light .Button--color--purple:active{background-color:#f7edfa}.theme-nanotrasen.mode-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#e86bb1;color:#fff}.theme-nanotrasen.mode-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--pink:hover,.theme-nanotrasen.mode-light .Button--color--pink:focus{background-color:#f4b7d9;color:#fff}.theme-nanotrasen.mode-light .Button--color--pink:active{background-color:#fdf0f7}.theme-nanotrasen.mode-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#c58b66;color:#fff}.theme-nanotrasen.mode-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--brown:hover,.theme-nanotrasen.mode-light .Button--color--brown:focus{background-color:#dbb9a2;color:#fff}.theme-nanotrasen.mode-light .Button--color--brown:active{background-color:#f3e6df}.theme-nanotrasen.mode-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#989898;color:#fff}.theme-nanotrasen.mode-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--grey:hover,.theme-nanotrasen.mode-light .Button--color--grey:focus{background-color:#c2c2c2;color:#fff}.theme-nanotrasen.mode-light .Button--color--grey:active{background-color:#ededed}.theme-nanotrasen.mode-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-nanotrasen.mode-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--light-grey:hover,.theme-nanotrasen.mode-light .Button--color--light-grey:focus{background-color:#efefef;color:#000}.theme-nanotrasen.mode-light .Button--color--light-grey:active{background-color:#f9f9f9}.theme-nanotrasen.mode-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#6ddd23;color:#000}.theme-nanotrasen.mode-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--good:hover,.theme-nanotrasen.mode-light .Button--color--good:focus{background-color:#99e765;color:#000}.theme-nanotrasen.mode-light .Button--color--good:active{background-color:#c5f1a8}.theme-nanotrasen.mode-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#fb9511;color:#000}.theme-nanotrasen.mode-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--average:hover,.theme-nanotrasen.mode-light .Button--color--average:focus{background-color:#fcb75e;color:#000}.theme-nanotrasen.mode-light .Button--color--average:active{background-color:#fedaab}.theme-nanotrasen.mode-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#dd3535;color:#fff}.theme-nanotrasen.mode-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--bad:hover,.theme-nanotrasen.mode-light .Button--color--bad:focus{background-color:#e97a7a;color:#fff}.theme-nanotrasen.mode-light .Button--color--bad:active{background-color:#f4bdbd}.theme-nanotrasen.mode-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#627d9e;color:#fff}.theme-nanotrasen.mode-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--label:hover,.theme-nanotrasen.mode-light .Button--color--label:focus{background-color:#91a4bb;color:#fff}.theme-nanotrasen.mode-light .Button--color--label:active{background-color:#c0cbd8}.theme-nanotrasen.mode-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#fff;color:#000}.theme-nanotrasen.mode-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--default:hover,.theme-nanotrasen.mode-light .Button--color--default:focus{background-color:#fff;color:#000}.theme-nanotrasen.mode-light .Button--color--default:active{background-color:#fff}.theme-nanotrasen.mode-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#b96817;color:#fff}.theme-nanotrasen.mode-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--caution:hover,.theme-nanotrasen.mode-light .Button--color--caution:focus{background-color:#df8b37;color:#fff}.theme-nanotrasen.mode-light .Button--color--caution:active{background-color:#e9ad71}.theme-nanotrasen.mode-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-nanotrasen.mode-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--danger:hover,.theme-nanotrasen.mode-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-nanotrasen.mode-light .Button--color--danger:active{background-color:#eef226}.theme-nanotrasen.mode-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#fff;color:#000;background-color:rgba(255,255,255,0);color:rgba(33,33,34,.75)}.theme-nanotrasen.mode-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--color--transparent:hover,.theme-nanotrasen.mode-light .Button--color--transparent:focus{background-color:#fff;color:#000}.theme-nanotrasen.mode-light .Button--color--transparent:active{background-color:#fff}.theme-nanotrasen.mode-light .Button--disabled{background-color:#777 !important}.theme-nanotrasen.mode-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#58c44a;color:#000}.theme-nanotrasen.mode-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-nanotrasen.mode-light .Button--selected:hover,.theme-nanotrasen.mode-light .Button--selected:focus{background-color:#8fd885;color:#000}.theme-nanotrasen.mode-light .Button--selected:active{background-color:#c6ebc1}.theme-nanotrasen.mode-light .Button--flex{display:inline-flex;flex-direction:column}.theme-nanotrasen.mode-light .Button--flex--fluid{width:100%}.theme-nanotrasen.mode-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-nanotrasen.mode-light .Button--verticalAlignContent--middle{justify-content:center}.theme-nanotrasen.mode-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-nanotrasen.mode-light .Button__content{display:block;align-self:stretch}.theme-nanotrasen.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-nanotrasen.mode-light .Input--fluid{display:block;width:auto}.theme-nanotrasen.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-nanotrasen.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-nanotrasen.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-nanotrasen.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-nanotrasen.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-nanotrasen.mode-light .Input--fluid{display:block;width:auto}.theme-nanotrasen.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-nanotrasen.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-nanotrasen.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-nanotrasen.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-nanotrasen.mode-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;background-color:#e6e6e6;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-nanotrasen.mode-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-nanotrasen.mode-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-nanotrasen.mode-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-nanotrasen.mode-light .Modal{background-color:#e6e6e6;max-width:calc(100% - 1rem);padding:1rem}.theme-nanotrasen.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-nanotrasen.mode-light .Input--fluid{display:block;width:auto}.theme-nanotrasen.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-nanotrasen.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-nanotrasen.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-nanotrasen.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-nanotrasen.mode-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#4171a8;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-nanotrasen.mode-light .NumberInput--fluid{display:block}.theme-nanotrasen.mode-light .NumberInput__content{margin-left:.5em}.theme-nanotrasen.mode-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-nanotrasen.mode-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #4171a8;background-color:#4171a8}.theme-nanotrasen.mode-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#e6e6e6;color:#000;text-align:right}.theme-nanotrasen.mode-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(255,255,255,.33)}.theme-nanotrasen.mode-light .Tabs--fill{height:100%}.theme-nanotrasen.mode-light .Section .Tabs{background-color:transparent}.theme-nanotrasen.mode-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-nanotrasen.mode-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-nanotrasen.mode-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-nanotrasen.mode-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-nanotrasen.mode-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-nanotrasen.mode-light .Tabs__Tab{flex-grow:0}.theme-nanotrasen.mode-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-nanotrasen.mode-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-nanotrasen.mode-light .Tab:not(.Tab--selected):hover{background-color:rgba(0,0,0,.075)}.theme-nanotrasen.mode-light .Tab--selected{background-color:rgba(0,0,0,.125);color:rgba(0,0,0,.9)}.theme-nanotrasen.mode-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-nanotrasen.mode-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-nanotrasen.mode-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #ededed}.theme-nanotrasen.mode-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #ededed}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--black{color:#404040}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--white{color:#b6b6b6}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#9e9e9e}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#9e9e9e}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--yellow{color:#ffd902}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#ad9300}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#ad9300}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--olive{color:#c3dc1c}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#7e8e12}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#7e8e12}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--grey{color:#8f8f8f}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#6a6a6a}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#6a6a6a}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--good{color:#68d221}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#428515}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#428515}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--average{color:#fa8e04}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#a65f03}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#a65f03}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--bad{color:#db2929}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#971919}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#971919}.theme-nanotrasen.mode-light .Tab--selected.Tab--color--label{color:#5d7696}.theme-nanotrasen.mode-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#3b4b5f}.theme-nanotrasen.mode-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#3b4b5f}.theme-nanotrasen.mode-light .Slider{cursor:e-resize}.theme-nanotrasen.mode-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-nanotrasen.mode-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-nanotrasen.mode-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-nanotrasen.mode-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#000;background-color:#fff;transform:translateX(50%);white-space:nowrap}.theme-nanotrasen.mode-light .BlockQuote{color:#3b4b5f;border-left:.1666666667em solid #3b4b5f;padding-left:.5em;margin-bottom:.5em}.theme-nanotrasen.mode-light .BlockQuote:last-child{margin-bottom:0}.theme-nanotrasen.mode-light .Layout,.theme-nanotrasen.mode-light .Layout *{scrollbar-base-color:#bfbfbf;scrollbar-face-color:#fff;scrollbar-3dlight-color:#fff;scrollbar-highlight-color:#fff;scrollbar-track-color:#bfbfbf;scrollbar-arrow-color:#fff;scrollbar-shadow-color:#fff}.theme-nanotrasen.mode-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-nanotrasen.mode-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-nanotrasen.mode-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#fff;background-image:linear-gradient(to bottom, white 0%, #f7f7f7 100%)}.theme-nanotrasen.mode-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-nanotrasen.mode-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-nanotrasen.mode-light .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-nanotrasen.mode-light .Window__contentPadding:after{height:0}.theme-nanotrasen.mode-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-nanotrasen.mode-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,.25);pointer-events:none}.theme-nanotrasen.mode-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-nanotrasen.mode-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-nanotrasen.mode-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-nanotrasen.mode-light .TitleBar{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-nanotrasen.mode-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#fff;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-nanotrasen.mode-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-nanotrasen.mode-light .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.9);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-nanotrasen.mode-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-nanotrasen.mode-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-nanotrasen.mode-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-nanotrasen.mode-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(73,148,23,.75);color:#fff;text-align:center}.theme-nanotrasen.mode-light .Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjA0Ij4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==)}
 .theme-ntos.mode-light .color-black{color:#000 !important}.theme-ntos.mode-light .color-white{color:#9e9e9e !important}.theme-ntos.mode-light .color-red{color:#c82121 !important}.theme-ntos.mode-light .color-orange{color:#e6630d !important}.theme-ntos.mode-light .color-yellow{color:#ad9300 !important}.theme-ntos.mode-light .color-olive{color:#7e8e12 !important}.theme-ntos.mode-light .color-green{color:#1d9f3b !important}.theme-ntos.mode-light .color-teal{color:#00a39c !important}.theme-ntos.mode-light .color-blue{color:#1e78bb !important}.theme-ntos.mode-light .color-violet{color:#5a30b5 !important}.theme-ntos.mode-light .color-purple{color:#932eb4 !important}.theme-ntos.mode-light .color-pink{color:#db228a !important}.theme-ntos.mode-light .color-brown{color:#955d39 !important}.theme-ntos.mode-light .color-grey{color:#6a6a6a !important}.theme-ntos.mode-light .color-light-grey{color:#999 !important}.theme-ntos.mode-light .color-good{color:#428515 !important}.theme-ntos.mode-light .color-average{color:#a65f03 !important}.theme-ntos.mode-light .color-bad{color:#971919 !important}.theme-ntos.mode-light .color-label{color:#3b4b5f !important}.theme-ntos.mode-light .color-bg-black{background-color:#404040 !important}.theme-ntos.mode-light .color-bg-white{background-color:#c3c3c3 !important}.theme-ntos.mode-light .color-bg-red{background-color:#e45e5e !important}.theme-ntos.mode-light .color-bg-orange{background-color:#f59555 !important}.theme-ntos.mode-light .color-bg-yellow{background-color:#ffdb11 !important}.theme-ntos.mode-light .color-bg-olive{background-color:#cae322 !important}.theme-ntos.mode-light .color-bg-green{background-color:#40dc65 !important}.theme-ntos.mode-light .color-bg-teal{background-color:#08fff4 !important}.theme-ntos.mode-light .color-bg-blue{background-color:#51a5e3 !important}.theme-ntos.mode-light .color-bg-violet{background-color:#8b67d7 !important}.theme-ntos.mode-light .color-bg-purple{background-color:#bb64d8 !important}.theme-ntos.mode-light .color-bg-pink{background-color:#e86bb1 !important}.theme-ntos.mode-light .color-bg-brown{background-color:#c58b66 !important}.theme-ntos.mode-light .color-bg-grey{background-color:#989898 !important}.theme-ntos.mode-light .color-bg-light-grey{background-color:#bfbfbf !important}.theme-ntos.mode-light .color-bg-good{background-color:#6ddd23 !important}.theme-ntos.mode-light .color-bg-average{background-color:#fb9511 !important}.theme-ntos.mode-light .color-bg-bad{background-color:#dd3535 !important}.theme-ntos.mode-light .color-bg-label{background-color:#627d9e !important}.theme-ntos.mode-light .Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#d9eaff;color:#000;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.theme-ntos.mode-light .Divider--horizontal{margin:.5em 0}.theme-ntos.mode-light .Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .Divider--vertical{height:100%;margin:0 .5em}.theme-ntos.mode-light .Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .Divider--horizontal{margin:.5em 0}.theme-ntos.mode-light .Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .Divider--vertical{height:100%;margin:0 .5em}.theme-ntos.mode-light .Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .Stack--fill{height:100%}.theme-ntos.mode-light .Stack--horizontal>.Stack__item{margin-left:.5em}.theme-ntos.mode-light .Stack--horizontal>.Stack__item:first-child{margin-left:0}.theme-ntos.mode-light .Stack--vertical>.Stack__item{margin-top:.5em}.theme-ntos.mode-light .Stack--vertical>.Stack__item:first-child{margin-top:0}.theme-ntos.mode-light .Stack--zebra>.Stack__item:nth-child(even){background-color:rgba(217,234,255,.33)}.theme-ntos.mode-light .Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(0,0,0,.1)}.theme-ntos.mode-light .ProgressBar{display:flex;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(255,255,255,.5);transition:border-color 900ms ease-out;align-items:center}.theme-ntos.mode-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-ntos.mode-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-ntos.mode-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-ntos.mode-light .ProgressBar--color--default{border:.0833333333em solid #d9eaff}.theme-ntos.mode-light .ProgressBar--color--default .ProgressBar__fill{background-color:#d9eaff}.theme-ntos.mode-light .ProgressBar--color--black{border-color:#404040 !important}.theme-ntos.mode-light .ProgressBar--color--black .ProgressBar__fill{background-color:#404040}.theme-ntos.mode-light .ProgressBar--color--white{border-color:#c3c3c3 !important}.theme-ntos.mode-light .ProgressBar--color--white .ProgressBar__fill{background-color:#c3c3c3}.theme-ntos.mode-light .ProgressBar--color--red{border-color:#e45e5e !important}.theme-ntos.mode-light .ProgressBar--color--red .ProgressBar__fill{background-color:#e45e5e}.theme-ntos.mode-light .ProgressBar--color--orange{border-color:#f59555 !important}.theme-ntos.mode-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#f59555}.theme-ntos.mode-light .ProgressBar--color--yellow{border-color:#ffdb11 !important}.theme-ntos.mode-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#ffdb11}.theme-ntos.mode-light .ProgressBar--color--olive{border-color:#cae322 !important}.theme-ntos.mode-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#cae322}.theme-ntos.mode-light .ProgressBar--color--green{border-color:#40dc65 !important}.theme-ntos.mode-light .ProgressBar--color--green .ProgressBar__fill{background-color:#40dc65}.theme-ntos.mode-light .ProgressBar--color--teal{border-color:#08fff4 !important}.theme-ntos.mode-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#08fff4}.theme-ntos.mode-light .ProgressBar--color--blue{border-color:#51a5e3 !important}.theme-ntos.mode-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#51a5e3}.theme-ntos.mode-light .ProgressBar--color--violet{border-color:#8b67d7 !important}.theme-ntos.mode-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#8b67d7}.theme-ntos.mode-light .ProgressBar--color--purple{border-color:#bb64d8 !important}.theme-ntos.mode-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#bb64d8}.theme-ntos.mode-light .ProgressBar--color--pink{border-color:#e86bb1 !important}.theme-ntos.mode-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#e86bb1}.theme-ntos.mode-light .ProgressBar--color--brown{border-color:#c58b66 !important}.theme-ntos.mode-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#c58b66}.theme-ntos.mode-light .ProgressBar--color--grey{border-color:#989898 !important}.theme-ntos.mode-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#989898}.theme-ntos.mode-light .ProgressBar--color--light-grey{border-color:#bfbfbf !important}.theme-ntos.mode-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:#bfbfbf}.theme-ntos.mode-light .ProgressBar--color--good{border-color:#6ddd23 !important}.theme-ntos.mode-light .ProgressBar--color--good .ProgressBar__fill{background-color:#6ddd23}.theme-ntos.mode-light .ProgressBar--color--average{border-color:#fb9511 !important}.theme-ntos.mode-light .ProgressBar--color--average .ProgressBar__fill{background-color:#fb9511}.theme-ntos.mode-light .ProgressBar--color--bad{border-color:#dd3535 !important}.theme-ntos.mode-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#dd3535}.theme-ntos.mode-light .ProgressBar--color--label{border-color:#627d9e !important}.theme-ntos.mode-light .ProgressBar--color--label .ProgressBar__fill{background-color:#627d9e}.theme-ntos.mode-light .Section{position:relative;margin-bottom:.5em;background-color:#c3d3e6;background-color:rgba(0,0,0,.1);box-sizing:border-box}.theme-ntos.mode-light .Section:last-child{margin-bottom:0}.theme-ntos.mode-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #7bb6ff}.theme-ntos.mode-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-ntos.mode-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-ntos.mode-light .Section__rest{position:relative}.theme-ntos.mode-light .Section__content{padding:.66em .5em}.theme-ntos.mode-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-ntos.mode-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-ntos.mode-light .Section--fill>.Section__rest{flex-grow:1}.theme-ntos.mode-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-ntos.mode-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-ntos.mode-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-ntos.mode-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-ntos.mode-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-ntos.mode-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-ntos.mode-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-ntos.mode-light .Section .Section:first-child{margin-top:-0.5em}.theme-ntos.mode-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-ntos.mode-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-ntos.mode-light .SectionEx .Section__title{display:flex}.theme-ntos.mode-light .SectionEx .Section__titleText{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:auto}.theme-ntos.mode-light .SectionEx .Section__buttons{position:inherit;right:inherit;flex:none}.theme-ntos.mode-light .SectionEx__capitalize .Section__titleText{text-transform:capitalize}.theme-ntos.mode-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-ntos.mode-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-ntos.mode-light .Button .fa,.theme-ntos.mode-light .Button .fa-solid,.theme-ntos.mode-light .Button .fa-regular{margin-left:0;margin-right:0;min-width:1.333em;text-align:center}.theme-ntos.mode-light .Button--hasContent .fa,.theme-ntos.mode-light .Button--hasContent .fa-solid,.theme-ntos.mode-light .Button--hasContent .fa-regular{margin-right:.25em}.theme-ntos.mode-light .Button--hasContent.Button--iconPosition--right .fa,.theme-ntos.mode-light .Button--hasContent.Button--iconPosition--right .fas,.theme-ntos.mode-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-ntos.mode-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos.mode-light .Button--ellipsis .Button__content{overflow:hidden;text-overflow:ellipsis}.theme-ntos.mode-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos.mode-light .Button--circular{border-radius:50%}.theme-ntos.mode-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-ntos.mode-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#404040;color:#fff}.theme-ntos.mode-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--black:hover,.theme-ntos.mode-light .Button--color--black:focus{background-color:#5d5d5d;color:#fff}.theme-ntos.mode-light .Button--color--black:active{background-color:#797979}.theme-ntos.mode-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#c3c3c3;color:#000}.theme-ntos.mode-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--white:hover,.theme-ntos.mode-light .Button--color--white:focus{background-color:#f4f4f4;color:#000}.theme-ntos.mode-light .Button--color--white:active{background-color:#f9f9f9}.theme-ntos.mode-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#e45e5e;color:#fff}.theme-ntos.mode-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--red:hover,.theme-ntos.mode-light .Button--color--red:focus{background-color:#f1a8a8;color:#fff}.theme-ntos.mode-light .Button--color--red:active{background-color:#fcefef}.theme-ntos.mode-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#f59555;color:#000}.theme-ntos.mode-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--orange:hover,.theme-ntos.mode-light .Button--color--orange:focus{background-color:#fac9a8;color:#000}.theme-ntos.mode-light .Button--color--orange:active{background-color:#fef5ee}.theme-ntos.mode-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#ffdb11;color:#000}.theme-ntos.mode-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--yellow:hover,.theme-ntos.mode-light .Button--color--yellow:focus{background-color:#ffe760;color:#000}.theme-ntos.mode-light .Button--color--yellow:active{background-color:#fff3ae}.theme-ntos.mode-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#cae322;color:#000}.theme-ntos.mode-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--olive:hover,.theme-ntos.mode-light .Button--color--olive:focus{background-color:#dbec66;color:#000}.theme-ntos.mode-light .Button--color--olive:active{background-color:#ebf5ac}.theme-ntos.mode-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#40dc65;color:#000}.theme-ntos.mode-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--green:hover,.theme-ntos.mode-light .Button--color--green:focus{background-color:#84e99c;color:#000}.theme-ntos.mode-light .Button--color--green:active{background-color:#c9f6d3}.theme-ntos.mode-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#08fff4;color:#000}.theme-ntos.mode-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--teal:hover,.theme-ntos.mode-light .Button--color--teal:focus{background-color:#56fff8;color:#000}.theme-ntos.mode-light .Button--color--teal:active{background-color:#a4fffb}.theme-ntos.mode-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#51a5e3;color:#fff}.theme-ntos.mode-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--blue:hover,.theme-ntos.mode-light .Button--color--blue:focus{background-color:#9acbef;color:#fff}.theme-ntos.mode-light .Button--color--blue:active{background-color:#e3f0fb}.theme-ntos.mode-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#8b67d7;color:#fff}.theme-ntos.mode-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--violet:hover,.theme-ntos.mode-light .Button--color--violet:focus{background-color:#bface9;color:#fff}.theme-ntos.mode-light .Button--color--violet:active{background-color:#f3effb}.theme-ntos.mode-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#bb64d8;color:#fff}.theme-ntos.mode-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--purple:hover,.theme-ntos.mode-light .Button--color--purple:focus{background-color:#d9a9e9;color:#fff}.theme-ntos.mode-light .Button--color--purple:active{background-color:#f7edfa}.theme-ntos.mode-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#e86bb1;color:#fff}.theme-ntos.mode-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--pink:hover,.theme-ntos.mode-light .Button--color--pink:focus{background-color:#f4b7d9;color:#fff}.theme-ntos.mode-light .Button--color--pink:active{background-color:#fdf0f7}.theme-ntos.mode-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#c58b66;color:#fff}.theme-ntos.mode-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--brown:hover,.theme-ntos.mode-light .Button--color--brown:focus{background-color:#dbb9a2;color:#fff}.theme-ntos.mode-light .Button--color--brown:active{background-color:#f3e6df}.theme-ntos.mode-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#989898;color:#fff}.theme-ntos.mode-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--grey:hover,.theme-ntos.mode-light .Button--color--grey:focus{background-color:#c2c2c2;color:#fff}.theme-ntos.mode-light .Button--color--grey:active{background-color:#ededed}.theme-ntos.mode-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-ntos.mode-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--light-grey:hover,.theme-ntos.mode-light .Button--color--light-grey:focus{background-color:#efefef;color:#000}.theme-ntos.mode-light .Button--color--light-grey:active{background-color:#f9f9f9}.theme-ntos.mode-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#6ddd23;color:#000}.theme-ntos.mode-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--good:hover,.theme-ntos.mode-light .Button--color--good:focus{background-color:#99e765;color:#000}.theme-ntos.mode-light .Button--color--good:active{background-color:#c5f1a8}.theme-ntos.mode-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#fb9511;color:#000}.theme-ntos.mode-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--average:hover,.theme-ntos.mode-light .Button--color--average:focus{background-color:#fcb75e;color:#000}.theme-ntos.mode-light .Button--color--average:active{background-color:#fedaab}.theme-ntos.mode-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#dd3535;color:#fff}.theme-ntos.mode-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--bad:hover,.theme-ntos.mode-light .Button--color--bad:focus{background-color:#e97a7a;color:#fff}.theme-ntos.mode-light .Button--color--bad:active{background-color:#f4bdbd}.theme-ntos.mode-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#627d9e;color:#fff}.theme-ntos.mode-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--label:hover,.theme-ntos.mode-light .Button--color--label:focus{background-color:#91a4bb;color:#fff}.theme-ntos.mode-light .Button--color--label:active{background-color:#c0cbd8}.theme-ntos.mode-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#d9eaff;color:#000}.theme-ntos.mode-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--default:hover,.theme-ntos.mode-light .Button--color--default:focus{background-color:#f8fbff;color:#000}.theme-ntos.mode-light .Button--color--default:active{background-color:#fbfdff}.theme-ntos.mode-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#b96817;color:#fff}.theme-ntos.mode-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--caution:hover,.theme-ntos.mode-light .Button--color--caution:focus{background-color:#df8b37;color:#fff}.theme-ntos.mode-light .Button--color--caution:active{background-color:#e9ad71}.theme-ntos.mode-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-ntos.mode-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--danger:hover,.theme-ntos.mode-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-ntos.mode-light .Button--color--danger:active{background-color:#eef226}.theme-ntos.mode-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#d9eaff;color:#000;background-color:rgba(217,234,255,0);color:rgba(33,33,34,.75)}.theme-ntos.mode-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--color--transparent:hover,.theme-ntos.mode-light .Button--color--transparent:focus{background-color:#f8fbff;color:#000}.theme-ntos.mode-light .Button--color--transparent:active{background-color:#fbfdff}.theme-ntos.mode-light .Button--disabled{background-color:#777 !important}.theme-ntos.mode-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#58c44a;color:#000}.theme-ntos.mode-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-ntos.mode-light .Button--selected:hover,.theme-ntos.mode-light .Button--selected:focus{background-color:#8fd885;color:#000}.theme-ntos.mode-light .Button--selected:active{background-color:#c6ebc1}.theme-ntos.mode-light .Button--flex{display:inline-flex;flex-direction:column}.theme-ntos.mode-light .Button--flex--fluid{width:100%}.theme-ntos.mode-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-ntos.mode-light .Button--verticalAlignContent--middle{justify-content:center}.theme-ntos.mode-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-ntos.mode-light .Button__content{display:block;align-self:stretch}.theme-ntos.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#d9eaff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-ntos.mode-light .Input--fluid{display:block;width:auto}.theme-ntos.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-ntos.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-ntos.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-ntos.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#d9eaff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-ntos.mode-light .Input--fluid{display:block;width:auto}.theme-ntos.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-ntos.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-ntos.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-ntos.mode-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;background-color:#d9eaff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-ntos.mode-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-ntos.mode-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-ntos.mode-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos.mode-light .Modal{background-color:#d9eaff;max-width:calc(100% - 1rem);padding:1rem}.theme-ntos.mode-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#000;background-color:#d9eaff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-ntos.mode-light .Input--fluid{display:block;width:auto}.theme-ntos.mode-light .Input__baseline{display:inline-block;color:transparent}.theme-ntos.mode-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-ntos.mode-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos.mode-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-ntos.mode-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #4171a8;border:.0833333333em solid rgba(65,113,168,.75);border-radius:.16em;color:#4171a8;background-color:#d9eaff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-ntos.mode-light .NumberInput--fluid{display:block}.theme-ntos.mode-light .NumberInput__content{margin-left:.5em}.theme-ntos.mode-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-ntos.mode-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #4171a8;background-color:#4171a8}.theme-ntos.mode-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#d9eaff;color:#000;text-align:right}.theme-ntos.mode-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(217,234,255,.33)}.theme-ntos.mode-light .Tabs--fill{height:100%}.theme-ntos.mode-light .Section .Tabs{background-color:transparent}.theme-ntos.mode-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-ntos.mode-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-ntos.mode-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-ntos.mode-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-ntos.mode-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-ntos.mode-light .Tabs__Tab{flex-grow:0}.theme-ntos.mode-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-ntos.mode-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-ntos.mode-light .Tab:not(.Tab--selected):hover{background-color:rgba(0,0,0,.075)}.theme-ntos.mode-light .Tab--selected{background-color:rgba(0,0,0,.125);color:rgba(0,0,0,.9)}.theme-ntos.mode-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-ntos.mode-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-ntos.mode-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-ntos.mode-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4e7ff}.theme-ntos.mode-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-ntos.mode-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4e7ff}.theme-ntos.mode-light .Tab--selected.Tab--color--black{color:#404040}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-ntos.mode-light .Tab--selected.Tab--color--white{color:#b6b6b6}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#9e9e9e}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#9e9e9e}.theme-ntos.mode-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-ntos.mode-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-ntos.mode-light .Tab--selected.Tab--color--yellow{color:#ffd902}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#ad9300}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#ad9300}.theme-ntos.mode-light .Tab--selected.Tab--color--olive{color:#c3dc1c}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#7e8e12}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#7e8e12}.theme-ntos.mode-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-ntos.mode-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-ntos.mode-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-ntos.mode-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-ntos.mode-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-ntos.mode-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-ntos.mode-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-ntos.mode-light .Tab--selected.Tab--color--grey{color:#8f8f8f}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#6a6a6a}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#6a6a6a}.theme-ntos.mode-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-ntos.mode-light .Tab--selected.Tab--color--good{color:#68d221}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#428515}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#428515}.theme-ntos.mode-light .Tab--selected.Tab--color--average{color:#fa8e04}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#a65f03}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#a65f03}.theme-ntos.mode-light .Tab--selected.Tab--color--bad{color:#db2929}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#971919}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#971919}.theme-ntos.mode-light .Tab--selected.Tab--color--label{color:#5d7696}.theme-ntos.mode-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#3b4b5f}.theme-ntos.mode-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#3b4b5f}.theme-ntos.mode-light .Slider{cursor:e-resize}.theme-ntos.mode-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-ntos.mode-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-ntos.mode-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-ntos.mode-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#000;background-color:#fff;transform:translateX(50%);white-space:nowrap}.theme-ntos.mode-light .BlockQuote{color:#3b4b5f;border-left:.1666666667em solid #3b4b5f;padding-left:.5em;margin-bottom:.5em}.theme-ntos.mode-light .BlockQuote:last-child{margin-bottom:0}.theme-ntos.mode-light .Layout,.theme-ntos.mode-light .Layout *{scrollbar-base-color:#63a9ff;scrollbar-face-color:#ddecff;scrollbar-3dlight-color:#d9eaff;scrollbar-highlight-color:#d9eaff;scrollbar-track-color:#63a9ff;scrollbar-arrow-color:#ecf5ff;scrollbar-shadow-color:#ddecff}.theme-ntos.mode-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-ntos.mode-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-ntos.mode-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#d9eaff;background-image:linear-gradient(to bottom, #e8f2ff 0%, #cae2ff 100%)}.theme-ntos.mode-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-ntos.mode-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-ntos.mode-light .Window__contentPadding{margin:.5rem;height:calc(100% - 1.01rem)}.theme-ntos.mode-light .Window__contentPadding:after{height:0}.theme-ntos.mode-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-ntos.mode-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(248,251,255,.25);pointer-events:none}.theme-ntos.mode-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-ntos.mode-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-ntos.mode-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-ntos.mode-light .TitleBar{background-color:#d9eaff;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos.mode-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#d9eaff;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-ntos.mode-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos.mode-light .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.9);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-ntos.mode-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-ntos.mode-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-ntos.mode-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-ntos.mode-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(73,148,23,.75);color:#fff;text-align:center}.theme-ntos.mode-light .Layout__content{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjA0Ij4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==)}
diff --git a/browserassets/tgui/tgui.bundle.js b/browserassets/tgui/tgui.bundle.js
index 3112a037eed26..c5c6d4c3c7d1a 100644
--- a/browserassets/tgui/tgui.bundle.js
+++ b/browserassets/tgui/tgui.bundle.js
@@ -1 +1 @@
-!function(){var e={92179:function(e,t,n){"use strict";t.__esModule=!0,t.popperGenerator=h,t.createPopper=void 0;var o=p(n(30505)),r=p(n(43545)),a=p(n(46213)),i=p(n(32440)),c=(p(n(61131)),p(n(45700))),l=p(n(68369)),u=(p(n(38574)),p(n(25435)),p(n(22709)),p(n(36284))),d=p(n(19574));t.detectOverflow=d["default"];var s=n(67458);n(56728);function p(e){return e&&e.__esModule?e:{"default":e}}var m={placement:"bottom",modifiers:[],strategy:"absolute"};function f(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function h(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,d=void 0===n?[]:n,p=t.defaultOptions,h=void 0===p?m:p;return function(e,t,n){void 0===n&&(n=h);var p={placement:"bottom",orderedModifiers:[],options:Object.assign({},m,h),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},g=[],C=!1,N={state:p,setOptions:function(n){v(),p.options=Object.assign({},h,p.options,n),p.scrollParents={reference:(0,s.isElement)(e)?(0,a["default"])(e):e.contextElement?(0,a["default"])(e.contextElement):[],popper:(0,a["default"])(t)};var o=(0,c["default"])((0,u["default"])([].concat(d,p.options.modifiers)));return p.orderedModifiers=o.filter((function(e){return e.enabled})),p.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,o=void 0===n?{}:n,r=e.effect;if("function"==typeof r){var a=r({state:p,name:t,instance:N,options:o}),i=function(){function e(){}return e}();g.push(a||i)}})),N.update()},forceUpdate:function(){if(!C){var e=p.elements,t=e.reference,n=e.popper;if(f(t,n)){p.rects={reference:(0,o["default"])(t,(0,i["default"])(n),"fixed"===p.options.strategy),popper:(0,r["default"])(n)},p.reset=!1,p.placement=p.options.placement,p.orderedModifiers.forEach((function(e){return p.modifiersData[e.name]=Object.assign({},e.data)}));for(var a=0;a<p.orderedModifiers.length;a++)if(!0!==p.reset){var c=p.orderedModifiers[a],l=c.fn,u=c.options,d=void 0===u?{}:u,s=c.name;"function"==typeof l&&(p=l({state:p,options:d,name:s,instance:N})||p)}else p.reset=!1,a=-1}}},update:(0,l["default"])((function(){return new Promise((function(e){N.forceUpdate(),e(p)}))})),destroy:function(){v(),C=!0}};if(!f(e,t))return N;function v(){g.forEach((function(e){return e()})),g=[]}return N.setOptions(n).then((function(e){!C&&n.onFirstUpdate&&n.onFirstUpdate(e)})),N}}var g=h();t.createPopper=g},97607:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&(0,o.isShadowRoot)(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1};var o=n(67458)},94294:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),a=1,i=1;(0,o.isHTMLElement)(e)&&t&&(a=n.width/e.offsetWidth||1,i=n.height/e.offsetHeight||1);return{width:r(n.width/a),height:r(n.height/i),top:r(n.top/i),right:r(n.right/a),bottom:r(n.bottom/i),left:r(n.left/a),x:r(n.left/a),y:r(n.top/i)}};var o=n(67458),r=Math.round},48162:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){var o="clippingParents"===t?function(e){var t=(0,i["default"])((0,p["default"])(e)),n=["absolute","fixed"].indexOf((0,u["default"])(e).position)>=0,o=n&&(0,d.isHTMLElement)(e)?(0,c["default"])(e):e;if(!(0,d.isElement)(o))return[];return t.filter((function(e){return(0,d.isElement)(e)&&(0,m["default"])(e,o)&&"body"!==(0,f["default"])(e)}))}(e):[].concat(t),r=[].concat(o,[n]),a=r[0],l=r.reduce((function(t,n){var o=N(e,n);return t.top=(0,g.max)(o.top,t.top),t.right=(0,g.min)(o.right,t.right),t.bottom=(0,g.min)(o.bottom,t.bottom),t.left=(0,g.max)(o.left,t.left),t}),N(e,a));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l};var o=n(56728),r=C(n(78331)),a=C(n(68692)),i=C(n(46213)),c=C(n(32440)),l=C(n(58386)),u=C(n(61131)),d=n(67458),s=C(n(94294)),p=C(n(31613)),m=C(n(97607)),f=C(n(99624)),h=C(n(20935)),g=n(62836);function C(e){return e&&e.__esModule?e:{"default":e}}function N(e,t){return t===o.viewport?(0,h["default"])((0,r["default"])(e)):(0,d.isHTMLElement)(t)?function(e){var t=(0,s["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,h["default"])((0,a["default"])((0,l["default"])(e)))}},30505:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var d=(0,i.isHTMLElement)(t),s=(0,i.isHTMLElement)(t)&&function(e){var t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,o=t.height/e.offsetHeight||1;return 1!==n||1!==o}(t),p=(0,l["default"])(t),m=(0,o["default"])(e,s),f={scrollLeft:0,scrollTop:0},h={x:0,y:0};(d||!d&&!n)&&(("body"!==(0,a["default"])(t)||(0,u["default"])(p))&&(f=(0,r["default"])(t)),(0,i.isHTMLElement)(t)?((h=(0,o["default"])(t,!0)).x+=t.clientLeft,h.y+=t.clientTop):p&&(h.x=(0,c["default"])(p)));return{x:m.left+f.scrollLeft-h.x,y:m.top+f.scrollTop-h.y,width:m.width,height:m.height}};var o=d(n(94294)),r=d(n(71942)),a=d(n(99624)),i=n(67458),c=d(n(45471)),l=d(n(58386)),u=d(n(37229));function d(e){return e&&e.__esModule?e:{"default":e}}},61131:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])(e).getComputedStyle(e)};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},58386:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,o.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var o=n(67458)},68692:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,o["default"])(e),l=(0,i["default"])(e),u=null==(t=e.ownerDocument)?void 0:t.body,d=(0,c.max)(n.scrollWidth,n.clientWidth,u?u.scrollWidth:0,u?u.clientWidth:0),s=(0,c.max)(n.scrollHeight,n.clientHeight,u?u.scrollHeight:0,u?u.clientHeight:0),p=-l.scrollLeft+(0,a["default"])(e),m=-l.scrollTop;"rtl"===(0,r["default"])(u||n).direction&&(p+=(0,c.max)(n.clientWidth,u?u.clientWidth:0)-d);return{width:d,height:s,x:p,y:m}};var o=l(n(58386)),r=l(n(61131)),a=l(n(45471)),i=l(n(1255)),c=n(62836);function l(e){return e&&e.__esModule?e:{"default":e}}},50552:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},43545:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=e.offsetWidth,o=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-o)<=1&&(o=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}};var o,r=(o=n(94294))&&o.__esModule?o:{"default":o}},99624:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},71942:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,r["default"])(e)&&(0,a.isHTMLElement)(e)?(0,i["default"])(e):(0,o["default"])(e)};var o=c(n(1255)),r=c(n(31677)),a=n(67458),i=c(n(50552));function c(e){return e&&e.__esModule?e:{"default":e}}},32440:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=d(e);for(;n&&(0,c["default"])(n)&&"static"===(0,a["default"])(n).position;)n=d(n);if(n&&("html"===(0,r["default"])(n)||"body"===(0,r["default"])(n)&&"static"===(0,a["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,i.isHTMLElement)(e)){if("fixed"===(0,a["default"])(e).position)return null}var n=(0,l["default"])(e);for(;(0,i.isHTMLElement)(n)&&["html","body"].indexOf((0,r["default"])(n))<0;){var o=(0,a["default"])(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t};var o=u(n(31677)),r=u(n(99624)),a=u(n(61131)),i=n(67458),c=u(n(79130)),l=u(n(31613));function u(e){return e&&e.__esModule?e:{"default":e}}function d(e){return(0,i.isHTMLElement)(e)&&"fixed"!==(0,a["default"])(e).position?e.offsetParent:null}},31613:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,o["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,a.isShadowRoot)(e)?e.host:null)||(0,r["default"])(e)};var o=i(n(99624)),r=i(n(58386)),a=n(67458);function i(e){return e&&e.__esModule?e:{"default":e}}},66055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e){if(["html","body","#document"].indexOf((0,a["default"])(e))>=0)return e.ownerDocument.body;if((0,i.isHTMLElement)(e)&&(0,r["default"])(e))return e;return l((0,o["default"])(e))};var o=c(n(31613)),r=c(n(37229)),a=c(n(99624)),i=n(67458);function c(e){return e&&e.__esModule?e:{"default":e}}},78331:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=(0,r["default"])(e),i=t.visualViewport,c=n.clientWidth,l=n.clientHeight,u=0,d=0;i&&(c=i.width,l=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(u=i.offsetLeft,d=i.offsetTop));return{width:c,height:l,x:u+(0,a["default"])(e),y:d}};var o=i(n(31677)),r=i(n(58386)),a=i(n(45471));function i(e){return e&&e.__esModule?e:{"default":e}}},31677:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},1255:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.pageXOffset,o=t.pageYOffset;return{scrollLeft:n,scrollTop:o}};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},45471:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])((0,r["default"])(e)).left+(0,a["default"])(e).scrollLeft};var o=i(n(94294)),r=i(n(58386)),a=i(n(1255));function i(e){return e&&e.__esModule?e:{"default":e}}},67458:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,r["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,r["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,r["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},37229:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.overflow,o=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+o)};var o,r=(o=n(61131))&&o.__esModule?o:{"default":o}},79130:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,r["default"])(e))>=0};var o,r=(o=n(99624))&&o.__esModule?o:{"default":o}},46213:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e,t){var n;void 0===t&&(t=[]);var c=(0,o["default"])(e),u=c===(null==(n=e.ownerDocument)?void 0:n.body),d=(0,a["default"])(c),s=u?[d].concat(d.visualViewport||[],(0,i["default"])(c)?c:[]):c,p=t.concat(s);return u?p:p.concat(l((0,r["default"])(s)))};var o=c(n(66055)),r=c(n(31613)),a=c(n(31677)),i=c(n(37229));function c(e){return e&&e.__esModule?e:{"default":e}}},56728:function(e,t){"use strict";t.__esModule=!0,t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0;t.top="top";var n="bottom";t.bottom=n;var o="right";t.right=o;var r="left";t.left=r;var a="auto";t.auto=a;var i=["top",n,o,r];t.basePlacements=i;var c="start";t.start=c;var l="end";t.end=l;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var u=i.reduce((function(e,t){return e.concat([t+"-"+c,t+"-"+l])}),[]);t.variationPlacements=u;var d=[].concat(i,[a]).reduce((function(e,t){return e.concat([t,t+"-"+c,t+"-"+l])}),[]);t.placements=d;var s="beforeRead";t.beforeRead=s;var p="read";t.read=p;var m="afterRead";t.afterRead=m;var f="beforeMain";t.beforeMain=f;var h="main";t.main=h;var g="afterMain";t.afterMain=g;var C="beforeWrite";t.beforeWrite=C;var N="write";t.write=N;var v="afterWrite";t.afterWrite=v;var b=[s,p,m,f,h,g,C,N,v];t.modifierPhases=b},34739:function(e,t,n){"use strict";t.__esModule=!0;var o={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.createPopperLite=t.createPopper=t.createPopperBase=t.detectOverflow=t.popperGenerator=void 0;var r=n(56728);Object.keys(r).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===r[e]||(t[e]=r[e]))}));var a=n(18726);Object.keys(a).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===a[e]||(t[e]=a[e]))}));var i=n(92179);t.popperGenerator=i.popperGenerator,t.detectOverflow=i.detectOverflow,t.createPopperBase=i.createPopper;var c=n(48069);t.createPopper=c.createPopper;var l=n(39030);t.createPopperLite=l.createPopper},34559:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(99624))&&o.__esModule?o:{"default":o},a=n(67458);var i={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},i=t.elements[e];(0,a.isHTMLElement)(i)&&(0,r["default"])(i)&&(Object.assign(i.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],i=t.attributes[e]||{},c=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,a.isHTMLElement)(o)&&(0,r["default"])(o)&&(Object.assign(o.style,c),Object.keys(i).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=i},76340:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=p(n(22709)),r=p(n(43545)),a=p(n(97607)),i=p(n(32440)),c=p(n(16615)),l=p(n(52534)),u=p(n(32055)),d=p(n(76294)),s=n(56728);n(67458);function p(e){return e&&e.__esModule?e:{"default":e}}var m=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,u["default"])("number"!=typeof e?e:(0,d["default"])(e,s.basePlacements))};var f={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,a=e.name,u=e.options,d=n.elements.arrow,p=n.modifiersData.popperOffsets,f=(0,o["default"])(n.placement),h=(0,c["default"])(f),g=[s.left,s.right].indexOf(f)>=0?"height":"width";if(d&&p){var C=m(u.padding,n),N=(0,r["default"])(d),v="y"===h?s.top:s.left,b="y"===h?s.bottom:s.right,V=n.rects.reference[g]+n.rects.reference[h]-p[h]-n.rects.popper[g],y=p[h]-n.rects.reference[h],x=(0,i["default"])(d),I=x?"y"===h?x.clientHeight||0:x.clientWidth||0:0,k=V/2-y/2,w=C[v],S=I-N[g]-C[b],_=I/2-N[g]/2+k,M=(0,l["default"])(w,_,S),D=h;n.modifiersData[a]=((t={})[D]=M,t.centerOffset=M-_,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&(0,a["default"])(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=f},11300:function(e,t,n){"use strict";t.__esModule=!0,t.mapToStyles=p,t["default"]=void 0;var o=n(56728),r=d(n(32440)),a=d(n(31677)),i=d(n(58386)),c=d(n(61131)),l=d(n(22709)),u=n(62836);function d(e){return e&&e.__esModule?e:{"default":e}}var s={top:"auto",right:"auto",bottom:"auto",left:"auto"};function p(e){var t,n=e.popper,l=e.popperRect,d=e.placement,p=e.offsets,m=e.position,f=e.gpuAcceleration,h=e.adaptive,g=e.roundOffsets,C=!0===g?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:(0,u.round)((0,u.round)(t*o)/o)||0,y:(0,u.round)((0,u.round)(n*o)/o)||0}}(p):"function"==typeof g?g(p):p,N=C.x,v=void 0===N?0:N,b=C.y,V=void 0===b?0:b,y=p.hasOwnProperty("x"),x=p.hasOwnProperty("y"),I=o.left,k=o.top,w=window;if(h){var S=(0,r["default"])(n),_="clientHeight",M="clientWidth";S===(0,a["default"])(n)&&(S=(0,i["default"])(n),"static"!==(0,c["default"])(S).position&&(_="scrollHeight",M="scrollWidth")),d===o.top&&(k=o.bottom,V-=S[_]-l.height,V*=f?1:-1),d===o.left&&(I=o.right,v-=S[M]-l.width,v*=f?1:-1)}var D,B=Object.assign({position:m},h&&s);return f?Object.assign({},B,((D={})[k]=x?"0":"",D[I]=y?"0":"",D.transform=(w.devicePixelRatio||1)<2?"translate("+v+"px, "+V+"px)":"translate3d("+v+"px, "+V+"px, 0)",D)):Object.assign({},B,((t={})[k]=x?V+"px":"",t[I]=y?v+"px":"",t.transform="",t))}var m={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,a=n.adaptive,i=void 0===a||a,c=n.roundOffsets,u=void 0===c||c,d={placement:(0,l["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,p(Object.assign({},d,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:u})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,p(Object.assign({},d,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=m},27020:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(31677))&&o.__esModule?o:{"default":o};var a={passive:!0};var i={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,o=e.options,i=o.scroll,c=void 0===i||i,l=o.resize,u=void 0===l||l,d=(0,r["default"])(t.elements.popper),s=[].concat(t.scrollParents.reference,t.scrollParents.popper);return c&&s.forEach((function(e){e.addEventListener("scroll",n.update,a)})),u&&d.addEventListener("resize",n.update,a),function(){c&&s.forEach((function(e){e.removeEventListener("scroll",n.update,a)})),u&&d.removeEventListener("resize",n.update,a)}},data:{}};t["default"]=i},45922:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=d(n(70045)),r=d(n(22709)),a=d(n(28916)),i=d(n(19574)),c=d(n(31565)),l=n(56728),u=d(n(45412));function d(e){return e&&e.__esModule?e:{"default":e}}var s={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,d=e.name;if(!t.modifiersData[d]._skip){for(var s=n.mainAxis,p=void 0===s||s,m=n.altAxis,f=void 0===m||m,h=n.fallbackPlacements,g=n.padding,C=n.boundary,N=n.rootBoundary,v=n.altBoundary,b=n.flipVariations,V=void 0===b||b,y=n.allowedAutoPlacements,x=t.options.placement,I=(0,r["default"])(x),k=h||(I===x||!V?[(0,o["default"])(x)]:function(e){if((0,r["default"])(e)===l.auto)return[];var t=(0,o["default"])(e);return[(0,a["default"])(e),t,(0,a["default"])(t)]}(x)),w=[x].concat(k).reduce((function(e,n){return e.concat((0,r["default"])(n)===l.auto?(0,c["default"])(t,{placement:n,boundary:C,rootBoundary:N,padding:g,flipVariations:V,allowedAutoPlacements:y}):n)}),[]),S=t.rects.reference,_=t.rects.popper,M=new Map,D=!0,B=w[0],A=0;A<w.length;A++){var T=w[A],L=(0,r["default"])(T),E=(0,u["default"])(T)===l.start,j=[l.top,l.bottom].indexOf(L)>=0,P=j?"width":"height",O=(0,i["default"])(t,{placement:T,boundary:C,rootBoundary:N,altBoundary:v,padding:g}),F=j?E?l.right:l.left:E?l.bottom:l.top;S[P]>_[P]&&(F=(0,o["default"])(F));var R=(0,o["default"])(F),z=[];if(p&&z.push(O[L]<=0),f&&z.push(O[F]<=0,O[R]<=0),z.every((function(e){return e}))){B=T,D=!1;break}M.set(T,z)}if(D)for(var W=function(e){var t=w.find((function(t){var n=M.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return B=t,"break"},U=V?3:1;U>0;U--){if("break"===W(U))break}t.placement!==B&&(t.modifiersData[d]._skip=!0,t.placement=B,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=s},82860:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=n(56728),a=(o=n(19574))&&o.__esModule?o:{"default":o};function i(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function c(e){return[r.top,r.right,r.bottom,r.left].some((function(t){return e[t]>=0}))}var l={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,l=t.modifiersData.preventOverflow,u=(0,a["default"])(t,{elementContext:"reference"}),d=(0,a["default"])(t,{altBoundary:!0}),s=i(u,o),p=i(d,r,l),m=c(s),f=c(p);t.modifiersData[n]={referenceClippingOffsets:s,popperEscapeOffsets:p,isReferenceHidden:m,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":m,"data-popper-escaped":f})}};t["default"]=l},18726:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var o=p(n(34559));t.applyStyles=o["default"];var r=p(n(76340));t.arrow=r["default"];var a=p(n(11300));t.computeStyles=a["default"];var i=p(n(27020));t.eventListeners=i["default"];var c=p(n(45922));t.flip=c["default"];var l=p(n(82860));t.hide=l["default"];var u=p(n(33310));t.offset=u["default"];var d=p(n(74371));t.popperOffsets=d["default"];var s=p(n(21532));function p(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=s["default"]},33310:function(e,t,n){"use strict";t.__esModule=!0,t.distanceAndSkiddingToXY=i,t["default"]=void 0;var o,r=(o=n(22709))&&o.__esModule?o:{"default":o},a=n(56728);function i(e,t,n){var o=(0,r["default"])(e),i=[a.left,a.top].indexOf(o)>=0?-1:1,c="function"==typeof n?n(Object.assign({},t,{placement:e})):n,l=c[0],u=c[1];return l=l||0,u=(u||0)*i,[a.left,a.right].indexOf(o)>=0?{x:u,y:l}:{x:l,y:u}}var c={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,c=void 0===r?[0,0]:r,l=a.placements.reduce((function(e,n){return e[n]=i(n,t.rects,c),e}),{}),u=l[t.placement],d=u.x,s=u.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=d,t.modifiersData.popperOffsets.y+=s),t.modifiersData[o]=l}};t["default"]=c},74371:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(17175))&&o.__esModule?o:{"default":o};var a={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,r["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=a},21532:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(56728),r=f(n(22709)),a=f(n(16615)),i=f(n(82898)),c=f(n(52534)),l=f(n(43545)),u=f(n(32440)),d=f(n(19574)),s=f(n(45412)),p=f(n(41801)),m=n(62836);function f(e){return e&&e.__esModule?e:{"default":e}}var h={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,f=e.name,h=n.mainAxis,g=void 0===h||h,C=n.altAxis,N=void 0!==C&&C,v=n.boundary,b=n.rootBoundary,V=n.altBoundary,y=n.padding,x=n.tether,I=void 0===x||x,k=n.tetherOffset,w=void 0===k?0:k,S=(0,d["default"])(t,{boundary:v,rootBoundary:b,padding:y,altBoundary:V}),_=(0,r["default"])(t.placement),M=(0,s["default"])(t.placement),D=!M,B=(0,a["default"])(_),A=(0,i["default"])(B),T=t.modifiersData.popperOffsets,L=t.rects.reference,E=t.rects.popper,j="function"==typeof w?w(Object.assign({},t.rects,{placement:t.placement})):w,P={x:0,y:0};if(T){if(g||N){var O="y"===B?o.top:o.left,F="y"===B?o.bottom:o.right,R="y"===B?"height":"width",z=T[B],W=T[B]+S[O],U=T[B]-S[F],H=I?-E[R]/2:0,G=M===o.start?L[R]:E[R],Y=M===o.start?-E[R]:-L[R],Z=t.elements.arrow,K=I&&Z?(0,l["default"])(Z):{width:0,height:0},Q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,p["default"])(),J=Q[O],X=Q[F],q=(0,c["default"])(0,L[R],K[R]),$=D?L[R]/2-H-q-J-j:G-q-J-j,ee=D?-L[R]/2+H+q+X+j:Y+q+X+j,te=t.elements.arrow&&(0,u["default"])(t.elements.arrow),ne=te?"y"===B?te.clientTop||0:te.clientLeft||0:0,oe=t.modifiersData.offset?t.modifiersData.offset[t.placement][B]:0,re=T[B]+$-oe-ne,ae=T[B]+ee-oe;if(g){var ie=(0,c["default"])(I?(0,m.min)(W,re):W,z,I?(0,m.max)(U,ae):U);T[B]=ie,P[B]=ie-z}if(N){var ce="x"===B?o.top:o.left,le="x"===B?o.bottom:o.right,ue=T[A],de=ue+S[ce],se=ue-S[le],pe=(0,c["default"])(I?(0,m.min)(de,re):de,ue,I?(0,m.max)(se,ae):se);T[A]=pe,P[A]=pe-ue}}t.modifiersData[f]=P}},requiresIfExists:["offset"]};t["default"]=h},39030:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var o=n(92179);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var r=l(n(27020)),a=l(n(74371)),i=l(n(11300)),c=l(n(34559));function l(e){return e&&e.__esModule?e:{"default":e}}var u=[r["default"],a["default"],i["default"],c["default"]];t.defaultModifiers=u;var d=(0,o.popperGenerator)({defaultModifiers:u});t.createPopper=d},48069:function(e,t,n){"use strict";t.__esModule=!0;var o={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var r=n(92179);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var a=g(n(27020)),i=g(n(74371)),c=g(n(11300)),l=g(n(34559)),u=g(n(33310)),d=g(n(45922)),s=g(n(21532)),p=g(n(76340)),m=g(n(82860)),f=n(39030);t.createPopperLite=f.createPopper;var h=n(18726);function g(e){return e&&e.__esModule?e:{"default":e}}Object.keys(h).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===h[e]||(t[e]=h[e]))}));var C=[a["default"],i["default"],c["default"],l["default"],u["default"],d["default"],s["default"],p["default"],m["default"]];t.defaultModifiers=C;var N=(0,r.popperGenerator)({defaultModifiers:C});t.createPopperLite=t.createPopper=N},31565:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,c=n.placement,l=n.boundary,u=n.rootBoundary,d=n.padding,s=n.flipVariations,p=n.allowedAutoPlacements,m=void 0===p?r.placements:p,f=(0,o["default"])(c),h=f?s?r.variationPlacements:r.variationPlacements.filter((function(e){return(0,o["default"])(e)===f})):r.basePlacements,g=h.filter((function(e){return m.indexOf(e)>=0}));0===g.length&&(g=h);var C=g.reduce((function(t,n){return t[n]=(0,a["default"])(e,{placement:n,boundary:l,rootBoundary:u,padding:d})[(0,i["default"])(n)],t}),{});return Object.keys(C).sort((function(e,t){return C[e]-C[t]}))};var o=c(n(45412)),r=n(56728),a=c(n(19574)),i=c(n(22709));function c(e){return e&&e.__esModule?e:{"default":e}}},17175:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,c=e.element,l=e.placement,u=l?(0,o["default"])(l):null,d=l?(0,r["default"])(l):null,s=n.x+n.width/2-c.width/2,p=n.y+n.height/2-c.height/2;switch(u){case i.top:t={x:s,y:n.y-c.height};break;case i.bottom:t={x:s,y:n.y+n.height};break;case i.right:t={x:n.x+n.width,y:p};break;case i.left:t={x:n.x-c.width,y:p};break;default:t={x:n.x,y:n.y}}var m=u?(0,a["default"])(u):null;if(null!=m){var f="y"===m?"height":"width";switch(d){case i.start:t[m]=t[m]-(n[f]/2-c[f]/2);break;case i.end:t[m]=t[m]+(n[f]/2-c[f]/2)}}return t};var o=c(n(22709)),r=c(n(45412)),a=c(n(16615)),i=n(56728);function c(e){return e&&e.__esModule?e:{"default":e}}},68369:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},19574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,p=n.placement,m=void 0===p?e.placement:p,f=n.boundary,h=void 0===f?l.clippingParents:f,g=n.rootBoundary,C=void 0===g?l.viewport:g,N=n.elementContext,v=void 0===N?l.popper:N,b=n.altBoundary,V=void 0!==b&&b,y=n.padding,x=void 0===y?0:y,I=(0,d["default"])("number"!=typeof x?x:(0,s["default"])(x,l.basePlacements)),k=v===l.popper?l.reference:l.popper,w=e.elements.reference,S=e.rects.popper,_=e.elements[V?k:v],M=(0,r["default"])((0,u.isElement)(_)?_:_.contextElement||(0,a["default"])(e.elements.popper),h,C),D=(0,o["default"])(w),B=(0,i["default"])({reference:D,element:S,strategy:"absolute",placement:m}),A=(0,c["default"])(Object.assign({},S,B)),T=v===l.popper?A:D,L={top:M.top-T.top+I.top,bottom:T.bottom-M.bottom+I.bottom,left:M.left-T.left+I.left,right:T.right-M.right+I.right},E=e.modifiersData.offset;if(v===l.popper&&E){var j=E[m];Object.keys(L).forEach((function(e){var t=[l.right,l.bottom].indexOf(e)>=0?1:-1,n=[l.top,l.bottom].indexOf(e)>=0?"y":"x";L[e]+=j[n]*t}))}return L};var o=p(n(94294)),r=p(n(48162)),a=p(n(58386)),i=p(n(17175)),c=p(n(20935)),l=n(56728),u=n(67458),d=p(n(32055)),s=p(n(76294));function p(e){return e&&e.__esModule?e:{"default":e}}},76294:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},41434:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return[].concat(n).reduce((function(e,t){return e.replace(/%s/,t)}),e)}},82898:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return"x"===e?"y":"x"}},22709:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[0]};n(56728)},41801:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(){return{top:0,right:0,bottom:0,left:0}}},16615:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}},70045:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},28916:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},45412:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},62836:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var o=Math.min;t.min=o;var r=Math.round;t.round=r},36284:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},32055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,r["default"])(),e)};var o,r=(o=n(41801))&&o.__esModule?o:{"default":o}},45700:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}(e);return o.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var o=n(56728)},20935:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},25435:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var o=t(e);if(!n.has(o))return n.add(o),!0}))}},38574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){Object.keys(t).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;case"phase":r.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":t.effect;break;case"requires":Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(o=n(41434))&&o.__esModule;var o,r=n(56728)},52534:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){return(0,o.max)(e,(0,o.min)(t,n))};var o=n(62836)},83923:function(e){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},1372:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e){if(!o(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},36910:function(e,t,n){"use strict";var o=n(17657),r=n(83681),a=n(74217),i=o("unscopables"),c=Array.prototype;c[i]==undefined&&a.f(c,i,{configurable:!0,value:r(null)}),e.exports=function(e){c[i][e]=!0}},69953:function(e,t,n){"use strict";var o=n(37015).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},50997:function(e){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},63518:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e){if(!o(e))throw TypeError(String(e)+" is not an object");return e}},32977:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},19216:function(e,t,n){"use strict";var o,r,a,i=n(32977),c=n(75592),l=n(84253),u=n(35611),d=n(28919),s=n(47953),p=n(52188),m=n(11807),f=n(74217).f,h=n(6863),g=n(18444),C=n(17657),N=n(41080),v=l.Int8Array,b=v&&v.prototype,V=l.Uint8ClampedArray,y=V&&V.prototype,x=v&&h(v),I=b&&h(b),k=Object.prototype,w=k.isPrototypeOf,S=C("toStringTag"),_=N("TYPED_ARRAY_TAG"),M=N("TYPED_ARRAY_CONSTRUCTOR"),D=i&&!!g&&"Opera"!==s(l.opera),B=!1,A={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},L=function(e){if(!u(e))return!1;var t=s(e);return"DataView"===t||d(A,t)||d(T,t)},E=function(e){if(!u(e))return!1;var t=s(e);return d(A,t)||d(T,t)};for(o in A)(a=(r=l[o])&&r.prototype)?p(a,M,r):D=!1;for(o in T)(a=(r=l[o])&&r.prototype)&&p(a,M,r);if((!D||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},D))for(o in A)l[o]&&g(l[o],x);if((!D||!I||I===k)&&(I=x.prototype,D))for(o in A)l[o]&&g(l[o].prototype,I);if(D&&h(y)!==I&&g(y,I),c&&!d(I,S))for(o in B=!0,f(I,S,{get:function(){return u(this)?this[_]:undefined}}),A)l[o]&&p(l[o],_,o);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:D,TYPED_ARRAY_CONSTRUCTOR:M,TYPED_ARRAY_TAG:B&&_,aTypedArray:function(e){if(E(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(g&&!w.call(x,e))throw TypeError("Target is not a typed array constructor");return e},exportTypedArrayMethod:function(e,t,n){if(c){if(n)for(var o in A){var r=l[o];if(r&&d(r.prototype,e))try{delete r.prototype[e]}catch(a){}}I[e]&&!n||m(I,e,n?t:D&&b[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var o,r;if(c){if(g){if(n)for(o in A)if((r=l[o])&&d(r,e))try{delete r[e]}catch(a){}if(x[e]&&!n)return;try{return m(x,e,n?t:D&&x[e]||t)}catch(a){}}for(o in A)!(r=l[o])||r[e]&&!n||m(r,e,t)}},isView:L,isTypedArray:E,TypedArray:x,TypedArrayPrototype:I}},80246:function(e,t,n){"use strict";var o=n(84253),r=n(75592),a=n(32977),i=n(52188),c=n(3993),l=n(69691),u=n(50997),d=n(3997),s=n(39570),p=n(77559),m=n(16567),f=n(6863),h=n(18444),g=n(78870).f,C=n(74217).f,N=n(22051),v=n(29108),b=n(79947),V=b.get,y=b.set,x="ArrayBuffer",I="DataView",k="prototype",w="Wrong index",S=o[x],_=S,M=o[I],D=M&&M[k],B=Object.prototype,A=o.RangeError,T=m.pack,L=m.unpack,E=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},P=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},F=function(e){return T(e,23,4)},R=function(e){return T(e,52,8)},z=function(e,t){C(e[k],t,{get:function(){return V(this)[t]}})},W=function(e,t,n,o){var r=p(n),a=V(e);if(r+t>a.byteLength)throw A(w);var i=V(a.buffer).bytes,c=r+a.byteOffset,l=i.slice(c,c+t);return o?l:l.reverse()},U=function(e,t,n,o,r,a){var i=p(n),c=V(e);if(i+t>c.byteLength)throw A(w);for(var l=V(c.buffer).bytes,u=i+c.byteOffset,d=o(+r),s=0;s<t;s++)l[u+s]=d[a?s:t-s-1]};if(a){if(!l((function(){S(1)}))||!l((function(){new S(-1)}))||l((function(){return new S,new S(1.5),new S(NaN),S.name!=x}))){for(var H,G=(_=function(e){return u(this,_),new S(p(e))})[k]=S[k],Y=g(S),Z=0;Y.length>Z;)(H=Y[Z++])in _||i(_,H,S[H]);G.constructor=_}h&&f(D)!==B&&h(D,B);var K=new M(new _(2)),Q=D.setInt8;K.setInt8(0,2147483648),K.setInt8(1,2147483649),!K.getInt8(0)&&K.getInt8(1)||c(D,{setInt8:function(e,t){Q.call(this,e,t<<24>>24)},setUint8:function(e,t){Q.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){u(this,_,x);var t=p(e);y(this,{bytes:N.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},M=function(e,t,n){u(this,M,I),u(e,_,I);var o=V(e).byteLength,a=d(t);if(a<0||a>o)throw A("Wrong offset");if(a+(n=n===undefined?o-a:s(n))>o)throw A("Wrong length");y(this,{buffer:e,byteLength:n,byteOffset:a}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=a)},r&&(z(_,"byteLength"),z(M,"buffer"),z(M,"byteLength"),z(M,"byteOffset")),c(M[k],{getInt8:function(e){return W(this,1,e)[0]<<24>>24},getUint8:function(e){return W(this,1,e)[0]},getInt16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return O(W(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return O(W(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return L(W(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return L(W(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){U(this,1,e,E,t)},setUint8:function(e,t){U(this,1,e,E,t)},setInt16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){U(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){U(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){U(this,4,e,F,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){U(this,8,e,R,t,arguments.length>2?arguments[2]:undefined)}});v(_,x),v(M,I),e.exports={ArrayBuffer:_,DataView:M}},59571:function(e,t,n){"use strict";var o=n(12104),r=n(55205),a=n(39570),i=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),c=a(n.length),l=r(e,c),u=r(t,c),d=arguments.length>2?arguments[2]:undefined,s=i((d===undefined?c:r(d,c))-u,c-l),p=1;for(u<l&&l<u+s&&(p=-1,u+=s-1,l+=s-1);s-- >0;)u in n?n[l]=n[u]:delete n[l],l+=p,u+=p;return n}},22051:function(e,t,n){"use strict";var o=n(12104),r=n(55205),a=n(39570);e.exports=function(e){for(var t=o(this),n=a(t.length),i=arguments.length,c=r(i>1?arguments[1]:undefined,n),l=i>2?arguments[2]:undefined,u=l===undefined?n:r(l,n);u>c;)t[c++]=e;return t}},90369:function(e,t,n){"use strict";var o=n(69033).forEach,r=n(37902)("forEach");e.exports=r?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},11955:function(e){"use strict";e.exports=function(e,t){for(var n=0,o=t.length,r=new e(o);o>n;)r[n]=t[n++];return r}},28213:function(e,t,n){"use strict";var o=n(74271),r=n(12104),a=n(32648),i=n(14195),c=n(39570),l=n(39241),u=n(3170);e.exports=function(e){var t,n,d,s,p,m,f=r(e),h="function"==typeof this?this:Array,g=arguments.length,C=g>1?arguments[1]:undefined,N=C!==undefined,v=u(f),b=0;if(N&&(C=o(C,g>2?arguments[2]:undefined,2)),v==undefined||h==Array&&i(v))for(n=new h(t=c(f.length));t>b;b++)m=N?C(f[b],b):f[b],l(n,b,m);else for(p=(s=v.call(f)).next,n=new h;!(d=p.call(s)).done;b++)m=N?a(s,C,[d.value,b],!0):d.value,l(n,b,m);return n.length=b,n}},25945:function(e,t,n){"use strict";var o=n(26553),r=n(39570),a=n(55205),i=function(e){return function(t,n,i){var c,l=o(t),u=r(l.length),d=a(i,u);if(e&&n!=n){for(;u>d;)if((c=l[d++])!=c)return!0}else for(;u>d;d++)if((e||d in l)&&l[d]===n)return e||d||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},69033:function(e,t,n){"use strict";var o=n(74271),r=n(50990),a=n(12104),i=n(39570),c=n(77454),l=[].push,u=function(e){var t=1==e,n=2==e,u=3==e,d=4==e,s=6==e,p=7==e,m=5==e||s;return function(f,h,g,C){for(var N,v,b=a(f),V=r(b),y=o(h,g,3),x=i(V.length),I=0,k=C||c,w=t?k(f,x):n||p?k(f,0):undefined;x>I;I++)if((m||I in V)&&(v=y(N=V[I],I,b),e))if(t)w[I]=v;else if(v)switch(e){case 3:return!0;case 5:return N;case 6:return I;case 2:l.call(w,N)}else switch(e){case 4:return!1;case 7:l.call(w,N)}return s?-1:u||d?d:w}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},41183:function(e,t,n){"use strict";var o=n(26553),r=n(3997),a=n(39570),i=n(37902),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,d=i("lastIndexOf"),s=u||!d;e.exports=s?function(e){if(u)return l.apply(this,arguments)||0;var t=o(this),n=a(t.length),i=n-1;for(arguments.length>1&&(i=c(i,r(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:l},93537:function(e,t,n){"use strict";var o=n(69691),r=n(17657),a=n(12338),i=r("species");e.exports=function(e){return a>=51||!o((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},37902:function(e,t,n){"use strict";var o=n(69691);e.exports=function(e,t){var n=[][e];return!!n&&o((function(){n.call(null,t||function(){throw 1},1)}))}},28249:function(e,t,n){"use strict";var o=n(83923),r=n(12104),a=n(50990),i=n(39570),c=function(e){return function(t,n,c,l){o(n);var u=r(t),d=a(u),s=i(u.length),p=e?s-1:0,m=e?-1:1;if(c<2)for(;;){if(p in d){l=d[p],p+=m;break}if(p+=m,e?p<0:s<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:s>p;p+=m)p in d&&(l=n(l,d[p],p,u));return l}};e.exports={left:c(!1),right:c(!0)}},58737:function(e){"use strict";var t=Math.floor,n=function(e,t){for(var n,o,r=e.length,a=1;a<r;){for(o=a,n=e[a];o&&t(e[o-1],n)>0;)e[o]=e[--o];o!==a++&&(e[o]=n)}return e},o=function(e,t,n){for(var o=e.length,r=t.length,a=0,i=0,c=[];a<o||i<r;)a<o&&i<r?c.push(n(e[a],t[i])<=0?e[a++]:t[i++]):c.push(a<o?e[a++]:t[i++]);return c};e.exports=function r(e,a){var i=e.length,c=t(i/2);return i<8?n(e,a):o(r(e.slice(0,c),a),r(e.slice(c),a),a)}},73612:function(e,t,n){"use strict";var o=n(35611),r=n(89999),a=n(17657)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)?o(t)&&null===(t=t[a])&&(t=undefined):t=undefined),t===undefined?Array:t}},77454:function(e,t,n){"use strict";var o=n(73612);e.exports=function(e,t){return new(o(e))(0===t?0:t)}},32648:function(e,t,n){"use strict";var o=n(63518),r=n(61781);e.exports=function(e,t,n,a){try{return a?t(o(n)[0],n[1]):t(n)}catch(i){throw r(e),i}}},68762:function(e,t,n){"use strict";var o=n(17657)("iterator"),r=!1;try{var a=0,i={next:function(){return{done:!!a++}},"return":function(){r=!0}};i[o]=function(){return this},Array.from(i,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var a={};a[o]=function(){return{next:function(){return{done:n=!0}}}},e(a)}catch(c){}return n}},77e3:function(e){"use strict";var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},47953:function(e,t,n){"use strict";var o=n(64910),r=n(77e3),a=n(17657)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=o?r:function(e){var t,n,o;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),a))?n:i?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},74568:function(e,t,n){"use strict";var o=n(74217).f,r=n(83681),a=n(3993),i=n(74271),c=n(50997),l=n(56342),u=n(71179),d=n(64157),s=n(75592),p=n(40421).fastKey,m=n(79947),f=m.set,h=m.getterFor;e.exports={getConstructor:function(e,t,n,u){var d=e((function(e,o){c(e,d,t),f(e,{type:t,index:r(null),first:undefined,last:undefined,size:0}),s||(e.size=0),o!=undefined&&l(o,e[u],{that:e,AS_ENTRIES:n})})),m=h(t),g=function(e,t,n){var o,r,a=m(e),i=C(e,t);return i?i.value=n:(a.last=i={index:r=p(t,!0),key:t,value:n,previous:o=a.last,next:undefined,removed:!1},a.first||(a.first=i),o&&(o.next=i),s?a.size++:e.size++,"F"!==r&&(a.index[r]=i)),e},C=function(e,t){var n,o=m(e),r=p(t);if("F"!==r)return o.index[r];for(n=o.first;n;n=n.next)if(n.key==t)return n};return a(d.prototype,{clear:function(){for(var e=m(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=undefined),delete t[n.index],n=n.next;e.first=e.last=undefined,s?e.size=0:this.size=0},"delete":function(e){var t=this,n=m(t),o=C(t,e);if(o){var r=o.next,a=o.previous;delete n.index[o.index],o.removed=!0,a&&(a.next=r),r&&(r.previous=a),n.first==o&&(n.first=r),n.last==o&&(n.last=a),s?n.size--:t.size--}return!!o},forEach:function(e){for(var t,n=m(this),o=i(e,arguments.length>1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!C(this,e)}}),a(d.prototype,n?{get:function(e){var t=C(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),s&&o(d.prototype,"size",{get:function(){return m(this).size}}),d},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),a=h(o);u(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),d(t)}}},57396:function(e,t,n){"use strict";var o=n(3993),r=n(40421).getWeakData,a=n(63518),i=n(35611),c=n(50997),l=n(56342),u=n(69033),d=n(28919),s=n(79947),p=s.set,m=s.getterFor,f=u.find,h=u.findIndex,g=0,C=function(e){return e.frozen||(e.frozen=new N)},N=function(){this.entries=[]},v=function(e,t){return f(e.entries,(function(e){return e[0]===t}))};N.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var n=v(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=h(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,u){var s=e((function(e,o){c(e,s,t),p(e,{type:t,id:g++,frozen:undefined}),o!=undefined&&l(o,e[u],{that:e,AS_ENTRIES:n})})),f=m(t),h=function(e,t,n){var o=f(e),i=r(a(t),!0);return!0===i?C(o).set(t,n):i[o.id]=n,e};return o(s.prototype,{"delete":function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?C(t)["delete"](e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?C(t).has(e):n&&d(n,t.id)}}),o(s.prototype,n?{get:function(e){var t=f(this);if(i(e)){var n=r(e);return!0===n?C(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return h(this,e,t)}}:{add:function(e){return h(this,e,!0)}}),s}}},42006:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(41441),i=n(11807),c=n(40421),l=n(56342),u=n(50997),d=n(35611),s=n(69691),p=n(68762),m=n(29108),f=n(22285);e.exports=function(e,t,n){var h=-1!==e.indexOf("Map"),g=-1!==e.indexOf("Weak"),C=h?"set":"add",N=r[e],v=N&&N.prototype,b=N,V={},y=function(e){var t=v[e];i(v,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(g&&!d(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return g&&!d(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(g&&!d(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(a(e,"function"!=typeof N||!(g||v.forEach&&!s((function(){(new N).entries().next()})))))b=n.getConstructor(t,e,h,C),c.enable();else if(a(e,!0)){var x=new b,I=x[C](g?{}:-0,1)!=x,k=s((function(){x.has(1)})),w=p((function(e){new N(e)})),S=!g&&s((function(){for(var e=new N,t=5;t--;)e[C](t,t);return!e.has(-0)}));w||((b=t((function(t,n){u(t,b,e);var o=f(new N,t,b);return n!=undefined&&l(n,o[C],{that:o,AS_ENTRIES:h}),o}))).prototype=v,v.constructor=b),(k||S)&&(y("delete"),y("has"),h&&y("get")),(S||I)&&y(C),g&&v.clear&&delete v.clear}return V[e]=b,o({global:!0,forced:b!=N},V),m(b,e),g||n.setStrong(b,e,h),b}},49957:function(e,t,n){"use strict";var o=n(28919),r=n(28482),a=n(22245),i=n(74217);e.exports=function(e,t){for(var n=r(t),c=i.f,l=a.f,u=0;u<n.length;u++){var d=n[u];o(e,d)||c(e,d,l(t,d))}}},93937:function(e,t,n){"use strict";var o=n(17657)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[o]=!1,"/./"[e](t)}catch(r){}}return!1}},28954:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},34141:function(e,t,n){"use strict";var o=n(44184),r=n(92082),a=/"/g;e.exports=function(e,t,n,i){var c=r(o(e)),l="<"+t;return""!==n&&(l+=" "+n+'="'+r(i).replace(a,"&quot;")+'"'),l+">"+c+"</"+t+">"}},38415:function(e,t,n){"use strict";var o=n(39881).IteratorPrototype,r=n(83681),a=n(39160),i=n(29108),c=n(82723),l=function(){return this};e.exports=function(e,t,n){var u=t+" Iterator";return e.prototype=r(o,{next:a(1,n)}),i(e,u,!1,!0),c[u]=l,e}},52188:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(39160);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},39160:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},39241:function(e,t,n){"use strict";var o=n(14613),r=n(74217),a=n(39160);e.exports=function(e,t,n){var i=o(t);i in e?r.f(e,i,a(0,n)):e[i]=n}},79873:function(e,t,n){"use strict";var o=n(69691),r=n(47497).start,a=Math.abs,i=Date.prototype,c=i.getTime,l=i.toISOString;e.exports=o((function(){return"0385-07-25T07:06:39.999Z"!=l.call(new Date(-50000000000001))}))||!o((function(){l.call(new Date(NaN))}))?function(){if(!isFinite(c.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),o=t<0?"-":t>9999?"+":"";return o+r(a(t),o?6:4,0)+"-"+r(e.getUTCMonth()+1,2,0)+"-"+r(e.getUTCDate(),2,0)+"T"+r(e.getUTCHours(),2,0)+":"+r(e.getUTCMinutes(),2,0)+":"+r(e.getUTCSeconds(),2,0)+"."+r(n,3,0)+"Z"}:l},57763:function(e,t,n){"use strict";var o=n(63518),r=n(28734);e.exports=function(e){if(o(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw TypeError("Incorrect hint");return r(this,e)}},71179:function(e,t,n){"use strict";var o=n(56174),r=n(38415),a=n(6863),i=n(18444),c=n(29108),l=n(52188),u=n(11807),d=n(17657),s=n(1986),p=n(82723),m=n(39881),f=m.IteratorPrototype,h=m.BUGGY_SAFARI_ITERATORS,g=d("iterator"),C="keys",N="values",v="entries",b=function(){return this};e.exports=function(e,t,n,d,m,V,y){r(n,t,d);var x,I,k,w=function(e){if(e===m&&B)return B;if(!h&&e in M)return M[e];switch(e){case C:case N:case v:return function(){return new n(this,e)}}return function(){return new n(this)}},S=t+" Iterator",_=!1,M=e.prototype,D=M[g]||M["@@iterator"]||m&&M[m],B=!h&&D||w(m),A="Array"==t&&M.entries||D;if(A&&(x=a(A.call(new e)),f!==Object.prototype&&x.next&&(s||a(x)===f||(i?i(x,f):"function"!=typeof x[g]&&l(x,g,b)),c(x,S,!0,!0),s&&(p[S]=b))),m==N&&D&&D.name!==N&&(_=!0,B=function(){return D.call(this)}),s&&!y||M[g]===B||l(M,g,B),p[t]=B,m)if(I={values:w(N),keys:V?B:w(C),entries:w(v)},y)for(k in I)(h||_||!(k in M))&&u(M,k,I[k]);else o({target:t,proto:!0,forced:h||_},I);return I}},55282:function(e,t,n){"use strict";var o=n(65781),r=n(28919),a=n(3444),i=n(74217).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||i(t,e,{value:a.f(e)})}},75592:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},21477:function(e,t,n){"use strict";var o=n(84253),r=n(35611),a=o.document,i=r(a)&&r(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},20967:function(e,t,n){"use strict";var o=n(72319).match(/firefox\/(\d+)/i);e.exports=!!o&&+o[1]},46392:function(e){"use strict";e.exports="object"==typeof window},85749:function(e,t,n){"use strict";var o=n(72319);e.exports=/MSIE|Trident/.test(o)},20037:function(e,t,n){"use strict";var o=n(72319),r=n(84253);e.exports=/iphone|ipod|ipad/i.test(o)&&r.Pebble!==undefined},24542:function(e,t,n){"use strict";var o=n(72319);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(o)},41488:function(e,t,n){"use strict";var o=n(77e3),r=n(84253);e.exports="process"==o(r.process)},47501:function(e,t,n){"use strict";var o=n(72319);e.exports=/web0s(?!.*chrome)/i.test(o)},72319:function(e,t,n){"use strict";var o=n(69808);e.exports=o("navigator","userAgent")||""},12338:function(e,t,n){"use strict";var o,r,a=n(84253),i=n(72319),c=a.process,l=a.Deno,u=c&&c.versions||l&&l.version,d=u&&u.v8;d?r=(o=d.split("."))[0]<4?1:o[0]+o[1]:i&&(!(o=i.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=i.match(/Chrome\/(\d+)/))&&(r=o[1]),e.exports=r&&+r},12200:function(e,t,n){"use strict";var o=n(72319).match(/AppleWebKit\/(\d+)\./);e.exports=!!o&&+o[1]},23344:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},56174:function(e,t,n){"use strict";var o=n(84253),r=n(22245).f,a=n(52188),i=n(11807),c=n(30889),l=n(49957),u=n(41441);e.exports=function(e,t){var n,d,s,p,m,f=e.target,h=e.global,g=e.stat;if(n=h?o:g?o[f]||c(f,{}):(o[f]||{}).prototype)for(d in t){if(p=t[d],s=e.noTargetGet?(m=r(n,d))&&m.value:n[d],!u(h?d:f+(g?".":"#")+d,e.forced)&&s!==undefined){if(typeof p==typeof s)continue;l(p,s)}(e.sham||s&&s.sham)&&a(p,"sham",!0),i(n,d,p,e)}}},69691:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},68880:function(e,t,n){"use strict";n(12654);var o=n(11807),r=n(71841),a=n(69691),i=n(17657),c=n(52188),l=i("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var s=i(e),p=!a((function(){var t={};return t[s]=function(){return 7},7!=""[e](t)})),m=p&&!a((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[s]=/./[s]),n.exec=function(){return t=!0,null},n[s](""),!t}));if(!p||!m||n){var f=/./[s],h=t(s,""[e],(function(e,t,n,o,a){var i=t.exec;return i===r||i===u.exec?p&&!a?{done:!0,value:f.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}}));o(String.prototype,e,h[0]),o(u,s,h[1])}d&&c(u[s],"sham",!0)}},904:function(e,t,n){"use strict";var o=n(89999),r=n(39570),a=n(74271);e.exports=function i(e,t,n,c,l,u,d,s){for(var p,m=l,f=0,h=!!d&&a(d,s,3);f<c;){if(f in n){if(p=h?h(n[f],f,t):n[f],u>0&&o(p))m=i(e,t,p,r(p.length),m,u-1)-1;else{if(m>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[m]=p}m++}f++}return m}},7056:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},74271:function(e,t,n){"use strict";var o=n(83923);e.exports=function(e,t,n){if(o(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}}},68719:function(e,t,n){"use strict";var o=n(83923),r=n(35611),a=[].slice,i={};e.exports=Function.bind||function(e){var t=o(this),n=a.call(arguments,1),c=function(){var o=n.concat(a.call(arguments));return this instanceof c?function(e,t,n){if(!(t in i)){for(var o=[],r=0;r<t;r++)o[r]="a["+r+"]";i[t]=Function("C,a","return new C("+o.join(",")+")")}return i[t](e,n)}(t,o.length,o):t.apply(e,o)};return r(t.prototype)&&(c.prototype=t.prototype),c}},69808:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){return arguments.length<2?"function"==typeof(n=o[e])?n:undefined:o[e]&&o[e][t];var n}},3170:function(e,t,n){"use strict";var o=n(47953),r=n(82723),a=n(17657)("iterator");e.exports=function(e){if(e!=undefined)return e[a]||e["@@iterator"]||r[o(e)]}},55444:function(e,t,n){"use strict";var o=n(12104),r=Math.floor,a="".replace,i=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,c=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,l,u,d){var s=n+e.length,p=l.length,m=c;return u!==undefined&&(u=o(u),m=i),a.call(d,m,(function(o,a){var i;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(s);case"<":i=u[a.slice(1,-1)];break;default:var c=+a;if(0===c)return o;if(c>p){var d=r(c/10);return 0===d?o:d<=p?l[d-1]===undefined?a.charAt(1):l[d-1]+a.charAt(1):o}i=l[c-1]}return i===undefined?"":i}))}},84253:function(e,t,n){"use strict";var o=function(e){return e&&e.Math==Math&&e};e.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},28919:function(e,t,n){"use strict";var o=n(12104),r={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return r.call(o(e),t)}},90311:function(e){"use strict";e.exports={}},21419:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},2369:function(e,t,n){"use strict";var o=n(69808);e.exports=o("document","documentElement")},78251:function(e,t,n){"use strict";var o=n(75592),r=n(69691),a=n(21477);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},16567:function(e){"use strict";var t=Math.abs,n=Math.pow,o=Math.floor,r=Math.log,a=Math.LN2;e.exports={pack:function(e,i,c){var l,u,d,s=new Array(c),p=8*c-i-1,m=(1<<p)-1,f=m>>1,h=23===i?n(2,-24)-n(2,-77):0,g=e<0||0===e&&1/e<0?1:0,C=0;for((e=t(e))!=e||e===Infinity?(u=e!=e?1:0,l=m):(l=o(r(e)/a),e*(d=n(2,-l))<1&&(l--,d*=2),(e+=l+f>=1?h/d:h*n(2,1-f))*d>=2&&(l++,d/=2),l+f>=m?(u=0,l=m):l+f>=1?(u=(e*d-1)*n(2,i),l+=f):(u=e*n(2,f-1)*n(2,i),l=0));i>=8;s[C++]=255&u,u/=256,i-=8);for(l=l<<i|u,p+=i;p>0;s[C++]=255&l,l/=256,p-=8);return s[--C]|=128*g,s},unpack:function(e,t){var o,r=e.length,a=8*r-t-1,i=(1<<a)-1,c=i>>1,l=a-7,u=r-1,d=e[u--],s=127&d;for(d>>=7;l>0;s=256*s+e[u],u--,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=t;l>0;o=256*o+e[u],u--,l-=8);if(0===s)s=1-c;else{if(s===i)return o?NaN:d?-Infinity:Infinity;o+=n(2,t),s-=c}return(d?-1:1)*o*n(2,s-t)}}},50990:function(e,t,n){"use strict";var o=n(69691),r=n(77e3),a="".split;e.exports=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?a.call(e,""):Object(e)}:Object},22285:function(e,t,n){"use strict";var o=n(35611),r=n(18444);e.exports=function(e,t,n){var a,i;return r&&"function"==typeof(a=t.constructor)&&a!==n&&o(i=a.prototype)&&i!==n.prototype&&r(e,i),e}},89853:function(e,t,n){"use strict";var o=n(55935),r=Function.toString;"function"!=typeof o.inspectSource&&(o.inspectSource=function(e){return r.call(e)}),e.exports=o.inspectSource},40421:function(e,t,n){"use strict";var o=n(56174),r=n(90311),a=n(35611),i=n(28919),c=n(74217).f,l=n(78870),u=n(59995),d=n(41080),s=n(7056),p=!1,m=d("meta"),f=0,h=Object.isExtensible||function(){return!0},g=function(e){c(e,m,{value:{objectID:"O"+f++,weakData:{}}})},C=e.exports={enable:function(){C.enable=function(){},p=!0;var e=l.f,t=[].splice,n={};n[m]=1,e(n).length&&(l.f=function(n){for(var o=e(n),r=0,a=o.length;r<a;r++)if(o[r]===m){t.call(o,r,1);break}return o},o({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,m)){if(!h(e))return"F";if(!t)return"E";g(e)}return e[m].objectID},getWeakData:function(e,t){if(!i(e,m)){if(!h(e))return!0;if(!t)return!1;g(e)}return e[m].weakData},onFreeze:function(e){return s&&p&&h(e)&&!i(e,m)&&g(e),e}};r[m]=!0},79947:function(e,t,n){"use strict";var o,r,a,i=n(82911),c=n(84253),l=n(35611),u=n(52188),d=n(28919),s=n(55935),p=n(85152),m=n(90311),f="Object already initialized",h=c.WeakMap;if(i||s.state){var g=s.state||(s.state=new h),C=g.get,N=g.has,v=g.set;o=function(e,t){if(N.call(g,e))throw new TypeError(f);return t.facade=e,v.call(g,e,t),t},r=function(e){return C.call(g,e)||{}},a=function(e){return N.call(g,e)}}else{var b=p("state");m[b]=!0,o=function(e,t){if(d(e,b))throw new TypeError(f);return t.facade=e,u(e,b,t),t},r=function(e){return d(e,b)?e[b]:{}},a=function(e){return d(e,b)}}e.exports={set:o,get:r,has:a,enforce:function(e){return a(e)?r(e):o(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},14195:function(e,t,n){"use strict";var o=n(17657),r=n(82723),a=o("iterator"),i=Array.prototype;e.exports=function(e){return e!==undefined&&(r.Array===e||i[a]===e)}},89999:function(e,t,n){"use strict";var o=n(77e3);e.exports=Array.isArray||function(e){return"Array"==o(e)}},41441:function(e,t,n){"use strict";var o=n(69691),r=/#|\.prototype\./,a=function(e,t){var n=c[i(e)];return n==u||n!=l&&("function"==typeof t?o(t):!!t)},i=a.normalize=function(e){return String(e).replace(r,".").toLowerCase()},c=a.data={},l=a.NATIVE="N",u=a.POLYFILL="P";e.exports=a},93624:function(e,t,n){"use strict";var o=n(35611),r=Math.floor;e.exports=function(e){return!o(e)&&isFinite(e)&&r(e)===e}},35611:function(e){"use strict";e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1986:function(e){"use strict";e.exports=!1},86133:function(e,t,n){"use strict";var o=n(35611),r=n(77e3),a=n(17657)("match");e.exports=function(e){var t;return o(e)&&((t=e[a])!==undefined?!!t:"RegExp"==r(e))}},78253:function(e,t,n){"use strict";var o=n(69808),r=n(40647);e.exports=r?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return"function"==typeof t&&Object(e)instanceof t}},56342:function(e,t,n){"use strict";var o=n(63518),r=n(14195),a=n(39570),i=n(74271),c=n(3170),l=n(61781),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var d,s,p,m,f,h,g,C=n&&n.that,N=!(!n||!n.AS_ENTRIES),v=!(!n||!n.IS_ITERATOR),b=!(!n||!n.INTERRUPTED),V=i(t,C,1+N+b),y=function(e){return d&&l(d),new u(!0,e)},x=function(e){return N?(o(e),b?V(e[0],e[1],y):V(e[0],e[1])):b?V(e,y):V(e)};if(v)d=e;else{if("function"!=typeof(s=c(e)))throw TypeError("Target is not iterable");if(r(s)){for(p=0,m=a(e.length);m>p;p++)if((f=x(e[p]))&&f instanceof u)return f;return new u(!1)}d=s.call(e)}for(h=d.next;!(g=h.call(d)).done;){try{f=x(g.value)}catch(I){throw l(d),I}if("object"==typeof f&&f&&f instanceof u)return f}return new u(!1)}},61781:function(e,t,n){"use strict";var o=n(63518);e.exports=function(e){var t=e["return"];if(t!==undefined)return o(t.call(e)).value}},39881:function(e,t,n){"use strict";var o,r,a,i=n(69691),c=n(6863),l=n(52188),u=n(28919),d=n(17657),s=n(1986),p=d("iterator"),m=!1;[].keys&&("next"in(a=[].keys())?(r=c(c(a)))!==Object.prototype&&(o=r):m=!0);var f=o==undefined||i((function(){var e={};return o[p].call(e)!==e}));f&&(o={}),s&&!f||u(o,p)||l(o,p,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:m}},82723:function(e){"use strict";e.exports={}},19997:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:n(e)-1}:t},43334:function(e,t,n){"use strict";var o=n(24305),r=Math.abs,a=Math.pow,i=a(2,-52),c=a(2,-23),l=a(2,127)*(2-c),u=a(2,-126);e.exports=Math.fround||function(e){var t,n,a=r(e),d=o(e);return a<u?d*(a/u/c+1/i-1/i)*u*c:(n=(t=(1+c/i)*a)-(t-a))>l||n!=n?d*Infinity:d*n}},83659:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:t(1+e)}},24305:function(e){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},80909:function(e,t,n){"use strict";var o,r,a,i,c,l,u,d,s=n(84253),p=n(22245).f,m=n(33453).set,f=n(24542),h=n(20037),g=n(47501),C=n(41488),N=s.MutationObserver||s.WebKitMutationObserver,v=s.document,b=s.process,V=s.Promise,y=p(s,"queueMicrotask"),x=y&&y.value;x||(o=function(){var e,t;for(C&&(e=b.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?i():a=undefined,n}}a=undefined,e&&e.enter()},f||C||g||!N||!v?!h&&V&&V.resolve?((u=V.resolve(undefined)).constructor=V,d=u.then,i=function(){d.call(u,o)}):i=C?function(){b.nextTick(o)}:function(){m.call(s,o)}:(c=!0,l=v.createTextNode(""),new N(o).observe(l,{characterData:!0}),i=function(){l.data=c=!c})),e.exports=x||function(e){var t={fn:e,next:undefined};a&&(a.next=t),r||(r=t,i()),a=t}},4302:function(e,t,n){"use strict";var o=n(84253);e.exports=o.Promise},54772:function(e,t,n){"use strict";var o=n(12338),r=n(69691);e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&o&&o<41}))},82911:function(e,t,n){"use strict";var o=n(84253),r=n(89853),a=o.WeakMap;e.exports="function"==typeof a&&/native code/.test(r(a))},82101:function(e,t,n){"use strict";var o=n(83923),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},18774:function(e,t,n){"use strict";var o=n(86133);e.exports=function(e){if(o(e))throw TypeError("The method doesn't accept regular expressions");return e}},64630:function(e,t,n){"use strict";var o=n(84253).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},78025:function(e,t,n){"use strict";var o=n(84253),r=n(92082),a=n(84703).trim,i=n(65181),c=o.parseFloat,l=1/c(i+"-0")!=-Infinity;e.exports=l?function(e){var t=a(r(e)),n=c(t);return 0===n&&"-"==t.charAt(0)?-0:n}:c},55092:function(e,t,n){"use strict";var o=n(84253),r=n(92082),a=n(84703).trim,i=n(65181),c=o.parseInt,l=/^[+-]?0[Xx]/,u=8!==c(i+"08")||22!==c(i+"0x16");e.exports=u?function(e,t){var n=a(r(e));return c(n,t>>>0||(l.test(n)?16:10))}:c},64905:function(e,t,n){"use strict";var o=n(75592),r=n(69691),a=n(84547),i=n(21061),c=n(77659),l=n(12104),u=n(50990),d=Object.assign,s=Object.defineProperty;e.exports=!d||r((function(){if(o&&1!==d({b:1},d(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=d({},e)[n]||a(d({},t)).join("")!=r}))?function(e,t){for(var n=l(e),r=arguments.length,d=1,s=i.f,p=c.f;r>d;)for(var m,f=u(arguments[d++]),h=s?a(f).concat(s(f)):a(f),g=h.length,C=0;g>C;)m=h[C++],o&&!p.call(f,m)||(n[m]=f[m]);return n}:d},83681:function(e,t,n){"use strict";var o,r=n(63518),a=n(91543),i=n(23344),c=n(90311),l=n(2369),u=n(21477),d=n(85152),s="prototype",p="script",m=d("IE_PROTO"),f=function(){},h=function(e){return"<"+p+">"+e+"</"+p+">"},g=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},C=function(){try{o=new ActiveXObject("htmlfile")}catch(t){}C=document.domain&&o?g(o):function(){var e,t=u("iframe"),n="java"+p+":";if(t.style)return t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F}()||g(o);for(var e=i.length;e--;)delete C[s][i[e]];return C()};c[m]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f[s]=r(e),n=new f,f[s]=null,n[m]=e):n=C(),t===undefined?n:a(n,t)}},91543:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(63518),i=n(84547);e.exports=o?Object.defineProperties:function(e,t){a(e);for(var n,o=i(t),c=o.length,l=0;c>l;)r.f(e,n=o[l++],t[n]);return e}},74217:function(e,t,n){"use strict";var o=n(75592),r=n(78251),a=n(63518),i=n(14613),c=Object.defineProperty;t.f=o?c:function(e,t,n){if(a(e),t=i(t),a(n),r)try{return c(e,t,n)}catch(o){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},22245:function(e,t,n){"use strict";var o=n(75592),r=n(77659),a=n(39160),i=n(26553),c=n(14613),l=n(28919),u=n(78251),d=Object.getOwnPropertyDescriptor;t.f=o?d:function(e,t){if(e=i(e),t=c(t),u)try{return d(e,t)}catch(n){}if(l(e,t))return a(!r.f.call(e,t),e[t])}},59995:function(e,t,n){"use strict";var o=n(26553),r=n(78870).f,a={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&"[object Window]"==a.call(e)?function(e){try{return r(e)}catch(t){return i.slice()}}(e):r(o(e))}},78870:function(e,t,n){"use strict";var o=n(3613),r=n(23344).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return o(e,r)}},21061:function(e,t){"use strict";t.f=Object.getOwnPropertySymbols},6863:function(e,t,n){"use strict";var o=n(28919),r=n(12104),a=n(85152),i=n(28954),c=a("IE_PROTO"),l=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=r(e),o(e,c)?e[c]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},3613:function(e,t,n){"use strict";var o=n(28919),r=n(26553),a=n(25945).indexOf,i=n(90311);e.exports=function(e,t){var n,c=r(e),l=0,u=[];for(n in c)!o(i,n)&&o(c,n)&&u.push(n);for(;t.length>l;)o(c,n=t[l++])&&(~a(u,n)||u.push(n));return u}},84547:function(e,t,n){"use strict";var o=n(3613),r=n(23344);e.exports=Object.keys||function(e){return o(e,r)}},77659:function(e,t){"use strict";var n={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,r=o&&!n.call({1:2},1);t.f=r?function(e){var t=o(this,e);return!!t&&t.enumerable}:n},47339:function(e,t,n){"use strict";var o=n(1986),r=n(84253),a=n(69691),i=n(12200);e.exports=o||!a((function(){if(!(i&&i<535)){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}}))},18444:function(e,t,n){"use strict";var o=n(63518),r=n(1372);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(a){}return function(n,a){return o(n),r(a),t?e.call(n,a):n.__proto__=a,n}}():undefined)},3e4:function(e,t,n){"use strict";var o=n(75592),r=n(84547),a=n(26553),i=n(77659).f,c=function(e){return function(t){for(var n,c=a(t),l=r(c),u=l.length,d=0,s=[];u>d;)n=l[d++],o&&!i.call(c,n)||s.push(e?[n,c[n]]:c[n]);return s}};e.exports={entries:c(!0),values:c(!1)}},13966:function(e,t,n){"use strict";var o=n(64910),r=n(47953);e.exports=o?{}.toString:function(){return"[object "+r(this)+"]"}},28734:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e,t){var n,r;if("string"===t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if("string"!==t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},28482:function(e,t,n){"use strict";var o=n(69808),r=n(78870),a=n(21061),i=n(63518);e.exports=o("Reflect","ownKeys")||function(e){var t=r.f(i(e)),n=a.f;return n?t.concat(n(e)):t}},65781:function(e,t,n){"use strict";var o=n(84253);e.exports=o},47673:function(e){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},48141:function(e,t,n){"use strict";var o=n(63518),r=n(35611),a=n(82101);e.exports=function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},3993:function(e,t,n){"use strict";var o=n(11807);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},11807:function(e,t,n){"use strict";var o=n(84253),r=n(52188),a=n(28919),i=n(30889),c=n(89853),l=n(79947),u=l.get,d=l.enforce,s=String(String).split("String");(e.exports=function(e,t,n,c){var l,u=!!c&&!!c.unsafe,p=!!c&&!!c.enumerable,m=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof t||a(n,"name")||r(n,"name",t),(l=d(n)).source||(l.source=s.join("string"==typeof t?t:""))),e!==o?(u?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:r(e,t,n)):p?e[t]=n:i(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||c(this)}))},5641:function(e,t,n){"use strict";var o=n(77e3),r=n(71841);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var a=n.call(e,t);if("object"!=typeof a)throw TypeError("RegExp exec method returned something other than an Object or null");return a}if("RegExp"!==o(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},71841:function(e,t,n){"use strict";var o,r,a=n(92082),i=n(5105),c=n(1864),l=n(27364),u=n(83681),d=n(79947).get,s=n(8368),p=n(2229),m=RegExp.prototype.exec,f=l("native-string-replace",String.prototype.replace),h=m,g=(o=/a/,r=/b*/g,m.call(o,"a"),m.call(r,"a"),0!==o.lastIndex||0!==r.lastIndex),C=c.UNSUPPORTED_Y||c.BROKEN_CARET,N=/()??/.exec("")[1]!==undefined;(g||N||C||s||p)&&(h=function(e){var t,n,o,r,c,l,s,p=this,v=d(p),b=a(e),V=v.raw;if(V)return V.lastIndex=p.lastIndex,t=h.call(V,b),p.lastIndex=V.lastIndex,t;var y=v.groups,x=C&&p.sticky,I=i.call(p),k=p.source,w=0,S=b;if(x&&(-1===(I=I.replace("y","")).indexOf("g")&&(I+="g"),S=b.slice(p.lastIndex),p.lastIndex>0&&(!p.multiline||p.multiline&&"\n"!==b.charAt(p.lastIndex-1))&&(k="(?: "+k+")",S=" "+S,w++),n=new RegExp("^(?:"+k+")",I)),N&&(n=new RegExp("^"+k+"$(?!\\s)",I)),g&&(o=p.lastIndex),r=m.call(x?n:p,S),x?r?(r.input=r.input.slice(w),r[0]=r[0].slice(w),r.index=p.lastIndex,p.lastIndex+=r[0].length):p.lastIndex=0:g&&r&&(p.lastIndex=p.global?r.index+r[0].length:o),N&&r&&r.length>1&&f.call(r[0],n,(function(){for(c=1;c<arguments.length-2;c++)arguments[c]===undefined&&(r[c]=undefined)})),r&&y)for(r.groups=l=u(null),c=0;c<y.length;c++)l[(s=y[c])[0]]=r[s[1]];return r}),e.exports=h},5105:function(e,t,n){"use strict";var o=n(63518);e.exports=function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},1864:function(e,t,n){"use strict";var o=n(69691),r=function(e,t){return RegExp(e,t)};t.UNSUPPORTED_Y=o((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=o((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},8368:function(e,t,n){"use strict";var o=n(69691);e.exports=o((function(){var e=RegExp(".","string".charAt(0));return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},2229:function(e,t,n){"use strict";var o=n(69691);e.exports=o((function(){var e=RegExp("(?<a>b)","string".charAt(5));return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},44184:function(e){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},61398:function(e){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},30889:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){try{Object.defineProperty(o,e,{value:t,configurable:!0,writable:!0})}catch(n){o[e]=t}return t}},64157:function(e,t,n){"use strict";var o=n(69808),r=n(74217),a=n(17657),i=n(75592),c=a("species");e.exports=function(e){var t=o(e),n=r.f;i&&t&&!t[c]&&n(t,c,{configurable:!0,get:function(){return this}})}},29108:function(e,t,n){"use strict";var o=n(74217).f,r=n(28919),a=n(17657)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,a)&&o(e,a,{configurable:!0,value:t})}},85152:function(e,t,n){"use strict";var o=n(27364),r=n(41080),a=o("keys");e.exports=function(e){return a[e]||(a[e]=r(e))}},55935:function(e,t,n){"use strict";var o=n(84253),r=n(30889),a="__core-js_shared__",i=o[a]||r(a,{});e.exports=i},27364:function(e,t,n){"use strict";var o=n(1986),r=n(55935);(e.exports=function(e,t){return r[e]||(r[e]=t!==undefined?t:{})})("versions",[]).push({version:"3.16.1",mode:o?"pure":"global",copyright:"\xa9 2021 Denis Pushkarev (zloirock.ru)"})},24345:function(e,t,n){"use strict";var o=n(63518),r=n(83923),a=n(17657)("species");e.exports=function(e,t){var n,i=o(e).constructor;return i===undefined||(n=o(i)[a])==undefined?t:r(n)}},26096:function(e,t,n){"use strict";var o=n(69691);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},37015:function(e,t,n){"use strict";var o=n(3997),r=n(92082),a=n(44184),i=function(e){return function(t,n){var i,c,l=r(a(t)),u=o(n),d=l.length;return u<0||u>=d?e?"":undefined:(i=l.charCodeAt(u))<55296||i>56319||u+1===d||(c=l.charCodeAt(u+1))<56320||c>57343?e?l.charAt(u):i:e?l.slice(u,u+2):c-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},43331:function(e,t,n){"use strict";var o=n(72319);e.exports=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(o)},47497:function(e,t,n){"use strict";var o=n(39570),r=n(92082),a=n(9811),i=n(44184),c=Math.ceil,l=function(e){return function(t,n,l){var u,d,s=r(i(t)),p=s.length,m=l===undefined?" ":r(l),f=o(n);return f<=p||""==m?s:(u=f-p,(d=a.call(m,c(u/m.length))).length>u&&(d=d.slice(0,u)),e?s+d:d+s)}};e.exports={start:l(!1),end:l(!0)}},9811:function(e,t,n){"use strict";var o=n(3997),r=n(92082),a=n(44184);e.exports=function(e){var t=r(a(this)),n="",i=o(e);if(i<0||i==Infinity)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},3035:function(e,t,n){"use strict";var o=n(69691),r=n(65181);e.exports=function(e){return o((function(){return!!r[e]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[e]()||r[e].name!==e}))}},84703:function(e,t,n){"use strict";var o=n(44184),r=n(92082),a="["+n(65181)+"]",i=RegExp("^"+a+a+"*"),c=RegExp(a+a+"*$"),l=function(e){return function(t){var n=r(o(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(c,"")),n}};e.exports={start:l(1),end:l(2),trim:l(3)}},33453:function(e,t,n){"use strict";var o,r,a,i,c=n(84253),l=n(69691),u=n(74271),d=n(2369),s=n(21477),p=n(24542),m=n(41488),f=c.setImmediate,h=c.clearImmediate,g=c.process,C=c.MessageChannel,N=c.Dispatch,v=0,b={},V="onreadystatechange";try{o=c.location}catch(w){}var y=function(e){if(b.hasOwnProperty(e)){var t=b[e];delete b[e],t()}},x=function(e){return function(){y(e)}},I=function(e){y(e.data)},k=function(e){c.postMessage(String(e),o.protocol+"//"+o.host)};f&&h||(f=function(e){for(var t=[],n=arguments.length,o=1;n>o;)t.push(arguments[o++]);return b[++v]=function(){("function"==typeof e?e:Function(e)).apply(undefined,t)},r(v),v},h=function(e){delete b[e]},m?r=function(e){g.nextTick(x(e))}:N&&N.now?r=function(e){N.now(x(e))}:C&&!p?(i=(a=new C).port2,a.port1.onmessage=I,r=u(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts&&o&&"file:"!==o.protocol&&!l(k)?(r=k,c.addEventListener("message",I,!1)):r=V in s("script")?function(e){d.appendChild(s("script"))[V]=function(){d.removeChild(this),y(e)}}:function(e){setTimeout(x(e),0)}),e.exports={set:f,clear:h}},81687:function(e,t,n){"use strict";var o=n(77e3);e.exports=function(e){if("number"!=typeof e&&"Number"!=o(e))throw TypeError("Incorrect invocation");return+e}},55205:function(e,t,n){"use strict";var o=n(3997),r=Math.max,a=Math.min;e.exports=function(e,t){var n=o(e);return n<0?r(n+t,0):a(n,t)}},77559:function(e,t,n){"use strict";var o=n(3997),r=n(39570);e.exports=function(e){if(e===undefined)return 0;var t=o(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},26553:function(e,t,n){"use strict";var o=n(50990),r=n(44184);e.exports=function(e){return o(r(e))}},3997:function(e){"use strict";var t=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:t)(e)}},39570:function(e,t,n){"use strict";var o=n(3997),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},12104:function(e,t,n){"use strict";var o=n(44184);e.exports=function(e){return Object(o(e))}},95740:function(e,t,n){"use strict";var o=n(80425);e.exports=function(e,t){var n=o(e);if(n%t)throw RangeError("Wrong offset");return n}},80425:function(e,t,n){"use strict";var o=n(3997);e.exports=function(e){var t=o(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},94673:function(e,t,n){"use strict";var o=n(35611),r=n(78253),a=n(28734),i=n(17657)("toPrimitive");e.exports=function(e,t){if(!o(e)||r(e))return e;var n,c=e[i];if(c!==undefined){if(t===undefined&&(t="default"),n=c.call(e,t),!o(n)||r(n))return n;throw TypeError("Can't convert object to primitive value")}return t===undefined&&(t="number"),a(e,t)}},14613:function(e,t,n){"use strict";var o=n(94673),r=n(78253);e.exports=function(e){var t=o(e,"string");return r(t)?t:String(t)}},64910:function(e,t,n){"use strict";var o={};o[n(17657)("toStringTag")]="z",e.exports="[object z]"===String(o)},92082:function(e,t,n){"use strict";var o=n(78253);e.exports=function(e){if(o(e))throw TypeError("Cannot convert a Symbol value to a string");return String(e)}},17576:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(75592),i=n(29023),c=n(19216),l=n(80246),u=n(50997),d=n(39160),s=n(52188),p=n(93624),m=n(39570),f=n(77559),h=n(95740),g=n(14613),C=n(28919),N=n(47953),v=n(35611),b=n(78253),V=n(83681),y=n(18444),x=n(78870).f,I=n(76182),k=n(69033).forEach,w=n(64157),S=n(74217),_=n(22245),M=n(79947),D=n(22285),B=M.get,A=M.set,T=S.f,L=_.f,E=Math.round,j=r.RangeError,P=l.ArrayBuffer,O=l.DataView,F=c.NATIVE_ARRAY_BUFFER_VIEWS,R=c.TYPED_ARRAY_CONSTRUCTOR,z=c.TYPED_ARRAY_TAG,W=c.TypedArray,U=c.TypedArrayPrototype,H=c.aTypedArrayConstructor,G=c.isTypedArray,Y="BYTES_PER_ELEMENT",Z="Wrong length",K=function(e,t){for(var n=0,o=t.length,r=new(H(e))(o);o>n;)r[n]=t[n++];return r},Q=function(e,t){T(e,t,{get:function(){return B(this)[t]}})},J=function(e){var t;return e instanceof P||"ArrayBuffer"==(t=N(e))||"SharedArrayBuffer"==t},X=function(e,t){return G(e)&&!b(t)&&t in e&&p(+t)&&t>=0},q=function(e,t){return t=g(t),X(e,t)?d(2,e[t]):L(e,t)},$=function(e,t,n){return t=g(t),!(X(e,t)&&v(n)&&C(n,"value"))||C(n,"get")||C(n,"set")||n.configurable||C(n,"writable")&&!n.writable||C(n,"enumerable")&&!n.enumerable?T(e,t,n):(e[t]=n.value,e)};a?(F||(_.f=q,S.f=$,Q(U,"buffer"),Q(U,"byteOffset"),Q(U,"byteLength"),Q(U,"length")),o({target:"Object",stat:!0,forced:!F},{getOwnPropertyDescriptor:q,defineProperty:$}),e.exports=function(e,t,n){var a=e.match(/\d+$/)[0]/8,c=e+(n?"Clamped":"")+"Array",l="get"+e,d="set"+e,p=r[c],g=p,C=g&&g.prototype,N={},b=function(e,t){T(e,t,{get:function(){return function(e,t){var n=B(e);return n.view[l](t*a+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,o){var r=B(e);n&&(o=(o=E(o))<0?0:o>255?255:255&o),r.view[d](t*a+r.byteOffset,o,!0)}(this,t,e)},enumerable:!0})};F?i&&(g=t((function(e,t,n,o){return u(e,g,c),D(v(t)?J(t)?o!==undefined?new p(t,h(n,a),o):n!==undefined?new p(t,h(n,a)):new p(t):G(t)?K(g,t):I.call(g,t):new p(f(t)),e,g)})),y&&y(g,W),k(x(p),(function(e){e in g||s(g,e,p[e])})),g.prototype=C):(g=t((function(e,t,n,o){u(e,g,c);var r,i,l,d=0,s=0;if(v(t)){if(!J(t))return G(t)?K(g,t):I.call(g,t);r=t,s=h(n,a);var p=t.byteLength;if(o===undefined){if(p%a)throw j(Z);if((i=p-s)<0)throw j(Z)}else if((i=m(o)*a)+s>p)throw j(Z);l=i/a}else l=f(t),r=new P(i=l*a);for(A(e,{buffer:r,byteOffset:s,byteLength:i,length:l,view:new O(r)});d<l;)b(e,d++)})),y&&y(g,W),C=g.prototype=V(U)),C.constructor!==g&&s(C,"constructor",g),s(C,R,g),z&&s(C,z,c),N[c]=g,o({global:!0,forced:g!=p,sham:!F},N),Y in g||s(g,Y,a),Y in C||s(C,Y,a),w(c)}):e.exports=function(){}},29023:function(e,t,n){"use strict";var o=n(84253),r=n(69691),a=n(68762),i=n(19216).NATIVE_ARRAY_BUFFER_VIEWS,c=o.ArrayBuffer,l=o.Int8Array;e.exports=!i||!r((function(){l(1)}))||!r((function(){new l(-1)}))||!a((function(e){new l,new l(null),new l(1.5),new l(e)}),!0)||r((function(){return 1!==new l(new c(2),1,undefined).length}))},16688:function(e,t,n){"use strict";var o=n(11955),r=n(25198);e.exports=function(e,t){return o(r(e),t)}},76182:function(e,t,n){"use strict";var o=n(12104),r=n(39570),a=n(3170),i=n(14195),c=n(74271),l=n(19216).aTypedArrayConstructor;e.exports=function(e){var t,n,u,d,s,p,m=o(e),f=arguments.length,h=f>1?arguments[1]:undefined,g=h!==undefined,C=a(m);if(C!=undefined&&!i(C))for(p=(s=C.call(m)).next,m=[];!(d=p.call(s)).done;)m.push(d.value);for(g&&f>2&&(h=c(h,arguments[2],2)),n=r(m.length),u=new(l(this))(n),t=0;n>t;t++)u[t]=g?h(m[t],t):m[t];return u}},25198:function(e,t,n){"use strict";var o=n(19216),r=n(24345),a=o.TYPED_ARRAY_CONSTRUCTOR,i=o.aTypedArrayConstructor;e.exports=function(e){return i(r(e,e[a]))}},41080:function(e){"use strict";var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(e===undefined?"":e)+")_"+(++t+n).toString(36)}},40647:function(e,t,n){"use strict";var o=n(54772);e.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3444:function(e,t,n){"use strict";var o=n(17657);t.f=o},17657:function(e,t,n){"use strict";var o=n(84253),r=n(27364),a=n(28919),i=n(41080),c=n(54772),l=n(40647),u=r("wks"),d=o.Symbol,s=l?d:d&&d.withoutSetter||i;e.exports=function(e){return a(u,e)&&(c||"string"==typeof u[e])||(c&&a(d,e)?u[e]=d[e]:u[e]=s("Symbol."+e)),u[e]}},65181:function(e){"use strict";e.exports="\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},15196:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(80246),i=n(64157),c="ArrayBuffer",l=a[c];o({global:!0,forced:r[c]!==l},{ArrayBuffer:l}),i(c)},95993:function(e,t,n){"use strict";var o=n(56174),r=n(19216);o({target:"ArrayBuffer",stat:!0,forced:!r.NATIVE_ARRAY_BUFFER_VIEWS},{isView:r.isView})},25079:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(80246),i=n(63518),c=n(55205),l=n(39570),u=n(24345),d=a.ArrayBuffer,s=a.DataView,p=d.prototype.slice;o({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:r((function(){return!new d(2).slice(1,undefined).byteLength}))},{slice:function(e,t){if(p!==undefined&&t===undefined)return p.call(i(this),e);for(var n=i(this).byteLength,o=c(e,n),r=c(t===undefined?n:t,n),a=new(u(this,d))(l(r-o)),m=new s(this),f=new s(a),h=0;o<r;)f.setUint8(h++,m.getUint8(o++));return a}})},24835:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(89999),i=n(35611),c=n(12104),l=n(39570),u=n(39241),d=n(77454),s=n(93537),p=n(17657),m=n(12338),f=p("isConcatSpreadable"),h=9007199254740991,g="Maximum allowed index exceeded",C=m>=51||!r((function(){var e=[];return e[f]=!1,e.concat()[0]!==e})),N=s("concat"),v=function(e){if(!i(e))return!1;var t=e[f];return t!==undefined?!!t:a(e)};o({target:"Array",proto:!0,forced:!C||!N},{concat:function(e){var t,n,o,r,a,i=c(this),s=d(i,0),p=0;for(t=-1,o=arguments.length;t<o;t++)if(v(a=-1===t?i:arguments[t])){if(p+(r=l(a.length))>h)throw TypeError(g);for(n=0;n<r;n++,p++)n in a&&u(s,p,a[n])}else{if(p>=h)throw TypeError(g);u(s,p++,a)}return s.length=p,s}})},14653:function(e,t,n){"use strict";var o=n(56174),r=n(59571),a=n(36910);o({target:"Array",proto:!0},{copyWithin:r}),a("copyWithin")},58139:function(e,t,n){"use strict";var o=n(56174),r=n(69033).every;o({target:"Array",proto:!0,forced:!n(37902)("every")},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},34049:function(e,t,n){"use strict";var o=n(56174),r=n(22051),a=n(36910);o({target:"Array",proto:!0},{fill:r}),a("fill")},38356:function(e,t,n){"use strict";var o=n(56174),r=n(69033).filter;o({target:"Array",proto:!0,forced:!n(93537)("filter")},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},31699:function(e,t,n){"use strict";var o=n(56174),r=n(69033).findIndex,a=n(36910),i="findIndex",c=!0;i in[]&&Array(1)[i]((function(){c=!1})),o({target:"Array",proto:!0,forced:c},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a(i)},72494:function(e,t,n){"use strict";var o=n(56174),r=n(69033).find,a=n(36910),i="find",c=!0;i in[]&&Array(1)[i]((function(){c=!1})),o({target:"Array",proto:!0,forced:c},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a(i)},81520:function(e,t,n){"use strict";var o=n(56174),r=n(904),a=n(12104),i=n(39570),c=n(83923),l=n(77454);o({target:"Array",proto:!0},{flatMap:function(e){var t,n=a(this),o=i(n.length);return c(e),(t=l(n,0)).length=r(t,n,n,o,0,1,e,arguments.length>1?arguments[1]:undefined),t}})},3263:function(e,t,n){"use strict";var o=n(56174),r=n(904),a=n(12104),i=n(39570),c=n(3997),l=n(77454);o({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:undefined,t=a(this),n=i(t.length),o=l(t,0);return o.length=r(o,t,t,n,0,e===undefined?1:c(e)),o}})},80036:function(e,t,n){"use strict";var o=n(56174),r=n(90369);o({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},60515:function(e,t,n){"use strict";var o=n(56174),r=n(28213);o({target:"Array",stat:!0,forced:!n(68762)((function(e){Array.from(e)}))},{from:r})},94330:function(e,t,n){"use strict";var o=n(56174),r=n(25945).includes,a=n(36910);o({target:"Array",proto:!0},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a("includes")},96553:function(e,t,n){"use strict";var o=n(56174),r=n(25945).indexOf,a=n(37902),i=[].indexOf,c=!!i&&1/[1].indexOf(1,-0)<0,l=a("indexOf");o({target:"Array",proto:!0,forced:c||!l},{indexOf:function(e){return c?i.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:undefined)}})},99139:function(e,t,n){"use strict";n(56174)({target:"Array",stat:!0},{isArray:n(89999)})},98215:function(e,t,n){"use strict";var o=n(26553),r=n(36910),a=n(82723),i=n(79947),c=n(71179),l="Array Iterator",u=i.set,d=i.getterFor(l);e.exports=c(Array,"Array",(function(e,t){u(this,{type:l,target:o(e),index:0,kind:t})}),(function(){var e=d(this),t=e.target,n=e.kind,o=e.index++;return!t||o>=t.length?(e.target=undefined,{value:undefined,done:!0}):"keys"==n?{value:o,done:!1}:"values"==n?{value:t[o],done:!1}:{value:[o,t[o]],done:!1}}),"values"),a.Arguments=a.Array,r("keys"),r("values"),r("entries")},32617:function(e,t,n){"use strict";var o=n(56174),r=n(50990),a=n(26553),i=n(37902),c=[].join,l=r!=Object,u=i("join",",");o({target:"Array",proto:!0,forced:l||!u},{join:function(e){return c.call(a(this),e===undefined?",":e)}})},80186:function(e,t,n){"use strict";var o=n(56174),r=n(41183);o({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},31149:function(e,t,n){"use strict";var o=n(56174),r=n(69033).map;o({target:"Array",proto:!0,forced:!n(93537)("map")},{map:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},71827:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(39241);o({target:"Array",stat:!0,forced:r((function(){function e(){}return!(Array.of.call(e)instanceof e)}))},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)a(n,e,arguments[e++]);return n.length=t,n}})},32099:function(e,t,n){"use strict";var o=n(56174),r=n(28249).right,a=n(37902),i=n(12338),c=n(41488);o({target:"Array",proto:!0,forced:!a("reduceRight")||!c&&i>79&&i<83},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},79770:function(e,t,n){"use strict";var o=n(56174),r=n(28249).left,a=n(37902),i=n(12338),c=n(41488);o({target:"Array",proto:!0,forced:!a("reduce")||!c&&i>79&&i<83},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},72667:function(e,t,n){"use strict";var o=n(56174),r=n(89999),a=[].reverse,i=[1,2];o({target:"Array",proto:!0,forced:String(i)===String(i.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),a.call(this)}})},94920:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(89999),i=n(55205),c=n(39570),l=n(26553),u=n(39241),d=n(17657),s=n(93537)("slice"),p=d("species"),m=[].slice,f=Math.max;o({target:"Array",proto:!0,forced:!s},{slice:function(e,t){var n,o,d,s=l(this),h=c(s.length),g=i(e,h),C=i(t===undefined?h:t,h);if(a(s)&&("function"!=typeof(n=s.constructor)||n!==Array&&!a(n.prototype)?r(n)&&null===(n=n[p])&&(n=undefined):n=undefined,n===Array||n===undefined))return m.call(s,g,C);for(o=new(n===undefined?Array:n)(f(C-g,0)),d=0;g<C;g++,d++)g in s&&u(o,d,s[g]);return o.length=d,o}})},64683:function(e,t,n){"use strict";var o=n(56174),r=n(69033).some;o({target:"Array",proto:!0,forced:!n(37902)("some")},{some:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},26189:function(e,t,n){"use strict";var o=n(56174),r=n(83923),a=n(12104),i=n(39570),c=n(92082),l=n(69691),u=n(58737),d=n(37902),s=n(20967),p=n(85749),m=n(12338),f=n(12200),h=[],g=h.sort,C=l((function(){h.sort(undefined)})),N=l((function(){h.sort(null)})),v=d("sort"),b=!l((function(){if(m)return m<70;if(!(s&&s>3)){if(p)return!0;if(f)return f<603;var e,t,n,o,r="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(o=0;o<47;o++)h.push({k:t+o,v:n})}for(h.sort((function(e,t){return t.v-e.v})),o=0;o<h.length;o++)t=h[o].k.charAt(0),r.charAt(r.length-1)!==t&&(r+=t);return"DGBEFHACIJK"!==r}}));o({target:"Array",proto:!0,forced:C||!N||!v||!b},{sort:function(e){e!==undefined&&r(e);var t=a(this);if(b)return e===undefined?g.call(t):g.call(t,e);var n,o,l=[],d=i(t.length);for(o=0;o<d;o++)o in t&&l.push(t[o]);for(l=u(l,function(e){return function(t,n){return n===undefined?-1:t===undefined?1:e!==undefined?+e(t,n)||0:c(t)>c(n)?1:-1}}(e)),n=l.length,o=0;o<n;)t[o]=l[o++];for(;o<d;)delete t[o++];return t}})},41185:function(e,t,n){"use strict";n(64157)("Array")},51008:function(e,t,n){"use strict";var o=n(56174),r=n(55205),a=n(3997),i=n(39570),c=n(12104),l=n(77454),u=n(39241),d=n(93537)("splice"),s=Math.max,p=Math.min;o({target:"Array",proto:!0,forced:!d},{splice:function(e,t){var n,o,d,m,f,h,g=c(this),C=i(g.length),N=r(e,C),v=arguments.length;if(0===v?n=o=0:1===v?(n=0,o=C-N):(n=v-2,o=p(s(a(t),0),C-N)),C+n-o>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(d=l(g,o),m=0;m<o;m++)(f=N+m)in g&&u(d,m,g[f]);if(d.length=o,n<o){for(m=N;m<C-o;m++)h=m+n,(f=m+o)in g?g[h]=g[f]:delete g[h];for(m=C;m>C-o+n;m--)delete g[m-1]}else if(n>o)for(m=C-o;m>N;m--)h=m+n-1,(f=m+o-1)in g?g[h]=g[f]:delete g[h];for(m=0;m<n;m++)g[m+N]=arguments[m+2];return g.length=C-o+n,d}})},86e3:function(e,t,n){"use strict";n(36910)("flatMap")},47112:function(e,t,n){"use strict";n(36910)("flat")},87143:function(e,t,n){"use strict";var o=n(56174),r=n(80246);o({global:!0,forced:!n(32977)},{DataView:r.DataView})},72499:function(e,t,n){"use strict";n(56174)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},73676:function(e,t,n){"use strict";var o=n(56174),r=n(79873);o({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},76746:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(12104),i=n(94673);o({target:"Date",proto:!0,forced:r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=a(this),n=i(t,"number");return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},19:function(e,t,n){"use strict";var o=n(52188),r=n(57763),a=n(17657)("toPrimitive"),i=Date.prototype;a in i||o(i,a,r)},17038:function(e,t,n){"use strict";var o=n(11807),r=Date.prototype,a="Invalid Date",i="toString",c=r[i],l=r.getTime;String(new Date(NaN))!=a&&o(r,i,(function(){var e=l.call(this);return e==e?c.call(this):a}))},46360:function(e,t,n){"use strict";n(56174)({target:"Function",proto:!0},{bind:n(68719)})},16835:function(e,t,n){"use strict";var o=n(35611),r=n(74217),a=n(6863),i=n(17657)("hasInstance"),c=Function.prototype;i in c||r.f(c,i,{value:function(e){if("function"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=a(e);)if(this.prototype===e)return!0;return!1}})},96683:function(e,t,n){"use strict";var o=n(75592),r=n(74217).f,a=Function.prototype,i=a.toString,c=/^\s*function ([^ (]*)/,l="name";o&&!(l in a)&&r(a,l,{configurable:!0,get:function(){try{return i.call(this).match(c)[1]}catch(e){return""}}})},7756:function(e,t,n){"use strict";var o=n(84253);n(29108)(o.JSON,"JSON",!0)},21842:function(e,t,n){"use strict";var o=n(42006),r=n(74568);e.exports=o("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},1613:function(e,t,n){"use strict";var o=n(56174),r=n(83659),a=Math.acosh,i=Math.log,c=Math.sqrt,l=Math.LN2;o({target:"Math",stat:!0,forced:!a||710!=Math.floor(a(Number.MAX_VALUE))||a(Infinity)!=Infinity},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?i(e)+l:r(e-1+c(e-1)*c(e+1))}})},65115:function(e,t,n){"use strict";var o=n(56174),r=Math.asinh,a=Math.log,i=Math.sqrt;o({target:"Math",stat:!0,forced:!(r&&1/r(0)>0)},{asinh:function c(e){return isFinite(e=+e)&&0!=e?e<0?-c(-e):a(e+i(e*e+1)):e}})},27115:function(e,t,n){"use strict";var o=n(56174),r=Math.atanh,a=Math.log;o({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:a((1+e)/(1-e))/2}})},13280:function(e,t,n){"use strict";var o=n(56174),r=n(24305),a=Math.abs,i=Math.pow;o({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*i(a(e),1/3)}})},21019:function(e,t,n){"use strict";var o=n(56174),r=Math.floor,a=Math.log,i=Math.LOG2E;o({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(a(e+.5)*i):32}})},66619:function(e,t,n){"use strict";var o=n(56174),r=n(19997),a=Math.cosh,i=Math.abs,c=Math.E;o({target:"Math",stat:!0,forced:!a||a(710)===Infinity},{cosh:function(e){var t=r(i(e)-1)+1;return(t+1/(t*c*c))*(c/2)}})},75469:function(e,t,n){"use strict";var o=n(56174),r=n(19997);o({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},90967:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{fround:n(43334)})},35022:function(e,t,n){"use strict";var o=n(56174),r=Math.hypot,a=Math.abs,i=Math.sqrt;o({target:"Math",stat:!0,forced:!!r&&r(Infinity,NaN)!==Infinity},{hypot:function(e,t){for(var n,o,r=0,c=0,l=arguments.length,u=0;c<l;)u<(n=a(arguments[c++]))?(r=r*(o=u/n)*o+1,u=n):r+=n>0?(o=n/u)*o:n;return u===Infinity?Infinity:u*i(r)}})},22604:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=Math.imul;o({target:"Math",stat:!0,forced:r((function(){return-5!=a(4294967295,5)||2!=a.length}))},{imul:function(e,t){var n=65535,o=+e,r=+t,a=n&o,i=n&r;return 0|a*i+((n&o>>>16)*i+a*(n&r>>>16)<<16>>>0)}})},41843:function(e,t,n){"use strict";var o=n(56174),r=Math.log,a=Math.LOG10E;o({target:"Math",stat:!0},{log10:function(e){return r(e)*a}})},86810:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{log1p:n(83659)})},54670:function(e,t,n){"use strict";var o=n(56174),r=Math.log,a=Math.LN2;o({target:"Math",stat:!0},{log2:function(e){return r(e)/a}})},16580:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{sign:n(24305)})},31304:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(19997),i=Math.abs,c=Math.exp,l=Math.E;o({target:"Math",stat:!0,forced:r((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(e){return i(e=+e)<1?(a(e)-a(-e))/2:(c(e-1)-c(-e-1))*(l/2)}})},13078:function(e,t,n){"use strict";var o=n(56174),r=n(19997),a=Math.exp;o({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==Infinity?1:n==Infinity?-1:(t-n)/(a(e)+a(-e))}})},45128:function(e,t,n){"use strict";n(29108)(Math,"Math",!0)},31938:function(e,t,n){"use strict";var o=n(56174),r=Math.ceil,a=Math.floor;o({target:"Math",stat:!0},{trunc:function(e){return(e>0?a:r)(e)}})},90958:function(e,t,n){"use strict";var o=n(75592),r=n(84253),a=n(41441),i=n(11807),c=n(28919),l=n(77e3),u=n(22285),d=n(78253),s=n(94673),p=n(69691),m=n(83681),f=n(78870).f,h=n(22245).f,g=n(74217).f,C=n(84703).trim,N="Number",v=r[N],b=v.prototype,V=l(m(b))==N,y=function(e){if(d(e))throw TypeError("Cannot convert a Symbol value to a number");var t,n,o,r,a,i,c,l,u=s(e,"number");if("string"==typeof u&&u.length>2)if(43===(t=(u=C(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:o=2,r=49;break;case 79:case 111:o=8,r=55;break;default:return+u}for(i=(a=u.slice(2)).length,c=0;c<i;c++)if((l=a.charCodeAt(c))<48||l>r)return NaN;return parseInt(a,o)}return+u};if(a(N,!v(" 0o1")||!v("0b1")||v("+0x1"))){for(var x,I=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof I&&(V?p((function(){b.valueOf.call(n)})):l(n)!=N)?u(new v(y(t)),n,I):y(t)},k=o?f(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range".split(","),w=0;k.length>w;w++)c(v,x=k[w])&&!c(I,x)&&g(I,x,h(v,x));I.prototype=b,b.constructor=I,i(r,N,I)}},88885:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},45017:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isFinite:n(64630)})},59743:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isInteger:n(93624)})},47560:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},31569:function(e,t,n){"use strict";var o=n(56174),r=n(93624),a=Math.abs;o({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&a(e)<=9007199254740991}})},6134:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},12622:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},60852:function(e,t,n){"use strict";var o=n(56174),r=n(78025);o({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},99085:function(e,t,n){"use strict";var o=n(56174),r=n(55092);o({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},75180:function(e,t,n){"use strict";var o=n(56174),r=n(3997),a=n(81687),i=n(9811),c=n(69691),l=1..toFixed,u=Math.floor,d=function f(e,t,n){return 0===t?n:t%2==1?f(e,t-1,n*e):f(e*e,t/2,n)},s=function(e,t,n){for(var o=-1,r=n;++o<6;)r+=t*e[o],e[o]=r%1e7,r=u(r/1e7)},p=function(e,t){for(var n=6,o=0;--n>=0;)o+=e[n],e[n]=u(o/t),o=o%t*1e7},m=function(e){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==e[t]){var o=String(e[t]);n=""===n?o:n+i.call("0",7-o.length)+o}return n};o({target:"Number",proto:!0,forced:l&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!c((function(){l.call({})}))},{toFixed:function(e){var t,n,o,c,l=a(this),u=r(e),f=[0,0,0,0,0,0],h="",g="0";if(u<0||u>20)throw RangeError("Incorrect fraction digits");if(l!=l)return"NaN";if(l<=-1e21||l>=1e21)return String(l);if(l<0&&(h="-",l=-l),l>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(l*d(2,69,1))-69)<0?l*d(2,-t,1):l/d(2,t,1),n*=4503599627370496,(t=52-t)>0){for(s(f,0,n),o=u;o>=7;)s(f,1e7,0),o-=7;for(s(f,d(10,o,1),0),o=t-1;o>=23;)p(f,1<<23),o-=23;p(f,1<<o),s(f,1,1),p(f,2),g=m(f)}else s(f,0,n),s(f,1<<-t,0),g=m(f)+i.call("0",u);return g=u>0?h+((c=g.length)<=u?"0."+i.call("0",u-c)+g:g.slice(0,c-u)+"."+g.slice(c-u)):h+g}})},79437:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(81687),i=1..toPrecision;o({target:"Number",proto:!0,forced:r((function(){return"1"!==i.call(1,undefined)}))||!r((function(){i.call({})}))},{toPrecision:function(e){return e===undefined?i.call(a(this)):i.call(a(this),e)}})},75370:function(e,t,n){"use strict";var o=n(56174),r=n(64905);o({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},61022:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0,sham:!n(75592)},{create:n(83681)})},50580:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(83923),l=n(74217);r&&o({target:"Object",proto:!0,forced:a},{__defineGetter__:function(e,t){l.f(i(this),e,{get:c(t),enumerable:!0,configurable:!0})}})},5301:function(e,t,n){"use strict";var o=n(56174),r=n(75592);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:n(91543)})},76438:function(e,t,n){"use strict";var o=n(56174),r=n(75592);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:n(74217).f})},97307:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(83923),l=n(74217);r&&o({target:"Object",proto:!0,forced:a},{__defineSetter__:function(e,t){l.f(i(this),e,{set:c(t),enumerable:!0,configurable:!0})}})},34016:function(e,t,n){"use strict";var o=n(56174),r=n(3e4).entries;o({target:"Object",stat:!0},{entries:function(e){return r(e)}})},86944:function(e,t,n){"use strict";var o=n(56174),r=n(7056),a=n(69691),i=n(35611),c=n(40421).onFreeze,l=Object.freeze;o({target:"Object",stat:!0,forced:a((function(){l(1)})),sham:!r},{freeze:function(e){return l&&i(e)?l(c(e)):e}})},60687:function(e,t,n){"use strict";var o=n(56174),r=n(56342),a=n(39241);o({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){a(t,e,n)}),{AS_ENTRIES:!0}),t}})},86957:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(26553),i=n(22245).f,c=n(75592),l=r((function(){i(1)}));o({target:"Object",stat:!0,forced:!c||l,sham:!c},{getOwnPropertyDescriptor:function(e,t){return i(a(e),t)}})},59163:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(28482),i=n(26553),c=n(22245),l=n(39241);o({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){for(var t,n,o=i(e),r=c.f,u=a(o),d={},s=0;u.length>s;)(n=r(o,t=u[s++]))!==undefined&&l(d,t,n);return d}})},34128:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(59995).f;o({target:"Object",stat:!0,forced:r((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:a})},24267:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(12104),i=n(6863),c=n(28954);o({target:"Object",stat:!0,forced:r((function(){i(1)})),sham:!c},{getPrototypeOf:function(e){return i(a(e))}})},4239:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isExtensible;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isExtensible:function(e){return!!a(e)&&(!i||i(e))}})},8381:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isFrozen;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isFrozen:function(e){return!a(e)||!!i&&i(e)}})},63669:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isSealed;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isSealed:function(e){return!a(e)||!!i&&i(e)}})},39816:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0},{is:n(61398)})},25779:function(e,t,n){"use strict";var o=n(56174),r=n(12104),a=n(84547);o({target:"Object",stat:!0,forced:n(69691)((function(){a(1)}))},{keys:function(e){return a(r(e))}})},84580:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(14613),l=n(6863),u=n(22245).f;r&&o({target:"Object",proto:!0,forced:a},{__lookupGetter__:function(e){var t,n=i(this),o=c(e);do{if(t=u(n,o))return t.get}while(n=l(n))}})},33198:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(14613),l=n(6863),u=n(22245).f;r&&o({target:"Object",proto:!0,forced:a},{__lookupSetter__:function(e){var t,n=i(this),o=c(e);do{if(t=u(n,o))return t.set}while(n=l(n))}})},71895:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(40421).onFreeze,i=n(7056),c=n(69691),l=Object.preventExtensions;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!i},{preventExtensions:function(e){return l&&r(e)?l(a(e)):e}})},44910:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(40421).onFreeze,i=n(7056),c=n(69691),l=Object.seal;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!i},{seal:function(e){return l&&r(e)?l(a(e)):e}})},95962:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0},{setPrototypeOf:n(18444)})},73769:function(e,t,n){"use strict";var o=n(64910),r=n(11807),a=n(13966);o||r(Object.prototype,"toString",a,{unsafe:!0})},14962:function(e,t,n){"use strict";var o=n(56174),r=n(3e4).values;o({target:"Object",stat:!0},{values:function(e){return r(e)}})},80345:function(e,t,n){"use strict";var o=n(56174),r=n(78025);o({global:!0,forced:parseFloat!=r},{parseFloat:r})},18438:function(e,t,n){"use strict";var o=n(56174),r=n(55092);o({global:!0,forced:parseInt!=r},{parseInt:r})},46356:function(e,t,n){"use strict";var o=n(56174),r=n(1986),a=n(4302),i=n(69691),c=n(69808),l=n(24345),u=n(48141),d=n(11807);if(o({target:"Promise",proto:!0,real:!0,forced:!!a&&i((function(){a.prototype["finally"].call({then:function(){}},(function(){}))}))},{"finally":function(e){var t=l(this,c("Promise")),n="function"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),!r&&"function"==typeof a){var s=c("Promise").prototype["finally"];a.prototype["finally"]!==s&&d(a.prototype,"finally",s,{unsafe:!0})}},70552:function(e,t,n){"use strict";var o,r,a,i,c=n(56174),l=n(1986),u=n(84253),d=n(69808),s=n(4302),p=n(11807),m=n(3993),f=n(18444),h=n(29108),g=n(64157),C=n(35611),N=n(83923),v=n(50997),b=n(89853),V=n(56342),y=n(68762),x=n(24345),I=n(33453).set,k=n(80909),w=n(48141),S=n(21419),_=n(82101),M=n(47673),D=n(79947),B=n(41441),A=n(17657),T=n(46392),L=n(41488),E=n(12338),j=A("species"),P="Promise",O=D.get,F=D.set,R=D.getterFor(P),z=s&&s.prototype,W=s,U=z,H=u.TypeError,G=u.document,Y=u.process,Z=_.f,K=Z,Q=!!(G&&G.createEvent&&u.dispatchEvent),J="function"==typeof PromiseRejectionEvent,X="unhandledrejection",q=!1,$=B(P,(function(){var e=b(W),t=e!==String(W);if(!t&&66===E)return!0;if(l&&!U["finally"])return!0;if(E>=51&&/native code/.test(e))return!1;var n=new W((function(e){e(1)})),o=function(e){e((function(){}),(function(){}))};return(n.constructor={})[j]=o,!(q=n.then((function(){}))instanceof o)||!t&&T&&!J})),ee=$||!y((function(e){W.all(e)["catch"]((function(){}))})),te=function(e){var t;return!(!C(e)||"function"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;k((function(){for(var o=e.value,r=1==e.state,a=0;n.length>a;){var i,c,l,u=n[a++],d=r?u.ok:u.fail,s=u.resolve,p=u.reject,m=u.domain;try{d?(r||(2===e.rejection&&ie(e),e.rejection=1),!0===d?i=o:(m&&m.enter(),i=d(o),m&&(m.exit(),l=!0)),i===u.promise?p(H("Promise-chain cycle")):(c=te(i))?c.call(i,s,p):s(i)):p(o)}catch(f){m&&!l&&m.exit(),p(f)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&re(e)}))}},oe=function(e,t,n){var o,r;Q?((o=G.createEvent("Event")).promise=t,o.reason=n,o.initEvent(e,!1,!0),u.dispatchEvent(o)):o={promise:t,reason:n},!J&&(r=u["on"+e])?r(o):e===X&&S("Unhandled promise rejection",n)},re=function(e){I.call(u,(function(){var t,n=e.facade,o=e.value;if(ae(e)&&(t=M((function(){L?Y.emit("unhandledRejection",o,n):oe(X,n,o)})),e.rejection=L||ae(e)?2:1,t.error))throw t.value}))},ae=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){I.call(u,(function(){var t=e.facade;L?Y.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},ce=function(e,t,n){return function(o){e(t,o,n)}},le=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ue=function se(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw H("Promise can't be resolved itself");var o=te(t);o?k((function(){var n={done:!1};try{o.call(t,ce(se,n,e),ce(le,n,e))}catch(r){le(n,r,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(r){le({done:!1},r,e)}}};if($&&(W=function(e){v(this,W,P),N(e),o.call(this);var t=O(this);try{e(ce(ue,t),ce(le,t))}catch(n){le(t,n)}},U=W.prototype,(o=function(e){F(this,{type:P,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:undefined})}).prototype=m(U,{then:function(e,t){var n=R(this),o=Z(x(this,W));return o.ok="function"!=typeof e||e,o.fail="function"==typeof t&&t,o.domain=L?Y.domain:undefined,n.parent=!0,n.reactions.push(o),0!=n.state&&ne(n,!1),o.promise},"catch":function(e){return this.then(undefined,e)}}),r=function(){var e=new o,t=O(e);this.promise=e,this.resolve=ce(ue,t),this.reject=ce(le,t)},_.f=Z=function(e){return e===W||e===a?new r(e):K(e)},!l&&"function"==typeof s&&z!==Object.prototype)){i=z.then,q||(p(z,"then",(function(e,t){var n=this;return new W((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),p(z,"catch",U["catch"],{unsafe:!0}));try{delete z.constructor}catch(de){}f&&f(z,U)}c({global:!0,wrap:!0,forced:$},{Promise:W}),h(W,P,!1,!0),g(P),a=d(P),c({target:P,stat:!0,forced:$},{reject:function(e){var t=Z(this);return t.reject.call(undefined,e),t.promise}}),c({target:P,stat:!0,forced:l||$},{resolve:function(e){return w(l&&this===a?W:this,e)}}),c({target:P,stat:!0,forced:ee},{all:function(e){var t=this,n=Z(t),o=n.resolve,r=n.reject,a=M((function(){var n=N(t.resolve),a=[],i=0,c=1;V(e,(function(e){var l=i++,u=!1;a.push(undefined),c++,n.call(t,e).then((function(e){u||(u=!0,a[l]=e,--c||o(a))}),r)})),--c||o(a)}));return a.error&&r(a.value),n.promise},race:function(e){var t=this,n=Z(t),o=n.reject,r=M((function(){var r=N(t.resolve);V(e,(function(e){r.call(t,e).then(n.resolve,o)}))}));return r.error&&o(r.value),n.promise}})},57128:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(83923),i=n(63518),c=n(69691),l=r("Reflect","apply"),u=Function.apply;o({target:"Reflect",stat:!0,forced:!c((function(){l((function(){}))}))},{apply:function(e,t,n){return a(e),i(n),l?l(e,t,n):u.call(e,t,n)}})},83588:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(83923),i=n(63518),c=n(35611),l=n(83681),u=n(68719),d=n(69691),s=r("Reflect","construct"),p=d((function(){function e(){}return!(s((function(){}),[],e)instanceof e)})),m=!d((function(){s((function(){}))})),f=p||m;o({target:"Reflect",stat:!0,forced:f,sham:f},{construct:function(e,t){a(e),i(t);var n=arguments.length<3?e:a(arguments[2]);if(m&&!p)return s(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(u.apply(e,o))}var r=n.prototype,d=l(c(r)?r:Object.prototype),f=Function.apply.call(e,d,t);return c(f)?f:d}})},47057:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(63518),i=n(14613),c=n(74217);o({target:"Reflect",stat:!0,forced:n(69691)((function(){Reflect.defineProperty(c.f({},1,{value:1}),1,{value:2})})),sham:!r},{defineProperty:function(e,t,n){a(e);var o=i(t);a(n);try{return c.f(e,o,n),!0}catch(r){return!1}}})},67092:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(22245).f;o({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=a(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},69203:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(63518),i=n(22245);o({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return i.f(a(e),t)}})},27879:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(6863);o({target:"Reflect",stat:!0,sham:!n(28954)},{getPrototypeOf:function(e){return a(r(e))}})},59478:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(63518),i=n(28919),c=n(22245),l=n(6863);o({target:"Reflect",stat:!0},{get:function u(e,t){var n,o,d=arguments.length<3?e:arguments[2];return a(e)===d?e[t]:(n=c.f(e,t))?i(n,"value")?n.value:n.get===undefined?undefined:n.get.call(d):r(o=l(e))?u(o,t,d):void 0}})},71507:function(e,t,n){"use strict";n(56174)({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},39021:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=Object.isExtensible;o({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!a||a(e)}})},8641:function(e,t,n){"use strict";n(56174)({target:"Reflect",stat:!0},{ownKeys:n(28482)})},83064:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(63518);o({target:"Reflect",stat:!0,sham:!n(7056)},{preventExtensions:function(e){a(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},33362:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(1372),i=n(18444);i&&o({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),a(t);try{return i(e,t),!0}catch(n){return!1}}})},93115:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(35611),i=n(28919),c=n(69691),l=n(74217),u=n(22245),d=n(6863),s=n(39160);o({target:"Reflect",stat:!0,forced:c((function(){var e=function(){},t=l.f(new e,"a",{configurable:!0});return!1!==Reflect.set(e.prototype,"a",1,t)}))},{set:function p(e,t,n){var o,c,m=arguments.length<4?e:arguments[3],f=u.f(r(e),t);if(!f){if(a(c=d(e)))return p(c,t,n,m);f=s(0)}if(i(f,"value")){if(!1===f.writable||!a(m))return!1;if(o=u.f(m,t)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,l.f(m,t,o)}else l.f(m,t,s(0,n));return!0}return f.set!==undefined&&(f.set.call(m,n),!0)}})},45090:function(e,t,n){"use strict";var o=n(75592),r=n(84253),a=n(41441),i=n(22285),c=n(52188),l=n(74217).f,u=n(78870).f,d=n(86133),s=n(92082),p=n(5105),m=n(1864),f=n(11807),h=n(69691),g=n(28919),C=n(79947).enforce,N=n(64157),v=n(17657),b=n(8368),V=n(2229),y=v("match"),x=r.RegExp,I=x.prototype,k=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,w=/a/g,S=/a/g,_=new x(w)!==w,M=m.UNSUPPORTED_Y,D=o&&(!_||M||b||V||h((function(){return S[y]=!1,x(w)!=w||x(S)==S||"/a/i"!=x(w,"i")})));if(a("RegExp",D)){for(var B=function(e,t){var n,o,r,a,l,u,m=this instanceof B,f=d(e),h=t===undefined,N=[],v=e;if(!m&&f&&h&&e.constructor===B)return e;if((f||e instanceof B)&&(e=e.source,h&&(t="flags"in v?v.flags:p.call(v))),e=e===undefined?"":s(e),t=t===undefined?"":s(t),v=e,b&&"dotAll"in w&&(o=!!t&&t.indexOf("s")>-1)&&(t=t.replace(/s/g,"")),n=t,M&&"sticky"in w&&(r=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,"")),V&&(a=function(e){for(var t,n=e.length,o=0,r="",a=[],i={},c=!1,l=!1,u=0,d="";o<=n;o++){if("\\"===(t=e.charAt(o)))t+=e.charAt(++o);else if("]"===t)c=!1;else if(!c)switch(!0){case"["===t:c=!0;break;case"("===t:k.test(e.slice(o+1))&&(o+=2,l=!0),r+=t,u++;continue;case">"===t&&l:if(""===d||g(i,d))throw new SyntaxError("Invalid capture group name");i[d]=!0,a.push([d,u]),l=!1,d="";continue}l?d+=t:r+=t}return[r,a]}(e),e=a[0],N=a[1]),l=i(x(e,t),m?this:I,B),(o||r||N.length)&&(u=C(l),o&&(u.dotAll=!0,u.raw=B(function(e){for(var t,n=e.length,o=0,r="",a=!1;o<=n;o++)"\\"!==(t=e.charAt(o))?a||"."!==t?("["===t?a=!0:"]"===t&&(a=!1),r+=t):r+="[\\s\\S]":r+=t+e.charAt(++o);return r}(e),n)),r&&(u.sticky=!0),N.length&&(u.groups=N)),e!==v)try{c(l,"source",""===v?"(?:)":v)}catch(y){}return l},A=function(e){e in B||l(B,e,{configurable:!0,get:function(){return x[e]},set:function(t){x[e]=t}})},T=u(x),L=0;T.length>L;)A(T[L++]);I.constructor=B,B.prototype=I,f(r,"RegExp",B)}N("RegExp")},12654:function(e,t,n){"use strict";var o=n(56174),r=n(71841);o({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},58870:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(5105),i=n(69691);o&&i((function(){return"sy"!==Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get.call({dotAll:!0,sticky:!0})}))&&r.f(RegExp.prototype,"flags",{configurable:!0,get:a})},76581:function(e,t,n){"use strict";var o=n(11807),r=n(63518),a=n(92082),i=n(69691),c=n(5105),l="toString",u=RegExp.prototype,d=u[l],s=i((function(){return"/a/b"!=d.call({source:"a",flags:"b"})})),p=d.name!=l;(s||p)&&o(RegExp.prototype,l,(function(){var e=r(this),t=a(e.source),n=e.flags;return"/"+t+"/"+a(n===undefined&&e instanceof RegExp&&!("flags"in u)?c.call(e):n)}),{unsafe:!0})},4567:function(e,t,n){"use strict";var o=n(42006),r=n(74568);e.exports=o("Set",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},67586:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},7743:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("big")},{big:function(){return r(this,"big","","")}})},15890:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("blink")},{blink:function(){return r(this,"blink","","")}})},34651:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("bold")},{bold:function(){return r(this,"b","","")}})},28638:function(e,t,n){"use strict";var o=n(56174),r=n(37015).codeAt;o({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},60314:function(e,t,n){"use strict";var o,r=n(56174),a=n(22245).f,i=n(39570),c=n(92082),l=n(18774),u=n(44184),d=n(93937),s=n(1986),p="".endsWith,m=Math.min,f=d("endsWith");r({target:"String",proto:!0,forced:!!(s||f||(o=a(String.prototype,"endsWith"),!o||o.writable))&&!f},{endsWith:function(e){var t=c(u(this));l(e);var n=arguments.length>1?arguments[1]:undefined,o=i(t.length),r=n===undefined?o:m(i(n),o),a=c(e);return p?p.call(t,a,r):t.slice(r-a.length,r)===a}})},18037:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fixed")},{fixed:function(){return r(this,"tt","","")}})},48415:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},54950:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},71595:function(e,t,n){"use strict";var o=n(56174),r=n(55205),a=String.fromCharCode,i=String.fromCodePoint;o({target:"String",stat:!0,forced:!!i&&1!=i.length},{fromCodePoint:function(e){for(var t,n=[],o=arguments.length,i=0;o>i;){if(t=+arguments[i++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?a(t):a(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},98954:function(e,t,n){"use strict";var o=n(56174),r=n(18774),a=n(44184),i=n(92082);o({target:"String",proto:!0,forced:!n(93937)("includes")},{includes:function(e){return!!~i(a(this)).indexOf(i(r(e)),arguments.length>1?arguments[1]:undefined)}})},76102:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("italics")},{italics:function(){return r(this,"i","","")}})},91332:function(e,t,n){"use strict";var o=n(37015).charAt,r=n(92082),a=n(79947),i=n(71179),c="String Iterator",l=a.set,u=a.getterFor(c);i(String,"String",(function(e){l(this,{type:c,string:r(e),index:0})}),(function(){var e,t=u(this),n=t.string,r=t.index;return r>=n.length?{value:undefined,done:!0}:(e=o(n,r),t.index+=e.length,{value:e,done:!1})}))},47816:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("link")},{link:function(e){return r(this,"a","href",e)}})},79445:function(e,t,n){"use strict";var o=n(68880),r=n(63518),a=n(39570),i=n(92082),c=n(44184),l=n(69953),u=n(5641);o("match",(function(e,t,n){return[function(t){var n=c(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](i(n))},function(e){var o=r(this),c=i(e),d=n(t,o,c);if(d.done)return d.value;if(!o.global)return u(o,c);var s=o.unicode;o.lastIndex=0;for(var p,m=[],f=0;null!==(p=u(o,c));){var h=i(p[0]);m[f]=h,""===h&&(o.lastIndex=l(c,a(o.lastIndex),s)),f++}return 0===f?null:m}]}))},36493:function(e,t,n){"use strict";var o=n(56174),r=n(47497).end;o({target:"String",proto:!0,forced:n(43331)},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},24476:function(e,t,n){"use strict";var o=n(56174),r=n(47497).start;o({target:"String",proto:!0,forced:n(43331)},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},78192:function(e,t,n){"use strict";var o=n(56174),r=n(26553),a=n(39570),i=n(92082);o({target:"String",stat:!0},{raw:function(e){for(var t=r(e.raw),n=a(t.length),o=arguments.length,c=[],l=0;n>l;)c.push(i(t[l++])),l<o&&c.push(i(arguments[l]));return c.join("")}})},58660:function(e,t,n){"use strict";n(56174)({target:"String",proto:!0},{repeat:n(9811)})},56592:function(e,t,n){"use strict";var o=n(68880),r=n(69691),a=n(63518),i=n(3997),c=n(39570),l=n(92082),u=n(44184),d=n(69953),s=n(55444),p=n(5641),m=n(17657)("replace"),f=Math.max,h=Math.min,g="$0"==="a".replace(/./,"$0"),C=!!/./[m]&&""===/./[m]("a","$0");o("replace",(function(e,t,n){var o=C?"$":"$0";return[function(e,n){var o=u(this),r=e==undefined?undefined:e[m];return r!==undefined?r.call(e,o,n):t.call(l(o),e,n)},function(e,r){var u=a(this),m=l(e);if("string"==typeof r&&-1===r.indexOf(o)&&-1===r.indexOf("$<")){var g=n(t,u,m,r);if(g.done)return g.value}var C="function"==typeof r;C||(r=l(r));var N=u.global;if(N){var v=u.unicode;u.lastIndex=0}for(var b=[];;){var V=p(u,m);if(null===V)break;if(b.push(V),!N)break;""===l(V[0])&&(u.lastIndex=d(m,c(u.lastIndex),v))}for(var y,x="",I=0,k=0;k<b.length;k++){V=b[k];for(var w=l(V[0]),S=f(h(i(V.index),m.length),0),_=[],M=1;M<V.length;M++)_.push((y=V[M])===undefined?y:String(y));var D=V.groups;if(C){var B=[w].concat(_,S,m);D!==undefined&&B.push(D);var A=l(r.apply(undefined,B))}else A=s(w,m,S,_,D,r);S>=I&&(x+=m.slice(I,S)+A,I=S+w.length)}return x+m.slice(I)}]}),!!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!g||C)},69957:function(e,t,n){"use strict";var o=n(68880),r=n(63518),a=n(44184),i=n(61398),c=n(92082),l=n(5641);o("search",(function(e,t,n){return[function(t){var n=a(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](c(n))},function(e){var o=r(this),a=c(e),u=n(t,o,a);if(u.done)return u.value;var d=o.lastIndex;i(d,0)||(o.lastIndex=0);var s=l(o,a);return i(o.lastIndex,d)||(o.lastIndex=d),null===s?-1:s.index}]}))},30037:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("small")},{small:function(){return r(this,"small","","")}})},9747:function(e,t,n){"use strict";var o=n(68880),r=n(86133),a=n(63518),i=n(44184),c=n(24345),l=n(69953),u=n(39570),d=n(92082),s=n(5641),p=n(71841),m=n(1864),f=n(69691),h=m.UNSUPPORTED_Y,g=[].push,C=Math.min,N=4294967295,v=!f((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));o("split",(function(e,t,n){var o;return o="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var o=d(i(this)),a=n===undefined?N:n>>>0;if(0===a)return[];if(e===undefined)return[o];if(!r(e))return t.call(o,e,a);for(var c,l,u,s=[],m=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,h=new RegExp(e.source,m+"g");(c=p.call(h,o))&&!((l=h.lastIndex)>f&&(s.push(o.slice(f,c.index)),c.length>1&&c.index<o.length&&g.apply(s,c.slice(1)),u=c[0].length,f=l,s.length>=a));)h.lastIndex===c.index&&h.lastIndex++;return f===o.length?!u&&h.test("")||s.push(""):s.push(o.slice(f)),s.length>a?s.slice(0,a):s}:"0".split(undefined,0).length?function(e,n){return e===undefined&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=i(this),a=t==undefined?undefined:t[e];return a!==undefined?a.call(t,r,n):o.call(d(r),t,n)},function(e,r){var i=a(this),p=d(e),m=n(o,i,p,r,o!==t);if(m.done)return m.value;var f=c(i,RegExp),g=i.unicode,v=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(h?"g":"y"),b=new f(h?"^(?:"+i.source+")":i,v),V=r===undefined?N:r>>>0;if(0===V)return[];if(0===p.length)return null===s(b,p)?[p]:[];for(var y=0,x=0,I=[];x<p.length;){b.lastIndex=h?0:x;var k,w=s(b,h?p.slice(x):p);if(null===w||(k=C(u(b.lastIndex+(h?x:0)),p.length))===y)x=l(p,x,g);else{if(I.push(p.slice(y,x)),I.length===V)return I;for(var S=1;S<=w.length-1;S++)if(I.push(w[S]),I.length===V)return I;x=y=k}}return I.push(p.slice(y)),I}]}),!v,h)},13578:function(e,t,n){"use strict";var o,r=n(56174),a=n(22245).f,i=n(39570),c=n(92082),l=n(18774),u=n(44184),d=n(93937),s=n(1986),p="".startsWith,m=Math.min,f=d("startsWith");r({target:"String",proto:!0,forced:!!(s||f||(o=a(String.prototype,"startsWith"),!o||o.writable))&&!f},{startsWith:function(e){var t=c(u(this));l(e);var n=i(m(arguments.length>1?arguments[1]:undefined,t.length)),o=c(e);return p?p.call(t,o,n):t.slice(n,n+o.length)===o}})},54705:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("strike")},{strike:function(){return r(this,"strike","","")}})},75831:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("sub")},{sub:function(){return r(this,"sub","","")}})},96958:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("sup")},{sup:function(){return r(this,"sup","","")}})},19209:function(e,t,n){"use strict";var o=n(56174),r=n(84703).end,a=n(3035)("trimEnd"),i=a?function(){return r(this)}:"".trimEnd;o({target:"String",proto:!0,forced:a},{trimEnd:i,trimRight:i})},56737:function(e,t,n){"use strict";var o=n(56174),r=n(84703).start,a=n(3035)("trimStart"),i=a?function(){return r(this)}:"".trimStart;o({target:"String",proto:!0,forced:a},{trimStart:i,trimLeft:i})},3684:function(e,t,n){"use strict";var o=n(56174),r=n(84703).trim;o({target:"String",proto:!0,forced:n(3035)("trim")},{trim:function(){return r(this)}})},69656:function(e,t,n){"use strict";n(55282)("asyncIterator")},43674:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(84253),i=n(28919),c=n(35611),l=n(74217).f,u=n(49957),d=a.Symbol;if(r&&"function"==typeof d&&(!("description"in d.prototype)||d().description!==undefined)){var s={},p=function(){var e=arguments.length<1||arguments[0]===undefined?undefined:String(arguments[0]),t=this instanceof p?new d(e):e===undefined?d():d(e);return""===e&&(s[t]=!0),t};u(p,d);var m=p.prototype=d.prototype;m.constructor=p;var f=m.toString,h="Symbol(test)"==String(d("test")),g=/^Symbol\((.*)\)[^)]+$/;l(m,"description",{configurable:!0,get:function(){var e=c(this)?this.valueOf():this,t=f.call(e);if(i(s,e))return"";var n=h?t.slice(7,-1):t.replace(g,"$1");return""===n?undefined:n}}),o({global:!0,forced:!0},{Symbol:p})}},72411:function(e,t,n){"use strict";n(55282)("hasInstance")},24467:function(e,t,n){"use strict";n(55282)("isConcatSpreadable")},37493:function(e,t,n){"use strict";n(55282)("iterator")},65379:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(69808),i=n(1986),c=n(75592),l=n(54772),u=n(69691),d=n(28919),s=n(89999),p=n(35611),m=n(78253),f=n(63518),h=n(12104),g=n(26553),C=n(14613),N=n(92082),v=n(39160),b=n(83681),V=n(84547),y=n(78870),x=n(59995),I=n(21061),k=n(22245),w=n(74217),S=n(77659),_=n(52188),M=n(11807),D=n(27364),B=n(85152),A=n(90311),T=n(41080),L=n(17657),E=n(3444),j=n(55282),P=n(29108),O=n(79947),F=n(69033).forEach,R=B("hidden"),z="Symbol",W="prototype",U=L("toPrimitive"),H=O.set,G=O.getterFor(z),Y=Object[W],Z=r.Symbol,K=a("JSON","stringify"),Q=k.f,J=w.f,X=x.f,q=S.f,$=D("symbols"),ee=D("op-symbols"),te=D("string-to-symbol-registry"),ne=D("symbol-to-string-registry"),oe=D("wks"),re=r.QObject,ae=!re||!re[W]||!re[W].findChild,ie=c&&u((function(){return 7!=b(J({},"a",{get:function(){return J(this,"a",{value:7}).a}})).a}))?function(e,t,n){var o=Q(Y,t);o&&delete Y[t],J(e,t,n),o&&e!==Y&&J(Y,t,o)}:J,ce=function(e,t){var n=$[e]=b(Z[W]);return H(n,{type:z,tag:e,description:t}),c||(n.description=t),n},le=function(e,t,n){e===Y&&le(ee,t,n),f(e);var o=C(t);return f(n),d($,o)?(n.enumerable?(d(e,R)&&e[R][o]&&(e[R][o]=!1),n=b(n,{enumerable:v(0,!1)})):(d(e,R)||J(e,R,v(1,{})),e[R][o]=!0),ie(e,o,n)):J(e,o,n)},ue=function(e,t){f(e);var n=g(t),o=V(n).concat(fe(n));return F(o,(function(t){c&&!se.call(n,t)||le(e,t,n[t])})),e},de=function(e,t){return t===undefined?b(e):ue(b(e),t)},se=function(e){var t=C(e),n=q.call(this,t);return!(this===Y&&d($,t)&&!d(ee,t))&&(!(n||!d(this,t)||!d($,t)||d(this,R)&&this[R][t])||n)},pe=function(e,t){var n=g(e),o=C(t);if(n!==Y||!d($,o)||d(ee,o)){var r=Q(n,o);return!r||!d($,o)||d(n,R)&&n[R][o]||(r.enumerable=!0),r}},me=function(e){var t=X(g(e)),n=[];return F(t,(function(e){d($,e)||d(A,e)||n.push(e)})),n},fe=function(e){var t=e===Y,n=X(t?ee:g(e)),o=[];return F(n,(function(e){!d($,e)||t&&!d(Y,e)||o.push($[e])})),o};(l||(Z=function(){if(this instanceof Z)throw TypeError("Symbol is not a constructor");var e=arguments.length&&arguments[0]!==undefined?N(arguments[0]):undefined,t=T(e),n=function o(e){this===Y&&o.call(ee,e),d(this,R)&&d(this[R],t)&&(this[R][t]=!1),ie(this,t,v(1,e))};return c&&ae&&ie(Y,t,{configurable:!0,set:n}),ce(t,e)},M(Z[W],"toString",(function(){return G(this).tag})),M(Z,"withoutSetter",(function(e){return ce(T(e),e)})),S.f=se,w.f=le,k.f=pe,y.f=x.f=me,I.f=fe,E.f=function(e){return ce(L(e),e)},c&&(J(Z[W],"description",{configurable:!0,get:function(){return G(this).description}}),i||M(Y,"propertyIsEnumerable",se,{unsafe:!0}))),o({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:Z}),F(V(oe),(function(e){j(e)})),o({target:z,stat:!0,forced:!l},{"for":function(e){var t=N(e);if(d(te,t))return te[t];var n=Z(t);return te[t]=n,ne[n]=t,n},keyFor:function(e){if(!m(e))throw TypeError(e+" is not a symbol");if(d(ne,e))return ne[e]},useSetter:function(){ae=!0},useSimple:function(){ae=!1}}),o({target:"Object",stat:!0,forced:!l,sham:!c},{create:de,defineProperty:le,defineProperties:ue,getOwnPropertyDescriptor:pe}),o({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:me,getOwnPropertySymbols:fe}),o({target:"Object",stat:!0,forced:u((function(){I.f(1)}))},{getOwnPropertySymbols:function(e){return I.f(h(e))}}),K)&&o({target:"JSON",stat:!0,forced:!l||u((function(){var e=Z();return"[null]"!=K([e])||"{}"!=K({a:e})||"{}"!=K(Object(e))}))},{stringify:function(e,t,n){for(var o,r=[e],a=1;arguments.length>a;)r.push(arguments[a++]);if(o=t,(p(t)||e!==undefined)&&!m(e))return s(t)||(t=function(e,t){if("function"==typeof o&&(t=o.call(this,e,t)),!m(t))return t}),r[1]=t,K.apply(null,r)}});Z[W][U]||_(Z[W],U,Z[W].valueOf),P(Z,z),A[R]=!0},87420:function(e,t,n){"use strict";n(55282)("match")},9480:function(e,t,n){"use strict";n(55282)("replace")},66171:function(e,t,n){"use strict";n(55282)("search")},53276:function(e,t,n){"use strict";n(55282)("species")},71852:function(e,t,n){"use strict";n(55282)("split")},59045:function(e,t,n){"use strict";n(55282)("toPrimitive")},70887:function(e,t,n){"use strict";n(55282)("toStringTag")},72906:function(e,t,n){"use strict";n(55282)("unscopables")},64346:function(e,t,n){"use strict";var o=n(19216),r=n(59571),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("copyWithin",(function(e,t){return r.call(a(this),e,t,arguments.length>2?arguments[2]:undefined)}))},27553:function(e,t,n){"use strict";var o=n(19216),r=n(69033).every,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("every",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},49007:function(e,t,n){"use strict";var o=n(19216),r=n(22051),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("fill",(function(e){return r.apply(a(this),arguments)}))},17621:function(e,t,n){"use strict";var o=n(19216),r=n(69033).filter,a=n(16688),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("filter",(function(e){var t=r(i(this),e,arguments.length>1?arguments[1]:undefined);return a(this,t)}))},20500:function(e,t,n){"use strict";var o=n(19216),r=n(69033).findIndex,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("findIndex",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},71078:function(e,t,n){"use strict";var o=n(19216),r=n(69033).find,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("find",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},75344:function(e,t,n){"use strict";n(17576)("Float32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},87853:function(e,t,n){"use strict";n(17576)("Float64",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},85923:function(e,t,n){"use strict";var o=n(19216),r=n(69033).forEach,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("forEach",(function(e){r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},38956:function(e,t,n){"use strict";var o=n(29023);(0,n(19216).exportTypedArrayStaticMethod)("from",n(76182),o)},49264:function(e,t,n){"use strict";var o=n(19216),r=n(25945).includes,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("includes",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},70448:function(e,t,n){"use strict";var o=n(19216),r=n(25945).indexOf,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("indexOf",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},1150:function(e,t,n){"use strict";n(17576)("Int16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},50444:function(e,t,n){"use strict";n(17576)("Int32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},25865:function(e,t,n){"use strict";n(17576)("Int8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},5775:function(e,t,n){"use strict";var o=n(84253),r=n(19216),a=n(98215),i=n(17657)("iterator"),c=o.Uint8Array,l=a.values,u=a.keys,d=a.entries,s=r.aTypedArray,p=r.exportTypedArrayMethod,m=c&&c.prototype[i],f=!!m&&("values"==m.name||m.name==undefined),h=function(){return l.call(s(this))};p("entries",(function(){return d.call(s(this))})),p("keys",(function(){return u.call(s(this))})),p("values",h,!f),p(i,h,!f)},45164:function(e,t,n){"use strict";var o=n(19216),r=o.aTypedArray,a=o.exportTypedArrayMethod,i=[].join;a("join",(function(e){return i.apply(r(this),arguments)}))},83762:function(e,t,n){"use strict";var o=n(19216),r=n(41183),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("lastIndexOf",(function(e){return r.apply(a(this),arguments)}))},67265:function(e,t,n){"use strict";var o=n(19216),r=n(69033).map,a=n(25198),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("map",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined,(function(e,t){return new(a(e))(t)}))}))},56058:function(e,t,n){"use strict";var o=n(19216),r=n(29023),a=o.aTypedArrayConstructor;(0,o.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,n=new(a(this))(t);t>e;)n[e]=arguments[e++];return n}),r)},23535:function(e,t,n){"use strict";var o=n(19216),r=n(28249).right,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduceRight",(function(e){return r(a(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},87001:function(e,t,n){"use strict";var o=n(19216),r=n(28249).left,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduce",(function(e){return r(a(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},18617:function(e,t,n){"use strict";var o=n(19216),r=o.aTypedArray,a=o.exportTypedArrayMethod,i=Math.floor;a("reverse",(function(){for(var e,t=this,n=r(t).length,o=i(n/2),a=0;a<o;)e=t[a],t[a++]=t[--n],t[n]=e;return t}))},70595:function(e,t,n){"use strict";var o=n(19216),r=n(39570),a=n(95740),i=n(12104),c=n(69691),l=o.aTypedArray;(0,o.exportTypedArrayMethod)("set",(function(e){l(this);var t=a(arguments.length>1?arguments[1]:undefined,1),n=this.length,o=i(e),c=r(o.length),u=0;if(c+t>n)throw RangeError("Wrong length");for(;u<c;)this[t+u]=o[u++]}),c((function(){new Int8Array(1).set({})})))},76820:function(e,t,n){"use strict";var o=n(19216),r=n(25198),a=n(69691),i=o.aTypedArray,c=o.exportTypedArrayMethod,l=[].slice;c("slice",(function(e,t){for(var n=l.call(i(this),e,t),o=r(this),a=0,c=n.length,u=new o(c);c>a;)u[a]=n[a++];return u}),a((function(){new Int8Array(1).slice()})))},33357:function(e,t,n){"use strict";var o=n(19216),r=n(69033).some,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("some",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},38215:function(e,t,n){"use strict";var o=n(19216),r=n(84253),a=n(69691),i=n(83923),c=n(39570),l=n(58737),u=n(20967),d=n(85749),s=n(12338),p=n(12200),m=o.aTypedArray,f=o.exportTypedArrayMethod,h=r.Uint16Array,g=h&&h.prototype.sort,C=!!g&&!a((function(){var e=new h(2);e.sort(null),e.sort({})})),N=!!g&&!a((function(){if(s)return s<74;if(u)return u<67;if(d)return!0;if(p)return p<602;var e,t,n=new h(516),o=Array(516);for(e=0;e<516;e++)t=e%4,n[e]=515-e,o[e]=e-2*t+3;for(n.sort((function(e,t){return(e/4|0)-(t/4|0)})),e=0;e<516;e++)if(n[e]!==o[e])return!0}));f("sort",(function(e){var t=this;if(e!==undefined&&i(e),N)return g.call(t,e);m(t);var n,o=c(t.length),r=Array(o);for(n=0;n<o;n++)r[n]=t[n];for(r=l(t,function(e){return function(t,n){return e!==undefined?+e(t,n)||0:n!=n?-1:t!=t?1:0===t&&0===n?1/t>0&&1/n<0?1:-1:t>n}}(e)),n=0;n<o;n++)t[n]=r[n];return t}),!N||C)},37281:function(e,t,n){"use strict";var o=n(19216),r=n(39570),a=n(55205),i=n(25198),c=o.aTypedArray;(0,o.exportTypedArrayMethod)("subarray",(function(e,t){var n=c(this),o=n.length,l=a(e,o);return new(i(n))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,r((t===undefined?o:a(t,o))-l))}))},99584:function(e,t,n){"use strict";var o=n(84253),r=n(19216),a=n(69691),i=o.Int8Array,c=r.aTypedArray,l=r.exportTypedArrayMethod,u=[].toLocaleString,d=[].slice,s=!!i&&a((function(){u.call(new i(1))}));l("toLocaleString",(function(){return u.apply(s?d.call(c(this)):c(this),arguments)}),a((function(){return[1,2].toLocaleString()!=new i([1,2]).toLocaleString()}))||!a((function(){i.prototype.toLocaleString.call([1,2])})))},43582:function(e,t,n){"use strict";var o=n(19216).exportTypedArrayMethod,r=n(69691),a=n(84253).Uint8Array,i=a&&a.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var u=i.toString!=c;o("toString",c,u)},37650:function(e,t,n){"use strict";n(17576)("Uint16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},12424:function(e,t,n){"use strict";n(17576)("Uint32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},11220:function(e,t,n){"use strict";n(17576)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},6636:function(e,t,n){"use strict";n(17576)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}),!0)},15378:function(e,t,n){"use strict";var o,r=n(84253),a=n(3993),i=n(40421),c=n(42006),l=n(57396),u=n(35611),d=n(79947).enforce,s=n(82911),p=!r.ActiveXObject&&"ActiveXObject"in r,m=Object.isExtensible,f=function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}},h=e.exports=c("WeakMap",f,l);if(s&&p){o=l.getConstructor(f,"WeakMap",!0),i.enable();var g=h.prototype,C=g["delete"],N=g.has,v=g.get,b=g.set;a(g,{"delete":function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),C.call(this,e)||t.frozen["delete"](e)}return C.call(this,e)},has:function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),N.call(this,e)||t.frozen.has(e)}return N.call(this,e)},get:function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),N.call(this,e)?v.call(this,e):t.frozen.get(e)}return v.call(this,e)},set:function(e,t){if(u(e)&&!m(e)){var n=d(this);n.frozen||(n.frozen=new o),N.call(this,e)?b.call(this,e,t):n.frozen.set(e,t)}else b.call(this,e,t);return this}})}},31213:function(e,t,n){"use strict";n(42006)("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),n(57396))},19275:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(33453);o({global:!0,bind:!0,enumerable:!0,forced:!r.setImmediate||!r.clearImmediate},{setImmediate:a.set,clearImmediate:a.clear})},59:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(80909),i=n(41488),c=r.process;o({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=i&&c.domain;a(t?t.bind(e):e)}})},43849:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(72319),i=[].slice,c=function(e){return function(t,n){var o=arguments.length>2,r=o?i.call(arguments,2):undefined;return e(o?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};o({global:!0,bind:!0,forced:/MSIE .\./.test(a)},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},42950:function(e){"use strict";e.exports=function(){function e(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var t=Object.hasOwnProperty,n=Object.setPrototypeOf,o=Object.isFrozen,r=Object.getPrototypeOf,a=Object.getOwnPropertyDescriptor,i=Object.freeze,c=Object.seal,l=Object.create,u="undefined"!=typeof Reflect&&Reflect,d=u.apply,s=u.construct;d||(d=function(){function e(e,t,n){return e.apply(t,n)}return e}()),i||(i=function(){function e(e){return e}return e}()),c||(c=function(){function e(e){return e}return e}()),s||(s=function(){function t(t,n){return new(Function.prototype.bind.apply(t,[null].concat(e(n))))}return t}());var p=y(Array.prototype.forEach),m=y(Array.prototype.pop),f=y(Array.prototype.push),h=y(String.prototype.toLowerCase),g=y(String.prototype.match),C=y(String.prototype.replace),N=y(String.prototype.indexOf),v=y(String.prototype.trim),b=y(RegExp.prototype.test),V=x(TypeError);function y(e){return function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return d(e,t,o)}}function x(e){return function(){for(var t=arguments.length,n=Array(t),o=0;o<t;o++)n[o]=arguments[o];return s(e,n)}}function I(e,t){n&&n(e,null);for(var r=t.length;r--;){var a=t[r];if("string"==typeof a){var i=h(a);i!==a&&(o(t)||(t[r]=i),a=i)}e[a]=!0}return e}function k(e){var n=l(null),o=void 0;for(o in e)d(t,e,[o])&&(n[o]=e[o]);return n}function w(e,t){for(;null!==e;){var n=a(e,t);if(n){if(n.get)return y(n.get);if("function"==typeof n.value)return y(n.value)}e=r(e)}function o(e){return null}return o}var S=i(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),_=i(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),M=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),D=i(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),B=i(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),A=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),T=i(["#text"]),L=i(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),E=i(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),j=i(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),O=c(/\{\{[\s\S]*|[\s\S]*\}\}/gm),F=c(/<%[\s\S]*|[\s\S]*%>/gm),R=c(/^data-[\-\w.\u00B7-\uFFFF]/),z=c(/^aria-[\-\w]+$/),W=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),U=c(/^(?:\w+script|data):/i),H=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function Y(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var Z=function(){function e(){return"undefined"==typeof window?null:window}return e}(),K=function(){function e(e,t){if("object"!==(void 0===e?"undefined":G(e))||"function"!=typeof e.createPolicy)return null;var n=null,o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(){function e(e){return e}return e}()})}catch(a){return null}}return e}();function Q(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:Z(),t=function(){function e(e){return Q(e)}return e}();if(t.version="2.3.1",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,o=e.document,r=e.DocumentFragment,a=e.HTMLTemplateElement,c=e.Node,l=e.Element,u=e.NodeFilter,d=e.NamedNodeMap,s=d===undefined?e.NamedNodeMap||e.MozNamedAttrMap:d,y=e.Text,x=e.Comment,J=e.DOMParser,X=e.trustedTypes,q=l.prototype,$=w(q,"cloneNode"),ee=w(q,"nextSibling"),te=w(q,"childNodes"),ne=w(q,"parentNode");if("function"==typeof a){var oe=o.createElement("template");oe.content&&oe.content.ownerDocument&&(o=oe.content.ownerDocument)}var re=K(X,n),ae=re&&Pe?re.createHTML(""):"",ie=o,ce=ie.implementation,le=ie.createNodeIterator,ue=ie.createDocumentFragment,de=ie.getElementsByTagName,se=n.importNode,pe={};try{pe=k(o).documentMode?o.documentMode:{}}catch(Nt){}var me={};t.isSupported="function"==typeof ne&&ce&&"undefined"!=typeof ce.createHTMLDocument&&9!==pe;var fe=O,he=F,ge=R,Ce=z,Ne=U,ve=H,be=W,Ve=null,ye=I({},[].concat(Y(S),Y(_),Y(M),Y(B),Y(T))),xe=null,Ie=I({},[].concat(Y(L),Y(E),Y(j),Y(P))),ke=null,we=null,Se=!0,_e=!0,Me=!1,De=!1,Be=!1,Ae=!1,Te=!1,Le=!1,Ee=!1,je=!0,Pe=!1,Oe=!0,Fe=!0,Re=!1,ze={},We=null,Ue=I({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),He=null,Ge=I({},["audio","video","img","source","image","track"]),Ye=null,Ze=I({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ke="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",Je="http://www.w3.org/1999/xhtml",Xe=Je,qe=!1,$e=null,et=o.createElement("form"),tt=function(){function e(e){$e&&$e===e||(e&&"object"===(void 0===e?"undefined":G(e))||(e={}),e=k(e),Ve="ALLOWED_TAGS"in e?I({},e.ALLOWED_TAGS):ye,xe="ALLOWED_ATTR"in e?I({},e.ALLOWED_ATTR):Ie,Ye="ADD_URI_SAFE_ATTR"in e?I(k(Ze),e.ADD_URI_SAFE_ATTR):Ze,He="ADD_DATA_URI_TAGS"in e?I(k(Ge),e.ADD_DATA_URI_TAGS):Ge,We="FORBID_CONTENTS"in e?I({},e.FORBID_CONTENTS):Ue,ke="FORBID_TAGS"in e?I({},e.FORBID_TAGS):{},we="FORBID_ATTR"in e?I({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,Se=!1!==e.ALLOW_ARIA_ATTR,_e=!1!==e.ALLOW_DATA_ATTR,Me=e.ALLOW_UNKNOWN_PROTOCOLS||!1,De=e.SAFE_FOR_TEMPLATES||!1,Be=e.WHOLE_DOCUMENT||!1,Le=e.RETURN_DOM||!1,Ee=e.RETURN_DOM_FRAGMENT||!1,je=!1!==e.RETURN_DOM_IMPORT,Pe=e.RETURN_TRUSTED_TYPE||!1,Te=e.FORCE_BODY||!1,Oe=!1!==e.SANITIZE_DOM,Fe=!1!==e.KEEP_CONTENT,Re=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Xe=e.NAMESPACE||Je,De&&(_e=!1),Ee&&(Le=!0),ze&&(Ve=I({},[].concat(Y(T))),xe=[],!0===ze.html&&(I(Ve,S),I(xe,L)),!0===ze.svg&&(I(Ve,_),I(xe,E),I(xe,P)),!0===ze.svgFilters&&(I(Ve,M),I(xe,E),I(xe,P)),!0===ze.mathMl&&(I(Ve,B),I(xe,j),I(xe,P))),e.ADD_TAGS&&(Ve===ye&&(Ve=k(Ve)),I(Ve,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Ie&&(xe=k(xe)),I(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&I(Ye,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(We===Ue&&(We=k(We)),I(We,e.FORBID_CONTENTS)),Fe&&(Ve["#text"]=!0),Be&&I(Ve,["html","head","body"]),Ve.table&&(I(Ve,["tbody"]),delete ke.tbody),i&&i(e),$e=e)}return e}(),nt=I({},["mi","mo","mn","ms","mtext"]),ot=I({},["foreignobject","desc","title","annotation-xml"]),rt=I({},_);I(rt,M),I(rt,D);var at=I({},B);I(at,A);var it=function(){function e(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Je,tagName:"template"});var n=h(e.tagName),o=h(t.tagName);if(e.namespaceURI===Qe)return t.namespaceURI===Je?"svg"===n:t.namespaceURI===Ke?"svg"===n&&("annotation-xml"===o||nt[o]):Boolean(rt[n]);if(e.namespaceURI===Ke)return t.namespaceURI===Je?"math"===n:t.namespaceURI===Qe?"math"===n&&ot[o]:Boolean(at[n]);if(e.namespaceURI===Je){if(t.namespaceURI===Qe&&!ot[o])return!1;if(t.namespaceURI===Ke&&!nt[o])return!1;var r=I({},["title","style","font","a","script"]);return!at[n]&&(r[n]||!rt[n])}return!1}return e}(),ct=function(){function e(e){f(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(Nt){try{e.outerHTML=ae}catch(Nt){e.remove()}}}return e}(),lt=function(){function e(e,n){try{f(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(Nt){f(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),"is"===e&&!xe[e])if(Le||Ee)try{ct(n)}catch(Nt){}else try{n.setAttribute(e,"")}catch(Nt){}}return e}(),ut=function(){function e(e){var t=void 0,n=void 0;if(Te)e="<remove></remove>"+e;else{var r=g(e,/^[\r\n\t ]+/);n=r&&r[0]}var a=re?re.createHTML(e):e;if(Xe===Je)try{t=(new J).parseFromString(a,"text/html")}catch(Nt){}if(!t||!t.documentElement){t=ce.createDocument(Xe,"template",null);try{t.documentElement.innerHTML=qe?"":a}catch(Nt){}}var i=t.body||t.documentElement;return e&&n&&i.insertBefore(o.createTextNode(n),i.childNodes[0]||null),Xe===Je?de.call(t,Be?"html":"body")[0]:Be?t.documentElement:i}return e}(),dt=function(){function e(e){return le.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,null,!1)}return e}(),st=function(){function e(e){return!(e instanceof y||e instanceof x||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof s&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)}return e}(),pt=function(){function e(e){return"object"===(void 0===c?"undefined":G(c))?e instanceof c:e&&"object"===(void 0===e?"undefined":G(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName}return e}(),mt=function(){function e(e,n,o){me[e]&&p(me[e],(function(e){e.call(t,n,o,$e)}))}return e}(),ft=function(){function e(e){var n=void 0;if(mt("beforeSanitizeElements",e,null),st(e))return ct(e),!0;if(g(e.nodeName,/[\u0080-\uFFFF]/))return ct(e),!0;var o=h(e.nodeName);if(mt("uponSanitizeElement",e,{tagName:o,allowedTags:Ve}),!pt(e.firstElementChild)&&(!pt(e.content)||!pt(e.content.firstElementChild))&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return ct(e),!0;if("select"===o&&b(/<template/i,e.innerHTML))return ct(e),!0;if(!Ve[o]||ke[o]){if(Fe&&!We[o]){var r=ne(e)||e.parentNode,a=te(e)||e.childNodes;if(a&&r)for(var i=a.length-1;i>=0;--i)r.insertBefore($(a[i],!0),ee(e))}return ct(e),!0}return e instanceof l&&!it(e)?(ct(e),!0):"noscript"!==o&&"noembed"!==o||!b(/<\/no(script|embed)/i,e.innerHTML)?(De&&3===e.nodeType&&(n=e.textContent,n=C(n,fe," "),n=C(n,he," "),e.textContent!==n&&(f(t.removed,{element:e.cloneNode()}),e.textContent=n)),mt("afterSanitizeElements",e,null),!1):(ct(e),!0)}return e}(),ht=function(){function e(e,t,n){if(Oe&&("id"===t||"name"===t)&&(n in o||n in et))return!1;if(_e&&!we[t]&&b(ge,t));else if(Se&&b(Ce,t));else{if(!xe[t]||we[t])return!1;if(Ye[t]);else if(b(be,C(n,ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!He[e])if(Me&&!b(Ne,C(n,ve,"")));else if(n)return!1}return!0}return e}(),gt=function(){function e(e){var n=void 0,o=void 0,r=void 0,a=void 0;mt("beforeSanitizeAttributes",e,null);var i=e.attributes;if(i){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(a=i.length;a--;){var l=n=i[a],u=l.name,d=l.namespaceURI;if(o=v(n.value),r=h(u),c.attrName=r,c.attrValue=o,c.keepAttr=!0,c.forceKeepAttr=undefined,mt("uponSanitizeAttribute",e,c),o=c.attrValue,!c.forceKeepAttr&&(lt(u,e),c.keepAttr))if(b(/\/>/i,o))lt(u,e);else{De&&(o=C(o,fe," "),o=C(o,he," "));var s=e.nodeName.toLowerCase();if(ht(s,r,o))try{d?e.setAttributeNS(d,u,o):e.setAttribute(u,o),m(t.removed)}catch(Nt){}}}mt("afterSanitizeAttributes",e,null)}}return e}(),Ct=function(){function e(t){var n=void 0,o=dt(t);for(mt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)mt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof r&&e(n.content),gt(n));mt("afterSanitizeShadowDOM",t,null)}return e}();return t.sanitize=function(o,a){var i=void 0,l=void 0,u=void 0,d=void 0,s=void 0;if((qe=!o)&&(o="\x3c!--\x3e"),"string"!=typeof o&&!pt(o)){if("function"!=typeof o.toString)throw V("toString is not a function");if("string"!=typeof(o=o.toString()))throw V("dirty is not a string, aborting")}if(!t.isSupported){if("object"===G(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof o)return e.toStaticHTML(o);if(pt(o))return e.toStaticHTML(o.outerHTML)}return o}if(Ae||tt(a),t.removed=[],"string"==typeof o&&(Re=!1),Re);else if(o instanceof c)1===(l=(i=ut("\x3c!----\x3e")).ownerDocument.importNode(o,!0)).nodeType&&"BODY"===l.nodeName||"HTML"===l.nodeName?i=l:i.appendChild(l);else{if(!Le&&!De&&!Be&&-1===o.indexOf("<"))return re&&Pe?re.createHTML(o):o;if(!(i=ut(o)))return Le?null:ae}i&&Te&&ct(i.firstChild);for(var p=dt(Re?o:i);u=p.nextNode();)3===u.nodeType&&u===d||ft(u)||(u.content instanceof r&&Ct(u.content),gt(u),d=u);if(d=null,Re)return o;if(Le){if(Ee)for(s=ue.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return je&&(s=se.call(n,s,!0)),s}var m=Be?i.outerHTML:i.innerHTML;return De&&(m=C(m,fe," "),m=C(m,he," ")),re&&Pe?re.createHTML(m):m},t.setConfig=function(e){tt(e),Ae=!0},t.clearConfig=function(){$e=null,Ae=!1},t.isValidAttribute=function(e,t,n){$e||tt({});var o=h(e),r=h(t);return ht(o,r,n)},t.addHook=function(e,t){"function"==typeof t&&(me[e]=me[e]||[],f(me[e],t))},t.removeHook=function(e){me[e]&&m(me[e])},t.removeHooks=function(e){me[e]&&(me[e]=[])},t.removeAllHooks=function(){me={}},t}return Q()}()},92376:function(e,t){"use strict";t.__esModule=!0,t._CI=Me,t._HI=O,t._M=Be,t._MCCC=Ee,t._ME=Te,t._MFCC=je,t._MP=Se,t._MR=ve,t._RFC=De,t.__render=ze,t.createComponentVNode=function(e,t,n,o,a){var i=new D(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),o,function(e,t,n){var o=(32768&e?t.render:t).defaultProps;if(r(o))return n;if(r(n))return u(o,null);return S(n,o)}(e,t,n),function(e,t,n){if(4&e)return n;var o=(32768&e?t.render:t).defaultHooks;if(r(o))return n;if(r(n))return o;return S(n,o)}(e,t,a),t);I.createVNode&&I.createVNode(i);return i},t.createFragment=T,t.createPortal=function(e,t){var n=O(e);return B(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,o,r){e||(e=t),We(n,e,o,r)}},t.createTextVNode=A,t.createVNode=B,t.directClone=L,t.findDOMfromVNode=v,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case p:return 8192;default:return 1}},t.linkEvent=function(e,t){if(i(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&r(e.children)&&P(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?u(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=We,t.rerender=Ke,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var n=Array.isArray;function o(e){var t=typeof e;return"string"===t||"number"===t}function r(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function i(e){return"function"==typeof e}function c(e){return"string"==typeof e}function l(e){return null===e}function u(e,t){var n={};if(e)for(var o in e)n[o]=e[o];if(t)for(var r in t)n[r]=t[r];return n}function d(e){return!l(e)&&"object"==typeof e}var s={};t.EMPTY_OBJ=s;var p="$F";function m(e){return e.substr(2).toLowerCase()}function f(e,t){e.appendChild(t)}function h(e,t,n){l(n)?f(e,t):e.insertBefore(t,n)}function g(e,t){e.removeChild(t)}function C(e){for(var t=0;t<e.length;t++)e[t]()}function N(e,t,n){var o=e.children;return 4&n?o.$LI:8192&n?2===e.childFlags?o:o[t?0:o.length-1]:o}function v(e,t){for(var n;e;){if(2033&(n=e.flags))return e.dom;e=N(e,t,n)}return null}function b(e,t){do{var n=e.flags;if(2033&n)return void g(t,e.dom);var o=e.children;if(4&n&&(e=o.$LI),8&n&&(e=o),8192&n){if(2!==e.childFlags){for(var r=0,a=o.length;r<a;++r)b(o[r],t);return}e=o}}while(e)}function V(e,t,n){do{var o=e.flags;if(2033&o)return void h(t,e.dom,n);var r=e.children;if(4&o&&(e=r.$LI),8&o&&(e=r),8192&o){if(2!==e.childFlags){for(var a=0,i=r.length;a<i;++a)V(r[a],t,n);return}e=r}}while(e)}function y(e,t,n){return e.constructor.getDerivedStateFromProps?u(n,e.constructor.getDerivedStateFromProps(t,n)):n}t.Fragment=p;var x={v:!1},I={componentComparator:null,createVNode:null,renderComplete:null};function k(e,t){e.textContent=t}function w(e,t){return d(e)&&e.event===t.event&&e.data===t.data}function S(e,t){for(var n in t)void 0===e[n]&&(e[n]=t[n]);return e}function _(e,t){return!!i(e)&&(e(t),!0)}t.options=I;var M="$";function D(e,t,n,o,r,a,i,c){this.childFlags=e,this.children=t,this.className=n,this.dom=null,this.flags=o,this.key=void 0===r?null:r,this.props=void 0===a?null:a,this.ref=void 0===i?null:i,this.type=c}function B(e,t,n,o,r,a,i,c){var l=void 0===r?1:r,u=new D(l,o,n,e,i,a,c,t);return I.createVNode&&I.createVNode(u),0===l&&P(u,u.children),u}function A(e,t){return new D(1,r(e)||!0===e||!1===e?"":e,null,16,t,null,null,null)}function T(e,t,n){var o=B(8192,8192,null,e,t,null,n,null);switch(o.childFlags){case 1:o.children=E(),o.childFlags=2;break;case 16:o.children=[A(e)],o.childFlags=4}return o}function L(e){var t=-16385&e.flags,n=e.props;if(14&t&&!l(n)){var o=n;for(var r in n={},o)n[r]=o[r]}return 0==(8192&t)?new D(e.childFlags,e.children,e.className,t,e.key,n,e.ref,e.type):function(e){var t=e.children,n=e.childFlags;return T(2===n?L(t):t.map(L),n,e.key)}(e)}function E(){return A("",null)}function j(e,t,r,i){for(var u=e.length;r<u;r++){var d=e[r];if(!a(d)){var s=i+M+r;if(n(d))j(d,t,0,s);else{if(o(d))d=A(d,s);else{var p=d.key,m=c(p)&&p[0]===M;(81920&d.flags||m)&&(d=L(d)),d.flags|=65536,m?p.substring(0,i.length)!==i&&(d.key=i+p):l(p)?d.key=s:d.key=i+p}t.push(d)}}}}function P(e,t){var r,i=1;if(a(t))r=t;else if(o(t))i=16,r=t;else if(n(t)){for(var u=t.length,d=0;d<u;++d){var s=t[d];if(a(s)||n(s)){r=r||t.slice(0,d),j(t,r,d,"");break}if(o(s))(r=r||t.slice(0,d)).push(A(s,M+d));else{var p=s.key,m=(81920&s.flags)>0,f=l(p),h=c(p)&&p[0]===M;m||f||h?(r=r||t.slice(0,d),(m||h)&&(s=L(s)),(f||h)&&(s.key=M+d),r.push(s)):r&&r.push(s),s.flags|=65536}}i=0===(r=r||t).length?1:8}else(r=t).flags|=65536,81920&t.flags&&(r=L(t)),i=2;return e.children=r,e.childFlags=i,e}function O(e){return a(e)||o(e)?A(e,null):n(e)?T(e,0,null):16384&e.flags?L(e):e}var F="http://www.w3.org/1999/xlink",R="http://www.w3.org/XML/1998/namespace",z={"xlink:actuate":F,"xlink:arcrole":F,"xlink:href":F,"xlink:role":F,"xlink:show":F,"xlink:title":F,"xlink:type":F,"xml:base":R,"xml:lang":R,"xml:space":R};function W(e){return{onClick:e,onDblClick:e,onFocusIn:e,onFocusOut:e,onKeyDown:e,onKeyPress:e,onKeyUp:e,onMouseDown:e,onMouseMove:e,onMouseUp:e,onTouchEnd:e,onTouchMove:e,onTouchStart:e}}var U=W(0),H=W(null),G=W(!0);function Y(e,t){var n=t.$EV;return n||(n=t.$EV=W(null)),n[e]||1==++U[e]&&(H[e]=function(e){var t="onClick"===e||"onDblClick"===e?function(e){return function(t){0===t.button?K(t,!0,e,q(t)):t.stopPropagation()}}(e):function(e){return function(t){K(t,!1,e,q(t))}}(e);return document.addEventListener(m(e),t),t}(e)),n}function Z(e,t){var n=t.$EV;n&&n[e]&&(0==--U[e]&&(document.removeEventListener(m(e),H[e]),H[e]=null),n[e]=null)}function K(e,t,n,o){var r=function(e){return i(e.composedPath)?e.composedPath()[0]:e.target}(e);do{if(t&&r.disabled)return;var a=r.$EV;if(a){var c=a[n];if(c&&(o.dom=r,c.event?c.event(c.data,e):c(e),e.cancelBubble))return}r=r.parentNode}while(!l(r))}function Q(){this.cancelBubble=!0,this.immediatePropagationStopped||this.stopImmediatePropagation()}function J(){return this.defaultPrevented}function X(){return this.cancelBubble}function q(e){var t={dom:document};return e.isDefaultPrevented=J,e.isPropagationStopped=X,e.stopPropagation=Q,Object.defineProperty(e,"currentTarget",{configurable:!0,get:function(){return t.dom}}),t}function $(e,t,n){if(e[t]){var o=e[t];o.event?o.event(o.data,n):o(n)}else{var r=t.toLowerCase();e[r]&&e[r](n)}}function ee(e,t){var n=function(n){var o=this.$V;if(o){var r=o.props||s,a=o.dom;if(c(e))$(r,e,n);else for(var l=0;l<e.length;++l)$(r,e[l],n);if(i(t)){var u=this.$V,d=u.props||s;t(d,a,!1,u)}}};return Object.defineProperty(n,"wrapped",{configurable:!1,enumerable:!1,value:!0,writable:!1}),n}function te(e,t,n){var o="$"+t,r=e[o];if(r){if(r[1].wrapped)return;e.removeEventListener(r[0],r[1]),e[o]=null}i(n)&&(e.addEventListener(t,n),e[o]=[t,n])}function ne(e){return"checkbox"===e||"radio"===e}var oe=ee("onInput",ie),re=ee(["onClick","onChange"],ie);function ae(e){e.stopPropagation()}function ie(e,t){var n=e.type,o=e.value,a=e.checked,i=e.multiple,c=e.defaultValue,l=!r(o);n&&n!==t.type&&t.setAttribute("type",n),r(i)||i===t.multiple||(t.multiple=i),r(c)||l||(t.defaultValue=c+""),ne(n)?(l&&(t.value=o),r(a)||(t.checked=a)):l&&t.value!==o?(t.defaultValue=o,t.value=o):r(a)||(t.checked=a)}function ce(e,t){if("option"===e.type)!function(e,t){var o=e.props||s,a=e.dom;a.value=o.value,o.value===t||n(t)&&-1!==t.indexOf(o.value)?a.selected=!0:r(t)&&r(o.selected)||(a.selected=o.selected||!1)}(e,t);else{var o=e.children,a=e.flags;if(4&a)ce(o.$LI,t);else if(8&a)ce(o,t);else if(2===e.childFlags)ce(o,t);else if(12&e.childFlags)for(var i=0,c=o.length;i<c;++i)ce(o[i],t)}}ae.wrapped=!0;var le=ee("onChange",ue);function ue(e,t,n,o){var a=Boolean(e.multiple);r(e.multiple)||a===t.multiple||(t.multiple=a);var i=e.selectedIndex;if(-1===i&&(t.selectedIndex=-1),1!==o.childFlags){var c=e.value;"number"==typeof i&&i>-1&&t.options[i]&&(c=t.options[i].value),n&&r(c)&&(c=e.defaultValue),ce(o,c)}}var de,se,pe=ee("onInput",fe),me=ee("onChange");function fe(e,t,n){var o=e.value,a=t.value;if(r(o)){if(n){var i=e.defaultValue;r(i)||i===a||(t.defaultValue=i,t.value=i)}}else a!==o&&(t.defaultValue=o,t.value=o)}function he(e,t,n,o,r,a){64&e?ie(o,n):256&e?ue(o,n,r,t):128&e&&fe(o,n,r),a&&(n.$V=t)}function ge(e,t,n){64&e?function(e,t){ne(t.type)?(te(e,"change",re),te(e,"click",ae)):te(e,"input",oe)}(t,n):256&e?function(e){te(e,"change",le)}(t):128&e&&function(e,t){te(e,"input",pe),t.onChange&&te(e,"change",me)}(t,n)}function Ce(e){return e.type&&ne(e.type)?!r(e.checked):!r(e.value)}function Ne(e){e&&!_(e,null)&&e.current&&(e.current=null)}function ve(e,t,n){e&&(i(e)||void 0!==e.current)&&n.push((function(){_(e,t)||void 0===e.current||(e.current=t)}))}function be(e,t){Ve(e),b(e,t)}function Ve(e){var t,n=e.flags,o=e.children;if(481&n){t=e.ref;var a=e.props;Ne(t);var c=e.childFlags;if(!l(a))for(var u=Object.keys(a),d=0,p=u.length;d<p;d++){var m=u[d];G[m]&&Z(m,e.dom)}12&c?ye(o):2===c&&Ve(o)}else o&&(4&n?(i(o.componentWillUnmount)&&o.componentWillUnmount(),Ne(e.ref),o.$UN=!0,Ve(o.$LI)):8&n?(!r(t=e.ref)&&i(t.onComponentWillUnmount)&&t.onComponentWillUnmount(v(e,!0),e.props||s),Ve(o)):1024&n?be(o,e.ref):8192&n&&12&e.childFlags&&ye(o))}function ye(e){for(var t=0,n=e.length;t<n;++t)Ve(e[t])}function xe(e){e.textContent=""}function Ie(e,t,n){ye(n),8192&t.flags?b(t,e):xe(e)}function ke(e,t,n,o){var a=e&&e.__html||"",i=t&&t.__html||"";a!==i&&(r(i)||function(e,t){var n=document.createElement("i");return n.innerHTML=t,n.innerHTML===e.innerHTML}(o,i)||(l(n)||(12&n.childFlags?ye(n.children):2===n.childFlags&&Ve(n.children),n.children=null,n.childFlags=1),o.innerHTML=i))}function we(e,t,n,o,a,l,u){switch(e){case"children":case"childrenType":case"className":case"defaultValue":case"key":case"multiple":case"ref":case"selectedIndex":break;case"autoFocus":o.autofocus=!!n;break;case"allowfullscreen":case"autoplay":case"capture":case"checked":case"controls":case"default":case"disabled":case"hidden":case"indeterminate":case"loop":case"muted":case"novalidate":case"open":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"selected":o[e]=!!n;break;case"defaultChecked":case"value":case"volume":if(l&&"value"===e)break;var s=r(n)?"":n;o[e]!==s&&(o[e]=s);break;case"style":!function(e,t,n){if(r(t))n.removeAttribute("style");else{var o,a,i=n.style;if(c(t))i.cssText=t;else if(r(e)||c(e))for(o in t)a=t[o],i.setProperty(o,a);else{for(o in t)(a=t[o])!==e[o]&&i.setProperty(o,a);for(o in e)r(t[o])&&i.removeProperty(o)}}}(t,n,o);break;case"dangerouslySetInnerHTML":ke(t,n,u,o);break;default:G[e]?function(e,t,n,o){if(i(n))Y(e,o)[e]=n;else if(d(n)){if(w(t,n))return;Y(e,o)[e]=n}else Z(e,o)}(e,t,n,o):111===e.charCodeAt(0)&&110===e.charCodeAt(1)?function(e,t,n,o){if(d(n)){if(w(t,n))return;n=function(e){var t=e.event;return function(n){t(e.data,n)}}(n)}te(o,m(e),n)}(e,t,n,o):r(n)?o.removeAttribute(e):a&&z[e]?o.setAttributeNS(z[e],e,n):o.setAttribute(e,n)}}function Se(e,t,n,o,r){var a=!1,i=(448&t)>0;for(var c in i&&(a=Ce(n))&&ge(t,o,n),n)we(c,null,n[c],o,r,a,null);i&&he(t,e,o,n,!0,a)}function _e(e,t,n){var o=O(e.render(t,e.state,n)),r=n;return i(e.getChildContext)&&(r=u(n,e.getChildContext())),e.$CX=r,o}function Me(e,t,n,o,r,a){var c=new t(n,o),u=c.$N=Boolean(t.getDerivedStateFromProps||c.getSnapshotBeforeUpdate);if(c.$SVG=r,c.$L=a,e.children=c,c.$BS=!1,c.context=o,c.props===s&&(c.props=n),u)c.state=y(c,n,c.state);else if(i(c.componentWillMount)){c.$BR=!0,c.componentWillMount();var d=c.$PS;if(!l(d)){var p=c.state;if(l(p))c.state=d;else for(var m in d)p[m]=d[m];c.$PS=null}c.$BR=!1}return c.$LI=_e(c,n,o),c}function De(e,t){var n=e.props||s;return 32768&e.flags?e.type.render(n,e.ref,t):e.type(n,t)}function Be(e,t,n,o,r,a){var i=e.flags|=16384;481&i?Te(e,t,n,o,r,a):4&i?function(e,t,n,o,r,a){var i=Me(e,e.type,e.props||s,n,o,a);Be(i.$LI,t,i.$CX,o,r,a),Ee(e.ref,i,a)}(e,t,n,o,r,a):8&i?(!function(e,t,n,o,r,a){Be(e.children=O(De(e,n)),t,n,o,r,a)}(e,t,n,o,r,a),je(e,a)):512&i||16&i?Ae(e,t,r):8192&i?function(e,t,n,o,r,a){var i=e.children,c=e.childFlags;12&c&&0===i.length&&(c=e.childFlags=2,i=e.children=E());2===c?Be(i,n,r,o,r,a):Le(i,n,t,o,r,a)}(e,n,t,o,r,a):1024&i&&function(e,t,n,o,r){Be(e.children,e.ref,t,!1,null,r);var a=E();Ae(a,n,o),e.dom=a.dom}(e,n,t,r,a)}function Ae(e,t,n){var o=e.dom=document.createTextNode(e.children);l(t)||h(t,o,n)}function Te(e,t,n,o,a,i){var c=e.flags,u=e.props,d=e.className,s=e.childFlags,p=e.dom=function(e,t){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}(e.type,o=o||(32&c)>0),m=e.children;if(r(d)||""===d||(o?p.setAttribute("class",d):p.className=d),16===s)k(p,m);else if(1!==s){var f=o&&"foreignObject"!==e.type;2===s?(16384&m.flags&&(e.children=m=L(m)),Be(m,p,n,f,null,i)):8!==s&&4!==s||Le(m,p,n,f,null,i)}l(t)||h(t,p,a),l(u)||Se(e,c,u,p,o),ve(e.ref,p,i)}function Le(e,t,n,o,r,a){for(var i=0;i<e.length;++i){var c=e[i];16384&c.flags&&(e[i]=c=L(c)),Be(c,t,n,o,r,a)}}function Ee(e,t,n){ve(e,t,n),i(t.componentDidMount)&&n.push(function(e){return function(){e.componentDidMount()}}(t))}function je(e,t){var n=e.ref;r(n)||(_(n.onComponentWillMount,e.props||s),i(n.onComponentDidMount)&&t.push(function(e,t){return function(){e.onComponentDidMount(v(t,!0),t.props||s)}}(n,e)))}function Pe(e,t,n,o,c,d,p){var m=t.flags|=16384;e.flags!==m||e.type!==t.type||e.key!==t.key||2048&m?16384&e.flags?function(e,t,n,o,r,a){Ve(e),0!=(t.flags&e.flags&2033)?(Be(t,null,o,r,null,a),function(e,t,n){e.replaceChild(t,n)}(n,t.dom,e.dom)):(Be(t,n,o,r,v(e,!0),a),b(e,n))}(e,t,n,o,c,p):Be(t,n,o,c,d,p):481&m?function(e,t,n,o,a,i){var c,l=t.dom=e.dom,u=e.props,d=t.props,p=!1,m=!1;if(o=o||(32&a)>0,u!==d){var f=u||s;if((c=d||s)!==s)for(var h in(p=(448&a)>0)&&(m=Ce(c)),c){var g=f[h],C=c[h];g!==C&&we(h,g,C,l,o,m,e)}if(f!==s)for(var N in f)r(c[N])&&!r(f[N])&&we(N,f[N],null,l,o,m,e)}var v=t.children,b=t.className;e.className!==b&&(r(b)?l.removeAttribute("class"):o?l.setAttribute("class",b):l.className=b);4096&a?function(e,t){e.textContent!==t&&(e.textContent=t)}(l,v):Oe(e.childFlags,t.childFlags,e.children,v,l,n,o&&"foreignObject"!==t.type,null,e,i);p&&he(a,t,l,c,!1,m);var V=t.ref,y=e.ref;y!==V&&(Ne(y),ve(V,l,i))}(e,t,o,c,m,p):4&m?function(e,t,n,o,r,a,c){var d=t.children=e.children;if(l(d))return;d.$L=c;var p=t.props||s,m=t.ref,f=e.ref,h=d.state;if(!d.$N){if(i(d.componentWillReceiveProps)){if(d.$BR=!0,d.componentWillReceiveProps(p,o),d.$UN)return;d.$BR=!1}l(d.$PS)||(h=u(h,d.$PS),d.$PS=null)}Fe(d,h,p,n,o,r,!1,a,c),f!==m&&(Ne(f),ve(m,d,c))}(e,t,n,o,c,d,p):8&m?function(e,t,n,o,a,c,l){var u=!0,d=t.props||s,p=t.ref,m=e.props,f=!r(p),h=e.children;f&&i(p.onComponentShouldUpdate)&&(u=p.onComponentShouldUpdate(m,d));if(!1!==u){f&&i(p.onComponentWillUpdate)&&p.onComponentWillUpdate(m,d);var g=O(De(t,o));Pe(h,g,n,o,a,c,l),t.children=g,f&&i(p.onComponentDidUpdate)&&p.onComponentDidUpdate(m,d)}else t.children=h}(e,t,n,o,c,d,p):16&m?function(e,t){var n=t.children,o=t.dom=e.dom;n!==e.children&&(o.nodeValue=n)}(e,t):512&m?t.dom=e.dom:8192&m?function(e,t,n,o,r,a){var i=e.children,c=t.children,l=e.childFlags,u=t.childFlags,d=null;12&u&&0===c.length&&(u=t.childFlags=2,c=t.children=E());var s=0!=(2&u);if(12&l){var p=i.length;(8&l&&8&u||s||!s&&c.length>p)&&(d=v(i[p-1],!1).nextSibling)}Oe(l,u,i,c,n,o,r,d,e,a)}(e,t,n,o,c,p):function(e,t,n,o){var r=e.ref,i=t.ref,c=t.children;if(Oe(e.childFlags,t.childFlags,e.children,c,r,n,!1,null,e,o),t.dom=e.dom,r!==i&&!a(c)){var l=c.dom;g(r,l),f(i,l)}}(e,t,o,p)}function Oe(e,t,n,o,r,a,i,c,l,u){switch(e){case 2:switch(t){case 2:Pe(n,o,r,a,i,c,u);break;case 1:be(n,r);break;case 16:Ve(n),k(r,o);break;default:!function(e,t,n,o,r,a){Ve(e),Le(t,n,o,r,v(e,!0),a),b(e,n)}(n,o,r,a,i,u)}break;case 1:switch(t){case 2:Be(o,r,a,i,c,u);break;case 1:break;case 16:k(r,o);break;default:Le(o,r,a,i,c,u)}break;case 16:switch(t){case 16:!function(e,t,n){e!==t&&(""!==e?n.firstChild.nodeValue=t:k(n,t))}(n,o,r);break;case 2:xe(r),Be(o,r,a,i,c,u);break;case 1:xe(r);break;default:xe(r),Le(o,r,a,i,c,u)}break;default:switch(t){case 16:ye(n),k(r,o);break;case 2:Ie(r,l,n),Be(o,r,a,i,c,u);break;case 1:Ie(r,l,n);break;default:var d=0|n.length,s=0|o.length;0===d?s>0&&Le(o,r,a,i,c,u):0===s?Ie(r,l,n):8===t&&8===e?function(e,t,n,o,r,a,i,c,l,u){var d,s,p=a-1,m=i-1,f=0,h=e[f],g=t[f];e:{for(;h.key===g.key;){if(16384&g.flags&&(t[f]=g=L(g)),Pe(h,g,n,o,r,c,u),e[f]=g,++f>p||f>m)break e;h=e[f],g=t[f]}for(h=e[p],g=t[m];h.key===g.key;){if(16384&g.flags&&(t[m]=g=L(g)),Pe(h,g,n,o,r,c,u),e[p]=g,m--,f>--p||f>m)break e;h=e[p],g=t[m]}}if(f>p){if(f<=m)for(s=(d=m+1)<i?v(t[d],!0):c;f<=m;)16384&(g=t[f]).flags&&(t[f]=g=L(g)),++f,Be(g,n,o,r,s,u)}else if(f>m)for(;f<=p;)be(e[f++],n);else!function(e,t,n,o,r,a,i,c,l,u,d,s,p){var m,f,h,g=0,C=c,N=c,b=a-c+1,y=i-c+1,x=new Int32Array(y+1),I=b===o,k=!1,w=0,S=0;if(r<4||(b|y)<32)for(g=C;g<=a;++g)if(m=e[g],S<y){for(c=N;c<=i;c++)if(f=t[c],m.key===f.key){if(x[c-N]=g+1,I)for(I=!1;C<g;)be(e[C++],l);w>c?k=!0:w=c,16384&f.flags&&(t[c]=f=L(f)),Pe(m,f,l,n,u,d,p),++S;break}!I&&c>i&&be(m,l)}else I||be(m,l);else{var _={};for(g=N;g<=i;++g)_[t[g].key]=g;for(g=C;g<=a;++g)if(m=e[g],S<y)if(void 0!==(c=_[m.key])){if(I)for(I=!1;g>C;)be(e[C++],l);x[c-N]=g+1,w>c?k=!0:w=c,16384&(f=t[c]).flags&&(t[c]=f=L(f)),Pe(m,f,l,n,u,d,p),++S}else I||be(m,l);else I||be(m,l)}if(I)Ie(l,s,e),Le(t,l,n,u,d,p);else if(k){var M=function(e){var t=0,n=0,o=0,r=0,a=0,i=0,c=0,l=e.length;l>Re&&(Re=l,de=new Int32Array(l),se=new Int32Array(l));for(;n<l;++n)if(0!==(t=e[n])){if(e[o=de[r]]<t){se[n]=o,de[++r]=n;continue}for(a=0,i=r;a<i;)e[de[c=a+i>>1]]<t?a=c+1:i=c;t<e[de[a]]&&(a>0&&(se[n]=de[a-1]),de[a]=n)}a=r+1;var u=new Int32Array(a);i=de[a-1];for(;a-- >0;)u[a]=i,i=se[i],de[a]=0;return u}(x);for(c=M.length-1,g=y-1;g>=0;g--)0===x[g]?(16384&(f=t[w=g+N]).flags&&(t[w]=f=L(f)),Be(f,l,n,u,(h=w+1)<r?v(t[h],!0):d,p)):c<0||g!==M[c]?V(f=t[w=g+N],l,(h=w+1)<r?v(t[h],!0):d):c--}else if(S!==y)for(g=y-1;g>=0;g--)0===x[g]&&(16384&(f=t[w=g+N]).flags&&(t[w]=f=L(f)),Be(f,l,n,u,(h=w+1)<r?v(t[h],!0):d,p))}(e,t,o,a,i,p,m,f,n,r,c,l,u)}(n,o,r,a,i,d,s,c,l,u):function(e,t,n,o,r,a,i,c,l){for(var u,d,s=a>i?i:a,p=0;p<s;++p)u=t[p],d=e[p],16384&u.flags&&(u=t[p]=L(u)),Pe(d,u,n,o,r,c,l),e[p]=u;if(a<i)for(p=s;p<i;++p)16384&(u=t[p]).flags&&(u=t[p]=L(u)),Be(u,n,o,r,c,l);else if(a>i)for(p=s;p<a;++p)be(e[p],n)}(n,o,r,a,i,d,s,c,u)}}}function Fe(e,t,n,o,r,a,c,l,d){var s=e.state,p=e.props,m=Boolean(e.$N),f=i(e.shouldComponentUpdate);if(m&&(t=y(e,n,t!==s?u(s,t):t)),c||!f||f&&e.shouldComponentUpdate(n,t,r)){!m&&i(e.componentWillUpdate)&&e.componentWillUpdate(n,t,r),e.props=n,e.state=t,e.context=r;var h=null,g=_e(e,n,r);m&&i(e.getSnapshotBeforeUpdate)&&(h=e.getSnapshotBeforeUpdate(p,s)),Pe(e.$LI,g,o,e.$CX,a,l,d),e.$LI=g,i(e.componentDidUpdate)&&function(e,t,n,o,r){r.push((function(){e.componentDidUpdate(t,n,o)}))}(e,p,s,h,d)}else e.props=n,e.state=t,e.context=r}var Re=0;function ze(e,t,n,o){var a=[],c=t.$V;x.v=!0,r(c)?r(e)||(16384&e.flags&&(e=L(e)),Be(e,t,o,!1,null,a),t.$V=e,c=e):r(e)?(be(c,t),t.$V=null):(16384&e.flags&&(e=L(e)),Pe(c,e,t,o,!1,null,a),c=t.$V=e),C(a),x.v=!1,i(n)&&n(),i(I.renderComplete)&&I.renderComplete(c,t)}function We(e,t,n,o){void 0===n&&(n=null),void 0===o&&(o=s),ze(e,t,n,o)}"undefined"!=typeof document&&window.Node&&(Node.prototype.$EV=null,Node.prototype.$V=null);var Ue=[],He="undefined"!=typeof Promise?Promise.resolve().then.bind(Promise.resolve()):function(e){window.setTimeout(e,0)},Ge=!1;function Ye(e,t,n,o){var a=e.$PS;if(i(t)&&(t=t(a?u(e.state,a):e.state,e.props,e.context)),r(a))e.$PS=t;else for(var c in t)a[c]=t[c];if(e.$BR)i(n)&&e.$L.push(n.bind(e));else{if(!x.v&&0===Ue.length)return Qe(e,o),void(i(n)&&n.call(e));if(-1===Ue.indexOf(e)&&Ue.push(e),o&&(e.$F=!0),Ge||(Ge=!0,He(Ke)),i(n)){var l=e.$QU;l||(l=e.$QU=[]),l.push(n)}}}function Ze(e){for(var t=e.$QU,n=0;n<t.length;++n)t[n].call(e);e.$QU=null}function Ke(){var e;for(Ge=!1;e=Ue.shift();)if(!e.$UN){var t=e.$F;e.$F=!1,Qe(e,t),e.$QU&&Ze(e)}}function Qe(e,t){if(t||!e.$BR){var n=e.$PS;e.$PS=null;var o=[];x.v=!0,Fe(e,u(e.state,n),e.props,v(e.$LI,!0).parentNode,e.context,e.$SVG,t,null,o),C(o),x.v=!1}else e.state=e.$PS,e.$PS=null}var Je=function(e,t){this.state=null,this.$BR=!1,this.$BS=!0,this.$PS=null,this.$LI=null,this.$UN=!1,this.$CX=null,this.$QU=null,this.$N=!1,this.$L=null,this.$SVG=!1,this.$F=!1,this.props=e||s,this.context=t||s};t.Component=Je,Je.prototype.forceUpdate=function(e){this.$UN||Ye(this,{},e,!0)},Je.prototype.setState=function(e,t){this.$UN||this.$BS||Ye(this,e,t,!1)},Je.prototype.render=function(e,t,n){return null};t.version="7.4.8"},96323:function(e,t,n){"use strict";t.__esModule=!0;var o=n(92376);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(e in t&&t[e]===o[e]||(t[e]=o[e]))}))},10648:function(e,t){"use strict";var n,o;t.__esModule=!0,t.VNodeFlags=t.ChildFlags=void 0,t.VNodeFlags=n,function(e){e[e.HtmlElement=1]="HtmlElement",e[e.ComponentUnknown=2]="ComponentUnknown",e[e.ComponentClass=4]="ComponentClass",e[e.ComponentFunction=8]="ComponentFunction",e[e.Text=16]="Text",e[e.SvgElement=32]="SvgElement",e[e.InputElement=64]="InputElement",e[e.TextareaElement=128]="TextareaElement",e[e.SelectElement=256]="SelectElement",e[e.Void=512]="Void",e[e.Portal=1024]="Portal",e[e.ReCreate=2048]="ReCreate",e[e.ContentEditable=4096]="ContentEditable",e[e.Fragment=8192]="Fragment",e[e.InUse=16384]="InUse",e[e.ForwardRef=32768]="ForwardRef",e[e.Normalized=65536]="Normalized",e[e.ForwardRefComponent=32776]="ForwardRefComponent",e[e.FormElement=448]="FormElement",e[e.Element=481]="Element",e[e.Component=14]="Component",e[e.DOMRef=2033]="DOMRef",e[e.InUseOrNormalized=81920]="InUseOrNormalized",e[e.ClearInUse=-16385]="ClearInUse",e[e.ComponentKnown=12]="ComponentKnown"}(n||(t.VNodeFlags=n={})),t.ChildFlags=o,function(e){e[e.UnknownChildren=0]="UnknownChildren",e[e.HasInvalidChildren=1]="HasInvalidChildren",e[e.HasVNodeChildren=2]="HasVNodeChildren",e[e.HasNonKeyedChildren=4]="HasNonKeyedChildren",e[e.HasKeyedChildren=8]="HasKeyedChildren",e[e.HasTextChildren=16]="HasTextChildren",e[e.MultipleChildren=12]="MultipleChildren"}(o||(t.ChildFlags=o={}))},12800:function(e){"use strict";e.exports=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function t(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}function n(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function r(e,t){var o="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(o)return(o=o.call(e)).next.bind(o);if(Array.isArray(e)||(o=n(e))||t&&e&&"number"==typeof e.length){o&&(e=o);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a={exports:{}};function i(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}function c(e){a.exports.defaults=e}a.exports={defaults:i(),getDefaults:i,changeDefaults:c};var l=/[&<>"']/,u=/[&<>"']/g,d=/[<>"']|&(?!#?\w+;)/,s=/[<>"']|&(?!#?\w+;)/g,p={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},m=function(){function e(e){return p[e]}return e}();function f(e,t){if(t){if(l.test(e))return e.replace(u,m)}else if(d.test(e))return e.replace(s,m);return e}var h=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function g(e){return e.replace(h,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var C=/(^|[^\[])\^/g;function N(e,t){e=e.source||e,t=t||"";var n={replace:function(){function t(t,o){return o=(o=o.source||o).replace(C,"$1"),e=e.replace(t,o),n}return t}(),getRegex:function(){function n(){return new RegExp(e,t)}return n}()};return n}var v=/[^\w:]/g,b=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function V(e,t,n){if(e){var o;try{o=decodeURIComponent(g(n)).replace(v,"").toLowerCase()}catch(r){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}t&&!b.test(n)&&(n=w(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(r){return null}return n}var y={},x=/^[^:]+:\/*[^/]*$/,I=/^([^:]+:)[\s\S]*$/,k=/^([^:]+:\/*[^/]*)[\s\S]*$/;function w(e,t){y[" "+e]||(x.test(e)?y[" "+e]=e+"/":y[" "+e]=M(e,"/",!0));var n=-1===(e=y[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(I,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(k,"$1")+t:e+t}function S(e){for(var t,n,o=1;o<arguments.length;o++)for(n in t=arguments[o])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function _(e,t){var n=e.replace(/\|/g,(function(e,t,n){for(var o=!1,r=t;--r>=0&&"\\"===n[r];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;o<n.length;o++)n[o]=n[o].trim().replace(/\\\|/g,"|");return n}function M(e,t,n){var o=e.length;if(0===o)return"";for(var r=0;r<o;){var a=e.charAt(o-r-1);if(a!==t||n){if(a===t||!n)break;r++}else r++}return e.substr(0,o-r)}function D(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,o=0,r=0;r<n;r++)if("\\"===e[r])r++;else if(e[r]===t[0])o++;else if(e[r]===t[1]&&--o<0)return r;return-1}function B(e){e&&e.sanitize&&e.silent}function A(e,t){if(t<1)return"";for(var n="";t>1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}var T={escape:f,unescape:g,edit:N,cleanUrl:V,resolveUrl:w,noopTest:{exec:function(){function e(){}return e}()},merge:S,splitCells:_,rtrim:M,findClosingBracket:D,checkSanitizeDeprecation:B,repeatString:A},L=a.exports.defaults,E=T.rtrim,j=T.splitCells,P=T.escape,O=T.findClosingBracket;function F(e,t,n){var o=t.href,r=t.title?P(t.title):null,a=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:o,title:r,text:a}:{type:"image",raw:n,href:o,title:r,text:P(a)}}function R(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var o=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:t[0].length>=o.length?e.slice(o.length):e})).join("\n")}var z=function(){function e(e){this.options=e||L}var t=e.prototype;return t.space=function(){function e(e){var t=this.rules.block.newline.exec(e);if(t)return t[0].length>1?{type:"space",raw:t[0]}:{raw:"\n"}}return e}(),t.code=function(){function e(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:E(n,"\n")}}}return e}(),t.fences=function(){function e(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],o=R(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:o}}}return e}(),t.heading=function(){function e(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(/#$/.test(n)){var o=E(n,"#");this.options.pedantic?n=o.trim():o&&!/ $/.test(o)||(n=o.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n}}}return e}(),t.nptable=function(){function e(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:j(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=j(n.cells[o],n.header.length);return n}}}return e}(),t.hr=function(){function e(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}return e}(),t.blockquote=function(){function e(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}}return e}(),t.list=function(){function e(e){var t=this.rules.block.list.exec(e);if(t){var n,o,r,a,i,c,l,u,d,s=t[0],p=t[2],m=p.length>1,f={type:"list",raw:s,ordered:m,start:m?+p.slice(0,-1):"",loose:!1,items:[]},h=t[0].match(this.rules.block.item),g=!1,C=h.length;r=this.rules.block.listItemStart.exec(h[0]);for(var N=0;N<C;N++){if(s=n=h[N],this.options.pedantic||(d=n.match(new RegExp("\\n\\s*\\n {0,"+(r[0].length-1)+"}\\S")))&&(i=n.length-d.index+h.slice(N+1).join("\n").length,f.raw=f.raw.substring(0,f.raw.length-i),s=n=n.substring(0,d.index),C=N+1),N!==C-1){if(a=this.rules.block.listItemStart.exec(h[N+1]),this.options.pedantic?a[1].length>r[1].length:a[1].length>=r[0].length||a[1].length>3){h.splice(N,2,h[N]+(!this.options.pedantic&&a[1].length<r[0].length&&!h[N].match(/\n$/)?"":"\n")+h[N+1]),N--,C--;continue}(!this.options.pedantic||this.options.smartLists?a[2][a[2].length-1]!==p[p.length-1]:m===(1===a[2].length))&&(i=h.slice(N+1).join("\n").length,f.raw=f.raw.substring(0,f.raw.length-i),N=C-1),r=a}o=n.length,~(n=n.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=n.length,n=this.options.pedantic?n.replace(/^ {1,4}/gm,""):n.replace(new RegExp("^ {1,"+o+"}","gm"),"")),n=E(n,"\n"),N!==C-1&&(s+="\n"),c=g||/\n\n(?!\s*$)/.test(s),N!==C-1&&(g="\n\n"===s.slice(-2),c||(c=g)),c&&(f.loose=!0),this.options.gfm&&(l=/^\[[ xX]\] /.test(n),u=undefined,l&&(u=" "!==n[1],n=n.replace(/^\[[ xX]\] +/,""))),f.items.push({type:"list_item",raw:s,task:l,checked:u,loose:c,text:n})}return f}}return e}(),t.html=function(){function e(e){var t=this.rules.block.html.exec(e);if(t)return{type:this.options.sanitize?"paragraph":"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):P(t[0]):t[0]}}return e}(),t.def=function(){function e(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{type:"def",tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2],title:t[3]}}return e}(),t.table=function(){function e(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:j(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=j(n.cells[o].replace(/^ *\| *| *\| *$/g,""),n.header.length);return n}}}return e}(),t.lheading=function(){function e(e){var t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1]}}return e}(),t.paragraph=function(){function e(e){var t=this.rules.block.paragraph.exec(e);if(t)return{type:"paragraph",raw:t[0],text:"\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1]}}return e}(),t.text=function(){function e(e){var t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0]}}return e}(),t.escape=function(){function e(e){var t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:P(t[1])}}return e}(),t.tag=function(){function e(e,t,n){var o=this.rules.inline.tag.exec(e);if(o)return!t&&/^<a /i.test(o[0])?t=!0:t&&/^<\/a>/i.test(o[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):P(o[0]):o[0]}}return e}(),t.link=function(){function e(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^</.test(n)){if(!/>$/.test(n))return;var o=E(n.slice(0,-1),"\\");if((n.length-o.length)%2==0)return}else{var r=O(t[2],"()");if(r>-1){var a=(0===t[0].indexOf("!")?5:4)+t[1].length+r;t[2]=t[2].substring(0,r),t[0]=t[0].substring(0,a).trim(),t[3]=""}}var i=t[2],c="";if(this.options.pedantic){var l=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i);l&&(i=l[1],c=l[3])}else c=t[3]?t[3].slice(1,-1):"";return i=i.trim(),/^</.test(i)&&(i=this.options.pedantic&&!/>$/.test(n)?i.slice(1):i.slice(1,-1)),F(t,{href:i?i.replace(this.rules.inline._escapes,"$1"):i,title:c?c.replace(this.rules.inline._escapes,"$1"):c},t[0])}}return e}(),t.reflink=function(){function e(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var o=(n[2]||n[1]).replace(/\s+/g," ");if(!(o=t[o.toLowerCase()])||!o.href){var r=n[0].charAt(0);return{type:"text",raw:r,text:r}}return F(n,o,n[0])}}return e}(),t.emStrong=function(){function e(e,t,n){void 0===n&&(n="");var o=this.rules.inline.emStrong.lDelim.exec(e);if(o&&(!o[3]||!n.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=o[1]||o[2]||"";if(!r||r&&(""===n||this.rules.inline.punctuation.exec(n))){var a,i,c=o[0].length-1,l=c,u=0,d="*"===o[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+c);null!=(o=d.exec(t));)if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6])if(i=a.length,o[3]||o[4])l+=i;else if(!((o[5]||o[6])&&c%3)||(c+i)%3){if(!((l-=i)>0))return i=Math.min(i,i+l+u),Math.min(c,i)%2?{type:"em",raw:e.slice(0,c+o.index+i+1),text:e.slice(1,c+o.index+i)}:{type:"strong",raw:e.slice(0,c+o.index+i+1),text:e.slice(2,c+o.index+i-1)}}else u+=i}}}return e}(),t.codespan=function(){function e(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),o=/[^ ]/.test(n),r=/^ /.test(n)&&/ $/.test(n);return o&&r&&(n=n.substring(1,n.length-1)),n=P(n,!0),{type:"codespan",raw:t[0],text:n}}}return e}(),t.br=function(){function e(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}return e}(),t.del=function(){function e(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2]}}return e}(),t.autolink=function(){function e(e,t){var n,o,r=this.rules.inline.autolink.exec(e);if(r)return o="@"===r[2]?"mailto:"+(n=P(this.options.mangle?t(r[1]):r[1])):n=P(r[1]),{type:"link",raw:r[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}}return e}(),t.url=function(){function e(e,t){var n;if(n=this.rules.inline.url.exec(e)){var o,r;if("@"===n[2])r="mailto:"+(o=P(this.options.mangle?t(n[0]):n[0]));else{var a;do{a=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(a!==n[0]);o=P(n[0]),r="www."===n[1]?"http://"+o:o}return{type:"link",raw:n[0],text:o,href:r,tokens:[{type:"text",raw:o,text:o}]}}}return e}(),t.inlineText=function(){function e(e,t,n){var o,r=this.rules.inline.text.exec(e);if(r)return o=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):P(r[0]):r[0]:P(this.options.smartypants?n(r[0]):r[0]),{type:"text",raw:r[0],text:o}}return e}(),e}(),W=T.noopTest,U=T.edit,H=T.merge,G={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:W,table:W,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};G.def=U(G.def).replace("label",G._label).replace("title",G._title).getRegex(),G.bullet=/(?:[*+-]|\d{1,9}[.)])/,G.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,G.item=U(G.item,"gm").replace(/bull/g,G.bullet).getRegex(),G.listItemStart=U(/^( *)(bull) */).replace("bull",G.bullet).getRegex(),G.list=U(G.list).replace(/bull/g,G.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+G.def.source+")").getRegex(),G._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",G._comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/,G.html=U(G.html,"i").replace("comment",G._comment).replace("tag",G._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),G.paragraph=U(G._paragraph).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.blockquote=U(G.blockquote).replace("paragraph",G.paragraph).getRegex(),G.normal=H({},G),G.gfm=H({},G.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),G.gfm.nptable=U(G.gfm.nptable).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.gfm.table=U(G.gfm.table).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.pedantic=H({},G.normal,{html:U("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",G._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:W,paragraph:U(G.normal._paragraph).replace("hr",G.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",G.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Y={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:W,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:W,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,punctuation:/^([\spunctuation])/,_punctuation:"!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"};Y.punctuation=U(Y.punctuation).replace(/punctuation/g,Y._punctuation).getRegex(),Y.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,Y.escapedEmSt=/\\\*|\\_/g,Y._comment=U(G._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Y.emStrong.lDelim=U(Y.emStrong.lDelim).replace(/punct/g,Y._punctuation).getRegex(),Y.emStrong.rDelimAst=U(Y.emStrong.rDelimAst,"g").replace(/punct/g,Y._punctuation).getRegex(),Y.emStrong.rDelimUnd=U(Y.emStrong.rDelimUnd,"g").replace(/punct/g,Y._punctuation).getRegex(),Y._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Y._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Y.autolink=U(Y.autolink).replace("scheme",Y._scheme).replace("email",Y._email).getRegex(),Y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Y.tag=U(Y.tag).replace("comment",Y._comment).replace("attribute",Y._attribute).getRegex(),Y._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Y._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Y.link=U(Y.link).replace("label",Y._label).replace("href",Y._href).replace("title",Y._title).getRegex(),Y.reflink=U(Y.reflink).replace("label",Y._label).getRegex(),Y.reflinkSearch=U(Y.reflinkSearch,"g").replace("reflink",Y.reflink).replace("nolink",Y.nolink).getRegex(),Y.normal=H({},Y),Y.pedantic=H({},Y.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:U(/^!?\[(label)\]\((.*?)\)/).replace("label",Y._label).getRegex(),reflink:U(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Y._label).getRegex()}),Y.gfm=H({},Y.normal,{escape:U(Y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/}),Y.gfm.url=U(Y.gfm.url,"i").replace("email",Y.gfm._extended_email).getRegex(),Y.breaks=H({},Y.gfm,{br:U(Y.br).replace("{2,}","*").getRegex(),text:U(Y.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});var Z={block:G,inline:Y},K=z,Q=a.exports.defaults,J=Z.block,X=Z.inline,q=T.repeatString;function $(e){return e.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")}function ee(e){var t,n,o="",r=e.length;for(t=0;t<r;t++)n=e.charCodeAt(t),Math.random()>.5&&(n="x"+n.toString(16)),o+="&#"+n+";";return o}var te=function(){function e(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Q,this.options.tokenizer=this.options.tokenizer||new K,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var t={block:J.normal,inline:X.normal};this.options.pedantic?(t.block=J.pedantic,t.inline=X.pedantic):this.options.gfm&&(t.block=J.gfm,this.options.breaks?t.inline=X.breaks:t.inline=X.gfm),this.tokenizer.rules=t}e.lex=function(){function t(t,n){return new e(n).lex(t)}return t}(),e.lexInline=function(){function t(t,n){return new e(n).inlineTokens(t)}return t}();var n=e.prototype;return n.lex=function(){function e(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    "),this.blockTokens(e,this.tokens,!0),this.inline(this.tokens),this.tokens}return e}(),n.blockTokens=function(){function e(e,t,n){var o,r,a,i,c,l,u=this;for(void 0===t&&(t=[]),void 0===n&&(n=!0),this.options.pedantic&&(e=e.replace(/^ +$/gm,""));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((function(n){return!!(o=n.call(u,e,t))&&(e=e.substring(o.raw.length),t.push(o),!0)}))))if(o=this.tokenizer.space(e))e=e.substring(o.raw.length),o.type&&t.push(o);else if(o=this.tokenizer.code(e))e=e.substring(o.raw.length),(i=t[t.length-1])&&"paragraph"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o);else if(o=this.tokenizer.fences(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.heading(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.nptable(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.hr(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.blockquote(e))e=e.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],n),t.push(o);else if(o=this.tokenizer.list(e)){for(e=e.substring(o.raw.length),a=o.items.length,r=0;r<a;r++)o.items[r].tokens=this.blockTokens(o.items[r].text,[],!1);t.push(o)}else if(o=this.tokenizer.html(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.def(e)))e=e.substring(o.raw.length),this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title});else if(o=this.tokenizer.table(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.lheading(e))e=e.substring(o.raw.length),t.push(o);else if(c=e,this.options.extensions&&this.options.extensions.startBlock&&function(){var t=Infinity,n=e.slice(1),o=void 0;u.options.extensions.startBlock.forEach((function(e){"number"==typeof(o=e.call(this,n))&&o>=0&&(t=Math.min(t,o))})),t<Infinity&&t>=0&&(c=e.substring(0,t+1))}(),n&&(o=this.tokenizer.paragraph(c)))i=t[t.length-1],l&&"paragraph"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o),l=c.length!==e.length,e=e.substring(o.raw.length);else if(o=this.tokenizer.text(e))e=e.substring(o.raw.length),(i=t[t.length-1])&&"text"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o);else if(e){var d="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(d)}return t}return e}(),n.inline=function(){function e(e){var t,n,o,r,a,i,c=e.length;for(t=0;t<c;t++)switch((i=e[t]).type){case"paragraph":case"text":case"heading":i.tokens=[],this.inlineTokens(i.text,i.tokens);break;case"table":for(i.tokens={header:[],cells:[]},r=i.header.length,n=0;n<r;n++)i.tokens.header[n]=[],this.inlineTokens(i.header[n],i.tokens.header[n]);for(r=i.cells.length,n=0;n<r;n++)for(a=i.cells[n],i.tokens.cells[n]=[],o=0;o<a.length;o++)i.tokens.cells[n][o]=[],this.inlineTokens(a[o],i.tokens.cells[n][o]);break;case"blockquote":this.inline(i.tokens);break;case"list":for(r=i.items.length,n=0;n<r;n++)this.inline(i.items[n].tokens)}return e}return e}(),n.inlineTokens=function(){function e(e,t,n,o){var r,a,i,c=this;void 0===t&&(t=[]),void 0===n&&(n=!1),void 0===o&&(o=!1);var l,u,d,s=e;if(this.tokens.links){var p=Object.keys(this.tokens.links);if(p.length>0)for(;null!=(l=this.tokenizer.rules.inline.reflinkSearch.exec(s));)p.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,l.index)+"["+q("a",l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(l=this.tokenizer.rules.inline.blockSkip.exec(s));)s=s.slice(0,l.index)+"["+q("a",l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(l=this.tokenizer.rules.inline.escapedEmSt.exec(s));)s=s.slice(0,l.index)+"++"+s.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;e;)if(u||(d=""),u=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((function(n){return!!(r=n.call(c,e,t))&&(e=e.substring(r.raw.length),t.push(r),!0)}))))if(r=this.tokenizer.escape(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.tag(e,n,o))e=e.substring(r.raw.length),n=r.inLink,o=r.inRawBlock,(a=t[t.length-1])&&"text"===r.type&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(r=this.tokenizer.link(e))e=e.substring(r.raw.length),"link"===r.type&&(r.tokens=this.inlineTokens(r.text,[],!0,o)),t.push(r);else if(r=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(r.raw.length),a=t[t.length-1],"link"===r.type?(r.tokens=this.inlineTokens(r.text,[],!0,o),t.push(r)):a&&"text"===r.type&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(r=this.tokenizer.emStrong(e,s,d))e=e.substring(r.raw.length),r.tokens=this.inlineTokens(r.text,[],n,o),t.push(r);else if(r=this.tokenizer.codespan(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.br(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.del(e))e=e.substring(r.raw.length),r.tokens=this.inlineTokens(r.text,[],n,o),t.push(r);else if(r=this.tokenizer.autolink(e,ee))e=e.substring(r.raw.length),t.push(r);else if(n||!(r=this.tokenizer.url(e,ee))){if(i=e,this.options.extensions&&this.options.extensions.startInline&&function(){var t=Infinity,n=e.slice(1),o=void 0;c.options.extensions.startInline.forEach((function(e){"number"==typeof(o=e.call(this,n))&&o>=0&&(t=Math.min(t,o))})),t<Infinity&&t>=0&&(i=e.substring(0,t+1))}(),r=this.tokenizer.inlineText(i,o,$))e=e.substring(r.raw.length),"_"!==r.raw.slice(-1)&&(d=r.raw.slice(-1)),u=!0,(a=t[t.length-1])&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(e){var m="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(m)}}else e=e.substring(r.raw.length),t.push(r);return t}return e}(),t(e,null,[{key:"rules",get:function(){function e(){return{block:J,inline:X}}return e}()}]),e}(),ne=a.exports.defaults,oe=T.cleanUrl,re=T.escape,ae=function(){function e(e){this.options=e||ne}var t=e.prototype;return t.code=function(){function e(e,t,n){var o=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,o);null!=r&&r!==e&&(n=!0,e=r)}return e=e.replace(/\n$/,"")+"\n",o?'<pre><code class="'+this.options.langPrefix+re(o,!0)+'">'+(n?e:re(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:re(e,!0))+"</code></pre>\n"}return e}(),t.blockquote=function(){function e(e){return"<blockquote>\n"+e+"</blockquote>\n"}return e}(),t.html=function(){function e(e){return e}return e}(),t.heading=function(){function e(e,t,n,o){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+o.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"}return e}(),t.hr=function(){function e(){return this.options.xhtml?"<hr/>\n":"<hr>\n"}return e}(),t.list=function(){function e(e,t,n){var o=t?"ol":"ul";return"<"+o+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"</"+o+">\n"}return e}(),t.listitem=function(){function e(e){return"<li>"+e+"</li>\n"}return e}(),t.checkbox=function(){function e(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "}return e}(),t.paragraph=function(){function e(e){return"<p>"+e+"</p>\n"}return e}(),t.table=function(){function e(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"}return e}(),t.tablerow=function(){function e(e){return"<tr>\n"+e+"</tr>\n"}return e}(),t.tablecell=function(){function e(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"}return e}(),t.strong=function(){function e(e){return"<strong>"+e+"</strong>"}return e}(),t.em=function(){function e(e){return"<em>"+e+"</em>"}return e}(),t.codespan=function(){function e(e){return"<code>"+e+"</code>"}return e}(),t.br=function(){function e(){return this.options.xhtml?"<br/>":"<br>"}return e}(),t.del=function(){function e(e){return"<del>"+e+"</del>"}return e}(),t.link=function(){function e(e,t,n){if(null===(e=oe(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<a href="'+re(e)+'"';return t&&(o+=' title="'+t+'"'),o+=">"+n+"</a>"}return e}(),t.image=function(){function e(e,t,n){if(null===(e=oe(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<img src="'+e+'" alt="'+n+'"';return t&&(o+=' title="'+t+'"'),o+=this.options.xhtml?"/>":">"}return e}(),t.text=function(){function e(e){return e}return e}(),e}(),ie=function(){function e(){}var t=e.prototype;return t.strong=function(){function e(e){return e}return e}(),t.em=function(){function e(e){return e}return e}(),t.codespan=function(){function e(e){return e}return e}(),t.del=function(){function e(e){return e}return e}(),t.html=function(){function e(e){return e}return e}(),t.text=function(){function e(e){return e}return e}(),t.link=function(){function e(e,t,n){return""+n}return e}(),t.image=function(){function e(e,t,n){return""+n}return e}(),t.br=function(){function e(){return""}return e}(),e}(),ce=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(){function e(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}return e}(),t.getNextSafeSlug=function(){function e(e,t){var n=e,o=0;if(this.seen.hasOwnProperty(n)){o=this.seen[e];do{n=e+"-"+ ++o}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=o,this.seen[n]=0),n}return e}(),t.slug=function(){function e(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}return e}(),e}(),le=ae,ue=ie,de=ce,se=a.exports.defaults,pe=T.unescape,me=te,fe=function(){function e(e){this.options=e||se,this.options.renderer=this.options.renderer||new le,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ue,this.slugger=new de}e.parse=function(){function t(t,n){return new e(n).parse(t)}return t}(),e.parseInline=function(){function t(t,n){return new e(n).parseInline(t)}return t}();var t=e.prototype;return t.parse=function(){function e(e,t){void 0===t&&(t=!0);var n,o,r,a,i,c,l,u,d,s,p,m,f,h,g,C,N,v,b,V="",y=e.length;for(n=0;n<y;n++)if(s=e[n],!(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[s.type])||!1===(b=this.options.extensions.renderers[s.type].call(this,s))&&["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(s.type))switch(s.type){case"space":continue;case"hr":V+=this.renderer.hr();continue;case"heading":V+=this.renderer.heading(this.parseInline(s.tokens),s.depth,pe(this.parseInline(s.tokens,this.textRenderer)),this.slugger);continue;case"code":V+=this.renderer.code(s.text,s.lang,s.escaped);continue;case"table":for(u="",l="",a=s.header.length,o=0;o<a;o++)l+=this.renderer.tablecell(this.parseInline(s.tokens.header[o]),{header:!0,align:s.align[o]});for(u+=this.renderer.tablerow(l),d="",a=s.cells.length,o=0;o<a;o++){for(l="",i=(c=s.tokens.cells[o]).length,r=0;r<i;r++)l+=this.renderer.tablecell(this.parseInline(c[r]),{header:!1,align:s.align[r]});d+=this.renderer.tablerow(l)}V+=this.renderer.table(u,d);continue;case"blockquote":d=this.parse(s.tokens),V+=this.renderer.blockquote(d);continue;case"list":for(p=s.ordered,m=s.start,f=s.loose,a=s.items.length,d="",o=0;o<a;o++)C=(g=s.items[o]).checked,N=g.task,h="",g.task&&(v=this.renderer.checkbox(C),f?g.tokens.length>0&&"text"===g.tokens[0].type?(g.tokens[0].text=v+" "+g.tokens[0].text,g.tokens[0].tokens&&g.tokens[0].tokens.length>0&&"text"===g.tokens[0].tokens[0].type&&(g.tokens[0].tokens[0].text=v+" "+g.tokens[0].tokens[0].text)):g.tokens.unshift({type:"text",text:v}):h+=v),h+=this.parse(g.tokens,f),d+=this.renderer.listitem(h,N,C);V+=this.renderer.list(d,p,m);continue;case"html":V+=this.renderer.html(s.text);continue;case"paragraph":V+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(d=s.tokens?this.parseInline(s.tokens):s.text;n+1<y&&"text"===e[n+1].type;)d+="\n"+((s=e[++n]).tokens?this.parseInline(s.tokens):s.text);V+=t?this.renderer.paragraph(d):d;continue;default:var x='Token with "'+s.type+'" type was not found.';if(this.options.silent)return;throw new Error(x)}else V+=b||"";return V}return e}(),t.parseInline=function(){function e(e,t){t=t||this.renderer;var n,o,r,a="",i=e.length;for(n=0;n<i;n++)if(o=e[n],!(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[o.type])||!1===(r=this.options.extensions.renderers[o.type].call(this,o))&&["escape","html","link","image","strong","em","codespan","br","del","text"].includes(o.type))switch(o.type){case"escape":case"text":a+=t.text(o.text);break;case"html":a+=t.html(o.text);break;case"link":a+=t.link(o.href,o.title,this.parseInline(o.tokens,t));break;case"image":a+=t.image(o.href,o.title,o.text);break;case"strong":a+=t.strong(this.parseInline(o.tokens,t));break;case"em":a+=t.em(this.parseInline(o.tokens,t));break;case"codespan":a+=t.codespan(o.text);break;case"br":a+=t.br();break;case"del":a+=t.del(this.parseInline(o.tokens,t));break;default:var c='Token with "'+o.type+'" type was not found.';if(this.options.silent)return;throw new Error(c)}else a+=r||"";return a}return e}(),e}(),he=z,ge=ae,Ce=ie,Ne=ce,ve=T.merge,be=T.checkSanitizeDeprecation,Ve=T.escape,ye=a.exports.getDefaults,xe=a.exports.changeDefaults,Ie=a.exports.defaults;function ke(e,t,n){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if("function"==typeof t&&(n=t,t=null),t=ve({},ke.defaults,t||{}),be(t),n){var o,r=t.highlight;try{o=me.lex(e,t)}catch(l){return n(l)}var a=function(){function e(e){var a;if(!e)try{t.walkTokens&&ke.walkTokens(o,t.walkTokens),a=fe.parse(o,t)}catch(l){e=l}return t.highlight=r,e?n(e):n(null,a)}return e}();if(!r||r.length<3)return a();if(delete t.highlight,!o.length)return a();var i=0;return ke.walkTokens(o,(function(e){"code"===e.type&&(i++,setTimeout((function(){r(e.text,e.lang,(function(t,n){if(t)return a(t);null!=n&&n!==e.text&&(e.text=n,e.escaped=!0),0==--i&&a()}))}),0))})),void(0===i&&a())}try{var c=me.lex(e,t);return t.walkTokens&&ke.walkTokens(c,t.walkTokens),fe.parse(c,t)}catch(l){if(l.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+Ve(l.message+"",!0)+"</pre>";throw l}}return ke.options=ke.setOptions=function(e){return ve(ke.defaults,e),xe(ke.defaults),ke},ke.getDefaults=ye,ke.defaults=Ie,ke.use=function(){for(var e=this,t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];var r,a=ve.apply(void 0,[{}].concat(n)),i=ke.defaults.extensions||{renderers:{},childTokens:{}};n.forEach((function(t){if(t.extensions&&(r=!0,t.extensions.forEach((function(e){if(!e.name)throw new Error("extension name required");if(e.renderer){var t=i.renderers?i.renderers[e.name]:null;i.renderers[e.name]=t?function(){for(var n=arguments.length,o=new Array(n),r=0;r<n;r++)o[r]=arguments[r];var a=e.renderer.apply(this,o);return!1===a&&(a=t.apply(this,o)),a}:e.renderer}if(e.tokenizer){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");i[e.level]?i[e.level].unshift(e.tokenizer):i[e.level]=[e.tokenizer],e.start&&("block"===e.level?i.startBlock?i.startBlock.push(e.start):i.startBlock=[e.start]:"inline"===e.level&&(i.startInline?i.startInline.push(e.start):i.startInline=[e.start]))}e.childTokens&&(i.childTokens[e.name]=e.childTokens)}))),t.renderer&&function(){var e=ke.defaults.renderer||new ge,n=function(){function n(n){var o=e[n];e[n]=function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=t.renderer[n].apply(e,a);return!1===c&&(c=o.apply(e,a)),c}}return n}();for(var o in t.renderer)n(o);a.renderer=e}(),t.tokenizer&&function(){var e=ke.defaults.tokenizer||new he,n=function(){function n(n){var o=e[n];e[n]=function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=t.tokenizer[n].apply(e,a);return!1===c&&(c=o.apply(e,a)),c}}return n}();for(var o in t.tokenizer)n(o);a.tokenizer=e}(),t.walkTokens){var n=ke.defaults.walkTokens;a.walkTokens=function(o){t.walkTokens.call(e,o),n&&n(o)}}r&&(a.extensions=i),ke.setOptions(a)}))},ke.walkTokens=function(e,t){for(var n,o=function(){function e(){var e=n.value;switch(t(e),e.type){case"table":for(var o,a=r(e.tokens.header);!(o=a()).done;){var i=o.value;ke.walkTokens(i,t)}for(var c,l=r(e.tokens.cells);!(c=l()).done;)for(var u,d=r(c.value);!(u=d()).done;){var s=u.value;ke.walkTokens(s,t)}break;case"list":ke.walkTokens(e.items,t);break;default:ke.defaults.extensions&&ke.defaults.extensions.childTokens&&ke.defaults.extensions.childTokens[e.type]?ke.defaults.extensions.childTokens[e.type].forEach((function(n){ke.walkTokens(e[n],t)})):e.tokens&&ke.walkTokens(e.tokens,t)}}return e}(),a=r(e);!(n=a()).done;)o()},ke.parseInline=function(e,t){if(null==e)throw new Error("marked.parseInline(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");t=ve({},ke.defaults,t||{}),be(t);try{var n=me.lexInline(e,t);return t.walkTokens&&ke.walkTokens(n,t.walkTokens),fe.parseInline(n,t)}catch(o){if(o.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+Ve(o.message+"",!0)+"</pre>";throw o}},ke.Parser=fe,ke.parser=fe.parse,ke.Renderer=ge,ke.TextRenderer=Ce,ke.Lexer=me,ke.lexer=me.lex,ke.Tokenizer=he,ke.Slugger=Ne,ke.parse=ke,ke}()},69838:function(e){"use strict";var t=function(e){var t,n=Object.prototype,o=n.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},a=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",c=r.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(B){l=function(e,t,n){return e[t]=n}}function u(e,t,n,o){var r=t&&t.prototype instanceof g?t:g,a=Object.create(r.prototype),i=new _(o||[]);return a._invoke=function(e,t,n){var o=s;return function(){function r(r,a){if(o===m)throw new Error("Generator is already running");if(o===f){if("throw"===r)throw a;return D()}for(n.method=r,n.arg=a;;){var i=n.delegate;if(i){var c=k(i,n);if(c){if(c===h)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===s)throw o=f,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=m;var l=d(e,t,n);if("normal"===l.type){if(o=n.done?f:p,l.arg===h)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=f,n.method="throw",n.arg=l.arg)}}return r}()}(e,n,i),a}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(B){return{type:"throw",arg:B}}}e.wrap=u;var s="suspendedStart",p="suspendedYield",m="executing",f="completed",h={};function g(){}function C(){}function N(){}var v={};l(v,a,(function(){return this}));var b=Object.getPrototypeOf,V=b&&b(b(M([])));V&&V!==n&&o.call(V,a)&&(v=V);var y=N.prototype=g.prototype=Object.create(v);function x(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function I(e,t){function n(r,a,i,c){var l=d(e[r],e,a);if("throw"!==l.type){var u=l.arg,s=u.value;return s&&"object"==typeof s&&o.call(s,"__await")?t.resolve(s.__await).then((function(e){n("next",e,i,c)}),(function(e){n("throw",e,i,c)})):t.resolve(s).then((function(e){u.value=e,i(u)}),(function(e){return n("throw",e,i,c)}))}c(l.arg)}var r;this._invoke=function(e,o){function a(){return new t((function(t,r){n(e,o,t,r)}))}return r=r?r.then(a,a):a()}}function k(e,n){var o=e.iterator[n.method];if(o===t){if(n.delegate=null,"throw"===n.method){if(e.iterator["return"]&&(n.method="return",n.arg=t,k(e,n),"throw"===n.method))return h;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var r=d(o,e.iterator,n.arg);if("throw"===r.type)return n.method="throw",n.arg=r.arg,n.delegate=null,h;var a=r.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,h):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,h)}function w(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(w,this),this.reset(!0)}function M(e){if(e){var n=e[a];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function n(){for(;++r<e.length;)if(o.call(e,r))return n.value=e[r],n.done=!1,n;return n.value=t,n.done=!0,n};return i.next=i}}return{next:D}}function D(){return{value:t,done:!0}}return C.prototype=N,l(y,"constructor",N),l(N,"constructor",C),C.displayName=l(N,c,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===C||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,N):(e.__proto__=N,l(e,c,"GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},x(I.prototype),l(I.prototype,i,(function(){return this})),e.AsyncIterator=I,e.async=function(t,n,o,r,a){void 0===a&&(a=Promise);var i=new I(u(t,n,o,r),a);return e.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},x(y),l(y,c,"Generator"),l(y,a,(function(){return this})),l(y,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function o(){for(;t.length;){var n=t.pop();if(n in e)return o.value=n,o.done=!1,o}return o.done=!0,o}},e.values=M,_.prototype={constructor:_,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(S),!e)for(var n in this)"t"===n.charAt(0)&&o.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function r(o,r){return c.type="throw",c.arg=e,n.next=o,r&&(n.method="next",n.arg=t),!!r}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],c=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=o.call(i,"catchLoc"),u=o.call(i,"finallyLoc");if(l&&u){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var a=r;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method="next",this.next=a.finallyLoc,h):this.complete(i)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),h},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),h}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var o=n.completion;if("throw"===o.type){var r=o.arg;S(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,o){return this.delegate={iterator:M(e),resultName:n,nextLoc:o},"next"===this.method&&(this.arg=t),h}},e}(e.exports);try{regeneratorRuntime=t}catch(n){"object"==typeof globalThis?globalThis.regeneratorRuntime=t:Function("r","regeneratorRuntime = r")(t)}},96250:function(){"use strict";self.fetch||(self.fetch=function(e,t){return t=t||{},new Promise((function(n,o){var r=new XMLHttpRequest,a=[],i=[],c={},l=function d(){return{ok:2==(r.status/100|0),statusText:r.statusText,status:r.status,url:r.responseURL,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},clone:d,headers:{keys:function(){return a},entries:function(){return i},get:function(e){return c[e.toLowerCase()]},has:function(e){return e.toLowerCase()in c}}}};for(var u in r.open(t.method||"get",e,!0),r.onload=function(){r.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,(function(e,t,n){a.push(t=t.toLowerCase()),i.push([t,n]),c[t]=c[t]?c[t]+","+n:n})),n(l())},r.onerror=o,r.withCredentials="include"==t.credentials,t.headers)r.setRequestHeader(u,t.headers[u]);r.send(t.body||null)}))})},88243:function(e,t){"use strict";t.__esModule=!0,t.modifier=t.element=t.block=void 0;t.block=function(e,t){return e+"-"+t};t.element=function(e,t){return e+"__"+t};t.modifier=function(e,t){return e+"--"+t}},1397:function(e,t){"use strict";t.__esModule=!0,t.binaryInsertWith=t.zipWith=t.zip=t.uniq=t.uniqBy=t.reduce=t.range=t.sortStrings=t.sort=t.sortBy=t.map=t.filter=void 0;t.filter=function(e){return function(t){if(null===t||t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++){var r=t[o];e(r,o,t)&&n.push(r)}return n}throw new Error("filter() can't iterate on type "+typeof t)}};var n=function(e){return function(t){if(null===t||t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++)n.push(e(t[o],o,t));return n}if("object"==typeof t){var r=Object.prototype.hasOwnProperty,a=[];for(var i in t)r.call(t,i)&&a.push(e(t[i],i,t));return a}throw new Error("map() can't iterate on type "+typeof t)}};t.map=n;var o=function(e,t){for(var n=e.criteria,o=t.criteria,r=n.length,a=0;a<r;a++){var i=n[a],c=o[a];if(i<c)return-1;if(i>c)return 1}return 0},r=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){if(!Array.isArray(e))return e;for(var n=e.length,r=[],a=function(n){var o=e[n];r.push({criteria:t.map((function(e){return e(o)})),value:o})},i=0;i<n;i++)a(i);r.sort(o);for(var c=[];n--;)c[n]=r[n].value;return c}};t.sortBy=r;var a=r();t.sort=a;var i=r();t.sortStrings=i;t.range=function(e,t){return new Array(t-e).fill(null).map((function(t,n){return n+e}))};t.reduce=function(e,t){return function(n){var o,r,a=n.length;for(t===undefined?(o=1,r=n[0]):(o=0,r=t);o<a;o++)r=e(r,n[o],o,n);return r}};var c=function(e){return function(t){var n=t.length,o=[],r=e?[]:o,a=-1;e:for(;++a<n;){var i=t[a],c=e?e(i):i;if(c==c){for(var l=r.length;l--;)if(r[l]===c)continue e;e&&r.push(c),o.push(i)}else r.includes(c)||(r!==o&&r.push(c),o.push(i))}return o}};t.uniqBy=c;var l=c();t.uniq=l;var u=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(0===t.length)return[];for(var o=t.length,r=t[0].length,a=[],i=0;i<r;i++){for(var c=[],l=0;l<o;l++)c.push(t[l][i]);a.push(c)}return a};t.zip=u;t.zipWith=function(e){return function(){return n((function(t){return e.apply(void 0,t)}))(u.apply(void 0,arguments))}};t.binaryInsertWith=function(e){return function(t,n){var o=[].concat(t);return o.splice(function(e,t,n){if(0===t.length)return 0;for(var o=e(n),r=[0,t.length],a=r[0],i=r[1],c=undefined,l=0;a<i;)if((c=e(t[l=a+i>>1]))<o)a=l+1;else{if(c===o)return l;i=l}return c>o?l:l+1}(e,t,n),0,n),o}}},89295:function(e,t){"use strict";t.__esModule=!0,t.validHex=t.hsvaToHsv=t.hslaToHsl=t.rgbaToRgb=t.roundHsva=t.rgbaToHsva=t.rgbaToHex=t.rgbStringToHsva=t.rgbaStringToHsva=t.hsvStringToHsva=t.hsvaStringToHsva=t.hsvaToRgbaString=t.hsvaToRgbString=t.hsvaToRgba=t.hsvaToHslaString=t.hsvaToHsvaString=t.hsvaToHsvString=t.hsvaToHslString=t.hsvaToHsla=t.hsvaToHex=t.hslaToHsva=t.hslStringToHsva=t.hslaStringToHsva=t.parseHue=t.hexToRgba=t.hexToHsva=t.Color=void 0;var n=1e-4,o=function(){function e(e,t,n,o){void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=0),void 0===o&&(o=1),this.r=void 0,this.g=void 0,this.b=void 0,this.a=void 0,this.r=e,this.g=t,this.b=n,this.a=o}return e.prototype.toString=function(){return"rgba("+(0|this.r)+", "+(0|this.g)+", "+(0|this.b)+", "+(0|this.a)+")"},e.fromHex=function(t){return new e(parseInt(t.substr(1,2),16),parseInt(t.substr(3,2),16),parseInt(t.substr(5,2),16))},e.lerp=function(t,n,o){return new e((n.r-t.r)*o+t.r,(n.g-t.g)*o+t.g,(n.b-t.b)*o+t.b,(n.a-t.a)*o+t.a)},e.lookup=function(t,o){void 0===o&&(o=[]);var r=o.length;if(r<2)throw new Error("Needs at least two colors!");var a=t*(r-1);if(t<n)return o[0];if(t>=.9999)return o[r-1];var i=a%1,c=0|a;return e.lerp(o[c],o[c+1],i)},e}();t.Color=o;var r=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*e)/n},a={grad:.9,turn:360,rad:360/(2*Math.PI)};t.hexToHsva=function(e){return v(i(e))};var i=function(e){return e?("#"===e[0]&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:4===e.length?r(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:8===e.length?r(parseInt(e.substring(6,8),16)/255,2):1}):{r:0,g:0,b:0,a:0}};t.hexToRgba=i;var c=function(e,t){return void 0===t&&(t="deg"),Number(e)*(a[t]||1)};t.parseHue=c;var l=function(e){var t=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?d({h:c(t[1],t[2]),s:Number(t[3]),l:Number(t[4]),a:t[5]===undefined?1:Number(t[5])/(t[6]?100:1)}):{h:0,s:0,v:0,a:1}};t.hslaStringToHsva=l;var u=l;t.hslStringToHsva=u;var d=function(e){var t=e.h,n=e.s,o=e.l;return{h:t,s:(n*=(o<50?o:100-o)/100)>0?2*n/(o+n)*100:0,v:o+n,a:e.a}};t.hslaToHsva=d;t.hsvaToHex=function(e){return N(p(e))};var s=function(e){var t=e.h,n=e.s,o=e.v,a=e.a,i=(200-n)*o/100;return{h:r(t),s:r(i>0&&i<200?n*o/100/(i<=100?i:200-i)*100:0),l:r(i/2),a:r(a,2)}};t.hsvaToHsla=s;t.hsvaToHslString=function(e){var t=s(e);return"hsl("+t.h+", "+t.s+"%, "+t.l+"%)"};t.hsvaToHsvString=function(e){var t=b(e);return"hsv("+t.h+", "+t.s+"%, "+t.v+"%)"};t.hsvaToHsvaString=function(e){var t=b(e);return"hsva("+t.h+", "+t.s+"%, "+t.v+"%, "+t.a+")"};t.hsvaToHslaString=function(e){var t=s(e);return"hsla("+t.h+", "+t.s+"%, "+t.l+"%, "+t.a+")"};var p=function(e){var t=e.h,n=e.s,o=e.v,a=e.a;t=t/360*6,n/=100,o/=100;var i=Math.floor(t),c=o*(1-n),l=o*(1-(t-i)*n),u=o*(1-(1-t+i)*n),d=i%6;return{r:255*[o,l,c,c,u,o][d],g:255*[u,o,o,l,c,c][d],b:255*[c,c,u,o,o,l][d],a:r(a,2)}};t.hsvaToRgba=p;t.hsvaToRgbString=function(e){var t=p(e),n=t.r,o=t.g,a=t.b;return"rgb("+r(n)+", "+r(o)+", "+r(a)+")"};t.hsvaToRgbaString=function(e){var t=p(e),n=t.r,o=t.g,a=t.b,i=t.a;return"rgba("+r(n)+", "+r(o)+", "+r(a)+", "+r(i,2)+")"};var m=function(e){var t=/hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?b({h:c(t[1],t[2]),s:Number(t[3]),v:Number(t[4]),a:t[5]===undefined?1:Number(t[5])/(t[6]?100:1)}):{h:0,s:0,v:0,a:1}};t.hsvaStringToHsva=m;var f=m;t.hsvStringToHsva=f;var h=function(e){var t=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?v({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===undefined?1:Number(t[7])/(t[8]?100:1)}):{h:0,s:0,v:0,a:1}};t.rgbaStringToHsva=h;var g=h;t.rgbStringToHsva=g;var C=function(e){var t=e.toString(16);return t.length<2?"0"+t:t},N=function(e){var t=e.r,n=e.g,o=e.b,a=e.a,i=a<1?C(r(255*a)):"";return"#"+C(r(t))+C(r(n))+C(r(o))+i};t.rgbaToHex=N;var v=function(e){var t=e.r,n=e.g,o=e.b,r=e.a,a=Math.max(t,n,o),i=a-Math.min(t,n,o),c=i?a===t?(n-o)/i:a===n?2+(o-t)/i:4+(t-n)/i:0;return{h:60*(c<0?c+6:c),s:a?i/a*100:0,v:a/255*100,a:r}};t.rgbaToHsva=v;var b=function(e){return{h:r(e.h),s:r(e.s),v:r(e.v),a:r(e.a,2)}};t.roundHsva=b;t.rgbaToRgb=function(e){return{r:e.r,g:e.g,b:e.b}};t.hslaToHsl=function(e){return{h:e.h,s:e.s,l:e.l}};t.hsvaToHsv=function(e){var t=b(e);return{h:t.h,s:t.s,v:t.v}};var V=/^#?([0-9A-F]{3,8})$/i;t.validHex=function(e,t){var n=V.exec(e),o=n?n[1].length:0;return 3===o||6===o||!!t&&4===o||!!t&&8===o}},52844:function(e,t){"use strict";t.__esModule=!0,t.EventEmitter=void 0;var n=function(){function e(){this.listeners={}}var t=e.prototype;return t.on=function(e,t){this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(t)},t.off=function(e,t){var n=this.listeners[e];if(!n)throw new Error('There is no listeners for "'+e+'"');this.listeners[e]=n.filter((function(e){return e!==t}))},t.emit=function(e){var t=this.listeners[e];if(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];for(var a=0,i=t.length;a<i;a+=1)t[a].apply(void 0,o)}},t.clear=function(){this.listeners={}},e}();t.EventEmitter=n},32416:function(e,t){"use strict";function n(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.compose=t.flow=void 0;t.flow=function r(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return function(e){for(var o=e,a=arguments.length,i=new Array(a>1?a-1:0),c=1;c<a;c++)i[c-1]=arguments[c];for(var l,u=n(t);!(l=u()).done;){var d=l.value;Array.isArray(d)?o=r.apply(void 0,d).apply(void 0,[o].concat(i)):d&&(o=d.apply(void 0,[o].concat(i)))}return o}};t.compose=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce((function(e,t){return function(n){for(var o=arguments.length,r=new Array(o>1?o-1:0),a=1;a<o;a++)r[a-1]=arguments[a];return e.apply(void 0,[t.apply(void 0,[n].concat(r))].concat(r))}}))}},57890:function(e,t){"use strict";t.__esModule=!0,t.KEY_QUOTE=t.KEY_RIGHT_BRACKET=t.KEY_BACKSLASH=t.KEY_LEFT_BRACKET=t.KEY_SLASH=t.KEY_PERIOD=t.KEY_MINUS=t.KEY_COMMA=t.KEY_EQUAL=t.KEY_SEMICOLON=t.KEY_F12=t.KEY_F11=t.KEY_F10=t.KEY_F9=t.KEY_F8=t.KEY_F7=t.KEY_F6=t.KEY_F5=t.KEY_F4=t.KEY_F3=t.KEY_F2=t.KEY_F1=t.KEY_Z=t.KEY_Y=t.KEY_X=t.KEY_W=t.KEY_V=t.KEY_U=t.KEY_T=t.KEY_S=t.KEY_R=t.KEY_Q=t.KEY_P=t.KEY_O=t.KEY_N=t.KEY_M=t.KEY_L=t.KEY_K=t.KEY_J=t.KEY_I=t.KEY_H=t.KEY_G=t.KEY_F=t.KEY_E=t.KEY_D=t.KEY_C=t.KEY_B=t.KEY_A=t.KEY_9=t.KEY_8=t.KEY_7=t.KEY_6=t.KEY_5=t.KEY_4=t.KEY_3=t.KEY_2=t.KEY_1=t.KEY_0=t.KEY_DELETE=t.KEY_INSERT=t.KEY_DOWN=t.KEY_RIGHT=t.KEY_UP=t.KEY_LEFT=t.KEY_HOME=t.KEY_END=t.KEY_PAGEDOWN=t.KEY_PAGEUP=t.KEY_SPACE=t.KEY_ESCAPE=t.KEY_CAPSLOCK=t.KEY_PAUSE=t.KEY_ALT=t.KEY_CTRL=t.KEY_SHIFT=t.KEY_ENTER=t.KEY_TAB=t.KEY_BACKSPACE=void 0;t.KEY_BACKSPACE=8;t.KEY_TAB=9;t.KEY_ENTER=13;t.KEY_SHIFT=16;t.KEY_CTRL=17;t.KEY_ALT=18;t.KEY_PAUSE=19;t.KEY_CAPSLOCK=20;t.KEY_ESCAPE=27;t.KEY_SPACE=32;t.KEY_PAGEUP=33;t.KEY_PAGEDOWN=34;t.KEY_END=35;t.KEY_HOME=36;t.KEY_LEFT=37;t.KEY_UP=38;t.KEY_RIGHT=39;t.KEY_DOWN=40;t.KEY_INSERT=45;t.KEY_DELETE=46;t.KEY_0=48;t.KEY_1=49;t.KEY_2=50;t.KEY_3=51;t.KEY_4=52;t.KEY_5=53;t.KEY_6=54;t.KEY_7=55;t.KEY_8=56;t.KEY_9=57;t.KEY_A=65;t.KEY_B=66;t.KEY_C=67;t.KEY_D=68;t.KEY_E=69;t.KEY_F=70;t.KEY_G=71;t.KEY_H=72;t.KEY_I=73;t.KEY_J=74;t.KEY_K=75;t.KEY_L=76;t.KEY_M=77;t.KEY_N=78;t.KEY_O=79;t.KEY_P=80;t.KEY_Q=81;t.KEY_R=82;t.KEY_S=83;t.KEY_T=84;t.KEY_U=85;t.KEY_V=86;t.KEY_W=87;t.KEY_X=88;t.KEY_Y=89;t.KEY_Z=90;t.KEY_F1=112;t.KEY_F2=113;t.KEY_F3=114;t.KEY_F4=115;t.KEY_F5=116;t.KEY_F6=117;t.KEY_F7=118;t.KEY_F8=119;t.KEY_F9=120;t.KEY_F10=121;t.KEY_F11=122;t.KEY_F12=123;t.KEY_SEMICOLON=186;t.KEY_EQUAL=187;t.KEY_COMMA=188;t.KEY_MINUS=189;t.KEY_PERIOD=190;t.KEY_SLASH=191;t.KEY_LEFT_BRACKET=219;t.KEY_BACKSLASH=220;t.KEY_RIGHT_BRACKET=221;t.KEY_QUOTE=222},97622:function(e,t){"use strict";t.__esModule=!0,t.numberOfDecimalDigits=t.keyOfMatchingRange=t.inRange=t.toFixed=t.round=t.scale=t.clamp01=t.clamp=void 0;t.clamp=function(e,t,n){return e<t?t:e>n?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,a=+((e*=n=Math.pow(10,t))>0)|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(a>0)),(r?e:Math.round(e))/n);var n,o,r,a};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var n=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=n;t.keyOfMatchingRange=function(e,t){for(var o=0,r=Object.keys(t);o<r.length;o++){var a=r[o],i=t[a];if(n(e,i))return a}};t.numberOfDecimalDigits=function(e){return Math.floor(e)!==e&&e.toString().split(".")[1].length||0}},28440:function(e,t){"use strict";var n;t.__esModule=!0,t.perf=void 0;null==(n=window.performance)||n.now;var o={mark:function(e,t){0},measure:function(e,t){}};t.perf=o},1060:function(e,t){"use strict";t.__esModule=!0,t.canRender=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];"string"==typeof o&&(t+=o+" ")}return t};t.normalizeChildren=function(e){return Array.isArray(e)?e.flat().filter((function(e){return e})):"object"==typeof e?[e]:[]};var n=function(e,t){var n;for(n in e)if(!(n in t))return!0;for(n in t)if(e[n]!==t[n])return!0;return!1};t.shallowDiffers=n;var o={onComponentShouldUpdate:function(e,t){return n(e,t)}};t.pureComponentHooks=o;t.canRender=function(e){return e!==undefined&&null!==e&&"boolean"!=typeof e}},465:function(e,t,n){"use strict";t.__esModule=!0,t.useSelector=t.useDispatch=t.createAction=t.combineReducers=t.applyMiddleware=t.createStore=void 0;var o=n(32416);function r(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.createStore=function i(e,t){if(t)return t(i)(e);var n,o=[],r=function(t){n=e(n,t);for(var r=0;r<o.length;r++)o[r]()};return r({type:"@@INIT"}),{dispatch:r,subscribe:function(e){o.push(e)},getState:function(){return n}}};t.applyMiddleware=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n){for(var r=arguments.length,a=new Array(r>1?r-1:0),i=1;i<r;i++)a[i-1]=arguments[i];var c=e.apply(void 0,[n].concat(a)),l=function(){throw new Error("Dispatching while constructing your middleware is not allowed.")},u={getState:c.getState,dispatch:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return l.apply(void 0,[e].concat(n))}},d=t.map((function(e){return e(u)}));return l=o.compose.apply(void 0,d)(c.dispatch),Object.assign({},c,{dispatch:l})}}};t.combineReducers=function(e){var t=Object.keys(e),n=!1;return function(o,a){void 0===o&&(o={});for(var i,c=Object.assign({},o),l=r(t);!(i=l()).done;){var u=i.value,d=e[u],s=o[u],p=d(s,a);s!==p&&(n=!0,c[u]=p)}return n?c:o}};t.createAction=function(e,t){void 0===t&&(t=null);var n=function(){if(!t)return{type:e,payload:arguments.length<=0?undefined:arguments[0]};var n=t.apply(void 0,arguments);if(!n)throw new Error("prepare function did not return an object");var o={type:e};return"payload"in n&&(o.payload=n.payload),"meta"in n&&(o.meta=n.meta),o};return n.toString=function(){return""+e},n.type=e,n.match=function(t){return t.type===e},n};t.useDispatch=function(e){return e.store.dispatch};t.useSelector=function(e,t){return t(e.store.getState())}},7151:function(e,t){"use strict";function n(e,t,n,o,r,a,i){try{var c=e[a](i),l=c.value}catch(u){return void n(u)}c.done?t(l):Promise.resolve(l).then(o,r)}function o(e){return function(){var t=this,o=arguments;return new Promise((function(r,a){var i=e.apply(t,o);function c(e){n(i,r,a,c,l,"next",e)}function l(e){n(i,r,a,c,l,"throw",e)}c(undefined)}))}}t.__esModule=!0,t.storage=t.IMPL_INDEXED_DB=t.IMPL_LOCAL_STORAGE=t.IMPL_MEMORY=void 0;t.IMPL_MEMORY=0;t.IMPL_LOCAL_STORAGE=1;t.IMPL_INDEXED_DB=2;var r="storage-v1",a="readwrite",i=function(e){return function(){try{return Boolean(e())}catch(t){return!1}}},c=i((function(){return window.localStorage&&window.localStorage.getItem})),l=i((function(){return(window.indexedDB||window.msIndexedDB)&&(window.IDBTransaction||window.msIDBTransaction)})),u=function(){function e(){this.impl=0,this.store={}}var t=e.prototype;return t.get=function(e){return this.store[e]},t.set=function(e,t){this.store[e]=t},t.remove=function(e){this.store[e]=undefined},t.clear=function(){this.store={}},e}(),d=function(){function e(){this.impl=1,this.store={}}var t=e.prototype;return t.get=function(e){var t=localStorage.getItem(e);if("string"==typeof t)return JSON.parse(t)},t.set=function(e,t){localStorage.setItem(e,JSON.stringify(t))},t.remove=function(e){localStorage.removeItem(e)},t.clear=function(){localStorage.clear()},e}(),s=function(){function e(){this.impl=2,this.dbPromise=new Promise((function(e,t){var n=(window.indexedDB||window.msIndexedDB).open("tgui",1);n.onupgradeneeded=function(){try{n.result.createObjectStore(r)}catch(e){t(new Error("Failed to upgrade IDB: "+n.error))}},n.onsuccess=function(){return e(n.result)},n.onerror=function(){t(new Error("Failed to open IDB: "+n.error))}}))}var t=e.prototype;return t.getStore=function(e){return this.dbPromise.then((function(t){return t.transaction(r,e).objectStore(r)}))},t.get=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getStore("readonly");case 2:return n=t.sent,t.abrupt("return",new Promise((function(t,o){var r=n.get(e);r.onsuccess=function(){return t(r.result)},r.onerror=function(){return o(r.error)}})));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.set=function(){var e=o(regeneratorRuntime.mark((function t(e,n){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return null===n&&(n=undefined),t.next=3,this.getStore(a);case 3:t.sent.put(n,e);case 5:case"end":return t.stop()}}),t,this)})));return function(t,n){return e.apply(this,arguments)}}(),t.remove=function(){var e=o(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getStore(a);case 2:t.sent["delete"](e);case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.clear=function(){var e=o(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.getStore(a);case 2:e.sent.clear();case 4:case"end":return e.stop()}}),t,this)})));return function(){return e.apply(this,arguments)}}(),e}(),p=function(){function e(){this.backendPromise=o(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!l()){e.next=10;break}return e.prev=1,t=new s,e.next=5,t.dbPromise;case 5:return e.abrupt("return",t);case 8:e.prev=8,e.t0=e["catch"](1);case 10:if(!c()){e.next=12;break}return e.abrupt("return",new d);case 12:return e.abrupt("return",new u);case 13:case"end":return e.stop()}}),e,null,[[1,8]])})))()}var t=e.prototype;return t.get=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return n=t.sent,t.abrupt("return",n.get(e));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.set=function(){var e=o(regeneratorRuntime.mark((function t(e,n){var o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return o=t.sent,t.abrupt("return",o.set(e,n));case 4:case"end":return t.stop()}}),t,this)})));return function(t,n){return e.apply(this,arguments)}}(),t.remove=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return n=t.sent,t.abrupt("return",n.remove(e));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.clear=function(){var e=o(regeneratorRuntime.mark((function t(){var e;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return e=t.sent,t.abrupt("return",e.clear());case 4:case"end":return t.stop()}}),t,this)})));return function(){return e.apply(this,arguments)}}(),e}(),m=new p;t.storage=m},21118:function(e,t){"use strict";function n(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.buildQueryString=t.decodeHtmlEntities=t.toTitleCase=t.capitalize=t.createSearch=t.createGlobPattern=t.multiline=void 0;t.multiline=function r(e){if(Array.isArray(e))return r(e.join(""));for(var t,o,a=e.split("\n"),i=n(a);!(o=i()).done;)for(var c=o.value,l=0;l<c.length;l++){if(" "!==c[l]){(t===undefined||l<t)&&(t=l);break}}return t||(t=0),a.map((function(e){return e.substr(t).trimRight()})).join("\n").trim()};t.createGlobPattern=function(e){var t=new RegExp("^"+e.split(/\*+/).map((function(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")})).join(".*")+"$");return function(e){return t.test(e)}};t.createSearch=function(e,t){var n=e.toLowerCase().trim();return function(e){if(!n)return!0;var o=t?t(e):e;return!!o&&o.toLowerCase().includes(n)}};t.capitalize=function a(e){return Array.isArray(e)?e.map(a):e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()};t.toTitleCase=function i(e){if(Array.isArray(e))return e.map(i);if("string"!=typeof e)return e;for(var t=e.replace(/([^\W_]+[^\s-]*) */g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})),n=0,o=["A","An","And","As","At","But","By","For","For","From","In","Into","Near","Nor","Of","On","Onto","Or","The","To","With"];n<o.length;n++){var r=new RegExp("\\s"+o[n]+"\\s","g");t=t.replace(r,(function(e){return e.toLowerCase()}))}for(var a=0,c=["Id","Tv"];a<c.length;a++){var l=new RegExp("\\b"+c[a]+"\\b","g");t=t.replace(l,(function(e){return e.toLowerCase()}))}return t};t.decodeHtmlEntities=function(e){if(!e)return e;var t={nbsp:" ",amp:"&",quot:'"',lt:"<",gt:">",apos:"'"};return e.replace(/<br>/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},53538:function(e,t){"use strict";t.__esModule=!0,t.sleep=t.debounce=void 0;t.debounce=function(e,t,n){var o;return void 0===n&&(n=!1),function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=n&&!o;clearTimeout(o),o=setTimeout((function(){o=null,n||e.apply(void 0,a)}),t),c&&e.apply(void 0,a)}};t.sleep=function(e){return new Promise((function(t){return setTimeout(t,e)}))}},67288:function(e,t,n){"use strict";t.__esModule=!0,t.vecNormalize=t.vecLength=t.vecInverse=t.vecScale=t.vecDivide=t.vecMultiply=t.vecSubtract=t.vecAdd=void 0;var o=n(1397),r=function(e,t){return e+t},a=function(e,t){return e-t},i=function(e,t){return e*t},c=function(e,t){return e/t};t.vecAdd=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(r)(e,t)}))(t)};t.vecSubtract=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(a)(e,t)}))(t)};t.vecMultiply=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(i)(e,t)}))(t)};var l=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(c)(e,t)}))(t)};t.vecDivide=l;t.vecScale=function(e,t){return(0,o.map)((function(e){return e*t}))(e)};t.vecInverse=function(e){return(0,o.map)((function(e){return-e}))(e)};var u=function(e){return Math.sqrt((0,o.reduce)(r)((0,o.zipWith)(i)(e,e)))};t.vecLength=u;t.vecNormalize=function(e){return l(e,u(e))}},88280:function(){"use strict";!function(e){if("undefined"!=typeof e.setAttribute){var t=function(e){return e.replace(/-[a-z]/g,(function(e){return e[1].toUpperCase()}))};e.setProperty=function(e,n){var o=t(e);if(!n)return this.removeAttribute(o);var r=String(n);return this.setAttribute(o,r)},e.getPropertyValue=function(e){var n=t(e);return this.getAttribute(n)||null},e.removeProperty=function(e){var n=t(e),o=this.getAttribute(n);return this.removeAttribute(n),o}}}(CSSStyleDeclaration.prototype)},15511:function(){"use strict";!function(e){function t(){return s.createDocumentFragment()}function n(e){return s.createElement(e)}function o(e,t){if(!e)throw new Error("Failed to construct "+t+": 1 argument required, but only 0 present.")}function r(e){if(1===e.length)return a(e[0]);for(var n=t(),o=T.call(e),r=0;r<e.length;r++)n.appendChild(a(o[r]));return n}function a(e){return"object"==typeof e?e:s.createTextNode(e)}for(var i,c,l,u,d,s=e.document,p=Object.prototype.hasOwnProperty,m=Object.defineProperty||function(e,t,n){return p.call(n,"value")?e[t]=n.value:(p.call(n,"get")&&e.__defineGetter__(t,n.get),p.call(n,"set")&&e.__defineSetter__(t,n.set)),e},f=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},h=function(e){var t="undefined"==typeof e.className,n=t?e.getAttribute("class")||"":e.className,o=t||"object"==typeof n,r=(o?t?n:n.baseVal:n).replace(C,"");r.length&&A.push.apply(this,r.split(N)),this._isSVG=o,this._=e},g={get:function(){return new h(this)},set:function(){}},C=/^\s+|\s+$/g,N=/\s+/,v="classList",b=function(e,t){return this.contains(e)?t||this.remove(e):(t===undefined||t)&&(t=!0,this.add(e)),!!t},V=e.DocumentFragment&&DocumentFragment.prototype,y=e.Node,x=(y||Element).prototype,I=e.CharacterData||y,k=I&&I.prototype,w=e.DocumentType,S=w&&w.prototype,_=(e.Element||y||e.HTMLElement).prototype,M=e.HTMLSelectElement||n("select").constructor,D=M.prototype.remove,B=e.SVGElement,A=["matches",_.matchesSelector||_.webkitMatchesSelector||_.khtmlMatchesSelector||_.mozMatchesSelector||_.msMatchesSelector||_.oMatchesSelector||function(e){var t=this.parentNode;return!!t&&-1<f.call(t.querySelectorAll(e),this)},"closest",function(e){for(var t,n=this;(t=n&&n.matches)&&!n.matches(e);)n=n.parentNode;return t?n:null},"prepend",function(){var e=this.firstChild,t=r(arguments);e?this.insertBefore(t,e):this.appendChild(t)},"append",function(){this.appendChild(r(arguments))},"before",function(){var e=this.parentNode;e&&e.insertBefore(r(arguments),this)},"after",function(){var e=this.parentNode,t=this.nextSibling,n=r(arguments);e&&(t?e.insertBefore(n,t):e.appendChild(n))},"toggleAttribute",function(e,t){var n=this.hasAttribute(e);return 1<arguments.length?n&&!t?this.removeAttribute(e):t&&!n&&this.setAttribute(e,""):n?this.removeAttribute(e):this.setAttribute(e,""),this.hasAttribute(e)},"replace",function(){this.replaceWith.apply(this,arguments)},"replaceWith",function(){var e=this.parentNode;e&&e.replaceChild(r(arguments),this)},"remove",function(){var e=this.parentNode;e&&e.removeChild(this)}],T=A.slice,L=A.length;L;L-=2)if((c=A[L-2])in _||(_[c]=A[L-1]),"remove"!==c||D._dom4||((M.prototype[c]=function(){return 0<arguments.length?D.apply(this,arguments):_.remove.call(this)})._dom4=!0),/^(?:before|after|replace|replaceWith|remove)$/.test(c)&&(I&&!(c in k)&&(k[c]=A[L-1]),w&&!(c in S)&&(S[c]=A[L-1])),/^(?:append|prepend)$/.test(c))if(V)c in V||(V[c]=A[L-1]);else try{t().constructor.prototype[c]=A[L-1]}catch(j){}var E;n("a").matches("a")||(_[c]=(E=_[c],function(e){return E.call(this.parentNode?this:t().appendChild(this),e)})),h.prototype={length:0,add:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)||A.push.call(this,c);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},contains:function(e){return function(t){return-1<(L=e.call(this,c=function(e){if(!e)throw"SyntaxError";if(N.test(e))throw"InvalidCharacterError";return e}(t)))}}([].indexOf||function(e){for(L=this.length;L--&&this[L]!==e;);return L}),item:function(e){return this[e]||null},remove:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)&&A.splice.call(this,L,1);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},toggle:b,toString:function(){return A.join.call(this," ")}},B&&!(v in B.prototype)&&m(B.prototype,v,g),v in s.documentElement?((u=n("div")[v]).add("a","b","a"),"a b"!=u&&("add"in(l=u.constructor.prototype)||(l=e.TemporaryTokenList.prototype),d=function(e){return function(){for(var t=0;t<arguments.length;)e.call(this,arguments[t++])}},l.add=d(l.add),l.remove=d(l.remove),l.toggle=b)):m(_,v,g),"contains"in x||m(x,"contains",{value:function(e){for(;e&&e!==this;)e=e.parentNode;return this===e}}),"head"in s||m(s,"head",{get:function(){return i||(i=s.getElementsByTagName("head")[0])}}),function(){for(var t,n=e.requestAnimationFrame,o=e.cancelAnimationFrame,r=["o","ms","moz","webkit"],a=r.length;!o&&a--;)n=n||e[r[a]+"RequestAnimationFrame"],o=e[r[a]+"CancelAnimationFrame"]||e[r[a]+"CancelRequestAnimationFrame"];o||(n?(t=n,n=function(e){var n=!0;return t((function(){n&&e.apply(this,arguments)})),function(){n=!1}},o=function(e){e()}):(n=function(e){return setTimeout(e,15,15)},o=function(e){clearTimeout(e)})),e.requestAnimationFrame=n,e.cancelAnimationFrame=o}();try{new e.CustomEvent("?")}catch(j){e.CustomEvent=function(e,t){function n(e,t,n,o){this.initEvent(e,t,n),this.detail=o}return function(o,r){var a=s.createEvent(e);if("string"!=typeof o)throw new Error("An event name must be provided");return"Event"==e&&(a.initCustomEvent=n),null==r&&(r=t),a.initCustomEvent(o,r.bubbles,r.cancelable,r.detail),a}}(e.CustomEvent?"CustomEvent":"Event",{bubbles:!1,cancelable:!1,detail:null})}try{new Event("_")}catch(j){j=function(e){function t(e,t){o(arguments.length,"Event");var n=s.createEvent("Event");return t||(t={}),n.initEvent(e,!!t.bubbles,!!t.cancelable),n}return t.prototype=e.prototype,t}(e.Event||function(){}),m(e,"Event",{value:j}),Event!==j&&(Event=j)}try{new KeyboardEvent("_",{})}catch(j){j=function(t){var n,r=0,a={char:"",key:"",location:0,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1,altGraphKey:!1,repeat:!1,locale:navigator.language,detail:0,bubbles:!1,cancelable:!1,keyCode:0,charCode:0,which:0};try{var i=s.createEvent("KeyboardEvent");i.initKeyboardEvent("keyup",!1,!1,e,"+",3,!0,!1,!0,!1,!1),r="+"==(i.keyIdentifier||i.key)&&3==(i.keyLocation||i.location)&&(i.ctrlKey?i.altKey?1:3:i.shiftKey?2:4)||9}catch(j){}function c(e,t,n){try{t[e]=n[e]}catch(j){}}function l(t,i){o(arguments.length,"KeyboardEvent"),i=function(e,t){for(var n in t)t.hasOwnProperty(n)&&!t.hasOwnProperty.call(e,n)&&(e[n]=t[n]);return e}(i||{},a);var l,u=s.createEvent(n),d=i.ctrlKey,p=i.shiftKey,m=i.altKey,f=i.metaKey,h=i.altGraphKey,g=r>3?function(e){for(var t=[],n=["ctrlKey","Control","shiftKey","Shift","altKey","Alt","metaKey","Meta","altGraphKey","AltGraph"],o=0;o<n.length;o+=2)e[n[o]]&&t.push(n[o+1]);return t.join(" ")}(i):null,C=String(i.key),N=String(i.char),v=i.location,b=i.keyCode||(i.keyCode=C)&&C.charCodeAt(0)||0,V=i.charCode||(i.charCode=N)&&N.charCodeAt(0)||0,y=i.bubbles,x=i.cancelable,I=i.repeat,k=i.locale,w=i.view||e;if(i.which||(i.which=i.keyCode),"initKeyEvent"in u)u.initKeyEvent(t,y,x,w,d,m,p,f,b,V);else if(0<r&&"initKeyboardEvent"in u){switch(l=[t,y,x,w],r){case 1:l.push(C,v,d,p,m,f,h);break;case 2:l.push(d,m,p,f,b,V);break;case 3:l.push(C,v,d,m,p,f,h);break;case 4:l.push(C,v,g,I,k);break;default:l.push(char,C,v,g,I,k)}u.initKeyboardEvent.apply(u,l)}else u.initEvent(t,y,x);for(C in u)a.hasOwnProperty(C)&&u[C]!==i[C]&&c(C,u,i);return u}return n=0<r?"KeyboardEvent":"Event",l.prototype=t.prototype,l}(e.KeyboardEvent||function(){}),m(e,"KeyboardEvent",{value:j}),KeyboardEvent!==j&&(KeyboardEvent=j)}try{new MouseEvent("_",{})}catch(j){j=function(t){function n(t,n){o(arguments.length,"MouseEvent");var r=s.createEvent("MouseEvent");return n||(n={}),r.initMouseEvent(t,!!n.bubbles,!!n.cancelable,n.view||e,n.detail||1,n.screenX||0,n.screenY||0,n.clientX||0,n.clientY||0,!!n.ctrlKey,!!n.altKey,!!n.shiftKey,!!n.metaKey,n.button||0,n.relatedTarget||null),r}return n.prototype=t.prototype,n}(e.MouseEvent||function(){}),m(e,"MouseEvent",{value:j}),MouseEvent!==j&&(MouseEvent=j)}s.querySelectorAll("*").forEach||function(){function e(e){var t=e.querySelectorAll;e.querySelectorAll=function(e){var n=t.call(this,e);return n.forEach=Array.prototype.forEach,n}}e(s),e(Element.prototype)}();try{s.querySelector(":scope *")}catch(j){!function(){var e="data-scope-"+(1e9*Math.random()>>>0),t=Element.prototype,n=t.querySelector,o=t.querySelectorAll;function r(t,n,o){t.setAttribute(e,null);var r=n.call(t,String(o).replace(/(^|,\s*)(:scope([ >]|$))/g,(function(t,n,o,r){return n+"["+e+"]"+(r||" ")})));return t.removeAttribute(e),r}t.querySelector=function(e){return r(this,n,e)},t.querySelectorAll=function(e){return r(this,o,e)}}()}}(window),function(e){var t=e.WeakMap||function(){var e,t=0,n=!1,o=!1;function r(t,r,a){o=a,n=!1,e=undefined,t.dispatchEvent(r)}function a(e){this.value=e}function c(){t++,this.__ce__=new i("@DOMMap:"+t+Math.random())}return a.prototype.handleEvent=function(t){n=!0,o?t.currentTarget.removeEventListener(t.type,this,!1):e=this.value},c.prototype={constructor:c,"delete":function(e){return r(e,this.__ce__,!0),n},get:function(t){r(t,this.__ce__,!1);var n=e;return e=undefined,n},has:function(e){return r(e,this.__ce__,!1),n},set:function(e,t){return r(e,this.__ce__,!0),e.addEventListener(this.__ce__.type,new a(t),!1),this}},c}();function n(){}function o(e,t,n){function r(e){r.once&&(e.currentTarget.removeEventListener(e.type,t,r),r.removed=!0),r.passive&&(e.preventDefault=o.preventDefault),"function"==typeof r.callback?r.callback.call(this,e):r.callback&&r.callback.handleEvent(e),r.passive&&delete e.preventDefault}return r.type=e,r.callback=t,r.capture=!!n.capture,r.passive=!!n.passive,r.once=!!n.once,r.removed=!1,r}n.prototype=(Object.create||Object)(null),o.preventDefault=function(){};var r,a,i=e.CustomEvent,c=e.dispatchEvent,l=e.addEventListener,u=e.removeEventListener,d=0,s=function(){d++},p=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},m=function(e){return"".concat(e.capture?"1":"0",e.passive?"1":"0",e.once?"1":"0")};try{l("_",s,{once:!0}),c(new i("_")),c(new i("_")),u("_",s,{once:!0})}catch(f){}1!==d&&(a=new t,r=function(e){if(e){var t=e.prototype;t.addEventListener=function(e){return function(t,r,i){if(i&&"boolean"!=typeof i){var c,l,u,d=a.get(this),s=m(i);d||a.set(this,d=new n),t in d||(d[t]={handler:[],wrap:[]}),l=d[t],(c=p.call(l.handler,r))<0?(c=l.handler.push(r)-1,l.wrap[c]=u=new n):u=l.wrap[c],s in u||(u[s]=o(t,r,i),e.call(this,t,u[s],u[s].capture))}else e.call(this,t,r,i)}}(t.addEventListener),t.removeEventListener=function(e){return function(t,n,o){if(o&&"boolean"!=typeof o){var r,i,c,l,u=a.get(this);if(u&&t in u&&(c=u[t],-1<(i=p.call(c.handler,n))&&(r=m(o))in(l=c.wrap[i]))){for(r in e.call(this,t,l[r],l[r].capture),delete l[r],l)return;c.handler.splice(i,1),c.wrap.splice(i,1),0===c.handler.length&&delete u[t]}}else e.call(this,t,n,o)}}(t.removeEventListener)}},e.EventTarget?r(EventTarget):(r(e.Text),r(e.Element||e.HTMLElement),r(e.HTMLDocument),r(e.Window||{prototype:e}),r(e.XMLHttpRequest)))}(window)},25513:function(e){"use strict";!function(t,n){var o,r,a=t.html5||{},i=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,l="_html5shiv",u=0,d={};function s(){var e=h.elements;return"string"==typeof e?e.split(" "):e}function p(e){var t=d[e[l]];return t||(t={},u++,e[l]=u,d[u]=t),t}function m(e,t,o){return t||(t=n),r?t.createElement(e):(o||(o=p(t)),!(a=o.cache[e]?o.cache[e].cloneNode():c.test(e)?(o.cache[e]=o.createElem(e)).cloneNode():o.createElem(e)).canHaveChildren||i.test(e)||a.tagUrn?a:o.frag.appendChild(a));var a}function f(e){e||(e=n);var t=p(e);return!h.shivCSS||o||t.hasCSS||(t.hasCSS=!!function(e,t){var n=e.createElement("p"),o=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",o.insertBefore(n.lastChild,o.firstChild)}(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),r||function(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return h.shivMethods?m(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+s().join().replace(/[\w\-:]+/g,(function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'}))+");return n}")(h,t.frag)}(e,t),e}!function(){try{var e=n.createElement("a");e.innerHTML="<xyz></xyz>",o="hidden"in e,r=1==e.childNodes.length||function(){n.createElement("a");var e=n.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(t){o=!0,r=!0}}();var h={elements:a.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:"3.7.3",shivCSS:!1!==a.shivCSS,supportsUnknownElements:r,shivMethods:!1!==a.shivMethods,type:"default",shivDocument:f,createElement:m,createDocumentFragment:function(e,t){if(e||(e=n),r)return e.createDocumentFragment();for(var o=(t=t||p(e)).frag.cloneNode(),a=0,i=s(),c=i.length;a<c;a++)o.createElement(i[a]);return o},addElements:function(e,t){var n=h.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),h.elements=n+" "+e,f(t)}};t.html5=h,f(n),e.exports&&(e.exports=h)}(window,document)},72090:function(){"use strict";!function(e){if(!document.createEvent){var t,n=!0,o=!1,r="onreadystatechange",a="DOMContentLoaded",i="__IE8__"+Math.random(),c=Object.defineProperty||function(e,t,n){e[t]=n.value},l=Object.defineProperties||function(t,n){for(var o in n)if(d.call(n,o))try{c(t,o,n[o])}catch(r){e.console}},u=Object.getOwnPropertyDescriptor,d=Object.prototype.hasOwnProperty,s=e.Element.prototype,p=e.Text.prototype,m=/^[a-z]+$/,f=/loaded|complete/,h={},g=document.createElement("div"),C=document.documentElement,N=C.removeAttribute,v=C.setAttribute,b=function(e){return{enumerable:!0,writable:!0,configurable:!0,value:e}};k(e.HTMLCommentElement.prototype,s,"nodeValue"),k(e.HTMLScriptElement.prototype,null,"text"),k(p,null,"nodeValue"),k(e.HTMLTitleElement.prototype,null,"text"),c(e.HTMLStyleElement.prototype,"textContent",(t=u(e.CSSStyleSheet.prototype,"cssText"),I((function(){return t.get.call(this.styleSheet)}),(function(e){t.set.call(this.styleSheet,e)}))));var V=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;c(e.CSSStyleDeclaration.prototype,"opacity",{get:function(){var e=this.filter.match(V);return e?(e[1]/100).toString():""},set:function(e){this.zoom=1;var t=!1;e=e<1?" alpha(opacity="+Math.round(100*e)+")":"",this.filter=this.filter.replace(V,(function(){return t=!0,e})),!t&&e&&(this.filter+=e)}}),l(s,{textContent:{get:S,set:B},firstElementChild:{get:function(){for(var e=this.childNodes||[],t=0,n=e.length;t<n;t++)if(1==e[t].nodeType)return e[t]}},lastElementChild:{get:function(){for(var e=this.childNodes||[],t=e.length;t--;)if(1==e[t].nodeType)return e[t]}},oninput:{get:function(){return this._oninput||null},set:function(e){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=e,e&&this.addEventListener("input",e))}},previousElementSibling:{get:function(){for(var e=this.previousSibling;e&&1!=e.nodeType;)e=e.previousSibling;return e}},nextElementSibling:{get:function(){for(var e=this.nextSibling;e&&1!=e.nodeType;)e=e.nextSibling;return e}},childElementCount:{get:function(){for(var e=0,t=this.childNodes||[],n=t.length;n--;e+=1==t[n].nodeType);return e}},addEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o,r,a=this,l="on"+e,u=a[i]||c(a,i,{value:{}})[i],s=u[l]||(u[l]={}),p=s.h||(s.h=[]);if(!d.call(s,"w")){if(s.w=function(e){return e[i]||x(a,A(0,e),p,!1)},!d.call(h,l))if(m.test(e)){try{(o=document.createEventObject())[i]=!0,9!=a.nodeType&&(null==a.parentNode&&g.appendChild(a),(r=a.getAttribute(l))&&N.call(a,l)),a.fireEvent(l,o),h[l]=!0}catch(f){for(h[l]=!1;g.hasChildNodes();)g.removeChild(g.firstChild)}null!=r&&v.call(a,l,r)}else h[l]=!1;(s.n=h[l])&&a.attachEvent(l,s.w)}w(p,t)<0&&p[n?"unshift":"push"](t),"input"===e&&a.attachEvent("onkeyup",_)}})),dispatchEvent:b((function(e){var t,n=this,o="on"+e.type,r=n[i],a=r&&r[o],c=!!a;return e.target||(e.target=n),c?a.n?n.fireEvent(o,e):x(n,e,a.h,!0):!(t=n.parentNode)||t.dispatchEvent(e),!e.defaultPrevented})),removeEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o="on"+e,r=this[i],a=r&&r[o],c=a&&a.h,l=c?w(c,t):-1;-1<l&&c.splice(l,1)}}))}),l(p,{addEventListener:b(s.addEventListener),dispatchEvent:b(s.dispatchEvent),removeEventListener:b(s.removeEventListener)}),l(e.XMLHttpRequest.prototype,{addEventListener:b((function(e,t,n){var o=this,r="on"+e,a=o[i]||c(o,i,{value:{}})[i],l=a[r]||(a[r]={}),u=l.h||(l.h=[]);w(u,t)<0&&(o[r]||(o[r]=function(){var t=document.createEvent("Event");t.initEvent(e,!0,!0),o.dispatchEvent(t)}),u[n?"unshift":"push"](t))})),dispatchEvent:b((function(e){var t=this,n="on"+e.type,o=t[i],r=o&&o[n];return!!r&&(r.n?t.fireEvent(n,e):x(t,e,r.h,!0))})),removeEventListener:b(s.removeEventListener)});var y=u(Event.prototype,"button").get;l(e.Event.prototype,{bubbles:b(!0),cancelable:b(!0),preventDefault:b((function(){this.cancelable&&(this.returnValue=!1)})),stopPropagation:b((function(){this.stoppedPropagation=!0,this.cancelBubble=!0})),stopImmediatePropagation:b((function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()})),initEvent:b((function(e,t,n){this.type=e,this.bubbles=!!t,this.cancelable=!!n,this.bubbles||this.stopPropagation()})),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+e.scrollX-(C.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+e.scrollY-(C.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?undefined:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return y.call(this)}},button:{get:function(){var e=this.buttons;return 1&e?0:2&e?2:4&e?1:undefined}},defaultPrevented:{get:function(){var e=this.returnValue;return!(void 0===e||e)}},relatedTarget:{get:function(){var e=this.type;return"mouseover"===e?this.fromElement:"mouseout"===e?this.toElement:null}}}),l(e.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?S.call(this):null},set:function(e){11===this.nodeType&&B.call(this,e)}},addEventListener:b((function(t,o,i){var c=this;s.addEventListener.call(c,t,o,i),n&&t===a&&!f.test(c.readyState)&&(n=!1,c.attachEvent(r,M),e==top&&function l(e){try{c.documentElement.doScroll("left"),M()}catch(t){setTimeout(l,50)}}())})),dispatchEvent:b(s.dispatchEvent),removeEventListener:b(s.removeEventListener),createEvent:b((function(e){var t;if("Event"!==e)throw new Error("unsupported "+e);return(t=document.createEventObject()).timeStamp=(new Date).getTime(),t}))}),l(e.Window.prototype,{getComputedStyle:b(function(){var e=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,t=/^(top|right|bottom|left)$/,n=/\-([a-z])/g,o=function(e,t){return t.toUpperCase()};function r(e){this._=e}function a(){}return r.prototype.getPropertyValue=function(r){var a,i,c,l=this._,u=l.style,d=l.currentStyle,s=l.runtimeStyle;return"opacity"==r?u.opacity||"1":(r=("float"===r?"style-float":r).replace(n,o),a=d?d[r]:u[r],e.test(a)&&!t.test(r)&&(i=u.left,(c=s&&s.left)&&(s.left=d.left),u.left="fontSize"===r?"1em":a,a=u.pixelLeft+"px",u.left=i,c&&(s.left=c)),null==a?a:a+""||"auto")},a.prototype.getPropertyValue=function(){return null},function(e,t){return t?new a(e):new r(e)}}()),addEventListener:b((function(t,n,o){var r,a=e,c="on"+t;a[c]||(a[c]=function(e){return x(a,A(0,e),r,!1)&&undefined}),w(r=a[c][i]||(a[c][i]=[]),n)<0&&r[o?"unshift":"push"](n)})),dispatchEvent:b((function(t){var n=e["on"+t.type];return!n||!1!==n.call(e,t)&&!t.defaultPrevented})),removeEventListener:b((function(t,n,o){var r=(e["on"+t]||Object)[i],a=r?w(r,n):-1;-1<a&&r.splice(a,1)})),pageXOffset:{get:D("scrollLeft")},pageYOffset:{get:D("scrollTop")},scrollX:{get:D("scrollLeft")},scrollY:{get:D("scrollTop")},innerWidth:{get:D("clientWidth")},innerHeight:{get:D("clientHeight")}}),e.HTMLElement=e.Element,function(e,t,n){for(n=0;n<t.length;n++)document.createElement(t[n]);e.length||document.createStyleSheet(""),e[0].addRule(t.join(","),"display:block;")}(document.styleSheets,["header","nav","section","article","aside","footer"]),function(){if(!document.createRange){document.createRange=function(){return new n};var e=n.prototype;e.cloneContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o].cloneNode(!0));return e},e.cloneRange=function(){var e=new n;return e._start=this._start,e._end=this._end,e},e.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.removeChild(n[o])},e.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o]);return e},e.setEndAfter=function(e){this._end=e},e.setEndBefore=function(e){this._end=e.previousSibling},e.setStartAfter=function(e){this._start=e.nextSibling},e.setStartBefore=function(e){this._start=e}}function t(e,t){for(var n=[e];e!==t;)n.push(e=e.nextSibling);return n}function n(){}}()}function x(e,t,n,o){for(var r,a,i=n.slice(),c=function(e,t){return e.currentTarget=t,e.eventPhase=e.target===e.currentTarget?2:3,e}(t,e),l=0,u=i.length;l<u&&("object"==typeof(r=i[l])?"function"==typeof r.handleEvent&&r.handleEvent(c):r.call(e,c),!c.stoppedImmediatePropagation);l++);return a=!c.stoppedPropagation,o&&a&&e.parentNode?e.parentNode.dispatchEvent(c):!c.defaultPrevented}function I(e,t){return{configurable:!0,get:e,set:t}}function k(e,t,n){var o=u(t||e,n);c(e,"textContent",I((function(){return o.get.call(this)}),(function(e){o.set.call(this,e)})))}function w(e,t){for(var n=e.length;n--&&e[n]!==t;);return n}function S(){if("BR"===this.tagName)return"\n";for(var e=this.firstChild,t=[];e;)8!==e.nodeType&&7!==e.nodeType&&t.push(e.textContent),e=e.nextSibling;return t.join("")}function _(e){var t=document.createEvent("Event");t.initEvent("input",!0,!0),(e.srcElement||e.fromElement||document).dispatchEvent(t)}function M(e){!o&&f.test(document.readyState)&&(o=!o,document.detachEvent(r,M),(e=document.createEvent("Event")).initEvent(a,!0,!0),document.dispatchEvent(e))}function D(e){return function(){return C[e]||document.body&&document.body[e]||0}}function B(e){for(var t;t=this.lastChild;)this.removeChild(t);null!=e&&this.appendChild(document.createTextNode(e))}function A(t,n){return n||(n=e.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}}(window)},37283:function(){"use strict";window.Int32Array||(window.Int32Array=Array)},57723:function(e,t){"use strict";t.__esModule=!0,t.assetMiddleware=t.resolveAsset=void 0;var n=[/v4shim/i],o={};t.resolveAsset=function(e){return o[e]||e};t.assetMiddleware=function(e){return function(e){return function(t){var r=t.type,a=t.payload;if("asset/stylesheet"!==r)if("asset/mappings"!==r)e(t);else for(var i=function(){var e=l[c];if(n.some((function(t){return t.test(e)})))return"continue";var t=a[e],r=e.split(".").pop();o[e]=t,"css"===r&&Byond.loadCss(t),"js"===r&&Byond.loadJs(t)},c=0,l=Object.keys(a);c<l.length;c++)i();else Byond.loadCss(a)}}}},31246:function(e,t,n){"use strict";t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.selectBackend=t.sendAct=t.sendMessage=t.backendMiddleware=t.backendReducer=t.backendSuspendSuccess=t.backendSuspendStart=t.backendSetSharedState=t.backendUpdate=void 0;var o=n(28440),r=n(465),a=n(41410),i=n(40509),c=n(79926),l=n(77960),u=["payload"];var d=(0,c.createLogger)("backend"),s=(0,r.createAction)("backend/update");t.backendUpdate=s;var p=(0,r.createAction)("backend/setSharedState");t.backendSetSharedState=p;var m=(0,r.createAction)("backend/suspendStart");t.backendSuspendStart=m;var f=function(){return{type:"backend/suspendSuccess",payload:{timestamp:Date.now()}}};t.backendSuspendSuccess=f;var h={config:{},data:{},shared:{},suspended:Date.now(),suspending:!1};t.backendReducer=function(e,t){void 0===e&&(e=h);var n=t.type,o=t.payload;if("backend/update"===n){var r=Object.assign({},e.config,o.config),a=Object.assign({},e.data,o.static_data,o.data),i=Object.assign({},e.shared);if(o.shared)for(var c=0,l=Object.keys(o.shared);c<l.length;c++){var u=l[c],d=o.shared[u];i[u]=""===d?undefined:JSON.parse(d)}return Object.assign({},e,{config:r,data:a,shared:i,suspended:!1})}if("backend/setSharedState"===n){var s,p=o.key,m=o.nextState;return Object.assign({},e,{shared:Object.assign({},e.shared,(s={},s[p]=m,s))})}if("backend/suspendStart"===n)return Object.assign({},e,{suspending:!0});if("backend/suspendSuccess"===n){var f=o.timestamp;return Object.assign({},e,{data:{},shared:{},config:Object.assign({},e.config,{title:"",status:1}),suspending:!1,suspended:f})}return e};t.backendMiddleware=function(e){var t,n;return function(r){return function(c){var u=N(e.getState()).suspended,p=c.type,m=c.payload;if("update"!==p)if("suspend"!==p){if("ping"!==p){if("backend/suspendStart"===p&&!n){d.log("suspending ("+window.__windowId__+")");var h=function(){return g({type:"suspend"})};h(),n=setInterval(h,2e3)}if("backend/suspendSuccess"===p&&((0,l.suspendRenderer)(),clearInterval(n),n=undefined,Byond.winset(window.__windowId__,{"is-visible":!1}),setImmediate((function(){(0,i.hasWindowFocus)()&&(0,i.focusMap)()}))),"backend/update"===p){var C,v,b=null==(C=m.config)||null==(v=C.window)?void 0:v.fancy;t===undefined?t=b:t!==b&&(d.log("changing fancy mode to",b),t=b,Byond.winset(window.__windowId__,{titlebar:!b,"can-resize":!b}))}return"backend/update"===p&&u&&(d.log("backend/update",m),(0,l.resumeRenderer)(),(0,a.setupDrag)(),setImmediate((function(){o.perf.mark("resume/start"),N(e.getState()).suspended||(Byond.winset(window.__windowId__,{"is-visible":!0}),o.perf.mark("resume/finish"))}))),r(c)}g({type:"pingReply"})}else e.dispatch(f());else e.dispatch(s(m))}}};var g=function(e){void 0===e&&(e={});var t=e,n=t.payload,o=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,u),r=Object.assign({tgui:1,window_id:window.__windowId__},o);null!==n&&n!==undefined&&(r.payload=JSON.stringify(n)),Byond.topic(r)};t.sendMessage=g;var C=function(e,t){void 0===t&&(t={}),"object"!=typeof t||null===t||Array.isArray(t)?d.error("Payload for act() must be an object, got this:",t):g({type:"act/"+e,payload:t})};t.sendAct=C;var N=function(e){return e.backend||{}};t.selectBackend=N;t.useBackend=function(e){var t=e.store,n=N(t.getState());return Object.assign({},n,{act:C})};t.useLocalState=function(e,t,n){var o,r=e.store,a=null!=(o=N(r.getState()).shared)?o:{},i=t in a?a[t]:n;return[i,function(e){r.dispatch(p({key:t,nextState:"function"==typeof e?e(i):e}))}]};t.useSharedState=function(e,t,n){var o,r=e.store,a=null!=(o=N(r.getState()).shared)?o:{},i=t in a?a[t]:n;return[i,function(e){g({type:"setSharedState",key:t,value:JSON.stringify("function"==typeof e?e(i):e)||""})}]}},54642:function(e,t,n){"use strict";t.__esModule=!0,t.AnimatedNumber=void 0;var o=n(96323),r=n(97622);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},c=.8333,l=function(e){var t,n;function l(t){var n;(n=e.call(this,t)||this).ref=(0,o.createRef)(),n.interval=void 0,n.currentValue=0;var r=t.initial,a=t.value;return r!==undefined&&i(r)?n.currentValue=r:i(a)&&(n.currentValue=a),n}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var u=l.prototype;return u.componentDidMount=function(){this.currentValue!==this.props.value&&this.startTicking()},u.componentWillUnmount=function(){this.stopTicking()},u.shouldComponentUpdate=function(e){return e.value!==this.props.value&&this.startTicking(),!1},u.startTicking=function(){var e=this;this.interval===undefined&&(this.interval=setInterval((function(){return e.tick()}),16.666666666666668))},u.stopTicking=function(){this.interval!==undefined&&(clearInterval(this.interval),this.interval=undefined)},u.tick=function(){var e=this.currentValue,t=this.props.value;i(t)?this.currentValue=e*c+t*(1-c):this.stopTicking(),Math.abs(t-this.currentValue)<Math.max(.001,.001*t)&&(this.currentValue=t,this.stopTicking()),this.ref.current&&(this.ref.current.textContent=this.getText())},u.getText=function(){var e=this.props,t=this.currentValue,n=e.format,o=e.value;if(!i(o))return String(o);if(n)return n(this.currentValue);var a=String(o).split(".")[1],c=a?a.length:0;return(0,r.toFixed)(t,(0,r.clamp)(c,0,8))},u.render=function(){return(0,o.createVNode)(1,"span",null,this.getText(),0,null,null,this.ref)},l}(o.Component);t.AnimatedNumber=l},75434:function(e,t,n){"use strict";t.__esModule=!0,t.Autofocus=void 0;var o=n(96323);function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}var a=function(e){var t,n;function a(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).ref=(0,o.createRef)(),t}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,r(t,n);var i=a.prototype;return i.componentDidMount=function(){var e=this;setTimeout((function(){var t;null==(t=e.ref.current)||t.focus()}),1)},i.render=function(){return(0,o.createVNode)(1,"div",null,this.props.children,0,{tabIndex:-1},null,this.ref)},a}(o.Component);t.Autofocus=a},90297:function(e,t,n){"use strict";t.__esModule=!0,t.Blink=void 0;var o=n(96323);function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}var a=function(e){var t,n;function a(){var t;return(t=e.call(this)||this).state={hidden:!1},t}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,r(t,n);var i=a.prototype;return i.createTimer=function(){var e=this,t=this.props,n=t.interval,o=void 0===n?1e3:n,r=t.time,a=void 0===r?1e3:r;clearInterval(this.interval),clearTimeout(this.timer),this.setState({hidden:!1}),this.interval=setInterval((function(){e.setState({hidden:!0}),e.timer=setTimeout((function(){e.setState({hidden:!1})}),a)}),o+a)},i.componentDidMount=function(){this.createTimer()},i.componentDidUpdate=function(e){e.interval===this.props.interval&&e.time===this.props.time||this.createTimer()},i.componentWillUnmount=function(){clearInterval(this.interval),clearTimeout(this.timer)},i.render=function(e){return(0,o.createVNode)(1,"span",null,e.children,0,{style:{visibility:this.state.hidden?"hidden":"visible"}})},a}(o.Component);t.Blink=a},7149:function(e,t,n){"use strict";t.__esModule=!0,t.BlockQuote=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className"];t.BlockQuote=function(e){var t=e.className,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["BlockQuote",t])},n)))}},54425:function(e,t,n){"use strict";t.__esModule=!0,t.Box=t.computeBoxClassName=t.computeBoxProps=t.halfUnit=t.unit=void 0;var o=n(1060),r=n(96323),a=n(10648),i=n(84200),c=["as","className","children"];var l=function(e){return"string"==typeof e?e.endsWith("px")&&!Byond.IS_LTE_IE8?parseFloat(e)/12+"rem":e:"number"==typeof e?Byond.IS_LTE_IE8?12*e+"px":e+"rem":void 0};t.unit=l;var u=function(e){return"string"==typeof e?l(e):"number"==typeof e?l(.5*e):void 0};t.halfUnit=u;var d=function(e){return"string"==typeof e&&i.CSS_COLORS.includes(e)},s=function(e){return function(t,n){"number"!=typeof n&&"string"!=typeof n||(t[e]=n)}},p=function(e,t){return function(n,o){"number"!=typeof o&&"string"!=typeof o||(n[e]=t(o))}},m=function(e,t){return function(n,o){o&&(n[e]=t)}},f=function(e,t,n){return function(o,r){if("number"==typeof r||"string"==typeof r)for(var a=0;a<n.length;a++)o[e+"-"+n[a]]=t(r)}},h=function(e){return function(t,n){d(n)||(t[e]=n)}},g={position:s("position"),overflow:s("overflow"),overflowX:s("overflow-x"),overflowY:s("overflow-y"),top:p("top",l),bottom:p("bottom",l),left:p("left",l),right:p("right",l),width:p("width",l),minWidth:p("min-width",l),maxWidth:p("max-width",l),height:p("height",l),minHeight:p("min-height",l),maxHeight:p("max-height",l),fontSize:p("font-size",l),fontFamily:s("font-family"),lineHeight:function(e,t){"number"==typeof t?e["line-height"]=t:"string"==typeof t&&(e["line-height"]=l(t))},opacity:s("opacity"),textAlign:s("text-align"),verticalAlign:s("vertical-align"),inline:m("display","inline-block"),bold:m("font-weight","bold"),italic:m("font-style","italic"),nowrap:m("white-space","nowrap"),preserveWhitespace:m("white-space","pre-wrap"),m:f("margin",u,["top","bottom","left","right"]),mx:f("margin",u,["left","right"]),my:f("margin",u,["top","bottom"]),mt:p("margin-top",u),mb:p("margin-bottom",u),ml:p("margin-left",u),mr:p("margin-right",u),p:f("padding",u,["top","bottom","left","right"]),px:f("padding",u,["left","right"]),py:f("padding",u,["top","bottom"]),pt:p("padding-top",u),pb:p("padding-bottom",u),pl:p("padding-left",u),pr:p("padding-right",u),color:h("color"),textColor:h("color"),backgroundColor:h("background-color"),fillPositionedParent:function(e,t){t&&(e.position="absolute",e.top=0,e.bottom=0,e.left=0,e.right=0)}},C=function(e){for(var t={},n={},o=0,r=Object.keys(e);o<r.length;o++){var a=r[o];if("style"!==a)if(Byond.IS_LTE_IE8&&"onClick"===a)t.onclick=e[a];else{var i=e[a],c=g[a];c?c(n,i):t[a]=i}}for(var l="",u=0,d=Object.keys(n);u<d.length;u++){var s=d[u];l+=s+":"+n[s]+";"}if(e.style)for(var p=0,m=Object.keys(e.style);p<m.length;p++){var f=m[p];l+=f+":"+e.style[f]+";"}return l.length>0&&(t.style=l),t};t.computeBoxProps=C;var N=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([d(t)&&"color-"+t,d(n)&&"color-bg-"+n])};t.computeBoxClassName=N;var v=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,i=e.children,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);if("function"==typeof i)return i(C(e));var u="string"==typeof o?o+" "+N(l):N(l),d=C(l);return(0,r.createVNode)(a.VNodeFlags.HtmlElement,n,u,i,a.ChildFlags.UnknownChildren,d,undefined)};t.Box=v,v.defaultHooks=o.pureComponentHooks},25808:function(e,t,n){"use strict";t.__esModule=!0,t.ButtonInput=t.ButtonConfirm=t.ButtonCheckbox=t.Button=void 0;var o=n(96323),r=n(57890),a=n(1060),i=n(79926),c=n(54425),l=n(65743),u=n(59463),d=["className","fluid","icon","iconRotation","iconSpin","iconColor","iconPosition","color","disabled","selected","tooltip","tooltipPosition","ellipsis","compact","circular","content","children","onclick","onClick","verticalAlignContent"],s=["checked"],p=["confirmContent","confirmColor","confirmIcon","icon","color","content","onClick"],m=["fluid","content","icon","iconRotation","iconSpin","tooltip","tooltipPosition","color","placeholder","maxLength"];function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,h(e,t)}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function g(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var C=(0,i.createLogger)("Button"),N=function(e){var t=e.className,n=e.fluid,i=e.icon,s=e.iconRotation,p=e.iconSpin,m=e.iconColor,f=e.iconPosition,h=e.color,N=e.disabled,v=e.selected,b=e.tooltip,V=e.tooltipPosition,y=e.ellipsis,x=e.compact,I=e.circular,k=e.content,w=e.children,S=e.onclick,_=e.onClick,M=e.verticalAlignContent,D=g(e,d),B=!(!k&&!w);S&&C.warn("Lowercase 'onclick' is not supported on Button and lowercase prop names are discouraged in general. Please use a camelCase'onClick' instead and read: https://infernojs.org/docs/guides/event-handling"),D.onClick=function(e){!N&&_&&_(e)},Byond.IS_LTE_IE8&&(D.unselectable=!0);var A=(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({className:(0,a.classes)(["Button",n&&"Button--fluid",N&&"Button--disabled",v&&"Button--selected",B&&"Button--hasContent",y&&"Button--ellipsis",I&&"Button--circular",x&&"Button--compact",f&&"Button--iconPosition--"+f,M&&"Button--flex",M&&n&&"Button--flex--fluid",M&&"Button--verticalAlignContent--"+M,h&&"string"==typeof h?"Button--color--"+h:"Button--color--default",t]),tabIndex:!N&&"0",onKeyUp:function(t){if(!1!==e.captureKeys){var n=window.event?t.which:t.keyCode;if(n===r.KEY_SPACE||n===r.KEY_ENTER)return t.preventDefault(),void(!N&&_&&_(t));n!==r.KEY_ESCAPE||t.preventDefault()}}},D,{children:(0,o.createVNode)(1,"div","Button__content",[i&&"right"!==f&&(0,o.createComponentVNode)(2,l.Icon,{name:i,color:m,rotation:s,spin:p}),k,w,i&&"right"===f&&(0,o.createComponentVNode)(2,l.Icon,{name:i,color:m,rotation:s,spin:p})],0)})));return b&&(A=(0,o.createComponentVNode)(2,u.Tooltip,{content:b,position:V,children:A})),A};t.Button=N,N.defaultHooks=a.pureComponentHooks;var v=function(e){var t=e.checked,n=g(e,s);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({color:"transparent",icon:t?"check-square-o":"square-o",selected:t},n)))};t.ButtonCheckbox=v,N.Checkbox=v;var b=function(e){function t(){var t;return(t=e.call(this)||this).state={clickedOnce:!1},t.handleClick=function(){t.state.clickedOnce&&t.setClickedOnce(!1)},t}f(t,e);var n=t.prototype;return n.setClickedOnce=function(e){var t=this;this.setState({clickedOnce:e}),e?setTimeout((function(){return window.addEventListener("click",t.handleClick)})):window.removeEventListener("click",this.handleClick)},n.render=function(){var e=this,t=this.props,n=t.confirmContent,r=void 0===n?"Confirm?":n,a=t.confirmColor,i=void 0===a?"bad":a,c=t.confirmIcon,l=t.icon,u=t.color,d=t.content,s=t.onClick,m=g(t,p);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({content:this.state.clickedOnce?r:d,icon:this.state.clickedOnce?c:l,color:this.state.clickedOnce?i:u,onClick:function(){return e.state.clickedOnce?s():e.setClickedOnce(!0)}},m)))},t}(o.Component);t.ButtonConfirm=b,N.Confirm=b;var V=function(e){function t(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={inInput:!1},t}f(t,e);var n=t.prototype;return n.setInInput=function(e){if(this.setState({inInput:e}),this.inputRef){var t=this.inputRef.current;if(e){t.value=this.props.currentValue||"";try{t.focus(),t.select()}catch(n){}}}},n.commitResult=function(e){if(this.inputRef){var t=this.inputRef.current;if(""!==t.value)return void this.props.onCommit(e,t.value);if(!this.props.defaultValue)return;this.props.onCommit(e,this.props.defaultValue)}},n.render=function(){var e=this,t=this.props,n=t.fluid,i=t.content,d=t.icon,s=t.iconRotation,p=t.iconSpin,f=t.tooltip,h=t.tooltipPosition,C=t.color,N=void 0===C?"default":C,v=(t.placeholder,t.maxLength,g(t,m)),b=(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({className:(0,a.classes)(["Button",n&&"Button--fluid","Button--color--"+N])},v,{onClick:function(){return e.setInInput(!0)},children:[d&&(0,o.createComponentVNode)(2,l.Icon,{name:d,rotation:s,spin:p}),(0,o.createVNode)(1,"div",null,i,0),(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:this.state.inInput?undefined:"none","text-align":"left"},onBlur:function(t){e.state.inInput&&(e.setInInput(!1),e.commitResult(t))},onKeyDown:function(t){if(t.keyCode===r.KEY_ENTER)return e.setInInput(!1),void e.commitResult(t);t.keyCode===r.KEY_ESCAPE&&e.setInInput(!1)}},null,this.inputRef)]})));return f&&(b=(0,o.createComponentVNode)(2,u.Tooltip,{content:f,position:h,children:b})),b},t}(o.Component);t.ButtonInput=V,N.Input=V},44051:function(e,t,n){"use strict";t.__esModule=!0,t.ByondUi=void 0;var o=n(96323),r=n(1060),a=n(53538),i=n(79926),c=n(54425),l=["params"],u=["params"],d=["params"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function p(e,t){return p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},p(e,t)}var m=(0,i.createLogger)("ByondUi"),f=[];window.addEventListener("beforeunload",(function(){for(var e=0;e<f.length;e++){var t=f[e];"string"==typeof t&&(m.log("unmounting '"+t+"' (beforeunload)"),f[e]=null,Byond.winset(t,{"is-visible":"false"}))}}));var h=function(e){var t,n;function i(t){var n,r;(r=e.call(this,t)||this).containerRef=(0,o.createRef)(),r.byondUiElement=function(e){var t=f.length;f.push(null);var n=e||"byondui_"+t;return m.log("allocated '"+n+"'"),{render:function(e){f[t]=n,e["is-visible"]="true",Byond.winset(n,e)},unmount:function(){m.log("unmounting '"+n+"'"),f[t]=null,Byond.winset(n,{"is-visible":"false"})}}}(null==(n=t.params)?void 0:n.id),r.handleResize=(0,a.debounce)((function(){r.forceUpdate()}),100);var i=!1;return r.handleScroll=function(){i||(window.requestAnimationFrame((function(){r.componentDidUpdate(),i=!1})),i=!0)},r}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,p(t,n);var h=i.prototype;return h.shouldComponentUpdate=function(e){var t=this.props,n=t.params,o=void 0===n?{}:n,a=s(t,l),i=e.params,c=void 0===i?{}:i,d=s(e,u);return(0,r.shallowDiffers)(o,c)||(0,r.shallowDiffers)(a,d)},h.componentDidMount=function(){Byond.IS_LTE_IE10||(window.addEventListener("resize",this.handleResize),window.addEventListener("scroll",this.handleScroll,!0),this.componentDidUpdate(),this.handleResize())},h.componentDidUpdate=function(){if(!Byond.IS_LTE_IE10){var e,t,n=this.props,o=n.params,r=void 0===o?{}:o,a=n.hideOnScroll;if(this.containerRef.current){var i=(e=this.containerRef.current,{pos:[(t=e.getBoundingClientRect()).left,t.top],size:[t.right-t.left,t.bottom-t.top]});if(m.debug("bounding box",i),a&&i.pos[1]<32)return void this.byondUiElement.unmount();this.byondUiElement.render(Object.assign({parent:window.__windowId__},r,{pos:i.pos[0]+","+i.pos[1],size:i.size[0]+"x"+i.size[1]}))}}},h.componentWillUnmount=function(){Byond.IS_LTE_IE10||(window.removeEventListener("resize",this.handleResize),window.removeEventListener("scroll",this.handleScroll,!0),this.byondUiElement.unmount())},h.render=function(){var e=this.props,t=(e.params,s(e,d)),n=(0,c.computeBoxProps)(t);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(1,"div",null,null,1,{style:{"min-height":"22px"}}),0,Object.assign({},n),null,this.containerRef))},i}(o.Component);t.ByondUi=h},64726:function(e,t,n){"use strict";t.__esModule=!0,t.Chart=void 0;var o=n(96323),r=n(1397),a=n(1060),i=n(54425),c=["data","rangeX","rangeY","fillColor","strokeColor","strokeWidth"];function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function a(t){var n;return(n=e.call(this,t)||this).ref=(0,o.createRef)(),n.state={viewBox:[600,200]},n.handleResize=function(){var e=n.ref.current;n.setState({viewBox:[e.offsetWidth,e.offsetHeight]})},n}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n);var u=a.prototype;return u.componentDidMount=function(){window.addEventListener("resize",this.handleResize),this.handleResize()},u.componentWillUnmount=function(){window.removeEventListener("resize",this.handleResize)},u.render=function(){var e=this,t=this.props,n=t.data,a=void 0===n?[]:n,l=t.rangeX,u=t.rangeY,d=t.fillColor,s=void 0===d?"none":d,p=t.strokeColor,m=void 0===p?"#ffffff":p,f=t.strokeWidth,h=void 0===f?2:f,g=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,c),C=this.state.viewBox,N=function(e,t,n,o){if(0===e.length)return[];var a=(0,r.zipWith)(Math.min).apply(void 0,e),i=(0,r.zipWith)(Math.max).apply(void 0,e);return n!==undefined&&(a[0]=n[0],i[0]=n[1]),o!==undefined&&(a[1]=o[0],i[1]=o[1]),(0,r.map)((function(e){return(0,r.zipWith)((function(e,t,n,o){return(e-t)/(n-t)*o}))(e,a,i,t)}))(e)}(a,C,l,u);if(N.length>0){var v=N[0],b=N[N.length-1];N.push([C[0]+h,b[1]]),N.push([C[0]+h,-h]),N.push([-h,-h]),N.push([-h,v[1]])}var V=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];t+=o[0]+","+o[1]+" "}return t}(N);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({position:"relative"},g,{children:function(t){return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(32,"svg",null,(0,o.createVNode)(32,"polyline",null,null,1,{transform:"scale(1, -1) translate(0, -"+C[1]+")",fill:s,stroke:m,"stroke-width":h,points:V}),2,{viewBox:"0 0 "+C[0]+" "+C[1],preserveAspectRatio:"none",style:{position:"absolute",top:0,left:0,right:0,bottom:0,overflow:"hidden"}}),2,Object.assign({},t),null,e.ref))}})))},a}(o.Component);u.defaultHooks=a.pureComponentHooks;var d={Line:Byond.IS_LTE_IE8?function(e){return null}:u};t.Chart=d},49751:function(e,t,n){"use strict";t.__esModule=!0,t.Collapsible=void 0;var o=n(96323),r=n(54425),a=n(25808),i=["children","color","title","buttons"];function c(e,t){return c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},c(e,t)}var l=function(e){var t,n;function l(t){var n;n=e.call(this,t)||this;var o=t.open;return n.state={open:o||!1},n}return n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,c(t,n),l.prototype.render=function(){var e=this,t=this.props,n=this.state.open,c=t.children,l=t.color,u=void 0===l?"default":l,d=t.title,s=t.buttons,p=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,i);return(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createVNode)(1,"div","Table",[(0,o.createVNode)(1,"div","Table__cell",(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({fluid:!0,color:u,icon:n?"chevron-down":"chevron-right",onClick:function(){return e.setState({open:!n})}},p,{children:d}))),2),s&&(0,o.createVNode)(1,"div","Table__cell Table__cell--collapsing",s,0)],0),n&&(0,o.createComponentVNode)(2,r.Box,{mt:1,children:c})]})},l}(o.Component);t.Collapsible=l},47233:function(e,t,n){"use strict";t.__esModule=!0,t.ColorBox=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["content","children","className","color","backgroundColor"];var c=function(e){var t=e.content,n=(e.children,e.className),c=e.color,l=e.backgroundColor,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return u.color=t?null:"transparent",u.backgroundColor=c||l,(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["ColorBox",n,(0,a.computeBoxClassName)(u)]),t||".",0,Object.assign({},(0,a.computeBoxProps)(u))))};t.ColorBox=c,c.defaultHooks=r.pureComponentHooks},93913:function(e,t,n){"use strict";t.__esModule=!0,t.Dimmer=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","children","full"];t.Dimmer=function(e){var t=e.className,n=e.children,c=e.full,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["Dimmer",!!c&&"Dimmer--full"].concat(t))},l,{children:(0,o.createVNode)(1,"div","Dimmer__inner",n,0)})))}},22755:function(e,t,n){"use strict";t.__esModule=!0,t.Divider=void 0;var o=n(96323),r=n(1060);t.Divider=function(e){var t=e.vertical,n=e.hidden;return(0,o.createVNode)(1,"div",(0,r.classes)(["Divider",n&&"Divider--hidden",t?"Divider--vertical":"Divider--horizontal"]))}},42833:function(e,t,n){"use strict";t.__esModule=!0,t.DraggableControl=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642);function c(e,t){return c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},c(e,t)}var l=function(e,t){return e.screenX*t[0]+e.screenY*t[1]},u=function(e){var t,n;function a(t){var n;return(n=e.call(this,t)||this).inputRef=(0,o.createRef)(),n.state={value:t.value,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props,o=t.value,r=t.dragMatrix;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:l(e,r),value:o,internalValue:o}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,a=n.props.onDrag;o&&a&&a(e,r)}),n.props.updateRate||400),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,a=t.maxValue,i=t.step,c=t.stepPixelSize,u=t.dragMatrix;n.setState((function(t){var n=Object.assign({},t),d=l(e,u)-n.origin;if(t.dragging){var s=Number.isFinite(o)?o%i:0;n.internalValue=(0,r.clamp)(n.internalValue+d*i/c,o-i,a+i),n.value=(0,r.clamp)(n.internalValue-n.internalValue%i+s,o,a),n.origin=l(e,u)}else Math.abs(d)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,a=n.state,i=a.dragging,c=a.value,l=a.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!i,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),i)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var u=n.inputRef.current;u.value=l;try{u.focus(),u.select()}catch(d){}}},n}return n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,c(t,n),a.prototype.render=function(){var e=this,t=this.state,n=t.dragging,a=t.editing,c=t.value,l=t.suppressingFlicker,u=this.props,d=u.animated,s=u.value,p=u.unit,m=u.minValue,f=u.maxValue,h=u.unclamped,g=u.format,C=u.onChange,N=u.onDrag,v=u.children,b=u.height,V=u.lineHeight,y=u.fontSize,x=s;(n||l)&&(x=c);var I=function(e){return e+(p?" "+p:"")},k=d&&!n&&!l&&(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:x,format:g,children:I})||I(g?g(x):x),w=(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:a?undefined:"none",height:b,"line-height":V,"font-size":y},onBlur:function(t){if(a){var n;if(h)n=t.target.value;else if(n=(0,r.clamp)(parseFloat(t.target.value),m,f),Number.isNaN(n))return void e.setState({editing:!1});e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),N&&N(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n;if(h)n=t.target.value;else if(n=(0,r.clamp)(parseFloat(t.target.value),m,f),Number.isNaN(n))return void e.setState({editing:!1});return e.setState({editing:!1,value:n}),e.suppressFlicker(),C&&C(t,n),void(N&&N(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef);return v({dragging:n,editing:a,value:s,displayValue:x,displayElement:k,inputElement:w,handleDragStart:this.handleDragStart})},a}(o.Component);t.DraggableControl=u,u.defaultHooks=a.pureComponentHooks,u.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50,dragMatrix:[1,0]}},12489:function(e,t,n){"use strict";t.__esModule=!0,t.Dropdown=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(65743),c=["icon","iconRotation","iconSpin","clipSelectedText","color","dropdownStyle","over","noscroll","nochevron","width","onClick","onOpen","selected","disabled","displayText"],l=["className"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function d(e,t){return d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},d(e,t)}var s=function(e){var t,n;function s(t){var n;return(n=e.call(this,t)||this).state={selected:t.selected,open:!1},n.handleClick=function(){n.state.open&&n.setOpen(!1)},n}n=e,(t=s).prototype=Object.create(n.prototype),t.prototype.constructor=t,d(t,n);var p=s.prototype;return p.componentWillUnmount=function(){window.removeEventListener("click",this.handleClick)},p.setOpen=function(e){var t=this;this.setState({open:e}),e?(setTimeout((function(){return window.addEventListener("click",t.handleClick)})),this.menuRef.focus()):window.removeEventListener("click",this.handleClick)},p.setSelected=function(e){this.setState({selected:e}),this.setOpen(!1),this.props.onSelected(e)},p.buildMenu=function(){var e=this,t=this.props.options,n=(void 0===t?[]:t).map((function(t){var n,r;return"string"==typeof t?(n=t,r=t):(n=t.displayText,r=t.value),(0,o.createComponentVNode)(2,a.Box,{className:"Dropdown__menuentry",onClick:function(){e.setSelected(r)},children:n},r)}));return n.length?n:"No Options Found"},p.render=function(){var e=this,t=this.props,n=t.icon,d=t.iconRotation,s=t.iconSpin,p=t.clipSelectedText,m=void 0===p||p,f=t.color,h=void 0===f?"default":f,g=t.dropdownStyle,C=t.over,N=t.noscroll,v=t.nochevron,b=t.width,V=(t.onClick,t.onOpen,t.selected,t.disabled),y=t.displayText,x=u(t,c),I=x.className,k=u(x,l),w=C?!this.state.open:this.state.open,S=this.state.open?(0,o.createVNode)(1,"div",(0,r.classes)([N?"Dropdown__menu-noscroll":"Dropdown__menu",C&&"Dropdown__over"]),this.buildMenu(),0,{tabIndex:"-1",style:{width:b}},null,(function(t){e.menuRef=t})):null;return(0,o.createVNode)(1,"div","Dropdown",[(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({width:b,className:(0,r.classes)(["Dropdown__control","Button","Button--color--"+h,V&&"Button--disabled",I])},k,{onClick:function(n){V&&!e.state.open||(e.setOpen(!e.state.open),t.onOpen&&t.onOpen(n))},children:[n&&(0,o.createComponentVNode)(2,i.Icon,{name:n,rotation:d,spin:s,mr:1}),(0,o.createVNode)(1,"span","Dropdown__selected-text",y||this.state.selected,0,{style:{overflow:m?"hidden":"visible"}}),!!v||(0,o.createVNode)(1,"span","Dropdown__arrow-button",(0,o.createComponentVNode)(2,i.Icon,{name:w?"chevron-up":"chevron-down"}),2)]}))),S],0,{style:g})},s}(o.Component);t.Dropdown=s},67486:function(e,t,n){"use strict";t.__esModule=!0,t.computeFlexItemProps=t.computeFlexItemClassName=t.Flex=t.computeFlexProps=t.computeFlexClassName=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","direction","wrap","align","justify","inline"],c=["className"],l=["className","style","grow","order","shrink","basis","align"],u=["className"];function d(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var s=function(e){return(0,r.classes)(["Flex",e.inline&&"Flex--inline",Byond.IS_LTE_IE10&&"Flex--iefix",Byond.IS_LTE_IE10&&"column"===e.direction&&"Flex--iefix--column",(0,a.computeBoxClassName)(e)])};t.computeFlexClassName=s;var p=function(e){e.className;var t=e.direction,n=e.wrap,o=e.align,r=e.justify,c=(e.inline,d(e,i));return(0,a.computeBoxProps)(Object.assign({style:Object.assign({},c.style,{"flex-direction":t,"flex-wrap":!0===n?"wrap":n,"align-items":o,"justify-content":r})},c))};t.computeFlexProps=p;var m=function(e){var t=e.className,n=d(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)([t,s(n)]),null,1,Object.assign({},p(n))))};t.Flex=m,m.defaultHooks=r.pureComponentHooks;var f=function(e){return(0,r.classes)(["Flex__item",Byond.IS_LTE_IE10&&"Flex__item--iefix",(0,a.computeBoxClassName)(e)])};t.computeFlexItemClassName=f;var h=function(e){e.className;var t,n=e.style,o=e.grow,r=e.order,i=e.shrink,c=e.basis,u=e.align,s=d(e,l),p=null!=(t=null!=c?c:e.width)?t:o!==undefined?0:undefined;return(0,a.computeBoxProps)(Object.assign({style:Object.assign({},n,{"flex-grow":o!==undefined&&Number(o),"flex-shrink":i!==undefined&&Number(i),"flex-basis":(0,a.unit)(p),order:r,"align-self":u})},s))};t.computeFlexItemProps=h;var g=function(e){var t=e.className,n=d(e,u);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)([t,f(e)]),null,1,Object.assign({},h(n))))};g.defaultHooks=r.pureComponentHooks,m.Item=g},28408:function(e,t,n){"use strict";t.__esModule=!0,t.GridColumn=t.Grid=void 0;var o=n(96323),r=n(28581),a=n(1060),i=["children"],c=["size","style"];function l(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var u=function(e){var t=e.children,n=l(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table,Object.assign({},n,{children:(0,o.createComponentVNode)(2,r.Table.Row,{children:t})})))};t.Grid=u,u.defaultHooks=a.pureComponentHooks;var d=function(e){var t=e.size,n=void 0===t?1:t,a=e.style,i=l(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table.Cell,Object.assign({style:Object.assign({width:n+"%"},a)},i)))};t.GridColumn=d,u.defaultHooks=a.pureComponentHooks,u.Column=d},65743:function(e,t,n){"use strict";t.__esModule=!0,t.IconStack=t.Icon=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["name","size","spin","className","style","rotation","inverse"],c=["className","style","children"];function l(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var u=/-o$/,d=function(e){var t=e.name,n=e.size,c=e.spin,d=e.className,s=e.style,p=void 0===s?{}:s,m=e.rotation,f=(e.inverse,l(e,i));n&&(p["font-size"]=100*n+"%"),"number"==typeof m&&(p.transform="rotate("+m+"deg)");var h=u.test(t),g=t.replace(u,"");return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"i",className:(0,r.classes)(["Icon",d,h?"fa-regular":"fa-solid","fa-"+g,c&&"fa-spin"]),style:p},f)))};t.Icon=d,d.defaultHooks=r.pureComponentHooks;var s=function(e){var t=e.className,n=e.style,i=void 0===n?{}:n,u=e.children,d=l(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"span","class":(0,r.classes)(["IconStack",t]),style:i},d,{children:u})))};t.IconStack=s,d.Stack=s},94261:function(e,t,n){"use strict";t.__esModule=!0,t.Image=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["pixelated","className"];t.Image=function(e){var t=e.pixelated,n=e.className,c=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"img"},c,{style:t&&{"-ms-interpolation-mode":"nearest-neighbor"},className:(0,r.classes)("Image",n)})))}},77863:function(e,t,n){"use strict";t.__esModule=!0,t.Input=t.toInputValue=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(57890),c=["selfClear","onInput","onChange","onEnter","value","maxLength","placeholder"],l=["className","fluid","monospace"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function d(e,t){return d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},d(e,t)}var s=function(e){return"number"!=typeof e&&"string"!=typeof e?"":String(e)};t.toInputValue=s;var p=function(e){var t,n;function p(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={editing:!1,history:[],historyIndex:0},t.handleInput=function(e){var n=t.state.editing,o=t.props.onInput;n||t.setEditing(!0),o&&o(e,e.target.value)},t.handleFocus=function(e){t.state.editing||t.setEditing(!0)},t.handleBlur=function(e){var n=t.state.editing,o=t.props.onChange;n&&(t.setEditing(!1),o&&o(e,e.target.value))},t.navigateHistory=function(e,n){var o=t.state.historyIndex+e,r=!1;(e>0&&o<t.state.history.length||e<0&&o>=0)&&(r=!0),r?(n.target.value=t.state.history[o],t.state.historyIndex=o):e>0&&(n.target.value="",t.state.historyIndex=t.state.history.length)},t.appendHistory=function(e){this.state.history[this.state.history.length-1]!==e&&this.state.history.push(e),this.state.historyIndex=this.state.history.length},t.handleKeyDown=function(e){var n=t.props,o=n.onInput,r=n.onChange,a=n.onEnter,c=n.history;return e.keyCode===i.KEY_ENTER?(t.setEditing(!1),r&&r(e,e.target.value),o&&o(e,e.target.value),a&&a(e,e.target.value),c&&t.appendHistory(e.target.value),void(t.props.selfClear?e.target.value="":e.target.blur())):e.keyCode===i.KEY_ESCAPE?t.props.onEscape?void t.props.onEscape(e):(t.setEditing(!1),e.target.value=s(t.props.value),void e.target.blur()):void(c&&(e.keyCode===i.KEY_UP?t.navigateHistory(-1,e):e.keyCode===i.KEY_DOWN&&t.navigateHistory(1,e)))},t}n=e,(t=p).prototype=Object.create(n.prototype),t.prototype.constructor=t,d(t,n);var m=p.prototype;return m.componentDidMount=function(){var e=this,t=this.props.value,n=this.inputRef.current;n&&(n.value=s(t)),(this.props.autoFocus||this.props.autoSelect)&&setTimeout((function(){n.focus(),e.props.autoSelect&&n.select()}),1)},m.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,a=this.inputRef.current;a&&!n&&o!==r&&(a.value=s(r))},m.setEditing=function(e){this.setState({editing:e})},m.render=function(){var e=this.props,t=(e.selfClear,e.onInput,e.onChange,e.onEnter,e.value,e.maxLength),n=e.placeholder,i=u(e,c),d=i.className,s=i.fluid,p=i.monospace,m=u(i,l);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["Input",s&&"Input--fluid",p&&"Input--monospace",d])},m,{children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{placeholder:n,onInput:this.handleInput,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown,maxLength:t},null,this.inputRef)]})))},p}(o.Component);t.Input=p},54291:function(e,t,n){"use strict";t.__esModule=!0,t.Interactive=void 0;var o=n(96323),r=n(97622);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return e&&e.ownerDocument.defaultView||self},c=function(e,t){var n=e.getBoundingClientRect(),o=t;return{left:(0,r.clamp)((o.pageX-(n.left+i(e).pageXOffset))/n.width,0,1),top:(0,r.clamp)((o.pageY-(n.top+i(e).pageYOffset))/n.height,0,1)}},l=function(e){var t,n;function r(t){var n;return(n=e.call(this)||this).containerRef=void 0,n.props=void 0,n.handleMoveStart=function(e){var t,o=null==(t=n.containerRef)?void 0:t.current;o&&(e.preventDefault(),o.focus(),n.props.onMove(c(o,e)),n.toggleDocumentEvents(!0))},n.handleMove=function(e){var t;e.preventDefault(),e.buttons>0&&null!=(t=n.containerRef)&&t.current?n.props.onMove(c(n.containerRef.current,e)):n.toggleDocumentEvents(!1)},n.handleMoveEnd=function(){n.toggleDocumentEvents(!1)},n.handleKeyDown=function(e){var t=e.which||e.keyCode;t<37||t>40||(e.preventDefault(),n.props.onKey({left:39===t?.05:37===t?-.05:0,top:40===t?.05:38===t?-.05:0}))},n.props=t,n.containerRef=(0,o.createRef)(),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var l=r.prototype;return l.toggleDocumentEvents=function(e){var t,n=null==(t=this.containerRef)?void 0:t.current,o=i(n),r=e?o.addEventListener:o.removeEventListener;r("mousemove",this.handleMove),r("mouseup",this.handleMoveEnd)},l.componentDidMount=function(){this.toggleDocumentEvents(!0)},l.componentWillUnmount=function(){this.toggleDocumentEvents(!1)},l.render=function(){return(0,o.normalizeProps)((0,o.createVNode)(1,"div","react-colorful__interactive",this.props.children,0,Object.assign({},this.props,{style:this.props.style,onMouseDown:this.handleMoveStart,onKeyDown:this.handleKeyDown,tabIndex:0,role:"slider"}),null,this.containerRef))},r}(o.Component);t.Interactive=l},14274:function(e,t,n){"use strict";t.__esModule=!0,t.Knob=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(42833),l=n(97667),u=["animated","format","maxValue","minValue","unclamped","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","style","fillValue","color","ranges","size","bipolar","children"];t.Knob=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,s=e.minValue,p=e.unclamped,m=e.onChange,f=e.onDrag,h=e.step,g=e.stepPixelSize,C=e.suppressFlicker,N=e.unit,v=e.value,b=e.className,V=e.style,y=e.fillValue,x=e.color,I=e.ranges,k=void 0===I?{}:I,w=e.size,S=void 0===w?1:w,_=e.bipolar,M=(e.children,function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[0,-1]},{animated:t,format:n,maxValue:d,minValue:s,unclamped:p,onChange:m,onDrag:f,step:h,stepPixelSize:g,suppressFlicker:C,unit:N,value:v},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,u=e.inputElement,p=e.handleDragStart,m=(0,r.scale)(null!=y?y:c,s,d),f=(0,r.scale)(c,s,d),h=x||(0,r.keyOfMatchingRange)(null!=y?y:n,k)||"default",g=Math.min(270*(f-.5),225);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["Knob","Knob--color--"+h,_&&"Knob--bipolar",b,(0,i.computeBoxClassName)(M)]),[(0,o.createVNode)(1,"div","Knob__circle",(0,o.createVNode)(1,"div","Knob__cursorBox",(0,o.createVNode)(1,"div","Knob__cursor"),2,{style:{transform:"rotate("+g+"deg)"}}),2),t&&(0,o.createVNode)(1,"div","Knob__popupValue",l,0),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringTrackPivot",(0,o.createVNode)(32,"circle","Knob__ringTrack",null,1,{cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringFillPivot",(0,o.createVNode)(32,"circle","Knob__ringFill",null,1,{style:{"stroke-dashoffset":Math.max(((_?2.75:2)-1.5*m)*Math.PI*50,0)},cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),u],0,Object.assign({},(0,i.computeBoxProps)(Object.assign({style:Object.assign({"font-size":S+"em"},V)},M)),{onMouseDown:p})))}})))}},95592:function(e,t,n){"use strict";t.__esModule=!0,t.LabeledControls=void 0;var o=n(96323),r=n(67486),a=["children","wrap"],i=["label","children","mx"];function c(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=function(e){var t=e.children,n=e.wrap,i=c(e,a);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({mx:-.5,wrap:n,align:"stretch",justify:"space-between"},i,{children:t})))};t.LabeledControls=l;l.Item=function(e){var t=e.label,n=e.children,a=e.mx,l=void 0===a?1:a,u=c(e,i);return(0,o.createComponentVNode)(2,r.Flex.Item,{mx:l,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({height:"100%",direction:"column",align:"center",textAlign:"center",justify:"space-between"},u,{children:[(0,o.createComponentVNode)(2,r.Flex.Item),(0,o.createComponentVNode)(2,r.Flex.Item,{children:n}),(0,o.createComponentVNode)(2,r.Flex.Item,{color:"label",children:t})]})))})}},21173:function(e,t,n){"use strict";t.__esModule=!0,t.LabeledList=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(22755),c=function(e){var t=e.children;return(0,o.createVNode)(1,"table","LabeledList",t,0)};t.LabeledList=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.label,i=e.labelColor,c=void 0===i?"label":i,l=e.labelWrap,u=e.color,d=e.textAlign,s=e.buttons,p=e.content,m=e.children,f=e.verticalAlign,h=void 0===f?"baseline":f;return(0,o.createVNode)(1,"tr",(0,r.classes)(["LabeledList__row",t]),[(0,o.createComponentVNode)(2,a.Box,{as:"td",color:c,className:(0,r.classes)(["LabeledList__cell",!l&&"LabeledList__label--nowrap"]),verticalAlign:h,children:n?n+":":null}),(0,o.createComponentVNode)(2,a.Box,{as:"td",color:u,textAlign:d,className:(0,r.classes)(["LabeledList__cell","LabeledList__content"]),colSpan:s?undefined:2,verticalAlign:h,children:[p,m]}),s&&(0,o.createVNode)(1,"td","LabeledList__cell LabeledList__buttons",s,0)],0)};l.defaultHooks=r.pureComponentHooks;var u=function(e){var t=e.size?(0,a.unit)(Math.max(0,e.size-1)):0;return(0,o.createVNode)(1,"tr","LabeledList__row",(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,i.Divider),2,{colSpan:3,style:{"padding-top":t,"padding-bottom":t}}),2)};u.defaultHooks=r.pureComponentHooks,c.Item=l,c.Divider=u},89416:function(e,t,n){"use strict";t.__esModule=!0,t.Modal=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(93913),c=["className","children","full"];t.Modal=function(e){var t=e.className,n=e.children,l=e.full,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.createComponentVNode)(2,i.Dimmer,{full:l,children:(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Modal",t,(0,a.computeBoxClassName)(u)]),n,0,Object.assign({},(0,a.computeBoxProps)(u))))})}},23257:function(e,t,n){"use strict";t.__esModule=!0,t.NoticeBox=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","color","info","warning","success","danger"];var c=function(e){var t=e.className,n=e.color,c=e.info,l=(e.warning,e.success),u=e.danger,d=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["NoticeBox",n&&"NoticeBox--color--"+n,c&&"NoticeBox--type--info",l&&"NoticeBox--type--success",u&&"NoticeBox--type--danger",t])},d)))};t.NoticeBox=c,c.defaultHooks=r.pureComponentHooks},97667:function(e,t,n){"use strict";t.__esModule=!0,t.NumberInput=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642),c=n(54425);function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function u(t){var n;n=e.call(this,t)||this;var a=t.value;return n.inputRef=(0,o.createRef)(),n.state={value:a,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props.value;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:e.screenY,value:t,internalValue:t}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,a=n.props.onDrag;o&&a&&a(e,r)}),n.props.updateRate||400),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,a=t.maxValue,i=t.step,c=t.stepPixelSize;n.setState((function(t){var n=Object.assign({},t),l=n.origin-e.screenY;if(t.dragging){var u=Number.isFinite(o)?o%i:0;n.internalValue=(0,r.clamp)(n.internalValue+l*i/c,o-i,a+i),n.value=(0,r.clamp)(n.internalValue-n.internalValue%i+u,o,a),n.origin=e.screenY}else Math.abs(l)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,a=n.state,i=a.dragging,c=a.value,l=a.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!i,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),i)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var u=n.inputRef.current;u.value=l;try{u.focus(),u.select()}catch(d){}}},n}return n=e,(t=u).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n),u.prototype.render=function(){var e=this,t=this.state,n=t.dragging,l=t.editing,u=t.value,d=t.suppressingFlicker,s=this.props,p=s.className,m=s.fluid,f=s.animated,h=s.value,g=s.unit,C=s.minValue,N=s.maxValue,v=s.height,b=s.width,V=s.lineHeight,y=s.fontSize,x=s.format,I=s.onChange,k=s.onDrag,w=h;(n||d)&&(w=u);var S=function(e){return(0,o.createVNode)(1,"div","NumberInput__content",e+(g?" "+g:""),0,{unselectable:Byond.IS_LTE_IE8})},_=f&&!n&&!d&&(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:w,format:x,children:S})||S(x?x(w):w);return(0,o.createComponentVNode)(2,c.Box,{className:(0,a.classes)(["NumberInput",m&&"NumberInput--fluid",p]),minWidth:b,minHeight:v,lineHeight:V,fontSize:y,onMouseDown:this.handleDragStart,children:[(0,o.createVNode)(1,"div","NumberInput__barContainer",(0,o.createVNode)(1,"div","NumberInput__bar",null,1,{style:{height:(0,r.clamp)((w-C)/(N-C)*100,0,100)+"%"}}),2),_,(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{opacity:l?undefined:0,height:v,"line-height":V,"font-size":y},onFocus:function(t){e.setState({editing:!0}),I&&I(t,h)},onBlur:function(t){if(l){var n=(0,r.clamp)(parseFloat(t.target.value),C,N);Number.isNaN(n)?e.setState({editing:!1}):(e.setState({editing:!1,value:n}),e.suppressFlicker(),I&&I(t,n),k&&k(t,n))}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(parseFloat(t.target.value),C,N);return Number.isNaN(n)?void e.setState({editing:!1}):(e.setState({editing:!1,value:n}),e.suppressFlicker(),I&&I(t,n),void(k&&k(t,n)))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef)]})},u}(o.Component);t.NumberInput=u,u.defaultHooks=a.pureComponentHooks,u.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50}},76776:function(e,t,n){"use strict";t.__esModule=!0,t.Pointer=void 0;var o=n(96323),r=n(1060);t.Pointer=function(e){var t=e.className,n=e.color,a=e.left,i=e.top,c=void 0===i?.5:i,l=(0,r.classes)(["react-colorful__pointer",t]),u={top:100*c+"%",left:100*a+"%"};return(0,o.createVNode)(1,"div",l,(0,o.createVNode)(1,"div","react-colorful__pointer-fill",null,1,{style:{"background-color":n}}),2,{style:u})}},16513:function(e,t,n){"use strict";t.__esModule=!0,t.Popper=void 0;var o=n(34739),r=n(96323);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){var t,n;function i(){var t;return(t=e.call(this)||this).renderedContent=void 0,t.popperInstance=void 0,i.id+=1,t}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var c=i.prototype;return c.componentDidMount=function(){var e=this,t=this.props,n=t.additionalStyles,a=t.options;if(this.renderedContent=document.createElement("div"),n)for(var i=0,c=Object.entries(n);i<c.length;i++){var l=c[i],u=l[0],d=l[1];this.renderedContent.style[u]=d}this.renderPopperContent((function(){document.body.appendChild(e.renderedContent);var t=(0,r.findDOMfromVNode)(e.$LI,!0);t&&(e.popperInstance=(0,o.createPopper)(t,e.renderedContent,a))}))},c.componentDidUpdate=function(){var e=this;this.renderPopperContent((function(){var t;return null==(t=e.popperInstance)?void 0:t.update()}))},c.componentWillUnmount=function(){var e;null==(e=this.popperInstance)||e.destroy(),this.renderedContent.remove()},c.renderPopperContent=function(e){(0,r.render)(this.props.popperContent,this.renderedContent,e)},c.render=function(){return this.props.children},i}(r.Component);t.Popper=i,i.id=0},12194:function(e,t,n){"use strict";t.__esModule=!0,t.ProgressBar=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(84200),l=["className","value","minValue","maxValue","color","textColor","ranges","children"];var u=function(e){var t=e.className,n=e.value,u=e.minValue,d=void 0===u?0:u,s=e.maxValue,p=void 0===s?1:s,m=e.color,f=e.textColor,h=e.ranges,g=void 0===h?{}:h,C=e.children,N=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),v=(0,r.scale)(n,d,p),b=C!==undefined,V=m||(0,r.keyOfMatchingRange)(n,g)||"default",y=(0,i.computeBoxProps)(N),x=["ProgressBar",t,(0,i.computeBoxClassName)(N)],I={width:100*(0,r.clamp01)(v)+"%"};return c.CSS_COLORS.includes(V)||"default"===V?x.push("ProgressBar--color--"+V):(y.style=(y.style||"")+"border-color: "+V+";",I["background-color"]=V),(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(x),[(0,o.createVNode)(1,"div","ProgressBar__fill ProgressBar__fill--animated",null,1,{style:I}),(0,o.createVNode)(1,"div","ProgressBar__content",b?C:(0,r.toFixed)(100*v)+"%",0,{style:f&&{color:f}})],4,Object.assign({},y)))};t.ProgressBar=u,u.defaultHooks=a.pureComponentHooks},94709:function(e,t,n){"use strict";t.__esModule=!0,t.RoundGauge=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642),c=n(54425),l=["value","minValue","maxValue","ranges","alertAfter","alertBefore","format","size","className","style"];t.RoundGauge=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.AnimatedNumber,Object.assign({},e)));var t=e.value,n=e.minValue,u=void 0===n?1:n,d=e.maxValue,s=void 0===d?1:d,p=e.ranges,m=e.alertAfter,f=e.alertBefore,h=e.format,g=e.size,C=void 0===g?1:g,N=e.className,v=e.style,b=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),V=(0,r.scale)(t,u,s),y=(0,r.clamp01)(V),x=p?{}:{primary:[0,1]};p&&Object.keys(p).forEach((function(e){var t=p[e];x[e]=[(0,r.scale)(t[0],u,s),(0,r.scale)(t[1],u,s)]}));var I=function(){if(m&&f&&m<f){if(m<t&&f>t)return!0}else if(m<t||f>t)return!0;return!1}()&&(0,r.keyOfMatchingRange)(y,x);return(0,o.createComponentVNode)(2,c.Box,{inline:!0,children:[(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["RoundGauge",N,(0,c.computeBoxClassName)(b)]),(0,o.createVNode)(32,"svg",null,[(m||f)&&(0,o.createVNode)(32,"g",(0,a.classes)(["RoundGauge__alert",I?"active RoundGauge__alert--"+I:""]),(0,o.createVNode)(32,"path",null,null,1,{d:"M48.211,14.578C48.55,13.9 49.242,13.472 50,13.472C50.758,13.472 51.45,13.9 51.789,14.578C54.793,20.587 60.795,32.589 63.553,38.106C63.863,38.726 63.83,39.462 63.465,40.051C63.101,40.641 62.457,41 61.764,41C55.996,41 44.004,41 38.236,41C37.543,41 36.899,40.641 36.535,40.051C36.17,39.462 36.137,38.726 36.447,38.106C39.205,32.589 45.207,20.587 48.211,14.578ZM50,34.417C51.426,34.417 52.583,35.574 52.583,37C52.583,38.426 51.426,39.583 50,39.583C48.574,39.583 47.417,38.426 47.417,37C47.417,35.574 48.574,34.417 50,34.417ZM50,32.75C50,32.75 53,31.805 53,22.25C53,20.594 51.656,19.25 50,19.25C48.344,19.25 47,20.594 47,22.25C47,31.805 50,32.75 50,32.75Z"}),2),(0,o.createVNode)(32,"g",null,(0,o.createVNode)(32,"circle","RoundGauge__ringTrack",null,1,{cx:"50",cy:"50",r:"45"}),2),(0,o.createVNode)(32,"g",null,Object.keys(x).map((function(e,t){var n=x[e];return(0,o.createVNode)(32,"circle","RoundGauge__ringFill RoundGauge--color--"+e,null,1,{style:{"stroke-dashoffset":Math.max((2-(n[1]-n[0]))*Math.PI*50,0)},transform:"rotate("+(180+180*n[0])+" 50 50)",cx:"50",cy:"50",r:"45"},t)})),0),(0,o.createVNode)(32,"g","RoundGauge__needle",[(0,o.createVNode)(32,"polygon","RoundGauge__needleLine",null,1,{points:"46,50 50,0 54,50"}),(0,o.createVNode)(32,"circle","RoundGauge__needleMiddle",null,1,{cx:"50",cy:"50",r:"8"})],4,{transform:"rotate("+(180*y-90)+" 50 50)"})],0,{viewBox:"0 0 100 50"}),2,Object.assign({},(0,c.computeBoxProps)(Object.assign({style:Object.assign({"font-size":C+"em"},v)},b))))),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:t,format:h,size:C})]})}},77381:function(e,t,n){"use strict";t.__esModule=!0,t.Section=void 0;var o=n(96323),r=n(1060),a=n(99397),i=n(54425),c=["className","title","buttons","fill","fitted","scrollable","children"];function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function u(t){var n;return(n=e.call(this,t)||this).scrollableRef=void 0,n.scrollable=void 0,n.scrollableRef=(0,o.createRef)(),n.scrollable=t.scrollable,n}n=e,(t=u).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n);var d=u.prototype;return d.componentDidMount=function(){this.scrollable&&(0,a.addScrollableNode)(this.scrollableRef.current)},d.componentWillUnmount=function(){this.scrollable&&(0,a.removeScrollableNode)(this.scrollableRef.current)},d.render=function(){var e=this.props,t=e.className,n=e.title,a=e.buttons,l=e.fill,u=e.fitted,d=e.scrollable,s=e.children,p=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c),m=(0,r.canRender)(n)||(0,r.canRender)(a);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Section",Byond.IS_LTE_IE8&&"Section--iefix",l&&"Section--fill",u&&"Section--fitted",d&&"Section--scrollable",t,(0,i.computeBoxClassName)(p)]),[m&&(0,o.createVNode)(1,"div","Section__title",[(0,o.createVNode)(1,"span","Section__titleText",n,0),(0,o.createVNode)(1,"div","Section__buttons",a,0)],4),(0,o.createVNode)(1,"div","Section__rest",(0,o.createVNode)(1,"div","Section__content",s,0,null,null,this.scrollableRef),2)],0,Object.assign({},(0,i.computeBoxProps)(p))))},u}(o.Component);t.Section=u},4482:function(e,t,n){"use strict";t.__esModule=!0,t.Slider=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(42833),l=n(97667),u=["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","fillValue","color","ranges","children"];t.Slider=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,s=e.minValue,p=e.onChange,m=e.onDrag,f=e.step,h=e.stepPixelSize,g=e.suppressFlicker,C=e.unit,N=e.value,v=e.className,b=e.fillValue,V=e.color,y=e.ranges,x=void 0===y?{}:y,I=e.children,k=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),w=I!==undefined;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[1,0]},{animated:t,format:n,maxValue:d,minValue:s,onChange:p,onDrag:m,step:f,stepPixelSize:h,suppressFlicker:g,unit:C,value:N},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,u=e.inputElement,p=e.handleDragStart,m=b!==undefined&&null!==b,f=((0,r.scale)(n,s,d),(0,r.scale)(null!=b?b:c,s,d)),h=(0,r.scale)(c,s,d),g=V||(0,r.keyOfMatchingRange)(null!=b?b:n,x)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["Slider","ProgressBar","ProgressBar--color--"+g,v,(0,i.computeBoxClassName)(k)]),[(0,o.createVNode)(1,"div",(0,a.classes)(["ProgressBar__fill",m&&"ProgressBar__fill--animated"]),null,1,{style:{width:100*(0,r.clamp01)(f)+"%",opacity:.4}}),(0,o.createVNode)(1,"div","ProgressBar__fill",null,1,{style:{width:100*(0,r.clamp01)(Math.min(f,h))+"%"}}),(0,o.createVNode)(1,"div","Slider__cursorOffset",[(0,o.createVNode)(1,"div","Slider__cursor"),(0,o.createVNode)(1,"div","Slider__pointer"),t&&(0,o.createVNode)(1,"div","Slider__popupValue",l,0)],0,{style:{width:100*(0,r.clamp01)(h)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",w?I:l,0),u],0,Object.assign({},(0,i.computeBoxProps)(k),{onMouseDown:p})))}})))}},4033:function(e,t,n){"use strict";t.__esModule=!0,t.Stack=void 0;var o=n(96323),r=n(1060),a=n(67486),i=["className","vertical","fill","zebra"],c=["className","innerRef"],l=["className","hidden"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.vertical,c=e.fill,l=e.zebra,d=u(e,i);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack",c&&"Stack--fill",n?"Stack--vertical":"Stack--horizontal",l&&"Stack--zebra",t,(0,a.computeFlexClassName)(e)]),null,1,Object.assign({},(0,a.computeFlexProps)(Object.assign({direction:n?"column":"row"},d)))))};t.Stack=d;d.Item=function(e){var t=e.className,n=e.innerRef,i=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack__item",t,(0,a.computeFlexItemClassName)(i)]),null,1,Object.assign({},(0,a.computeFlexItemProps)(i)),null,n))};d.Divider=function(e){var t=e.className,n=e.hidden,i=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack__item","Stack__divider",n&&"Stack__divider--hidden",t,(0,a.computeFlexItemClassName)(i)]),null,1,Object.assign({},(0,a.computeFlexItemProps)(i))))}},28581:function(e,t,n){"use strict";t.__esModule=!0,t.TableCell=t.TableRow=t.Table=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","collapsing","children"],c=["className","header"],l=["className","collapsing","header"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.collapsing,c=e.children,l=u(e,i);return(0,o.normalizeProps)((0,o.createVNode)(1,"table",(0,r.classes)(["Table",n&&"Table--collapsing",t,(0,a.computeBoxClassName)(l)]),(0,o.createVNode)(1,"tbody",null,c,0),2,Object.assign({},(0,a.computeBoxProps)(l))))};t.Table=d,d.defaultHooks=r.pureComponentHooks;var s=function(e){var t=e.className,n=e.header,i=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"tr",(0,r.classes)(["Table__row",n&&"Table__row--header",t,(0,a.computeBoxClassName)(e)]),null,1,Object.assign({},(0,a.computeBoxProps)(i))))};t.TableRow=s,s.defaultHooks=r.pureComponentHooks;var p=function(e){var t=e.className,n=e.collapsing,i=e.header,c=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"td",(0,r.classes)(["Table__cell",n&&"Table__cell--collapsing",i&&"Table__cell--header",t,(0,a.computeBoxClassName)(e)]),null,1,Object.assign({},(0,a.computeBoxProps)(c))))};t.TableCell=p,p.defaultHooks=r.pureComponentHooks,d.Row=s,d.Cell=p},60839:function(e,t,n){"use strict";t.__esModule=!0,t.Tabs=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(65743),c=["className","vertical","fill","fluid","children"],l=["className","selected","color","icon","leftSlot","rightSlot","children"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.vertical,i=e.fill,l=e.fluid,d=e.children,s=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tabs",n?"Tabs--vertical":"Tabs--horizontal",i&&"Tabs--fill",l&&"Tabs--fluid",t,(0,a.computeBoxClassName)(s)]),d,0,Object.assign({},(0,a.computeBoxProps)(s))))};t.Tabs=d;d.Tab=function(e){var t=e.className,n=e.selected,c=e.color,d=e.icon,s=e.leftSlot,p=e.rightSlot,m=e.children,f=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tab","Tabs__Tab","Tab--color--"+c,n&&"Tab--selected",t].concat((0,a.computeBoxClassName)(f))),[(0,r.canRender)(s)&&(0,o.createVNode)(1,"div","Tab__left",s,0)||!!d&&(0,o.createVNode)(1,"div","Tab__left",(0,o.createComponentVNode)(2,i.Icon,{name:d}),2),(0,o.createVNode)(1,"div","Tab__text",m,0),(0,r.canRender)(p)&&(0,o.createVNode)(1,"div","Tab__right",p,0)],0,Object.assign({},(0,a.computeBoxProps)(f))))}},51129:function(e,t,n){"use strict";t.__esModule=!0,t.TextArea=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(77863),c=n(57890),l=["onChange","onKeyDown","onKeyPress","onInput","onFocus","onBlur","onEnter","value","maxLength","placeholder"],u=["className","fluid"];function d(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function s(e,t){return s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},s(e,t)}var p=function(e){var t,n;function p(t,n){var r;(r=e.call(this,t,n)||this).textareaRef=(0,o.createRef)(),r.fillerRef=(0,o.createRef)(),r.state={editing:!1};var a=t.dontUseTabForIndent,l=void 0!==a&&a;return r.handleOnInput=function(e){var t=r.state.editing,n=r.props.onInput;t||r.setEditing(!0),n&&n(e,e.target.value)},r.handleOnChange=function(e){var t=r.state.editing,n=r.props.onChange;t&&r.setEditing(!1),n&&n(e,e.target.value)},r.handleKeyPress=function(e){var t=r.state.editing,n=r.props.onKeyPress;t||r.setEditing(!0),n&&n(e,e.target.value)},r.handleKeyDown=function(e){var t=r.state.editing,n=r.props.onKeyDown;if(e.keyCode===c.KEY_ESCAPE)return r.setEditing(!1),e.target.value=(0,i.toInputValue)(r.props.value),void e.target.blur();if((t||r.setEditing(!0),!l)&&9===(e.keyCode||e.which)){e.preventDefault();var o=e.target,a=o.value,u=o.selectionStart,d=o.selectionEnd;e.target.value=a.substring(0,u)+"\t"+a.substring(d),e.target.selectionEnd=u+1}n&&n(e,e.target.value)},r.handleFocus=function(e){r.state.editing||r.setEditing(!0)},r.handleBlur=function(e){var t=r.state.editing,n=r.props.onChange;t&&(r.setEditing(!1),n&&n(e,e.target.value))},r}n=e,(t=p).prototype=Object.create(n.prototype),t.prototype.constructor=t,s(t,n);var m=p.prototype;return m.componentDidMount=function(){var e=this.props.value,t=this.textareaRef.current;t&&(t.value=(0,i.toInputValue)(e))},m.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,a=this.textareaRef.current;a&&!n&&o!==r&&(a.value=(0,i.toInputValue)(r))},m.setEditing=function(e){this.setState({editing:e})},m.getValue=function(){return this.textareaRef.current&&this.textareaRef.current.value},m.render=function(){var e=this.props,t=(e.onChange,e.onKeyDown,e.onKeyPress,e.onInput,e.onFocus,e.onBlur,e.onEnter,e.value,e.maxLength),n=e.placeholder,i=d(e,l),c=i.className,s=i.fluid,p=d(i,u);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["TextArea",s&&"TextArea--fluid",c])},p,{children:(0,o.createVNode)(128,"textarea","TextArea__textarea",null,1,{placeholder:n,onChange:this.handleOnChange,onKeyDown:this.handleKeyDown,onKeyPress:this.handleKeyPress,onInput:this.handleOnInput,onFocus:this.handleFocus,onBlur:this.handleBlur,maxLength:t},null,this.textareaRef)})))},p}(o.Component);t.TextArea=p},92464:function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=void 0;var o=n(97622),r=n(96323);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},c=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.timing=!1,n.format=null,n.last_seen_value=undefined,n.state={value:0},i(t.value)&&(n.state.value=Number(t.value),n.last_seen_value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var c=r.prototype;return c.componentDidUpdate=function(){var e=this;this.props.timing&&(clearInterval(this.timer),this.timer=setInterval((function(){return e.tick()}),1e3))},c.tick=function(){var e=Number(this.state.value);this.props.value!==this.last_seen_value&&(this.last_seen_value=this.props.value,e=this.props.value);var t="up"===this.props.auto?10:-10,n=Math.max(0,e+t);this.setState({value:n})},c.componentDidMount=function(){var e=this;this.props.timing&&(this.timer=setInterval((function(){return e.tick()}),1e3))},c.componentWillUnmount=function(){clearInterval(this.timer)},r.getDerivedStateFromProps=function(e){return e.timing?null:{value:e.value}},r.defaultFormat=function(e){var t=(0,o.toFixed)(Math.floor(e/10%60)).padStart(2,"0"),n=(0,o.toFixed)(Math.floor(e/600%60)).padStart(2,"0");return(0,o.toFixed)(Math.floor(e/36e3%24)).padStart(2,"0")+":"+n+":"+t},c.render=function(){var e=this.state.value;return i(e)?this.props.format?this.props.format(e):r.defaultFormat(e):this.state.value||null},r}(r.Component);t.TimeDisplay=c},59463:function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=void 0;var o=n(96323),r=n(34739);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i={modifiers:[{name:"eventListeners",enabled:!1}]},c={width:0,height:0,top:0,right:0,bottom:0,left:0,x:0,y:0,toJSON:function(){return null}},l=function(e){var t,n;function c(){return e.apply(this,arguments)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var l=c.prototype;return l.getDOMNode=function(){return(0,o.findDOMfromVNode)(this.$LI,!0)},l.componentDidMount=function(){var e=this,t=this.getDOMNode();t&&(t.addEventListener("mouseenter",(function(){var n=c.renderedTooltip;n===undefined&&((n=document.createElement("div")).className="Tooltip",document.body.appendChild(n),c.renderedTooltip=n),c.currentHoveredElement=t,n.style.opacity="1",e.renderPopperContent()})),t.addEventListener("mouseleave",(function(){e.fadeOut()})))},l.fadeOut=function(){c.currentHoveredElement===this.getDOMNode()&&(c.currentHoveredElement=undefined,c.renderedTooltip.style.opacity="0")},l.renderPopperContent=function(){var e=this,t=c.renderedTooltip;t&&(0,o.render)((0,o.createVNode)(1,"span",null,this.props.content,0),t,(function(){var n=c.singletonPopper;n===undefined?(n=(0,r.createPopper)(c.virtualElement,t,Object.assign({},i,{placement:e.props.position||"auto"})),c.singletonPopper=n):(n.setOptions(Object.assign({},i,{placement:e.props.position||"auto"})),n.update())}),this.context)},l.componentDidUpdate=function(){c.currentHoveredElement===this.getDOMNode()&&this.renderPopperContent()},l.componentWillUnmount=function(){this.fadeOut()},l.render=function(){return this.props.children},c}(o.Component);t.Tooltip=l,l.renderedTooltip=void 0,l.singletonPopper=void 0,l.currentHoveredElement=void 0,l.virtualElement={getBoundingClientRect:function(){var e,t;return null!=(e=null==(t=l.currentHoveredElement)?void 0:t.getBoundingClientRect())?e:c}}},16422:function(e,t,n){"use strict";t.__esModule=!0,t.ColorButton=void 0;var o=n(96323),r=n(54425),a=n(25808),i=n(47233),c=["color"];t.ColorButton=function(e){var t=e.color,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({},n,{children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:t,mr:"5px"}),(0,o.createComponentVNode)(2,r.Box,{as:"code",children:t})]})))}},88344:function(e,t,n){"use strict";t.__esModule=!0,t.ItemList=void 0;var o=n(96323),r=n(26949);t.ItemList=function(e){var t=e.items,n=e.nothing_text,a=void 0===n?"Nothing":n;return t===undefined||0===t.length?""+a:t.map((function(e,t,n){return(0,o.createComponentVNode)(2,r.Flex,{inline:!0,align:"center",children:[!!e.iconBase64&&(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,r.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+e.iconBase64})}),(0,o.createComponentVNode)(2,r.Flex.Item,{pr:1,pl:.5,children:[e.name,t===n.length-1?"":", "+(t===n.length-2?"and ":"")]})]},t)}))}},44516:function(e,t,n){"use strict";t.__esModule=!0,t.Placeholder=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["children","className"];t.Placeholder=function(e){var t=e.children,n=void 0===t?"No results found":t,c=e.className,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),u=(0,r.classes)(["placeholder",c]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:u,color:"label",italic:!0},l,{children:n})))}},99120:function(e,t,n){"use strict";t.__esModule=!0,t.SectionEx=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(77381),c=["className","capitalize"];t.SectionEx=function(e){var t=e.className,n=e.capitalize,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Section,Object.assign({className:(0,r.classes)(["SectionEx",n&&"SectionEx__capitalize",t,(0,a.computeBoxClassName)(l)])},l)))}},26949:function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=t.TimeDisplay=t.TextArea=t.Tabs=t.Table=t.Stack=t.Slider=t.SectionEx=t.Section=t.RoundGauge=t.Pointer=t.Popper=t.ProgressBar=t.Placeholder=t.NumberInput=t.NoticeBox=t.Modal=t.LabeledList=t.LabeledControls=t.Knob=t.ItemList=t.Interactive=t.Input=t.Image=t.Icon=t.Grid=t.Flex=t.Dropdown=t.DraggableControl=t.Divider=t.Dimmer=t.ColorButton=t.ColorBox=t.Collapsible=t.Chart=t.ByondUi=t.Button=t.Box=t.BlockQuote=t.Blink=t.Autofocus=t.AnimatedNumber=void 0;var o=n(54642);t.AnimatedNumber=o.AnimatedNumber;var r=n(75434);t.Autofocus=r.Autofocus;var a=n(90297);t.Blink=a.Blink;var i=n(7149);t.BlockQuote=i.BlockQuote;var c=n(54425);t.Box=c.Box;var l=n(25808);t.Button=l.Button;var u=n(44051);t.ByondUi=u.ByondUi;var d=n(64726);t.Chart=d.Chart;var s=n(49751);t.Collapsible=s.Collapsible;var p=n(47233);t.ColorBox=p.ColorBox;var m=n(16422);t.ColorButton=m.ColorButton;var f=n(93913);t.Dimmer=f.Dimmer;var h=n(22755);t.Divider=h.Divider;var g=n(42833);t.DraggableControl=g.DraggableControl;var C=n(12489);t.Dropdown=C.Dropdown;var N=n(67486);t.Flex=N.Flex;var v=n(28408);t.Grid=v.Grid;var b=n(65743);t.Icon=b.Icon;var V=n(94261);t.Image=V.Image;var y=n(77863);t.Input=y.Input;var x=n(54291);t.Interactive=x.Interactive;var I=n(88344);t.ItemList=I.ItemList;var k=n(14274);t.Knob=k.Knob;var w=n(95592);t.LabeledControls=w.LabeledControls;var S=n(21173);t.LabeledList=S.LabeledList;var _=n(89416);t.Modal=_.Modal;var M=n(23257);t.NoticeBox=M.NoticeBox;var D=n(97667);t.NumberInput=D.NumberInput;var B=n(44516);t.Placeholder=B.Placeholder;var A=n(12194);t.ProgressBar=A.ProgressBar;var T=n(16513);t.Popper=T.Popper;var L=n(76776);t.Pointer=L.Pointer;var E=n(94709);t.RoundGauge=E.RoundGauge;var j=n(77381);t.Section=j.Section;var P=n(99120);t.SectionEx=P.SectionEx;var O=n(4482);t.Slider=O.Slider;var F=n(4033);t.Stack=F.Stack;var R=n(28581);t.Table=R.Table;var z=n(60839);t.Tabs=z.Tabs;var W=n(51129);t.TextArea=W.TextArea;var U=n(92464);t.TimeDisplay=U.TimeDisplay;var H=n(59463);t.Tooltip=H.Tooltip},84200:function(e,t){"use strict";t.__esModule=!0,t.getGasColor=t.getGasLabel=t.RADIO_CHANNELS=t.CSS_COLORS=t.COLORS=t.UI_CLOSE=t.UI_DISABLED=t.UI_UPDATE=t.UI_INTERACTIVE=void 0;t.UI_INTERACTIVE=2;t.UI_UPDATE=1;t.UI_DISABLED=0;t.UI_CLOSE=-1;t.COLORS={department:{captain:"#548b55",security:"#e74c3c",medbay:"#3498db",science:"#9b59b6",engineering:"#f1c40f",cargo:"#f39c12",centcom:"#00c100",other:"#c38312"},damageType:{oxy:"#3498db",toxin:"#2ecc71",burn:"#e67e22",brute:"#e74c3c"},damageTypeFill:{oxy:"rgba(52, 152, 219, 0.5)",toxin:"rgba(46, 204, 113, 0.5)",burn:"rgba(230, 126, 34, 0.5)",brute:"rgba(231, 76, 60, 0.5)"}};t.CSS_COLORS=["black","white","red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey","good","average","bad","label"];t.RADIO_CHANNELS=[{name:"Syndicate",freq:1352,color:"#BB3333"},{name:"CentCom",freq:1451,color:"#2681a5"},{name:"Catering",freq:1485,color:"#C16082"},{name:"Civilian",freq:1355,color:"#6ca729"},{name:"Research",freq:1354,color:"#153E9E"},{name:"Command",freq:1356,color:"#5177ff"},{name:"Medical",freq:1445,color:"#57b8f0"},{name:"Engineering",freq:1441,color:"#BBBB00"},{name:"Security",freq:1485,color:"#dd3535"},{name:"AI",freq:1447,color:"#333399"},{name:"Bridge",freq:1442,color:"#339933"}];var n=[{id:"o2",name:"Oxygen",label:"O\u2082",color:"blue"},{id:"n2",name:"Nitrogen",label:"N\u2082",color:"red"},{id:"co2",name:"Carbon Dioxide",label:"CO\u2082",color:"grey"},{id:"plasma",name:"Plasma",label:"Plasma",color:"pink"},{id:"n2o",name:"Nitrous Oxide",label:"N\u2082O",color:"red"}];t.getGasLabel=function(e,t){var o=String(e).toLowerCase(),r=n.find((function(e){return e.id===o||e.name.toLowerCase()===o}));return r&&r.label||t||e};t.getGasColor=function(e){var t=String(e).toLowerCase(),o=n.find((function(e){return e.id===t||e.name.toLowerCase()===t}));return o&&o.color}},71224:function(e,t,n){"use strict";t.__esModule=!0,t.KitchenSink=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(69321);t.KitchenSink=function(e,t){var n=e.panel,l=(0,r.useLocalState)(t,"kitchenSinkTheme")[0],u=(0,r.useLocalState)(t,"pageIndex",0),d=u[0],s=u[1],p=c.keys().map((function(e){return c(e)})),m=p[d],f=n?i.Pane:i.Window;return(0,o.createComponentVNode)(2,f,{title:"Kitchen Sink",width:600,height:500,theme:l,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{m:1,mr:0,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,fitted:!0,children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:p.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{color:"transparent",selected:t===d,onClick:function(){return s(t)},children:e.meta.title},t)}))})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{position:"relative",grow:1,children:(0,o.createComponentVNode)(2,f.Content,{scrollable:!0,children:m.meta.render()})})]})})}},98069:function(e,t,n){"use strict";t.__esModule=!0,t.openExternalBrowser=t.toggleDebugLayout=t.toggleKitchenSink=void 0;var o=n(465),r=(0,o.createAction)("debug/toggleKitchenSink");t.toggleKitchenSink=r;var a=(0,o.createAction)("debug/toggleDebugLayout");t.toggleDebugLayout=a;var i=(0,o.createAction)("debug/openExternalBrowser");t.openExternalBrowser=i},35177:function(e,t,n){"use strict";t.__esModule=!0,t.useDebug=void 0;var o=n(465),r=n(12184);t.useDebug=function(e){return(0,o.useSelector)(e,r.selectDebug)}},27157:function(e,t,n){"use strict";t.__esModule=!0,t.debugReducer=t.relayMiddleware=t.debugMiddleware=t.KitchenSink=t.useDebug=void 0;var o=n(35177);t.useDebug=o.useDebug;var r=n(71224);t.KitchenSink=r.KitchenSink;var a=n(46656);t.debugMiddleware=a.debugMiddleware,t.relayMiddleware=a.relayMiddleware;var i=n(7124);t.debugReducer=i.debugReducer},46656:function(e,t,n){"use strict";t.__esModule=!0,t.relayMiddleware=t.debugMiddleware=void 0;var o=n(57890),r=n(99397),a=n(6965),i=n(98069),c=["backend/update","chat/message"];t.debugMiddleware=function(e){return(0,a.acquireHotKey)(o.KEY_F11),(0,a.acquireHotKey)(o.KEY_F12),r.globalEvents.on("keydown",(function(t){t.code===o.KEY_F11&&e.dispatch((0,i.toggleDebugLayout)()),t.code===o.KEY_F12&&e.dispatch((0,i.toggleKitchenSink)()),t.ctrl&&t.alt&&t.code===o.KEY_BACKSPACE&&setTimeout((function(){throw new Error("OOPSIE WOOPSIE!! UwU We made a fucky wucky!! A wittle fucko boingo! The code monkeys at our headquarters are working VEWY HAWD to fix this!")}))})),function(e){return function(t){return e(t)}}};t.relayMiddleware=function(e){var t=n(82252),l="?external"===location.search;return l?t.subscribe((function(t){var n=t.type,o=t.payload;"relay"===n&&o.windowId===window.__windowId__&&e.dispatch(Object.assign({},o.action,{relayed:!0}))})):((0,a.acquireHotKey)(o.KEY_F10),r.globalEvents.on("keydown",(function(t){t===o.KEY_F10&&e.dispatch((0,i.openExternalBrowser)())}))),function(e){return function(n){var o=n.type,r=(n.payload,n.relayed);if(o!==i.openExternalBrowser.type)return!c.includes(o)||r||l||t.sendMessage({type:"relay",payload:{windowId:window.__windowId__,action:n}}),e(n);window.open(location.href+"?external","_blank")}}}},7124:function(e,t){"use strict";t.__esModule=!0,t.debugReducer=void 0;t.debugReducer=function(e,t){void 0===e&&(e={});var n=t.type;t.payload;return"debug/toggleKitchenSink"===n?Object.assign({},e,{kitchenSink:!e.kitchenSink}):"debug/toggleDebugLayout"===n?Object.assign({},e,{debugLayout:!e.debugLayout}):e}},12184:function(e,t){"use strict";t.__esModule=!0,t.selectDebug=void 0;t.selectDebug=function(e){return e.debug}},41410:function(e,t,n){"use strict";t.__esModule=!0,t.resizeStartHandler=t.dragStartHandler=t.setupDrag=t.recallWindowGeometry=t.storeWindowGeometry=t.getScreenSize=t.getScreenPosition=t.setWindowSize=t.setWindowPosition=t.getWindowSize=t.getWindowPosition=t.setWindowKey=void 0;var o=n(7151),r=n(67288);function a(e,t,n,o,r,a,i){try{var c=e[a](i),l=c.value}catch(u){return void n(u)}c.done?t(l):Promise.resolve(l).then(o,r)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(o,r){var i=e.apply(t,n);function c(e){a(i,o,r,c,l,"next",e)}function l(e){a(i,o,r,c,l,"throw",e)}c(undefined)}))}}var c,l,u,d,s,p=(0,n(79926).createLogger)("drag"),m=window.__windowId__,f=!1,h=!1,g=[0,0];t.setWindowKey=function(e){m=e};var C=function(){return[window.screenLeft,window.screenTop]};t.getWindowPosition=C;var N=function(){return[window.innerWidth,window.innerHeight]};t.getWindowSize=N;var v=function(e){var t=(0,r.vecAdd)(e,g);return Byond.winset(window.__windowId__,{pos:t[0]+","+t[1]})};t.setWindowPosition=v;var b=function(e){return Byond.winset(window.__windowId__,{size:e[0]+"x"+e[1]})};t.setWindowSize=b;var V=function(){return[0-g[0],0-g[1]]};t.getScreenPosition=V;var y=function(){return[window.screen.availWidth,window.screen.availHeight]};t.getScreenSize=y;var x=function(e,t,n){void 0===n&&(n=50);for(var o,r=[t],a=0;a<e.length;a++){var i=e[a];i!==t&&(r.length<n?r.push(i):o=i)}return[r,o]},I=function(){var e=i(regeneratorRuntime.mark((function t(){var e,n,r,a;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p.log("storing geometry"),e={pos:C(),size:N()},o.storage.set(m,e),t.t0=x,t.next=6,o.storage.get("geometries");case 6:if(t.t1=t.sent,t.t1){t.next=9;break}t.t1=[];case 9:t.t2=t.t1,t.t3=m,n=(0,t.t0)(t.t2,t.t3),r=n[0],(a=n[1])&&o.storage.remove(a),o.storage.set("geometries",r);case 16:case"end":return t.stop()}}),t)})));return function(){return e.apply(this,arguments)}}();t.storeWindowGeometry=I;var k=function(){var e=i(regeneratorRuntime.mark((function t(e){var n,a,i,l;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===e&&(e={}),t.t0=e.fancy,!t.t0){t.next=6;break}return t.next=5,o.storage.get(m);case 5:t.t0=t.sent;case 6:return(n=t.t0)&&p.log("recalled geometry:",n),a=(null==n?void 0:n.pos)||e.pos,i=e.size,t.next=12,c;case 12:l=[window.screen.availWidth,window.screen.availHeight],i&&(i=[Math.min(l[0],i[0]),Math.min(l[1],i[1])],b(i)),a?(i&&e.locked&&(a=S(a,i)[1]),v(a)):i&&(a=(0,r.vecAdd)((0,r.vecScale)(l,.5),(0,r.vecScale)(i,-.5),(0,r.vecScale)(g,-1)),v(a));case 15:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}();t.recallWindowGeometry=k;var w=function(){var e=i(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return c=Byond.winget(window.__windowId__,"pos").then((function(e){return[e.x-window.screenLeft,e.y-window.screenTop]})),e.next=3,c;case 3:g=e.sent,p.debug("screen offset",g);case 5:case"end":return e.stop()}}),t)})));return function(){return e.apply(this,arguments)}}();t.setupDrag=w;var S=function(e,t){for(var n=V(),o=y(),r=[e[0],e[1]],a=!1,i=0;i<2;i++){var c=n[i],l=n[i]+o[i];e[i]<c?(r[i]=c,a=!0):e[i]+t[i]>l&&(r[i]=l-t[i],a=!0)}return[a,r]};t.dragStartHandler=function(e){p.log("drag start"),f=!0,l=[window.screenLeft-e.screenX,window.screenTop-e.screenY],document.addEventListener("mousemove",M),document.addEventListener("mouseup",_),M(e)};var _=function A(e){p.log("drag end"),f=!1,M(e),document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",A),I()},M=function T(e){if(f){if(0===e.buttons)return p.log("emergency drag end"),document.removeEventListener("mousemove",T),document.removeEventListener("mouseup",_),f=!1,void I();e.preventDefault(),v((0,r.vecAdd)([e.screenX,e.screenY],l))}};t.resizeStartHandler=function(e,t){return function(n){u=[e,t],p.log("resize start",u),h=!0,l=[window.screenLeft-n.screenX,window.screenTop-n.screenY],d=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",B),document.addEventListener("mouseup",D),B(n)}};var D=function L(e){p.log("resize end",s),B(e),document.removeEventListener("mousemove",B),document.removeEventListener("mouseup",L),h=!1,I()},B=function(e){h&&(e.preventDefault(),(s=(0,r.vecAdd)(d,(0,r.vecMultiply)(u,(0,r.vecAdd)([e.screenX,e.screenY],(0,r.vecInverse)([window.screenLeft,window.screenTop]),l,[1,1]))))[0]=Math.max(s[0],150),s[1]=Math.max(s[1],50),b(s))}},99397:function(e,t,n){"use strict";t.__esModule=!0,t.KeyEvent=t.removeScrollableNode=t.addScrollableNode=t.canStealFocus=t.setupGlobalEvents=t.globalEvents=void 0;var o=n(52844),r=n(57890),a=new o.EventEmitter;t.globalEvents=a;var i,c=!1;t.setupGlobalEvents=function(e){void 0===e&&(e={}),c=!!e.ignoreWindowFocus};var l=!0,u=function N(e,t){c?l=!0:(i&&(clearTimeout(i),i=null),t?i=setTimeout((function(){return N(e)})):l!==e&&(l=e,a.emit(e?"window-focus":"window-blur"),a.emit("window-focus-change",e)))},d=null,s=function(e){var t=String(e.tagName).toLowerCase();return"input"===t||"textarea"===t};t.canStealFocus=s;var p=function v(){d&&(d.removeEventListener("blur",v),d=null)},m=null,f=null,h=[];t.addScrollableNode=function(e){h.push(e)};t.removeScrollableNode=function(e){var t=h.indexOf(e);t>=0&&h.splice(t,1)};window.addEventListener("mousemove",(function(e){var t=e.target;t!==f&&(f=t,function(e){if(!d&&l)for(var t=document.body;e&&e!==t;){if(h.includes(e)){if(e.contains(m))return;return m=e,void e.focus()}e=e.parentNode}}(t))})),window.addEventListener("focusin",(function(e){if(f=null,m=e.target,u(!0),s(e.target))return t=e.target,p(),void(d=t).addEventListener("blur",p);var t})),window.addEventListener("focusout",(function(e){f=null,u(!1,!0)})),window.addEventListener("blur",(function(e){f=null,u(!1,!0)})),window.addEventListener("beforeunload",(function(e){u(!1)}));var g={},C=function(){function e(e,t,n){this.event=e,this.type=t,this.code=window.event?e.which:e.keyCode,this.ctrl=e.ctrlKey,this.shift=e.shiftKey,this.alt=e.altKey,this.repeat=!!n}var t=e.prototype;return t.hasModifierKeys=function(){return this.ctrl||this.alt||this.shift},t.isModifierKey=function(){return this.code===r.KEY_CTRL||this.code===r.KEY_SHIFT||this.code===r.KEY_ALT},t.isDown=function(){return"keydown"===this.type},t.isUp=function(){return"keyup"===this.type},t.toString=function(){return this._str||(this._str="",this.ctrl&&(this._str+="Ctrl+"),this.alt&&(this._str+="Alt+"),this.shift&&(this._str+="Shift+"),this.code>=48&&this.code<=90?this._str+=String.fromCharCode(this.code):this.code>=r.KEY_F1&&this.code<=r.KEY_F12?this._str+="F"+(this.code-111):this._str+="["+this.code+"]"),this._str},e}();t.KeyEvent=C,document.addEventListener("keydown",(function(e){if(!s(e.target)){var t=e.keyCode,n=new C(e,"keydown",g[t]);a.emit("keydown",n),a.emit("key",n),g[t]=!0}})),document.addEventListener("keyup",(function(e){if(!s(e.target)){var t=e.keyCode,n=new C(e,"keyup");a.emit("keyup",n),a.emit("key",n),g[t]=!1}}))},40509:function(e,t){"use strict";t.__esModule=!0,t.hasWindowFocus=t.focusWindow=t.focusMap=void 0;t.focusMap=function(){Byond.winset("mapwindow.map",{focus:!0})};t.focusWindow=function(){Byond.winset(window.__windowId__,{focus:!0})};t.hasWindowFocus=function(){return document.hasFocus()}},1033:function(e,t,n){"use strict";t.__esModule=!0,t.formatFrequency=t.truncate=t.formatPressure=t.formatTime=t.formatDb=t.formatMoney=t.formatPower=t.formatSiUnit=void 0;var o=n(97622),r=["f","p","n","\u03bc","m"," ","k","M","G","T","P","E","Z","Y"],a=r.indexOf(" "),i=function(e,t,n){if(void 0===t&&(t=-a),void 0===n&&(n=""),"number"!=typeof e||!Number.isFinite(e))return e;var i=Math.floor(Math.log10(e)),c=Math.floor(Math.max(3*t,i)),l=Math.floor(i/3),u=Math.floor(c/3),d=(0,o.clamp)(a+u,0,r.length),s=r[d],p=e/Math.pow(1e3,u),m=l>t?2+3*u-c:0;return((0,o.toFixed)(p,m)+" "+s+n).trim()};t.formatSiUnit=i;t.formatPower=function(e,t){return void 0===t&&(t=0),i(e,t,"W")};t.formatMoney=function(e,t){if(void 0===t&&(t=0),!Number.isFinite(e))return e;var n=(0,o.round)(e,t);t>0&&(n=(0,o.toFixed)(e,t));var r=(n=String(n)).length,a=n.indexOf(".");-1===a&&(a=r);for(var i="",c=0;c<r;c++)c>0&&c<a&&(a-c)%3==0&&(i+=","),i+=n.charAt(c);return i};t.formatDb=function(e){var t=20*Math.log(e)/Math.log(10),n=t>=0?"+":"\u2013",r=Math.abs(t);return n+(r=r===Infinity?"Inf":(0,o.toFixed)(r,2))+" dB"};t.formatTime=function(e,t){void 0===t&&(t="");var n=Math.floor(e/10%60),o=Math.floor((e/10-n)/60);return e<=0&&""!==t?t:(n<10&&(n="0"+n),o<10&&(o="0"+o),o+":"+n)};t.formatPressure=function(e){return e<1e4?(0,o.toFixed)(e)+" kPa":i(1e3*e,1,"Pa")};t.truncate=function(e,t){return void 0===t&&(t=25),e.length>t?e.substr(0,t-1)+"\u2026":e};t.formatFrequency=function(e){return e=Math.round(e),Math.floor(e/10)+"."+e%10}},6965:function(e,t,n){"use strict";t.__esModule=!0,t.listenForKeyEvents=t.setupHotKeys=t.releaseHeldKeys=t.releaseHotKey=t.acquireHotKey=void 0;var o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=a(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var c=r?Object.getOwnPropertyDescriptor(e,i):null;c&&(c.get||c.set)?Object.defineProperty(o,i,c):o[i]=e[i]}o["default"]=e,n&&n.set(e,o);return o}(n(57890)),r=n(99397);function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(a=function(e){return e?n:t})(e)}function i(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var l=(0,n(79926).createLogger)("hotkeys"),u={},d=[o.KEY_ESCAPE,o.KEY_ENTER,o.KEY_SPACE,o.KEY_TAB,o.KEY_CTRL,o.KEY_SHIFT,o.KEY_UP,o.KEY_DOWN,o.KEY_LEFT,o.KEY_RIGHT,o.KEY_F5],s={},p=[],m=function(e){var t=String(e);if("Ctrl+F5"!==t&&"Ctrl+R"!==t){if("Ctrl+F"!==t&&!(e.event.defaultPrevented||e.isModifierKey()||d.includes(e.code))){var n,o=16===(n=e.code)?"Shift":17===n?"Ctrl":18===n?"Alt":33===n?"Northeast":34===n?"Southeast":35===n?"Southwest":36===n?"Northwest":37===n?"West":38===n?"North":39===n?"East":40===n?"South":45===n?"Insert":46===n?"Delete":n>=48&&n<=57||n>=65&&n<=90?String.fromCharCode(n):n>=96&&n<=105?"Numpad"+(n-96):n>=112&&n<=123?"F"+(n-111):188===n?",":189===n?"-":190===n?".":void 0;if(o){var r=u[o];if(r)return l.debug("macro",r),Byond.command(r);if(e.isDown()&&!s[o]){s[o]=!0;var a='.keydown "'+o+'"';return l.debug(a),Byond.command(a)}if(e.isUp()&&s[o]){s[o]=!1;var i='.force_keyup "'+o+'"';return l.debug(i),Byond.command(i)}}}}else location.reload()};t.acquireHotKey=function(e){d.push(e)};t.releaseHotKey=function(e){var t=d.indexOf(e);t>=0&&d.splice(t,1)};var f=function(){for(var e=0,t=Object.keys(s);e<t.length;e++){var n=t[e];s[n]&&(s[n]=!1,l.log('releasing key "'+n+'"'),Byond.command('.force_keyup "'+n+'"'))}};t.releaseHeldKeys=f;t.setupHotKeys=function(){Byond.winget("default.*").then((function(e){for(var t={},n=0,o=Object.keys(e);n<o.length;n++){var r=o[n],a=r.split("."),i=a[1],c=a[2];i&&c&&(t[i]||(t[i]={}),t[i][c]=e[r])}for(var d=/\\"/g,s=function(e){return e.substring(1,e.length-1).replace(d,'"')},p=0,m=Object.keys(t);p<m.length;p++){var f=t[m[p]],h=s(f.name);u[h]=s(f.command)}l.debug("loaded macros",u)})),r.globalEvents.on("window-blur",(function(){f()})),r.globalEvents.on("key",(function(e){for(var t,n=i(p);!(t=n()).done;){(0,t.value)(e)}m(e)}))};t.listenForKeyEvents=function(e){p.push(e);var t=!1;return function(){t||(t=!0,p.splice(p.indexOf(e),1))}}},36525:function(e,t,n){"use strict";t.__esModule=!0,t.AIRack=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.AIRack=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.lawTitles,d=l.lawText,s=l.welded,p=l.screwed;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"AI Law Rack",width:600,height:800,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Collapsible,{title:e?u[t]:"Empty",open:!!e,children:[(0,o.createComponentVNode)(2,a.BlockQuote,{preserveWhitespace:!0,children:e?d[t]:"<Empty Slot>"}),(0,o.createComponentVNode)(2,a.Button,{icon:e?"circle":"circle-o",content:e?"Remove":"Empty",onClick:function(){return c("rack",{rack_index:t+1})},disabled:s[t]||p[t]}),(0,o.createComponentVNode)(2,a.Button,{icon:s[t]?"circle":"circle-o",content:s[t]?"Welded":"Not Welded",onClick:function(){return c("weld",{rack_index:t+1})},color:s[t]?"red":"green"}),(0,o.createComponentVNode)(2,a.Button,{icon:p[t]?"circle":"circle-o",content:p[t]?"Screwed In":"Not Screwed In",onClick:function(){return c("screw",{rack_index:t+1})},color:p[t]?"red":"green"})]},t)}))})})})})}},50687:function(e,t,n){"use strict";t.__esModule=!0,t.AbilityManager=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.number,n=e.unit,r=e.onChange,i=e.abilityRef;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,unit:n,width:"5em",value:t,onChange:function(e,t){return r(i,t)}})})})},l=function(e){var t=e.children;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",textAlign:"center",children:t})},u=function(){return(0,o.createComponentVNode)(2,a.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,l,{children:"Name"}),(0,o.createComponentVNode)(2,l,{children:"Subtype"}),(0,o.createComponentVNode)(2,l,{children:"Cost"}),(0,o.createComponentVNode)(2,l,{children:"Cooldown"}),(0,o.createComponentVNode)(2,l,{children:"Actions"})]})};t.AbilityManager=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,s=d.abilities,p=d.target_name,m=function(e,t){return l("updatePointCost",{abilityRef:e,value:t})},f=function(e,t){return l("updateCooldown",{abilityRef:e,value:t})};return(0,o.createComponentVNode)(2,i.Window,{title:"Ability Manager",width:"750",height:"300",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Abilities of "+p,scrollable:!0,fill:!0,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return l("addAbility")},children:"Add Ability"}),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,u),(null==s?void 0:s.length)>0?s.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.subtype}),(0,o.createComponentVNode)(2,c,{number:e.pointCost,onChange:m,abilityRef:e.abilityRef}),(0,o.createComponentVNode)(2,c,{number:e.cooldown,unit:"ds",onChange:f,abilityRef:e.abilityRef}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{direction:"row",align:"center",nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:"View Variables",tooltipPosition:"top",align:"left",icon:"gear",onClick:function(){return t=e.abilityRef,l("manageAbility",{abilityRef:t});var t}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:"Rename",tooltipPosition:"top",align:"left",icon:"pen",onClick:function(){return t=e.abilityRef,l("renameAbility",{abilityRef:t});var t}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{tooltip:"Remove",tooltipPosition:"top",align:"left",icon:"trash",color:"bad",onClick:function(){return t=e.abilityRef,l("deleteAbility",{abilityRef:t});var t}})]})})]},e.abilityRef)})):null]})})})})}},24782:function(e,t,n){"use strict";t.__esModule=!0,t.GasInfo=t.AirAlarm=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(48175);t.AirAlarm=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data),d=c.boundaries,s=c.gasses,p=c.temperature,m=c.safe;return(0,o.createComponentVNode)(2,i.Window,{width:300,height:350,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[0===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"red",children:"ALERT!"}),1===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"orange",children:"CAUTION"}),2===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"green",children:"OPTIMAL"}),(0,o.createComponentVNode)(2,a.Box,{align:"center",nowrap:!0,p:1,fontSize:1,color:(0,l.getTemperatureColor)(p),children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Atmospheric Temperature"}),(0,o.createComponentVNode)(2,a.Icon,{name:(0,l.getTemperatureIcon)(p),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p})," K"]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Gasses",children:[(0,o.createComponentVNode)(2,a.Flex,{children:d.slice(0,4).map((function(e,t){return(0,o.createComponentVNode)(2,u,{partial_pressure:s[e.varname],boundary:e,gas_index:t},e.varname)}))}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Flex,{children:d.slice(4,8).map((function(e,t){return(0,o.createComponentVNode)(2,u,{partial_pressure:s[e.varname],boundary:e,gas_index:t},e.varname)}))})]})]})})};var u=function(e){var t=e.partial_pressure,n=e.boundary,r=(e.gas_index,100);return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Box,{align:"center",children:n.friend_name}),(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.RoundGauge,{align:"center",size:1.75,value:t,minValue:0,maxValue:r,alertAfter:isFinite(n.safe_max)?n.safe_max:r,alertBefore:isFinite(n.safe_min)?n.safe_min:0,ranges:{bad:[0,r],average:[isFinite(n.safe_min)?n.safe_min:0,isFinite(n.safe_max)?n.safe_max:r],good:[isFinite(n.good_min)?n.good_min:0,isFinite(n.good_max)?n.good_max:r]},format:c.formatPressure})})]})};t.GasInfo=u},89375:function(e,t,n){"use strict";t.__esModule=!0,t.AirVendor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(72638),l=n(5394),u=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.air_cost,u=c.bankMoney,d=c.cash,s=c.current_fill,p=c.fill_cost,m=c.max_pressure,f=c.min_pressure,h=c.target_pressure,g=c.vend_type,C=function(e){return i("o2_changepressure",{pressure:e})},N=!l,v=N||p>0&&(u>=p||d>=p);return(0,o.createComponentVNode)(2,a.Section,{title:"Buy "+g+"!",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cost",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Button,{content:N?"Free!":(p||0)+"\u2abd",color:v?"green":undefined,disabled:!v,onClick:function(){return i("o2_fill")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:h===f,onClick:function(){return C(f)},content:"Min"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Slider,{value:h,fillValue:Math.min(s,m),minValue:f,maxValue:m,step:10,stepPixelSize:4,onChange:function(e,t){return C(t)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:h===m,onClick:function(){return C(m)},content:"Max"})})]})})]})})},d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,u=c.holding,d=c.holding_pressure,s=c.max_pressure;return(0,o.createComponentVNode)(2,a.Section,{title:"Holding Tank",buttons:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("o2_eject")},icon:"eject",disabled:!u,children:"Eject"}),children:[(0,o.createComponentVNode)(2,l.GasTankInfo,{pressure:d||0,maxPressure:s||1,name:u||"N/A"}),!u&&(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return i("o2_insert")},bold:!0,children:"Insert Gas Tank"})})]})};t.AirVendor=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data,s=l.cash,p=l.cardname,m=l.bankMoney;return(0,o.createComponentVNode)(2,i.Window,{width:350,height:320,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,c.VendorCashTable,{cardname:p,onCardClick:function(){return a("logout")},bankMoney:m,cash:s,onCashClick:function(){return a("returncash")}})]})})}},22704:function(e,t,n){"use strict";t.__esModule=!0,t.AccessPanel=t.Airlock=t.uiCurrentUserPermissions=void 0;var o=n(96323),r=n(31246),a=n(1033),i=n(26949),c=n(2381),l=function(e){var t=e.panelOpen,n=e.userStates;return{airlock:n.isBorg||n.isAi,accessPanel:n.isBorg&&n.distance<=1&&t||t&&!n.isBorg&&!n.isAi}};t.uiCurrentUserPermissions=l;t.Airlock=function(e,t){var n=(0,r.useBackend)(t).data,a=l(n);return(0,o.createComponentVNode)(2,c.Window,{theme:"ntos",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[!a.airlock&&!a.accessPanel&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Box,{width:25,height:5,align:"center",children:"Access Panel is Closed"})}),!!a.airlock&&!!a.accessPanel&&(0,o.createComponentVNode)(2,u)||!!a.airlock&&(0,o.createComponentVNode)(2,d)||!!a.accessPanel&&(0,o.createComponentVNode)(2,s)]})})};var u=function(e,t){var n=(0,r.useBackend)(t).data,l=n.name,u=n.canAiControl,d=n.hackMessage,s=n.canAiHack,C=n.noPower,N=(0,r.useLocalState)(t,"tabIndex",1),v=N[0],b=N[1];return(0,o.createComponentVNode)(2,c.Window,{width:354,height:495,title:"Airlock - "+(0,a.truncate)(l,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===v,onClick:function(){b(1)},children:"Airlock Controls"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===v,onClick:function(){b(2)},children:"Access Panel"})]}),1===v&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{fitted:!0,backgroundColor:"transparent",children:[(!u||!!C)&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Box,{width:20,height:5,algin:"center",children:d||"Airlock Controls Disabled"})}),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]}),!!s&&(0,o.createComponentVNode)(2,h)],0),2===v&&(0,o.createComponentVNode)(2,g)]})})},d=function(e,t){var n=(0,r.useBackend)(t).data,l=n.name,u=n.canAiControl,d=n.hackMessage,s=n.canAiHack,g=n.noPower;return(0,o.createComponentVNode)(2,c.Window,{width:315,height:380,title:"Airlock - "+(0,a.truncate)(l,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(!u||!!g)&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"26px",children:[(0,o.createComponentVNode)(2,i.Box,{width:20,height:5,algin:"center",children:d||"Airlock Controls Disabled"}),!!s&&(0,o.createComponentVNode)(2,h)]}),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]})})},s=function(e,t){var n=(0,r.useBackend)(t).data.name;return(0,o.createComponentVNode)(2,c.Window,{width:354,height:465,title:"Airlock - "+(0,a.truncate)(n,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,g)})})},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.netId,p=c.accessCode,m={width:6.7,textAlign:"center"};return(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:[(0,o.createComponentVNode)(2,i.Box,{children:["Access sensor reports the net identifer is:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:s})]}),(0,o.createComponentVNode)(2,i.Box,{children:["Net access code:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:p})]}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main",color:l?"bad":"good",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},m,{color:"bad",icon:"plug",disabled:!!l,onClick:function(){return a("disruptMain")},children:"Disrupt"}))),children:[l?"Offline":"Online"," ",d.main_1&&d.main_2?l>0&&"["+l+"s]":"[Wires cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Backup",color:u?"bad":"good",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},m,{mt:.5,color:"bad",icon:"plug",disabled:!!u,onClick:function(){return a("disruptBackup")},children:"Disrupt"}))),children:[u?"Offline":"Online"," ",d.backup_1&&d.backup_2?u>0&&"["+u+"s]":"[Wires cut!]"]})]})]})},m=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.idScanner,p=c.boltsAreUp,m=c.opened,f=c.welded,h={width:6.7,textAlign:"center"};return(0,o.createComponentVNode)(2,i.Section,{title:"Access and Door Control",pt:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID Scan",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},h,{color:s?"good":"bad",icon:s?"power-off":"times",disabled:!d.idScanner||l&&u,onClick:function(){return a("idScanToggle")},children:s?"Enabled":"Disabled"}))),children:!d.idScanner&&"[Wires cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolts",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({mt:.5},h,{color:p?"good":"bad",icon:p?"lock":"unlock",disabled:!d.bolts||l&&u,onClick:function(){return a("boltToggle")},children:p?"Raised":"Lowered"}))),children:!d.bolts&&"[Wires cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Control",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},h,{mt:.5,color:m?"bad":"good",icon:m?"sign-out-alt":"sign-in-alt",disabled:!p||f||l&&u,onClick:function(){return a("openClose")},children:m?"Open":"Closed"}))),children:!(p&&!f)&&(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("["),!p&&"Bolted",!p&&f&&" & ",f&&"Welded",(0,o.createTextVNode)("!]")],0)})]})})},f=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.shockTimeLeft;return(0,o.createComponentVNode)(2,i.NoticeBox,{backgroundColor:"#601B1B",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{labelColor:"white",color:s?"average":"good",label:"Electrify",children:[s?"Electrified":"Safe"," ",(d.shock?s>0&&"["+s+"s]":"[Wires cut!]")||-1===s&&"[Permanent]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{color:s?"Bad":"Average",children:(0,o.createComponentVNode)(2,i.Box,{pl:s?18:0,pt:.5,children:[!s&&(0,o.createComponentVNode)(2,i.Button.Confirm,{width:9,p:.5,align:"center",color:"average",content:"Temporary",confirmContent:"Are you sure?",icon:"bolt",disabled:!d.shock||l&&u,onClick:function(){return a("shockTemp")}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{width:9,p:.5,align:"center",color:s?"good":"bad",icon:"bolt",confirmContent:"Are you sure?",content:s?"Restore":"Permanent",disabled:!d.shock||l&&u,onClick:s?function(){return a("shockRestore")}:function(){return a("shockPerm")}})]})})]})})},h=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.aiHacking,u=c.hackingProgression;return(0,o.createComponentVNode)(2,i.Box,{fitted:!0,py:.5,pt:2,align:"center",children:[!l&&(0,o.createComponentVNode)(2,i.Button,{className:"Airlock-hack-button",fontSize:"29px",backgroundColor:"#00FF00",disabled:l,textColor:"black",textAlign:"center",width:16,onClick:function(){return a("hackAirlock")},children:"HACK"}),!!l&&(0,o.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[6,Infinity],average:[2,5],bad:[-Infinity,1]},minValue:0,maxValue:6,value:u})]})},g=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.signalers,u=c.wireColors,d=c.wireStates,s=c.netId,p=c.powerIsOn,m=c.boltsAreUp,f=c.canAiControl,h=c.aiControlVar,g=c.safety,C=c.panelOpen,N=c.accessCode,v=function(e,t){a(t,{wireColorIndex:e})},b=Object.keys(u);return(0,o.createComponentVNode)(2,i.Section,{title:"Access Panel",children:[!C&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:"Access Panel is Closed"}),(0,o.createComponentVNode)(2,i.Box,{children:["An identifier is engraved under the airlock's card sensors:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:s})]}),(0,o.createComponentVNode)(2,i.Box,{children:["A display shows net access code:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:N})]}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:b.map((function(e,t){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e+" wire",labelColor:e.toLowerCase(),children:d[t]?(0,o.createComponentVNode)(2,i.Button,{color:"green",height:1.8,onClick:function(){return v(t,"mend")},children:"Mend"}):(0,o.createComponentVNode)(2,i.Box,{height:1.8,children:[(0,o.createComponentVNode)(2,i.Button,{icon:"cut",onClick:function(){return v(t,"cut")},children:"Cut"}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",onClick:function(){return v(t,"pulse")},children:"Pulse"}),(0,o.createComponentVNode)(2,i.Button,{icon:"broadcast-tower",width:10.5,className:"AccessPanel-wires-btn",selected:l[t],onClick:function(){return v(t,"signaler")},children:l[t]?"Detach Signaler":"Attach Signaler"})]})},e)}))}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door bolts",color:m?"green":"red",children:m?"Disengaged":"Engaged"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Test light",color:p?"green":"red",children:p?"Active":"Inactive"})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"AI control",color:f?2===h?"orange":"green":"red",children:f?"Enabled":"Disabled"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Safety light",color:g?"green":"red",children:g?"Active":"Inactive"})]})})]})]})};t.AccessPanel=g},78403:function(e,t,n){"use strict";t.__esModule=!0,t.getAlertContentWindow=void 0;var o=n(43469);t.getAlertContentWindow=function(e){if("tgControls"===e)return o.tgControls}},43469:function(e,t,n){"use strict";t.__esModule=!0,t.tgControls=void 0;var o=n(96323),r=n(26949),a={width:470,height:320,title:"Use /tg/ style interface?",content:(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Box,{children:"Would you rather use a /tg/ style interface? If so, checkout the options in the drop-down menu at the top of the screen - 'Game'."}),(0,o.createComponentVNode)(2,r.Box,{my:1.5,children:"Save your profile in Character Setup to dismiss this alert."})],0)};t.tgControls=a},89037:function(){},458:function(e,t,n){"use strict";t.__esModule=!0,t.AlertModal=void 0;var o=n(96323),r=n(55631),a=n(31246),i=n(57890),c=n(26949),l=n(2381),u=n(78403);t.AlertModal=function(e,t){var n=(0,a.useBackend)(t),s=n.act,p=n.data,m=p.autofocus,f=p.items,h=void 0===f?[]:f,g=p.message,C=void 0===g?"":g,N=p.content_window,v=void 0===N?"":N,b=p.timeout,V=p.title,y=p.theme,x=(0,a.useLocalState)(t,"selected",0),I=x[0],k=x[1],w=v?(0,u.getAlertContentWindow)(v):null,S=w?w.height:115+(C.length>30?Math.ceil(C.length/4):0),_=w?w.width:325+(h.length>2?55:0),M=function(e){0===I&&-1===e?k(h.length-1):I===h.length-1&&1===e?k(0):k(I+e)};return(0,o.createComponentVNode)(2,l.Window,{height:S,title:w?w.title:V,width:_,theme:y||"nanotrasen",children:[!!b&&(0,o.createComponentVNode)(2,r.Loader,{value:b}),(0,o.createComponentVNode)(2,l.Window.Content,{onKeyDown:function(e){var t=window.event?e.which:e.keyCode;t===i.KEY_SPACE||t===i.KEY_ENTER?s("choose",{choice:h[I]}):t===i.KEY_ESCAPE?s("cancel"):t===i.KEY_LEFT?(e.preventDefault(),M(-1)):t!==i.KEY_TAB&&t!==i.KEY_RIGHT||(e.preventDefault(),M(1))},children:(0,o.createComponentVNode)(2,c.Section,{fill:!0,children:(0,o.createComponentVNode)(2,c.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,m:1,children:(0,o.createComponentVNode)(2,c.Box,{color:"label",overflow:"hidden",children:w?w.content:C})}),(0,o.createComponentVNode)(2,c.Stack.Item,{children:[!!m&&(0,o.createComponentVNode)(2,c.Autofocus),(0,o.createComponentVNode)(2,d,{selected:I})]})]})})})]})};var d=function(e,t){var n=(0,a.useBackend)(t).data.items,r=void 0===n?[]:n,i=e.selected;return(0,o.createComponentVNode)(2,c.Flex,{align:"center",direction:"row",fill:!0,justify:"space-around",wrap:!0,children:null==r?void 0:r.map((function(e,t){return(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,s,{button:e,id:t.toString(),selected:i===t})},t)}))})},s=function(e,t){var n=(0,a.useBackend)(t),r=n.act,i=(n.data,e.button),l=e.selected,u=i.length>7?i.length:7;return(0,o.createComponentVNode)(2,c.Button,{onClick:function(){return r("choose",{choice:i})},m:.5,pl:2,pr:2,pt:0,selected:l,textAlign:"center",width:u,children:i})}},20920:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistTypeTabBody=void 0;var o=n(96323),r=n(31246),a=n(21118),i=n(26949);t.AntagonistTypeTabBody=function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.currentTabSections?e.currentTabSections.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e),t))})):(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e)))})};var c=function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{mb:-2.5,italic:!0,children:"The Game Mode Is:"}),(0,o.createComponentVNode)(2,i.Stack.Item,{fontSize:2.75,bold:!0,children:(0,a.toTitleCase)(e.gameMode)})]})}),(0,o.createComponentVNode)(2,i.Stack,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Antagonist Mortality Rate",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:e.mortalityRates.antagonistsAlive+e.mortalityRates.antagonistsDead||1,value:e.mortalityRates.antagonistsDead,color:"red",backgroundColor:"green",mb:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alive Antagonists",children:e.mortalityRates.antagonistsAlive}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Dead Antagonists",children:e.mortalityRates.antagonistsDead})]})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Crew Mortality Rate",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:e.mortalityRates.crewAlive+e.mortalityRates.crewDead||1,value:e.mortalityRates.crewDead,color:"red",backgroundColor:"green",mb:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alive Crew",children:e.mortalityRates.crewAlive}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Dead Crew",children:e.mortalityRates.crewDead})]})]})})]})],4)},l=function(e){var t=V(e.sectionType);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,t,Object.assign({},e)))},u=function(){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]})]})},d=function(e,t){var n,a=(0,r.useBackend)(t),c=a.act,l=a.data,u=(null==(n=l.subordinateAntagonists[e.antagonist_datum])?void 0:n.sort((function(e,t){return e.real_name.localeCompare(t.real_name)})))||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e)))]}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[!!e.has_subordinate_antagonists&&(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",my:-.5,mr:.8,icon:l.subordinateAntagonists[e.antagonist_datum]?"chevron-down":"chevron-right",onClick:function(){return c(l.subordinateAntagonists[e.antagonist_datum]?"unrequest_subordinate_antagonist_data":"request_subordinate_antagonist_data",{antagonist_datum:e.antagonist_datum})},tooltip:"Subordinate Antagonists"}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({mind_ref:e.mind_ref},l.mindLocations[e.mind_ref]))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e)))]}),u.map((function(e,t){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",pl:1.6,children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e)))]}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,i.Icon,{name:"caret-right",mr:1.6}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e)))]},t)}))],0)},s=function(e){e.display_name;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Antagonist Role",children:(0,a.toTitleCase)(e.display_name)})},p=function(e){e.ckey;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Client",children:e.ckey?e.ckey:(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"No Client"})})},m=function(e){e.job;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Job",children:e.job?e.job:(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"N/A"})})},f=function(e){e.real_name,e.ckey,e.dead;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[!!e.dead&&(0,o.createComponentVNode)(2,i.Icon,{name:"skull"})," ",e.real_name+" ",!e.ckey&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"(no client)"})]})},h=function(e,t){var n=(0,r.useBackend)(t).act,a=(e.mind_ref,e.area),c=e.coordinates;return(0,o.createComponentVNode)(2,i.Table.Cell,{children:[a,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c,onClick:function(){return n("jump_to",{target:e.mind_ref})},tooltip:"Jump To Position"})]})},g=function(e){return(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e)))]})},C=function(e,t){var n=(0,r.useBackend)(t).act;e.mind_ref;return(0,o.createComponentVNode)(2,i.Button,{content:"PM",onClick:function(){return n("admin_pm",{mind_ref:e.mind_ref})},tooltip:"Admin PM",mr:1})},N=function(e,t){var n=(0,r.useBackend)(t).act;e.mind_ref;return(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",icon:"user-gear",onClick:function(){return n("player_options",{mind_ref:e.mind_ref})},tooltip:"Player Options",mr:1})},v=function(e,t){var n=(0,r.useBackend)(t).act;e.antagonist_datum;return(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",icon:"gear",onClick:function(){return n("view_variables",{antagonist_datum:e.antagonist_datum})},tooltip:"Antagonist Datum Vars"})},b=function(e,t){var n=(0,r.useBackend)(t),c=n.data;n.act;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",children:(0,a.toTitleCase)(e.role)}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e)))}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[" ",(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))," "]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({mind_ref:e.mind_ref},c.mindLocations[e.mind_ref]))),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e)))]})]})},V=function(e){if(e!==undefined)return e in y?y[e]:void 0},y={AntagonistList:function(e){var t=e.sectionData;if(t.length){var n=t.sort((function(e,t){return e.real_name.localeCompare(t.real_name)}))||[];return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Table,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",e.sectionName?e.sectionName:"Name"," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Location "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Commands "})]}),(0,o.createComponentVNode)(2,u),null==n?void 0:n.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e),t))}))]})})}},NuclearBombReadout:function(e,t){if(e.sectionData){var n=(0,r.useBackend)(t).act,c=e.sectionData;return(0,o.createComponentVNode)(2,i.Section,{title:(0,a.toTitleCase)(e.sectionName),children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",textColor:"red",fontFamily:"Consolas",fontSize:5,m:.5,mr:2,children:c.timeRemaining})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:c.maxHealth,value:c.health,color:"green",backgroundColor:"red",mb:1})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",verticalAlign:"middle",children:[c.area,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c.coordinates,onClick:function(){return n("jump_to",{target:c.nuclearBomb})},tooltip:"Jump To Position"})]})]})})]})})}},HeadsList:function(e){var t=e.sectionData;if(t.length){var n=["Captain","Head of Personnel","Head of Security","Chief Engineer","Research Director","Medical Director"],r=t.sort((function(e,t){return n.indexOf(e.role)-n.indexOf(t.role)}))||[];return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Table,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Role "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Name "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Location "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Commands "})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]})]}),null==r?void 0:r.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},e),t))}))]})})}},GangReadout:function(e){var t=e.sectionData;if(t.length)return(0,o.createComponentVNode)(2,i.Section,{title:e.sectionName,children:t.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e),t))}))})},GangLockerReadout:function(e,t){if(e.sectionData){var n=(0,r.useBackend)(t).act,c=e.sectionData;return(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:(0,a.toTitleCase)(e.sectionName)}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:c.maxHealth,value:c.health,color:"green",backgroundColor:"red",mb:1})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",verticalAlign:"middle",children:[c.area,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c.coordinates,onClick:function(){return n("jump_to",{target:c.gangLocker})},tooltip:"Jump To Position"})]})]})]})}}}},56444:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistTypeTabs=void 0;var o=n(96323),r=n(31246),a=n(21118),i=n(26949);t.AntagonistTypeTabs=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=(0,r.useLocalState)(t,"tabIndex",c.tabToOpenOn),d=u[0],s=u[1],p=c.tabs.sort((function(e,t){return e.tabName.localeCompare(t.tabName)}))||[],m=function(e){s(e),l("set_tab",{index:e})};return(0,o.createComponentVNode)(2,i.Section,{inline:!0,fill:!0,children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:null===d,onClick:function(){return m(null)},width:12,my:.2,children:"General"}),(0,o.createComponentVNode)(2,i.Box,{my:-.5,children:(0,o.createComponentVNode)(2,i.Divider)}),p.map((function(e,t){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:d===e.index,onClick:function(){return m(e.index)},width:12,my:.2,children:(0,a.toTitleCase)(e.tabName)},t)}))]})})}},20636:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistPanel=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(56444),l=n(20920);t.AntagonistPanel=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Window,{title:"Antagonist Panel",width:750,height:500,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.AntagonistTypeTabs,Object.assign({},n)))}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.AntagonistTypeTabBody,Object.assign({},n)))})]})})})}},5562:function(){},20065:function(e,t,n){"use strict";t.__esModule=!0,t.AccessPanelSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(63687);t.AccessPanelSection=function(e,t){var n=(0,r.useBackend)(t).data,c=n.net_id,l=n.locked,u=n.shorted,d=n.aidisabled;return(0,o.createComponentVNode)(2,a.Section,{title:"Access Panel",children:[(0,o.createComponentVNode)(2,a.Box,{children:["An identifier is engraved above the APC's wires:"," ",(0,o.createComponentVNode)(2,a.Box,{inline:!0,italic:!0,children:c})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,i.WireList),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Controls",color:l?"green":"red",children:l?"Locked":"Unlocked"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Circuitry",color:u?"red":"green",children:u?"Shorted":"Working"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"AI Control",color:d?"red":"green",children:d?"Disabled":"Enabled"})]})]})}},65005:function(e,t,n){"use strict";t.__esModule=!0,t.CellDisplay=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(94104);t.CellDisplay=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.cell_percent,d=l.cell_present,s=l.chargecount,p=l.chargemode,m=l.charging,f=(0,i.getHasPermission)(l),h=function(e,t){switch(e){case 0:return t?"Performing self-test":"Not charging";case 1:return"Charging";default:return"Fully Charged"}}(m,s),g=function(e){return function(){return c("onChargeModeChange",{chargemode:e})}};return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charging",textAlign:"right",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:g(0),disabled:!f&&0!==p,selected:0===p,children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{onClick:g(1),disabled:!f&&1!==p,selected:1===p,children:"Auto"})],4),children:["(",d?h:"Not Connected",")"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cell Power",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:u,minValue:0,maxValue:100,color:u<20?"red":u<50?"yellow":"green"})})],4)}},54187:function(e,t,n){"use strict";t.__esModule=!0,t.MainSection=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(65005),u=n(94104);!function(e){e[e.None=0]="None",e[e.Low=1]="Low",e[e.Good=2]="Good"}(r||(r={}));var d=((o={})[r.None]={name:"None",color:"red"},o[r.Low]={name:"Low",color:"yellow"},o[r.Good]={name:"Good",color:"green"},o),s=function(e){var t=e.mainStatus,n=d[t];return(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"External Power",color:n.color,textAlign:"right",children:n.name})};t.MainSection=function(e,t){var n=(0,i.useBackend)(t),o=n.act,r=n.data,d=r.area_name,p=r.host_id,m=r.locked,f=r.main_status,h=r.operating,g=(0,u.getHasPermission)(r),C=(0,u.getIsLocalAccess)(r),N=function(e){return o("onOperatingChange",{operating:e})};return(0,a.createComponentVNode)(2,c.Section,{title:d,children:[C&&(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Box,{align:"center",bold:!0,fill:!0,children:["Swipe ID card to ",m?"unlock":"lock"," interface"]}),(0,a.createComponentVNode)(2,c.Divider)],4),(0,a.createComponentVNode)(2,c.LabeledList,{children:[(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Main Breaker",buttons:(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Button,{disabled:!g&&h,onClick:function(){return N(!1)},selected:!h,children:"Off"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!g&&!h,onClick:function(){return N(!0)},selected:h,children:"On"})],4)}),(0,a.createComponentVNode)(2,l.CellDisplay),(0,a.createComponentVNode)(2,s,{mainStatus:f}),C&&(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Host Connection",color:p?"green":"red",textAlign:"right",children:p?"OK":"NONE"})]})]})}},42947:function(e,t,n){"use strict";t.__esModule=!0,t.PowerChannelSection=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(94104);!function(e){e[e.Equipment=1]="Equipment",e[e.Lighting=2]="Lighting",e[e.Environmental=3]="Environmental"}(o||(o={})),function(e){e[e.Off=0]="Off",e[e.AutoOff=1]="AutoOff",e[e.On=2]="On",e[e.AutoOn=3]="AutoOn"}(r||(r={}));var u=[r.AutoOff,r.AutoOn],d=[{id:o.Equipment,label:"Equipment",getPower:function(e){return e.lastused_equip},getStatus:function(e){return e.equipment},statusChangeAction:"onPowerChannelEquipmentStatusChange"},{id:o.Lighting,label:"Lighting",getPower:function(e){return e.lastused_light},getStatus:function(e){return e.lighting},statusChangeAction:"onPowerChannelLightingStatusChange"},{id:o.Environmental,label:"Environmental",getPower:function(e){return e.lastused_environ},getStatus:function(e){return e.environ},statusChangeAction:"onPowerChannelEnvironStatusChange"}].reduce((function(e,t){var n;return Object.assign({},e,((n={})[t.id]=t,n))}),{}),s=function(e,t){var n,o,s=e.powerChannel,p=(0,i.useBackend)(t),m=p.act,f=p.data,h=(0,l.getHasPermission)(f),g=d[s],C=null!=(n=g.label)?n:"Unknown",N=g.getStatus(f),v=(o=N,u.includes(o)),b=g.getPower(f),V=g.statusChangeAction,y=function(e){V&&m(V,{status:e})};return(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:C,textAlign:"right",buttons:(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&N!==r.Off,onClick:function(){return y(r.Off)},selected:N===r.Off,children:"Off"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&N!==r.On,onClick:function(){return y(r.On)},selected:N===r.On,children:"On"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&!v,onClick:function(){return y(r.AutoOn)},selected:v,children:"Auto"})],4),children:(0,l.formatWatts)(b)})};t.PowerChannelSection=function(e,t){var n=(0,i.useBackend)(t).data.lastused_total;return(0,a.createComponentVNode)(2,c.Section,{title:"Power Channel",children:(0,a.createComponentVNode)(2,c.LabeledList,{children:[(0,a.createComponentVNode)(2,s,{powerChannel:o.Equipment}),(0,a.createComponentVNode)(2,s,{powerChannel:o.Lighting}),(0,a.createComponentVNode)(2,s,{powerChannel:o.Environmental}),(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Load",textAlign:"right",buttons:!0,children:(0,l.formatWatts)(n)})]})})}},63687:function(e,t,n){"use strict";t.__esModule=!0,t.WireListItem=t.WireList=void 0;var o,r=n(96323),a=n(31246),i=n(26949);!function(e){e[e.Orange=1]="Orange",e[e.DarkRed=2]="DarkRed",e[e.White=3]="White",e[e.Yellow=4]="Yellow"}(o||(o={}));var c=[{id:o.Orange,name:"Orange",color:"orange",getIsCut:function(e){return!!e.orange_cut}},{id:o.DarkRed,name:"Dark red",color:"darkred",getIsCut:function(e){return!!e.dark_red_cut}},{id:o.White,name:"White",color:"white",getIsCut:function(e){return!!e.white_cut}},{id:o.Yellow,name:"Yellow",color:"yellow",getIsCut:function(e){return!!e.yellow_cut}}];t.WireList=function(e,t){var n=(0,a.useBackend)(t),o=n.act,u=n.data;return(0,r.createComponentVNode)(2,i.LabeledList,{children:c.map((function(e){var t=e.color,n=e.getIsCut,a=e.id,i=e.name;return(0,r.createComponentVNode)(2,l,{color:t,isCut:n(u),name:i,onBite:function(){return o("onBiteWire",{wire:a})},onCut:function(){return o("onCutWire",{wire:a})},onMend:function(){return o("onMendWire",{wire:a})},onPulse:function(){return o("onPulseWire",{wire:a})}},a)}))})};var l=function(e){var t=e.color,n=e.isCut,o=e.name,a=e.onBite,c=e.onCut,l=e.onMend,u=e.onPulse,d=n?(0,r.createComponentVNode)(2,i.Button,{content:"Mend",onClick:l,selected:!0}):(0,r.createFragment)([(0,r.createComponentVNode)(2,i.Button,{icon:"cut",onClick:c,children:"Cut"}),(0,r.createComponentVNode)(2,i.Button,{icon:"bolt",onClick:u,children:"Pulse"}),(0,r.createComponentVNode)(2,i.Button,{icon:"tooth",onClick:a,children:"Bite"})],4);return(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:o+" wire",labelColor:t,buttons:d})};t.WireListItem=l},91690:function(e,t,n){"use strict";t.__esModule=!0,t.Apc=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(20065),l=n(54187),u=n(42947),d=n(94104),s=function(e){var t=e.coverlocked,n=e.hasPermission,r=e.onCoverLockedChange;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{disabled:!n&&!!t,onClick:function(){return r(!1)},selected:!t,children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{disabled:!n&&!t,onClick:function(){return r(!0)},selected:!!t,children:"On"})],4)};t.Apc=function(e,t){return(0,r.useBackend)(t).data.area_requires_power?(0,o.createComponentVNode)(2,p):(0,o.createComponentVNode)(2,m)};var p=function(e,t){var n=(0,r.useBackend)(t),p=n.act,m=n.data,f=m.area_requires_power,h=m.can_access_remotely,g=m.coverlocked,C=(0,d.getIsLocalAccess)(m),N=(0,d.getHasPermission)(m),v=!!h,b=(0,d.getIsAccessPanelVisible)(m),V=(0,d.calculateWindowHeight)(f,!0,!0,v,b,C);return(0,o.createComponentVNode)(2,i.Window,{title:"Area Power Controller",width:360,height:V,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,l.MainSection),(0,o.createComponentVNode)(2,u.PowerChannelSection),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cover Lock",buttons:(0,o.createComponentVNode)(2,s,{coverlocked:g,hasPermission:N,onCoverLockedChange:function(e){return p("onCoverLockedChange",{coverlocked:e})}})})})}),v&&(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Button,{align:"center",color:"red",fluid:!0,icon:"bolt",onClick:function(){return p("onOverload")},children:"Overload Lighting Circuit"})}),b&&(0,o.createComponentVNode)(2,c.AccessPanelSection)]})})},m=function(e,t){var n=(0,r.useBackend)(t).data,l=n.area_name,u=n.area_requires_power,s=(0,d.getIsAccessPanelVisible)(n),p=(0,d.calculateWindowHeight)(u,!1,!1,!1,s,!1);return(0,o.createComponentVNode)(2,i.Window,{title:"Area Power Controller",width:360,height:p,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Area Power Controller ("+l+")",children:(0,o.createComponentVNode)(2,a.Box,{children:"This APC has no configurable settings."})}),s&&(0,o.createComponentVNode)(2,c.AccessPanelSection)]})})}},73020:function(e,t){"use strict";var n;t.__esModule=!0,t.InterfaceType=void 0,t.InterfaceType=n,function(e){e[e.LocalOnly=0]="LocalOnly",e[e.LocalAndNetwork=1]="LocalAndNetwork",e[e.NetworkOnly=2]="NetworkOnly"}(n||(t.InterfaceType=n={}))},94104:function(e,t,n){"use strict";t.__esModule=!0,t.calculateWindowHeight=t.getIsLocalAccess=t.getIsAccessPanelVisible=t.getHasPermission=t.formatWatts=void 0;var o=n(73020);t.formatWatts=function(e){return(isNaN(e)?0:Math.floor(e))+" W"};t.getHasPermission=function(e){var t=e.is_ai,n=e.is_silicon,o=e.can_access_remotely,r=e.aidisabled,a=e.locked;return t||n||o?!r:!a};t.getIsAccessPanelVisible=function(e){var t=e.is_ai;return!!e.wiresexposed&&!t};var r=[o.InterfaceType.LocalOnly,o.InterfaceType.LocalAndNetwork];t.getIsLocalAccess=function(e){var t=e.can_access_remotely,n=e.setup_networkapc;return r.includes(n)&&!t};t.calculateWindowHeight=function(e,t,n,o,r,a){var i=function(e,t){return 6+(e?t?181:132:62)}(e,a);return 32+i+(n?136:0)+(t?42:0)+(o?42:0)+(r?254:0)+12}},52403:function(e,t,n){"use strict";t.__esModule=!0,t.ArtifactPaper=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ArtifactPaper=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.artifactName,d=l.artifactOrigin,s=l.artifactType,p=l.artifactTriggers,m=l.artifactFaults,f=l.artifactDetails,h=l.allArtifactOrigins,g=l.allArtifactTypes,C=l.allArtifactTriggers,N=l.hasPen;return(0,o.createComponentVNode)(2,i.Window,{title:"Nanotrasen Alien Artifact Analysis Form",theme:"paper",width:800,height:835,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createVNode)(1,"h3",null,"Artifact Name",16),(0,o.createVNode)(1,"h4",null,""===u?"unknown":u,0),(0,o.createVNode)(1,"h3",null,"Artifact Origin",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:3,children:h.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{onClick:function(t,n){return c("origin",{newOrigin:e,hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:d===e}),(0,o.createVNode)(1,"a",null,e,0)]},e.id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Type",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:25,justify:"space-evenly",children:g.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"artifactType"+e[1],onClick:function(t,n){return c("type",{newType:e[0],hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s===e[0]}),(0,o.createVNode)(1,"a",null,e[0],0)]},e[0].id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Triggers (If Applicable)",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:5,children:C.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{onClick:function(t,n){return c("trigger",{newTriggers:e,hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:p===e}),(0,o.createVNode)(1,"a",null,e,0)]},e.id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Faults",16),(0,o.createComponentVNode)(2,a.TextArea,{value:m,fluid:!0,height:5,onChange:function(e,t){return c("fault",{newFaults:t,hasPen:N})}}),(0,o.createVNode)(1,"h3",null,"Additional Information",16),(0,o.createComponentVNode)(2,a.TextArea,{value:f,fluid:!0,height:10,onChange:function(e,t){return c("detail",{newDetail:t,hasPen:N})}})]})})})}},7171:function(e,t,n){"use strict";t.__esModule=!0,t.Atm=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(3382),l=["type"];var u=2,d="danger",s="info",p="success",m=function(e){var t=e.type,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),r=Object.assign({},t===d?{danger:!0}:{},t===s?{info:!0}:{},t===p?{success:!0}:{});return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.NoticeBox,Object.assign({},r,n)))]})};t.Atm=function(e,t){var n=(0,r.useBackend)(t).data.name,l=(0,r.useLocalState)(t,"tabIndex",c.AtmTabKeys.Teller),u=l[0],d=l[1];return(0,o.createComponentVNode)(2,i.Window,{title:n,width:375,height:420,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{fluid:!0,children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"money-bills",selected:u===c.AtmTabKeys.Teller,onClick:function(){return d(c.AtmTabKeys.Teller)},children:"ATM"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"coins",selected:u===c.AtmTabKeys.Spacebux,onClick:function(){return d(c.AtmTabKeys.Spacebux)},children:"Spacebux"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[u===c.AtmTabKeys.Teller&&(0,o.createComponentVNode)(2,f),u===c.AtmTabKeys.Spacebux&&(0,o.createComponentVNode)(2,h)]})]})})})};var f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.accountBalance,d=c.accountName,s=c.loggedIn,p=c.scannedCard,f=c.message||{text:"",status:"",position:""};return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Automatic Teller Machine",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!p&&(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"Please swipe card and enter PIN to access your account."}),(0,o.createComponentVNode)(2,a.Button,{icon:"id-card",content:p||"Swipe ID",onClick:p?function(){return i("logout")}:function(){return i("insert_card")}}),f.text&&"splash"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]}),s===u?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Welcome, ",(0,o.createVNode)(1,"strong",null,[d,(0,o.createTextVNode)(".")],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Your account balance is ",(0,o.createVNode)(1,"strong",null,[l,(0,o.createTextVNode)("\u2abd.")],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"money-bill",content:"Withdraw cash",onClick:function(){return i("withdraw_cash")}}),f.text&&"atm"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})]})})],4):p&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"Enter PIN",onClick:function(){return i("login_attempt")}}),f.text&&"login"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:s===u&&(0,o.createComponentVNode)(2,a.Section,{title:"Lottery",children:[(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"To claim your winnings, you must insert your lottery ticket."}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"ticket-alt",content:"Purchase Lottery Ticket (100\u2abd)",onClick:function(){return i("buy")}}),f.text&&"lottery"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})})]})},h=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.clientKey,u=c.spacebuxBalance;return(0,o.createComponentVNode)(2,a.Section,{title:l+"'s Spacebux Menu",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"This menu is only visible to you. Deposit Spacebux into your account by inserting a token."}),(0,o.createComponentVNode)(2,a.Divider)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Your Spacebux balance is currently"," ",(0,o.createVNode)(1,"strong",null,[u,(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Icon,{name:"fa-solid fa-coins"})],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"coins",content:"Withdraw Spacebux",onClick:function(){return i("withdraw_spacebux")}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",content:"Securely send Spacebux",onClick:function(){return i("transfer_spacebux")}})})]})})}},3382:function(e,t){"use strict";var n;t.__esModule=!0,t.AtmTabKeys=void 0,t.AtmTabKeys=n,function(e){e[e.Teller=0]="Teller",e[e.Spacebux=1]="Spacebux"}(n||(t.AtmTabKeys=n={}))},46837:function(e,t,n){"use strict";t.__esModule=!0,t.AutoInjector=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.AutoInjector=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.injectionAmount,s=u.reagentData,p=u.minimumTime,m=u.condition,f=u.conditionTreshold,h=u.conditionDamage,g=u.conditions;return(0,o.createComponentVNode)(2,i.Window,{width:360,height:520,theme:"neutral",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Contents",buttons:(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!s,onClick:function(){return l("remove_cont")},children:"Eject"}),children:s?(0,o.createFragment)([(0,o.createComponentVNode)(2,c.ReagentGraph,{container:s}),(0,o.createComponentVNode)(2,c.ReagentList,{container:s})],4):"Please attach a beaker"}),(0,o.createComponentVNode)(2,a.Section,{title:"Condition",children:[(0,o.createComponentVNode)(2,a.Dropdown,{options:g,selected:m?m.name:"None",onSelected:function(e){return l("sel_cond",{condition:e})},noscroll:!0,width:"130px"}),f?(0,o.createFragment)([h?(0,o.createComponentVNode)(2,a.Dropdown,{options:["brute","burn","toxin","oxygen"],selected:h.damagetype,onSelected:function(e){return l("sel_damage_type",{damagetype:e})},noscroll:!0,width:"75px",mt:"0.5rem"}):null,(0,o.createComponentVNode)(2,a.Slider,{value:f.currentValue,format:function(e){return e+f.suffix},minValue:f.minValue,maxValue:f.maxValue,step:1,onChange:function(e,t){return l("changeConditionValue",{conditionValue:t})},mt:"0.5rem"})],0):null,m?(0,o.createComponentVNode)(2,a.Box,{mt:"0.5rem",children:m.desc}):null]}),s?(0,o.createComponentVNode)(2,a.Section,{title:"Injection Amount",children:(0,o.createComponentVNode)(2,a.Slider,{value:d,format:function(e){return e+"u"},minValue:1,maxValue:s.maxVolume,step:1,onChange:function(e,t){return l("changeAmount",{amount:t})}})}):null,(0,o.createComponentVNode)(2,a.Section,{title:"Min. time between activations",children:(0,o.createComponentVNode)(2,a.Slider,{value:p,format:function(e){return e+" seconds"},minValue:3,maxValue:300,step:1,onChange:function(e,t){return l("changeMintime",{mintime:t})}})})]})})}},36443:function(e,t,n){"use strict";t.__esModule=!0,t.BarberingMenu=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c="200px";t.BarberingMenu=function(e,t){var n=(0,r.useBackend)(t).data,l=(0,r.useLocalState)(t,"searchText",""),d=l[0],s=l[1],p=n.available_styles,m=Object.keys(p);return(0,o.createComponentVNode)(2,i.Window,{width:700,height:500,title:"Barber",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,m:0,children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:c,children:(0,o.createComponentVNode)(2,a.Box,{position:"fixed",width:c,children:(0,o.createComponentVNode)(2,f,{onSearchTextInput:s})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,u,{searchText:d,allHairNames:m,allHairStyles:p})})]})})})};var l=function(e){var t=e.onInput;return(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Icon,{name:"magnifying-glass"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Input,{style:{width:"100%"},onInput:function(e,n){return t(n)},placeholder:"Search..."})})]})},u=function(e){var t=e.searchText,n=e.allHairNames,r=e.allHairStyles,i=t.toLowerCase(),c=n.filter((function(e){return e.toLowerCase().includes(i)}));return(0,o.createComponentVNode)(2,a.Stack,{wrap:!0,children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{m:1,children:(0,o.createComponentVNode)(2,p,{hairStyle:r[e],hairName:e})},r[e].id)}))})},d=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"cut",color:"red",bold:!0,onClick:function(){return n("do_hair",{style_id:null})},children:"Create Wig"})},s=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"rotate-left",color:"red",onClick:function(){return n("update_preview",{action:"reset"})},children:"Reset"})},p=function(e,t){var n=(0,r.useBackend)(t).act,i=e.hairStyle,c=e.hairName;return(0,o.createComponentVNode)(2,a.Section,{width:"140px",align:"center",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,width:"60px",height:"100px",src:""+i.hair_icon})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:c}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{color:"blue",icon:"cut",onClick:function(){return n("do_hair",{style_id:i.hair_id})},children:"Cut"}),(0,o.createComponentVNode)(2,a.Button,{color:"blue",icon:"eye",onClick:function(){return n("update_preview",{action:"new_hair",style_id:i.hair_id})},children:"Preview"})]})]})})},m=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Stack,{justify:"space-around",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"rotate-left",onClick:function(){return n("update_preview",{action:"change_direction",direction:-90})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"rotate-right",onClick:function(){return n("update_preview",{action:"change_direction",direction:90})}})})]})},f=function(e,t){var n=(0,r.useBackend)(t).data.preview,i=e.onSearchTextInput;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,l,{onInput:i})}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,g)}),(0,o.createComponentVNode)(2,a.Stack.Divider,{mt:0}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",style:{width:"100%"},children:[(0,o.createComponentVNode)(2,a.Box,{style:{width:"100%"},align:"center",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:n,type:"map"},style:{width:"80px",height:"160px"}})}),(0,o.createComponentVNode)(2,s)]}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,m)}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,d)})]})})},h=function(e,t){var n=e.children,i=e.hairPortion,c=e.icon,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.current_hair_style,p=d.selected_hair_portion,m=(0,o.createComponentVNode)(2,a.Box,{align:"right",children:s[i]});return(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:c,rightSlot:m,selected:p===i,onClick:function(){return u("change_hair_portion",{new_portion:i})},children:n})},g=function(){return(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,mb:0,children:[(0,o.createComponentVNode)(2,h,{hairPortion:"top",icon:"arrows-up-to-line",children:"Top"}),(0,o.createComponentVNode)(2,h,{hairPortion:"middle",icon:"arrow-down-up-across-line",children:"Middle"}),(0,o.createComponentVNode)(2,h,{hairPortion:"bottom",icon:"arrows-down-to-line",children:"Bottom"})]})}},8844:function(e,t,n){"use strict";t.__esModule=!0,t.BarcodeComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=e.title,r=e.destinations,i=e.act,c=e.amount;return(0,o.createComponentVNode)(2,a.Section,{title:n,children:r.map((function(e){var t=e.crate_tag,n=e.name;return(0,o.createComponentVNode)(2,a.Button,{width:"100%",align:"center",content:n||t,onClick:function(){return i("print",{crate_tag:t,amount:c})}},t)}))})},l=function(e,t){if(e.card){var n=e.card,r=e.act;return(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:n.name+" ("+n.role+")",tooltip:"Clear scanned card",tooltipPosition:"bottom-end",onClick:function(){r("reset_id")}})}};t.BarcodeComputer=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.sections,p=d.card,m=(0,r.useLocalState)(t,"amount",1),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Barcode computer",width:600,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Amount to print",fill:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:f,minValue:1,maxValue:5,stepPixelSize:15,unit:"Barcodes",onDrag:function(e,t){return h(t)}})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Scanned ID card",fill:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:[(0,o.createComponentVNode)(2,l,{card:p,act:u}),(0,o.createVNode)(1,"br"),p?"Account balance: "+p.balance+"\u2abd":null]})})})]}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Stack,{children:s.map((function(e){var t=e.title,n=e.destinations;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:"33%",children:(0,o.createComponentVNode)(2,c,{title:t,destinations:n,act:u,amount:f})},t)}))})]})})}},45027:function(e,t,n){"use strict";t.__esModule=!0,t.BioEffectManager=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.checked,n=e.onClick,r=e.id;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:t,width:"5em",onClick:function(){return n(r)}})})})},l=function(e){var t=e.number,n=e.unit,r=e.onChange,i=e.id;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,unit:n,width:"5em",value:t,onChange:function(e,t){return r(i,t)}})})})},u=function(e){var t=e.children;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",textAlign:"center",children:t})},d=function(){return(0,o.createComponentVNode)(2,a.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,u,{children:"Name"}),(0,o.createComponentVNode)(2,u,{children:"ID"}),(0,o.createComponentVNode)(2,u,{children:"Stable"}),(0,o.createComponentVNode)(2,u,{children:"Reinforced"}),(0,o.createComponentVNode)(2,u,{children:"Boosted"}),(0,o.createComponentVNode)(2,u,{children:"Synced"}),(0,o.createComponentVNode)(2,u,{children:"Cooldown"}),(0,o.createComponentVNode)(2,u,{children:"Actions"})]})};t.BioEffectManager=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data,p=s.bioEffects,m=s.stability,f=s.target_name,h=function(e,t){return u("updateCooldown",{id:e,value:t})},g=function(e){return u("toggleBoosted",{id:e})},C=function(e){return u("toggleReinforced",{id:e})},N=function(e){return u("toggleStabilized",{id:e})},v=function(e){return u("toggleSynced",{id:e})};return(0,o.createComponentVNode)(2,i.Window,{title:"Bioeffect Manager",width:"750",height:"300",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Bioeffects of "+f,scrollable:!0,fill:!0,buttons:(0,o.createFragment)([(0,o.createTextVNode)("Stability:"),(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,width:"5em",placeholder:100,value:m,onChange:function(e,t){return function(e){return u("updateStability",{value:e})}(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return u("addBioEffect")},children:"Add Bioeffect"})],0),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,d),(null==p?void 0:p.length)>0?p.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.stabilized,onClick:N,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.reinforced,onClick:C,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.boosted,onClick:g,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.synced,onClick:v,id:e.id}),(0,o.createComponentVNode)(2,l,{number:e.cooldown,unit:"ds",onChange:h,id:e.id}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{direction:"row",align:"center",nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:"View Variables",tooltipPosition:"top",align:"left",icon:"gear",onClick:function(){return t=e.id,u("manageBioEffect",{id:t});var t}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{tooltip:"Remove",tooltipPosition:"top",align:"left",icon:"trash",color:"bad",onClick:function(){return t=e.id,u("deleteBioEffect",{id:t});var t}})]})})]},e.id)})):null]})})})})}},34116:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=n(65844),i=function(){return(0,o.createVNode)(32,"defs",null,(0,o.createVNode)(32,"marker",null,(0,o.createVNode)(32,"path",null,null,1,{d:"M0,0 L0,6 L9,3 z",fill:"orange",stroke:"none"}),2,{id:"arrow",markerWidth:"10",markerHeight:"10",refX:"0",refY:"3",orient:"auto",markerUnits:"strokeWidth"}),2)},c=function(e,t){var n=(0,r.useBackend)(t).data,c=(0,a.useStates)(t),l=c.mouseCoords,u=c.tileSize,d=c.isFlipped,s=n.boardInfo,p=s.width,m=s.height,f=n.currentUser;if(!f||!f.selected)return null;var h=n.pieces[f.selected];if(!h)return null;var g=h.x*u.width+u.width/2,C=h.y*u.height+u.height/2,N=l.x-20,v=l.y-54,b=Math.floor(N/u.width)*u.width,V=Math.floor(v/u.height)*u.height,y=b+u.width/2,x=V+u.height/2,I=y-g,k=x-C,w=Math.sqrt(I*I+k*k),S=w>u.width/2&&w>u.height/2,_=y-40*(I/w),M=x-40*(k/w);return(0,o.createVNode)(32,"svg","boardgame__board-ggrenderer",[(0,o.createVNode)(32,"rect",null,null,1,{x:b,y:V,width:u.width,height:u.height,fill:"red","fill-opacity":"0.4"}),(0,o.createVNode)(32,"rect",null,null,1,{x:d?p*u.width-g-u.width/2:g-u.width/2,y:d?m*u.height-C-u.height/2:C-u.height/2,width:u.width,height:u.height,fill:S?"red":"none","fill-opacity":"0.4"}),S&&(0,o.createComponentVNode)(2,i),S&&(0,o.createVNode)(32,"line",null,null,1,{x1:g,y1:C,x2:_,y2:M,stroke:"orange",fill:"none","stroke-width":"3","marker-end":"url(#arrow)"})],0,{width:"100%",height:"100%"})};t["default"]=c},9149:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=n(86489),i=n(65844),c=n(26949),l=function(e,t){var n=e.pieces,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.currentUser,p=d.users,m=(0,i.useStates)(t),f=m.isFlipped,h=m.tileSize,g=(0,i.useActions)(u),C=g.pieceSelect,N=g.pieceRemove,v=g.piecePlace,b=d.boardInfo,V=b.width,y=b.height,x=(0,a.codeRecordFromPieces)((0,a.fetchPieces)());return(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__board-gprenderer",children:Object.keys(n).map((function(e,t){var r,a=n[e],i=a.x,c=a.y,l=(a.prevX,a.prevY,a.code),u=a.selected,d=x[l],m=u&&s!==u,g=i*h.width,b=c*h.height;f&&(g=(V-i-1)*h.width,b=(y-c-1)*h.height);var I=(null==(r=p[u])?void 0:r.name)||"";return(0,o.createVNode)(1,"div","boardgame__board-gprenderer-piece",[(0,o.createVNode)(1,"img",null,null,1,{style:{width:h.width+"px",height:h.width+"px"},src:d.image}),u&&(0,o.createVNode)(1,"span",null,I,0)],0,{onmousedown:function(t){0!==t.button||u||(s.palette&&v(s.ckey,i,c),s.selected&&!m&&v(s.ckey,i,c),s.selected||C(s.ckey,e)),2===t.button&&(u||N(e))},onmouseup:function(e){s.palette&&v(s.ckey,i,c),s.selected&&!m&&v(s.ckey,i,c)},style:{left:g+"px",top:b+"px",width:h.width+"px",height:h.height+"px"}},t)}))})};t["default"]=l},83702:function(e,t){"use strict";t.__esModule=!0,t.screenToBoard=void 0;t.screenToBoard=function(e,t,n){return[e/n.width,t/n.height]}},66508:function(e,t,n){"use strict";t.__esModule=!0,t.Board=void 0;var o,r=n(96323),a=n(29678),i=n(26949),c=n(31246),l=n(65844),u=(o=n(45208))&&o.__esModule?o:{"default":o};t.Board=function(e,t){var n=(0,c.useBackend)(t),o=n.act,u=n.data,s=(0,l.useActions)(o).pieceDeselect;return(0,r.createComponentVNode)(2,i.Flex,{className:"boardgame__wrapper",children:(0,r.createComponentVNode)(2,i.Box,{className:"boardgame__board-inner",children:[(0,r.createComponentVNode)(2,a.HorizontalNotations),(0,r.createComponentVNode)(2,i.Flex,{className:"boardgame__board",children:[(0,r.createComponentVNode)(2,a.VerticalNotations),(0,r.createComponentVNode)(2,i.Flex.Item,{grow:!0,onmouseleave:function(){var e;null!=(e=u.currentUser)&&e.selected&&s(u.currentUser.ckey)},children:(0,r.createComponentVNode)(2,d)}),(0,r.createComponentVNode)(2,a.VerticalNotations)]}),(0,r.createComponentVNode)(2,a.HorizontalNotations)]})})};var d=function(e,t){var n=(0,c.useBackend)(t).data.boardInfo.boardstyle;return"checkerboard"===n?(0,r.createComponentVNode)(2,u["default"],{interactable:!0}):(0,r.createVNode)(1,"div",null,[(0,r.createTextVNode)("Unknown design: "),n],0)}},84894:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=function(e,t){var n=(0,r.useBackend)(t).data,a=n.styling,i=a.tileColor1,c=a.tileColor2,l=100/n.boardInfo.width,u=100/n.boardInfo.height;return(0,o.createVNode)(32,"svg",null,[(0,o.createVNode)(32,"pattern",null,[(0,o.createVNode)(32,"rect",null,null,1,{width:l+"%",height:u+"%",fill:i}),(0,o.createVNode)(32,"rect",null,null,1,{x:l+"%",y:u+"%",width:l+"%",height:u+"%",fill:i}),(0,o.createVNode)(32,"rect",null,null,1,{x:l+"%",width:l+"%",height:u+"%",fill:c}),(0,o.createVNode)(32,"rect",null,null,1,{y:u+"%",width:l+"%",height:u+"%",fill:c})],4,{id:"checkerboardpattern",x:"0",y:"0",width:2*l+"%",height:2*u+"%",patternUnits:"userSpaceOnUse"}),(0,o.createVNode)(32,"rect",null,null,1,{width:"100%",height:"100%",fill:"url(#checkerboardpattern)"})],4,{width:"100%",height:"100%"})};t["default"]=a},45208:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.CheckerBoard=void 0;var o=n(96323),r=n(31246),a=n(65844),i=u(n(34116)),c=u(n(9149)),l=u(n(84894));function u(e){return e&&e.__esModule?e:{"default":e}}var d=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.pieces,p=d.currentUser,m=d.styling.tileColor2,f=(0,a.useStates)(t),h=f.tileSize,g=f.isFlipped,C=f.mouseCoords,N=h.width,v=h.height,b=(0,a.useActions)(u).piecePlace,V=(0,o.createRef)(),y=function(){var e=C.x,t=C.y;if(!V)return[-1,-1];var n=V.current.getBoundingClientRect(),o=e-n.left,r=t-n.top,a=Math.floor(o/N),i=Math.floor(r/v);return g&&(a=d.boardInfo.width-a-1,i=d.boardInfo.height-i-1),[a,i]};return(0,o.createVNode)(1,"div","boardgame__board-checkerboard",[(0,o.createComponentVNode)(2,l["default"]),(0,o.createComponentVNode)(2,i["default"]),(0,o.createComponentVNode)(2,c["default"],{pieces:s})],4,{style:{"background-color":m},onMouseDown:function(e){if(0===e.button&&(p.palette||p.selected)){var t=y(),n=t[0],o=t[1];b(p.ckey,n,o)}},onMouseUp:function(e){if(0===e.button){var t=y(),n=t[0],o=t[1];if(p.palette)return void b(p.ckey,n,o);if(p.selected){var r=s[p.selected];r.x===n&&r.y===o||b(p.ckey,n,o)}}}},null,V)};t.CheckerBoard=d;var s=d;t["default"]=s},51891:function(){},25540:function(e,t,n){"use strict";t.__esModule=!0,t.BoardgameContents=void 0;var o=n(96323),r=n(66508),a=n(2381),i=n(29678),c=n(65844);t.BoardgameContents=function(e,t){var n=(0,c.useStates)(t).mouseCoordsSet;return(0,o.createComponentVNode)(2,a.Window.Content,{onMouseMove:function(e){n({x:e.clientX,y:e.clientY})},fitted:!0,className:"boardgame__window",children:[(0,o.createComponentVNode)(2,r.Board),(0,o.createComponentVNode)(2,i.Palettes)]})}},75022:function(e,t,n){"use strict";t.__esModule=!0,t.ButtonConfirm=void 0;var o=n(96323),r=n(26949),a=["icon","color","onConfirm","tooltipContent","confirmText"];function i(e,t){return i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},i(e,t)}var c=function(e){var t,n;function c(){for(var t,n=arguments.length,o=new Array(n),r=0;r<n;r++)o[r]=arguments[r];return(t=e.call.apply(e,[this].concat(o))||this).state={confirmState:!1},t.setConfirmState=function(e){t.setState({confirmState:e})},t}return n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,i(t,n),c.prototype.render=function(){var e=this,t=this.props,n=t.icon,i=t.color,c=t.onConfirm,l=t.tooltipContent,u=t.confirmText,d=void 0===u?"Confirm":u,s=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,a);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Button,Object.assign({icon:n,color:this.state.confirmState?"orange":i,tooltip:this.state.confirmState?d:l,onMouseOut:function(){return e.setConfirmState(!1)},onClick:function(){e.state.confirmState?(c(),e.setConfirmState(!1)):e.setConfirmState(!0)}},s)))},c}(o.Component);t.ButtonConfirm=c},68035:function(e,t,n){"use strict";t.__esModule=!0,t.HeldPieceRenderer=void 0;var o=n(96323),r=n(26949),a=n(31246),i=n(65844),c=n(86489);t.HeldPieceRenderer=function(e,t){var n=(0,a.useBackend)(t),l=(n.act,n.data);if(!l.currentUser)return null;var u=(0,i.useStates)(t).mouseCoords,d=u.x,s=u.y,p=l.currentUser.palette||l.currentUser.selected;if(!p)return null;var m=(0,c.fetchPieces)(),f=(0,c.codeRecordFromPieces)(m)[p];return f?(0,o.createComponentVNode)(2,r.Box,{className:"boardgame__heldpiece",style:{top:s+"px",left:d+"px",width:"120px",height:"120px"},children:[(0,o.createComponentVNode)(2,r.Box,{className:"boardgame__heldpiece-inner",children:(0,o.createVNode)(1,"img",null,null,1,{src:f.image})}),(0,o.createComponentVNode)(2,r.Box,{style:{"font-size":"12px","font-weight":"bold","text-shadow":"0 0 2px black"},children:"Right click to cancel"})]}):null}},41541:function(e,t,n){"use strict";t.__esModule=!0,t.VerticalNotations=t.HorizontalNotations=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(65844);t.HorizontalNotations=function(e,t){var n=(0,r.useBackend)(t).data,c=n.boardInfo.width,l=n.styling,u=l.border,d=l.tileColor1,s=l.tileColor2,p=(0,i.useStates)(t).isFlipped,m=u||s||"black",f=d||"white",h=(0,i.generateBoardNotationLetters)(c);return p&&(h=h.reverse()),(0,o.createComponentVNode)(2,a.Flex,{style:{"background-color":m,color:f},className:"boardgame__notations boardgame__notations-horizontal",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{className:"boardgame__notation-letter",children:e})},t)}))})};t.VerticalNotations=function(e,t){var n=(0,r.useBackend)(t).data,c=n.boardInfo.height,l=n.styling,u=l.border,d=l.tileColor1,s=l.tileColor2,p=(0,i.useStates)(t).isFlipped,m=u||s||"black",f=d||"white",h=Array.from(Array(c).keys());return p&&(h=h.reverse()),(0,o.createComponentVNode)(2,a.Flex,{style:{"background-color":m,color:f},className:"boardgame__notations boardgame__notations-vertical",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"boardgame__notations-number",grow:1,children:p?t+1:c-t},t)}))})}},75750:function(e,t,n){"use strict";t.__esModule=!0,t.Palettes=void 0;var o=n(96323),r=n(31246),a=n(86489),i=n(65844),c=n(26949);t.Palettes=function(e,t){var n=(0,r.useBackend)(t),d=(n.act,n.data,(0,i.useStates)(t).isExpanded);return(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__palettes",children:(0,a.fetchPalettes)().map((function(e,t){return(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__palettes-header",children:(0,o.createComponentVNode)(2,u,{index:t,setId:e.name})}),(0,o.createComponentVNode)(2,c.Flex,{className:"boardgame__palettes-set "+(d(t)?"":"boardgame__palettes-set-minimized"),children:e.pieces.map((function(e,t){return(0,o.createComponentVNode)(2,l,{piece:e},t)}))})]},e.name)}))})};var l=function(e,t){var n=e.piece,a=(0,r.useBackend)(t),l=a.act,u=a.data.currentUser,d=(0,i.useActions)(l).paletteSet;return(0,o.createComponentVNode)(2,c.Flex.Item,{className:"boardgame__palettes-set-piece",onMouseDown:function(){return d(u.ckey,n.code)},children:(0,o.createVNode)(1,"img",null,null,1,{src:n.image})},n.name)},u=function(e,t){var n=e.index,r=e.setId,a=(0,i.useStates)(t),l=a.isExpanded,u=a.togglePalette;return(0,o.createComponentVNode)(2,c.Button.Checkbox,{className:"boardgame__palettes-set-toggle",checked:l(n),onClick:function(){return u(n)},children:r})}},15237:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.TitleBar=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(75022),c=n(65844),l=function(e,t){var n=(0,r.useBackend)(t).act,l=(0,c.useStates)(t),u=l.isFlipped,d=l.toggleFlip,s=l.helpModalOpen,p=l.helpModalClose,m=l.isHelpModalOpen,f=(0,c.useActions)(n),h=f.boardClear,g=f.applyGNot;return(0,o.createComponentVNode)(2,a.Box,{className:"boardgame__titlebar",children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:m?"Close":"Help",color:m?"orange":"default",icon:m?"times":"question",onClick:function(){return m?p():s()}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:"Flip board",color:u?"orange":"default",icon:"repeat",onClick:d}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Clear board",icon:"trash",onConfirm:function(){h()}}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Load Chess Preset",icon:"chess",onConfirm:function(){g("r,n,b,q,k,b,n,r,p,p,p,p,p,p,p,p,32,P,P,P,P,P,P,P,P,R,N,B,Q,K,B,N,R")}}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Load Draughts Preset",icon:"ring",onConfirm:function(){g("1,d,1,d,1,d,1,d,d,1,d,1,d,1,d,2,d,1,d,1,d,1,d,16,D,1,D,1,D,1,D,2,D,1,D,1,D,1,D,D,1,D,1,D,1,D")}})]})};t.TitleBar=l;var u=l;t["default"]=u},29678:function(e,t,n){"use strict";t.__esModule=!0;var o=n(41541);t.HorizontalNotations=o.HorizontalNotations,t.VerticalNotations=o.VerticalNotations;var r=n(68035);t.HeldPieceRenderer=r.HeldPieceRenderer;var a=n(75750);t.Palettes=a.Palettes},95102:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.kit=void 0;var o,r=(o=n(86364))&&o.__esModule?o:{"default":o};var a={pieces:r["default"],palettes:[{name:"Chess",pieces:r["default"]}]};t.kit=a;var i=a;t["default"]=i},86364:function(e,t){"use strict";t.__esModule=!0,t["default"]=void 0;var n=[];n.push({code:"k",name:"King (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDpub25lOyBmaWxsLW9wYWNpdHk6MTsgZmlsbC1ydWxlOmV2ZW5vZGQ7IHN0cm9rZTojMDAwMDAwOyBzdHJva2Utd2lkdGg6MS41OyBzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyI+DQogICAgPHBhdGggZD0iTSAyMi41LDExLjYzIEwgMjIuNSw2IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIgaWQ9InBhdGg2NTcwIi8+DQogICAgPHBhdGggZD0iTSAyMi41LDI1IEMgMjIuNSwyNSAyNywxNy41IDI1LjUsMTQuNSBDIDI1LjUsMTQuNSAyNC41LDEyIDIyLjUsMTIgQyAyMC41LDEyIDE5LjUsMTQuNSAxOS41LDE0LjUgQyAxOCwxNy41IDIyLjUsMjUgMjIuNSwyNSIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlLWxpbmVjYXA6YnV0dDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMTIuNSwzNyBDIDE4LDQwLjUgMjcsNDAuNSAzMi41LDM3IEwgMzIuNSwzMCBDIDMyLjUsMzAgNDEuNSwyNS41IDM4LjUsMTkuNSBDIDM0LjUsMTMgMjUsMTYgMjIuNSwyMy41IEwgMjIuNSwyNyBMIDIyLjUsMjMuNSBDIDIwLDE2IDEwLjUsMTMgNi41LDE5LjUgQyAzLjUsMjUuNSAxMi41LDMwIDEyLjUsMzAgTCAxMi41LDM3IiBzdHlsZT0iZmlsbDojMDAwMDAwOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDIwLDggTCAyNSw4IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMzIsMjkuNSBDIDMyLDI5LjUgNDAuNSwyNS41IDM4LjAzLDE5Ljg1IEMgMzQuMTUsMTQgMjUsMTggMjIuNSwyNC41IEwgMjIuNSwyNi42IEwgMjIuNSwyNC41IEMgMjAsMTggMTAuODUsMTQgNi45NywxOS44NSBDIDQuNSwyNS41IDEzLDI5LjUgMTMsMjkuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAxMi41LDMwIEMgMTgsMjcgMjcsMjcgMzIuNSwzMCBNIDEyLjUsMzMuNSBDIDE4LDMwLjUgMjcsMzAuNSAzMi41LDMzLjUgTSAxMi41LDM3IEMgMTgsMzQgMjcsMzQgMzIuNSwzNyIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"K",name:"King (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNSI+DQogICAgPHBhdGggc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZD0iTTIyLjUgMTEuNjNWNk0yMCA4aDUiLz4NCiAgICA8cGF0aCBmaWxsPSIjZmZmIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZD0iTTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIvPg0KICAgIDxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDRWMjd2LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPg0KICAgIDxwYXRoIGQ9Ik0xMi41IDMwYzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMCIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"q",name:"Queen (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDojMDAwMDAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCI+DQoNCiAgICA8cGF0aCBkPSJNIDksMjYgQyAxNy41LDI0LjUgMzAsMjQuNSAzNiwyNiBMIDM4LjUsMTMuNSBMIDMxLDI1IEwgMzAuNywxMC45IEwgMjUuNSwyNC41IEwgMjIuNSwxMCBMIDE5LjUsMjQuNSBMIDE0LjMsMTAuOSBMIDE0LDI1IEwgNi41LDEzLjUgTCA5LDI2IHoiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpidXR0O2ZpbGw6IzAwMDAwMCIvPg0KICAgIDxwYXRoIGQ9Im0gOSwyNiBjIDAsMiAxLjUsMiAyLjUsNCAxLDEuNSAxLDEgMC41LDMuNSAtMS41LDEgLTEsMi41IC0xLDIuNSAtMS41LDEuNSAwLDIuNSAwLDIuNSA2LjUsMSAxNi41LDEgMjMsMCAwLDAgMS41LC0xIDAsLTIuNSAwLDAgMC41LC0xLjUgLTEsLTIuNSAtMC41LC0yLjUgLTAuNSwtMiAwLjUsLTMuNSAxLC0yIDIuNSwtMiAyLjUsLTQgLTguNSwtMS41IC0xOC41LC0xLjUgLTI3LDAgeiIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEuNSwzMCBDIDE1LDI5IDMwLDI5IDMzLjUsMzAiLz4NCiAgICA8cGF0aCBkPSJtIDEyLDMzLjUgYyA2LC0xIDE1LC0xIDIxLDAiLz4NCiAgICA8Y2lyY2xlIGN4PSI2IiBjeT0iMTIiIHI9IjIiLz4NCiAgICA8Y2lyY2xlIGN4PSIxNCIgY3k9IjkiIHI9IjIiLz4NCiAgICA8Y2lyY2xlIGN4PSIyMi41IiBjeT0iOCIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjMxIiBjeT0iOSIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjM5IiBjeT0iMTIiIHI9IjIiLz4NCiAgICA8cGF0aCBkPSJNIDExLDM4LjUgQSAzNSwzNSAxIDAgMCAzNCwzOC41IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0OyIvPg0KICAgIDxnIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojZmZmZmZmOyI+DQogICAgICA8cGF0aCBkPSJNIDExLDI5IEEgMzUsMzUgMSAwIDEgMzQsMjkiLz4NCiAgICAgIDxwYXRoIGQ9Ik0gMTIuNSwzMS41IEwgMzIuNSwzMS41Ii8+DQogICAgICA8cGF0aCBkPSJNIDExLjUsMzQuNSBBIDM1LDM1IDEgMCAwIDMzLjUsMzQuNSIvPg0KICAgICAgPHBhdGggZD0iTSAxMC41LDM3LjUgQSAzNSwzNSAxIDAgMCAzNC41LDM3LjUiLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"Q",name:"Queen (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIj4NCiAgICA8cGF0aCBkPSJNIDksMjYgQyAxNy41LDI0LjUgMzAsMjQuNSAzNiwyNiBMIDM4LjUsMTMuNSBMIDMxLDI1IEwgMzAuNywxMC45IEwgMjUuNSwyNC41IEwgMjIuNSwxMCBMIDE5LjUsMjQuNSBMIDE0LjMsMTAuOSBMIDE0LDI1IEwgNi41LDEzLjUgTCA5LDI2IHoiLz4NCiAgICA8cGF0aCBkPSJNIDksMjYgQyA5LDI4IDEwLjUsMjggMTEuNSwzMCBDIDEyLjUsMzEuNSAxMi41LDMxIDEyLDMzLjUgQyAxMC41LDM0LjUgMTEsMzYgMTEsMzYgQyA5LjUsMzcuNSAxMSwzOC41IDExLDM4LjUgQyAxNy41LDM5LjUgMjcuNSwzOS41IDM0LDM4LjUgQyAzNCwzOC41IDM1LjUsMzcuNSAzNCwzNiBDIDM0LDM2IDM0LjUsMzQuNSAzMywzMy41IEMgMzIuNSwzMSAzMi41LDMxLjUgMzMuNSwzMCBDIDM0LjUsMjggMzYsMjggMzYsMjYgQyAyNy41LDI0LjUgMTcuNSwyNC41IDksMjYgeiIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEuNSwzMCBDIDE1LDI5IDMwLDI5IDMzLjUsMzAiIHN0eWxlPSJmaWxsOm5vbmUiLz4NCiAgICA8cGF0aCBkPSJNIDEyLDMzLjUgQyAxOCwzMi41IDI3LDMyLjUgMzMsMzMuNSIgc3R5bGU9ImZpbGw6bm9uZSIvPg0KICAgIDxjaXJjbGUgY3g9IjYiIGN5PSIxMiIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjE0IiBjeT0iOSIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjIyLjUiIGN5PSI4IiByPSIyIi8+DQogICAgPGNpcmNsZSBjeD0iMzEiIGN5PSI5IiByPSIyIi8+DQogICAgPGNpcmNsZSBjeD0iMzkiIGN5PSIxMiIgcj0iMiIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"r",name:"Rook (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOiMwMDAwMDA7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gOSwzOSBMIDM2LDM5IEwgMzYsMzYgTCA5LDM2IEwgOSwzOSB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMi41LDMyIEwgMTQsMjkuNSBMIDMxLDI5LjUgTCAzMi41LDMyIEwgMTIuNSwzMiB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMiwzNiBMIDEyLDMyIEwgMzMsMzIgTCAzMywzNiBMIDEyLDM2IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDE0LDI5LjUgTCAxNCwxNi41IEwgMzEsMTYuNSBMIDMxLDI5LjUgTCAxNCwyOS41IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwxNi41IEwgMTEsMTQgTCAzNCwxNCBMIDMxLDE2LjUgTCAxNCwxNi41IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDExLDE0IEwgMTEsOSBMIDE1LDkgTCAxNSwxMSBMIDIwLDExIEwgMjAsOSBMIDI1LDkgTCAyNSwxMSBMIDMwLDExIEwgMzAsOSBMIDM0LDkgTCAzNCwxNCBMIDExLDE0IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDEyLDM1LjUgTCAzMywzNS41IEwgMzMsMzUuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxMywzMS41IEwgMzIsMzEuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwyOS41IEwgMzEsMjkuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwxNi41IEwgMzEsMTYuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxMSwxNCBMIDM0LDE0IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6I2ZmZmZmZjsgc3Ryb2tlLXdpZHRoOjE7IHN0cm9rZS1saW5lam9pbjptaXRlcjsiLz4NCiAgPC9nPg0KPC9zdmc+"}),n.push({code:"R",name:"Rook (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOiNmZmZmZmY7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gOSwzOSBMIDM2LDM5IEwgMzYsMzYgTCA5LDM2IEwgOSwzOSB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMiwzNiBMIDEyLDMyIEwgMzMsMzIgTCAzMywzNiBMIDEyLDM2IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDExLDE0IEwgMTEsOSBMIDE1LDkgTCAxNSwxMSBMIDIwLDExIEwgMjAsOSBMIDI1LDkgTCAyNSwxMSBMIDMwLDExIEwgMzAsOSBMIDM0LDkgTCAzNCwxNCIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAzNCwxNCBMIDMxLDE3IEwgMTQsMTcgTCAxMSwxNCIvPg0KICAgIDxwYXRoIGQ9Ik0gMzEsMTcgTCAzMSwyOS41IEwgMTQsMjkuNSBMIDE0LDE3IiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMzEsMjkuNSBMIDMyLjUsMzIgTCAxMi41LDMyIEwgMTQsMjkuNSIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEsMTQgTCAzNCwxNCIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lam9pbjptaXRlcjsiLz4NCiAgPC9nPg0KPC9zdmc+"}),n.push({code:"b",name:"Bishop (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtcnVsZTpldmVub2RkOyBmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kOyBzdHJva2UtbGluZWpvaW46cm91bmQ7IHN0cm9rZS1taXRlcmxpbWl0OjQ7IHN0cm9rZS1kYXNoYXJyYXk6bm9uZTsgc3Ryb2tlLW9wYWNpdHk6MTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMC42KSI+DQogICAgPGcgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lY2FwOmJ1dHQ7Ij4NCiAgICAgIDxwYXRoIGQ9Ik0gOSwzNiBDIDEyLjM5LDM1LjAzIDE5LjExLDM2LjQzIDIyLjUsMzQgQyAyNS44OSwzNi40MyAzMi42MSwzNS4wMyAzNiwzNiBDIDM2LDM2IDM3LjY1LDM2LjU0IDM5LDM4IEMgMzguMzIsMzguOTcgMzcuMzUsMzguOTkgMzYsMzguNSBDIDMyLjYxLDM3LjUzIDI1Ljg5LDM4Ljk2IDIyLjUsMzcuNSBDIDE5LjExLDM4Ljk2IDEyLjM5LDM3LjUzIDksMzguNSBDIDcuNjUsMzguOTkgNi42OCwzOC45NyA2LDM4IEMgNy4zNSwzNi41NCA5LDM2IDksMzYgeiIvPg0KICAgICAgPHBhdGggZD0iTSAxNSwzMiBDIDE3LjUsMzQuNSAyNy41LDM0LjUgMzAsMzIgQyAzMC41LDMwLjUgMzAsMzAgMzAsMzAgQyAzMCwyNy41IDI3LjUsMjYgMjcuNSwyNiBDIDMzLDI0LjUgMzMuNSwxNC41IDIyLjUsMTAuNSBDIDExLjUsMTQuNSAxMiwyNC41IDE3LjUsMjYgQyAxNy41LDI2IDE1LDI3LjUgMTUsMzAgQyAxNSwzMCAxNC41LDMwLjUgMTUsMzIgeiIvPg0KICAgICAgPHBhdGggZD0iTSAyNSA4IEEgMi41IDIuNSAwIDEgMSAgMjAsOCBBIDIuNSAyLjUgMCAxIDEgIDI1IDggeiIvPg0KICAgIDwvZz4NCiAgICA8cGF0aCBkPSJNIDE3LjUsMjYgTCAyNy41LDI2IE0gMTUsMzAgTCAzMCwzMCBNIDIyLjUsMTUuNSBMIDIyLjUsMjAuNSBNIDIwLDE4IEwgMjUsMTgiIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojZmZmZmZmOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"B",name:"Bishop (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtcnVsZTpldmVub2RkOyBmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kOyBzdHJva2UtbGluZWpvaW46cm91bmQ7IHN0cm9rZS1taXRlcmxpbWl0OjQ7IHN0cm9rZS1kYXNoYXJyYXk6bm9uZTsgc3Ryb2tlLW9wYWNpdHk6MTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMC42KSI+DQogICAgPGcgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lY2FwOmJ1dHQ7Ij4NCiAgICAgIDxwYXRoIGQ9Ik0gOSwzNiBDIDEyLjM5LDM1LjAzIDE5LjExLDM2LjQzIDIyLjUsMzQgQyAyNS44OSwzNi40MyAzMi42MSwzNS4wMyAzNiwzNiBDIDM2LDM2IDM3LjY1LDM2LjU0IDM5LDM4IEMgMzguMzIsMzguOTcgMzcuMzUsMzguOTkgMzYsMzguNSBDIDMyLjYxLDM3LjUzIDI1Ljg5LDM4Ljk2IDIyLjUsMzcuNSBDIDE5LjExLDM4Ljk2IDEyLjM5LDM3LjUzIDksMzguNSBDIDcuNjUsMzguOTkgNi42OCwzOC45NyA2LDM4IEMgNy4zNSwzNi41NCA5LDM2IDksMzYgeiIvPg0KICAgICAgPHBhdGggZD0iTSAxNSwzMiBDIDE3LjUsMzQuNSAyNy41LDM0LjUgMzAsMzIgQyAzMC41LDMwLjUgMzAsMzAgMzAsMzAgQyAzMCwyNy41IDI3LjUsMjYgMjcuNSwyNiBDIDMzLDI0LjUgMzMuNSwxNC41IDIyLjUsMTAuNSBDIDExLjUsMTQuNSAxMiwyNC41IDE3LjUsMjYgQyAxNy41LDI2IDE1LDI3LjUgMTUsMzAgQyAxNSwzMCAxNC41LDMwLjUgMTUsMzIgeiIvPg0KICAgICAgPHBhdGggZD0iTSAyNSA4IEEgMi41IDIuNSAwIDEgMSAgMjAsOCBBIDIuNSAyLjUgMCAxIDEgIDI1IDggeiIvPg0KICAgIDwvZz4NCiAgICA8cGF0aCBkPSJNIDE3LjUsMjYgTCAyNy41LDI2IE0gMTUsMzAgTCAzMCwzMCBNIDIyLjUsMTUuNSBMIDIyLjUsMjAuNSBNIDIwLDE4IEwgMjUsMTgiIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojMDAwMDAwOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"n",name:"Knight (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gMjIsMTAgQyAzMi41LDExIDM4LjUsMTggMzgsMzkgTCAxNSwzOSBDIDE1LDMwIDI1LDMyLjUgMjMsMTgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7IHN0cm9rZTojMDAwMDAwOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMjQsMTggQyAyNC4zOCwyMC45MSAxOC40NSwyNS4zNyAxNiwyNyBDIDEzLDI5IDEzLjE4LDMxLjM0IDExLDMxIEMgOS45NTgsMzAuMDYgMTIuNDEsMjcuOTYgMTEsMjggQyAxMCwyOCAxMS4xOSwyOS4yMyAxMCwzMCBDIDksMzAgNS45OTcsMzEgNiwyNiBDIDYsMjQgMTIsMTQgMTIsMTQgQyAxMiwxNCAxMy44OSwxMi4xIDE0LDEwLjUgQyAxMy4yNyw5LjUwNiAxMy41LDguNSAxMy41LDcuNSBDIDE0LjUsNi41IDE2LjUsMTAgMTYuNSwxMCBMIDE4LjUsMTAgQyAxOC41LDEwIDE5LjI4LDguMDA4IDIxLDcgQyAyMiw3IDIyLDEwIDIyLDEwIiBzdHlsZT0iZmlsbDojMDAwMDAwOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDkuNSAyNS41IEEgMC41IDAuNSAwIDEgMSA4LjUsMjUuNSBBIDAuNSAwLjUgMCAxIDEgOS41IDI1LjUgeiIgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAxNSAxNS41IEEgMC41IDEuNSAwIDEgMSAgMTQsMTUuNSBBIDAuNSAxLjUgMCAxIDEgIDE1IDE1LjUgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC44NjYsMC41LC0wLjUsMC44NjYsOS42OTMsLTUuMTczKSIgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAyNC41NSwxMC40IEwgMjQuMSwxMS44NSBMIDI0LjYsMTIgQyAyNy43NSwxMyAzMC4yNSwxNC40OSAzMi41LDE4Ljc1IEMgMzQuNzUsMjMuMDEgMzUuNzUsMjkuMDYgMzUuMjUsMzkgTCAzNS4yLDM5LjUgTCAzNy40NSwzOS41IEwgMzcuNSwzOSBDIDM4LDI4Ljk0IDM2LjYyLDIyLjE1IDM0LjI1LDE3LjY2IEMgMzEuODgsMTMuMTcgMjguNDYsMTEuMDIgMjUuMDYsMTAuNSBMIDI0LjU1LDEwLjQgeiAiIHN0eWxlPSJmaWxsOiNmZmZmZmY7IHN0cm9rZTpub25lOyIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"N",name:"Knight (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gMjIsMTAgQyAzMi41LDExIDM4LjUsMTggMzgsMzkgTCAxNSwzOSBDIDE1LDMwIDI1LDMyLjUgMjMsMTgiIHN0eWxlPSJmaWxsOiNmZmZmZmY7IHN0cm9rZTojMDAwMDAwOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMjQsMTggQyAyNC4zOCwyMC45MSAxOC40NSwyNS4zNyAxNiwyNyBDIDEzLDI5IDEzLjE4LDMxLjM0IDExLDMxIEMgOS45NTgsMzAuMDYgMTIuNDEsMjcuOTYgMTEsMjggQyAxMCwyOCAxMS4xOSwyOS4yMyAxMCwzMCBDIDksMzAgNS45OTcsMzEgNiwyNiBDIDYsMjQgMTIsMTQgMTIsMTQgQyAxMiwxNCAxMy44OSwxMi4xIDE0LDEwLjUgQyAxMy4yNyw5LjUwNiAxMy41LDguNSAxMy41LDcuNSBDIDE0LjUsNi41IDE2LjUsMTAgMTYuNSwxMCBMIDE4LjUsMTAgQyAxOC41LDEwIDE5LjI4LDguMDA4IDIxLDcgQyAyMiw3IDIyLDEwIDIyLDEwIiBzdHlsZT0iZmlsbDojZmZmZmZmOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDkuNSAyNS41IEEgMC41IDAuNSAwIDEgMSA4LjUsMjUuNSBBIDAuNSAwLjUgMCAxIDEgOS41IDI1LjUgeiIgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7Ii8+DQogICAgPHBhdGggZD0iTSAxNSAxNS41IEEgMC41IDEuNSAwIDEgMSAgMTQsMTUuNSBBIDAuNSAxLjUgMCAxIDEgIDE1IDE1LjUgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC44NjYsMC41LC0wLjUsMC44NjYsOS42OTMsLTUuMTczKSIgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"p",name:"Pawn (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8cGF0aCBkPSJtIDIyLjUsOSBjIC0yLjIxLDAgLTQsMS43OSAtNCw0IDAsMC44OSAwLjI5LDEuNzEgMC43OCwyLjM4IEMgMTcuMzMsMTYuNSAxNiwxOC41OSAxNiwyMSBjIDAsMi4wMyAwLjk0LDMuODQgMi40MSw1LjAzIEMgMTUuNDEsMjcuMDkgMTEsMzEuNTggMTEsMzkuNSBIIDM0IEMgMzQsMzEuNTggMjkuNTksMjcuMDkgMjYuNTksMjYuMDMgMjguMDYsMjQuODQgMjksMjMuMDMgMjksMjEgMjksMTguNTkgMjcuNjcsMTYuNSAyNS43MiwxNS4zOCAyNi4yMSwxNC43MSAyNi41LDEzLjg5IDI2LjUsMTMgYyAwLC0yLjIxIC0xLjc5LC00IC00LC00IHoiIHN0eWxlPSJvcGFjaXR5OjE7IGZpbGw6IzAwMDAwMDsgZmlsbC1vcGFjaXR5OjE7IGZpbGwtcnVsZTpub256ZXJvOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLXdpZHRoOjEuNTsgc3Ryb2tlLWxpbmVjYXA6cm91bmQ7IHN0cm9rZS1saW5lam9pbjptaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyIvPg0KPC9zdmc+"}),n.push({code:"P",name:"Pawn (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8cGF0aCBkPSJtIDIyLjUsOSBjIC0yLjIxLDAgLTQsMS43OSAtNCw0IDAsMC44OSAwLjI5LDEuNzEgMC43OCwyLjM4IEMgMTcuMzMsMTYuNSAxNiwxOC41OSAxNiwyMSBjIDAsMi4wMyAwLjk0LDMuODQgMi40MSw1LjAzIEMgMTUuNDEsMjcuMDkgMTEsMzEuNTggMTEsMzkuNSBIIDM0IEMgMzQsMzEuNTggMjkuNTksMjcuMDkgMjYuNTksMjYuMDMgMjguMDYsMjQuODQgMjksMjMuMDMgMjksMjEgMjksMTguNTkgMjcuNjcsMTYuNSAyNS43MiwxNS4zOCAyNi4yMSwxNC43MSAyNi41LDEzLjg5IDI2LjUsMTMgYyAwLC0yLjIxIC0xLjc5LC00IC00LC00IHoiIHN0eWxlPSJvcGFjaXR5OjE7IGZpbGw6I2ZmZmZmZjsgZmlsbC1vcGFjaXR5OjE7IGZpbGwtcnVsZTpub256ZXJvOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLXdpZHRoOjEuNTsgc3Ryb2tlLWxpbmVjYXA6cm91bmQ7IHN0cm9rZS1saW5lam9pbjptaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyIvPg0KPC9zdmc+"});var o=n;t["default"]=o},85867:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.kit=void 0;var o,r=(o=n(77896))&&o.__esModule?o:{"default":o};var a={pieces:r["default"],palettes:[{name:"Draughts",pieces:r["default"]}]};t.kit=a;var i=a;t["default"]=i},77896:function(e,t){"use strict";t.__esModule=!0,t["default"]=void 0;var n=[];n.push({code:"d",name:"Man (Black)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOS43OW1tIiBoZWlnaHQ9IjkuNzltbSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgOS43OSA5Ljc5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KIDxtZXRhZGF0YT4KICA8cmRmOlJERj4KICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICA8ZGM6dGl0bGUvPgogICA8L2NjOldvcms+CiAgPC9yZGY6UkRGPgogPC9tZXRhZGF0YT4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMCAtMzIuNzg2KSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo"}),n.push({code:"m",name:"King  (Black)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOS43OW1tIiBoZWlnaHQ9IjkuNzltbSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgOS43OSA5Ljc5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KIDxtZXRhZGF0YT4KICA8cmRmOlJERj4KICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICA8ZGM6dGl0bGUvPgogICA8L2NjOldvcms+CiAgPC9yZGY6UkRGPgogPC9tZXRhZGF0YT4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Mi40MDggLTMyLjc4NikiPgogIDxnIGZpbGw9IiNmZmYiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIyNS44OTUiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iMyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICA8L2c+CiAgPGc+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjM3LjY4MSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSIzIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuMzk3Ii8+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4xMTU3NiAwIDAgLjExNTc2IDQ0LjY5OCAzNS4wNDEpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjQuODk1IiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMjUuODk1IiByPSIzIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNzU2IDIzLjA2OCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgPHBhdGggZD0ibTIyLjUgMTEuNjN2LTUuNjNtLTIuNSAyaDUiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0yMi41IDI1czQuNS03LjUgMy0xMC41YzAgMC0xLTIuNS0zLTIuNXMtMyAyLjUtMyAyLjVjLTEuNSAzIDMgMTAuNSAzIDEwLjUiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMTIuNSAzN2M1LjUgMy41IDE0LjUgMy41IDIwIDB2LTdzOS00LjUgNi0xMC41Yy00LTYuNS0xMy41LTMuNS0xNiA0djMuNS0zLjVjLTIuNS03LjUtMTItMTAuNS0xNi00LTMgNiA2IDEwLjUgNiAxMC41djciLz4KICAgIDxwYXRoIGQ9Im0xMi41IDMwYzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMCIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K"}),n.push({code:"D",name:"Man (White)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuMTg3bW0iIGhlaWdodD0iMTAuMTg3bW0iIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEwLjE4NyAxMC4xODciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjgwMiAtMjAuODAyKSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo="}),n.push({code:"M",name:"King (White)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuMTg3bW0iIGhlaWdodD0iMTAuMTg3bW0iIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEwLjE4NyAxMC4xODciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjIwOSAtMjAuODAyKSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo="});var o=n;t["default"]=o},86489:function(e,t,n){"use strict";t.__esModule=!0,t.fetchPalettes=t.palettes=t.fetchPieces=t.codeRecordFromPieces=t.getPiecesByGame=t.getPiece=t.pushPieces=void 0;var o=n(8250),r=[];o.kits.forEach((function(e){r.push.apply(r,e.pieces)}));t.pushPieces=function(e){return r.push.apply(r,e)};t.getPiece=function(e,t){return r.find((function(n){return n.code===e&&n.game===t}))};t.getPiecesByGame=function(e){return r.filter((function(t){return t.game===e}))};t.codeRecordFromPieces=function(e){return e.reduce((function(e,t){return e[t.code]=t,e}),{})};t.fetchPieces=function(){return r};var a=[];t.palettes=a,o.kits.forEach((function(e){a.push.apply(a,e.palettes)}));t.fetchPalettes=function(){return a}},8250:function(e,t,n){"use strict";t.__esModule=!0,t.kits=void 0;var o=a(n(95102)),r=a(n(85867));function a(e){return e&&e.__esModule?e:{"default":e}}var i=[o["default"],r["default"]];t.kits=i},10522:function(e,t,n){"use strict";t.__esModule=!0,t.Boardgame=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(44135),c=n(26949),l=n(65844),u=n(15237),d=n(68035),s=n(25540);function p(e,t){return p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},p(e,t)}var m=function(e){var t,n;function c(t){return e.call(this,t)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,p(t,n);var l=c.prototype;return l.componentDidUpdate=function(){(0,i.handleEvents)(this.context),(0,i.adjustSizes)(this.context)},l.render=function(){var e,t=(0,a.useBackend)(this.context).data,n=(null==t||null==(e=t.boardInfo)?void 0:e.name)||"Boardgame";return(0,o.createComponentVNode)(2,r.Window,{title:n,width:580,height:512,children:[(0,o.createComponentVNode)(2,f),(0,o.createComponentVNode)(2,u.TitleBar),(0,o.createComponentVNode)(2,d.HeldPieceRenderer),(0,o.createComponentVNode)(2,s.BoardgameContents)]})},c}(o.Component);t.Boardgame=m;var f=function(e,t){var n=(0,l.useStates)(t),r=n.helpModalClose;return n.isHelpModalOpen?(0,o.createComponentVNode)(2,c.Dimmer,{className:"boardgame__helpmodal",onClick:r,children:(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createVNode)(1,"p",null,(0,o.createVNode)(1,"strong",null,"Help",16),2),(0,o.createVNode)(1,"p",null,[(0,o.createComponentVNode)(2,c.Icon,{name:"mouse"}),(0,o.createTextVNode)(" Click on a piece to select it, click on a tile to move it there.")],4),(0,o.createVNode)(1,"p",null,"Pieces may also be click-dragged to a target tile.",16),(0,o.createVNode)(1,"p",null,"Moving a piece onto a tile occupied by another piece will replace/capture the piece already on that tile.",16),(0,o.createVNode)(1,"p",null,"Right click a piece to delete it.",16)]})}):null}},65844:function(e,t,n){"use strict";t.__esModule=!0,t.generateBoardNotationLetters=t.numToBoardNotation=t.PalleteExpandType=t.SizeType=t.XYType=t.TileSizeType=t.UserDataType=t.PieceDataType=t.BoardgameData=t.StylingType=t.BoardInfoType=t.useStates=t.useActions=void 0;var o=n(51887);t.useActions=o.useActions;var r=n(31463);t.useStates=r.useStates;var a=n(76434);t.BoardInfoType=a.BoardInfoType,t.StylingType=a.StylingType,t.BoardgameData=a.BoardgameData,t.PieceDataType=a.PieceDataType,t.UserDataType=a.UserDataType,t.TileSizeType=a.TileSizeType,t.XYType=a.XYType,t.SizeType=a.SizeType,t.PalleteExpandType=a.PalleteExpandType;var i=n(43785);t.numToBoardNotation=i.numToBoardNotation,t.generateBoardNotationLetters=i.generateBoardNotationLetters},43785:function(e,t){"use strict";t.__esModule=!0,t.generateBoardNotationLetters=t.numToBoardNotation=void 0;var n=function(e){for(var t="",n=e;n>=0;){var o=n%26;t=String.fromCharCode(65+o)+t,n=Math.floor(n/26)-1}return t};t.numToBoardNotation=n;t.generateBoardNotationLetters=function(e,t){for(var o=[],r=0;r<e;r++)t?o.push(n(e-r)):o.push(n(r));return o}},76434:function(){},51887:function(e,t){"use strict";t.__esModule=!0,t.useActions=void 0;t.useActions=function(e){return{pieceCreate:function(t,n,o){e("pieceCreate",{code:t,x:n,y:o})},pieceRemove:function(t){e("pieceRemove",{piece:t})},pieceRemoveHeld:function(t){e("pieceRemoveHeld",{ckey:t})},pieceSelect:function(t,n){e("pieceSelect",{ckey:t,piece:n})},pieceDeselect:function(t){e("pieceDeselect",{ckey:t})},piecePlace:function(t,n,o){e("piecePlace",{ckey:t,x:n,y:o})},applyGNot:function(t){e("applyGNot",{gnot:t})},paletteSet:function(t,n){e("paletteSet",{ckey:t,code:n})},paletteClear:function(t){e("paletteClear",{ckey:t})},boardClear:function(){e("applyGNot",{gnot:""})}}}},31463:function(e,t,n){"use strict";t.__esModule=!0,t.useStates=t.STATES=t.DEFAULT_STATES=void 0;var o=n(31246),r={FLIP:!1,ZOOM:1,MOUSE_COORDS:{x:0,y:0}};t.DEFAULT_STATES=r;var a=function(e){return{flip:(0,o.useLocalState)(e,"flip",r.FLIP),zoom:(0,o.useLocalState)(e,"zoom",r.ZOOM),mouseCoords:(0,o.useLocalState)(e,"mouseCoords",r.MOUSE_COORDS),palettesExpanded:(0,o.useLocalState)(e,"palettesExpanded",{}),paletteLastElement:(0,o.useLocalState)(e,"paletteLastElement",null),tileSize:(0,o.useLocalState)(e,"tileSize",{width:0,height:0}),helpModalOpen:(0,o.useLocalState)(e,"helpModalOpen",!1)}};t.STATES=a;t.useStates=function(e){var t=a(e);return{paletteLastElementSet:function(e){(0,t.paletteLastElement[1])(e)},paletteLastElement:t.paletteLastElement[0],mouseCoordsSet:function(e){(0,t.mouseCoords[1])({x:e.x,y:e.y})},mouseCoords:t.mouseCoords[0],toggleFlip:function(){var e=t.flip,n=e[0];(0,e[1])(!n)},isFlipped:t.flip[0],helpModalClose:function(){(0,t.helpModalOpen[1])(!1)},helpModalOpen:function(){(0,t.helpModalOpen[1])(!0)},isHelpModalOpen:t.helpModalOpen[0],expandPalette:function(e){var n;(0,t.palettesExpanded[1])(Object.assign({},t.palettesExpanded[0],((n={})[e]=!0,n)))},togglePalette:function(e){var n;(0,t.palettesExpanded[1])(Object.assign({},t.palettesExpanded[0],((n={})[e]=!t.palettesExpanded[0][e],n)))},isExpanded:function(e){return!!t.palettesExpanded[0][e]},setTileSizeType:function(e){(0,t.tileSize[1])(e)},tileSize:t.tileSize[0]}}},44135:function(e,t,n){"use strict";t.__esModule=!0,t.handleEvents=t.adjustSizes=void 0;var o=n(31246),r=n(65844);t.adjustSizes=function(e){a(e),i(e)};var a=function(e){var t=(0,o.useBackend)(e).data,n=(0,r.useStates)(e),a=n.setTileSizeType,i=n.tileSize,c=document.getElementsByClassName("boardgame__board-inner")[0],l=0,u=0;if(c){var d=c.getBoundingClientRect(),s=d.width-40,p=d.height-40;l=s/t.boardInfo.width,u=p/t.boardInfo.height}l===i.width&&u===i.height||a({width:l,height:u})},i=function(e){var t=(0,o.useBackend)(e).data.styling.aspectRatio,n=500,r=400,a=document.getElementsByClassName("boardgame__window")[0];if(a){var i=a.getBoundingClientRect(),c=i.width,l=i.height;if(c===n&&l===r)return;var u=c<l?c:l;n=u+100,r=u+32.25,t&&(n=u*t+100,r=u+32.25)}Byond.winset(window.__windowId__,{size:n+"x"+r})};t.handleEvents=function(e){var t=(0,o.useBackend)(e),n=t.act,a=t.data,i=(0,r.useActions)(n),c=i.paletteClear,l=i.pieceDeselect;document.body.oncontextmenu=function(e){var t,n;(e.preventDefault(),2===e.button)&&(null!=(t=a.currentUser)&&t.palette&&c(a.currentUser.ckey),null!=(n=a.currentUser)&&n.selected&&l(a.currentUser.ckey));return!1},document.body.onmouseleave=function(){var e;null!=(e=a.currentUser)&&e.palette&&c(a.currentUser.ckey)}}},15094:function(e,t,n){"use strict";t.__esModule=!0,t.BugReportForm=t.InputTitle=t.Textarea=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381),l=function(e,t){return(0,o.createVNode)(128,"textarea",null,e.defaultText,0,{rows:4,style:{"overflow-y":"hidden",width:"100%","background-color":"black",border:"solid 1px #6992c2",color:"white"},onInput:function(e){e.target.style.height="auto",e.target.style.height=e.target.scrollHeight+"px"},id:e.id,placeholder:e.placeholder})};t.Textarea=l;var u=function(e,t){return(0,o.createVNode)(1,"h2",null,[e.children,e.required&&(0,o.createVNode)(1,"span",null," *",0,{style:{color:"red"}})],0)};t.InputTitle=u;t.BugReportForm=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=(n.data,(0,r.useLocalState)(t,"is_secret",!1)),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"tag","MINOR"),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Bug Report Form",width:600,height:700,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{style:{"text-align":"center"},children:(0,o.createVNode)(1,"a",null,"If you have a GitHub account click here instead",16,{href:"https://github.com/goonstation/goonstation/issues/new?assignees=&labels=&template=bug_report.yml",target:"_blank",rel:"noreferrer",style:{color:"#6992c2"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Title"}),(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"title"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Tags",0),[["Trivial","TRIVIAL","A bug that is extremely trivial, such as a spelling issue."],["Minor","MINOR","A bug that does not impact usage of a feature. These are often visual issues."],["Major","MAJOR","A bug that significantly impacts the usage of a feature."],["Critical","CRITICAL","A bug that significantly impacts the progression of the round."]].map((function(e){return(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:e[1]===h,onClick:function(){return g(e[1])},tooltip:e[2],tooltipPosition:"bottom",children:e[0]},e[1])}))]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Description"}),"Give a short description of the bug",(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"description"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Steps To Reproduce"}),"Give a list of steps to reproduce this issue",(0,o.createComponentVNode)(2,l,{id:"steps",placeholder:"1.\n2.\n3."})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Expected Behavior"}),"Give a short description of what you expected to happen",(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"expected_behavior"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Additional Information & Screenshots",0),"Add screenshots and any other information here",(0,o.createComponentVNode)(2,l,{id:"additional"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Is this bug an exploit or related to secret content?",0),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:p,onClick:function(){m(!p)},children:"Exploit / Secret"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:(0,o.createComponentVNode)(2,a.Flex,{style:{"justify-content":"center"},children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mx:1,children:(0,o.createVNode)(1,"div","Button Button--color--default","Submit",0,{onClick:function(){var e={};e.secret=p,e.tags=[h],e.steps=document.getElementById("steps").value,e.additional=document.getElementById("additional").value,e.title=document.getElementById("title").getElementsByTagName("input")[0].value,e.description=document.getElementById("description").getElementsByTagName("input")[0].value,e.expected_behavior=document.getElementById("expected_behavior").getElementsByTagName("input")[0].value,e.title&&e.description&&e.expected_behavior&&e.steps?d("confirm",e):alert("Please fill out all required fields!")}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{mx:1,children:(0,o.createVNode)(1,"div","Button Button--color--default","Cancel",0,{onClick:function(){return d("cancel")}})})]})})]})})})})}},65101:function(e,t,n){"use strict";t.__esModule=!0,t.CAViewer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.CAViewer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.CAType,d=l.CAData,s=(l.viewWidth,l.typeData),p=l.settings;return(0,o.createComponentVNode)(2,i.Window,{title:"Cellular Automata Viewer",width:900,height:800,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:u}),buttons:(0,o.createComponentVNode)(2,a.Dropdown,{displayText:"CA Type",width:20,options:Object.keys(s),onSelected:function(e){return c("set_ca",{name:"default",priority:10,type:e})}}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{ml:2}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Description",children:"Description Goes here?"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:4}),u&&s[u].options&&Object.keys(s[u].options).length?Object.keys(s[u].options).map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:s[u].options[e],children:(0,o.createComponentVNode)(2,a.NumberInput,{value:p[s[u].options[e]],minValue:0,maxValue:500,stepPixelSize:5,width:"39px",onDrag:function(t,n){return c("settings",{name:s[u].options[e],data:n})}})},t)})):""]}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return c("generate")},children:"Generate"})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{preserveWhitespace:!0,fontFamily:"Consolas",children:d.replace(/0/g,"-").replace(/(.{100})/g,"$1\n")})})]})})})}},57399:function(e,t,n){"use strict";t.__esModule=!0,t.Cashreg=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381);t.Cashreg=function(e,t){var n=(0,a.useBackend)(t),r=n.act,u=n.data,d=u.active_transaction,s=u.amount,p=u.is_authorised,m=u.is_owner,f=u.name,h=u.owner,g=u.tip_proportion;return(0,o.createComponentVNode)(2,c.Window,{title:f,theme:"ntos",height:240,width:300,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{className:"cashreg__ownerbutton",color:"blue",disabled:d,onClick:h?(p||m)&&function(){return r("reset")}:function(){return r("swipe_owner")},tooltip:h&&(p||m)&&"Click to remove ownership",width:"100%",children:h?"Owner: "+h:"Swipe ID to own"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:m?(0,o.createComponentVNode)(2,i.Tooltip,{content:s?"Click to clear transaction":"Click to set price",children:(0,o.createComponentVNode)(2,l)}):(0,o.createComponentVNode)(2,l)}),h&&(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{align:"center",className:"cashreg__tip",color:"blue",disabled:!s||d,onClick:function(){return r("set_tip")},width:"100%",children:"Tip: "+100*g+"%"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{align:"center",className:"cashreg__pay",color:"blue",disabled:!s||d,onClick:function(){return r("swipe_payer")},width:"100%",children:"Swipe ID to pay"})})]})})]})})})};var l=function(e,t){var n=(0,a.useBackend)(t),c=n.act,l=n.data,u=l.amount,d=l.is_owner,s=l.owner,p=l.tip_amount,m=l.tip_proportion,f=l.total;return(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,align:"center",justify:"space-around",className:(0,r.classes)(["cashreg__centerpart",s&&d&&"cashreg__amount"]),onClick:s&&d&&(u?function(){return c("clear_transaction")}:function(){return c("set_amount")}),children:s?u?(0,o.createVNode)(1,"table","cashreg__table",(0,o.createVNode)(1,"tbody",null,[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Amount",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",u+"\u2abd",0)],4),!!m&&(0,o.createFragment)([(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Tip (%)",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",100*m+"%",0)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Tip (\u2abd)",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",p+"\u2abd",0)],4)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Total",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",f+"\u2abd",0)],4)],0),2):(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:d?"Enter amount":"Owner must enter amount"}):(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:"Please register owner"})})}},48341:function(e,t,n){"use strict";t.__esModule=!0,t.CentComViewer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var u=function(e,t){for(var n,o=36e5,r=864e5,a=[{interval:1e3,label:"second"},{interval:6e4,label:"minute"},{interval:o,label:"hour"},{interval:r,label:"day"},{interval:2592e6,label:"month"},{interval:31536e6,label:"year"}],i=new Date(t)-new Date(e),l=c(a.reverse());!(n=l()).done;){var u=n.value,d=u.interval,s=u.label;if(i>=d){var p=Number((i/d).toFixed(2));return p+" "+s+(1===p?"":"s")}}return"Permanent"},d=function(e){var t=e.ban,n=t.bannedOn,r=t.expires,i=t.jobs,c=t.reason,l=t.sourceName,d=t.type,s=t.unbannedBy,p=new Date(r)<new Date,m="";return t.active&&!p?m="Banned":!s&&p?m="Expired":s&&(m="Unbanned"),(0,o.createComponentVNode)(2,a.Section,{title:d+" Ban | "+l,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Banned",children:new Date(n).toLocaleString("en-US",{year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Length",children:u(n,r)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reason",children:c}),i&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Jobs",children:i.join(", ")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",color:"Banned"===m?"bad":"Expired"===m?"average":"good",children:m})]})})},s=function(e){var t=e.banData,n=e.filterInactive?t.filter((function(e){return e.active})):t;return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:n.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,d,{ban:e})},t)}))})},p=function(e,t){var n=(0,r.useBackend)(t).data,a=n.banData,i=n.filterInactive;return(0,o.createComponentVNode)(2,s,{banData:a,filterInactive:i})};t.CentComViewer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.key,d=l.filterInactive;return(0,o.createComponentVNode)(2,i.Window,{title:"CentCom Viewer",width:"650",height:"500",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createFragment)(["Ban Data for ",(0,o.createComponentVNode)(2,a.Input,{width:"50vw",value:u,onChange:function(e,t){return c("updateKey",{value:t})}})],0),buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:d,onClick:function(){return c("toggle-filterInactive")},children:"Filter Inactive"})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:(0,o.createComponentVNode)(2,p)})})})]})})})}},96074:function(e,t,n){"use strict";t.__esModule=!0,t.CharacterTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=function(e,t){var n=e.id,i=e.color,c=e.style,l=(0,r.useBackend)(t),u=l.act;l.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.ColorButton,{color:i,onClick:function(){return u("update-detail-color",{id:n})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-left",onClick:function(){return u("update-detail-style-cycle",{id:n,direction:-1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return u("update-detail-style-cycle",{id:n,direction:1})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("update-detail-style",{id:n})},children:c})],4)},c=function(e,t){var n=e.slot_id,i=(0,r.useBackend)(t),c=i.act,l=i.data;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("pick_part",{slot_id:n})},tooltip:l.partsData[n].name,children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,width:"64px",height:"64px",src:"data:image/png;base64,"+l.partsData[n].img,backgroundColor:"transparent"})})};t.CharacterTab=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Appearance",buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.randomAppearance,onClick:function(){return l("update-randomAppearance")},children:"Random appearance"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Skin Tone",children:[(0,o.createComponentVNode)(2,a.ColorButton,{color:u.skinTone,onClick:function(){return l("update-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"angle-double-left",onClick:function(){return l("decrease-skinTone",{alot:1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-left",onClick:function(){return l("decrease-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return l("increase-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"angle-double-right",onClick:function(){return l("increase-skinTone",{alot:1})}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Eye Color",children:(0,o.createComponentVNode)(2,a.ColorButton,{color:u.eyeColor,onClick:function(){return l("update-eyeColor")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Top Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom3",color:u.customColor3,style:u.customStyle3})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Middle Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom2",color:u.customColor2,style:u.customStyle2})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bottom Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom1",color:u.customColor1,style:u.customStyle1})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Special Style",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-specialStyle")},children:u.specialStyle||"default"})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Underwear",children:(0,o.createComponentVNode)(2,i,{id:"underwear",color:u.underwearColor,style:u.underwearStyle})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bionics",children:[(0,o.createComponentVNode)(2,c,{slot_id:"r_arm"}),(0,o.createComponentVNode)(2,c,{slot_id:"l_arm"}),(0,o.createComponentVNode)(2,a.Box,{children:["Trait points:"," ",(0,o.createComponentVNode)(2,a.Box,{as:"span",color:u.traitsPointsTotal>0?"good":"bad",children:u.traitsPointsTotal})]})]}),(0,o.createComponentVNode)(2,a.LabeledList.Divider)]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Sounds",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Fart",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-fartsound")},children:u.fartsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{fartsound:1})},children:"Preview"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scream",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-screamsound")},children:u.screamsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{screamsound:1})},children:"Preview"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Chat",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-chatsound")},children:u.chatsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{chatsound:1})},children:"Preview"})]})]})})],4)}},56374:function(e,t,n){"use strict";t.__esModule=!0,t.GameSettingsTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(59576);t.GameSettingsTab=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Popup Font Size",buttons:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-fontSize",{reset:1})},children:"Reset"}),children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Changes the font size used in popup windows. Only works when CHUI is disabled."}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-fontSize")},children:l.fontSize?l.fontSize+"%":"Default"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Messages",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Toggles if certain messages are shown in the chat window by default. You can change these mid-round by using the Toggle OOC/LOOC commands under the Commands tab in the top right."}),l.isMentor?(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.seeMentorPms,onClick:function(){return c("update-seeMentorPms")},children:"Display Mentorhelp"})}):null,(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.listenOoc,onClick:function(){return c("update-listenOoc")},tooltip:"Out-of-Character chat. This mostly just shows up on the RP server and at the end of rounds.",children:"Display OOC chat"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.listenLooc,onClick:function(){return c("update-listenLooc")},tooltip:"Local Out-of-Character is OOC chat, but only appears for nearby players. This is basically only used on the RP server.",children:"Display LOOC chat"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!l.flyingChatHidden,onClick:function(){return c("update-flyingChatHidden")},tooltip:"Chat messages will appear over characters as they're talking.",children:"See chat above people's heads"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.autoCapitalization,onClick:function(){return c("update-autoCapitalization")},tooltip:"Chat messages you send will be automatically capitalized.",children:"Auto-capitalize your messages"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.localDeadchat,onClick:function(){return c("update-localDeadchat")},tooltip:"You'll only hear chat messages from living people on your screen as a ghost.",children:"Local ghost hearing"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"HUD Theme",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-hudTheme")},children:"Change"})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+l.hudThemePreview,width:"32px",height:"32px"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Targeting Cursor",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-targetingCursor")},children:"Change"})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+l.targetingCursorPreview,width:"32px",height:"32px"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Tooltips",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Tooltips can appear when hovering over items. These tooltips can provide bits of information about the item, such as attack strength, special moves, etc."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Always,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Always})},children:"Show Always"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Alt,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Alt})},children:"Show When ALT is held"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Never,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Never})},children:"Never Show"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"tgui",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"TGUI is the UI framework we use for some game windows, and it comes with options!"}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tguiFancy,onClick:function(){return c("update-tguiFancy")},children:"Makes TGUI windows look better, at the cost of compatibility."})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tguiLock,onClick:function(){return c("update-tguiLock")},children:"Locks TGUI windows to your main monitor."})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Popups",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"These options toggle the popups that appear when logging in and at the end of a round."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewChangelog,onClick:function(){return c("update-viewChangelog")},tooltip:"The changelog can be shown at any time by using the 'Changelog' command, under the Commands tab in the top right.",tooltipPosition:"top",children:"Auto-open changelog"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewScore,onClick:function(){return c("update-viewScore")},tooltip:"The end-of-round scoring shows various stats on how the round went. If this option is off, you won't be able to see it.",tooltipPosition:"top",children:"Auto-open end-of-round score"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewTickets,onClick:function(){return c("update-viewTickets")},tooltip:"The end-of-round ticketing summary shows the various tickets and fines that were handed out. If this option is off, you can still see them on Goonhub (goonhub.com).",tooltipPosition:"top",children:"Auto-open end-of-round ticket summary"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Controls",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Various options for how you control your character and the game."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useClickBuffer,onClick:function(){return c("update-useClickBuffer")},tooltip:"There is a cooldown after clicking on things in-game. When enabled, if you click something during this cooldown, the game will apply that click after the cooldown. Otherwise, the click is ignored.",tooltipPosition:"top",children:"Queue Combat Clicks"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useWasd,onClick:function(){return c("update-useWasd")},tooltip:"Enabling this allows you to use WASD to move instead of the arrow keys, and enables a few other hotkeys.",tooltipPosition:"top",children:"Use WASD Mode"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useAzerty,onClick:function(){return c("update-useAzerty")},tooltip:"If you have an AZERTY keyboard, enable this. Yep. This sure is a tooltip.",tooltipPosition:"top",children:"Use AZERTY Keyboard Layout"})}),(0,o.createComponentVNode)(2,a.Box,{color:"label",children:"Familiar with /tg/station controls? You can enable/disable them under the Game/Interface menu in the top left."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scroll Targeting",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"This option allows you to change which limb to target with the scroll wheel."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Always,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Always})},children:"Always"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Hover,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Hover})},children:"When hovering over targeting doll"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Never,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Never})},children:"Never"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Preferred Map",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-preferredMap")},children:l.preferredMap?l.preferredMap:(0,o.createComponentVNode)(2,a.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Examine help",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.helpTextInExamine,onClick:function(){return c("update-helpTextInExamine")},tooltip:"If help messages in examine text annoy you, you can turn them off here. They will still be available by alt+doubleclicking the item or in the right click menu.",tooltipPosition:"top",children:"See help messages when you examine?"})})]})})}},57368:function(e,t,n){"use strict";t.__esModule=!0,t.GeneralTab=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949);t.GeneralTab=function(e,t){var n,c=(0,a.useBackend)(t),l=c.act,u=c.data,d=function(e){return e.length>200?e.substring(0,200)+"\u2026":e};return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Records",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:u.randomName,onClick:function(){return l("update-randomName")},children:"Random"}),children:[(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameFirst")},children:u.nameFirst}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameMiddle")},color:""===u.nameMiddle?"grey":"default",children:""!==u.nameMiddle?u.nameMiddle:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameLast")},children:u.nameLast})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Gender",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-gender")},children:u.gender})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pronouns",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pronouns")},children:u.pronouns})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Age",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-age")},children:u.age})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Type",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-bloodType")},children:u.bloodRandom?(0,o.createComponentVNode)(2,i.Box,{as:"span",italic:!0,children:"Random"}):u.bloodType})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Bank PIN",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:!u.pin,onClick:function(){return l("update-pin",{random:!!u.pin})},children:"Random"}),children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pin")},children:null!=(n=u.pin)?n:(0,o.createComponentVNode)(2,i.Box,{as:"span",italic:!0,children:"Random"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Flavor Text",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-flavorText")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.flavorText?(0,r.decodeHtmlEntities)(u.flavorText):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Security Note",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-securityNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.securityNote?(0,r.decodeHtmlEntities)(u.securityNote):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Medical Note",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-medicalNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.medicalNote?(0,r.decodeHtmlEntities)(u.medicalNote):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Syndicate Intelligence",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-syndintNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.syndintNote?d((0,r.decodeHtmlEntities)(u.syndintNote)):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Other names",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Preferred Cyborg Name",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-robotName")},color:u.robotName?"default":"grey",children:u.robotName?u.robotName:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"PDA",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Ringtone",children:[(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pdaRingtone")},children:u.pdaRingtone}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("previewSound",{pdaRingtone:1})},icon:"volume-up",children:"Preview"})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Background Color",children:(0,o.createComponentVNode)(2,i.ColorButton,{color:u.pdaColor,onClick:function(){return l("update-pdaColor")}})})]})})],4)}},70712:function(e,t,n){"use strict";t.__esModule=!0,t.SavesTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.SavesTab=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Section,{title:"Cloud Saves",children:l.cloudSaves?(0,o.createFragment)([l.cloudSaves.map((function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i,{name:e,index:t}),(0,o.createComponentVNode)(2,a.Divider)],4,e)})),(0,o.createComponentVNode)(2,a.Box,{mt:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-new")},children:"Create new save"})})],0):(0,o.createComponentVNode)(2,a.Box,{italic:!0,color:"label",children:"Cloud saves could not be loaded."})})};var i=function(e,t){var n=e.name,i=e.index,c=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cloud save "+(i+1),buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-load",{name:n})},children:"Load"}),(0,o.createTextVNode)(" -"),(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-save",{name:n})},children:"Save"}),(0,o.createTextVNode)(" -"),(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Button.Confirm,{onClick:function(){return c("cloud-delete",{name:n})},content:"Delete"})],0),children:n})})}},30709:function(e,t,n){"use strict";t.__esModule=!0,t.TraitsTab=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(25808);function l(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var d=function(e,t){return e.name.localeCompare(t.name,"en",{sensitivity:"base"})};t.TraitsTab=function(e,t){for(var n,r=(0,a.useBackend)(t),u=r.act,p=r.data,m=(0,a.useLocalState)(t,"filter-available",!1),f=m[0],h=m[1],g={},C=p.traitsAvailable.map((function(e){return Object.assign({},e,p.traitsData[e.id])})),N=l(C);!(n=N()).done;)for(var v,b=n.value,V=l(b.category&&b.category.length>0?b.category:["uncategorized"]);!(v=V()).done;){var y=v.value;g[y]||(g[y]=[]),g[y].push(b)}var x=Object.keys(g).sort();x.includes("uncategorized")&&(x=[].concat(x.filter((function(e){return"uncategorized"!==e})),["uncategorized"]));var I=p.traitsAvailable.filter((function(e){return e.selected})).length;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{children:["Available points:"," ",(0,o.createComponentVNode)(2,i.Box,{as:"span",color:p.traitsPointsTotal>0?"good":"bad",children:p.traitsPointsTotal})]}),(0,o.createComponentVNode)(2,i.Divider)]}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Available",fill:!0,scrollable:!0,buttons:(0,o.createComponentVNode)(2,c.ButtonCheckbox,{checked:f,onClick:function(){return h(!f)},children:"Filter available"}),children:x.map((function(e){var t=g[e];return(0,o.createComponentVNode)(2,s,{category:e,traits:t.filter((function(e){return!e.selected})).filter((function(e){return!f||e.available})).sort(d)},e)}))})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Selected ("+I+"/"+p.traitsMax+")",fill:!0,scrollable:!0,buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return u("reset-traits")},children:"Reset traits"}),children:x.map((function(e){var t=g[e];return(0,o.createComponentVNode)(2,s,{category:e,traits:t.filter((function(e){return e.selected})).sort(d)},e)}))})})]})})]})})};var s=function(e,t){var n=e.category,a=e.traits;return 0===a.length?null:(0,o.createComponentVNode)(2,i.Collapsible,{title:(0,r.toTitleCase)(n),open:!0,children:a.map((function(e,t){return(0,o.createFragment)([0!==t&&(0,o.createComponentVNode)(2,i.Divider),(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e)))],0,e.id)}))})},p=function(e,t){var n=(0,a.useBackend)(t).act,r=e.id,c=e.name,l=e.desc,u=e.points,d=e.selected,s=e.available,p=e.img;return(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Image,{pixelated:!0,width:"32px",height:"32px",src:"data:image/png;base64,"+p,backgroundColor:"transparent"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:[(0,o.createComponentVNode)(2,i.Stack,{align:"center",mb:1,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:[c," ",(0,o.createComponentVNode)(2,i.Box,{as:"span",color:u<0?"bad":u>0?"good":"label",children:["(",u>0?"+":"",u,")"]})]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{disabled:!s,icon:d?"minus":"plus",onClick:function(){return n(d?"unselect-trait":"select-trait",{id:r})},children:d?"Remove":"Add"})})]}),(0,o.createComponentVNode)(2,i.BlockQuote,{children:l})]})]})}},4098:function(e,t,n){"use strict";t.__esModule=!0,t.CharacterPreferences=void 0;var o=n(96323),r=n(57890),a=n(31246),i=n(26949),c=n(2381),l=n(96074),u=n(56374),d=n(57368),s=n(70712),p=n(30709),m=n(59576),f=0;t.CharacterPreferences=function(e,t){var n=(0,a.useBackend)(t),g=n.act,C=n.data,N=(0,a.useLocalState)(t,"menu",m.CharacterPreferencesTabKeys.General),v=N[0],b=N[1];return(0,o.createComponentVNode)(2,c.Window,{width:600,height:750,title:"Character Setup",children:(0,o.createComponentVNode)(2,c.Window.Content,{onKeyDown:function(e){if(!(v!==m.CharacterPreferencesTabKeys.General&&v!==m.CharacterPreferencesTabKeys.Character||e.keyCode!==r.KEY_LEFT&&e.keyCode!==r.KEY_RIGHT)){if(e.preventDefault(),f>performance.now())return;f=performance.now()+125;var t="rotate-counter-clockwise";e.keyCode===r.KEY_RIGHT&&(t="rotate-clockwise"),g(t)}},children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,h)}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.General,onClick:function(){return b(m.CharacterPreferencesTabKeys.General)},children:"General"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Character,onClick:function(){return b(m.CharacterPreferencesTabKeys.Character)},children:"Appearance"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{onClick:function(){return g("open-occupation-window")},children:"Occupation"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Traits,onClick:function(){return b(m.CharacterPreferencesTabKeys.Traits)},children:"Traits"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.GameSettings,onClick:function(){return b(m.CharacterPreferencesTabKeys.GameSettings)},children:"Game Settings"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Saves,onClick:function(){return b(m.CharacterPreferencesTabKeys.Saves)},children:"Cloud Saves"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:"1",children:[(v===m.CharacterPreferencesTabKeys.General||v===m.CharacterPreferencesTabKeys.Character)&&(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:0,grow:"1",children:(0,o.createComponentVNode)(2,i.Section,{scrollable:!0,fill:!0,children:[v===m.CharacterPreferencesTabKeys.General&&(0,o.createComponentVNode)(2,d.GeneralTab),v===m.CharacterPreferencesTabKeys.Character&&(0,o.createComponentVNode)(2,l.CharacterTab)]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:[(0,o.createComponentVNode)(2,i.ByondUi,{params:{id:C.preview,type:"map"},style:{width:"64px",height:"128px"}}),(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",mt:"5px",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-left",onClick:function(){return g("rotate-counter-clockwise")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-right",onClick:function(){return g("rotate-clockwise")}})]})]})})]}),(v===m.CharacterPreferencesTabKeys.GameSettings||v===m.CharacterPreferencesTabKeys.Saves)&&(0,o.createComponentVNode)(2,i.Section,{scrollable:!0,fill:!0,children:[v===m.CharacterPreferencesTabKeys.GameSettings&&(0,o.createComponentVNode)(2,u.GameSettingsTab),v===m.CharacterPreferencesTabKeys.Saves&&(0,o.createComponentVNode)(2,s.SavesTab)]}),v===m.CharacterPreferencesTabKeys.Traits&&(0,o.createComponentVNode)(2,p.TraitsTab)]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Button.Confirm,{content:"Reset All",onClick:function(){return g("reset")}})})})]})})})};var h=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data,l=c.profiles.findIndex((function(e){return e.active}));return(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:c.profiles.map((function(e,t){return(0,o.createComponentVNode)(2,i.Stack.Item,{basis:0,grow:1,children:(0,o.createComponentVNode)(2,g,{profile:e,index:t})},t)}))})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Profile Name",buttons:l>-1?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("load",{index:l+1})},children:"Reload"})," - ",(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("save",{index:l+1})},icon:c.profileModified?"exclamation-triangle":undefined,color:c.profileModified?"danger":undefined,tooltip:c.profileModified?"You may have unsaved changes! Any unsaved changes will take effect for this round only.":undefined,tooltipPosition:"left",children:"Save"})],0):null,children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("update-profileName")},children:c.profileName?c.profileName:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})})})})]})},g=function(e,t){var n=e.index,r=e.profile,c=(0,a.useBackend)(t).act;return(0,o.createComponentVNode)(2,i.Section,{title:"Profile "+(n+1),textAlign:"center",backgroundColor:r.active?"rgba(0, 0, 0, 0.10)":null,fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,justify:"space-between",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:r.name?(0,o.createComponentVNode)(2,i.Box,{children:r.name}):(0,o.createComponentVNode)(2,i.Box,{italic:!0,color:"label",children:"Empty"})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{disabled:!r.name,onClick:function(){return c("load",{index:n+1})},children:"Load"})," - ",(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("save",{index:n+1})},children:"Save"})]})]})})}},59576:function(e,t){"use strict";var n,o,r;t.__esModule=!0,t.CharacterPreferencesScrollTarget=t.CharacterPreferencesTooltip=t.CharacterPreferencesTabKeys=void 0,t.CharacterPreferencesTabKeys=n,function(e){e[e.Saves=0]="Saves",e[e.General=1]="General",e[e.Character=2]="Character",e[e.Traits=3]="Traits",e[e.GameSettings=4]="GameSettings"}(n||(t.CharacterPreferencesTabKeys=n={})),t.CharacterPreferencesTooltip=o,function(e){e[e.Always=1]="Always",e[e.Never=2]="Never",e[e.Alt=3]="Alt"}(o||(t.CharacterPreferencesTooltip=o={})),t.CharacterPreferencesScrollTarget=r,function(e){e[e.Never=1]="Never",e[e.Hover=2]="Hover",e[e.Always=3]="Always"}(r||(t.CharacterPreferencesScrollTarget=r={}))},78979:function(e,t,n){"use strict";t.__esModule=!0,t.ChemChute=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ChemChute=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.productList);return(0,o.createComponentVNode)(2,i.Window,{title:"Medical supply chute console",width:355,height:500,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Dispensary interlink stock view",height:"100%",children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"stretch",style:{"border-bottom":"1px #555 solid"},children:[(0,o.createComponentVNode)(2,a.Flex.Item,{direction:"row",children:e.img&&(0,o.createComponentVNode)(2,a.Box,{style:{overflow:"show",height:"24px"},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+e.img,style:{transform:"translate(0, -4px)"}})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{direction:"row",grow:!0,style:{display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,italic:!0,children:[e.amount+" x","\xa0"]}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:e.name})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{bold:!0,direction:"row",style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"}})]},e.name)}))})})})}},28487:function(){},56915:function(e,t,n){"use strict";t.__esModule=!0,t.ChemGroups=t.BeakerContentsGraph=t.Beaker=t.ReagentDispenser=t.ChemDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(48175),u=[{id:0,icon:"sort-amount-down",contents:"",compareFunction:function(e,t){return t.volume-e.volume}},{id:1,icon:"sort-amount-up",contents:"",compareFunction:function(e,t){return e.volume-t.volume}},{id:2,contents:"Density",compareFunction:function(e,t){return e.state-t.state}},{id:3,contents:"Order Added",compareFunction:function(){return 1}}];t.ChemDispenser=function(e,t){return(0,o.createComponentVNode)(2,i.Window,{width:570,height:730,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,s),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m)]})})})};var d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.beakerName,d=l.container,s=(0,r.useSharedState)(t,"addAmount",10),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"iconToggle",!1),h=f[0],g=f[1],C=(0,r.useLocalState)(t,"hoverOver",""),N=C[0],v=C[1],b=l.dispensableReagents||[];return(0,o.createComponentVNode)(2,a.Section,{fontSize:"12px",title:(0,o.createFragment)([(0,o.createTextVNode)("Dispense"),(0,o.createComponentVNode)(2,a.Box,{as:"span",ml:18,children:["Icons:",(0,o.createComponentVNode)(2,a.Button,{width:2,textAlign:"center",backgroundColor:"rgba(0, 0, 0, 0)",textColor:h?"rgba(255, 255, 255, 0.5)":"rgba(255, 255, 255, 1)",onClick:function(){return g(!1)},children:(0,o.createComponentVNode)(2,a.Icon,{mr:1,name:"circle"})}),(0,o.createComponentVNode)(2,a.Button,{width:2,backgroundColor:"rgba(0, 0, 0, 0)",textColor:h?"rgba(255, 255, 255, 1)":"rgba(255, 255, 255, 0.5)",onClick:function(){return g(!0)},children:(0,o.createComponentVNode)(2,a.Icon,{name:"tint"})})]})],4),buttons:(0,o.createComponentVNode)(2,a.Box,{children:["Dispense Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:p,format:function(e){return e+"u"},width:4,minValue:1,maxValue:100,onDrag:function(e,t){return m(t)}})]}),children:[(0,o.createComponentVNode)(2,a.Section,{fitted:!0,backgroundColor:"rgba(0,0,0,0)",children:[!d||d.maxVolume===d.totalVolume&&(0,o.createComponentVNode)(2,a.Modal,{className:"chem-dispenser__labels",fontSize:"20px",mr:2,p:3,children:(0,o.createComponentVNode)(2,a.Box,{children:d?d.name+" Full":"No "+u+" Inserted"})}),b.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__dispense-buttons",align:"left",width:"130px",onMouseEnter:function(){return v(e.id)},onMouseLeave:function(){return v("")},disabled:(null==d?void 0:d.maxVolume)===(null==d?void 0:d.totalVolume),lineHeight:1.75,onClick:function(){return i("dispense",{amount:p,reagentId:e.id})},children:[(0,o.createComponentVNode)(2,a.Icon,{color:"rgba("+e.colorR+","+e.colorG+", "+e.colorB+", 1)",name:h?c.MatterStateIconMap[e.state].icon:"circle",pt:1,style:{"text-shadow":"0 0 3px #000"}}),e.name]},t)}))]}),(0,o.createComponentVNode)(2,a.Box,{italic:!0,pt:.5,children:[" ","Reagent ID: "+N]})]})};t.ReagentDispenser=d;var s=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.beakerName,d=l.container,s=(0,r.useSharedState)(t,"iconToggle",!1)[0],p=(0,r.useSharedState)(t,"removeAmount",10),m=p[0],f=p[1],h=[m,10,5,1];return(0,o.createComponentVNode)(2,a.Section,{fontSize:"12px",title:(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__buttons",icon:"eject",onClick:function(){return i("eject")},children:d?"Eject "+d.name+" ("+d.totalVolume+"/"+d.maxVolume+")":"Insert "+u}),buttons:(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Remove Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{width:4,format:function(e){return e+"u"},value:m,minValue:1,maxValue:100,onDrag:function(e,t){return f(t)}})]}),children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,collapsing:!0,textAlign:"center"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0})]}),(0,o.createComponentVNode)(2,c.ReagentList,{container:d,height:"auto",showState:s,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"filter",onClick:function(){return i("isolate",{reagentId:e.id})},children:"Isolate"}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return i("all",{amount:m,reagentId:e.id})},children:"All"}),h.map((function(t,n){return(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return i("remove",{amount:t,reagentId:e.id})},children:t},n)}))],0)},renderButtonsDeps:m})]})};t.Beaker=s;var p=function(e,t){var n=(0,r.useBackend)(t).data,i=(0,r.useSharedState)(t,"sort",1),d=i[0],s=i[1],p=n.container;return(0,o.createComponentVNode)(2,a.Section,{align:"center",p:.5,title:(0,o.createComponentVNode)(2,a.Tabs,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{fontSize:"11px",textAlign:"center",align:"center",selected:d===e.id,onClick:function(){return s(e.id)},children:[e.icon&&(0,o.createComponentVNode)(2,a.Icon,{name:e.icon}),e.contents]},t)}))}),children:[(0,o.createComponentVNode)(2,c.ReagentGraph,{container:p,sort:u[d].compareFunction}),!(!p||!p.totalVolume)&&(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,l.getTemperatureColor)(p.temperature),className:"ChemHeater__TemperatureNumber",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,l.getTemperatureIcon)(p.temperature),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p.temperature})," K"]})]})};t.BeakerContentsGraph=p;var m=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useLocalState)(t,"groupName",""),u=l[0],d=l[1],s=(0,r.useLocalState)(t,"reagents",""),p=s[0],m=s[1],f=c.groupList,h=c.idCardName,g=c.idCardInserted,C=c.isRecording,N=c.activeRecording;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Reagent Groups",buttons:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__buttons",icon:"eject",onClick:function(){return i("card")},children:g?"Eject ID: "+h:"Insert ID"}),(0,o.createComponentVNode)(2,a.Button,{color:"red",className:"chem-dispenser__buttons",icon:"circle",onClick:function(){return i("record")},children:C?"Stop":"Record"}),(0,o.createComponentVNode)(2,a.Button,{color:"red",className:"chem-dispenser__buttons",icon:"eraser",disabled:!N,onClick:function(){return i("clear_recording")},children:"Clear"})]}),children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Box,{pt:1,pr:7,as:"span",children:"Group Name:"})}),(0,o.createComponentVNode)(2,a.Input,{pl:5,placeholder:"Name",value:u,onInput:function(e,t){return d(t)}}),(0,o.createComponentVNode)(2,a.Box,{as:"span",children:(0,o.createComponentVNode)(2,a.Button,{icon:"plus-circle",lineHeight:1.75,onClick:function(){i("newGroup",{reagents:p,groupName:u}),d(""),m("")},children:"Add Group"})})]}),(0,o.createComponentVNode)(2,a.Box,{pt:.5,italic:!N,color:N?"default":"grey",children:N||"Recording Empty"})]}),!!f.length&&(0,o.createComponentVNode)(2,a.Section,{children:f.map((function(e,t){return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"tint",lineHeight:1.75,onClick:function(){return i("groupDispense",{selectedGroup:e.ref})},children:e.name},t),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",lineHeight:1.75,onClick:function(){return i("deleteGroup",{selectedGroup:e.ref})},children:"Delete"})," "+e.info]},t)}))})],0)};t.ChemGroups=m},95348:function(e,t,n){"use strict";t.__esModule=!0,t.ChemHeater=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381),l=n(48175),u=n(51418);t.ChemHeater=function(e,t){var n=(0,a.useBackend)(t),r=n.act,u=n.data,s=u.containerData,p=u.isActive,m=u.targetTemperature;return(0,o.createComponentVNode)(2,c.Window,{title:"Reagent Heater/Cooler",width:320,height:385,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,d,{container:s,targetTemperature:m,active:p}),(0,o.createComponentVNode)(2,i.Section,{title:"Temperature Control",children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:m,minValue:0,maxValue:1e3,format:function(e){return e+" K"},onDrag:function(e,t){return r("adjustTemp",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,overflow:"hidden",children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,l.getTemperatureColor)(m),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Target"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(m),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:m})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{basis:9.6,align:"center",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",disabled:!(null!=s&&s.totalVolume),color:p?"red":"green",fluid:!0,height:"100%",fontSize:1.25,textAlign:"center",onClick:function(){return r(p?"stop":"start")},children:p?"Deactivate":"Activate"})})]})})]})})};var d=function(e,t){var n,c=(0,a.useBackend)(t).act,d=e.active,s=void 0!==d&&d,p=e.targetTemperature,m=void 0===p?l.freezeTemperature:p,f=null!=(n=e.container)?n:u.NoContainer,h=s&&!f.fake,g=f.temperature,C=f.totalVolume;return(0,o.createComponentVNode)(2,i.SectionEx,{capitalize:!0,title:f.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!e.container,onClick:function(){return c("eject")},children:"Eject"}),children:[(0,o.createComponentVNode)(2,u.ReagentGraph,{container:f}),(0,o.createComponentVNode)(2,u.ReagentList,{container:f}),(0,o.createComponentVNode)(2,i.Box,{className:(0,r.classes)(["ChemHeater__TemperatureBox",h&&"ChemHeater__TemperatureBox__"+(0,l.getTemperatureChangeName)(g,m)]),children:!C||(0,o.createComponentVNode)(2,i.Box,{fontSize:2,color:(0,l.getTemperatureColor)(g),className:"ChemHeater__TemperatureNumber",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"long-arrow-alt-down",className:(0,r.classes)(["ChemHeater__TemperatureArrow",h&&"ChemHeater__TemperatureArrow__"+(0,l.getTemperatureChangeName)(g,m)]),pt:"2px",pr:.25,style:{transform:s?"scaleY("+Math.sign(g-m)+")":"scaleY(0)"}}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(g),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:g})," K"]})}),!e.container&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",fontSize:1.5,onClick:function(){return c("insert")},bold:!0,children:"Insert Beaker"})})]})}},45747:function(e,t,n){"use strict";t.__esModule=!0,t.ChemMaster=t.OperationsSection=t.MakePatches=t.MakePatch=t.MakeBottle=t.MakePills=t.MakePill=t.CheckboxControl=t.MakeButtonControl=t.AmountInputControl=t.IconButtonControl=t.SelectIconModal=t.ReagentDisplay=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.max_volume,l=e.container||c.NoContainer,u=(0,r.useSharedState)(t,"remove_amount",10),d=u[0],s=u[1];return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:l.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{title:"Flush All",icon:"times",color:"red",disabled:!l.totalVolume,onClick:function(){return n("flushall")}}),(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!e.container,onClick:function(){return n("eject")}}),(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Remove Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{width:4,format:function(e){return e+"u"},value:d,minValue:1,maxValue:i,onDrag:function(e,t){return s(Math.round(t))}})]})],4),children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insert")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:l}),(0,o.createComponentVNode)(2,c.ReagentList,{container:l,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"search",color:"green",title:"Analyze",onClick:function(){return n("analyze",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return n("isolate",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"times",color:"red",title:"Flush all",onClick:function(){return n("flush",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"minus",color:"yellow",title:"Flush variable amount of units",bold:!0,onClick:function(){return n("flushinput",{reagent_id:e.id,amount:d})},children:[d,"u"]})],4)},renderButtonsDeps:d})]})};t.ReagentDisplay=l;var u=function(e,t){var n,i,c,l=(0,r.useBackend)(t).data,u=null!=(n=l.pill_icons)?n:[],d=null!=(i=l.bottle_icons)?i:[],s=null!=(c=l.patch_icons)?c:[],p=e.icon_list,m=e.set_icon,f=e.cancel_modal,h=(0,o.createComponentVNode)(2,a.Button,{title:"Cancel",icon:"times",color:"red",mr:1,onClick:function(){return f()}}),g=function(e,t){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){m(t)},children:[(0,o.createComponentVNode)(2,a.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+(0!==p?e[1]:e),style:{"vertical-align":"middle","horizontal-align":"middle"}}),0!==p&&(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",bold:!0,children:[e[0],"u"]})]},t)};return(0,o.createComponentVNode)(2,a.Modal,{full:!0,mx:"auto",backgroundColor:"#1c2734",children:[0===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select pill",buttons:h,minWidth:10,children:u.map(g)}),1===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select bottle",buttons:h,minWidth:12,children:d.map(g)}),2===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select patch",buttons:h,minWidth:12,children:s.map(g)})]})};t.SelectIconModal=u;var d=function(e){var t=e.modal_function,n=e.imageb64;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Change type",tooltipPosition:"top",onClick:function(){return t(!0)},children:(0,o.createComponentVNode)(2,a.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+n,style:{"vertical-align":"middle","horizontal-align":"middle"}})})})};t.IconButtonControl=d;var s=function(e){var t=e.set_amount,n=e.current_amount,r=e.max_amount;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{width:5,format:function(e){return e+"u"},value:n,minValue:5,maxValue:r,onDrag:function(e,n){return t(Math.round(n))}})})};t.AmountInputControl=s;var p=function(e){var t=e.text,n=e.onClick;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:n,width:13,children:t})})};t.MakeButtonControl=p;var m=function(e){var t=e.label,n=e.checked,r=e.set_function;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,onClick:function(){return r(!n)},children:t})})};t.CheckboxControl=m;var f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.item_name,m=e.max_volume,f=(0,r.useSharedState)(t,"single_pill_amount",m),h=f[0],g=f[1],C=c.pill_icons,N=(0,r.useLocalState)(t,"modal_singlepill",!1),v=N[0],b=N[1],V=(0,r.useSharedState)(t,"icon_singlepill",0),y=V[0],x=V[1],I=function(){return b(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[v&&(0,o.createComponentVNode)(2,u,{icon_list:0,set_icon:function(e){x(e),I()},cancel_modal:I}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:b,imageb64:C?C[y]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create single pill",onClick:function(){return i("makepill",{item_name:l,amount:h,icon:y})}}),(0,o.createComponentVNode)(2,s,{set_amount:g,current_amount:h,max_amount:m})]})]})};t.MakePill=f;var h=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.item_name,f=e.max_volume,h=(0,r.useSharedState)(t,"use_bottle",!0),g=h[0],C=h[1],N=(0,r.useSharedState)(t,"multiple_pills_amount",5),v=N[0],b=N[1],V=c.pill_icons,y=(0,r.useLocalState)(t,"modal_multiplepills",!1),x=y[0],I=y[1],k=(0,r.useSharedState)(t,"icon_multiplepills",0),w=k[0],S=k[1],_=function(){return I(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[x&&(0,o.createComponentVNode)(2,u,{icon_list:0,set_icon:function(e){S(e),_()},cancel_modal:_}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:I,imageb64:V?V[w]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create multiple pills",onClick:function(){return i("makepills",{item_name:l,amount:v,use_bottle:g,icon:w})}}),(0,o.createComponentVNode)(2,s,{set_amount:b,current_amount:v,max_amount:f}),(0,o.createComponentVNode)(2,m,{label:"Use bottle",checked:g,set_function:C})]})]})};t.MakePills=h;var g=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"bottle_amount",50),m=l[0],f=l[1],h=e.item_name,g=c.bottle_icons,C=(0,r.useLocalState)(t,"modal_bottle",!1),N=C[0],v=C[1],b=(0,r.useSharedState)(t,"icon_bottle",2),V=b[0],y=b[1],x=function(){return v(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[N&&(0,o.createComponentVNode)(2,u,{icon_list:1,set_icon:function(e){y(e),f(g[e][0]),x()},cancel_modal:x}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:v,imageb64:g?g[V][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create bottle",onClick:function(){return i("makebottle",{item_name:h,amount:m,bottle:V})}}),(0,o.createComponentVNode)(2,s,{set_amount:f,current_amount:m,max_amount:g?g[V][0]:50})]})]})};t.MakeBottle=g;var C=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"single_patch_amount",30),m=l[0],f=l[1],h=e.item_name,g=c.patch_icons,C=(0,r.useLocalState)(t,"modal_singlepatch",!1),N=C[0],v=C[1],b=(0,r.useSharedState)(t,"icon_singlepatch",1),V=b[0],y=b[1],x=function(){return v(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[N&&(0,o.createComponentVNode)(2,u,{icon_list:2,set_icon:function(e){y(e),f(g[e][0]),x()},cancel_modal:x}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:v,imageb64:g?g[V][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create single patch",onClick:function(){return i("makepatch",{item_name:h,amount:m,patch:V})}}),(0,o.createComponentVNode)(2,s,{set_amount:f,current_amount:m,max_amount:g?g[V][0]:30})]})]})};t.MakePatch=C;var N=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"use_box",!0),f=l[0],h=l[1],g=(0,r.useSharedState)(t,"multiple_patches_amount",30),C=g[0],N=g[1],v=e.item_name,b=c.patch_icons,V=(0,r.useLocalState)(t,"modal_multiplepatches",!1),y=V[0],x=V[1],I=(0,r.useSharedState)(t,"icon_multiplepatches",1),k=I[0],w=I[1],S=function(){return x(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[y&&(0,o.createComponentVNode)(2,u,{icon_list:2,set_icon:function(e){w(e),N(b[e][0]),S()},cancel_modal:S}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:x,imageb64:b?b[k][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create multiple patches",onClick:function(){return i("makepatches",{item_name:v,amount:C,use_box:f,patch:k})}}),(0,o.createComponentVNode)(2,s,{set_amount:N,current_amount:C,max_amount:b?b[k][0]:30}),(0,o.createComponentVNode)(2,m,{label:"Use patch box",checked:f,set_function:h})]})]})};t.MakePatches=N;var v=function(e,t){(0,r.useBackend)(t).act;var n=e.placeholder,i=e.item_name,c=e.set_item_name,l=e.max_volume,u=-.5;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Operations",buttons:(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Name: ",(0,o.createComponentVNode)(2,a.Input,{value:i,placeholder:n,onChange:function(e,t){c(t)}})]}),children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,f,{max_volume:l,item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,h,{max_volume:l,item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,g,{item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,C,{item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,N,{item_name:i})})]})})};t.OperationsSection=v;t.ChemMaster=function(e,t){var n,a=(0,r.useBackend)(t).data,c=null!=(n=a.default_name)?n:null,u=(0,r.useLocalState)(t,"item_name",""),d=u[0],s=u[1],p=a.container?a.container.maxVolume:100;return(0,o.createComponentVNode)(2,i.Window,{width:435,height:480,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,l,{container:a.container,max_volume:p}),(0,o.createComponentVNode)(2,v,{container:a.container,max_volume:p,item_name:d,set_item_name:s,placeholder:c})]})})}},48230:function(e,t,n){"use strict";t.__esModule=!0,t.ChemRequestReceiver=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(21118),l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.name,l=e.id,u=e.reagent_name,d=e.reagent_color,s=e.volume,p=e.notes,m=e.area,f=e.state,h=e.interactable,g=e.age,C="rgba("+d[0]+","+d[1]+", "+d[2]+", 1)";return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:10,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[i," requested"]}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Box,{width:16,textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Icon,{color:C,name:"circle",pt:1,style:{"text-shadow":"0 0 3px #000"}})," "+(0,c.capitalize)(u)," (",s,"u)"]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["from ",m," ",g," ago. ",(0,o.createVNode)(1,"br")," ",p&&"Notes: "+p]})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Box,{children:["pending"===f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{disabled:!h,align:"center",width:"49.5%",color:"red",icon:"ban",onClick:function(){n("deny",{id:l})},children:"Deny"}),(0,o.createComponentVNode)(2,a.Button,{disabled:!h,align:"center",width:"49.5%",icon:"check",onClick:function(){n("fulfil",{id:l})},children:"Mark as fulfilled"})],4),"pending"!==f&&(0,o.createComponentVNode)(2,a.Box,{align:"center",backgroundColor:"denied"===f?"red":"green",children:(0,c.capitalize)(f)})]})})]})})};t.ChemRequestReceiver=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data),u=(0,r.useLocalState)(t,"tabIndex",1),d=u[0],s=u[1],p=c.requests,m=c.allowed,f=0;return(0,o.createComponentVNode)(2,i.Window,{title:"Chemical requests",width:600,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===d,onClick:function(){return s(1)},children:"Pending"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:2===d,onClick:function(){return s(2)},children:"History"})]}),(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",children:p.map((function(e){if("pending"===e.state&&1===d||"pending"!==e.state&&2===d)return(0,o.createComponentVNode)(2,a.Stack.Item,{py:1,width:23,ml:0==f++?1:undefined,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({interactable:m},e)))},e.id)}))})]})})}},20938:function(e,t,n){"use strict";t.__esModule=!0,t.ChemRequester=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(21118),l=n(36814),u=n(8095),d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.chemicals,i=(0,r.useLocalState)(t,"searchText",""),c=i[0],u=i[1],d=Object.keys(a).filter((function(e){return e.includes(c)}));return(0,o.createComponentVNode)(2,l.ListSearch,{autoFocus:!0,currentSearch:c,options:d,onSearch:u,onSelect:function(e){n("set_reagent",{reagent_name:e,reagent_id:a[e]}),u("")}})};t.ChemRequester=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.chemicals,m=s.card,f=s.selected_reagent,h=s.volume,g=s.max_volume,C=s.notes,N=s.silicon_user,v=(0,r.useLocalState)(t,"notesText",""),b=v[0],V=v[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Chemical request",width:400,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{align:"center",children:[!!m&&(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,u.IDCard,{card:m,onEject:function(){l("reset_id")}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!f&&(0,o.createComponentVNode)(2,a.Section,{height:36,fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,d,{chemicals:p})}),!!f&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("set_reagent",{reagent:null})},children:(0,c.capitalize)(f)})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Amount",children:(0,o.createComponentVNode)(2,a.NumberInput,{align:"left",unit:"u",minValue:5,step:5,maxValue:g,value:h,onChange:function(e,t){l("set_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Notes",children:(0,o.createComponentVNode)(2,a.Input,{width:"100%",value:b,maxLength:65,onInput:V,onChange:function(e,t){l("set_notes",{notes:t})},children:C})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("submit"),V("")},children:"Submit request"})})]}),!m&&!N&&(0,o.createComponentVNode)(2,a.Section,{children:"Please swipe ID to place request."}),!m&&!!N&&(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("silicon_login")},children:"Login to place request."})})]})})}},6542:function(e,t,n){"use strict";t.__esModule=!0,t.CloningConsole=t.shortenNumber=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(65751),l=n(97622),u=["type"];var d=["","k","M","B","T"],s=function(e,t){void 0===t&&(t=0);var n=Math.log10(Math.abs(e))/3|0;return n===t?e:""+Math.round(e/Math.pow(10,3*n))+d[n]};t.shortenNumber=s;var p=["#17d568","#2ecc71","#e67e22","#ed5100","#e74c3c","#ed2814"],m="functions",f="records",h="pods",g="danger",C="info",N="success",v=function(e){var t=e.type,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),r=Object.assign({},t===g?{danger:!0}:{},t===C?{info:!0}:{},t===N?{success:!0}:{});return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.NoticeBox,Object.assign({},r,n)))};t.CloningConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=c.balance,d=c.cloneHack,s=c.clonesForCash,p=c.cloningWithRecords,g=c.allowedToDelete,C=(0,r.useLocalState)(t,"deletionTarget",""),N=C[0],v=C[1],I=(0,r.useLocalState)(t,"viewingNote",""),k=I[0],w=I[1],S=(0,r.useSharedState)(t,"tab",f),_=S[0],M=S[1];return p||_!==f||M(h),(0,o.createComponentVNode)(2,i.Window,{theme:d.some(Boolean)?"syndicate":"ntos",width:540,height:595,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[N&&(0,o.createComponentVNode)(2,a.Modal,{mx:7,fontSize:"31px",children:[(0,o.createComponentVNode)(2,a.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:2,mt:1,children:(0,o.createComponentVNode)(2,a.Icon,{name:"trash"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:"Delete Record?"})]}),(0,o.createComponentVNode)(2,a.Box,{mt:2,textAlign:"center",fontSize:"24px",children:[(0,o.createComponentVNode)(2,a.Button,{lineHeight:"40px",icon:"check",color:"good",onClick:function(){l("delete",{id:N}),v("")},children:"Yes"}),(0,o.createComponentVNode)(2,a.Button,{width:8,align:"center",mt:2,ml:5,lineHeight:"40px",icon:"times",color:"bad",onClick:function(){return v("")},children:"No"})]})]}),k&&(0,o.createComponentVNode)(2,a.Modal,{mx:7,width:25,fontSize:"15px",children:[(0,o.createComponentVNode)(2,a.Button,{fontSize:"26px",color:"blue",onClick:function(){return w("")},style:{position:"absolute",top:"5px",right:"5px"},children:"X"}),k.note,!!g&&(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"trash",mx:1,onClick:function(){w(""),l("deleteNote",{id:k.id})}})]}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,a.Tabs,{children:[!!p&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",selected:_===f,onClick:function(){return M(f)},children:"Records"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"box",selected:_===h,onClick:function(){return M(h)},children:"Pods"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"wrench",selected:_===m,onClick:function(){return M(m)},children:"Functions"})]})})}),!!s&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:["Current machine credit: ",u]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,V)}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:[_===f&&!!p&&(0,o.createComponentVNode)(2,y),_===h&&(0,o.createComponentVNode)(2,x),_===m&&(0,o.createComponentVNode)(2,b)]})]})]})})};var b=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.allowMindErasure,u=c.disk,d=c.diskReadOnly,s=c.geneticAnalysis,p=c.mindWipe,m=c.cloningWithRecords;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Advanced Genetic Analysis",children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Notice:"}),(0,o.createComponentVNode)(2,a.Box,{children:"Enabling this feature will prompt the attached clone pod to transfer active genetic mutations from the genetic record to the subject during cloning."}),(0,o.createComponentVNode)(2,a.Box,{children:"The cloning process will be slightly slower as a result."})]}),(0,o.createComponentVNode)(2,a.Box,{pt:2,children:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",width:6.7,icon:s?"toggle-on":"toggle-off",color:s?"good":"bad",onClick:function(){return i("toggleGeneticAnalysis")},children:s?"Enabled":"Disabled"})})]}),!!l&&(0,o.createComponentVNode)(2,a.Section,{title:"Criminal Rehabilitation Controls",children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Notice:"}),(0,o.createComponentVNode)(2,a.Box,{children:"Enabling this feature will enable an experimental criminal rehabilitation routine."}),(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Human use is specifically forbidden by the Space Geneva convention."})]}),(0,o.createComponentVNode)(2,a.Box,{pt:2,children:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",width:6.7,icon:p?"toggle-on":"toggle-off",color:p?"good":"bad",onClick:function(){return i("mindWipeToggle")},children:p?"Enabled":"Disabled"})})]}),!!u&&(0,o.createComponentVNode)(2,a.Section,{title:"Disk Controls",buttons:(0,o.createFragment)([m?(0,o.createComponentVNode)(2,a.Button,{icon:"upload",color:"blue",onClick:function(){return i("load")},children:"Load from disk"}):(0,o.createComponentVNode)(2,a.Button,{icon:"upload",color:"blue",onClick:function(){return i("loadAndClone")},children:"Clone from disk"}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",color:"bad",onClick:function(){return i("eject")},children:"Eject Disk"})],0),children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:d?"bad":"good",name:"check"})," ",d?"Disk is read only.":"Disk is writeable."]})})],0)},V=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.scannerLocked,u=c.occupantScanned,d=c.scannerOccupied,s=c.scannerGone,p=c.cloningWithRecords,m=c.message||{text:"",status:""};return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Status Messages",height:7,children:m.text&&(0,o.createComponentVNode)(2,v,{type:m.status,textColor:"white",height:3.17,align:"center",style:{"vertical-align":"middle","horizontal-align":"middle"},children:(0,o.createComponentVNode)(2,a.Box,{style:{position:"relative",left:"50%",top:"50%",transform:"translate(-50%, -50%)"},children:m.text})})}),(0,o.createComponentVNode)(2,a.Section,{title:"Scanner Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{width:7,icon:l?"unlock":"lock-open",align:"center",color:l?"bad":"good",onClick:function(){return i("toggleLock")},children:l?"Locked":"Unlocked"}),children:[!!p&&(!!s||!!u||!d)&&(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:s||!d?"bad":"good",name:s||!d?"times":"check"})," ",!!s&&"No scanner detected.",!s&&(d?"Occupant scanned.":"Scanner has no occupant.")]}),!s&&!u&&!!d&&!!p&&(0,o.createComponentVNode)(2,a.Button,{width:s?8:7,icon:"dna",align:"center",color:s?"bad":"good",disabled:u||s,onClick:function(){return i("scan")},children:"Scan"}),!s&&!!d&&!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"dna",align:"center",color:"good",onClick:function(){return i("scanAndClone")},children:"Scan & Clone"})]})],4)},y=function(e,t){var n=(0,r.useBackend)(t),i=n.act,u=n.data,d=u.disk,m=u.diskReadOnly,f=u.allowedToDelete,h=u.meatLevels,g=u.cloneRecords||[],C=(0,r.useLocalState)(t,"deletionTarget","")[1],N=(0,r.useLocalState)(t,"viewingNote",""),v=(N[0],N[1]);return(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{mb:0,title:"Records",style:{"border-bottom":"2px solid rgba(51, 51, 51, 0.4);"},children:(0,o.createComponentVNode)(2,a.Flex,{className:"cloning-console__flex__head",children:(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__row",mr:2,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"190px"},children:"Name"}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"160px"},children:[(0,o.createComponentVNode)(2,a.Box,{children:"Damage"}),(0,o.createComponentVNode)(2,a.Box,{style:{position:"absolute",left:"50%",top:"20%",transform:"translate(-40%, 22px)"},fontSize:"9px",children:"OXY / TOX / BURN / BRUTE"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"180px"},children:"Actions"})]})})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__flex__table",children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:g.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__body__row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,className:"cloning-console__body__item",style:{width:"190px"},children:e.name}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__body__item",style:{width:"160px"},children:[(0,o.createComponentVNode)(2,a.ColorBox,{mr:1,color:(t=e.health.OXY,n=e.health.TOX,r=e.health.BURN,u=e.health.BRUTE,g=t+n+r+u,N=(0,l.clamp)(Math.ceil(g/25),0,5),p[N])}),e.implant&&e.health.OXY>=0?(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"oxy",width:2,children:s(e.health.OXY)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"toxin",width:2,children:s(e.health.TOX)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"burn",width:2,children:s(e.health.BURN)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"brute",width:2,children:s(e.health.BRUTE)})]}):"No Implant Detected"]}),(0,o.createComponentVNode)(2,a.Flex.Item,{align:"baseline",className:"cloning-console__body__item",style:{width:"180px"},children:[!!f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"trash",color:"bad",onClick:function(){return C(e.id)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"pencil",color:"blue",onClick:function(){return i("editNote",{id:e.id})},tooltip:"Edit note"})],4),!!d&&(0,o.createComponentVNode)(2,a.Button,{icon:m||e.saved?"":"save",color:"blue",alignText:"center",width:"22px",disabled:e.saved||m,onClick:function(){return i("saveToDisk",{id:e.id})},children:[!m&&!!e.saved&&(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"check"}),!!m&&(0,o.createComponentVNode)(2,a.Icon.Stack,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"pen"}),(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"slash"})]})]}),(0,o.createComponentVNode)(2,a.Button,{icon:"dna",color:"good",disabled:!h.length,onClick:function(){return i("clone",{id:e.id})},children:"Clone"}),!!e.note&&(0,o.createComponentVNode)(2,a.Button,{color:"blue",circular:!0,icon:"circle-exclamation",onClick:function(){return v({note:e.note,id:e.id})},tooltip:"View note"})]})]},e.id);var t,n,r,u,g,N}))})})})})})]})},x=function(e,t){var n=(0,r.useBackend)(t).data,i=n.completion,c=n.meatLevels,l=n.podNames;return c.length?c.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:l[t].replace(/cloning pod/,"Cloning Pod")+" Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Completion",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:i[t],maxValue:100,minValue:0,ranges:{good:[90,Infinity],average:[25,90],bad:[-Infinity,25]}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bio-Matter",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:e,maxValue:100,minValue:0,ranges:{good:[50,100],average:[25,50],bad:[0,25]}})})]})},"pod"+t)})):(0,o.createComponentVNode)(2,a.Section,{title:"Cloning Pod Status",children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:"bad",name:"times"})," No Pod Detected"]})})}},78826:function(e,t,n){"use strict";t.__esModule=!0,t.ClothingBooth=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381),l=n(18331);t.ClothingBooth=function(e,t){var n=(0,a.useBackend)(t).data,r=n.clothingBoothCategories||[],l=(0,a.useLocalState)(t,"selectedCategory",r[0]),p=l[0],m=l[1],f=p.items;return(0,o.createComponentVNode)(2,c.Window,{title:n.name,width:300,height:500,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,align:"center",justify:"space-between",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{bold:!0,children:"Cash: "+n.money+"\u2abd"}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Dropdown,{className:"clothingbooth__dropdown",options:r.map((function(e){return e.category})),selected:p.category,onSelected:function(e){return m(r[r.findIndex((function(t){return t.category===e}))])}})})]})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,children:f.map((function(e){return(0,o.createComponentVNode)(2,u,{item:e},e.name)}))})})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,d)})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Purchase Info",children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,justify:"space-around",children:(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,s)})})})})]})})]})})})};var u=function(e,t){var n=(0,a.useBackend)(t),c=n.act,u=n.data,d=e.item;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Stack,{align:"center",className:(0,r.classes)(["clothingbooth__boothitem",d.name===u.selectedItemName&&"clothingbooth__boothitem-selected"]),onClick:function(){return c("select",{path:d.path})},children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+d.img})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:(0,l.capitalize)(d.name)})}),(0,o.createComponentVNode)(2,i.Stack.Item,{bold:!0,children:d.cost+"\u2abd"})]}),(0,o.createComponentVNode)(2,i.Divider)],4)},d=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{textAlign:!0,children:(0,o.createComponentVNode)(2,i.Image,{height:2*c.previewHeight+"px",pixelated:!0,src:"data:image/png;base64,"+c.previewIcon})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-left",tooltip:"Clockwise",tooltipPosition:"right",onClick:function(){return r("rotate-cw")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-right",tooltip:"Counter-clockwise",tooltipPosition:"right",onClick:function(){return r("rotate-ccw")}})]})]})},s=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Stack,{bold:!0,vertical:!0,textAlign:"center",children:c.selectedItemName?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Selected: "+c.selectedItemName}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Price: "+c.selectedItemCost+"\u2abd"}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{color:"green",disabled:c.selectedItemCost>c.money,onClick:function(){return r("purchase")},children:c.selectedItemCost>c.money?"Insufficient Cash":"Purchase"})})],4):(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Please select an item."})})}},41717:function(){},70855:function(e,t,n){"use strict";t.__esModule=!0,t.ColorMatrixEditor=void 0;var o=n(96323),r=n(31246),a=n(97622),i=n(26949),c=n(2381);t.ColorMatrixEditor=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.currentColor,s=d[0],p=(s[0],s[1],s[2],s[3],d[1]),m=(p[0],p[1],p[2],p[3],d[2]),f=(m[0],m[1],m[2],m[3],d[3]),h=(f[0],f[1],f[2],f[3],d[4]),g=(h[0],h[1],h[2],h[3],["r","g","b","a","c"]);return(0,o.createComponentVNode)(2,c.Window,{title:"Color Matrix Editor",width:560,height:245,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[0,1,2,3].map((function(e,t){return(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[0,1,2,3,4].map((function(t,n){return(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,textColor:"label",width:"2.1rem",children:""+g[t]+g[e]+":"}),(0,o.createComponentVNode)(2,i.NumberInput,{inline:!0,value:u.currentColor[4*t+e],step:.01,width:"50px",format:function(e){return(0,a.toFixed)(e,2)},onDrag:function(n,o){var r=u.currentColor;r[4*t+e]=o,l("transition_color",{color:r})}})]},n)}))})},t)}))})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0}),(0,o.createComponentVNode)(2,i.Stack.Item,{align:"left",children:[(0,o.createComponentVNode)(2,i.Button.Confirm,{content:"Confirm",confirmContent:"Confirm?",onClick:function(){return l("confirm")}}),u.targetIsClient?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Preview Color",onClick:function(){return l("client-preview")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Reset Your Color",onClick:function(){return l("client-reset")}})],4):""]})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.ByondUi,{params:{id:u.previewRef,type:"map"},style:{height:"100%"}})})]})})})}},21018:function(e,t,n){"use strict";t.__esModule=!0,t.ColorInput=t.HexColorInput=t.ColorSelector=t.ColorPickerModal=void 0;var o=n(96323),r=n(55631),a=n(31246),i=n(26949),c=n(2381),l=n(97622),u=n(89295),d=n(54291),s=n(1060),p=n(79926),m=n(34277),f=["prefixed","alpha","color","fluid","onChange"];function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}t.ColorPickerModal=function(e,t){var n=(0,a.useBackend)(t).data,l=n.timeout,d=n.message,s=n.title,p=n.autofocus,f=n.default_color,h=void 0===f?"#000000":f,C=(0,a.useLocalState)(t,"color_picker_choice",(0,u.hexToHsva)(h)),N=C[0],v=C[1];return(0,o.createComponentVNode)(2,c.Window,{height:400,title:s,width:600,theme:"generic",children:[!!l&&(0,o.createComponentVNode)(2,r.Loader,{value:l}),(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[d&&(0,o.createComponentVNode)(2,i.Stack.Item,{m:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Box,{color:"label",overflow:"hidden",children:d})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:[!!p&&(0,o.createComponentVNode)(2,i.Autofocus),(0,o.createComponentVNode)(2,g,{color:N,setColor:v,defaultColor:h})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,m.InputButtons,{input:(0,u.hsvaToHex)(N)})})]})})]})};var g=function(e,t){var n=e.color,r=e.setColor,a=e.defaultColor,c=function(e){r((function(t){return Object.assign({},t,e)}))},l=(0,u.hsvaToRgba)(n),d=(0,u.hsvaToHex)(n);return(0,o.createComponentVNode)(2,i.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createVNode)(1,"div","react-colorful",[(0,o.createComponentVNode)(2,V,{hsva:n,onChange:c}),(0,o.createComponentVNode)(2,y,{hue:n.h,onChange:c,className:"react-colorful__last-control"})],4)}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"20px",textAlign:"center",children:"Current"}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"20px",textAlign:"center",children:"Previous"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Tooltip,{content:d,position:"bottom",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"30px",backgroundColor:d})}),(0,o.createComponentVNode)(2,i.Tooltip,{content:a,position:"bottom",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"30px",backgroundColor:a})})]})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:!0,fontSize:"15px",lineHeight:"24px",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"Hex:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,height:"24px",children:(0,o.createComponentVNode)(2,v,{fluid:!0,color:(0,u.hsvaToHex)(n).substring(1),onChange:function(e){p.logger.info(e),r((0,u.hexToHsva)(e))},prefixed:!0})})]})}),(0,o.createComponentVNode)(2,i.Stack.Divider),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"H:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,y,{hue:n.h,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:n.h,callback:function(e,t){return c({h:t})},max:360,unit:"\xb0"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"S:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,x,{color:n,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:n.s,callback:function(e,t){return c({s:t})},unit:"%"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"V:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,I,{color:n,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:n.v,callback:function(e,t){return c({v:t})},unit:"%"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Divider),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"R:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,k,{color:n,onChange:c,target:"r"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:l.r,callback:function(e,t){l.r=t,c((0,u.rgbaToHsva)(l))},max:255})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"G:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,k,{color:n,onChange:c,target:"g"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:l.g,callback:function(e,t){l.g=t,c((0,u.rgbaToHsva)(l))},max:255})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"B:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,k,{color:n,onChange:c,target:"b"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,C,{value:l.b,callback:function(e,t){l.b=t,c((0,u.rgbaToHsva)(l))},max:255})})]})})]})})]})};t.ColorSelector=g;var C=function(e){var t=e.value,n=e.callback,r=e.min,a=void 0===r?0:r,c=e.max,l=void 0===c?100:c,u=e.unit;return(0,o.createComponentVNode)(2,i.NumberInput,{width:"70px",value:Math.round(t),step:1,minValue:a,maxValue:l,onChange:n,unit:u})},N=function(e){return"#"+e},v=function(e){var t=e.prefixed,n=e.alpha,r=e.color,a=e.fluid,i=e.onChange,c=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,f);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},c,{fluid:a,color:r,onChange:i,escape:function(e){return e.replace(/([^0-9A-F]+)/gi,"").substring(0,n?8:6)},format:t?N:undefined,validate:function(e){return(0,u.validHex)(e,n)}})))};t.HexColorInput=v;var b=function(e){var t,n;function r(t){var n;return(n=e.call(this)||this).props=void 0,n.state=void 0,n.handleInput=function(e){var t=n.props.escape(e.currentTarget.value);n.setState({localValue:t})},n.handleBlur=function(e){e.currentTarget&&(n.props.validate(e.currentTarget.value)?n.props.onChange(n.props.escape?n.props.escape(e.currentTarget.value):e.currentTarget.value):n.setState({localValue:n.props.escape(n.props.color)}))},n.props=t,n.state={localValue:n.props.escape(n.props.color)},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,h(t,n);var a=r.prototype;return a.componentDidUpdate=function(e,t){e.color!==this.props.color&&this.setStateValue()},a.setStateValue=function(){this.setState({localValue:this.props.escape(this.props.color)})},a.render=function(){return(0,o.createComponentVNode)(2,i.Box,{className:(0,s.classes)(["Input",this.props.fluid&&"Input--fluid"]),children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{value:this.props.format?this.props.format(this.state.localValue):this.state.localValue,onInput:this.handleInput,onBlur:this.handleBlur})]})},r}(o.Component);t.ColorInput=b;var V=function(e){var t=e.hsva,n=e.onChange,r={"background-color":(0,u.hsvaToHslString)({h:t.h,s:100,v:100,a:1})+" !important"};return(0,o.createVNode)(1,"div","react-colorful__saturation_value",(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){n({s:100*e.left,v:100-100*e.top})},onKey:function(e){n({s:(0,l.clamp)(t.s+100*e.left,0,100),v:(0,l.clamp)(t.v-100*e.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+Math.round(t.s)+"%, Brightness "+Math.round(t.v)+"%",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__saturation_value-pointer",top:1-t.v/100,left:t.s/100,color:(0,u.hsvaToHslString)(t)})}),2,{style:r})},y=function(e){var t=e.className,n=e.hue,r=e.onChange,a=(0,s.classes)(["react-colorful__hue",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){r({h:360*e.left})},onKey:function(e){r({h:(0,l.clamp)(n+360*e.left,0,360)})},"aria-label":"Hue","aria-valuenow":Math.round(n),"aria-valuemax":"360","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__hue-pointer",left:n/360,color:(0,u.hsvaToHslString)({h:n,s:100,v:100,a:1})})}),2)},x=function(e){var t=e.className,n=e.color,r=e.onChange,a=(0,s.classes)(["react-colorful__saturation",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{style:{background:"linear-gradient(to right, "+(0,u.hsvaToHslString)({h:n.h,s:0,v:n.v,a:1})+", "+(0,u.hsvaToHslString)({h:n.h,s:100,v:n.v,a:1})+")"},onMove:function(e){r({s:100*e.left})},onKey:function(e){r({s:(0,l.clamp)(n.s+100*e.left,0,100)})},"aria-label":"Saturation","aria-valuenow":Math.round(n.s),"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__saturation-pointer",left:n.s/100,color:(0,u.hsvaToHslString)({h:n.h,s:n.s,v:n.v,a:1})})}),2)},I=function(e){var t=e.className,n=e.color,r=e.onChange,a=(0,s.classes)(["react-colorful__value",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{style:{background:"linear-gradient(to right, "+(0,u.hsvaToHslString)({h:n.h,s:n.s,v:0,a:1})+", "+(0,u.hsvaToHslString)({h:n.h,s:n.s,v:100,a:1})+")"},onMove:function(e){r({v:100*e.left})},onKey:function(e){r({v:(0,l.clamp)(n.v+100*e.left,0,100)})},"aria-label":"Value","aria-valuenow":Math.round(n.s),"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__value-pointer",left:n.v/100,color:(0,u.hsvaToHslString)({h:n.h,s:n.s,v:n.v,a:1})})}),2)},k=function(e){var t=e.className,n=e.color,r=e.onChange,a=e.target,c=(0,u.hsvaToRgba)(n),p=function(e){c[a]=e,r((0,u.rgbaToHsva)(c))},m=(0,s.classes)(["react-colorful__"+a,t]),f="r"===a?"rgb("+Math.round(c.r)+",0,0)":"g"===a?"rgb(0,"+Math.round(c.g)+",0)":"rgb(0,0,"+Math.round(c.b)+")";return(0,o.createVNode)(1,"div",m,(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){p(255*e.left)},onKey:function(e){p((0,l.clamp)(c[a]+255*e.left,0,255))},"aria-valuenow":c[a],"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__"+a+"-pointer",left:c[a]/255,color:f})}),2)}},22049:function(e,t,n){"use strict";t.__esModule=!0,t.ComUplink=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331);t.ComUplink=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,i.Window,{theme:"syndicate",title:"Syndicate Commander Uplink",width:500,height:500,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Stack,{className:"ComUplink"}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Points",children:(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,color:"green",mr:"5px",className:"ComUplink__Points--commander",children:n.points},n.points)})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Uplink Items"}),(0,o.createComponentVNode)(2,a.Collapsible,{className:"ComUplink__Category--Main",title:"Equipment",open:!0,color:"Main",children:(0,o.createComponentVNode)(2,a.Table,{children:n.stock.filter((function(e){return"Main"===e.category})).map((function(e){return(0,o.createComponentVNode)(2,l,{stock:e},e.name)}))})})]})]})})};var l=function(e,t){var n=e.stock,i=(0,r.useBackend)(t),l=i.data,u=i.act;return(0,o.createComponentVNode)(2,a.Table.Row,{className:"ComUplink__Row",opacity:n.cost>l.points[n.category]?.5:1,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{className:"ComUplink__Cell",py:"5px",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",bold:!0,children:n.name}),(0,o.createComponentVNode)(2,a.Box,{children:n.description})]}),(0,o.createComponentVNode)(2,a.Table.Cell,{className:"ComUplink__Cell",py:"5px",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{disabled:n.cost>l.points,onClick:function(){return u("redeem",{ref:n.ref})},children:["Purchase ",n.cost," ",(0,c.pluralize)("point",n.cost)]})})]})}},20254:function(){},65208:function(e,t,n){"use strict";t.__esModule=!0,t.ContributorRewards=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ContributorRewards=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.rewardTitles,d=l.rewardDescs;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Contributor Rewards",width:350,height:200,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:["Howdy, contributor! These rewards don't revert until you respawn somehow.",(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Collapsible,{title:u[t],open:!0,children:[d[t],(0,o.createComponentVNode)(2,a.Button,{ml:1,icon:"check-circle",content:"Redeem",onClick:function(){return c("redeem",{reward_idx:t+1})}})]},t)}))})})]})})}},19812:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistsTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.AntagonistsTab=function(e,t){var n,l=(0,r.useBackend)(t).data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i,{game_mode:l.game_mode}),null==(n=l.verbose_antagonist_data)?void 0:n.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e),t))})),!!l.succinct_antagonist_data.length&&(0,o.createComponentVNode)(2,a.Section,{title:"Other Antagonists",children:(0,o.createComponentVNode)(2,f,{succinct_antagonist_data:l.succinct_antagonist_data})})],0)};var i=function(e){var t=e.game_mode;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{mb:-2.5,italic:!0,children:"The Game Mode Was:"}),(0,o.createComponentVNode)(2,a.Stack.Item,{fontSize:2.75,bold:!0,children:t})]})})},c=function(e){var t=e.antagonist_roles,n=e.real_name,r=e.player,i=e.job_role,c=e.status,d=e.objectives,s=e.antagonist_statistics,p=e.subordinate_antagonists;return(0,o.createComponentVNode)(2,a.Box,{my:2,children:(0,o.createComponentVNode)(2,a.Collapsible,{title:n+" (played by "+r+") - "+t,fontSize:1.2,bold:!0,children:(0,o.createComponentVNode)(2,a.Section,{mt:-1.1,children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,children:"General"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Job",children:i}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:c})]}),!!d.length&&(0,o.createComponentVNode)(2,l,{objectives:d}),!!s.length&&(0,o.createComponentVNode)(2,u,{antagonist_statistics:s}),!!p.length&&(0,o.createComponentVNode)(2,m,{subordinate_antagonists:p})]})})})},l=function(e){var t=e.objectives;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Objectives"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,ml:.5,children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{color:e.completed?"green":"red",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{minWidth:.9,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Icon,{name:e.completed?"check":"xmark"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.explanation_text})]})},t)}))})],4)},u=function(e){var t=e.antagonist_statistics;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Statistics"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,d,{name:e.name,type:e.type,value:e.value},t)}))})],4)},d=function(e){var t=e.name,n=e.type,r=e.value,i=s(n);return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t,verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i,{type:n,items:r,nothing_text:"Nothing."})})},s=function(e){return e===undefined?function(e){return e.items}:e in p?p[e]:void 0},p={itemList:a.ItemList},m=function(e){var t=e.subordinate_antagonists;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Subordinate Antagonists"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,f,{succinct_antagonist_data:t})],4)},f=function(e){var t=e.succinct_antagonist_data;return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:e.antagonist_role}),(0,o.createComponentVNode)(2,a.Stack.Item,{shrink:!0,textAlign:"right",children:[!!e.dead&&(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," ",e.real_name," (played by ",e.player,")"]})]})},t)}))})}},99407:function(e,t,n){"use strict";t.__esModule=!0,t.CrewTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.CrewTab=function(e,t){var n,c=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Box,{children:null==(n=c.groups)?void 0:n.map((function(e,t){return c.groups[t].crew.length>0&&(0,o.createComponentVNode)(2,i,{title:e.title,crew:e.crew},t)}))})};var i=function(e){var t=e.title,n=e.crew,r=null==n?void 0:n.filter((function(e){return e.head})),i=null==n?void 0:n.filter((function(e){return!e.head}));return(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[null==r?void 0:r.map((function(e,t){return(0,o.createComponentVNode)(2,c,{real_name:e.real_name,dead:e.dead,player:e.player,role:e.role,head:!0},"head"+t)})),null==i?void 0:i.map((function(e,t){return(0,o.createComponentVNode)(2,c,{real_name:e.real_name,dead:e.dead,player:e.player,role:e.role},t)}))]})})},c=function(e){var t=e.real_name,n=e.dead,r=e.player,i=e.role,c=e.head;return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,bold:c,justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:i}),(0,o.createComponentVNode)(2,a.Stack.Item,{shrink:!0,textAlign:"right",children:[!!n&&(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," ",t," (played by ",r,")"]})]})})}},21187:function(e,t,n){"use strict";t.__esModule=!0,t.ScoreTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.ScoreTab=function(e,t){var n=(0,r.useBackend)(t).data,l=n.score_groups,u=n.total_score,s=n.grade,p=n.victory_body,m=n.victory_headline,f=(0,o.createComponentVNode)(2,d,{items:u});return(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,i,{preamble:"Round Result:",headline:m,body:p,children:" "}),!m&&(0,o.createComponentVNode)(2,i,{preamble:"Total Score:",headline:f,body:s,children:" "}),(0,o.createComponentVNode)(2,a.Section,{children:null==l?void 0:l.map((function(e,t){return!!e.entries.length&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e),t))}))})],0)};var i=function(e){var t=e.preamble,n=e.headline,r=e.body;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{italic:!0,mt:0,mb:-2.5,children:t}),(0,o.createComponentVNode)(2,a.Stack.Item,{fontSize:2.75,bold:!0,children:n}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:-2.5,children:r})]})})},c=function(e){var t=e.title,n=e.entries;return(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:null==n?void 0:n.map((function(e,t){return(0,o.createComponentVNode)(2,l,{name:e.name,type:e.type,value:e.value},t)}))})})},l=function(e){var t=e.name,n=e.type,r=e.value,i=u(n);return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t,verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i,{type:n,items:r,nothing_text:"N/A"})})},u=function(e){return e===undefined?function(e){return e.items}:e in s?s[e]:void 0},d=function(e){var t=e.items,n="white";return t<0?n="purple":t<30?n="brown":t<60?n="red":t<70?n="orange":t<80?n="yellow":t<90?n="yellowgreen":t<100?n="chartreuse":100===t?n="lime":t>100&&(n="teal"),(0,o.createComponentVNode)(2,a.Box,{color:n,children:[t,"%"]})},s={itemList:a.ItemList,colorPercent:d}},57119:function(e,t,n){"use strict";t.__esModule=!0,t.CrewCredits=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(99407),l=n(19812),u=n(37538),d=n(21187);t.CrewCredits=function(e,t){var n=(0,r.useLocalState)(t,"menu",u.CrewCreditsTabKeys.General),s=n[0],p=n[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Crew Credits",width:600,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.General,onClick:function(){return p(u.CrewCreditsTabKeys.General)},children:"General"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.Antagonists,onClick:function(){return p(u.CrewCreditsTabKeys.Antagonists)},children:"Antagonists"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.Score,onClick:function(){return p(u.CrewCreditsTabKeys.Score)},children:"Station Score"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[s===u.CrewCreditsTabKeys.General&&(0,o.createComponentVNode)(2,c.CrewTab),s===u.CrewCreditsTabKeys.Antagonists&&(0,o.createComponentVNode)(2,l.AntagonistsTab),s===u.CrewCreditsTabKeys.Score&&(0,o.createComponentVNode)(2,d.ScoreTab)]})]})})})}},37538:function(e,t){"use strict";var n;t.__esModule=!0,t.CrewCreditsTabKeys=void 0,t.CrewCreditsTabKeys=n,function(e){e[e.General=0]="General",e[e.Antagonists=1]="Antagonists",e[e.Score=2]="Score"}(n||(t.CrewCreditsTabKeys=n={}))},75859:function(e,t,n){"use strict";t.__esModule=!0,t.Beaker=t.CryoCell=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(48175),l=n(51418),u=n(65751),d=n(90881),s=n(9720);t.CryoCell=function(e,t){return(0,o.createComponentVNode)(2,i.Window,{width:485,height:575,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]})})};var p=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.cellTemp,d=l.status;return(0,o.createComponentVNode)(2,a.Section,{title:"Cryo Cell Control System",children:(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:["Current Cell Temperature",(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,c.getTemperatureColor)(u),mb:"1rem",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,c.getTemperatureIcon)(u),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:(u-273.15).toPrecision(4)})," \xb0C"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:d?"green":"red",fontSize:1.25,textAlign:"center",onClick:function(){return i("start")},children:d?"Activated":"Deactivated"})]})})},m=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,p=c.occupant,m=c.reagentScanEnabled,f=c.reagentScanActive,h=c.hasDefib,g=p?d.MobStatuses[p.occupantStat]:null;return(0,o.createComponentVNode)(2,a.Section,{title:"Occupant",buttons:(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("reagent_scan_active")},icon:f?"eye-slash":"eye",children:[f?"Hide":"Show"," Reagents"]}),h&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("defib")},icon:"bolt",color:"yellow",children:"Defibrillate"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("eject_occupant")},icon:"eject",disabled:!p,color:"green",children:"Eject"})],0),children:[!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:[(0,o.createComponentVNode)(2,a.Icon,{color:g.color,name:g.icon})," ",g.name]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Overall Health",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:p.health,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Damage Breakdown",children:[(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"oxy",width:5,children:(0,u.damageNum)(p.oxyDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"toxin",width:5,children:(0,u.damageNum)(p.toxDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"burn",width:5,children:(0,u.damageNum)(p.burnDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"brute",width:5,children:(0,u.damageNum)(p.bruteDamage)})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Key Health Indicators",mt:"0.5rem",children:[(0,o.createComponentVNode)(2,s.KeyHealthIndicators,{mobData:p}),!!p.hasRoboticOrgans&&(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Box,{bold:!0,fontSize:1.2,color:"purple",children:"Unknown augmented organs detected."})})]})],4),p&&p.reagents&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.ReagentGraph,{container:p.reagents,mt:"0.5rem"}),(0,o.createComponentVNode)(2,l.ReagentList,{container:p.reagents})],4),!p&&(0,o.createVNode)(1,"em",null,"Unoccupied",16)]})},f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,u=n.data,d=u.showBeakerContents,s=u.containerData;return(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("show_beaker_contents")},icon:d?"eye-slash":"eye",children:[d?"Hide":"Show"," Contents"]}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("eject")},icon:"eject",disabled:!s,color:"green",children:"Eject"})],4),children:!!d&&(0,o.createFragment)([s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.ReagentGraph,{container:s}),(0,o.createComponentVNode)(2,l.ReagentList,{container:s}),(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,c.getTemperatureColor)(s.temperature),textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,c.getTemperatureIcon)(s.temperature),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:s.temperature})," K"]})],4),!s&&(0,o.createComponentVNode)(2,a.Dimmer,{height:"5rem",children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return i("insert")},bold:!0,children:"Insert Beaker"})})],0)})};t.Beaker=f},56445:function(e,t,n){"use strict";t.__esModule=!0,t.CyborgDockingStation=void 0;var o=n(96323),r=n(31246),a=n(84200),i=n(26949),c=n(2381),l=["disabled"];t.CyborgDockingStation=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data,d=(0,r.useLocalState)(t,"tabIndex",1),s=d[0],p=d[1];return(0,o.createComponentVNode)(2,c.Window,{width:500,height:640,title:"Cyborg Docking Station",theme:l.conversion_chamber&&"human"===l.occupant.kind?"syndicate":"neutral",children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,width:"100px",children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===s,onClick:function(){return p(1)},children:"Occupant"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===s,onClick:function(){return p(2)},children:"Supplies"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,basis:0,children:(0,o.createComponentVNode)(2,_,{data:l,act:a,tabIndex:s})})]})]})})};var u=function(e,t){var n=(0,r.useBackend)(t),a=(n.act,n.data);if(a.disabled)return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Box,{backgroundColor:"#773333",p:"5px",mb:"5px",bold:!0,textAlign:"center",children:[a.viewer_is_robot&&!a.viewer_is_occupant?"You must be inside the docking station to use the functions.":"",a.viewer_is_occupant&&!a.viewer_is_robot?"Non-cyborgs cannot use the docking station functions.":"",a.viewer_is_occupant&&!a.allow_self_service?"Self-service has been disabled at this station.":""]}),(0,o.createComponentVNode)(2,i.Divider)],4)},d=function(e,t){var n=e.disabled,a=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),c=(0,r.useBackend)(t),u=(c.act,c.data);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({disabled:n||u.disabled},a)))},s=function(e){var t=e.occupant,n=e.fuel,r=e.cabling,a=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,i.Stack,{children:(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,p,{occupant:t,act:a,fuel:n,cabling:r})})})})},p=function(e){var t=e.occupant,n=e.fuel,r=e.cabling,a=e.act;return t.name?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",buttons:(0,o.createFragment)(["robot"===t.kind&&(0,o.createComponentVNode)(2,d,{onClick:function(){return a("occupant-rename")},icon:"edit",tooltip:"Change the occupant's designation"}),(0,o.createComponentVNode)(2,d,{onClick:function(){return a("occupant-eject")},icon:"eject",tooltip:"Eject the occupant"})],0),children:t.name}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Type",children:(0,o.createComponentVNode)(2,g,{kind:t.kind,user:t.user})})]}),(0,o.createComponentVNode)(2,i.Section,{title:"Status",children:["robot"===t.kind&&(0,o.createComponentVNode)(2,m,{occupant:t,fuel:n,cabling:r,act:a}),"human"===t.kind&&(0,o.createComponentVNode)(2,f,{occupant:t}),"eyebot"===t.kind&&(0,o.createComponentVNode)(2,h,{occupant:t})]})],4):(0,o.createVNode)(1,"div",null,"No occupant",16)},m=function(e){var t=e.occupant,n=e.fuel,r=e.cabling,a=e.act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,k,{cellData:t.cell,act:a}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Module",buttons:(0,o.createComponentVNode)(2,d,{onClick:function(){return a("module-remove")},icon:"minus",tooltip:"Remove the occupant's module",disabled:!t.module}),children:t.module||(0,o.createComponentVNode)(2,i.Box,{as:"span",color:"red",children:"No Module Installed"})})]}),(0,o.createComponentVNode)(2,v,{parts:t.parts,fuel:n,cabling:r,act:a}),(0,o.createComponentVNode)(2,S,{upgrades:t.upgrades,upgrades_max:t.upgrades_max,act:a}),(0,o.createComponentVNode)(2,N,{cosmetics:t.cosmetics,act:a}),(0,o.createComponentVNode)(2,C,{clothes:t.clothing,act:a})],4)},f=function(e){var t=e.occupant;return(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Converting",children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:(t.max_health-t.health)/t.max_health,ranges:{good:[.5,Infinity],average:[.25,.5],bad:[-Infinity,.25]},children:[Math.floor((t.max_health-t.health)/t.max_health*100),"%"]})})})},h=function(e){var t=e.occupant;return(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:t.cell.name,children:(0,o.createComponentVNode)(2,w,{cellData:t.cell})})})},g=function(e){var t=e.kind,n=e.user;switch(t){case"robot":if("brain"===n)return(0,o.createFragment)([(0,o.createTextVNode)("Mk.2-Type Cyborg")],4);if("ai"===n)return(0,o.createFragment)([(0,o.createTextVNode)("Mk.2-Type AI Shell")],4);break;case"human":return(0,o.createFragment)([(0,o.createTextVNode)("Mk.2-Type Carbon")],4);case"eyebot":return(0,o.createFragment)([(0,o.createTextVNode)("Mk.1-Type Eyebot")],4);default:return(0,o.createFragment)([(0,o.createTextVNode)("Unknown type")],4)}},C=function(e){var t=e.clothes,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Clothing",children:t.length>0?t.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:[e.name," ",(0,o.createComponentVNode)(2,d,{onClick:function(){return n("clothing-remove",{clothingRef:e.ref})},icon:"minus-circle",color:"transparent",tooltip:"Remove from occupant"})]},e.ref)})):(0,o.createComponentVNode)(2,i.Box,{children:"No Clothing"})})},N=function(e){var t=e.cosmetics,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Decoration",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Head",buttons:(0,o.createComponentVNode)(2,d,{icon:"sync-alt",tooltip:"Change head decoration",onClick:function(){return n("cosmetic-change-head")}}),children:t.head||"None"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Chest",buttons:(0,o.createComponentVNode)(2,d,{icon:"sync-alt",tooltip:"Change chest decoration",onClick:function(){return n("cosmetic-change-chest")}}),children:t.chest||"None"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Arms",buttons:(0,o.createComponentVNode)(2,d,{icon:"sync-alt",tooltip:"Change arms decoration",onClick:function(){return n("cosmetic-change-arms")}}),children:t.arms||"None"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Legs",buttons:(0,o.createComponentVNode)(2,d,{icon:"sync-alt",tooltip:"Change legs decoration",onClick:function(){return n("cosmetic-change-legs")}}),children:t.legs||"None"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Paint",buttons:(0,o.createFragment)([!t.paint&&(0,o.createComponentVNode)(2,d,{icon:"plus",tooltip:"Add paint",onClick:function(){return n("occupant-paint-add")}}),t.paint&&(0,o.createComponentVNode)(2,d,{icon:"tint",tooltip:"Change colour",onClick:function(){return n("occupant-paint-change")}}),t.paint&&(0,o.createComponentVNode)(2,d,{icon:"minus",tooltip:"Remove paint",onClick:function(){return n("occupant-paint-remove")}})],0),children:t.paint?(0,o.createComponentVNode)(2,i.ColorBox,{color:t.paint}):"No paint applied"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Eyes",buttons:(0,o.createComponentVNode)(2,d,{icon:"tint",tooltip:"Change eye glow",onClick:function(){return n("occupant-fx")}}),children:(0,o.createComponentVNode)(2,i.ColorBox,{color:"rgb("+t.fx[0]+","+t.fx[1]+","+t.fx[2]+")"})})]})})},v=function(e){var t=e.parts,n=e.fuel,r=e.cabling,c=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Damage Report",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,d,{disabled:n<1,icon:"wrench",backgroundColor:a.COLORS.damageType.brute,tooltip:"Fix structural damage",onClick:function(){return c("repair-fuel")}}),(0,o.createComponentVNode)(2,d,{disabled:r<1,icon:"fire",backgroundColor:a.COLORS.damageType.burn,tooltip:"Fix wiring damage",onClick:function(){return c("repair-wiring")}})],4),children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,b,{label:"Head",partData:t.head}),(0,o.createComponentVNode)(2,b,{label:"Chest",partData:t.chest}),(0,o.createComponentVNode)(2,b,{label:"Left Arm",partData:t.arm_l}),(0,o.createComponentVNode)(2,b,{label:"Right Arm",partData:t.arm_r}),(0,o.createComponentVNode)(2,b,{label:"Left Leg",partData:t.leg_l}),(0,o.createComponentVNode)(2,b,{label:"Right Leg",partData:t.leg_r})]})})},b=function(e){var t=e.label,n=e.partData;if(0===n.exists)return(0,o.createComponentVNode)(2,i.LabeledList.Item,{color:"red",label:t,children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:"MISSING!"})});var r=Math.floor(n.dmg_blunt/n.max_health*100),c=Math.floor(n.dmg_burns/n.max_health*100);return r||c?(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:t,children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{backgroundColor:a.COLORS.damageType.brute,width:r+"%"}),(0,o.createComponentVNode)(2,i.Flex.Item,{backgroundColor:a.COLORS.damageType.burn,width:c+"%"}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:1,backgroundColor:"#000000",stretch:!0,children:"\xa0"})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{shrink:!0,children:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Flex.Item,{shrink:!0,width:"25px",backgroundColor:"#330000",color:a.COLORS.damageType.brute,bold:!0,children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:r>0?r:"--"})}),(0,o.createComponentVNode)(2,i.Flex.Item,{shrink:!0,width:"25px",backgroundColor:"#331100",color:a.COLORS.damageType.burn,bold:!0,children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",children:c>0?c:"--"})})]})})]})}):void 0},V=function(e){var t=e.cells,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Power Cells",children:t.length>0?(0,o.createComponentVNode)(2,i.LabeledList,{children:[" ",t.map((function(e){return(0,o.createVNode)(1,"div",null,(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,d,{onClick:function(){return n("cell-install",{cellRef:e.ref})},icon:"plus",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,d,{onClick:function(){return n("cell-eject",{cellRef:e.ref})},icon:"eject",tooltip:"Eject from station"})],4),children:(0,o.createComponentVNode)(2,w,{cellData:e})}),2,null,e.ref)}))]}):(0,o.createComponentVNode)(2,i.Box,{as:"div",children:"None Stored"})})},y=function(e){var t=e.modules,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Modules",children:[" ",t.length>0?t.map((function(e){return(0,o.createVNode)(1,"div",null,[e.name,(0,o.createComponentVNode)(2,d,{onClick:function(){return n("module-install",{moduleRef:e.ref})},icon:"plus-circle",color:"transparent",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,d,{onClick:function(){return n("module-eject",{moduleRef:e.ref})},icon:"eject",color:"transparent",tooltip:"Eject from station"})],0,null,e.ref)})):(0,o.createComponentVNode)(2,i.Box,{as:"div",children:"None Stored"})]})},x=function(e){var t=e.upgrades,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Upgrades",children:[" ",t.length>0?t.map((function(e){return(0,o.createVNode)(1,"div",null,[e.name,(0,o.createComponentVNode)(2,d,{onClick:function(){return n("upgrade-install",{upgradeRef:e.ref})},icon:"plus-circle",color:"transparent",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,d,{onClick:function(){return n("upgrade-eject",{upgradeRef:e.ref})},icon:"eject",color:"transparent",tooltip:"Eject from station"})],0,null,e.ref)})):(0,o.createComponentVNode)(2,i.Box,{as:"div",children:"None Stored"})]})},I=function(e){var t=e.clothes,n=e.act;return(0,o.createComponentVNode)(2,i.Section,{title:"Clothing",children:[" ",t.length>0?t.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{children:[e.name,(0,o.createComponentVNode)(2,d,{onClick:function(){return n("clothing-install",{clothingRef:e.ref})},icon:"plus-circle",color:"transparent",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,d,{onClick:function(){return n("clothing-eject",{clothingRef:e.ref})},icon:"eject",color:"transparent",tooltip:"Eject from station"})]},e.ref)})):(0,o.createComponentVNode)(2,i.Box,{as:"div",children:"None Stored"})]})},k=function(e){var t=e.cellData,n=e.act;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Power Cell",color:t?"white":"red",buttons:(0,o.createComponentVNode)(2,d,{onClick:function(){return n("cell-remove")},icon:"minus",tooltip:"Remove the occupant's power cell",disabled:!t}),children:[t&&(0,o.createComponentVNode)(2,w,{cellData:t}),!t&&(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:"No Power Cell Installed"})]})},w=function(e){var t=e.cellData,n=t.current/t.max;return(0,o.createComponentVNode)(2,i.Tooltip,{position:"bottom",content:Math.floor(t.current)+"/"+t.max,children:(0,o.createComponentVNode)(2,i.ProgressBar,{position:"relative",value:n,ranges:{good:[.5,Infinity],average:[.25,.5],bad:[-Infinity,.25]},children:[Math.floor(100*n),"%"]})})},S=function(e){var t=e.upgrades,n=e.upgrades_max,r=e.act,a="Upgrades ("+t.length+" / "+n+" installed)";return(0,o.createComponentVNode)(2,i.Section,{title:a,children:(0,o.createVNode)(1,"div",null,t.map((function(e){return(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,d,{compact:!0,icon:"minus-circle",color:"transparent",tooltip:"Remove "+e.name,onClick:function(){return r("upgrade-remove",{upgradeRef:e.ref})}})})]},e.ref)})),0)})},_=function(e){var t=e.tabIndex,n=e.data,r=e.act;switch(t){case 1:return(0,o.createComponentVNode)(2,s,{occupant:n.occupant,cabling:n.cabling,fuel:n.fuel,act:r});case 2:return(0,o.createComponentVNode)(2,i.Section,{title:"Supplies",children:[(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Welding Fuel",children:n.fuel}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Wire Cabling",children:n.cabling}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Self Service",children:[(0,o.createComponentVNode)(2,i.Button.Checkbox,{tooltip:"Toggle self-service.",checked:n.allow_self_service,disabled:n.viewer_is_robot,onClick:function(){return r("self-service")}})," ",n.allow_self_service?"Enabled":"Disabled"]})]}),(0,o.createComponentVNode)(2,y,{modules:n.modules,act:r}),(0,o.createComponentVNode)(2,x,{upgrades:n.upgrades,act:r}),(0,o.createComponentVNode)(2,V,{cells:n.cells,act:r}),(0,o.createComponentVNode)(2,I,{clothes:n.clothes,act:r})]})}}},89974:function(){},44616:function(e,t,n){"use strict";t.__esModule=!0,t.EmptyPlaceholder=void 0;var o=n(96323),r=n(1060),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=i(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var c=r?Object.getOwnPropertyDescriptor(e,a):null;c&&(c.get||c.set)?Object.defineProperty(o,a,c):o[a]=e[a]}o["default"]=e,n&&n.set(e,o);return o}(n(67044));function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(i=function(e){return e?n:t})(e)}var c=function(e){var t=e.children,n=e.className,i=(0,r.classes)([a.EmptyPlaceholder,n]);return(0,o.createVNode)(1,"div",i,t,0)};t.EmptyPlaceholder=c,c.defaultHooks=r.pureComponentHooks},94241:function(e,t,n){"use strict";t.__esModule=!0,t.ModuleDetail=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(5880),c=[{id:"brobocop",name:"Brobocop"},{id:"science",name:"Science"},{id:"civilian",name:"Civilian"},{id:"engineering",name:"Engineering"},{id:"medical",name:"Medical"},{id:"mining",name:"Mining"}];t.ModuleDetail=function(e,t){var n,u=e.onMoveToolDown,d=e.onMoveToolUp,s=e.onRemoveTool,p=e.onResetModule,m=e.tools,f=(0,r.useLocalState)(t,"selectedToolRef",undefined),h=f[0],g=f[1],C=h&&(null==(n=m.find((function(e){return e.ref===h})))?void 0:n.ref);h&&!C&&g(undefined);var N=(0,o.createComponentVNode)(2,l,{itemRef:C,onMoveDown:u,onMoveUp:d,onRemove:function(e){var t,n=m.findIndex((function(t){return t.ref===e}));g(null==(t=m[n+1])?void 0:t.ref),s(e)}});return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Reset",children:c.map((function(e){var t=e.id,n=e.name;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return p(t)},title:n,children:n},t)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Tools",buttons:N,children:(0,o.createComponentVNode)(2,i.Tools,{tools:m,selectedToolRef:C,onSelectTool:g})})})]})};var l=function(e){var t=e.onMoveDown,n=e.onMoveUp,r=e.onRemove,i=e.itemRef,c=!!i;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-up",disabled:!c,onClick:function(){return n(i)},title:"Move Up"}),(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-down",disabled:!c,onClick:function(){return t(i)},title:"Move Down"}),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",disabled:!c,onClick:function(){return r(i)},title:"Remove"})],4)}},5880:function(e,t,n){"use strict";t.__esModule=!0,t.Tools=void 0;var o=n(96323),r=n(26949),a=n(44616),i=function(e){var t=e.children,n=e.onClick,a=e.selected;return(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:n,selected:a,children:t})};t.Tools=function(e){var t=e.onSelectTool,n=e.selectedToolRef,c=e.tools,l=void 0===c?[]:c;return 0===l.length?(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"Module has no tools"}):(0,o.createComponentVNode)(2,r.Tabs,{vertical:!0,children:l.map((function(e){var r=e.name,a=e.ref;return(0,o.createComponentVNode)(2,i,{onClick:function(){return t(a)},selected:a===n,children:r},a)}))})}},25526:function(e,t,n){"use strict";t.__esModule=!0,t.ModuleView=void 0;var o=n(96323),r=n(26949),a=n(44616),i=n(94241);t.ModuleView=function(e){var t=e.modules,n=(t=void 0===t?{}:t).available,c=void 0===n?[]:n,l=t.selected,u=e.onEjectModule,d=e.onMoveToolDown,s=e.onMoveToolUp,p=e.onRemoveTool,m=e.onResetModule,f=e.onSelectModule,h=l||{},g=h.ref,C=h.tools,N=void 0===C?[]:C;return 0===c.length?(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"No modules inserted"})}):(0,o.createComponentVNode)(2,r.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,r.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,r.Section,{title:"Modules",scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,r.Tabs,{vertical:!0,children:c.map((function(e){var t=e.ref,n=e.name,a=(0,o.createComponentVNode)(2,r.Button,{icon:"eject",color:"transparent",onClick:function(){return u(t)},title:"Eject "+n});return(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:function(){return f(t)},rightSlot:a,selected:t===g,children:n},t)}))})})}),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:!0,children:g?(0,o.createComponentVNode)(2,i.ModuleDetail,{onMoveToolDown:function(e){return d(g,e)},onMoveToolUp:function(e){return s(g,e)},onRemoveTool:function(e){return p(g,e)},onResetModule:function(e){return m(g,e)},tools:N}):(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"No module selected"})})})]})}},83709:function(e,t,n){"use strict";t.__esModule=!0,t.selectModule=t.resetModule=t.removeTool=t.moveTool=t.ejectModule=void 0;var o=n(95502),r=function(e){return function(t,n){return t(e,n)}},a=r(o.Action.EjectModule);t.ejectModule=a;var i=r(o.Action.MoveTool);t.moveTool=i;var c=r(o.Action.RemoveTool);t.removeTool=c;var l=r(o.Action.ResetModule);t.resetModule=l;var u=r(o.Action.SelectModule);t.selectModule=u},85175:function(e,t,n){"use strict";t.__esModule=!0,t.CyborgModuleRewriter=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(25526),c=n(83709),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=d(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=r?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(o,a,i):o[a]=e[a]}o["default"]=e,n&&n.set(e,o);return o}(n(67044)),u=n(95502);function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(d=function(e){return e?n:t})(e)}t.CyborgModuleRewriter=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=n.data.modules;return(0,o.createComponentVNode)(2,a.Window,{width:670,height:640,children:(0,o.createComponentVNode)(2,a.Window.Content,{className:l.Block,children:(0,o.createComponentVNode)(2,i.ModuleView,{modules:s,onEjectModule:function(e){return(0,c.ejectModule)(d,{moduleRef:e})},onMoveToolDown:function(e,t){return(0,c.moveTool)(d,{dir:u.Direction.Down,moduleRef:e,toolRef:t})},onMoveToolUp:function(e,t){return(0,c.moveTool)(d,{dir:u.Direction.Up,moduleRef:e,toolRef:t})},onRemoveTool:function(e,t){return(0,c.removeTool)(d,{moduleRef:e,toolRef:t})},onResetModule:function(e,t){return(0,c.resetModule)(d,{moduleId:t,moduleRef:e})},onSelectModule:function(e){return(0,c.selectModule)(d,{moduleRef:e})}})})})}},67044:function(e,t,n){"use strict";t.__esModule=!0,t.EmptyPlaceholder=t.ToolLabel=t.ModuleView=t.Block=void 0;var o=n(88243),r="cyborg-module-rewriter-interface";t.Block=r;var a=(0,o.block)(r,"module-view");t.ModuleView=a;var i=(0,o.element)(a,"tool-label");t.ToolLabel=i;var c=(0,o.block)(r,"empty-placeholder");t.EmptyPlaceholder=c},95502:function(e,t){"use strict";var n,o;t.__esModule=!0,t.Direction=t.Action=void 0,t.Action=n,function(e){e.EjectModule="module-eject",e.MoveTool="tool-move",e.RemoveTool="tool-remove",e.ResetModule="module-reset",e.SelectModule="module-select"}(n||(t.Action=n={})),t.Direction=o,function(e){e.Up="up",e.Down="down"}(o||(t.Direction=o={}))},9299:function(e,t,n){"use strict";t.__esModule=!0,t.DJPanel=void 0;var o=n(96323),r=n(97622),a=n(1033),i=n(31246),c=n(26949),l=n(2381);t.DJPanel=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,s=d.loadedSound,m=d.adminChannel,f=d.preloadedSounds;return(0,o.createComponentVNode)(2,l.Window,{width:430,height:306,title:"DJ Panel",children:(0,o.createComponentVNode)(2,l.Window.Content,{children:[(0,o.createComponentVNode)(2,c.Section,{children:[(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createVNode)(1,"strong",null,"Active Soundfile: ",16),(0,o.createComponentVNode)(2,c.Button,{icon:s?"file-audio":"upload",selected:!s,content:s?(0,a.truncate)(s,38):"Upload",tooltip:s,onClick:function(){return r("set-file")}})]}),(0,o.createComponentVNode)(2,c.Divider),(0,o.createComponentVNode)(2,p)]}),(0,o.createComponentVNode)(2,c.Section,{children:(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{icon:"music",selected:s,disabled:!s,content:"Play Music",onClick:function(){return r("play-music")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"volume-up",selected:s,disabled:!s,content:"Play Sound",onClick:function(){return r("play-sound")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"record-vinyl",selected:s,disabled:!s,content:"Play Ambience",onClick:function(){return r("play-ambience")}}),(0,o.createComponentVNode)(2,c.Box,{as:"span",color:"grey",textAlign:"right",pl:1,children:[(0,o.createComponentVNode)(2,c.Icon,{name:"satellite"})," Channel: ",(0,o.createVNode)(1,"em",null,1024-m,0)]})]})}),(0,o.createComponentVNode)(2,c.Section,{children:[(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{content:"Play Remote",onClick:function(){return r("play-remote")}}),(0,o.createComponentVNode)(2,c.Button,{disabled:!s,content:"Play To Player",onClick:function(){return r("play-player")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{disabled:!s,content:"Preload Sound",onClick:function(){return r("preload-sound")}}),(0,o.createComponentVNode)(2,c.Button,{disabled:!Object.keys(f).length,content:"Play Preloaded Sound",onClick:function(){return r("play-preloaded")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{color:"yellow",content:"Toggle DJ Announcements",onClick:function(){return r("toggle-announce")}}),(0,o.createComponentVNode)(2,c.Button,{color:"yellow",content:"Toggle DJ For Player",onClick:function(){return r("toggle-player-dj")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{icon:"stop",color:"red",content:"Stop Last Sound",onClick:function(){return r("stop-sound")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"broadcast-tower",color:"red",content:"Stop The Radio For Everyone",onClick:function(){return r("stop-radio")}})]})]}),(0,o.createComponentVNode)(2,u)]})})};var u=function(e,t){if((0,i.useBackend)(t).data.announceMode)return(0,o.createComponentVNode)(2,c.NoticeBox,{info:!0,children:"Announce Mode Enabled"})},d=function(e){return(0,r.toFixed)(2*e)+"%"},s=function(e){return(0,r.toFixed)(100*e)+"%"},p=function(e,t){var n=(0,i.useBackend)(t),r=n.act,a=n.data,l=a.loadedSound,u=a.volume,p=a.frequency,m=function(e,t){return r("set-volume",{volume:t})},f=function(e,t){return r("set-freq",{frequency:t})};return(0,o.createComponentVNode)(2,c.Box,{children:(0,o.createComponentVNode)(2,c.LabeledControls,{children:[(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,c.NumberInput,{animated:!0,value:u,minValue:0,maxValue:100,format:d,onDrag:m})}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{children:[(0,o.createComponentVNode)(2,c.Knob,{minValue:0,maxValue:100,ranges:{primary:[20,80],average:[10,90],bad:[0,100]},value:u,format:d,onDrag:m}),(0,o.createComponentVNode)(2,c.Button,{icon:"sync-alt",top:"0.3em",content:"Reset",onClick:function(e,t){return r("set-volume",{volume:"reset"})}})]}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Frequency",children:(0,o.createComponentVNode)(2,c.NumberInput,{animated:!0,value:p,step:.1,minValue:-100,maxValue:100,format:s,onDrag:f})}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{children:[(0,o.createComponentVNode)(2,c.Knob,{disabled:!l,minValue:-100,maxValue:100,step:.1,stepPixelSize:.1,ranges:{primary:[-40,40],average:[-70,70],bad:[-100,100]},value:p,format:s,onDrag:f}),(0,o.createComponentVNode)(2,c.Button,{icon:"sync-alt",top:"0.3em",content:"Reset",onClick:function(e,t){return r("set-freq",{frequency:"reset"})}})]})]})})}},64640:function(e,t,n){"use strict";t.__esModule=!0,t.DisposalChute=void 0;var o,r=n(96323),a=n(31246),i=n(26949),c=n(2381),l=n(36814),u=n(9389),d=((o={})[u.DisposalChuteState.Off]={pumpColor:"bad",pumpText:"Inactive"},o[u.DisposalChuteState.Charging]={pumpColor:"average",pumpText:"Pressurizing"},o[u.DisposalChuteState.Charged]={pumpColor:"good",pumpText:"Ready"},o);t.DisposalChute=function(e,t){var n=(0,a.useBackend)(t),o=n.act,l=n.data,u=l.name,p=l.destinations,m=void 0===p?null:p,f=l.destinationTag,h=l.flush,g=l.mode,C=l.pressure,N=d[g],v=N.pumpColor,b=N.pumpText;return(0,r.createComponentVNode)(2,c.Window,{title:u,width:355,height:m?350:140,children:(0,r.createComponentVNode)(2,c.Window.Content,{className:"disposal-chute-interface",scrollable:!!m,children:[(0,r.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.LabeledList,{children:(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Pressure"})})}),(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[1,Infinity],average:[.75,1],bad:[-Infinity,.75]},value:C})})]}),(0,r.createComponentVNode)(2,i.Divider),(0,r.createComponentVNode)(2,i.LabeledList,{children:[(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Air Pump",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"power-off",content:g?"Enabled":"Disabled",color:g?"green":"red",onClick:function(){return o("togglePump")}}),children:(0,r.createComponentVNode)(2,i.Box,{color:v,children:b})}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Chute Handle",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:m?"envelope":"trash-alt",content:h?"Flushing":"Flush",color:h?"":"red",onClick:function(){return o("toggleHandle")}}),children:(0,r.createComponentVNode)(2,i.Button,{content:"Eject Contents",icon:"eject",onClick:function(){return o("eject")}})})]}),!!m&&(0,r.createFragment)([(0,r.createComponentVNode)(2,i.Divider),(0,r.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.LabeledList,{children:(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"search",content:"Rescan",onClick:function(){return o("rescanDest")}}),children:f})})}),(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,s,{destinations:m,destinationTag:f})})]})],4)]})})};var s=function(e,t){var n=e.destinations,o=void 0===n?[]:n,i=e.destinationTag,c=void 0===i?null:i,u=(0,a.useBackend)(t).act,d=(0,a.useLocalState)(t,"searchText",""),s=d[0],p=d[1],m=o.filter((function(e){return e.includes(s)}));return(0,r.createComponentVNode)(2,l.ListSearch,{autoFocus:!0,currentSearch:s,onSearch:p,onSelect:function(e){return u("select-destination",{destination:e})},options:m,selectedOption:c})}},9389:function(e,t){"use strict";var n;t.__esModule=!0,t.DisposalChuteState=void 0,t.DisposalChuteState=n,function(e){e[e.Off=0]="Off",e[e.Charging=1]="Charging",e[e.Charged=2]="Charged"}(n||(t.DisposalChuteState=n={}))},84430:function(e,t,n){"use strict";t.__esModule=!0,t.DoorTimer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.DoorTimer=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:260,height:u.flasher?279:207,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,justify:"stretch",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Timer",fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledControls,{justify:"start",children:[(0,o.createComponentVNode)(2,a.LabeledControls.Item,{label:"Time",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,minValue:0,maxValue:u.maxTime,value:u.time,format:function(e){return(0,i.formatTime)(10*e)},onDrag:function(e,t){return l("set-time",{time:t})},onChange:function(e,t){return l("set-time",{time:t,finish:!0})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.TimeDisplay,{value:10*u.time,timing:u.timing,format:i.formatTime})})]})}),(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("toggle-timing")},children:u.timing?"Stop":"Start"})})]})})}),!!u.flusher&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Floor Flusher",fill:!0,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("toggle-flusher")},backgroundColor:u.opening?"orange":undefined,children:u.opening?u.flusheropen?"Opening...":"Closing...":u.flusheropen?"Close Flusher":"Open Flusher"})})}),!!u.flasher&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Flasher",fill:!0,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("activate-flasher")},backgroundColor:u.recharging?"orange":undefined,children:["Flash Cell ",!!u.recharging&&"(Recharging)"]})})})]})})})}},9494:function(){},29259:function(e,t,n){"use strict";t.__esModule=!0,t.DyeDispenser=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(21018),l=n(89295),u="#FFFFFF";t.DyeDispenser=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=n.data,p=s.bottle,m=s.uses_left,f=s.bottle_color,h=p&&m>0,g=(0,r.useLocalState)(t,"color_picker_choice",(0,l.hexToHsva)(f||u)),C=g[0],N=g[1];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:340,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Stack,{mb:1,textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("fillb",{selectedColor:(0,l.hsvaToHex)(C)})},children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:(0,l.hsvaToHex)(C),mr:1}),"Fill"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("emptyb",{})},icon:"broom",disabled:!h,children:"Empty"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("eject",{})},icon:"eject",children:"Eject"})})]}),(0,o.createComponentVNode)(2,c.ColorSelector,{color:C,setColor:N,defaultColor:f||u}),!p&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,onClick:function(){return d("insertb",{})},icon:"eject",children:"Insert Dye Bottle"})})]})})}},87339:function(e,t,n){"use strict";t.__esModule=!0,t.Elevator=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949);t.Elevator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.location,d=l.active;return(0,o.createComponentVNode)(2,a.Window,{theme:"ntos",width:400,height:130,children:(0,o.createComponentVNode)(2,a.Window.Content,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Section,{width:"70%",mx:"auto",children:["Location: ",(0,o.createVNode)(1,"em",null,u,0)]}),(0,o.createComponentVNode)(2,i.Section,{width:"70%",mx:"auto",fontSize:"16px",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("send",{})},enabled:!d,color:d?"grey":"green",icon:"elevator",fluid:!0,children:d?"Moving":"Move Elevator"})})]})})}},20316:function(e,t,n){"use strict";t.__esModule=!0,t.EngineStats=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(818),u=function(e){return Object.entries(e).map((function(e,t){var n=e[0],r=e[1];return(0,o.createComponentVNode)(2,a.Stack.Item,{mt:.5,ml:0===t?1:undefined,children:[(0,o.createComponentVNode)(2,a.Box,{children:[n.split("|")[0],":\xa0",0===r[r.length-1][1]?"No Data":(0,c.formatSiUnit)(r[r.length-1][1],0,n.split("|")[1])]}),(0,o.createComponentVNode)(2,a.Chart.Line,{height:"3.5em",width:"20em",data:r,rangeX:[0,r.length-1],rangeY:[0,(0,l.getStatsMax)(r)],strokeColor:"\trgba(55,170,25, 1)",fillColor:"rgba(55,170,25, 0.25)"})]},n)}))};t.EngineStats=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,s=d.turnedOn,p=d.tegData,m=d.chamberData,f=(0,l.processStatsData)(p),h=(0,l.processStatsData)(m);return(0,o.createComponentVNode)(2,i.Window,{height:"560",width:"760",theme:"retro-dark",title:"Engine Statistics",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:s&&f&&h?(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{children:["TEG Data",(0,o.createComponentVNode)(2,a.Button,{tooltip:"Power",icon:"power-off",color:"caution",position:"absolute",right:.25,top:.25,onClick:function(){return c("toggle-power")}})]}),children:(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",justify:"space-around",ml:-1,children:u(f)})}),(0,o.createComponentVNode)(2,a.Section,{title:"Combustion Chamber Data",children:(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",justify:"space-around",ml:-1,children:u(h)})})]}):(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:20,height:5,fontSize:2,fontFamily:"Courier",children:["POWER ON",(0,o.createComponentVNode)(2,a.Button,{tooltip:"Power",icon:"power-off",selected:s,color:"caution",ml:3,onClick:function(){return c("toggle-power")}})]})})})}},65203:function(e,t,n){"use strict";t.__esModule=!0,t.EspressoMachine=t.DrinkContainer=t.ReagentBlocks=t.ContainerButtons=t.DrinksList=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.drinks;return(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{m:"2px",fontSize:"1.4rem",backgroundColor:"brown",textAlign:"center",onClick:function(){return n("pour",{drink_name:e})},children:e},e)},e)}))})};t.DrinksList=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.index;return(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",color:"blue",title:"Eject",mr:"10px",onClick:function(){return n("eject",{cup_index:i})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"red",title:"Flush All",onClick:function(){return n("flush",{cup_index:i})}})]})})};t.ContainerButtons=l;var u=function(e){var t=e.capacity,n=e.total,r=e.reagents;return(0,o.createComponentVNode)(2,a.Flex,{mt:"5px",children:[r.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:e.amount/t,children:(0,o.createComponentVNode)(2,a.Tooltip,{content:e.name+" ("+e.amount+"u)",position:"bottom",children:(0,o.createComponentVNode)(2,a.Box,{width:"100%",height:"30px",px:0,my:0,backgroundColor:e.colour})})},e.name)})),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:(t-n)/t,children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Nothing ("+(t-n)+"u)",position:"bottom",children:(0,o.createComponentVNode)(2,a.NoticeBox,{width:"100%",height:"30px",px:0,my:0,backgroundColor:"rgba(0, 0, 0, 0)"})})},"nothing")]})};t.ReagentBlocks=u;var d=function(e,t){(0,r.useBackend)(t).act;var n=e.cup;return(0,o.createComponentVNode)(2,a.Flex,{direction:"column",mt:"10px",children:[(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,l,{index:n.index}),(0,o.createComponentVNode)(2,a.Box,{as:"span",fontSize:"1.3rem",ml:"15px",children:n.total+" / "+n.capacity})]}),(0,o.createComponentVNode)(2,u,{capacity:n.capacity,total:n.total,reagents:n.reagents})]})};t.DrinkContainer=d;t.EspressoMachine=function(e,t){var n=(0,r.useBackend)(t).data,l=n.drinks,u=n.containers.map((function(e){return{capacity:e.capacity,index:e.index,total:e.reagents.reduce((function(e,t){return e+t[1]}),0),reagents:e.reagents.map((function(e){return{name:e[0],amount:e[1],colour:"rgb("+e[2]+","+e[3]+","+e[4]+")"}}))}}));return(0,o.createComponentVNode)(2,i.Window,{title:"Espresso Machine",width:500,height:400,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Drinks",children:(0,o.createComponentVNode)(2,c,{drinks:l})}),(0,o.createComponentVNode)(2,a.Section,{title:"Cups",children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:u.map((function(e){return(0,o.createComponentVNode)(2,d,{cup:e},e.index)}))})})]})})}},53600:function(e,t,n){"use strict";t.__esModule=!0,t.Filteriffic=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1397),l=n(97622),u=n(97622),d=["type","priority"];var s=function(e,t){var n=e.value,i=e.name,c=e.filterName,l=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:-500,maxValue:500,stepPixelSize:5,width:"39px",onDrag:function(e,t){var n;return l("modify_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}})},p=function(e,t){var n=e.value,i=e.name,c=e.filterName,d=(0,r.useBackend)(t).act,s=(0,r.useLocalState)(t,c+"-"+i,.01),p=s[0],m=s[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:-500,maxValue:500,stepPixelSize:4,step:p,format:function(e){return(0,l.toFixed)(e,(0,u.numberOfDecimalDigits)(p))},width:"80px",onDrag:function(e,t){var n;return d("transition_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,ml:2,mr:1,children:"Step:"}),(0,o.createComponentVNode)(2,a.NumberInput,{value:p,step:.001,format:function(e){return(0,l.toFixed)(e,4)},width:"70px",onChange:function(e,t){return m(t)}})],4)},m=function(e,t){var n=e.value,i=e.name,c=e.filterName,l=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Input,{value:n,width:"250px",onInput:function(e,t){var n;return l("modify_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}})},f=function(e,t){var n=e.value,i=e.name,c=e.filterName,u=(0,r.useBackend)(t).act,d=n;return null===d&&(d=Array(1,0,0,0,1,0)),(0,o.createFragment)([(0,o.createTextVNode)("Matrix:"),(0,o.createComponentVNode)(2,a.Stack,{children:[0,1,2].map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[0,1,2].map((function(t,n){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:[2===e&&t<2&&0,2===e&&2===t&&1,e<2&&(0,o.createComponentVNode)(2,a.NumberInput,{inline:!0,value:d[3*e+t],step:.01,width:"50px",format:function(e){return(0,l.toFixed)(e,2)},onDrag:function(n,o){var r,a=d;a[3*e+t]=o,u("transition_filter_value",{name:c,new_data:(r={},r[i]=a,r)})}})]},n)}))})},t)}))})],4)},h=function(e,t){var n=e.value,i=e.filterName,c=e.name,u=(0,r.useBackend)(t).act,d=["r","g","b","a","c"];if(Array.isArray(n)){var s=n;if(s.length<20){for(;s.length<12;)s.push(0);for(s=Array(s[0],s[1],s[2],0,s[3],s[4],s[5],0,s[6],s[7],s[8],0,0,0,0,1,s[9],s[10],s[11],0);s.length<20;)s.push(0)}return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:i})}}),(0,o.createComponentVNode)(2,a.Stack,{children:[0,1,2,3].map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[0,1,2,3,4].map((function(t,n){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,textColor:"label",width:"2.1rem",children:""+d[t]+d[e]+":"}),(0,o.createComponentVNode)(2,a.NumberInput,{inline:!0,value:s[4*t+e],step:.01,width:"50px",format:function(e){return(0,l.toFixed)(e,2)},onDrag:function(n,o){var r,a=s;a[4*t+e]=o,u("transition_filter_value",{name:i,new_data:(r={},r[c]=a,r)})}})]},n)}))})},t)}))})],4)}return(0,o.createFragment)([n.type,(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:i})}}),(0,o.createComponentVNode)(2,a.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,a.Input,{value:n,width:"90px",onInput:function(e,t){var n;return u("transition_filter_value",{name:i,new_data:(n={},n[c]=t,n)})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Convert to color matrix",onClick:function(){return u("convert_color_value_matrix",{name:i})}})],0)},g=function(e,t){var n=e.value,i=e.filterName,c=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return c("modify_icon_value",{name:i})}}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,ml:1,children:n})],4)},C=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].flags;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i&e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=i^e,t)})}})}))(p)},N=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].space;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i===e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=e,t)})}})}))(p)},v=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].blend_mode;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i===e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=e,t)})}})}))(p)},b=function(e,t){var n=e.name,r=(e.value,e.hasValue),i=(e.filterName,{int:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),float:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),string:(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e))),color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({},e))),icon:(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e))),flags:(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e))),space:(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),blendmode:(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e))),matrix:(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))});return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:n,children:[i[{x:"float",y:"float",icon:"icon",render_source:"string",flags:"flags",size:"float",color:"color",offset:"float",radius:"float",space:"space",falloff:"float",density:"int",threshold:"float",factor:"float",repeat:"int",transform:"matrix",blend_mode:"blendmode"}[n]]||"Not Found (This is an error)"," ",!r&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"average",children:"(Default)"})]})},V=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.name,u=e.filterDataEntry,s=u.type,p=u.priority,m=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(u,d),f=c.filter_info,h=Object.keys(f[s].defaults);return(0,o.createComponentVNode)(2,a.Collapsible,{title:l+" ("+s+")",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NumberInput,{value:p,stepPixelSize:10,width:"60px",onChange:function(e,t){return i("change_priority",{name:l,new_priority:t})}}),(0,o.createComponentVNode)(2,a.Button.Input,{content:"Rename",placeholder:l,onCommit:function(e,t){return i("rename_filter",{name:l,new_name:t})},width:"90px"}),(0,o.createComponentVNode)(2,a.Button.Confirm,{icon:"minus",onClick:function(){return i("remove_filter",{name:l})}})],4),children:(0,o.createComponentVNode)(2,a.Section,{level:2,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:h.map((function(e){var t=f[s].defaults,n=m[e]||t[e],r=n!==t[e];return(0,o.createComponentVNode)(2,b,{filterName:l,filterType:s,name:e,value:n,hasValue:r},e)}))})})})};t.Filteriffic=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.target_name||"Unknown Object",s=u.target_filter_data||{},p=s!=={},m=u.filter_info,f=(0,r.useLocalState)(t,"massApplyPath",""),h=f[0],g=f[1],C=(0,r.useLocalState)(t,"hidden",!1),N=C[0],v=C[1];return(0,o.createComponentVNode)(2,i.Window,{width:500,height:500,title:"Filteriffic",resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"DO NOT MESS WITH EXISTING FILTERS IF YOU DO NOT KNOW THE CONSEQUENCES. YOU HAVE BEEN WARNED."}),(0,o.createComponentVNode)(2,a.Section,{title:N?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{mr:.5,inline:!0,children:"MASS EDIT:"}),(0,o.createComponentVNode)(2,a.Input,{value:h,width:"100px",onInput:function(e,t){return g(t)}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{content:"Apply",confirmContent:"ARE YOU SURE?",onClick:function(){return l("mass_apply",{path:h})}})],4):(0,o.createComponentVNode)(2,a.Box,{inline:!0,onDblClick:function(){return v(!0)},children:d}),buttons:(0,o.createComponentVNode)(2,a.Dropdown,{icon:"plus",displayText:"Add Filter",nochevron:!0,options:Object.keys(m),onSelected:function(e){return l("add_filter",{name:"default",priority:10,type:e})}}),children:p?(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,V,{filterDataEntry:e,name:t},t)}))(s):(0,o.createComponentVNode)(2,a.Box,{children:"No filters"})})]})})}},21980:function(e,t,n){"use strict";t.__esModule=!0,t.Flamethrower=void 0;var o=n(96323),r=n(31246),a=n(41161),i=n(26949),c=n(51418),l=n(48175),u=n(2381),d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.lit,c=e.maxTemp,u=e.minTemp,d=e.sprayTemp;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Pilot Light",children:(0,o.createComponentVNode)(2,i.Stack,{justify:"center",align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"fire",color:a?"orange":null,iconColor:a?"yellow":null,onClick:function(){return n("light")},align:"center",width:"5em",fontSize:1.25,children:a?"Lit":"Unlit"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:d,minValue:u,maxValue:c,format:function(e){return Math.floor(e-l.freezeTemperature)+" C"},onChange:function(e,t){return n("change_temperature",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,l.getTemperatureColor)(d),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Temperature"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(d),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.floor(d-l.freezeTemperature)}),"C"]})})]})})},s=function(e,t){var n=(0,r.useBackend)(t).act,a=e.mode,c=e.minVolume,l=e.maxVolume,u=e.chamberVolume;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Fuel Control",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:["Fire mode: ",(0,o.createComponentVNode)(2,i.Button,{selected:"auto"===a,onClick:function(){return n("change_mode",{mode:"auto"})},children:"Full Auto"}),(0,o.createComponentVNode)(2,i.Button,{selected:"burst"===a,onClick:function(){return n("change_mode",{mode:"burst"})},children:"Wide Burst"}),(0,o.createComponentVNode)(2,i.Button,{selected:"semi_auto"===a,onClick:function(){return n("change_mode",{mode:"semi_auto"})},children:"Semi Auto"})]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:["Chamber volume: ",(0,o.createComponentVNode)(2,i.NumberInput,{value:u,minValue:c,maxValue:l,onChange:function(e,t){return n("change_volume",{volume:t})}})]})]})})};t.Flamethrower=function(e,t){var n=(0,r.useBackend)(t),l=n.act,p=n.data,m=p.gasTank,f=p.fuelTank;return(0,o.createComponentVNode)(2,u.Window,{width:580,height:270,theme:"ntos",title:"Flamethrower",children:(0,o.createComponentVNode)(2,u.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{justify:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"21em",children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},p)))}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},p)))})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"21em",children:(0,o.createComponentVNode)(2,a.PortableHoldingTank,{title:"Gas Tank",holding:m,onEjectTank:function(){return l("remove_gas")}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Fuel Tank",fill:!0,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!f,onClick:function(){return l("remove_fuel")}}),children:f&&(0,o.createComponentVNode)(2,c.ReagentBar,{container:f,height:"5em"})})})]})})]})})})}},72758:function(e,t,n){"use strict";t.__esModule=!0,t.FlockPanel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.partitions;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",height:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"20%",height:"100%",children:(0,o.createComponentVNode)(2,a.Section,{align:"center",height:"100%",children:e.name})}),(0,o.createComponentVNode)(2,a.Stack.Item,{height:"100%",grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.host&&(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Icon,{name:"wifi",size:3})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.host}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health,(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})]})]})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{height:"100%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:[e.host&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("eject_trace",{origin:e.ref})},children:"Eject"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("promote_trace",{origin:e.ref})},children:"Promote sentience"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("delete_trace",{origin:e.ref})},children:"Remove sentience"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},l={thinking:"brain",shooting:"bolt",rummaging:"dumpster",wandering:"route",building:"hammer",nesting:"hammer",harvesting:"cogs",controlled:"wifi",replicating:"egg",rallying:"map-marker","opening container":"box-open",butchering:"recycle",repairing:"tools",capturing:"bars",depositing:"border-style",observing:"eye",deconstructing:"trash",hibernating:"stop-circle"},u=function(e,t){var n=(0,r.useBackend)(t).act,i=e.drones,c=e.sortBy;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.sort((function(e,t){return function(e,t,n){return isNaN(e[n])||isNaN(t[n])?(""+e[n]).localeCompare(t[n]):t[n]-e[n]}(e,t,c)})).map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"20%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health,(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})," ",e.resources,(0,o.createComponentVNode)(2,a.Icon,{name:"cog"})]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50px",children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(r=e.task,i=l[r],i?(0,o.createComponentVNode)(2,a.Icon,{size:3,name:i}):"")})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createVNode)(1,"b",null,e.area,0)," ",(0,o.createVNode)(1,"br")," ",e.task&&(t=e.task,t.charAt(0).toUpperCase()+t.slice(1))]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:["controlled"===e.task&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("eject_trace",{origin:e.controller_ref})},children:"Eject Trace"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("rally",{origin:e.ref})},children:"Rally"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref);var t,r,i}))})},d=function(e,t){var n=(0,r.useBackend)(t).act,i=e.structures;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"30%",children:(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:e.desc,children:(0,o.createComponentVNode)(2,a.Section,{position:"relative",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health," ",(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})]})]})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.compute>0&&"Compute provided: "+e.compute})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:["Construction Tealprint"===e.name&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("cancel_tealprint",{origin:e.ref})},children:"Cancel"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},s=function(e,t){var n=(0,r.useBackend)(t).act,i=e.enemies;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"30%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.name})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createVNode)(1,"b",null,e.area,0)})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"times",onClick:function(){return n("remove_enemy",{origin:e.ref})},children:"Remove"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},p=function(e,t){var n=e.stats;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:n.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{width:"100%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"left",children:(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.name," ",e.value]})})})})})},e.name)}))})};t.FlockPanel=function(e,t){var n=(0,r.useBackend)(t),l=n.data,m=n.act,f=(0,r.useLocalState)(t,"sortBy","resources"),h=f[0],g=f[1],C=l.vitals,N=l.partitions,v=l.drones,b=l.structures,V=l.enemies,y=l.stats,x=l.category_lengths,I=l.category;return(0,o.createComponentVNode)(2,i.Window,{theme:"flock",title:"Flockmind "+C.name,width:600,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"drones"===I,onClick:function(){m("change_tab",{tab:"drones"})},children:["Drones ","("+x.drones+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"traces"===I,onClick:function(){m("change_tab",{tab:"traces"})},children:["Partitions ","("+x.traces+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"structures"===I,onClick:function(){m("change_tab",{tab:"structures"})},children:["Structures ","("+x.structures+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"enemies"===I,onClick:function(){m("change_tab",{tab:"enemies"})},children:["Enemies ","("+x.enemies+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"stats"===I,onClick:function(){m("change_tab",{tab:"stats"})},children:"Stats"})]}),"drones"===I&&(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Dropdown,{options:["name","health","resources","area"],selected:"resources",onSelected:function(e){return g(e)}}),(0,o.createComponentVNode)(2,u,{drones:v,sortBy:h})]}),"traces"===I&&(0,o.createComponentVNode)(2,c,{partitions:N}),"structures"===I&&(0,o.createComponentVNode)(2,d,{structures:b}),"enemies"===I&&(0,o.createComponentVNode)(2,s,{enemies:V}),"stats"===I&&(0,o.createComponentVNode)(2,p,{stats:y})]})})}},57576:function(e,t,n){"use strict";t.__esModule=!0,t.FlockStructures=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.FlockStructures=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.structures);return(0,o.createComponentVNode)(2,i.Window,{title:"Flock structures",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:c.map((function(e){var t=e.name,n=e.icon,r=e.description,i=e.cost;return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:9,children:(0,o.createComponentVNode)(2,a.Section,{align:"center",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:t}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,height:"64px",width:"64px",src:"data:image/png;base64,"+n})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:29,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:r}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:!!i&&"Cost: "+i})]})})})]})},t)}))})})})}},11653:function(e,t,n){"use strict";t.__esModule=!0,t.Freezer=void 0;var o=n(96323),r=n(31246),a=n(48175),i=n(26949),c=n(2381),l=n(1033);t.Freezer=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.target_temperature,p=d.active,m=d.air_temperature,f=d.air_pressure;return(0,o.createComponentVNode)(2,c.Window,{title:"Freezer",width:320,height:215,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Temperature Control",children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:s,minValue:73.15,maxValue:293.15,format:function(e){return e+" K"},onDrag:function(e,t){return u("set_target_temperature",{value:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,overflow:"hidden",children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,a.getTemperatureColor)(s),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Target"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,a.getTemperatureIcon)(s),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{basis:9.6,align:"center",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",color:0===p?"red":"green",fluid:!0,height:"100%",fontSize:1.15,textAlign:"center",onClick:function(){return u("active_toggle")},children:0===p?"Deactivated":"Activated"})})]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,width:"50%",fontSize:1.3,color:(0,a.getTemperatureColor)(m),children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Current Temperature"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,a.getTemperatureIcon)(m),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:m})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{nowrap:!0,p:1,width:"50%",fontSize:1.3,children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Current Pressure"}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:(0,l.formatPressure)(f)})]})})]})})]})})}},6482:function(e,t,n){"use strict";t.__esModule=!0,t.Gameclock=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.Gameclock=function(e,t){var n=(0,r.useBackend)(t).data.clockStatic.name,c=(0,r.useLocalState)(t,"configModalOpen",!1)[0],d=(0,r.useLocalState)(t,"swap",!1)[0],f=(0,r.useLocalState)(t,"helpModalOpen",!1),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,i.Window,{title:n,width:220,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{className:"gameclock__window",fitted:!0,children:[c&&(0,o.createComponentVNode)(2,l),h&&(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,a.Box,{className:"gameclock__help",children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__helpbutton",tooltip:h?"Close":"Help",icon:h?"xmark":"question",color:h&&"orange",onClick:!c&&function(){g(!h)}})}),(0,o.createComponentVNode)(2,s,{team:d?"white":"black"}),(0,o.createComponentVNode)(2,p,{team:d?"white":"black"}),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,p,{team:d?"black":"white"}),(0,o.createComponentVNode)(2,s,{team:d?"black":"white"})]})})};var l=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=i.clockStatic.defaultTime,u=(0,r.useLocalState)(t,"configModalOpen",!1)[1],s=(0,r.useLocalState)(t,"whiteTimeBuffer",0),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"blackTimeBuffer",0),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,a.Dimmer,{className:"gameclock__configmodal",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time (White)",children:(0,o.createComponentVNode)(2,d,{team:"white"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time (Black)",children:(0,o.createComponentVNode)(2,d,{team:"black"})})]}),(0,o.createComponentVNode)(2,a.Box,{className:"gameclock__configmodalbuttoncontainer",children:[(0,o.createComponentVNode)(2,a.Button,{content:"Reset to default",onClick:function(){m(l),g(l)}}),(0,o.createComponentVNode)(2,a.Button,{content:"Apply",onClick:function(){u(!1),c("set_time",{whiteTime:10*p,blackTime:10*h})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Cancel",onClick:function(){return u(!1)}})]})]})},u=function(){return(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createVNode)(1,"p",null,(0,o.createVNode)(1,"strong",null,"Help",16),2),(0,o.createVNode)(1,"p",null,"These clocks are used in two-player games where the players move in turns.",16),(0,o.createVNode)(1,"p",null,"Click on the clock face corresponding to your color to end your turn.",16),(0,o.createVNode)(1,"p",null,"The time value (in seconds) for each clock can be set using the Clocks Setup button.",16),(0,o.createVNode)(1,"p",null,"Before starting the clock, ensure that the Current Turn is set to the correct side.",16),(0,o.createVNode)(1,"p",null,"The positions of the White and Black clocks can be swapped on your client using the rotate view button.",16)]})})},d=function(e,t){var n=(0,r.useBackend)(t).data.clockStatic,i=n.minTime,l=n.maxTime,u=e.team,d=(0,r.useLocalState)(t,"whiteTimeBuffer",0),s=d[0],p=d[1],m=(0,r.useLocalState)(t,"blackTimeBuffer",0),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,a.NumberInput,{onDrag:function(e,t){"white"===u?p(t):h(t)},format:function(e){return(0,c.formatTime)(10*e)},value:"white"===u?s:f,minValue:i,maxValue:l,step:15,stepPixelSize:2})},s=function(e,t){var n=e.team;return(0,o.createComponentVNode)(2,a.Stack,{direction:"column",children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"white"===n?"White":"Black",children:(0,o.createComponentVNode)(2,a.Icon,{className:"gameclock__teamicon",name:"circle"+("white"===n?"":"-o")})})})},p=function(e,t){var n=(0,r.useBackend)(t),i=n.data,l=n.act,u=e.team;return(0,o.createComponentVNode)(2,a.Stack,{direction:"column",fill:!0,className:"gameclock__sidepart",children:(0,o.createComponentVNode)(2,a.Button,{color:"orange",disabled:!i.timing||(i.turn?"black"===u:"white"===u),className:"gameclock__timebutton",onClick:function(){return l("end_turn")},children:(0,o.createComponentVNode)(2,a.Stack,{className:"gameclock__timeflex",children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:"white"===u?i.whiteTime:i.blackTime,format:function(e){return(0,c.formatTime)(10*e)}})})})})},m=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useLocalState)(t,"configModalOpen",!1)[1],u=(0,r.useLocalState)(t,"whiteTimeBuffer",0)[1],d=(0,r.useLocalState)(t,"blackTimeBuffer",0)[1],s=(0,r.useLocalState)(t,"swap",!1),p=s[0],m=s[1];return(0,o.createComponentVNode)(2,a.Stack,{direction:"row",className:"gameclock__mid",children:[(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:i.timing,tooltip:"Clocks Setup",tooltipPosition:"top",icon:"cog",onClick:function(){l(!0),u(i.whiteTime),d(i.blackTime)}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:i.timing,tooltip:"Current Turn: "+(i.turn?"White":"Black"),tooltipPosition:"top",icon:"flag",color:i.turn?"white":"black",onClick:function(){return c("set_turn")}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:0===i.whiteTime||0===i.blackTime,tooltip:i.timing?"Pause":"Unpause",tooltipPosition:"top",icon:i.timing?"pause":"play",color:i.timing?"orange":"",onClick:function(){return c("toggle_timing")}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",tooltip:"Rotate view",tooltipPosition:"top",icon:"rotate",onClick:function(){return m(!p)}})})]})}},69658:function(){},16484:function(e,t,n){"use strict";t.__esModule=!0,t.Detonator=void 0;var o=n(96323),r=n(26949),a=n(41834);t.Detonator=function(e){var t=e.detonator,n=e.detonatorAttachments,a=e.onToggleAnchor,l=e.onToggleSafety,u=e.onWireInteract,d=e.onPrimeDetonator,s=e.onTriggerActivate,p=e.onSetTimer;return(0,o.createComponentVNode)(2,r.Section,{title:"Detonator",children:[(0,o.createComponentVNode)(2,i,{detonator:t,onWireInteract:u,onSetTimer:p}),(0,o.createComponentVNode)(2,r.Divider),(0,o.createComponentVNode)(2,c,{detonator:t,detonatorAttachments:n,onToggleAnchor:a,onToggleSafety:l,onPrimeDetonator:d,onTriggerActivate:s})]})};var i=function(e){var t=e.detonator,n=(t=void 0===t?{}:t).wireNames,i=t.wireStatus,c=t.time,l=t.isPrimed,u=e.onWireInteract,d=e.onSetTimer;return(0,o.createComponentVNode)(2,r.Flex,{children:[(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,r.LabeledList,{children:n.map((function(e,t){return(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:e,children:(0,o.createComponentVNode)(2,r.Box,{height:1.7,children:i&&i[t]?(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Button,{icon:"cut",content:"Cut",onClick:function(){return u("cut",t)}}),(0,o.createComponentVNode)(2,r.Button,{icon:"bolt",content:"Pulse",onClick:function(){return u("pulse",t)}})],4):(0,o.createComponentVNode)(2,r.Box,{color:"average",minHeight:1.4,children:"Cut"})})},e+t)}))})}),(0,o.createComponentVNode)(2,r.Flex.Item,{mr:2,mt:2,children:(0,o.createComponentVNode)(2,r.Flex,{direction:"column",align:"center",children:[(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,a.DetonatorTimer,{time:c,isPrimed:l})}),(0,o.createComponentVNode)(2,r.Flex.Item,{children:[(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"fast-backward",onClick:function(){return d(c-300)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"backward",onClick:function(){return d(c-10)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"forward",onClick:function(){return d(c+10)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"fast-forward",onClick:function(){return d(c+300)}})]})]})})]})},c=function(e){var t=e.detonator,n=(t=void 0===t?{}:t).isAnchored,a=t.trigger,i=t.safetyIsOn,c=t.isPrimed,l=e.detonatorAttachments,u=e.onToggleAnchor,d=e.onToggleSafety,s=e.onPrimeDetonator,p=e.onTriggerActivate;return(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Anchor Status",children:n?"Anchored. There are no controls for undoing this.":(0,o.createComponentVNode)(2,r.Button,{icon:"anchor",content:"Anchor",onClick:u})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Trigger",children:a?(0,o.createComponentVNode)(2,r.Button,{onClick:p,children:a}):"There is no trigger attached."}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Safety",children:i?(0,o.createComponentVNode)(2,r.Button,{color:"average",icon:"power-off",content:"Turn Off",onClick:d}):(0,o.createComponentVNode)(2,r.Box,{color:"average",children:"Off"})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Arming",children:i?"The safety is on, therefore, you cannot prime the bomb.":c?(0,o.createComponentVNode)(2,r.Box,{bold:!0,color:"red",children:"PRIMED"}):(0,o.createComponentVNode)(2,r.Button,{color:"danger",icon:"bomb",content:"Prime",onClick:s})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Attachments",className:"gas-canister-detonator-utility__list-item",children:l&&l.length>0?l.map((function(e,t){return(0,o.createComponentVNode)(2,r.Box,{className:"gas-canister-detonator-utility__attachment-item",children:l[t]},e+t)})):"There are no additional attachments to the detonator."})]})}},41834:function(e,t,n){"use strict";t.__esModule=!0,t.DetonatorTimer=void 0;var o=n(96323),r=n(26949),a=n(1033);t.DetonatorTimer=function(e){var t=e.time,n=e.isPrimed,i=e.warningThreshold,c=void 0===i?300:i,l=e.dangerThreshold,u=void 0===l?100:l,d=e.explosionMessage,s=void 0===d?"BO:OM":d,p="green";return t<=u?p="red":t<=c&&(p="orange"),(0,o.createComponentVNode)(2,r.Box,{p:1,textAlign:"center",backgroundColor:"black",color:p,maxWidth:"90px",width:"90px",fontSize:"20px",children:(0,o.createComponentVNode)(2,r.TimeDisplay,{value:t,timing:n,format:function(e){return(0,a.formatTime)(e,s)}})})}},52709:function(e,t,n){"use strict";t.__esModule=!0,t.GasCanister=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=n(75015),u=n(69412),d=n(16484);function s(e,t){return s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},s(e,t)}t.GasCanister=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data,m=s.connected,f=s.holding,h=s.hasValve,g=s.valveIsOpen,C=s.pressure,N=s.maxPressure,v=s.releasePressure,b=s.minRelease,V=s.maxRelease,y=s.detonator,x=s.detonatorAttachments,I=s.hasPaper,k=!!y;return(0,o.createComponentVNode)(2,i.Window,{width:k?I?880:470:305,height:k?685:340,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{width:"480px",children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:m,pressure:C,maxPressure:N,children:[(0,o.createComponentVNode)(2,a.Divider),h?(0,o.createComponentVNode)(2,l.ReleaseValve,{valveIsOpen:g,releasePressure:v,minRelease:b,maxRelease:V,onToggleValve:function(){u("toggle-valve")},onSetPressure:function(e){u("set-pressure",{releasePressure:e})}}):(0,o.createComponentVNode)(2,a.Box,{color:"average",children:"The release valve is missing."})]}),y?(0,o.createComponentVNode)(2,d.Detonator,{detonator:y,detonatorAttachments:x,onToggleAnchor:function(){u("anchor")},onToggleSafety:function(){u("safety")},onWireInteract:function(e,t){u("wire-interact",{index:t,toolAction:e})},onPrimeDetonator:function(){u("prime")},onTriggerActivate:function(){u("trigger")},onSetTimer:function(e){u("timer",{newTime:e})}}):(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:f,onEjectTank:function(){u("eject-tank")}})]}),!!I&&(0,o.createComponentVNode)(2,a.Flex.Item,{width:"410px",children:(0,o.createComponentVNode)(2,p)})]})})})};var p=function(e){var t,n;function i(t,n){var o;return(o=e.call(this,t)||this).el=document.createElement("div"),o}return n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,s(t,n),i.prototype.render=function(){var e=(0,r.useBackend)(this.context).data.paperData,t=e.text,n=e.stamps;return(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,width:"400px",height:"518px",backgroundColor:"white",style:{"overflow-wrap":"break-word"},children:(0,o.createComponentVNode)(2,u.PaperSheetView,{value:t||"",stamps:n,readOnly:!0})})},i}(o.Component)},5394:function(e,t,n){"use strict";t.__esModule=!0,t.GasTankInfo=t.GasTank=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(75015);t.GasTank=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,s=d.pressure,p=d.maxPressure,m=d.valveIsOpen,f=d.releasePressure,h=d.maxRelease;return(0,o.createComponentVNode)(2,i.Window,{width:400,height:220,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:(0,o.createComponentVNode)(2,u,{pressure:s,maxPressure:p})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,l.ReleaseValve,{valveIsOpen:m,releasePressure:f,maxRelease:h,onToggleValve:function(){c("toggle-valve")},onSetPressure:function(e){c("set-pressure",{releasePressure:e})}})})]})})};var u=function(e){var t=e.pressure,n=e.maxPressure,r=e.name;return(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,a.RoundGauge,{size:1.75,value:t,minValue:0,maxValue:n,alertAfter:.7*n,ranges:{good:[0,.7*n],average:[.7*n,.85*n],bad:[.85*n,n]},format:c.formatPressure})}),r?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Label",children:r}):null]})};t.GasTankInfo=u},92526:function(e,t,n){"use strict";t.__esModule=!0,t.GeneTek=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(33012),l=function(e){return e>0?(e/10).toFixed(0)+"s":"Ready"};t.GeneTek=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"menu","research"),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"buymats",null),h=f[0],g=f[1],C=(0,r.useSharedState)(t,"iscombining",!1)[0],N=u.materialCur,v=u.materialMax,b=u.currentResearch,V=u.equipmentCooldown,y=u.subject,x=u.costPerMaterial,I=u.budget,k=u.record,w=u.scannerAlert,S=u.scannerError,_=u.allowed,M=y||{},D=M.name,B=M.stat,A=M.health,T=M.stability,L=Math.min(v-N,Math.floor(I/x));return(0,o.createComponentVNode)(2,i.Window,{theme:_?"genetek":"genetek-disabled",width:730,height:415,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{width:"245px",height:"100%",style:{padding:"5px 5px 5px 5px"},children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[!_&&(0,o.createFragment)([(0,o.createVNode)(1,"div",null,"Insufficient access to interact.",16,{style:{color:"#ff3333","text-align":"center"}}),(0,o.createComponentVNode)(2,a.Divider)],4),(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.ProgressBar,{value:N,maxValue:v,mb:1,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",bold:!0,children:"Materials"}),N," / ",v]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:0,shrink:0,ml:1,children:(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,icon:"dollar-sign",disabled:L<=0,onClick:function(){return g(1)}})})]}),y&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Occupant",children:D}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:{bad:[-Infinity,.15],average:[.15,.75],good:[.75,Infinity]},value:A,children:B<2?A<=0?(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:[(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle"})," Critical"]}):(100*A).toFixed(0)+"%":(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," Deceased"]})})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stability",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:{bad:[-Infinity,15],average:[15,75],good:[75,Infinity]},value:T,maxValue:100})})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,style:{overflow:"hidden"},children:b.map((function(e){return(0,o.createComponentVNode)(2,a.ProgressBar,{value:e.total-e.current,maxValue:e.total,mb:1,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",children:e.name}),(0,o.createComponentVNode)(2,a.TimeDisplay,{timing:!0,value:e.current,format:l})]},e.ref)}))}),!!w&&(0,o.createComponentVNode)(2,a.NoticeBox,{info:!S,danger:!!S,children:w}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:V.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.label,children:e.cooldown<0?"Ready":(0,o.createComponentVNode)(2,a.TimeDisplay,{timing:!0,value:e.cooldown,format:l})},e.label)}))})]})}),(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Box,{ml:"250px",children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"flask",selected:"research"===p,onClick:function(){return m("research")},children:"Research"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"radiation",selected:"mutations"===p,onClick:function(){return m("mutations")},children:"Mutations"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"server",selected:"storage"===p||!k&&"record"===p,onClick:function(){return m("storage")},children:"Storage"}),!!k&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"save",selected:"record"===p,onClick:function(){return m("record")},rightSlot:"record"===p&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times",onClick:function(){return d("clearrecord")}}),children:"Record"}),y&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"dna",selected:"scanner"===p,onClick:function(){return m("scanner")},children:"Scanner"})]}),null!==h&&(0,o.createComponentVNode)(2,c.BuyMaterialsModal,{maxAmount:L}),!!C&&(0,o.createComponentVNode)(2,c.CombineGenesModal),"research"===p&&(0,o.createComponentVNode)(2,c.ResearchTab,{maxBuyMats:L,setBuyMats:g}),"mutations"===p&&(0,o.createComponentVNode)(2,c.MutationsTab),"storage"===p&&(0,o.createComponentVNode)(2,c.StorageTab),"record"===p&&(k?(0,o.createComponentVNode)(2,c.RecordTab):(0,o.createComponentVNode)(2,c.StorageTab)),"scanner"===p&&(0,o.createComponentVNode)(2,c.ScannerTab)]})})})]})})}},92195:function(e,t,n){"use strict";t.__esModule=!0,t.AppearanceEditor=void 0;var o=n(96323),r=n(31246),a=n(26949);t.AppearanceEditor=function(e,t){var n=(0,r.useBackend)(t).act,c=e.preview,l=e.hairStyles,u=e.skin,d=e.eyes,s=e.color1,p=e.color2,m=e.color3,f=e.style1,h=e.style2,g=e.style3,C=e.fixColors,N=e.hasEyes,v=e.hasSkin,b=e.hasHair,V=e.channels;return(0,o.createComponentVNode)(2,a.Section,{title:"Appearance Editor",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("editappearance",{apply:!0})},icon:"user",color:"good",children:"Apply Changes"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("editappearance",{cancel:!0})},icon:"times",color:"bad"})],4),children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{shrink:"1",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!v&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Skin Tone",children:(0,o.createComponentVNode)(2,i,{color:u,onChange:function(e){return n("editappearance",{skin:e})}})}),!!N&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Eye Color",children:(0,o.createComponentVNode)(2,i,{color:d,onChange:function(e){return n("editappearance",{eyes:e})}})}),!(!v&&!N||!V[0])&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[0]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[0],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:f,onSelected:function(e){return n("editappearance",{style1:e})},options:l})}),!!V[0]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[0].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:s,onChange:function(e){return n("editappearance",{color1:e})},fix:C})}),!!V[1]&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[1]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[1],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:h,onSelected:function(e){return n("editappearance",{style2:e})},options:l})}),!!V[1]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[1].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:p,onChange:function(e){return n("editappearance",{color2:e})},fix:C})}),!!V[2]&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[2]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[2],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:g,onSelected:function(e){return n("editappearance",{style3:e})},options:l})}),!!V[2]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[2].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:m,onChange:function(e){return n("editappearance",{color3:e})},fix:C})})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:"80px",shrink:"0",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:c,type:"map"},style:{width:"80px",height:"160px"}})})]})})};var i=function(e,t){var n=e.color,r=e.onChange,i=e.fix,c=parseInt(n.substr(1,2),16),l=parseInt(n.substr(3,2),16),u=parseInt(n.substr(5,2),16),d=function(e,t,n){r&&r("#"+e.toString(16).padStart(2,"0")+t.toString(16).padStart(2,"0")+n.toString(16).padStart(2,"0"))};return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.ColorBox,{color:n}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:c,color:"red",onChange:function(e,t){return d(Math.round(t),l,u)}}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:l,color:"green",onChange:function(e,t){return d(c,Math.round(t),u)}}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:u,color:"blue",onChange:function(e,t){return d(c,l,Math.round(t))}})]})}},11265:function(e,t,n){"use strict";t.__esModule=!0,t.GeneList=t.Description=t.BioEffect=t.onCooldown=t.haveDevice=t.ResearchLevel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(89613),c=n(59450),l=n(43024),u=["genes","noSelection","noGenes"];function d(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var p={None:0,InProgress:1,Done:2,Activated:3};t.ResearchLevel=p;var m=function(e,t){for(var n,o=d(e);!(n=o()).done;){var r=n.value,a=r.label;r.cooldown;if(a===t)return!0}return!1};t.haveDevice=m;var f=function(e,t){for(var n,o=d(e);!(n=o()).done;){var r=n.value,a=r.label,i=r.cooldown;if(a===t)return i>0}return!0};t.onCooldown=f;var h=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"booth",null),p=s[0],h=s[1],C=u.materialCur,N=u.researchCost,v=u.equipmentCooldown,b=u.saveSlots,V=u.savedMutations,y=u.subject,x=u.boothCost,I=u.injectorCost,k=u.precisionEmitter,w=u.toSplice,S=e.gene,_=e.showSequence,M=e.isSample,D=e.isPotential,B=e.isActive,A=e.isStorage,T=S.ref,L=S.name,E=S.desc,j=S.icon,P=S.research,O=S.canResearch,F=S.canInject,R=S.canScramble,z=S.canReclaim,W=S.spliceError,U=S.dna,H=U.every((function(e){return!e.style})),G=U.every((function(e){return!e.style||"locked"===e.marker})),Y=B||A;return(0,o.createComponentVNode)(2,a.Section,{title:L,buttons:(0,o.createComponentVNode)(2,l.GeneIcon,{name:j,size:1.5}),children:[p&&p.ref===T&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Section,{width:35,title:L,style:{margin:"-10px","margin-right":"2px"},buttons:(0,o.createComponentVNode)(2,l.GeneIcon,{name:j,size:4,style:{"margin-top":"-2px","margin-right":"-4px"}}),children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Price",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,maxValue:999999,width:5,value:p.price,onChange:function(e,t){return h({ref:p.ref,price:t,desc:p.desc})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:(0,o.createComponentVNode)(2,a.Input,{width:25,value:p.desc,onChange:function(e,t){return h({ref:p.ref,price:p.price,desc:t})}})})]}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",mt:2,children:(0,o.createComponentVNode)(2,a.Button,{icon:"person-booth",color:"good",disabled:x>C,onClick:function(){return d("booth",p)},children:"Send to Booth"})}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){return h(null)},children:"Cancel"})})]})}),(0,o.createComponentVNode)(2,i.UnlockModal),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{mr:1,style:{float:"left"},children:[(0,o.createComponentVNode)(2,a.Icon,{color:P>=3?"good":P>=2?"teal":P>=1?"average":"bad",name:P>=2?"flask":P>=1?"hourglass":"times"}),P>=2?" Researched":P>=1?" In Progress":" Not Researched"]}),!B&&!!O&&0===P&&(0,o.createComponentVNode)(2,a.Button,{icon:"flask",disabled:N>C,onClick:function(){return d("researchmut",{ref:T,sample:!!M})},color:"teal",children:"Research"}),D&&(0,o.createComponentVNode)(2,a.Button,{icon:"check",disabled:!H,onClick:function(){return d("activate",{ref:T})},color:"blue",children:"Activate"}),P>=3&&!H&&(0,o.createComponentVNode)(2,a.Button,{icon:"magic",disabled:G,onClick:function(){return d("autocomplete",{ref:T})},children:"Autocomplete DNA"}),m(v,"Analyzer")&&!H&&D&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Analyzer"),icon:"microscope",color:"average",onClick:function(){return d("analyze",{ref:T})},children:"Check Stability"}),m(v,"Reclaimer")&&Y&&!!z&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Reclaimer"),icon:"times",color:"bad",onClick:function(){return d("reclaim",{ref:T})},children:"Reclaim"}),x>=0&&P>=2&&Y&&(0,o.createComponentVNode)(2,a.Button,{disabled:C<x,icon:"person-booth",color:"good",onClick:function(){return h({ref:T,price:200,desc:""})},children:"Sell at Booth"}),!!k&&P>=2&&D&&!!R&&(0,o.createComponentVNode)(2,a.Button,{icon:"radiation",disabled:f(v,"Emitter")||y.stat>0,color:"bad",onClick:function(){return d("precisionemitter",{ref:T})},children:"Scramble Gene"}),b>0&&P>=2&&B&&(0,o.createComponentVNode)(2,a.Button,{disabled:b<=V.length,icon:"save",color:"average",onClick:function(){return d("save",{ref:T})},children:"Store"}),P>=2&&!!F&&m(v,"Injectors")&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Injectors"),icon:"syringe",onClick:function(){return d("activator",{ref:T})},children:"Activator"}),P>=2&&!!F&&I>=0&&Y&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Injectors")||C<I,icon:"syringe",onClick:function(){return d("injector",{ref:T})},color:"bad",children:"Injector"}),Y&&!!w&&(0,o.createComponentVNode)(2,a.Button,{disabled:!!W,icon:"map-marker-alt",onClick:function(){return d("splicegene",{ref:T})},tooltip:W,tooltipPosition:"left",children:"Splice"}),A&&y&&(0,o.createComponentVNode)(2,a.Button,{icon:"check",onClick:function(){return d("addstored",{ref:T})},color:"blue",children:"Add to Occupant"}),A&&(0,o.createComponentVNode)(2,a.Button,{icon:"trash",onClick:function(){return d("deletegene",{ref:T})},color:"bad"}),(0,o.createComponentVNode)(2,a.Box,{inline:!0})]}),(0,o.createComponentVNode)(2,g,{text:E}),_&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DNASequence,Object.assign({},e)))]})};t.BioEffect=h;var g=function(e,t){return e.text.split(/<br ?\/?>/g).map((function(e,t){return(0,o.createVNode)(1,"p",null,e,0,null,t)}))};t.Description=g;t.GeneList=function(e,t){var n,i=(0,r.useBackend)(t),c=i.data,l=i.act,d=c.activeGene,s=e.genes,m=e.noSelection,f=e.noGenes,g=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),C=s.find((function(e){return e.ref===d})),N=((n={})[p.None]={icon:"question",color:"grey"},n[p.InProgress]={icon:"hourglass",color:"average"},n[p.Done]={icon:"flask",color:"teal"},n[p.Activated]={icon:"flask",color:"good"},n);return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,mb:1,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:N[e.research].icon,color:e.ref===d?"black":N[e.research].color,onClick:function(){return l("setgene",{ref:e.ref})},tooltip:e.research===p.InProgress?"Researching...":e.name,tooltipPosition:"left",width:"80%"})},e.ref)}))}),!s.length&&(f||"No genes found."),!!s.length&&!C&&(m||"Select a gene to view it."),C&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({gene:C,showSequence:!0},g),C.ref))],0)}},59450:function(e,t,n){"use strict";t.__esModule=!0,t.Nucleotide=t.DNASequence=void 0;var o=n(96323),r=n(31246),a=n(26949),i=["letter","type","mark","useLetterColor"];var c={"?":"grey",A:"red",T:"blue",C:"yellow",G:"green"},l={"":"good",X:"grey",1:"good",2:"olive",3:"average",4:"orange",5:"bad"};t.DNASequence=function(e,t){for(var n=(0,r.useBackend)(t).act,i=e.gene,c=e.isPotential,d=i.dna,s=!0,p=[],m=0;m<d.length;m++)m%4==0&&p.push([]),p[p.length-1].push(d[m]),d[m].style&&(s=!1);var f=function(e){c&&n("advancepair",{ref:i.ref,pair:e})};return p.map((function(e,t){return(0,o.createVNode)(1,"table",null,[(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,u,{letter:e.pair.charAt(0),type:e.style,mark:e.marker,useLetterColor:s,onClick:function(){return f(4*t+n+1)}}),2,null,n)})),0),(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,s?"|":"locked"===e.marker?(0,o.createComponentVNode)(2,a.Icon,{name:"lock",color:"average",onClick:function(){return f(4*t+n+1)}}):(0,o.createComponentVNode)(2,a.Icon,{name:""===e.style?"check":"5"===e.style?"times":"question",color:l[e.style]}),0,{style:{"text-align":"center"}},n)})),0),(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,u,{letter:e.pair.charAt(1),type:e.style,mark:e.marker,useLetterColor:s,onClick:function(){return f(4*t+n+1)}}),2,null,n)})),0)],4,{style:{display:"inline-table","margin-top":"1em","margin-left":t%4==0?"0":"0.25em","margin-right":t%4==3?"0":"0.25em"}},t)}))};var u=function(e){var t=e.letter,n=e.type,r=(e.mark,e.useLetterColor),u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),d=r?c[t]:l[n];return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({width:"1.75em",textAlign:"center",color:d},u,{children:t})))};t.Nucleotide=u},43024:function(e,t,n){"use strict";t.__esModule=!0,t.GeneIcon=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["name","size","style"];var c=function(e){var t=e.name,n=e.size,c=e.style,l=void 0===c?{}:c,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return n&&(l["font-size"]=100*n+"%"),(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"i",className:(0,r.classes)(["GeneIcon","GeneIcon--"+t]),style:l},u)))};t.GeneIcon=c,c.defaultHooks=r.pureComponentHooks},33012:function(e,t,n){"use strict";t.__esModule=!0,t.StorageTab=t.RecordTab=t.ScannerTab=t.ResearchTab=t.MutationsTab=t.UnlockModal=t.CombineGenesModal=t.BuyMaterialsModal=void 0;var o=n(78368);t.BuyMaterialsModal=o.BuyMaterialsModal;var r=n(39961);t.CombineGenesModal=r.CombineGenesModal;var a=n(89613);t.UnlockModal=a.UnlockModal;var i=n(22675);t.MutationsTab=i.MutationsTab;var c=n(93847);t.ResearchTab=c.ResearchTab;var l=n(49445);t.ScannerTab=l.ScannerTab;var u=n(64477);t.RecordTab=u.RecordTab,t.StorageTab=u.StorageTab},78368:function(e,t,n){"use strict";t.__esModule=!0,t.BuyMaterialsModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.BuyMaterialsModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"buymats",null),u=l[0],d=l[1],s=e.maxAmount,p=i.budget,m=i.costPerMaterial,f=Math.min(u,s);return(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Box,{position:"relative",width:18,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",right:1,top:0,children:(0,o.createComponentVNode)(2,a.Knob,{inline:!0,value:f,onChange:function(e,t){return d(t)},minValue:1,maxValue:s})}),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Purchase",children:[f,1===f?" Material":" Materials"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Budget",children:p+" Credits"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cost",children:f*m+" Credits"}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Remainder",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:p-f*m<0&&"bad",children:p-f*m})," Credits"]})]}),(0,o.createComponentVNode)(2,a.Divider,{hidden:!0}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"good",icon:"dollar-sign",disabled:f<=0,onClick:function(){c("purchasematerial",{amount:f}),d(null)},children:"Submit"})}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return d(null)},children:"Cancel"})})]})})}},39961:function(e,t,n){"use strict";t.__esModule=!0,t.CombineGenesModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.CombineGenesModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"iscombining",!1),u=(l[0],l[1]),d=i.savedMutations,s=i.combining,p=void 0===s?[]:s;return(0,o.createComponentVNode)(2,a.Modal,{full:!0,width:20,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Select",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:p.indexOf(e.ref)>=0,onClick:function(){return c("togglecombine",{ref:e.ref})},children:e.name})},e.ref)}))})}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return u(!1)},children:"Cancel"}),(0,o.createComponentVNode)(2,a.Button,{icon:"sitemap",disabled:!p.length,onClick:function(){c("combinegenes"),u(!1)},children:"Combine"})]})]})}},89613:function(e,t,n){"use strict";t.__esModule=!0,t.UnlockModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.UnlockModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"unlockcode",""),u=l[0],d=l[1],s=i.autoDecryptors,p=i.unlock;if(p)return(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Box,{width:22,mr:2,children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Detected Length",children:[p.length," characters"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Possible Characters",children:p.chars.join(" ")}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Enter Unlock Code",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t.toUpperCase())}})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Correct Characters",children:[p.correctChar," of ",p.length]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Correct Positions",children:[p.correctPos," of ",p.length]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Attempts Remaining",children:[p.tries," before mutation"]})]}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",mt:2,children:(0,o.createComponentVNode)(2,a.Button,{icon:"magic",color:"average",tooltip:"Auto-Decryptors Available: "+s,disabled:s<1,onClick:function(){d(""),c("unlock",{code:"UNLOCK"})},children:"Use Auto-Decryptor"})}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",mt:1,children:[(0,o.createComponentVNode)(2,a.Button,{mr:1,icon:"check",color:"good",tooltip:u.length!==p.length?"Code is the wrong length.":u.split("").some((function(e){return-1===p.chars.indexOf(e)}))?"Invalid character in code.":"",disabled:u.length!==p.length||u.split("").some((function(e){return-1===p.chars.indexOf(e)})),onClick:function(){d(""),c("unlock",{code:u})},children:"Attempt Decryption"}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){d(""),c("unlock",{code:null})},children:"Cancel"})]})]})})}},22675:function(e,t,n){"use strict";t.__esModule=!0,t.MutationsTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(11265);t.MutationsTab=function(e,t){var n=(0,r.useBackend)(t).data,c=(0,r.useSharedState)(t,"mutsortmode","time"),l=c[0],u=c[1],d=(0,r.useSharedState)(t,"showSequence",!1),s=d[0],p=d[1],m=(n.bioEffects||[]).slice(0);return"time"===l?m.sort((function(e,t){return e.time-t.time})):"alpha"===l&&m.sort((function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"time"===l?"clock":"sort-alpha-down",onClick:function(){return u("time"===l?"alpha":"time")},children:"Sort Mode"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"Show Sequence",checked:s,onClick:function(){return p(!s)}})]}),m.map((function(e){return(0,o.createComponentVNode)(2,i.BioEffect,{gene:e,showSequence:s},e.ref)}))],0)}},93847:function(e,t,n){"use strict";t.__esModule=!0,t.ResearchTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(11265);t.ResearchTab=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=c.materialCur,d=c.materialMax,s=c.budget,p=c.mutationsResearched,m=c.autoDecryptors,f=c.saveSlots,h=c.availableResearch,g=c.finishedResearch,C=c.savedMutations,N=c.research,v=e.maxBuyMats,b=e.setBuyMats;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Statistics",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"dollar-sign",disabled:v<=0,onClick:function(){return b(1)},children:"Purchase Additional Materials"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Research Materials",children:[u," / ",d]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Research Budget",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:s})," Credits"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mutations Researched",children:p}),f>0&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mutations Stored",children:[C.length," / ",f]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Auto-Decryptors",children:m})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Available Research",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:"Tier "+(t+1),children:e.length?e.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:N[e.ref].name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"flask",disabled:u<e.cost,onClick:function(){return l("research",{ref:e.ref})},color:"teal",children:"Research ("+e.cost+" mat, "+e.time+"s)"}),children:(0,o.createComponentVNode)(2,i.Description,{text:N[e.ref].desc})},e.ref)})):"No research is currently available at this tier."},t)}))}),(0,o.createComponentVNode)(2,a.Section,{title:"Finished Research",children:g.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:"Tier "+(t+1),children:e.length?e.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:N[e.ref].name,children:(0,o.createComponentVNode)(2,i.Description,{text:N[e.ref].desc})},N[e.ref].name)})):"No research has been completed at this tier."},t)}))})],4)}},49445:function(e,t,n){"use strict";t.__esModule=!0,t.ScannerTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(92195),c=n(11265),l=n(43024);t.ScannerTab=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"changingmutantrace",!1),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"togglePreview",!1),h=f[0],g=f[1],C=u.haveScanner,N=u.subject,v=u.modifyAppearance,b=u.equipmentCooldown,V=u.mutantRaces,y=N||{},x=y.preview,I=y.name,k=y.health,w=y.human,S=y.age,_=y.bloodType,M=y.mutantRace,D=y.canAppearance,B=y.premature,A=y.potential,T=y.active;return!p||N&&w&&!B||(p=!1,m(!1)),N?(0,o.createFragment)([!!p&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,width:20,mb:.5,children:"Change to which body type?"}),V.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{color:"blue",disabled:M===e.name,mt:.5,onClick:function(){m(!1),d("mutantrace",{ref:e.ref})},children:[(0,o.createComponentVNode)(2,l.GeneIcon,{name:e.icon,size:1.5,style:{margin:"-4px","margin-right":"4px"}}),e.name]})},e.ref)})),(0,o.createComponentVNode)(2,a.Box,{mt:1,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return m(!1)},children:"Cancel"})})]}),v?(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.AppearanceEditor,Object.assign({},v))):(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Name",buttons:(0,c.haveDevice)(b,"Emitter")&&(0,o.createComponentVNode)(2,a.Button,{icon:"radiation",disabled:(0,c.onCooldown)(b,"Emitter")||k<=0,color:"bad",onClick:function(){return d("emitter")},children:"Scramble DNA"}),children:I}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Body Type",buttons:!!w&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"user",color:"blue",disabled:!!B,onClick:function(){return m(!0)},children:"Change"}),(0,o.createComponentVNode)(2,a.Button,{icon:"wrench",color:"average",disabled:!D,onClick:function(){return d("editappearance")}})],4),children:M}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Physical Age",buttons:!!w&&(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,color:"good",content:"DNA Render",checked:h,onClick:function(){return g(!h)}}),children:[S," years"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood Type",children:_})]})}),w&&h&&(0,o.createComponentVNode)(2,a.Flex.Item,{grow:0,shrink:0,children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:x,type:"map"},style:{width:"64px",height:"128px"},hideOnScroll:!0})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Potential Genes",children:(0,o.createComponentVNode)(2,c.GeneList,{genes:A,noGenes:"All detected potential mutations are active.",isPotential:!0})}),(0,o.createComponentVNode)(2,a.Section,{title:"Active Mutations",children:(0,o.createComponentVNode)(2,c.GeneList,{genes:T,noGenes:"Subject has no detected mutations.",isActive:!0})})],4)],0):(0,o.createComponentVNode)(2,a.Section,{title:"Scanner Error",children:C?"Subject has absconded.":"Check connection to scanner."})}},64477:function(e,t,n){"use strict";t.__esModule=!0,t.RecordTab=t.StorageTab=void 0;var o=n(96323),r=n(31246),a=n(11265),i=n(26949);t.StorageTab=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=(0,r.useSharedState)(t,"menu","research"),d=(u[0],u[1]),s=(0,r.useSharedState)(t,"iscombining",!1),p=(s[0],s[1]),m=c.saveSlots,f=c.samples,h=c.savedMutations,g=c.savedChromosomes,C=c.toSplice,N=Object.values(g.reduce((function(e,t){return e[t.name]||(e[t.name]={name:t.name,desc:t.desc,count:0}),e[t.name].count++,e[t.name].ref=t.ref,e}),{}));return N.sort((function(e,t){return e.name>t.name?1:-1})),(0,o.createFragment)([m>0&&(0,o.createComponentVNode)(2,i.Section,{title:"Stored Mutations",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sitemap",onClick:function(){return p(!0)},children:"Combine"}),children:h.length?h.map((function(e){return(0,o.createComponentVNode)(2,a.BioEffect,{gene:e,showSequence:!0,isStorage:!0},e.ref)})):"There are no mutations in storage."}),(0,o.createComponentVNode)(2,i.Section,{title:"Stored Chromosomes",children:N.length?(0,o.createComponentVNode)(2,i.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{disabled:e.name===C,icon:"map-marker-alt",onClick:function(){return l("splicechromosome",{ref:e.ref})},children:"Splice"}),(0,o.createComponentVNode)(2,i.Button,{color:"bad",icon:"trash",onClick:function(){return l("deletechromosome",{ref:e.ref})}})],4),children:[e.desc,(0,o.createComponentVNode)(2,i.Box,{mt:.5,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"grey",children:"Stored Copies:"})," ",e.count]})]},e.ref)}))}):"There are no chromosomes in storage."}),(0,o.createComponentVNode)(2,i.Section,{title:"DNA Samples",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"save",onClick:function(){l("setrecord",{ref:e.ref}),d("record")},children:"View Record"}),children:(0,o.createVNode)(1,"tt",null,e.uid,0)},e.ref)}))})})],0)};t.RecordTab=function(e,t){var n=(0,r.useBackend)(t).data.record;if(n){var c=n.name,l=n.uid,u=n.genes;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:c,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Genetic Signature",children:(0,o.createVNode)(1,"tt",null,l,0)})})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,a.GeneList,{genes:u,noGenes:"No genes found in sample.",isSample:!0})})],4)}}},12302:function(e,t,n){"use strict";t.__esModule=!0,t.GimmickObject=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.GimmickObject=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.eventList,d=l.interactiveTypes,s=l.activeStage;l.icon,l.iconState;return(0,o.createComponentVNode)(2,i.Window,{title:"Gimmick Object Editor",width:675,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Edit Interactive Steps"}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:Object.keys(u).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Move Step Down",children:(0,o.createComponentVNode)(2,a.Button,{icon:"angle-down",disabled:parseInt(e,10)>=u.length-1,onClick:function(){return c("move-down",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Move Step Down",children:(0,o.createComponentVNode)(2,a.Button,{icon:"angle-up",disabled:parseInt(e,10)<=0,onClick:function(){return c("move-up",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Make Active Step",children:(0,o.createComponentVNode)(2,a.Button,{icon:"play",disabled:parseInt(e,10)===parseInt(s,10)-1,onClick:function(){return c("active_step",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Remove step from Gimmick",children:(0,o.createComponentVNode)(2,a.Button,{icon:"trash",color:"red",onClick:function(){return c("delete_event",{event:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Set Tool Interactive Flags (Blank will be AttackHand)",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Interactive Flags",children:Object.keys(d).map((function(n,r){return(0,o.createComponentVNode)(2,a.Button,{selected:u[e].interaction&d[n],onClick:function(){return c("interaction",{event:t,value:d[n]})},children:n},r)}))})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Hint appended to examine text",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:(0,o.createComponentVNode)(2,a.Input,{fluid:!0,value:u[e].description,onInput:function(e,n){return c("description",{event:t,value:n})}})})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Actionbar Duration",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Duration",children:[(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:u[e].duration,minValue:1,maxValue:9e4,onChange:function(e,n){return c("duration",{event:t,value:n})}}),"Seconds"]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Visible Text Appended after [src]",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Visible Message",children:(0,o.createComponentVNode)(2,a.Input,{fluid:!0,value:u[e].message,onInput:function(e,n){return c("message",{event:t,value:n})}})})})]}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Notify in-game admins that action was performed",children:(0,o.createComponentVNode)(2,a.Button,{icon:"flag",selected:u[e].notify,onClick:function(){return c("notify",{event:t,value:!u[e].notify})},children:"Notify Admins"})})]})})},t)}))}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("add_new")},children:"Add Event"})})]})})})}},96608:function(e,t,n){"use strict";t.__esModule=!0,t.GlassRecycler=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=function(e){var t=e.product,n=t.name,r=t.cost,i=t.img,l=e.disabled,u=e.onClick;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:(0,c.capitalize)(n)}),(0,o.createComponentVNode)(2,a.Box,{children:"Cost: "+r+" "+(0,c.pluralize)("Unit",r)})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:u,disabled:l,children:"Create"})})]}),(0,o.createComponentVNode)(2,a.Divider)],4)};t.GlassRecycler=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.glassAmt,p=d.products,m=(0,r.useLocalState)(t,"filter-available",!1),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Glass Recycler",width:300,height:400,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{children:"Glass: "+s+" "+(0,c.pluralize)("Unit",s)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:f,onClick:function(){return h(!f)},children:"Filter Available"})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Products",children:p.filter((function(e){var t=e.cost;return!f||s>=t})).map((function(e){var t=e.cost,n=e.type;return(0,o.createComponentVNode)(2,l,{product:e,disabled:s<t,onClick:function(){return u("create",{type:n})}},n)}))})})]})})})}},21381:function(e,t,n){"use strict";t.__esModule=!0,t.HumanInventory=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c={slot_head:"Head",slot_wear_mask:"Mask",slot_glasses:"Eyes",slot_ears:"Ears",slot_l_hand:"Left Hand",slot_r_hand:"Right Hand",slot_gloves:"Gloves",slot_shoes:"Shoes",slot_belt:"Belt",slot_w_uniform:"Uniform",slot_wear_suit:"Outer Suit",slot_back:"Back",slot_wear_id:"ID",slot_l_store:"Left Pocket",slot_r_store:"Right Pocket"};t.HumanInventory=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act;return(0,o.createComponentVNode)(2,i.Window,{width:300,height:490,title:u.name,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:Object.entries(c).map((function(e){var t=e[0],n=e[1],r=u.slots.find((function(e){return e.id===t}));return(0,o.createComponentVNode)(2,l,{name:n,slot:r},t)}))})})}),Boolean(u.handcuffed||u.canSetInternal||u.internal)&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[Boolean(u.handcuffed)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("remove-handcuffs")},children:"Remove handcuffs"}),Boolean(u.canSetInternal)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("access-internals")},children:"Set internals"}),Boolean(u.internal)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("access-internals")},children:"Remove internals"})]})})]})})})};var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.slot,c=e.name,l=i.id,u=i.item;return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:c,children:(0,o.createComponentVNode)(2,a.Button,{color:u?"default":"transparent",fluid:!0,onClick:function(){return n("access-slot",{id:l})},children:u||"Nothing"})})}},59818:function(){},92354:function(e,t,n){"use strict";t.__esModule=!0,t.Hypospray=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(18331);t.Hypospray=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.emagged,p=d.injectionAmount,m=d.reagentData;return(0,o.createComponentVNode)(2,i.Window,{width:320,height:300,theme:s?"syndicate":"nanotrasen",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:s?(0,l.glitch)("Contents",3):"Contents",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"red",disabled:!m.totalVolume,onClick:function(){return u("dump")},children:"Dump"}),children:[(0,o.createComponentVNode)(2,c.ReagentGraph,{container:m}),(0,o.createComponentVNode)(2,c.ReagentList,{container:m})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Injection Amount",children:(0,o.createComponentVNode)(2,a.Slider,{value:p,format:function(e){return e+"u"},minValue:1,maxValue:m.maxVolume,step:1,stepPixelSize:10,onChange:function(e,t){return u("changeAmount",{amount:t})}})})]})})}},26513:function(e,t,n){"use strict";t.__esModule=!0,t.IDComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.name,c=e.colour,l=e.jobs,u=e.current_job,d=e.isCustomRank,s=e.accesses,p=e.target_accesses;return(0,o.createComponentVNode)(2,a.Section,{title:i,"class":"IDComputer__DeptBox "+(c&&"IDComputer__DeptBox_color_"+c),mb:"0.25rem",children:[l&&l.map((function(e,t){return(0,o.createFragment)([!d&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("assign",{assign:e,colour:c})},selected:e===u,children:e},e),d&&(0,o.createFragment)([e,(0,o.createComponentVNode)(2,a.Button,{icon:"save",tooltip:"Save",onClick:function(){return n("save",{save:t+1})},pl:"10px",mx:"0.2rem"}),(0,o.createComponentVNode)(2,a.Button,{icon:"check",tooltip:"Apply",onClick:function(){return n("apply",{apply:t+1})},pl:"10px",mx:"0.2rem",mr:"1rem"})],0)],0)})),s&&s.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("access",{access:e.id,allowed:!p.includes(e.id)})},selected:p.includes(e.id),children:e.name},e.id)}))]})};t.IDComputer=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.mode,s=u.manifest,p=u.target_name,m=u.target_owner,f=u.target_rank,h=u.target_card_look,g=u.scan_name,C=u.pronouns,N=u.custom_names,v=u.target_accesses,b=u.standard_jobs,V=u.accesses_by_area,y=u.icons;return(0,o.createComponentVNode)(2,i.Window,{width:620,height:780,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"manifest"!==d,onClick:function(){return l("mode",{mode:0})},children:"ID Modification"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"manifest"===d,onClick:function(){return l("mode",{mode:1})},children:"Crew Manifest"})]}),"manifest"===d&&(0,o.createFragment)([(0,o.createVNode)(1,"h1",null,"Crew Manifest:",16),(0,o.createVNode)(1,"em",null,"Please use the security record computer to modify entries.",16),(0,o.createComponentVNode)(2,a.Box,{my:"0.5rem",dangerouslySetInnerHTML:{__html:s}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("print")},icon:"print",children:"Print"})],4),"manifest"!==d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Confirm identity",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("scan")},icon:"eject",preserveWhitespace:!0,children:g||"Insert card"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("modify")},icon:"eject",preserveWhitespace:!0,children:p||"Insert card or implant"})})]}),"authenticated"===d&&(0,o.createFragment)([(0,o.createVNode)(1,"hr"),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:2,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Registered",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("reg")},preserveWhitespace:!0,children:m&&m.trim()||"(blank)"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Assignment",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("assign",{assign:"Custom Assignment"})},preserveWhitespace:!0,children:f&&f.trim()||"Unassigned"})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pronouns",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pronouns",{pronouns:"next"})},children:C||"None"}),C&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pronouns",{pronouns:"remove"})},icon:"trash",tooltip:"Remove"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"PIN",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pin")},children:"****"})})]})})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Standard Job Assignment",children:[b.map((function(e){return e.jobs&&(0,o.createComponentVNode)(2,c,{name:e.name,colour:e.color,current_job:f,jobs:e.jobs},e.name)})),(0,o.createComponentVNode)(2,c,{name:"Custom",current_job:f,jobs:N,isCustomRank:!0})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Specific Area Access",children:V.map((function(e){return e.accesses.length>0&&(0,o.createComponentVNode)(2,c,{name:e.name,colour:e.color,accesses:e.accesses,target_accesses:v},e.name)}))}),(0,o.createComponentVNode)(2,a.Section,{title:"Custom Card Look",children:y.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("colour",{colour:e.style})},selected:e.card_look===h,children:[(0,o.createComponentVNode)(2,a.Image,{verticalAlign:"middle",my:"0.2rem",mr:"0.5rem",height:"24px",width:"24px",src:"data:image/png;base64,"+e.icon}),e.name]},e.style)}))})],0),"unauthenticated"===d&&g&&p&&(0,o.createComponentVNode)(2,a.NoticeBox,{mt:"0.5rem",warning:!0,children:["Identity ",(0,o.createVNode)(1,"em",null,g,0)," unauthorized to perform ID modifications."]})],0)]})})})}},23255:function(e,t,n){"use strict";t.__esModule=!0,t.Laundry=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.Laundry=function(e,t){var n=(0,r.useBackend)(t).data.on;return(0,o.createComponentVNode)(2,i.Window,{title:"Washman 550",width:400,height:100,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",mb:1,children:n?(0,o.createComponentVNode)(2,c):(0,o.createComponentVNode)(2,l)}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d)]})]})})};var c=function(e,t){return(0,o.createComponentVNode)(2,a.NoticeBox,{warning:!0,children:"Please wait, machine is currently running."})},l=function(e,t){return(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:'Insert items and press "Turn On" to start.'})},u=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.on;return(0,o.createComponentVNode)(2,a.Button,{disabled:c,color:c?"":"good",icon:"fas fa-power-off",content:"Turn On",onClick:function(){return i("cycle")}})},d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.on,u=c.door;return(0,o.createComponentVNode)(2,a.Button,{disabled:l,color:u?"orange":"",icon:u?"fas fa-door-open":"fas fa-door-closed",content:u?"Open":"Closed",onClick:function(){return i("door")}})}},84696:function(e,t,n){"use strict";t.__esModule=!0,t.ListInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(26949),c=n(57890),l=n(2381),u=n(31246);function d(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var p="undefined"!=typeof Promise?Promise.resolve().then.bind(Promise.resolve()):function(e){window.setTimeout(e,0)},m=function(e,t){var n=(f||(f=document.createElement("canvas"))).getContext("2d");return n.font=t,n.measureText(e).width},f=null,h=function(e,t){return window.getComputedStyle(e,null).getPropertyValue(t)};t.ListInputModal=function(e,t){var n=(0,u.useBackend)(t),s=n.act,f=n.data,N=f.items,v=void 0===N?[]:N,b=f.message,V=f.init_value,y=f.timeout,x=f.title,I=f.start_with_search,k=f.capitalize,w=f.theme,S=(0,u.useLocalState)(t,"selected",v.indexOf(V)),_=S[0],M=S[1],D=(0,u.useLocalState)(t,"searchBarVisible",1===I),B=D[0],A=D[1],T=(0,u.useLocalState)(t,"searchQuery",""),L=T[0],E=T[1],j=(0,u.useLocalState)(t,"windowWidth",null),P=j[0],O=j[1],F=function(e){if(e!==L){var t,n=R[_],o=v.filter((function(t){return t.toLowerCase().includes(e.toLowerCase())})),r=o.indexOf(n);if(-1===r&&o.length>0)M(0),null==(t=document.getElementById("0"))||t.scrollIntoView();else if(0!==o.length){var a;M(r),null==(a=document.getElementById(r.toString()))||a.scrollIntoView()}E(e)}},R=v.filter((function(e){return null==e?void 0:e.toLowerCase().includes(L.toLowerCase())})),z=325+Math.ceil((null==b?void 0:b.length)/3);B||setTimeout((function(){var e;return null==(e=document.getElementById(_.toString()))?void 0:e.focus()}),1);var W,U=P;if(null===P){for(var H,G=325,Y=(void 0===W&&(W=document.body),(h(W,"font-weight")||"normal")+" "+(h(W,"font-size")||"16px")+" "+(h(W,"font-family")||"Times New Roman")),Z=d(v);!(H=Z()).done;){var K=H.value;G=Math.max(G,m(K,Y))}p((function(){return O(G)})),U=G}return(0,o.createComponentVNode)(2,l.Window,{title:x,width:U,height:z,theme:w||"nanotrasen",children:[y&&(0,o.createComponentVNode)(2,r.Loader,{value:y}),(0,o.createComponentVNode)(2,l.Window.Content,{onkeydown:function(e){var t,n,o,r,a=B?document.getElementById("search_bar").getElementsByTagName("input")[0]:null,i=document.activeElement===a,l=R.length-1,u=window.event?e.which:e.keyCode,d=String.fromCharCode(e.keyCode).toLowerCase();if(u===c.KEY_DOWN||u===c.KEY_UP||u===c.KEY_PAGEUP||u===c.KEY_PAGEDOWN)e.preventDefault(),function(e){var t,n=R.length-1,o=-1;switch(e){case c.KEY_UP:o=-1;break;case c.KEY_DOWN:o=1;break;case c.KEY_PAGEUP:o=-10;break;case c.KEY_PAGEDOWN:o=10}var r=_+o;r<0&&1===Math.abs(o)&&(r=n),r>n&&1===Math.abs(o)&&(r=0),r<0&&(r=0),r>n&&(r=n),M(r),null==(t=document.getElementById(r.toString()))||t.focus()}(u);else{if("f"===d&&e.ctrlKey)return B||p((function(){return document.getElementById("search_bar").getElementsByTagName("input")[0].focus()})),A(!B),E(""),void e.preventDefault();if(u===c.KEY_ENTER)e.preventDefault(),s("submit",{entry:R[_]});else if(u===c.KEY_ESCAPE)e.preventDefault(),s("cancel");else if(u===c.KEY_END){var m;M(l),null==(m=document.getElementById(l.toString()))||m.focus(),e.preventDefault()}else if(u===c.KEY_HOME){var f;M(0),null==(f=document.getElementById("0"))||f.focus(),e.preventDefault()}else if(u===c.KEY_TAB&&B){var h=document.getElementById(_.toString());i&&h?h.focus():a&&!i&&a.focus(),e.preventDefault()}else!B&&u>=c.KEY_A&&u<=c.KEY_Z&&!e.ctrlKey&&(e.preventDefault(),e.stopPropagation(),t=u,o=String.fromCharCode(t),r=v.findIndex((function(e,t){return(null==e?void 0:e.toLowerCase().startsWith(null==o?void 0:o.toLowerCase()))&&t>_})),-1===r&&(r=v.findIndex((function(e,t){return(null==e?void 0:e.toLowerCase().startsWith(null==o?void 0:o.toLowerCase()))&&t<=_}))),-1!==r&&(M(r),null==(n=document.getElementById(r.toString()))||n.focus()))}},children:(0,o.createComponentVNode)(2,i.Section,{buttons:(0,o.createComponentVNode)(2,i.Button,{compact:!0,icon:B?"search":"font",selected:!0,tooltip:B?"Search Mode. Type to search or use arrow keys to select manually.":"Hotkey Mode. Type a letter to jump to the first match. Enter to select.",tooltipPosition:"left",onClick:function(){return A(!B),void E("")}}),className:"ListInput__Section",fill:!0,title:b,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,g,{filteredItems:R,onClick:function(e){e!==_&&M(e)},onFocusSearch:function(e){var t=B?document.getElementById("search_bar").getElementsByTagName("input")[0]:null;t.focus(),t.value+=e,F(t.value)},searchBarVisible:B,selected:_,capitalize:k})}),B&&(0,o.createComponentVNode)(2,C,{filteredItems:R,onSearch:F,searchQuery:L,selected:_}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,a.InputButtons,{input:R[_]})})]})})})]})};var g=function(e,t){var n=(0,u.useBackend)(t).act,r=e.filteredItems,a=e.onClick,c=e.onFocusSearch,l=e.searchBarVisible,d=e.selected,s=e.capitalize;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,tabIndex:0,children:r.map((function(e,t){return(0,o.createComponentVNode)(2,i.Button,{color:"transparent",fluid:!0,id:t,onClick:function(){return a(t)},onDblClick:function(e){e.preventDefault(),n("submit",{entry:r[d]})},onkeydown:function(e){var t=window.event?e.which:e.keyCode,n=String.fromCharCode(t);e.shiftKey||(n=n.toLowerCase()),l&&1===e.key.length&&(e.preventDefault(),e.stopPropagation(),c(n))},selected:t===d,style:{animation:"none",transition:"none"},children:s?e.replace(/^\w/,(function(e){return e.toUpperCase()})):e},t)}))})},C=function(e,t){var n=(0,u.useBackend)(t).act,r=e.filteredItems,a=e.onSearch,c=e.searchQuery,l=e.selected;return(0,o.createComponentVNode)(2,i.Input,{autoFocus:!0,autoSelect:!0,fluid:!0,id:"search_bar",onEnter:function(e){e.preventDefault(),n("submit",{entry:r[l]})},onInput:function(e,t){return a(t)},placeholder:"Search...",value:c})}},56596:function(e,t,n){"use strict";t.__esModule=!0,t.LocalGenerator=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(41161);t.LocalGenerator=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.holding,p=u.internalCell,m=u.connectedAPC,f=u.chargeAPC,h=u.boltsStatus,g=u.generatorStatus;return(0,o.createComponentVNode)(2,a.Window,{title:d,width:300,height:470,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Generator",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("toggle-bolts")},icon:h?"toggle-on":"toggle-off",children:"Toggle Floor Bolts"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Status:"}),h?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"ACTIVE"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"average",children:"INACTIVE"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("toggle-generator")},icon:g?"toggle-on":"toggle-off",children:"Toggle Generator"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Status:"}),g?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"ACTIVE"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"average",children:"INACTIVE"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("swap-target")},icon:"bolt",children:"Change Target"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Target:"}),f?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"APC"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"CELL"})]})})]})}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:s,onEjectTank:function(){l("eject-tank")}}),(0,o.createComponentVNode)(2,i.Section,{title:"Internal Cell",height:7.25,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!p,onClick:function(){l("eject-cell")},children:"Eject"}),children:p?(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:p.name})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.chargePercent,minValue:0,maxValue:100,color:p.chargePercent<20?"red":p.chargePercent<50?"yellow":"green"})})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No cell"})}),(0,o.createComponentVNode)(2,i.Section,{title:"Local APC",height:7.25,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"wifi",disabled:!s,onClick:function(){l("connect-APC")},children:"Connect"}),children:m?(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:m.name})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:m.chargePercent,minValue:0,maxValue:100,color:m.chargePercent<20?"red":m.chargePercent<50?"yellow":"green"})})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No connected APC"})})]})})})}},83329:function(){},56403:function(e,t,n){"use strict";t.__esModule=!0,t.LongRangeTeleporter=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.LongRangeTeleporter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.destinations,d=l.receive_allowed,s=l.send_allowed,p=l.syndicate;return(0,o.createComponentVNode)(2,i.Window,{theme:p?"syndicate":"ntos",width:390,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Destinations",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:u.length?u.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.destination,children:[!!s&&(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",onClick:function(){return c("send",{target:e.ref,name:e.destination})},children:"Send"}),!!d&&(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",onClick:function(){return c("receive",{target:e.ref,name:e.destination})},children:"Receive"})]},e.destination)})):(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:"No destinations are currently available."})})})})})}},46045:function(e,t,n){"use strict";t.__esModule=!0,t.MechanicalDropper=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(51418),c=n(97622),l=n(26949),u=function(e){var t=e.transferMode,n=e.onTransferModeChange;return(0,o.createComponentVNode)(2,l.Section,{fitted:!0,py:.6,pl:.6,pr:1.2,children:(0,o.createComponentVNode)(2,l.Tabs,{vertical:!0,children:[(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:0===t,color:"green",onClick:function(){return n(0)},children:"Draw"}),(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:1===t,color:"red",onClick:function(){return n(1)},children:"Drop"})]})})},d=function(e){var t=e.curTransferAmt,n=e.minTransferAmt,r=e.maxTransferAmt,a=e.onTransferAmtChange,c=e.reagents;return(0,o.createComponentVNode)(2,l.Section,{children:[(0,o.createComponentVNode)(2,i.ReagentBar,{container:c}),(0,o.createComponentVNode)(2,l.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{textAlign:"center",width:"3em",content:"Min",onClick:function(){return a(n)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,l.Slider,{minValue:n,maxValue:r,stepPixelSize:20,step:1,value:t,onChange:function(e,t){return a(t)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{textAlign:"center",width:"3em",content:"Max",onClick:function(){return a(r)}})})]})]})};t.MechanicalDropper=function(e,t){var n=(0,a.useBackend)(t),i=n.act,s=n.data,p=s.curTransferAmt,m=s.minTransferAmt,f=s.maxTransferAmt,h=s.transferMode,g=s.reagents;return(0,o.createComponentVNode)(2,r.Window,{title:"Mechanical Dropper",width:400,height:105,children:(0,o.createComponentVNode)(2,r.Window.Content,{children:(0,o.createComponentVNode)(2,l.Stack,{children:[(0,o.createComponentVNode)(2,l.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,u,{transferMode:h,onTransferModeChange:function(e){i("mode",{mode:e})}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,d,{curTransferAmt:p,minTransferAmt:m,maxTransferAmt:f,onTransferAmtChange:function(e){e=(0,c.round)((0,c.clamp)(e,m,f),1),i("amt",{amt:e})},reagents:g})})]})})})}},17526:function(e,t,n){"use strict";t.__esModule=!0,t.MineralMagnet=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.MineralMagnet=function(e,t){var n,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.isLinked,p=d.magnetActive,m=d.magnetAutomaticMode,f=d.magnetCooldownOverride,h=d.magnetHealth,g=d.magnetLastUsed,C=d.time,N=d.linkedMagnets||[],v=d.miningEncounters||[],b=g>C,V=(0,r.useLocalState)(t,"viewEncounters",!1),y=V[0],x=V[1];return(0,o.createComponentVNode)(2,c.Window,{width:300,height:240,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Magnet Status",children:[(0,o.createComponentVNode)(2,a.Box,{children:["Condition: ",s?(n=h,n>=95?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"good",children:"Optimal"}):n>=70?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"olive",children:"Mild Structural Damage"}):n>=40?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"yellow",children:"Heavy Structural Damage"}):n>=10?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"average",children:"Extreme Structural Damage"}):(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"Destruction Imminent"})):(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"No Magnet Linked"})]}),(0,o.createComponentVNode)(2,a.Box,{children:["Status: ",p?"Pulling New Mineral Source":b?(0,o.createFragment)([(0,o.createTextVNode)("Cooling Down: "),(0,o.createComponentVNode)(2,a.TimeDisplay,{value:Math.max(g-C,0),timing:!0,format:function(e){return(0,i.formatTime)(e)}})],4):"Idle"]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Magnet Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",icon:"rss",onClick:function(){return u("geoscan")},children:"Scan"}),children:[(!!p||b&&!f)&&(0,o.createComponentVNode)(2,a.Dimmer,{fontSize:1.75,pb:2,children:p?"Magnet Active":"On Cooldown"}),(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",color:b&&f&&"average",icon:"magnet",onClick:function(){return u("activatemagnet")},fluid:!0,children:"Activate Magnet"}),(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",color:b&&f&&"average",icon:"search",disabled:!v.length,onClick:function(){return x(!0)},fluid:!0,children:"Activate telescope location"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:f,onClick:function(){return u("overridecooldown")},style:{"z-index":"1"},children:"Override Cooldown"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:m,onClick:function(){return u("automode")},style:{"z-index":"1"},children:"Automatic Mode"})]}),y&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,ml:1,width:"230px",height:"200px",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:v.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){u("activateselectable",{encounter_id:e.id}),x(!1)},fluid:!0,children:e.name},e.id)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,pt:.5,color:"label",children:[(0,o.createComponentVNode)(2,a.Icon,{name:"search"})," Choose a location"]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return x(!1)},children:"Cancel"})})]})})]})}),!!s||(0,o.createComponentVNode)(2,a.Modal,{full:!0,ml:1,width:"270px",height:"200px",children:(0,o.createComponentVNode)(2,a.Section,{title:"Choose Linked Magnet",scrollable:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",icon:"rss",fluid:!0,onClick:function(){return u("magnetscan")},children:"Scan for Magnets"}),(0,o.createComponentVNode)(2,a.Divider),N.map((function(e){var t;return(0,o.createComponentVNode)(2,a.Button,{icon:e.angle===undefined?"circle":"arrow-right",iconRotation:null!=(t=e.angle)?t:0,textAlign:"center",fluid:!0,onClick:function(){return u("linkmagnet",e)},children:e.name+" at ("+e.x+", "+e.y+")"},e.ref)}))]})})]})})}},2960:function(e,t,n){"use strict";t.__esModule=!0,t.Minimap=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.Minimap=function(e,t){var n=(0,r.useBackend)(t).data,c=n.title,l=n.theme,u=n.minimap_id;return(0,o.createComponentVNode)(2,i.Window,{title:c,theme:l,width:610,height:640,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:u,type:"map"},style:{width:"600px",height:"600px"}})})})}},3082:function(e,t,n){"use strict";t.__esModule=!0,t.MinimapController=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331);t.MinimapController=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.title,s=u.theme,p=u.minimap_id,m=u.markers_visible,f=u.selecting_coordinates,h=u.minimap_markers,g=u.placable_marker_states,C=u.placable_marker_images,N=u.icon,v=u.image,b=u.pos_x,V=u.pos_y,y=(0,r.useLocalState)(t,"name"),x=y[0],I=y[1],k=(0,r.useLocalState)(t,"show_menu",!1),w=k[0],S=k[1];return(0,o.createComponentVNode)(2,i.Window,{title:d,theme:s,width:750,height:390,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{justify:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Minimap",fill:!0,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"undo",color:"green",content:"Reset Map Scale",onClick:function(){return l("reset_scale")}}),children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:p,type:"map"},style:{width:"300px",height:"300px"}})})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Minimap Markers",fill:!0,buttons:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",color:"green",content:"New",onClick:function(){return S(!w)}}),(0,o.createComponentVNode)(2,a.Button,{icon:m?"eye-slash":"eye",color:m?"red":"green",content:m?"Hide All":"Show All",onClick:function(){return l("toggle_visibility_all")}})]}),children:[!!w&&(0,o.createComponentVNode)(2,a.Modal,{mr:2,children:(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{backgroundColor:"black",children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,height:"150px",width:"150px",src:"data:image/png;base64,"+v})}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:"10px",children:[(0,o.createComponentVNode)(2,a.Input,{placeholder:"Marker Name",fluid:!0,value:x,onChange:function(e,t){return I(t)}}),(0,o.createComponentVNode)(2,a.Dropdown,{selected:N,width:"150px",options:g,onSelected:function(e){return function(e){u.icon=e,u.image=C[e],l("update_icon",{icon:e})}(e)},mt:"10px"}),(0,o.createComponentVNode)(2,a.Flex,{mt:"10px",justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{className:"minimap-controller__number-inputs",minValue:1,maxValue:300,value:b,format:function(e){return"x, "+e},onDrag:function(e,t){return function(e){u.pos_x=e}(t)}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{className:"minimap-controller__number-inputs",minValue:1,maxValue:300,value:V,format:function(e){return"y, "+e},onDrag:function(e,t){return function(e){u.pos_y=e}(t)}})})]}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",color:f?"orange":"default",content:f?"Select Position":"Select (x, y) From Map",onClick:function(){return l("location_from_minimap")},mt:"10px"}),(0,o.createComponentVNode)(2,a.Flex,{mt:"20px",justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"check",color:"green",content:"Confirm",onClick:function(){return S(!w),void l("new_marker",{name:x,icon:N,pos_x:b,pos_y:V})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"xmark",color:"red",content:"Cancel",onClick:function(){return S(!w),void l("cancel_new_marker")}})})]})]})]})})}),(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:Object.keys(h).map((function(e){return(0,o.createComponentVNode)(2,a.Flex,{className:"minimap-controller__marker-list",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{fontSize:1.1,bold:!0,children:(0,c.capitalize)(u.minimap_markers[e].name)}),(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,lineHeight:1.7,children:u.minimap_markers[e].pos})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,children:[(0,o.createComponentVNode)(2,a.Button,{className:"minimap-controller__buttons",icon:u.minimap_markers[e].visible?"eye":"eye-slash",color:u.minimap_markers[e].visible?"green":"red",onClick:function(){return l("toggle_visibility",{index:u.minimap_markers[e].index})}}),(0,o.createComponentVNode)(2,a.Button,{className:"minimap-controller__buttons",icon:"trash-alt",color:"red",disabled:!u.minimap_markers[e].can_be_deleted,onClick:function(){return l("delete_marker",{index:u.minimap_markers[e].index})}})]})]},u.minimap_markers[e])}))})})})})]})})]})})})}},5244:function(e,t,n){"use strict";t.__esModule=!0,t.MixingDesk=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.MixingDesk=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.voices,s=u.selected_voice,p=u.say_popup,m=(0,r.useSharedState)(t,"message",null),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{height:375,width:370,children:(0,o.createComponentVNode)(2,i.Window.Content,{onkeydown:function(e){var t=String.fromCharCode(e.keyCode),n=!0;if("T"===t)l("say_popup");else if(27===e.keyCode&&p)l("cancel_say"),h("");else if(p)n=!1;else{var o=Number(t);String(o)===t?l("switch_voice",{id:o}):n=!1}n&&e.stopPropagation()},children:[!!p&&(0,o.createComponentVNode)(2,a.Modal,{children:["Say as ",s>0&&s<=d.length?d[s-1].name:"yourself",":",(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{pt:"5px",pr:"10px",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,selfClear:!0,width:20,value:f,onEnter:function(e,t){window.focus(),l("say",{message:t}),h("")},onChange:function(e,t){return h(t)}})}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("say",{message:f}),h("")},children:"Say"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("cancel_say"),h("")},children:"Cancel"})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Voice Synthesizer",children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[d.map((function(e,t){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t+1+" "+(0,c.truncate)(e.name,18)+(e.accent?" ["+e.accent+"]":""),labelColor:t+1===s?"red":"label",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"trash-alt",onClick:function(){return l("remove_voice",{id:t+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"bullhorn",onClick:function(){return l("say_popup",{id:t+1})}})]},e.name)})),(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return l("add_voice")},disabled:d.length>=9})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{position:"right",content:"Press T to talk and 1-9 keys to switch voices. Press 0 to reset to your normal voice.",children:(0,o.createComponentVNode)(2,a.Icon,{name:"question-circle"})})})]})})]})]})]})})}},71417:function(e,t,n){"use strict";t.__esModule=!0,t.MusicInstrument=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381);t.MusicInstrument=function(e,t){var n=(0,a.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.notes,p=u.volume,m=u.transpose,f=u.keybindToggle,h=u.noteKeysString,g=(0,a.useLocalState)(t,"keyboardBindingsOrder",h.split("")),C=g[0],N=g[1],v=(0,a.useLocalState)(t,"keyboardActivekeys",{}),b=v[0],V=v[1],y=(0,a.useLocalState)(t,"keyOffset",0),x=y[0],I=y[1],k=function(){l(!f?"play_keyboard_on":"play_keyboard_off")},w=function(e){return e+m>=0&&e+m<s.length},S=function(e){if(w(e)&&!b[e]){l("play_note",{note:e+m,volume:p});var t=b;t[s[e]]=!0,V(t)}},_=function(e){if(w(e)){var t=b;t[s[e]]=!1,V(t)}},M=function(e){var t=x+C.findIndex((function(t){return t===e}));return t>=0?t:-1};return(0,o.createComponentVNode)(2,c.Window,{title:d,width:50+30*s.length,height:410,children:(0,o.createComponentVNode)(2,c.Window.Content,{onKeyUp:function(e){if(f){var t=M(e.key);_(t)}},onKeyDown:function(e){if(f){var t=M(e.key);S(t)}"Control"===e.key&&k()},children:(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyboardwrapper",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__outerpanel",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__speaker"}),(0,o.createComponentVNode)(2,i.Flex,{direction:"column",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyboardsupport",children:[(0,o.createComponentVNode)(2,i.Button,{className:"instrument__toggle-keyboard-button",title:"Toggle keyboard support (toggle with ctrl)",onClick:k,icon:"keyboard"}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keybind-indicator",style:{"box-shadow":"0px 0px 5px "+(f?"#1b9b37":"#5a1919"),background:f?"#1b9b37":"#5a1919"}})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:24,minValue:-24,maxValue:24,value:x,onDrag:function(e,t){return I(t)},title:"Keybind offset"}),(0,o.createVNode)(1,"span",null,"Offset",16)]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument_panel-info",children:(0,o.createVNode)(1,"h1",null,d.toUpperCase(),0,{style:{"text-align":"center"}})}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:1,minValue:0,maxValue:100,title:"Volume",value:p,onDrag:function(e,t){l("set_volume",{value:t})}}),(0,o.createVNode)(1,"span",null,"Volume",16)]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:6,minValue:-12,maxValue:12,title:"Transpose",value:m,onDrag:function(e,t){l("set_transpose",{value:t})}}),(0,o.createVNode)(1,"span",null,"Transpose",16)]})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyorder",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__instructions",fontSize:"1.1em",children:"Key binding order for keyboard input"}),(0,o.createComponentVNode)(2,i.Input,{className:"instrument__input_keyorder",value:C.join(""),onInput:function(e,t){return N(t.split(""))}}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__instructions",fontSize:"0.8em",bold:!0,children:"Type in the order you wish the keybindings to be placed"})]})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__speaker"})]}),(0,o.createVNode)(1,"ul","instruments__piano",s.map((function(e,t){var n=e.includes("-"),a=C[t-x],c=n?"instruments__piano-key-black":"instruments__piano-key-white",l=["d","e","g","a","b"].includes(e.split("")[0])&&!n?"instruments__piano-key-white-offset":"";return(0,o.createVNode)(1,"li",(0,r.classes)(["instruments__piano-key",c,l,b[s[t]]?n?"instruments__piano-key-black-active":"instruments__piano-key-white-active":""]),(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notedetails",children:[a&&(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notekey",children:a}),(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notename",children:e.replace("-","#")})]}),2,{onMouseDown:function(){return S(t)},onMouseLeave:function(){return _(t)},onMouseUp:function(){return _(t)}},t)})),0)]})})})}},14086:function(e,t,n){"use strict";t.__esModule=!0,t.NuclearReactor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=n(48175),u=n(97622),d=273.15,s=function(e){var t=e.onClick,n=e.components,r=e.rowID,i=e.emptySlotIcon;return(0,o.createComponentVNode)(2,a.Table.Row,{children:n.map((function(e,n){if(null===e)return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,color:"transparent",m:1,onClick:function(){return t("slot",{x:r+1,y:n+1})},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","border-color":"#AAAAAA","border-style":"solid","border-radius":"4px","horizontal-align":"middle"}})},name)});var s=e.x,p=e.y,m=e.name,f=e.img,h=e.temp,g=e.extra,C=e.flux;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,tooltip:(0,o.createFragment)([(0,c.capitalize)(m),(0,o.createVNode)(1,"br"),(0,u.round)(h-d,2),(0,o.createTextVNode)(" \xb0C"),""!==g?(0,o.createFragment)([(0,o.createVNode)(1,"br"),g],0):"",null!==C?(0,o.createFragment)([(0,o.createVNode)(1,"br"),C,(0,o.createTextVNode)(" Neutrons")],0):""],0),color:"transparent",m:1,onClick:function(){return t("slot",{x:s,y:p})},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+f,style:{"box-shadow":"0px 0px 20px "+(0,l.getTemperatureColor)(h,2e3),"vertical-align":"middle","border-color":""+(0,l.getTemperatureColor)(h,2e3),"border-style":"solid","border-radius":"4px","horizontal-align":"middle"}})},m)})}))})},p=function(e){var t=e.onClick,n=e.components,r=e.emptySlotIcon;return(0,o.createComponentVNode)(2,a.Table,{children:n.map((function(e,n){e.comp;return(0,o.createComponentVNode)(2,a.Table.Row,{children:(0,o.createComponentVNode)(2,s,{rowID:n,components:e,onClick:t,emptySlotIcon:r})},!0)}))})};t.NuclearReactor=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,s=l.gridW,m=l.gridH,f=l.emptySlotIcon,h=l.components,g=l.reactorTemp,C=l.reactorRads,N=l.configuredControlRodLevel,v=l.actualControlRodLevel;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Nuclear Reactor",width:500,height:700,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,p,{gridW:s,gridH:m,onClick:c,components:h,emptySlotIcon:f})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Reactor Temperature:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0-d,maxValue:1500,size:5,value:g,format:function(e){return(0,u.round)(e-d,2)+" \xb0C"},alertAfter:1200,ranges:{good:[0-d,1e3],average:[1e3,1200],bad:[1200,1500]}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Radiation Level:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0,maxValue:100,size:5,value:C,format:function(e){return(0,u.round)(e,1)+" clicks"},alertAfter:15,ranges:{good:[0,5],average:[5,50],bad:[50,100]}})]})]})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Control Rod Insertion:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0,maxValue:100,size:5,value:v,format:function(e){return(0,u.round)(e,1)+"%"},alertBefore:20,ranges:{bad:[0,20],average:[20,80],good:[80,100]}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-double-left",onClick:function(){return c("adjustCR",{crvalue:0})}}),(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-left",onClick:function(){return c("adjustCR",{crvalue:N-5})}}),N," %",(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-right",onClick:function(){return c("adjustCR",{crvalue:N+5})}}),(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-double-right",onClick:function(){return c("adjustCR",{crvalue:100})}}),(0,o.createComponentVNode)(2,a.Knob,{animated:!0,size:3,value:N,minValue:0,maxValue:100,format:function(e){return e+"%"},onDrag:function(e,t){return c("adjustCR",{crvalue:t})}})]})]})})]})})}},12660:function(e,t,n){"use strict";t.__esModule=!0,t.NumberInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(57890),c=n(31246),l=n(26949),u=n(2381);t.NumberInputModal=function(e,t){var n=(0,c.useBackend)(t),s=n.act,p=n.data,m=p.message,f=p.init_value,h=p.round_input,g=p.timeout,C=p.title,N=p.theme,v=(0,c.useLocalState)(t,"input",f),b=v[0],V=v[1],y=125+Math.ceil((null==m?void 0:m.length)/3);return(0,o.createComponentVNode)(2,u.Window,{title:C,width:270,height:y,theme:N||"nanotrasen",children:[g&&(0,o.createComponentVNode)(2,r.Loader,{value:g}),(0,o.createComponentVNode)(2,u.Window.Content,{onKeyDown:function(e){var t=window.event?e.which:e.keyCode;t===i.KEY_ENTER&&s("submit",{entry:b}),t===i.KEY_ESCAPE&&s("cancel")},children:(0,o.createComponentVNode)(2,l.Section,{fill:!0,children:(0,o.createComponentVNode)(2,l.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Box,{color:"label",children:m})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,d,{input:b,onClick:function(e){V(h?Math.round(e):e)},onChange:function(e){V(h?Math.round(e):e)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{pl:4,pr:4,children:(0,o.createComponentVNode)(2,a.InputButtons,{input:b})})]})})})]})};var d=function(e,t){var n=(0,c.useBackend)(t).data,r=n.min_value,a=n.max_value,i=n.init_value,u=e.input,d=e.onClick,s=e.onChange;return(0,o.createComponentVNode)(2,l.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"angle-double-left",onClick:function(){return d(r||0)},tooltip:"Minimum"})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,l.NumberInput,{autoFocus:!0,autoSelect:!0,fluid:!0,minValue:r,maxValue:a,onChange:function(e,t){return s(t)},onDrag:function(e,t){return s(t)},value:null!==u?u:i})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"angle-double-right",onClick:function(){return d(null!==a?a:1e4)},tooltip:"Max"})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"redo",onClick:function(){return d(i||0)},tooltip:"Reset"})})]})}},55223:function(e,t,n){"use strict";t.__esModule=!0,t.ObserverMenu=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=function(e,t){var n=(0,r.useBackend)(t).act,a=e.obsObject,c=null,l=a.name,u=null;return a.dead&&(c="skull"),a.name!==a.real_name&&(l+=" ("+a.real_name+")"),null!==a.job&&(u="Job: "+a.job),a.dup_name_count>0&&(l+=" #"+a.dup_name_count),a.ghost_count>0&&(c="ghost",l=a.ghost_count+" "+l),null!==a.antag&&(l+=" ["+a.antag+"]"),(0,o.createComponentVNode)(2,i.Button,{icon:c,onClick:function(){return n("observe",{targetref:a.ref})},tooltip:u,children:l},a.ref)};t.ObserverMenu=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=(0,r.useLocalState)(t,"searchQuery",""),s=d[0],p=d[1],m=u.mydata.filter((function(e){var t,n,o,r;return(null==e||null==(t=e.name)?void 0:t.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(n=e.real_name)?void 0:n.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(o=e.job)?void 0:o.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(r=e.antag)?void 0:r.toLowerCase().includes(s.toLowerCase()))})),f=(0,r.useLocalState)(t,"filterDead",!1),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,a.Window,{title:"Choose something to observe",width:600,height:600,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Observables",buttons:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,id:"random_observe_button",disabled:0===u.mydata.filter((function(e){return e.player&&!e.dead})).length,onClick:function(){var e,t,n;return l("observe",{targetref:null==(t=u.mydata,n=t.filter((function(e){return e.player&&!e.dead})),e=n[Math.floor(Math.random()*n.length)])?void 0:e.ref})},icon:"random",tooltip:"Observe a random player"}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,icon:"skull",tooltip:h?"Show dead mobs":"Hide dead mobs",id:"dead_filter_button",checked:!h,onClick:function(){return g(!h)}}),(0,o.createComponentVNode)(2,i.Input,{width:20,autoFocus:!0,autoSelect:!0,fluid:!0,id:"search_bar",onInput:function(e,t){var n;(n=t)!==s&&p(n)},placeholder:"Search by name or job",value:s})]}),children:[(0,o.createComponentVNode)(2,i.Collapsible,{title:"Antagonists",open:!!u.dnrset,color:"red",children:[!u.dnrset&&(0,o.createComponentVNode)(2,i.BlockQuote,{children:"You must set DNR to view the antagonists"}),m.filter((function(e){return null!==e.antag&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))]},"Antags"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"Players",open:!0,color:"green",children:m.filter((function(e){return e.player&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"Players"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"NPCs",color:"blue",children:m.filter((function(e){return e.npc&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"NPCs"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"Objects",color:"brown",children:m.filter((function(e){return!e.npc&&!e.player})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"Objects")]})})})}},35851:function(e,t,n){"use strict";t.__esModule=!0,t.OperatingComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(65751),l=n(84200),u=n(51418),d=n(818),s=n(18331),p=n(9720);t.OperatingComputer=function(e,t){var n=(0,r.useSharedState)(t,"tabIndex",1),c=n[0],l=n[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Operating Computer",width:"560",height:"760",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===c,onClick:function(){return l(1)},children:"Patient Health"})}),(0,o.createComponentVNode)(2,m,{tabIndex:c})]})})};var m=function(e){if(1===e.tabIndex)return(0,o.createComponentVNode)(2,g)},f=function(e){var t=e.occupied,n=e.patient_status,r=e.isCrit,i="NONE",c="grey";return t&&(2===n?(i="DEAD",c="red"):r?(i="CRIT",c="orange"):0!==n&&n?1===n&&(i="UNCON",c="yellow"):(i="STABLE",c="green")),(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Status"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,children:(0,o.createComponentVNode)(2,a.Box,{color:c,children:i})})]})},h=function(e){var t=e.health_text,n=e.health_color;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Overall Health"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,children:(0,o.createComponentVNode)(2,a.Box,{color:n,children:[t,(0,o.createComponentVNode)(2,a.Box,{as:"span",color:"white",children:"%"})]})})]})},g=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,w,{occupied:n.occupied,patient_name:n.patient_name,patient_health:n.current_health,patient_max_health:n.max_health,patient_status:n.patient_status}),(0,o.createComponentVNode)(2,y),(0,o.createComponentVNode)(2,a.Section,{title:"Key Health Indicators",children:(0,o.createComponentVNode)(2,p.KeyHealthIndicators,{mobData:n})}),(0,o.createComponentVNode)(2,x,{occupied:n.occupied,organs:n.organ_status,limbs:n.limb_status}),(0,o.createComponentVNode)(2,I,{occupied:n.occupied,reagent_container:n.reagent_container}),(0,o.createComponentVNode)(2,k,{occupied:n.occupied,age:n.age,blood_type:n.blood_type,blood_color_value:n.blood_color_value,blood_color_name:n.blood_color_name,clone_generation:n.clone_generation,cloner_defect_count:n.cloner_defect_count,genetic_stability:n.genetic_stability})]})},C=function(e){var t=e.metric,n=e.value,r=e.metric_data,i=e.title;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:25,children:(0,o.createComponentVNode)(2,c.HealthStat,{type:t,children:[i,(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{fontSize:4,children:n}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:r,rangeX:[0,r.length-1],rangeY:[0,Math.max(100,(0,d.getStatsMax)(r))],strokeColor:l.COLORS.damageType[t],fillColor:l.COLORS.damageTypeFill[t]})})]})})},N=function(e){var t=e.occupied,n=e.organs;if(t)return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Organ"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Status"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,v,{organ:e.organ,state:e.state,color:e.color,special:e.special},e.organ)}))]})})},v=function(e){var t=e.organ,n=e.state,r=e.color,i=e.special;if("Okay"!==n||i)return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",width:10,children:[(0,s.capitalize)((0,s.spaceUnderscores)(t)),":"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:10,color:r,bold:"Missing"===n||"Dead"===n||"Critical"===n,children:["Okay"!==n&&n,i&&(0,o.createComponentVNode)(2,a.Box,{color:"white",children:i})]})]})},b=function(e){var t=e.occupied,n=e.limbs;if(t)return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Limb"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Status"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,V,{limb:e.limb,status:e.status},e.limb)}))]})})},V=function(e){var t=e.limb,n=e.status;if("Okay"!==n)return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",width:10,children:[(0,s.capitalize)((0,s.spaceUnderscores)(t)),":"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:10,color:"Missing"===n?"red":"white",bold:"Missing"===n,children:n})]})},y=function(e,t){var n=(0,r.useBackend)(t).data,i=(0,d.processStatsData)(n.patient_data),c=n.occupied?Math.floor(n.oxygen).toString():"--",l=n.occupied&&i?i.oxygen:[],u=n.occupied?Math.floor(n.toxin).toString():"--",s=n.occupied&&i?i.toxin:[],p=n.occupied?Math.floor(n.burn).toString():"--",m=n.occupied&&i?i.burn:[],f=n.occupied?Math.floor(n.brute).toString():"--",h=n.occupied&&i?i.brute:[];return(0,o.createComponentVNode)(2,a.Section,{title:"Vitals",children:(0,o.createComponentVNode)(2,a.Stack,{textAlign:"center",children:[(0,o.createComponentVNode)(2,C,{title:"Suffocation",value:c,metric_data:l,metric:"oxy"}),(0,o.createComponentVNode)(2,C,{title:"Toxin",value:u,metric_data:s,metric:"toxin"}),(0,o.createComponentVNode)(2,C,{title:"Burn",value:p,metric_data:m,metric:"burn"}),(0,o.createComponentVNode)(2,C,{title:"Brute",value:f,metric_data:h,metric:"brute"})]})})},x=function(e){var t=e.occupied,n=e.organs,r=e.limbs;return(0,o.createComponentVNode)(2,a.Section,{title:"Anatomical Anomalies",color:!t&&"grey",children:(0,o.createComponentVNode)(2,a.Stack,{children:[!!t&&(0,o.createComponentVNode)(2,N,{occupied:t,organs:n}),!!t&&(0,o.createComponentVNode)(2,b,{occupied:t,limbs:r}),!t&&"No Patient Detected"]})})},I=function(e){var t=e.occupied,n=e.reagent_container;return(0,o.createComponentVNode)(2,a.Section,{title:"Bloodstream Contents",children:[!!t&&(0,o.createComponentVNode)(2,u.ReagentGraph,{container:n}),!t&&"No Patient Detected"]})},k=function(e){var t=e.occupied,n=e.age,r=e.blood_type,i=e.blood_color_value,c=e.blood_color_name,l=e.clone_generation,u=e.cloner_defect_count,d=e.genetic_stability;return t?(0,o.createComponentVNode)(2,a.Section,{title:"Genetic Analysis",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Age:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:n})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Blood Type:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:r})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Blood Color:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[(0,o.createComponentVNode)(2,a.ColorBox,{backgroundColor:i})," ",(0,o.createVNode)(1,"span",null,c,0)]})]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:14,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Clone Generation:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:l})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Genetic Defects:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:u})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Genetic Stability:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:d})]})]})})]})}):(0,o.createComponentVNode)(2,a.Section,{title:"Genetic Analysis",color:"grey",children:"No Patient Detected"})},w=function(e){var t=e.occupied,n=e.patient_name,r=e.patient_health,i=e.patient_max_health,c=e.patient_status,l=t?"white":"grey",u=t&&r<0,d=t?Math.floor(100*r/i):0,s="--",p="grey";return t&&(i<=0?(p="purple",s="???"):(s=d.toString(),p=d>=51&&d<=100?"green":d>=1&&d<=50?"yellow":"red")),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:60,children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Patient Name"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,color:l,children:[!!n&&n,!n&&"No Patient Detected"]})]}),(0,o.createComponentVNode)(2,h,{health_text:s,health_color:p}),(0,o.createComponentVNode)(2,f,{occupied:t,patient_status:c,isCrit:u})]})}},36273:function(){},69412:function(e,t,n){"use strict";t.__esModule=!0,t.PaperSheet=t.PaperSheetView=void 0;var o,r=n(96323),a=n(57723),i=(o=n(12800))&&o.__esModule?o:{"default":o},c=n(31246),l=n(26949),u=n(2381),d=n(97622),s=n(81890);function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function m(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return f(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return f(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function h(){h=function(e,t){return new n(e,undefined,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,o,r){var a=new RegExp(e,o);return t.set(a,r||t.get(e)),g(a,n.prototype)}function o(e,n){var o=t.get(n);return Object.keys(o).reduce((function(t,n){return t[n]=e[o[n]],t}),Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&g(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);return n&&(n.groups=o(n,this)),n},n.prototype[Symbol.replace]=function(n,r){if("string"==typeof r){var a=t.get(this);return e[Symbol.replace].call(this,n,r.replace(/\$<([^>]+)>/g,(function(e,t){return"$"+a[t]})))}if("function"==typeof r){var i=this;return e[Symbol.replace].call(this,n,(function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(o(e,i)),r.apply(this,e)}))}return e[Symbol.replace].call(this,n,r)},h.apply(this,arguments)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}var C=5e3,N=function(e,t,n,o){return void 0===o&&(o=!1),'<span style="color:'+n+";font-family:"+t+";"+(o?"font-weight: bold;":"")+'">'+e+"</span>"},v=/\[(_+)\]/g,b=h(/\[<input[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+(?!disabled)(.*?)[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+id="(paperfield_[0-9]+)"(.*?)\/>\]/gm,{id:2}),V=/%s(?:ign)?(?=\\s|$)?/gim,y=function(e,t,n,o,r){var a=e.replace(v,(function(e,a,i,c){var l=function(e,t,n){t=n+"x "+t;var o=document.createElement("canvas").getContext("2d");return o.font=t,o.measureText(e).width}(e,t,n)+"px";return function(e,t,n,o,r,a){return'[<input type="text" style="font:\''+o+"x "+n+"';color:'"+r+"';min-width:"+t+";max-width:"+t+';" id="'+a+'" maxlength='+e+" size="+e+" />]"}(a.length,l,t,n,o,"paperfield_"+r++)}));return{counter:r,text:a}},x=function(e,t){var n=e.image,o=e.opacity,i=e.activeStamp,c={left:n.x+"px",top:n.y+"px",transform:"rotate("+n.rotate+"deg)",opacity:o||1};return n.sprite.match("stamp-.*")?(0,r.createVNode)(1,"img","paper__stamp",null,1,{id:i&&"stamp",style:c,src:(0,a.resolveAsset)(n.sprite)}):(0,r.createComponentVNode)(2,l.Box,{id:i&&"stamp",style:c,className:"paper__stamp-text",children:n.sprite})},I=function(e,t){var n,o,a=e.value,i=void 0===a?"":a,c=e.stamps,u=void 0===c?[]:c,d=e.backgroundColor,s=e.readOnly,p=u||[],m={__html:'<span class="paper-text">'+(n=i,o=s,(o?n.replace(/<input\s[^d]/g,"<input disabled "):n.replace(/<input\sdisabled\s/g,"<input "))+"</span>")};return(0,r.createComponentVNode)(2,l.Box,{className:"paper__page",position:"relative",backgroundColor:d,width:"100%",height:"100%",children:[(0,r.createComponentVNode)(2,l.Box,{color:"black",backgroundColor:d,fillPositionedParent:!0,width:"100%",height:"100%",dangerouslySetInnerHTML:m,p:"10px"}),p.map((function(e,t){return(0,r.createComponentVNode)(2,x,{image:{sprite:e[0],x:e[1],y:e[2],rotate:e[3]}},e[0]+t)}))]})};t.PaperSheetView=I;var k=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={x:0,y:0,rotate:0},o.style=null,o.handleMouseMove=function(e){var t=o.findStampPosition(e);t&&(!function(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.cancelBubble=!0,e.returnValue=!1}(e),o.setState({x:t[0],y:t[1],rotate:t[2]}))},o.handleMouseClick=function(e){e.pageY<=30||(0,(0,c.useBackend)(o.context).act)("stamp",{x:o.state.x,y:o.state.y,r:o.state.rotate})},o}p(t,e);var n=t.prototype;return n.findStampPosition=function(e){var t,n=document.querySelector(".Layout__content");e.shiftKey&&(t=!0);var o=document.getElementById("stamp");if(o){var r=o.clientHeight,a=o.clientWidth,i=t?this.state.y:e.pageY+n.scrollTop-r,c=t?this.state.x:e.pageX-a/2,l=n.clientWidth-a,u=n.clientHeight+n.scrollTop-r,s=Math.atan2(e.pageX-c,e.pageY-i),p=t?s*(180/Math.PI)*-1:this.state.rotate;return[(0,d.clamp)(c,0,l),(0,d.clamp)(i,0,u),p]}},n.componentDidMount=function(){document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("click",this.handleMouseClick)},n.componentWillUnmount=function(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("click",this.handleMouseClick)},n.render=function(){var e=this.props,t=e.value,n=e.stampClass,o=e.stamps||[],a={sprite:n,x:this.state.x,y:this.state.y,rotate:this.state.rotate};return(0,r.createFragment)([(0,r.createComponentVNode)(2,I,{readOnly:!0,value:t,stamps:o}),(0,r.createComponentVNode)(2,x,{activeStamp:!0,opacity:.5,image:a})],4)},t}(r.Component),w=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={previewSelected:"Preview",oldText:t.value||"",textAreaText:"",combinedText:t.value||"",showingHelpTip:!1},o}p(t,e);var n=t.prototype;return n.createPreview=function(e,t){void 0===t&&(t=!1);var n,o,r=(0,c.useBackend)(this.context).data,a=r.text,l=r.penColor,u=r.penFont,d=r.isCrayon,p=r.fieldCounter,f=r.editUsr,h={text:a};if((e=e.trim()).length>0){var g=(0,s.sanitizeText)(e),C=(n=l,o=f,g.replace(V,(function(){return N(o,"Times New Roman",n,!0)}))),v=y(C,u,12,l,p),x=function(e){return(0,i["default"])(e,{breaks:!0,smartypants:!0,smartLists:!0,walkTokens:function(e){switch(e.type){case"url":case"autolink":case"reflink":case"link":case"image":e.type="text",e.href=""}},baseUrl:"thisshouldbreakhttp"})}(v.text),I=N(x,u,l,d);h.text+=I,h.fieldCounter=v.counter}if(t){var k=function(e,t,n,o,r){var a;void 0===r&&(r=!1);for(var i={},c=[];null!==(a=b.exec(e));){var l=a[0],u=a.groups.id;if(u){var d=document.getElementById(u);if(0===(d&&d.value?d.value:"").length)continue;var p=(0,s.sanitizeText)(d.value.trim(),[]);if(0===p.length)continue;var f=d.cloneNode(!0);p.match(V)?(f.style.fontFamily="Times New Roman",r=!0,f.defaultValue=o):(f.style.fontFamily=t,f.defaultValue=p),r&&(f.style.fontWeight="bold"),f.style.color=n,f.disabled=!0;var h=document.createElement("div");h.appendChild(f),i[u]=p,c.push({value:"["+h.innerHTML+"]",rawText:l})}}if(c.length>0)for(var g,C=m(c);!(g=C()).done;){var N=g.value;e=e.replace(N.rawText,N.value)}return{text:e,fields:i}}(h.text,u,l,f,d);h.text=k.text,h.formFields=k.fields}return h},n.onInputHandler=function(e,t){var n=this;if(t!==this.state.textAreaText){var o=this.state.oldText.length+this.state.textAreaText.length;if(o>C&&(t=o-C>=t.length?"":t.substr(0,t.length-(o-C)))===this.state.textAreaText)return;this.setState((function(){return{textAreaText:t,combinedText:n.createPreview(t)}}))}},n.finalUpdate=function(e){var t=(0,c.useBackend)(this.context).act,n=this.createPreview(e,!0);t("save",n),this.setState((function(){return{textAreaText:"",previewSelected:"save",combinedText:n.text}}))},n.render=function(){var e=this,t=this.props,n=t.textColor,o=t.fontFamily,a=t.stamps,i=t.backgroundColor;return(0,r.createComponentVNode)(2,l.Flex,{direction:"column",fillPositionedParent:!0,children:[(0,r.createComponentVNode)(2,l.Flex.Item,{children:(0,r.createComponentVNode)(2,l.Tabs,{size:"100%",children:[(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"Edit"===this.state.previewSelected?"grey":"white",selected:"Edit"===this.state.previewSelected,onClick:function(){return e.setState({previewSelected:"Edit"})},children:"Edit"},"marked_edit"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"Preview"===this.state.previewSelected?"grey":"white",selected:"Preview"===this.state.previewSelected,onClick:function(){return e.setState((function(){return{previewSelected:"Preview",textAreaText:e.state.textAreaText,combinedText:e.createPreview(e.state.textAreaText).text}}))},children:"Preview"},"marked_preview"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"confirm"===this.state.previewSelected?"red":"save"===this.state.previewSelected?"grey":"white",selected:"confirm"===this.state.previewSelected||"save"===this.state.previewSelected,onClick:function(){"confirm"===e.state.previewSelected?e.finalUpdate(e.state.textAreaText):"Edit"===e.state.previewSelected?e.setState((function(){return{previewSelected:"confirm",textAreaText:e.state.textAreaText,combinedText:e.createPreview(e.state.textAreaText).text}})):e.setState({previewSelected:"confirm"})},children:"confirm"===this.state.previewSelected?"Confirm":"Save"},"marked_done"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"white",icon:"question-circle-o",onmouseover:function(){e.setState({showingHelpTip:!0})},onmouseout:function(){e.setState({showingHelpTip:!1})},children:"Help"},"marked_help")]})}),(0,r.createComponentVNode)(2,l.Flex.Item,{grow:1,basis:1,children:"Edit"===this.state.previewSelected&&(0,r.createComponentVNode)(2,l.TextArea,{value:this.state.textAreaText,textColor:n,fontFamily:o,height:window.innerHeight-60+"px",backgroundColor:i,onInput:this.onInputHandler.bind(this)})||(0,r.createComponentVNode)(2,I,{value:this.state.combinedText,stamps:a,fontFamily:o,textColor:n})}),this.state.showingHelpTip&&(0,r.createComponentVNode)(2,S)]})},t}(r.Component);t.PaperSheet=function(e,t){var n=(0,c.useBackend)(t).data,o=n.editMode,a=n.text,i=n.paperColor,d=void 0===i?"white":i,s=n.penColor,p=void 0===s?"black":s,m=n.penFont,f=void 0===m?"Verdana":m,h=n.stamps,g=n.stampClass,C=n.sizeX,N=n.sizeY,v=n.name,b=h||[];return(0,r.createComponentVNode)(2,u.Window,{title:v,theme:"paper",width:C||400,height:N||500,children:(0,r.createComponentVNode)(2,u.Window.Content,{backgroundColor:d,scrollable:!0,children:(0,r.createComponentVNode)(2,l.Box,{id:"page",fitted:!0,fillPositionedParent:!0,children:function(e){switch(e){case 0:return(0,r.createComponentVNode)(2,I,{value:a,stamps:b,readOnly:!0});case 1:return(0,r.createComponentVNode)(2,w,{value:a,textColor:p,fontFamily:f,stamps:b,backgroundColor:d});case 2:return(0,r.createComponentVNode)(2,k,{value:a,stamps:b,stampClass:g});default:return"ERROR ERROR WE CANNOT BE HERE!!"}}(o)})})})};var S=function(){return(0,r.createComponentVNode)(2,l.Box,{position:"absolute",left:"10px",top:"25px",width:"300px",height:"350px",backgroundColor:"#E8E4C9",textAlign:"center",children:[(0,r.createVNode)(1,"h3",null,"Markdown Syntax",16),(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Heading"}),"====="]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"h2",null,"Heading",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Sub Heading"}),"------"]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"h4",null,"Sub Heading",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"_Italic Text_"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"i",null,"Italic Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"**Bold Text**"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"b",null,"Bold Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"`Code Text`"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"code",null,"Code Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"~~Strikethrough Text~~"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"s",null,"Strikethrough Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Horizontal Rule"}),"---"]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:["Horizontal Rule",(0,r.createVNode)(1,"hr")]})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:"* List Element 1"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"* List Element 2"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"* Etc..."})]})}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"ul",null,[(0,r.createVNode)(1,"li",null,"List Element 1",16),(0,r.createVNode)(1,"li",null,"List Element 2",16),(0,r.createVNode)(1,"li",null,"Etc...",16)],4)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:"1. List Element 1"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"2. List Element 2"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"3. Etc..."})]})}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"ol",null,[(0,r.createVNode)(1,"li",null,"List Element 1",16),(0,r.createVNode)(1,"li",null,"List Element 2",16),(0,r.createVNode)(1,"li",null,"Etc...",16)],4)})]})]})]})}},21293:function(e,t,n){"use strict";t.__esModule=!0,t.Particool=void 0;var o=n(96323),r=n(97622),a=n(97622),i=n(31246),c=n(26949),l=n(2381),u=n(79926),d=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.NumberInput,{value:n,stepPixelSize:5,width:"39px",onDrag:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"int"}})}})})},s=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return n=n||[1,0,0,1,0,0],(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:(0,o.createComponentVNode)(2,c.Flex.Item,{children:n.map((function(e,t){return(0,o.createComponentVNode)(2,c.NumberInput,{value:e,onDrag:function(e,o){n[t]=o,l("modify_particle_value",{new_data:{name:a,value:n,type:"matrix"}})}},t)}))})})})},p=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):m(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?0:{genType:"num",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"float":"generator"}})}})})]})})},m=function(e,t){var n=e.value,l=e.tooltip,u=e.name,d=(0,i.useBackend)(t).act,s=(0,i.useLocalState)(t,"particleFloatStep",.01),p=s[0];s[1];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:l,children:(0,o.createComponentVNode)(2,c.NumberInput,{value:n,stepPixelSize:4,step:p,format:function(e){return(0,r.toFixed)(e,(0,a.numberOfDecimalDigits)(p))},width:"80px",onDrag:function(e,t){return d("modify_particle_value",{new_data:{name:u,value:t,type:"float"}})}})})},f=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):g(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?[0,0,0]:{genType:"box",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"vector":"generator"}})}})})]})})},h=function(e){return function(t,n){var r=t.value,a=t.tooltip,l=t.name,u=(0,i.useBackend)(n).act;return r=r||Array(e).fill(0),isNaN(r)||(r=Array(e).fill(r)),r=r.slice(0,e),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:a,children:(0,o.createComponentVNode)(2,c.Flex,{children:(0,o.createComponentVNode)(2,c.Flex.Item,{children:r.map((function(e,t){return(0,o.createComponentVNode)(2,c.NumberInput,{value:e,width:"40px",onDrag:function(e,n){r[t]=n,u("modify_particle_value",{new_data:{name:l,value:r,type:"vector"}})}},t)}))})})})}},g=h(3),C=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):h(2)(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?[0,0]:{genType:"box",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"vector":"generator"}})}})})]})})},N=function(e,t){var n=e.value,r=e.name,a=(0,i.useBackend)(t).act,l="",d="",s="",p="";if(u.logger.log(n),n){var m=n.match(/\((.*)\)/);if(4===(m=(m=m||["","","",""])[1].split(", ")).length){l=m[0].replace(/['"]+/g,"");var f=m[1].match(/\((.*)\)/);d=f?f[1]:m[1].replace(/['"]+/g,"");var h=m[2].match(/\((.*)\)/);s=h?h[1]:m[2].replace(/['"]+/g,""),p=m[3]}}var g=(0,i.useLocalState)(t,r+"genType",l),C=g[0],N=g[1],v=(0,i.useLocalState)(t,r+"a",d),b=v[0],V=v[1],y=(0,i.useLocalState)(t,r+"b",s),x=y[0],I=y[1],k=(0,i.useLocalState)(t,r+"rand",p),w=k[0],S=k[1];return(0,o.createComponentVNode)(2,c.Collapsible,{title:"Generator Settings - Hit Set to save",children:(0,o.createComponentVNode)(2,c.Section,{level:2,children:[(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"type",children:(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:""+["num","vector","box","color","circle","sphere","square","cube"].join(", "),children:(0,o.createComponentVNode)(2,c.Input,{value:C,onInput:function(e,t){return N(t)}})})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"A",children:(0,o.createComponentVNode)(2,c.Input,{value:b,onInput:function(e,t){return V(t)}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"B",children:(0,o.createComponentVNode)(2,c.Input,{value:x,onInput:function(e,t){return I(t)}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Rand Type",children:(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:""+["UNIFORM_RAND","NORMAL_RAND","LINEAR_RAND","SQUARE_RAND"].join(", "),children:(0,o.createComponentVNode)(2,c.Input,{value:w,onInput:function(e,t){return S(t)}})})})]}),(0,o.createComponentVNode)(2,c.Button,{content:"Set",onClick:function(){return u.logger.log(C),void a("modify_particle_value",{new_data:{name:r,value:{genType:C,a:b,b:x,rand:w},type:"generator"}})}})]})})},v=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:n,width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"text"}})}})})},b=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=n?Object.keys(n).map((function(e){return n[e]})):[];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:u.join(","),width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"numList"}})}})})},V=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=n?Object.keys(n).map((function(e){return n[e]})):[];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:u.join(","),width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"list"}})}})})},y=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n&&"#"!==n.charAt(0);return u=d?N(e,t):function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:[(0,o.createComponentVNode)(2,c.Button,{icon:"pencil-alt",onClick:function(){return l("modify_color_value")}}),(0,o.createComponentVNode)(2,c.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,c.Input,{value:n,width:"90px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"color"}})}})]})}(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?"#ffffff":{genType:"color",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"color":"generator"}})}})})]})})},x=function(e,t){var n=e.value,r=e.tooltip,a=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:[(0,o.createComponentVNode)(2,c.Button,{icon:"pencil-alt",onClick:function(){return a("modify_icon_value")}}),(0,o.createComponentVNode)(2,c.Box,{inline:!0,ml:1,children:n})]})},I={width:{type:"float_nongen",tooltip:"Width of particle image in pixels"},height:{type:"float_nongen",tooltip:"Height of particle image in pixels"},count:{type:"int",tooltip:"Maximum particle count"},spawning:{type:"float_nongen",tooltip:"Number of particles to spawn per tick (can be fractional)"},bound1:{type:"vector_nongen",tooltip:"Minimum particle position in x,y,z space"},bound2:{type:"vector_nongen",tooltip:"Maximum particle position in x,y,z space"},gravity:{type:"vector_nongen",tooltip:"Constant acceleration applied to all particles in this set (pixels per squared tick)"},gradient:{type:"list",tooltip:"Color gradient used, if any"},transform:{type:"matrix",tooltip:"Transform done to all particles, if any (can be higher than 2D)"},lifespan:{type:"float",tooltip:"Maximum life of the particle, in ticks"},fade:{type:"float",tooltip:"Fade-out time at end of lifespan, in ticks"},fadein:{type:"float",tooltip:"Fade-in time, in ticks"},icon:{type:"icon",tooltip:"Icon to use, if any; no icon means this particle will be a dot"},icon_state:{type:"list",tooltip:"Icon state to use, if any"},color:{type:"color",tooltip:"Particle color; can be a number if a gradient is used"},color_change:{type:"float",tooltip:"Color change per tick; only applies if gradient is used"},position:{type:"vector",tooltip:"x,y,z position, from center in pixels"},velocity:{type:"vector",tooltip:"x,y,z velocity, in pixels"},scale:{type:"vector2",tooltip:"(2D)\tScale applied to icon, if used; defaults to list(1,1)"},grow:{type:"vector2",tooltip:"Change in scale per tick; defaults to list(0,0)"},rotation:{type:"float",tooltip:"Angle of rotation (clockwise); applies only if using an icon"},spin:{type:"float",tooltip:"Change in rotation per tick"},friction:{type:"float",tooltip:"Amount of velocity to shed (0 to 1) per tick, also applied to acceleration from drift"},drift:{type:"vector",tooltip:"Added acceleration every tick; e.g. a circle or sphere generator can be applied to produce snow or ember effects"}},k=function(e,t){var n=e.name,r={int:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e))),float:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),float_nongen:(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e))),string:(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e))),numlist:(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},e))),list:(0,o.normalizeProps)((0,o.createComponentVNode)(2,V,Object.assign({},e))),color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,y,Object.assign({},e))),icon:(0,o.normalizeProps)((0,o.createComponentVNode)(2,x,Object.assign({},e))),generator:(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),matrix:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),vector:(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e))),vector_nongen:(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e))),vector2:(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e)))};return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:n,children:r[I[n].type]||I[n].type||"Not Found (This is an error)"})},w=function(e,t){var n=e.particle;return(0,o.createComponentVNode)(2,c.LabeledList,{children:Object.keys(I).map((function(e){var t=n[e],r=I[e].tooltip||"Oh Bees! Tooltip is missing.";return(0,o.createComponentVNode)(2,k,{name:e,tooltip:r,value:t},e)}))})},S=function(){return(0,o.createComponentVNode)(2,c.Collapsible,{title:"Generator Help",children:[(0,o.createComponentVNode)(2,c.Section,{level:2}),(0,o.createComponentVNode)(2,c.Section,{level:2,children:(0,o.createVNode)(1,"table",null,(0,o.createVNode)(1,"tbody",null,[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Generator type",16),(0,o.createVNode)(1,"td",null,"Result type",16),(0,o.createVNode)(1,"td",null,"Description",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"num",16),(0,o.createVNode)(1,"td",null,"num",16),(0,o.createVNode)(1,"td",null,"A random number between A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector on a line between A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"box",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector within a box whose corners are at A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"color",16),(0,o.createVNode)(1,"td",null,"color (string) or color matrix",16),(0,o.createVNode)(1,"td",null,"Result type depends on whether A or B are matrices or not. The result is interpolated between A and B; components are not randomized separately.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"circle",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random XY-only vector in a ring between radius A and B, centered at 0,0.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"sphere",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector in a spherical shell between radius A and B, centered at 0,0,0.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"square",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random XY-only vector between squares of sizes A and B. (The length of the square is between A*2 and B*2, centered at 0,0.)",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"cube",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector between cubes of sizes A and B. (The length of the cube is between A*2 and B*2, centered at 0,0,0.)",16)],4)],4),2)})]})};t.Particool=function(e,t){var n=(0,i.useBackend)(t),u=n.act,d=n.data,s=d.target_particle||{},p=s&&Object.keys(s).length>0,m=(0,i.useLocalState)(t,"particleFloatStep",.01),f=m[0],h=m[1],g=(0,i.useLocalState)(t,"hidden",!1),C=g[0],N=g[1];return(0,o.createComponentVNode)(2,l.Window,{title:"Particool",width:700,height:500,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[!!C&&(0,o.createComponentVNode)(2,c.NoticeBox,{danger:!0,children:[" ",String(Date.now())," ",(0,o.createVNode)(1,"br"),"Particles? ",p.toString()," -",(null===d.target_particle).toString()," ",(0,o.createVNode)(1,"br"),"Json - ",JSON.stringify(d.target_particle)]}),(0,o.createComponentVNode)(2,c.Section,{title:(0,o.createComponentVNode)(2,c.Box,{inline:!0,onDblClick:function(){return N(!0)},children:"Particle"}),buttons:(0,o.createFragment)([!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,c.Button,{icon:"save",content:"Save Particle",onClick:function(){return u("save_particle")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"file-image",content:"Save Particle + Icon",onClick:function(){return u("save_particle_with_icon")}}),(0,o.createTextVNode)(" ")],0),(0,o.createComponentVNode)(2,c.Button,{icon:"upload",content:"Load Particle",onClick:function(){return u("load_particle")}}),p?(0,o.createComponentVNode)(2,c.Button.Confirm,{icon:"minus",content:"Remove Particle",onClick:function(){return u("remove_particle")}}):(0,o.createComponentVNode)(2,c.Button,{icon:"plus",content:"Add Particle",onClick:function(){return u("add_particle")}}),(0,o.createComponentVNode)(2,c.Button)],0),children:[(0,o.createComponentVNode)(2,S),(0,o.createComponentVNode)(2,c.Box,{mt:2,mb:2,children:[(0,o.createComponentVNode)(2,c.Box,{inline:!0,mr:1,children:"Float change step:"}),(0,o.createComponentVNode)(2,c.NumberInput,{value:f,step:.001,format:function(e){return(0,r.toFixed)(e,(0,a.numberOfDecimalDigits)(f))},width:"70px",onChange:function(e,t){return h(t)}})]}),p?(0,o.createComponentVNode)(2,w,{particle:s}):(0,o.createComponentVNode)(2,c.Box,{children:"No particle"})]})]})})}},85344:function(e,t,n){"use strict";t.__esModule=!0,t.Phone=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(18331),c=n(2381),l=[{department:"bridge",color:"green"},{department:"engineering",color:"yellow"},{department:"medical",color:"blue"},{department:"research",color:"purple"},{department:"security",color:"red"},{department:"uncategorized",color:"brown"}],u=function(e,t){return e.category.localeCompare(t.category)},d=function(e,t){return e.id.localeCompare(t.id)};t.Phone=function(e,t){var n=(0,r.useBackend)(t).data,i=n.dialing,l=n.inCall,d=n.lastCalled,p=n.name,m=n.phonebook.sort(u)||[];return(0,o.createComponentVNode)(2,c.Window,{title:p,width:250,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(i||l)&&(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createVNode)(1,"h1",null,"LINE BUSY",16)}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Last Called",children:d?""+d:"None"})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Phonebook",fill:!0,scrollable:!0,children:m.map((function(e){return(0,o.createComponentVNode)(2,s,{phonebook:e},e.category)}))})})]})]})})};var s=function(e,t){var n=e.phonebook,c=(0,r.useBackend)(t).act,u=(0,i.capitalize)(n.category),s=n.phones.sort(d),p=l[l.findIndex((function(e){return e.department===n.category}))].color;return(0,o.createComponentVNode)(2,a.Collapsible,{title:u,color:!!p&&p,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:e.id,onClick:function(){return c("call",{target:e.id})},textAlign:"center",className:"phone__button"},e.id)}))})}},85990:function(){},41245:function(e,t,n){"use strict";t.__esModule=!0,t.AutoPipeLaying=t.DisposalPipeRow=t.PipeDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.PipeDispenser=function(e,t){var n=(0,r.useBackend)(t).data,u=n.disposalpipes||[],d=n.dispenser_ready,s=n.windowName,p=n.mobile,m=n.removing_pipe,f=n.laying_pipe,h=n.max_disposal_pipes;return(0,o.createComponentVNode)(2,i.Window,{title:s,width:"325",height:p?365:270,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,c,{dispenser_ready:d,max_disposal_pipes:h,disposalpipe:e},e.disposaltype)}))}),!!p&&(0,o.createComponentVNode)(2,l,{laying_pipe:f,removing_pipe:m})]})})};var c=function(e,t){var n=(0,r.useBackend)(t).act,i=(0,r.useLocalState)(t,"amount",1),c=i[0],l=i[1],u=e.dispenser_ready,d=e.max_disposal_pipes,s=e.disposalpipe;return(0,o.createComponentVNode)(2,a.Stack,{style:{"border-bottom":"1px #555 solid"},children:[s.image&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{style:{overflow:"show",height:"32px"},children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+s.image})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:s.disposaltype}),(0,o.createComponentVNode)(2,a.Stack.Item,{style:{display:"flex","justify-content":"center","flex-direction":"column"},children:["Amount:",(0,o.createComponentVNode)(2,a.NumberInput,{value:c,minValue:1,maxValue:d,onChange:function(e,t){return l(Math.round(t))}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,a.Button,{color:u?"green":"grey",content:"Dispense",disabled:!u,style:{width:"70px","text-align":"center"},onClick:function(){return n("dmake",{disposal_type:s.disposaltype,amount:c})}})})]})};t.DisposalPipeRow=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.laying_pipe,c=e.removing_pipe;return(0,o.createComponentVNode)(2,a.Section,{title:"Automatic Pipe Options",children:[(0,o.createComponentVNode)(2,a.Button,{color:i?"average":"green",content:i?"Stop Laying Pipe Automatically":"Start Laying Pipe Automatically",fluid:!0,align:"center",onClick:function(){return n("toggle_laying")}}),(0,o.createComponentVNode)(2,a.Button,{color:c?"average":"green",content:c?"Stop Removing Pipe Automatically":"Start Removing Pipe Automatically",fluid:!0,align:"center",onClick:function(){return n("toggle_removing")}})]})};t.AutoPipeLaying=l},38837:function(e,t,n){"use strict";t.__esModule=!0,t.PixelOffset=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.PixelOffset=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.x,d=l.y,s=l.thing_name;return(0,o.createComponentVNode)(2,i.Window,{title:"Pixel Offsets for "+s,width:400,height:180,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{fontSize:"3em",width:"1.3em",children:"X:"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",fontSize:"1.5em",onClick:function(){return c("set_x",{x:u+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",fontSize:"1.5em",onClick:function(){return c("set_x",{x:u-1})}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:u,fontSize:"35px",stepPixelSize:7,width:"2.7em",onDrag:function(e,t){return c("set_x",{x:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync-alt",color:"red",fontSize:"1.5em",onClick:function(){return c("set_x",{x:0})}})]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{fontSize:"3em",width:"1.3em",children:"Y:"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",fontSize:"1.5em",onClick:function(){return c("set_y",{y:d+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",fontSize:"1.5em",onClick:function(){return c("set_y",{y:d-1})}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:d,fontSize:"35px",width:"2.7em",stepPixelSize:7,onDrag:function(e,t){return c("set_y",{y:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync-alt",color:"red",fontSize:"1.5em",onClick:function(){return c("set_y",{y:0})}})]})]})})]})})})}},51884:function(e,t,n){"use strict";t.__esModule=!0,t.Plantmaster=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(28581),u=n(97622),d=n(18331),s=n(1033),p=["name","species","damage","genome","generation","maturity rate","production rate","lifespan","yield","potency","endurance","controls"],m=["name","species","damage","genome","generation","growtime","harvesttime","lifespan","cropsize","potency","endurance",""];t.Plantmaster=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.extractables,d=l.seeds,s=l.category,p=l.category_lengths,m=l.inserted,f=l.inserted_container,h=l.seedoutput,C=l.splice_chance,N=l.show_splicing,V=l.splice_seeds,y=l.sortBy,x=l.sortAsc;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Plantmaster Mk4",width:1100,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"overview"===s,onClick:function(){c("change_tab",{tab:"overview"})},children:"Overview"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"extractables"===s,onClick:function(){c("change_tab",{tab:"extractables"})},children:["Seed Extraction (",p[0],")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"seedlist"===s,onClick:function(){c("change_tab",{tab:"seedlist"})},children:["Seeds (",p[1],")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{backgroundColor:null!==f?"green":"blue",selected:null!==f,icon:"eject",onClick:function(){return c(null!==f?"ejectbeaker":"insertbeaker")},bold:!0,children:null!==f?m:"Insert Beaker"})]}),"overview"===s&&(0,o.createComponentVNode)(2,g,{cat_lens:p,container:m?f:null,seedoutput:h}),"extractables"===s&&(0,o.createComponentVNode)(2,b,{seedoutput:h,produce:u,sortBy:y,sortAsc:x}),"seedlist"===s&&(0,o.createComponentVNode)(2,v,{seeds:d,seedoutput:h,splicing:N,splice_chance:C,splice_seeds:V,sortBy:y,sortAsc:x})]})})};var f=function(e,t,n,o){var r,a,i,c;return"name"===n||"species"===n?o?(null!=(r=e[n])?r:"").toString().localeCompare(null!=(a=t[n])?a:""):(null!=(i=t[n])?i:"").toString().localeCompare(null!=(c=e[n])?c:""):o?parseFloat(e[n])-parseFloat(t[n]):parseFloat(t[n])-parseFloat(e[n])},h=function(e,t){var n=(0,r.useBackend)(t).act,i=e.container||c.NoContainer;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:i.name,children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insertbeaker")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:i}),(0,o.createComponentVNode)(2,c.ReagentList,{container:i})]})},g=function(e,t){(0,r.useBackend)(t).act;var n=e.cat_lens,i=e.container;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Overview",children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Box,{children:["Items ready for extraction: ",(0,o.createVNode)(1,"b",null,n[0],0)," ",(0,o.createVNode)(1,"br"),"Seeds ready for experimentation: ",(0,o.createVNode)(1,"b",null,n[1],0)]}),(0,o.createComponentVNode)(2,h,{container:i})]})})})},C=function(e,t){var n=(0,r.useBackend)(t).act,i=e.show_damage,c=e.sortBy,u=e.sortAsc;return(0,o.createComponentVNode)(2,l.TableRow,{children:p.map((function(e,t){return(i||"damage"!==e)&&(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:""!==c&&c===m[t]?u?"angle-up":"angle-down":"",onClick:function(){return n("sort",{sortBy:m[t],asc:c===m[t]?!u:u})},children:(0,o.createVNode)(1,"b",null,(0,d.capitalize)(e),0)})},e)}))})},N=function(e,t){var n=(0,r.useBackend)(t).act,i=e.extractable,c=e.show_damage,u=e.infuse,d=e.extract,p=e.splice,m=e.splice_disable;return(0,o.createFragment)([(0,o.createComponentVNode)(2,l.TableRow,{children:[(0,o.createComponentVNode)(2,l.TableCell,{width:"100px",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button.Input,{width:"100px",tooltip:"Click to rename",color:"transparent",textColor:"#FFFFFF",content:(0,s.truncate)(i.name[0],10),defaultValue:i.name[0],currentValue:i.name[0],onCommit:function(e,t){return n("label",{label_ref:i.ref[0],label_new:t})}})}),(0,o.createComponentVNode)(2,l.TableCell,{width:"100px",textAlign:"center",bold:i.species[1],backgroundColor:i.species[1]?"#333333":"",children:i.species[0]}),c&&(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.damage[1],backgroundColor:i.damage[1]?"#333333":"",children:[i.damage[0],"%"]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.genome[1],backgroundColor:i.genome[1]?"#333333":"",children:i.genome[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.generation[1],backgroundColor:i.generation[1]?"#333333":"",children:i.generation[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.growtime[1],backgroundColor:i.growtime[1]?"#333333":"",children:i.growtime[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.harvesttime[1],backgroundColor:i.harvesttime[1]?"#333333":"",children:i.harvesttime[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.lifespan[1],backgroundColor:i.lifespan[1]?"#333333":"",children:i.lifespan[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.cropsize[1],backgroundColor:i.cropsize[1]?"#333333":"",children:i.cropsize[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.potency[1],backgroundColor:i.potency[1]?"#333333":"",children:i.potency[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.endurance[1],backgroundColor:i.endurance[1]?"#333333":"",children:i.endurance[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[u&&(0,o.createComponentVNode)(2,a.Button,{icon:"fill-drip",title:"Infuse",fontSize:1.1,disabled:!i.allow_infusion[1],onClick:function(){return n("infuse",{infuse_ref:i.ref[0]})}}),d&&(0,o.createComponentVNode)(2,a.Button,{icon:"seedling",title:"Extract Seeds",fontSize:1.1,onClick:function(){return n("extract",{extract_ref:i.ref[0]})}}),p&&(0,o.createComponentVNode)(2,a.Button,{disabled:!i.splicing[1]&&m,icon:i.splicing[1]?"window-close":"code-branch",color:i.splicing[1]?"red":"",title:i.splicing[1]?"Cancel Splice":"Splice",fontSize:1.1,onClick:function(){return n("splice_select",{splice_select_ref:i.ref[0]})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"search",title:"Analyze",fontSize:1.1,onClick:function(){return n("analyze",{analyze_ref:i.ref[0]})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",title:"Eject",fontSize:1.1,onClick:function(){return n("eject",{eject_ref:i.ref[0]})}})]})})})]}),(0,o.createComponentVNode)(2,a.Divider)],4,i.ref[1])},v=function(e,t){var n=(0,r.useBackend)(t).act,i=e.seedoutput,c=e.seeds,l=e.splicing,d=e.splice_seeds,s=e.splice_chance,p=e.sortBy,m=e.sortAsc,h=(c||[]).sort((function(e,t){return f(e,t,p,m)})),g=l?7:10,v=(0,r.useLocalState)(t,"page",1),b=v[0],V=v[1],y=Math.max(1,Math.ceil(h.length/g));(b<1||b>y)&&V((0,u.clamp)(b,1,y));var x=h.slice(g*(b-1),g*(b-1)+g),I=null!==d[0]&&null!==d[1];return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Seeds",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",tooltip:"All seeds will be ejected from the Plantmaster",onClick:function(){return n("ejectseeds")},children:"Eject All"}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:b<2,onClick:function(){return V(b-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:b,format:function(e){return"Page "+e+"/"+y},minValue:1,maxValue:y,stepPixelSize:15,onChange:function(e,t){return V(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:b>y-1,onClick:function(){return V(b+1)}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!i,tooltip:"Seeds will be extracted into the Plantmaster.",onClick:function(){return n("outputmode")},children:"Output Internally"})]}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{height:l?"60%":"100%",children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,C,{show_damage:!0,sortBy:p,sortAsc:m}),x.map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,show_damage:!0,infuse:!0,splice:!0,splice_disable:I},e.ref[1])}))]})}),l&&(0,o.createComponentVNode)(2,a.Flex.Item,{height:"30%",children:(0,o.createComponentVNode)(2,a.Section,{title:"Splicing",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:["Splice Chance: ",s,"%\xa0",(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("splice")},children:"Splice"})]}),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,C,{show_damage:!0,sortBy:p,sortAsc:m}),d.filter((function(e){return null!==e})).sort((function(e,t){return f(e,t,p,m)})).map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,show_damage:!0,infuse:!0,splice:!0},e.ref[1])}))]})})})]})})},b=function(e,t){var n=(0,r.useBackend)(t).act,i=e.seedoutput,c=e.produce,l=e.sortBy,d=e.sortAsc,s=(c||[]).sort((function(e,t){return f(e,t,l,d)})),p=(0,r.useLocalState)(t,"page",1),m=p[0],h=p[1],g=Math.max(1,Math.ceil(s.length/10));(m<1||m>g)&&h((0,u.clamp)(m,1,g));var v=s.slice(10*(m-1),10*(m-1)+10);return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Extractable Items",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",tooltip:"All produce will be ejected from the Plantmaster",onClick:function(){return n("ejectextractables")},children:"Eject All"}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:m<2,onClick:function(){return h(m-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:m,format:function(e){return"Page "+e+"/"+g},minValue:1,maxValue:g,stepPixelSize:15,onChange:function(e,t){return h(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:m>g-1,onClick:function(){return h(m+1)}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!i,tooltip:"Seeds will be extracted into the Plantmaster.",onClick:function(){return n("outputmode")},children:"Output Internally"})]}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,C,{sortBy:l,sortAsc:d}),v.map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,extract:!0},e.ref[1])}))]})})})})}},53302:function(e,t,n){"use strict";t.__esModule=!0,t.Header=void 0;var o=n(96323),r=n(26949),a=n(22706),i=["children","onSortClick","sortDirection"];t.Header=function(e){var t=e.children,n=e.onSortClick,c=e.sortDirection,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),u=c?c===a.SortDirection.Asc?"sort-alpha-down":"sort-alpha-up":"sort";return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Stack,Object.assign({style:{cursor:"pointer"},onClick:n},l,{children:[(0,o.createComponentVNode)(2,r.Stack.Item,{children:t}),n&&(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Icon,{name:u,unselectable:!0})})]})))}},22706:function(e,t){"use strict";var n,o;t.__esModule=!0,t.SortDirection=t.Action=void 0,t.Action=n,function(e){e.JumpToPlayerLocation="jump-to-player-loc",e.OpenPlayerOptions="open-player-options",e.PrivateMessagePlayer="private-message-player"}(n||(t.Action=n={})),t.SortDirection=o,function(e){e.Asc="asc",e.Desc="desc"}(o||(t.SortDirection=o={}))},78927:function(e,t,n){"use strict";t.__esModule=!0,t.PlayerPanel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(53302),l=n(22706),u=function(e){return""+e.value},d=function(e,t){return e.localeCompare(t)},s=function(e){return Number(e.split(".").map((function(e){return("00"+e).slice(-3)})).join(""))},p=function(e){return function(t){return t.row[e]}},m=function(e){return{id:e,sorter:d,template:u,valueSelector:p(e)}},f=[Object.assign({},m("ckey"),{name:"CKey",template:function(e){var t=e.act,n=e.row,r=e.value;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return t(l.Action.OpenPlayerOptions,{ckey:r,mobRef:n.mobRef})},children:r}),(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",color:"bad",onClick:function(){return t(l.Action.PrivateMessagePlayer,{ckey:r,mobRef:n.mobRef})}})],4)}}),Object.assign({},m("name"),{name:"Name"}),Object.assign({},m("realName"),{name:"Real Name"}),Object.assign({},m("assignedRole"),{name:"Assigned Role"}),Object.assign({},m("specialRole"),{name:"Special Role"}),Object.assign({},m("playerType"),{name:"Player Type"}),Object.assign({},m("computerId"),{name:"CID"}),Object.assign({},m("ip"),{name:"IP",sorter:function(e,t){return s(e)-s(t)}}),Object.assign({},m("joined"),{name:"Join Date",sorter:function(e,t){var n=e.split("-").map(parseFloat),o=t.split("-").map(parseFloat);return n>o?1:n<o?-1:0}}),Object.assign({},m("playerLocation"),{name:"Player Location",template:function(e){var t=e.act,n=e.row,r=e.value;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return t(l.Action.JumpToPlayerLocation,{ckey:n.ckey,mobRef:n.mobRef})},children:r})}}),Object.assign({},m("ping"),{name:"Ping",sorter:function(e,t){return e-t}})];t.PlayerPanel=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data.players,s=(0,r.useLocalState)(t,"search",""),p=s[0],m=s[1],h=(0,r.useLocalState)(t,"sort",null),g=h[0],C=h[1],N=Object.keys(d).map((function(e){return d[e]})),v=N.reduce((function(e,t){return e[t.ckey]=f.reduce((function(e,n){var o=n.id,r=n.valueSelector;return e[o]=r({column:n,row:t}),e}),{}),e}),{});if(p){var b=p.toLowerCase();N=N.filter((function(e){return Object.values(v[e.ckey]).some((function(e){return"string"==typeof e&&e.toLowerCase().includes(b)}))}))}if(g){var V=f.find((function(e){return e.id===g.id}));V&&N.sort((function(e,t){var n=V.sorter(v[e.ckey][V.id],v[t.ckey][V.id]);return g.dir===l.SortDirection.Desc&&(n*=-1),n}))}return(0,o.createComponentVNode)(2,i.Window,{width:1100,height:640,title:"Player Panel",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,mb:1,placeholder:"Search...",onInput:function(e,t){return m(t)},value:p}),(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:f.map((function(e){var t=(null==g?void 0:g.id)===e.id?g:null;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,c.Header,{onSortClick:e.sorter?function(){return C({dir:null!=t&&t.dir&&t.dir===l.SortDirection.Asc?l.SortDirection.Desc:l.SortDirection.Asc,id:e.id})}:null,sortDirection:null==t?void 0:t.dir,children:e.name})},e.field)}))}),N.map((function(e){var t=e.ckey;return(0,o.createComponentVNode)(2,a.Table.Row,{children:f.map((function(n){var r=n.id,i=n.template;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:i({act:u,column:n,row:e,value:v[t][r]})},r)}))},t)}))]})]})})}},43771:function(){},13484:function(e,t,n){"use strict";t.__esModule=!0,t.PortablePump=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161);t.PortablePump=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.connected,s=u.on,p=u.direction_out,m=u.holding,f=u.pressure,h=u.targetPressure,g=u.maxPressure,C=u.minRelease,N=u.maxRelease;return(0,o.createComponentVNode)(2,i.Window,{width:305,height:365,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:d,pressure:f,maxPressure:g,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pump Power",children:(0,o.createComponentVNode)(2,a.Button,{content:s?"On":"Off",color:s?"average":"default",onClick:function(){return l("toggle-power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Pressure",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("set-pressure",{targetPressure:C})},content:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:h,minValue:C,maxValue:N,onChange:function(e,t){return l("set-pressure",{targetPressure:t})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("set-pressure",{targetPressure:N})},content:"Max"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pump Direction",children:(0,o.createComponentVNode)(2,a.Button,{content:p?"Out":"In",color:p?"yellow":"blue",onClick:function(){return l("toggle-pump")}})})]})]}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:m,onEjectTank:function(){return l("eject-tank")}})]})})}},54652:function(e,t,n){"use strict";t.__esModule=!0,t.PortableScrubber=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=n(51418);t.PortableScrubber=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.connected,p=d.on,m=d.holding,f=d.pressure,h=d.inletFlow,g=d.maxPressure,C=d.minFlow,N=d.maxFlow,v=d.reagent_container;return(0,o.createComponentVNode)(2,i.Window,{width:305,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:s,pressure:f,maxPressure:g,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scrubber Power",children:(0,o.createComponentVNode)(2,a.Button,{content:p?"On":"Off",color:p?"average":"default",onClick:function(){return u("toggle-power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Flow",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("set-inlet-flow",{inletFlow:C})},content:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:h,minValue:C,maxValue:N,onChange:function(e,t){return u("set-inlet-flow",{inletFlow:t})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("set-inlet-flow",{inletFlow:N})},content:"Max"})]})]})]}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:m,onEjectTank:function(){return u("eject-tank")}}),(0,o.createComponentVNode)(2,a.Section,{title:"Fluid Tank",children:(0,o.createComponentVNode)(2,l.ReagentGraph,{container:v})})]})})}},15264:function(e,t,n){"use strict";t.__esModule=!0,t.PowerDebug=t.MachineData=t.AreaData=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.areaData;return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:Object.keys(t).map((function(e,n){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:[(0,o.createComponentVNode)(2,a.Section,{title:t[e].name,children:t[e].total?(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Total:",t[e].total," "]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Equip:",t[e].equip]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Light:",t[e].light," "]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Environ:",t[e].environ]})]}):"NO APC"}),(0,o.createComponentVNode)(2,l,{machineData:t[e].machines})]},n)}))})})};t.AreaData=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.machineData;return Object.keys(i).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){n("jmp",{ref:e})},children:"JMP"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:20,children:i[e].name}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:8,children:i[e].data}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:i[e].power_usage})]},t)}))};t.MachineData=l;t.PowerDebug=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data.areaData);return(0,o.createComponentVNode)(2,i.Window,{title:"PowerDebug",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Power Debug"}),children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,c,{areaData:l})})})})})}},4914:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitorApcTableRows=t.PowerMonitorApcTableHeader=t.PowerMonitorApcGlobal=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(1033),u=((o={})[0]="Off",o[1]=(0,a.createComponentVNode)(2,c.Box,{inline:!0,children:["Off"," ",(0,a.createComponentVNode)(2,c.Box,{inline:!0,color:"grey",children:"(Auto)"})]}),o[2]="On",o[3]=(0,a.createComponentVNode)(2,c.Box,{inline:!0,children:["On"," ",(0,a.createComponentVNode)(2,c.Box,{inline:!0,color:"grey",children:"(Auto)"})]}),o),d=((r={})[0]="Discharging",r[1]="Charging",r[2]="Charged",r);t.PowerMonitorApcGlobal=function(e,t){var n=(0,i.useBackend)(t).data,o=n.history.map((function(e){return e[0]})),r=o.map((function(e,t){return[t,e]})),u=n.history.map((function(e){return e[1]})),d=u.map((function(e,t){return[t,e]})),s=Math.max.apply(Math,o.concat(u));return(0,a.createComponentVNode)(2,c.Stack,{fill:!0,children:[(0,a.createComponentVNode)(2,c.Stack.Item,{width:"50%",children:[(0,a.createComponentVNode)(2,c.LabeledList,{children:(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Power",children:(0,l.formatPower)(n.available)})}),(0,a.createComponentVNode)(2,c.Chart.Line,{mt:"5px",height:"5em",data:r,rangeX:[0,r.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,a.createComponentVNode)(2,c.Stack.Item,{width:"50%",children:[(0,a.createComponentVNode)(2,c.LabeledList,{children:(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Load",children:(0,l.formatPower)(n.load)})}),(0,a.createComponentVNode)(2,c.Chart.Line,{mt:"5px",height:"5em",data:d,rangeX:[0,d.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]})]})};t.PowerMonitorApcTableHeader=function(){return(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,children:"Area"}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Equipment",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Eqp."})}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Lighting",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Lgt."})}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Environment",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Env."})}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,textAlign:"right",children:"Load"}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,textAlign:"right",children:"Cell Charge"}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,children:"Cell State"})],4)};t.PowerMonitorApcTableRows=function(e,t){var n=e.search,o=(0,i.useBackend)(t).data;return(0,a.createFragment)(o.apcs.map((function(e){return(0,a.createComponentVNode)(2,s,{apc:e,search:n},e[0])})),0)};var s=function(e,t){var n,o=e.apc,r=e.search,u=o[0],s=o[1],m=o[2],f=o[3],h=o[4],g=o[5],C=o[6],N=null!=(n=(0,i.useBackend)(t).data.apcNames[u])?n:"N/A";return r&&!N.toLowerCase().includes(r.toLowerCase())?null:(0,a.createComponentVNode)(2,c.Table.Row,{children:[(0,a.createComponentVNode)(2,c.Table.Cell,{children:N}),(0,a.createComponentVNode)(2,p,{state:s}),(0,a.createComponentVNode)(2,p,{state:m}),(0,a.createComponentVNode)(2,p,{state:f}),(0,a.createComponentVNode)(2,c.Table.Cell,{textAlign:"right",nowrap:!0,children:(0,l.formatPower)(h)}),"number"==typeof g?(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell,{textAlign:"right",nowrap:!0,children:[g,"%"]}),(0,a.createComponentVNode)(2,c.Table.Cell,{color:C>0?1===C?"average":"good":"bad",nowrap:!0,children:d[C]})],4):(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell),(0,a.createComponentVNode)(2,c.Table.Cell,{color:"bad",children:"N/A"})],4)]})},p=function(e){var t=e.state;return(0,a.createComponentVNode)(2,c.Table.Cell,{nowrap:!0,color:t>=2?"good":"bad",children:u[t]})}},8954:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitorSmesTableRows=t.PowerMonitorSmesTableHeader=t.PowerMonitorSmesGlobal=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033);t.PowerMonitorSmesGlobal=function(e,t){var n=(0,r.useBackend)(t).data,c=n.history.map((function(e){return e[0]})),l=c.map((function(e,t){return[t,e]})),u=n.history.map((function(e){return e[1]})),d=u.map((function(e,t){return[t,e]})),s=Math.max.apply(Math,c.concat(u));return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50%",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Engine Output",children:(0,i.formatPower)(n.available)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:l,rangeX:[0,l.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50%",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"SMES/PTL Draw",children:(0,i.formatPower)(n.load)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:d,rangeX:[0,d.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]})]})};t.PowerMonitorSmesTableHeader=function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Area"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Stored Power"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Charging"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Input"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Output"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Active"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Load"})],4)};t.PowerMonitorSmesTableRows=function(e,t){var n=e.search,a=(0,r.useBackend)(t).data;return(0,o.createFragment)(a.units.map((function(e){return(0,o.createComponentVNode)(2,c,{unit:e,search:n},e[0])})),0)};var c=function(e,t){var n,c=e.unit,l=e.search,u=c[0],d=c[1],s=c[2],p=c[3],m=c[4],f=c[5],h=c[6],g=null!=(n=(0,r.useBackend)(t).data.unitNames[u])?n:"N/A";return l&&!g.toLowerCase().includes(l.toLowerCase())?null:(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:g}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[d,"%"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{color:s?"good":"bad",children:s?"Yes":"No"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,i.formatPower)(p)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,i.formatPower)(m)}),(0,o.createComponentVNode)(2,a.Table.Cell,{color:f?"good":"bad",children:f?"Yes":"No"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:h?(0,i.formatPower)(h):"N/A"})]})}},84699:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(4914),l=n(8954),u=n(2441);t.PowerMonitor=function(e,t){var n=(0,r.useBackend)(t).data,d=(0,r.useSharedState)(t,"search",""),s=d[0],p=d[1];return(0,o.createComponentVNode)(2,i.Window,{width:700,height:700,theme:"retro-dark",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcGlobal),(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesGlobal)]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Search",children:(0,o.createComponentVNode)(2,a.Input,{value:s,onInput:function(e,t){return p(t)}})})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcTableHeader)}),(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcTableRows,{search:s}),(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesTableHeader)}),(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesTableRows,{search:s})]})})})]})})})}},2441:function(e,t){"use strict";var n;t.__esModule=!0,t.isDataForSmes=t.isDataForApc=t.PowerMonitorType=void 0,t.PowerMonitorType=n,function(e){e.Apc="apc",e.Smes="smes"}(n||(t.PowerMonitorType=n={}));t.isDataForApc=function(e){return e.type===n.Apc};t.isDataForSmes=function(e){return e.type===n.Smes}},36476:function(e,t,n){"use strict";t.__esModule=!0,t.PowerTransmissionLaser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.PowerTransmissionLaser=function(e,t){var n=(0,r.useBackend)(t).data,s=n.lifetimeEarnings,p=n.name,m=void 0===p?"Power Transmission Laser":p;return(0,o.createComponentVNode)(2,c.Window,{title:m,width:"310",height:"485",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,l),(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,a.NoticeBox,{success:!0,children:["Earned Credits : ",(0,i.formatMoney)(s)]})]})})};var l=function(e,t){var n=(0,r.useBackend)(t).data,c=n.capacity,l=n.charge,u=n.gridLoad,d=n.totalGridPower;return(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reserve Power",children:(0,i.formatSiUnit)(l,0,"J")})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",mb:"0.5em",ranges:{good:[.8,Infinity],average:[.5,.8],bad:[-Infinity,.5]},value:l/c}),(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Grid Saturation"})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",ranges:{good:[.8,Infinity],average:[.5,.8],bad:[-Infinity,.5]},value:d?u/d:0})]})},u=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.isChargingEnabled,d=l.excessPower,s=l.isCharging,p=l.inputLevel,m=l.inputNumber,f=l.inputMultiplier;return(0,o.createComponentVNode)(2,a.Section,{title:"Input Controls",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input Circuit",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",content:u?"Enabled":"Disabled",color:u?"green":"red",onClick:function(){return c("toggleInput")}}),children:(0,o.createComponentVNode)(2,a.Box,{color:(s?"good":u&&"average")||"bad",children:(s?"Online":u&&"Idle")||"Offline"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input Level",children:(0,i.formatPower)(p)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Optimal",children:(0,i.formatPower)(d)})]}),(0,o.createComponentVNode)(2,a.Box,{mt:"0.5em",children:[(0,o.createComponentVNode)(2,a.Knob,{mr:"0.5em",animated:!0,size:1.25,inline:!0,step:5,stepPixelSize:2,minValue:0,maxValue:999,value:m,onDrag:function(e,t){return c("setInput",{setInput:t})}}),(0,o.createComponentVNode)(2,a.Button,{content:"W",selected:1===f,onClick:function(){return c("inputW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"kW",selected:f===Math.pow(10,3),onClick:function(){return c("inputkW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"MW",selected:f===Math.pow(10,6),onClick:function(){return c("inputMW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"GW",selected:f===Math.pow(10,9),onClick:function(){return c("inputGW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"TW",selected:f===Math.pow(10,12),onClick:function(){return c("inputTW")}})]})]})},d=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.isEmagged,d=l.isFiring,s=l.isLaserEnabled,p=l.outputLevel,m=l.outputNumber,f=l.outputMultiplier;return(0,o.createComponentVNode)(2,a.Section,{title:"Output Controls",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Laser Circuit",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",content:s?"Enabled":"Disabled",color:s?"green":"red",onClick:function(){return c("toggleOutput")}}),children:(0,o.createComponentVNode)(2,a.Box,{color:(d?"good":s&&"average")||"bad",children:(d?"Online":s&&"Idle")||"Offline"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output Level",children:m<0?"-"+(0,i.formatPower)(Math.abs(p)):(0,i.formatPower)(p)})]}),(0,o.createComponentVNode)(2,a.Box,{mt:"0.5em",children:[(0,o.createComponentVNode)(2,a.Knob,{mr:"0.5em",size:1.25,animated:!0,bipolar:u,inline:!0,step:5,stepPixelSize:2,minValue:u?-999:0,maxValue:999,ranges:{bad:[-Infinity,-1]},value:m,onDrag:function(e,t){return c("setOutput",{setOutput:t})}}),(0,o.createComponentVNode)(2,a.Button,{content:"MW",selected:f===Math.pow(10,6),onClick:function(){return c("outputMW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"GW",selected:f===Math.pow(10,9),onClick:function(){return c("outputGW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"TW",selected:f===Math.pow(10,12),onClick:function(){return c("outputTW")}})]})]})}},61221:function(e,t,n){"use strict";t.__esModule=!0,t.Precipitation=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.Precipitation=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.probability,s=u.cooldown,p=u.poolDepth,m=u.containerData;return(0,o.createComponentVNode)(2,i.Window,{title:"Precipitation",width:300,height:425,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Precipitation"}),children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Cooldown for how fast ATOMs can be rained on.",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Cooldown",(0,o.createComponentVNode)(2,a.NumberInput,{value:s,width:4,minValue:0,onChange:function(e,t){return l("set-cooldown",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Chance of being rained on entering turf.",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Probability",(0,o.createComponentVNode)(2,a.NumberInput,{value:d,width:4,minValue:0,maxValue:100,onChange:function(e,t){return l("set-probability",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Maximum fluid size/depth on the tile. (0 means no pooling will form)",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Maximum Pool Depth",(0,o.createComponentVNode)(2,a.NumberInput,{value:p,width:4,minValue:0,maxValue:100,onChange:function(e,t){return l("set-poolDepth",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Reagents",children:[(0,o.createComponentVNode)(2,c.ReagentList,{container:m,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return l("isolate",{container_id:m.id,reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"times",color:"red",title:"Flush",onClick:function(){return l("flush_reagent",{container_id:m.id,reagent_id:e.id})}})],4)}}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:[(0,o.createComponentVNode)(2,a.Button,{ml:1,onClick:function(){return l("add_reagents")},children:"Add Reagents"}),(0,o.createComponentVNode)(2,a.Button,{ml:1,onClick:function(){return l("flush")},children:"Clear Reagents"})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Particle",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("particle_editor")},children:"Edit Particle"})})})]})})})}},90227:function(e,t,n){"use strict";t.__esModule=!0,t.Pressurizer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=0,u=1,d=2,s={good:[1,Infinity],average:[.75,1],bad:[-Infinity,.75]};t.Pressurizer=function(e,t){var n=(0,r.useBackend)(t),p=n.act,m=n.data,f=m.airSafe,h=m.blastArmed,g=m.blastDelay,C=m.connected,N=m.emagged,v=m.fanState,b=m.materialsCount,V=m.materialsProgress,y=m.maxArmDelay,x=m.maxPressure,I=m.maxRelease,k=m.minArmDelay,w=m.minBlastPercent,S=m.minRelease,_=m.pressure,M=m.processRate,D=m.releasePressure,B=function(e){p("set-pressure",{releasePressure:e})},A=function(e){p("set-blast-delay",{blastDelay:e})},T=function(e){p("set-process_rate",{processRate:e})},L=function(e){p("fan",{fanState:e})},E=_<x*w;return(0,o.createComponentVNode)(2,i.Window,{theme:N?"syndicate":"ntos",width:390,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:C,pressure:_,maxPressure:x,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Emergency Blast Release",children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",icon:"circle",content:E?"Insufficient Pressure":f?h?"Armed":"Ready":"AIR UNSAFE - Locked",disabled:E||!f,color:h?"bad":"average",onClick:function(){p("arm")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Delay",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return A(k)},children:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:g,minValue:k,maxValue:y,onChange:function(e,t){return A(t)}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return A(y)},children:"Max"})]})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Fan Status",children:[(0,o.createComponentVNode)(2,a.Button,{color:v===l?"bad":"default",onClick:function(){return L(l)},children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{selected:v===u,onClick:function(){return L(u)},children:"In"}),(0,o.createComponentVNode)(2,a.Button,{selected:v===d,onClick:function(){return L(d)},children:"Out"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Release Pressure",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return B(S)},children:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:D,minValue:S,maxValue:I,onChange:function(e,t){return B(t)}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return B(I)},children:"Max"})]})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Material Processing",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",disabled:0===b,onClick:function(){p("eject-materials")},children:"Eject"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Speed",children:[(0,o.createComponentVNode)(2,a.Button,{selected:1===M,onClick:function(){return T(1)},children:"1"}),(0,o.createComponentVNode)(2,a.Button,{selected:2===M,onClick:function(){return T(2)},children:"2"}),(0,o.createComponentVNode)(2,a.Button,{selected:3===M,onClick:function(){return T(3)},children:"3"}),!!N&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{selected:4===M,onClick:function(){return T(4)},children:"4"}),(0,o.createComponentVNode)(2,a.Button,{selected:5===M,onClick:function(){return T(5)},children:"5"})],4)]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Progress",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:s,value:V/100})})]})})]})})}},62376:function(e,t,n){"use strict";t.__esModule=!0,t.ProcCall=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(48916),c=n(2381);t.ProcCall=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.options;return(0,o.createComponentVNode)(2,c.Window,{title:"Proc Call",width:700,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,i.DataInputOptions,{options:s})})}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("activate")},children:"Confirm Event"})})]})})})}},42626:function(e,t,n){"use strict";t.__esModule=!0,t.Radio=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381),l=n(39582);t.Radio=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=function(e,t){d("set-frequency",{value:e,finish:t})},p=function(e,t){d("set-code",{value:e,finish:t})};return(0,o.createComponentVNode)(2,c.Window,{width:"280",height:"400",title:u.name,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!u.hasToggleButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.power,onClick:function(){return d("toggle-power")},children:u.power?"Powered on":"Powered off"})}),!!u.hasMicrophone&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Microphone",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.broadcasting,onClick:function(){return d("toggle-broadcasting")},children:u.broadcasting?"Engaged":"Disengaged"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Speaker",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.listening,onClick:function(){return d("toggle-listening")},children:u.listening?"Engaged":"Disengaged"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Frequency",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:!u.lockedFrequency&&(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:u.frequency,minValue:1441,maxValue:1489,stepPixelSize:2,format:i.formatFrequency,onDrag:function(e,t){return s(t,!1)},onChange:function(e,t){return s(t,!0)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:u.frequency,format:i.formatFrequency})})]})}),!!u.code&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Code",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:u.code,minValue:1,maxValue:100,stepPixelSize:1,onDrag:function(e,t){return p(t,!1)},onChange:function(e,t){return p(t,!0)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:u.code})})]})}),!!u.sendButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:(0,o.createComponentVNode)(2,a.Button,{align:"center",onClick:function(){d("send")},children:"Send signal"})})]})})}),u.secureFrequencies.length>0&&(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Supplementary Channels",fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Channel"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Frequency"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Prefix"})]}),u.secureFrequencies.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.channel}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.frequency}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Box,{as:"code",children:e.sayToken})})]},e.frequency)}))]})})}),!!u.modifiable&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Access Panel",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Green Wire",labelColor:"green",children:(0,o.createComponentVNode)(2,a.Button,{color:"green",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Transmit})},children:u.wires&l.RadioWires.Transmit?"Cut":"Mend"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Red Wire",labelColor:"red",children:(0,o.createComponentVNode)(2,a.Button,{color:"red",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Receive})},children:u.wires&l.RadioWires.Receive?"Cut":"Mend"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blue Wire",labelColor:"blue",children:(0,o.createComponentVNode)(2,a.Button,{color:"blue",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Signal})},children:u.wires&l.RadioWires.Signal?"Cut":"Mend"})})]})})})]})})})}},39582:function(e,t){"use strict";var n;t.__esModule=!0,t.RadioWires=void 0,t.RadioWires=n,function(e){e[e.Signal=1]="Signal",e[e.Receive=2]="Receive",e[e.Transmit=4]="Transmit"}(n||(t.RadioWires=n={}))},16710:function(e,t,n){"use strict";t.__esModule=!0,t.RandomEvent=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(48916),c=n(2381);t.RandomEvent=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.eventName,s=u.eventOptions;return(0,o.createComponentVNode)(2,c.Window,{title:"Random Event",width:700,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,i.DataInputOptions,{options:s})})}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("activate")},children:"Confirm Event"})})]})})})}},63777:function(e,t,n){"use strict";t.__esModule=!0,t.ReagentExtractor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.ReagentExtractor=function(e,t){var n=(0,r.useBackend)(t).data.containersData,c=n.inserted,d=n.storage_tank_1,s=n.storage_tank_2;return(0,o.createComponentVNode)(2,i.Window,{title:"Reagent Extractor",width:500,height:739,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,children:(0,o.createComponentVNode)(2,l,{container:c,insertable:!0})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,basis:"auto",children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,u)}),(0,o.createComponentVNode)(2,a.Stack.Item,{basis:18,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,grow:!0,children:(0,o.createComponentVNode)(2,l,{container:d})}),(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,children:(0,o.createComponentVNode)(2,l,{container:s})})]})})]})})]})})})};var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.insertable,l=e.container||c.NoContainer,u=(0,r.useSharedState)(t,"transferAmount_"+l.id,10),d=u[0],s=u[1];return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:l.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{title:"Flush All",icon:"times",color:"red",disabled:!l.totalVolume,onClick:function(){return n("flush",{container_id:l.id})}}),!i||(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!e.container,onClick:function(){return n("ejectcontainer")}})],0),children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insertcontainer")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:l}),(0,o.createComponentVNode)(2,c.ReagentList,{container:l,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return n("isolate",{container_id:l.id,reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"times",color:"red",title:"Flush",onClick:function(){return n("flush_reagent",{container_id:l.id,reagent_id:e.id})}})],4)}}),(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,justify:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,basis:"auto",children:(0,o.createComponentVNode)(2,a.Button,{mb:.5,width:17,textAlign:"center",selected:l.selected,title:"Select Extraction and Transfer Target",icon:l.selected?"check-square-o":"square-o",onClick:function(){return n("extractto",{container_id:l.id})},children:"Select"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Flex,{width:17,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Button,{disabled:l.selected,onClick:function(){return n("chemtransfer",{container_id:l.id,amount:d})},children:"Transfer"}),(0,o.createComponentVNode)(2,a.NumberInput,{value:d,format:function(e){return e+"u"},minValue:1,maxValue:500,onDrag:function(e,t){return s(t)}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:l.selected,onClick:function(){return n("chemtransfer",{container_id:l.id,amount:500})},children:"Transfer All"})})]})})]})]})},u=function(e,t){var n,i,c,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.autoextract,p=d.ingredientsData||[],m=(0,r.useLocalState)(t,"page",1),f=m[0],h=m[1],g=Math.max(1,Math.ceil(p.length/25));(f<1||f>g)&&h((n=f,i=1,c=g,Math.min(Math.max(i,n),c)));var C=p.slice(25*(f-1),25*(f-1)+25);return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Extractable Items",buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s,tooltip:"Items will be extracted into the selected container automatically upon insertion.",onClick:function(){return u("autoextract")},children:"Auto-Extract"}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:C.map((function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:e.name}),(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("extractingredient",{ingredient_id:e.id})},children:"Extract"}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",title:"Eject",onClick:function(){return u("ejectingredient",{ingredient_id:e.id})}})]})]}),(0,o.createComponentVNode)(2,a.Divider)],4,e.id)}))})}),g<2||(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:f<2,onClick:function(){return h(f-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:f,format:function(e){return"Page "+e+"/"+g},minValue:1,maxValue:g,stepPixelSize:15,onChange:function(e,t){return h(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:f>g-1,onClick:function(){return h(f+1)}})]})]})})}},89971:function(e,t,n){"use strict";t.__esModule=!0,t.Rockbox=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381);t.Rockbox=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.default_price,s=u.autosell,p=(0,r.useLocalState)(t,"takeAmount",1),m=p[0],f=p[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Rockbox",width:375,height:400,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Box,{children:["Amount to eject: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:m,width:4,minValue:1,onDrag:function(e,t){return f(t)},onChange:function(e,t){return f(t)}})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Default price for new ore entries.",position:"bottom",children:(0,o.createComponentVNode)(2,a.Box,{as:"span",children:[" ","Default Price: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:d,width:4,minValue:0,format:function(e){return e+"\u2abd"},onChange:function(e,t){return l("set-default-price",{newPrice:t})}})]})}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s,tooltip:"Mark new ore entries for sale automatically.",onClick:function(){return l("toggle-auto-sell")},children:"Auto-Sell"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:u.ores.length?(0,o.createComponentVNode)(2,a.Box,{children:u.ores.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:e.stats,children:(0,o.createComponentVNode)(2,a.Table,{children:(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{style:{"vertical-align":"top"},children:(0,o.createComponentVNode)(2,a.Box,{children:e.name+": "+e.amount})}),(0,o.createComponentVNode)(2,a.Table.Cell,{textAlign:"right",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,textAlign:"left",inline:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Price: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:e.price,width:4,minValue:0,format:function(e){return e+"\u2abd"},onChange:function(t,n){return l("set-ore-price",{newPrice:n,ore:e.name})}}),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{content:"For Sale",color:e.forSale?"green":"red",checked:e.forSale,onClick:function(){return l("toggle-ore-sell-status",{ore:e.name})}}),(0,o.createComponentVNode)(2,a.Button,{color:e.amount<m?"orange":"default",disabled:0===e.amount,onClick:function(){return l("dispense-ore",{ore:e.name,take:m})},children:"Eject"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:!!e.amountSold&&(0,o.createComponentVNode)(2,a.Box,{children:"Amount sold: "+e.amountSold})})]})})]})})}),(0,o.createComponentVNode)(2,a.Divider)],4,e.name)}))}):(0,o.createComponentVNode)(2,a.Box,{children:"No ores stored"})})})]})})})}},95285:function(e,t,n){"use strict";t.__esModule=!0,t.SecureSafe=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=[["7","8","9","A"],["4","5","6","B"],["1","2","3","C"],["0","F","E","D"]],u=function(e,t){var n=e.attempt,r=e.codeLen,i=e.disabled,l=e.emagged,u=e.padMsg,d=(e.theme,u||function(e,t){return e.padEnd(t,"*").split("").join(" ")}(n,r));return i&&(d="NO ACCESS"),l&&(d=(0,c.glitch)(d,2)),(0,o.createComponentVNode)(2,a.Box,{fontSize:"25px",fontFamily:"Courier",bold:!0,textAlign:"center",padding:"3px",backgroundColor:"#342210",style:{"border-width":"0.1em","border-style":"solid","border-radius":"0.16em","border-color":"#FC8E1F"},children:d})},d=function(e,t){var n=e.act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex.Item,{children:l.map((function(e,t){var r=e.length;return(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",mt:1,children:e.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mr:t<r-1?1:0,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"25px",fontFamily:"Courier",bold:!0,content:e,onClick:function(){return n("input",{input:e})}})},e)}))},"row-"+t)}))}),(0,o.createComponentVNode)(2,a.Flex.Item,{mt:1,children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mr:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"20px",fontFamily:"Courier",bold:!0,content:"ENTER",onClick:function(){return n("enter")}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"20px",fontFamily:"Courier",bold:!0,content:"RESET",onClick:function(){return n("reset")}})})]})})],4)};t.SecureSafe=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.attempt,m=s.codeLen,f=s.disabled,h=s.emagged,g=s.padMsg,C=s.safeName,N=s.theme;return(0,o.createComponentVNode)(2,i.Window,{title:(0,c.capitalize)(C),width:200,height:328,theme:N||"retro-dark",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,u,{attempt:p,codeLen:m,disabled:f,emagged:h,padMsg:g}),(0,o.createComponentVNode)(2,d,{act:l})]})})})})}},19172:function(e,t,n){"use strict";t.__esModule=!0,t.SeedFabricator=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l={Fruit:1,Vegetable:2,Herb:3,Flower:4,Miscellaneous:5,Other:6},u=function(e,t){return(l[e.name]||l.Other)-(l[t.name]||l.Other)};t.SeedFabricator=function(e,t){var n=(0,r.useBackend)(t).data,l=n.canVend,d=n.isWorking,p=n.maxSeed,m=n.name,f=n.seedCount,h=n.seedCategories||[];h.sort(u);var g=(0,r.useLocalState)(t,"dispenseAmount",1),C=g[0],N=g[1];return(0,o.createComponentVNode)(2,i.Window,{title:m,width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[!d&&(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:35,height:10,fontSize:3,fontFamily:"Courier",color:"red",children:[(0,o.createComponentVNode)(2,a.Blink,{time:500,children:[(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle",pr:1.5}),"MALFUNCTION",(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle",pl:1.5})]}),"CHECK WIRES"]}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{bold:!0,pr:1,children:"Dispense:"}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:6,grow:!0,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:C,format:function(e){return e+(0,c.pluralize)(" seed",e)},minValue:1,maxValue:10,onDrag:function(e,t){return N(t)}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:2,children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:Math.max(0,p-f),maxValue:p,ranges:{yellow:[5,Infinity],bad:[-Infinity,5]},children:(0,o.createComponentVNode)(2,a.Icon,{name:"bolt"})})})]})}),(0,o.createComponentVNode)(2,a.Section,{children:[!l&&(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:25,height:5,fontSize:2,fontFamily:"Courier",color:"yellow",children:[(0,o.createComponentVNode)(2,a.Blink,{interval:500,time:500,children:(0,o.createComponentVNode)(2,a.Icon,{name:"bolt",pr:1.5})}),"UNIT RECHARGING"]}),h.map((function(e){return(0,o.createComponentVNode)(2,s,{category:e,dispenseAmount:C},e.name)}))]})]})})};var d=function(e,t){return e.name.localeCompare(t.name)},s=function(e,t){var n=(0,r.useBackend)(t).act,i=e.category,c=e.dispenseAmount,l=i.name,u=i.seeds;if(!u)return null;var s=u.sort(d);return(0,o.createComponentVNode)(2,a.Collapsible,{title:l,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{as:"span",children:(0,o.createComponentVNode)(2,a.Button,{width:"155px",height:"32px",px:0,m:.25,onClick:function(){return n("disp",{path:e.path,amount:c})},children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:e.img?(0,o.createVNode)(1,"img",null,null,1,{style:{"vertical-align":"middle","horizontal-align":"middle"},height:"32px",width:"32px",src:"data:image/png;base64,"+e.img}):(0,o.createComponentVNode)(2,a.Icon,{style:{"vertical-align":"middle","horizontal-align":"middle"},height:"32px",width:"32px",name:"question-circle-o",pl:"8px",pt:"4px",fontSize:"24px"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{overflow:"hidden",style:{"text-overflow":"ellipsis"},title:e.name,children:e.name})]})})},e.name)}))})}},70535:function(e,t,n){"use strict";t.__esModule=!0,t.SheetCrafting=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SheetCrafting=function(e,t){var n=(0,r.useBackend)(t).data,l=n.availableAmount,u=n.labeledAvailableAmount,d=n.itemList;return(0,o.createComponentVNode)(2,i.Window,{width:360,height:760,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Recipes",fill:!0,scrollable:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,c,{item:e,disabled:l<e.sheetCost},e.recipeID)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Amount Left",children:u})})]})})})};var c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.item,c=i.recipeID,l=i.name,u=i.sheetCost,d=i.itemYield,s=i.img;return(0,o.createComponentVNode)(2,a.Button,{disabled:e.disabled,fluid:!0,onClick:function(){return n("make",{recipeID:c})},m:"0.5rem",children:[(0,o.createComponentVNode)(2,a.Image,{verticalAlign:"middle",my:"0.2rem",mr:"0.5rem",height:"32px",width:"32px",src:"data:image/png;base64,"+s}),d>1?(0,o.createVNode)(1,"em",null,[d,(0,o.createTextVNode)("x ")],0):null,l,u>1?(0,o.createVNode)(1,"em",null,[(0,o.createTextVNode)(" ("),u,(0,o.createTextVNode)(" sheets)")],0):null]})}},24258:function(e,t,n){"use strict";t.__esModule=!0,t.Sleeper=void 0;var o,r=n(96323),a=n(31246),i=n(26949),c=n(2381),l=n(1033),u=n(65751),d=function(e){return e<=0?"0":e.toFixed(1)},s=1,p=2,m=((o={})[0]={name:"Conscious",color:"good",icon:"check"},o[s]={name:"Unconscious",color:"average",icon:"bed"},o[p]={name:"Dead",color:"bad",icon:"skull"},o);t.Sleeper=function(e,t){var n=(0,a.useBackend)(t),o=n.data,s=n.act,p=o.sleeperGone,f=o.hasOccupant,h=o.occupantStat,g=o.health,C=o.oxyDamage,N=o.toxDamage,v=o.burnDamage,b=o.bruteDamage,V=o.recharging,y=o.rejuvinators,x=o.isTiming,I=o.time,k=o.timeStarted,w=o.timeNow,S=o.maxTime,_=Math.max(k?(I||0)+k-w:I||0,0),M=f&&!x&&!V&&h<2,D=m[h];return(0,r.createComponentVNode)(2,c.Window,{theme:"ntos",width:440,height:440,children:(0,r.createComponentVNode)(2,c.Window.Content,{children:[(0,r.createComponentVNode)(2,i.Section,{title:"Occupant Statistics",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"eject",align:"center",color:"good",disabled:!f||!!x,onClick:function(){return s("eject")},children:"Eject"}),children:[!f&&(p?"Check connection to sleeper pod.":"The sleeper is unoccupied."),!!f&&(0,r.createComponentVNode)(2,i.LabeledList,{children:[(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:[(0,r.createComponentVNode)(2,i.Icon,{color:D.color,name:D.icon})," ",D.name]}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Overall Health",children:(0,r.createComponentVNode)(2,i.ProgressBar,{value:g,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Damage Breakdown",children:[(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"oxy",width:5,children:d(C)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"toxin",width:5,children:d(N)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"burn",width:5,children:d(v)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"brute",width:5,children:d(b)})]})]})]}),!!f&&(0,r.createComponentVNode)(2,i.Section,{title:"Detected Rejuvinators",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"syringe",align:"center",color:"good",disabled:!M,onClick:function(){return s("inject")},children:"Inject"}),children:[(0,r.createComponentVNode)(2,i.Section,{height:10,scrollable:!0,children:y.length?(0,r.createComponentVNode)(2,i.LabeledList,{children:y.map((function(e){return(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[(0,r.createComponentVNode)(2,i.Icon,{name:!e.od||e.volume<e.od?"circle":"skull",color:e.color})," "+e.volume.toFixed(3),!!e.od&&e.volume>=e.od&&(0,r.createComponentVNode)(2,i.Box,{inline:!0,color:"bad",pl:1,children:"(Overdose!)"})]},e.name)}))}):"No rejuvinators detected in occupant's bloodstream."}),(0,r.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",color:"label",mt:2,children:"Use separate reagent scanner for complete analysis."})]}),(0,r.createComponentVNode)(2,i.Section,{title:"Occupant Alarm Clock",buttons:(0,r.createComponentVNode)(2,i.Button,{width:8,icon:"clock",align:"center",color:x?"bad":"good",disabled:!f||h>1||I<=0,onClick:function(){return s("timer")},children:x?"Stop Timer":"Start Timer"}),children:(0,r.createComponentVNode)(2,i.Flex,{children:[(0,r.createComponentVNode)(2,i.Flex.Item,{children:(0,r.createComponentVNode)(2,i.Knob,{mr:"0.5em",animated:!0,size:1.25,step:5,stepPixelSize:2,minValue:0,maxValue:S/10,value:_/10,onDrag:function(e,t){return s("time_add",{tp:t-_/10})}})}),(0,r.createComponentVNode)(2,i.Flex.Item,{children:(0,r.createComponentVNode)(2,i.Box,{p:1,textAlign:"center",backgroundColor:"black",color:"good",maxWidth:"90px",width:"90px",fontSize:"20px",children:(0,r.createComponentVNode)(2,i.TimeDisplay,{value:_,timing:!!x,format:function(e){return(0,l.formatTime)(e)}})})}),(0,r.createComponentVNode)(2,i.Flex.Item,{shrink:1,children:(0,r.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",color:"label",pl:1,children:"System will inject rejuvenators automatically when occupant is in hibernation."})})]})})]})})}},82930:function(e,t,n){"use strict";t.__esModule=!0,t.SlotMachine=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SlotMachine=function(e,t){var n=(0,r.useBackend)(t).data,a=n.busy,d=n.scannedCard;return(0,o.createComponentVNode)(2,i.Window,{title:"Slot Machine",width:375,height:220,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:d?a?(0,o.createComponentVNode)(2,u):(0,o.createComponentVNode)(2,l):(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"You must insert your ID to continue!"}),(0,o.createComponentVNode)(2,a.Button,{icon:"id-card",onClick:function(){return n("insert_card")},children:"Insert ID"})],4)},l=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.account_funds,u=c.money,d=c.plays,s=c.scannedCard,p=c.wager;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NoticeBox,{success:!0,children:(0,o.createVNode)(1,"marquee",null," Wager some credits! ",16)}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createVNode)(1,"strong",null,"Your card: ",16),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:s,tooltip:"Pull Funds and Eject Card",tooltipPosition:"bottom-end",onClick:function(){return i("eject")}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(1,"strong",null,"Account Balance:",16)}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"dollar-sign"})," ",l]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Add Funds",tooltipPosition:"bottom",onClick:function(){return i("cashin")},children:"Cash In"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Pull Funds",tooltipPosition:"bottom",onClick:function(){return i("cashout")},children:"Cash Out"})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:"Amount Wagered:"}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:20,maxValue:1e3,value:p,format:function(e){return e+"\u2abd"},onDrag:function(e,t){return i("set_wager",{bet:t})}})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(1,"strong",null,"Credits Remaining:",16)}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"dollar-sign"})," ",u]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.BlockQuote,{children:[d," attempts have been made today!"]})}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"dice",tooltip:"Pull the lever",tooltipPosition:"right",onClick:function(){return i("play",{bet:p})},children:"Play!"})})]})],4)},u=function(){return(0,o.createComponentVNode)(2,a.NoticeBox,{warning:!0,children:"The Machine is busy, please wait!"})}},68952:function(e,t,n){"use strict";t.__esModule=!0,t.Smes=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381),l=1e3;t.Smes=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.charge,p=d.capacity,m=d.inputAttempt,f=d.inputting,h=d.inputLevel,g=d.inputLevelMax,C=d.inputAvailable,N=d.outputAttempt,v=d.outputting,b=d.outputLevel,V=d.outputLevelMax,y=(s/p>=1?"good":f&&h&&"average")||"bad",x=(N&&v?"good":s>0&&"average")||"bad";return(0,o.createComponentVNode)(2,c.Window,{width:340,height:360,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Stored Energy",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stored Energy",children:(0,i.formatSiUnit)(s,0,"J")})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",value:s/p,ranges:{good:[.5,Infinity],average:[.15,.5],bad:[-Infinity,.15]}})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Input",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge Mode",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:m?"green":"red",onClick:function(){return u("toggle-input")},children:m?"On":"Off"}),children:(0,o.createComponentVNode)(2,a.Box,{color:y,children:(s/p>=1?"Fully Charged":m&&h&&!f&&"Initializing")||m&&h&&f&&"Charging"||m&&f&&"Idle"||"Not Charging"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Input",children:(0,o.createComponentVNode)(2,a.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:0===h,onClick:function(){return u("set-input",{target:"min"})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward",disabled:0===h,onClick:function(){return u("set-input",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,a.Slider,{value:h/l,fillValue:C/l,minValue:0,maxValue:g/l,step:5,stepPixelSize:4,format:function(e){return(0,i.formatPower)(e*l,1)},onDrag:function(e,t){return u("set-input",{target:t*l})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"forward",disabled:h===g,onClick:function(){return u("set-input",{adjust:1e4})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:h===g,onClick:function(){return u("set-input",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Available",children:(0,i.formatPower)(C)})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Output",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output Mode",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:N?"green":"red",onClick:function(){return u("toggle-output")},children:N?"On":"Off"}),children:(0,o.createComponentVNode)(2,a.Box,{color:x,children:(v&&N?"Enabled":N&&"Idle")||s&&"Disabled"||"No Charge"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Output",children:(0,o.createComponentVNode)(2,a.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:0===b,onClick:function(){return u("set-output",{target:"min"})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward",disabled:0===b,onClick:function(){return u("set-output",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,a.Slider,{value:b/l,minValue:0,maxValue:V/l,step:5,stepPixelSize:4,format:function(e){return(0,i.formatPower)(e*l,1)},onDrag:function(e,t){return u("set-output",{target:t*l})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"forward",disabled:b===V,onClick:function(){return u("set-output",{adjust:1e4})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:b===V,onClick:function(){return u("set-output",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outputting",children:(0,i.formatPower)(v)})]})})]})})}},54016:function(e,t,n){"use strict";t.__esModule=!0,t.SpawnEvent=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381);t.SpawnEvent=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.thing_to_spawn,s=u.thing_name,p=u.spawn_directly,m=u.spawn_loc,f=u.ghost_confirmation_delay,h=u.amount_to_spawn,g=u.antag_role,C=u.objective_text,N=u.spawn_type,v=u.loc_type,b=u.incompatible_antag,V=u.equip_antag,y=u.ask_permission,x=u.allow_dnr,I=u.eligible_player_count;return(0,o.createComponentVNode)(2,c.Window,{title:"Ghost Spawn Editor",width:500,height:330,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Thing to spawn",children:[(0,o.createComponentVNode)(2,a.Button,{selected:s&&"mob_ref"===N,onClick:function(){return l("select_mob")},tooltip:"mob_ref"===N&&s?d:"",children:"mob_ref"===N?s:"Mob ref"}),(0,o.createComponentVNode)(2,a.Button,{selected:s&&"mob_type"===N,onClick:function(){return l("select_mob_type")},tooltip:"mob_type"===N&&s?d:"",children:"mob_type"===N?s:"Mob type"}),(0,o.createComponentVNode)(2,a.Button,{selected:s&&"job"===N,onClick:function(){return l("select_job")},tooltip:"job"===N&&s?d:"",children:"job"===N?s:"Job"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Accept delay",children:[!!y&&(0,o.createComponentVNode)(2,a.NumberInput,{value:f/10,minValue:0,maxValue:120,onDrag:function(e,t){return l("set_spawn_delay",{spawn_delay:10*t})},disabled:!y}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:y,onClick:function(){return l("set_ask_permission",{ask_permission:!y})},tooltip:"Do we ask permission or just spawn them directly?",children:"Ask permission."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Amount to spawn",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:h,minValue:1,maxValue:100,onDrag:function(e,t){return l("set_amount",{amount:t})}}),"/",I," ",(0,o.createComponentVNode)(2,a.Button,{icon:"refresh",onClick:function(){return l("refresh_player_count")}}),1===h&&"mob_ref"===N&&s&&(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:p,onClick:function(){return l("set_spawn_directly",{spawn_directly:!p})},tooltip:"Puts the ghost mind directly into the original mob instead of copying it.",children:"Spawn as original"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Spawn location",children:[(0,o.createComponentVNode)(2,a.Button,{disabled:p,selected:m&&"turf_ref"===v,onClick:function(){return l("select_turf")},children:"turf_ref"===v?m:"Turf ref"}),(0,o.createComponentVNode)(2,a.Button,{disabled:p,selected:m&&"landmark"===v,onClick:function(){return l("select_landmark")},children:"landmark"===v?m:"Landmark"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Antagonist status",children:[(0,o.createComponentVNode)(2,a.Button,{selected:g,onClick:function(){return l("select_antag")},children:g||"Antag role"}),g&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{color:"red",onClick:function(){return l("clear_antag")},children:"x"}),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:V,tooltip:"Give antag default equipment and abilities? Will overwrite anything already equipped in those slots.",onClick:function(){return l("set_equip",{equip_antag:!V})},children:"Equip antags"})],4),!!b&&(0,o.createComponentVNode)(2,a.Button,{color:"yellow",circular:!0,icon:"circle-exclamation",tooltip:"Some antagonists are only compatible with human mobs, this may not work properly."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"DNR",children:(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:x,tooltip:"Allow players who have set DNR to respawn in this event",onClick:function(){return l("set_allow_dnr",{allow_dnr:!x})},children:"Allow DNR players"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Objective text",children:(0,o.createComponentVNode)(2,a.TextArea,{value:C,fluid:!0,height:5,onChange:function(e,t){return l("set_objective_text",{objective_text:t})}})})]})}),(0,o.createComponentVNode)(2,a.Section,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("spawn")},disabled:!d||"[0x0]"===d,children:"Spawn"})})]})})}},19378:function(e,t,n){"use strict";t.__esModule=!0,t.SpendSpacebux=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.product,n=t.pname,r=t.cost,i=t.img,c=e.disabled,l=e.onClick;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:n}),(0,o.createComponentVNode)(2,a.Box,{children:["Cost: "+r," ",(0,o.createVNode)(1,"i","fa-solid fa-coins")]})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:l,disabled:c,children:"Buy"})})]}),(0,o.createComponentVNode)(2,a.Divider)],4)};t.SpendSpacebux=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.purchasables,s=u.held,p=u.balance,m=u.truebalance,f=(0,r.useLocalState)(t,"filter-available",!1),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Spend Spacebux",width:300,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.BlockQuote,{children:"Purchase an item for the upcoming round. Earn more cash by completing rounds. A purchased item will persist until you die or fail to escape the station. If you have a Held Item, buying a new one will replace it."}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[s?(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{children:["Held Item: ",s]})}):"",(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{children:["Balance: ",p," ",(0,o.createVNode)(1,"i","fa-solid fa-coins")]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:h,onClick:function(){return g(!h)},children:"Filter Affordable"})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:d.filter((function(e){var t=e.cost;return!(h&&m<t)})).map((function(e){var t=e.pname,n=e.cost;return(0,o.createComponentVNode)(2,c,{product:e,disabled:m<n,onClick:function(){return l("purchase",{pname:t})}},t)}))})]})]})})})}},79387:function(e,t,n){"use strict";t.__esModule=!0,t.SwingSign=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SwingSign=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.message,d=l.maxRows,s=l.maxCols;return(0,o.createComponentVNode)(2,i.Window,{width:30+8*s,height:95+15*d,title:"Swing sign",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{content:"Save",onClick:function(){l.message=document.getElementById("messageTA").value,c("save_message",l)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(128,"textarea",null,u,0,{id:"messageTA",cols:s,rows:d,maxlength:s*d+d-1,style:{overflow:"hidden",background:"#0A0A0A",color:"#FFFFFF",outline:"1px #6A93C3",textalign:"center",wrap:"hard"},placeholder:"Your message goes here...",onInput:function(e){for(var t=e.target.value.split(/\n/g),n=0;n<t.length;n++)if(t[n]&&t[n].length>s){var o=t[n].substring(0,s);t[n]=t[n].substring(s,t[n].length),t.splice(n,0,o)}t&&t.length>d&&t.splice(d,t.length-d),e.target.value=t.join("\n")}})})]})})})})}},44001:function(e,t,n){"use strict";t.__esModule=!0,t.SwingSignTIM=void 0;var o=n(96323),r=n(34277),a=n(31246),i=n(26949),c=n(2381);t.SwingSignTIM=function(e,t){var n=(0,a.useBackend)(t).data,s=n.max_length,p=n.message,m=n.placeholder,f=n.title,h=n.allowEmpty,g=n.rows,C=n.columns,N=(0,a.useLocalState)(t,"input",m),v=N[0],b=N[1],V=(0,a.useLocalState)(t,"inputIsValid",{isValid:h||!!p,error:null}),y=V[0],x=V[1],I=130+Math.ceil(p.length/5)+75;return(0,o.createComponentVNode)(2,c.Window,{title:f,width:325,height:I,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{color:"label",children:p})}),(0,o.createComponentVNode)(2,l,{input:v,inputIsValid:y,onType:function(e){e.preventDefault();var t=e.target;t.value=d(t.value,g,C),x(u(t.value,s,g)),b(t.value)}}),(0,o.createComponentVNode)(2,i.Stack.Item,{pl:5,pr:5,children:(0,o.createComponentVNode)(2,r.InputButtons,{input:v,inputIsValid:y})})]})})})})};var l=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=(n.data,e.input),l=(e.inputIsValid,e.onType);return(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.TextArea,{autoFocus:!0,height:"100%",textAlign:"center",fontFamily:"Consolas",onInput:function(e){return l(e)},onEnter:function(){r("submit",{entry:c})},placeholder:"Type something...",style:{overflow:"hidden",whiteSpace:"pre-line",wrap:"hard",textAlignLast:"center"},value:c})})},u=function(e,t,n){return t&&e.length>t||n&&e.split(/\n/g).length>n?{isValid:!1,error:"Too long!"}:{isValid:!0,error:null}},d=function(e,t,n){for(var o=e.split(/\n/g),r=0;r<o.length;r++)if(o[r]&&o[r].length>n){var a=o[r].substring(0,n);o[r]=o[r].substring(n,o[r].length),o.splice(r,0,a)}return o.join("\n")}},13634:function(e,t,n){"use strict";t.__esModule=!0,t.TEG=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.TEG=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),u=l.output,d=l.history,s=l.hotCircStatus,p=l.hotInletTemp,m=l.hotOutletTemp,f=l.hotInletPres,h=l.hotOutletPres,g=l.coldCircStatus,C=l.coldInletTemp,N=l.coldOutletTemp,v=l.coldInletPres,b=l.coldOutletPres,V=d.map((function(e,t){return[t,e]})),y=Math.max.apply(Math,d),x=function(e){return(e>=1e3?e.toExponential(3):e)+" K"};return(0,o.createComponentVNode)(2,c.Window,{height:"520",width:"300",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output History"})}),(0,o.createComponentVNode)(2,a.Chart.Line,{height:"5em",data:V,rangeX:[0,V.length-1],rangeY:[0,y],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Energy Output",textAlign:"right",children:(0,i.formatPower)(u)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Hot Gas Circulator",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:(s&&p?"good":s&&"average")||"bad",children:(s&&p?"OK":s&&"Idle")||"ERROR"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cold Gas Circulator",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:(g&&C?"good":g&&"average")||"bad",children:(g&&C?"OK":g&&"Idle")||"ERROR"})})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Hot Loop",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Temp",textAlign:"right",children:x(p)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Temp",textAlign:"right",children:x(m)}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(Math.max(f,0),1,"Pa")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(h,1,"Pa")})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Cold Loop",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Temp",textAlign:"right",children:x(C)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Temp",textAlign:"right",children:x(N)}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(Math.max(v,0),1,"Pa")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(b,1,"Pa")})]})})]})})}},99714:function(e,t,n){"use strict";t.__esModule=!0,t.TankDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.TankDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,i.Window,{width:280,height:105,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Plasma",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:l.plasma?"circle":"circle-o",content:"Dispense",disabled:!l.plasma,onClick:function(){return c("dispense-plasma")}}),children:l.plasma}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Oxygen",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:l.oxygen?"circle":"circle-o",content:"Dispense",disabled:!l.oxygen,onClick:function(){return c("dispense-oxygen")}}),children:l.oxygen})]})})})})}},87221:function(e,t,n){"use strict";t.__esModule=!0,t.BookmarksSection=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(581);t.BookmarksSection=function(e,t){var n=e.bookmarks,l=e.maxBookmarks,u=e.onAddBookmark,d=e.onDeleteBookmark,s=e.onRestoreBookmark,p=e.targetCoords,m=(0,a.useLocalState)(t,"newBookmarkName",""),f=m[0],h=m[1],g=function(e){u(e),h("")};return(0,o.createComponentVNode)(2,i.Section,{title:"Bookmarks",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[n.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:(0,c.formatCoordinates)(e.x,e.y,e.z),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"trash",color:"red",onClick:function(){return d(e.ref)}}),children:(0,o.createComponentVNode)(2,i.Button,{icon:"bookmark",onClick:function(){return s(e.ref)},children:(0,r.decodeHtmlEntities)(e.name)})},e.ref)})),!!(n.length<l)&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:c.formatCoordinates.apply(void 0,p),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return g(f)}}),children:(0,o.createComponentVNode)(2,i.Input,{width:"100%",value:f,onInput:function(e,t){return h(t)},placeholder:"New bookmark",onEnter:function(e,t){return g(t)},maxLength:32})},"new")]})})}},75461:function(e,t,n){"use strict";t.__esModule=!0,t.ConnectionSection=void 0;var o=n(96323),r=n(26949);t.ConnectionSection=function(e){var t=e.isConnected,n=e.isPanelOpen,a=e.onCyclePad,i=e.onReset,c=e.onRetry,l=e.padNum,u=t?(0,o.createComponentVNode)(2,r.Button,{icon:"power-off",color:"red",onClick:i,children:"Reset"}):(0,o.createComponentVNode)(2,r.Button,{icon:"power-off",color:"green",onClick:c,children:"Retry"});return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Connection",buttons:u,children:t?(0,o.createComponentVNode)(2,r.Box,{color:"green",children:"Connected"}):(0,o.createComponentVNode)(2,r.Box,{color:"red",children:"No connection to host"})}),n&&(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Linked Pad",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"arrows-spin",onClick:a,children:"Cycle"}),children:l})]})})}},12703:function(e,t,n){"use strict";t.__esModule=!0,t.CoordinatesSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(34545),c=n(581);t.CoordinatesSection=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.xTarget,s=u.yTarget,p=u.zTarget;return(0,o.createComponentVNode)(2,a.Section,{title:"Target",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"X",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{format:c.formatDecimal,maxValue:500,minValue:0,nudgeAmount:.25,skipAmount:10,stepAmount:1,step:.25,onChange:function(e){return l("setX",{value:e})},value:d})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Y",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{format:c.formatDecimal,maxValue:500,minValue:0,nudgeAmount:.25,skipAmount:10,stepAmount:1,step:.25,onChange:function(e){return l("setY",{value:e})},value:s})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Z",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{maxValue:14,minValue:0,onChange:function(e){return l("setZ",{value:e})},stepPixelSize:16,value:p})})]})})}},34545:function(e,t,n){"use strict";t.__esModule=!0,t.SteppedSlider=void 0;var o=n(96323),r=n(97622),a=n(26949),i=["format","maxValue","minValue","onAdjust","onChange","nudgeAmount","skipAmount","step","stepAmount","value"];t.SteppedSlider=function(e){var t,n=e.format,c=e.maxValue,l=e.minValue,u=e.onAdjust,d=e.onChange,s=e.nudgeAmount,p=e.skipAmount,m=e.step,f=e.stepAmount,h=e.value,g=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),C=null!=(t=null!=f?f:m)?t:1,N=function(e){u?u(e):d((0,r.clamp)(h+e,l,c))};return(0,o.createComponentVNode)(2,a.Stack,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"backward-fast",onClick:function(){return d(l)},tooltip:"Minimum ("+l+")",tooltipPosition:"bottom"}),!!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"backward",onClick:function(){return N(-p)},tooltip:"Skip Down ("+-p+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward-step",onClick:function(){return N(-C)},tooltip:"Step Down ("+-C+")",tooltipPosition:"bottom"}),!!s&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return N(-s)},tooltip:"Nudge Down ("+-s+")",tooltipPosition:"bottom",children:(0,o.createComponentVNode)(2,a.Icon,{name:"play",rotation:180})})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Slider,Object.assign({},g,{format:n,maxValue:c,minValue:l,onChange:function(e,t){return d(t)},step:m,value:h})))}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!!s&&(0,o.createComponentVNode)(2,a.Button,{icon:"play",onClick:function(){return N(s)},tooltip:"Nudge Up (+"+s+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"forward-step",onClick:function(){return N(C)},tooltip:"Step Up (+"+C+")",tooltipPosition:"bottom"}),!!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"forward",onClick:function(){return N(p)},tooltip:"Skip Up (+"+p+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",onClick:function(){return d(c)},tooltip:"Maximum ("+c+")",tooltipPosition:"bottom"})]})]})}},79268:function(e,t,n){"use strict";t.__esModule=!0,t.TeleConsole=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(87221),l=n(75461),u=n(12703),d=n(581);t.TeleConsole=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data,m=p.xTarget,f=p.yTarget,h=p.zTarget,g=p.hostId,C=p.bookmarks,N=p.readout,v=p.isPanelOpen,b=p.padNum,V=p.maxBookmarks,y=!!g;return(0,o.createComponentVNode)(2,i.Window,{theme:"ntos",width:400,height:515,children:(0,o.createComponentVNode)(2,i.Window.Content,{textAlign:"center",children:[(0,o.createComponentVNode)(2,u.CoordinatesSection),(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",onClick:function(){return s("send")},disabled:!y,children:"Send"}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",onClick:function(){return s("receive")},disabled:!y,children:"Receive"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return s("portal")},disabled:!y,children:[(0,o.createComponentVNode)(2,a.Icon,{name:"ring",rotation:90}),"Toggle Portal"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"magnifying-glass",onClick:function(){return s("scan")},disabled:!y,children:"Scan"})]}),N&&(0,o.createComponentVNode)(2,a.Section,{children:(0,d.formatReadout)(N)}),(0,o.createComponentVNode)(2,c.BookmarksSection,{bookmarks:C,maxBookmarks:V,onAddBookmark:function(e){return s("addbookmark",{value:e})},onDeleteBookmark:function(e){return s("deletebookmark",{value:e})},onRestoreBookmark:function(e){return s("restorebookmark",{value:e})},targetCoords:[m,f,h]}),(0,o.createComponentVNode)(2,l.ConnectionSection,{isConnected:y,isPanelOpen:!!v,onCyclePad:function(){return s("setpad")},onReset:function(){return s("reconnect",{value:2})},onRetry:function(){return s("reconnect",{value:1})},padNum:b})]})})}},65087:function(){},581:function(e,t,n){"use strict";t.__esModule=!0,t.formatReadout=t.formatCoordinates=t.formatDecimal=void 0;var o=n(97622),r=n(21118),a=function(e){return(0,o.toFixed)(e,2)};t.formatDecimal=a;t.formatCoordinates=function(e,t,n){return a(e)+" / "+a(t)+" / "+n};t.formatReadout=function(e){return(0,r.decodeHtmlEntities)(e)}},73354:function(e,t,n){"use strict";t.__esModule=!0,t.InputAndButtonsSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.InputAndButtonsSection=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.TermActive;return(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,a.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Input,{id:"terminalInput",placeholder:"Type Here",selfClear:!0,fluid:!0,mr:"0.5rem",onEnter:function(e,t){i("text",{value:t})},history:!0})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Enter",children:(0,o.createComponentVNode)(2,a.Button,{icon:"share",color:c?"green":"red",onClick:function(){var e=document.querySelector("#terminalInput .Input__input");i("text",{value:e.value}),e.value=""},mr:"0.5rem",my:.25})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Restart",children:(0,o.createComponentVNode)(2,a.Button,{icon:"repeat",color:c?"green":"red",onClick:function(){return i("restart")},my:.25})})})]})})}},58084:function(e,t,n){"use strict";t.__esModule=!0,t.PheripheralsSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.PheripheralsSection=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.peripherals||[];return(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:e.icon,content:e.label,fontFamily:e.Clown?"Comic Sans MS":"Consolas",color:e.color?"green":"grey",onClick:function(){return function(e){return i("buttonPressed",{card:e.card,index:e.index})}(e)}},e.card)}))})}},98341:function(e,t,n){"use strict";t.__esModule=!0,t.TerminalOutputSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.TerminalOutputSection=function(e,t){var n=(0,r.useBackend)(t).data,i=n.fontColor,c=n.bgColor,l=e.displayHTML;return(0,o.createComponentVNode)(2,a.Section,{backgroundColor:c,scrollable:!0,fill:!0,id:"terminalOutput",children:(0,o.createComponentVNode)(2,a.Box,{fontFamily:"Consolas",fill:!0,color:i,dangerouslySetInnerHTML:{__html:l}})})}},14831:function(e,t,n){"use strict";t.__esModule=!0,t.Terminal=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(98341),c=n(73354),l=n(58084),u=n(26949);t.Terminal=function(e,t){var n=(0,r.useBackend)(t).data,d=n.windowName,s=n.displayHTML,p=function(){var e=document.querySelector("#terminalOutput .Section__content");e&&(e.scrollTop=e.scrollHeight)};return(0,o.createComponentVNode)(2,a.Window,{theme:"retro-dark",title:d,fontFamily:"Consolas",width:"380",height:"350",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,u.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,u.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.TerminalOutputSection,{displayHTML:s},null,{onComponentDidMount:p,onComponentDidUpdate:function(e,t){e.displayHTML!==t.displayHTML&&p()}})}),(0,o.createComponentVNode)(2,u.Stack.Item,{children:(0,o.createComponentVNode)(2,c.InputAndButtonsSection)}),(0,o.createComponentVNode)(2,u.Stack.Item,{children:(0,o.createComponentVNode)(2,l.PheripheralsSection)})]})})})}},55230:function(){},14081:function(e,t,n){"use strict";t.__esModule=!0,t.Terrainify=t.TerrainOptions=t.TerrainToggles=t.TerrainVehicleChoice=t.TerrainChoice=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.typeData,n=e.terrain,r=e.onTerrainValue;return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:(0,o.createComponentVNode)(2,a.Section,{title:"Types",children:Object.keys(t).map((function(e,i){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:n===e,onClick:function(){return r(e)},children:t[e].name})},i)}))})})})};t.TerrainChoice=c;var l=function(e){var t=e.fabricator,n=e.cars,r=e.allowVehicles,i=e.onToggleFabricators,c=e.onToggleCars,l=e.onToggleAllowVehicles;return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Vehicle Options",children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:t,content:"Add Subs to Fabricators",onClick:function(){return i()}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,content:"Convert some Cars",onClick:function(){return c()}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:r,content:"Allow Pods",onClick:function(){return l()}})]})})};t.TerrainVehicleChoice=l;var u=function(e){var t=e.terrain,n=e.typeData,r=e.activeToggles,i=e.onToggle;return t&&n[t].toggles&&Object.keys(n[t].toggles).length?(0,o.createComponentVNode)(2,a.Section,{title:"Toggles",children:Object.keys(n[t].toggles).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:r[e],content:e,onClick:function(){return i(e)}})},t)}))}):""};t.TerrainToggles=u;var d=function(e){var t=e.terrain,n=e.typeData,r=e.activeOptions,i=e.onSelect;return t&&n[t].options&&Object.keys(n[t].options).length?Object.keys(n[t].options).map((function(e,c){return(0,o.createComponentVNode)(2,a.Section,{title:e,children:n[t].options[e].map((function(t,n){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:r[e]===t,onClick:function(){return i(e,t)},children:t})},n)}))},c)})):""};t.TerrainOptions=d;t.Terrainify=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data,m=p.typeData,f=p.terrain,h=p.fabricator,g=p.cars,C=p.allowVehicles,N=p.locked,v=p.activeOptions,b=p.activeToggles;return(0,o.createComponentVNode)(2,i.Window,{title:"Terrainify",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Terrainify"}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,c,{typeData:m,terrain:f,onTerrainValue:function(e){s("terrain",{terrain:e})}}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:2}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Description",children:f?m[f].description:"..."}),(0,o.createComponentVNode)(2,l,{fabricator:h,cars:g,allowVehicles:C,onToggleAllowVehicles:function(){s("allowVehicles")},onToggleFabricators:function(){s("fabricator")},onToggleCars:function(){s("cars")}}),(0,o.createComponentVNode)(2,u,{typeData:m,terrain:f,activeToggles:b,onToggle:function(e){s("toggle",{toggle:e})}}),(0,o.createComponentVNode)(2,d,{typeData:m,terrain:f,activeOptions:v,onSelect:function(e,t){s("option",{key:e,value:t})}})]})]}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,disabled:N,onClick:function(){return s("activate")},children:"Transform Station"})})]})})})}},81235:function(e,t,n){"use strict";t.__esModule=!0,t.TextInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(31246),c=n(26949),l=n(2381);t.TextInputModal=function(e,t){var n=(0,i.useBackend)(t).data,s=n.max_length,p=n.message,m=n.multiline,f=n.placeholder,h=n.timeout,g=n.title,C=n.allowEmpty,N=n.theme,v=(0,i.useLocalState)(t,"input",f),b=v[0],V=v[1],y=(0,i.useLocalState)(t,"inputIsValid",{isValid:C||!!p,error:null}),x=y[0],I=y[1],k=130+Math.ceil(p.length/5)+(m?75:0);return(0,o.createComponentVNode)(2,l.Window,{title:g,width:325,height:k,theme:N||"nanotrasen",children:[h&&(0,o.createComponentVNode)(2,r.Loader,{value:h}),(0,o.createComponentVNode)(2,l.Window.Content,{children:(0,o.createComponentVNode)(2,c.Section,{fill:!0,children:(0,o.createComponentVNode)(2,c.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Box,{color:"label",children:p})}),(0,o.createComponentVNode)(2,u,{input:b,inputIsValid:x,onType:function(e){e.preventDefault();var t=e.target;I(d(t.value,s,C)),V(t.value)}}),(0,o.createComponentVNode)(2,c.Stack.Item,{pl:5,pr:5,children:(0,o.createComponentVNode)(2,a.InputButtons,{input:b,inputIsValid:x})})]})})})]})};var u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,a=n.data.multiline,l=e.input,u=e.inputIsValid,d=e.onType;return a?(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,c.TextArea,{autoFocus:!0,height:"100%",onInput:function(e){return d(e)},onEnter:function(){r("submit",{entry:l})},placeholder:"Type something...",value:l})}):(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Input,{autoFocus:!0,fluid:!0,onInput:function(e){return d(e)},onEnter:function(){u&&r("submit",{entry:l})},placeholder:"Type something...",value:l})})},d=function(e,t,n){return t&&e.length>t?{isValid:!1,error:"Too long!"}:0!==e.length||n?{isValid:!0,error:null}:{isValid:!1,error:null}}},80480:function(e,t,n){"use strict";t.__esModule=!0,t.Timer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.Timer=function(e,t){var n=(0,r.useBackend)(t),l=n.data,u=n.act,d=function(e){u("set-time",{value:10*e})},s=function(e){return(0,c.formatTime)(10*e)};return(0,o.createComponentVNode)(2,i.Window,{width:"280",height:"200",title:l.name,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!l.armButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Armed",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.armed,onClick:function(){return u("toggle-armed")},children:l.armed?"Armed":"Not armed"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Timing",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.timing,onClick:function(){return u("toggle-timing")},children:l.timing?"Timing":"Not timing"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:l.time,minValue:l.minTime,maxValue:600,stepPixelSize:1,format:s,onDrag:function(e,t){return d(t)},onChange:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:l.time,format:s})})]})})]})})})})}},5051:function(e,t,n){"use strict";t.__esModule=!0,t.TransitShuttle=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.TransitShuttle=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.destinations||[],d=l.currentlocation||[],s=l.endlocation||[],p=l.shuttlename,m=l.moving,f=l.locked,h="the "+p+" is currently at "+d.name;return m&&s&&(h+=" moving to "+s.name),(0,o.createComponentVNode)(2,i.Window,{height:"520",width:"300",title:p,children:[(0,o.createComponentVNode)(2,a.BlockQuote,{style:{margin:"5px"},children:h}),(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,height:"100%",children:u.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Table,{direction:"row",align:"center",children:(0,o.createComponentVNode)(2,a.Table.Row,{children:(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:e.name,disabled:f||m||d.type===e.type,onClick:function(){return c("callto",{dest:e.type})}})})})},e.type),(0,o.createComponentVNode)(2,a.Divider)],8)}))})]})}},73128:function(e,t,n){"use strict";t.__esModule=!0,t.TrscArray=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(26949),c=n(1033);t.TrscArray=function(e,t){var n=(0,a.useBackend)(t),l=n.act,u=n.data,d=u.apcCellStat,s=u.apcCellDiff,p=u.arrayCellStat,m=u.arrayCellDiff,f=u.sendsSafe,h=u.sendsMax,g=u.failsafeThreshold,C=u.failsafeStat,N=u.arrayImage,v=u.arrayHealth,b=u.drawRateTarget,V=u.surplusThreshold;return(0,o.createComponentVNode)(2,r.Window,{width:400,height:525,title:"Transception Systems",children:(0,o.createComponentVNode)(2,r.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Array Status",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Flex,{height:21,direction:"column",justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Area Cell Power:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h3",null,d,0),(0,o.createComponentVNode)(2,i.ProgressBar,{value:s,color:"#f9ae00"})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Internal Capacitor:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h3",null,p,0),(0,o.createComponentVNode)(2,i.ProgressBar,{value:m,color:"#76B9D3"})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Transceptions Remaining"),(0,o.createVNode)(1,"br"),(0,o.createTextVNode)("(Standard / Maximum)"),(0,o.createVNode)(1,"br")],4),(0,o.createVNode)(1,"h2",null,[f,(0,o.createTextVNode)(" | "),h],0)]})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{backgroundColor:"#A37933",children:(0,o.createComponentVNode)(2,i.Box,{mb:1,mx:.5,height:19,backgroundColor:"#101020",children:(0,o.createComponentVNode)(2,i.Flex,{mx:2,my:2,height:18,direction:"column",justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Image,{pixelated:!0,width:"96px",height:"96px",src:"data:image/png;base64,"+N,backgroundColor:"transparent"}),(0,o.createVNode)(1,"br")]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Array Condition:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h2",null,v,0)]})]})})})]})})}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.Section,{title:"Transception Systems",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Transception Capability:"),(0,o.createVNode)(1,"br"),C],0)}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Power Loss Failsafe:"),(0,o.createVNode)(1,"br"),g,(0,o.createTextVNode)(" | ")],0),(0,o.createComponentVNode)(2,i.Button,{content:"Toggle",onClick:function(){return l("toggle_failsafe")}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Internal Capacitor Control",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Target Charge Rate:"),(0,o.createVNode)(1,"br")],4),(0,o.createComponentVNode)(2,i.Slider,{value:b,minValue:0,maxValue:5e4,step:1e3,stepPixelSize:4,format:function(e){return(0,c.formatPower)(e)},onDrag:function(e,t){return l("set_draw_rate",{drawRateTarget:t})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Required Surplus:"),(0,o.createVNode)(1,"br")],4),(0,o.createComponentVNode)(2,i.Slider,{value:V,minValue:1e4,maxValue:2e5,step:5e3,stepPixelSize:4,format:function(e){return(0,c.formatPower)(e)},onDrag:function(e,t){return l("set_surplus",{surplusThreshold:t})}})]})]})})]})})}},73248:function(e,t,n){"use strict";t.__esModule=!0,t.TurbineControl=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.TurbineControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.rpm,s=u.load,p=u.power,m=u.volume,f=u.history,h=u.overspeed,g=u.overtemp,C=u.undertemp,N=f.map((function(e){return e[0]})),v=N.map((function(e,t){return[t,e]})),b=f.map((function(e){return e[1]})),V=b.map((function(e,t){return[t,e]})),y=f.map((function(e){return e[2]})),x=y.map((function(e,t){return[t,e]})),I=Math.max.apply(Math,y),k=Math.max.apply(Math,N),w=Math.max.apply(Math,b);return(0,o.createComponentVNode)(2,c.Window,{width:375,height:400,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Output",children:(0,i.formatPower)(p)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:x,rangeX:[0,x.length-1],rangeY:[0,I],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Speed",children:[d," RPM"]}),h?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"OVERSPEED"}):"",g?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"OVER TEMPERATURE"}):"",C?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"UNDER TEMPERATURE"}):""]}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:v,rangeX:[0,v.length-1],rangeY:[0,k],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Load",children:[s," Joules/Revolution"]})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:V,rangeX:[0,V.length-1],rangeY:[0,w],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Stator Load:",(0,o.createComponentVNode)(2,a.NumberInput,{minValue:1,value:s,format:function(e){return e+" Joules/Revolution"},onChange:function(e,t){return l("loadChange",{newVal:t})}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Coolant Volume:",(0,o.createComponentVNode)(2,a.NumberInput,{minValue:1,value:m,format:function(e){return e+" L"},onChange:function(e,t){return l("volChange",{newVal:t})}})]})]})})})}},40620:function(e,t,n){"use strict";t.__esModule=!0,t.TurretControl=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(26949),c=n(96794),l=n(18331),u=function(e){for(var t=[],n=0;n<e;n++)Math.random()>.3?t.push("Kill. "):t.push("KILL. ");return t.map((function(e,t){return(0,o.createComponentVNode)(2,i.Box,{inline:!0,preserveWhitespace:!0,fontSize:(0,c.randInt)(11,25)+"px",children:e},t)}))};t.TurretControl=function(e,t){var n=(0,a.useBackend)(t),c=n.act,d=n.data,s=d.enabled,p=d.lethal,m=d.emagged,f=d.area,h=d.locked,g=function(e){c("setLethal",{lethal:e})},C=function(e){c("setEnabled",{enabled:e})};return(0,o.createComponentVNode)(2,r.Window,{title:m?"FATAL ERROR":"Turret control ("+f+")",theme:m?"syndicate":"ntos",width:400,height:160,children:(0,o.createComponentVNode)(2,r.Window.Content,{align:"center",children:(0,o.createComponentVNode)(2,i.Box,{py:"6px",children:[!m&&!h&&(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:[(0,o.createComponentVNode)(2,i.Section,{width:"70%",children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",fluid:!0,selected:s,onClick:function(){return C(!0)},children:"Enabled"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",fluid:!0,selected:!s,onClick:function(){return C(!1)},children:"Disabled"})})]})}),(0,o.createComponentVNode)(2,i.Section,{width:"70%",children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",fluid:!0,selected:!p,onClick:function(){return g(!1)},children:"Stun"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"skull-crossbones",fluid:!0,selected:p,onClick:function(){return g(!0)},children:"Lethal"})})]})})]}),!m&&!!h&&(0,o.createComponentVNode)(2,i.Section,{children:"Panel locked, swipe ID card to unlock."}),!!m&&(0,o.createComponentVNode)(2,i.Box,{py:"20px",children:[(0,o.createComponentVNode)(2,i.Box,{align:"center",fontFamily:"Courier New",children:(0,l.glitch)("ERROR: UNABLE TO READ AUTHORIZATION",12)}),(0,o.createComponentVNode)(2,i.Box,{align:"center",style:{"font-size":"20px"},children:u(7)})]})]})})})}},97170:function(e,t,n){"use strict";t.__esModule=!0,t.Vendors=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(26949),l=n(72638);t.Vendors=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.wiresList||[],p=d.productList||[],m=d.lightColors||[],f=d.windowName,h=d.wiresOpen,g=d.cash,C=d.bankMoney,N=d.requiresMoney,v=d.cardname,b=d.playerBuilt,V=d.name,y=d.owner,x=d.unlocked,I=d.loading,k=d.busy,w=d.busyphrase,S=d.currentlyVending,_=function(e){return(e.cost<=g||e.cost<=C||!N)&&e.amount>0},M=function(e){return e.cost&&N?e.cost+"\u2abd":"Vend"};return(0,o.createComponentVNode)(2,a.Window,{title:f,width:"500",height:"600",fontFamily:"Consolas","font-size":"10pt",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,c.Stack,{vertical:!0,fill:!0,minHeight:"1%",maxHeight:"100%",children:[h&&(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Collapsible,{mb:"1%",title:"Wire Panel",children:[h&&s.map((function(e){return(0,o.createComponentVNode)(2,c.Flex,{textColor:e.color,children:[(0,o.createComponentVNode)(2,c.Flex.Item,{grow:!0,bold:!0,children:e.name}),(0,o.createComponentVNode)(2,c.Flex.Item,{mr:"5%",children:(0,o.createComponentVNode)(2,i.Button,{ml:"10%",my:"1%",content:"Pulse",onClick:function(){return u("pulsewire",{wire:e.name})}})}),(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{m:"1%",content:e.uncut?"Cut":"Mend",onClick:function(){return u(e.uncut?"cutwire":"mendwire",{wire:e.name})}})})]},e.name)})),(0,o.createComponentVNode)(2,c.Divider),b&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Owner: "+y+" ("+(x?"Unlocked":"Locked")+")",onClick:function(){return u("togglelock")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Loading Chute",disabled:!x,color:I?"green":"red",onClick:function(){return u("togglechute")}}),(0,o.createComponentVNode)(2,i.Button.Input,{content:V,defaultValue:V,onCommit:function(e,t){return u("rename",{name:t})}})],4),(0,o.createComponentVNode)(2,c.Flex,{justify:"space-between",align:"stretch",children:[(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"AI Control",children:m.ai_control?"Enabled":"Disabled"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Electrification",children:m.electrified?"Yes":"No"})]})}),(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Inventory",children:m.extendedinventory?"Expanded":"Standard"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Safety Light",children:m.shootinventory?"On":"Off"})]})]})]})}),(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,minHeight:"1%",maxHeight:"100%",children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,height:"100%",children:[!k&&p.map((function(e){return(0,o.createComponentVNode)(2,c.Flex,{justify:"space-between",align:"stretch",style:{"border-bottom":"1px #555 solid"},children:[(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:e.img&&(0,o.createComponentVNode)(2,i.Box,{style:{overflow:"show",height:"24px"},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+e.img,style:{transform:"translate(0, -4px)"}})})}),(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",grow:!0,style:{display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:[!e.infinite&&e.amount+" x","\xa0"]}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[e.name,b&&h&&(0,o.createComponentVNode)(2,i.Button,{inline:!0,color:"green",icon:"images",style:{"margin-left":"5px"},onClick:function(){return u("setIcon",{target:e.ref})}})]})]})}),(0,o.createComponentVNode)(2,c.Flex.Item,{bold:!0,direction:"row",style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"},children:b&&x?(0,o.createComponentVNode)(2,i.Button.Input,{color:_(e)?"green":"grey",content:M(e),style:{width:"50px","text-align":"center"},onCommit:function(t,n){return u("setPrice",{target:e.ref,cost:n})}}):(0,o.createComponentVNode)(2,i.Button,{color:_(e)?"green":"grey",content:M(e),disabled:!_(e),style:{width:"50px","text-align":"center",padding:"0px"},onClick:function(){return u("vend",{target:e.ref,cost:e.cost,amount:e.amount})}})})]},e.name)})),!!k&&(0,o.createComponentVNode)(2,c.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Image,{height:"128px",width:"128px",pixelated:!0,src:"data:image/png;base64,"+p.find((function(e){return e.name===S})).img})}),(0,o.createComponentVNode)(2,c.Stack.Item,{align:"center",children:w})]})]})}),N>0&&(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,l.VendorCashTable,{cardname:v,onCardClick:function(){return u("logout")},bankMoney:C,cash:g,onCashClick:function(){return u("returncash")}})})]})})})}},96880:function(e,t,n){"use strict";t.__esModule=!0,t.WeaponVendor=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(2381),l=n(18331);t.WeaponVendor=function(e,t){var n=(0,a.useBackend)(t).data,r=(0,a.useLocalState)(t,"filter-available",!1),d=r[0],s=r[1];return(0,o.createComponentVNode)(2,c.Window,{width:550,height:700,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{className:"WeaponVendor",vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Balance",children:Object.entries(n.credits).map((function(e,t){var r=e[0],a=e[1];return(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:"5px",className:"WeaponVendor__Credits--"+r,children:[a," ",r," ",(0,l.pluralize)("credit",a),t+1!==Object.keys(n.credits).length?", ":""]},r)}))})})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,title:"Materiel",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:d,onClick:function(){return s(!d)},children:"Filter Available"}),children:Object.keys(n.credits).map((function(e){return(0,o.createComponentVNode)(2,u,{category:e,filterAvailable:d},e)}))})})]})})})};var u=function(e,t){var n=e.category,c=e.filterAvailable,l=(0,a.useBackend)(t).data,u=l.stock.filter((function(e){return e.category===n}));return c&&(u=u.filter((function(e){return e.cost<=l.credits[e.category]}))),0===u.length?null:(0,o.createComponentVNode)(2,i.Collapsible,{className:"WeaponVendor__Category--"+n,title:(0,r.toTitleCase)(n),open:!0,color:n,children:(0,o.createComponentVNode)(2,i.Table,{children:l.stock.filter((function(e){return e.category===n})).map((function(e){return(0,o.createComponentVNode)(2,d,{stock:e},e.name)}))})})},d=function(e,t){var n=e.stock,r=(0,a.useBackend)(t),c=r.data,u=r.act;return(0,o.createComponentVNode)(2,i.Table.Row,{className:"WeaponVendor__Row",opacity:n.cost>c.credits[n.category]?.5:1,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{className:"WeaponVendor__Cell",py:"5px",children:[(0,o.createComponentVNode)(2,i.Box,{mb:"5px",bold:!0,children:n.name}),(0,o.createComponentVNode)(2,i.Box,{children:n.description})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{className:"WeaponVendor__Cell",py:"5px",textAlign:"right",children:(0,o.createComponentVNode)(2,i.Button,{disabled:n.cost>c.credits[n.category],color:n.category,onClick:function(){return u("redeem",{ref:n.ref})},children:["Redeem ",n.cost," ",(0,l.pluralize)("credit",n.cost)]})})]})}},10661:function(){},57361:function(e,t,n){"use strict";t.__esModule=!0,t.BeakerContents=void 0;var o=n(96323),r=n(26949);t.BeakerContents=function(e){var t=e.beakerLoaded,n=e.beakerContents;return(0,o.createComponentVNode)(2,r.Box,{children:[!t&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"No beaker loaded."})||0===n.length&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"Beaker is empty."}),n.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{color:"label",children:[e.volume," units of ",e.name]},e.name)}))]})}},48916:function(e,t,n){"use strict";t.__esModule=!0,t.DataInputOptions=void 0;var o=n(96323),r=n(31246),a=n(26949);t.DataInputOptions=function(e){var t=e.options;return t&&Object.keys(t).length?Object.keys(t).map((function(e,n){return(0,o.createComponentVNode)(2,i,{type:t[e].type,name:e,description:t[e].description,value:t[e].value,tooltip:t[e].description,list:t[e].list,a:t[e].a,b:t[e].b},e)})):""};var i=function(e,t){var n=e.name,i=e.description,m=e.type,f=(0,r.useBackend)(t).act,h={Number:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e))),Color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,u,Object.assign({},e))),Text:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),Ref:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),"Mob Reference":(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),"Reference Picker":(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),Boolean:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),"Children of Type":(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e))),"List Var":(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e))),List:(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e)))};return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:i,children:h[m]||f("unsupported_type",{name:n,type:m})})},c=function(e,t){var n=e.value,i=(e.tooltip,e.name),c=e.type,l=e.list,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,height:15,children:l.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:e===n,color:"transparent",onClick:function(){return u("modify_value",{name:i,value:e,type:c})},children:e},t)}))})},l=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Button,{icon:"location-crosshairs",onClick:function(){return u("modify_ref_value",{name:c,type:l})},children:n})})},u=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:c,type:l})}}),(0,o.createComponentVNode)(2,a.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,a.Input,{value:n,width:"90px",onInput:function(e,t){return u("modify_value",{name:c,value:t,type:l})}})]})},d=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=e.a,d=e.b,s=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:0|u,maxValue:100|d,stepPixelSize:5,width:"39px",onDrag:function(e,t){return s("modify_value",{name:c,value:t,type:l})}})})},s=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,onClick:function(){return u("modify_value",{name:c,value:!n,type:l})}})})},p=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Input,{value:n,width:"200px",onInput:function(e,t){return u("modify_value",{name:c,value:t,type:l})}})})}},65751:function(e,t,n){"use strict";t.__esModule=!0,t.damageNum=t.HealthStat=void 0;var o=n(96323),r=n(1060),a=n(84200),i=n(54425),c=["type","children","className"];t.HealthStat=function(e){var t=e.type,n=e.children,l=e.className,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return u.color=a.COLORS.damageType[t]&a.COLORS.damageType[t],(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},u,{className:(0,r.classes)(["HealthStat",l,(0,i.computeBoxClassName)(u)]),color:a.COLORS.damageType[t],children:n})))};t.damageNum=function(e){return!e||e<=0?"0":e.toFixed(1)}},8095:function(e,t,n){"use strict";t.__esModule=!0,t.IDCard=void 0;var o=n(96323),r=n(26949);t.IDCard=function(e,t){if(e.card){var n=e.card,a=e.onEject;return(0,o.createComponentVNode)(2,r.Button,{icon:"eject",content:n.name+" ("+n.role+")",tooltip:"Clear scanned card",tooltipPosition:"bottom-end",onClick:a})}}},34277:function(e,t,n){"use strict";t.__esModule=!0,t.InputButtons=void 0;var o=n(96323),r=n(31246),a=n(26949);t.InputButtons=function(e,t){var n=(0,r.useBackend)(t).act,i=e.input,c=e.inputIsValid,l=(0,o.createComponentVNode)(2,a.Button,{color:"good",disabled:c&&!c.isValid,fluid:!1,onClick:function(){return n("submit",{entry:i})},pt:0,textAlign:"center",tooltip:(null==c?void 0:c.error)||null,width:6,children:"Submit"}),u=(0,o.createComponentVNode)(2,a.Button,{color:"bad",fluid:!1,onClick:function(){return n("cancel")},pt:0,textAlign:"center",width:6,children:"Cancel"}),d=l;return(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:u}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:c&&!c.isValid&&c.error&&(0,o.createComponentVNode)(2,a.Box,{color:"average",nowrap:!0,textAlign:"center",children:c.error})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:d})]})}},9720:function(e,t,n){"use strict";t.__esModule=!0,t.KeyHealthIndicators=void 0;var o=n(96323),r=n(26949),a=n(18331);t.KeyHealthIndicators=function(e){var t=e.mobData,n=t.occupied,a=t.patient_status,l=t.blood_pressure_rendered,u=t.blood_pressure_status,m=t.blood_volume,f=t.body_temp,h=t.optimal_temp,g=t.embedded_objects,C=t.rad_stage,N=t.rad_dose,v=t.brain_damage;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table,{children:[(0,o.createComponentVNode)(2,i,{occupied:n,patient_status:a,blood_pressure_rendered:l,blood_pressure_status:u,blood_volume:m}),(0,o.createComponentVNode)(2,c,{occupied:n,body_temp:f,optimal_temp:h,embedded_objects:g}),!!n&&(0,o.createComponentVNode)(2,d,{rad_stage:C,rad_dose:N}),(0,o.createComponentVNode)(2,s,{occupied:n,status:v})]}),!!n&&(0,o.createComponentVNode)(2,p,{embedded_objects:g})],0)};var i=function(e){var t=e.occupied,n=e.patient_status,a=e.blood_pressure_rendered,i=e.blood_pressure_status,c=e.blood_volume,l="grey";return t&&(l=c<=299?"red":c<=414?"yellow":c<=584?"green":c<=665?"yellow":"red"),(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"Blood Pressure:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:l,nowrap:!0,children:[!!t&&2!==n&&a+" ("+i+")",!t&&"--/--"]}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"number"==typeof c&&(0,o.createFragment)([(0,o.createTextVNode)("Blood Volume:")],4)}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:l,children:"number"==typeof c&&(0,o.createFragment)([t?c.toString():"--",(0,o.createTextVNode)(" units")],0)})]})},c=function(e){var t=e.occupied,n=e.body_temp,a=e.optimal_temp,i=e.embedded_objects;return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,l,{occupied:t,body_temp:n,optimal_temp:a}),(0,o.createComponentVNode)(2,u,{occupied:t,embedded_objects:i})]})},l=function(e){var t=e.occupied,n=e.body_temp,a=e.optimal_temp,i="grey";return t&&(i=n>=a+60?"red":n>=a+30?"yellow":n<=a-60?"purple":n<=a-30?"blue":"green"),(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",children:"Temperature:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{color:i,nowrap:!0,children:[!!t&&(n-273.15).toPrecision(4)+"\xb0C / "+(1.8*(n-273.15)+32).toPrecision(4)+"\xb0F",!t&&"--\xb0C / --\xb0F"]})],4)},u=function(e){var t=e.embedded_objects,n=e.occupied;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",children:"Implants:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{color:n?"white":"grey",children:[!!n&&t.implant_count+" "+(0,a.pluralize)("implant",t.implant_count),!n&&"--"]})],4)},d=function(e){var t=e.rad_stage,n=e.rad_dose,a=null,i=!1;if(t>0){switch(t){case 1:a="yellow";break;case 2:a="orange";break;case 3:a="orange",i=!0;break;case 4:case 5:case 6:a="red",i=!0}return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",color:"yellow",width:10,children:"Radiation:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:a,bold:i,children:["Stage ",t]}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,children:"Effective Dose:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,nowrap:!0,children:[n.toPrecision(6)," Sv"]})]})}},s=function(e){var t=e.occupied,n=e.status;if(t&&"Okay"!==n.desc&&"Missing"!==n.desc)return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",color:"pink",width:10,children:"Brain Damage:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:n.color,children:n.desc}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"Neuron Cohesion:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{children:[((120-n.value)/120*100).toFixed(2),"%"]})]})},p=function(e){var t=e.embedded_objects;return(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:[!!t.has_chest_object&&(0,o.createComponentVNode)(2,r.Box,{bold:!0,fontSize:1.2,color:"red",children:"Sizable foreign object located below sternum!"}),!!t.foreign_object_count&&(0,o.createComponentVNode)(2,r.Box,{bold:!0,fontSize:1.2,color:"red",children:["Foreign ",""+(0,a.pluralize)("object",t.foreign_object_count)," detected!"]})]})}},68397:function(){},36814:function(e,t,n){"use strict";t.__esModule=!0,t.ListSearch=void 0;var o=n(96323),r=n(1060),a=n(26949);t.ListSearch=function(e){var t=e.autoFocus,n=e.className,i=e.currentSearch,c=e.noResultsPlaceholder,l=e.onSearch,u=e.onSelect,d=e.options,s=e.searchPlaceholder,p=void 0===s?"Search...":s,m=e.selectedOption,f=void 0===m?null:m,h=(0,r.classes)(["list-search-interface",n]);return(0,o.createComponentVNode)(2,a.Stack,{className:h,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Input,{autoFocus:t,fluid:!0,onInput:function(e,t){l(t)},placeholder:p,value:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[0===d.length&&(0,o.createComponentVNode)(2,a.Placeholder,{mx:1,py:.5,children:c}),d.map((function(e){return(0,o.createVNode)(1,"div",(0,r.classes)(["list-search-interface__search-option","Button","Button--fluid","Button--color--transparent","Button--ellipsis",f&&e===f&&"Button--selected"]),e,0,{onClick:function(){return u(e)},title:e},e)}))]})]})}},55631:function(e,t,n){"use strict";t.__esModule=!0,t.Loader=void 0;var o=n(96323),r=n(26949),a=n(97622);t.Loader=function(e){var t=e.value;return(0,o.createVNode)(1,"div","AlertModal__Loader",(0,o.createComponentVNode)(2,r.Box,{className:"AlertModal__LoaderProgress",style:{width:100*(0,a.clamp01)(t)+"%"}}),2)}},90881:function(e,t){"use strict";var n;t.__esModule=!0,t.MobStatuses=t.MobStatus=void 0;var o={Conscious:0,Unconscious:1,Dead:2};t.MobStatus=o;var r=((n={})[o.Conscious]={name:"Conscious",color:"good",icon:"check"},n[o.Unconscious]={name:"Unconscious",color:"average",icon:"bed"},n[o.Dead]={name:"Dead",color:"bad",icon:"skull"},n);t.MobStatuses=r},41161:function(e,t,n){"use strict";t.__esModule=!0,t.PortableHoldingTank=t.PortableBasicInfo=void 0;var o=n(96323),r=n(26949),a=n(1033);t.PortableBasicInfo=function(e){var t=e.connected,n=e.pressure,i=e.maxPressure,c=e.children;return(0,o.createComponentVNode)(2,r.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,r.RoundGauge,{size:1.75,value:n,minValue:0,maxValue:i,alertAfter:.7*i,ranges:{good:[0,.7*i],average:[.7*i,.85*i],bad:[.85*i,i]},format:a.formatPressure})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Port",color:t?"good":"average",children:t?"Connected":"Not Connected"})]}),c]})};t.PortableHoldingTank=function(e){var t=e.holding,n=e.onEjectTank,i=e.title;return(0,o.createComponentVNode)(2,r.Section,{title:i||"Holding Tank",minHeight:"115px",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"eject",content:"Eject",disabled:!t,onClick:function(){return n()}}),children:t?(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,r.RoundGauge,{size:1.75,value:t.pressure,minValue:0,maxValue:t.maxPressure,alertAfter:.7*t.maxPressure,ranges:{good:[0,.7*t.maxPressure],average:[.7*t.maxPressure,.85*t.maxPressure],bad:[.85*t.maxPressure,t.maxPressure]},format:a.formatPressure})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Label",children:t.name})]}):(0,o.createComponentVNode)(2,r.Box,{color:"average",children:["No ",i?i.toLowerCase():"holding tank"]})})}},51418:function(e,t,n){"use strict";t.__esModule=!0,t.ReagentBar=t.ReagentList=t.ReagentGraph=t.NoContainer=t.MatterStateIconMap=t.MatterState=void 0;var o,r,a=n(96323),i=n(26949),c=n(48175),l=["className","height","sort"],u=["className","renderButtons","sort","showState","height"],d=["className","container"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}t.MatterState=r,function(e){e[e.Solid=1]="Solid",e[e.Liquid=2]="Liquid",e[e.Gas=3]="Gas"}(r||(t.MatterState=r={}));var p=((o={})[r.Solid]={icon:"square",pr:.5},o[r.Liquid]={icon:"tint",pr:.9},o[r.Gas]={icon:"wind",pr:.5},o);t.MatterStateIconMap=p;var m={name:"No Beaker Inserted",contents:[],id:"inserted",maxVolume:100,totalVolume:0,finalColor:"#000000",temperature:c.freezeTemperature,fake:!0};t.NoContainer=m;var f=function(e){e.className;var t,n=e.height,o=e.sort,r=s(e,l),c=null!=(t=e.container)?t:m,u=c.maxVolume,d=c.totalVolume,p=c.finalColor,f=o?c.contents.slice().sort(o):c.contents||[];return r.height=n||"50px",(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.Box,Object.assign({},r,{children:(0,a.createComponentVNode)(2,i.Flex,{height:"100%",direction:"column",children:[(0,a.createComponentVNode)(2,i.Flex.Item,{grow:!0,children:(0,a.createComponentVNode)(2,i.Flex,{height:"100%",children:[f.map((function(e){return(0,a.createComponentVNode)(2,i.Flex.Item,{grow:e.volume/u,children:(0,a.createComponentVNode)(2,i.Tooltip,{content:e.name+" ("+e.volume+"u)",position:"bottom",children:(0,a.createComponentVNode)(2,i.Box,{px:0,my:0,height:"100%",backgroundColor:"rgb("+e.colorR+", "+e.colorG+", "+e.colorB+")"})})},e.id)})),(0,a.createComponentVNode)(2,i.Flex.Item,{grow:(u-d)/u,children:(0,a.createComponentVNode)(2,i.Tooltip,{content:"Nothing"+(c.fake?"":" ("+(u-d)+"u)"),position:"bottom",children:(0,a.createComponentVNode)(2,i.NoticeBox,{px:0,my:0,height:"100%",backgroundColor:"rgba(0, 0, 0, 0)"})})})]})}),(0,a.createComponentVNode)(2,i.Flex.Item,{children:(0,a.createComponentVNode)(2,i.Tooltip,{content:(0,a.createComponentVNode)(2,i.Box,{children:[(0,a.createComponentVNode)(2,i.ColorBox,{color:p})," Current Mixture Color"]}),position:"bottom",children:(0,a.createComponentVNode)(2,i.Box,{height:"14px",backgroundColor:f.length?p:"rgba(0, 0, 0, 0.1)",textAlign:"center",children:c.fake||(0,a.createComponentVNode)(2,i.Box,{as:"span",backgroundColor:"rgba(0, 0, 0, 0.5)",px:1,children:d+"/"+u})})})})]})})))};t.ReagentGraph=f;var h=function(e){e.className;var t,n=e.renderButtons,o=e.sort,r=e.showState,c=e.height,l=s(e,u),d=null!=(t=e.container)?t:m,f=o?d.contents.slice().sort(o):d.contents||[];return l.height=c||6,(0,a.createComponentVNode)(2,i.Section,{scrollable:"auto"!==c,children:(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.Box,Object.assign({},l,{children:f.length?f.map((function(e){return(0,a.createComponentVNode)(2,i.Flex,{mb:.2,align:"center",children:[(0,a.createComponentVNode)(2,i.Flex.Item,{grow:!0,children:[(0,a.createComponentVNode)(2,i.Icon,{pr:r?p[e.state].pr:.9,name:r?p[e.state].icon:"circle",style:{"text-shadow":"0 0 3px #000;"},color:"rgb("+e.colorR+", "+e.colorG+", "+e.colorB+")"}),"( "+e.volume+"u ) "+e.name]}),n&&(0,a.createComponentVNode)(2,i.Flex.Item,{nowrap:!0,children:n(e)})]},e.id)})):(0,a.createComponentVNode)(2,i.Box,{color:"label",children:[(0,a.createComponentVNode)(2,i.Icon,{pr:.9,name:"circle-o",style:{"text-shadow":"0 0 3px #000;"}}),"Empty"]})})))})};t.ReagentList=h;var g=function(e,t){return e!==t&&(!e||!t||e.volume!==t.volume||e.name!==t.name||e.id!==t.id||e.colorR!==t.colorR||e.colorG!==t.colorG||e.colorB!==t.colorB)},C=function(e,t){var n,o;if(e===t)return!1;if(null===e||null===t)return!0;if(e.totalVolume!==t.totalVolume||e.finalColor!==t.finalColor||e.maxVolume!==t.maxVolume)return!0;if((null==(n=e.contents)?void 0:n.length)!==(null==(o=t.contents)?void 0:o.length))return!0;for(var r in e)if(g(e.contents[r],t.contents[r]))return!0;return!1};f.defaultHooks={onComponentShouldUpdate:function(e,t){var n;for(n in e)if("container"!==n&&!(n in t))return!0;for(n in t)if("container"!==n&&e[n]!==t[n])return!0;return C(e.container,t.container)}},h.defaultHooks={onComponentShouldUpdate:function(e,t){var n;for(n in e)if("container"!==n&&"renderButtons"!==n&&!(n in t))return!0;for(n in t)if("container"!==n&&"renderButtons"!==n)if("renderButtonsDeps"!==n||"object"!=typeof e.renderButtonsDeps||"object"!=typeof t.renderButtonsDeps){if(e[n]!==t[n])return!0}else{var o=e.renderButtonsDeps,r=t.renderButtonsDeps;if(o.length!==r.length)return!0;var a=void 0;for(a in o)if(o[a]!==r[a])return!0}return C(e.container,t.container)}};t.ReagentBar=function(e){e.className;var t=e.container,n=s(e,d),o=t.maxVolume,r=t.totalVolume,c=t.finalColor;return(0,a.createComponentVNode)(2,i.Stack,{align:"center",pb:1,children:[(0,a.createComponentVNode)(2,i.Stack.Item,{children:(0,a.createComponentVNode)(2,i.Box,{textAlign:"right",width:"3em",children:r+"u"})}),(0,a.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.ProgressBar,Object.assign({value:r,minValue:0,maxValue:o,color:c},n)))}),(0,a.createComponentVNode)(2,i.Stack.Item,{children:(0,a.createComponentVNode)(2,i.Box,{textAlign:"left",width:"3em",children:o+"u"})})]})}},75015:function(e,t,n){"use strict";t.__esModule=!0,t.ReleaseValve=void 0;var o=n(96323),r=n(26949);t.ReleaseValve=function(e){var t=e.valveIsOpen,n=e.releasePressure,a=void 0===n?0:n,i=e.minRelease,c=void 0===i?0:i,l=e.maxRelease,u=void 0===l?0:l,d=e.onToggleValve,s=e.onSetPressure;return(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Release valve",children:(0,o.createComponentVNode)(2,r.Button,{content:t?"Open":"Closed",color:t?"average":"default",onClick:d})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Release pressure",children:[(0,o.createComponentVNode)(2,r.Button,{onClick:function(){return s(c)},content:"Min"}),(0,o.createComponentVNode)(2,r.NumberInput,{animated:!0,width:"7em",value:a,minValue:c,maxValue:u,onChange:function(e,t){return s(t)}}),(0,o.createComponentVNode)(2,r.Button,{onClick:function(){return s(u)},content:"Max"})]})]})}},72638:function(e,t,n){"use strict";t.__esModule=!0,t.VendorCashTable=void 0;var o=n(96323),r=n(26949);t.VendorCashTable=function(e){var t=e.cardname,n=e.onCardClick,a=e.bankMoney,i=e.cash,c=e.onCashClick;return(0,o.createComponentVNode)(2,r.Table,{"font-size":"9pt",direction:"row",style:{maxWidth:"100%","table-layout":"fixed"},children:[(0,o.createComponentVNode)(2,r.Table.Row,{children:(0,o.createComponentVNode)(2,r.Table.Cell,{bold:!0,children:[t&&(0,o.createComponentVNode)(2,r.Button,{icon:"id-card",mr:"100%",content:t||"",title:t||"",onClick:n,ellipsis:!0,maxWidth:"100%"}),t&&a>=0&&"Money on account: "+a+"\u2abd"]})}),(0,o.createComponentVNode)(2,r.Table.Row,{children:(0,o.createComponentVNode)(2,r.Table.Cell,{bold:!0,direction:"row",children:[i>0&&"Cash: "+i+"\u2abd",i>0&&i&&(0,o.createComponentVNode)(2,r.Button,{icon:"eject",ml:"1%",content:"eject",onClick:c})]})})]})}},818:function(e,t){"use strict";t.__esModule=!0,t.getStatsMax=t.processStatsData=void 0;t.processStatsData=function(e){if(0===(null!=e?e:[]).length)return null;for(var t=Object.keys(e[0]),n=t.reduce((function(e,t){return e[t]=[],e}),{}),o=0;o<e.length;o++)for(var r=e[o],a=0;a<t.length;a++){var i,c=t[a];n[c].push([o,null!=(i=r[c])?i:0])}return n};t.getStatsMax=function(e){var t=0;for(var n in e){var o=e[n][1];o>t&&(t=o)}return t}},96794:function(e,t){"use strict";t.__esModule=!0,t.randInt=void 0;t.randInt=function(e,t){return Math.floor(Math.random()*(t-e+1))+e}},18331:function(e,t,n){"use strict";t.__esModule=!0,t.glitch=t.spaceUnderscores=t.capitalize=t.pluralize=void 0;var o=n(96794);t.pluralize=function(e,t){return 1!==t?e+"s":e};t.capitalize=function(e){return e.replace(/(^\w{1})|(\s+\w{1})/g,(function(e){return e.toUpperCase()}))};t.spaceUnderscores=function(e){return e.replace(/[_]/g,(function(e){return" "}))};var r=["$","{","]","%","^","?",">","\xac","\u03c0",";","\u0438","\u046b","/","#","~"];t.glitch=function(e,t){for(var n=e.split(""),a=0;a<t;a++){n[(0,o.randInt)(0,n.length?n.length-1:0)]=r[(0,o.randInt)(0,r.length-1)]}return n.join("")}},48175:function(e,t,n){"use strict";t.__esModule=!0,t.getTemperatureChangeName=t.getTemperatureIcon=t.getTemperatureColor=t.neutralTemperature=t.freezeTemperature=t.TemperatureColors=void 0;var o=n(89295),r={cold:new o.Color(66,194,255),neutral:new o.Color(170,170,170),hot:new o.Color(255,120,0),veryhot:new o.Color(255,0,0)};t.TemperatureColors=r;t.freezeTemperature=273.15;var a=293.15;t.neutralTemperature=a;var i=493.15;t.getTemperatureColor=function(e,t){void 0===t&&(t=1e3);var n=r.cold,c=r.neutral,l=r.hot,u=r.veryhot;return e<i?o.Color.lookup((e-a)/400+.5,[n,c,l]).toString():o.Color.lookup((e-i)/(t-i),[l,u]).toString()};t.getTemperatureIcon=function(e){switch(Math.round(e/200)){case 0:return"thermometer-empty";case 1:return"thermometer-quarter";case 2:return"thermometer-half";case 3:return"thermometer-three-quarters";default:return"thermometer-full"}};t.getTemperatureChangeName=function(e,t){return e<t?"heating":e>t?"cooling":"neutral"}},30041:function(e,t,n){"use strict";t.__esModule=!0,t.Layout=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(99397),c=["className","theme","mode","children"],l=["className","scrollable","children"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.theme,i=void 0===n?"nanotrasen":n,l=e.mode,d=void 0===l?"dark":l,s=e.children,p=u(e,c);return(0,o.createVNode)(1,"div",(0,r.classes)(["theme-"+i,"mode-"+d]),(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout",t,(0,a.computeBoxClassName)(p)]),s,0,Object.assign({},(0,a.computeBoxProps)(p)))),2)};t.Layout=d;var s=function(e){var t=e.className,n=e.scrollable,i=e.children,c=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout__content",n&&"Layout__content--scrollable",t,(0,a.computeBoxClassName)(c)]),i,0,Object.assign({},(0,a.computeBoxProps)(c))))};s.defaultHooks={onComponentDidMount:function(e){return(0,i.addScrollableNode)(e)},onComponentWillUnmount:function(e){return(0,i.removeScrollableNode)(e)}},d.Content=s},76738:function(e,t,n){"use strict";t.__esModule=!0,t.NtosWindow=void 0;var o=n(96323),r=n(57723),a=n(31246),i=n(26949),c=n(34881),l=function(e,t){var n=e.title,l=e.width,u=void 0===l?575:l,d=e.height,s=void 0===d?700:d,p=e.theme,m=void 0===p?"ntos":p,f=e.children,h=(0,a.useBackend)(t),g=h.act,C=h.data,N=C.PC_device_theme,v=C.PC_batteryicon,b=C.PC_showbatteryicon,V=C.PC_batterypercent,y=C.PC_ntneticon,x=C.PC_apclinkicon,I=C.PC_stationtime,k=C.PC_programheaders,w=void 0===k?[]:k,S=C.PC_showexitprogram;return(0,o.createComponentVNode)(2,c.Window,{title:n,width:u,height:s,theme:m,children:(0,o.createVNode)(1,"div","NtosWindow",[(0,o.createVNode)(1,"div","NtosWindow__header NtosHeader",[(0,o.createVNode)(1,"div","NtosHeader__left",[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:2,children:I}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,mr:2,opacity:.33,children:["ntos"===N&&"NtOS","syndicate"===N&&"Syndix"]})],4),(0,o.createVNode)(1,"div","NtosHeader__right",[w.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(e.icon)})},e.icon)})),(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:y&&(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(y)})}),!(!b||!v)&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:[(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(v)}),V&&V]}),x&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(x)})}),!!S&&(0,o.createComponentVNode)(2,i.Button,{width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-minimize-o",tooltip:"Minimize",tooltipPosition:"bottom",onClick:function(){return g("PC_minimize")}}),!!S&&(0,o.createComponentVNode)(2,i.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-close-o",tooltip:"Close",tooltipPosition:"bottom-start",onClick:function(){return g("PC_exit")}}),!S&&(0,o.createComponentVNode)(2,i.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"power-off",tooltip:"Power off",tooltipPosition:"bottom-start",onClick:function(){return g("PC_shutdown")}})],0)],4),f],0)})};t.NtosWindow=l;l.Content=function(e){return(0,o.createVNode)(1,"div","NtosWindow__content",(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Window.Content,Object.assign({},e))),2)}},52243:function(e,t,n){"use strict";t.__esModule=!0,t.Pane=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(27157),l=n(30041),u=["theme","children","className"],d=["className","fitted","children"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var p=function(e,t){var n=e.theme,d=e.children,p=e.className,m=s(e,u),f=(0,a.useBackend)(t).suspended,h=(0,c.useDebug)(t).debugLayout;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Layout,Object.assign({className:(0,r.classes)(["Window",p]),theme:n},m,{children:(0,o.createComponentVNode)(2,i.Box,{fillPositionedParent:!0,className:h&&"debug-layout",children:!f&&d})})))};t.Pane=p;p.Content=function(e){var t=e.className,n=e.fitted,a=e.children,i=s(e,d);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},i,{children:n&&a||(0,o.createVNode)(1,"div","Window__contentPadding",a,0)})))}},34881:function(e,t,n){"use strict";t.__esModule=!0,t.Window=void 0;var o=n(96323),r=n(1060),a=n(465),i=n(21118),c=n(31246),l=n(26949),u=n(84200),d=n(27157),s=(n(98069),n(41410)),p=n(79926),m=n(30041),f=["className","fitted","children"];function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}var g=(0,p.createLogger)("Window"),C=[400,600],N=function(e){var t,n;function l(){return e.apply(this,arguments)||this}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,h(t,n);var p=l.prototype;return p.componentDidMount=function(){var e=(0,c.useBackend)(this.context).suspended,t=this.props.canClose,n=void 0===t||t;e||(Byond.winset(window.__windowId__,{"can-close":Boolean(n)}),g.log("mounting"),this.updateGeometry())},p.componentDidUpdate=function(e){(this.props.width!==e.width||this.props.height!==e.height)&&this.updateGeometry()},p.updateGeometry=function(){var e,t=(0,c.useBackend)(this.context).config,n=Object.assign({size:C},t.window);this.props.width&&this.props.height&&(n.size=[this.props.width,this.props.height]),null!=(e=t.window)&&e.key&&(0,s.setWindowKey)(t.window.key),(0,s.recallWindowGeometry)(n)},p.render=function(){var e,t,n=this.props,l=n.canClose,p=void 0===l||l,f=n.theme,h=n.title,C=n.children,N=(0,c.useBackend)(this.context),v=N.config,V=N.suspended,y=(0,d.useDebug)(this.context).debugLayout,x=(0,a.useDispatch)(this.context),I=null==(e=v.window)?void 0:e.fancy,k=null==(t=v.window)?void 0:t.mode,w=v.user&&(v.user.observer?v.status<u.UI_DISABLED:v.status<u.UI_INTERACTIVE);return(0,o.createComponentVNode)(2,m.Layout,{className:"Window",theme:f,mode:k,children:[(0,o.createComponentVNode)(2,b,{className:"Window__titleBar",title:!V&&(h||(0,i.decodeHtmlEntities)(v.title)),status:v.status,fancy:I,onDragStart:s.dragStartHandler,onClose:function(){g.log("pressed close"),x((0,c.backendSuspendStart)())},canClose:p}),(0,o.createVNode)(1,"div",(0,r.classes)(["Window__rest",y&&"debug-layout"]),[!V&&C,w&&(0,o.createVNode)(1,"div","Window__dimmer")],0),I&&(0,o.createFragment)([(0,o.createVNode)(1,"div","Window__resizeHandle__e",null,1,{onMousedown:(0,s.resizeStartHandler)(1,0)}),(0,o.createVNode)(1,"div","Window__resizeHandle__s",null,1,{onMousedown:(0,s.resizeStartHandler)(0,1)}),(0,o.createVNode)(1,"div","Window__resizeHandle__se",null,1,{onMousedown:(0,s.resizeStartHandler)(1,1)})],4)]})},l}(o.Component);t.Window=N;N.Content=function(e){var t=e.className,n=e.fitted,a=e.children,i=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,f);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,m.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},i,{children:n&&a||(0,o.createVNode)(1,"div","Window__contentPadding",a,0)})))};var v=function(e){switch(e){case u.UI_INTERACTIVE:return"good";case u.UI_UPDATE:return"average";case u.UI_DISABLED:default:return"bad"}},b=function(e,t){var n=e.className,c=e.title,u=e.status,d=e.canClose,s=e.fancy,p=e.onDragStart,m=e.onClose;(0,a.useDispatch)(t);return(0,o.createVNode)(1,"div",(0,r.classes)(["TitleBar",n]),[u===undefined&&(0,o.createComponentVNode)(2,l.Icon,{className:"TitleBar__statusIcon",name:"tools",opacity:.5})||(0,o.createComponentVNode)(2,l.Icon,{className:"TitleBar__statusIcon",color:v(u),name:"eye"}),(0,o.createVNode)(1,"div","TitleBar__title","string"==typeof c&&c===c.toLowerCase()&&(0,i.toTitleCase)(c)||c,0),(0,o.createVNode)(1,"div","TitleBar__dragZone",null,1,{onMousedown:function(e){return s&&p(e)}}),!1,Boolean(s&&d)&&(0,o.createVNode)(1,"div","TitleBar__close TitleBar__clickable",Byond.IS_LTE_IE8?"x":"\xd7",0,{onclick:m})],0)}},2381:function(e,t,n){"use strict";t.__esModule=!0,t.Window=t.Pane=t.NtosWindow=t.Layout=void 0;var o=n(30041);t.Layout=o.Layout;var r=n(76738);t.NtosWindow=r.NtosWindow;var a=n(52243);t.Pane=a.Pane;var i=n(34881);t.Window=i.Window},13952:function(e,t){"use strict";t.__esModule=!0,t.captureExternalLinks=void 0;t.captureExternalLinks=function(){document.addEventListener("click",(function(e){for(var t=e.target;;){if(!t||t===document.body)return;if("a"===String(t.tagName).toLowerCase())break;t=t.parentElement}var n=t.getAttribute("href")||"";if(!("?"===n.charAt(0)||n.startsWith("byond://"))){e.preventDefault();var o=n;o.toLowerCase().startsWith("www")&&(o="https://"+o),Byond.topic({tgui:1,window_id:window.__windowId__,type:"openLink",url:o})}}))}},79926:function(e,t,n){"use strict";t.__esModule=!0,t.logger=t.createLogger=void 0;n(82252);var o=0,r=1,a=2,i=3,c=4,l=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r<n;r++)o[r-2]=arguments[r];if(e>=a){var i=[t].concat(o).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;Byond.topic({tgui:1,window_id:window.__windowId__,type:"log",ns:t,message:i})}},u=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return l.apply(void 0,[o,e].concat(n))},log:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[r,e].concat(n))},info:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[a,e].concat(n))},warn:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[i,e].concat(n))},error:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[c,e].concat(n))}}};t.createLogger=u;var d=u();t.logger=d},77960:function(e,t,n){"use strict";t.__esModule=!0,t.createRenderer=t.suspendRenderer=t.resumeRenderer=void 0;var o,r=n(28440),a=n(96323),i=((0,n(79926).createLogger)("renderer"),!0),c=!1;t.resumeRenderer=function(){i=i||"resumed",c=!1};t.suspendRenderer=function(){c=!0};t.createRenderer=function(e){return function(){r.perf.mark("render/start"),o||(o=document.getElementById("react-root")),(0,a.render)(e(),o),r.perf.mark("render/finish"),c||i&&(i=!1)}}},91199:function(e,t,n){"use strict";t.__esModule=!0,t.getRoutedComponent=void 0;var o=n(96323),r=n(31246),a=(n(12184),n(2381)),i=n(8156),c=function(e,t){return function(){return(0,o.createComponentVNode)(2,a.Window,{children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:["notFound"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" was not found.")],4),"missingExport"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" is missing an export.")],4)]})})}},l=function(){return(0,o.createComponentVNode)(2,a.Window,{children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0})})};t.getRoutedComponent=function(e){var t=e.getState(),n=(0,r.selectBackend)(t),o=n.suspended,a=n.config;if(o)return l;for(var u,d=null==a?void 0:a["interface"],s=[function(e){return"./"+e+".tsx"},function(e){return"./"+e+".js"},function(e){return"./"+e+"/index.tsx"},function(e){return"./"+e+"/index.js"}];!u&&s.length>0;){var p=s.shift()(d);try{u=i(p)}catch(f){if("MODULE_NOT_FOUND"!==f.code)throw f}}if(!u)return c("notFound",d);var m=u[d];return m||c("missingExport",d)}},81890:function(e,t,n){"use strict";t.__esModule=!0,t.sanitizeText=void 0;var o,r=(o=n(42950))&&o.__esModule?o:{"default":o};var a=["b","br","center","code","div","font","hr","i","li","menu","ol","p","pre","span","table","td","th","tr","u","ul"],i=["class","style"];t.sanitizeText=function(e,t,n){return void 0===t&&(t=a),void 0===n&&(n=i),r["default"].sanitize(e,{ALLOWED_TAGS:t,FORBID_ATTR:n})}},18749:function(e,t,n){"use strict";t.__esModule=!0,t.StoreProvider=t.configureStore=void 0;var o=n(32416),r=n(465),a=n(96323),i=n(57723),c=n(31246),l=n(27157);function u(e,t){return u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},u(e,t)}var d=(0,n(79926).createLogger)("store");t.configureStore=function(e){var t,n;void 0===e&&(e={});var a=(0,o.flow)([(0,r.combineReducers)({debug:l.debugReducer,backend:c.backendReducer}),e.reducer]),u=[].concat((null==(t=e.middleware)?void 0:t.pre)||[],[i.assetMiddleware,c.backendMiddleware],(null==(n=e.middleware)?void 0:n.post)||[]);var d=r.applyMiddleware.apply(void 0,u),p=(0,r.createStore)(a,d);return window.__store__=p,window.__augmentStack__=s(p),p};var s=function(e){return function(t,n){var o,r;n?"object"!=typeof n||n.stack||(n.stack=t):(n=new Error(t.split("\n")[0])).stack=t,d.log("FatalError:",n);var a=e.getState(),i=null==a||null==(o=a.backend)?void 0:o.config,c=t;return c+="\nUser Agent: "+navigator.userAgent,c+="\nState: "+JSON.stringify({ckey:null==i||null==(r=i.client)?void 0:r.ckey,"interface":null==i?void 0:i["interface"],window:null==i?void 0:i.window})}},p=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,u(t,n);var r=o.prototype;return r.getChildContext=function(){return{store:this.props.store}},r.render=function(){return this.props.children},o}(a.Component);t.StoreProvider=p},88428:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Blink",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.Blink,{children:"Blink"})})}},9184:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a=n(87758),i={title:"BlockQuote",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.BlockQuote,{children:(0,o.createComponentVNode)(2,a.BoxWithSampleText)})})}},36801:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Box",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{bold:!0,children:"bold"}),(0,o.createComponentVNode)(2,r.Box,{italic:!0,children:"italic"}),(0,o.createComponentVNode)(2,r.Box,{opacity:.5,children:"opacity 0.5"}),(0,o.createComponentVNode)(2,r.Box,{opacity:.25,children:"opacity 0.25"}),(0,o.createComponentVNode)(2,r.Box,{m:2,children:"m: 2"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"left",children:"left"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:"center"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"right",children:"right"})]})}},3750:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Button",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=a;var i=["red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey"],c=["good","average","bad","black","white"],l=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createComponentVNode)(2,r.Button,{content:"Simple"}),(0,o.createComponentVNode)(2,r.Button,{selected:!0,content:"Selected"}),(0,o.createComponentVNode)(2,r.Button,{altSelected:!0,content:"Alt Selected"}),(0,o.createComponentVNode)(2,r.Button,{disabled:!0,content:"Disabled"}),(0,o.createComponentVNode)(2,r.Button,{color:"transparent",content:"Transparent"}),(0,o.createComponentVNode)(2,r.Button,{icon:"cog",content:"Icon"}),(0,o.createComponentVNode)(2,r.Button,{icon:"power-off"}),(0,o.createComponentVNode)(2,r.Button,{fluid:!0,content:"Fluid"}),(0,o.createComponentVNode)(2,r.Button,{my:1,lineHeight:2,minWidth:15,textAlign:"center",content:"With Box props"})]}),(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[c.map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:e,content:e},e)})),(0,o.createVNode)(1,"br"),i.map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:e,content:e},e)})),(0,o.createVNode)(1,"br"),i.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{inline:!0,mx:"7px",color:e,children:e},e)}))]})]})}},68696:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(79926),c={title:"ByondUi",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=c;var l=function(e,t){var n=(0,r.useLocalState)(t,"byondUiEvalCode","Byond.winset('"+window.__windowId__+"', {\n  'is-visible': true,\n})"),c=n[0],l=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Button",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{type:"button",text:"Button"}})}),(0,o.createComponentVNode)(2,a.Section,{title:"Make BYOND calls",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return setImmediate((function(){try{var e=new Function("return ("+c+")")();e&&e.then?(i.logger.log("Promise"),e.then(i.logger.log)):i.logger.log(e)}catch(t){i.logger.log(t)}}))},children:"Evaluate"}),children:(0,o.createComponentVNode)(2,a.Box,{as:"textarea",width:"100%",height:"10em",onChange:function(e){return l(e.target.value)},children:c})})],4)}},88835:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a=n(87758),i={title:"Collapsible",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.Collapsible,{title:"Collapsible Demo",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"cog"}),children:(0,o.createComponentVNode)(2,a.BoxWithSampleText)})})}},34458:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Flex & Sections",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"fs_grow",1),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"fs_direction","column"),u=l[0],d=l[1],s=(0,r.useLocalState)(t,"fs_fill",!0),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"fs_title",!0),h=f[0],g=f[1];return(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return d("column"===u?"row":"column")},children:'Flex direction="'+u+'"'}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return c(Number(!i))},children:"Flex.Item grow={"+i+"}"}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return m(!p)},children:"Section fill={"+String(p)+"}"}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:h,onClick:function(){return g(!h)},children:"Section title"})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:u,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:"row"===u&&1,mb:"column"===u&&1,grow:i,children:(0,o.createComponentVNode)(2,a.Section,{title:h&&"Section 1",fill:p,children:"Content"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:i,children:(0,o.createComponentVNode)(2,a.Section,{title:h&&"Section 2",fill:p,children:"Content"})})]})})]})}},23148:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Input",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"number",0),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"text","Sample text"),u=l[0],d=l[1];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input (onChange)",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input (onInput)",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onInput:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"NumberInput (onChange)",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"40px",step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onChange:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"NumberInput (onDrag)",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"40px",step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Slider (onDrag)",children:(0,o.createComponentVNode)(2,a.Slider,{step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Knob (onDrag)",children:[(0,o.createComponentVNode)(2,a.Knob,{inline:!0,size:1,step:1,stepPixelSize:2,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}}),(0,o.createComponentVNode)(2,a.Knob,{ml:1,inline:!0,bipolar:!0,size:1,step:1,stepPixelSize:2,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Rotating Icon",children:(0,o.createComponentVNode)(2,a.Box,{inline:!0,position:"relative",children:(0,o.createComponentVNode)(2,a.DraggableControl,{value:i,minValue:-100,maxValue:100,dragMatrix:[0,-1],step:1,stepPixelSize:5,onDrag:function(e,t){return c(t)},children:function(e){return(0,o.createComponentVNode)(2,a.Box,{onMouseDown:e.handleDragStart,children:[(0,o.createComponentVNode)(2,a.Icon,{size:4,color:"yellow",name:"times",rotation:4*e.displayValue}),e.inputElement]})}})})})]})})}},23613:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Popper",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(){return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Popper,{popperContent:(0,o.createComponentVNode)(2,r.Box,{style:{background:"white",border:"2px solid blue"},children:"Loogatme!"}),options:{placement:"bottom"},children:(0,o.createComponentVNode)(2,r.Box,{style:{border:"5px solid white",height:"300px",width:"200px"}})}),(0,o.createComponentVNode)(2,r.Popper,{popperContent:(0,o.createComponentVNode)(2,r.Box,{style:{background:"white",border:"2px solid blue"},children:"I am on the right!"}),options:{placement:"right"},children:(0,o.createComponentVNode)(2,r.Box,{style:{border:"5px solid white",height:"500px",width:"100px"}})})],4)}},9093:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"ProgressBar",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"progress",.5),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"color",""),u=l[0],d=l[1],s=u?{color:u}:{ranges:{good:[.5,Infinity],bad:[-Infinity,.1],average:[0,.5]}};return(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.ProgressBar,Object.assign({},s,{minValue:-1,maxValue:1,value:i,children:["Value: ",Number(i).toFixed(1)]}))),(0,o.createComponentVNode)(2,a.Box,{mt:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{mt:"2em",children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Adjust value",children:[(0,o.createComponentVNode)(2,a.Button,{content:"-0.1",onClick:function(){return c(i-.1)}}),(0,o.createComponentVNode)(2,a.Button,{content:"+0.1",onClick:function(){return c(i+.1)}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Override color",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t)}})})]})})]})}},86482:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Stack",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=a;var i=function(){return(0,o.createComponentVNode)(2,r.Box,{inline:!0,width:1,height:1,children:"A"})},c=function(){return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,i)}),(0,o.createComponentVNode)(2,r.Stack.Divider),(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,i)})],4)},l=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,className:"debug-layout",children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,zebra:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1}),(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,c)]})}),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1}),(0,o.createComponentVNode)(2,c)]})})]})})}},63900:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(7151),a=n(26949),i=n(1033),c={title:"Storage",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=c;var l=function(e,t){return window.localStorage?(0,o.createComponentVNode)(2,a.Section,{title:"Local Storage",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"recycle",onClick:function(){localStorage.clear(),r.storage.clear()},children:"Clear"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Keys in use",children:localStorage.length}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Remaining space",children:(0,i.formatSiUnit)(localStorage.remainingSpace,0,"B")})]})}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"Local storage is not available."})}},88209:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Tabs",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=i;var c=["Tab #1","Tab #2","Tab #3","Tab #4"],l=function(e,t){var n=(0,r.useLocalState)(t,"tabProps",{}),i=n[0],c=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"vertical",checked:i.vertical,onClick:function(){return c(Object.assign({},i,{vertical:!i.vertical}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"leftSlot",checked:i.leftSlot,onClick:function(){return c(Object.assign({},i,{leftSlot:!i.leftSlot}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"rightSlot",checked:i.rightSlot,onClick:function(){return c(Object.assign({},i,{rightSlot:!i.rightSlot}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"icon",checked:i.icon,onClick:function(){return c(Object.assign({},i,{icon:!i.icon}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"fluid",checked:i.fluid,onClick:function(){return c(Object.assign({},i,{fluid:!i.fluid}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"centered",checked:i.centered,onClick:function(){return c(Object.assign({},i,{centered:!i.centered}))}})]}),(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,u)}),(0,o.createComponentVNode)(2,a.Section,{title:"Normal section",children:[(0,o.createComponentVNode)(2,u),"Some text"]}),(0,o.createComponentVNode)(2,a.Section,{children:"Section-less tabs appear the same as tabs in a fitted section:"}),(0,o.createComponentVNode)(2,u)],4)},u=function(e,t){var n=(0,r.useLocalState)(t,"tabIndex",0),i=n[0],l=n[1],u=(0,r.useLocalState)(t,"tabProps",{})[0];return(0,o.createComponentVNode)(2,a.Tabs,{vertical:u.vertical,fluid:u.fluid,textAlign:u.centered&&"center",children:c.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:t===i,icon:u.icon&&"info-circle",leftSlot:u.leftSlot&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times"}),rightSlot:u.rightSlot&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times"}),onClick:function(){return l(t)},children:e},t)}))})}},38200:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Themes",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"kitchenSinkTheme"),i=n[0],c=n[1];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Use theme",children:(0,o.createComponentVNode)(2,a.Input,{placeholder:"theme_name",value:i,onInput:function(e,t){return c(t)}})})})})}},48181:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Tooltip",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{children:[(0,o.createComponentVNode)(2,r.Tooltip,{content:"Tooltip text.",children:(0,o.createComponentVNode)(2,r.Box,{inline:!0,position:"relative",mr:1,children:"Box (hover me)."})}),(0,o.createComponentVNode)(2,r.Button,{tooltip:"Tooltip text.",content:"Button"})]}),(0,o.createComponentVNode)(2,r.Box,{mt:1,children:["top","left","right","bottom","bottom-start","bottom-end"].map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:"transparent",tooltip:"Tooltip text.",tooltipPosition:e,content:e},e)}))})]})}},87758:function(e,t,n){"use strict";t.__esModule=!0,t.BoxWithSampleText=void 0;var o=n(96323),r=n(26949);t.BoxWithSampleText=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Box,Object.assign({},e,{children:[(0,o.createComponentVNode)(2,r.Box,{italic:!0,children:"Jackdaws love my big sphinx of quartz."}),(0,o.createComponentVNode)(2,r.Box,{mt:1,bold:!0,children:"The wide electrification of the southern provinces will give a powerful impetus to the growth of agriculture."})]})))}},33603:function(){},28553:function(){},68885:function(){},19210:function(){},44951:function(){},22031:function(){},44576:function(){},21805:function(){},50222:function(){},74199:function(){},8156:function(e,t,n){var o={"./AIRack":36525,"./AIRack.js":36525,"./AbilityManager":50687,"./AbilityManager.js":50687,"./AirAlarm":24782,"./AirAlarm.js":24782,"./AirVendor":89375,"./AirVendor.tsx":89375,"./Airlock":22704,"./Airlock.js":22704,"./AlertContentWindows":78403,"./AlertContentWindows/":78403,"./AlertContentWindows/index":78403,"./AlertContentWindows/index.ts":78403,"./AlertContentWindows/tgControls":43469,"./AlertContentWindows/tgControls.tsx":43469,"./AlertContentWindows/types":89037,"./AlertContentWindows/types.ts":89037,"./AlertModal":458,"./AlertModal.tsx":458,"./AntagonistPanel":20636,"./AntagonistPanel/":20636,"./AntagonistPanel/AntagonistTypeTabBody":20920,"./AntagonistPanel/AntagonistTypeTabBody.tsx":20920,"./AntagonistPanel/AntagonistTypeTabs":56444,"./AntagonistPanel/AntagonistTypeTabs.tsx":56444,"./AntagonistPanel/index":20636,"./AntagonistPanel/index.tsx":20636,"./AntagonistPanel/type":5562,"./AntagonistPanel/type.ts":5562,"./Apc":91690,"./Apc/":91690,"./Apc/AccessPanelSection":20065,"./Apc/AccessPanelSection.tsx":20065,"./Apc/CellDisplay":65005,"./Apc/CellDisplay.tsx":65005,"./Apc/MainSection":54187,"./Apc/MainSection.tsx":54187,"./Apc/PowerChannelSection":42947,"./Apc/PowerChannelSection.tsx":42947,"./Apc/WireList":63687,"./Apc/WireList.tsx":63687,"./Apc/index":91690,"./Apc/index.tsx":91690,"./Apc/types":73020,"./Apc/types.ts":73020,"./Apc/util":94104,"./Apc/util.ts":94104,"./ArtifactPaper":52403,"./ArtifactPaper.js":52403,"./Atm":7171,"./Atm/":7171,"./Atm/index":7171,"./Atm/index.tsx":7171,"./Atm/types":3382,"./Atm/types.ts":3382,"./AutoInjector":46837,"./AutoInjector.js":46837,"./BarberingMenu":36443,"./BarberingMenu.js":36443,"./BarcodeComputer":8844,"./BarcodeComputer.js":8844,"./BioEffectManager":45027,"./BioEffectManager.js":45027,"./Boardgame":10522,"./Boardgame/":10522,"./Boardgame/Components":29678,"./Boardgame/Components/":29678,"./Boardgame/Components/board":66508,"./Boardgame/Components/board/":66508,"./Boardgame/Components/board/common/GridGuideRenderer":34116,"./Boardgame/Components/board/common/GridGuideRenderer.tsx":34116,"./Boardgame/Components/board/common/GridPieceRenderer":9149,"./Boardgame/Components/board/common/GridPieceRenderer.tsx":9149,"./Boardgame/Components/board/helpers":83702,"./Boardgame/Components/board/helpers.ts":83702,"./Boardgame/Components/board/index":66508,"./Boardgame/Components/board/index.tsx":66508,"./Boardgame/Components/board/styles/checkerboard":45208,"./Boardgame/Components/board/styles/checkerboard/":45208,"./Boardgame/Components/board/styles/checkerboard/CheckerBoardPattern":84894,"./Boardgame/Components/board/styles/checkerboard/CheckerBoardPattern.tsx":84894,"./Boardgame/Components/board/styles/checkerboard/index":45208,"./Boardgame/Components/board/styles/checkerboard/index.tsx":45208,"./Boardgame/Components/board/styles/types":51891,"./Boardgame/Components/board/styles/types.ts":51891,"./Boardgame/Components/common/BoardgameContents":25540,"./Boardgame/Components/common/BoardgameContents.tsx":25540,"./Boardgame/Components/common/ButtonConfirm":75022,"./Boardgame/Components/common/ButtonConfirm.tsx":75022,"./Boardgame/Components/common/HeldPieceRenderer":68035,"./Boardgame/Components/common/HeldPieceRenderer.tsx":68035,"./Boardgame/Components/common/Notations":41541,"./Boardgame/Components/common/Notations.tsx":41541,"./Boardgame/Components/common/Palettes":75750,"./Boardgame/Components/common/Palettes.tsx":75750,"./Boardgame/Components/common/TitleBar":15237,"./Boardgame/Components/common/TitleBar.tsx":15237,"./Boardgame/Components/index":29678,"./Boardgame/Components/index.tsx":29678,"./Boardgame/games":86489,"./Boardgame/games/":86489,"./Boardgame/games/chess":95102,"./Boardgame/games/chess/":95102,"./Boardgame/games/chess/index":95102,"./Boardgame/games/chess/index.tsx":95102,"./Boardgame/games/chess/pieces":86364,"./Boardgame/games/chess/pieces.tsx":86364,"./Boardgame/games/draughts":85867,"./Boardgame/games/draughts/":85867,"./Boardgame/games/draughts/index":85867,"./Boardgame/games/draughts/index.tsx":85867,"./Boardgame/games/draughts/pieces":77896,"./Boardgame/games/draughts/pieces.tsx":77896,"./Boardgame/games/index":86489,"./Boardgame/games/index.ts":86489,"./Boardgame/games/kits":8250,"./Boardgame/games/kits.ts":8250,"./Boardgame/index":10522,"./Boardgame/index.tsx":10522,"./Boardgame/utils":65844,"./Boardgame/utils/":65844,"./Boardgame/utils/index":65844,"./Boardgame/utils/index.ts":65844,"./Boardgame/utils/notations":43785,"./Boardgame/utils/notations.ts":43785,"./Boardgame/utils/types":76434,"./Boardgame/utils/types.ts":76434,"./Boardgame/utils/useActions":51887,"./Boardgame/utils/useActions.ts":51887,"./Boardgame/utils/useStates":31463,"./Boardgame/utils/useStates.ts":31463,"./Boardgame/utils/window":44135,"./Boardgame/utils/window.ts":44135,"./BugReportForm":15094,"./BugReportForm.js":15094,"./CAViewer":65101,"./CAViewer.js":65101,"./Cashreg":57399,"./Cashreg.tsx":57399,"./CentComViewer":48341,"./CentComViewer.js":48341,"./CharacterPreferences":4098,"./CharacterPreferences/":4098,"./CharacterPreferences/CharacterTab":96074,"./CharacterPreferences/CharacterTab.tsx":96074,"./CharacterPreferences/GameSettingsTab":56374,"./CharacterPreferences/GameSettingsTab.tsx":56374,"./CharacterPreferences/GeneralTab":57368,"./CharacterPreferences/GeneralTab.tsx":57368,"./CharacterPreferences/SavesTab":70712,"./CharacterPreferences/SavesTab.tsx":70712,"./CharacterPreferences/TraitsTab":30709,"./CharacterPreferences/TraitsTab.tsx":30709,"./CharacterPreferences/index":4098,"./CharacterPreferences/index.tsx":4098,"./CharacterPreferences/type":59576,"./CharacterPreferences/type.ts":59576,"./ChemChute":78979,"./ChemChute/":78979,"./ChemChute/index":78979,"./ChemChute/index.tsx":78979,"./ChemChute/type":28487,"./ChemChute/type.ts":28487,"./ChemDispenser":56915,"./ChemDispenser.tsx":56915,"./ChemHeater":95348,"./ChemHeater.js":95348,"./ChemMaster":45747,"./ChemMaster.js":45747,"./ChemRequestReceiver":48230,"./ChemRequestReceiver.js":48230,"./ChemRequester":20938,"./ChemRequester.js":20938,"./CloningConsole":6542,"./CloningConsole.js":6542,"./ClothingBooth":78826,"./ClothingBooth/":78826,"./ClothingBooth/index":78826,"./ClothingBooth/index.tsx":78826,"./ClothingBooth/type":41717,"./ClothingBooth/type.ts":41717,"./ColorMatrixEditor":70855,"./ColorMatrixEditor.tsx":70855,"./ColorPickerModal":21018,"./ColorPickerModal.tsx":21018,"./ComUplink":22049,"./ComUplink/":22049,"./ComUplink/index":22049,"./ComUplink/index.tsx":22049,"./ComUplink/type":20254,"./ComUplink/type.ts":20254,"./ContributorRewards":65208,"./ContributorRewards.js":65208,"./CrewCredits":57119,"./CrewCredits/":57119,"./CrewCredits/AntagonistsTab":19812,"./CrewCredits/AntagonistsTab.tsx":19812,"./CrewCredits/CrewTab":99407,"./CrewCredits/CrewTab.tsx":99407,"./CrewCredits/ScoreTab":21187,"./CrewCredits/ScoreTab.tsx":21187,"./CrewCredits/index":57119,"./CrewCredits/index.tsx":57119,"./CrewCredits/type":37538,"./CrewCredits/type.ts":37538,"./CryoCell":75859,"./CryoCell.js":75859,"./CyborgDockingStation":56445,"./CyborgDockingStation/":56445,"./CyborgDockingStation/index":56445,"./CyborgDockingStation/index.tsx":56445,"./CyborgDockingStation/type":89974,"./CyborgDockingStation/type.ts":89974,"./CyborgModuleRewriter":85175,"./CyborgModuleRewriter/":85175,"./CyborgModuleRewriter/EmptyPlaceholder":44616,"./CyborgModuleRewriter/EmptyPlaceholder.tsx":44616,"./CyborgModuleRewriter/ModuleView":25526,"./CyborgModuleRewriter/ModuleView/":25526,"./CyborgModuleRewriter/ModuleView/ModuleDetail":94241,"./CyborgModuleRewriter/ModuleView/ModuleDetail.tsx":94241,"./CyborgModuleRewriter/ModuleView/Tools":5880,"./CyborgModuleRewriter/ModuleView/Tools.tsx":5880,"./CyborgModuleRewriter/ModuleView/index":25526,"./CyborgModuleRewriter/ModuleView/index.tsx":25526,"./CyborgModuleRewriter/action":83709,"./CyborgModuleRewriter/action.ts":83709,"./CyborgModuleRewriter/index":85175,"./CyborgModuleRewriter/index.tsx":85175,"./CyborgModuleRewriter/style":67044,"./CyborgModuleRewriter/style.ts":67044,"./CyborgModuleRewriter/type":95502,"./CyborgModuleRewriter/type.ts":95502,"./DJPanel":9299,"./DJPanel.js":9299,"./DisposalChute":64640,"./DisposalChute/":64640,"./DisposalChute/index":64640,"./DisposalChute/index.tsx":64640,"./DisposalChute/type":9389,"./DisposalChute/type.ts":9389,"./DoorTimer":84430,"./DoorTimer/":84430,"./DoorTimer/index":84430,"./DoorTimer/index.tsx":84430,"./DoorTimer/type":9494,"./DoorTimer/type.ts":9494,"./DyeDispenser":29259,"./DyeDispenser.tsx":29259,"./Elevator":87339,"./Elevator.tsx":87339,"./EngineStats":20316,"./EngineStats.js":20316,"./EspressoMachine":65203,"./EspressoMachine.js":65203,"./Filteriffic":53600,"./Filteriffic.js":53600,"./Flamethrower":21980,"./Flamethrower.js":21980,"./FlockPanel":72758,"./FlockPanel.js":72758,"./FlockStructures":57576,"./FlockStructures.js":57576,"./Freezer":11653,"./Freezer.tsx":11653,"./Gameclock":6482,"./Gameclock/":6482,"./Gameclock/index":6482,"./Gameclock/index.tsx":6482,"./Gameclock/types":69658,"./Gameclock/types.tsx":69658,"./GasCanister":52709,"./GasCanister/":52709,"./GasCanister/Detonator":16484,"./GasCanister/Detonator.js":16484,"./GasCanister/DetonatorTimer":41834,"./GasCanister/DetonatorTimer.js":41834,"./GasCanister/index":52709,"./GasCanister/index.js":52709,"./GasTank":5394,"./GasTank.js":5394,"./GeneTek":92526,"./GeneTek.js":92526,"./GeneTek/":33012,"./GeneTek/AppearanceEditor":92195,"./GeneTek/AppearanceEditor.js":92195,"./GeneTek/BioEffect":11265,"./GeneTek/BioEffect.js":11265,"./GeneTek/DNASequence":59450,"./GeneTek/DNASequence.js":59450,"./GeneTek/GeneIcon":43024,"./GeneTek/GeneIcon.js":43024,"./GeneTek/index":33012,"./GeneTek/index.js":33012,"./GeneTek/modals/BuyMaterialsModal":78368,"./GeneTek/modals/BuyMaterialsModal.js":78368,"./GeneTek/modals/CombineGenesModal":39961,"./GeneTek/modals/CombineGenesModal.js":39961,"./GeneTek/modals/UnlockModal":89613,"./GeneTek/modals/UnlockModal.js":89613,"./GeneTek/tabs/MutationsTab":22675,"./GeneTek/tabs/MutationsTab.js":22675,"./GeneTek/tabs/ResearchTab":93847,"./GeneTek/tabs/ResearchTab.js":93847,"./GeneTek/tabs/ScannerTab":49445,"./GeneTek/tabs/ScannerTab.js":49445,"./GeneTek/tabs/StorageTab":64477,"./GeneTek/tabs/StorageTab.js":64477,"./GimmickObject":12302,"./GimmickObject.js":12302,"./GlassRecycler":96608,"./GlassRecycler.js":96608,"./HumanInventory":21381,"./HumanInventory/":21381,"./HumanInventory/index":21381,"./HumanInventory/index.tsx":21381,"./HumanInventory/types":59818,"./HumanInventory/types.ts":59818,"./Hypospray":92354,"./Hypospray.js":92354,"./IDComputer":26513,"./IDComputer.js":26513,"./Laundry":23255,"./Laundry.js":23255,"./ListInputModal":84696,"./ListInputModal.tsx":84696,"./LocalGenerator":56596,"./LocalGenerator/":56596,"./LocalGenerator/index":56596,"./LocalGenerator/index.tsx":56596,"./LocalGenerator/type":83329,"./LocalGenerator/type.ts":83329,"./LongRangeTeleporter":56403,"./LongRangeTeleporter.js":56403,"./MechanicalDropper":46045,"./MechanicalDropper.js":46045,"./MineralMagnet":17526,"./MineralMagnet.js":17526,"./Minimap":2960,"./Minimap.js":2960,"./MinimapController":3082,"./MinimapController.js":3082,"./MixingDesk":5244,"./MixingDesk.js":5244,"./MusicInstrument":71417,"./MusicInstrument.tsx":71417,"./NuclearReactor":14086,"./NuclearReactor.js":14086,"./NumberInputModal":12660,"./NumberInputModal.tsx":12660,"./ObserverMenu":55223,"./ObserverMenu.tsx":55223,"./OperatingComputer":35851,"./OperatingComputer/":35851,"./OperatingComputer/index":35851,"./OperatingComputer/index.tsx":35851,"./OperatingComputer/type":36273,"./OperatingComputer/type.ts":36273,"./PaperSheet":69412,"./PaperSheet.js":69412,"./Particool":21293,"./Particool.js":21293,"./Phone":85344,"./Phone/":85344,"./Phone/index":85344,"./Phone/index.tsx":85344,"./Phone/type":85990,"./Phone/type.ts":85990,"./PipeDispenser":41245,"./PipeDispenser.js":41245,"./PixelOffset":38837,"./PixelOffset.js":38837,"./Plantmaster":51884,"./Plantmaster.js":51884,"./PlayerPanel":78927,"./PlayerPanel/":78927,"./PlayerPanel/Header":53302,"./PlayerPanel/Header.tsx":53302,"./PlayerPanel/constant":22706,"./PlayerPanel/constant.ts":22706,"./PlayerPanel/index":78927,"./PlayerPanel/index.tsx":78927,"./PlayerPanel/type":43771,"./PlayerPanel/type.ts":43771,"./PortablePump":13484,"./PortablePump.js":13484,"./PortableScrubber":54652,"./PortableScrubber.js":54652,"./PowerDebug":15264,"./PowerDebug.js":15264,"./PowerMonitor":84699,"./PowerMonitor/":84699,"./PowerMonitor/Apc":4914,"./PowerMonitor/Apc.tsx":4914,"./PowerMonitor/Smes":8954,"./PowerMonitor/Smes.tsx":8954,"./PowerMonitor/index":84699,"./PowerMonitor/index.tsx":84699,"./PowerMonitor/type":2441,"./PowerMonitor/type.ts":2441,"./PowerTransmissionLaser":36476,"./PowerTransmissionLaser.js":36476,"./Precipitation":61221,"./Precipitation.js":61221,"./Pressurizer":90227,"./Pressurizer.js":90227,"./ProcCall":62376,"./ProcCall.js":62376,"./Radio":42626,"./Radio/":42626,"./Radio/index":42626,"./Radio/index.tsx":42626,"./Radio/type":39582,"./Radio/type.ts":39582,"./RandomEvent":16710,"./RandomEvent.js":16710,"./ReagentExtractor":63777,"./ReagentExtractor.js":63777,"./Rockbox":89971,"./Rockbox.js":89971,"./SecureSafe":95285,"./SecureSafe.js":95285,"./SeedFabricator":19172,"./SeedFabricator.js":19172,"./SheetCrafting":70535,"./SheetCrafting.js":70535,"./Sleeper":24258,"./Sleeper.js":24258,"./SlotMachine":82930,"./SlotMachine.js":82930,"./Smes":68952,"./Smes.js":68952,"./SpawnEvent":54016,"./SpawnEvent.js":54016,"./SpendSpacebux":19378,"./SpendSpacebux.js":19378,"./SwingSign":79387,"./SwingSign.js":79387,"./SwingSignTIM":44001,"./SwingSignTIM.tsx":44001,"./TEG":13634,"./TEG.js":13634,"./TankDispenser":99714,"./TankDispenser.js":99714,"./TeleConsole":79268,"./TeleConsole/":79268,"./TeleConsole/BookmarksSection":87221,"./TeleConsole/BookmarksSection.tsx":87221,"./TeleConsole/ConnectionSection":75461,"./TeleConsole/ConnectionSection.tsx":75461,"./TeleConsole/CoordinatesSection":12703,"./TeleConsole/CoordinatesSection.tsx":12703,"./TeleConsole/SteppedSlider":34545,"./TeleConsole/SteppedSlider.tsx":34545,"./TeleConsole/index":79268,"./TeleConsole/index.tsx":79268,"./TeleConsole/types":65087,"./TeleConsole/types.ts":65087,"./TeleConsole/util":581,"./TeleConsole/util.ts":581,"./Terminal":14831,"./Terminal/":14831,"./Terminal/InputAndButtonsSection":73354,"./Terminal/InputAndButtonsSection.tsx":73354,"./Terminal/PheripheralsSection":58084,"./Terminal/PheripheralsSection.tsx":58084,"./Terminal/TerminalOutputSection":98341,"./Terminal/TerminalOutputSection.tsx":98341,"./Terminal/index":14831,"./Terminal/index.tsx":14831,"./Terminal/types":55230,"./Terminal/types.ts":55230,"./Terrainify":14081,"./Terrainify.js":14081,"./TextInputModal":81235,"./TextInputModal.tsx":81235,"./Timer":80480,"./Timer.js":80480,"./TransitShuttle":5051,"./TransitShuttle.js":5051,"./TrscArray":73128,"./TrscArray.js":73128,"./TurbineControl":73248,"./TurbineControl.js":73248,"./TurretControl":40620,"./TurretControl.js":40620,"./Vendors":97170,"./Vendors.js":97170,"./WeaponVendor":96880,"./WeaponVendor/":96880,"./WeaponVendor/index":96880,"./WeaponVendor/index.tsx":96880,"./WeaponVendor/type":10661,"./WeaponVendor/type.ts":10661,"./common/BeakerContents":57361,"./common/BeakerContents.js":57361,"./common/DataInput":48916,"./common/DataInput.js":48916,"./common/HealthStat":65751,"./common/HealthStat.js":65751,"./common/IDCard":8095,"./common/IDCard.js":8095,"./common/InputButtons":34277,"./common/InputButtons.tsx":34277,"./common/KeyHealthIndicators":9720,"./common/KeyHealthIndicators/":9720,"./common/KeyHealthIndicators/index":9720,"./common/KeyHealthIndicators/index.tsx":9720,"./common/KeyHealthIndicators/type":68397,"./common/KeyHealthIndicators/type.ts":68397,"./common/ListSearch":36814,"./common/ListSearch.tsx":36814,"./common/Loader":55631,"./common/Loader.tsx":55631,"./common/MobStatus":90881,"./common/MobStatus.js":90881,"./common/PortableAtmos":41161,"./common/PortableAtmos.js":41161,"./common/ReagentInfo":51418,"./common/ReagentInfo.tsx":51418,"./common/ReleaseValve":75015,"./common/ReleaseValve.js":75015,"./common/VendorCashTable":72638,"./common/VendorCashTable.tsx":72638,"./common/graphUtils":818,"./common/graphUtils.js":818,"./common/mathUtils":96794,"./common/mathUtils.ts":96794,"./common/stringUtils":18331,"./common/stringUtils.ts":18331,"./common/temperatureUtils":48175,"./common/temperatureUtils.js":48175};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=a,e.exports=r,r.id=8156},69321:function(e,t,n){var o={"./Blink.stories.js":88428,"./BlockQuote.stories.js":9184,"./Box.stories.js":36801,"./Button.stories.js":3750,"./ByondUi.stories.js":68696,"./Collapsible.stories.js":88835,"./Flex.stories.js":34458,"./Input.stories.js":23148,"./Popper.stories.js":23613,"./ProgressBar.stories.js":9093,"./Stack.stories.js":86482,"./Storage.stories.js":63900,"./Tabs.stories.js":88209,"./Themes.stories.js":38200,"./Tooltip.stories.js":48181};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=a,e.exports=r,r.id=69321},82252:function(e){"use strict";var t=[];e.exports={subscribe:function(e){return t.push(e)},sendMessage:function(e){},sendLogEntry:function(e,t){},setupHotReloading:function(){0}}}},t={};function n(o){var r=t[o];if(r!==undefined)return r.exports;var a=t[o]={exports:{}};return e[o](a,a.exports,n),a.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){"use strict";n(65379),n(43674),n(69656),n(72411),n(24467),n(37493),n(87420),n(9480),n(66171),n(53276),n(71852),n(59045),n(70887),n(72906),n(24835),n(14653),n(58139),n(34049),n(38356),n(72494),n(31699),n(3263),n(81520),n(80036),n(60515),n(94330),n(96553),n(99139),n(98215),n(32617),n(80186),n(31149),n(71827),n(79770),n(32099),n(72667),n(94920),n(64683),n(26189),n(41185),n(51008),n(47112),n(86e3),n(15196),n(95993),n(25079),n(87143),n(72499),n(73676),n(76746),n(19),n(17038),n(46360),n(16835),n(96683),n(7756),n(21842),n(1613),n(65115),n(27115),n(13280),n(21019),n(66619),n(75469),n(90967),n(35022),n(22604),n(41843),n(86810),n(54670),n(16580),n(31304),n(13078),n(45128),n(31938),n(90958),n(88885),n(45017),n(59743),n(47560),n(31569),n(6134),n(12622),n(60852),n(99085),n(75180),n(79437),n(75370),n(61022),n(50580),n(5301),n(76438),n(97307),n(34016),n(86944),n(60687),n(86957),n(59163),n(34128),n(24267),n(39816),n(4239),n(8381),n(63669),n(25779),n(84580),n(33198),n(71895),n(44910),n(95962),n(73769),n(14962),n(80345),n(18438),n(70552),n(46356),n(57128),n(83588),n(47057),n(67092),n(59478),n(69203),n(27879),n(71507),n(39021),n(8641),n(83064),n(93115),n(33362),n(45090),n(12654),n(58870),n(76581),n(4567),n(28638),n(60314),n(71595),n(98954),n(91332),n(79445),n(36493),n(24476),n(78192),n(58660),n(56592),n(69957),n(9747),n(13578),n(3684),n(19209),n(56737),n(67586),n(7743),n(15890),n(34651),n(18037),n(48415),n(54950),n(76102),n(47816),n(30037),n(54705),n(75831),n(96958),n(75344),n(87853),n(25865),n(1150),n(50444),n(11220),n(6636),n(37650),n(12424),n(64346),n(27553),n(49007),n(17621),n(71078),n(20500),n(85923),n(38956),n(49264),n(70448),n(5775),n(45164),n(83762),n(67265),n(56058),n(87001),n(23535),n(18617),n(70595),n(76820),n(33357),n(38215),n(37281),n(99584),n(43582),n(15378),n(31213),n(19275),n(59),n(43849),n(69838),n(25513),n(72090),n(15511),n(88280),n(37283),n(96250)}(),function(){"use strict";var e=n(96323);n(33603),n(22031),n(44951),n(44576),n(21805),n(50222),n(74199),n(19210),n(28553),n(68885);var t,o,r=n(28440),a=(n(82252),n(6965)),i=n(13952),c=n(77960),l=n(18749),u=n(99397);r.perf.mark("inception",null==(t=window.performance)||null==(o=t.timing)?void 0:o.navigationStart),r.perf.mark("init");var d=(0,l.configureStore)(),s=(0,c.createRenderer)((function(){var t=(0,n(91199).getRoutedComponent)(d);return(0,e.createComponentVNode)(2,l.StoreProvider,{store:d,children:(0,e.createComponentVNode)(2,t)})}));!function p(){if("loading"!==document.readyState){for((0,u.setupGlobalEvents)(),(0,a.setupHotKeys)(),(0,i.captureExternalLinks)(),d.subscribe(s),window.update=function(e){return d.dispatch(Byond.parseJson(e))};;){var e=window.__updateQueue__.shift();if(!e)break;window.update(e)}0}else document.addEventListener("DOMContentLoaded",p)}()}()}();
\ No newline at end of file
+!function(){var e={92179:function(e,t,n){"use strict";t.__esModule=!0,t.popperGenerator=h,t.createPopper=void 0;var o=p(n(30505)),r=p(n(43545)),a=p(n(46213)),i=p(n(32440)),c=(p(n(61131)),p(n(45700))),l=p(n(68369)),u=(p(n(38574)),p(n(25435)),p(n(22709)),p(n(36284))),d=p(n(19574));t.detectOverflow=d["default"];var s=n(67458);n(56728);function p(e){return e&&e.__esModule?e:{"default":e}}var m={placement:"bottom",modifiers:[],strategy:"absolute"};function f(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function h(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,d=void 0===n?[]:n,p=t.defaultOptions,h=void 0===p?m:p;return function(e,t,n){void 0===n&&(n=h);var p={placement:"bottom",orderedModifiers:[],options:Object.assign({},m,h),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},C=[],g=!1,N={state:p,setOptions:function(n){v(),p.options=Object.assign({},h,p.options,n),p.scrollParents={reference:(0,s.isElement)(e)?(0,a["default"])(e):e.contextElement?(0,a["default"])(e.contextElement):[],popper:(0,a["default"])(t)};var o=(0,c["default"])((0,u["default"])([].concat(d,p.options.modifiers)));return p.orderedModifiers=o.filter((function(e){return e.enabled})),p.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,o=void 0===n?{}:n,r=e.effect;if("function"==typeof r){var a=r({state:p,name:t,instance:N,options:o}),i=function(){function e(){}return e}();C.push(a||i)}})),N.update()},forceUpdate:function(){if(!g){var e=p.elements,t=e.reference,n=e.popper;if(f(t,n)){p.rects={reference:(0,o["default"])(t,(0,i["default"])(n),"fixed"===p.options.strategy),popper:(0,r["default"])(n)},p.reset=!1,p.placement=p.options.placement,p.orderedModifiers.forEach((function(e){return p.modifiersData[e.name]=Object.assign({},e.data)}));for(var a=0;a<p.orderedModifiers.length;a++)if(!0!==p.reset){var c=p.orderedModifiers[a],l=c.fn,u=c.options,d=void 0===u?{}:u,s=c.name;"function"==typeof l&&(p=l({state:p,options:d,name:s,instance:N})||p)}else p.reset=!1,a=-1}}},update:(0,l["default"])((function(){return new Promise((function(e){N.forceUpdate(),e(p)}))})),destroy:function(){v(),g=!0}};if(!f(e,t))return N;function v(){C.forEach((function(e){return e()})),C=[]}return N.setOptions(n).then((function(e){!g&&n.onFirstUpdate&&n.onFirstUpdate(e)})),N}}var C=h();t.createPopper=C},97607:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&(0,o.isShadowRoot)(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1};var o=n(67458)},94294:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),a=1,i=1;(0,o.isHTMLElement)(e)&&t&&(a=n.width/e.offsetWidth||1,i=n.height/e.offsetHeight||1);return{width:r(n.width/a),height:r(n.height/i),top:r(n.top/i),right:r(n.right/a),bottom:r(n.bottom/i),left:r(n.left/a),x:r(n.left/a),y:r(n.top/i)}};var o=n(67458),r=Math.round},48162:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){var o="clippingParents"===t?function(e){var t=(0,i["default"])((0,p["default"])(e)),n=["absolute","fixed"].indexOf((0,u["default"])(e).position)>=0,o=n&&(0,d.isHTMLElement)(e)?(0,c["default"])(e):e;if(!(0,d.isElement)(o))return[];return t.filter((function(e){return(0,d.isElement)(e)&&(0,m["default"])(e,o)&&"body"!==(0,f["default"])(e)}))}(e):[].concat(t),r=[].concat(o,[n]),a=r[0],l=r.reduce((function(t,n){var o=N(e,n);return t.top=(0,C.max)(o.top,t.top),t.right=(0,C.min)(o.right,t.right),t.bottom=(0,C.min)(o.bottom,t.bottom),t.left=(0,C.max)(o.left,t.left),t}),N(e,a));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l};var o=n(56728),r=g(n(78331)),a=g(n(68692)),i=g(n(46213)),c=g(n(32440)),l=g(n(58386)),u=g(n(61131)),d=n(67458),s=g(n(94294)),p=g(n(31613)),m=g(n(97607)),f=g(n(99624)),h=g(n(20935)),C=n(62836);function g(e){return e&&e.__esModule?e:{"default":e}}function N(e,t){return t===o.viewport?(0,h["default"])((0,r["default"])(e)):(0,d.isHTMLElement)(t)?function(e){var t=(0,s["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,h["default"])((0,a["default"])((0,l["default"])(e)))}},30505:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var d=(0,i.isHTMLElement)(t),s=(0,i.isHTMLElement)(t)&&function(e){var t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,o=t.height/e.offsetHeight||1;return 1!==n||1!==o}(t),p=(0,l["default"])(t),m=(0,o["default"])(e,s),f={scrollLeft:0,scrollTop:0},h={x:0,y:0};(d||!d&&!n)&&(("body"!==(0,a["default"])(t)||(0,u["default"])(p))&&(f=(0,r["default"])(t)),(0,i.isHTMLElement)(t)?((h=(0,o["default"])(t,!0)).x+=t.clientLeft,h.y+=t.clientTop):p&&(h.x=(0,c["default"])(p)));return{x:m.left+f.scrollLeft-h.x,y:m.top+f.scrollTop-h.y,width:m.width,height:m.height}};var o=d(n(94294)),r=d(n(71942)),a=d(n(99624)),i=n(67458),c=d(n(45471)),l=d(n(58386)),u=d(n(37229));function d(e){return e&&e.__esModule?e:{"default":e}}},61131:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])(e).getComputedStyle(e)};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},58386:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,o.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var o=n(67458)},68692:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,o["default"])(e),l=(0,i["default"])(e),u=null==(t=e.ownerDocument)?void 0:t.body,d=(0,c.max)(n.scrollWidth,n.clientWidth,u?u.scrollWidth:0,u?u.clientWidth:0),s=(0,c.max)(n.scrollHeight,n.clientHeight,u?u.scrollHeight:0,u?u.clientHeight:0),p=-l.scrollLeft+(0,a["default"])(e),m=-l.scrollTop;"rtl"===(0,r["default"])(u||n).direction&&(p+=(0,c.max)(n.clientWidth,u?u.clientWidth:0)-d);return{width:d,height:s,x:p,y:m}};var o=l(n(58386)),r=l(n(61131)),a=l(n(45471)),i=l(n(1255)),c=n(62836);function l(e){return e&&e.__esModule?e:{"default":e}}},50552:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},43545:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=e.offsetWidth,o=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-o)<=1&&(o=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}};var o,r=(o=n(94294))&&o.__esModule?o:{"default":o}},99624:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},71942:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,r["default"])(e)&&(0,a.isHTMLElement)(e)?(0,i["default"])(e):(0,o["default"])(e)};var o=c(n(1255)),r=c(n(31677)),a=n(67458),i=c(n(50552));function c(e){return e&&e.__esModule?e:{"default":e}}},32440:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=d(e);for(;n&&(0,c["default"])(n)&&"static"===(0,a["default"])(n).position;)n=d(n);if(n&&("html"===(0,r["default"])(n)||"body"===(0,r["default"])(n)&&"static"===(0,a["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,i.isHTMLElement)(e)){if("fixed"===(0,a["default"])(e).position)return null}var n=(0,l["default"])(e);for(;(0,i.isHTMLElement)(n)&&["html","body"].indexOf((0,r["default"])(n))<0;){var o=(0,a["default"])(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t};var o=u(n(31677)),r=u(n(99624)),a=u(n(61131)),i=n(67458),c=u(n(79130)),l=u(n(31613));function u(e){return e&&e.__esModule?e:{"default":e}}function d(e){return(0,i.isHTMLElement)(e)&&"fixed"!==(0,a["default"])(e).position?e.offsetParent:null}},31613:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,o["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,a.isShadowRoot)(e)?e.host:null)||(0,r["default"])(e)};var o=i(n(99624)),r=i(n(58386)),a=n(67458);function i(e){return e&&e.__esModule?e:{"default":e}}},66055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e){if(["html","body","#document"].indexOf((0,a["default"])(e))>=0)return e.ownerDocument.body;if((0,i.isHTMLElement)(e)&&(0,r["default"])(e))return e;return l((0,o["default"])(e))};var o=c(n(31613)),r=c(n(37229)),a=c(n(99624)),i=n(67458);function c(e){return e&&e.__esModule?e:{"default":e}}},78331:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=(0,r["default"])(e),i=t.visualViewport,c=n.clientWidth,l=n.clientHeight,u=0,d=0;i&&(c=i.width,l=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(u=i.offsetLeft,d=i.offsetTop));return{width:c,height:l,x:u+(0,a["default"])(e),y:d}};var o=i(n(31677)),r=i(n(58386)),a=i(n(45471));function i(e){return e&&e.__esModule?e:{"default":e}}},31677:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},1255:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.pageXOffset,o=t.pageYOffset;return{scrollLeft:n,scrollTop:o}};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},45471:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])((0,r["default"])(e)).left+(0,a["default"])(e).scrollLeft};var o=i(n(94294)),r=i(n(58386)),a=i(n(1255));function i(e){return e&&e.__esModule?e:{"default":e}}},67458:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,r["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,r["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,r["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var o,r=(o=n(31677))&&o.__esModule?o:{"default":o}},37229:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=t.overflow,o=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+o)};var o,r=(o=n(61131))&&o.__esModule?o:{"default":o}},79130:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,r["default"])(e))>=0};var o,r=(o=n(99624))&&o.__esModule?o:{"default":o}},46213:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function l(e,t){var n;void 0===t&&(t=[]);var c=(0,o["default"])(e),u=c===(null==(n=e.ownerDocument)?void 0:n.body),d=(0,a["default"])(c),s=u?[d].concat(d.visualViewport||[],(0,i["default"])(c)?c:[]):c,p=t.concat(s);return u?p:p.concat(l((0,r["default"])(s)))};var o=c(n(66055)),r=c(n(31613)),a=c(n(31677)),i=c(n(37229));function c(e){return e&&e.__esModule?e:{"default":e}}},56728:function(e,t){"use strict";t.__esModule=!0,t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0;t.top="top";var n="bottom";t.bottom=n;var o="right";t.right=o;var r="left";t.left=r;var a="auto";t.auto=a;var i=["top",n,o,r];t.basePlacements=i;var c="start";t.start=c;var l="end";t.end=l;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var u=i.reduce((function(e,t){return e.concat([t+"-"+c,t+"-"+l])}),[]);t.variationPlacements=u;var d=[].concat(i,[a]).reduce((function(e,t){return e.concat([t,t+"-"+c,t+"-"+l])}),[]);t.placements=d;var s="beforeRead";t.beforeRead=s;var p="read";t.read=p;var m="afterRead";t.afterRead=m;var f="beforeMain";t.beforeMain=f;var h="main";t.main=h;var C="afterMain";t.afterMain=C;var g="beforeWrite";t.beforeWrite=g;var N="write";t.write=N;var v="afterWrite";t.afterWrite=v;var b=[s,p,m,f,h,C,g,N,v];t.modifierPhases=b},34739:function(e,t,n){"use strict";t.__esModule=!0;var o={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.createPopperLite=t.createPopper=t.createPopperBase=t.detectOverflow=t.popperGenerator=void 0;var r=n(56728);Object.keys(r).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===r[e]||(t[e]=r[e]))}));var a=n(18726);Object.keys(a).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===a[e]||(t[e]=a[e]))}));var i=n(92179);t.popperGenerator=i.popperGenerator,t.detectOverflow=i.detectOverflow,t.createPopperBase=i.createPopper;var c=n(48069);t.createPopper=c.createPopper;var l=n(39030);t.createPopperLite=l.createPopper},34559:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(99624))&&o.__esModule?o:{"default":o},a=n(67458);var i={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},i=t.elements[e];(0,a.isHTMLElement)(i)&&(0,r["default"])(i)&&(Object.assign(i.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],i=t.attributes[e]||{},c=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,a.isHTMLElement)(o)&&(0,r["default"])(o)&&(Object.assign(o.style,c),Object.keys(i).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=i},76340:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=p(n(22709)),r=p(n(43545)),a=p(n(97607)),i=p(n(32440)),c=p(n(16615)),l=p(n(52534)),u=p(n(32055)),d=p(n(76294)),s=n(56728);n(67458);function p(e){return e&&e.__esModule?e:{"default":e}}var m=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,u["default"])("number"!=typeof e?e:(0,d["default"])(e,s.basePlacements))};var f={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,a=e.name,u=e.options,d=n.elements.arrow,p=n.modifiersData.popperOffsets,f=(0,o["default"])(n.placement),h=(0,c["default"])(f),C=[s.left,s.right].indexOf(f)>=0?"height":"width";if(d&&p){var g=m(u.padding,n),N=(0,r["default"])(d),v="y"===h?s.top:s.left,b="y"===h?s.bottom:s.right,V=n.rects.reference[C]+n.rects.reference[h]-p[h]-n.rects.popper[C],y=p[h]-n.rects.reference[h],x=(0,i["default"])(d),k=x?"y"===h?x.clientHeight||0:x.clientWidth||0:0,S=V/2-y/2,I=g[v],w=k-N[C]-g[b],_=k/2-N[C]/2+S,D=(0,l["default"])(I,_,w),M=h;n.modifiersData[a]=((t={})[M]=D,t.centerOffset=D-_,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&(0,a["default"])(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=f},11300:function(e,t,n){"use strict";t.__esModule=!0,t.mapToStyles=p,t["default"]=void 0;var o=n(56728),r=d(n(32440)),a=d(n(31677)),i=d(n(58386)),c=d(n(61131)),l=d(n(22709)),u=n(62836);function d(e){return e&&e.__esModule?e:{"default":e}}var s={top:"auto",right:"auto",bottom:"auto",left:"auto"};function p(e){var t,n=e.popper,l=e.popperRect,d=e.placement,p=e.offsets,m=e.position,f=e.gpuAcceleration,h=e.adaptive,C=e.roundOffsets,g=!0===C?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:(0,u.round)((0,u.round)(t*o)/o)||0,y:(0,u.round)((0,u.round)(n*o)/o)||0}}(p):"function"==typeof C?C(p):p,N=g.x,v=void 0===N?0:N,b=g.y,V=void 0===b?0:b,y=p.hasOwnProperty("x"),x=p.hasOwnProperty("y"),k=o.left,S=o.top,I=window;if(h){var w=(0,r["default"])(n),_="clientHeight",D="clientWidth";w===(0,a["default"])(n)&&(w=(0,i["default"])(n),"static"!==(0,c["default"])(w).position&&(_="scrollHeight",D="scrollWidth")),d===o.top&&(S=o.bottom,V-=w[_]-l.height,V*=f?1:-1),d===o.left&&(k=o.right,v-=w[D]-l.width,v*=f?1:-1)}var M,B=Object.assign({position:m},h&&s);return f?Object.assign({},B,((M={})[S]=x?"0":"",M[k]=y?"0":"",M.transform=(I.devicePixelRatio||1)<2?"translate("+v+"px, "+V+"px)":"translate3d("+v+"px, "+V+"px, 0)",M)):Object.assign({},B,((t={})[S]=x?V+"px":"",t[k]=y?v+"px":"",t.transform="",t))}var m={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,a=n.adaptive,i=void 0===a||a,c=n.roundOffsets,u=void 0===c||c,d={placement:(0,l["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,p(Object.assign({},d,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:u})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,p(Object.assign({},d,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=m},27020:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(31677))&&o.__esModule?o:{"default":o};var a={passive:!0};var i={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,o=e.options,i=o.scroll,c=void 0===i||i,l=o.resize,u=void 0===l||l,d=(0,r["default"])(t.elements.popper),s=[].concat(t.scrollParents.reference,t.scrollParents.popper);return c&&s.forEach((function(e){e.addEventListener("scroll",n.update,a)})),u&&d.addEventListener("resize",n.update,a),function(){c&&s.forEach((function(e){e.removeEventListener("scroll",n.update,a)})),u&&d.removeEventListener("resize",n.update,a)}},data:{}};t["default"]=i},45922:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=d(n(70045)),r=d(n(22709)),a=d(n(28916)),i=d(n(19574)),c=d(n(31565)),l=n(56728),u=d(n(45412));function d(e){return e&&e.__esModule?e:{"default":e}}var s={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,d=e.name;if(!t.modifiersData[d]._skip){for(var s=n.mainAxis,p=void 0===s||s,m=n.altAxis,f=void 0===m||m,h=n.fallbackPlacements,C=n.padding,g=n.boundary,N=n.rootBoundary,v=n.altBoundary,b=n.flipVariations,V=void 0===b||b,y=n.allowedAutoPlacements,x=t.options.placement,k=(0,r["default"])(x),S=h||(k===x||!V?[(0,o["default"])(x)]:function(e){if((0,r["default"])(e)===l.auto)return[];var t=(0,o["default"])(e);return[(0,a["default"])(e),t,(0,a["default"])(t)]}(x)),I=[x].concat(S).reduce((function(e,n){return e.concat((0,r["default"])(n)===l.auto?(0,c["default"])(t,{placement:n,boundary:g,rootBoundary:N,padding:C,flipVariations:V,allowedAutoPlacements:y}):n)}),[]),w=t.rects.reference,_=t.rects.popper,D=new Map,M=!0,B=I[0],A=0;A<I.length;A++){var T=I[A],L=(0,r["default"])(T),E=(0,u["default"])(T)===l.start,P=[l.top,l.bottom].indexOf(L)>=0,j=P?"width":"height",O=(0,i["default"])(t,{placement:T,boundary:g,rootBoundary:N,altBoundary:v,padding:C}),F=P?E?l.right:l.left:E?l.bottom:l.top;w[j]>_[j]&&(F=(0,o["default"])(F));var R=(0,o["default"])(F),z=[];if(p&&z.push(O[L]<=0),f&&z.push(O[F]<=0,O[R]<=0),z.every((function(e){return e}))){B=T,M=!1;break}D.set(T,z)}if(M)for(var W=function(e){var t=I.find((function(t){var n=D.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return B=t,"break"},U=V?3:1;U>0;U--){if("break"===W(U))break}t.placement!==B&&(t.modifiersData[d]._skip=!0,t.placement=B,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=s},82860:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=n(56728),a=(o=n(19574))&&o.__esModule?o:{"default":o};function i(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function c(e){return[r.top,r.right,r.bottom,r.left].some((function(t){return e[t]>=0}))}var l={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,l=t.modifiersData.preventOverflow,u=(0,a["default"])(t,{elementContext:"reference"}),d=(0,a["default"])(t,{altBoundary:!0}),s=i(u,o),p=i(d,r,l),m=c(s),f=c(p);t.modifiersData[n]={referenceClippingOffsets:s,popperEscapeOffsets:p,isReferenceHidden:m,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":m,"data-popper-escaped":f})}};t["default"]=l},18726:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var o=p(n(34559));t.applyStyles=o["default"];var r=p(n(76340));t.arrow=r["default"];var a=p(n(11300));t.computeStyles=a["default"];var i=p(n(27020));t.eventListeners=i["default"];var c=p(n(45922));t.flip=c["default"];var l=p(n(82860));t.hide=l["default"];var u=p(n(33310));t.offset=u["default"];var d=p(n(74371));t.popperOffsets=d["default"];var s=p(n(21532));function p(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=s["default"]},33310:function(e,t,n){"use strict";t.__esModule=!0,t.distanceAndSkiddingToXY=i,t["default"]=void 0;var o,r=(o=n(22709))&&o.__esModule?o:{"default":o},a=n(56728);function i(e,t,n){var o=(0,r["default"])(e),i=[a.left,a.top].indexOf(o)>=0?-1:1,c="function"==typeof n?n(Object.assign({},t,{placement:e})):n,l=c[0],u=c[1];return l=l||0,u=(u||0)*i,[a.left,a.right].indexOf(o)>=0?{x:u,y:l}:{x:l,y:u}}var c={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,c=void 0===r?[0,0]:r,l=a.placements.reduce((function(e,n){return e[n]=i(n,t.rects,c),e}),{}),u=l[t.placement],d=u.x,s=u.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=d,t.modifiersData.popperOffsets.y+=s),t.modifiersData[o]=l}};t["default"]=c},74371:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o,r=(o=n(17175))&&o.__esModule?o:{"default":o};var a={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,r["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=a},21532:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(56728),r=f(n(22709)),a=f(n(16615)),i=f(n(82898)),c=f(n(52534)),l=f(n(43545)),u=f(n(32440)),d=f(n(19574)),s=f(n(45412)),p=f(n(41801)),m=n(62836);function f(e){return e&&e.__esModule?e:{"default":e}}var h={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,f=e.name,h=n.mainAxis,C=void 0===h||h,g=n.altAxis,N=void 0!==g&&g,v=n.boundary,b=n.rootBoundary,V=n.altBoundary,y=n.padding,x=n.tether,k=void 0===x||x,S=n.tetherOffset,I=void 0===S?0:S,w=(0,d["default"])(t,{boundary:v,rootBoundary:b,padding:y,altBoundary:V}),_=(0,r["default"])(t.placement),D=(0,s["default"])(t.placement),M=!D,B=(0,a["default"])(_),A=(0,i["default"])(B),T=t.modifiersData.popperOffsets,L=t.rects.reference,E=t.rects.popper,P="function"==typeof I?I(Object.assign({},t.rects,{placement:t.placement})):I,j={x:0,y:0};if(T){if(C||N){var O="y"===B?o.top:o.left,F="y"===B?o.bottom:o.right,R="y"===B?"height":"width",z=T[B],W=T[B]+w[O],U=T[B]-w[F],H=k?-E[R]/2:0,G=D===o.start?L[R]:E[R],Y=D===o.start?-E[R]:-L[R],Z=t.elements.arrow,K=k&&Z?(0,l["default"])(Z):{width:0,height:0},Q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,p["default"])(),$=Q[O],J=Q[F],X=(0,c["default"])(0,L[R],K[R]),q=M?L[R]/2-H-X-$-P:G-X-$-P,ee=M?-L[R]/2+H+X+J+P:Y+X+J+P,te=t.elements.arrow&&(0,u["default"])(t.elements.arrow),ne=te?"y"===B?te.clientTop||0:te.clientLeft||0:0,oe=t.modifiersData.offset?t.modifiersData.offset[t.placement][B]:0,re=T[B]+q-oe-ne,ae=T[B]+ee-oe;if(C){var ie=(0,c["default"])(k?(0,m.min)(W,re):W,z,k?(0,m.max)(U,ae):U);T[B]=ie,j[B]=ie-z}if(N){var ce="x"===B?o.top:o.left,le="x"===B?o.bottom:o.right,ue=T[A],de=ue+w[ce],se=ue-w[le],pe=(0,c["default"])(k?(0,m.min)(de,re):de,ue,k?(0,m.max)(se,ae):se);T[A]=pe,j[A]=pe-ue}}t.modifiersData[f]=j}},requiresIfExists:["offset"]};t["default"]=h},39030:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var o=n(92179);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var r=l(n(27020)),a=l(n(74371)),i=l(n(11300)),c=l(n(34559));function l(e){return e&&e.__esModule?e:{"default":e}}var u=[r["default"],a["default"],i["default"],c["default"]];t.defaultModifiers=u;var d=(0,o.popperGenerator)({defaultModifiers:u});t.createPopper=d},48069:function(e,t,n){"use strict";t.__esModule=!0;var o={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var r=n(92179);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var a=C(n(27020)),i=C(n(74371)),c=C(n(11300)),l=C(n(34559)),u=C(n(33310)),d=C(n(45922)),s=C(n(21532)),p=C(n(76340)),m=C(n(82860)),f=n(39030);t.createPopperLite=f.createPopper;var h=n(18726);function C(e){return e&&e.__esModule?e:{"default":e}}Object.keys(h).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===h[e]||(t[e]=h[e]))}));var g=[a["default"],i["default"],c["default"],l["default"],u["default"],d["default"],s["default"],p["default"],m["default"]];t.defaultModifiers=g;var N=(0,r.popperGenerator)({defaultModifiers:g});t.createPopperLite=t.createPopper=N},31565:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,c=n.placement,l=n.boundary,u=n.rootBoundary,d=n.padding,s=n.flipVariations,p=n.allowedAutoPlacements,m=void 0===p?r.placements:p,f=(0,o["default"])(c),h=f?s?r.variationPlacements:r.variationPlacements.filter((function(e){return(0,o["default"])(e)===f})):r.basePlacements,C=h.filter((function(e){return m.indexOf(e)>=0}));0===C.length&&(C=h);var g=C.reduce((function(t,n){return t[n]=(0,a["default"])(e,{placement:n,boundary:l,rootBoundary:u,padding:d})[(0,i["default"])(n)],t}),{});return Object.keys(g).sort((function(e,t){return g[e]-g[t]}))};var o=c(n(45412)),r=n(56728),a=c(n(19574)),i=c(n(22709));function c(e){return e&&e.__esModule?e:{"default":e}}},17175:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,c=e.element,l=e.placement,u=l?(0,o["default"])(l):null,d=l?(0,r["default"])(l):null,s=n.x+n.width/2-c.width/2,p=n.y+n.height/2-c.height/2;switch(u){case i.top:t={x:s,y:n.y-c.height};break;case i.bottom:t={x:s,y:n.y+n.height};break;case i.right:t={x:n.x+n.width,y:p};break;case i.left:t={x:n.x-c.width,y:p};break;default:t={x:n.x,y:n.y}}var m=u?(0,a["default"])(u):null;if(null!=m){var f="y"===m?"height":"width";switch(d){case i.start:t[m]=t[m]-(n[f]/2-c[f]/2);break;case i.end:t[m]=t[m]+(n[f]/2-c[f]/2)}}return t};var o=c(n(22709)),r=c(n(45412)),a=c(n(16615)),i=n(56728);function c(e){return e&&e.__esModule?e:{"default":e}}},68369:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},19574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,p=n.placement,m=void 0===p?e.placement:p,f=n.boundary,h=void 0===f?l.clippingParents:f,C=n.rootBoundary,g=void 0===C?l.viewport:C,N=n.elementContext,v=void 0===N?l.popper:N,b=n.altBoundary,V=void 0!==b&&b,y=n.padding,x=void 0===y?0:y,k=(0,d["default"])("number"!=typeof x?x:(0,s["default"])(x,l.basePlacements)),S=v===l.popper?l.reference:l.popper,I=e.elements.reference,w=e.rects.popper,_=e.elements[V?S:v],D=(0,r["default"])((0,u.isElement)(_)?_:_.contextElement||(0,a["default"])(e.elements.popper),h,g),M=(0,o["default"])(I),B=(0,i["default"])({reference:M,element:w,strategy:"absolute",placement:m}),A=(0,c["default"])(Object.assign({},w,B)),T=v===l.popper?A:M,L={top:D.top-T.top+k.top,bottom:T.bottom-D.bottom+k.bottom,left:D.left-T.left+k.left,right:T.right-D.right+k.right},E=e.modifiersData.offset;if(v===l.popper&&E){var P=E[m];Object.keys(L).forEach((function(e){var t=[l.right,l.bottom].indexOf(e)>=0?1:-1,n=[l.top,l.bottom].indexOf(e)>=0?"y":"x";L[e]+=P[n]*t}))}return L};var o=p(n(94294)),r=p(n(48162)),a=p(n(58386)),i=p(n(17175)),c=p(n(20935)),l=n(56728),u=n(67458),d=p(n(32055)),s=p(n(76294));function p(e){return e&&e.__esModule?e:{"default":e}}},76294:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},41434:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return[].concat(n).reduce((function(e,t){return e.replace(/%s/,t)}),e)}},82898:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return"x"===e?"y":"x"}},22709:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[0]};n(56728)},41801:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(){return{top:0,right:0,bottom:0,left:0}}},16615:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}},70045:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},28916:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},45412:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},62836:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var o=Math.min;t.min=o;var r=Math.round;t.round=r},36284:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},32055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,r["default"])(),e)};var o,r=(o=n(41801))&&o.__esModule?o:{"default":o}},45700:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}(e);return o.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var o=n(56728)},20935:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},25435:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var o=t(e);if(!n.has(o))return n.add(o),!0}))}},38574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){Object.keys(t).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;case"phase":r.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":t.effect;break;case"requires":Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(o=n(41434))&&o.__esModule;var o,r=n(56728)},52534:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){return(0,o.max)(e,(0,o.min)(t,n))};var o=n(62836)},83923:function(e){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},1372:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e){if(!o(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},36910:function(e,t,n){"use strict";var o=n(17657),r=n(83681),a=n(74217),i=o("unscopables"),c=Array.prototype;c[i]==undefined&&a.f(c,i,{configurable:!0,value:r(null)}),e.exports=function(e){c[i][e]=!0}},69953:function(e,t,n){"use strict";var o=n(37015).charAt;e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},50997:function(e){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},63518:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e){if(!o(e))throw TypeError(String(e)+" is not an object");return e}},32977:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},19216:function(e,t,n){"use strict";var o,r,a,i=n(32977),c=n(75592),l=n(84253),u=n(35611),d=n(28919),s=n(47953),p=n(52188),m=n(11807),f=n(74217).f,h=n(6863),C=n(18444),g=n(17657),N=n(41080),v=l.Int8Array,b=v&&v.prototype,V=l.Uint8ClampedArray,y=V&&V.prototype,x=v&&h(v),k=b&&h(b),S=Object.prototype,I=S.isPrototypeOf,w=g("toStringTag"),_=N("TYPED_ARRAY_TAG"),D=N("TYPED_ARRAY_CONSTRUCTOR"),M=i&&!!C&&"Opera"!==s(l.opera),B=!1,A={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},L=function(e){if(!u(e))return!1;var t=s(e);return"DataView"===t||d(A,t)||d(T,t)},E=function(e){if(!u(e))return!1;var t=s(e);return d(A,t)||d(T,t)};for(o in A)(a=(r=l[o])&&r.prototype)?p(a,D,r):M=!1;for(o in T)(a=(r=l[o])&&r.prototype)&&p(a,D,r);if((!M||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},M))for(o in A)l[o]&&C(l[o],x);if((!M||!k||k===S)&&(k=x.prototype,M))for(o in A)l[o]&&C(l[o].prototype,k);if(M&&h(y)!==k&&C(y,k),c&&!d(k,w))for(o in B=!0,f(k,w,{get:function(){return u(this)?this[_]:undefined}}),A)l[o]&&p(l[o],_,o);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:M,TYPED_ARRAY_CONSTRUCTOR:D,TYPED_ARRAY_TAG:B&&_,aTypedArray:function(e){if(E(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(C&&!I.call(x,e))throw TypeError("Target is not a typed array constructor");return e},exportTypedArrayMethod:function(e,t,n){if(c){if(n)for(var o in A){var r=l[o];if(r&&d(r.prototype,e))try{delete r.prototype[e]}catch(a){}}k[e]&&!n||m(k,e,n?t:M&&b[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var o,r;if(c){if(C){if(n)for(o in A)if((r=l[o])&&d(r,e))try{delete r[e]}catch(a){}if(x[e]&&!n)return;try{return m(x,e,n?t:M&&x[e]||t)}catch(a){}}for(o in A)!(r=l[o])||r[e]&&!n||m(r,e,t)}},isView:L,isTypedArray:E,TypedArray:x,TypedArrayPrototype:k}},80246:function(e,t,n){"use strict";var o=n(84253),r=n(75592),a=n(32977),i=n(52188),c=n(3993),l=n(69691),u=n(50997),d=n(3997),s=n(39570),p=n(77559),m=n(16567),f=n(6863),h=n(18444),C=n(78870).f,g=n(74217).f,N=n(22051),v=n(29108),b=n(79947),V=b.get,y=b.set,x="ArrayBuffer",k="DataView",S="prototype",I="Wrong index",w=o[x],_=w,D=o[k],M=D&&D[S],B=Object.prototype,A=o.RangeError,T=m.pack,L=m.unpack,E=function(e){return[255&e]},P=function(e){return[255&e,e>>8&255]},j=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},F=function(e){return T(e,23,4)},R=function(e){return T(e,52,8)},z=function(e,t){g(e[S],t,{get:function(){return V(this)[t]}})},W=function(e,t,n,o){var r=p(n),a=V(e);if(r+t>a.byteLength)throw A(I);var i=V(a.buffer).bytes,c=r+a.byteOffset,l=i.slice(c,c+t);return o?l:l.reverse()},U=function(e,t,n,o,r,a){var i=p(n),c=V(e);if(i+t>c.byteLength)throw A(I);for(var l=V(c.buffer).bytes,u=i+c.byteOffset,d=o(+r),s=0;s<t;s++)l[u+s]=d[a?s:t-s-1]};if(a){if(!l((function(){w(1)}))||!l((function(){new w(-1)}))||l((function(){return new w,new w(1.5),new w(NaN),w.name!=x}))){for(var H,G=(_=function(e){return u(this,_),new w(p(e))})[S]=w[S],Y=C(w),Z=0;Y.length>Z;)(H=Y[Z++])in _||i(_,H,w[H]);G.constructor=_}h&&f(M)!==B&&h(M,B);var K=new D(new _(2)),Q=M.setInt8;K.setInt8(0,2147483648),K.setInt8(1,2147483649),!K.getInt8(0)&&K.getInt8(1)||c(M,{setInt8:function(e,t){Q.call(this,e,t<<24>>24)},setUint8:function(e,t){Q.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){u(this,_,x);var t=p(e);y(this,{bytes:N.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},D=function(e,t,n){u(this,D,k),u(e,_,k);var o=V(e).byteLength,a=d(t);if(a<0||a>o)throw A("Wrong offset");if(a+(n=n===undefined?o-a:s(n))>o)throw A("Wrong length");y(this,{buffer:e,byteLength:n,byteOffset:a}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=a)},r&&(z(_,"byteLength"),z(D,"buffer"),z(D,"byteLength"),z(D,"byteOffset")),c(D[S],{getInt8:function(e){return W(this,1,e)[0]<<24>>24},getUint8:function(e){return W(this,1,e)[0]},getInt16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=W(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return O(W(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return O(W(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return L(W(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return L(W(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){U(this,1,e,E,t)},setUint8:function(e,t){U(this,1,e,E,t)},setInt16:function(e,t){U(this,2,e,P,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){U(this,2,e,P,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){U(this,4,e,j,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){U(this,4,e,j,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){U(this,4,e,F,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){U(this,8,e,R,t,arguments.length>2?arguments[2]:undefined)}});v(_,x),v(D,k),e.exports={ArrayBuffer:_,DataView:D}},59571:function(e,t,n){"use strict";var o=n(12104),r=n(55205),a=n(39570),i=Math.min;e.exports=[].copyWithin||function(e,t){var n=o(this),c=a(n.length),l=r(e,c),u=r(t,c),d=arguments.length>2?arguments[2]:undefined,s=i((d===undefined?c:r(d,c))-u,c-l),p=1;for(u<l&&l<u+s&&(p=-1,u+=s-1,l+=s-1);s-- >0;)u in n?n[l]=n[u]:delete n[l],l+=p,u+=p;return n}},22051:function(e,t,n){"use strict";var o=n(12104),r=n(55205),a=n(39570);e.exports=function(e){for(var t=o(this),n=a(t.length),i=arguments.length,c=r(i>1?arguments[1]:undefined,n),l=i>2?arguments[2]:undefined,u=l===undefined?n:r(l,n);u>c;)t[c++]=e;return t}},90369:function(e,t,n){"use strict";var o=n(69033).forEach,r=n(37902)("forEach");e.exports=r?[].forEach:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}},11955:function(e){"use strict";e.exports=function(e,t){for(var n=0,o=t.length,r=new e(o);o>n;)r[n]=t[n++];return r}},28213:function(e,t,n){"use strict";var o=n(74271),r=n(12104),a=n(32648),i=n(14195),c=n(39570),l=n(39241),u=n(3170);e.exports=function(e){var t,n,d,s,p,m,f=r(e),h="function"==typeof this?this:Array,C=arguments.length,g=C>1?arguments[1]:undefined,N=g!==undefined,v=u(f),b=0;if(N&&(g=o(g,C>2?arguments[2]:undefined,2)),v==undefined||h==Array&&i(v))for(n=new h(t=c(f.length));t>b;b++)m=N?g(f[b],b):f[b],l(n,b,m);else for(p=(s=v.call(f)).next,n=new h;!(d=p.call(s)).done;b++)m=N?a(s,g,[d.value,b],!0):d.value,l(n,b,m);return n.length=b,n}},25945:function(e,t,n){"use strict";var o=n(26553),r=n(39570),a=n(55205),i=function(e){return function(t,n,i){var c,l=o(t),u=r(l.length),d=a(i,u);if(e&&n!=n){for(;u>d;)if((c=l[d++])!=c)return!0}else for(;u>d;d++)if((e||d in l)&&l[d]===n)return e||d||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},69033:function(e,t,n){"use strict";var o=n(74271),r=n(50990),a=n(12104),i=n(39570),c=n(77454),l=[].push,u=function(e){var t=1==e,n=2==e,u=3==e,d=4==e,s=6==e,p=7==e,m=5==e||s;return function(f,h,C,g){for(var N,v,b=a(f),V=r(b),y=o(h,C,3),x=i(V.length),k=0,S=g||c,I=t?S(f,x):n||p?S(f,0):undefined;x>k;k++)if((m||k in V)&&(v=y(N=V[k],k,b),e))if(t)I[k]=v;else if(v)switch(e){case 3:return!0;case 5:return N;case 6:return k;case 2:l.call(I,N)}else switch(e){case 4:return!1;case 7:l.call(I,N)}return s?-1:u||d?d:I}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},41183:function(e,t,n){"use strict";var o=n(26553),r=n(3997),a=n(39570),i=n(37902),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,d=i("lastIndexOf"),s=u||!d;e.exports=s?function(e){if(u)return l.apply(this,arguments)||0;var t=o(this),n=a(t.length),i=n-1;for(arguments.length>1&&(i=c(i,r(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:l},93537:function(e,t,n){"use strict";var o=n(69691),r=n(17657),a=n(12338),i=r("species");e.exports=function(e){return a>=51||!o((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},37902:function(e,t,n){"use strict";var o=n(69691);e.exports=function(e,t){var n=[][e];return!!n&&o((function(){n.call(null,t||function(){throw 1},1)}))}},28249:function(e,t,n){"use strict";var o=n(83923),r=n(12104),a=n(50990),i=n(39570),c=function(e){return function(t,n,c,l){o(n);var u=r(t),d=a(u),s=i(u.length),p=e?s-1:0,m=e?-1:1;if(c<2)for(;;){if(p in d){l=d[p],p+=m;break}if(p+=m,e?p<0:s<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:s>p;p+=m)p in d&&(l=n(l,d[p],p,u));return l}};e.exports={left:c(!1),right:c(!0)}},58737:function(e){"use strict";var t=Math.floor,n=function(e,t){for(var n,o,r=e.length,a=1;a<r;){for(o=a,n=e[a];o&&t(e[o-1],n)>0;)e[o]=e[--o];o!==a++&&(e[o]=n)}return e},o=function(e,t,n){for(var o=e.length,r=t.length,a=0,i=0,c=[];a<o||i<r;)a<o&&i<r?c.push(n(e[a],t[i])<=0?e[a++]:t[i++]):c.push(a<o?e[a++]:t[i++]);return c};e.exports=function r(e,a){var i=e.length,c=t(i/2);return i<8?n(e,a):o(r(e.slice(0,c),a),r(e.slice(c),a),a)}},73612:function(e,t,n){"use strict";var o=n(35611),r=n(89999),a=n(17657)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)?o(t)&&null===(t=t[a])&&(t=undefined):t=undefined),t===undefined?Array:t}},77454:function(e,t,n){"use strict";var o=n(73612);e.exports=function(e,t){return new(o(e))(0===t?0:t)}},32648:function(e,t,n){"use strict";var o=n(63518),r=n(61781);e.exports=function(e,t,n,a){try{return a?t(o(n)[0],n[1]):t(n)}catch(i){throw r(e),i}}},68762:function(e,t,n){"use strict";var o=n(17657)("iterator"),r=!1;try{var a=0,i={next:function(){return{done:!!a++}},"return":function(){r=!0}};i[o]=function(){return this},Array.from(i,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var a={};a[o]=function(){return{next:function(){return{done:n=!0}}}},e(a)}catch(c){}return n}},77e3:function(e){"use strict";var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},47953:function(e,t,n){"use strict";var o=n(64910),r=n(77e3),a=n(17657)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=o?r:function(e){var t,n,o;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),a))?n:i?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},74568:function(e,t,n){"use strict";var o=n(74217).f,r=n(83681),a=n(3993),i=n(74271),c=n(50997),l=n(56342),u=n(71179),d=n(64157),s=n(75592),p=n(40421).fastKey,m=n(79947),f=m.set,h=m.getterFor;e.exports={getConstructor:function(e,t,n,u){var d=e((function(e,o){c(e,d,t),f(e,{type:t,index:r(null),first:undefined,last:undefined,size:0}),s||(e.size=0),o!=undefined&&l(o,e[u],{that:e,AS_ENTRIES:n})})),m=h(t),C=function(e,t,n){var o,r,a=m(e),i=g(e,t);return i?i.value=n:(a.last=i={index:r=p(t,!0),key:t,value:n,previous:o=a.last,next:undefined,removed:!1},a.first||(a.first=i),o&&(o.next=i),s?a.size++:e.size++,"F"!==r&&(a.index[r]=i)),e},g=function(e,t){var n,o=m(e),r=p(t);if("F"!==r)return o.index[r];for(n=o.first;n;n=n.next)if(n.key==t)return n};return a(d.prototype,{clear:function(){for(var e=m(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=undefined),delete t[n.index],n=n.next;e.first=e.last=undefined,s?e.size=0:this.size=0},"delete":function(e){var t=this,n=m(t),o=g(t,e);if(o){var r=o.next,a=o.previous;delete n.index[o.index],o.removed=!0,a&&(a.next=r),r&&(r.previous=a),n.first==o&&(n.first=r),n.last==o&&(n.last=a),s?n.size--:t.size--}return!!o},forEach:function(e){for(var t,n=m(this),o=i(e,arguments.length>1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(o(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),a(d.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return C(this,0===e?0:e,t)}}:{add:function(e){return C(this,e=0===e?0:e,e)}}),s&&o(d.prototype,"size",{get:function(){return m(this).size}}),d},setStrong:function(e,t,n){var o=t+" Iterator",r=h(t),a=h(o);u(e,t,(function(e,t){f(this,{type:o,target:e,state:r(e),kind:t,last:undefined})}),(function(){for(var e=a(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),d(t)}}},57396:function(e,t,n){"use strict";var o=n(3993),r=n(40421).getWeakData,a=n(63518),i=n(35611),c=n(50997),l=n(56342),u=n(69033),d=n(28919),s=n(79947),p=s.set,m=s.getterFor,f=u.find,h=u.findIndex,C=0,g=function(e){return e.frozen||(e.frozen=new N)},N=function(){this.entries=[]},v=function(e,t){return f(e.entries,(function(e){return e[0]===t}))};N.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var n=v(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=h(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,u){var s=e((function(e,o){c(e,s,t),p(e,{type:t,id:C++,frozen:undefined}),o!=undefined&&l(o,e[u],{that:e,AS_ENTRIES:n})})),f=m(t),h=function(e,t,n){var o=f(e),i=r(a(t),!0);return!0===i?g(o).set(t,n):i[o.id]=n,e};return o(s.prototype,{"delete":function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?g(t)["delete"](e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=f(this);if(!i(e))return!1;var n=r(e);return!0===n?g(t).has(e):n&&d(n,t.id)}}),o(s.prototype,n?{get:function(e){var t=f(this);if(i(e)){var n=r(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return h(this,e,t)}}:{add:function(e){return h(this,e,!0)}}),s}}},42006:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(41441),i=n(11807),c=n(40421),l=n(56342),u=n(50997),d=n(35611),s=n(69691),p=n(68762),m=n(29108),f=n(22285);e.exports=function(e,t,n){var h=-1!==e.indexOf("Map"),C=-1!==e.indexOf("Weak"),g=h?"set":"add",N=r[e],v=N&&N.prototype,b=N,V={},y=function(e){var t=v[e];i(v,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(C&&!d(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return C&&!d(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(C&&!d(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(a(e,"function"!=typeof N||!(C||v.forEach&&!s((function(){(new N).entries().next()})))))b=n.getConstructor(t,e,h,g),c.enable();else if(a(e,!0)){var x=new b,k=x[g](C?{}:-0,1)!=x,S=s((function(){x.has(1)})),I=p((function(e){new N(e)})),w=!C&&s((function(){for(var e=new N,t=5;t--;)e[g](t,t);return!e.has(-0)}));I||((b=t((function(t,n){u(t,b,e);var o=f(new N,t,b);return n!=undefined&&l(n,o[g],{that:o,AS_ENTRIES:h}),o}))).prototype=v,v.constructor=b),(S||w)&&(y("delete"),y("has"),h&&y("get")),(w||k)&&y(g),C&&v.clear&&delete v.clear}return V[e]=b,o({global:!0,forced:b!=N},V),m(b,e),C||n.setStrong(b,e,h),b}},49957:function(e,t,n){"use strict";var o=n(28919),r=n(28482),a=n(22245),i=n(74217);e.exports=function(e,t){for(var n=r(t),c=i.f,l=a.f,u=0;u<n.length;u++){var d=n[u];o(e,d)||c(e,d,l(t,d))}}},93937:function(e,t,n){"use strict";var o=n(17657)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[o]=!1,"/./"[e](t)}catch(r){}}return!1}},28954:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},34141:function(e,t,n){"use strict";var o=n(44184),r=n(92082),a=/"/g;e.exports=function(e,t,n,i){var c=r(o(e)),l="<"+t;return""!==n&&(l+=" "+n+'="'+r(i).replace(a,"&quot;")+'"'),l+">"+c+"</"+t+">"}},38415:function(e,t,n){"use strict";var o=n(39881).IteratorPrototype,r=n(83681),a=n(39160),i=n(29108),c=n(82723),l=function(){return this};e.exports=function(e,t,n){var u=t+" Iterator";return e.prototype=r(o,{next:a(1,n)}),i(e,u,!1,!0),c[u]=l,e}},52188:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(39160);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},39160:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},39241:function(e,t,n){"use strict";var o=n(14613),r=n(74217),a=n(39160);e.exports=function(e,t,n){var i=o(t);i in e?r.f(e,i,a(0,n)):e[i]=n}},79873:function(e,t,n){"use strict";var o=n(69691),r=n(47497).start,a=Math.abs,i=Date.prototype,c=i.getTime,l=i.toISOString;e.exports=o((function(){return"0385-07-25T07:06:39.999Z"!=l.call(new Date(-50000000000001))}))||!o((function(){l.call(new Date(NaN))}))?function(){if(!isFinite(c.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),o=t<0?"-":t>9999?"+":"";return o+r(a(t),o?6:4,0)+"-"+r(e.getUTCMonth()+1,2,0)+"-"+r(e.getUTCDate(),2,0)+"T"+r(e.getUTCHours(),2,0)+":"+r(e.getUTCMinutes(),2,0)+":"+r(e.getUTCSeconds(),2,0)+"."+r(n,3,0)+"Z"}:l},57763:function(e,t,n){"use strict";var o=n(63518),r=n(28734);e.exports=function(e){if(o(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw TypeError("Incorrect hint");return r(this,e)}},71179:function(e,t,n){"use strict";var o=n(56174),r=n(38415),a=n(6863),i=n(18444),c=n(29108),l=n(52188),u=n(11807),d=n(17657),s=n(1986),p=n(82723),m=n(39881),f=m.IteratorPrototype,h=m.BUGGY_SAFARI_ITERATORS,C=d("iterator"),g="keys",N="values",v="entries",b=function(){return this};e.exports=function(e,t,n,d,m,V,y){r(n,t,d);var x,k,S,I=function(e){if(e===m&&B)return B;if(!h&&e in D)return D[e];switch(e){case g:case N:case v:return function(){return new n(this,e)}}return function(){return new n(this)}},w=t+" Iterator",_=!1,D=e.prototype,M=D[C]||D["@@iterator"]||m&&D[m],B=!h&&M||I(m),A="Array"==t&&D.entries||M;if(A&&(x=a(A.call(new e)),f!==Object.prototype&&x.next&&(s||a(x)===f||(i?i(x,f):"function"!=typeof x[C]&&l(x,C,b)),c(x,w,!0,!0),s&&(p[w]=b))),m==N&&M&&M.name!==N&&(_=!0,B=function(){return M.call(this)}),s&&!y||D[C]===B||l(D,C,B),p[t]=B,m)if(k={values:I(N),keys:V?B:I(g),entries:I(v)},y)for(S in k)(h||_||!(S in D))&&u(D,S,k[S]);else o({target:t,proto:!0,forced:h||_},k);return k}},55282:function(e,t,n){"use strict";var o=n(65781),r=n(28919),a=n(3444),i=n(74217).f;e.exports=function(e){var t=o.Symbol||(o.Symbol={});r(t,e)||i(t,e,{value:a.f(e)})}},75592:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},21477:function(e,t,n){"use strict";var o=n(84253),r=n(35611),a=o.document,i=r(a)&&r(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},20967:function(e,t,n){"use strict";var o=n(72319).match(/firefox\/(\d+)/i);e.exports=!!o&&+o[1]},46392:function(e){"use strict";e.exports="object"==typeof window},85749:function(e,t,n){"use strict";var o=n(72319);e.exports=/MSIE|Trident/.test(o)},20037:function(e,t,n){"use strict";var o=n(72319),r=n(84253);e.exports=/iphone|ipod|ipad/i.test(o)&&r.Pebble!==undefined},24542:function(e,t,n){"use strict";var o=n(72319);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(o)},41488:function(e,t,n){"use strict";var o=n(77e3),r=n(84253);e.exports="process"==o(r.process)},47501:function(e,t,n){"use strict";var o=n(72319);e.exports=/web0s(?!.*chrome)/i.test(o)},72319:function(e,t,n){"use strict";var o=n(69808);e.exports=o("navigator","userAgent")||""},12338:function(e,t,n){"use strict";var o,r,a=n(84253),i=n(72319),c=a.process,l=a.Deno,u=c&&c.versions||l&&l.version,d=u&&u.v8;d?r=(o=d.split("."))[0]<4?1:o[0]+o[1]:i&&(!(o=i.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=i.match(/Chrome\/(\d+)/))&&(r=o[1]),e.exports=r&&+r},12200:function(e,t,n){"use strict";var o=n(72319).match(/AppleWebKit\/(\d+)\./);e.exports=!!o&&+o[1]},23344:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},56174:function(e,t,n){"use strict";var o=n(84253),r=n(22245).f,a=n(52188),i=n(11807),c=n(30889),l=n(49957),u=n(41441);e.exports=function(e,t){var n,d,s,p,m,f=e.target,h=e.global,C=e.stat;if(n=h?o:C?o[f]||c(f,{}):(o[f]||{}).prototype)for(d in t){if(p=t[d],s=e.noTargetGet?(m=r(n,d))&&m.value:n[d],!u(h?d:f+(C?".":"#")+d,e.forced)&&s!==undefined){if(typeof p==typeof s)continue;l(p,s)}(e.sham||s&&s.sham)&&a(p,"sham",!0),i(n,d,p,e)}}},69691:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},68880:function(e,t,n){"use strict";n(12654);var o=n(11807),r=n(71841),a=n(69691),i=n(17657),c=n(52188),l=i("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var s=i(e),p=!a((function(){var t={};return t[s]=function(){return 7},7!=""[e](t)})),m=p&&!a((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[s]=/./[s]),n.exec=function(){return t=!0,null},n[s](""),!t}));if(!p||!m||n){var f=/./[s],h=t(s,""[e],(function(e,t,n,o,a){var i=t.exec;return i===r||i===u.exec?p&&!a?{done:!0,value:f.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}}));o(String.prototype,e,h[0]),o(u,s,h[1])}d&&c(u[s],"sham",!0)}},904:function(e,t,n){"use strict";var o=n(89999),r=n(39570),a=n(74271);e.exports=function i(e,t,n,c,l,u,d,s){for(var p,m=l,f=0,h=!!d&&a(d,s,3);f<c;){if(f in n){if(p=h?h(n[f],f,t):n[f],u>0&&o(p))m=i(e,t,p,r(p.length),m,u-1)-1;else{if(m>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[m]=p}m++}f++}return m}},7056:function(e,t,n){"use strict";var o=n(69691);e.exports=!o((function(){return Object.isExtensible(Object.preventExtensions({}))}))},74271:function(e,t,n){"use strict";var o=n(83923);e.exports=function(e,t,n){if(o(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,o){return e.call(t,n,o)};case 3:return function(n,o,r){return e.call(t,n,o,r)}}return function(){return e.apply(t,arguments)}}},68719:function(e,t,n){"use strict";var o=n(83923),r=n(35611),a=[].slice,i={};e.exports=Function.bind||function(e){var t=o(this),n=a.call(arguments,1),c=function(){var o=n.concat(a.call(arguments));return this instanceof c?function(e,t,n){if(!(t in i)){for(var o=[],r=0;r<t;r++)o[r]="a["+r+"]";i[t]=Function("C,a","return new C("+o.join(",")+")")}return i[t](e,n)}(t,o.length,o):t.apply(e,o)};return r(t.prototype)&&(c.prototype=t.prototype),c}},69808:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){return arguments.length<2?"function"==typeof(n=o[e])?n:undefined:o[e]&&o[e][t];var n}},3170:function(e,t,n){"use strict";var o=n(47953),r=n(82723),a=n(17657)("iterator");e.exports=function(e){if(e!=undefined)return e[a]||e["@@iterator"]||r[o(e)]}},55444:function(e,t,n){"use strict";var o=n(12104),r=Math.floor,a="".replace,i=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,c=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,l,u,d){var s=n+e.length,p=l.length,m=c;return u!==undefined&&(u=o(u),m=i),a.call(d,m,(function(o,a){var i;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(s);case"<":i=u[a.slice(1,-1)];break;default:var c=+a;if(0===c)return o;if(c>p){var d=r(c/10);return 0===d?o:d<=p?l[d-1]===undefined?a.charAt(1):l[d-1]+a.charAt(1):o}i=l[c-1]}return i===undefined?"":i}))}},84253:function(e,t,n){"use strict";var o=function(e){return e&&e.Math==Math&&e};e.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},28919:function(e,t,n){"use strict";var o=n(12104),r={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return r.call(o(e),t)}},90311:function(e){"use strict";e.exports={}},21419:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){var n=o.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},2369:function(e,t,n){"use strict";var o=n(69808);e.exports=o("document","documentElement")},78251:function(e,t,n){"use strict";var o=n(75592),r=n(69691),a=n(21477);e.exports=!o&&!r((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},16567:function(e){"use strict";var t=Math.abs,n=Math.pow,o=Math.floor,r=Math.log,a=Math.LN2;e.exports={pack:function(e,i,c){var l,u,d,s=new Array(c),p=8*c-i-1,m=(1<<p)-1,f=m>>1,h=23===i?n(2,-24)-n(2,-77):0,C=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===Infinity?(u=e!=e?1:0,l=m):(l=o(r(e)/a),e*(d=n(2,-l))<1&&(l--,d*=2),(e+=l+f>=1?h/d:h*n(2,1-f))*d>=2&&(l++,d/=2),l+f>=m?(u=0,l=m):l+f>=1?(u=(e*d-1)*n(2,i),l+=f):(u=e*n(2,f-1)*n(2,i),l=0));i>=8;s[g++]=255&u,u/=256,i-=8);for(l=l<<i|u,p+=i;p>0;s[g++]=255&l,l/=256,p-=8);return s[--g]|=128*C,s},unpack:function(e,t){var o,r=e.length,a=8*r-t-1,i=(1<<a)-1,c=i>>1,l=a-7,u=r-1,d=e[u--],s=127&d;for(d>>=7;l>0;s=256*s+e[u],u--,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=t;l>0;o=256*o+e[u],u--,l-=8);if(0===s)s=1-c;else{if(s===i)return o?NaN:d?-Infinity:Infinity;o+=n(2,t),s-=c}return(d?-1:1)*o*n(2,s-t)}}},50990:function(e,t,n){"use strict";var o=n(69691),r=n(77e3),a="".split;e.exports=o((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?a.call(e,""):Object(e)}:Object},22285:function(e,t,n){"use strict";var o=n(35611),r=n(18444);e.exports=function(e,t,n){var a,i;return r&&"function"==typeof(a=t.constructor)&&a!==n&&o(i=a.prototype)&&i!==n.prototype&&r(e,i),e}},89853:function(e,t,n){"use strict";var o=n(55935),r=Function.toString;"function"!=typeof o.inspectSource&&(o.inspectSource=function(e){return r.call(e)}),e.exports=o.inspectSource},40421:function(e,t,n){"use strict";var o=n(56174),r=n(90311),a=n(35611),i=n(28919),c=n(74217).f,l=n(78870),u=n(59995),d=n(41080),s=n(7056),p=!1,m=d("meta"),f=0,h=Object.isExtensible||function(){return!0},C=function(e){c(e,m,{value:{objectID:"O"+f++,weakData:{}}})},g=e.exports={enable:function(){g.enable=function(){},p=!0;var e=l.f,t=[].splice,n={};n[m]=1,e(n).length&&(l.f=function(n){for(var o=e(n),r=0,a=o.length;r<a;r++)if(o[r]===m){t.call(o,r,1);break}return o},o({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,m)){if(!h(e))return"F";if(!t)return"E";C(e)}return e[m].objectID},getWeakData:function(e,t){if(!i(e,m)){if(!h(e))return!0;if(!t)return!1;C(e)}return e[m].weakData},onFreeze:function(e){return s&&p&&h(e)&&!i(e,m)&&C(e),e}};r[m]=!0},79947:function(e,t,n){"use strict";var o,r,a,i=n(82911),c=n(84253),l=n(35611),u=n(52188),d=n(28919),s=n(55935),p=n(85152),m=n(90311),f="Object already initialized",h=c.WeakMap;if(i||s.state){var C=s.state||(s.state=new h),g=C.get,N=C.has,v=C.set;o=function(e,t){if(N.call(C,e))throw new TypeError(f);return t.facade=e,v.call(C,e,t),t},r=function(e){return g.call(C,e)||{}},a=function(e){return N.call(C,e)}}else{var b=p("state");m[b]=!0,o=function(e,t){if(d(e,b))throw new TypeError(f);return t.facade=e,u(e,b,t),t},r=function(e){return d(e,b)?e[b]:{}},a=function(e){return d(e,b)}}e.exports={set:o,get:r,has:a,enforce:function(e){return a(e)?r(e):o(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},14195:function(e,t,n){"use strict";var o=n(17657),r=n(82723),a=o("iterator"),i=Array.prototype;e.exports=function(e){return e!==undefined&&(r.Array===e||i[a]===e)}},89999:function(e,t,n){"use strict";var o=n(77e3);e.exports=Array.isArray||function(e){return"Array"==o(e)}},41441:function(e,t,n){"use strict";var o=n(69691),r=/#|\.prototype\./,a=function(e,t){var n=c[i(e)];return n==u||n!=l&&("function"==typeof t?o(t):!!t)},i=a.normalize=function(e){return String(e).replace(r,".").toLowerCase()},c=a.data={},l=a.NATIVE="N",u=a.POLYFILL="P";e.exports=a},93624:function(e,t,n){"use strict";var o=n(35611),r=Math.floor;e.exports=function(e){return!o(e)&&isFinite(e)&&r(e)===e}},35611:function(e){"use strict";e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1986:function(e){"use strict";e.exports=!1},86133:function(e,t,n){"use strict";var o=n(35611),r=n(77e3),a=n(17657)("match");e.exports=function(e){var t;return o(e)&&((t=e[a])!==undefined?!!t:"RegExp"==r(e))}},78253:function(e,t,n){"use strict";var o=n(69808),r=n(40647);e.exports=r?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return"function"==typeof t&&Object(e)instanceof t}},56342:function(e,t,n){"use strict";var o=n(63518),r=n(14195),a=n(39570),i=n(74271),c=n(3170),l=n(61781),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var d,s,p,m,f,h,C,g=n&&n.that,N=!(!n||!n.AS_ENTRIES),v=!(!n||!n.IS_ITERATOR),b=!(!n||!n.INTERRUPTED),V=i(t,g,1+N+b),y=function(e){return d&&l(d),new u(!0,e)},x=function(e){return N?(o(e),b?V(e[0],e[1],y):V(e[0],e[1])):b?V(e,y):V(e)};if(v)d=e;else{if("function"!=typeof(s=c(e)))throw TypeError("Target is not iterable");if(r(s)){for(p=0,m=a(e.length);m>p;p++)if((f=x(e[p]))&&f instanceof u)return f;return new u(!1)}d=s.call(e)}for(h=d.next;!(C=h.call(d)).done;){try{f=x(C.value)}catch(k){throw l(d),k}if("object"==typeof f&&f&&f instanceof u)return f}return new u(!1)}},61781:function(e,t,n){"use strict";var o=n(63518);e.exports=function(e){var t=e["return"];if(t!==undefined)return o(t.call(e)).value}},39881:function(e,t,n){"use strict";var o,r,a,i=n(69691),c=n(6863),l=n(52188),u=n(28919),d=n(17657),s=n(1986),p=d("iterator"),m=!1;[].keys&&("next"in(a=[].keys())?(r=c(c(a)))!==Object.prototype&&(o=r):m=!0);var f=o==undefined||i((function(){var e={};return o[p].call(e)!==e}));f&&(o={}),s&&!f||u(o,p)||l(o,p,(function(){return this})),e.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:m}},82723:function(e){"use strict";e.exports={}},19997:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:n(e)-1}:t},43334:function(e,t,n){"use strict";var o=n(24305),r=Math.abs,a=Math.pow,i=a(2,-52),c=a(2,-23),l=a(2,127)*(2-c),u=a(2,-126);e.exports=Math.fround||function(e){var t,n,a=r(e),d=o(e);return a<u?d*(a/u/c+1/i-1/i)*u*c:(n=(t=(1+c/i)*a)-(t-a))>l||n!=n?d*Infinity:d*n}},83659:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:t(1+e)}},24305:function(e){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},80909:function(e,t,n){"use strict";var o,r,a,i,c,l,u,d,s=n(84253),p=n(22245).f,m=n(33453).set,f=n(24542),h=n(20037),C=n(47501),g=n(41488),N=s.MutationObserver||s.WebKitMutationObserver,v=s.document,b=s.process,V=s.Promise,y=p(s,"queueMicrotask"),x=y&&y.value;x||(o=function(){var e,t;for(g&&(e=b.domain)&&e.exit();r;){t=r.fn,r=r.next;try{t()}catch(n){throw r?i():a=undefined,n}}a=undefined,e&&e.enter()},f||g||C||!N||!v?!h&&V&&V.resolve?((u=V.resolve(undefined)).constructor=V,d=u.then,i=function(){d.call(u,o)}):i=g?function(){b.nextTick(o)}:function(){m.call(s,o)}:(c=!0,l=v.createTextNode(""),new N(o).observe(l,{characterData:!0}),i=function(){l.data=c=!c})),e.exports=x||function(e){var t={fn:e,next:undefined};a&&(a.next=t),r||(r=t,i()),a=t}},4302:function(e,t,n){"use strict";var o=n(84253);e.exports=o.Promise},54772:function(e,t,n){"use strict";var o=n(12338),r=n(69691);e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&o&&o<41}))},82911:function(e,t,n){"use strict";var o=n(84253),r=n(89853),a=o.WeakMap;e.exports="function"==typeof a&&/native code/.test(r(a))},82101:function(e,t,n){"use strict";var o=n(83923),r=function(e){var t,n;this.promise=new e((function(e,o){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)};e.exports.f=function(e){return new r(e)}},18774:function(e,t,n){"use strict";var o=n(86133);e.exports=function(e){if(o(e))throw TypeError("The method doesn't accept regular expressions");return e}},64630:function(e,t,n){"use strict";var o=n(84253).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&o(e)}},78025:function(e,t,n){"use strict";var o=n(84253),r=n(92082),a=n(84703).trim,i=n(65181),c=o.parseFloat,l=1/c(i+"-0")!=-Infinity;e.exports=l?function(e){var t=a(r(e)),n=c(t);return 0===n&&"-"==t.charAt(0)?-0:n}:c},55092:function(e,t,n){"use strict";var o=n(84253),r=n(92082),a=n(84703).trim,i=n(65181),c=o.parseInt,l=/^[+-]?0[Xx]/,u=8!==c(i+"08")||22!==c(i+"0x16");e.exports=u?function(e,t){var n=a(r(e));return c(n,t>>>0||(l.test(n)?16:10))}:c},64905:function(e,t,n){"use strict";var o=n(75592),r=n(69691),a=n(84547),i=n(21061),c=n(77659),l=n(12104),u=n(50990),d=Object.assign,s=Object.defineProperty;e.exports=!d||r((function(){if(o&&1!==d({b:1},d(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=d({},e)[n]||a(d({},t)).join("")!=r}))?function(e,t){for(var n=l(e),r=arguments.length,d=1,s=i.f,p=c.f;r>d;)for(var m,f=u(arguments[d++]),h=s?a(f).concat(s(f)):a(f),C=h.length,g=0;C>g;)m=h[g++],o&&!p.call(f,m)||(n[m]=f[m]);return n}:d},83681:function(e,t,n){"use strict";var o,r=n(63518),a=n(91543),i=n(23344),c=n(90311),l=n(2369),u=n(21477),d=n(85152),s="prototype",p="script",m=d("IE_PROTO"),f=function(){},h=function(e){return"<"+p+">"+e+"</"+p+">"},C=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{o=new ActiveXObject("htmlfile")}catch(t){}g=document.domain&&o?C(o):function(){var e,t=u("iframe"),n="java"+p+":";if(t.style)return t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F}()||C(o);for(var e=i.length;e--;)delete g[s][i[e]];return g()};c[m]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f[s]=r(e),n=new f,f[s]=null,n[m]=e):n=g(),t===undefined?n:a(n,t)}},91543:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(63518),i=n(84547);e.exports=o?Object.defineProperties:function(e,t){a(e);for(var n,o=i(t),c=o.length,l=0;c>l;)r.f(e,n=o[l++],t[n]);return e}},74217:function(e,t,n){"use strict";var o=n(75592),r=n(78251),a=n(63518),i=n(14613),c=Object.defineProperty;t.f=o?c:function(e,t,n){if(a(e),t=i(t),a(n),r)try{return c(e,t,n)}catch(o){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},22245:function(e,t,n){"use strict";var o=n(75592),r=n(77659),a=n(39160),i=n(26553),c=n(14613),l=n(28919),u=n(78251),d=Object.getOwnPropertyDescriptor;t.f=o?d:function(e,t){if(e=i(e),t=c(t),u)try{return d(e,t)}catch(n){}if(l(e,t))return a(!r.f.call(e,t),e[t])}},59995:function(e,t,n){"use strict";var o=n(26553),r=n(78870).f,a={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&"[object Window]"==a.call(e)?function(e){try{return r(e)}catch(t){return i.slice()}}(e):r(o(e))}},78870:function(e,t,n){"use strict";var o=n(3613),r=n(23344).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return o(e,r)}},21061:function(e,t){"use strict";t.f=Object.getOwnPropertySymbols},6863:function(e,t,n){"use strict";var o=n(28919),r=n(12104),a=n(85152),i=n(28954),c=a("IE_PROTO"),l=Object.prototype;e.exports=i?Object.getPrototypeOf:function(e){return e=r(e),o(e,c)?e[c]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},3613:function(e,t,n){"use strict";var o=n(28919),r=n(26553),a=n(25945).indexOf,i=n(90311);e.exports=function(e,t){var n,c=r(e),l=0,u=[];for(n in c)!o(i,n)&&o(c,n)&&u.push(n);for(;t.length>l;)o(c,n=t[l++])&&(~a(u,n)||u.push(n));return u}},84547:function(e,t,n){"use strict";var o=n(3613),r=n(23344);e.exports=Object.keys||function(e){return o(e,r)}},77659:function(e,t){"use strict";var n={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,r=o&&!n.call({1:2},1);t.f=r?function(e){var t=o(this,e);return!!t&&t.enumerable}:n},47339:function(e,t,n){"use strict";var o=n(1986),r=n(84253),a=n(69691),i=n(12200);e.exports=o||!a((function(){if(!(i&&i<535)){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}}))},18444:function(e,t,n){"use strict";var o=n(63518),r=n(1372);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(a){}return function(n,a){return o(n),r(a),t?e.call(n,a):n.__proto__=a,n}}():undefined)},3e4:function(e,t,n){"use strict";var o=n(75592),r=n(84547),a=n(26553),i=n(77659).f,c=function(e){return function(t){for(var n,c=a(t),l=r(c),u=l.length,d=0,s=[];u>d;)n=l[d++],o&&!i.call(c,n)||s.push(e?[n,c[n]]:c[n]);return s}};e.exports={entries:c(!0),values:c(!1)}},13966:function(e,t,n){"use strict";var o=n(64910),r=n(47953);e.exports=o?{}.toString:function(){return"[object "+r(this)+"]"}},28734:function(e,t,n){"use strict";var o=n(35611);e.exports=function(e,t){var n,r;if("string"===t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if("string"!==t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},28482:function(e,t,n){"use strict";var o=n(69808),r=n(78870),a=n(21061),i=n(63518);e.exports=o("Reflect","ownKeys")||function(e){var t=r.f(i(e)),n=a.f;return n?t.concat(n(e)):t}},65781:function(e,t,n){"use strict";var o=n(84253);e.exports=o},47673:function(e){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},48141:function(e,t,n){"use strict";var o=n(63518),r=n(35611),a=n(82101);e.exports=function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},3993:function(e,t,n){"use strict";var o=n(11807);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},11807:function(e,t,n){"use strict";var o=n(84253),r=n(52188),a=n(28919),i=n(30889),c=n(89853),l=n(79947),u=l.get,d=l.enforce,s=String(String).split("String");(e.exports=function(e,t,n,c){var l,u=!!c&&!!c.unsafe,p=!!c&&!!c.enumerable,m=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof t||a(n,"name")||r(n,"name",t),(l=d(n)).source||(l.source=s.join("string"==typeof t?t:""))),e!==o?(u?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:r(e,t,n)):p?e[t]=n:i(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||c(this)}))},5641:function(e,t,n){"use strict";var o=n(77e3),r=n(71841);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var a=n.call(e,t);if("object"!=typeof a)throw TypeError("RegExp exec method returned something other than an Object or null");return a}if("RegExp"!==o(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},71841:function(e,t,n){"use strict";var o,r,a=n(92082),i=n(5105),c=n(1864),l=n(27364),u=n(83681),d=n(79947).get,s=n(8368),p=n(2229),m=RegExp.prototype.exec,f=l("native-string-replace",String.prototype.replace),h=m,C=(o=/a/,r=/b*/g,m.call(o,"a"),m.call(r,"a"),0!==o.lastIndex||0!==r.lastIndex),g=c.UNSUPPORTED_Y||c.BROKEN_CARET,N=/()??/.exec("")[1]!==undefined;(C||N||g||s||p)&&(h=function(e){var t,n,o,r,c,l,s,p=this,v=d(p),b=a(e),V=v.raw;if(V)return V.lastIndex=p.lastIndex,t=h.call(V,b),p.lastIndex=V.lastIndex,t;var y=v.groups,x=g&&p.sticky,k=i.call(p),S=p.source,I=0,w=b;if(x&&(-1===(k=k.replace("y","")).indexOf("g")&&(k+="g"),w=b.slice(p.lastIndex),p.lastIndex>0&&(!p.multiline||p.multiline&&"\n"!==b.charAt(p.lastIndex-1))&&(S="(?: "+S+")",w=" "+w,I++),n=new RegExp("^(?:"+S+")",k)),N&&(n=new RegExp("^"+S+"$(?!\\s)",k)),C&&(o=p.lastIndex),r=m.call(x?n:p,w),x?r?(r.input=r.input.slice(I),r[0]=r[0].slice(I),r.index=p.lastIndex,p.lastIndex+=r[0].length):p.lastIndex=0:C&&r&&(p.lastIndex=p.global?r.index+r[0].length:o),N&&r&&r.length>1&&f.call(r[0],n,(function(){for(c=1;c<arguments.length-2;c++)arguments[c]===undefined&&(r[c]=undefined)})),r&&y)for(r.groups=l=u(null),c=0;c<y.length;c++)l[(s=y[c])[0]]=r[s[1]];return r}),e.exports=h},5105:function(e,t,n){"use strict";var o=n(63518);e.exports=function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},1864:function(e,t,n){"use strict";var o=n(69691),r=function(e,t){return RegExp(e,t)};t.UNSUPPORTED_Y=o((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=o((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},8368:function(e,t,n){"use strict";var o=n(69691);e.exports=o((function(){var e=RegExp(".","string".charAt(0));return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},2229:function(e,t,n){"use strict";var o=n(69691);e.exports=o((function(){var e=RegExp("(?<a>b)","string".charAt(5));return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},44184:function(e){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},61398:function(e){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},30889:function(e,t,n){"use strict";var o=n(84253);e.exports=function(e,t){try{Object.defineProperty(o,e,{value:t,configurable:!0,writable:!0})}catch(n){o[e]=t}return t}},64157:function(e,t,n){"use strict";var o=n(69808),r=n(74217),a=n(17657),i=n(75592),c=a("species");e.exports=function(e){var t=o(e),n=r.f;i&&t&&!t[c]&&n(t,c,{configurable:!0,get:function(){return this}})}},29108:function(e,t,n){"use strict";var o=n(74217).f,r=n(28919),a=n(17657)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,a)&&o(e,a,{configurable:!0,value:t})}},85152:function(e,t,n){"use strict";var o=n(27364),r=n(41080),a=o("keys");e.exports=function(e){return a[e]||(a[e]=r(e))}},55935:function(e,t,n){"use strict";var o=n(84253),r=n(30889),a="__core-js_shared__",i=o[a]||r(a,{});e.exports=i},27364:function(e,t,n){"use strict";var o=n(1986),r=n(55935);(e.exports=function(e,t){return r[e]||(r[e]=t!==undefined?t:{})})("versions",[]).push({version:"3.16.1",mode:o?"pure":"global",copyright:"\xa9 2021 Denis Pushkarev (zloirock.ru)"})},24345:function(e,t,n){"use strict";var o=n(63518),r=n(83923),a=n(17657)("species");e.exports=function(e,t){var n,i=o(e).constructor;return i===undefined||(n=o(i)[a])==undefined?t:r(n)}},26096:function(e,t,n){"use strict";var o=n(69691);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},37015:function(e,t,n){"use strict";var o=n(3997),r=n(92082),a=n(44184),i=function(e){return function(t,n){var i,c,l=r(a(t)),u=o(n),d=l.length;return u<0||u>=d?e?"":undefined:(i=l.charCodeAt(u))<55296||i>56319||u+1===d||(c=l.charCodeAt(u+1))<56320||c>57343?e?l.charAt(u):i:e?l.slice(u,u+2):c-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},43331:function(e,t,n){"use strict";var o=n(72319);e.exports=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(o)},47497:function(e,t,n){"use strict";var o=n(39570),r=n(92082),a=n(9811),i=n(44184),c=Math.ceil,l=function(e){return function(t,n,l){var u,d,s=r(i(t)),p=s.length,m=l===undefined?" ":r(l),f=o(n);return f<=p||""==m?s:(u=f-p,(d=a.call(m,c(u/m.length))).length>u&&(d=d.slice(0,u)),e?s+d:d+s)}};e.exports={start:l(!1),end:l(!0)}},9811:function(e,t,n){"use strict";var o=n(3997),r=n(92082),a=n(44184);e.exports=function(e){var t=r(a(this)),n="",i=o(e);if(i<0||i==Infinity)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},3035:function(e,t,n){"use strict";var o=n(69691),r=n(65181);e.exports=function(e){return o((function(){return!!r[e]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[e]()||r[e].name!==e}))}},84703:function(e,t,n){"use strict";var o=n(44184),r=n(92082),a="["+n(65181)+"]",i=RegExp("^"+a+a+"*"),c=RegExp(a+a+"*$"),l=function(e){return function(t){var n=r(o(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(c,"")),n}};e.exports={start:l(1),end:l(2),trim:l(3)}},33453:function(e,t,n){"use strict";var o,r,a,i,c=n(84253),l=n(69691),u=n(74271),d=n(2369),s=n(21477),p=n(24542),m=n(41488),f=c.setImmediate,h=c.clearImmediate,C=c.process,g=c.MessageChannel,N=c.Dispatch,v=0,b={},V="onreadystatechange";try{o=c.location}catch(I){}var y=function(e){if(b.hasOwnProperty(e)){var t=b[e];delete b[e],t()}},x=function(e){return function(){y(e)}},k=function(e){y(e.data)},S=function(e){c.postMessage(String(e),o.protocol+"//"+o.host)};f&&h||(f=function(e){for(var t=[],n=arguments.length,o=1;n>o;)t.push(arguments[o++]);return b[++v]=function(){("function"==typeof e?e:Function(e)).apply(undefined,t)},r(v),v},h=function(e){delete b[e]},m?r=function(e){C.nextTick(x(e))}:N&&N.now?r=function(e){N.now(x(e))}:g&&!p?(i=(a=new g).port2,a.port1.onmessage=k,r=u(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts&&o&&"file:"!==o.protocol&&!l(S)?(r=S,c.addEventListener("message",k,!1)):r=V in s("script")?function(e){d.appendChild(s("script"))[V]=function(){d.removeChild(this),y(e)}}:function(e){setTimeout(x(e),0)}),e.exports={set:f,clear:h}},81687:function(e,t,n){"use strict";var o=n(77e3);e.exports=function(e){if("number"!=typeof e&&"Number"!=o(e))throw TypeError("Incorrect invocation");return+e}},55205:function(e,t,n){"use strict";var o=n(3997),r=Math.max,a=Math.min;e.exports=function(e,t){var n=o(e);return n<0?r(n+t,0):a(n,t)}},77559:function(e,t,n){"use strict";var o=n(3997),r=n(39570);e.exports=function(e){if(e===undefined)return 0;var t=o(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},26553:function(e,t,n){"use strict";var o=n(50990),r=n(44184);e.exports=function(e){return o(r(e))}},3997:function(e){"use strict";var t=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:t)(e)}},39570:function(e,t,n){"use strict";var o=n(3997),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},12104:function(e,t,n){"use strict";var o=n(44184);e.exports=function(e){return Object(o(e))}},95740:function(e,t,n){"use strict";var o=n(80425);e.exports=function(e,t){var n=o(e);if(n%t)throw RangeError("Wrong offset");return n}},80425:function(e,t,n){"use strict";var o=n(3997);e.exports=function(e){var t=o(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},94673:function(e,t,n){"use strict";var o=n(35611),r=n(78253),a=n(28734),i=n(17657)("toPrimitive");e.exports=function(e,t){if(!o(e)||r(e))return e;var n,c=e[i];if(c!==undefined){if(t===undefined&&(t="default"),n=c.call(e,t),!o(n)||r(n))return n;throw TypeError("Can't convert object to primitive value")}return t===undefined&&(t="number"),a(e,t)}},14613:function(e,t,n){"use strict";var o=n(94673),r=n(78253);e.exports=function(e){var t=o(e,"string");return r(t)?t:String(t)}},64910:function(e,t,n){"use strict";var o={};o[n(17657)("toStringTag")]="z",e.exports="[object z]"===String(o)},92082:function(e,t,n){"use strict";var o=n(78253);e.exports=function(e){if(o(e))throw TypeError("Cannot convert a Symbol value to a string");return String(e)}},17576:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(75592),i=n(29023),c=n(19216),l=n(80246),u=n(50997),d=n(39160),s=n(52188),p=n(93624),m=n(39570),f=n(77559),h=n(95740),C=n(14613),g=n(28919),N=n(47953),v=n(35611),b=n(78253),V=n(83681),y=n(18444),x=n(78870).f,k=n(76182),S=n(69033).forEach,I=n(64157),w=n(74217),_=n(22245),D=n(79947),M=n(22285),B=D.get,A=D.set,T=w.f,L=_.f,E=Math.round,P=r.RangeError,j=l.ArrayBuffer,O=l.DataView,F=c.NATIVE_ARRAY_BUFFER_VIEWS,R=c.TYPED_ARRAY_CONSTRUCTOR,z=c.TYPED_ARRAY_TAG,W=c.TypedArray,U=c.TypedArrayPrototype,H=c.aTypedArrayConstructor,G=c.isTypedArray,Y="BYTES_PER_ELEMENT",Z="Wrong length",K=function(e,t){for(var n=0,o=t.length,r=new(H(e))(o);o>n;)r[n]=t[n++];return r},Q=function(e,t){T(e,t,{get:function(){return B(this)[t]}})},$=function(e){var t;return e instanceof j||"ArrayBuffer"==(t=N(e))||"SharedArrayBuffer"==t},J=function(e,t){return G(e)&&!b(t)&&t in e&&p(+t)&&t>=0},X=function(e,t){return t=C(t),J(e,t)?d(2,e[t]):L(e,t)},q=function(e,t,n){return t=C(t),!(J(e,t)&&v(n)&&g(n,"value"))||g(n,"get")||g(n,"set")||n.configurable||g(n,"writable")&&!n.writable||g(n,"enumerable")&&!n.enumerable?T(e,t,n):(e[t]=n.value,e)};a?(F||(_.f=X,w.f=q,Q(U,"buffer"),Q(U,"byteOffset"),Q(U,"byteLength"),Q(U,"length")),o({target:"Object",stat:!0,forced:!F},{getOwnPropertyDescriptor:X,defineProperty:q}),e.exports=function(e,t,n){var a=e.match(/\d+$/)[0]/8,c=e+(n?"Clamped":"")+"Array",l="get"+e,d="set"+e,p=r[c],C=p,g=C&&C.prototype,N={},b=function(e,t){T(e,t,{get:function(){return function(e,t){var n=B(e);return n.view[l](t*a+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,o){var r=B(e);n&&(o=(o=E(o))<0?0:o>255?255:255&o),r.view[d](t*a+r.byteOffset,o,!0)}(this,t,e)},enumerable:!0})};F?i&&(C=t((function(e,t,n,o){return u(e,C,c),M(v(t)?$(t)?o!==undefined?new p(t,h(n,a),o):n!==undefined?new p(t,h(n,a)):new p(t):G(t)?K(C,t):k.call(C,t):new p(f(t)),e,C)})),y&&y(C,W),S(x(p),(function(e){e in C||s(C,e,p[e])})),C.prototype=g):(C=t((function(e,t,n,o){u(e,C,c);var r,i,l,d=0,s=0;if(v(t)){if(!$(t))return G(t)?K(C,t):k.call(C,t);r=t,s=h(n,a);var p=t.byteLength;if(o===undefined){if(p%a)throw P(Z);if((i=p-s)<0)throw P(Z)}else if((i=m(o)*a)+s>p)throw P(Z);l=i/a}else l=f(t),r=new j(i=l*a);for(A(e,{buffer:r,byteOffset:s,byteLength:i,length:l,view:new O(r)});d<l;)b(e,d++)})),y&&y(C,W),g=C.prototype=V(U)),g.constructor!==C&&s(g,"constructor",C),s(g,R,C),z&&s(g,z,c),N[c]=C,o({global:!0,forced:C!=p,sham:!F},N),Y in C||s(C,Y,a),Y in g||s(g,Y,a),I(c)}):e.exports=function(){}},29023:function(e,t,n){"use strict";var o=n(84253),r=n(69691),a=n(68762),i=n(19216).NATIVE_ARRAY_BUFFER_VIEWS,c=o.ArrayBuffer,l=o.Int8Array;e.exports=!i||!r((function(){l(1)}))||!r((function(){new l(-1)}))||!a((function(e){new l,new l(null),new l(1.5),new l(e)}),!0)||r((function(){return 1!==new l(new c(2),1,undefined).length}))},16688:function(e,t,n){"use strict";var o=n(11955),r=n(25198);e.exports=function(e,t){return o(r(e),t)}},76182:function(e,t,n){"use strict";var o=n(12104),r=n(39570),a=n(3170),i=n(14195),c=n(74271),l=n(19216).aTypedArrayConstructor;e.exports=function(e){var t,n,u,d,s,p,m=o(e),f=arguments.length,h=f>1?arguments[1]:undefined,C=h!==undefined,g=a(m);if(g!=undefined&&!i(g))for(p=(s=g.call(m)).next,m=[];!(d=p.call(s)).done;)m.push(d.value);for(C&&f>2&&(h=c(h,arguments[2],2)),n=r(m.length),u=new(l(this))(n),t=0;n>t;t++)u[t]=C?h(m[t],t):m[t];return u}},25198:function(e,t,n){"use strict";var o=n(19216),r=n(24345),a=o.TYPED_ARRAY_CONSTRUCTOR,i=o.aTypedArrayConstructor;e.exports=function(e){return i(r(e,e[a]))}},41080:function(e){"use strict";var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(e===undefined?"":e)+")_"+(++t+n).toString(36)}},40647:function(e,t,n){"use strict";var o=n(54772);e.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3444:function(e,t,n){"use strict";var o=n(17657);t.f=o},17657:function(e,t,n){"use strict";var o=n(84253),r=n(27364),a=n(28919),i=n(41080),c=n(54772),l=n(40647),u=r("wks"),d=o.Symbol,s=l?d:d&&d.withoutSetter||i;e.exports=function(e){return a(u,e)&&(c||"string"==typeof u[e])||(c&&a(d,e)?u[e]=d[e]:u[e]=s("Symbol."+e)),u[e]}},65181:function(e){"use strict";e.exports="\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},15196:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(80246),i=n(64157),c="ArrayBuffer",l=a[c];o({global:!0,forced:r[c]!==l},{ArrayBuffer:l}),i(c)},95993:function(e,t,n){"use strict";var o=n(56174),r=n(19216);o({target:"ArrayBuffer",stat:!0,forced:!r.NATIVE_ARRAY_BUFFER_VIEWS},{isView:r.isView})},25079:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(80246),i=n(63518),c=n(55205),l=n(39570),u=n(24345),d=a.ArrayBuffer,s=a.DataView,p=d.prototype.slice;o({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:r((function(){return!new d(2).slice(1,undefined).byteLength}))},{slice:function(e,t){if(p!==undefined&&t===undefined)return p.call(i(this),e);for(var n=i(this).byteLength,o=c(e,n),r=c(t===undefined?n:t,n),a=new(u(this,d))(l(r-o)),m=new s(this),f=new s(a),h=0;o<r;)f.setUint8(h++,m.getUint8(o++));return a}})},24835:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(89999),i=n(35611),c=n(12104),l=n(39570),u=n(39241),d=n(77454),s=n(93537),p=n(17657),m=n(12338),f=p("isConcatSpreadable"),h=9007199254740991,C="Maximum allowed index exceeded",g=m>=51||!r((function(){var e=[];return e[f]=!1,e.concat()[0]!==e})),N=s("concat"),v=function(e){if(!i(e))return!1;var t=e[f];return t!==undefined?!!t:a(e)};o({target:"Array",proto:!0,forced:!g||!N},{concat:function(e){var t,n,o,r,a,i=c(this),s=d(i,0),p=0;for(t=-1,o=arguments.length;t<o;t++)if(v(a=-1===t?i:arguments[t])){if(p+(r=l(a.length))>h)throw TypeError(C);for(n=0;n<r;n++,p++)n in a&&u(s,p,a[n])}else{if(p>=h)throw TypeError(C);u(s,p++,a)}return s.length=p,s}})},14653:function(e,t,n){"use strict";var o=n(56174),r=n(59571),a=n(36910);o({target:"Array",proto:!0},{copyWithin:r}),a("copyWithin")},58139:function(e,t,n){"use strict";var o=n(56174),r=n(69033).every;o({target:"Array",proto:!0,forced:!n(37902)("every")},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},34049:function(e,t,n){"use strict";var o=n(56174),r=n(22051),a=n(36910);o({target:"Array",proto:!0},{fill:r}),a("fill")},38356:function(e,t,n){"use strict";var o=n(56174),r=n(69033).filter;o({target:"Array",proto:!0,forced:!n(93537)("filter")},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},31699:function(e,t,n){"use strict";var o=n(56174),r=n(69033).findIndex,a=n(36910),i="findIndex",c=!0;i in[]&&Array(1)[i]((function(){c=!1})),o({target:"Array",proto:!0,forced:c},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a(i)},72494:function(e,t,n){"use strict";var o=n(56174),r=n(69033).find,a=n(36910),i="find",c=!0;i in[]&&Array(1)[i]((function(){c=!1})),o({target:"Array",proto:!0,forced:c},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a(i)},81520:function(e,t,n){"use strict";var o=n(56174),r=n(904),a=n(12104),i=n(39570),c=n(83923),l=n(77454);o({target:"Array",proto:!0},{flatMap:function(e){var t,n=a(this),o=i(n.length);return c(e),(t=l(n,0)).length=r(t,n,n,o,0,1,e,arguments.length>1?arguments[1]:undefined),t}})},3263:function(e,t,n){"use strict";var o=n(56174),r=n(904),a=n(12104),i=n(39570),c=n(3997),l=n(77454);o({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:undefined,t=a(this),n=i(t.length),o=l(t,0);return o.length=r(o,t,t,n,0,e===undefined?1:c(e)),o}})},80036:function(e,t,n){"use strict";var o=n(56174),r=n(90369);o({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},60515:function(e,t,n){"use strict";var o=n(56174),r=n(28213);o({target:"Array",stat:!0,forced:!n(68762)((function(e){Array.from(e)}))},{from:r})},94330:function(e,t,n){"use strict";var o=n(56174),r=n(25945).includes,a=n(36910);o({target:"Array",proto:!0},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}}),a("includes")},96553:function(e,t,n){"use strict";var o=n(56174),r=n(25945).indexOf,a=n(37902),i=[].indexOf,c=!!i&&1/[1].indexOf(1,-0)<0,l=a("indexOf");o({target:"Array",proto:!0,forced:c||!l},{indexOf:function(e){return c?i.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:undefined)}})},99139:function(e,t,n){"use strict";n(56174)({target:"Array",stat:!0},{isArray:n(89999)})},98215:function(e,t,n){"use strict";var o=n(26553),r=n(36910),a=n(82723),i=n(79947),c=n(71179),l="Array Iterator",u=i.set,d=i.getterFor(l);e.exports=c(Array,"Array",(function(e,t){u(this,{type:l,target:o(e),index:0,kind:t})}),(function(){var e=d(this),t=e.target,n=e.kind,o=e.index++;return!t||o>=t.length?(e.target=undefined,{value:undefined,done:!0}):"keys"==n?{value:o,done:!1}:"values"==n?{value:t[o],done:!1}:{value:[o,t[o]],done:!1}}),"values"),a.Arguments=a.Array,r("keys"),r("values"),r("entries")},32617:function(e,t,n){"use strict";var o=n(56174),r=n(50990),a=n(26553),i=n(37902),c=[].join,l=r!=Object,u=i("join",",");o({target:"Array",proto:!0,forced:l||!u},{join:function(e){return c.call(a(this),e===undefined?",":e)}})},80186:function(e,t,n){"use strict";var o=n(56174),r=n(41183);o({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},31149:function(e,t,n){"use strict";var o=n(56174),r=n(69033).map;o({target:"Array",proto:!0,forced:!n(93537)("map")},{map:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},71827:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(39241);o({target:"Array",stat:!0,forced:r((function(){function e(){}return!(Array.of.call(e)instanceof e)}))},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)a(n,e,arguments[e++]);return n.length=t,n}})},32099:function(e,t,n){"use strict";var o=n(56174),r=n(28249).right,a=n(37902),i=n(12338),c=n(41488);o({target:"Array",proto:!0,forced:!a("reduceRight")||!c&&i>79&&i<83},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},79770:function(e,t,n){"use strict";var o=n(56174),r=n(28249).left,a=n(37902),i=n(12338),c=n(41488);o({target:"Array",proto:!0,forced:!a("reduce")||!c&&i>79&&i<83},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},72667:function(e,t,n){"use strict";var o=n(56174),r=n(89999),a=[].reverse,i=[1,2];o({target:"Array",proto:!0,forced:String(i)===String(i.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),a.call(this)}})},94920:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(89999),i=n(55205),c=n(39570),l=n(26553),u=n(39241),d=n(17657),s=n(93537)("slice"),p=d("species"),m=[].slice,f=Math.max;o({target:"Array",proto:!0,forced:!s},{slice:function(e,t){var n,o,d,s=l(this),h=c(s.length),C=i(e,h),g=i(t===undefined?h:t,h);if(a(s)&&("function"!=typeof(n=s.constructor)||n!==Array&&!a(n.prototype)?r(n)&&null===(n=n[p])&&(n=undefined):n=undefined,n===Array||n===undefined))return m.call(s,C,g);for(o=new(n===undefined?Array:n)(f(g-C,0)),d=0;C<g;C++,d++)C in s&&u(o,d,s[C]);return o.length=d,o}})},64683:function(e,t,n){"use strict";var o=n(56174),r=n(69033).some;o({target:"Array",proto:!0,forced:!n(37902)("some")},{some:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},26189:function(e,t,n){"use strict";var o=n(56174),r=n(83923),a=n(12104),i=n(39570),c=n(92082),l=n(69691),u=n(58737),d=n(37902),s=n(20967),p=n(85749),m=n(12338),f=n(12200),h=[],C=h.sort,g=l((function(){h.sort(undefined)})),N=l((function(){h.sort(null)})),v=d("sort"),b=!l((function(){if(m)return m<70;if(!(s&&s>3)){if(p)return!0;if(f)return f<603;var e,t,n,o,r="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(o=0;o<47;o++)h.push({k:t+o,v:n})}for(h.sort((function(e,t){return t.v-e.v})),o=0;o<h.length;o++)t=h[o].k.charAt(0),r.charAt(r.length-1)!==t&&(r+=t);return"DGBEFHACIJK"!==r}}));o({target:"Array",proto:!0,forced:g||!N||!v||!b},{sort:function(e){e!==undefined&&r(e);var t=a(this);if(b)return e===undefined?C.call(t):C.call(t,e);var n,o,l=[],d=i(t.length);for(o=0;o<d;o++)o in t&&l.push(t[o]);for(l=u(l,function(e){return function(t,n){return n===undefined?-1:t===undefined?1:e!==undefined?+e(t,n)||0:c(t)>c(n)?1:-1}}(e)),n=l.length,o=0;o<n;)t[o]=l[o++];for(;o<d;)delete t[o++];return t}})},41185:function(e,t,n){"use strict";n(64157)("Array")},51008:function(e,t,n){"use strict";var o=n(56174),r=n(55205),a=n(3997),i=n(39570),c=n(12104),l=n(77454),u=n(39241),d=n(93537)("splice"),s=Math.max,p=Math.min;o({target:"Array",proto:!0,forced:!d},{splice:function(e,t){var n,o,d,m,f,h,C=c(this),g=i(C.length),N=r(e,g),v=arguments.length;if(0===v?n=o=0:1===v?(n=0,o=g-N):(n=v-2,o=p(s(a(t),0),g-N)),g+n-o>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(d=l(C,o),m=0;m<o;m++)(f=N+m)in C&&u(d,m,C[f]);if(d.length=o,n<o){for(m=N;m<g-o;m++)h=m+n,(f=m+o)in C?C[h]=C[f]:delete C[h];for(m=g;m>g-o+n;m--)delete C[m-1]}else if(n>o)for(m=g-o;m>N;m--)h=m+n-1,(f=m+o-1)in C?C[h]=C[f]:delete C[h];for(m=0;m<n;m++)C[m+N]=arguments[m+2];return C.length=g-o+n,d}})},86e3:function(e,t,n){"use strict";n(36910)("flatMap")},47112:function(e,t,n){"use strict";n(36910)("flat")},87143:function(e,t,n){"use strict";var o=n(56174),r=n(80246);o({global:!0,forced:!n(32977)},{DataView:r.DataView})},72499:function(e,t,n){"use strict";n(56174)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},73676:function(e,t,n){"use strict";var o=n(56174),r=n(79873);o({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},76746:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(12104),i=n(94673);o({target:"Date",proto:!0,forced:r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=a(this),n=i(t,"number");return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},19:function(e,t,n){"use strict";var o=n(52188),r=n(57763),a=n(17657)("toPrimitive"),i=Date.prototype;a in i||o(i,a,r)},17038:function(e,t,n){"use strict";var o=n(11807),r=Date.prototype,a="Invalid Date",i="toString",c=r[i],l=r.getTime;String(new Date(NaN))!=a&&o(r,i,(function(){var e=l.call(this);return e==e?c.call(this):a}))},46360:function(e,t,n){"use strict";n(56174)({target:"Function",proto:!0},{bind:n(68719)})},16835:function(e,t,n){"use strict";var o=n(35611),r=n(74217),a=n(6863),i=n(17657)("hasInstance"),c=Function.prototype;i in c||r.f(c,i,{value:function(e){if("function"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=a(e);)if(this.prototype===e)return!0;return!1}})},96683:function(e,t,n){"use strict";var o=n(75592),r=n(74217).f,a=Function.prototype,i=a.toString,c=/^\s*function ([^ (]*)/,l="name";o&&!(l in a)&&r(a,l,{configurable:!0,get:function(){try{return i.call(this).match(c)[1]}catch(e){return""}}})},7756:function(e,t,n){"use strict";var o=n(84253);n(29108)(o.JSON,"JSON",!0)},21842:function(e,t,n){"use strict";var o=n(42006),r=n(74568);e.exports=o("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},1613:function(e,t,n){"use strict";var o=n(56174),r=n(83659),a=Math.acosh,i=Math.log,c=Math.sqrt,l=Math.LN2;o({target:"Math",stat:!0,forced:!a||710!=Math.floor(a(Number.MAX_VALUE))||a(Infinity)!=Infinity},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?i(e)+l:r(e-1+c(e-1)*c(e+1))}})},65115:function(e,t,n){"use strict";var o=n(56174),r=Math.asinh,a=Math.log,i=Math.sqrt;o({target:"Math",stat:!0,forced:!(r&&1/r(0)>0)},{asinh:function c(e){return isFinite(e=+e)&&0!=e?e<0?-c(-e):a(e+i(e*e+1)):e}})},27115:function(e,t,n){"use strict";var o=n(56174),r=Math.atanh,a=Math.log;o({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:a((1+e)/(1-e))/2}})},13280:function(e,t,n){"use strict";var o=n(56174),r=n(24305),a=Math.abs,i=Math.pow;o({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*i(a(e),1/3)}})},21019:function(e,t,n){"use strict";var o=n(56174),r=Math.floor,a=Math.log,i=Math.LOG2E;o({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(a(e+.5)*i):32}})},66619:function(e,t,n){"use strict";var o=n(56174),r=n(19997),a=Math.cosh,i=Math.abs,c=Math.E;o({target:"Math",stat:!0,forced:!a||a(710)===Infinity},{cosh:function(e){var t=r(i(e)-1)+1;return(t+1/(t*c*c))*(c/2)}})},75469:function(e,t,n){"use strict";var o=n(56174),r=n(19997);o({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},90967:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{fround:n(43334)})},35022:function(e,t,n){"use strict";var o=n(56174),r=Math.hypot,a=Math.abs,i=Math.sqrt;o({target:"Math",stat:!0,forced:!!r&&r(Infinity,NaN)!==Infinity},{hypot:function(e,t){for(var n,o,r=0,c=0,l=arguments.length,u=0;c<l;)u<(n=a(arguments[c++]))?(r=r*(o=u/n)*o+1,u=n):r+=n>0?(o=n/u)*o:n;return u===Infinity?Infinity:u*i(r)}})},22604:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=Math.imul;o({target:"Math",stat:!0,forced:r((function(){return-5!=a(4294967295,5)||2!=a.length}))},{imul:function(e,t){var n=65535,o=+e,r=+t,a=n&o,i=n&r;return 0|a*i+((n&o>>>16)*i+a*(n&r>>>16)<<16>>>0)}})},41843:function(e,t,n){"use strict";var o=n(56174),r=Math.log,a=Math.LOG10E;o({target:"Math",stat:!0},{log10:function(e){return r(e)*a}})},86810:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{log1p:n(83659)})},54670:function(e,t,n){"use strict";var o=n(56174),r=Math.log,a=Math.LN2;o({target:"Math",stat:!0},{log2:function(e){return r(e)/a}})},16580:function(e,t,n){"use strict";n(56174)({target:"Math",stat:!0},{sign:n(24305)})},31304:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(19997),i=Math.abs,c=Math.exp,l=Math.E;o({target:"Math",stat:!0,forced:r((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(e){return i(e=+e)<1?(a(e)-a(-e))/2:(c(e-1)-c(-e-1))*(l/2)}})},13078:function(e,t,n){"use strict";var o=n(56174),r=n(19997),a=Math.exp;o({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==Infinity?1:n==Infinity?-1:(t-n)/(a(e)+a(-e))}})},45128:function(e,t,n){"use strict";n(29108)(Math,"Math",!0)},31938:function(e,t,n){"use strict";var o=n(56174),r=Math.ceil,a=Math.floor;o({target:"Math",stat:!0},{trunc:function(e){return(e>0?a:r)(e)}})},90958:function(e,t,n){"use strict";var o=n(75592),r=n(84253),a=n(41441),i=n(11807),c=n(28919),l=n(77e3),u=n(22285),d=n(78253),s=n(94673),p=n(69691),m=n(83681),f=n(78870).f,h=n(22245).f,C=n(74217).f,g=n(84703).trim,N="Number",v=r[N],b=v.prototype,V=l(m(b))==N,y=function(e){if(d(e))throw TypeError("Cannot convert a Symbol value to a number");var t,n,o,r,a,i,c,l,u=s(e,"number");if("string"==typeof u&&u.length>2)if(43===(t=(u=g(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:o=2,r=49;break;case 79:case 111:o=8,r=55;break;default:return+u}for(i=(a=u.slice(2)).length,c=0;c<i;c++)if((l=a.charCodeAt(c))<48||l>r)return NaN;return parseInt(a,o)}return+u};if(a(N,!v(" 0o1")||!v("0b1")||v("+0x1"))){for(var x,k=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof k&&(V?p((function(){b.valueOf.call(n)})):l(n)!=N)?u(new v(y(t)),n,k):y(t)},S=o?f(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range".split(","),I=0;S.length>I;I++)c(v,x=S[I])&&!c(k,x)&&C(k,x,h(v,x));k.prototype=b,b.constructor=k,i(r,N,k)}},88885:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},45017:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isFinite:n(64630)})},59743:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isInteger:n(93624)})},47560:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},31569:function(e,t,n){"use strict";var o=n(56174),r=n(93624),a=Math.abs;o({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&a(e)<=9007199254740991}})},6134:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},12622:function(e,t,n){"use strict";n(56174)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},60852:function(e,t,n){"use strict";var o=n(56174),r=n(78025);o({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},99085:function(e,t,n){"use strict";var o=n(56174),r=n(55092);o({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},75180:function(e,t,n){"use strict";var o=n(56174),r=n(3997),a=n(81687),i=n(9811),c=n(69691),l=1..toFixed,u=Math.floor,d=function f(e,t,n){return 0===t?n:t%2==1?f(e,t-1,n*e):f(e*e,t/2,n)},s=function(e,t,n){for(var o=-1,r=n;++o<6;)r+=t*e[o],e[o]=r%1e7,r=u(r/1e7)},p=function(e,t){for(var n=6,o=0;--n>=0;)o+=e[n],e[n]=u(o/t),o=o%t*1e7},m=function(e){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==e[t]){var o=String(e[t]);n=""===n?o:n+i.call("0",7-o.length)+o}return n};o({target:"Number",proto:!0,forced:l&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!c((function(){l.call({})}))},{toFixed:function(e){var t,n,o,c,l=a(this),u=r(e),f=[0,0,0,0,0,0],h="",C="0";if(u<0||u>20)throw RangeError("Incorrect fraction digits");if(l!=l)return"NaN";if(l<=-1e21||l>=1e21)return String(l);if(l<0&&(h="-",l=-l),l>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(l*d(2,69,1))-69)<0?l*d(2,-t,1):l/d(2,t,1),n*=4503599627370496,(t=52-t)>0){for(s(f,0,n),o=u;o>=7;)s(f,1e7,0),o-=7;for(s(f,d(10,o,1),0),o=t-1;o>=23;)p(f,1<<23),o-=23;p(f,1<<o),s(f,1,1),p(f,2),C=m(f)}else s(f,0,n),s(f,1<<-t,0),C=m(f)+i.call("0",u);return C=u>0?h+((c=C.length)<=u?"0."+i.call("0",u-c)+C:C.slice(0,c-u)+"."+C.slice(c-u)):h+C}})},79437:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(81687),i=1..toPrecision;o({target:"Number",proto:!0,forced:r((function(){return"1"!==i.call(1,undefined)}))||!r((function(){i.call({})}))},{toPrecision:function(e){return e===undefined?i.call(a(this)):i.call(a(this),e)}})},75370:function(e,t,n){"use strict";var o=n(56174),r=n(64905);o({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},61022:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0,sham:!n(75592)},{create:n(83681)})},50580:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(83923),l=n(74217);r&&o({target:"Object",proto:!0,forced:a},{__defineGetter__:function(e,t){l.f(i(this),e,{get:c(t),enumerable:!0,configurable:!0})}})},5301:function(e,t,n){"use strict";var o=n(56174),r=n(75592);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:n(91543)})},76438:function(e,t,n){"use strict";var o=n(56174),r=n(75592);o({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:n(74217).f})},97307:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(83923),l=n(74217);r&&o({target:"Object",proto:!0,forced:a},{__defineSetter__:function(e,t){l.f(i(this),e,{set:c(t),enumerable:!0,configurable:!0})}})},34016:function(e,t,n){"use strict";var o=n(56174),r=n(3e4).entries;o({target:"Object",stat:!0},{entries:function(e){return r(e)}})},86944:function(e,t,n){"use strict";var o=n(56174),r=n(7056),a=n(69691),i=n(35611),c=n(40421).onFreeze,l=Object.freeze;o({target:"Object",stat:!0,forced:a((function(){l(1)})),sham:!r},{freeze:function(e){return l&&i(e)?l(c(e)):e}})},60687:function(e,t,n){"use strict";var o=n(56174),r=n(56342),a=n(39241);o({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){a(t,e,n)}),{AS_ENTRIES:!0}),t}})},86957:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(26553),i=n(22245).f,c=n(75592),l=r((function(){i(1)}));o({target:"Object",stat:!0,forced:!c||l,sham:!c},{getOwnPropertyDescriptor:function(e,t){return i(a(e),t)}})},59163:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(28482),i=n(26553),c=n(22245),l=n(39241);o({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){for(var t,n,o=i(e),r=c.f,u=a(o),d={},s=0;u.length>s;)(n=r(o,t=u[s++]))!==undefined&&l(d,t,n);return d}})},34128:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(59995).f;o({target:"Object",stat:!0,forced:r((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:a})},24267:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(12104),i=n(6863),c=n(28954);o({target:"Object",stat:!0,forced:r((function(){i(1)})),sham:!c},{getPrototypeOf:function(e){return i(a(e))}})},4239:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isExtensible;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isExtensible:function(e){return!!a(e)&&(!i||i(e))}})},8381:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isFrozen;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isFrozen:function(e){return!a(e)||!!i&&i(e)}})},63669:function(e,t,n){"use strict";var o=n(56174),r=n(69691),a=n(35611),i=Object.isSealed;o({target:"Object",stat:!0,forced:r((function(){i(1)}))},{isSealed:function(e){return!a(e)||!!i&&i(e)}})},39816:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0},{is:n(61398)})},25779:function(e,t,n){"use strict";var o=n(56174),r=n(12104),a=n(84547);o({target:"Object",stat:!0,forced:n(69691)((function(){a(1)}))},{keys:function(e){return a(r(e))}})},84580:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(14613),l=n(6863),u=n(22245).f;r&&o({target:"Object",proto:!0,forced:a},{__lookupGetter__:function(e){var t,n=i(this),o=c(e);do{if(t=u(n,o))return t.get}while(n=l(n))}})},33198:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(47339),i=n(12104),c=n(14613),l=n(6863),u=n(22245).f;r&&o({target:"Object",proto:!0,forced:a},{__lookupSetter__:function(e){var t,n=i(this),o=c(e);do{if(t=u(n,o))return t.set}while(n=l(n))}})},71895:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(40421).onFreeze,i=n(7056),c=n(69691),l=Object.preventExtensions;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!i},{preventExtensions:function(e){return l&&r(e)?l(a(e)):e}})},44910:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(40421).onFreeze,i=n(7056),c=n(69691),l=Object.seal;o({target:"Object",stat:!0,forced:c((function(){l(1)})),sham:!i},{seal:function(e){return l&&r(e)?l(a(e)):e}})},95962:function(e,t,n){"use strict";n(56174)({target:"Object",stat:!0},{setPrototypeOf:n(18444)})},73769:function(e,t,n){"use strict";var o=n(64910),r=n(11807),a=n(13966);o||r(Object.prototype,"toString",a,{unsafe:!0})},14962:function(e,t,n){"use strict";var o=n(56174),r=n(3e4).values;o({target:"Object",stat:!0},{values:function(e){return r(e)}})},80345:function(e,t,n){"use strict";var o=n(56174),r=n(78025);o({global:!0,forced:parseFloat!=r},{parseFloat:r})},18438:function(e,t,n){"use strict";var o=n(56174),r=n(55092);o({global:!0,forced:parseInt!=r},{parseInt:r})},46356:function(e,t,n){"use strict";var o=n(56174),r=n(1986),a=n(4302),i=n(69691),c=n(69808),l=n(24345),u=n(48141),d=n(11807);if(o({target:"Promise",proto:!0,real:!0,forced:!!a&&i((function(){a.prototype["finally"].call({then:function(){}},(function(){}))}))},{"finally":function(e){var t=l(this,c("Promise")),n="function"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),!r&&"function"==typeof a){var s=c("Promise").prototype["finally"];a.prototype["finally"]!==s&&d(a.prototype,"finally",s,{unsafe:!0})}},70552:function(e,t,n){"use strict";var o,r,a,i,c=n(56174),l=n(1986),u=n(84253),d=n(69808),s=n(4302),p=n(11807),m=n(3993),f=n(18444),h=n(29108),C=n(64157),g=n(35611),N=n(83923),v=n(50997),b=n(89853),V=n(56342),y=n(68762),x=n(24345),k=n(33453).set,S=n(80909),I=n(48141),w=n(21419),_=n(82101),D=n(47673),M=n(79947),B=n(41441),A=n(17657),T=n(46392),L=n(41488),E=n(12338),P=A("species"),j="Promise",O=M.get,F=M.set,R=M.getterFor(j),z=s&&s.prototype,W=s,U=z,H=u.TypeError,G=u.document,Y=u.process,Z=_.f,K=Z,Q=!!(G&&G.createEvent&&u.dispatchEvent),$="function"==typeof PromiseRejectionEvent,J="unhandledrejection",X=!1,q=B(j,(function(){var e=b(W),t=e!==String(W);if(!t&&66===E)return!0;if(l&&!U["finally"])return!0;if(E>=51&&/native code/.test(e))return!1;var n=new W((function(e){e(1)})),o=function(e){e((function(){}),(function(){}))};return(n.constructor={})[P]=o,!(X=n.then((function(){}))instanceof o)||!t&&T&&!$})),ee=q||!y((function(e){W.all(e)["catch"]((function(){}))})),te=function(e){var t;return!(!g(e)||"function"!=typeof(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;S((function(){for(var o=e.value,r=1==e.state,a=0;n.length>a;){var i,c,l,u=n[a++],d=r?u.ok:u.fail,s=u.resolve,p=u.reject,m=u.domain;try{d?(r||(2===e.rejection&&ie(e),e.rejection=1),!0===d?i=o:(m&&m.enter(),i=d(o),m&&(m.exit(),l=!0)),i===u.promise?p(H("Promise-chain cycle")):(c=te(i))?c.call(i,s,p):s(i)):p(o)}catch(f){m&&!l&&m.exit(),p(f)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&re(e)}))}},oe=function(e,t,n){var o,r;Q?((o=G.createEvent("Event")).promise=t,o.reason=n,o.initEvent(e,!1,!0),u.dispatchEvent(o)):o={promise:t,reason:n},!$&&(r=u["on"+e])?r(o):e===J&&w("Unhandled promise rejection",n)},re=function(e){k.call(u,(function(){var t,n=e.facade,o=e.value;if(ae(e)&&(t=D((function(){L?Y.emit("unhandledRejection",o,n):oe(J,n,o)})),e.rejection=L||ae(e)?2:1,t.error))throw t.value}))},ae=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){k.call(u,(function(){var t=e.facade;L?Y.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},ce=function(e,t,n){return function(o){e(t,o,n)}},le=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ue=function se(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw H("Promise can't be resolved itself");var o=te(t);o?S((function(){var n={done:!1};try{o.call(t,ce(se,n,e),ce(le,n,e))}catch(r){le(n,r,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(r){le({done:!1},r,e)}}};if(q&&(W=function(e){v(this,W,j),N(e),o.call(this);var t=O(this);try{e(ce(ue,t),ce(le,t))}catch(n){le(t,n)}},U=W.prototype,(o=function(e){F(this,{type:j,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:undefined})}).prototype=m(U,{then:function(e,t){var n=R(this),o=Z(x(this,W));return o.ok="function"!=typeof e||e,o.fail="function"==typeof t&&t,o.domain=L?Y.domain:undefined,n.parent=!0,n.reactions.push(o),0!=n.state&&ne(n,!1),o.promise},"catch":function(e){return this.then(undefined,e)}}),r=function(){var e=new o,t=O(e);this.promise=e,this.resolve=ce(ue,t),this.reject=ce(le,t)},_.f=Z=function(e){return e===W||e===a?new r(e):K(e)},!l&&"function"==typeof s&&z!==Object.prototype)){i=z.then,X||(p(z,"then",(function(e,t){var n=this;return new W((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),p(z,"catch",U["catch"],{unsafe:!0}));try{delete z.constructor}catch(de){}f&&f(z,U)}c({global:!0,wrap:!0,forced:q},{Promise:W}),h(W,j,!1,!0),C(j),a=d(j),c({target:j,stat:!0,forced:q},{reject:function(e){var t=Z(this);return t.reject.call(undefined,e),t.promise}}),c({target:j,stat:!0,forced:l||q},{resolve:function(e){return I(l&&this===a?W:this,e)}}),c({target:j,stat:!0,forced:ee},{all:function(e){var t=this,n=Z(t),o=n.resolve,r=n.reject,a=D((function(){var n=N(t.resolve),a=[],i=0,c=1;V(e,(function(e){var l=i++,u=!1;a.push(undefined),c++,n.call(t,e).then((function(e){u||(u=!0,a[l]=e,--c||o(a))}),r)})),--c||o(a)}));return a.error&&r(a.value),n.promise},race:function(e){var t=this,n=Z(t),o=n.reject,r=D((function(){var r=N(t.resolve);V(e,(function(e){r.call(t,e).then(n.resolve,o)}))}));return r.error&&o(r.value),n.promise}})},57128:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(83923),i=n(63518),c=n(69691),l=r("Reflect","apply"),u=Function.apply;o({target:"Reflect",stat:!0,forced:!c((function(){l((function(){}))}))},{apply:function(e,t,n){return a(e),i(n),l?l(e,t,n):u.call(e,t,n)}})},83588:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(83923),i=n(63518),c=n(35611),l=n(83681),u=n(68719),d=n(69691),s=r("Reflect","construct"),p=d((function(){function e(){}return!(s((function(){}),[],e)instanceof e)})),m=!d((function(){s((function(){}))})),f=p||m;o({target:"Reflect",stat:!0,forced:f,sham:f},{construct:function(e,t){a(e),i(t);var n=arguments.length<3?e:a(arguments[2]);if(m&&!p)return s(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(u.apply(e,o))}var r=n.prototype,d=l(c(r)?r:Object.prototype),f=Function.apply.call(e,d,t);return c(f)?f:d}})},47057:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(63518),i=n(14613),c=n(74217);o({target:"Reflect",stat:!0,forced:n(69691)((function(){Reflect.defineProperty(c.f({},1,{value:1}),1,{value:2})})),sham:!r},{defineProperty:function(e,t,n){a(e);var o=i(t);a(n);try{return c.f(e,o,n),!0}catch(r){return!1}}})},67092:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(22245).f;o({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=a(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},69203:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(63518),i=n(22245);o({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return i.f(a(e),t)}})},27879:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(6863);o({target:"Reflect",stat:!0,sham:!n(28954)},{getPrototypeOf:function(e){return a(r(e))}})},59478:function(e,t,n){"use strict";var o=n(56174),r=n(35611),a=n(63518),i=n(28919),c=n(22245),l=n(6863);o({target:"Reflect",stat:!0},{get:function u(e,t){var n,o,d=arguments.length<3?e:arguments[2];return a(e)===d?e[t]:(n=c.f(e,t))?i(n,"value")?n.value:n.get===undefined?undefined:n.get.call(d):r(o=l(e))?u(o,t,d):void 0}})},71507:function(e,t,n){"use strict";n(56174)({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},39021:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=Object.isExtensible;o({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!a||a(e)}})},8641:function(e,t,n){"use strict";n(56174)({target:"Reflect",stat:!0},{ownKeys:n(28482)})},83064:function(e,t,n){"use strict";var o=n(56174),r=n(69808),a=n(63518);o({target:"Reflect",stat:!0,sham:!n(7056)},{preventExtensions:function(e){a(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},33362:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(1372),i=n(18444);i&&o({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),a(t);try{return i(e,t),!0}catch(n){return!1}}})},93115:function(e,t,n){"use strict";var o=n(56174),r=n(63518),a=n(35611),i=n(28919),c=n(69691),l=n(74217),u=n(22245),d=n(6863),s=n(39160);o({target:"Reflect",stat:!0,forced:c((function(){var e=function(){},t=l.f(new e,"a",{configurable:!0});return!1!==Reflect.set(e.prototype,"a",1,t)}))},{set:function p(e,t,n){var o,c,m=arguments.length<4?e:arguments[3],f=u.f(r(e),t);if(!f){if(a(c=d(e)))return p(c,t,n,m);f=s(0)}if(i(f,"value")){if(!1===f.writable||!a(m))return!1;if(o=u.f(m,t)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,l.f(m,t,o)}else l.f(m,t,s(0,n));return!0}return f.set!==undefined&&(f.set.call(m,n),!0)}})},45090:function(e,t,n){"use strict";var o=n(75592),r=n(84253),a=n(41441),i=n(22285),c=n(52188),l=n(74217).f,u=n(78870).f,d=n(86133),s=n(92082),p=n(5105),m=n(1864),f=n(11807),h=n(69691),C=n(28919),g=n(79947).enforce,N=n(64157),v=n(17657),b=n(8368),V=n(2229),y=v("match"),x=r.RegExp,k=x.prototype,S=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,I=/a/g,w=/a/g,_=new x(I)!==I,D=m.UNSUPPORTED_Y,M=o&&(!_||D||b||V||h((function(){return w[y]=!1,x(I)!=I||x(w)==w||"/a/i"!=x(I,"i")})));if(a("RegExp",M)){for(var B=function(e,t){var n,o,r,a,l,u,m=this instanceof B,f=d(e),h=t===undefined,N=[],v=e;if(!m&&f&&h&&e.constructor===B)return e;if((f||e instanceof B)&&(e=e.source,h&&(t="flags"in v?v.flags:p.call(v))),e=e===undefined?"":s(e),t=t===undefined?"":s(t),v=e,b&&"dotAll"in I&&(o=!!t&&t.indexOf("s")>-1)&&(t=t.replace(/s/g,"")),n=t,D&&"sticky"in I&&(r=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,"")),V&&(a=function(e){for(var t,n=e.length,o=0,r="",a=[],i={},c=!1,l=!1,u=0,d="";o<=n;o++){if("\\"===(t=e.charAt(o)))t+=e.charAt(++o);else if("]"===t)c=!1;else if(!c)switch(!0){case"["===t:c=!0;break;case"("===t:S.test(e.slice(o+1))&&(o+=2,l=!0),r+=t,u++;continue;case">"===t&&l:if(""===d||C(i,d))throw new SyntaxError("Invalid capture group name");i[d]=!0,a.push([d,u]),l=!1,d="";continue}l?d+=t:r+=t}return[r,a]}(e),e=a[0],N=a[1]),l=i(x(e,t),m?this:k,B),(o||r||N.length)&&(u=g(l),o&&(u.dotAll=!0,u.raw=B(function(e){for(var t,n=e.length,o=0,r="",a=!1;o<=n;o++)"\\"!==(t=e.charAt(o))?a||"."!==t?("["===t?a=!0:"]"===t&&(a=!1),r+=t):r+="[\\s\\S]":r+=t+e.charAt(++o);return r}(e),n)),r&&(u.sticky=!0),N.length&&(u.groups=N)),e!==v)try{c(l,"source",""===v?"(?:)":v)}catch(y){}return l},A=function(e){e in B||l(B,e,{configurable:!0,get:function(){return x[e]},set:function(t){x[e]=t}})},T=u(x),L=0;T.length>L;)A(T[L++]);k.constructor=B,B.prototype=k,f(r,"RegExp",B)}N("RegExp")},12654:function(e,t,n){"use strict";var o=n(56174),r=n(71841);o({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},58870:function(e,t,n){"use strict";var o=n(75592),r=n(74217),a=n(5105),i=n(69691);o&&i((function(){return"sy"!==Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get.call({dotAll:!0,sticky:!0})}))&&r.f(RegExp.prototype,"flags",{configurable:!0,get:a})},76581:function(e,t,n){"use strict";var o=n(11807),r=n(63518),a=n(92082),i=n(69691),c=n(5105),l="toString",u=RegExp.prototype,d=u[l],s=i((function(){return"/a/b"!=d.call({source:"a",flags:"b"})})),p=d.name!=l;(s||p)&&o(RegExp.prototype,l,(function(){var e=r(this),t=a(e.source),n=e.flags;return"/"+t+"/"+a(n===undefined&&e instanceof RegExp&&!("flags"in u)?c.call(e):n)}),{unsafe:!0})},4567:function(e,t,n){"use strict";var o=n(42006),r=n(74568);e.exports=o("Set",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),r)},67586:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},7743:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("big")},{big:function(){return r(this,"big","","")}})},15890:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("blink")},{blink:function(){return r(this,"blink","","")}})},34651:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("bold")},{bold:function(){return r(this,"b","","")}})},28638:function(e,t,n){"use strict";var o=n(56174),r=n(37015).codeAt;o({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},60314:function(e,t,n){"use strict";var o,r=n(56174),a=n(22245).f,i=n(39570),c=n(92082),l=n(18774),u=n(44184),d=n(93937),s=n(1986),p="".endsWith,m=Math.min,f=d("endsWith");r({target:"String",proto:!0,forced:!!(s||f||(o=a(String.prototype,"endsWith"),!o||o.writable))&&!f},{endsWith:function(e){var t=c(u(this));l(e);var n=arguments.length>1?arguments[1]:undefined,o=i(t.length),r=n===undefined?o:m(i(n),o),a=c(e);return p?p.call(t,a,r):t.slice(r-a.length,r)===a}})},18037:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fixed")},{fixed:function(){return r(this,"tt","","")}})},48415:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},54950:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},71595:function(e,t,n){"use strict";var o=n(56174),r=n(55205),a=String.fromCharCode,i=String.fromCodePoint;o({target:"String",stat:!0,forced:!!i&&1!=i.length},{fromCodePoint:function(e){for(var t,n=[],o=arguments.length,i=0;o>i;){if(t=+arguments[i++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?a(t):a(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},98954:function(e,t,n){"use strict";var o=n(56174),r=n(18774),a=n(44184),i=n(92082);o({target:"String",proto:!0,forced:!n(93937)("includes")},{includes:function(e){return!!~i(a(this)).indexOf(i(r(e)),arguments.length>1?arguments[1]:undefined)}})},76102:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("italics")},{italics:function(){return r(this,"i","","")}})},91332:function(e,t,n){"use strict";var o=n(37015).charAt,r=n(92082),a=n(79947),i=n(71179),c="String Iterator",l=a.set,u=a.getterFor(c);i(String,"String",(function(e){l(this,{type:c,string:r(e),index:0})}),(function(){var e,t=u(this),n=t.string,r=t.index;return r>=n.length?{value:undefined,done:!0}:(e=o(n,r),t.index+=e.length,{value:e,done:!1})}))},47816:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("link")},{link:function(e){return r(this,"a","href",e)}})},79445:function(e,t,n){"use strict";var o=n(68880),r=n(63518),a=n(39570),i=n(92082),c=n(44184),l=n(69953),u=n(5641);o("match",(function(e,t,n){return[function(t){var n=c(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](i(n))},function(e){var o=r(this),c=i(e),d=n(t,o,c);if(d.done)return d.value;if(!o.global)return u(o,c);var s=o.unicode;o.lastIndex=0;for(var p,m=[],f=0;null!==(p=u(o,c));){var h=i(p[0]);m[f]=h,""===h&&(o.lastIndex=l(c,a(o.lastIndex),s)),f++}return 0===f?null:m}]}))},36493:function(e,t,n){"use strict";var o=n(56174),r=n(47497).end;o({target:"String",proto:!0,forced:n(43331)},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},24476:function(e,t,n){"use strict";var o=n(56174),r=n(47497).start;o({target:"String",proto:!0,forced:n(43331)},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}})},78192:function(e,t,n){"use strict";var o=n(56174),r=n(26553),a=n(39570),i=n(92082);o({target:"String",stat:!0},{raw:function(e){for(var t=r(e.raw),n=a(t.length),o=arguments.length,c=[],l=0;n>l;)c.push(i(t[l++])),l<o&&c.push(i(arguments[l]));return c.join("")}})},58660:function(e,t,n){"use strict";n(56174)({target:"String",proto:!0},{repeat:n(9811)})},56592:function(e,t,n){"use strict";var o=n(68880),r=n(69691),a=n(63518),i=n(3997),c=n(39570),l=n(92082),u=n(44184),d=n(69953),s=n(55444),p=n(5641),m=n(17657)("replace"),f=Math.max,h=Math.min,C="$0"==="a".replace(/./,"$0"),g=!!/./[m]&&""===/./[m]("a","$0");o("replace",(function(e,t,n){var o=g?"$":"$0";return[function(e,n){var o=u(this),r=e==undefined?undefined:e[m];return r!==undefined?r.call(e,o,n):t.call(l(o),e,n)},function(e,r){var u=a(this),m=l(e);if("string"==typeof r&&-1===r.indexOf(o)&&-1===r.indexOf("$<")){var C=n(t,u,m,r);if(C.done)return C.value}var g="function"==typeof r;g||(r=l(r));var N=u.global;if(N){var v=u.unicode;u.lastIndex=0}for(var b=[];;){var V=p(u,m);if(null===V)break;if(b.push(V),!N)break;""===l(V[0])&&(u.lastIndex=d(m,c(u.lastIndex),v))}for(var y,x="",k=0,S=0;S<b.length;S++){V=b[S];for(var I=l(V[0]),w=f(h(i(V.index),m.length),0),_=[],D=1;D<V.length;D++)_.push((y=V[D])===undefined?y:String(y));var M=V.groups;if(g){var B=[I].concat(_,w,m);M!==undefined&&B.push(M);var A=l(r.apply(undefined,B))}else A=s(I,m,w,_,M,r);w>=k&&(x+=m.slice(k,w)+A,k=w+I.length)}return x+m.slice(k)}]}),!!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!C||g)},69957:function(e,t,n){"use strict";var o=n(68880),r=n(63518),a=n(44184),i=n(61398),c=n(92082),l=n(5641);o("search",(function(e,t,n){return[function(t){var n=a(this),o=t==undefined?undefined:t[e];return o!==undefined?o.call(t,n):new RegExp(t)[e](c(n))},function(e){var o=r(this),a=c(e),u=n(t,o,a);if(u.done)return u.value;var d=o.lastIndex;i(d,0)||(o.lastIndex=0);var s=l(o,a);return i(o.lastIndex,d)||(o.lastIndex=d),null===s?-1:s.index}]}))},30037:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("small")},{small:function(){return r(this,"small","","")}})},9747:function(e,t,n){"use strict";var o=n(68880),r=n(86133),a=n(63518),i=n(44184),c=n(24345),l=n(69953),u=n(39570),d=n(92082),s=n(5641),p=n(71841),m=n(1864),f=n(69691),h=m.UNSUPPORTED_Y,C=[].push,g=Math.min,N=4294967295,v=!f((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));o("split",(function(e,t,n){var o;return o="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var o=d(i(this)),a=n===undefined?N:n>>>0;if(0===a)return[];if(e===undefined)return[o];if(!r(e))return t.call(o,e,a);for(var c,l,u,s=[],m=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,h=new RegExp(e.source,m+"g");(c=p.call(h,o))&&!((l=h.lastIndex)>f&&(s.push(o.slice(f,c.index)),c.length>1&&c.index<o.length&&C.apply(s,c.slice(1)),u=c[0].length,f=l,s.length>=a));)h.lastIndex===c.index&&h.lastIndex++;return f===o.length?!u&&h.test("")||s.push(""):s.push(o.slice(f)),s.length>a?s.slice(0,a):s}:"0".split(undefined,0).length?function(e,n){return e===undefined&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=i(this),a=t==undefined?undefined:t[e];return a!==undefined?a.call(t,r,n):o.call(d(r),t,n)},function(e,r){var i=a(this),p=d(e),m=n(o,i,p,r,o!==t);if(m.done)return m.value;var f=c(i,RegExp),C=i.unicode,v=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(h?"g":"y"),b=new f(h?"^(?:"+i.source+")":i,v),V=r===undefined?N:r>>>0;if(0===V)return[];if(0===p.length)return null===s(b,p)?[p]:[];for(var y=0,x=0,k=[];x<p.length;){b.lastIndex=h?0:x;var S,I=s(b,h?p.slice(x):p);if(null===I||(S=g(u(b.lastIndex+(h?x:0)),p.length))===y)x=l(p,x,C);else{if(k.push(p.slice(y,x)),k.length===V)return k;for(var w=1;w<=I.length-1;w++)if(k.push(I[w]),k.length===V)return k;x=y=S}}return k.push(p.slice(y)),k}]}),!v,h)},13578:function(e,t,n){"use strict";var o,r=n(56174),a=n(22245).f,i=n(39570),c=n(92082),l=n(18774),u=n(44184),d=n(93937),s=n(1986),p="".startsWith,m=Math.min,f=d("startsWith");r({target:"String",proto:!0,forced:!!(s||f||(o=a(String.prototype,"startsWith"),!o||o.writable))&&!f},{startsWith:function(e){var t=c(u(this));l(e);var n=i(m(arguments.length>1?arguments[1]:undefined,t.length)),o=c(e);return p?p.call(t,o,n):t.slice(n,n+o.length)===o}})},54705:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("strike")},{strike:function(){return r(this,"strike","","")}})},75831:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("sub")},{sub:function(){return r(this,"sub","","")}})},96958:function(e,t,n){"use strict";var o=n(56174),r=n(34141);o({target:"String",proto:!0,forced:n(26096)("sup")},{sup:function(){return r(this,"sup","","")}})},19209:function(e,t,n){"use strict";var o=n(56174),r=n(84703).end,a=n(3035)("trimEnd"),i=a?function(){return r(this)}:"".trimEnd;o({target:"String",proto:!0,forced:a},{trimEnd:i,trimRight:i})},56737:function(e,t,n){"use strict";var o=n(56174),r=n(84703).start,a=n(3035)("trimStart"),i=a?function(){return r(this)}:"".trimStart;o({target:"String",proto:!0,forced:a},{trimStart:i,trimLeft:i})},3684:function(e,t,n){"use strict";var o=n(56174),r=n(84703).trim;o({target:"String",proto:!0,forced:n(3035)("trim")},{trim:function(){return r(this)}})},69656:function(e,t,n){"use strict";n(55282)("asyncIterator")},43674:function(e,t,n){"use strict";var o=n(56174),r=n(75592),a=n(84253),i=n(28919),c=n(35611),l=n(74217).f,u=n(49957),d=a.Symbol;if(r&&"function"==typeof d&&(!("description"in d.prototype)||d().description!==undefined)){var s={},p=function(){var e=arguments.length<1||arguments[0]===undefined?undefined:String(arguments[0]),t=this instanceof p?new d(e):e===undefined?d():d(e);return""===e&&(s[t]=!0),t};u(p,d);var m=p.prototype=d.prototype;m.constructor=p;var f=m.toString,h="Symbol(test)"==String(d("test")),C=/^Symbol\((.*)\)[^)]+$/;l(m,"description",{configurable:!0,get:function(){var e=c(this)?this.valueOf():this,t=f.call(e);if(i(s,e))return"";var n=h?t.slice(7,-1):t.replace(C,"$1");return""===n?undefined:n}}),o({global:!0,forced:!0},{Symbol:p})}},72411:function(e,t,n){"use strict";n(55282)("hasInstance")},24467:function(e,t,n){"use strict";n(55282)("isConcatSpreadable")},37493:function(e,t,n){"use strict";n(55282)("iterator")},65379:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(69808),i=n(1986),c=n(75592),l=n(54772),u=n(69691),d=n(28919),s=n(89999),p=n(35611),m=n(78253),f=n(63518),h=n(12104),C=n(26553),g=n(14613),N=n(92082),v=n(39160),b=n(83681),V=n(84547),y=n(78870),x=n(59995),k=n(21061),S=n(22245),I=n(74217),w=n(77659),_=n(52188),D=n(11807),M=n(27364),B=n(85152),A=n(90311),T=n(41080),L=n(17657),E=n(3444),P=n(55282),j=n(29108),O=n(79947),F=n(69033).forEach,R=B("hidden"),z="Symbol",W="prototype",U=L("toPrimitive"),H=O.set,G=O.getterFor(z),Y=Object[W],Z=r.Symbol,K=a("JSON","stringify"),Q=S.f,$=I.f,J=x.f,X=w.f,q=M("symbols"),ee=M("op-symbols"),te=M("string-to-symbol-registry"),ne=M("symbol-to-string-registry"),oe=M("wks"),re=r.QObject,ae=!re||!re[W]||!re[W].findChild,ie=c&&u((function(){return 7!=b($({},"a",{get:function(){return $(this,"a",{value:7}).a}})).a}))?function(e,t,n){var o=Q(Y,t);o&&delete Y[t],$(e,t,n),o&&e!==Y&&$(Y,t,o)}:$,ce=function(e,t){var n=q[e]=b(Z[W]);return H(n,{type:z,tag:e,description:t}),c||(n.description=t),n},le=function(e,t,n){e===Y&&le(ee,t,n),f(e);var o=g(t);return f(n),d(q,o)?(n.enumerable?(d(e,R)&&e[R][o]&&(e[R][o]=!1),n=b(n,{enumerable:v(0,!1)})):(d(e,R)||$(e,R,v(1,{})),e[R][o]=!0),ie(e,o,n)):$(e,o,n)},ue=function(e,t){f(e);var n=C(t),o=V(n).concat(fe(n));return F(o,(function(t){c&&!se.call(n,t)||le(e,t,n[t])})),e},de=function(e,t){return t===undefined?b(e):ue(b(e),t)},se=function(e){var t=g(e),n=X.call(this,t);return!(this===Y&&d(q,t)&&!d(ee,t))&&(!(n||!d(this,t)||!d(q,t)||d(this,R)&&this[R][t])||n)},pe=function(e,t){var n=C(e),o=g(t);if(n!==Y||!d(q,o)||d(ee,o)){var r=Q(n,o);return!r||!d(q,o)||d(n,R)&&n[R][o]||(r.enumerable=!0),r}},me=function(e){var t=J(C(e)),n=[];return F(t,(function(e){d(q,e)||d(A,e)||n.push(e)})),n},fe=function(e){var t=e===Y,n=J(t?ee:C(e)),o=[];return F(n,(function(e){!d(q,e)||t&&!d(Y,e)||o.push(q[e])})),o};(l||(Z=function(){if(this instanceof Z)throw TypeError("Symbol is not a constructor");var e=arguments.length&&arguments[0]!==undefined?N(arguments[0]):undefined,t=T(e),n=function o(e){this===Y&&o.call(ee,e),d(this,R)&&d(this[R],t)&&(this[R][t]=!1),ie(this,t,v(1,e))};return c&&ae&&ie(Y,t,{configurable:!0,set:n}),ce(t,e)},D(Z[W],"toString",(function(){return G(this).tag})),D(Z,"withoutSetter",(function(e){return ce(T(e),e)})),w.f=se,I.f=le,S.f=pe,y.f=x.f=me,k.f=fe,E.f=function(e){return ce(L(e),e)},c&&($(Z[W],"description",{configurable:!0,get:function(){return G(this).description}}),i||D(Y,"propertyIsEnumerable",se,{unsafe:!0}))),o({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:Z}),F(V(oe),(function(e){P(e)})),o({target:z,stat:!0,forced:!l},{"for":function(e){var t=N(e);if(d(te,t))return te[t];var n=Z(t);return te[t]=n,ne[n]=t,n},keyFor:function(e){if(!m(e))throw TypeError(e+" is not a symbol");if(d(ne,e))return ne[e]},useSetter:function(){ae=!0},useSimple:function(){ae=!1}}),o({target:"Object",stat:!0,forced:!l,sham:!c},{create:de,defineProperty:le,defineProperties:ue,getOwnPropertyDescriptor:pe}),o({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:me,getOwnPropertySymbols:fe}),o({target:"Object",stat:!0,forced:u((function(){k.f(1)}))},{getOwnPropertySymbols:function(e){return k.f(h(e))}}),K)&&o({target:"JSON",stat:!0,forced:!l||u((function(){var e=Z();return"[null]"!=K([e])||"{}"!=K({a:e})||"{}"!=K(Object(e))}))},{stringify:function(e,t,n){for(var o,r=[e],a=1;arguments.length>a;)r.push(arguments[a++]);if(o=t,(p(t)||e!==undefined)&&!m(e))return s(t)||(t=function(e,t){if("function"==typeof o&&(t=o.call(this,e,t)),!m(t))return t}),r[1]=t,K.apply(null,r)}});Z[W][U]||_(Z[W],U,Z[W].valueOf),j(Z,z),A[R]=!0},87420:function(e,t,n){"use strict";n(55282)("match")},9480:function(e,t,n){"use strict";n(55282)("replace")},66171:function(e,t,n){"use strict";n(55282)("search")},53276:function(e,t,n){"use strict";n(55282)("species")},71852:function(e,t,n){"use strict";n(55282)("split")},59045:function(e,t,n){"use strict";n(55282)("toPrimitive")},70887:function(e,t,n){"use strict";n(55282)("toStringTag")},72906:function(e,t,n){"use strict";n(55282)("unscopables")},64346:function(e,t,n){"use strict";var o=n(19216),r=n(59571),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("copyWithin",(function(e,t){return r.call(a(this),e,t,arguments.length>2?arguments[2]:undefined)}))},27553:function(e,t,n){"use strict";var o=n(19216),r=n(69033).every,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("every",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},49007:function(e,t,n){"use strict";var o=n(19216),r=n(22051),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("fill",(function(e){return r.apply(a(this),arguments)}))},17621:function(e,t,n){"use strict";var o=n(19216),r=n(69033).filter,a=n(16688),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("filter",(function(e){var t=r(i(this),e,arguments.length>1?arguments[1]:undefined);return a(this,t)}))},20500:function(e,t,n){"use strict";var o=n(19216),r=n(69033).findIndex,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("findIndex",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},71078:function(e,t,n){"use strict";var o=n(19216),r=n(69033).find,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("find",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},75344:function(e,t,n){"use strict";n(17576)("Float32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},87853:function(e,t,n){"use strict";n(17576)("Float64",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},85923:function(e,t,n){"use strict";var o=n(19216),r=n(69033).forEach,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("forEach",(function(e){r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},38956:function(e,t,n){"use strict";var o=n(29023);(0,n(19216).exportTypedArrayStaticMethod)("from",n(76182),o)},49264:function(e,t,n){"use strict";var o=n(19216),r=n(25945).includes,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("includes",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},70448:function(e,t,n){"use strict";var o=n(19216),r=n(25945).indexOf,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("indexOf",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},1150:function(e,t,n){"use strict";n(17576)("Int16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},50444:function(e,t,n){"use strict";n(17576)("Int32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},25865:function(e,t,n){"use strict";n(17576)("Int8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},5775:function(e,t,n){"use strict";var o=n(84253),r=n(19216),a=n(98215),i=n(17657)("iterator"),c=o.Uint8Array,l=a.values,u=a.keys,d=a.entries,s=r.aTypedArray,p=r.exportTypedArrayMethod,m=c&&c.prototype[i],f=!!m&&("values"==m.name||m.name==undefined),h=function(){return l.call(s(this))};p("entries",(function(){return d.call(s(this))})),p("keys",(function(){return u.call(s(this))})),p("values",h,!f),p(i,h,!f)},45164:function(e,t,n){"use strict";var o=n(19216),r=o.aTypedArray,a=o.exportTypedArrayMethod,i=[].join;a("join",(function(e){return i.apply(r(this),arguments)}))},83762:function(e,t,n){"use strict";var o=n(19216),r=n(41183),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("lastIndexOf",(function(e){return r.apply(a(this),arguments)}))},67265:function(e,t,n){"use strict";var o=n(19216),r=n(69033).map,a=n(25198),i=o.aTypedArray;(0,o.exportTypedArrayMethod)("map",(function(e){return r(i(this),e,arguments.length>1?arguments[1]:undefined,(function(e,t){return new(a(e))(t)}))}))},56058:function(e,t,n){"use strict";var o=n(19216),r=n(29023),a=o.aTypedArrayConstructor;(0,o.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,n=new(a(this))(t);t>e;)n[e]=arguments[e++];return n}),r)},23535:function(e,t,n){"use strict";var o=n(19216),r=n(28249).right,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduceRight",(function(e){return r(a(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},87001:function(e,t,n){"use strict";var o=n(19216),r=n(28249).left,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("reduce",(function(e){return r(a(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},18617:function(e,t,n){"use strict";var o=n(19216),r=o.aTypedArray,a=o.exportTypedArrayMethod,i=Math.floor;a("reverse",(function(){for(var e,t=this,n=r(t).length,o=i(n/2),a=0;a<o;)e=t[a],t[a++]=t[--n],t[n]=e;return t}))},70595:function(e,t,n){"use strict";var o=n(19216),r=n(39570),a=n(95740),i=n(12104),c=n(69691),l=o.aTypedArray;(0,o.exportTypedArrayMethod)("set",(function(e){l(this);var t=a(arguments.length>1?arguments[1]:undefined,1),n=this.length,o=i(e),c=r(o.length),u=0;if(c+t>n)throw RangeError("Wrong length");for(;u<c;)this[t+u]=o[u++]}),c((function(){new Int8Array(1).set({})})))},76820:function(e,t,n){"use strict";var o=n(19216),r=n(25198),a=n(69691),i=o.aTypedArray,c=o.exportTypedArrayMethod,l=[].slice;c("slice",(function(e,t){for(var n=l.call(i(this),e,t),o=r(this),a=0,c=n.length,u=new o(c);c>a;)u[a]=n[a++];return u}),a((function(){new Int8Array(1).slice()})))},33357:function(e,t,n){"use strict";var o=n(19216),r=n(69033).some,a=o.aTypedArray;(0,o.exportTypedArrayMethod)("some",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:undefined)}))},38215:function(e,t,n){"use strict";var o=n(19216),r=n(84253),a=n(69691),i=n(83923),c=n(39570),l=n(58737),u=n(20967),d=n(85749),s=n(12338),p=n(12200),m=o.aTypedArray,f=o.exportTypedArrayMethod,h=r.Uint16Array,C=h&&h.prototype.sort,g=!!C&&!a((function(){var e=new h(2);e.sort(null),e.sort({})})),N=!!C&&!a((function(){if(s)return s<74;if(u)return u<67;if(d)return!0;if(p)return p<602;var e,t,n=new h(516),o=Array(516);for(e=0;e<516;e++)t=e%4,n[e]=515-e,o[e]=e-2*t+3;for(n.sort((function(e,t){return(e/4|0)-(t/4|0)})),e=0;e<516;e++)if(n[e]!==o[e])return!0}));f("sort",(function(e){var t=this;if(e!==undefined&&i(e),N)return C.call(t,e);m(t);var n,o=c(t.length),r=Array(o);for(n=0;n<o;n++)r[n]=t[n];for(r=l(t,function(e){return function(t,n){return e!==undefined?+e(t,n)||0:n!=n?-1:t!=t?1:0===t&&0===n?1/t>0&&1/n<0?1:-1:t>n}}(e)),n=0;n<o;n++)t[n]=r[n];return t}),!N||g)},37281:function(e,t,n){"use strict";var o=n(19216),r=n(39570),a=n(55205),i=n(25198),c=o.aTypedArray;(0,o.exportTypedArrayMethod)("subarray",(function(e,t){var n=c(this),o=n.length,l=a(e,o);return new(i(n))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,r((t===undefined?o:a(t,o))-l))}))},99584:function(e,t,n){"use strict";var o=n(84253),r=n(19216),a=n(69691),i=o.Int8Array,c=r.aTypedArray,l=r.exportTypedArrayMethod,u=[].toLocaleString,d=[].slice,s=!!i&&a((function(){u.call(new i(1))}));l("toLocaleString",(function(){return u.apply(s?d.call(c(this)):c(this),arguments)}),a((function(){return[1,2].toLocaleString()!=new i([1,2]).toLocaleString()}))||!a((function(){i.prototype.toLocaleString.call([1,2])})))},43582:function(e,t,n){"use strict";var o=n(19216).exportTypedArrayMethod,r=n(69691),a=n(84253).Uint8Array,i=a&&a.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var u=i.toString!=c;o("toString",c,u)},37650:function(e,t,n){"use strict";n(17576)("Uint16",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},12424:function(e,t,n){"use strict";n(17576)("Uint32",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},11220:function(e,t,n){"use strict";n(17576)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}))},6636:function(e,t,n){"use strict";n(17576)("Uint8",(function(e){return function(t,n,o){return e(this,t,n,o)}}),!0)},15378:function(e,t,n){"use strict";var o,r=n(84253),a=n(3993),i=n(40421),c=n(42006),l=n(57396),u=n(35611),d=n(79947).enforce,s=n(82911),p=!r.ActiveXObject&&"ActiveXObject"in r,m=Object.isExtensible,f=function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}},h=e.exports=c("WeakMap",f,l);if(s&&p){o=l.getConstructor(f,"WeakMap",!0),i.enable();var C=h.prototype,g=C["delete"],N=C.has,v=C.get,b=C.set;a(C,{"delete":function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),g.call(this,e)||t.frozen["delete"](e)}return g.call(this,e)},has:function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),N.call(this,e)||t.frozen.has(e)}return N.call(this,e)},get:function(e){if(u(e)&&!m(e)){var t=d(this);return t.frozen||(t.frozen=new o),N.call(this,e)?v.call(this,e):t.frozen.get(e)}return v.call(this,e)},set:function(e,t){if(u(e)&&!m(e)){var n=d(this);n.frozen||(n.frozen=new o),N.call(this,e)?b.call(this,e,t):n.frozen.set(e,t)}else b.call(this,e,t);return this}})}},31213:function(e,t,n){"use strict";n(42006)("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),n(57396))},19275:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(33453);o({global:!0,bind:!0,enumerable:!0,forced:!r.setImmediate||!r.clearImmediate},{setImmediate:a.set,clearImmediate:a.clear})},59:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(80909),i=n(41488),c=r.process;o({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=i&&c.domain;a(t?t.bind(e):e)}})},43849:function(e,t,n){"use strict";var o=n(56174),r=n(84253),a=n(72319),i=[].slice,c=function(e){return function(t,n){var o=arguments.length>2,r=o?i.call(arguments,2):undefined;return e(o?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};o({global:!0,bind:!0,forced:/MSIE .\./.test(a)},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},77249:function(e){"use strict";e.exports=function(){var e=1e3,t=6e4,n=36e5,o="millisecond",r="second",a="minute",i="hour",c="day",l="week",u="month",d="quarter",s="year",p="date",m="Invalid Date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,h=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,C={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(){function e(e){var t=["th","st","nd","rd"],n=e%100;return"["+e+(t[(n-20)%10]||t[n]||t[0])+"]"}return e}()},g=function(e,t,n){var o=String(e);return!o||o.length>=t?e:""+Array(t+1-o.length).join(n)+e},N={s:g,z:function(){function e(e){var t=-e.utcOffset(),n=Math.abs(t),o=Math.floor(n/60),r=n%60;return(t<=0?"+":"-")+g(o,2,"0")+":"+g(r,2,"0")}return e}(),m:function(){function e(t,n){if(t.date()<n.date())return-e(n,t);var o=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(o,u),a=n-r<0,i=t.clone().add(o+(a?-1:1),u);return+(-(o+(n-r)/(a?r-i:i-r))||0)}return e}(),a:function(){function e(e){return e<0?Math.ceil(e)||0:Math.floor(e)}return e}(),p:function(){function e(e){return{M:u,y:s,w:l,d:c,D:p,h:i,m:a,s:r,ms:o,Q:d}[e]||String(e||"").toLowerCase().replace(/s$/,"")}return e}(),u:function(){function e(e){return void 0===e}return e}()},v="en",b={};b[v]=C;var V="$isDayjsObject",y=function(e){return e instanceof I||!(!e||!e[V])},x=function(){function e(t,n,o){var r;if(!t)return v;if("string"==typeof t){var a=t.toLowerCase();b[a]&&(r=a),n&&(b[a]=n,r=a);var i=t.split("-");if(!r&&i.length>1)return e(i[0])}else{var c=t.name;b[c]=t,r=c}return!o&&r&&(v=r),r||!o&&v}return e}(),k=function(e,t){if(y(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new I(n)},S=N;S.l=x,S.i=y,S.w=function(e,t){return k(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var I=function(){function C(e){this.$L=x(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[V]=!0}var g=C.prototype;return g.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(S.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var o=t.match(f);if(o){var r=o[2]-1||0,a=(o[7]||"0").substring(0,3);return n?new Date(Date.UTC(o[1],r,o[3]||1,o[4]||0,o[5]||0,o[6]||0,a)):new Date(o[1],r,o[3]||1,o[4]||0,o[5]||0,o[6]||0,a)}}return new Date(t)}(e),this.init()},g.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},g.$utils=function(){return S},g.isValid=function(){return!(this.$d.toString()===m)},g.isSame=function(e,t){var n=k(e);return this.startOf(t)<=n&&n<=this.endOf(t)},g.isAfter=function(e,t){return k(e)<this.startOf(t)},g.isBefore=function(e,t){return this.endOf(t)<k(e)},g.$g=function(e,t,n){return S.u(e)?this[t]:this.set(n,e)},g.unix=function(){return Math.floor(this.valueOf()/1e3)},g.valueOf=function(){return this.$d.getTime()},g.startOf=function(e,t){var n=this,o=!!S.u(t)||t,d=S.p(e),m=function(e,t){var r=S.w(n.$u?Date.UTC(n.$y,t,e):new Date(n.$y,t,e),n);return o?r:r.endOf(c)},f=function(e,t){return S.w(n.toDate()[e].apply(n.toDate("s"),(o?[0,0,0,0]:[23,59,59,999]).slice(t)),n)},h=this.$W,C=this.$M,g=this.$D,N="set"+(this.$u?"UTC":"");switch(d){case s:return o?m(1,0):m(31,11);case u:return o?m(1,C):m(0,C+1);case l:var v=this.$locale().weekStart||0,b=(h<v?h+7:h)-v;return m(o?g-b:g+(6-b),C);case c:case p:return f(N+"Hours",0);case i:return f(N+"Minutes",1);case a:return f(N+"Seconds",2);case r:return f(N+"Milliseconds",3);default:return this.clone()}},g.endOf=function(e){return this.startOf(e,!1)},g.$set=function(e,t){var n,l=S.p(e),d="set"+(this.$u?"UTC":""),m=(n={},n[c]=d+"Date",n[p]=d+"Date",n[u]=d+"Month",n[s]=d+"FullYear",n[i]=d+"Hours",n[a]=d+"Minutes",n[r]=d+"Seconds",n[o]=d+"Milliseconds",n)[l],f=l===c?this.$D+(t-this.$W):t;if(l===u||l===s){var h=this.clone().set(p,1);h.$d[m](f),h.init(),this.$d=h.set(p,Math.min(this.$D,h.daysInMonth())).$d}else m&&this.$d[m](f);return this.init(),this},g.set=function(e,t){return this.clone().$set(e,t)},g.get=function(e){return this[S.p(e)]()},g.add=function(o,d){var p,m=this;o=Number(o);var f=S.p(d),h=function(e){var t=k(m);return S.w(t.date(t.date()+Math.round(e*o)),m)};if(f===u)return this.set(u,this.$M+o);if(f===s)return this.set(s,this.$y+o);if(f===c)return h(1);if(f===l)return h(7);var C=(p={},p[a]=t,p[i]=n,p[r]=e,p)[f]||1,g=this.$d.getTime()+o*C;return S.w(g,this)},g.subtract=function(e,t){return this.add(-1*e,t)},g.format=function(e){var t=this,n=this.$locale();if(!this.isValid())return n.invalidDate||m;var o=e||"YYYY-MM-DDTHH:mm:ssZ",r=S.z(this),a=this.$H,i=this.$m,c=this.$M,l=n.weekdays,u=n.months,d=n.meridiem,s=function(e,n,r,a){return e&&(e[n]||e(t,o))||r[n].slice(0,a)},p=function(e){return S.s(a%12||12,e,"0")},f=d||function(e,t,n){var o=e<12?"AM":"PM";return n?o.toLowerCase():o};return o.replace(h,(function(e,o){return o||function(e){switch(e){case"YY":return String(t.$y).slice(-2);case"YYYY":return S.s(t.$y,4,"0");case"M":return c+1;case"MM":return S.s(c+1,2,"0");case"MMM":return s(n.monthsShort,c,u,3);case"MMMM":return s(u,c);case"D":return t.$D;case"DD":return S.s(t.$D,2,"0");case"d":return String(t.$W);case"dd":return s(n.weekdaysMin,t.$W,l,2);case"ddd":return s(n.weekdaysShort,t.$W,l,3);case"dddd":return l[t.$W];case"H":return String(a);case"HH":return S.s(a,2,"0");case"h":return p(1);case"hh":return p(2);case"a":return f(a,i,!0);case"A":return f(a,i,!1);case"m":return String(i);case"mm":return S.s(i,2,"0");case"s":return String(t.$s);case"ss":return S.s(t.$s,2,"0");case"SSS":return S.s(t.$ms,3,"0");case"Z":return r}return null}(e)||r.replace(":","")}))},g.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},g.diff=function(o,p,m){var f,h=this,C=S.p(p),g=k(o),N=(g.utcOffset()-this.utcOffset())*t,v=this-g,b=function(){return S.m(h,g)};switch(C){case s:f=b()/12;break;case u:f=b();break;case d:f=b()/3;break;case l:f=(v-N)/6048e5;break;case c:f=(v-N)/864e5;break;case i:f=v/n;break;case a:f=v/t;break;case r:f=v/e;break;default:f=v}return m?f:S.a(f)},g.daysInMonth=function(){return this.endOf(u).$D},g.$locale=function(){return b[this.$L]},g.locale=function(e,t){if(!e)return this.$L;var n=this.clone(),o=x(e,t,!0);return o&&(n.$L=o),n},g.clone=function(){return S.w(this.$d,this)},g.toDate=function(){return new Date(this.valueOf())},g.toJSON=function(){return this.isValid()?this.toISOString():null},g.toISOString=function(){return this.$d.toISOString()},g.toString=function(){return this.$d.toUTCString()},C}(),w=I.prototype;return k.prototype=w,[["$ms",o],["$s",r],["$m",a],["$H",i],["$W",c],["$M",u],["$y",s],["$D",p]].forEach((function(e){w[e[1]]=function(t){return this.$g(t,e[0],e[1])}})),k.extend=function(e,t){return e.$i||(e(t,I,k),e.$i=!0),k},k.locale=x,k.isDayjs=y,k.unix=function(e){return k(1e3*e)},k.en=b[v],k.Ls=b,k.p={},k}()},50282:function(e){"use strict";var t,n,o,r,a,i,c,l,u,d,s,p,m,f,h,C,g,N,v,b;e.exports=(c=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,d=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,s={years:l=31536e6,months:u=2628e6,days:i=864e5,hours:a=36e5,minutes:r=6e4,seconds:o=1e3,milliseconds:1,weeks:6048e5},p=function(e){return e instanceof v},m=function(e,t,n){return new v(e,n,t.$l)},f=function(e){return n.p(e)+"s"},h=function(e){return e<0},C=function(e){return h(e)?Math.ceil(e):Math.floor(e)},g=function(e){return Math.abs(e)},N=function(e,t){return e?h(e)?{negative:!0,format:""+g(e)+t}:{negative:!1,format:""+e+t}:{negative:!1,format:""}},v=function(){function e(e,t,n){var o=this;if(this.$d={},this.$l=n,void 0===e&&(this.$ms=0,this.parseFromMilliseconds()),t)return m(e*s[f(t)],this);if("number"==typeof e)return this.$ms=e,this.parseFromMilliseconds(),this;if("object"==typeof e)return Object.keys(e).forEach((function(t){o.$d[f(t)]=e[t]})),this.calMilliseconds(),this;if("string"==typeof e){var r=e.match(d);if(r){var a=r.slice(2).map((function(e){return null!=e?Number(e):0}));return this.$d.years=a[0],this.$d.months=a[1],this.$d.weeks=a[2],this.$d.days=a[3],this.$d.hours=a[4],this.$d.minutes=a[5],this.$d.seconds=a[6],this.calMilliseconds(),this}}return this}var h=e.prototype;return h.calMilliseconds=function(){var e=this;this.$ms=Object.keys(this.$d).reduce((function(t,n){return t+(e.$d[n]||0)*s[n]}),0)},h.parseFromMilliseconds=function(){var e=this.$ms;this.$d.years=C(e/l),e%=l,this.$d.months=C(e/u),e%=u,this.$d.days=C(e/i),e%=i,this.$d.hours=C(e/a),e%=a,this.$d.minutes=C(e/r),e%=r,this.$d.seconds=C(e/o),e%=o,this.$d.milliseconds=e},h.toISOString=function(){var e=N(this.$d.years,"Y"),t=N(this.$d.months,"M"),n=+this.$d.days||0;this.$d.weeks&&(n+=7*this.$d.weeks);var o=N(n,"D"),r=N(this.$d.hours,"H"),a=N(this.$d.minutes,"M"),i=this.$d.seconds||0;this.$d.milliseconds&&(i+=this.$d.milliseconds/1e3,i=Math.round(1e3*i)/1e3);var c=N(i,"S"),l=e.negative||t.negative||o.negative||r.negative||a.negative||c.negative,u=r.format||a.format||c.format?"T":"",d=(l?"-":"")+"P"+e.format+t.format+o.format+u+r.format+a.format+c.format;return"P"===d||"-P"===d?"P0D":d},h.toJSON=function(){return this.toISOString()},h.format=function(e){var t=e||"YYYY-MM-DDTHH:mm:ss",o={Y:this.$d.years,YY:n.s(this.$d.years,2,"0"),YYYY:n.s(this.$d.years,4,"0"),M:this.$d.months,MM:n.s(this.$d.months,2,"0"),D:this.$d.days,DD:n.s(this.$d.days,2,"0"),H:this.$d.hours,HH:n.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:n.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:n.s(this.$d.seconds,2,"0"),SSS:n.s(this.$d.milliseconds,3,"0")};return t.replace(c,(function(e,t){return t||String(o[e])}))},h.as=function(e){return this.$ms/s[f(e)]},h.get=function(e){var t=this.$ms,n=f(e);return"milliseconds"===n?t%=1e3:t="weeks"===n?C(t/s[n]):this.$d[n],t||0},h.add=function(e,t,n){var o;return o=t?e*s[f(t)]:p(e)?e.$ms:m(e,this).$ms,m(this.$ms+o*(n?-1:1),this)},h.subtract=function(e,t){return this.add(e,t,!0)},h.locale=function(e){var t=this.clone();return t.$l=e,t},h.clone=function(){return m(this.$ms,this)},h.humanize=function(e){return t().add(this.$ms,"ms").locale(this.$l).fromNow(!e)},h.valueOf=function(){return this.asMilliseconds()},h.milliseconds=function(){return this.get("milliseconds")},h.asMilliseconds=function(){return this.as("milliseconds")},h.seconds=function(){return this.get("seconds")},h.asSeconds=function(){return this.as("seconds")},h.minutes=function(){return this.get("minutes")},h.asMinutes=function(){return this.as("minutes")},h.hours=function(){return this.get("hours")},h.asHours=function(){return this.as("hours")},h.days=function(){return this.get("days")},h.asDays=function(){return this.as("days")},h.weeks=function(){return this.get("weeks")},h.asWeeks=function(){return this.as("weeks")},h.months=function(){return this.get("months")},h.asMonths=function(){return this.as("months")},h.years=function(){return this.get("years")},h.asYears=function(){return this.as("years")},e}(),b=function(e,t,n){return e.add(t.years()*n,"y").add(t.months()*n,"M").add(t.days()*n,"d").add(t.hours()*n,"h").add(t.minutes()*n,"m").add(t.seconds()*n,"s").add(t.milliseconds()*n,"ms")},function(e,o,r){t=r,n=r().$utils(),r.duration=function(e,t){var n=r.locale();return m(e,{$l:n},t)},r.isDuration=p;var a=o.prototype.add,i=o.prototype.subtract;o.prototype.add=function(e,t){return p(e)?b(this,e,1):a.bind(this)(e,t)},o.prototype.subtract=function(e,t){return p(e)?b(this,e,-1):i.bind(this)(e,t)}})},78978:function(e){"use strict";e.exports=function(e,t,n){e=e||{};var o=t.prototype,r={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function a(e,t,n,r){return o.fromToBase(e,t,n,r)}n.en.relativeTime=r,o.fromToBase=function(t,o,a,i,c){for(var l,u,d,s=a.$locale().relativeTime||r,p=e.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],m=p.length,f=0;f<m;f+=1){var h=p[f];h.d&&(l=i?n(t).diff(a,h.d,!0):a.diff(t,h.d,!0));var C=(e.rounding||Math.round)(Math.abs(l));if(d=l>0,C<=h.r||!h.r){C<=1&&f>0&&(h=p[f-1]);var g=s[h.l];c&&(C=c(""+C)),u="string"==typeof g?g.replace("%d",C):g(C,o,h.l,d);break}}if(o)return u;var N=d?s.future:s.past;return"function"==typeof N?N(u):N.replace("%s",u)},o.to=function(e,t){return a(e,t,this,!0)},o.from=function(e,t){return a(e,t,this)};var i=function(e){return e.$u?n.utc():n()};o.toNow=function(e){return this.to(i(this),e)},o.fromNow=function(e){return this.from(i(this),e)}}},42950:function(e){"use strict";e.exports=function(){function e(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var t=Object.hasOwnProperty,n=Object.setPrototypeOf,o=Object.isFrozen,r=Object.getPrototypeOf,a=Object.getOwnPropertyDescriptor,i=Object.freeze,c=Object.seal,l=Object.create,u="undefined"!=typeof Reflect&&Reflect,d=u.apply,s=u.construct;d||(d=function(){function e(e,t,n){return e.apply(t,n)}return e}()),i||(i=function(){function e(e){return e}return e}()),c||(c=function(){function e(e){return e}return e}()),s||(s=function(){function t(t,n){return new(Function.prototype.bind.apply(t,[null].concat(e(n))))}return t}());var p=y(Array.prototype.forEach),m=y(Array.prototype.pop),f=y(Array.prototype.push),h=y(String.prototype.toLowerCase),C=y(String.prototype.match),g=y(String.prototype.replace),N=y(String.prototype.indexOf),v=y(String.prototype.trim),b=y(RegExp.prototype.test),V=x(TypeError);function y(e){return function(t){for(var n=arguments.length,o=Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return d(e,t,o)}}function x(e){return function(){for(var t=arguments.length,n=Array(t),o=0;o<t;o++)n[o]=arguments[o];return s(e,n)}}function k(e,t){n&&n(e,null);for(var r=t.length;r--;){var a=t[r];if("string"==typeof a){var i=h(a);i!==a&&(o(t)||(t[r]=i),a=i)}e[a]=!0}return e}function S(e){var n=l(null),o=void 0;for(o in e)d(t,e,[o])&&(n[o]=e[o]);return n}function I(e,t){for(;null!==e;){var n=a(e,t);if(n){if(n.get)return y(n.get);if("function"==typeof n.value)return y(n.value)}e=r(e)}function o(e){return null}return o}var w=i(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),_=i(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),D=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),M=i(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),B=i(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),A=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),T=i(["#text"]),L=i(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),E=i(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),P=i(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),j=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),O=c(/\{\{[\s\S]*|[\s\S]*\}\}/gm),F=c(/<%[\s\S]*|[\s\S]*%>/gm),R=c(/^data-[\-\w.\u00B7-\uFFFF]/),z=c(/^aria-[\-\w]+$/),W=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),U=c(/^(?:\w+script|data):/i),H=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function Y(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var Z=function(){function e(){return"undefined"==typeof window?null:window}return e}(),K=function(){function e(e,t){if("object"!==(void 0===e?"undefined":G(e))||"function"!=typeof e.createPolicy)return null;var n=null,o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(){function e(e){return e}return e}()})}catch(a){return null}}return e}();function Q(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:Z(),t=function(){function e(e){return Q(e)}return e}();if(t.version="2.3.1",t.removed=[],!e||!e.document||9!==e.document.nodeType)return t.isSupported=!1,t;var n=e.document,o=e.document,r=e.DocumentFragment,a=e.HTMLTemplateElement,c=e.Node,l=e.Element,u=e.NodeFilter,d=e.NamedNodeMap,s=d===undefined?e.NamedNodeMap||e.MozNamedAttrMap:d,y=e.Text,x=e.Comment,$=e.DOMParser,J=e.trustedTypes,X=l.prototype,q=I(X,"cloneNode"),ee=I(X,"nextSibling"),te=I(X,"childNodes"),ne=I(X,"parentNode");if("function"==typeof a){var oe=o.createElement("template");oe.content&&oe.content.ownerDocument&&(o=oe.content.ownerDocument)}var re=K(J,n),ae=re&&je?re.createHTML(""):"",ie=o,ce=ie.implementation,le=ie.createNodeIterator,ue=ie.createDocumentFragment,de=ie.getElementsByTagName,se=n.importNode,pe={};try{pe=S(o).documentMode?o.documentMode:{}}catch(Nt){}var me={};t.isSupported="function"==typeof ne&&ce&&"undefined"!=typeof ce.createHTMLDocument&&9!==pe;var fe=O,he=F,Ce=R,ge=z,Ne=U,ve=H,be=W,Ve=null,ye=k({},[].concat(Y(w),Y(_),Y(D),Y(B),Y(T))),xe=null,ke=k({},[].concat(Y(L),Y(E),Y(P),Y(j))),Se=null,Ie=null,we=!0,_e=!0,De=!1,Me=!1,Be=!1,Ae=!1,Te=!1,Le=!1,Ee=!1,Pe=!0,je=!1,Oe=!0,Fe=!0,Re=!1,ze={},We=null,Ue=k({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),He=null,Ge=k({},["audio","video","img","source","image","track"]),Ye=null,Ze=k({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ke="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",$e="http://www.w3.org/1999/xhtml",Je=$e,Xe=!1,qe=null,et=o.createElement("form"),tt=function(){function e(e){qe&&qe===e||(e&&"object"===(void 0===e?"undefined":G(e))||(e={}),e=S(e),Ve="ALLOWED_TAGS"in e?k({},e.ALLOWED_TAGS):ye,xe="ALLOWED_ATTR"in e?k({},e.ALLOWED_ATTR):ke,Ye="ADD_URI_SAFE_ATTR"in e?k(S(Ze),e.ADD_URI_SAFE_ATTR):Ze,He="ADD_DATA_URI_TAGS"in e?k(S(Ge),e.ADD_DATA_URI_TAGS):Ge,We="FORBID_CONTENTS"in e?k({},e.FORBID_CONTENTS):Ue,Se="FORBID_TAGS"in e?k({},e.FORBID_TAGS):{},Ie="FORBID_ATTR"in e?k({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,we=!1!==e.ALLOW_ARIA_ATTR,_e=!1!==e.ALLOW_DATA_ATTR,De=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Me=e.SAFE_FOR_TEMPLATES||!1,Be=e.WHOLE_DOCUMENT||!1,Le=e.RETURN_DOM||!1,Ee=e.RETURN_DOM_FRAGMENT||!1,Pe=!1!==e.RETURN_DOM_IMPORT,je=e.RETURN_TRUSTED_TYPE||!1,Te=e.FORCE_BODY||!1,Oe=!1!==e.SANITIZE_DOM,Fe=!1!==e.KEEP_CONTENT,Re=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Je=e.NAMESPACE||$e,Me&&(_e=!1),Ee&&(Le=!0),ze&&(Ve=k({},[].concat(Y(T))),xe=[],!0===ze.html&&(k(Ve,w),k(xe,L)),!0===ze.svg&&(k(Ve,_),k(xe,E),k(xe,j)),!0===ze.svgFilters&&(k(Ve,D),k(xe,E),k(xe,j)),!0===ze.mathMl&&(k(Ve,B),k(xe,P),k(xe,j))),e.ADD_TAGS&&(Ve===ye&&(Ve=S(Ve)),k(Ve,e.ADD_TAGS)),e.ADD_ATTR&&(xe===ke&&(xe=S(xe)),k(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&k(Ye,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(We===Ue&&(We=S(We)),k(We,e.FORBID_CONTENTS)),Fe&&(Ve["#text"]=!0),Be&&k(Ve,["html","head","body"]),Ve.table&&(k(Ve,["tbody"]),delete Se.tbody),i&&i(e),qe=e)}return e}(),nt=k({},["mi","mo","mn","ms","mtext"]),ot=k({},["foreignobject","desc","title","annotation-xml"]),rt=k({},_);k(rt,D),k(rt,M);var at=k({},B);k(at,A);var it=function(){function e(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:$e,tagName:"template"});var n=h(e.tagName),o=h(t.tagName);if(e.namespaceURI===Qe)return t.namespaceURI===$e?"svg"===n:t.namespaceURI===Ke?"svg"===n&&("annotation-xml"===o||nt[o]):Boolean(rt[n]);if(e.namespaceURI===Ke)return t.namespaceURI===$e?"math"===n:t.namespaceURI===Qe?"math"===n&&ot[o]:Boolean(at[n]);if(e.namespaceURI===$e){if(t.namespaceURI===Qe&&!ot[o])return!1;if(t.namespaceURI===Ke&&!nt[o])return!1;var r=k({},["title","style","font","a","script"]);return!at[n]&&(r[n]||!rt[n])}return!1}return e}(),ct=function(){function e(e){f(t.removed,{element:e});try{e.parentNode.removeChild(e)}catch(Nt){try{e.outerHTML=ae}catch(Nt){e.remove()}}}return e}(),lt=function(){function e(e,n){try{f(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch(Nt){f(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),"is"===e&&!xe[e])if(Le||Ee)try{ct(n)}catch(Nt){}else try{n.setAttribute(e,"")}catch(Nt){}}return e}(),ut=function(){function e(e){var t=void 0,n=void 0;if(Te)e="<remove></remove>"+e;else{var r=C(e,/^[\r\n\t ]+/);n=r&&r[0]}var a=re?re.createHTML(e):e;if(Je===$e)try{t=(new $).parseFromString(a,"text/html")}catch(Nt){}if(!t||!t.documentElement){t=ce.createDocument(Je,"template",null);try{t.documentElement.innerHTML=Xe?"":a}catch(Nt){}}var i=t.body||t.documentElement;return e&&n&&i.insertBefore(o.createTextNode(n),i.childNodes[0]||null),Je===$e?de.call(t,Be?"html":"body")[0]:Be?t.documentElement:i}return e}(),dt=function(){function e(e){return le.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,null,!1)}return e}(),st=function(){function e(e){return!(e instanceof y||e instanceof x||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof s&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)}return e}(),pt=function(){function e(e){return"object"===(void 0===c?"undefined":G(c))?e instanceof c:e&&"object"===(void 0===e?"undefined":G(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName}return e}(),mt=function(){function e(e,n,o){me[e]&&p(me[e],(function(e){e.call(t,n,o,qe)}))}return e}(),ft=function(){function e(e){var n=void 0;if(mt("beforeSanitizeElements",e,null),st(e))return ct(e),!0;if(C(e.nodeName,/[\u0080-\uFFFF]/))return ct(e),!0;var o=h(e.nodeName);if(mt("uponSanitizeElement",e,{tagName:o,allowedTags:Ve}),!pt(e.firstElementChild)&&(!pt(e.content)||!pt(e.content.firstElementChild))&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return ct(e),!0;if("select"===o&&b(/<template/i,e.innerHTML))return ct(e),!0;if(!Ve[o]||Se[o]){if(Fe&&!We[o]){var r=ne(e)||e.parentNode,a=te(e)||e.childNodes;if(a&&r)for(var i=a.length-1;i>=0;--i)r.insertBefore(q(a[i],!0),ee(e))}return ct(e),!0}return e instanceof l&&!it(e)?(ct(e),!0):"noscript"!==o&&"noembed"!==o||!b(/<\/no(script|embed)/i,e.innerHTML)?(Me&&3===e.nodeType&&(n=e.textContent,n=g(n,fe," "),n=g(n,he," "),e.textContent!==n&&(f(t.removed,{element:e.cloneNode()}),e.textContent=n)),mt("afterSanitizeElements",e,null),!1):(ct(e),!0)}return e}(),ht=function(){function e(e,t,n){if(Oe&&("id"===t||"name"===t)&&(n in o||n in et))return!1;if(_e&&!Ie[t]&&b(Ce,t));else if(we&&b(ge,t));else{if(!xe[t]||Ie[t])return!1;if(Ye[t]);else if(b(be,g(n,ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!He[e])if(De&&!b(Ne,g(n,ve,"")));else if(n)return!1}return!0}return e}(),Ct=function(){function e(e){var n=void 0,o=void 0,r=void 0,a=void 0;mt("beforeSanitizeAttributes",e,null);var i=e.attributes;if(i){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(a=i.length;a--;){var l=n=i[a],u=l.name,d=l.namespaceURI;if(o=v(n.value),r=h(u),c.attrName=r,c.attrValue=o,c.keepAttr=!0,c.forceKeepAttr=undefined,mt("uponSanitizeAttribute",e,c),o=c.attrValue,!c.forceKeepAttr&&(lt(u,e),c.keepAttr))if(b(/\/>/i,o))lt(u,e);else{Me&&(o=g(o,fe," "),o=g(o,he," "));var s=e.nodeName.toLowerCase();if(ht(s,r,o))try{d?e.setAttributeNS(d,u,o):e.setAttribute(u,o),m(t.removed)}catch(Nt){}}}mt("afterSanitizeAttributes",e,null)}}return e}(),gt=function(){function e(t){var n=void 0,o=dt(t);for(mt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)mt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof r&&e(n.content),Ct(n));mt("afterSanitizeShadowDOM",t,null)}return e}();return t.sanitize=function(o,a){var i=void 0,l=void 0,u=void 0,d=void 0,s=void 0;if((Xe=!o)&&(o="\x3c!--\x3e"),"string"!=typeof o&&!pt(o)){if("function"!=typeof o.toString)throw V("toString is not a function");if("string"!=typeof(o=o.toString()))throw V("dirty is not a string, aborting")}if(!t.isSupported){if("object"===G(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof o)return e.toStaticHTML(o);if(pt(o))return e.toStaticHTML(o.outerHTML)}return o}if(Ae||tt(a),t.removed=[],"string"==typeof o&&(Re=!1),Re);else if(o instanceof c)1===(l=(i=ut("\x3c!----\x3e")).ownerDocument.importNode(o,!0)).nodeType&&"BODY"===l.nodeName||"HTML"===l.nodeName?i=l:i.appendChild(l);else{if(!Le&&!Me&&!Be&&-1===o.indexOf("<"))return re&&je?re.createHTML(o):o;if(!(i=ut(o)))return Le?null:ae}i&&Te&&ct(i.firstChild);for(var p=dt(Re?o:i);u=p.nextNode();)3===u.nodeType&&u===d||ft(u)||(u.content instanceof r&&gt(u.content),Ct(u),d=u);if(d=null,Re)return o;if(Le){if(Ee)for(s=ue.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return Pe&&(s=se.call(n,s,!0)),s}var m=Be?i.outerHTML:i.innerHTML;return Me&&(m=g(m,fe," "),m=g(m,he," ")),re&&je?re.createHTML(m):m},t.setConfig=function(e){tt(e),Ae=!0},t.clearConfig=function(){qe=null,Ae=!1},t.isValidAttribute=function(e,t,n){qe||tt({});var o=h(e),r=h(t);return ht(o,r,n)},t.addHook=function(e,t){"function"==typeof t&&(me[e]=me[e]||[],f(me[e],t))},t.removeHook=function(e){me[e]&&m(me[e])},t.removeHooks=function(e){me[e]&&(me[e]=[])},t.removeAllHooks=function(){me={}},t}return Q()}()},92376:function(e,t){"use strict";t.__esModule=!0,t._CI=De,t._HI=O,t._M=Be,t._MCCC=Ee,t._ME=Te,t._MFCC=Pe,t._MP=we,t._MR=ve,t._RFC=Me,t.__render=ze,t.createComponentVNode=function(e,t,n,o,a){var i=new M(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),o,function(e,t,n){var o=(32768&e?t.render:t).defaultProps;if(r(o))return n;if(r(n))return u(o,null);return w(n,o)}(e,t,n),function(e,t,n){if(4&e)return n;var o=(32768&e?t.render:t).defaultHooks;if(r(o))return n;if(r(n))return o;return w(n,o)}(e,t,a),t);k.createVNode&&k.createVNode(i);return i},t.createFragment=T,t.createPortal=function(e,t){var n=O(e);return B(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,o,r){e||(e=t),We(n,e,o,r)}},t.createTextVNode=A,t.createVNode=B,t.directClone=L,t.findDOMfromVNode=v,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case p:return 8192;default:return 1}},t.linkEvent=function(e,t){if(i(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&r(e.children)&&j(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?u(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=We,t.rerender=Ke,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var n=Array.isArray;function o(e){var t=typeof e;return"string"===t||"number"===t}function r(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function i(e){return"function"==typeof e}function c(e){return"string"==typeof e}function l(e){return null===e}function u(e,t){var n={};if(e)for(var o in e)n[o]=e[o];if(t)for(var r in t)n[r]=t[r];return n}function d(e){return!l(e)&&"object"==typeof e}var s={};t.EMPTY_OBJ=s;var p="$F";function m(e){return e.substr(2).toLowerCase()}function f(e,t){e.appendChild(t)}function h(e,t,n){l(n)?f(e,t):e.insertBefore(t,n)}function C(e,t){e.removeChild(t)}function g(e){for(var t=0;t<e.length;t++)e[t]()}function N(e,t,n){var o=e.children;return 4&n?o.$LI:8192&n?2===e.childFlags?o:o[t?0:o.length-1]:o}function v(e,t){for(var n;e;){if(2033&(n=e.flags))return e.dom;e=N(e,t,n)}return null}function b(e,t){do{var n=e.flags;if(2033&n)return void C(t,e.dom);var o=e.children;if(4&n&&(e=o.$LI),8&n&&(e=o),8192&n){if(2!==e.childFlags){for(var r=0,a=o.length;r<a;++r)b(o[r],t);return}e=o}}while(e)}function V(e,t,n){do{var o=e.flags;if(2033&o)return void h(t,e.dom,n);var r=e.children;if(4&o&&(e=r.$LI),8&o&&(e=r),8192&o){if(2!==e.childFlags){for(var a=0,i=r.length;a<i;++a)V(r[a],t,n);return}e=r}}while(e)}function y(e,t,n){return e.constructor.getDerivedStateFromProps?u(n,e.constructor.getDerivedStateFromProps(t,n)):n}t.Fragment=p;var x={v:!1},k={componentComparator:null,createVNode:null,renderComplete:null};function S(e,t){e.textContent=t}function I(e,t){return d(e)&&e.event===t.event&&e.data===t.data}function w(e,t){for(var n in t)void 0===e[n]&&(e[n]=t[n]);return e}function _(e,t){return!!i(e)&&(e(t),!0)}t.options=k;var D="$";function M(e,t,n,o,r,a,i,c){this.childFlags=e,this.children=t,this.className=n,this.dom=null,this.flags=o,this.key=void 0===r?null:r,this.props=void 0===a?null:a,this.ref=void 0===i?null:i,this.type=c}function B(e,t,n,o,r,a,i,c){var l=void 0===r?1:r,u=new M(l,o,n,e,i,a,c,t);return k.createVNode&&k.createVNode(u),0===l&&j(u,u.children),u}function A(e,t){return new M(1,r(e)||!0===e||!1===e?"":e,null,16,t,null,null,null)}function T(e,t,n){var o=B(8192,8192,null,e,t,null,n,null);switch(o.childFlags){case 1:o.children=E(),o.childFlags=2;break;case 16:o.children=[A(e)],o.childFlags=4}return o}function L(e){var t=-16385&e.flags,n=e.props;if(14&t&&!l(n)){var o=n;for(var r in n={},o)n[r]=o[r]}return 0==(8192&t)?new M(e.childFlags,e.children,e.className,t,e.key,n,e.ref,e.type):function(e){var t=e.children,n=e.childFlags;return T(2===n?L(t):t.map(L),n,e.key)}(e)}function E(){return A("",null)}function P(e,t,r,i){for(var u=e.length;r<u;r++){var d=e[r];if(!a(d)){var s=i+D+r;if(n(d))P(d,t,0,s);else{if(o(d))d=A(d,s);else{var p=d.key,m=c(p)&&p[0]===D;(81920&d.flags||m)&&(d=L(d)),d.flags|=65536,m?p.substring(0,i.length)!==i&&(d.key=i+p):l(p)?d.key=s:d.key=i+p}t.push(d)}}}}function j(e,t){var r,i=1;if(a(t))r=t;else if(o(t))i=16,r=t;else if(n(t)){for(var u=t.length,d=0;d<u;++d){var s=t[d];if(a(s)||n(s)){r=r||t.slice(0,d),P(t,r,d,"");break}if(o(s))(r=r||t.slice(0,d)).push(A(s,D+d));else{var p=s.key,m=(81920&s.flags)>0,f=l(p),h=c(p)&&p[0]===D;m||f||h?(r=r||t.slice(0,d),(m||h)&&(s=L(s)),(f||h)&&(s.key=D+d),r.push(s)):r&&r.push(s),s.flags|=65536}}i=0===(r=r||t).length?1:8}else(r=t).flags|=65536,81920&t.flags&&(r=L(t)),i=2;return e.children=r,e.childFlags=i,e}function O(e){return a(e)||o(e)?A(e,null):n(e)?T(e,0,null):16384&e.flags?L(e):e}var F="http://www.w3.org/1999/xlink",R="http://www.w3.org/XML/1998/namespace",z={"xlink:actuate":F,"xlink:arcrole":F,"xlink:href":F,"xlink:role":F,"xlink:show":F,"xlink:title":F,"xlink:type":F,"xml:base":R,"xml:lang":R,"xml:space":R};function W(e){return{onClick:e,onDblClick:e,onFocusIn:e,onFocusOut:e,onKeyDown:e,onKeyPress:e,onKeyUp:e,onMouseDown:e,onMouseMove:e,onMouseUp:e,onTouchEnd:e,onTouchMove:e,onTouchStart:e}}var U=W(0),H=W(null),G=W(!0);function Y(e,t){var n=t.$EV;return n||(n=t.$EV=W(null)),n[e]||1==++U[e]&&(H[e]=function(e){var t="onClick"===e||"onDblClick"===e?function(e){return function(t){0===t.button?K(t,!0,e,X(t)):t.stopPropagation()}}(e):function(e){return function(t){K(t,!1,e,X(t))}}(e);return document.addEventListener(m(e),t),t}(e)),n}function Z(e,t){var n=t.$EV;n&&n[e]&&(0==--U[e]&&(document.removeEventListener(m(e),H[e]),H[e]=null),n[e]=null)}function K(e,t,n,o){var r=function(e){return i(e.composedPath)?e.composedPath()[0]:e.target}(e);do{if(t&&r.disabled)return;var a=r.$EV;if(a){var c=a[n];if(c&&(o.dom=r,c.event?c.event(c.data,e):c(e),e.cancelBubble))return}r=r.parentNode}while(!l(r))}function Q(){this.cancelBubble=!0,this.immediatePropagationStopped||this.stopImmediatePropagation()}function $(){return this.defaultPrevented}function J(){return this.cancelBubble}function X(e){var t={dom:document};return e.isDefaultPrevented=$,e.isPropagationStopped=J,e.stopPropagation=Q,Object.defineProperty(e,"currentTarget",{configurable:!0,get:function(){return t.dom}}),t}function q(e,t,n){if(e[t]){var o=e[t];o.event?o.event(o.data,n):o(n)}else{var r=t.toLowerCase();e[r]&&e[r](n)}}function ee(e,t){var n=function(n){var o=this.$V;if(o){var r=o.props||s,a=o.dom;if(c(e))q(r,e,n);else for(var l=0;l<e.length;++l)q(r,e[l],n);if(i(t)){var u=this.$V,d=u.props||s;t(d,a,!1,u)}}};return Object.defineProperty(n,"wrapped",{configurable:!1,enumerable:!1,value:!0,writable:!1}),n}function te(e,t,n){var o="$"+t,r=e[o];if(r){if(r[1].wrapped)return;e.removeEventListener(r[0],r[1]),e[o]=null}i(n)&&(e.addEventListener(t,n),e[o]=[t,n])}function ne(e){return"checkbox"===e||"radio"===e}var oe=ee("onInput",ie),re=ee(["onClick","onChange"],ie);function ae(e){e.stopPropagation()}function ie(e,t){var n=e.type,o=e.value,a=e.checked,i=e.multiple,c=e.defaultValue,l=!r(o);n&&n!==t.type&&t.setAttribute("type",n),r(i)||i===t.multiple||(t.multiple=i),r(c)||l||(t.defaultValue=c+""),ne(n)?(l&&(t.value=o),r(a)||(t.checked=a)):l&&t.value!==o?(t.defaultValue=o,t.value=o):r(a)||(t.checked=a)}function ce(e,t){if("option"===e.type)!function(e,t){var o=e.props||s,a=e.dom;a.value=o.value,o.value===t||n(t)&&-1!==t.indexOf(o.value)?a.selected=!0:r(t)&&r(o.selected)||(a.selected=o.selected||!1)}(e,t);else{var o=e.children,a=e.flags;if(4&a)ce(o.$LI,t);else if(8&a)ce(o,t);else if(2===e.childFlags)ce(o,t);else if(12&e.childFlags)for(var i=0,c=o.length;i<c;++i)ce(o[i],t)}}ae.wrapped=!0;var le=ee("onChange",ue);function ue(e,t,n,o){var a=Boolean(e.multiple);r(e.multiple)||a===t.multiple||(t.multiple=a);var i=e.selectedIndex;if(-1===i&&(t.selectedIndex=-1),1!==o.childFlags){var c=e.value;"number"==typeof i&&i>-1&&t.options[i]&&(c=t.options[i].value),n&&r(c)&&(c=e.defaultValue),ce(o,c)}}var de,se,pe=ee("onInput",fe),me=ee("onChange");function fe(e,t,n){var o=e.value,a=t.value;if(r(o)){if(n){var i=e.defaultValue;r(i)||i===a||(t.defaultValue=i,t.value=i)}}else a!==o&&(t.defaultValue=o,t.value=o)}function he(e,t,n,o,r,a){64&e?ie(o,n):256&e?ue(o,n,r,t):128&e&&fe(o,n,r),a&&(n.$V=t)}function Ce(e,t,n){64&e?function(e,t){ne(t.type)?(te(e,"change",re),te(e,"click",ae)):te(e,"input",oe)}(t,n):256&e?function(e){te(e,"change",le)}(t):128&e&&function(e,t){te(e,"input",pe),t.onChange&&te(e,"change",me)}(t,n)}function ge(e){return e.type&&ne(e.type)?!r(e.checked):!r(e.value)}function Ne(e){e&&!_(e,null)&&e.current&&(e.current=null)}function ve(e,t,n){e&&(i(e)||void 0!==e.current)&&n.push((function(){_(e,t)||void 0===e.current||(e.current=t)}))}function be(e,t){Ve(e),b(e,t)}function Ve(e){var t,n=e.flags,o=e.children;if(481&n){t=e.ref;var a=e.props;Ne(t);var c=e.childFlags;if(!l(a))for(var u=Object.keys(a),d=0,p=u.length;d<p;d++){var m=u[d];G[m]&&Z(m,e.dom)}12&c?ye(o):2===c&&Ve(o)}else o&&(4&n?(i(o.componentWillUnmount)&&o.componentWillUnmount(),Ne(e.ref),o.$UN=!0,Ve(o.$LI)):8&n?(!r(t=e.ref)&&i(t.onComponentWillUnmount)&&t.onComponentWillUnmount(v(e,!0),e.props||s),Ve(o)):1024&n?be(o,e.ref):8192&n&&12&e.childFlags&&ye(o))}function ye(e){for(var t=0,n=e.length;t<n;++t)Ve(e[t])}function xe(e){e.textContent=""}function ke(e,t,n){ye(n),8192&t.flags?b(t,e):xe(e)}function Se(e,t,n,o){var a=e&&e.__html||"",i=t&&t.__html||"";a!==i&&(r(i)||function(e,t){var n=document.createElement("i");return n.innerHTML=t,n.innerHTML===e.innerHTML}(o,i)||(l(n)||(12&n.childFlags?ye(n.children):2===n.childFlags&&Ve(n.children),n.children=null,n.childFlags=1),o.innerHTML=i))}function Ie(e,t,n,o,a,l,u){switch(e){case"children":case"childrenType":case"className":case"defaultValue":case"key":case"multiple":case"ref":case"selectedIndex":break;case"autoFocus":o.autofocus=!!n;break;case"allowfullscreen":case"autoplay":case"capture":case"checked":case"controls":case"default":case"disabled":case"hidden":case"indeterminate":case"loop":case"muted":case"novalidate":case"open":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"selected":o[e]=!!n;break;case"defaultChecked":case"value":case"volume":if(l&&"value"===e)break;var s=r(n)?"":n;o[e]!==s&&(o[e]=s);break;case"style":!function(e,t,n){if(r(t))n.removeAttribute("style");else{var o,a,i=n.style;if(c(t))i.cssText=t;else if(r(e)||c(e))for(o in t)a=t[o],i.setProperty(o,a);else{for(o in t)(a=t[o])!==e[o]&&i.setProperty(o,a);for(o in e)r(t[o])&&i.removeProperty(o)}}}(t,n,o);break;case"dangerouslySetInnerHTML":Se(t,n,u,o);break;default:G[e]?function(e,t,n,o){if(i(n))Y(e,o)[e]=n;else if(d(n)){if(I(t,n))return;Y(e,o)[e]=n}else Z(e,o)}(e,t,n,o):111===e.charCodeAt(0)&&110===e.charCodeAt(1)?function(e,t,n,o){if(d(n)){if(I(t,n))return;n=function(e){var t=e.event;return function(n){t(e.data,n)}}(n)}te(o,m(e),n)}(e,t,n,o):r(n)?o.removeAttribute(e):a&&z[e]?o.setAttributeNS(z[e],e,n):o.setAttribute(e,n)}}function we(e,t,n,o,r){var a=!1,i=(448&t)>0;for(var c in i&&(a=ge(n))&&Ce(t,o,n),n)Ie(c,null,n[c],o,r,a,null);i&&he(t,e,o,n,!0,a)}function _e(e,t,n){var o=O(e.render(t,e.state,n)),r=n;return i(e.getChildContext)&&(r=u(n,e.getChildContext())),e.$CX=r,o}function De(e,t,n,o,r,a){var c=new t(n,o),u=c.$N=Boolean(t.getDerivedStateFromProps||c.getSnapshotBeforeUpdate);if(c.$SVG=r,c.$L=a,e.children=c,c.$BS=!1,c.context=o,c.props===s&&(c.props=n),u)c.state=y(c,n,c.state);else if(i(c.componentWillMount)){c.$BR=!0,c.componentWillMount();var d=c.$PS;if(!l(d)){var p=c.state;if(l(p))c.state=d;else for(var m in d)p[m]=d[m];c.$PS=null}c.$BR=!1}return c.$LI=_e(c,n,o),c}function Me(e,t){var n=e.props||s;return 32768&e.flags?e.type.render(n,e.ref,t):e.type(n,t)}function Be(e,t,n,o,r,a){var i=e.flags|=16384;481&i?Te(e,t,n,o,r,a):4&i?function(e,t,n,o,r,a){var i=De(e,e.type,e.props||s,n,o,a);Be(i.$LI,t,i.$CX,o,r,a),Ee(e.ref,i,a)}(e,t,n,o,r,a):8&i?(!function(e,t,n,o,r,a){Be(e.children=O(Me(e,n)),t,n,o,r,a)}(e,t,n,o,r,a),Pe(e,a)):512&i||16&i?Ae(e,t,r):8192&i?function(e,t,n,o,r,a){var i=e.children,c=e.childFlags;12&c&&0===i.length&&(c=e.childFlags=2,i=e.children=E());2===c?Be(i,n,r,o,r,a):Le(i,n,t,o,r,a)}(e,n,t,o,r,a):1024&i&&function(e,t,n,o,r){Be(e.children,e.ref,t,!1,null,r);var a=E();Ae(a,n,o),e.dom=a.dom}(e,n,t,r,a)}function Ae(e,t,n){var o=e.dom=document.createTextNode(e.children);l(t)||h(t,o,n)}function Te(e,t,n,o,a,i){var c=e.flags,u=e.props,d=e.className,s=e.childFlags,p=e.dom=function(e,t){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}(e.type,o=o||(32&c)>0),m=e.children;if(r(d)||""===d||(o?p.setAttribute("class",d):p.className=d),16===s)S(p,m);else if(1!==s){var f=o&&"foreignObject"!==e.type;2===s?(16384&m.flags&&(e.children=m=L(m)),Be(m,p,n,f,null,i)):8!==s&&4!==s||Le(m,p,n,f,null,i)}l(t)||h(t,p,a),l(u)||we(e,c,u,p,o),ve(e.ref,p,i)}function Le(e,t,n,o,r,a){for(var i=0;i<e.length;++i){var c=e[i];16384&c.flags&&(e[i]=c=L(c)),Be(c,t,n,o,r,a)}}function Ee(e,t,n){ve(e,t,n),i(t.componentDidMount)&&n.push(function(e){return function(){e.componentDidMount()}}(t))}function Pe(e,t){var n=e.ref;r(n)||(_(n.onComponentWillMount,e.props||s),i(n.onComponentDidMount)&&t.push(function(e,t){return function(){e.onComponentDidMount(v(t,!0),t.props||s)}}(n,e)))}function je(e,t,n,o,c,d,p){var m=t.flags|=16384;e.flags!==m||e.type!==t.type||e.key!==t.key||2048&m?16384&e.flags?function(e,t,n,o,r,a){Ve(e),0!=(t.flags&e.flags&2033)?(Be(t,null,o,r,null,a),function(e,t,n){e.replaceChild(t,n)}(n,t.dom,e.dom)):(Be(t,n,o,r,v(e,!0),a),b(e,n))}(e,t,n,o,c,p):Be(t,n,o,c,d,p):481&m?function(e,t,n,o,a,i){var c,l=t.dom=e.dom,u=e.props,d=t.props,p=!1,m=!1;if(o=o||(32&a)>0,u!==d){var f=u||s;if((c=d||s)!==s)for(var h in(p=(448&a)>0)&&(m=ge(c)),c){var C=f[h],g=c[h];C!==g&&Ie(h,C,g,l,o,m,e)}if(f!==s)for(var N in f)r(c[N])&&!r(f[N])&&Ie(N,f[N],null,l,o,m,e)}var v=t.children,b=t.className;e.className!==b&&(r(b)?l.removeAttribute("class"):o?l.setAttribute("class",b):l.className=b);4096&a?function(e,t){e.textContent!==t&&(e.textContent=t)}(l,v):Oe(e.childFlags,t.childFlags,e.children,v,l,n,o&&"foreignObject"!==t.type,null,e,i);p&&he(a,t,l,c,!1,m);var V=t.ref,y=e.ref;y!==V&&(Ne(y),ve(V,l,i))}(e,t,o,c,m,p):4&m?function(e,t,n,o,r,a,c){var d=t.children=e.children;if(l(d))return;d.$L=c;var p=t.props||s,m=t.ref,f=e.ref,h=d.state;if(!d.$N){if(i(d.componentWillReceiveProps)){if(d.$BR=!0,d.componentWillReceiveProps(p,o),d.$UN)return;d.$BR=!1}l(d.$PS)||(h=u(h,d.$PS),d.$PS=null)}Fe(d,h,p,n,o,r,!1,a,c),f!==m&&(Ne(f),ve(m,d,c))}(e,t,n,o,c,d,p):8&m?function(e,t,n,o,a,c,l){var u=!0,d=t.props||s,p=t.ref,m=e.props,f=!r(p),h=e.children;f&&i(p.onComponentShouldUpdate)&&(u=p.onComponentShouldUpdate(m,d));if(!1!==u){f&&i(p.onComponentWillUpdate)&&p.onComponentWillUpdate(m,d);var C=O(Me(t,o));je(h,C,n,o,a,c,l),t.children=C,f&&i(p.onComponentDidUpdate)&&p.onComponentDidUpdate(m,d)}else t.children=h}(e,t,n,o,c,d,p):16&m?function(e,t){var n=t.children,o=t.dom=e.dom;n!==e.children&&(o.nodeValue=n)}(e,t):512&m?t.dom=e.dom:8192&m?function(e,t,n,o,r,a){var i=e.children,c=t.children,l=e.childFlags,u=t.childFlags,d=null;12&u&&0===c.length&&(u=t.childFlags=2,c=t.children=E());var s=0!=(2&u);if(12&l){var p=i.length;(8&l&&8&u||s||!s&&c.length>p)&&(d=v(i[p-1],!1).nextSibling)}Oe(l,u,i,c,n,o,r,d,e,a)}(e,t,n,o,c,p):function(e,t,n,o){var r=e.ref,i=t.ref,c=t.children;if(Oe(e.childFlags,t.childFlags,e.children,c,r,n,!1,null,e,o),t.dom=e.dom,r!==i&&!a(c)){var l=c.dom;C(r,l),f(i,l)}}(e,t,o,p)}function Oe(e,t,n,o,r,a,i,c,l,u){switch(e){case 2:switch(t){case 2:je(n,o,r,a,i,c,u);break;case 1:be(n,r);break;case 16:Ve(n),S(r,o);break;default:!function(e,t,n,o,r,a){Ve(e),Le(t,n,o,r,v(e,!0),a),b(e,n)}(n,o,r,a,i,u)}break;case 1:switch(t){case 2:Be(o,r,a,i,c,u);break;case 1:break;case 16:S(r,o);break;default:Le(o,r,a,i,c,u)}break;case 16:switch(t){case 16:!function(e,t,n){e!==t&&(""!==e?n.firstChild.nodeValue=t:S(n,t))}(n,o,r);break;case 2:xe(r),Be(o,r,a,i,c,u);break;case 1:xe(r);break;default:xe(r),Le(o,r,a,i,c,u)}break;default:switch(t){case 16:ye(n),S(r,o);break;case 2:ke(r,l,n),Be(o,r,a,i,c,u);break;case 1:ke(r,l,n);break;default:var d=0|n.length,s=0|o.length;0===d?s>0&&Le(o,r,a,i,c,u):0===s?ke(r,l,n):8===t&&8===e?function(e,t,n,o,r,a,i,c,l,u){var d,s,p=a-1,m=i-1,f=0,h=e[f],C=t[f];e:{for(;h.key===C.key;){if(16384&C.flags&&(t[f]=C=L(C)),je(h,C,n,o,r,c,u),e[f]=C,++f>p||f>m)break e;h=e[f],C=t[f]}for(h=e[p],C=t[m];h.key===C.key;){if(16384&C.flags&&(t[m]=C=L(C)),je(h,C,n,o,r,c,u),e[p]=C,m--,f>--p||f>m)break e;h=e[p],C=t[m]}}if(f>p){if(f<=m)for(s=(d=m+1)<i?v(t[d],!0):c;f<=m;)16384&(C=t[f]).flags&&(t[f]=C=L(C)),++f,Be(C,n,o,r,s,u)}else if(f>m)for(;f<=p;)be(e[f++],n);else!function(e,t,n,o,r,a,i,c,l,u,d,s,p){var m,f,h,C=0,g=c,N=c,b=a-c+1,y=i-c+1,x=new Int32Array(y+1),k=b===o,S=!1,I=0,w=0;if(r<4||(b|y)<32)for(C=g;C<=a;++C)if(m=e[C],w<y){for(c=N;c<=i;c++)if(f=t[c],m.key===f.key){if(x[c-N]=C+1,k)for(k=!1;g<C;)be(e[g++],l);I>c?S=!0:I=c,16384&f.flags&&(t[c]=f=L(f)),je(m,f,l,n,u,d,p),++w;break}!k&&c>i&&be(m,l)}else k||be(m,l);else{var _={};for(C=N;C<=i;++C)_[t[C].key]=C;for(C=g;C<=a;++C)if(m=e[C],w<y)if(void 0!==(c=_[m.key])){if(k)for(k=!1;C>g;)be(e[g++],l);x[c-N]=C+1,I>c?S=!0:I=c,16384&(f=t[c]).flags&&(t[c]=f=L(f)),je(m,f,l,n,u,d,p),++w}else k||be(m,l);else k||be(m,l)}if(k)ke(l,s,e),Le(t,l,n,u,d,p);else if(S){var D=function(e){var t=0,n=0,o=0,r=0,a=0,i=0,c=0,l=e.length;l>Re&&(Re=l,de=new Int32Array(l),se=new Int32Array(l));for(;n<l;++n)if(0!==(t=e[n])){if(e[o=de[r]]<t){se[n]=o,de[++r]=n;continue}for(a=0,i=r;a<i;)e[de[c=a+i>>1]]<t?a=c+1:i=c;t<e[de[a]]&&(a>0&&(se[n]=de[a-1]),de[a]=n)}a=r+1;var u=new Int32Array(a);i=de[a-1];for(;a-- >0;)u[a]=i,i=se[i],de[a]=0;return u}(x);for(c=D.length-1,C=y-1;C>=0;C--)0===x[C]?(16384&(f=t[I=C+N]).flags&&(t[I]=f=L(f)),Be(f,l,n,u,(h=I+1)<r?v(t[h],!0):d,p)):c<0||C!==D[c]?V(f=t[I=C+N],l,(h=I+1)<r?v(t[h],!0):d):c--}else if(w!==y)for(C=y-1;C>=0;C--)0===x[C]&&(16384&(f=t[I=C+N]).flags&&(t[I]=f=L(f)),Be(f,l,n,u,(h=I+1)<r?v(t[h],!0):d,p))}(e,t,o,a,i,p,m,f,n,r,c,l,u)}(n,o,r,a,i,d,s,c,l,u):function(e,t,n,o,r,a,i,c,l){for(var u,d,s=a>i?i:a,p=0;p<s;++p)u=t[p],d=e[p],16384&u.flags&&(u=t[p]=L(u)),je(d,u,n,o,r,c,l),e[p]=u;if(a<i)for(p=s;p<i;++p)16384&(u=t[p]).flags&&(u=t[p]=L(u)),Be(u,n,o,r,c,l);else if(a>i)for(p=s;p<a;++p)be(e[p],n)}(n,o,r,a,i,d,s,c,u)}}}function Fe(e,t,n,o,r,a,c,l,d){var s=e.state,p=e.props,m=Boolean(e.$N),f=i(e.shouldComponentUpdate);if(m&&(t=y(e,n,t!==s?u(s,t):t)),c||!f||f&&e.shouldComponentUpdate(n,t,r)){!m&&i(e.componentWillUpdate)&&e.componentWillUpdate(n,t,r),e.props=n,e.state=t,e.context=r;var h=null,C=_e(e,n,r);m&&i(e.getSnapshotBeforeUpdate)&&(h=e.getSnapshotBeforeUpdate(p,s)),je(e.$LI,C,o,e.$CX,a,l,d),e.$LI=C,i(e.componentDidUpdate)&&function(e,t,n,o,r){r.push((function(){e.componentDidUpdate(t,n,o)}))}(e,p,s,h,d)}else e.props=n,e.state=t,e.context=r}var Re=0;function ze(e,t,n,o){var a=[],c=t.$V;x.v=!0,r(c)?r(e)||(16384&e.flags&&(e=L(e)),Be(e,t,o,!1,null,a),t.$V=e,c=e):r(e)?(be(c,t),t.$V=null):(16384&e.flags&&(e=L(e)),je(c,e,t,o,!1,null,a),c=t.$V=e),g(a),x.v=!1,i(n)&&n(),i(k.renderComplete)&&k.renderComplete(c,t)}function We(e,t,n,o){void 0===n&&(n=null),void 0===o&&(o=s),ze(e,t,n,o)}"undefined"!=typeof document&&window.Node&&(Node.prototype.$EV=null,Node.prototype.$V=null);var Ue=[],He="undefined"!=typeof Promise?Promise.resolve().then.bind(Promise.resolve()):function(e){window.setTimeout(e,0)},Ge=!1;function Ye(e,t,n,o){var a=e.$PS;if(i(t)&&(t=t(a?u(e.state,a):e.state,e.props,e.context)),r(a))e.$PS=t;else for(var c in t)a[c]=t[c];if(e.$BR)i(n)&&e.$L.push(n.bind(e));else{if(!x.v&&0===Ue.length)return Qe(e,o),void(i(n)&&n.call(e));if(-1===Ue.indexOf(e)&&Ue.push(e),o&&(e.$F=!0),Ge||(Ge=!0,He(Ke)),i(n)){var l=e.$QU;l||(l=e.$QU=[]),l.push(n)}}}function Ze(e){for(var t=e.$QU,n=0;n<t.length;++n)t[n].call(e);e.$QU=null}function Ke(){var e;for(Ge=!1;e=Ue.shift();)if(!e.$UN){var t=e.$F;e.$F=!1,Qe(e,t),e.$QU&&Ze(e)}}function Qe(e,t){if(t||!e.$BR){var n=e.$PS;e.$PS=null;var o=[];x.v=!0,Fe(e,u(e.state,n),e.props,v(e.$LI,!0).parentNode,e.context,e.$SVG,t,null,o),g(o),x.v=!1}else e.state=e.$PS,e.$PS=null}var $e=function(e,t){this.state=null,this.$BR=!1,this.$BS=!0,this.$PS=null,this.$LI=null,this.$UN=!1,this.$CX=null,this.$QU=null,this.$N=!1,this.$L=null,this.$SVG=!1,this.$F=!1,this.props=e||s,this.context=t||s};t.Component=$e,$e.prototype.forceUpdate=function(e){this.$UN||Ye(this,{},e,!0)},$e.prototype.setState=function(e,t){this.$UN||this.$BS||Ye(this,e,t,!1)},$e.prototype.render=function(e,t,n){return null};t.version="7.4.8"},96323:function(e,t,n){"use strict";t.__esModule=!0;var o=n(92376);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(e in t&&t[e]===o[e]||(t[e]=o[e]))}))},10648:function(e,t){"use strict";var n,o;t.__esModule=!0,t.VNodeFlags=t.ChildFlags=void 0,t.VNodeFlags=n,function(e){e[e.HtmlElement=1]="HtmlElement",e[e.ComponentUnknown=2]="ComponentUnknown",e[e.ComponentClass=4]="ComponentClass",e[e.ComponentFunction=8]="ComponentFunction",e[e.Text=16]="Text",e[e.SvgElement=32]="SvgElement",e[e.InputElement=64]="InputElement",e[e.TextareaElement=128]="TextareaElement",e[e.SelectElement=256]="SelectElement",e[e.Void=512]="Void",e[e.Portal=1024]="Portal",e[e.ReCreate=2048]="ReCreate",e[e.ContentEditable=4096]="ContentEditable",e[e.Fragment=8192]="Fragment",e[e.InUse=16384]="InUse",e[e.ForwardRef=32768]="ForwardRef",e[e.Normalized=65536]="Normalized",e[e.ForwardRefComponent=32776]="ForwardRefComponent",e[e.FormElement=448]="FormElement",e[e.Element=481]="Element",e[e.Component=14]="Component",e[e.DOMRef=2033]="DOMRef",e[e.InUseOrNormalized=81920]="InUseOrNormalized",e[e.ClearInUse=-16385]="ClearInUse",e[e.ComponentKnown=12]="ComponentKnown"}(n||(t.VNodeFlags=n={})),t.ChildFlags=o,function(e){e[e.UnknownChildren=0]="UnknownChildren",e[e.HasInvalidChildren=1]="HasInvalidChildren",e[e.HasVNodeChildren=2]="HasVNodeChildren",e[e.HasNonKeyedChildren=4]="HasNonKeyedChildren",e[e.HasKeyedChildren=8]="HasKeyedChildren",e[e.HasTextChildren=16]="HasTextChildren",e[e.MultipleChildren=12]="MultipleChildren"}(o||(t.ChildFlags=o={}))},12800:function(e){"use strict";e.exports=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function t(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}function n(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function r(e,t){var o="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(o)return(o=o.call(e)).next.bind(o);if(Array.isArray(e)||(o=n(e))||t&&e&&"number"==typeof e.length){o&&(e=o);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a={exports:{}};function i(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}function c(e){a.exports.defaults=e}a.exports={defaults:i(),getDefaults:i,changeDefaults:c};var l=/[&<>"']/,u=/[&<>"']/g,d=/[<>"']|&(?!#?\w+;)/,s=/[<>"']|&(?!#?\w+;)/g,p={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},m=function(){function e(e){return p[e]}return e}();function f(e,t){if(t){if(l.test(e))return e.replace(u,m)}else if(d.test(e))return e.replace(s,m);return e}var h=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function C(e){return e.replace(h,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var g=/(^|[^\[])\^/g;function N(e,t){e=e.source||e,t=t||"";var n={replace:function(){function t(t,o){return o=(o=o.source||o).replace(g,"$1"),e=e.replace(t,o),n}return t}(),getRegex:function(){function n(){return new RegExp(e,t)}return n}()};return n}var v=/[^\w:]/g,b=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function V(e,t,n){if(e){var o;try{o=decodeURIComponent(C(n)).replace(v,"").toLowerCase()}catch(r){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}t&&!b.test(n)&&(n=I(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(r){return null}return n}var y={},x=/^[^:]+:\/*[^/]*$/,k=/^([^:]+:)[\s\S]*$/,S=/^([^:]+:\/*[^/]*)[\s\S]*$/;function I(e,t){y[" "+e]||(x.test(e)?y[" "+e]=e+"/":y[" "+e]=D(e,"/",!0));var n=-1===(e=y[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(k,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(S,"$1")+t:e+t}function w(e){for(var t,n,o=1;o<arguments.length;o++)for(n in t=arguments[o])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}function _(e,t){var n=e.replace(/\|/g,(function(e,t,n){for(var o=!1,r=t;--r>=0&&"\\"===n[r];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;o<n.length;o++)n[o]=n[o].trim().replace(/\\\|/g,"|");return n}function D(e,t,n){var o=e.length;if(0===o)return"";for(var r=0;r<o;){var a=e.charAt(o-r-1);if(a!==t||n){if(a===t||!n)break;r++}else r++}return e.substr(0,o-r)}function M(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,o=0,r=0;r<n;r++)if("\\"===e[r])r++;else if(e[r]===t[0])o++;else if(e[r]===t[1]&&--o<0)return r;return-1}function B(e){e&&e.sanitize&&e.silent}function A(e,t){if(t<1)return"";for(var n="";t>1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}var T={escape:f,unescape:C,edit:N,cleanUrl:V,resolveUrl:I,noopTest:{exec:function(){function e(){}return e}()},merge:w,splitCells:_,rtrim:D,findClosingBracket:M,checkSanitizeDeprecation:B,repeatString:A},L=a.exports.defaults,E=T.rtrim,P=T.splitCells,j=T.escape,O=T.findClosingBracket;function F(e,t,n){var o=t.href,r=t.title?j(t.title):null,a=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:o,title:r,text:a}:{type:"image",raw:n,href:o,title:r,text:j(a)}}function R(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var o=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:t[0].length>=o.length?e.slice(o.length):e})).join("\n")}var z=function(){function e(e){this.options=e||L}var t=e.prototype;return t.space=function(){function e(e){var t=this.rules.block.newline.exec(e);if(t)return t[0].length>1?{type:"space",raw:t[0]}:{raw:"\n"}}return e}(),t.code=function(){function e(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:E(n,"\n")}}}return e}(),t.fences=function(){function e(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],o=R(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:o}}}return e}(),t.heading=function(){function e(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(/#$/.test(n)){var o=E(n,"#");this.options.pedantic?n=o.trim():o&&!/ $/.test(o)||(n=o.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n}}}return e}(),t.nptable=function(){function e(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:P(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=P(n.cells[o],n.header.length);return n}}}return e}(),t.hr=function(){function e(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}return e}(),t.blockquote=function(){function e(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}}return e}(),t.list=function(){function e(e){var t=this.rules.block.list.exec(e);if(t){var n,o,r,a,i,c,l,u,d,s=t[0],p=t[2],m=p.length>1,f={type:"list",raw:s,ordered:m,start:m?+p.slice(0,-1):"",loose:!1,items:[]},h=t[0].match(this.rules.block.item),C=!1,g=h.length;r=this.rules.block.listItemStart.exec(h[0]);for(var N=0;N<g;N++){if(s=n=h[N],this.options.pedantic||(d=n.match(new RegExp("\\n\\s*\\n {0,"+(r[0].length-1)+"}\\S")))&&(i=n.length-d.index+h.slice(N+1).join("\n").length,f.raw=f.raw.substring(0,f.raw.length-i),s=n=n.substring(0,d.index),g=N+1),N!==g-1){if(a=this.rules.block.listItemStart.exec(h[N+1]),this.options.pedantic?a[1].length>r[1].length:a[1].length>=r[0].length||a[1].length>3){h.splice(N,2,h[N]+(!this.options.pedantic&&a[1].length<r[0].length&&!h[N].match(/\n$/)?"":"\n")+h[N+1]),N--,g--;continue}(!this.options.pedantic||this.options.smartLists?a[2][a[2].length-1]!==p[p.length-1]:m===(1===a[2].length))&&(i=h.slice(N+1).join("\n").length,f.raw=f.raw.substring(0,f.raw.length-i),N=g-1),r=a}o=n.length,~(n=n.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=n.length,n=this.options.pedantic?n.replace(/^ {1,4}/gm,""):n.replace(new RegExp("^ {1,"+o+"}","gm"),"")),n=E(n,"\n"),N!==g-1&&(s+="\n"),c=C||/\n\n(?!\s*$)/.test(s),N!==g-1&&(C="\n\n"===s.slice(-2),c||(c=C)),c&&(f.loose=!0),this.options.gfm&&(l=/^\[[ xX]\] /.test(n),u=undefined,l&&(u=" "!==n[1],n=n.replace(/^\[[ xX]\] +/,""))),f.items.push({type:"list_item",raw:s,task:l,checked:u,loose:c,text:n})}return f}}return e}(),t.html=function(){function e(e){var t=this.rules.block.html.exec(e);if(t)return{type:this.options.sanitize?"paragraph":"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):j(t[0]):t[0]}}return e}(),t.def=function(){function e(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{type:"def",tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2],title:t[3]}}return e}(),t.table=function(){function e(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:P(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var o,r=n.align.length;for(o=0;o<r;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(r=n.cells.length,o=0;o<r;o++)n.cells[o]=P(n.cells[o].replace(/^ *\| *| *\| *$/g,""),n.header.length);return n}}}return e}(),t.lheading=function(){function e(e){var t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1]}}return e}(),t.paragraph=function(){function e(e){var t=this.rules.block.paragraph.exec(e);if(t)return{type:"paragraph",raw:t[0],text:"\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1]}}return e}(),t.text=function(){function e(e){var t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0]}}return e}(),t.escape=function(){function e(e){var t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:j(t[1])}}return e}(),t.tag=function(){function e(e,t,n){var o=this.rules.inline.tag.exec(e);if(o)return!t&&/^<a /i.test(o[0])?t=!0:t&&/^<\/a>/i.test(o[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):j(o[0]):o[0]}}return e}(),t.link=function(){function e(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^</.test(n)){if(!/>$/.test(n))return;var o=E(n.slice(0,-1),"\\");if((n.length-o.length)%2==0)return}else{var r=O(t[2],"()");if(r>-1){var a=(0===t[0].indexOf("!")?5:4)+t[1].length+r;t[2]=t[2].substring(0,r),t[0]=t[0].substring(0,a).trim(),t[3]=""}}var i=t[2],c="";if(this.options.pedantic){var l=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i);l&&(i=l[1],c=l[3])}else c=t[3]?t[3].slice(1,-1):"";return i=i.trim(),/^</.test(i)&&(i=this.options.pedantic&&!/>$/.test(n)?i.slice(1):i.slice(1,-1)),F(t,{href:i?i.replace(this.rules.inline._escapes,"$1"):i,title:c?c.replace(this.rules.inline._escapes,"$1"):c},t[0])}}return e}(),t.reflink=function(){function e(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var o=(n[2]||n[1]).replace(/\s+/g," ");if(!(o=t[o.toLowerCase()])||!o.href){var r=n[0].charAt(0);return{type:"text",raw:r,text:r}}return F(n,o,n[0])}}return e}(),t.emStrong=function(){function e(e,t,n){void 0===n&&(n="");var o=this.rules.inline.emStrong.lDelim.exec(e);if(o&&(!o[3]||!n.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=o[1]||o[2]||"";if(!r||r&&(""===n||this.rules.inline.punctuation.exec(n))){var a,i,c=o[0].length-1,l=c,u=0,d="*"===o[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+c);null!=(o=d.exec(t));)if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6])if(i=a.length,o[3]||o[4])l+=i;else if(!((o[5]||o[6])&&c%3)||(c+i)%3){if(!((l-=i)>0))return i=Math.min(i,i+l+u),Math.min(c,i)%2?{type:"em",raw:e.slice(0,c+o.index+i+1),text:e.slice(1,c+o.index+i)}:{type:"strong",raw:e.slice(0,c+o.index+i+1),text:e.slice(2,c+o.index+i-1)}}else u+=i}}}return e}(),t.codespan=function(){function e(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),o=/[^ ]/.test(n),r=/^ /.test(n)&&/ $/.test(n);return o&&r&&(n=n.substring(1,n.length-1)),n=j(n,!0),{type:"codespan",raw:t[0],text:n}}}return e}(),t.br=function(){function e(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}return e}(),t.del=function(){function e(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2]}}return e}(),t.autolink=function(){function e(e,t){var n,o,r=this.rules.inline.autolink.exec(e);if(r)return o="@"===r[2]?"mailto:"+(n=j(this.options.mangle?t(r[1]):r[1])):n=j(r[1]),{type:"link",raw:r[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}}return e}(),t.url=function(){function e(e,t){var n;if(n=this.rules.inline.url.exec(e)){var o,r;if("@"===n[2])r="mailto:"+(o=j(this.options.mangle?t(n[0]):n[0]));else{var a;do{a=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(a!==n[0]);o=j(n[0]),r="www."===n[1]?"http://"+o:o}return{type:"link",raw:n[0],text:o,href:r,tokens:[{type:"text",raw:o,text:o}]}}}return e}(),t.inlineText=function(){function e(e,t,n){var o,r=this.rules.inline.text.exec(e);if(r)return o=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):j(r[0]):r[0]:j(this.options.smartypants?n(r[0]):r[0]),{type:"text",raw:r[0],text:o}}return e}(),e}(),W=T.noopTest,U=T.edit,H=T.merge,G={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:W,table:W,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};G.def=U(G.def).replace("label",G._label).replace("title",G._title).getRegex(),G.bullet=/(?:[*+-]|\d{1,9}[.)])/,G.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,G.item=U(G.item,"gm").replace(/bull/g,G.bullet).getRegex(),G.listItemStart=U(/^( *)(bull) */).replace("bull",G.bullet).getRegex(),G.list=U(G.list).replace(/bull/g,G.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+G.def.source+")").getRegex(),G._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",G._comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/,G.html=U(G.html,"i").replace("comment",G._comment).replace("tag",G._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),G.paragraph=U(G._paragraph).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.blockquote=U(G.blockquote).replace("paragraph",G.paragraph).getRegex(),G.normal=H({},G),G.gfm=H({},G.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),G.gfm.nptable=U(G.gfm.nptable).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.gfm.table=U(G.gfm.table).replace("hr",G.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",G._tag).getRegex(),G.pedantic=H({},G.normal,{html:U("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",G._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:W,paragraph:U(G.normal._paragraph).replace("hr",G.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",G.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Y={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:W,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:W,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,punctuation:/^([\spunctuation])/,_punctuation:"!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"};Y.punctuation=U(Y.punctuation).replace(/punctuation/g,Y._punctuation).getRegex(),Y.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,Y.escapedEmSt=/\\\*|\\_/g,Y._comment=U(G._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Y.emStrong.lDelim=U(Y.emStrong.lDelim).replace(/punct/g,Y._punctuation).getRegex(),Y.emStrong.rDelimAst=U(Y.emStrong.rDelimAst,"g").replace(/punct/g,Y._punctuation).getRegex(),Y.emStrong.rDelimUnd=U(Y.emStrong.rDelimUnd,"g").replace(/punct/g,Y._punctuation).getRegex(),Y._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Y._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Y.autolink=U(Y.autolink).replace("scheme",Y._scheme).replace("email",Y._email).getRegex(),Y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Y.tag=U(Y.tag).replace("comment",Y._comment).replace("attribute",Y._attribute).getRegex(),Y._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Y._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Y.link=U(Y.link).replace("label",Y._label).replace("href",Y._href).replace("title",Y._title).getRegex(),Y.reflink=U(Y.reflink).replace("label",Y._label).getRegex(),Y.reflinkSearch=U(Y.reflinkSearch,"g").replace("reflink",Y.reflink).replace("nolink",Y.nolink).getRegex(),Y.normal=H({},Y),Y.pedantic=H({},Y.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:U(/^!?\[(label)\]\((.*?)\)/).replace("label",Y._label).getRegex(),reflink:U(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Y._label).getRegex()}),Y.gfm=H({},Y.normal,{escape:U(Y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/}),Y.gfm.url=U(Y.gfm.url,"i").replace("email",Y.gfm._extended_email).getRegex(),Y.breaks=H({},Y.gfm,{br:U(Y.br).replace("{2,}","*").getRegex(),text:U(Y.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});var Z={block:G,inline:Y},K=z,Q=a.exports.defaults,$=Z.block,J=Z.inline,X=T.repeatString;function q(e){return e.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201c").replace(/"/g,"\u201d").replace(/\.{3}/g,"\u2026")}function ee(e){var t,n,o="",r=e.length;for(t=0;t<r;t++)n=e.charCodeAt(t),Math.random()>.5&&(n="x"+n.toString(16)),o+="&#"+n+";";return o}var te=function(){function e(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Q,this.options.tokenizer=this.options.tokenizer||new K,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var t={block:$.normal,inline:J.normal};this.options.pedantic?(t.block=$.pedantic,t.inline=J.pedantic):this.options.gfm&&(t.block=$.gfm,this.options.breaks?t.inline=J.breaks:t.inline=J.gfm),this.tokenizer.rules=t}e.lex=function(){function t(t,n){return new e(n).lex(t)}return t}(),e.lexInline=function(){function t(t,n){return new e(n).inlineTokens(t)}return t}();var n=e.prototype;return n.lex=function(){function e(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    "),this.blockTokens(e,this.tokens,!0),this.inline(this.tokens),this.tokens}return e}(),n.blockTokens=function(){function e(e,t,n){var o,r,a,i,c,l,u=this;for(void 0===t&&(t=[]),void 0===n&&(n=!0),this.options.pedantic&&(e=e.replace(/^ +$/gm,""));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((function(n){return!!(o=n.call(u,e,t))&&(e=e.substring(o.raw.length),t.push(o),!0)}))))if(o=this.tokenizer.space(e))e=e.substring(o.raw.length),o.type&&t.push(o);else if(o=this.tokenizer.code(e))e=e.substring(o.raw.length),(i=t[t.length-1])&&"paragraph"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o);else if(o=this.tokenizer.fences(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.heading(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.nptable(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.hr(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.blockquote(e))e=e.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],n),t.push(o);else if(o=this.tokenizer.list(e)){for(e=e.substring(o.raw.length),a=o.items.length,r=0;r<a;r++)o.items[r].tokens=this.blockTokens(o.items[r].text,[],!1);t.push(o)}else if(o=this.tokenizer.html(e))e=e.substring(o.raw.length),t.push(o);else if(n&&(o=this.tokenizer.def(e)))e=e.substring(o.raw.length),this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title});else if(o=this.tokenizer.table(e))e=e.substring(o.raw.length),t.push(o);else if(o=this.tokenizer.lheading(e))e=e.substring(o.raw.length),t.push(o);else if(c=e,this.options.extensions&&this.options.extensions.startBlock&&function(){var t=Infinity,n=e.slice(1),o=void 0;u.options.extensions.startBlock.forEach((function(e){"number"==typeof(o=e.call(this,n))&&o>=0&&(t=Math.min(t,o))})),t<Infinity&&t>=0&&(c=e.substring(0,t+1))}(),n&&(o=this.tokenizer.paragraph(c)))i=t[t.length-1],l&&"paragraph"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o),l=c.length!==e.length,e=e.substring(o.raw.length);else if(o=this.tokenizer.text(e))e=e.substring(o.raw.length),(i=t[t.length-1])&&"text"===i.type?(i.raw+="\n"+o.raw,i.text+="\n"+o.text):t.push(o);else if(e){var d="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(d)}return t}return e}(),n.inline=function(){function e(e){var t,n,o,r,a,i,c=e.length;for(t=0;t<c;t++)switch((i=e[t]).type){case"paragraph":case"text":case"heading":i.tokens=[],this.inlineTokens(i.text,i.tokens);break;case"table":for(i.tokens={header:[],cells:[]},r=i.header.length,n=0;n<r;n++)i.tokens.header[n]=[],this.inlineTokens(i.header[n],i.tokens.header[n]);for(r=i.cells.length,n=0;n<r;n++)for(a=i.cells[n],i.tokens.cells[n]=[],o=0;o<a.length;o++)i.tokens.cells[n][o]=[],this.inlineTokens(a[o],i.tokens.cells[n][o]);break;case"blockquote":this.inline(i.tokens);break;case"list":for(r=i.items.length,n=0;n<r;n++)this.inline(i.items[n].tokens)}return e}return e}(),n.inlineTokens=function(){function e(e,t,n,o){var r,a,i,c=this;void 0===t&&(t=[]),void 0===n&&(n=!1),void 0===o&&(o=!1);var l,u,d,s=e;if(this.tokens.links){var p=Object.keys(this.tokens.links);if(p.length>0)for(;null!=(l=this.tokenizer.rules.inline.reflinkSearch.exec(s));)p.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,l.index)+"["+X("a",l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(l=this.tokenizer.rules.inline.blockSkip.exec(s));)s=s.slice(0,l.index)+"["+X("a",l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(l=this.tokenizer.rules.inline.escapedEmSt.exec(s));)s=s.slice(0,l.index)+"++"+s.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;e;)if(u||(d=""),u=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((function(n){return!!(r=n.call(c,e,t))&&(e=e.substring(r.raw.length),t.push(r),!0)}))))if(r=this.tokenizer.escape(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.tag(e,n,o))e=e.substring(r.raw.length),n=r.inLink,o=r.inRawBlock,(a=t[t.length-1])&&"text"===r.type&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(r=this.tokenizer.link(e))e=e.substring(r.raw.length),"link"===r.type&&(r.tokens=this.inlineTokens(r.text,[],!0,o)),t.push(r);else if(r=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(r.raw.length),a=t[t.length-1],"link"===r.type?(r.tokens=this.inlineTokens(r.text,[],!0,o),t.push(r)):a&&"text"===r.type&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(r=this.tokenizer.emStrong(e,s,d))e=e.substring(r.raw.length),r.tokens=this.inlineTokens(r.text,[],n,o),t.push(r);else if(r=this.tokenizer.codespan(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.br(e))e=e.substring(r.raw.length),t.push(r);else if(r=this.tokenizer.del(e))e=e.substring(r.raw.length),r.tokens=this.inlineTokens(r.text,[],n,o),t.push(r);else if(r=this.tokenizer.autolink(e,ee))e=e.substring(r.raw.length),t.push(r);else if(n||!(r=this.tokenizer.url(e,ee))){if(i=e,this.options.extensions&&this.options.extensions.startInline&&function(){var t=Infinity,n=e.slice(1),o=void 0;c.options.extensions.startInline.forEach((function(e){"number"==typeof(o=e.call(this,n))&&o>=0&&(t=Math.min(t,o))})),t<Infinity&&t>=0&&(i=e.substring(0,t+1))}(),r=this.tokenizer.inlineText(i,o,q))e=e.substring(r.raw.length),"_"!==r.raw.slice(-1)&&(d=r.raw.slice(-1)),u=!0,(a=t[t.length-1])&&"text"===a.type?(a.raw+=r.raw,a.text+=r.text):t.push(r);else if(e){var m="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent)break;throw new Error(m)}}else e=e.substring(r.raw.length),t.push(r);return t}return e}(),t(e,null,[{key:"rules",get:function(){function e(){return{block:$,inline:J}}return e}()}]),e}(),ne=a.exports.defaults,oe=T.cleanUrl,re=T.escape,ae=function(){function e(e){this.options=e||ne}var t=e.prototype;return t.code=function(){function e(e,t,n){var o=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,o);null!=r&&r!==e&&(n=!0,e=r)}return e=e.replace(/\n$/,"")+"\n",o?'<pre><code class="'+this.options.langPrefix+re(o,!0)+'">'+(n?e:re(e,!0))+"</code></pre>\n":"<pre><code>"+(n?e:re(e,!0))+"</code></pre>\n"}return e}(),t.blockquote=function(){function e(e){return"<blockquote>\n"+e+"</blockquote>\n"}return e}(),t.html=function(){function e(e){return e}return e}(),t.heading=function(){function e(e,t,n,o){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+o.slug(n)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"}return e}(),t.hr=function(){function e(){return this.options.xhtml?"<hr/>\n":"<hr>\n"}return e}(),t.list=function(){function e(e,t,n){var o=t?"ol":"ul";return"<"+o+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"</"+o+">\n"}return e}(),t.listitem=function(){function e(e){return"<li>"+e+"</li>\n"}return e}(),t.checkbox=function(){function e(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "}return e}(),t.paragraph=function(){function e(e){return"<p>"+e+"</p>\n"}return e}(),t.table=function(){function e(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"}return e}(),t.tablerow=function(){function e(e){return"<tr>\n"+e+"</tr>\n"}return e}(),t.tablecell=function(){function e(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"</"+n+">\n"}return e}(),t.strong=function(){function e(e){return"<strong>"+e+"</strong>"}return e}(),t.em=function(){function e(e){return"<em>"+e+"</em>"}return e}(),t.codespan=function(){function e(e){return"<code>"+e+"</code>"}return e}(),t.br=function(){function e(){return this.options.xhtml?"<br/>":"<br>"}return e}(),t.del=function(){function e(e){return"<del>"+e+"</del>"}return e}(),t.link=function(){function e(e,t,n){if(null===(e=oe(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<a href="'+re(e)+'"';return t&&(o+=' title="'+t+'"'),o+=">"+n+"</a>"}return e}(),t.image=function(){function e(e,t,n){if(null===(e=oe(this.options.sanitize,this.options.baseUrl,e)))return n;var o='<img src="'+e+'" alt="'+n+'"';return t&&(o+=' title="'+t+'"'),o+=this.options.xhtml?"/>":">"}return e}(),t.text=function(){function e(e){return e}return e}(),e}(),ie=function(){function e(){}var t=e.prototype;return t.strong=function(){function e(e){return e}return e}(),t.em=function(){function e(e){return e}return e}(),t.codespan=function(){function e(e){return e}return e}(),t.del=function(){function e(e){return e}return e}(),t.html=function(){function e(e){return e}return e}(),t.text=function(){function e(e){return e}return e}(),t.link=function(){function e(e,t,n){return""+n}return e}(),t.image=function(){function e(e,t,n){return""+n}return e}(),t.br=function(){function e(){return""}return e}(),e}(),ce=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(){function e(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}return e}(),t.getNextSafeSlug=function(){function e(e,t){var n=e,o=0;if(this.seen.hasOwnProperty(n)){o=this.seen[e];do{n=e+"-"+ ++o}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=o,this.seen[n]=0),n}return e}(),t.slug=function(){function e(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}return e}(),e}(),le=ae,ue=ie,de=ce,se=a.exports.defaults,pe=T.unescape,me=te,fe=function(){function e(e){this.options=e||se,this.options.renderer=this.options.renderer||new le,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ue,this.slugger=new de}e.parse=function(){function t(t,n){return new e(n).parse(t)}return t}(),e.parseInline=function(){function t(t,n){return new e(n).parseInline(t)}return t}();var t=e.prototype;return t.parse=function(){function e(e,t){void 0===t&&(t=!0);var n,o,r,a,i,c,l,u,d,s,p,m,f,h,C,g,N,v,b,V="",y=e.length;for(n=0;n<y;n++)if(s=e[n],!(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[s.type])||!1===(b=this.options.extensions.renderers[s.type].call(this,s))&&["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(s.type))switch(s.type){case"space":continue;case"hr":V+=this.renderer.hr();continue;case"heading":V+=this.renderer.heading(this.parseInline(s.tokens),s.depth,pe(this.parseInline(s.tokens,this.textRenderer)),this.slugger);continue;case"code":V+=this.renderer.code(s.text,s.lang,s.escaped);continue;case"table":for(u="",l="",a=s.header.length,o=0;o<a;o++)l+=this.renderer.tablecell(this.parseInline(s.tokens.header[o]),{header:!0,align:s.align[o]});for(u+=this.renderer.tablerow(l),d="",a=s.cells.length,o=0;o<a;o++){for(l="",i=(c=s.tokens.cells[o]).length,r=0;r<i;r++)l+=this.renderer.tablecell(this.parseInline(c[r]),{header:!1,align:s.align[r]});d+=this.renderer.tablerow(l)}V+=this.renderer.table(u,d);continue;case"blockquote":d=this.parse(s.tokens),V+=this.renderer.blockquote(d);continue;case"list":for(p=s.ordered,m=s.start,f=s.loose,a=s.items.length,d="",o=0;o<a;o++)g=(C=s.items[o]).checked,N=C.task,h="",C.task&&(v=this.renderer.checkbox(g),f?C.tokens.length>0&&"text"===C.tokens[0].type?(C.tokens[0].text=v+" "+C.tokens[0].text,C.tokens[0].tokens&&C.tokens[0].tokens.length>0&&"text"===C.tokens[0].tokens[0].type&&(C.tokens[0].tokens[0].text=v+" "+C.tokens[0].tokens[0].text)):C.tokens.unshift({type:"text",text:v}):h+=v),h+=this.parse(C.tokens,f),d+=this.renderer.listitem(h,N,g);V+=this.renderer.list(d,p,m);continue;case"html":V+=this.renderer.html(s.text);continue;case"paragraph":V+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(d=s.tokens?this.parseInline(s.tokens):s.text;n+1<y&&"text"===e[n+1].type;)d+="\n"+((s=e[++n]).tokens?this.parseInline(s.tokens):s.text);V+=t?this.renderer.paragraph(d):d;continue;default:var x='Token with "'+s.type+'" type was not found.';if(this.options.silent)return;throw new Error(x)}else V+=b||"";return V}return e}(),t.parseInline=function(){function e(e,t){t=t||this.renderer;var n,o,r,a="",i=e.length;for(n=0;n<i;n++)if(o=e[n],!(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[o.type])||!1===(r=this.options.extensions.renderers[o.type].call(this,o))&&["escape","html","link","image","strong","em","codespan","br","del","text"].includes(o.type))switch(o.type){case"escape":case"text":a+=t.text(o.text);break;case"html":a+=t.html(o.text);break;case"link":a+=t.link(o.href,o.title,this.parseInline(o.tokens,t));break;case"image":a+=t.image(o.href,o.title,o.text);break;case"strong":a+=t.strong(this.parseInline(o.tokens,t));break;case"em":a+=t.em(this.parseInline(o.tokens,t));break;case"codespan":a+=t.codespan(o.text);break;case"br":a+=t.br();break;case"del":a+=t.del(this.parseInline(o.tokens,t));break;default:var c='Token with "'+o.type+'" type was not found.';if(this.options.silent)return;throw new Error(c)}else a+=r||"";return a}return e}(),e}(),he=z,Ce=ae,ge=ie,Ne=ce,ve=T.merge,be=T.checkSanitizeDeprecation,Ve=T.escape,ye=a.exports.getDefaults,xe=a.exports.changeDefaults,ke=a.exports.defaults;function Se(e,t,n){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if("function"==typeof t&&(n=t,t=null),t=ve({},Se.defaults,t||{}),be(t),n){var o,r=t.highlight;try{o=me.lex(e,t)}catch(l){return n(l)}var a=function(){function e(e){var a;if(!e)try{t.walkTokens&&Se.walkTokens(o,t.walkTokens),a=fe.parse(o,t)}catch(l){e=l}return t.highlight=r,e?n(e):n(null,a)}return e}();if(!r||r.length<3)return a();if(delete t.highlight,!o.length)return a();var i=0;return Se.walkTokens(o,(function(e){"code"===e.type&&(i++,setTimeout((function(){r(e.text,e.lang,(function(t,n){if(t)return a(t);null!=n&&n!==e.text&&(e.text=n,e.escaped=!0),0==--i&&a()}))}),0))})),void(0===i&&a())}try{var c=me.lex(e,t);return t.walkTokens&&Se.walkTokens(c,t.walkTokens),fe.parse(c,t)}catch(l){if(l.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+Ve(l.message+"",!0)+"</pre>";throw l}}return Se.options=Se.setOptions=function(e){return ve(Se.defaults,e),xe(Se.defaults),Se},Se.getDefaults=ye,Se.defaults=ke,Se.use=function(){for(var e=this,t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];var r,a=ve.apply(void 0,[{}].concat(n)),i=Se.defaults.extensions||{renderers:{},childTokens:{}};n.forEach((function(t){if(t.extensions&&(r=!0,t.extensions.forEach((function(e){if(!e.name)throw new Error("extension name required");if(e.renderer){var t=i.renderers?i.renderers[e.name]:null;i.renderers[e.name]=t?function(){for(var n=arguments.length,o=new Array(n),r=0;r<n;r++)o[r]=arguments[r];var a=e.renderer.apply(this,o);return!1===a&&(a=t.apply(this,o)),a}:e.renderer}if(e.tokenizer){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");i[e.level]?i[e.level].unshift(e.tokenizer):i[e.level]=[e.tokenizer],e.start&&("block"===e.level?i.startBlock?i.startBlock.push(e.start):i.startBlock=[e.start]:"inline"===e.level&&(i.startInline?i.startInline.push(e.start):i.startInline=[e.start]))}e.childTokens&&(i.childTokens[e.name]=e.childTokens)}))),t.renderer&&function(){var e=Se.defaults.renderer||new Ce,n=function(){function n(n){var o=e[n];e[n]=function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=t.renderer[n].apply(e,a);return!1===c&&(c=o.apply(e,a)),c}}return n}();for(var o in t.renderer)n(o);a.renderer=e}(),t.tokenizer&&function(){var e=Se.defaults.tokenizer||new he,n=function(){function n(n){var o=e[n];e[n]=function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=t.tokenizer[n].apply(e,a);return!1===c&&(c=o.apply(e,a)),c}}return n}();for(var o in t.tokenizer)n(o);a.tokenizer=e}(),t.walkTokens){var n=Se.defaults.walkTokens;a.walkTokens=function(o){t.walkTokens.call(e,o),n&&n(o)}}r&&(a.extensions=i),Se.setOptions(a)}))},Se.walkTokens=function(e,t){for(var n,o=function(){function e(){var e=n.value;switch(t(e),e.type){case"table":for(var o,a=r(e.tokens.header);!(o=a()).done;){var i=o.value;Se.walkTokens(i,t)}for(var c,l=r(e.tokens.cells);!(c=l()).done;)for(var u,d=r(c.value);!(u=d()).done;){var s=u.value;Se.walkTokens(s,t)}break;case"list":Se.walkTokens(e.items,t);break;default:Se.defaults.extensions&&Se.defaults.extensions.childTokens&&Se.defaults.extensions.childTokens[e.type]?Se.defaults.extensions.childTokens[e.type].forEach((function(n){Se.walkTokens(e[n],t)})):e.tokens&&Se.walkTokens(e.tokens,t)}}return e}(),a=r(e);!(n=a()).done;)o()},Se.parseInline=function(e,t){if(null==e)throw new Error("marked.parseInline(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");t=ve({},Se.defaults,t||{}),be(t);try{var n=me.lexInline(e,t);return t.walkTokens&&Se.walkTokens(n,t.walkTokens),fe.parseInline(n,t)}catch(o){if(o.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"<p>An error occurred:</p><pre>"+Ve(o.message+"",!0)+"</pre>";throw o}},Se.Parser=fe,Se.parser=fe.parse,Se.Renderer=Ce,Se.TextRenderer=ge,Se.Lexer=me,Se.lexer=me.lex,Se.Tokenizer=he,Se.Slugger=Ne,Se.parse=Se,Se}()},69838:function(e){"use strict";var t=function(e){var t,n=Object.prototype,o=n.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},a=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",c=r.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(B){l=function(e,t,n){return e[t]=n}}function u(e,t,n,o){var r=t&&t.prototype instanceof C?t:C,a=Object.create(r.prototype),i=new _(o||[]);return a._invoke=function(e,t,n){var o=s;return function(){function r(r,a){if(o===m)throw new Error("Generator is already running");if(o===f){if("throw"===r)throw a;return M()}for(n.method=r,n.arg=a;;){var i=n.delegate;if(i){var c=S(i,n);if(c){if(c===h)continue;return c}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===s)throw o=f,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=m;var l=d(e,t,n);if("normal"===l.type){if(o=n.done?f:p,l.arg===h)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=f,n.method="throw",n.arg=l.arg)}}return r}()}(e,n,i),a}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(B){return{type:"throw",arg:B}}}e.wrap=u;var s="suspendedStart",p="suspendedYield",m="executing",f="completed",h={};function C(){}function g(){}function N(){}var v={};l(v,a,(function(){return this}));var b=Object.getPrototypeOf,V=b&&b(b(D([])));V&&V!==n&&o.call(V,a)&&(v=V);var y=N.prototype=C.prototype=Object.create(v);function x(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(r,a,i,c){var l=d(e[r],e,a);if("throw"!==l.type){var u=l.arg,s=u.value;return s&&"object"==typeof s&&o.call(s,"__await")?t.resolve(s.__await).then((function(e){n("next",e,i,c)}),(function(e){n("throw",e,i,c)})):t.resolve(s).then((function(e){u.value=e,i(u)}),(function(e){return n("throw",e,i,c)}))}c(l.arg)}var r;this._invoke=function(e,o){function a(){return new t((function(t,r){n(e,o,t,r)}))}return r=r?r.then(a,a):a()}}function S(e,n){var o=e.iterator[n.method];if(o===t){if(n.delegate=null,"throw"===n.method){if(e.iterator["return"]&&(n.method="return",n.arg=t,S(e,n),"throw"===n.method))return h;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var r=d(o,e.iterator,n.arg);if("throw"===r.type)return n.method="throw",n.arg=r.arg,n.delegate=null,h;var a=r.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,h):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,h)}function I(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function w(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(I,this),this.reset(!0)}function D(e){if(e){var n=e[a];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function n(){for(;++r<e.length;)if(o.call(e,r))return n.value=e[r],n.done=!1,n;return n.value=t,n.done=!0,n};return i.next=i}}return{next:M}}function M(){return{value:t,done:!0}}return g.prototype=N,l(y,"constructor",N),l(N,"constructor",g),g.displayName=l(N,c,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===g||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,N):(e.__proto__=N,l(e,c,"GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},x(k.prototype),l(k.prototype,i,(function(){return this})),e.AsyncIterator=k,e.async=function(t,n,o,r,a){void 0===a&&(a=Promise);var i=new k(u(t,n,o,r),a);return e.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},x(y),l(y,c,"Generator"),l(y,a,(function(){return this})),l(y,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function o(){for(;t.length;){var n=t.pop();if(n in e)return o.value=n,o.done=!1,o}return o.done=!0,o}},e.values=D,_.prototype={constructor:_,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(w),!e)for(var n in this)"t"===n.charAt(0)&&o.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function r(o,r){return c.type="throw",c.arg=e,n.next=o,r&&(n.method="next",n.arg=t),!!r}for(var a=this.tryEntries.length-1;a>=0;--a){var i=this.tryEntries[a],c=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=o.call(i,"catchLoc"),u=o.call(i,"finallyLoc");if(l&&u){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var a=r;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=e,i.arg=t,a?(this.method="next",this.next=a.finallyLoc,h):this.complete(i)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),h},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),w(n),h}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var o=n.completion;if("throw"===o.type){var r=o.arg;w(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,o){return this.delegate={iterator:D(e),resultName:n,nextLoc:o},"next"===this.method&&(this.arg=t),h}},e}(e.exports);try{regeneratorRuntime=t}catch(n){"object"==typeof globalThis?globalThis.regeneratorRuntime=t:Function("r","regeneratorRuntime = r")(t)}},96250:function(){"use strict";self.fetch||(self.fetch=function(e,t){return t=t||{},new Promise((function(n,o){var r=new XMLHttpRequest,a=[],i=[],c={},l=function d(){return{ok:2==(r.status/100|0),statusText:r.statusText,status:r.status,url:r.responseURL,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},clone:d,headers:{keys:function(){return a},entries:function(){return i},get:function(e){return c[e.toLowerCase()]},has:function(e){return e.toLowerCase()in c}}}};for(var u in r.open(t.method||"get",e,!0),r.onload=function(){r.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,(function(e,t,n){a.push(t=t.toLowerCase()),i.push([t,n]),c[t]=c[t]?c[t]+","+n:n})),n(l())},r.onerror=o,r.withCredentials="include"==t.credentials,t.headers)r.setRequestHeader(u,t.headers[u]);r.send(t.body||null)}))})},88243:function(e,t){"use strict";t.__esModule=!0,t.modifier=t.element=t.block=void 0;t.block=function(e,t){return e+"-"+t};t.element=function(e,t){return e+"__"+t};t.modifier=function(e,t){return e+"--"+t}},1397:function(e,t){"use strict";t.__esModule=!0,t.binaryInsertWith=t.zipWith=t.zip=t.uniq=t.uniqBy=t.reduce=t.range=t.sortStrings=t.sort=t.sortBy=t.map=t.filter=void 0;t.filter=function(e){return function(t){if(null===t||t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++){var r=t[o];e(r,o,t)&&n.push(r)}return n}throw new Error("filter() can't iterate on type "+typeof t)}};var n=function(e){return function(t){if(null===t||t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;o<t.length;o++)n.push(e(t[o],o,t));return n}if("object"==typeof t){var r=Object.prototype.hasOwnProperty,a=[];for(var i in t)r.call(t,i)&&a.push(e(t[i],i,t));return a}throw new Error("map() can't iterate on type "+typeof t)}};t.map=n;var o=function(e,t){for(var n=e.criteria,o=t.criteria,r=n.length,a=0;a<r;a++){var i=n[a],c=o[a];if(i<c)return-1;if(i>c)return 1}return 0},r=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){if(!Array.isArray(e))return e;for(var n=e.length,r=[],a=function(n){var o=e[n];r.push({criteria:t.map((function(e){return e(o)})),value:o})},i=0;i<n;i++)a(i);r.sort(o);for(var c=[];n--;)c[n]=r[n].value;return c}};t.sortBy=r;var a=r();t.sort=a;var i=r();t.sortStrings=i;t.range=function(e,t){return new Array(t-e).fill(null).map((function(t,n){return n+e}))};t.reduce=function(e,t){return function(n){var o,r,a=n.length;for(t===undefined?(o=1,r=n[0]):(o=0,r=t);o<a;o++)r=e(r,n[o],o,n);return r}};var c=function(e){return function(t){var n=t.length,o=[],r=e?[]:o,a=-1;e:for(;++a<n;){var i=t[a],c=e?e(i):i;if(c==c){for(var l=r.length;l--;)if(r[l]===c)continue e;e&&r.push(c),o.push(i)}else r.includes(c)||(r!==o&&r.push(c),o.push(i))}return o}};t.uniqBy=c;var l=c();t.uniq=l;var u=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(0===t.length)return[];for(var o=t.length,r=t[0].length,a=[],i=0;i<r;i++){for(var c=[],l=0;l<o;l++)c.push(t[l][i]);a.push(c)}return a};t.zip=u;t.zipWith=function(e){return function(){return n((function(t){return e.apply(void 0,t)}))(u.apply(void 0,arguments))}};t.binaryInsertWith=function(e){return function(t,n){var o=[].concat(t);return o.splice(function(e,t,n){if(0===t.length)return 0;for(var o=e(n),r=[0,t.length],a=r[0],i=r[1],c=undefined,l=0;a<i;)if((c=e(t[l=a+i>>1]))<o)a=l+1;else{if(c===o)return l;i=l}return c>o?l:l+1}(e,t,n),0,n),o}}},89295:function(e,t){"use strict";t.__esModule=!0,t.validHex=t.hsvaToHsv=t.hslaToHsl=t.rgbaToRgb=t.roundHsva=t.rgbaToHsva=t.rgbaToHex=t.rgbStringToHsva=t.rgbaStringToHsva=t.hsvStringToHsva=t.hsvaStringToHsva=t.hsvaToRgbaString=t.hsvaToRgbString=t.hsvaToRgba=t.hsvaToHslaString=t.hsvaToHsvaString=t.hsvaToHsvString=t.hsvaToHslString=t.hsvaToHsla=t.hsvaToHex=t.hslaToHsva=t.hslStringToHsva=t.hslaStringToHsva=t.parseHue=t.hexToRgba=t.hexToHsva=t.Color=void 0;var n=1e-4,o=function(){function e(e,t,n,o){void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=0),void 0===o&&(o=1),this.r=void 0,this.g=void 0,this.b=void 0,this.a=void 0,this.r=e,this.g=t,this.b=n,this.a=o}return e.prototype.toString=function(){return"rgba("+(0|this.r)+", "+(0|this.g)+", "+(0|this.b)+", "+(0|this.a)+")"},e.fromHex=function(t){return new e(parseInt(t.substr(1,2),16),parseInt(t.substr(3,2),16),parseInt(t.substr(5,2),16))},e.lerp=function(t,n,o){return new e((n.r-t.r)*o+t.r,(n.g-t.g)*o+t.g,(n.b-t.b)*o+t.b,(n.a-t.a)*o+t.a)},e.lookup=function(t,o){void 0===o&&(o=[]);var r=o.length;if(r<2)throw new Error("Needs at least two colors!");var a=t*(r-1);if(t<n)return o[0];if(t>=.9999)return o[r-1];var i=a%1,c=0|a;return e.lerp(o[c],o[c+1],i)},e}();t.Color=o;var r=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*e)/n},a={grad:.9,turn:360,rad:360/(2*Math.PI)};t.hexToHsva=function(e){return v(i(e))};var i=function(e){return e?("#"===e[0]&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:4===e.length?r(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:8===e.length?r(parseInt(e.substring(6,8),16)/255,2):1}):{r:0,g:0,b:0,a:0}};t.hexToRgba=i;var c=function(e,t){return void 0===t&&(t="deg"),Number(e)*(a[t]||1)};t.parseHue=c;var l=function(e){var t=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?d({h:c(t[1],t[2]),s:Number(t[3]),l:Number(t[4]),a:t[5]===undefined?1:Number(t[5])/(t[6]?100:1)}):{h:0,s:0,v:0,a:1}};t.hslaStringToHsva=l;var u=l;t.hslStringToHsva=u;var d=function(e){var t=e.h,n=e.s,o=e.l;return{h:t,s:(n*=(o<50?o:100-o)/100)>0?2*n/(o+n)*100:0,v:o+n,a:e.a}};t.hslaToHsva=d;t.hsvaToHex=function(e){return N(p(e))};var s=function(e){var t=e.h,n=e.s,o=e.v,a=e.a,i=(200-n)*o/100;return{h:r(t),s:r(i>0&&i<200?n*o/100/(i<=100?i:200-i)*100:0),l:r(i/2),a:r(a,2)}};t.hsvaToHsla=s;t.hsvaToHslString=function(e){var t=s(e);return"hsl("+t.h+", "+t.s+"%, "+t.l+"%)"};t.hsvaToHsvString=function(e){var t=b(e);return"hsv("+t.h+", "+t.s+"%, "+t.v+"%)"};t.hsvaToHsvaString=function(e){var t=b(e);return"hsva("+t.h+", "+t.s+"%, "+t.v+"%, "+t.a+")"};t.hsvaToHslaString=function(e){var t=s(e);return"hsla("+t.h+", "+t.s+"%, "+t.l+"%, "+t.a+")"};var p=function(e){var t=e.h,n=e.s,o=e.v,a=e.a;t=t/360*6,n/=100,o/=100;var i=Math.floor(t),c=o*(1-n),l=o*(1-(t-i)*n),u=o*(1-(1-t+i)*n),d=i%6;return{r:255*[o,l,c,c,u,o][d],g:255*[u,o,o,l,c,c][d],b:255*[c,c,u,o,o,l][d],a:r(a,2)}};t.hsvaToRgba=p;t.hsvaToRgbString=function(e){var t=p(e),n=t.r,o=t.g,a=t.b;return"rgb("+r(n)+", "+r(o)+", "+r(a)+")"};t.hsvaToRgbaString=function(e){var t=p(e),n=t.r,o=t.g,a=t.b,i=t.a;return"rgba("+r(n)+", "+r(o)+", "+r(a)+", "+r(i,2)+")"};var m=function(e){var t=/hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?b({h:c(t[1],t[2]),s:Number(t[3]),v:Number(t[4]),a:t[5]===undefined?1:Number(t[5])/(t[6]?100:1)}):{h:0,s:0,v:0,a:1}};t.hsvaStringToHsva=m;var f=m;t.hsvStringToHsva=f;var h=function(e){var t=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return t?v({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===undefined?1:Number(t[7])/(t[8]?100:1)}):{h:0,s:0,v:0,a:1}};t.rgbaStringToHsva=h;var C=h;t.rgbStringToHsva=C;var g=function(e){var t=e.toString(16);return t.length<2?"0"+t:t},N=function(e){var t=e.r,n=e.g,o=e.b,a=e.a,i=a<1?g(r(255*a)):"";return"#"+g(r(t))+g(r(n))+g(r(o))+i};t.rgbaToHex=N;var v=function(e){var t=e.r,n=e.g,o=e.b,r=e.a,a=Math.max(t,n,o),i=a-Math.min(t,n,o),c=i?a===t?(n-o)/i:a===n?2+(o-t)/i:4+(t-n)/i:0;return{h:60*(c<0?c+6:c),s:a?i/a*100:0,v:a/255*100,a:r}};t.rgbaToHsva=v;var b=function(e){return{h:r(e.h),s:r(e.s),v:r(e.v),a:r(e.a,2)}};t.roundHsva=b;t.rgbaToRgb=function(e){return{r:e.r,g:e.g,b:e.b}};t.hslaToHsl=function(e){return{h:e.h,s:e.s,l:e.l}};t.hsvaToHsv=function(e){var t=b(e);return{h:t.h,s:t.s,v:t.v}};var V=/^#?([0-9A-F]{3,8})$/i;t.validHex=function(e,t){var n=V.exec(e),o=n?n[1].length:0;return 3===o||6===o||!!t&&4===o||!!t&&8===o}},52844:function(e,t){"use strict";t.__esModule=!0,t.EventEmitter=void 0;var n=function(){function e(){this.listeners={}}var t=e.prototype;return t.on=function(e,t){this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(t)},t.off=function(e,t){var n=this.listeners[e];if(!n)throw new Error('There is no listeners for "'+e+'"');this.listeners[e]=n.filter((function(e){return e!==t}))},t.emit=function(e){var t=this.listeners[e];if(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];for(var a=0,i=t.length;a<i;a+=1)t[a].apply(void 0,o)}},t.clear=function(){this.listeners={}},e}();t.EventEmitter=n},32416:function(e,t){"use strict";function n(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.compose=t.flow=void 0;t.flow=function r(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return function(e){for(var o=e,a=arguments.length,i=new Array(a>1?a-1:0),c=1;c<a;c++)i[c-1]=arguments[c];for(var l,u=n(t);!(l=u()).done;){var d=l.value;Array.isArray(d)?o=r.apply(void 0,d).apply(void 0,[o].concat(i)):d&&(o=d.apply(void 0,[o].concat(i)))}return o}};t.compose=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce((function(e,t){return function(n){for(var o=arguments.length,r=new Array(o>1?o-1:0),a=1;a<o;a++)r[a-1]=arguments[a];return e.apply(void 0,[t.apply(void 0,[n].concat(r))].concat(r))}}))}},57890:function(e,t){"use strict";t.__esModule=!0,t.KEY_QUOTE=t.KEY_RIGHT_BRACKET=t.KEY_BACKSLASH=t.KEY_LEFT_BRACKET=t.KEY_SLASH=t.KEY_PERIOD=t.KEY_MINUS=t.KEY_COMMA=t.KEY_EQUAL=t.KEY_SEMICOLON=t.KEY_F12=t.KEY_F11=t.KEY_F10=t.KEY_F9=t.KEY_F8=t.KEY_F7=t.KEY_F6=t.KEY_F5=t.KEY_F4=t.KEY_F3=t.KEY_F2=t.KEY_F1=t.KEY_Z=t.KEY_Y=t.KEY_X=t.KEY_W=t.KEY_V=t.KEY_U=t.KEY_T=t.KEY_S=t.KEY_R=t.KEY_Q=t.KEY_P=t.KEY_O=t.KEY_N=t.KEY_M=t.KEY_L=t.KEY_K=t.KEY_J=t.KEY_I=t.KEY_H=t.KEY_G=t.KEY_F=t.KEY_E=t.KEY_D=t.KEY_C=t.KEY_B=t.KEY_A=t.KEY_9=t.KEY_8=t.KEY_7=t.KEY_6=t.KEY_5=t.KEY_4=t.KEY_3=t.KEY_2=t.KEY_1=t.KEY_0=t.KEY_DELETE=t.KEY_INSERT=t.KEY_DOWN=t.KEY_RIGHT=t.KEY_UP=t.KEY_LEFT=t.KEY_HOME=t.KEY_END=t.KEY_PAGEDOWN=t.KEY_PAGEUP=t.KEY_SPACE=t.KEY_ESCAPE=t.KEY_CAPSLOCK=t.KEY_PAUSE=t.KEY_ALT=t.KEY_CTRL=t.KEY_SHIFT=t.KEY_ENTER=t.KEY_TAB=t.KEY_BACKSPACE=void 0;t.KEY_BACKSPACE=8;t.KEY_TAB=9;t.KEY_ENTER=13;t.KEY_SHIFT=16;t.KEY_CTRL=17;t.KEY_ALT=18;t.KEY_PAUSE=19;t.KEY_CAPSLOCK=20;t.KEY_ESCAPE=27;t.KEY_SPACE=32;t.KEY_PAGEUP=33;t.KEY_PAGEDOWN=34;t.KEY_END=35;t.KEY_HOME=36;t.KEY_LEFT=37;t.KEY_UP=38;t.KEY_RIGHT=39;t.KEY_DOWN=40;t.KEY_INSERT=45;t.KEY_DELETE=46;t.KEY_0=48;t.KEY_1=49;t.KEY_2=50;t.KEY_3=51;t.KEY_4=52;t.KEY_5=53;t.KEY_6=54;t.KEY_7=55;t.KEY_8=56;t.KEY_9=57;t.KEY_A=65;t.KEY_B=66;t.KEY_C=67;t.KEY_D=68;t.KEY_E=69;t.KEY_F=70;t.KEY_G=71;t.KEY_H=72;t.KEY_I=73;t.KEY_J=74;t.KEY_K=75;t.KEY_L=76;t.KEY_M=77;t.KEY_N=78;t.KEY_O=79;t.KEY_P=80;t.KEY_Q=81;t.KEY_R=82;t.KEY_S=83;t.KEY_T=84;t.KEY_U=85;t.KEY_V=86;t.KEY_W=87;t.KEY_X=88;t.KEY_Y=89;t.KEY_Z=90;t.KEY_F1=112;t.KEY_F2=113;t.KEY_F3=114;t.KEY_F4=115;t.KEY_F5=116;t.KEY_F6=117;t.KEY_F7=118;t.KEY_F8=119;t.KEY_F9=120;t.KEY_F10=121;t.KEY_F11=122;t.KEY_F12=123;t.KEY_SEMICOLON=186;t.KEY_EQUAL=187;t.KEY_COMMA=188;t.KEY_MINUS=189;t.KEY_PERIOD=190;t.KEY_SLASH=191;t.KEY_LEFT_BRACKET=219;t.KEY_BACKSLASH=220;t.KEY_RIGHT_BRACKET=221;t.KEY_QUOTE=222},97622:function(e,t){"use strict";t.__esModule=!0,t.numberOfDecimalDigits=t.keyOfMatchingRange=t.inRange=t.toFixed=t.round=t.scale=t.clamp01=t.clamp=void 0;t.clamp=function(e,t,n){return e<t?t:e>n?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,a=+((e*=n=Math.pow(10,t))>0)|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(a>0)),(r?e:Math.round(e))/n);var n,o,r,a};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var n=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=n;t.keyOfMatchingRange=function(e,t){for(var o=0,r=Object.keys(t);o<r.length;o++){var a=r[o],i=t[a];if(n(e,i))return a}};t.numberOfDecimalDigits=function(e){return Math.floor(e)!==e&&e.toString().split(".")[1].length||0}},28440:function(e,t){"use strict";var n;t.__esModule=!0,t.perf=void 0;null==(n=window.performance)||n.now;var o={mark:function(e,t){0},measure:function(e,t){}};t.perf=o},1060:function(e,t){"use strict";t.__esModule=!0,t.canRender=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];"string"==typeof o&&(t+=o+" ")}return t};t.normalizeChildren=function(e){return Array.isArray(e)?e.flat().filter((function(e){return e})):"object"==typeof e?[e]:[]};var n=function(e,t){var n;for(n in e)if(!(n in t))return!0;for(n in t)if(e[n]!==t[n])return!0;return!1};t.shallowDiffers=n;var o={onComponentShouldUpdate:function(e,t){return n(e,t)}};t.pureComponentHooks=o;t.canRender=function(e){return e!==undefined&&null!==e&&"boolean"!=typeof e}},465:function(e,t,n){"use strict";t.__esModule=!0,t.useSelector=t.useDispatch=t.createAction=t.combineReducers=t.applyMiddleware=t.createStore=void 0;var o=n(32416);function r(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.createStore=function i(e,t){if(t)return t(i)(e);var n,o=[],r=function(t){n=e(n,t);for(var r=0;r<o.length;r++)o[r]()};return r({type:"@@INIT"}),{dispatch:r,subscribe:function(e){o.push(e)},getState:function(){return n}}};t.applyMiddleware=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n){for(var r=arguments.length,a=new Array(r>1?r-1:0),i=1;i<r;i++)a[i-1]=arguments[i];var c=e.apply(void 0,[n].concat(a)),l=function(){throw new Error("Dispatching while constructing your middleware is not allowed.")},u={getState:c.getState,dispatch:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return l.apply(void 0,[e].concat(n))}},d=t.map((function(e){return e(u)}));return l=o.compose.apply(void 0,d)(c.dispatch),Object.assign({},c,{dispatch:l})}}};t.combineReducers=function(e){var t=Object.keys(e),n=!1;return function(o,a){void 0===o&&(o={});for(var i,c=Object.assign({},o),l=r(t);!(i=l()).done;){var u=i.value,d=e[u],s=o[u],p=d(s,a);s!==p&&(n=!0,c[u]=p)}return n?c:o}};t.createAction=function(e,t){void 0===t&&(t=null);var n=function(){if(!t)return{type:e,payload:arguments.length<=0?undefined:arguments[0]};var n=t.apply(void 0,arguments);if(!n)throw new Error("prepare function did not return an object");var o={type:e};return"payload"in n&&(o.payload=n.payload),"meta"in n&&(o.meta=n.meta),o};return n.toString=function(){return""+e},n.type=e,n.match=function(t){return t.type===e},n};t.useDispatch=function(e){return e.store.dispatch};t.useSelector=function(e,t){return t(e.store.getState())}},7151:function(e,t){"use strict";function n(e,t,n,o,r,a,i){try{var c=e[a](i),l=c.value}catch(u){return void n(u)}c.done?t(l):Promise.resolve(l).then(o,r)}function o(e){return function(){var t=this,o=arguments;return new Promise((function(r,a){var i=e.apply(t,o);function c(e){n(i,r,a,c,l,"next",e)}function l(e){n(i,r,a,c,l,"throw",e)}c(undefined)}))}}t.__esModule=!0,t.storage=t.IMPL_INDEXED_DB=t.IMPL_LOCAL_STORAGE=t.IMPL_MEMORY=void 0;t.IMPL_MEMORY=0;t.IMPL_LOCAL_STORAGE=1;t.IMPL_INDEXED_DB=2;var r="storage-v1",a="readwrite",i=function(e){return function(){try{return Boolean(e())}catch(t){return!1}}},c=i((function(){return window.localStorage&&window.localStorage.getItem})),l=i((function(){return(window.indexedDB||window.msIndexedDB)&&(window.IDBTransaction||window.msIDBTransaction)})),u=function(){function e(){this.impl=0,this.store={}}var t=e.prototype;return t.get=function(e){return this.store[e]},t.set=function(e,t){this.store[e]=t},t.remove=function(e){this.store[e]=undefined},t.clear=function(){this.store={}},e}(),d=function(){function e(){this.impl=1,this.store={}}var t=e.prototype;return t.get=function(e){var t=localStorage.getItem(e);if("string"==typeof t)return JSON.parse(t)},t.set=function(e,t){localStorage.setItem(e,JSON.stringify(t))},t.remove=function(e){localStorage.removeItem(e)},t.clear=function(){localStorage.clear()},e}(),s=function(){function e(){this.impl=2,this.dbPromise=new Promise((function(e,t){var n=(window.indexedDB||window.msIndexedDB).open("tgui",1);n.onupgradeneeded=function(){try{n.result.createObjectStore(r)}catch(e){t(new Error("Failed to upgrade IDB: "+n.error))}},n.onsuccess=function(){return e(n.result)},n.onerror=function(){t(new Error("Failed to open IDB: "+n.error))}}))}var t=e.prototype;return t.getStore=function(e){return this.dbPromise.then((function(t){return t.transaction(r,e).objectStore(r)}))},t.get=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getStore("readonly");case 2:return n=t.sent,t.abrupt("return",new Promise((function(t,o){var r=n.get(e);r.onsuccess=function(){return t(r.result)},r.onerror=function(){return o(r.error)}})));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.set=function(){var e=o(regeneratorRuntime.mark((function t(e,n){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return null===n&&(n=undefined),t.next=3,this.getStore(a);case 3:t.sent.put(n,e);case 5:case"end":return t.stop()}}),t,this)})));return function(t,n){return e.apply(this,arguments)}}(),t.remove=function(){var e=o(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getStore(a);case 2:t.sent["delete"](e);case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.clear=function(){var e=o(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.getStore(a);case 2:e.sent.clear();case 4:case"end":return e.stop()}}),t,this)})));return function(){return e.apply(this,arguments)}}(),e}(),p=function(){function e(){this.backendPromise=o(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!l()){e.next=10;break}return e.prev=1,t=new s,e.next=5,t.dbPromise;case 5:return e.abrupt("return",t);case 8:e.prev=8,e.t0=e["catch"](1);case 10:if(!c()){e.next=12;break}return e.abrupt("return",new d);case 12:return e.abrupt("return",new u);case 13:case"end":return e.stop()}}),e,null,[[1,8]])})))()}var t=e.prototype;return t.get=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return n=t.sent,t.abrupt("return",n.get(e));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.set=function(){var e=o(regeneratorRuntime.mark((function t(e,n){var o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return o=t.sent,t.abrupt("return",o.set(e,n));case 4:case"end":return t.stop()}}),t,this)})));return function(t,n){return e.apply(this,arguments)}}(),t.remove=function(){var e=o(regeneratorRuntime.mark((function t(e){var n;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return n=t.sent,t.abrupt("return",n.remove(e));case 4:case"end":return t.stop()}}),t,this)})));return function(t){return e.apply(this,arguments)}}(),t.clear=function(){var e=o(regeneratorRuntime.mark((function t(){var e;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.backendPromise;case 2:return e=t.sent,t.abrupt("return",e.clear());case 4:case"end":return t.stop()}}),t,this)})));return function(){return e.apply(this,arguments)}}(),e}(),m=new p;t.storage=m},21118:function(e,t){"use strict";function n(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}t.__esModule=!0,t.buildQueryString=t.decodeHtmlEntities=t.toTitleCase=t.capitalize=t.createSearch=t.createGlobPattern=t.multiline=void 0;t.multiline=function r(e){if(Array.isArray(e))return r(e.join(""));for(var t,o,a=e.split("\n"),i=n(a);!(o=i()).done;)for(var c=o.value,l=0;l<c.length;l++){if(" "!==c[l]){(t===undefined||l<t)&&(t=l);break}}return t||(t=0),a.map((function(e){return e.substr(t).trimRight()})).join("\n").trim()};t.createGlobPattern=function(e){var t=new RegExp("^"+e.split(/\*+/).map((function(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&")})).join(".*")+"$");return function(e){return t.test(e)}};t.createSearch=function(e,t){var n=e.toLowerCase().trim();return function(e){if(!n)return!0;var o=t?t(e):e;return!!o&&o.toLowerCase().includes(n)}};t.capitalize=function a(e){return Array.isArray(e)?e.map(a):e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()};t.toTitleCase=function i(e){if(Array.isArray(e))return e.map(i);if("string"!=typeof e)return e;for(var t=e.replace(/([^\W_]+[^\s-]*) */g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})),n=0,o=["A","An","And","As","At","But","By","For","For","From","In","Into","Near","Nor","Of","On","Onto","Or","The","To","With"];n<o.length;n++){var r=new RegExp("\\s"+o[n]+"\\s","g");t=t.replace(r,(function(e){return e.toLowerCase()}))}for(var a=0,c=["Id","Tv"];a<c.length;a++){var l=new RegExp("\\b"+c[a]+"\\b","g");t=t.replace(l,(function(e){return e.toLowerCase()}))}return t};t.decodeHtmlEntities=function(e){if(!e)return e;var t={nbsp:" ",amp:"&",quot:'"',lt:"<",gt:">",apos:"'"};return e.replace(/<br>/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},53538:function(e,t){"use strict";t.__esModule=!0,t.sleep=t.debounce=void 0;t.debounce=function(e,t,n){var o;return void 0===n&&(n=!1),function(){for(var r=arguments.length,a=new Array(r),i=0;i<r;i++)a[i]=arguments[i];var c=n&&!o;clearTimeout(o),o=setTimeout((function(){o=null,n||e.apply(void 0,a)}),t),c&&e.apply(void 0,a)}};t.sleep=function(e){return new Promise((function(t){return setTimeout(t,e)}))}},67288:function(e,t,n){"use strict";t.__esModule=!0,t.vecNormalize=t.vecLength=t.vecInverse=t.vecScale=t.vecDivide=t.vecMultiply=t.vecSubtract=t.vecAdd=void 0;var o=n(1397),r=function(e,t){return e+t},a=function(e,t){return e-t},i=function(e,t){return e*t},c=function(e,t){return e/t};t.vecAdd=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(r)(e,t)}))(t)};t.vecSubtract=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(a)(e,t)}))(t)};t.vecMultiply=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(i)(e,t)}))(t)};var l=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,o.reduce)((function(e,t){return(0,o.zipWith)(c)(e,t)}))(t)};t.vecDivide=l;t.vecScale=function(e,t){return(0,o.map)((function(e){return e*t}))(e)};t.vecInverse=function(e){return(0,o.map)((function(e){return-e}))(e)};var u=function(e){return Math.sqrt((0,o.reduce)(r)((0,o.zipWith)(i)(e,e)))};t.vecLength=u;t.vecNormalize=function(e){return l(e,u(e))}},88280:function(){"use strict";!function(e){if("undefined"!=typeof e.setAttribute){var t=function(e){return e.replace(/-[a-z]/g,(function(e){return e[1].toUpperCase()}))};e.setProperty=function(e,n){var o=t(e);if(!n)return this.removeAttribute(o);var r=String(n);return this.setAttribute(o,r)},e.getPropertyValue=function(e){var n=t(e);return this.getAttribute(n)||null},e.removeProperty=function(e){var n=t(e),o=this.getAttribute(n);return this.removeAttribute(n),o}}}(CSSStyleDeclaration.prototype)},15511:function(){"use strict";!function(e){function t(){return s.createDocumentFragment()}function n(e){return s.createElement(e)}function o(e,t){if(!e)throw new Error("Failed to construct "+t+": 1 argument required, but only 0 present.")}function r(e){if(1===e.length)return a(e[0]);for(var n=t(),o=T.call(e),r=0;r<e.length;r++)n.appendChild(a(o[r]));return n}function a(e){return"object"==typeof e?e:s.createTextNode(e)}for(var i,c,l,u,d,s=e.document,p=Object.prototype.hasOwnProperty,m=Object.defineProperty||function(e,t,n){return p.call(n,"value")?e[t]=n.value:(p.call(n,"get")&&e.__defineGetter__(t,n.get),p.call(n,"set")&&e.__defineSetter__(t,n.set)),e},f=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},h=function(e){var t="undefined"==typeof e.className,n=t?e.getAttribute("class")||"":e.className,o=t||"object"==typeof n,r=(o?t?n:n.baseVal:n).replace(g,"");r.length&&A.push.apply(this,r.split(N)),this._isSVG=o,this._=e},C={get:function(){return new h(this)},set:function(){}},g=/^\s+|\s+$/g,N=/\s+/,v="classList",b=function(e,t){return this.contains(e)?t||this.remove(e):(t===undefined||t)&&(t=!0,this.add(e)),!!t},V=e.DocumentFragment&&DocumentFragment.prototype,y=e.Node,x=(y||Element).prototype,k=e.CharacterData||y,S=k&&k.prototype,I=e.DocumentType,w=I&&I.prototype,_=(e.Element||y||e.HTMLElement).prototype,D=e.HTMLSelectElement||n("select").constructor,M=D.prototype.remove,B=e.SVGElement,A=["matches",_.matchesSelector||_.webkitMatchesSelector||_.khtmlMatchesSelector||_.mozMatchesSelector||_.msMatchesSelector||_.oMatchesSelector||function(e){var t=this.parentNode;return!!t&&-1<f.call(t.querySelectorAll(e),this)},"closest",function(e){for(var t,n=this;(t=n&&n.matches)&&!n.matches(e);)n=n.parentNode;return t?n:null},"prepend",function(){var e=this.firstChild,t=r(arguments);e?this.insertBefore(t,e):this.appendChild(t)},"append",function(){this.appendChild(r(arguments))},"before",function(){var e=this.parentNode;e&&e.insertBefore(r(arguments),this)},"after",function(){var e=this.parentNode,t=this.nextSibling,n=r(arguments);e&&(t?e.insertBefore(n,t):e.appendChild(n))},"toggleAttribute",function(e,t){var n=this.hasAttribute(e);return 1<arguments.length?n&&!t?this.removeAttribute(e):t&&!n&&this.setAttribute(e,""):n?this.removeAttribute(e):this.setAttribute(e,""),this.hasAttribute(e)},"replace",function(){this.replaceWith.apply(this,arguments)},"replaceWith",function(){var e=this.parentNode;e&&e.replaceChild(r(arguments),this)},"remove",function(){var e=this.parentNode;e&&e.removeChild(this)}],T=A.slice,L=A.length;L;L-=2)if((c=A[L-2])in _||(_[c]=A[L-1]),"remove"!==c||M._dom4||((D.prototype[c]=function(){return 0<arguments.length?M.apply(this,arguments):_.remove.call(this)})._dom4=!0),/^(?:before|after|replace|replaceWith|remove)$/.test(c)&&(k&&!(c in S)&&(S[c]=A[L-1]),I&&!(c in w)&&(w[c]=A[L-1])),/^(?:append|prepend)$/.test(c))if(V)c in V||(V[c]=A[L-1]);else try{t().constructor.prototype[c]=A[L-1]}catch(P){}var E;n("a").matches("a")||(_[c]=(E=_[c],function(e){return E.call(this.parentNode?this:t().appendChild(this),e)})),h.prototype={length:0,add:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)||A.push.call(this,c);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},contains:function(e){return function(t){return-1<(L=e.call(this,c=function(e){if(!e)throw"SyntaxError";if(N.test(e))throw"InvalidCharacterError";return e}(t)))}}([].indexOf||function(e){for(L=this.length;L--&&this[L]!==e;);return L}),item:function(e){return this[e]||null},remove:function(){for(var e,t=0;t<arguments.length;t++)e=arguments[t],this.contains(e)&&A.splice.call(this,L,1);this._isSVG?this._.setAttribute("class",""+this):this._.className=""+this},toggle:b,toString:function(){return A.join.call(this," ")}},B&&!(v in B.prototype)&&m(B.prototype,v,C),v in s.documentElement?((u=n("div")[v]).add("a","b","a"),"a b"!=u&&("add"in(l=u.constructor.prototype)||(l=e.TemporaryTokenList.prototype),d=function(e){return function(){for(var t=0;t<arguments.length;)e.call(this,arguments[t++])}},l.add=d(l.add),l.remove=d(l.remove),l.toggle=b)):m(_,v,C),"contains"in x||m(x,"contains",{value:function(e){for(;e&&e!==this;)e=e.parentNode;return this===e}}),"head"in s||m(s,"head",{get:function(){return i||(i=s.getElementsByTagName("head")[0])}}),function(){for(var t,n=e.requestAnimationFrame,o=e.cancelAnimationFrame,r=["o","ms","moz","webkit"],a=r.length;!o&&a--;)n=n||e[r[a]+"RequestAnimationFrame"],o=e[r[a]+"CancelAnimationFrame"]||e[r[a]+"CancelRequestAnimationFrame"];o||(n?(t=n,n=function(e){var n=!0;return t((function(){n&&e.apply(this,arguments)})),function(){n=!1}},o=function(e){e()}):(n=function(e){return setTimeout(e,15,15)},o=function(e){clearTimeout(e)})),e.requestAnimationFrame=n,e.cancelAnimationFrame=o}();try{new e.CustomEvent("?")}catch(P){e.CustomEvent=function(e,t){function n(e,t,n,o){this.initEvent(e,t,n),this.detail=o}return function(o,r){var a=s.createEvent(e);if("string"!=typeof o)throw new Error("An event name must be provided");return"Event"==e&&(a.initCustomEvent=n),null==r&&(r=t),a.initCustomEvent(o,r.bubbles,r.cancelable,r.detail),a}}(e.CustomEvent?"CustomEvent":"Event",{bubbles:!1,cancelable:!1,detail:null})}try{new Event("_")}catch(P){P=function(e){function t(e,t){o(arguments.length,"Event");var n=s.createEvent("Event");return t||(t={}),n.initEvent(e,!!t.bubbles,!!t.cancelable),n}return t.prototype=e.prototype,t}(e.Event||function(){}),m(e,"Event",{value:P}),Event!==P&&(Event=P)}try{new KeyboardEvent("_",{})}catch(P){P=function(t){var n,r=0,a={char:"",key:"",location:0,ctrlKey:!1,shiftKey:!1,altKey:!1,metaKey:!1,altGraphKey:!1,repeat:!1,locale:navigator.language,detail:0,bubbles:!1,cancelable:!1,keyCode:0,charCode:0,which:0};try{var i=s.createEvent("KeyboardEvent");i.initKeyboardEvent("keyup",!1,!1,e,"+",3,!0,!1,!0,!1,!1),r="+"==(i.keyIdentifier||i.key)&&3==(i.keyLocation||i.location)&&(i.ctrlKey?i.altKey?1:3:i.shiftKey?2:4)||9}catch(P){}function c(e,t,n){try{t[e]=n[e]}catch(P){}}function l(t,i){o(arguments.length,"KeyboardEvent"),i=function(e,t){for(var n in t)t.hasOwnProperty(n)&&!t.hasOwnProperty.call(e,n)&&(e[n]=t[n]);return e}(i||{},a);var l,u=s.createEvent(n),d=i.ctrlKey,p=i.shiftKey,m=i.altKey,f=i.metaKey,h=i.altGraphKey,C=r>3?function(e){for(var t=[],n=["ctrlKey","Control","shiftKey","Shift","altKey","Alt","metaKey","Meta","altGraphKey","AltGraph"],o=0;o<n.length;o+=2)e[n[o]]&&t.push(n[o+1]);return t.join(" ")}(i):null,g=String(i.key),N=String(i.char),v=i.location,b=i.keyCode||(i.keyCode=g)&&g.charCodeAt(0)||0,V=i.charCode||(i.charCode=N)&&N.charCodeAt(0)||0,y=i.bubbles,x=i.cancelable,k=i.repeat,S=i.locale,I=i.view||e;if(i.which||(i.which=i.keyCode),"initKeyEvent"in u)u.initKeyEvent(t,y,x,I,d,m,p,f,b,V);else if(0<r&&"initKeyboardEvent"in u){switch(l=[t,y,x,I],r){case 1:l.push(g,v,d,p,m,f,h);break;case 2:l.push(d,m,p,f,b,V);break;case 3:l.push(g,v,d,m,p,f,h);break;case 4:l.push(g,v,C,k,S);break;default:l.push(char,g,v,C,k,S)}u.initKeyboardEvent.apply(u,l)}else u.initEvent(t,y,x);for(g in u)a.hasOwnProperty(g)&&u[g]!==i[g]&&c(g,u,i);return u}return n=0<r?"KeyboardEvent":"Event",l.prototype=t.prototype,l}(e.KeyboardEvent||function(){}),m(e,"KeyboardEvent",{value:P}),KeyboardEvent!==P&&(KeyboardEvent=P)}try{new MouseEvent("_",{})}catch(P){P=function(t){function n(t,n){o(arguments.length,"MouseEvent");var r=s.createEvent("MouseEvent");return n||(n={}),r.initMouseEvent(t,!!n.bubbles,!!n.cancelable,n.view||e,n.detail||1,n.screenX||0,n.screenY||0,n.clientX||0,n.clientY||0,!!n.ctrlKey,!!n.altKey,!!n.shiftKey,!!n.metaKey,n.button||0,n.relatedTarget||null),r}return n.prototype=t.prototype,n}(e.MouseEvent||function(){}),m(e,"MouseEvent",{value:P}),MouseEvent!==P&&(MouseEvent=P)}s.querySelectorAll("*").forEach||function(){function e(e){var t=e.querySelectorAll;e.querySelectorAll=function(e){var n=t.call(this,e);return n.forEach=Array.prototype.forEach,n}}e(s),e(Element.prototype)}();try{s.querySelector(":scope *")}catch(P){!function(){var e="data-scope-"+(1e9*Math.random()>>>0),t=Element.prototype,n=t.querySelector,o=t.querySelectorAll;function r(t,n,o){t.setAttribute(e,null);var r=n.call(t,String(o).replace(/(^|,\s*)(:scope([ >]|$))/g,(function(t,n,o,r){return n+"["+e+"]"+(r||" ")})));return t.removeAttribute(e),r}t.querySelector=function(e){return r(this,n,e)},t.querySelectorAll=function(e){return r(this,o,e)}}()}}(window),function(e){var t=e.WeakMap||function(){var e,t=0,n=!1,o=!1;function r(t,r,a){o=a,n=!1,e=undefined,t.dispatchEvent(r)}function a(e){this.value=e}function c(){t++,this.__ce__=new i("@DOMMap:"+t+Math.random())}return a.prototype.handleEvent=function(t){n=!0,o?t.currentTarget.removeEventListener(t.type,this,!1):e=this.value},c.prototype={constructor:c,"delete":function(e){return r(e,this.__ce__,!0),n},get:function(t){r(t,this.__ce__,!1);var n=e;return e=undefined,n},has:function(e){return r(e,this.__ce__,!1),n},set:function(e,t){return r(e,this.__ce__,!0),e.addEventListener(this.__ce__.type,new a(t),!1),this}},c}();function n(){}function o(e,t,n){function r(e){r.once&&(e.currentTarget.removeEventListener(e.type,t,r),r.removed=!0),r.passive&&(e.preventDefault=o.preventDefault),"function"==typeof r.callback?r.callback.call(this,e):r.callback&&r.callback.handleEvent(e),r.passive&&delete e.preventDefault}return r.type=e,r.callback=t,r.capture=!!n.capture,r.passive=!!n.passive,r.once=!!n.once,r.removed=!1,r}n.prototype=(Object.create||Object)(null),o.preventDefault=function(){};var r,a,i=e.CustomEvent,c=e.dispatchEvent,l=e.addEventListener,u=e.removeEventListener,d=0,s=function(){d++},p=[].indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},m=function(e){return"".concat(e.capture?"1":"0",e.passive?"1":"0",e.once?"1":"0")};try{l("_",s,{once:!0}),c(new i("_")),c(new i("_")),u("_",s,{once:!0})}catch(f){}1!==d&&(a=new t,r=function(e){if(e){var t=e.prototype;t.addEventListener=function(e){return function(t,r,i){if(i&&"boolean"!=typeof i){var c,l,u,d=a.get(this),s=m(i);d||a.set(this,d=new n),t in d||(d[t]={handler:[],wrap:[]}),l=d[t],(c=p.call(l.handler,r))<0?(c=l.handler.push(r)-1,l.wrap[c]=u=new n):u=l.wrap[c],s in u||(u[s]=o(t,r,i),e.call(this,t,u[s],u[s].capture))}else e.call(this,t,r,i)}}(t.addEventListener),t.removeEventListener=function(e){return function(t,n,o){if(o&&"boolean"!=typeof o){var r,i,c,l,u=a.get(this);if(u&&t in u&&(c=u[t],-1<(i=p.call(c.handler,n))&&(r=m(o))in(l=c.wrap[i]))){for(r in e.call(this,t,l[r],l[r].capture),delete l[r],l)return;c.handler.splice(i,1),c.wrap.splice(i,1),0===c.handler.length&&delete u[t]}}else e.call(this,t,n,o)}}(t.removeEventListener)}},e.EventTarget?r(EventTarget):(r(e.Text),r(e.Element||e.HTMLElement),r(e.HTMLDocument),r(e.Window||{prototype:e}),r(e.XMLHttpRequest)))}(window)},25513:function(e){"use strict";!function(t,n){var o,r,a=t.html5||{},i=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,l="_html5shiv",u=0,d={};function s(){var e=h.elements;return"string"==typeof e?e.split(" "):e}function p(e){var t=d[e[l]];return t||(t={},u++,e[l]=u,d[u]=t),t}function m(e,t,o){return t||(t=n),r?t.createElement(e):(o||(o=p(t)),!(a=o.cache[e]?o.cache[e].cloneNode():c.test(e)?(o.cache[e]=o.createElem(e)).cloneNode():o.createElem(e)).canHaveChildren||i.test(e)||a.tagUrn?a:o.frag.appendChild(a));var a}function f(e){e||(e=n);var t=p(e);return!h.shivCSS||o||t.hasCSS||(t.hasCSS=!!function(e,t){var n=e.createElement("p"),o=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",o.insertBefore(n.lastChild,o.firstChild)}(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),r||function(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return h.shivMethods?m(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+s().join().replace(/[\w\-:]+/g,(function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'}))+");return n}")(h,t.frag)}(e,t),e}!function(){try{var e=n.createElement("a");e.innerHTML="<xyz></xyz>",o="hidden"in e,r=1==e.childNodes.length||function(){n.createElement("a");var e=n.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(t){o=!0,r=!0}}();var h={elements:a.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:"3.7.3",shivCSS:!1!==a.shivCSS,supportsUnknownElements:r,shivMethods:!1!==a.shivMethods,type:"default",shivDocument:f,createElement:m,createDocumentFragment:function(e,t){if(e||(e=n),r)return e.createDocumentFragment();for(var o=(t=t||p(e)).frag.cloneNode(),a=0,i=s(),c=i.length;a<c;a++)o.createElement(i[a]);return o},addElements:function(e,t){var n=h.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),h.elements=n+" "+e,f(t)}};t.html5=h,f(n),e.exports&&(e.exports=h)}(window,document)},72090:function(){"use strict";!function(e){if(!document.createEvent){var t,n=!0,o=!1,r="onreadystatechange",a="DOMContentLoaded",i="__IE8__"+Math.random(),c=Object.defineProperty||function(e,t,n){e[t]=n.value},l=Object.defineProperties||function(t,n){for(var o in n)if(d.call(n,o))try{c(t,o,n[o])}catch(r){e.console}},u=Object.getOwnPropertyDescriptor,d=Object.prototype.hasOwnProperty,s=e.Element.prototype,p=e.Text.prototype,m=/^[a-z]+$/,f=/loaded|complete/,h={},C=document.createElement("div"),g=document.documentElement,N=g.removeAttribute,v=g.setAttribute,b=function(e){return{enumerable:!0,writable:!0,configurable:!0,value:e}};S(e.HTMLCommentElement.prototype,s,"nodeValue"),S(e.HTMLScriptElement.prototype,null,"text"),S(p,null,"nodeValue"),S(e.HTMLTitleElement.prototype,null,"text"),c(e.HTMLStyleElement.prototype,"textContent",(t=u(e.CSSStyleSheet.prototype,"cssText"),k((function(){return t.get.call(this.styleSheet)}),(function(e){t.set.call(this.styleSheet,e)}))));var V=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;c(e.CSSStyleDeclaration.prototype,"opacity",{get:function(){var e=this.filter.match(V);return e?(e[1]/100).toString():""},set:function(e){this.zoom=1;var t=!1;e=e<1?" alpha(opacity="+Math.round(100*e)+")":"",this.filter=this.filter.replace(V,(function(){return t=!0,e})),!t&&e&&(this.filter+=e)}}),l(s,{textContent:{get:w,set:B},firstElementChild:{get:function(){for(var e=this.childNodes||[],t=0,n=e.length;t<n;t++)if(1==e[t].nodeType)return e[t]}},lastElementChild:{get:function(){for(var e=this.childNodes||[],t=e.length;t--;)if(1==e[t].nodeType)return e[t]}},oninput:{get:function(){return this._oninput||null},set:function(e){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=e,e&&this.addEventListener("input",e))}},previousElementSibling:{get:function(){for(var e=this.previousSibling;e&&1!=e.nodeType;)e=e.previousSibling;return e}},nextElementSibling:{get:function(){for(var e=this.nextSibling;e&&1!=e.nodeType;)e=e.nextSibling;return e}},childElementCount:{get:function(){for(var e=0,t=this.childNodes||[],n=t.length;n--;e+=1==t[n].nodeType);return e}},addEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o,r,a=this,l="on"+e,u=a[i]||c(a,i,{value:{}})[i],s=u[l]||(u[l]={}),p=s.h||(s.h=[]);if(!d.call(s,"w")){if(s.w=function(e){return e[i]||x(a,A(0,e),p,!1)},!d.call(h,l))if(m.test(e)){try{(o=document.createEventObject())[i]=!0,9!=a.nodeType&&(null==a.parentNode&&C.appendChild(a),(r=a.getAttribute(l))&&N.call(a,l)),a.fireEvent(l,o),h[l]=!0}catch(f){for(h[l]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=r&&v.call(a,l,r)}else h[l]=!1;(s.n=h[l])&&a.attachEvent(l,s.w)}I(p,t)<0&&p[n?"unshift":"push"](t),"input"===e&&a.attachEvent("onkeyup",_)}})),dispatchEvent:b((function(e){var t,n=this,o="on"+e.type,r=n[i],a=r&&r[o],c=!!a;return e.target||(e.target=n),c?a.n?n.fireEvent(o,e):x(n,e,a.h,!0):!(t=n.parentNode)||t.dispatchEvent(e),!e.defaultPrevented})),removeEventListener:b((function(e,t,n){if("function"==typeof t||"object"==typeof t){var o="on"+e,r=this[i],a=r&&r[o],c=a&&a.h,l=c?I(c,t):-1;-1<l&&c.splice(l,1)}}))}),l(p,{addEventListener:b(s.addEventListener),dispatchEvent:b(s.dispatchEvent),removeEventListener:b(s.removeEventListener)}),l(e.XMLHttpRequest.prototype,{addEventListener:b((function(e,t,n){var o=this,r="on"+e,a=o[i]||c(o,i,{value:{}})[i],l=a[r]||(a[r]={}),u=l.h||(l.h=[]);I(u,t)<0&&(o[r]||(o[r]=function(){var t=document.createEvent("Event");t.initEvent(e,!0,!0),o.dispatchEvent(t)}),u[n?"unshift":"push"](t))})),dispatchEvent:b((function(e){var t=this,n="on"+e.type,o=t[i],r=o&&o[n];return!!r&&(r.n?t.fireEvent(n,e):x(t,e,r.h,!0))})),removeEventListener:b(s.removeEventListener)});var y=u(Event.prototype,"button").get;l(e.Event.prototype,{bubbles:b(!0),cancelable:b(!0),preventDefault:b((function(){this.cancelable&&(this.returnValue=!1)})),stopPropagation:b((function(){this.stoppedPropagation=!0,this.cancelBubble=!0})),stopImmediatePropagation:b((function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()})),initEvent:b((function(e,t,n){this.type=e,this.bubbles=!!t,this.cancelable=!!n,this.bubbles||this.stopPropagation()})),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+e.scrollX-(g.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+e.scrollY-(g.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?undefined:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return y.call(this)}},button:{get:function(){var e=this.buttons;return 1&e?0:2&e?2:4&e?1:undefined}},defaultPrevented:{get:function(){var e=this.returnValue;return!(void 0===e||e)}},relatedTarget:{get:function(){var e=this.type;return"mouseover"===e?this.fromElement:"mouseout"===e?this.toElement:null}}}),l(e.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?w.call(this):null},set:function(e){11===this.nodeType&&B.call(this,e)}},addEventListener:b((function(t,o,i){var c=this;s.addEventListener.call(c,t,o,i),n&&t===a&&!f.test(c.readyState)&&(n=!1,c.attachEvent(r,D),e==top&&function l(e){try{c.documentElement.doScroll("left"),D()}catch(t){setTimeout(l,50)}}())})),dispatchEvent:b(s.dispatchEvent),removeEventListener:b(s.removeEventListener),createEvent:b((function(e){var t;if("Event"!==e)throw new Error("unsupported "+e);return(t=document.createEventObject()).timeStamp=(new Date).getTime(),t}))}),l(e.Window.prototype,{getComputedStyle:b(function(){var e=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,t=/^(top|right|bottom|left)$/,n=/\-([a-z])/g,o=function(e,t){return t.toUpperCase()};function r(e){this._=e}function a(){}return r.prototype.getPropertyValue=function(r){var a,i,c,l=this._,u=l.style,d=l.currentStyle,s=l.runtimeStyle;return"opacity"==r?u.opacity||"1":(r=("float"===r?"style-float":r).replace(n,o),a=d?d[r]:u[r],e.test(a)&&!t.test(r)&&(i=u.left,(c=s&&s.left)&&(s.left=d.left),u.left="fontSize"===r?"1em":a,a=u.pixelLeft+"px",u.left=i,c&&(s.left=c)),null==a?a:a+""||"auto")},a.prototype.getPropertyValue=function(){return null},function(e,t){return t?new a(e):new r(e)}}()),addEventListener:b((function(t,n,o){var r,a=e,c="on"+t;a[c]||(a[c]=function(e){return x(a,A(0,e),r,!1)&&undefined}),I(r=a[c][i]||(a[c][i]=[]),n)<0&&r[o?"unshift":"push"](n)})),dispatchEvent:b((function(t){var n=e["on"+t.type];return!n||!1!==n.call(e,t)&&!t.defaultPrevented})),removeEventListener:b((function(t,n,o){var r=(e["on"+t]||Object)[i],a=r?I(r,n):-1;-1<a&&r.splice(a,1)})),pageXOffset:{get:M("scrollLeft")},pageYOffset:{get:M("scrollTop")},scrollX:{get:M("scrollLeft")},scrollY:{get:M("scrollTop")},innerWidth:{get:M("clientWidth")},innerHeight:{get:M("clientHeight")}}),e.HTMLElement=e.Element,function(e,t,n){for(n=0;n<t.length;n++)document.createElement(t[n]);e.length||document.createStyleSheet(""),e[0].addRule(t.join(","),"display:block;")}(document.styleSheets,["header","nav","section","article","aside","footer"]),function(){if(!document.createRange){document.createRange=function(){return new n};var e=n.prototype;e.cloneContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o].cloneNode(!0));return e},e.cloneRange=function(){var e=new n;return e._start=this._start,e._end=this._end,e},e.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.removeChild(n[o])},e.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),o=0,r=n.length;o<r;o++)e.appendChild(n[o]);return e},e.setEndAfter=function(e){this._end=e},e.setEndBefore=function(e){this._end=e.previousSibling},e.setStartAfter=function(e){this._start=e.nextSibling},e.setStartBefore=function(e){this._start=e}}function t(e,t){for(var n=[e];e!==t;)n.push(e=e.nextSibling);return n}function n(){}}()}function x(e,t,n,o){for(var r,a,i=n.slice(),c=function(e,t){return e.currentTarget=t,e.eventPhase=e.target===e.currentTarget?2:3,e}(t,e),l=0,u=i.length;l<u&&("object"==typeof(r=i[l])?"function"==typeof r.handleEvent&&r.handleEvent(c):r.call(e,c),!c.stoppedImmediatePropagation);l++);return a=!c.stoppedPropagation,o&&a&&e.parentNode?e.parentNode.dispatchEvent(c):!c.defaultPrevented}function k(e,t){return{configurable:!0,get:e,set:t}}function S(e,t,n){var o=u(t||e,n);c(e,"textContent",k((function(){return o.get.call(this)}),(function(e){o.set.call(this,e)})))}function I(e,t){for(var n=e.length;n--&&e[n]!==t;);return n}function w(){if("BR"===this.tagName)return"\n";for(var e=this.firstChild,t=[];e;)8!==e.nodeType&&7!==e.nodeType&&t.push(e.textContent),e=e.nextSibling;return t.join("")}function _(e){var t=document.createEvent("Event");t.initEvent("input",!0,!0),(e.srcElement||e.fromElement||document).dispatchEvent(t)}function D(e){!o&&f.test(document.readyState)&&(o=!o,document.detachEvent(r,D),(e=document.createEvent("Event")).initEvent(a,!0,!0),document.dispatchEvent(e))}function M(e){return function(){return g[e]||document.body&&document.body[e]||0}}function B(e){for(var t;t=this.lastChild;)this.removeChild(t);null!=e&&this.appendChild(document.createTextNode(e))}function A(t,n){return n||(n=e.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}}(window)},37283:function(){"use strict";window.Int32Array||(window.Int32Array=Array)},57723:function(e,t){"use strict";t.__esModule=!0,t.assetMiddleware=t.resolveAsset=void 0;var n=[/v4shim/i],o={};t.resolveAsset=function(e){return o[e]||e};t.assetMiddleware=function(e){return function(e){return function(t){var r=t.type,a=t.payload;if("asset/stylesheet"!==r)if("asset/mappings"!==r)e(t);else for(var i=function(){var e=l[c];if(n.some((function(t){return t.test(e)})))return"continue";var t=a[e],r=e.split(".").pop();o[e]=t,"css"===r&&Byond.loadCss(t),"js"===r&&Byond.loadJs(t)},c=0,l=Object.keys(a);c<l.length;c++)i();else Byond.loadCss(a)}}}},31246:function(e,t,n){"use strict";t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.selectBackend=t.sendAct=t.sendMessage=t.backendMiddleware=t.backendReducer=t.backendSuspendSuccess=t.backendSuspendStart=t.backendSetSharedState=t.backendUpdate=void 0;var o=n(28440),r=n(465),a=n(41410),i=n(40509),c=n(79926),l=n(77960),u=["payload"];var d=(0,c.createLogger)("backend"),s=(0,r.createAction)("backend/update");t.backendUpdate=s;var p=(0,r.createAction)("backend/setSharedState");t.backendSetSharedState=p;var m=(0,r.createAction)("backend/suspendStart");t.backendSuspendStart=m;var f=function(){return{type:"backend/suspendSuccess",payload:{timestamp:Date.now()}}};t.backendSuspendSuccess=f;var h={config:{},data:{},shared:{},suspended:Date.now(),suspending:!1};t.backendReducer=function(e,t){void 0===e&&(e=h);var n=t.type,o=t.payload;if("backend/update"===n){var r=Object.assign({},e.config,o.config),a=Object.assign({},e.data,o.static_data,o.data),i=Object.assign({},e.shared);if(o.shared)for(var c=0,l=Object.keys(o.shared);c<l.length;c++){var u=l[c],d=o.shared[u];i[u]=""===d?undefined:JSON.parse(d)}return Object.assign({},e,{config:r,data:a,shared:i,suspended:!1})}if("backend/setSharedState"===n){var s,p=o.key,m=o.nextState;return Object.assign({},e,{shared:Object.assign({},e.shared,(s={},s[p]=m,s))})}if("backend/suspendStart"===n)return Object.assign({},e,{suspending:!0});if("backend/suspendSuccess"===n){var f=o.timestamp;return Object.assign({},e,{data:{},shared:{},config:Object.assign({},e.config,{title:"",status:1}),suspending:!1,suspended:f})}return e};t.backendMiddleware=function(e){var t,n;return function(r){return function(c){var u=N(e.getState()).suspended,p=c.type,m=c.payload;if("update"!==p)if("suspend"!==p){if("ping"!==p){if("backend/suspendStart"===p&&!n){d.log("suspending ("+window.__windowId__+")");var h=function(){return C({type:"suspend"})};h(),n=setInterval(h,2e3)}if("backend/suspendSuccess"===p&&((0,l.suspendRenderer)(),clearInterval(n),n=undefined,Byond.winset(window.__windowId__,{"is-visible":!1}),setImmediate((function(){(0,i.hasWindowFocus)()&&(0,i.focusMap)()}))),"backend/update"===p){var g,v,b=null==(g=m.config)||null==(v=g.window)?void 0:v.fancy;t===undefined?t=b:t!==b&&(d.log("changing fancy mode to",b),t=b,Byond.winset(window.__windowId__,{titlebar:!b,"can-resize":!b}))}return"backend/update"===p&&u&&(d.log("backend/update",m),(0,l.resumeRenderer)(),(0,a.setupDrag)(),setImmediate((function(){o.perf.mark("resume/start"),N(e.getState()).suspended||(Byond.winset(window.__windowId__,{"is-visible":!0}),o.perf.mark("resume/finish"))}))),r(c)}C({type:"pingReply"})}else e.dispatch(f());else e.dispatch(s(m))}}};var C=function(e){void 0===e&&(e={});var t=e,n=t.payload,o=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,u),r=Object.assign({tgui:1,window_id:window.__windowId__},o);null!==n&&n!==undefined&&(r.payload=JSON.stringify(n)),Byond.topic(r)};t.sendMessage=C;var g=function(e,t){void 0===t&&(t={}),"object"!=typeof t||null===t||Array.isArray(t)?d.error("Payload for act() must be an object, got this:",t):C({type:"act/"+e,payload:t})};t.sendAct=g;var N=function(e){return e.backend||{}};t.selectBackend=N;t.useBackend=function(e){var t=e.store,n=N(t.getState());return Object.assign({},n,{act:g})};t.useLocalState=function(e,t,n){var o,r=e.store,a=null!=(o=N(r.getState()).shared)?o:{},i=t in a?a[t]:n;return[i,function(e){r.dispatch(p({key:t,nextState:"function"==typeof e?e(i):e}))}]};t.useSharedState=function(e,t,n){var o,r=e.store,a=null!=(o=N(r.getState()).shared)?o:{},i=t in a?a[t]:n;return[i,function(e){C({type:"setSharedState",key:t,value:JSON.stringify("function"==typeof e?e(i):e)||""})}]}},54642:function(e,t,n){"use strict";t.__esModule=!0,t.AnimatedNumber=void 0;var o=n(96323),r=n(97622);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},c=.8333,l=function(e){var t,n;function l(t){var n;(n=e.call(this,t)||this).ref=(0,o.createRef)(),n.interval=void 0,n.currentValue=0;var r=t.initial,a=t.value;return r!==undefined&&i(r)?n.currentValue=r:i(a)&&(n.currentValue=a),n}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var u=l.prototype;return u.componentDidMount=function(){this.currentValue!==this.props.value&&this.startTicking()},u.componentWillUnmount=function(){this.stopTicking()},u.shouldComponentUpdate=function(e){return e.value!==this.props.value&&this.startTicking(),!1},u.startTicking=function(){var e=this;this.interval===undefined&&(this.interval=setInterval((function(){return e.tick()}),16.666666666666668))},u.stopTicking=function(){this.interval!==undefined&&(clearInterval(this.interval),this.interval=undefined)},u.tick=function(){var e=this.currentValue,t=this.props.value;i(t)?this.currentValue=e*c+t*(1-c):this.stopTicking(),Math.abs(t-this.currentValue)<Math.max(.001,.001*t)&&(this.currentValue=t,this.stopTicking()),this.ref.current&&(this.ref.current.textContent=this.getText())},u.getText=function(){var e=this.props,t=this.currentValue,n=e.format,o=e.value;if(!i(o))return String(o);if(n)return n(this.currentValue);var a=String(o).split(".")[1],c=a?a.length:0;return(0,r.toFixed)(t,(0,r.clamp)(c,0,8))},u.render=function(){return(0,o.createVNode)(1,"span",null,this.getText(),0,null,null,this.ref)},l}(o.Component);t.AnimatedNumber=l},75434:function(e,t,n){"use strict";t.__esModule=!0,t.Autofocus=void 0;var o=n(96323);function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}var a=function(e){var t,n;function a(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).ref=(0,o.createRef)(),t}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,r(t,n);var i=a.prototype;return i.componentDidMount=function(){var e=this;setTimeout((function(){var t;null==(t=e.ref.current)||t.focus()}),1)},i.render=function(){return(0,o.createVNode)(1,"div",null,this.props.children,0,{tabIndex:-1},null,this.ref)},a}(o.Component);t.Autofocus=a},90297:function(e,t,n){"use strict";t.__esModule=!0,t.Blink=void 0;var o=n(96323);function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}var a=function(e){var t,n;function a(){var t;return(t=e.call(this)||this).state={hidden:!1},t}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,r(t,n);var i=a.prototype;return i.createTimer=function(){var e=this,t=this.props,n=t.interval,o=void 0===n?1e3:n,r=t.time,a=void 0===r?1e3:r;clearInterval(this.interval),clearTimeout(this.timer),this.setState({hidden:!1}),this.interval=setInterval((function(){e.setState({hidden:!0}),e.timer=setTimeout((function(){e.setState({hidden:!1})}),a)}),o+a)},i.componentDidMount=function(){this.createTimer()},i.componentDidUpdate=function(e){e.interval===this.props.interval&&e.time===this.props.time||this.createTimer()},i.componentWillUnmount=function(){clearInterval(this.interval),clearTimeout(this.timer)},i.render=function(e){return(0,o.createVNode)(1,"span",null,e.children,0,{style:{visibility:this.state.hidden?"hidden":"visible"}})},a}(o.Component);t.Blink=a},7149:function(e,t,n){"use strict";t.__esModule=!0,t.BlockQuote=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className"];t.BlockQuote=function(e){var t=e.className,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["BlockQuote",t])},n)))}},54425:function(e,t,n){"use strict";t.__esModule=!0,t.Box=t.computeBoxClassName=t.computeBoxProps=t.halfUnit=t.unit=void 0;var o=n(1060),r=n(96323),a=n(10648),i=n(84200),c=["as","className","children"];var l=function(e){return"string"==typeof e?e.endsWith("px")&&!Byond.IS_LTE_IE8?parseFloat(e)/12+"rem":e:"number"==typeof e?Byond.IS_LTE_IE8?12*e+"px":e+"rem":void 0};t.unit=l;var u=function(e){return"string"==typeof e?l(e):"number"==typeof e?l(.5*e):void 0};t.halfUnit=u;var d=function(e){return"string"==typeof e&&i.CSS_COLORS.includes(e)},s=function(e){return function(t,n){"number"!=typeof n&&"string"!=typeof n||(t[e]=n)}},p=function(e,t){return function(n,o){"number"!=typeof o&&"string"!=typeof o||(n[e]=t(o))}},m=function(e,t){return function(n,o){o&&(n[e]=t)}},f=function(e,t,n){return function(o,r){if("number"==typeof r||"string"==typeof r)for(var a=0;a<n.length;a++)o[e+"-"+n[a]]=t(r)}},h=function(e){return function(t,n){d(n)||(t[e]=n)}},C={position:s("position"),overflow:s("overflow"),overflowX:s("overflow-x"),overflowY:s("overflow-y"),top:p("top",l),bottom:p("bottom",l),left:p("left",l),right:p("right",l),width:p("width",l),minWidth:p("min-width",l),maxWidth:p("max-width",l),height:p("height",l),minHeight:p("min-height",l),maxHeight:p("max-height",l),fontSize:p("font-size",l),fontFamily:s("font-family"),lineHeight:function(e,t){"number"==typeof t?e["line-height"]=t:"string"==typeof t&&(e["line-height"]=l(t))},opacity:s("opacity"),textAlign:s("text-align"),verticalAlign:s("vertical-align"),inline:m("display","inline-block"),bold:m("font-weight","bold"),italic:m("font-style","italic"),nowrap:m("white-space","nowrap"),preserveWhitespace:m("white-space","pre-wrap"),m:f("margin",u,["top","bottom","left","right"]),mx:f("margin",u,["left","right"]),my:f("margin",u,["top","bottom"]),mt:p("margin-top",u),mb:p("margin-bottom",u),ml:p("margin-left",u),mr:p("margin-right",u),p:f("padding",u,["top","bottom","left","right"]),px:f("padding",u,["left","right"]),py:f("padding",u,["top","bottom"]),pt:p("padding-top",u),pb:p("padding-bottom",u),pl:p("padding-left",u),pr:p("padding-right",u),color:h("color"),textColor:h("color"),backgroundColor:h("background-color"),fillPositionedParent:function(e,t){t&&(e.position="absolute",e.top=0,e.bottom=0,e.left=0,e.right=0)}},g=function(e){for(var t={},n={},o=0,r=Object.keys(e);o<r.length;o++){var a=r[o];if("style"!==a)if(Byond.IS_LTE_IE8&&"onClick"===a)t.onclick=e[a];else{var i=e[a],c=C[a];c?c(n,i):t[a]=i}}for(var l="",u=0,d=Object.keys(n);u<d.length;u++){var s=d[u];l+=s+":"+n[s]+";"}if(e.style)for(var p=0,m=Object.keys(e.style);p<m.length;p++){var f=m[p];l+=f+":"+e.style[f]+";"}return l.length>0&&(t.style=l),t};t.computeBoxProps=g;var N=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([d(t)&&"color-"+t,d(n)&&"color-bg-"+n])};t.computeBoxClassName=N;var v=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,i=e.children,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);if("function"==typeof i)return i(g(e));var u="string"==typeof o?o+" "+N(l):N(l),d=g(l);return(0,r.createVNode)(a.VNodeFlags.HtmlElement,n,u,i,a.ChildFlags.UnknownChildren,d,undefined)};t.Box=v,v.defaultHooks=o.pureComponentHooks},25808:function(e,t,n){"use strict";t.__esModule=!0,t.ButtonInput=t.ButtonConfirm=t.ButtonCheckbox=t.Button=void 0;var o=n(96323),r=n(57890),a=n(1060),i=n(79926),c=n(54425),l=n(65743),u=n(59463),d=["className","fluid","icon","iconRotation","iconSpin","iconColor","iconPosition","color","disabled","selected","tooltip","tooltipPosition","ellipsis","compact","circular","content","children","onclick","onClick","verticalAlignContent"],s=["checked"],p=["confirmContent","confirmColor","confirmIcon","icon","color","content","onClick"],m=["fluid","content","icon","iconRotation","iconSpin","tooltip","tooltipPosition","color","placeholder","maxLength"];function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,h(e,t)}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function C(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var g=(0,i.createLogger)("Button"),N=function(e){var t=e.className,n=e.fluid,i=e.icon,s=e.iconRotation,p=e.iconSpin,m=e.iconColor,f=e.iconPosition,h=e.color,N=e.disabled,v=e.selected,b=e.tooltip,V=e.tooltipPosition,y=e.ellipsis,x=e.compact,k=e.circular,S=e.content,I=e.children,w=e.onclick,_=e.onClick,D=e.verticalAlignContent,M=C(e,d),B=!(!S&&!I);w&&g.warn("Lowercase 'onclick' is not supported on Button and lowercase prop names are discouraged in general. Please use a camelCase'onClick' instead and read: https://infernojs.org/docs/guides/event-handling"),M.onClick=function(e){!N&&_&&_(e)},Byond.IS_LTE_IE8&&(M.unselectable=!0);var A=(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({className:(0,a.classes)(["Button",n&&"Button--fluid",N&&"Button--disabled",v&&"Button--selected",B&&"Button--hasContent",y&&"Button--ellipsis",k&&"Button--circular",x&&"Button--compact",f&&"Button--iconPosition--"+f,D&&"Button--flex",D&&n&&"Button--flex--fluid",D&&"Button--verticalAlignContent--"+D,h&&"string"==typeof h?"Button--color--"+h:"Button--color--default",t]),tabIndex:!N&&"0",onKeyUp:function(t){if(!1!==e.captureKeys){var n=window.event?t.which:t.keyCode;if(n===r.KEY_SPACE||n===r.KEY_ENTER)return t.preventDefault(),void(!N&&_&&_(t));n!==r.KEY_ESCAPE||t.preventDefault()}}},M,{children:(0,o.createVNode)(1,"div","Button__content",[i&&"right"!==f&&(0,o.createComponentVNode)(2,l.Icon,{name:i,color:m,rotation:s,spin:p}),S,I,i&&"right"===f&&(0,o.createComponentVNode)(2,l.Icon,{name:i,color:m,rotation:s,spin:p})],0)})));return b&&(A=(0,o.createComponentVNode)(2,u.Tooltip,{content:b,position:V,children:A})),A};t.Button=N,N.defaultHooks=a.pureComponentHooks;var v=function(e){var t=e.checked,n=C(e,s);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({color:"transparent",icon:t?"check-square-o":"square-o",selected:t},n)))};t.ButtonCheckbox=v,N.Checkbox=v;var b=function(e){function t(){var t;return(t=e.call(this)||this).state={clickedOnce:!1},t.handleClick=function(){t.state.clickedOnce&&t.setClickedOnce(!1)},t}f(t,e);var n=t.prototype;return n.setClickedOnce=function(e){var t=this;this.setState({clickedOnce:e}),e?setTimeout((function(){return window.addEventListener("click",t.handleClick)})):window.removeEventListener("click",this.handleClick)},n.render=function(){var e=this,t=this.props,n=t.confirmContent,r=void 0===n?"Confirm?":n,a=t.confirmColor,i=void 0===a?"bad":a,c=t.confirmIcon,l=t.icon,u=t.color,d=t.content,s=t.onClick,m=C(t,p);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({content:this.state.clickedOnce?r:d,icon:this.state.clickedOnce?c:l,color:this.state.clickedOnce?i:u,onClick:function(){return e.state.clickedOnce?s():e.setClickedOnce(!0)}},m)))},t}(o.Component);t.ButtonConfirm=b,N.Confirm=b;var V=function(e){function t(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={inInput:!1},t}f(t,e);var n=t.prototype;return n.setInInput=function(e){if(this.setState({inInput:e}),this.inputRef){var t=this.inputRef.current;if(e){t.value=this.props.currentValue||"";try{t.focus(),t.select()}catch(n){}}}},n.commitResult=function(e){if(this.inputRef){var t=this.inputRef.current;if(""!==t.value)return void this.props.onCommit(e,t.value);if(!this.props.defaultValue)return;this.props.onCommit(e,this.props.defaultValue)}},n.render=function(){var e=this,t=this.props,n=t.fluid,i=t.content,d=t.icon,s=t.iconRotation,p=t.iconSpin,f=t.tooltip,h=t.tooltipPosition,g=t.color,N=void 0===g?"default":g,v=(t.placeholder,t.maxLength,C(t,m)),b=(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Box,Object.assign({className:(0,a.classes)(["Button",n&&"Button--fluid","Button--color--"+N])},v,{onClick:function(){return e.setInInput(!0)},children:[d&&(0,o.createComponentVNode)(2,l.Icon,{name:d,rotation:s,spin:p}),(0,o.createVNode)(1,"div",null,i,0),(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:this.state.inInput?undefined:"none","text-align":"left"},onBlur:function(t){e.state.inInput&&(e.setInInput(!1),e.commitResult(t))},onKeyDown:function(t){if(t.keyCode===r.KEY_ENTER)return e.setInInput(!1),void e.commitResult(t);t.keyCode===r.KEY_ESCAPE&&e.setInInput(!1)}},null,this.inputRef)]})));return f&&(b=(0,o.createComponentVNode)(2,u.Tooltip,{content:f,position:h,children:b})),b},t}(o.Component);t.ButtonInput=V,N.Input=V},44051:function(e,t,n){"use strict";t.__esModule=!0,t.ByondUi=void 0;var o=n(96323),r=n(1060),a=n(53538),i=n(79926),c=n(54425),l=["params"],u=["params"],d=["params"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function p(e,t){return p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},p(e,t)}var m=(0,i.createLogger)("ByondUi"),f=[];window.addEventListener("beforeunload",(function(){for(var e=0;e<f.length;e++){var t=f[e];"string"==typeof t&&(m.log("unmounting '"+t+"' (beforeunload)"),f[e]=null,Byond.winset(t,{"is-visible":"false"}))}}));var h=function(e){var t,n;function i(t){var n,r;(r=e.call(this,t)||this).containerRef=(0,o.createRef)(),r.byondUiElement=function(e){var t=f.length;f.push(null);var n=e||"byondui_"+t;return m.log("allocated '"+n+"'"),{render:function(e){f[t]=n,e["is-visible"]="true",Byond.winset(n,e)},unmount:function(){m.log("unmounting '"+n+"'"),f[t]=null,Byond.winset(n,{"is-visible":"false"})}}}(null==(n=t.params)?void 0:n.id),r.handleResize=(0,a.debounce)((function(){r.forceUpdate()}),100);var i=!1;return r.handleScroll=function(){i||(window.requestAnimationFrame((function(){r.componentDidUpdate(),i=!1})),i=!0)},r}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,p(t,n);var h=i.prototype;return h.shouldComponentUpdate=function(e){var t=this.props,n=t.params,o=void 0===n?{}:n,a=s(t,l),i=e.params,c=void 0===i?{}:i,d=s(e,u);return(0,r.shallowDiffers)(o,c)||(0,r.shallowDiffers)(a,d)},h.componentDidMount=function(){Byond.IS_LTE_IE10||(window.addEventListener("resize",this.handleResize),window.addEventListener("scroll",this.handleScroll,!0),this.componentDidUpdate(),this.handleResize())},h.componentDidUpdate=function(){if(!Byond.IS_LTE_IE10){var e,t,n=this.props,o=n.params,r=void 0===o?{}:o,a=n.hideOnScroll;if(this.containerRef.current){var i=(e=this.containerRef.current,{pos:[(t=e.getBoundingClientRect()).left,t.top],size:[t.right-t.left,t.bottom-t.top]});if(m.debug("bounding box",i),a&&i.pos[1]<32)return void this.byondUiElement.unmount();this.byondUiElement.render(Object.assign({parent:window.__windowId__},r,{pos:i.pos[0]+","+i.pos[1],size:i.size[0]+"x"+i.size[1]}))}}},h.componentWillUnmount=function(){Byond.IS_LTE_IE10||(window.removeEventListener("resize",this.handleResize),window.removeEventListener("scroll",this.handleScroll,!0),this.byondUiElement.unmount())},h.render=function(){var e=this.props,t=(e.params,s(e,d)),n=(0,c.computeBoxProps)(t);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(1,"div",null,null,1,{style:{"min-height":"22px"}}),0,Object.assign({},n),null,this.containerRef))},i}(o.Component);t.ByondUi=h},64726:function(e,t,n){"use strict";t.__esModule=!0,t.Chart=void 0;var o=n(96323),r=n(1397),a=n(1060),i=n(54425),c=["data","rangeX","rangeY","fillColor","strokeColor","strokeWidth"];function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function a(t){var n;return(n=e.call(this,t)||this).ref=(0,o.createRef)(),n.state={viewBox:[600,200]},n.handleResize=function(){var e=n.ref.current;n.setState({viewBox:[e.offsetWidth,e.offsetHeight]})},n}n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n);var u=a.prototype;return u.componentDidMount=function(){window.addEventListener("resize",this.handleResize),this.handleResize()},u.componentWillUnmount=function(){window.removeEventListener("resize",this.handleResize)},u.render=function(){var e=this,t=this.props,n=t.data,a=void 0===n?[]:n,l=t.rangeX,u=t.rangeY,d=t.fillColor,s=void 0===d?"none":d,p=t.strokeColor,m=void 0===p?"#ffffff":p,f=t.strokeWidth,h=void 0===f?2:f,C=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,c),g=this.state.viewBox,N=function(e,t,n,o){if(0===e.length)return[];var a=(0,r.zipWith)(Math.min).apply(void 0,e),i=(0,r.zipWith)(Math.max).apply(void 0,e);return n!==undefined&&(a[0]=n[0],i[0]=n[1]),o!==undefined&&(a[1]=o[0],i[1]=o[1]),(0,r.map)((function(e){return(0,r.zipWith)((function(e,t,n,o){return(e-t)/(n-t)*o}))(e,a,i,t)}))(e)}(a,g,l,u);if(N.length>0){var v=N[0],b=N[N.length-1];N.push([g[0]+h,b[1]]),N.push([g[0]+h,-h]),N.push([-h,-h]),N.push([-h,v[1]])}var V=function(e){for(var t="",n=0;n<e.length;n++){var o=e[n];t+=o[0]+","+o[1]+" "}return t}(N);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({position:"relative"},C,{children:function(t){return(0,o.normalizeProps)((0,o.createVNode)(1,"div",null,(0,o.createVNode)(32,"svg",null,(0,o.createVNode)(32,"polyline",null,null,1,{transform:"scale(1, -1) translate(0, -"+g[1]+")",fill:s,stroke:m,"stroke-width":h,points:V}),2,{viewBox:"0 0 "+g[0]+" "+g[1],preserveAspectRatio:"none",style:{position:"absolute",top:0,left:0,right:0,bottom:0,overflow:"hidden"}}),2,Object.assign({},t),null,e.ref))}})))},a}(o.Component);u.defaultHooks=a.pureComponentHooks;var d={Line:Byond.IS_LTE_IE8?function(e){return null}:u};t.Chart=d},49751:function(e,t,n){"use strict";t.__esModule=!0,t.Collapsible=void 0;var o=n(96323),r=n(54425),a=n(25808),i=["children","color","title","buttons"];function c(e,t){return c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},c(e,t)}var l=function(e){var t,n;function l(t){var n;n=e.call(this,t)||this;var o=t.open;return n.state={open:o||!1},n}return n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,c(t,n),l.prototype.render=function(){var e=this,t=this.props,n=this.state.open,c=t.children,l=t.color,u=void 0===l?"default":l,d=t.title,s=t.buttons,p=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,i);return(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createVNode)(1,"div","Table",[(0,o.createVNode)(1,"div","Table__cell",(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({fluid:!0,color:u,icon:n?"chevron-down":"chevron-right",onClick:function(){return e.setState({open:!n})}},p,{children:d}))),2),s&&(0,o.createVNode)(1,"div","Table__cell Table__cell--collapsing",s,0)],0),n&&(0,o.createComponentVNode)(2,r.Box,{mt:1,children:c})]})},l}(o.Component);t.Collapsible=l},47233:function(e,t,n){"use strict";t.__esModule=!0,t.ColorBox=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["content","children","className","color","backgroundColor"];var c=function(e){var t=e.content,n=(e.children,e.className),c=e.color,l=e.backgroundColor,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return u.color=t?null:"transparent",u.backgroundColor=c||l,(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["ColorBox",n,(0,a.computeBoxClassName)(u)]),t||".",0,Object.assign({},(0,a.computeBoxProps)(u))))};t.ColorBox=c,c.defaultHooks=r.pureComponentHooks},93913:function(e,t,n){"use strict";t.__esModule=!0,t.Dimmer=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","children","full"];t.Dimmer=function(e){var t=e.className,n=e.children,c=e.full,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["Dimmer",!!c&&"Dimmer--full"].concat(t))},l,{children:(0,o.createVNode)(1,"div","Dimmer__inner",n,0)})))}},22755:function(e,t,n){"use strict";t.__esModule=!0,t.Divider=void 0;var o=n(96323),r=n(1060);t.Divider=function(e){var t=e.vertical,n=e.hidden;return(0,o.createVNode)(1,"div",(0,r.classes)(["Divider",n&&"Divider--hidden",t?"Divider--vertical":"Divider--horizontal"]))}},42833:function(e,t,n){"use strict";t.__esModule=!0,t.DraggableControl=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642);function c(e,t){return c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},c(e,t)}var l=function(e,t){return e.screenX*t[0]+e.screenY*t[1]},u=function(e){var t,n;function a(t){var n;return(n=e.call(this,t)||this).inputRef=(0,o.createRef)(),n.state={value:t.value,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props,o=t.value,r=t.dragMatrix;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:l(e,r),value:o,internalValue:o}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,a=n.props.onDrag;o&&a&&a(e,r)}),n.props.updateRate||400),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,a=t.maxValue,i=t.step,c=t.stepPixelSize,u=t.dragMatrix;n.setState((function(t){var n=Object.assign({},t),d=l(e,u)-n.origin;if(t.dragging){var s=Number.isFinite(o)?o%i:0;n.internalValue=(0,r.clamp)(n.internalValue+d*i/c,o-i,a+i),n.value=(0,r.clamp)(n.internalValue-n.internalValue%i+s,o,a),n.origin=l(e,u)}else Math.abs(d)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,a=n.state,i=a.dragging,c=a.value,l=a.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!i,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),i)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var u=n.inputRef.current;u.value=l;try{u.focus(),u.select()}catch(d){}}},n}return n=e,(t=a).prototype=Object.create(n.prototype),t.prototype.constructor=t,c(t,n),a.prototype.render=function(){var e=this,t=this.state,n=t.dragging,a=t.editing,c=t.value,l=t.suppressingFlicker,u=this.props,d=u.animated,s=u.value,p=u.unit,m=u.minValue,f=u.maxValue,h=u.unclamped,C=u.format,g=u.onChange,N=u.onDrag,v=u.children,b=u.height,V=u.lineHeight,y=u.fontSize,x=s;(n||l)&&(x=c);var k=function(e){return e+(p?" "+p:"")},S=d&&!n&&!l&&(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:x,format:C,children:k})||k(C?C(x):x),I=(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:a?undefined:"none",height:b,"line-height":V,"font-size":y},onBlur:function(t){if(a){var n;if(h)n=t.target.value;else if(n=(0,r.clamp)(parseFloat(t.target.value),m,f),Number.isNaN(n))return void e.setState({editing:!1});e.setState({editing:!1,value:n}),e.suppressFlicker(),g&&g(t,n),N&&N(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n;if(h)n=t.target.value;else if(n=(0,r.clamp)(parseFloat(t.target.value),m,f),Number.isNaN(n))return void e.setState({editing:!1});return e.setState({editing:!1,value:n}),e.suppressFlicker(),g&&g(t,n),void(N&&N(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef);return v({dragging:n,editing:a,value:s,displayValue:x,displayElement:S,inputElement:I,handleDragStart:this.handleDragStart})},a}(o.Component);t.DraggableControl=u,u.defaultHooks=a.pureComponentHooks,u.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50,dragMatrix:[1,0]}},12489:function(e,t,n){"use strict";t.__esModule=!0,t.Dropdown=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(65743),c=["icon","iconRotation","iconSpin","clipSelectedText","color","dropdownStyle","over","noscroll","nochevron","width","onClick","onOpen","selected","disabled","displayText"],l=["className"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function d(e,t){return d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},d(e,t)}var s=function(e){var t,n;function s(t){var n;return(n=e.call(this,t)||this).state={selected:t.selected,open:!1},n.handleClick=function(){n.state.open&&n.setOpen(!1)},n}n=e,(t=s).prototype=Object.create(n.prototype),t.prototype.constructor=t,d(t,n);var p=s.prototype;return p.componentWillUnmount=function(){window.removeEventListener("click",this.handleClick)},p.setOpen=function(e){var t=this;this.setState({open:e}),e?(setTimeout((function(){return window.addEventListener("click",t.handleClick)})),this.menuRef.focus()):window.removeEventListener("click",this.handleClick)},p.setSelected=function(e){this.setState({selected:e}),this.setOpen(!1),this.props.onSelected(e)},p.buildMenu=function(){var e=this,t=this.props.options,n=(void 0===t?[]:t).map((function(t){var n,r;return"string"==typeof t?(n=t,r=t):(n=t.displayText,r=t.value),(0,o.createComponentVNode)(2,a.Box,{className:"Dropdown__menuentry",onClick:function(){e.setSelected(r)},children:n},r)}));return n.length?n:"No Options Found"},p.render=function(){var e=this,t=this.props,n=t.icon,d=t.iconRotation,s=t.iconSpin,p=t.clipSelectedText,m=void 0===p||p,f=t.color,h=void 0===f?"default":f,C=t.dropdownStyle,g=t.over,N=t.noscroll,v=t.nochevron,b=t.width,V=(t.onClick,t.onOpen,t.selected,t.disabled),y=t.displayText,x=u(t,c),k=x.className,S=u(x,l),I=g?!this.state.open:this.state.open,w=this.state.open?(0,o.createVNode)(1,"div",(0,r.classes)([N?"Dropdown__menu-noscroll":"Dropdown__menu",g&&"Dropdown__over"]),this.buildMenu(),0,{tabIndex:"-1",style:{width:b}},null,(function(t){e.menuRef=t})):null;return(0,o.createVNode)(1,"div","Dropdown",[(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({width:b,className:(0,r.classes)(["Dropdown__control","Button","Button--color--"+h,V&&"Button--disabled",k])},S,{onClick:function(n){V&&!e.state.open||(e.setOpen(!e.state.open),t.onOpen&&t.onOpen(n))},children:[n&&(0,o.createComponentVNode)(2,i.Icon,{name:n,rotation:d,spin:s,mr:1}),(0,o.createVNode)(1,"span","Dropdown__selected-text",y||this.state.selected,0,{style:{overflow:m?"hidden":"visible"}}),!!v||(0,o.createVNode)(1,"span","Dropdown__arrow-button",(0,o.createComponentVNode)(2,i.Icon,{name:I?"chevron-up":"chevron-down"}),2)]}))),w],0,{style:C})},s}(o.Component);t.Dropdown=s},67486:function(e,t,n){"use strict";t.__esModule=!0,t.computeFlexItemProps=t.computeFlexItemClassName=t.Flex=t.computeFlexProps=t.computeFlexClassName=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","direction","wrap","align","justify","inline"],c=["className"],l=["className","style","grow","order","shrink","basis","align"],u=["className"];function d(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var s=function(e){return(0,r.classes)(["Flex",e.inline&&"Flex--inline",Byond.IS_LTE_IE10&&"Flex--iefix",Byond.IS_LTE_IE10&&"column"===e.direction&&"Flex--iefix--column",(0,a.computeBoxClassName)(e)])};t.computeFlexClassName=s;var p=function(e){e.className;var t=e.direction,n=e.wrap,o=e.align,r=e.justify,c=(e.inline,d(e,i));return(0,a.computeBoxProps)(Object.assign({style:Object.assign({},c.style,{"flex-direction":t,"flex-wrap":!0===n?"wrap":n,"align-items":o,"justify-content":r})},c))};t.computeFlexProps=p;var m=function(e){var t=e.className,n=d(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)([t,s(n)]),null,1,Object.assign({},p(n))))};t.Flex=m,m.defaultHooks=r.pureComponentHooks;var f=function(e){return(0,r.classes)(["Flex__item",Byond.IS_LTE_IE10&&"Flex__item--iefix",(0,a.computeBoxClassName)(e)])};t.computeFlexItemClassName=f;var h=function(e){e.className;var t,n=e.style,o=e.grow,r=e.order,i=e.shrink,c=e.basis,u=e.align,s=d(e,l),p=null!=(t=null!=c?c:e.width)?t:o!==undefined?0:undefined;return(0,a.computeBoxProps)(Object.assign({style:Object.assign({},n,{"flex-grow":o!==undefined&&Number(o),"flex-shrink":i!==undefined&&Number(i),"flex-basis":(0,a.unit)(p),order:r,"align-self":u})},s))};t.computeFlexItemProps=h;var C=function(e){var t=e.className,n=d(e,u);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)([t,f(e)]),null,1,Object.assign({},h(n))))};C.defaultHooks=r.pureComponentHooks,m.Item=C},28408:function(e,t,n){"use strict";t.__esModule=!0,t.GridColumn=t.Grid=void 0;var o=n(96323),r=n(28581),a=n(1060),i=["children"],c=["size","style"];function l(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var u=function(e){var t=e.children,n=l(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table,Object.assign({},n,{children:(0,o.createComponentVNode)(2,r.Table.Row,{children:t})})))};t.Grid=u,u.defaultHooks=a.pureComponentHooks;var d=function(e){var t=e.size,n=void 0===t?1:t,a=e.style,i=l(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Table.Cell,Object.assign({style:Object.assign({width:n+"%"},a)},i)))};t.GridColumn=d,u.defaultHooks=a.pureComponentHooks,u.Column=d},65743:function(e,t,n){"use strict";t.__esModule=!0,t.IconStack=t.Icon=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["name","size","spin","className","style","rotation","inverse"],c=["className","style","children"];function l(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var u=/-o$/,d=function(e){var t=e.name,n=e.size,c=e.spin,d=e.className,s=e.style,p=void 0===s?{}:s,m=e.rotation,f=(e.inverse,l(e,i));n&&(p["font-size"]=100*n+"%"),"number"==typeof m&&(p.transform="rotate("+m+"deg)");var h=u.test(t),C=t.replace(u,"");return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"i",className:(0,r.classes)(["Icon",d,h?"fa-regular":"fa-solid","fa-"+C,c&&"fa-spin"]),style:p},f)))};t.Icon=d,d.defaultHooks=r.pureComponentHooks;var s=function(e){var t=e.className,n=e.style,i=void 0===n?{}:n,u=e.children,d=l(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"span","class":(0,r.classes)(["IconStack",t]),style:i},d,{children:u})))};t.IconStack=s,d.Stack=s},94261:function(e,t,n){"use strict";t.__esModule=!0,t.Image=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["pixelated","className"];t.Image=function(e){var t=e.pixelated,n=e.className,c=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"img"},c,{style:t&&{"-ms-interpolation-mode":"nearest-neighbor"},className:(0,r.classes)("Image",n)})))}},77863:function(e,t,n){"use strict";t.__esModule=!0,t.Input=t.toInputValue=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(57890),c=["selfClear","onInput","onChange","onEnter","value","maxLength","placeholder"],l=["className","fluid","monospace"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function d(e,t){return d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},d(e,t)}var s=function(e){return"number"!=typeof e&&"string"!=typeof e?"":String(e)};t.toInputValue=s;var p=function(e){var t,n;function p(){var t;return(t=e.call(this)||this).inputRef=(0,o.createRef)(),t.state={editing:!1,history:[],historyIndex:0},t.handleInput=function(e){var n=t.state.editing,o=t.props.onInput;n||t.setEditing(!0),o&&o(e,e.target.value)},t.handleFocus=function(e){t.state.editing||t.setEditing(!0)},t.handleBlur=function(e){var n=t.state.editing,o=t.props.onChange;n&&(t.setEditing(!1),o&&o(e,e.target.value))},t.navigateHistory=function(e,n){var o=t.state.historyIndex+e,r=!1;(e>0&&o<t.state.history.length||e<0&&o>=0)&&(r=!0),r?(n.target.value=t.state.history[o],t.state.historyIndex=o):e>0&&(n.target.value="",t.state.historyIndex=t.state.history.length)},t.appendHistory=function(e){this.state.history[this.state.history.length-1]!==e&&this.state.history.push(e),this.state.historyIndex=this.state.history.length},t.handleKeyDown=function(e){var n=t.props,o=n.onInput,r=n.onChange,a=n.onEnter,c=n.history;return e.keyCode===i.KEY_ENTER?(t.setEditing(!1),r&&r(e,e.target.value),o&&o(e,e.target.value),a&&a(e,e.target.value),c&&t.appendHistory(e.target.value),void(t.props.selfClear?e.target.value="":e.target.blur())):e.keyCode===i.KEY_ESCAPE?t.props.onEscape?void t.props.onEscape(e):(t.setEditing(!1),e.target.value=s(t.props.value),void e.target.blur()):void(c&&(e.keyCode===i.KEY_UP?t.navigateHistory(-1,e):e.keyCode===i.KEY_DOWN&&t.navigateHistory(1,e)))},t}n=e,(t=p).prototype=Object.create(n.prototype),t.prototype.constructor=t,d(t,n);var m=p.prototype;return m.componentDidMount=function(){var e=this,t=this.props.value,n=this.inputRef.current;n&&(n.value=s(t)),(this.props.autoFocus||this.props.autoSelect)&&setTimeout((function(){n.focus(),e.props.autoSelect&&n.select()}),1)},m.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,a=this.inputRef.current;a&&!n&&o!==r&&(a.value=s(r))},m.setEditing=function(e){this.setState({editing:e})},m.render=function(){var e=this.props,t=(e.selfClear,e.onInput,e.onChange,e.onEnter,e.value,e.maxLength),n=e.placeholder,i=u(e,c),d=i.className,s=i.fluid,p=i.monospace,m=u(i,l);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["Input",s&&"Input--fluid",p&&"Input--monospace",d])},m,{children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{placeholder:n,onInput:this.handleInput,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown,maxLength:t},null,this.inputRef)]})))},p}(o.Component);t.Input=p},54291:function(e,t,n){"use strict";t.__esModule=!0,t.Interactive=void 0;var o=n(96323),r=n(97622);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return e&&e.ownerDocument.defaultView||self},c=function(e,t){var n=e.getBoundingClientRect(),o=t;return{left:(0,r.clamp)((o.pageX-(n.left+i(e).pageXOffset))/n.width,0,1),top:(0,r.clamp)((o.pageY-(n.top+i(e).pageYOffset))/n.height,0,1)}},l=function(e){var t,n;function r(t){var n;return(n=e.call(this)||this).containerRef=void 0,n.props=void 0,n.handleMoveStart=function(e){var t,o=null==(t=n.containerRef)?void 0:t.current;o&&(e.preventDefault(),o.focus(),n.props.onMove(c(o,e)),n.toggleDocumentEvents(!0))},n.handleMove=function(e){var t;e.preventDefault(),e.buttons>0&&null!=(t=n.containerRef)&&t.current?n.props.onMove(c(n.containerRef.current,e)):n.toggleDocumentEvents(!1)},n.handleMoveEnd=function(){n.toggleDocumentEvents(!1)},n.handleKeyDown=function(e){var t=e.which||e.keyCode;t<37||t>40||(e.preventDefault(),n.props.onKey({left:39===t?.05:37===t?-.05:0,top:40===t?.05:38===t?-.05:0}))},n.props=t,n.containerRef=(0,o.createRef)(),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var l=r.prototype;return l.toggleDocumentEvents=function(e){var t,n=null==(t=this.containerRef)?void 0:t.current,o=i(n),r=e?o.addEventListener:o.removeEventListener;r("mousemove",this.handleMove),r("mouseup",this.handleMoveEnd)},l.componentDidMount=function(){this.toggleDocumentEvents(!0)},l.componentWillUnmount=function(){this.toggleDocumentEvents(!1)},l.render=function(){return(0,o.normalizeProps)((0,o.createVNode)(1,"div","react-colorful__interactive",this.props.children,0,Object.assign({},this.props,{style:this.props.style,onMouseDown:this.handleMoveStart,onKeyDown:this.handleKeyDown,tabIndex:0,role:"slider"}),null,this.containerRef))},r}(o.Component);t.Interactive=l},14274:function(e,t,n){"use strict";t.__esModule=!0,t.Knob=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(42833),l=n(97667),u=["animated","format","maxValue","minValue","unclamped","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","style","fillValue","color","ranges","size","bipolar","children"];t.Knob=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,s=e.minValue,p=e.unclamped,m=e.onChange,f=e.onDrag,h=e.step,C=e.stepPixelSize,g=e.suppressFlicker,N=e.unit,v=e.value,b=e.className,V=e.style,y=e.fillValue,x=e.color,k=e.ranges,S=void 0===k?{}:k,I=e.size,w=void 0===I?1:I,_=e.bipolar,D=(e.children,function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u));return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[0,-1]},{animated:t,format:n,maxValue:d,minValue:s,unclamped:p,onChange:m,onDrag:f,step:h,stepPixelSize:C,suppressFlicker:g,unit:N,value:v},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,u=e.inputElement,p=e.handleDragStart,m=(0,r.scale)(null!=y?y:c,s,d),f=(0,r.scale)(c,s,d),h=x||(0,r.keyOfMatchingRange)(null!=y?y:n,S)||"default",C=Math.min(270*(f-.5),225);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["Knob","Knob--color--"+h,_&&"Knob--bipolar",b,(0,i.computeBoxClassName)(D)]),[(0,o.createVNode)(1,"div","Knob__circle",(0,o.createVNode)(1,"div","Knob__cursorBox",(0,o.createVNode)(1,"div","Knob__cursor"),2,{style:{transform:"rotate("+C+"deg)"}}),2),t&&(0,o.createVNode)(1,"div","Knob__popupValue",l,0),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringTrackPivot",(0,o.createVNode)(32,"circle","Knob__ringTrack",null,1,{cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),(0,o.createVNode)(32,"svg","Knob__ring Knob__ringFillPivot",(0,o.createVNode)(32,"circle","Knob__ringFill",null,1,{style:{"stroke-dashoffset":Math.max(((_?2.75:2)-1.5*m)*Math.PI*50,0)},cx:"50",cy:"50",r:"50"}),2,{viewBox:"0 0 100 100"}),u],0,Object.assign({},(0,i.computeBoxProps)(Object.assign({style:Object.assign({"font-size":w+"em"},V)},D)),{onMouseDown:p})))}})))}},95592:function(e,t,n){"use strict";t.__esModule=!0,t.LabeledControls=void 0;var o=n(96323),r=n(67486),a=["children","wrap"],i=["label","children","mx"];function c(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=function(e){var t=e.children,n=e.wrap,i=c(e,a);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({mx:-.5,wrap:n,align:"stretch",justify:"space-between"},i,{children:t})))};t.LabeledControls=l;l.Item=function(e){var t=e.label,n=e.children,a=e.mx,l=void 0===a?1:a,u=c(e,i);return(0,o.createComponentVNode)(2,r.Flex.Item,{mx:l,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Flex,Object.assign({height:"100%",direction:"column",align:"center",textAlign:"center",justify:"space-between"},u,{children:[(0,o.createComponentVNode)(2,r.Flex.Item),(0,o.createComponentVNode)(2,r.Flex.Item,{children:n}),(0,o.createComponentVNode)(2,r.Flex.Item,{color:"label",children:t})]})))})}},21173:function(e,t,n){"use strict";t.__esModule=!0,t.LabeledList=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(22755),c=function(e){var t=e.children;return(0,o.createVNode)(1,"table","LabeledList",t,0)};t.LabeledList=c,c.defaultHooks=r.pureComponentHooks;var l=function(e){var t=e.className,n=e.label,i=e.labelColor,c=void 0===i?"label":i,l=e.labelWrap,u=e.color,d=e.textAlign,s=e.buttons,p=e.content,m=e.children,f=e.verticalAlign,h=void 0===f?"baseline":f;return(0,o.createVNode)(1,"tr",(0,r.classes)(["LabeledList__row",t]),[(0,o.createComponentVNode)(2,a.Box,{as:"td",color:c,className:(0,r.classes)(["LabeledList__cell",!l&&"LabeledList__label--nowrap"]),verticalAlign:h,children:n?n+":":null}),(0,o.createComponentVNode)(2,a.Box,{as:"td",color:u,textAlign:d,className:(0,r.classes)(["LabeledList__cell","LabeledList__content"]),colSpan:s?undefined:2,verticalAlign:h,children:[p,m]}),s&&(0,o.createVNode)(1,"td","LabeledList__cell LabeledList__buttons",s,0)],0)};l.defaultHooks=r.pureComponentHooks;var u=function(e){var t=e.size?(0,a.unit)(Math.max(0,e.size-1)):0;return(0,o.createVNode)(1,"tr","LabeledList__row",(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,i.Divider),2,{colSpan:3,style:{"padding-top":t,"padding-bottom":t}}),2)};u.defaultHooks=r.pureComponentHooks,c.Item=l,c.Divider=u},89416:function(e,t,n){"use strict";t.__esModule=!0,t.Modal=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(93913),c=["className","children","full"];t.Modal=function(e){var t=e.className,n=e.children,l=e.full,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.createComponentVNode)(2,i.Dimmer,{full:l,children:(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Modal",t,(0,a.computeBoxClassName)(u)]),n,0,Object.assign({},(0,a.computeBoxProps)(u))))})}},23257:function(e,t,n){"use strict";t.__esModule=!0,t.NoticeBox=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","color","info","warning","success","danger"];var c=function(e){var t=e.className,n=e.color,c=e.info,l=(e.warning,e.success),u=e.danger,d=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["NoticeBox",n&&"NoticeBox--color--"+n,c&&"NoticeBox--type--info",l&&"NoticeBox--type--success",u&&"NoticeBox--type--danger",t])},d)))};t.NoticeBox=c,c.defaultHooks=r.pureComponentHooks},97667:function(e,t,n){"use strict";t.__esModule=!0,t.NumberInput=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642),c=n(54425);function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function u(t){var n;n=e.call(this,t)||this;var a=t.value;return n.inputRef=(0,o.createRef)(),n.state={value:a,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props.value;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:e.screenY,value:t,internalValue:t}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,o=t.dragging,r=t.value,a=n.props.onDrag;o&&a&&a(e,r)}),n.props.updateRate||400),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,o=t.minValue,a=t.maxValue,i=t.step,c=t.stepPixelSize;n.setState((function(t){var n=Object.assign({},t),l=n.origin-e.screenY;if(t.dragging){var u=Number.isFinite(o)?o%i:0;n.internalValue=(0,r.clamp)(n.internalValue+l*i/c,o-i,a+i),n.value=(0,r.clamp)(n.internalValue-n.internalValue%i+u,o,a),n.origin=e.screenY}else Math.abs(l)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,o=t.onChange,r=t.onDrag,a=n.state,i=a.dragging,c=a.value,l=a.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!i,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),i)n.suppressFlicker(),o&&o(e,c),r&&r(e,c);else if(n.inputRef){var u=n.inputRef.current;u.value=l;try{u.focus(),u.select()}catch(d){}}},n}return n=e,(t=u).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n),u.prototype.render=function(){var e=this,t=this.state,n=t.dragging,l=t.editing,u=t.value,d=t.suppressingFlicker,s=this.props,p=s.className,m=s.fluid,f=s.animated,h=s.value,C=s.unit,g=s.minValue,N=s.maxValue,v=s.height,b=s.width,V=s.lineHeight,y=s.fontSize,x=s.format,k=s.onChange,S=s.onDrag,I=h;(n||d)&&(I=u);var w=function(e){return(0,o.createVNode)(1,"div","NumberInput__content",e+(C?" "+C:""),0,{unselectable:Byond.IS_LTE_IE8})},_=f&&!n&&!d&&(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:I,format:x,children:w})||w(x?x(I):I);return(0,o.createComponentVNode)(2,c.Box,{className:(0,a.classes)(["NumberInput",m&&"NumberInput--fluid",p]),minWidth:b,minHeight:v,lineHeight:V,fontSize:y,onMouseDown:this.handleDragStart,children:[(0,o.createVNode)(1,"div","NumberInput__barContainer",(0,o.createVNode)(1,"div","NumberInput__bar",null,1,{style:{height:(0,r.clamp)((I-g)/(N-g)*100,0,100)+"%"}}),2),_,(0,o.createVNode)(64,"input","NumberInput__input",null,1,{style:{opacity:l?undefined:0,height:v,"line-height":V,"font-size":y},onFocus:function(t){e.setState({editing:!0}),k&&k(t,h)},onBlur:function(t){if(l){var n=(0,r.clamp)(parseFloat(t.target.value),g,N);Number.isNaN(n)?e.setState({editing:!1}):(e.setState({editing:!1,value:n}),e.suppressFlicker(),k&&k(t,n),S&&S(t,n))}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,r.clamp)(parseFloat(t.target.value),g,N);return Number.isNaN(n)?void e.setState({editing:!1}):(e.setState({editing:!1,value:n}),e.suppressFlicker(),k&&k(t,n),void(S&&S(t,n)))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef)]})},u}(o.Component);t.NumberInput=u,u.defaultHooks=a.pureComponentHooks,u.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50}},76776:function(e,t,n){"use strict";t.__esModule=!0,t.Pointer=void 0;var o=n(96323),r=n(1060);t.Pointer=function(e){var t=e.className,n=e.color,a=e.left,i=e.top,c=void 0===i?.5:i,l=(0,r.classes)(["react-colorful__pointer",t]),u={top:100*c+"%",left:100*a+"%"};return(0,o.createVNode)(1,"div",l,(0,o.createVNode)(1,"div","react-colorful__pointer-fill",null,1,{style:{"background-color":n}}),2,{style:u})}},16513:function(e,t,n){"use strict";t.__esModule=!0,t.Popper=void 0;var o=n(34739),r=n(96323);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){var t,n;function i(){var t;return(t=e.call(this)||this).renderedContent=void 0,t.popperInstance=void 0,i.id+=1,t}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var c=i.prototype;return c.componentDidMount=function(){var e=this,t=this.props,n=t.additionalStyles,a=t.options;if(this.renderedContent=document.createElement("div"),n)for(var i=0,c=Object.entries(n);i<c.length;i++){var l=c[i],u=l[0],d=l[1];this.renderedContent.style[u]=d}this.renderPopperContent((function(){document.body.appendChild(e.renderedContent);var t=(0,r.findDOMfromVNode)(e.$LI,!0);t&&(e.popperInstance=(0,o.createPopper)(t,e.renderedContent,a))}))},c.componentDidUpdate=function(){var e=this;this.renderPopperContent((function(){var t;return null==(t=e.popperInstance)?void 0:t.update()}))},c.componentWillUnmount=function(){var e;null==(e=this.popperInstance)||e.destroy(),this.renderedContent.remove()},c.renderPopperContent=function(e){(0,r.render)(this.props.popperContent,this.renderedContent,e)},c.render=function(){return this.props.children},i}(r.Component);t.Popper=i,i.id=0},12194:function(e,t,n){"use strict";t.__esModule=!0,t.ProgressBar=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(84200),l=["className","value","minValue","maxValue","color","textColor","ranges","children"];var u=function(e){var t=e.className,n=e.value,u=e.minValue,d=void 0===u?0:u,s=e.maxValue,p=void 0===s?1:s,m=e.color,f=e.textColor,h=e.ranges,C=void 0===h?{}:h,g=e.children,N=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),v=(0,r.scale)(n,d,p),b=g!==undefined,V=m||(0,r.keyOfMatchingRange)(n,C)||"default",y=(0,i.computeBoxProps)(N),x=["ProgressBar",t,(0,i.computeBoxClassName)(N)],k={width:100*(0,r.clamp01)(v)+"%"};return c.CSS_COLORS.includes(V)||"default"===V?x.push("ProgressBar--color--"+V):(y.style=(y.style||"")+"border-color: "+V+";",k["background-color"]=V),(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(x),[(0,o.createVNode)(1,"div","ProgressBar__fill ProgressBar__fill--animated",null,1,{style:k}),(0,o.createVNode)(1,"div","ProgressBar__content",b?g:(0,r.toFixed)(100*v)+"%",0,{style:f&&{color:f}})],4,Object.assign({},y)))};t.ProgressBar=u,u.defaultHooks=a.pureComponentHooks},94709:function(e,t,n){"use strict";t.__esModule=!0,t.RoundGauge=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54642),c=n(54425),l=["value","minValue","maxValue","ranges","alertAfter","alertBefore","format","size","className","style"];t.RoundGauge=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.AnimatedNumber,Object.assign({},e)));var t=e.value,n=e.minValue,u=void 0===n?1:n,d=e.maxValue,s=void 0===d?1:d,p=e.ranges,m=e.alertAfter,f=e.alertBefore,h=e.format,C=e.size,g=void 0===C?1:C,N=e.className,v=e.style,b=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),V=(0,r.scale)(t,u,s),y=(0,r.clamp01)(V),x=p?{}:{primary:[0,1]};p&&Object.keys(p).forEach((function(e){var t=p[e];x[e]=[(0,r.scale)(t[0],u,s),(0,r.scale)(t[1],u,s)]}));var k=function(){if(m&&f&&m<f){if(m<t&&f>t)return!0}else if(m<t||f>t)return!0;return!1}()&&(0,r.keyOfMatchingRange)(y,x);return(0,o.createComponentVNode)(2,c.Box,{inline:!0,children:[(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["RoundGauge",N,(0,c.computeBoxClassName)(b)]),(0,o.createVNode)(32,"svg",null,[(m||f)&&(0,o.createVNode)(32,"g",(0,a.classes)(["RoundGauge__alert",k?"active RoundGauge__alert--"+k:""]),(0,o.createVNode)(32,"path",null,null,1,{d:"M48.211,14.578C48.55,13.9 49.242,13.472 50,13.472C50.758,13.472 51.45,13.9 51.789,14.578C54.793,20.587 60.795,32.589 63.553,38.106C63.863,38.726 63.83,39.462 63.465,40.051C63.101,40.641 62.457,41 61.764,41C55.996,41 44.004,41 38.236,41C37.543,41 36.899,40.641 36.535,40.051C36.17,39.462 36.137,38.726 36.447,38.106C39.205,32.589 45.207,20.587 48.211,14.578ZM50,34.417C51.426,34.417 52.583,35.574 52.583,37C52.583,38.426 51.426,39.583 50,39.583C48.574,39.583 47.417,38.426 47.417,37C47.417,35.574 48.574,34.417 50,34.417ZM50,32.75C50,32.75 53,31.805 53,22.25C53,20.594 51.656,19.25 50,19.25C48.344,19.25 47,20.594 47,22.25C47,31.805 50,32.75 50,32.75Z"}),2),(0,o.createVNode)(32,"g",null,(0,o.createVNode)(32,"circle","RoundGauge__ringTrack",null,1,{cx:"50",cy:"50",r:"45"}),2),(0,o.createVNode)(32,"g",null,Object.keys(x).map((function(e,t){var n=x[e];return(0,o.createVNode)(32,"circle","RoundGauge__ringFill RoundGauge--color--"+e,null,1,{style:{"stroke-dashoffset":Math.max((2-(n[1]-n[0]))*Math.PI*50,0)},transform:"rotate("+(180+180*n[0])+" 50 50)",cx:"50",cy:"50",r:"45"},t)})),0),(0,o.createVNode)(32,"g","RoundGauge__needle",[(0,o.createVNode)(32,"polygon","RoundGauge__needleLine",null,1,{points:"46,50 50,0 54,50"}),(0,o.createVNode)(32,"circle","RoundGauge__needleMiddle",null,1,{cx:"50",cy:"50",r:"8"})],4,{transform:"rotate("+(180*y-90)+" 50 50)"})],0,{viewBox:"0 0 100 50"}),2,Object.assign({},(0,c.computeBoxProps)(Object.assign({style:Object.assign({"font-size":g+"em"},v)},b))))),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:t,format:h,size:g})]})}},77381:function(e,t,n){"use strict";t.__esModule=!0,t.Section=void 0;var o=n(96323),r=n(1060),a=n(99397),i=n(54425),c=["className","title","buttons","fill","fitted","scrollable","children"];function l(e,t){return l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},l(e,t)}var u=function(e){var t,n;function u(t){var n;return(n=e.call(this,t)||this).scrollableRef=void 0,n.scrollable=void 0,n.scrollableRef=(0,o.createRef)(),n.scrollable=t.scrollable,n}n=e,(t=u).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n);var d=u.prototype;return d.componentDidMount=function(){this.scrollable&&(0,a.addScrollableNode)(this.scrollableRef.current)},d.componentWillUnmount=function(){this.scrollable&&(0,a.removeScrollableNode)(this.scrollableRef.current)},d.render=function(){var e=this.props,t=e.className,n=e.title,a=e.buttons,l=e.fill,u=e.fitted,d=e.scrollable,s=e.children,p=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c),m=(0,r.canRender)(n)||(0,r.canRender)(a);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Section",Byond.IS_LTE_IE8&&"Section--iefix",l&&"Section--fill",u&&"Section--fitted",d&&"Section--scrollable",t,(0,i.computeBoxClassName)(p)]),[m&&(0,o.createVNode)(1,"div","Section__title",[(0,o.createVNode)(1,"span","Section__titleText",n,0),(0,o.createVNode)(1,"div","Section__buttons",a,0)],4),(0,o.createVNode)(1,"div","Section__rest",(0,o.createVNode)(1,"div","Section__content",s,0,null,null,this.scrollableRef),2)],0,Object.assign({},(0,i.computeBoxProps)(p))))},u}(o.Component);t.Section=u},4482:function(e,t,n){"use strict";t.__esModule=!0,t.Slider=void 0;var o=n(96323),r=n(97622),a=n(1060),i=n(54425),c=n(42833),l=n(97667),u=["animated","format","maxValue","minValue","onChange","onDrag","step","stepPixelSize","suppressFlicker","unit","value","className","fillValue","color","ranges","children"];t.Slider=function(e){if(Byond.IS_LTE_IE8)return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.NumberInput,Object.assign({},e)));var t=e.animated,n=e.format,d=e.maxValue,s=e.minValue,p=e.onChange,m=e.onDrag,f=e.step,h=e.stepPixelSize,C=e.suppressFlicker,g=e.unit,N=e.value,v=e.className,b=e.fillValue,V=e.color,y=e.ranges,x=void 0===y?{}:y,k=e.children,S=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),I=k!==undefined;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DraggableControl,Object.assign({dragMatrix:[1,0]},{animated:t,format:n,maxValue:d,minValue:s,onChange:p,onDrag:m,step:f,stepPixelSize:h,suppressFlicker:C,unit:g,value:N},{children:function(e){var t=e.dragging,n=(e.editing,e.value),c=e.displayValue,l=e.displayElement,u=e.inputElement,p=e.handleDragStart,m=b!==undefined&&null!==b,f=((0,r.scale)(n,s,d),(0,r.scale)(null!=b?b:c,s,d)),h=(0,r.scale)(c,s,d),C=V||(0,r.keyOfMatchingRange)(null!=b?b:n,x)||"default";return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,a.classes)(["Slider","ProgressBar","ProgressBar--color--"+C,v,(0,i.computeBoxClassName)(S)]),[(0,o.createVNode)(1,"div",(0,a.classes)(["ProgressBar__fill",m&&"ProgressBar__fill--animated"]),null,1,{style:{width:100*(0,r.clamp01)(f)+"%",opacity:.4}}),(0,o.createVNode)(1,"div","ProgressBar__fill",null,1,{style:{width:100*(0,r.clamp01)(Math.min(f,h))+"%"}}),(0,o.createVNode)(1,"div","Slider__cursorOffset",[(0,o.createVNode)(1,"div","Slider__cursor"),(0,o.createVNode)(1,"div","Slider__pointer"),t&&(0,o.createVNode)(1,"div","Slider__popupValue",l,0)],0,{style:{width:100*(0,r.clamp01)(h)+"%"}}),(0,o.createVNode)(1,"div","ProgressBar__content",I?k:l,0),u],0,Object.assign({},(0,i.computeBoxProps)(S),{onMouseDown:p})))}})))}},4033:function(e,t,n){"use strict";t.__esModule=!0,t.Stack=void 0;var o=n(96323),r=n(1060),a=n(67486),i=["className","vertical","fill","zebra"],c=["className","innerRef"],l=["className","hidden"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.vertical,c=e.fill,l=e.zebra,d=u(e,i);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack",c&&"Stack--fill",n?"Stack--vertical":"Stack--horizontal",l&&"Stack--zebra",t,(0,a.computeFlexClassName)(e)]),null,1,Object.assign({},(0,a.computeFlexProps)(Object.assign({direction:n?"column":"row"},d)))))};t.Stack=d;d.Item=function(e){var t=e.className,n=e.innerRef,i=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack__item",t,(0,a.computeFlexItemClassName)(i)]),null,1,Object.assign({},(0,a.computeFlexItemProps)(i)),null,n))};d.Divider=function(e){var t=e.className,n=e.hidden,i=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Stack__item","Stack__divider",n&&"Stack__divider--hidden",t,(0,a.computeFlexItemClassName)(i)]),null,1,Object.assign({},(0,a.computeFlexItemProps)(i))))}},28581:function(e,t,n){"use strict";t.__esModule=!0,t.TableCell=t.TableRow=t.Table=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["className","collapsing","children"],c=["className","header"],l=["className","collapsing","header"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.collapsing,c=e.children,l=u(e,i);return(0,o.normalizeProps)((0,o.createVNode)(1,"table",(0,r.classes)(["Table",n&&"Table--collapsing",t,(0,a.computeBoxClassName)(l)]),(0,o.createVNode)(1,"tbody",null,c,0),2,Object.assign({},(0,a.computeBoxProps)(l))))};t.Table=d,d.defaultHooks=r.pureComponentHooks;var s=function(e){var t=e.className,n=e.header,i=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"tr",(0,r.classes)(["Table__row",n&&"Table__row--header",t,(0,a.computeBoxClassName)(e)]),null,1,Object.assign({},(0,a.computeBoxProps)(i))))};t.TableRow=s,s.defaultHooks=r.pureComponentHooks;var p=function(e){var t=e.className,n=e.collapsing,i=e.header,c=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"td",(0,r.classes)(["Table__cell",n&&"Table__cell--collapsing",i&&"Table__cell--header",t,(0,a.computeBoxClassName)(e)]),null,1,Object.assign({},(0,a.computeBoxProps)(c))))};t.TableCell=p,p.defaultHooks=r.pureComponentHooks,d.Row=s,d.Cell=p},60839:function(e,t,n){"use strict";t.__esModule=!0,t.Tabs=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(65743),c=["className","vertical","fill","fluid","children"],l=["className","selected","color","icon","leftSlot","rightSlot","children"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.vertical,i=e.fill,l=e.fluid,d=e.children,s=u(e,c);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tabs",n?"Tabs--vertical":"Tabs--horizontal",i&&"Tabs--fill",l&&"Tabs--fluid",t,(0,a.computeBoxClassName)(s)]),d,0,Object.assign({},(0,a.computeBoxProps)(s))))};t.Tabs=d;d.Tab=function(e){var t=e.className,n=e.selected,c=e.color,d=e.icon,s=e.leftSlot,p=e.rightSlot,m=e.children,f=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Tab","Tabs__Tab","Tab--color--"+c,n&&"Tab--selected",t].concat((0,a.computeBoxClassName)(f))),[(0,r.canRender)(s)&&(0,o.createVNode)(1,"div","Tab__left",s,0)||!!d&&(0,o.createVNode)(1,"div","Tab__left",(0,o.createComponentVNode)(2,i.Icon,{name:d}),2),(0,o.createVNode)(1,"div","Tab__text",m,0),(0,r.canRender)(p)&&(0,o.createVNode)(1,"div","Tab__right",p,0)],0,Object.assign({},(0,a.computeBoxProps)(f))))}},51129:function(e,t,n){"use strict";t.__esModule=!0,t.TextArea=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(77863),c=n(57890),l=["onChange","onKeyDown","onKeyPress","onInput","onFocus","onBlur","onEnter","value","maxLength","placeholder"],u=["className","fluid"];function d(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}function s(e,t){return s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},s(e,t)}var p=function(e){var t,n;function p(t,n){var r;(r=e.call(this,t,n)||this).textareaRef=(0,o.createRef)(),r.fillerRef=(0,o.createRef)(),r.state={editing:!1};var a=t.dontUseTabForIndent,l=void 0!==a&&a;return r.handleOnInput=function(e){var t=r.state.editing,n=r.props.onInput;t||r.setEditing(!0),n&&n(e,e.target.value)},r.handleOnChange=function(e){var t=r.state.editing,n=r.props.onChange;t&&r.setEditing(!1),n&&n(e,e.target.value)},r.handleKeyPress=function(e){var t=r.state.editing,n=r.props.onKeyPress;t||r.setEditing(!0),n&&n(e,e.target.value)},r.handleKeyDown=function(e){var t=r.state.editing,n=r.props.onKeyDown;if(e.keyCode===c.KEY_ESCAPE)return r.setEditing(!1),e.target.value=(0,i.toInputValue)(r.props.value),void e.target.blur();if((t||r.setEditing(!0),!l)&&9===(e.keyCode||e.which)){e.preventDefault();var o=e.target,a=o.value,u=o.selectionStart,d=o.selectionEnd;e.target.value=a.substring(0,u)+"\t"+a.substring(d),e.target.selectionEnd=u+1}n&&n(e,e.target.value)},r.handleFocus=function(e){r.state.editing||r.setEditing(!0)},r.handleBlur=function(e){var t=r.state.editing,n=r.props.onChange;t&&(r.setEditing(!1),n&&n(e,e.target.value))},r}n=e,(t=p).prototype=Object.create(n.prototype),t.prototype.constructor=t,s(t,n);var m=p.prototype;return m.componentDidMount=function(){var e=this.props.value,t=this.textareaRef.current;t&&(t.value=(0,i.toInputValue)(e))},m.componentDidUpdate=function(e,t){var n=this.state.editing,o=e.value,r=this.props.value,a=this.textareaRef.current;a&&!n&&o!==r&&(a.value=(0,i.toInputValue)(r))},m.setEditing=function(e){this.setState({editing:e})},m.getValue=function(){return this.textareaRef.current&&this.textareaRef.current.value},m.render=function(){var e=this.props,t=(e.onChange,e.onKeyDown,e.onKeyPress,e.onInput,e.onFocus,e.onBlur,e.onEnter,e.value,e.maxLength),n=e.placeholder,i=d(e,l),c=i.className,s=i.fluid,p=d(i,u);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:(0,r.classes)(["TextArea",s&&"TextArea--fluid",c])},p,{children:(0,o.createVNode)(128,"textarea","TextArea__textarea",null,1,{placeholder:n,onChange:this.handleOnChange,onKeyDown:this.handleKeyDown,onKeyPress:this.handleKeyPress,onInput:this.handleOnInput,onFocus:this.handleFocus,onBlur:this.handleBlur,maxLength:t},null,this.textareaRef)})))},p}(o.Component);t.TextArea=p},92464:function(e,t,n){"use strict";t.__esModule=!0,t.TimeDisplay=void 0;var o=n(97622),r=n(96323);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i=function(e){return"number"==typeof e&&Number.isFinite(e)&&!Number.isNaN(e)},c=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).timer=null,n.timing=!1,n.format=null,n.last_seen_value=undefined,n.state={value:0},i(t.value)&&(n.state.value=Number(t.value),n.last_seen_value=Number(t.value)),n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var c=r.prototype;return c.componentDidUpdate=function(){var e=this;this.props.timing&&(clearInterval(this.timer),this.timer=setInterval((function(){return e.tick()}),1e3))},c.tick=function(){var e=Number(this.state.value);this.props.value!==this.last_seen_value&&(this.last_seen_value=this.props.value,e=this.props.value);var t="up"===this.props.auto?10:-10,n=Math.max(0,e+t);this.setState({value:n})},c.componentDidMount=function(){var e=this;this.props.timing&&(this.timer=setInterval((function(){return e.tick()}),1e3))},c.componentWillUnmount=function(){clearInterval(this.timer)},r.getDerivedStateFromProps=function(e){return e.timing?null:{value:e.value}},r.defaultFormat=function(e){var t=(0,o.toFixed)(Math.floor(e/10%60)).padStart(2,"0"),n=(0,o.toFixed)(Math.floor(e/600%60)).padStart(2,"0");return(0,o.toFixed)(Math.floor(e/36e3%24)).padStart(2,"0")+":"+n+":"+t},c.render=function(){var e=this.state.value;return i(e)?this.props.format?this.props.format(e):r.defaultFormat(e):this.state.value||null},r}(r.Component);t.TimeDisplay=c},59463:function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=void 0;var o=n(96323),r=n(34739);function a(e,t){return a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},a(e,t)}var i={modifiers:[{name:"eventListeners",enabled:!1}]},c={width:0,height:0,top:0,right:0,bottom:0,left:0,x:0,y:0,toJSON:function(){return null}},l=function(e){var t,n;function c(){return e.apply(this,arguments)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,a(t,n);var l=c.prototype;return l.getDOMNode=function(){return(0,o.findDOMfromVNode)(this.$LI,!0)},l.componentDidMount=function(){var e=this,t=this.getDOMNode();t&&(t.addEventListener("mouseenter",(function(){var n=c.renderedTooltip;n===undefined&&((n=document.createElement("div")).className="Tooltip",document.body.appendChild(n),c.renderedTooltip=n),c.currentHoveredElement=t,n.style.opacity="1",e.renderPopperContent()})),t.addEventListener("mouseleave",(function(){e.fadeOut()})))},l.fadeOut=function(){c.currentHoveredElement===this.getDOMNode()&&(c.currentHoveredElement=undefined,c.renderedTooltip.style.opacity="0")},l.renderPopperContent=function(){var e=this,t=c.renderedTooltip;t&&(0,o.render)((0,o.createVNode)(1,"span",null,this.props.content,0),t,(function(){var n=c.singletonPopper;n===undefined?(n=(0,r.createPopper)(c.virtualElement,t,Object.assign({},i,{placement:e.props.position||"auto"})),c.singletonPopper=n):(n.setOptions(Object.assign({},i,{placement:e.props.position||"auto"})),n.update())}),this.context)},l.componentDidUpdate=function(){c.currentHoveredElement===this.getDOMNode()&&this.renderPopperContent()},l.componentWillUnmount=function(){this.fadeOut()},l.render=function(){return this.props.children},c}(o.Component);t.Tooltip=l,l.renderedTooltip=void 0,l.singletonPopper=void 0,l.currentHoveredElement=void 0,l.virtualElement={getBoundingClientRect:function(){var e,t;return null!=(e=null==(t=l.currentHoveredElement)?void 0:t.getBoundingClientRect())?e:c}}},16422:function(e,t,n){"use strict";t.__esModule=!0,t.ColorButton=void 0;var o=n(96323),r=n(54425),a=n(25808),i=n(47233),c=["color"];t.ColorButton=function(e){var t=e.color,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({},n,{children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:t,mr:"5px"}),(0,o.createComponentVNode)(2,r.Box,{as:"code",children:t})]})))}},88344:function(e,t,n){"use strict";t.__esModule=!0,t.ItemList=void 0;var o=n(96323),r=n(26949);t.ItemList=function(e){var t=e.items,n=e.nothing_text,a=void 0===n?"Nothing":n;return t===undefined||0===t.length?""+a:t.map((function(e,t,n){return(0,o.createComponentVNode)(2,r.Flex,{inline:!0,align:"center",children:[!!e.iconBase64&&(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,r.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+e.iconBase64})}),(0,o.createComponentVNode)(2,r.Flex.Item,{pr:1,pl:.5,children:[e.name,t===n.length-1?"":", "+(t===n.length-2?"and ":"")]})]},t)}))}},90282:function(e,t,n){"use strict";t.__esModule=!0,t.Cell=void 0;var o=n(96323),r=n(26949),a=n(98920);t.Cell=function(e){var t=e.columnConfig,n=e.data,i=e.rowId,c=t.basis,l=t.getValueTooltip,u=t.grow,d=t.renderContents,s=(0,a.isValuedColumnConfig)(t)?t.getValue(n):undefined,p=null==l?void 0:l(n),m=d?d({data:n,rowId:i,value:s}):(0,o.createComponentVNode)(2,r.Box,{children:s}),f=p?(0,o.createComponentVNode)(2,r.Tooltip,{content:p,children:m}):m;return(0,o.createComponentVNode)(2,r.Stack.Item,{basis:c,grow:u,children:f})}},72710:function(e,t,n){"use strict";t.__esModule=!0,t.HeaderCell=void 0;var o=n(96323),r=n(4033);t.HeaderCell=function(e){var t=e.config,n=t.basis,a=t.grow,i=t.header;return(0,o.createComponentVNode)(2,r.Stack.Item,{basis:n,grow:a,bold:!0,children:i})}},42151:function(e,t,n){"use strict";t.__esModule=!0,t.HeaderCell=t.Cell=void 0;var o=n(90282);t.Cell=o.Cell;var r=n(72710);t.HeaderCell=r.HeaderCell},98920:function(e,t){"use strict";t.__esModule=!0,t.isValuedColumnConfig=void 0;t.isValuedColumnConfig=function(e){return"getValue"in e}},44516:function(e,t,n){"use strict";t.__esModule=!0,t.Placeholder=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["children","className"];t.Placeholder=function(e){var t=e.children,n=void 0===t?"No results found":t,c=e.className,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),u=(0,r.classes)(["placeholder",c]);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({className:u,color:"label",italic:!0},l,{children:n})))}},99120:function(e,t,n){"use strict";t.__esModule=!0,t.SectionEx=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(77381),c=["className","capitalize"];t.SectionEx=function(e){var t=e.className,n=e.capitalize,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Section,Object.assign({className:(0,r.classes)(["SectionEx",n&&"SectionEx__capitalize",t,(0,a.computeBoxClassName)(l)])},l)))}},26949:function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=t.TimeDisplay=t.TextArea=t.Tabs=t.Table=t.Stack=t.Slider=t.SectionEx=t.Section=t.RoundGauge=t.Pointer=t.Popper=t.ProgressBar=t.Placeholder=t.NumberInput=t.NoticeBox=t.Modal=t.LabeledList=t.LabeledControls=t.Knob=t.ItemList=t.Interactive=t.Input=t.Image=t.Icon=t.Grid=t.Flex=t.Dropdown=t.DraggableControl=t.Divider=t.Dimmer=t.ColorButton=t.ColorBox=t.Collapsible=t.Chart=t.ByondUi=t.Button=t.Box=t.BlockQuote=t.Blink=t.Autofocus=t.AnimatedNumber=void 0;var o=n(54642);t.AnimatedNumber=o.AnimatedNumber;var r=n(75434);t.Autofocus=r.Autofocus;var a=n(90297);t.Blink=a.Blink;var i=n(7149);t.BlockQuote=i.BlockQuote;var c=n(54425);t.Box=c.Box;var l=n(25808);t.Button=l.Button;var u=n(44051);t.ByondUi=u.ByondUi;var d=n(64726);t.Chart=d.Chart;var s=n(49751);t.Collapsible=s.Collapsible;var p=n(47233);t.ColorBox=p.ColorBox;var m=n(16422);t.ColorButton=m.ColorButton;var f=n(93913);t.Dimmer=f.Dimmer;var h=n(22755);t.Divider=h.Divider;var C=n(42833);t.DraggableControl=C.DraggableControl;var g=n(12489);t.Dropdown=g.Dropdown;var N=n(67486);t.Flex=N.Flex;var v=n(28408);t.Grid=v.Grid;var b=n(65743);t.Icon=b.Icon;var V=n(94261);t.Image=V.Image;var y=n(77863);t.Input=y.Input;var x=n(54291);t.Interactive=x.Interactive;var k=n(88344);t.ItemList=k.ItemList;var S=n(14274);t.Knob=S.Knob;var I=n(95592);t.LabeledControls=I.LabeledControls;var w=n(21173);t.LabeledList=w.LabeledList;var _=n(89416);t.Modal=_.Modal;var D=n(23257);t.NoticeBox=D.NoticeBox;var M=n(97667);t.NumberInput=M.NumberInput;var B=n(44516);t.Placeholder=B.Placeholder;var A=n(12194);t.ProgressBar=A.ProgressBar;var T=n(16513);t.Popper=T.Popper;var L=n(76776);t.Pointer=L.Pointer;var E=n(94709);t.RoundGauge=E.RoundGauge;var P=n(77381);t.Section=P.Section;var j=n(99120);t.SectionEx=j.SectionEx;var O=n(4482);t.Slider=O.Slider;var F=n(4033);t.Stack=F.Stack;var R=n(28581);t.Table=R.Table;var z=n(60839);t.Tabs=z.Tabs;var W=n(51129);t.TextArea=W.TextArea;var U=n(92464);t.TimeDisplay=U.TimeDisplay;var H=n(59463);t.Tooltip=H.Tooltip},84200:function(e,t){"use strict";t.__esModule=!0,t.getGasColor=t.getGasLabel=t.RADIO_CHANNELS=t.CSS_COLORS=t.COLORS=t.UI_CLOSE=t.UI_DISABLED=t.UI_UPDATE=t.UI_INTERACTIVE=void 0;t.UI_INTERACTIVE=2;t.UI_UPDATE=1;t.UI_DISABLED=0;t.UI_CLOSE=-1;t.COLORS={department:{captain:"#548b55",security:"#e74c3c",medbay:"#3498db",science:"#9b59b6",engineering:"#f1c40f",cargo:"#f39c12",centcom:"#00c100",other:"#c38312"},damageType:{oxy:"#3498db",toxin:"#2ecc71",burn:"#e67e22",brute:"#e74c3c"},damageTypeFill:{oxy:"rgba(52, 152, 219, 0.5)",toxin:"rgba(46, 204, 113, 0.5)",burn:"rgba(230, 126, 34, 0.5)",brute:"rgba(231, 76, 60, 0.5)"}};t.CSS_COLORS=["black","white","red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey","good","average","bad","label"];t.RADIO_CHANNELS=[{name:"Syndicate",freq:1352,color:"#BB3333"},{name:"CentCom",freq:1451,color:"#2681a5"},{name:"Catering",freq:1485,color:"#C16082"},{name:"Civilian",freq:1355,color:"#6ca729"},{name:"Research",freq:1354,color:"#153E9E"},{name:"Command",freq:1356,color:"#5177ff"},{name:"Medical",freq:1445,color:"#57b8f0"},{name:"Engineering",freq:1441,color:"#BBBB00"},{name:"Security",freq:1485,color:"#dd3535"},{name:"AI",freq:1447,color:"#333399"},{name:"Bridge",freq:1442,color:"#339933"}];var n=[{id:"o2",name:"Oxygen",label:"O\u2082",color:"blue"},{id:"n2",name:"Nitrogen",label:"N\u2082",color:"red"},{id:"co2",name:"Carbon Dioxide",label:"CO\u2082",color:"grey"},{id:"plasma",name:"Plasma",label:"Plasma",color:"pink"},{id:"n2o",name:"Nitrous Oxide",label:"N\u2082O",color:"red"}];t.getGasLabel=function(e,t){var o=String(e).toLowerCase(),r=n.find((function(e){return e.id===o||e.name.toLowerCase()===o}));return r&&r.label||t||e};t.getGasColor=function(e){var t=String(e).toLowerCase(),o=n.find((function(e){return e.id===t||e.name.toLowerCase()===t}));return o&&o.color}},71224:function(e,t,n){"use strict";t.__esModule=!0,t.KitchenSink=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(69321);t.KitchenSink=function(e,t){var n=e.panel,l=(0,r.useLocalState)(t,"kitchenSinkTheme")[0],u=(0,r.useLocalState)(t,"pageIndex",0),d=u[0],s=u[1],p=c.keys().map((function(e){return c(e)})),m=p[d],f=n?i.Pane:i.Window;return(0,o.createComponentVNode)(2,f,{title:"Kitchen Sink",width:600,height:500,theme:l,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{m:1,mr:0,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,fitted:!0,children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,children:p.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{color:"transparent",selected:t===d,onClick:function(){return s(t)},children:e.meta.title},t)}))})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{position:"relative",grow:1,children:(0,o.createComponentVNode)(2,f.Content,{scrollable:!0,children:m.meta.render()})})]})})}},98069:function(e,t,n){"use strict";t.__esModule=!0,t.openExternalBrowser=t.toggleDebugLayout=t.toggleKitchenSink=void 0;var o=n(465),r=(0,o.createAction)("debug/toggleKitchenSink");t.toggleKitchenSink=r;var a=(0,o.createAction)("debug/toggleDebugLayout");t.toggleDebugLayout=a;var i=(0,o.createAction)("debug/openExternalBrowser");t.openExternalBrowser=i},35177:function(e,t,n){"use strict";t.__esModule=!0,t.useDebug=void 0;var o=n(465),r=n(12184);t.useDebug=function(e){return(0,o.useSelector)(e,r.selectDebug)}},27157:function(e,t,n){"use strict";t.__esModule=!0,t.debugReducer=t.relayMiddleware=t.debugMiddleware=t.KitchenSink=t.useDebug=void 0;var o=n(35177);t.useDebug=o.useDebug;var r=n(71224);t.KitchenSink=r.KitchenSink;var a=n(46656);t.debugMiddleware=a.debugMiddleware,t.relayMiddleware=a.relayMiddleware;var i=n(7124);t.debugReducer=i.debugReducer},46656:function(e,t,n){"use strict";t.__esModule=!0,t.relayMiddleware=t.debugMiddleware=void 0;var o=n(57890),r=n(99397),a=n(6965),i=n(98069),c=["backend/update","chat/message"];t.debugMiddleware=function(e){return(0,a.acquireHotKey)(o.KEY_F11),(0,a.acquireHotKey)(o.KEY_F12),r.globalEvents.on("keydown",(function(t){t.code===o.KEY_F11&&e.dispatch((0,i.toggleDebugLayout)()),t.code===o.KEY_F12&&e.dispatch((0,i.toggleKitchenSink)()),t.ctrl&&t.alt&&t.code===o.KEY_BACKSPACE&&setTimeout((function(){throw new Error("OOPSIE WOOPSIE!! UwU We made a fucky wucky!! A wittle fucko boingo! The code monkeys at our headquarters are working VEWY HAWD to fix this!")}))})),function(e){return function(t){return e(t)}}};t.relayMiddleware=function(e){var t=n(82252),l="?external"===location.search;return l?t.subscribe((function(t){var n=t.type,o=t.payload;"relay"===n&&o.windowId===window.__windowId__&&e.dispatch(Object.assign({},o.action,{relayed:!0}))})):((0,a.acquireHotKey)(o.KEY_F10),r.globalEvents.on("keydown",(function(t){t===o.KEY_F10&&e.dispatch((0,i.openExternalBrowser)())}))),function(e){return function(n){var o=n.type,r=(n.payload,n.relayed);if(o!==i.openExternalBrowser.type)return!c.includes(o)||r||l||t.sendMessage({type:"relay",payload:{windowId:window.__windowId__,action:n}}),e(n);window.open(location.href+"?external","_blank")}}}},7124:function(e,t){"use strict";t.__esModule=!0,t.debugReducer=void 0;t.debugReducer=function(e,t){void 0===e&&(e={});var n=t.type;t.payload;return"debug/toggleKitchenSink"===n?Object.assign({},e,{kitchenSink:!e.kitchenSink}):"debug/toggleDebugLayout"===n?Object.assign({},e,{debugLayout:!e.debugLayout}):e}},12184:function(e,t){"use strict";t.__esModule=!0,t.selectDebug=void 0;t.selectDebug=function(e){return e.debug}},41410:function(e,t,n){"use strict";t.__esModule=!0,t.resizeStartHandler=t.dragStartHandler=t.setupDrag=t.recallWindowGeometry=t.storeWindowGeometry=t.getScreenSize=t.getScreenPosition=t.setWindowSize=t.setWindowPosition=t.getWindowSize=t.getWindowPosition=t.setWindowKey=void 0;var o=n(7151),r=n(67288);function a(e,t,n,o,r,a,i){try{var c=e[a](i),l=c.value}catch(u){return void n(u)}c.done?t(l):Promise.resolve(l).then(o,r)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(o,r){var i=e.apply(t,n);function c(e){a(i,o,r,c,l,"next",e)}function l(e){a(i,o,r,c,l,"throw",e)}c(undefined)}))}}var c,l,u,d,s,p=(0,n(79926).createLogger)("drag"),m=window.__windowId__,f=!1,h=!1,C=[0,0];t.setWindowKey=function(e){m=e};var g=function(){return[window.screenLeft,window.screenTop]};t.getWindowPosition=g;var N=function(){return[window.innerWidth,window.innerHeight]};t.getWindowSize=N;var v=function(e){var t=(0,r.vecAdd)(e,C);return Byond.winset(window.__windowId__,{pos:t[0]+","+t[1]})};t.setWindowPosition=v;var b=function(e){return Byond.winset(window.__windowId__,{size:e[0]+"x"+e[1]})};t.setWindowSize=b;var V=function(){return[0-C[0],0-C[1]]};t.getScreenPosition=V;var y=function(){return[window.screen.availWidth,window.screen.availHeight]};t.getScreenSize=y;var x=function(e,t,n){void 0===n&&(n=50);for(var o,r=[t],a=0;a<e.length;a++){var i=e[a];i!==t&&(r.length<n?r.push(i):o=i)}return[r,o]},k=function(){var e=i(regeneratorRuntime.mark((function t(){var e,n,r,a;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p.log("storing geometry"),e={pos:g(),size:N()},o.storage.set(m,e),t.t0=x,t.next=6,o.storage.get("geometries");case 6:if(t.t1=t.sent,t.t1){t.next=9;break}t.t1=[];case 9:t.t2=t.t1,t.t3=m,n=(0,t.t0)(t.t2,t.t3),r=n[0],(a=n[1])&&o.storage.remove(a),o.storage.set("geometries",r);case 16:case"end":return t.stop()}}),t)})));return function(){return e.apply(this,arguments)}}();t.storeWindowGeometry=k;var S=function(){var e=i(regeneratorRuntime.mark((function t(e){var n,a,i,l;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===e&&(e={}),t.t0=e.fancy,!t.t0){t.next=6;break}return t.next=5,o.storage.get(m);case 5:t.t0=t.sent;case 6:return(n=t.t0)&&p.log("recalled geometry:",n),a=(null==n?void 0:n.pos)||e.pos,i=e.size,t.next=12,c;case 12:l=[window.screen.availWidth,window.screen.availHeight],i&&(i=[Math.min(l[0],i[0]),Math.min(l[1],i[1])],b(i)),a?(i&&e.locked&&(a=w(a,i)[1]),v(a)):i&&(a=(0,r.vecAdd)((0,r.vecScale)(l,.5),(0,r.vecScale)(i,-.5),(0,r.vecScale)(C,-1)),v(a));case 15:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}();t.recallWindowGeometry=S;var I=function(){var e=i(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return c=Byond.winget(window.__windowId__,"pos").then((function(e){return[e.x-window.screenLeft,e.y-window.screenTop]})),e.next=3,c;case 3:C=e.sent,p.debug("screen offset",C);case 5:case"end":return e.stop()}}),t)})));return function(){return e.apply(this,arguments)}}();t.setupDrag=I;var w=function(e,t){for(var n=V(),o=y(),r=[e[0],e[1]],a=!1,i=0;i<2;i++){var c=n[i],l=n[i]+o[i];e[i]<c?(r[i]=c,a=!0):e[i]+t[i]>l&&(r[i]=l-t[i],a=!0)}return[a,r]};t.dragStartHandler=function(e){p.log("drag start"),f=!0,l=[window.screenLeft-e.screenX,window.screenTop-e.screenY],document.addEventListener("mousemove",D),document.addEventListener("mouseup",_),D(e)};var _=function A(e){p.log("drag end"),f=!1,D(e),document.removeEventListener("mousemove",D),document.removeEventListener("mouseup",A),k()},D=function T(e){if(f){if(0===e.buttons)return p.log("emergency drag end"),document.removeEventListener("mousemove",T),document.removeEventListener("mouseup",_),f=!1,void k();e.preventDefault(),v((0,r.vecAdd)([e.screenX,e.screenY],l))}};t.resizeStartHandler=function(e,t){return function(n){u=[e,t],p.log("resize start",u),h=!0,l=[window.screenLeft-n.screenX,window.screenTop-n.screenY],d=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",B),document.addEventListener("mouseup",M),B(n)}};var M=function L(e){p.log("resize end",s),B(e),document.removeEventListener("mousemove",B),document.removeEventListener("mouseup",L),h=!1,k()},B=function(e){h&&(e.preventDefault(),(s=(0,r.vecAdd)(d,(0,r.vecMultiply)(u,(0,r.vecAdd)([e.screenX,e.screenY],(0,r.vecInverse)([window.screenLeft,window.screenTop]),l,[1,1]))))[0]=Math.max(s[0],150),s[1]=Math.max(s[1],50),b(s))}},99397:function(e,t,n){"use strict";t.__esModule=!0,t.KeyEvent=t.removeScrollableNode=t.addScrollableNode=t.canStealFocus=t.setupGlobalEvents=t.globalEvents=void 0;var o=n(52844),r=n(57890),a=new o.EventEmitter;t.globalEvents=a;var i,c=!1;t.setupGlobalEvents=function(e){void 0===e&&(e={}),c=!!e.ignoreWindowFocus};var l=!0,u=function N(e,t){c?l=!0:(i&&(clearTimeout(i),i=null),t?i=setTimeout((function(){return N(e)})):l!==e&&(l=e,a.emit(e?"window-focus":"window-blur"),a.emit("window-focus-change",e)))},d=null,s=function(e){var t=String(e.tagName).toLowerCase();return"input"===t||"textarea"===t};t.canStealFocus=s;var p=function v(){d&&(d.removeEventListener("blur",v),d=null)},m=null,f=null,h=[];t.addScrollableNode=function(e){h.push(e)};t.removeScrollableNode=function(e){var t=h.indexOf(e);t>=0&&h.splice(t,1)};window.addEventListener("mousemove",(function(e){var t=e.target;t!==f&&(f=t,function(e){if(!d&&l)for(var t=document.body;e&&e!==t;){if(h.includes(e)){if(e.contains(m))return;return m=e,void e.focus()}e=e.parentNode}}(t))})),window.addEventListener("focusin",(function(e){if(f=null,m=e.target,u(!0),s(e.target))return t=e.target,p(),void(d=t).addEventListener("blur",p);var t})),window.addEventListener("focusout",(function(e){f=null,u(!1,!0)})),window.addEventListener("blur",(function(e){f=null,u(!1,!0)})),window.addEventListener("beforeunload",(function(e){u(!1)}));var C={},g=function(){function e(e,t,n){this.event=e,this.type=t,this.code=window.event?e.which:e.keyCode,this.ctrl=e.ctrlKey,this.shift=e.shiftKey,this.alt=e.altKey,this.repeat=!!n}var t=e.prototype;return t.hasModifierKeys=function(){return this.ctrl||this.alt||this.shift},t.isModifierKey=function(){return this.code===r.KEY_CTRL||this.code===r.KEY_SHIFT||this.code===r.KEY_ALT},t.isDown=function(){return"keydown"===this.type},t.isUp=function(){return"keyup"===this.type},t.toString=function(){return this._str||(this._str="",this.ctrl&&(this._str+="Ctrl+"),this.alt&&(this._str+="Alt+"),this.shift&&(this._str+="Shift+"),this.code>=48&&this.code<=90?this._str+=String.fromCharCode(this.code):this.code>=r.KEY_F1&&this.code<=r.KEY_F12?this._str+="F"+(this.code-111):this._str+="["+this.code+"]"),this._str},e}();t.KeyEvent=g,document.addEventListener("keydown",(function(e){if(!s(e.target)){var t=e.keyCode,n=new g(e,"keydown",C[t]);a.emit("keydown",n),a.emit("key",n),C[t]=!0}})),document.addEventListener("keyup",(function(e){if(!s(e.target)){var t=e.keyCode,n=new g(e,"keyup");a.emit("keyup",n),a.emit("key",n),C[t]=!1}}))},40509:function(e,t){"use strict";t.__esModule=!0,t.hasWindowFocus=t.focusWindow=t.focusMap=void 0;t.focusMap=function(){Byond.winset("mapwindow.map",{focus:!0})};t.focusWindow=function(){Byond.winset(window.__windowId__,{focus:!0})};t.hasWindowFocus=function(){return document.hasFocus()}},1033:function(e,t,n){"use strict";t.__esModule=!0,t.formatFrequency=t.truncate=t.formatPressure=t.formatTime=t.formatDb=t.formatMoney=t.formatPower=t.formatSiUnit=void 0;var o=n(97622),r=["f","p","n","\u03bc","m"," ","k","M","G","T","P","E","Z","Y"],a=r.indexOf(" "),i=function(e,t,n){if(void 0===t&&(t=-a),void 0===n&&(n=""),"number"!=typeof e||!Number.isFinite(e))return e;var i=Math.floor(Math.log10(e)),c=Math.floor(Math.max(3*t,i)),l=Math.floor(i/3),u=Math.floor(c/3),d=(0,o.clamp)(a+u,0,r.length),s=r[d],p=e/Math.pow(1e3,u),m=l>t?2+3*u-c:0;return((0,o.toFixed)(p,m)+" "+s+n).trim()};t.formatSiUnit=i;t.formatPower=function(e,t){return void 0===t&&(t=0),i(e,t,"W")};t.formatMoney=function(e,t){if(void 0===t&&(t=0),!Number.isFinite(e))return e;var n=(0,o.round)(e,t);t>0&&(n=(0,o.toFixed)(e,t));var r=(n=String(n)).length,a=n.indexOf(".");-1===a&&(a=r);for(var i="",c=0;c<r;c++)c>0&&c<a&&(a-c)%3==0&&(i+=","),i+=n.charAt(c);return i};t.formatDb=function(e){var t=20*Math.log(e)/Math.log(10),n=t>=0?"+":"\u2013",r=Math.abs(t);return n+(r=r===Infinity?"Inf":(0,o.toFixed)(r,2))+" dB"};t.formatTime=function(e,t){void 0===t&&(t="");var n=Math.floor(e/10%60),o=Math.floor((e/10-n)/60);return e<=0&&""!==t?t:(n<10&&(n="0"+n),o<10&&(o="0"+o),o+":"+n)};t.formatPressure=function(e){return e<1e4?(0,o.toFixed)(e)+" kPa":i(1e3*e,1,"Pa")};t.truncate=function(e,t){return void 0===t&&(t=25),e.length>t?e.substr(0,t-1)+"\u2026":e};t.formatFrequency=function(e){return e=Math.round(e),Math.floor(e/10)+"."+e%10}},6965:function(e,t,n){"use strict";t.__esModule=!0,t.listenForKeyEvents=t.setupHotKeys=t.releaseHeldKeys=t.releaseHotKey=t.acquireHotKey=void 0;var o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=a(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var c=r?Object.getOwnPropertyDescriptor(e,i):null;c&&(c.get||c.set)?Object.defineProperty(o,i,c):o[i]=e[i]}o["default"]=e,n&&n.set(e,o);return o}(n(57890)),r=n(99397);function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(a=function(e){return e?n:t})(e)}function i(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var l=(0,n(79926).createLogger)("hotkeys"),u={},d=[o.KEY_ESCAPE,o.KEY_ENTER,o.KEY_SPACE,o.KEY_TAB,o.KEY_CTRL,o.KEY_SHIFT,o.KEY_UP,o.KEY_DOWN,o.KEY_LEFT,o.KEY_RIGHT,o.KEY_F5],s={},p=[],m=function(e){var t=String(e);if("Ctrl+F5"!==t&&"Ctrl+R"!==t){if("Ctrl+F"!==t&&!(e.event.defaultPrevented||e.isModifierKey()||d.includes(e.code))){var n,o=16===(n=e.code)?"Shift":17===n?"Ctrl":18===n?"Alt":33===n?"Northeast":34===n?"Southeast":35===n?"Southwest":36===n?"Northwest":37===n?"West":38===n?"North":39===n?"East":40===n?"South":45===n?"Insert":46===n?"Delete":n>=48&&n<=57||n>=65&&n<=90?String.fromCharCode(n):n>=96&&n<=105?"Numpad"+(n-96):n>=112&&n<=123?"F"+(n-111):188===n?",":189===n?"-":190===n?".":void 0;if(o){var r=u[o];if(r)return l.debug("macro",r),Byond.command(r);if(e.isDown()&&!s[o]){s[o]=!0;var a='.keydown "'+o+'"';return l.debug(a),Byond.command(a)}if(e.isUp()&&s[o]){s[o]=!1;var i='.force_keyup "'+o+'"';return l.debug(i),Byond.command(i)}}}}else location.reload()};t.acquireHotKey=function(e){d.push(e)};t.releaseHotKey=function(e){var t=d.indexOf(e);t>=0&&d.splice(t,1)};var f=function(){for(var e=0,t=Object.keys(s);e<t.length;e++){var n=t[e];s[n]&&(s[n]=!1,l.log('releasing key "'+n+'"'),Byond.command('.force_keyup "'+n+'"'))}};t.releaseHeldKeys=f;t.setupHotKeys=function(){Byond.winget("default.*").then((function(e){for(var t={},n=0,o=Object.keys(e);n<o.length;n++){var r=o[n],a=r.split("."),i=a[1],c=a[2];i&&c&&(t[i]||(t[i]={}),t[i][c]=e[r])}for(var d=/\\"/g,s=function(e){return e.substring(1,e.length-1).replace(d,'"')},p=0,m=Object.keys(t);p<m.length;p++){var f=t[m[p]],h=s(f.name);u[h]=s(f.command)}l.debug("loaded macros",u)})),r.globalEvents.on("window-blur",(function(){f()})),r.globalEvents.on("key",(function(e){for(var t,n=i(p);!(t=n()).done;){(0,t.value)(e)}m(e)}))};t.listenForKeyEvents=function(e){p.push(e);var t=!1;return function(){t||(t=!0,p.splice(p.indexOf(e),1))}}},36525:function(e,t,n){"use strict";t.__esModule=!0,t.AIRack=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.AIRack=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.lawTitles,d=l.lawText,s=l.welded,p=l.screwed;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"AI Law Rack",width:600,height:800,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Collapsible,{title:e?u[t]:"Empty",open:!!e,children:[(0,o.createComponentVNode)(2,a.BlockQuote,{preserveWhitespace:!0,children:e?d[t]:"<Empty Slot>"}),(0,o.createComponentVNode)(2,a.Button,{icon:e?"circle":"circle-o",content:e?"Remove":"Empty",onClick:function(){return c("rack",{rack_index:t+1})},disabled:s[t]||p[t]}),(0,o.createComponentVNode)(2,a.Button,{icon:s[t]?"circle":"circle-o",content:s[t]?"Welded":"Not Welded",onClick:function(){return c("weld",{rack_index:t+1})},color:s[t]?"red":"green"}),(0,o.createComponentVNode)(2,a.Button,{icon:p[t]?"circle":"circle-o",content:p[t]?"Screwed In":"Not Screwed In",onClick:function(){return c("screw",{rack_index:t+1})},color:p[t]?"red":"green"})]},t)}))})})})})}},50687:function(e,t,n){"use strict";t.__esModule=!0,t.AbilityManager=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.number,n=e.unit,r=e.onChange,i=e.abilityRef;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,unit:n,width:"5em",value:t,onChange:function(e,t){return r(i,t)}})})})},l=function(e){var t=e.children;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",textAlign:"center",children:t})},u=function(){return(0,o.createComponentVNode)(2,a.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,l,{children:"Name"}),(0,o.createComponentVNode)(2,l,{children:"Subtype"}),(0,o.createComponentVNode)(2,l,{children:"Cost"}),(0,o.createComponentVNode)(2,l,{children:"Cooldown"}),(0,o.createComponentVNode)(2,l,{children:"Actions"})]})};t.AbilityManager=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,s=d.abilities,p=d.target_name,m=function(e,t){return l("updatePointCost",{abilityRef:e,value:t})},f=function(e,t){return l("updateCooldown",{abilityRef:e,value:t})};return(0,o.createComponentVNode)(2,i.Window,{title:"Ability Manager",width:"750",height:"300",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Abilities of "+p,scrollable:!0,fill:!0,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return l("addAbility")},children:"Add Ability"}),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,u),(null==s?void 0:s.length)>0?s.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.subtype}),(0,o.createComponentVNode)(2,c,{number:e.pointCost,onChange:m,abilityRef:e.abilityRef}),(0,o.createComponentVNode)(2,c,{number:e.cooldown,unit:"ds",onChange:f,abilityRef:e.abilityRef}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{direction:"row",align:"center",nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:"View Variables",tooltipPosition:"top",align:"left",icon:"gear",onClick:function(){return t=e.abilityRef,l("manageAbility",{abilityRef:t});var t}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:"Rename",tooltipPosition:"top",align:"left",icon:"pen",onClick:function(){return t=e.abilityRef,l("renameAbility",{abilityRef:t});var t}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{tooltip:"Remove",tooltipPosition:"top",align:"left",icon:"trash",color:"bad",onClick:function(){return t=e.abilityRef,l("deleteAbility",{abilityRef:t});var t}})]})})]},e.abilityRef)})):null]})})})})}},24782:function(e,t,n){"use strict";t.__esModule=!0,t.GasInfo=t.AirAlarm=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(48175);t.AirAlarm=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data),d=c.boundaries,s=c.gasses,p=c.temperature,m=c.safe;return(0,o.createComponentVNode)(2,i.Window,{width:300,height:350,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[0===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"red",children:"ALERT!"}),1===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"orange",children:"CAUTION"}),2===m&&(0,o.createComponentVNode)(2,a.Box,{align:"center",fontSize:2,color:"green",children:"OPTIMAL"}),(0,o.createComponentVNode)(2,a.Box,{align:"center",nowrap:!0,p:1,fontSize:1,color:(0,l.getTemperatureColor)(p),children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Atmospheric Temperature"}),(0,o.createComponentVNode)(2,a.Icon,{name:(0,l.getTemperatureIcon)(p),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p})," K"]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Gasses",children:[(0,o.createComponentVNode)(2,a.Flex,{children:d.slice(0,4).map((function(e,t){return(0,o.createComponentVNode)(2,u,{partial_pressure:s[e.varname],boundary:e,gas_index:t},e.varname)}))}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Flex,{children:d.slice(4,8).map((function(e,t){return(0,o.createComponentVNode)(2,u,{partial_pressure:s[e.varname],boundary:e,gas_index:t},e.varname)}))})]})]})})};var u=function(e){var t=e.partial_pressure,n=e.boundary,r=(e.gas_index,100);return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Box,{align:"center",children:n.friend_name}),(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.RoundGauge,{align:"center",size:1.75,value:t,minValue:0,maxValue:r,alertAfter:isFinite(n.safe_max)?n.safe_max:r,alertBefore:isFinite(n.safe_min)?n.safe_min:0,ranges:{bad:[0,r],average:[isFinite(n.safe_min)?n.safe_min:0,isFinite(n.safe_max)?n.safe_max:r],good:[isFinite(n.good_min)?n.good_min:0,isFinite(n.good_max)?n.good_max:r]},format:c.formatPressure})})]})};t.GasInfo=u},89375:function(e,t,n){"use strict";t.__esModule=!0,t.AirVendor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(72638),l=n(5394),u=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.air_cost,u=c.bankMoney,d=c.cash,s=c.current_fill,p=c.fill_cost,m=c.max_pressure,f=c.min_pressure,h=c.target_pressure,C=c.vend_type,g=function(e){return i("o2_changepressure",{pressure:e})},N=!l,v=N||p>0&&(u>=p||d>=p);return(0,o.createComponentVNode)(2,a.Section,{title:"Buy "+C+"!",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cost",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Button,{content:N?"Free!":(p||0)+"\u2abd",color:v?"green":undefined,disabled:!v,onClick:function(){return i("o2_fill")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:h===f,onClick:function(){return g(f)},content:"Min"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Slider,{value:h,fillValue:Math.min(s,m),minValue:f,maxValue:m,step:10,stepPixelSize:4,onChange:function(e,t){return g(t)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:h===m,onClick:function(){return g(m)},content:"Max"})})]})})]})})},d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,u=c.holding,d=c.holding_pressure,s=c.max_pressure;return(0,o.createComponentVNode)(2,a.Section,{title:"Holding Tank",buttons:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("o2_eject")},icon:"eject",disabled:!u,children:"Eject"}),children:[(0,o.createComponentVNode)(2,l.GasTankInfo,{pressure:d||0,maxPressure:s||1,name:u||"N/A"}),!u&&(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return i("o2_insert")},bold:!0,children:"Insert Gas Tank"})})]})};t.AirVendor=function(e,t){var n=(0,r.useBackend)(t),a=n.act,l=n.data,s=l.cash,p=l.cardname,m=l.bankMoney;return(0,o.createComponentVNode)(2,i.Window,{width:350,height:320,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,c.VendorCashTable,{cardname:p,onCardClick:function(){return a("logout")},bankMoney:m,cash:s,onCashClick:function(){return a("returncash")}})]})})}},22704:function(e,t,n){"use strict";t.__esModule=!0,t.AccessPanel=t.Airlock=t.uiCurrentUserPermissions=void 0;var o=n(96323),r=n(31246),a=n(1033),i=n(26949),c=n(2381),l=function(e){var t=e.panelOpen,n=e.userStates;return{airlock:n.isBorg||n.isAi,accessPanel:n.isBorg&&n.distance<=1&&t||t&&!n.isBorg&&!n.isAi}};t.uiCurrentUserPermissions=l;t.Airlock=function(e,t){var n=(0,r.useBackend)(t).data,a=l(n);return(0,o.createComponentVNode)(2,c.Window,{theme:"ntos",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[!a.airlock&&!a.accessPanel&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Box,{width:25,height:5,align:"center",children:"Access Panel is Closed"})}),!!a.airlock&&!!a.accessPanel&&(0,o.createComponentVNode)(2,u)||!!a.airlock&&(0,o.createComponentVNode)(2,d)||!!a.accessPanel&&(0,o.createComponentVNode)(2,s)]})})};var u=function(e,t){var n=(0,r.useBackend)(t).data,l=n.name,u=n.canAiControl,d=n.hackMessage,s=n.canAiHack,g=n.noPower,N=(0,r.useLocalState)(t,"tabIndex",1),v=N[0],b=N[1];return(0,o.createComponentVNode)(2,c.Window,{width:354,height:495,title:"Airlock - "+(0,a.truncate)(l,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:1===v,onClick:function(){b(1)},children:"Airlock Controls"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:2===v,onClick:function(){b(2)},children:"Access Panel"})]}),1===v&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{fitted:!0,backgroundColor:"transparent",children:[(!u||!!g)&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:(0,o.createComponentVNode)(2,i.Box,{width:20,height:5,algin:"center",children:d||"Airlock Controls Disabled"})}),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]}),!!s&&(0,o.createComponentVNode)(2,h)],0),2===v&&(0,o.createComponentVNode)(2,C)]})})},d=function(e,t){var n=(0,r.useBackend)(t).data,l=n.name,u=n.canAiControl,d=n.hackMessage,s=n.canAiHack,C=n.noPower;return(0,o.createComponentVNode)(2,c.Window,{width:315,height:380,title:"Airlock - "+(0,a.truncate)(l,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(!u||!!C)&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"26px",children:[(0,o.createComponentVNode)(2,i.Box,{width:20,height:5,algin:"center",children:d||"Airlock Controls Disabled"}),!!s&&(0,o.createComponentVNode)(2,h)]}),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]})})},s=function(e,t){var n=(0,r.useBackend)(t).data.name;return(0,o.createComponentVNode)(2,c.Window,{width:354,height:465,title:"Airlock - "+(0,a.truncate)(n,19),children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,C)})})},p=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.netId,p=c.accessCode,m={width:6.7,textAlign:"center"};return(0,o.createComponentVNode)(2,i.Section,{title:"Power Status",children:[(0,o.createComponentVNode)(2,i.Box,{children:["Access sensor reports the net identifer is:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:s})]}),(0,o.createComponentVNode)(2,i.Box,{children:["Net access code:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:p})]}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Main",color:l?"bad":"good",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},m,{color:"bad",icon:"plug",disabled:!!l,onClick:function(){return a("disruptMain")},children:"Disrupt"}))),children:[l?"Offline":"Online"," ",d.main_1&&d.main_2?l>0&&"["+l+"s]":"[Wires cut!]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Backup",color:u?"bad":"good",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},m,{mt:.5,color:"bad",icon:"plug",disabled:!!u,onClick:function(){return a("disruptBackup")},children:"Disrupt"}))),children:[u?"Offline":"Online"," ",d.backup_1&&d.backup_2?u>0&&"["+u+"s]":"[Wires cut!]"]})]})]})},m=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.idScanner,p=c.boltsAreUp,m=c.opened,f=c.welded,h={width:6.7,textAlign:"center"};return(0,o.createComponentVNode)(2,i.Section,{title:"Access and Door Control",pt:1,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"ID Scan",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},h,{color:s?"good":"bad",icon:s?"power-off":"times",disabled:!d.idScanner||l&&u,onClick:function(){return a("idScanToggle")},children:s?"Enabled":"Disabled"}))),children:!d.idScanner&&"[Wires cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Bolts",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({mt:.5},h,{color:p?"good":"bad",icon:p?"lock":"unlock",disabled:!d.bolts||l&&u,onClick:function(){return a("boltToggle")},children:p?"Raised":"Lowered"}))),children:!d.bolts&&"[Wires cut!]"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door Control",color:"bad",buttons:(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Button,Object.assign({},h,{mt:.5,color:m?"bad":"good",icon:m?"sign-out-alt":"sign-in-alt",disabled:!p||f||l&&u,onClick:function(){return a("openClose")},children:m?"Open":"Closed"}))),children:!(p&&!f)&&(0,o.createVNode)(1,"span",null,[(0,o.createTextVNode)("["),!p&&"Bolted",!p&&f&&" & ",f&&"Welded",(0,o.createTextVNode)("!]")],0)})]})})},f=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.mainTimeLeft,u=c.backupTimeLeft,d=c.wires,s=c.shockTimeLeft;return(0,o.createComponentVNode)(2,i.NoticeBox,{backgroundColor:"#601B1B",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{labelColor:"white",color:s?"average":"good",label:"Electrify",children:[s?"Electrified":"Safe"," ",(d.shock?s>0&&"["+s+"s]":"[Wires cut!]")||-1===s&&"[Permanent]"]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{color:s?"Bad":"Average",children:(0,o.createComponentVNode)(2,i.Box,{pl:s?18:0,pt:.5,children:[!s&&(0,o.createComponentVNode)(2,i.Button.Confirm,{width:9,p:.5,align:"center",color:"average",content:"Temporary",confirmContent:"Are you sure?",icon:"bolt",disabled:!d.shock||l&&u,onClick:function(){return a("shockTemp")}}),(0,o.createComponentVNode)(2,i.Button.Confirm,{width:9,p:.5,align:"center",color:s?"good":"bad",icon:"bolt",confirmContent:"Are you sure?",content:s?"Restore":"Permanent",disabled:!d.shock||l&&u,onClick:s?function(){return a("shockRestore")}:function(){return a("shockPerm")}})]})})]})})},h=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.aiHacking,u=c.hackingProgression;return(0,o.createComponentVNode)(2,i.Box,{fitted:!0,py:.5,pt:2,align:"center",children:[!l&&(0,o.createComponentVNode)(2,i.Button,{className:"Airlock-hack-button",fontSize:"29px",backgroundColor:"#00FF00",disabled:l,textColor:"black",textAlign:"center",width:16,onClick:function(){return a("hackAirlock")},children:"HACK"}),!!l&&(0,o.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[6,Infinity],average:[2,5],bad:[-Infinity,1]},minValue:0,maxValue:6,value:u})]})},C=function(e,t){var n=(0,r.useBackend)(t),a=n.act,c=n.data,l=c.signalers,u=c.wireColors,d=c.wireStates,s=c.netId,p=c.powerIsOn,m=c.boltsAreUp,f=c.canAiControl,h=c.aiControlVar,C=c.safety,g=c.panelOpen,N=c.accessCode,v=function(e,t){a(t,{wireColorIndex:e})},b=Object.keys(u);return(0,o.createComponentVNode)(2,i.Section,{title:"Access Panel",children:[!g&&(0,o.createComponentVNode)(2,i.Modal,{textAlign:"center",fontSize:"24px",children:"Access Panel is Closed"}),(0,o.createComponentVNode)(2,i.Box,{children:["An identifier is engraved under the airlock's card sensors:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:s})]}),(0,o.createComponentVNode)(2,i.Box,{children:["A display shows net access code:"," ",(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:N})]}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:b.map((function(e,t){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e+" wire",labelColor:e.toLowerCase(),children:d[t]?(0,o.createComponentVNode)(2,i.Button,{color:"green",height:1.8,onClick:function(){return v(t,"mend")},children:"Mend"}):(0,o.createComponentVNode)(2,i.Box,{height:1.8,children:[(0,o.createComponentVNode)(2,i.Button,{icon:"cut",onClick:function(){return v(t,"cut")},children:"Cut"}),(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",onClick:function(){return v(t,"pulse")},children:"Pulse"}),(0,o.createComponentVNode)(2,i.Button,{icon:"broadcast-tower",width:10.5,className:"AccessPanel-wires-btn",selected:l[t],onClick:function(){return v(t,"signaler")},children:l[t]?"Detach Signaler":"Attach Signaler"})]})},e)}))}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Door bolts",color:m?"green":"red",children:m?"Disengaged":"Engaged"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Test light",color:p?"green":"red",children:p?"Active":"Inactive"})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"AI control",color:f?2===h?"orange":"green":"red",children:f?"Enabled":"Disabled"}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Safety light",color:C?"green":"red",children:C?"Active":"Inactive"})]})})]})]})};t.AccessPanel=C},78403:function(e,t,n){"use strict";t.__esModule=!0,t.getAlertContentWindow=void 0;var o=n(43469);t.getAlertContentWindow=function(e){if("tgControls"===e)return o.tgControls}},43469:function(e,t,n){"use strict";t.__esModule=!0,t.tgControls=void 0;var o=n(96323),r=n(26949),a={width:470,height:320,title:"Use /tg/ style interface?",content:(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Box,{children:"Would you rather use a /tg/ style interface? If so, checkout the options in the drop-down menu at the top of the screen - 'Game'."}),(0,o.createComponentVNode)(2,r.Box,{my:1.5,children:"Save your profile in Character Setup to dismiss this alert."})],0)};t.tgControls=a},89037:function(){},458:function(e,t,n){"use strict";t.__esModule=!0,t.AlertModal=void 0;var o=n(96323),r=n(55631),a=n(31246),i=n(57890),c=n(26949),l=n(2381),u=n(78403);t.AlertModal=function(e,t){var n=(0,a.useBackend)(t),s=n.act,p=n.data,m=p.autofocus,f=p.items,h=void 0===f?[]:f,C=p.message,g=void 0===C?"":C,N=p.content_window,v=void 0===N?"":N,b=p.timeout,V=p.title,y=p.theme,x=(0,a.useLocalState)(t,"selected",0),k=x[0],S=x[1],I=v?(0,u.getAlertContentWindow)(v):null,w=I?I.height:115+(g.length>30?Math.ceil(g.length/4):0),_=I?I.width:325+(h.length>2?55:0),D=function(e){0===k&&-1===e?S(h.length-1):k===h.length-1&&1===e?S(0):S(k+e)};return(0,o.createComponentVNode)(2,l.Window,{height:w,title:I?I.title:V,width:_,theme:y||"nanotrasen",children:[!!b&&(0,o.createComponentVNode)(2,r.Loader,{value:b}),(0,o.createComponentVNode)(2,l.Window.Content,{onKeyDown:function(e){var t=window.event?e.which:e.keyCode;t===i.KEY_SPACE||t===i.KEY_ENTER?s("choose",{choice:h[k]}):t===i.KEY_ESCAPE?s("cancel"):t===i.KEY_LEFT?(e.preventDefault(),D(-1)):t!==i.KEY_TAB&&t!==i.KEY_RIGHT||(e.preventDefault(),D(1))},children:(0,o.createComponentVNode)(2,c.Section,{fill:!0,children:(0,o.createComponentVNode)(2,c.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,m:1,children:(0,o.createComponentVNode)(2,c.Box,{color:"label",overflow:"hidden",children:I?I.content:g})}),(0,o.createComponentVNode)(2,c.Stack.Item,{children:[!!m&&(0,o.createComponentVNode)(2,c.Autofocus),(0,o.createComponentVNode)(2,d,{selected:k})]})]})})})]})};var d=function(e,t){var n=(0,a.useBackend)(t).data.items,r=void 0===n?[]:n,i=e.selected;return(0,o.createComponentVNode)(2,c.Flex,{align:"center",direction:"row",fill:!0,justify:"space-around",wrap:!0,children:null==r?void 0:r.map((function(e,t){return(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,s,{button:e,id:t.toString(),selected:i===t})},t)}))})},s=function(e,t){var n=(0,a.useBackend)(t),r=n.act,i=(n.data,e.button),l=e.selected,u=i.length>7?i.length:7;return(0,o.createComponentVNode)(2,c.Button,{onClick:function(){return r("choose",{choice:i})},m:.5,pl:2,pr:2,pt:0,selected:l,textAlign:"center",width:u,children:i})}},9168:function(e,t,n){"use strict";t.__esModule=!0,t.AutomaticAnnouncement=void 0;var o=n(96323),r=n(31246),a=n(26949);t.AutomaticAnnouncement=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.arrivalalert;return(0,o.createComponentVNode)(2,a.Section,{title:"Arrival Announcement Message",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:"Valid tokens: $NAME, $JOB, $STATION, $THEY, $THEM, $THEIR. Leave the field empty for no message."}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Input,{fluid:!0,onChange:function(e,t){return i("arrival_message",{value:t})},placeholder:"Type something...",value:c})})]})})}},364:function(e,t,n){"use strict";t.__esModule=!0,t.AnnouncementComputer=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(9168),c=n(88364);t.AnnouncementComputer=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),u=l.announces_arrivals,d=l.theme;return(0,o.createComponentVNode)(2,a.Window,{theme:d,width:400,height:u?326:215,children:(0,o.createComponentVNode)(2,a.Window.Content,{textAlign:"center",children:[(0,o.createComponentVNode)(2,c.ManualAnnouncement),!!u&&(0,o.createComponentVNode)(2,i.AutomaticAnnouncement)]})})}},88364:function(e,t,n){"use strict";t.__esModule=!0,t.ManualAnnouncement=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033);t.ManualAnnouncement=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.card_name,s=u.status_message,p=u.time,m=u.max_length,f=(0,r.useSharedState)(t,"input",""),h=f[0],C=f[1],g=(0,r.useSharedState)(t,"oldInput",""),N=g[0],v=g[1],b=c(h,m,s,p);return(0,o.createComponentVNode)(2,a.Section,{title:"Make an Announcement",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{color:b.color,children:["Status: ",b.text]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("id")},icon:"eject",preserveWhitespace:!0,children:d||"Insert card"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p,format:i.formatTime})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,fluid:!0,onInput:function(e){return function(e){e.preventDefault();var t=e.target;C(t.value),b=c(h,m,s,p)}(e)},onChange:function(){h!==N&&(l("log",{value:h,old:N}),v(h))},placeholder:"Type something...",value:h})}),(0,o.createComponentVNode)(2,a.Stack.Item,{label:"Button",fontSize:"16px",children:(0,o.createComponentVNode)(2,a.Button,{icon:"bullhorn",content:"Transmit",fluid:!0,disabled:!b.canTransmit,onClick:function(){return l("transmit",{value:h}),C(""),void v("")}})})]})})};var c=function(e,t,n,o){return o>0?{canTransmit:!1,text:"Broadcast delay in effect.",color:"bad"}:"Insert Card"===n?{canTransmit:!1,text:"Insert Card",color:"average"}:n?{canTransmit:!1,text:n,color:"bad"}:t&&e.length>t?{canTransmit:!1,text:"Message too long, maximium is "+t+" characters.",color:"average"}:e?{canTransmit:!0,text:"Ready to transmit!",color:"good"}:{canTransmit:!1,text:"Input message.",color:"average"}}},76295:function(){},20920:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistTypeTabBody=void 0;var o=n(96323),r=n(31246),a=n(21118),i=n(26949);t.AntagonistTypeTabBody=function(e){return(0,o.createComponentVNode)(2,i.Box,{children:e.currentTabSections?e.currentTabSections.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e),t))})):(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e)))})};var c=function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{mb:-2.5,italic:!0,children:"The Game Mode Is:"}),(0,o.createComponentVNode)(2,i.Stack.Item,{fontSize:2.75,bold:!0,children:(0,a.toTitleCase)(e.gameMode)})]})}),(0,o.createComponentVNode)(2,i.Stack,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Antagonist Mortality Rate",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:e.mortalityRates.antagonistsAlive+e.mortalityRates.antagonistsDead||1,value:e.mortalityRates.antagonistsDead,color:"red",backgroundColor:"green",mb:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alive Antagonists",children:e.mortalityRates.antagonistsAlive}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Dead Antagonists",children:e.mortalityRates.antagonistsDead})]})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Crew Mortality Rate",children:[(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:e.mortalityRates.crewAlive+e.mortalityRates.crewDead||1,value:e.mortalityRates.crewDead,color:"red",backgroundColor:"green",mb:1}),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Alive Crew",children:e.mortalityRates.crewAlive}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Dead Crew",children:e.mortalityRates.crewDead})]})]})})]})],4)},l=function(e){var t=V(e.sectionType);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,t,Object.assign({},e)))},u=function(){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]})]})},d=function(e,t){var n,a=(0,r.useBackend)(t),c=a.act,l=a.data,u=(null==(n=l.subordinateAntagonists[e.antagonist_datum])?void 0:n.sort((function(e,t){return e.real_name.localeCompare(t.real_name)})))||[];return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e)))]}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[!!e.has_subordinate_antagonists&&(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",my:-.5,mr:.8,icon:l.subordinateAntagonists[e.antagonist_datum]?"chevron-down":"chevron-right",onClick:function(){return c(l.subordinateAntagonists[e.antagonist_datum]?"unrequest_subordinate_antagonist_data":"request_subordinate_antagonist_data",{antagonist_datum:e.antagonist_datum})},tooltip:"Subordinate Antagonists"}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({mind_ref:e.mind_ref},l.mindLocations[e.mind_ref]))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e)))]}),u.map((function(e,t){return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",pl:1.6,children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e)))]}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,i.Icon,{name:"caret-right",mr:1.6}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e)))]},t)}))],0)},s=function(e){e.display_name;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Antagonist Role",children:(0,a.toTitleCase)(e.display_name)})},p=function(e){e.ckey;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Client",children:e.ckey?e.ckey:(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"No Client"})})},m=function(e){e.job;return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Job",children:e.job?e.job:(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"N/A"})})},f=function(e){e.real_name,e.ckey,e.dead;return(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[!!e.dead&&(0,o.createComponentVNode)(2,i.Icon,{name:"skull"})," ",e.real_name+" ",!e.ckey&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:"(no client)"})]})},h=function(e,t){var n=(0,r.useBackend)(t).act,a=(e.mind_ref,e.area),c=e.coordinates;return(0,o.createComponentVNode)(2,i.Table.Cell,{children:[a,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c,onClick:function(){return n("jump_to",{target:e.mind_ref})},tooltip:"Jump To Position"})]})},C=function(e){return(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e)))]})},g=function(e,t){var n=(0,r.useBackend)(t).act;e.mind_ref;return(0,o.createComponentVNode)(2,i.Button,{content:"PM",onClick:function(){return n("admin_pm",{mind_ref:e.mind_ref})},tooltip:"Admin PM",mr:1})},N=function(e,t){var n=(0,r.useBackend)(t).act;e.mind_ref;return(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",icon:"user-gear",onClick:function(){return n("player_options",{mind_ref:e.mind_ref})},tooltip:"Player Options",mr:1})},v=function(e,t){var n=(0,r.useBackend)(t).act;e.antagonist_datum;return(0,o.createComponentVNode)(2,i.Button,{width:2,textAlign:"center",icon:"gear",onClick:function(){return n("view_variables",{antagonist_datum:e.antagonist_datum})},tooltip:"Antagonist Datum Vars"})},b=function(e,t){var n=(0,r.useBackend)(t),c=n.data;n.act;return(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{py:"0.5em",children:(0,a.toTitleCase)(e.role)}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:(0,o.createComponentVNode)(2,i.Tooltip,{content:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e)))}),children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[" ",(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))," "]})})}),(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({mind_ref:e.mind_ref},c.mindLocations[e.mind_ref]))),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e))),(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e)))]})]})},V=function(e){if(e!==undefined)return e in y?y[e]:void 0},y={AntagonistList:function(e){var t=e.sectionData;if(t.length){var n=t.sort((function(e,t){return e.real_name.localeCompare(t.real_name)}))||[];return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Table,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",e.sectionName?e.sectionName:"Name"," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Location "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Commands "})]}),(0,o.createComponentVNode)(2,u),null==n?void 0:n.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e),t))}))]})})}},NuclearBombReadout:function(e,t){if(e.sectionData){var n=(0,r.useBackend)(t).act,c=e.sectionData;return(0,o.createComponentVNode)(2,i.Section,{title:(0,a.toTitleCase)(e.sectionName),children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",textColor:"red",fontFamily:"Consolas",fontSize:5,m:.5,mr:2,children:c.timeRemaining})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:c.maxHealth,value:c.health,color:"green",backgroundColor:"red",mb:1})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",verticalAlign:"middle",children:[c.area,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c.coordinates,onClick:function(){return n("jump_to",{target:c.nuclearBomb})},tooltip:"Jump To Position"})]})]})})]})})}},HeadsList:function(e){var t=e.sectionData;if(t.length){var n=["Captain","Head of Personnel","Head of Security","Chief Engineer","Research Director","Medical Director"],r=t.sort((function(e,t){return n.indexOf(e.role)-n.indexOf(t.role)}))||[];return(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Table,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Role "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Name "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Location "}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:" Commands "})]}),(0,o.createComponentVNode)(2,i.Table.Row,{children:[(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]}),(0,o.createComponentVNode)(2,i.Table.Cell,{children:[" ",(0,o.createComponentVNode)(2,i.Divider)," "]})]}),null==r?void 0:r.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},e),t))}))]})})}},GangReadout:function(e){var t=e.sectionData;if(t.length)return(0,o.createComponentVNode)(2,i.Section,{title:e.sectionName,children:t.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e),t))}))})},GangLockerReadout:function(e,t){if(e.sectionData){var n=(0,r.useBackend)(t).act,c=e.sectionData;return(0,o.createComponentVNode)(2,i.Section,{children:[(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:(0,a.toTitleCase)(e.sectionName)}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Health",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i.ProgressBar,{minValue:0,maxValue:c.maxHealth,value:c.health,color:"green",backgroundColor:"red",mb:1})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Location",verticalAlign:"middle",children:[c.area,(0,o.createComponentVNode)(2,i.Button,{color:"transparent",content:c.coordinates,onClick:function(){return n("jump_to",{target:c.gangLocker})},tooltip:"Jump To Position"})]})]})]})}}}},56444:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistTypeTabs=void 0;var o=n(96323),r=n(31246),a=n(21118),i=n(26949);t.AntagonistTypeTabs=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=(0,r.useLocalState)(t,"tabIndex",c.tabToOpenOn),d=u[0],s=u[1],p=c.tabs.sort((function(e,t){return e.tabName.localeCompare(t.tabName)}))||[],m=function(e){s(e),l("set_tab",{index:e})};return(0,o.createComponentVNode)(2,i.Section,{inline:!0,fill:!0,children:(0,o.createComponentVNode)(2,i.Tabs,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:null===d,onClick:function(){return m(null)},width:12,my:.2,children:"General"}),(0,o.createComponentVNode)(2,i.Box,{my:-.5,children:(0,o.createComponentVNode)(2,i.Divider)}),p.map((function(e,t){return(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:d===e.index,onClick:function(){return m(e.index)},width:12,my:.2,children:(0,a.toTitleCase)(e.tabName)},t)}))]})})}},20636:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistPanel=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(56444),l=n(20920);t.AntagonistPanel=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Window,{title:"Antagonist Panel",width:750,height:500,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.AntagonistTypeTabs,Object.assign({},n)))}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.AntagonistTypeTabBody,Object.assign({},n)))})]})})})}},5562:function(){},20065:function(e,t,n){"use strict";t.__esModule=!0,t.AccessPanelSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(63687);t.AccessPanelSection=function(e,t){var n=(0,r.useBackend)(t).data,c=n.net_id,l=n.locked,u=n.shorted,d=n.aidisabled;return(0,o.createComponentVNode)(2,a.Section,{title:"Access Panel",children:[(0,o.createComponentVNode)(2,a.Box,{children:["An identifier is engraved above the APC's wires:"," ",(0,o.createComponentVNode)(2,a.Box,{inline:!0,italic:!0,children:c})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,i.WireList),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Controls",color:l?"green":"red",children:l?"Locked":"Unlocked"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Circuitry",color:u?"red":"green",children:u?"Shorted":"Working"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"AI Control",color:d?"red":"green",children:d?"Disabled":"Enabled"})]})]})}},65005:function(e,t,n){"use strict";t.__esModule=!0,t.CellDisplay=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(94104);t.CellDisplay=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.cell_percent,d=l.cell_present,s=l.chargecount,p=l.chargemode,m=l.charging,f=(0,i.getHasPermission)(l),h=function(e,t){switch(e){case 0:return t?"Performing self-test":"Not charging";case 1:return"Charging";default:return"Fully Charged"}}(m,s),C=function(e){return function(){return c("onChargeModeChange",{chargemode:e})}};return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charging",textAlign:"right",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:C(0),disabled:!f&&0!==p,selected:0===p,children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{onClick:C(1),disabled:!f&&1!==p,selected:1===p,children:"Auto"})],4),children:["(",d?h:"Not Connected",")"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cell Power",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:u,minValue:0,maxValue:100,color:u<20?"red":u<50?"yellow":"green"})})],4)}},54187:function(e,t,n){"use strict";t.__esModule=!0,t.MainSection=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(65005),u=n(94104);!function(e){e[e.None=0]="None",e[e.Low=1]="Low",e[e.Good=2]="Good"}(r||(r={}));var d=((o={})[r.None]={name:"None",color:"red"},o[r.Low]={name:"Low",color:"yellow"},o[r.Good]={name:"Good",color:"green"},o),s=function(e){var t=e.mainStatus,n=d[t];return(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"External Power",color:n.color,textAlign:"right",children:n.name})};t.MainSection=function(e,t){var n=(0,i.useBackend)(t),o=n.act,r=n.data,d=r.area_name,p=r.host_id,m=r.locked,f=r.main_status,h=r.operating,C=(0,u.getHasPermission)(r),g=(0,u.getIsLocalAccess)(r),N=function(e){return o("onOperatingChange",{operating:e})};return(0,a.createComponentVNode)(2,c.Section,{title:d,children:[g&&(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Box,{align:"center",bold:!0,fill:!0,children:["Swipe ID card to ",m?"unlock":"lock"," interface"]}),(0,a.createComponentVNode)(2,c.Divider)],4),(0,a.createComponentVNode)(2,c.LabeledList,{children:[(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Main Breaker",buttons:(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Button,{disabled:!C&&h,onClick:function(){return N(!1)},selected:!h,children:"Off"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!C&&!h,onClick:function(){return N(!0)},selected:h,children:"On"})],4)}),(0,a.createComponentVNode)(2,l.CellDisplay),(0,a.createComponentVNode)(2,s,{mainStatus:f}),g&&(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Host Connection",color:p?"green":"red",textAlign:"right",children:p?"OK":"NONE"})]})]})}},42947:function(e,t,n){"use strict";t.__esModule=!0,t.PowerChannelSection=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(94104);!function(e){e[e.Equipment=1]="Equipment",e[e.Lighting=2]="Lighting",e[e.Environmental=3]="Environmental"}(o||(o={})),function(e){e[e.Off=0]="Off",e[e.AutoOff=1]="AutoOff",e[e.On=2]="On",e[e.AutoOn=3]="AutoOn"}(r||(r={}));var u=[r.AutoOff,r.AutoOn],d=[{id:o.Equipment,label:"Equipment",getPower:function(e){return e.lastused_equip},getStatus:function(e){return e.equipment},statusChangeAction:"onPowerChannelEquipmentStatusChange"},{id:o.Lighting,label:"Lighting",getPower:function(e){return e.lastused_light},getStatus:function(e){return e.lighting},statusChangeAction:"onPowerChannelLightingStatusChange"},{id:o.Environmental,label:"Environmental",getPower:function(e){return e.lastused_environ},getStatus:function(e){return e.environ},statusChangeAction:"onPowerChannelEnvironStatusChange"}].reduce((function(e,t){var n;return Object.assign({},e,((n={})[t.id]=t,n))}),{}),s=function(e,t){var n,o,s=e.powerChannel,p=(0,i.useBackend)(t),m=p.act,f=p.data,h=(0,l.getHasPermission)(f),C=d[s],g=null!=(n=C.label)?n:"Unknown",N=C.getStatus(f),v=(o=N,u.includes(o)),b=C.getPower(f),V=C.statusChangeAction,y=function(e){V&&m(V,{status:e})};return(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:g,textAlign:"right",buttons:(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&N!==r.Off,onClick:function(){return y(r.Off)},selected:N===r.Off,children:"Off"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&N!==r.On,onClick:function(){return y(r.On)},selected:N===r.On,children:"On"}),(0,a.createComponentVNode)(2,c.Button,{disabled:!h&&!v,onClick:function(){return y(r.AutoOn)},selected:v,children:"Auto"})],4),children:(0,l.formatWatts)(b)})};t.PowerChannelSection=function(e,t){var n=(0,i.useBackend)(t).data.lastused_total;return(0,a.createComponentVNode)(2,c.Section,{title:"Power Channel",children:(0,a.createComponentVNode)(2,c.LabeledList,{children:[(0,a.createComponentVNode)(2,s,{powerChannel:o.Equipment}),(0,a.createComponentVNode)(2,s,{powerChannel:o.Lighting}),(0,a.createComponentVNode)(2,s,{powerChannel:o.Environmental}),(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Load",textAlign:"right",buttons:!0,children:(0,l.formatWatts)(n)})]})})}},63687:function(e,t,n){"use strict";t.__esModule=!0,t.WireListItem=t.WireList=void 0;var o,r=n(96323),a=n(31246),i=n(26949);!function(e){e[e.Orange=1]="Orange",e[e.DarkRed=2]="DarkRed",e[e.White=3]="White",e[e.Yellow=4]="Yellow"}(o||(o={}));var c=[{id:o.Orange,name:"Orange",color:"orange",getIsCut:function(e){return!!e.orange_cut}},{id:o.DarkRed,name:"Dark red",color:"darkred",getIsCut:function(e){return!!e.dark_red_cut}},{id:o.White,name:"White",color:"white",getIsCut:function(e){return!!e.white_cut}},{id:o.Yellow,name:"Yellow",color:"yellow",getIsCut:function(e){return!!e.yellow_cut}}];t.WireList=function(e,t){var n=(0,a.useBackend)(t),o=n.act,u=n.data;return(0,r.createComponentVNode)(2,i.LabeledList,{children:c.map((function(e){var t=e.color,n=e.getIsCut,a=e.id,i=e.name;return(0,r.createComponentVNode)(2,l,{color:t,isCut:n(u),name:i,onBite:function(){return o("onBiteWire",{wire:a})},onCut:function(){return o("onCutWire",{wire:a})},onMend:function(){return o("onMendWire",{wire:a})},onPulse:function(){return o("onPulseWire",{wire:a})}},a)}))})};var l=function(e){var t=e.color,n=e.isCut,o=e.name,a=e.onBite,c=e.onCut,l=e.onMend,u=e.onPulse,d=n?(0,r.createComponentVNode)(2,i.Button,{content:"Mend",onClick:l,selected:!0}):(0,r.createFragment)([(0,r.createComponentVNode)(2,i.Button,{icon:"cut",onClick:c,children:"Cut"}),(0,r.createComponentVNode)(2,i.Button,{icon:"bolt",onClick:u,children:"Pulse"}),(0,r.createComponentVNode)(2,i.Button,{icon:"tooth",onClick:a,children:"Bite"})],4);return(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:o+" wire",labelColor:t,buttons:d})};t.WireListItem=l},91690:function(e,t,n){"use strict";t.__esModule=!0,t.Apc=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(20065),l=n(54187),u=n(42947),d=n(94104),s=function(e){var t=e.coverlocked,n=e.hasPermission,r=e.onCoverLockedChange;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{disabled:!n&&!!t,onClick:function(){return r(!1)},selected:!t,children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{disabled:!n&&!t,onClick:function(){return r(!0)},selected:!!t,children:"On"})],4)};t.Apc=function(e,t){return(0,r.useBackend)(t).data.area_requires_power?(0,o.createComponentVNode)(2,p):(0,o.createComponentVNode)(2,m)};var p=function(e,t){var n=(0,r.useBackend)(t),p=n.act,m=n.data,f=m.area_requires_power,h=m.can_access_remotely,C=m.coverlocked,g=(0,d.getIsLocalAccess)(m),N=(0,d.getHasPermission)(m),v=!!h,b=(0,d.getIsAccessPanelVisible)(m),V=(0,d.calculateWindowHeight)(f,!0,!0,v,b,g);return(0,o.createComponentVNode)(2,i.Window,{title:"Area Power Controller",width:360,height:V,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,l.MainSection),(0,o.createComponentVNode)(2,u.PowerChannelSection),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cover Lock",buttons:(0,o.createComponentVNode)(2,s,{coverlocked:C,hasPermission:N,onCoverLockedChange:function(e){return p("onCoverLockedChange",{coverlocked:e})}})})})}),v&&(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Button,{align:"center",color:"red",fluid:!0,icon:"bolt",onClick:function(){return p("onOverload")},children:"Overload Lighting Circuit"})}),b&&(0,o.createComponentVNode)(2,c.AccessPanelSection)]})})},m=function(e,t){var n=(0,r.useBackend)(t).data,l=n.area_name,u=n.area_requires_power,s=(0,d.getIsAccessPanelVisible)(n),p=(0,d.calculateWindowHeight)(u,!1,!1,!1,s,!1);return(0,o.createComponentVNode)(2,i.Window,{title:"Area Power Controller",width:360,height:p,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Area Power Controller ("+l+")",children:(0,o.createComponentVNode)(2,a.Box,{children:"This APC has no configurable settings."})}),s&&(0,o.createComponentVNode)(2,c.AccessPanelSection)]})})}},73020:function(e,t){"use strict";var n;t.__esModule=!0,t.InterfaceType=void 0,t.InterfaceType=n,function(e){e[e.LocalOnly=0]="LocalOnly",e[e.LocalAndNetwork=1]="LocalAndNetwork",e[e.NetworkOnly=2]="NetworkOnly"}(n||(t.InterfaceType=n={}))},94104:function(e,t,n){"use strict";t.__esModule=!0,t.calculateWindowHeight=t.getIsLocalAccess=t.getIsAccessPanelVisible=t.getHasPermission=t.formatWatts=void 0;var o=n(73020);t.formatWatts=function(e){return(isNaN(e)?0:Math.floor(e))+" W"};t.getHasPermission=function(e){var t=e.is_ai,n=e.is_silicon,o=e.can_access_remotely,r=e.aidisabled,a=e.locked;return t||n||o?!r:!a};t.getIsAccessPanelVisible=function(e){var t=e.is_ai;return!!e.wiresexposed&&!t};var r=[o.InterfaceType.LocalOnly,o.InterfaceType.LocalAndNetwork];t.getIsLocalAccess=function(e){var t=e.can_access_remotely,n=e.setup_networkapc;return r.includes(n)&&!t};t.calculateWindowHeight=function(e,t,n,o,r,a){var i=function(e,t){return 6+(e?t?181:132:62)}(e,a);return 32+i+(n?136:0)+(t?42:0)+(o?42:0)+(r?254:0)+12}},52403:function(e,t,n){"use strict";t.__esModule=!0,t.ArtifactPaper=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ArtifactPaper=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.artifactName,d=l.artifactOrigin,s=l.artifactType,p=l.artifactTriggers,m=l.artifactFaults,f=l.artifactDetails,h=l.allArtifactOrigins,C=l.allArtifactTypes,g=l.allArtifactTriggers,N=l.hasPen;return(0,o.createComponentVNode)(2,i.Window,{title:"Nanotrasen Alien Artifact Analysis Form",theme:"paper",width:800,height:835,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createVNode)(1,"h3",null,"Artifact Name",16),(0,o.createVNode)(1,"h4",null,""===u?"unknown":u,0),(0,o.createVNode)(1,"h3",null,"Artifact Origin",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:3,children:h.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{onClick:function(t,n){return c("origin",{newOrigin:e,hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:d===e}),(0,o.createVNode)(1,"a",null,e,0)]},e.id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Type",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:25,justify:"space-evenly",children:C.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"artifactType"+e[1],onClick:function(t,n){return c("type",{newType:e[0],hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s===e[0]}),(0,o.createVNode)(1,"a",null,e[0],0)]},e[0].id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Triggers (If Applicable)",16),(0,o.createComponentVNode)(2,a.Flex,{direction:"column",wrap:"wrap",height:5,children:g.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{onClick:function(t,n){return c("trigger",{newTriggers:e,hasPen:N})},children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:p===e}),(0,o.createVNode)(1,"a",null,e,0)]},e.id)}))}),(0,o.createVNode)(1,"h3",null,"Artifact Faults",16),(0,o.createComponentVNode)(2,a.TextArea,{value:m,fluid:!0,height:5,onChange:function(e,t){return c("fault",{newFaults:t,hasPen:N})}}),(0,o.createVNode)(1,"h3",null,"Additional Information",16),(0,o.createComponentVNode)(2,a.TextArea,{value:f,fluid:!0,height:10,onChange:function(e,t){return c("detail",{newDetail:t,hasPen:N})}})]})})})}},7171:function(e,t,n){"use strict";t.__esModule=!0,t.Atm=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(3382),l=["type"];var u=2,d="danger",s="info",p="success",m=function(e){var t=e.type,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,l),r=Object.assign({},t===d?{danger:!0}:{},t===s?{info:!0}:{},t===p?{success:!0}:{});return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.NoticeBox,Object.assign({},r,n)))]})};t.Atm=function(e,t){var n=(0,r.useBackend)(t).data.name,l=(0,r.useLocalState)(t,"tabIndex",c.AtmTabKeys.Teller),u=l[0],d=l[1];return(0,o.createComponentVNode)(2,i.Window,{title:n,width:375,height:420,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{fluid:!0,children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"money-bills",selected:u===c.AtmTabKeys.Teller,onClick:function(){return d(c.AtmTabKeys.Teller)},children:"ATM"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"coins",selected:u===c.AtmTabKeys.Spacebux,onClick:function(){return d(c.AtmTabKeys.Spacebux)},children:"Spacebux"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[u===c.AtmTabKeys.Teller&&(0,o.createComponentVNode)(2,f),u===c.AtmTabKeys.Spacebux&&(0,o.createComponentVNode)(2,h)]})]})})})};var f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.accountBalance,d=c.accountName,s=c.loggedIn,p=c.scannedCard,f=c.message||{text:"",status:"",position:""};return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Automatic Teller Machine",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!p&&(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"Please swipe card and enter PIN to access your account."}),(0,o.createComponentVNode)(2,a.Button,{icon:"id-card",content:p||"Swipe ID",onClick:p?function(){return i("logout")}:function(){return i("insert_card")}}),f.text&&"splash"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]}),s===u?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Welcome, ",(0,o.createVNode)(1,"strong",null,[d,(0,o.createTextVNode)(".")],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Your account balance is ",(0,o.createVNode)(1,"strong",null,[l,(0,o.createTextVNode)("\u2abd.")],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"money-bill",content:"Withdraw cash",onClick:function(){return i("withdraw_cash")}}),f.text&&"atm"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})]})})],4):p&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",content:"Enter PIN",onClick:function(){return i("login_attempt")}}),f.text&&"login"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:s===u&&(0,o.createComponentVNode)(2,a.Section,{title:"Lottery",children:[(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"To claim your winnings, you must insert your lottery ticket."}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"ticket-alt",content:"Purchase Lottery Ticket (100\u2abd)",onClick:function(){return i("buy")}}),f.text&&"lottery"===f.position&&(0,o.createComponentVNode)(2,m,{type:f.status,children:f.text})]})})]})},h=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.clientKey,u=c.spacebuxBalance;return(0,o.createComponentVNode)(2,a.Section,{title:l+"'s Spacebux Menu",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:"This menu is only visible to you. Deposit Spacebux into your account by inserting a token."}),(0,o.createComponentVNode)(2,a.Divider)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Your Spacebux balance is currently"," ",(0,o.createVNode)(1,"strong",null,[u,(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Icon,{name:"fa-solid fa-coins"})],0)]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Button,{icon:"coins",content:"Withdraw Spacebux",onClick:function(){return i("withdraw_spacebux")}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",content:"Securely send Spacebux",onClick:function(){return i("transfer_spacebux")}})})]})})}},3382:function(e,t){"use strict";var n;t.__esModule=!0,t.AtmTabKeys=void 0,t.AtmTabKeys=n,function(e){e[e.Teller=0]="Teller",e[e.Spacebux=1]="Spacebux"}(n||(t.AtmTabKeys=n={}))},46837:function(e,t,n){"use strict";t.__esModule=!0,t.AutoInjector=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.AutoInjector=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.injectionAmount,s=u.reagentData,p=u.minimumTime,m=u.condition,f=u.conditionTreshold,h=u.conditionDamage,C=u.conditions;return(0,o.createComponentVNode)(2,i.Window,{width:360,height:520,theme:"neutral",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Contents",buttons:(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!s,onClick:function(){return l("remove_cont")},children:"Eject"}),children:s?(0,o.createFragment)([(0,o.createComponentVNode)(2,c.ReagentGraph,{container:s}),(0,o.createComponentVNode)(2,c.ReagentList,{container:s})],4):"Please attach a beaker"}),(0,o.createComponentVNode)(2,a.Section,{title:"Condition",children:[(0,o.createComponentVNode)(2,a.Dropdown,{options:C,selected:m?m.name:"None",onSelected:function(e){return l("sel_cond",{condition:e})},noscroll:!0,width:"130px"}),f?(0,o.createFragment)([h?(0,o.createComponentVNode)(2,a.Dropdown,{options:["brute","burn","toxin","oxygen"],selected:h.damagetype,onSelected:function(e){return l("sel_damage_type",{damagetype:e})},noscroll:!0,width:"75px",mt:"0.5rem"}):null,(0,o.createComponentVNode)(2,a.Slider,{value:f.currentValue,format:function(e){return e+f.suffix},minValue:f.minValue,maxValue:f.maxValue,step:1,onChange:function(e,t){return l("changeConditionValue",{conditionValue:t})},mt:"0.5rem"})],0):null,m?(0,o.createComponentVNode)(2,a.Box,{mt:"0.5rem",children:m.desc}):null]}),s?(0,o.createComponentVNode)(2,a.Section,{title:"Injection Amount",children:(0,o.createComponentVNode)(2,a.Slider,{value:d,format:function(e){return e+"u"},minValue:1,maxValue:s.maxVolume,step:1,onChange:function(e,t){return l("changeAmount",{amount:t})}})}):null,(0,o.createComponentVNode)(2,a.Section,{title:"Min. time between activations",children:(0,o.createComponentVNode)(2,a.Slider,{value:p,format:function(e){return e+" seconds"},minValue:3,maxValue:300,step:1,onChange:function(e,t){return l("changeMintime",{mintime:t})}})})]})})}},95620:function(e,t,n){"use strict";t.__esModule=!0,t.BanList=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(42151),c=n(34747),l=n(92600),u=n(67179),d=n(99526),s=Object.keys(l.BanPanelSearchFilter),p=function(e){return""+e.id};t.BanList=function(e,t){var n=e.data,m=n.ban_list,f=n.per_page,h=(0,c.useBanPanelBackend)(t).action,C=(null!=m?m:{}).search_response,g=(null!=C?C:{}).data,N=(0,r.useLocalState)(t,"searchText",""),v=N[0],b=N[1],V=(0,r.useLocalState)(t,"searchFilter",l.BanPanelSearchFilter.ckey),y=V[0],x=V[1],k=h.navigatePreviousPage,S=h.navigateNextPage,I=(0,d.buildColumnConfigs)({editBan:function(e){return h.editBan(e)},deleteBan:function(e){return h.deleteBan(e)}});return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Flex,{pt:1,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{direction:"column",mx:1,wrap:"wrap",children:[(0,o.createComponentVNode)(2,a.Input,{value:v,onInput:function(e,t){return b(t)},mr:1}),(0,o.createComponentVNode)(2,a.Button,{icon:"magnifying-glass",onClick:function(){return h.searchBans(v,l.BanPanelSearchFilter[y])},children:"Search"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Dropdown,{width:11,icon:"filter",nochevron:!0,selected:y,options:s,onSelected:function(e){x(e)}})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{children:I.map((function(e){return(0,o.createComponentVNode)(2,i.HeaderCell,{config:e},e.id)}))})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,zebra:!0,mb:1,children:(null!=g?g:[]).map((function(e){return(0,o.createComponentVNode)(2,u.BanListItem,{columnConfigs:I,data:e,rowId:p(e)},e.id)}))})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{onClick:k,children:"Prev"}),(0,o.createComponentVNode)(2,a.Button,{onClick:S,children:"Next"}),(0,o.createComponentVNode)(2,a.NumberInput,{minValue:5,maxValue:100,value:null!=f?f:30,placeholder:30,onChange:function(e,t){return h.setPerPage(t)}})]})})],4)}},67179:function(e,t,n){"use strict";t.__esModule=!0,t.BanListItem=void 0;var o=n(96323),r=n(26949),a=n(42151);t.BanListItem=function(e){var t=e.columnConfigs,n=e.data,i=e.rowId;return(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Stack,{children:t.map((function(e){return(0,o.createComponentVNode)(2,a.Cell,{columnConfig:e,data:n,rowId:i},e.id)}))})})}},99526:function(e,t,n){"use strict";t.__esModule=!0,t.buildColumnConfigs=void 0;var o=n(96323),r=n(26949),a=l(n(77249)),i=l(n(50282)),c=l(n(78978));function l(e){return e&&e.__esModule?e:{"default":e}}a["default"].extend(i["default"]),a["default"].extend(c["default"]);t.buildColumnConfigs=function(e){return[{header:"",id:"actions",renderContents:function(t){var n=t.rowId;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Button,{icon:"pencil",onClick:function(){return e.editBan(n)}},"edit"),(0,o.createComponentVNode)(2,r.Button,{icon:"trash",onClick:function(){return e.deleteBan(n)},color:"red"},"delete")],8)},basis:4.5},{header:"ID",id:"id",getValue:function(e){return e.id},renderContents:function(e){var t=e.value;return(0,o.createVNode)(1,"a",null,t,0,{href:"https://staging.goonhub.com/admin/bans/"+t})},basis:4},{header:"ckey",id:"ckey",getValue:function(e){var t;return null!=(t=e.original_ban_detail.ckey)?t:"N/A"},renderContents:function(e){var t=e.value;return(0,o.createVNode)(1,"a",null,t,0,{href:"https://staging.goonhub.com/admin/players/"+t})},basis:10,grow:1},{header:"Duration",id:"duration",getValue:function(e){if(null===e.expires_at)return e.requires_appeal?"Until Appeal":"Permanent";var t=(0,a["default"])(e.created_at),n=(0,a["default"])(e.expires_at);return a["default"].duration(t.diff(n)).humanize()},getValueTooltip:function(e){var t=(0,a["default"])(e.created_at),n=[(0,o.createFragment)(t.format("[Banned ] YYYY-MM-DD HH:mm [UTC]\n"),0)];if(null===e.expires_at)n.push((0,o.createVNode)(1,"strong",null,"Permanent",16));else{var r=(0,a["default"])(e.expires_at);n.push((0,o.createFragment)(r.format("[Expires] YYYY-MM-DD HH:mm [UTC]"),0))}return null!==e.deleted_at&&n.push((0,o.createFragment)((0,a["default"])(e.deleted_at).format("\n[Deleted] YYYY-MM-DD HH:mm [UTC]"),0)),(0,o.createVNode)(1,"pre",null,n,0)},renderContents:function(e){return null!==e.data.deleted_at?(0,o.createVNode)(1,"div","ExpiredBan BanText",e.value,0):(0,o.createVNode)(1,"div","CurrentBan BanText",e.value,0)},basis:7.5},{header:"Server",id:"server",getValue:function(e){var t;return null!=(t=e.server_id)?t:"All"},basis:4},{header:"Admin",id:"admin",getValue:function(e){var t;return null!=(t=e.game_admin)?t:"N/A"},renderContents:function(e){var t=e.value;return(0,o.createVNode)(1,"a","NoColor",t.name,0,{href:"https://staging.goonhub.com/admin/game-admins/"+t.id})},getValueTooltip:function(e){return null===e.game_admin?"N/A":e.game_admin.ckey+" ("+e.game_admin_id+")"},basis:6.5},{header:"Reason",id:"reason",getValue:function(e){return e.reason},basis:10,grow:10},{header:"CID",id:"cid",getValue:function(e){var t;return null!=(t=e.original_ban_detail.comp_id)?t:"N/A"},basis:7},{header:"IP",id:"ip",getValue:function(e){var t;return null!=(t=e.original_ban_detail.ip)?t:"N/A"},basis:9}]}},62983:function(e,t,n){"use strict";t.__esModule=!0,t.JobBanList=void 0;var o=n(96323),r=n(26949);t.JobBanList=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:"Not yet implemented"})}},49641:function(){},13401:function(e,t,n){"use strict";t.__esModule=!0,t.BanPanel=void 0;var o=n(96323),r=n(26949),a=n(2381),i=n(95620),c=n(62983),l=n(92600),u=n(34747);t.BanPanel=function(e,t){var n=(0,u.useBanPanelBackend)(t),d=n.action,s=n.data,p=s.current_tab;return(0,o.createComponentVNode)(2,a.Window,{width:1100,height:640,title:"Ban Panel",className:"BanPanel",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Tabs,{children:[(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:function(){return d.setTab(l.BanPanelTab.BanList)},selected:p===l.BanPanelTab.BanList,children:"Ban List"}),(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:function(){return d.setTab(l.BanPanelTab.JobBanList)},selected:p===l.BanPanelTab.JobBanList,children:"Job Ban List"})]})}),p===l.BanPanelTab.BanList&&(0,o.createComponentVNode)(2,i.BanList,{data:s}),p===l.BanPanelTab.JobBanList&&(0,o.createComponentVNode)(2,c.JobBanList)]})})})}},92600:function(e,t){"use strict";var n,o,r;t.__esModule=!0,t.BanPanelSearchFilter=t.BanPanelAction=t.BanPanelTab=void 0,t.BanPanelTab=n,function(e){e.BanList="ban_list",e.JobBanList="job_ban_list"}(n||(t.BanPanelTab=n={})),t.BanPanelAction=o,function(e){e.SearchBans="ban_search",e.NavigatePreviousPage="page_prev",e.NavigateNextPage="page_next",e.SetPerPage="set_perpage",e.SetTab="set_tab",e.EditBan="edit_ban",e.DeleteBan="delete_ban"}(o||(t.BanPanelAction=o={})),t.BanPanelSearchFilter=r,function(e){e.ID="id",e.ckey="ckey",e.og_ckey="original_ban_ckey",e.Server="server",e.Admin="admin_ckey",e.Reason="reason",e.CID="comp_id",e.IP_Address="ip"}(r||(t.BanPanelSearchFilter=r={}))},34747:function(e,t,n){"use strict";t.__esModule=!0,t.useBanPanelBackend=void 0;var o=n(31246),r=n(92600);t.useBanPanelBackend=function(e){var t=(0,o.useBackend)(e),n=t.act;return{action:{searchBans:function(e,t){return n(r.BanPanelAction.SearchBans,{searchText:e,searchFilter:t})},navigatePreviousPage:function(){return n(r.BanPanelAction.NavigatePreviousPage)},navigateNextPage:function(){return n(r.BanPanelAction.NavigateNextPage)},setPerPage:function(e){return n(r.BanPanelAction.SetPerPage,{amount:e})},setTab:function(e){return n(r.BanPanelAction.SetTab,{value:e})},editBan:function(e){return n(r.BanPanelAction.EditBan,{id:e})},deleteBan:function(e){return n(r.BanPanelAction.DeleteBan,{id:e})}},data:t.data}}},36443:function(e,t,n){"use strict";t.__esModule=!0,t.BarberingMenu=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c="200px";t.BarberingMenu=function(e,t){var n=(0,r.useBackend)(t).data,l=(0,r.useLocalState)(t,"searchText",""),d=l[0],s=l[1],p=n.available_styles,m=Object.keys(p);return(0,o.createComponentVNode)(2,i.Window,{width:700,height:500,title:"Barber",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,m:0,children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:c,children:(0,o.createComponentVNode)(2,a.Box,{position:"fixed",width:c,children:(0,o.createComponentVNode)(2,f,{onSearchTextInput:s})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,u,{searchText:d,allHairNames:m,allHairStyles:p})})]})})})};var l=function(e){var t=e.onInput;return(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Icon,{name:"magnifying-glass"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Input,{style:{width:"100%"},onInput:function(e,n){return t(n)},placeholder:"Search..."})})]})},u=function(e){var t=e.searchText,n=e.allHairNames,r=e.allHairStyles,i=t.toLowerCase(),c=n.filter((function(e){return e.toLowerCase().includes(i)}));return(0,o.createComponentVNode)(2,a.Stack,{wrap:!0,children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{m:1,children:(0,o.createComponentVNode)(2,p,{hairStyle:r[e],hairName:e})},r[e].id)}))})},d=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"cut",color:"red",bold:!0,onClick:function(){return n("do_hair",{style_id:null})},children:"Create Wig"})},s=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,icon:"rotate-left",color:"red",onClick:function(){return n("update_preview",{action:"reset"})},children:"Reset"})},p=function(e,t){var n=(0,r.useBackend)(t).act,i=e.hairStyle,c=e.hairName;return(0,o.createComponentVNode)(2,a.Section,{width:"140px",align:"center",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,width:"60px",height:"100px",src:""+i.hair_icon})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:c}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{color:"blue",icon:"cut",onClick:function(){return n("do_hair",{style_id:i.hair_id})},children:"Cut"}),(0,o.createComponentVNode)(2,a.Button,{color:"blue",icon:"eye",onClick:function(){return n("update_preview",{action:"new_hair",style_id:i.hair_id})},children:"Preview"})]})]})})},m=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Stack,{justify:"space-around",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"rotate-left",onClick:function(){return n("update_preview",{action:"change_direction",direction:-90})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"rotate-right",onClick:function(){return n("update_preview",{action:"change_direction",direction:90})}})})]})},f=function(e,t){var n=(0,r.useBackend)(t).data.preview,i=e.onSearchTextInput;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,l,{onInput:i})}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,C)}),(0,o.createComponentVNode)(2,a.Stack.Divider,{mt:0}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",style:{width:"100%"},children:[(0,o.createComponentVNode)(2,a.Box,{style:{width:"100%"},align:"center",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:n,type:"map"},style:{width:"80px",height:"160px"}})}),(0,o.createComponentVNode)(2,s)]}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,m)}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,d)})]})})},h=function(e,t){var n=e.children,i=e.hairPortion,c=e.icon,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.current_hair_style,p=d.selected_hair_portion,m=(0,o.createComponentVNode)(2,a.Box,{align:"right",children:s[i]});return(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:c,rightSlot:m,selected:p===i,onClick:function(){return u("change_hair_portion",{new_portion:i})},children:n})},C=function(){return(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,mb:0,children:[(0,o.createComponentVNode)(2,h,{hairPortion:"top",icon:"arrows-up-to-line",children:"Top"}),(0,o.createComponentVNode)(2,h,{hairPortion:"middle",icon:"arrow-down-up-across-line",children:"Middle"}),(0,o.createComponentVNode)(2,h,{hairPortion:"bottom",icon:"arrows-down-to-line",children:"Bottom"})]})}},8844:function(e,t,n){"use strict";t.__esModule=!0,t.BarcodeComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=e.title,r=e.destinations,i=e.act,c=e.amount;return(0,o.createComponentVNode)(2,a.Section,{title:n,children:r.map((function(e){var t=e.crate_tag,n=e.name;return(0,o.createComponentVNode)(2,a.Button,{width:"100%",align:"center",content:n||t,onClick:function(){return i("print",{crate_tag:t,amount:c})}},t)}))})},l=function(e,t){if(e.card){var n=e.card,r=e.act;return(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:n.name+" ("+n.role+")",tooltip:"Clear scanned card",tooltipPosition:"bottom-end",onClick:function(){r("reset_id")}})}};t.BarcodeComputer=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.sections,p=d.card,m=(0,r.useLocalState)(t,"amount",1),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Barcode computer",width:600,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Amount to print",fill:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{value:f,minValue:1,maxValue:5,stepPixelSize:15,unit:"Barcodes",onDrag:function(e,t){return h(t)}})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Scanned ID card",fill:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:[(0,o.createComponentVNode)(2,l,{card:p,act:u}),(0,o.createVNode)(1,"br"),p?"Account balance: "+p.balance+"\u2abd":null]})})})]}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Stack,{children:s.map((function(e){var t=e.title,n=e.destinations;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:"33%",children:(0,o.createComponentVNode)(2,c,{title:t,destinations:n,act:u,amount:f})},t)}))})]})})}},45027:function(e,t,n){"use strict";t.__esModule=!0,t.BioEffectManager=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.checked,n=e.onClick,r=e.id;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:t,width:"5em",onClick:function(){return n(r)}})})})},l=function(e){var t=e.number,n=e.unit,r=e.onChange,i=e.id;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,unit:n,width:"5em",value:t,onChange:function(e,t){return r(i,t)}})})})},u=function(e){var t=e.children;return(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",textAlign:"center",children:t})},d=function(){return(0,o.createComponentVNode)(2,a.Table.Row,{bold:!0,children:[(0,o.createComponentVNode)(2,u,{children:"Name"}),(0,o.createComponentVNode)(2,u,{children:"ID"}),(0,o.createComponentVNode)(2,u,{children:"Stable"}),(0,o.createComponentVNode)(2,u,{children:"Reinforced"}),(0,o.createComponentVNode)(2,u,{children:"Boosted"}),(0,o.createComponentVNode)(2,u,{children:"Synced"}),(0,o.createComponentVNode)(2,u,{children:"Cooldown"}),(0,o.createComponentVNode)(2,u,{children:"Actions"})]})};t.BioEffectManager=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data,p=s.bioEffects,m=s.stability,f=s.target_name,h=function(e,t){return u("updateCooldown",{id:e,value:t})},C=function(e){return u("toggleBoosted",{id:e})},g=function(e){return u("toggleReinforced",{id:e})},N=function(e){return u("toggleStabilized",{id:e})},v=function(e){return u("toggleSynced",{id:e})};return(0,o.createComponentVNode)(2,i.Window,{title:"Bioeffect Manager",width:"750",height:"300",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Bioeffects of "+f,scrollable:!0,fill:!0,buttons:(0,o.createFragment)([(0,o.createTextVNode)("Stability:"),(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,width:"5em",placeholder:100,value:m,onChange:function(e,t){return function(e){return u("updateStability",{value:e})}(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return u("addBioEffect")},children:"Add Bioeffect"})],0),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,d),(null==p?void 0:p.length)>0?p.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",children:e.name}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.stabilized,onClick:N,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.reinforced,onClick:g,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.boosted,onClick:C,id:e.id}),(0,o.createComponentVNode)(2,c,{checked:e.synced,onClick:v,id:e.id}),(0,o.createComponentVNode)(2,l,{number:e.cooldown,unit:"ds",onChange:h,id:e.id}),(0,o.createComponentVNode)(2,a.Table.Cell,{py:"0.5em",collapsing:!0,children:(0,o.createComponentVNode)(2,a.Box,{direction:"row",align:"center",nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:"View Variables",tooltipPosition:"top",align:"left",icon:"gear",onClick:function(){return t=e.id,u("manageBioEffect",{id:t});var t}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{tooltip:"Remove",tooltipPosition:"top",align:"left",icon:"trash",color:"bad",onClick:function(){return t=e.id,u("deleteBioEffect",{id:t});var t}})]})})]},e.id)})):null]})})})})}},34116:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=n(65844),i=function(){return(0,o.createVNode)(32,"defs",null,(0,o.createVNode)(32,"marker",null,(0,o.createVNode)(32,"path",null,null,1,{d:"M0,0 L0,6 L9,3 z",fill:"orange",stroke:"none"}),2,{id:"arrow",markerWidth:"10",markerHeight:"10",refX:"0",refY:"3",orient:"auto",markerUnits:"strokeWidth"}),2)},c=function(e,t){var n=(0,r.useBackend)(t).data,c=(0,a.useStates)(t),l=c.mouseCoords,u=c.tileSize,d=c.isFlipped,s=n.boardInfo,p=s.width,m=s.height,f=n.currentUser;if(!f||!f.selected)return null;var h=n.pieces[f.selected];if(!h)return null;var C=h.x*u.width+u.width/2,g=h.y*u.height+u.height/2,N=l.x-20,v=l.y-54,b=Math.floor(N/u.width)*u.width,V=Math.floor(v/u.height)*u.height,y=b+u.width/2,x=V+u.height/2,k=y-C,S=x-g,I=Math.sqrt(k*k+S*S),w=I>u.width/2&&I>u.height/2,_=y-40*(k/I),D=x-40*(S/I);return(0,o.createVNode)(32,"svg","boardgame__board-ggrenderer",[(0,o.createVNode)(32,"rect",null,null,1,{x:b,y:V,width:u.width,height:u.height,fill:"red","fill-opacity":"0.4"}),(0,o.createVNode)(32,"rect",null,null,1,{x:d?p*u.width-C-u.width/2:C-u.width/2,y:d?m*u.height-g-u.height/2:g-u.height/2,width:u.width,height:u.height,fill:w?"red":"none","fill-opacity":"0.4"}),w&&(0,o.createComponentVNode)(2,i),w&&(0,o.createVNode)(32,"line",null,null,1,{x1:C,y1:g,x2:_,y2:D,stroke:"orange",fill:"none","stroke-width":"3","marker-end":"url(#arrow)"})],0,{width:"100%",height:"100%"})};t["default"]=c},9149:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=n(86489),i=n(65844),c=n(26949),l=function(e,t){var n=e.pieces,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.currentUser,p=d.users,m=(0,i.useStates)(t),f=m.isFlipped,h=m.tileSize,C=(0,i.useActions)(u),g=C.pieceSelect,N=C.pieceRemove,v=C.piecePlace,b=d.boardInfo,V=b.width,y=b.height,x=(0,a.codeRecordFromPieces)((0,a.fetchPieces)());return(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__board-gprenderer",children:Object.keys(n).map((function(e,t){var r,a=n[e],i=a.x,c=a.y,l=(a.prevX,a.prevY,a.code),u=a.selected,d=x[l],m=u&&s!==u,C=i*h.width,b=c*h.height;f&&(C=(V-i-1)*h.width,b=(y-c-1)*h.height);var k=(null==(r=p[u])?void 0:r.name)||"";return(0,o.createVNode)(1,"div","boardgame__board-gprenderer-piece",[(0,o.createVNode)(1,"img",null,null,1,{style:{width:h.width+"px",height:h.width+"px"},src:d.image}),u&&(0,o.createVNode)(1,"span",null,k,0)],0,{onmousedown:function(t){0!==t.button||u||(s.palette&&v(s.ckey,i,c),s.selected&&!m&&v(s.ckey,i,c),s.selected||g(s.ckey,e)),2===t.button&&(u||N(e))},onmouseup:function(e){s.palette&&v(s.ckey,i,c),s.selected&&!m&&v(s.ckey,i,c)},style:{left:C+"px",top:b+"px",width:h.width+"px",height:h.height+"px"}},t)}))})};t["default"]=l},83702:function(e,t){"use strict";t.__esModule=!0,t.screenToBoard=void 0;t.screenToBoard=function(e,t,n){return[e/n.width,t/n.height]}},66508:function(e,t,n){"use strict";t.__esModule=!0,t.Board=void 0;var o,r=n(96323),a=n(29678),i=n(26949),c=n(31246),l=n(65844),u=(o=n(45208))&&o.__esModule?o:{"default":o};t.Board=function(e,t){var n=(0,c.useBackend)(t),o=n.act,u=n.data,s=(0,l.useActions)(o).pieceDeselect;return(0,r.createComponentVNode)(2,i.Flex,{className:"boardgame__wrapper",children:(0,r.createComponentVNode)(2,i.Box,{className:"boardgame__board-inner",children:[(0,r.createComponentVNode)(2,a.HorizontalNotations),(0,r.createComponentVNode)(2,i.Flex,{className:"boardgame__board",children:[(0,r.createComponentVNode)(2,a.VerticalNotations),(0,r.createComponentVNode)(2,i.Flex.Item,{grow:!0,onmouseleave:function(){var e;null!=(e=u.currentUser)&&e.selected&&s(u.currentUser.ckey)},children:(0,r.createComponentVNode)(2,d)}),(0,r.createComponentVNode)(2,a.VerticalNotations)]}),(0,r.createComponentVNode)(2,a.HorizontalNotations)]})})};var d=function(e,t){var n=(0,c.useBackend)(t).data.boardInfo.boardstyle;return"checkerboard"===n?(0,r.createComponentVNode)(2,u["default"],{interactable:!0}):(0,r.createVNode)(1,"div",null,[(0,r.createTextVNode)("Unknown design: "),n],0)}},84894:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var o=n(96323),r=n(31246),a=function(e,t){var n=(0,r.useBackend)(t).data,a=n.styling,i=a.tileColor1,c=a.tileColor2,l=100/n.boardInfo.width,u=100/n.boardInfo.height;return(0,o.createVNode)(32,"svg",null,[(0,o.createVNode)(32,"pattern",null,[(0,o.createVNode)(32,"rect",null,null,1,{width:l+"%",height:u+"%",fill:i}),(0,o.createVNode)(32,"rect",null,null,1,{x:l+"%",y:u+"%",width:l+"%",height:u+"%",fill:i}),(0,o.createVNode)(32,"rect",null,null,1,{x:l+"%",width:l+"%",height:u+"%",fill:c}),(0,o.createVNode)(32,"rect",null,null,1,{y:u+"%",width:l+"%",height:u+"%",fill:c})],4,{id:"checkerboardpattern",x:"0",y:"0",width:2*l+"%",height:2*u+"%",patternUnits:"userSpaceOnUse"}),(0,o.createVNode)(32,"rect",null,null,1,{width:"100%",height:"100%",fill:"url(#checkerboardpattern)"})],4,{width:"100%",height:"100%"})};t["default"]=a},45208:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.CheckerBoard=void 0;var o=n(96323),r=n(31246),a=n(65844),i=u(n(34116)),c=u(n(9149)),l=u(n(84894));function u(e){return e&&e.__esModule?e:{"default":e}}var d=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.pieces,p=d.currentUser,m=d.styling.tileColor2,f=(0,a.useStates)(t),h=f.tileSize,C=f.isFlipped,g=f.mouseCoords,N=h.width,v=h.height,b=(0,a.useActions)(u).piecePlace,V=(0,o.createRef)(),y=function(){var e=g.x,t=g.y;if(!V)return[-1,-1];var n=V.current.getBoundingClientRect(),o=e-n.left,r=t-n.top,a=Math.floor(o/N),i=Math.floor(r/v);return C&&(a=d.boardInfo.width-a-1,i=d.boardInfo.height-i-1),[a,i]};return(0,o.createVNode)(1,"div","boardgame__board-checkerboard",[(0,o.createComponentVNode)(2,l["default"]),(0,o.createComponentVNode)(2,i["default"]),(0,o.createComponentVNode)(2,c["default"],{pieces:s})],4,{style:{"background-color":m},onMouseDown:function(e){if(0===e.button&&(p.palette||p.selected)){var t=y(),n=t[0],o=t[1];b(p.ckey,n,o)}},onMouseUp:function(e){if(0===e.button){var t=y(),n=t[0],o=t[1];if(p.palette)return void b(p.ckey,n,o);if(p.selected){var r=s[p.selected];r.x===n&&r.y===o||b(p.ckey,n,o)}}}},null,V)};t.CheckerBoard=d;var s=d;t["default"]=s},51891:function(){},25540:function(e,t,n){"use strict";t.__esModule=!0,t.BoardgameContents=void 0;var o=n(96323),r=n(66508),a=n(2381),i=n(29678),c=n(65844);t.BoardgameContents=function(e,t){var n=(0,c.useStates)(t).mouseCoordsSet;return(0,o.createComponentVNode)(2,a.Window.Content,{onMouseMove:function(e){n({x:e.clientX,y:e.clientY})},fitted:!0,className:"boardgame__window",children:[(0,o.createComponentVNode)(2,r.Board),(0,o.createComponentVNode)(2,i.Palettes)]})}},75022:function(e,t,n){"use strict";t.__esModule=!0,t.ButtonConfirm=void 0;var o=n(96323),r=n(26949),a=["icon","color","onConfirm","tooltipContent","confirmText"];function i(e,t){return i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},i(e,t)}var c=function(e){var t,n;function c(){for(var t,n=arguments.length,o=new Array(n),r=0;r<n;r++)o[r]=arguments[r];return(t=e.call.apply(e,[this].concat(o))||this).state={confirmState:!1},t.setConfirmState=function(e){t.setState({confirmState:e})},t}return n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,i(t,n),c.prototype.render=function(){var e=this,t=this.props,n=t.icon,i=t.color,c=t.onConfirm,l=t.tooltipContent,u=t.confirmText,d=void 0===u?"Confirm":u,s=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,a);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Button,Object.assign({icon:n,color:this.state.confirmState?"orange":i,tooltip:this.state.confirmState?d:l,onMouseOut:function(){return e.setConfirmState(!1)},onClick:function(){e.state.confirmState?(c(),e.setConfirmState(!1)):e.setConfirmState(!0)}},s)))},c}(o.Component);t.ButtonConfirm=c},68035:function(e,t,n){"use strict";t.__esModule=!0,t.HeldPieceRenderer=void 0;var o=n(96323),r=n(26949),a=n(31246),i=n(65844),c=n(86489);t.HeldPieceRenderer=function(e,t){var n=(0,a.useBackend)(t),l=(n.act,n.data);if(!l.currentUser)return null;var u=(0,i.useStates)(t).mouseCoords,d=u.x,s=u.y,p=l.currentUser.palette||l.currentUser.selected;if(!p)return null;var m=(0,c.fetchPieces)(),f=(0,c.codeRecordFromPieces)(m)[p];return f?(0,o.createComponentVNode)(2,r.Box,{className:"boardgame__heldpiece",style:{top:s+"px",left:d+"px",width:"120px",height:"120px"},children:[(0,o.createComponentVNode)(2,r.Box,{className:"boardgame__heldpiece-inner",children:(0,o.createVNode)(1,"img",null,null,1,{src:f.image})}),(0,o.createComponentVNode)(2,r.Box,{style:{"font-size":"12px","font-weight":"bold","text-shadow":"0 0 2px black"},children:"Right click to cancel"})]}):null}},41541:function(e,t,n){"use strict";t.__esModule=!0,t.VerticalNotations=t.HorizontalNotations=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(65844);t.HorizontalNotations=function(e,t){var n=(0,r.useBackend)(t).data,c=n.boardInfo.width,l=n.styling,u=l.border,d=l.tileColor1,s=l.tileColor2,p=(0,i.useStates)(t).isFlipped,m=u||s||"black",f=d||"white",h=(0,i.generateBoardNotationLetters)(c);return p&&(h=h.reverse()),(0,o.createComponentVNode)(2,a.Flex,{style:{"background-color":m,color:f},className:"boardgame__notations boardgame__notations-horizontal",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{className:"boardgame__notation-letter",children:e})},t)}))})};t.VerticalNotations=function(e,t){var n=(0,r.useBackend)(t).data,c=n.boardInfo.height,l=n.styling,u=l.border,d=l.tileColor1,s=l.tileColor2,p=(0,i.useStates)(t).isFlipped,m=u||s||"black",f=d||"white",h=Array.from(Array(c).keys());return p&&(h=h.reverse()),(0,o.createComponentVNode)(2,a.Flex,{style:{"background-color":m,color:f},className:"boardgame__notations boardgame__notations-vertical",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"boardgame__notations-number",grow:1,children:p?t+1:c-t},t)}))})}},75750:function(e,t,n){"use strict";t.__esModule=!0,t.Palettes=void 0;var o=n(96323),r=n(31246),a=n(86489),i=n(65844),c=n(26949);t.Palettes=function(e,t){var n=(0,r.useBackend)(t),d=(n.act,n.data,(0,i.useStates)(t).isExpanded);return(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__palettes",children:(0,a.fetchPalettes)().map((function(e,t){return(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Box,{className:"boardgame__palettes-header",children:(0,o.createComponentVNode)(2,u,{index:t,setId:e.name})}),(0,o.createComponentVNode)(2,c.Flex,{className:"boardgame__palettes-set "+(d(t)?"":"boardgame__palettes-set-minimized"),children:e.pieces.map((function(e,t){return(0,o.createComponentVNode)(2,l,{piece:e},t)}))})]},e.name)}))})};var l=function(e,t){var n=e.piece,a=(0,r.useBackend)(t),l=a.act,u=a.data.currentUser,d=(0,i.useActions)(l).paletteSet;return(0,o.createComponentVNode)(2,c.Flex.Item,{className:"boardgame__palettes-set-piece",onMouseDown:function(){return d(u.ckey,n.code)},children:(0,o.createVNode)(1,"img",null,null,1,{src:n.image})},n.name)},u=function(e,t){var n=e.index,r=e.setId,a=(0,i.useStates)(t),l=a.isExpanded,u=a.togglePalette;return(0,o.createComponentVNode)(2,c.Button.Checkbox,{className:"boardgame__palettes-set-toggle",checked:l(n),onClick:function(){return u(n)},children:r})}},15237:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.TitleBar=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(75022),c=n(65844),l=function(e,t){var n=(0,r.useBackend)(t).act,l=(0,c.useStates)(t),u=l.isFlipped,d=l.toggleFlip,s=l.helpModalOpen,p=l.helpModalClose,m=l.isHelpModalOpen,f=(0,c.useActions)(n),h=f.boardClear,C=f.applyGNot;return(0,o.createComponentVNode)(2,a.Box,{className:"boardgame__titlebar",children:[(0,o.createComponentVNode)(2,a.Button,{tooltip:m?"Close":"Help",color:m?"orange":"default",icon:m?"times":"question",onClick:function(){return m?p():s()}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:"Flip board",color:u?"orange":"default",icon:"repeat",onClick:d}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Clear board",icon:"trash",onConfirm:function(){h()}}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Load Chess Preset",icon:"chess",onConfirm:function(){C("r,n,b,q,k,b,n,r,p,p,p,p,p,p,p,p,32,P,P,P,P,P,P,P,P,R,N,B,Q,K,B,N,R")}}),(0,o.createComponentVNode)(2,i.ButtonConfirm,{tooltipContent:"Load Draughts Preset",icon:"ring",onConfirm:function(){C("1,d,1,d,1,d,1,d,d,1,d,1,d,1,d,2,d,1,d,1,d,1,d,16,D,1,D,1,D,1,D,2,D,1,D,1,D,1,D,D,1,D,1,D,1,D")}})]})};t.TitleBar=l;var u=l;t["default"]=u},29678:function(e,t,n){"use strict";t.__esModule=!0;var o=n(41541);t.HorizontalNotations=o.HorizontalNotations,t.VerticalNotations=o.VerticalNotations;var r=n(68035);t.HeldPieceRenderer=r.HeldPieceRenderer;var a=n(75750);t.Palettes=a.Palettes},95102:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.kit=void 0;var o,r=(o=n(86364))&&o.__esModule?o:{"default":o};var a={pieces:r["default"],palettes:[{name:"Chess",pieces:r["default"]}]};t.kit=a;var i=a;t["default"]=i},86364:function(e,t){"use strict";t.__esModule=!0,t["default"]=void 0;var n=[];n.push({code:"k",name:"King (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDpub25lOyBmaWxsLW9wYWNpdHk6MTsgZmlsbC1ydWxlOmV2ZW5vZGQ7IHN0cm9rZTojMDAwMDAwOyBzdHJva2Utd2lkdGg6MS41OyBzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyI+DQogICAgPHBhdGggZD0iTSAyMi41LDExLjYzIEwgMjIuNSw2IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIgaWQ9InBhdGg2NTcwIi8+DQogICAgPHBhdGggZD0iTSAyMi41LDI1IEMgMjIuNSwyNSAyNywxNy41IDI1LjUsMTQuNSBDIDI1LjUsMTQuNSAyNC41LDEyIDIyLjUsMTIgQyAyMC41LDEyIDE5LjUsMTQuNSAxOS41LDE0LjUgQyAxOCwxNy41IDIyLjUsMjUgMjIuNSwyNSIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlLWxpbmVjYXA6YnV0dDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMTIuNSwzNyBDIDE4LDQwLjUgMjcsNDAuNSAzMi41LDM3IEwgMzIuNSwzMCBDIDMyLjUsMzAgNDEuNSwyNS41IDM4LjUsMTkuNSBDIDM0LjUsMTMgMjUsMTYgMjIuNSwyMy41IEwgMjIuNSwyNyBMIDIyLjUsMjMuNSBDIDIwLDE2IDEwLjUsMTMgNi41LDE5LjUgQyAzLjUsMjUuNSAxMi41LDMwIDEyLjUsMzAgTCAxMi41LDM3IiBzdHlsZT0iZmlsbDojMDAwMDAwOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDIwLDggTCAyNSw4IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMzIsMjkuNSBDIDMyLDI5LjUgNDAuNSwyNS41IDM4LjAzLDE5Ljg1IEMgMzQuMTUsMTQgMjUsMTggMjIuNSwyNC41IEwgMjIuNSwyNi42IEwgMjIuNSwyNC41IEMgMjAsMTggMTAuODUsMTQgNi45NywxOS44NSBDIDQuNSwyNS41IDEzLDI5LjUgMTMsMjkuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAxMi41LDMwIEMgMTgsMjcgMjcsMjcgMzIuNSwzMCBNIDEyLjUsMzMuNSBDIDE4LDMwLjUgMjcsMzAuNSAzMi41LDMzLjUgTSAxMi41LDM3IEMgMTgsMzQgMjcsMzQgMzIuNSwzNyIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"K",name:"King (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNSI+DQogICAgPHBhdGggc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZD0iTTIyLjUgMTEuNjNWNk0yMCA4aDUiLz4NCiAgICA8cGF0aCBmaWxsPSIjZmZmIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZD0iTTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIvPg0KICAgIDxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDRWMjd2LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPg0KICAgIDxwYXRoIGQ9Ik0xMi41IDMwYzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMCIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"q",name:"Queen (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDojMDAwMDAwO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCI+DQoNCiAgICA8cGF0aCBkPSJNIDksMjYgQyAxNy41LDI0LjUgMzAsMjQuNSAzNiwyNiBMIDM4LjUsMTMuNSBMIDMxLDI1IEwgMzAuNywxMC45IEwgMjUuNSwyNC41IEwgMjIuNSwxMCBMIDE5LjUsMjQuNSBMIDE0LjMsMTAuOSBMIDE0LDI1IEwgNi41LDEzLjUgTCA5LDI2IHoiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpidXR0O2ZpbGw6IzAwMDAwMCIvPg0KICAgIDxwYXRoIGQ9Im0gOSwyNiBjIDAsMiAxLjUsMiAyLjUsNCAxLDEuNSAxLDEgMC41LDMuNSAtMS41LDEgLTEsMi41IC0xLDIuNSAtMS41LDEuNSAwLDIuNSAwLDIuNSA2LjUsMSAxNi41LDEgMjMsMCAwLDAgMS41LC0xIDAsLTIuNSAwLDAgMC41LC0xLjUgLTEsLTIuNSAtMC41LC0yLjUgLTAuNSwtMiAwLjUsLTMuNSAxLC0yIDIuNSwtMiAyLjUsLTQgLTguNSwtMS41IC0xOC41LC0xLjUgLTI3LDAgeiIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEuNSwzMCBDIDE1LDI5IDMwLDI5IDMzLjUsMzAiLz4NCiAgICA8cGF0aCBkPSJtIDEyLDMzLjUgYyA2LC0xIDE1LC0xIDIxLDAiLz4NCiAgICA8Y2lyY2xlIGN4PSI2IiBjeT0iMTIiIHI9IjIiLz4NCiAgICA8Y2lyY2xlIGN4PSIxNCIgY3k9IjkiIHI9IjIiLz4NCiAgICA8Y2lyY2xlIGN4PSIyMi41IiBjeT0iOCIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjMxIiBjeT0iOSIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjM5IiBjeT0iMTIiIHI9IjIiLz4NCiAgICA8cGF0aCBkPSJNIDExLDM4LjUgQSAzNSwzNSAxIDAgMCAzNCwzOC41IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0OyIvPg0KICAgIDxnIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojZmZmZmZmOyI+DQogICAgICA8cGF0aCBkPSJNIDExLDI5IEEgMzUsMzUgMSAwIDEgMzQsMjkiLz4NCiAgICAgIDxwYXRoIGQ9Ik0gMTIuNSwzMS41IEwgMzIuNSwzMS41Ii8+DQogICAgICA8cGF0aCBkPSJNIDExLjUsMzQuNSBBIDM1LDM1IDEgMCAwIDMzLjUsMzQuNSIvPg0KICAgICAgPHBhdGggZD0iTSAxMC41LDM3LjUgQSAzNSwzNSAxIDAgMCAzNC41LDM3LjUiLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"Q",name:"Queen (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIj4NCiAgICA8cGF0aCBkPSJNIDksMjYgQyAxNy41LDI0LjUgMzAsMjQuNSAzNiwyNiBMIDM4LjUsMTMuNSBMIDMxLDI1IEwgMzAuNywxMC45IEwgMjUuNSwyNC41IEwgMjIuNSwxMCBMIDE5LjUsMjQuNSBMIDE0LjMsMTAuOSBMIDE0LDI1IEwgNi41LDEzLjUgTCA5LDI2IHoiLz4NCiAgICA8cGF0aCBkPSJNIDksMjYgQyA5LDI4IDEwLjUsMjggMTEuNSwzMCBDIDEyLjUsMzEuNSAxMi41LDMxIDEyLDMzLjUgQyAxMC41LDM0LjUgMTEsMzYgMTEsMzYgQyA5LjUsMzcuNSAxMSwzOC41IDExLDM4LjUgQyAxNy41LDM5LjUgMjcuNSwzOS41IDM0LDM4LjUgQyAzNCwzOC41IDM1LjUsMzcuNSAzNCwzNiBDIDM0LDM2IDM0LjUsMzQuNSAzMywzMy41IEMgMzIuNSwzMSAzMi41LDMxLjUgMzMuNSwzMCBDIDM0LjUsMjggMzYsMjggMzYsMjYgQyAyNy41LDI0LjUgMTcuNSwyNC41IDksMjYgeiIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEuNSwzMCBDIDE1LDI5IDMwLDI5IDMzLjUsMzAiIHN0eWxlPSJmaWxsOm5vbmUiLz4NCiAgICA8cGF0aCBkPSJNIDEyLDMzLjUgQyAxOCwzMi41IDI3LDMyLjUgMzMsMzMuNSIgc3R5bGU9ImZpbGw6bm9uZSIvPg0KICAgIDxjaXJjbGUgY3g9IjYiIGN5PSIxMiIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjE0IiBjeT0iOSIgcj0iMiIvPg0KICAgIDxjaXJjbGUgY3g9IjIyLjUiIGN5PSI4IiByPSIyIi8+DQogICAgPGNpcmNsZSBjeD0iMzEiIGN5PSI5IiByPSIyIi8+DQogICAgPGNpcmNsZSBjeD0iMzkiIGN5PSIxMiIgcj0iMiIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"r",name:"Rook (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOiMwMDAwMDA7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gOSwzOSBMIDM2LDM5IEwgMzYsMzYgTCA5LDM2IEwgOSwzOSB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMi41LDMyIEwgMTQsMjkuNSBMIDMxLDI5LjUgTCAzMi41LDMyIEwgMTIuNSwzMiB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMiwzNiBMIDEyLDMyIEwgMzMsMzIgTCAzMywzNiBMIDEyLDM2IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDE0LDI5LjUgTCAxNCwxNi41IEwgMzEsMTYuNSBMIDMxLDI5LjUgTCAxNCwyOS41IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwxNi41IEwgMTEsMTQgTCAzNCwxNCBMIDMxLDE2LjUgTCAxNCwxNi41IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDExLDE0IEwgMTEsOSBMIDE1LDkgTCAxNSwxMSBMIDIwLDExIEwgMjAsOSBMIDI1LDkgTCAyNSwxMSBMIDMwLDExIEwgMzAsOSBMIDM0LDkgTCAzNCwxNCBMIDExLDE0IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDEyLDM1LjUgTCAzMywzNS41IEwgMzMsMzUuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxMywzMS41IEwgMzIsMzEuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwyOS41IEwgMzEsMjkuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxNCwxNi41IEwgMzEsMTYuNSIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiNmZmZmZmY7IHN0cm9rZS13aWR0aDoxOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogICAgPHBhdGggZD0iTSAxMSwxNCBMIDM0LDE0IiBzdHlsZT0iZmlsbDpub25lOyBzdHJva2U6I2ZmZmZmZjsgc3Ryb2tlLXdpZHRoOjE7IHN0cm9rZS1saW5lam9pbjptaXRlcjsiLz4NCiAgPC9nPg0KPC9zdmc+"}),n.push({code:"R",name:"Rook (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOiNmZmZmZmY7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gOSwzOSBMIDM2LDM5IEwgMzYsMzYgTCA5LDM2IEwgOSwzOSB6ICIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAxMiwzNiBMIDEyLDMyIEwgMzMsMzIgTCAzMywzNiBMIDEyLDM2IHogIiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsiLz4NCiAgICA8cGF0aCBkPSJNIDExLDE0IEwgMTEsOSBMIDE1LDkgTCAxNSwxMSBMIDIwLDExIEwgMjAsOSBMIDI1LDkgTCAyNSwxMSBMIDMwLDExIEwgMzAsOSBMIDM0LDkgTCAzNCwxNCIgc3R5bGU9InN0cm9rZS1saW5lY2FwOmJ1dHQ7Ii8+DQogICAgPHBhdGggZD0iTSAzNCwxNCBMIDMxLDE3IEwgMTQsMTcgTCAxMSwxNCIvPg0KICAgIDxwYXRoIGQ9Ik0gMzEsMTcgTCAzMSwyOS41IEwgMTQsMjkuNSBMIDE0LDE3IiBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6YnV0dDsgc3Ryb2tlLWxpbmVqb2luOm1pdGVyOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMzEsMjkuNSBMIDMyLjUsMzIgTCAxMi41LDMyIEwgMTQsMjkuNSIvPg0KICAgIDxwYXRoIGQ9Ik0gMTEsMTQgTCAzNCwxNCIgc3R5bGU9ImZpbGw6bm9uZTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lam9pbjptaXRlcjsiLz4NCiAgPC9nPg0KPC9zdmc+"}),n.push({code:"b",name:"Bishop (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtcnVsZTpldmVub2RkOyBmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kOyBzdHJva2UtbGluZWpvaW46cm91bmQ7IHN0cm9rZS1taXRlcmxpbWl0OjQ7IHN0cm9rZS1kYXNoYXJyYXk6bm9uZTsgc3Ryb2tlLW9wYWNpdHk6MTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMC42KSI+DQogICAgPGcgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lY2FwOmJ1dHQ7Ij4NCiAgICAgIDxwYXRoIGQ9Ik0gOSwzNiBDIDEyLjM5LDM1LjAzIDE5LjExLDM2LjQzIDIyLjUsMzQgQyAyNS44OSwzNi40MyAzMi42MSwzNS4wMyAzNiwzNiBDIDM2LDM2IDM3LjY1LDM2LjU0IDM5LDM4IEMgMzguMzIsMzguOTcgMzcuMzUsMzguOTkgMzYsMzguNSBDIDMyLjYxLDM3LjUzIDI1Ljg5LDM4Ljk2IDIyLjUsMzcuNSBDIDE5LjExLDM4Ljk2IDEyLjM5LDM3LjUzIDksMzguNSBDIDcuNjUsMzguOTkgNi42OCwzOC45NyA2LDM4IEMgNy4zNSwzNi41NCA5LDM2IDksMzYgeiIvPg0KICAgICAgPHBhdGggZD0iTSAxNSwzMiBDIDE3LjUsMzQuNSAyNy41LDM0LjUgMzAsMzIgQyAzMC41LDMwLjUgMzAsMzAgMzAsMzAgQyAzMCwyNy41IDI3LjUsMjYgMjcuNSwyNiBDIDMzLDI0LjUgMzMuNSwxNC41IDIyLjUsMTAuNSBDIDExLjUsMTQuNSAxMiwyNC41IDE3LjUsMjYgQyAxNy41LDI2IDE1LDI3LjUgMTUsMzAgQyAxNSwzMCAxNC41LDMwLjUgMTUsMzIgeiIvPg0KICAgICAgPHBhdGggZD0iTSAyNSA4IEEgMi41IDIuNSAwIDEgMSAgMjAsOCBBIDIuNSAyLjUgMCAxIDEgIDI1IDggeiIvPg0KICAgIDwvZz4NCiAgICA8cGF0aCBkPSJNIDE3LjUsMjYgTCAyNy41LDI2IE0gMTUsMzAgTCAzMCwzMCBNIDIyLjUsMTUuNSBMIDIyLjUsMjAuNSBNIDIwLDE4IEwgMjUsMTgiIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojZmZmZmZmOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"B",name:"Bishop (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtcnVsZTpldmVub2RkOyBmaWxsLW9wYWNpdHk6MTsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kOyBzdHJva2UtbGluZWpvaW46cm91bmQ7IHN0cm9rZS1taXRlcmxpbWl0OjQ7IHN0cm9rZS1kYXNoYXJyYXk6bm9uZTsgc3Ryb2tlLW9wYWNpdHk6MTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMC42KSI+DQogICAgPGcgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS1saW5lY2FwOmJ1dHQ7Ij4NCiAgICAgIDxwYXRoIGQ9Ik0gOSwzNiBDIDEyLjM5LDM1LjAzIDE5LjExLDM2LjQzIDIyLjUsMzQgQyAyNS44OSwzNi40MyAzMi42MSwzNS4wMyAzNiwzNiBDIDM2LDM2IDM3LjY1LDM2LjU0IDM5LDM4IEMgMzguMzIsMzguOTcgMzcuMzUsMzguOTkgMzYsMzguNSBDIDMyLjYxLDM3LjUzIDI1Ljg5LDM4Ljk2IDIyLjUsMzcuNSBDIDE5LjExLDM4Ljk2IDEyLjM5LDM3LjUzIDksMzguNSBDIDcuNjUsMzguOTkgNi42OCwzOC45NyA2LDM4IEMgNy4zNSwzNi41NCA5LDM2IDksMzYgeiIvPg0KICAgICAgPHBhdGggZD0iTSAxNSwzMiBDIDE3LjUsMzQuNSAyNy41LDM0LjUgMzAsMzIgQyAzMC41LDMwLjUgMzAsMzAgMzAsMzAgQyAzMCwyNy41IDI3LjUsMjYgMjcuNSwyNiBDIDMzLDI0LjUgMzMuNSwxNC41IDIyLjUsMTAuNSBDIDExLjUsMTQuNSAxMiwyNC41IDE3LjUsMjYgQyAxNy41LDI2IDE1LDI3LjUgMTUsMzAgQyAxNSwzMCAxNC41LDMwLjUgMTUsMzIgeiIvPg0KICAgICAgPHBhdGggZD0iTSAyNSA4IEEgMi41IDIuNSAwIDEgMSAgMjAsOCBBIDIuNSAyLjUgMCAxIDEgIDI1IDggeiIvPg0KICAgIDwvZz4NCiAgICA8cGF0aCBkPSJNIDE3LjUsMjYgTCAyNy41LDI2IE0gMTUsMzAgTCAzMCwzMCBNIDIyLjUsMTUuNSBMIDIyLjUsMjAuNSBNIDIwLDE4IEwgMjUsMTgiIHN0eWxlPSJmaWxsOm5vbmU7IHN0cm9rZTojMDAwMDAwOyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"n",name:"Knight (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gMjIsMTAgQyAzMi41LDExIDM4LjUsMTggMzgsMzkgTCAxNSwzOSBDIDE1LDMwIDI1LDMyLjUgMjMsMTgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7IHN0cm9rZTojMDAwMDAwOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMjQsMTggQyAyNC4zOCwyMC45MSAxOC40NSwyNS4zNyAxNiwyNyBDIDEzLDI5IDEzLjE4LDMxLjM0IDExLDMxIEMgOS45NTgsMzAuMDYgMTIuNDEsMjcuOTYgMTEsMjggQyAxMCwyOCAxMS4xOSwyOS4yMyAxMCwzMCBDIDksMzAgNS45OTcsMzEgNiwyNiBDIDYsMjQgMTIsMTQgMTIsMTQgQyAxMiwxNCAxMy44OSwxMi4xIDE0LDEwLjUgQyAxMy4yNyw5LjUwNiAxMy41LDguNSAxMy41LDcuNSBDIDE0LjUsNi41IDE2LjUsMTAgMTYuNSwxMCBMIDE4LjUsMTAgQyAxOC41LDEwIDE5LjI4LDguMDA4IDIxLDcgQyAyMiw3IDIyLDEwIDIyLDEwIiBzdHlsZT0iZmlsbDojMDAwMDAwOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDkuNSAyNS41IEEgMC41IDAuNSAwIDEgMSA4LjUsMjUuNSBBIDAuNSAwLjUgMCAxIDEgOS41IDI1LjUgeiIgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAxNSAxNS41IEEgMC41IDEuNSAwIDEgMSAgMTQsMTUuNSBBIDAuNSAxLjUgMCAxIDEgIDE1IDE1LjUgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC44NjYsMC41LC0wLjUsMC44NjYsOS42OTMsLTUuMTczKSIgc3R5bGU9ImZpbGw6I2ZmZmZmZjsgc3Ryb2tlOiNmZmZmZmY7Ii8+DQogICAgPHBhdGggZD0iTSAyNC41NSwxMC40IEwgMjQuMSwxMS44NSBMIDI0LjYsMTIgQyAyNy43NSwxMyAzMC4yNSwxNC40OSAzMi41LDE4Ljc1IEMgMzQuNzUsMjMuMDEgMzUuNzUsMjkuMDYgMzUuMjUsMzkgTCAzNS4yLDM5LjUgTCAzNy40NSwzOS41IEwgMzcuNSwzOSBDIDM4LDI4Ljk0IDM2LjYyLDIyLjE1IDM0LjI1LDE3LjY2IEMgMzEuODgsMTMuMTcgMjguNDYsMTEuMDIgMjUuMDYsMTAuNSBMIDI0LjU1LDEwLjQgeiAiIHN0eWxlPSJmaWxsOiNmZmZmZmY7IHN0cm9rZTpub25lOyIvPg0KICA8L2c+DQo8L3N2Zz4="}),n.push({code:"N",name:"Knight (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8ZyBzdHlsZT0ib3BhY2l0eToxOyBmaWxsOm5vbmU7IGZpbGwtb3BhY2l0eToxOyBmaWxsLXJ1bGU6ZXZlbm9kZDsgc3Ryb2tlOiMwMDAwMDA7IHN0cm9rZS13aWR0aDoxLjU7IHN0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0OyBzdHJva2UtZGFzaGFycmF5Om5vbmU7IHN0cm9rZS1vcGFjaXR5OjE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDAuMykiPg0KICAgIDxwYXRoIGQ9Ik0gMjIsMTAgQyAzMi41LDExIDM4LjUsMTggMzgsMzkgTCAxNSwzOSBDIDE1LDMwIDI1LDMyLjUgMjMsMTgiIHN0eWxlPSJmaWxsOiNmZmZmZmY7IHN0cm9rZTojMDAwMDAwOyIvPg0KICAgIDxwYXRoIGQ9Ik0gMjQsMTggQyAyNC4zOCwyMC45MSAxOC40NSwyNS4zNyAxNiwyNyBDIDEzLDI5IDEzLjE4LDMxLjM0IDExLDMxIEMgOS45NTgsMzAuMDYgMTIuNDEsMjcuOTYgMTEsMjggQyAxMCwyOCAxMS4xOSwyOS4yMyAxMCwzMCBDIDksMzAgNS45OTcsMzEgNiwyNiBDIDYsMjQgMTIsMTQgMTIsMTQgQyAxMiwxNCAxMy44OSwxMi4xIDE0LDEwLjUgQyAxMy4yNyw5LjUwNiAxMy41LDguNSAxMy41LDcuNSBDIDE0LjUsNi41IDE2LjUsMTAgMTYuNSwxMCBMIDE4LjUsMTAgQyAxOC41LDEwIDE5LjI4LDguMDA4IDIxLDcgQyAyMiw3IDIyLDEwIDIyLDEwIiBzdHlsZT0iZmlsbDojZmZmZmZmOyBzdHJva2U6IzAwMDAwMDsiLz4NCiAgICA8cGF0aCBkPSJNIDkuNSAyNS41IEEgMC41IDAuNSAwIDEgMSA4LjUsMjUuNSBBIDAuNSAwLjUgMCAxIDEgOS41IDI1LjUgeiIgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7Ii8+DQogICAgPHBhdGggZD0iTSAxNSAxNS41IEEgMC41IDEuNSAwIDEgMSAgMTQsMTUuNSBBIDAuNSAxLjUgMCAxIDEgIDE1IDE1LjUgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC44NjYsMC41LC0wLjUsMC44NjYsOS42OTMsLTUuMTczKSIgc3R5bGU9ImZpbGw6IzAwMDAwMDsgc3Ryb2tlOiMwMDAwMDA7Ii8+DQogIDwvZz4NCjwvc3ZnPg=="}),n.push({code:"p",name:"Pawn (Black)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8cGF0aCBkPSJtIDIyLjUsOSBjIC0yLjIxLDAgLTQsMS43OSAtNCw0IDAsMC44OSAwLjI5LDEuNzEgMC43OCwyLjM4IEMgMTcuMzMsMTYuNSAxNiwxOC41OSAxNiwyMSBjIDAsMi4wMyAwLjk0LDMuODQgMi40MSw1LjAzIEMgMTUuNDEsMjcuMDkgMTEsMzEuNTggMTEsMzkuNSBIIDM0IEMgMzQsMzEuNTggMjkuNTksMjcuMDkgMjYuNTksMjYuMDMgMjguMDYsMjQuODQgMjksMjMuMDMgMjksMjEgMjksMTguNTkgMjcuNjcsMTYuNSAyNS43MiwxNS4zOCAyNi4yMSwxNC43MSAyNi41LDEzLjg5IDI2LjUsMTMgYyAwLC0yLjIxIC0xLjc5LC00IC00LC00IHoiIHN0eWxlPSJvcGFjaXR5OjE7IGZpbGw6IzAwMDAwMDsgZmlsbC1vcGFjaXR5OjE7IGZpbGwtcnVsZTpub256ZXJvOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLXdpZHRoOjEuNTsgc3Ryb2tlLWxpbmVjYXA6cm91bmQ7IHN0cm9rZS1saW5lam9pbjptaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyIvPg0KPC9zdmc+"}),n.push({code:"P",name:"Pawn (White)",game:"chess",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgNDUgNDUiPg0KICA8cGF0aCBkPSJtIDIyLjUsOSBjIC0yLjIxLDAgLTQsMS43OSAtNCw0IDAsMC44OSAwLjI5LDEuNzEgMC43OCwyLjM4IEMgMTcuMzMsMTYuNSAxNiwxOC41OSAxNiwyMSBjIDAsMi4wMyAwLjk0LDMuODQgMi40MSw1LjAzIEMgMTUuNDEsMjcuMDkgMTEsMzEuNTggMTEsMzkuNSBIIDM0IEMgMzQsMzEuNTggMjkuNTksMjcuMDkgMjYuNTksMjYuMDMgMjguMDYsMjQuODQgMjksMjMuMDMgMjksMjEgMjksMTguNTkgMjcuNjcsMTYuNSAyNS43MiwxNS4zOCAyNi4yMSwxNC43MSAyNi41LDEzLjg5IDI2LjUsMTMgYyAwLC0yLjIxIC0xLjc5LC00IC00LC00IHoiIHN0eWxlPSJvcGFjaXR5OjE7IGZpbGw6I2ZmZmZmZjsgZmlsbC1vcGFjaXR5OjE7IGZpbGwtcnVsZTpub256ZXJvOyBzdHJva2U6IzAwMDAwMDsgc3Ryb2tlLXdpZHRoOjEuNTsgc3Ryb2tlLWxpbmVjYXA6cm91bmQ7IHN0cm9rZS1saW5lam9pbjptaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6NDsgc3Ryb2tlLWRhc2hhcnJheTpub25lOyBzdHJva2Utb3BhY2l0eToxOyIvPg0KPC9zdmc+"});var o=n;t["default"]=o},85867:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=t.kit=void 0;var o,r=(o=n(77896))&&o.__esModule?o:{"default":o};var a={pieces:r["default"],palettes:[{name:"Draughts",pieces:r["default"]}]};t.kit=a;var i=a;t["default"]=i},77896:function(e,t){"use strict";t.__esModule=!0,t["default"]=void 0;var n=[];n.push({code:"d",name:"Man (Black)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOS43OW1tIiBoZWlnaHQ9IjkuNzltbSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgOS43OSA5Ljc5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KIDxtZXRhZGF0YT4KICA8cmRmOlJERj4KICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICA8ZGM6dGl0bGUvPgogICA8L2NjOldvcms+CiAgPC9yZGY6UkRGPgogPC9tZXRhZGF0YT4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMCAtMzIuNzg2KSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo"}),n.push({code:"m",name:"King  (Black)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOS43OW1tIiBoZWlnaHQ9IjkuNzltbSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgOS43OSA5Ljc5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KIDxtZXRhZGF0YT4KICA8cmRmOlJERj4KICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICA8ZGM6dGl0bGUvPgogICA8L2NjOldvcms+CiAgPC9yZGY6UkRGPgogPC9tZXRhZGF0YT4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Mi40MDggLTMyLjc4NikiPgogIDxnIGZpbGw9IiNmZmYiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIyNS44OTUiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iMyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICA8L2c+CiAgPGc+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjM3LjY4MSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSIzIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuMzk3Ii8+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4xMTU3NiAwIDAgLjExNTc2IDQ0LjY5OCAzNS4wNDEpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjQuODk1IiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMjUuODk1IiByPSIzIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNzU2IDIzLjA2OCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgPHBhdGggZD0ibTIyLjUgMTEuNjN2LTUuNjNtLTIuNSAyaDUiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0yMi41IDI1czQuNS03LjUgMy0xMC41YzAgMC0xLTIuNS0zLTIuNXMtMyAyLjUtMyAyLjVjLTEuNSAzIDMgMTAuNSAzIDEwLjUiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMTIuNSAzN2M1LjUgMy41IDE0LjUgMy41IDIwIDB2LTdzOS00LjUgNi0xMC41Yy00LTYuNS0xMy41LTMuNS0xNiA0djMuNS0zLjVjLTIuNS03LjUtMTItMTAuNS0xNi00LTMgNiA2IDEwLjUgNiAxMC41djciLz4KICAgIDxwYXRoIGQ9Im0xMi41IDMwYzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMCIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K"}),n.push({code:"D",name:"Man (White)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuMTg3bW0iIGhlaWdodD0iMTAuMTg3bW0iIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEwLjE4NyAxMC4xODciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjgwMiAtMjAuODAyKSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo="}),n.push({code:"M",name:"King (White)",game:"draughts",image:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuMTg3bW0iIGhlaWdodD0iMTAuMTg3bW0iIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEwLjE4NyAxMC4xODciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjIwOSAtMjAuODAyKSI+CiAgPGcgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyI+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiLz4KICAgPGNpcmNsZSBjeD0iMzQuODk1IiBjeT0iMjUuODk1IiByPSIzIi8+CiAgPC9nPgogIDxnPgogICA8Y2lyY2xlIGN4PSIzNC44OTUiIGN5PSIzNy42ODEiIHI9IjQuODk1Ii8+CiAgIDxjaXJjbGUgY3g9IjM0Ljg5NSIgY3k9IjM3LjY4MSIgcj0iMyIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogIDwvZz4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNDcuMzAzIiBjeT0iMzcuNjgxIiByPSI0Ljg5NSIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIzNy42ODEiIHI9IjMiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii4zOTciLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjExNTc2IDAgMCAuMTE1NzYgNDQuNjk4IDM1LjA0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgIDxwYXRoIGQ9Im0yMi41IDExLjYzdi01LjYzbS0yLjUgMmg1IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+CiAgICA8cGF0aCBkPSJtMjIuNSAyNXM0LjUtNy41IDMtMTAuNWMwIDAtMS0yLjUtMy0yLjVzLTMgMi41LTMgMi41Yy0xLjUgMyAzIDEwLjUgMyAxMC41IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTEyLjUgMzdjNS41IDMuNSAxNC41IDMuNSAyMCAwdi03czktNC41IDYtMTAuNWMtNC02LjUtMTMuNS0zLjUtMTYgNHYzLjUtMy41Yy0yLjUtNy41LTEyLTEwLjUtMTYtNC0zIDYgNiAxMC41IDYgMTAuNXY3Ii8+CiAgICA8cGF0aCBkPSJtMTIuNSAzMGM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwbS0yMCAzLjVjNS41LTMgMTQuNS0zIDIwIDAiLz4KICAgPC9nPgogIDwvZz4KICA8ZyBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgIDxjaXJjbGUgY3g9IjQ3LjMwMyIgY3k9IjI1Ljg5NSIgcj0iNC44OTUiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8Y2lyY2xlIGN4PSI0Ny4zMDMiIGN5PSIyNS44OTUiIHI9IjMiIHN0cm9rZS13aWR0aD0iLjM5NyIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMTE1NzYgMCAwIC4xMTU3NiA0NC43NTYgMjMuMDY4KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cGF0aCBkPSJtMjIuNSAxMS42M3YtNS42M20tMi41IDJoNSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIvPgogICAgPHBhdGggZD0ibTIyLjUgMjVzNC41LTcuNSAzLTEwLjVjMCAwLTEtMi41LTMtMi41cy0zIDIuNS0zIDIuNWMtMS41IDMgMyAxMC41IDMgMTAuNSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz4KICAgIDxwYXRoIGQ9Im0xMi41IDM3YzUuNSAzLjUgMTQuNSAzLjUgMjAgMHYtN3M5LTQuNSA2LTEwLjVjLTQtNi41LTEzLjUtMy41LTE2IDR2My41LTMuNWMtMi41LTcuNS0xMi0xMC41LTE2LTQtMyA2IDYgMTAuNSA2IDEwLjV2NyIvPgogICAgPHBhdGggZD0ibTEyLjUgMzBjNS41LTMgMTQuNS0zIDIwIDBtLTIwIDMuNWM1LjUtMyAxNC41LTMgMjAgMG0tMjAgMy41YzUuNS0zIDE0LjUtMyAyMCAwIi8+CiAgIDwvZz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo="});var o=n;t["default"]=o},86489:function(e,t,n){"use strict";t.__esModule=!0,t.fetchPalettes=t.palettes=t.fetchPieces=t.codeRecordFromPieces=t.getPiecesByGame=t.getPiece=t.pushPieces=void 0;var o=n(8250),r=[];o.kits.forEach((function(e){r.push.apply(r,e.pieces)}));t.pushPieces=function(e){return r.push.apply(r,e)};t.getPiece=function(e,t){return r.find((function(n){return n.code===e&&n.game===t}))};t.getPiecesByGame=function(e){return r.filter((function(t){return t.game===e}))};t.codeRecordFromPieces=function(e){return e.reduce((function(e,t){return e[t.code]=t,e}),{})};t.fetchPieces=function(){return r};var a=[];t.palettes=a,o.kits.forEach((function(e){a.push.apply(a,e.palettes)}));t.fetchPalettes=function(){return a}},8250:function(e,t,n){"use strict";t.__esModule=!0,t.kits=void 0;var o=a(n(95102)),r=a(n(85867));function a(e){return e&&e.__esModule?e:{"default":e}}var i=[o["default"],r["default"]];t.kits=i},10522:function(e,t,n){"use strict";t.__esModule=!0,t.Boardgame=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(44135),c=n(26949),l=n(65844),u=n(15237),d=n(68035),s=n(25540);function p(e,t){return p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},p(e,t)}var m=function(e){var t,n;function c(t){return e.call(this,t)||this}n=e,(t=c).prototype=Object.create(n.prototype),t.prototype.constructor=t,p(t,n);var l=c.prototype;return l.componentDidUpdate=function(){(0,i.handleEvents)(this.context),(0,i.adjustSizes)(this.context)},l.render=function(){var e,t=(0,a.useBackend)(this.context).data,n=(null==t||null==(e=t.boardInfo)?void 0:e.name)||"Boardgame";return(0,o.createComponentVNode)(2,r.Window,{title:n,width:580,height:512,children:[(0,o.createComponentVNode)(2,f),(0,o.createComponentVNode)(2,u.TitleBar),(0,o.createComponentVNode)(2,d.HeldPieceRenderer),(0,o.createComponentVNode)(2,s.BoardgameContents)]})},c}(o.Component);t.Boardgame=m;var f=function(e,t){var n=(0,l.useStates)(t),r=n.helpModalClose;return n.isHelpModalOpen?(0,o.createComponentVNode)(2,c.Dimmer,{className:"boardgame__helpmodal",onClick:r,children:(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createVNode)(1,"p",null,(0,o.createVNode)(1,"strong",null,"Help",16),2),(0,o.createVNode)(1,"p",null,[(0,o.createComponentVNode)(2,c.Icon,{name:"mouse"}),(0,o.createTextVNode)(" Click on a piece to select it, click on a tile to move it there.")],4),(0,o.createVNode)(1,"p",null,"Pieces may also be click-dragged to a target tile.",16),(0,o.createVNode)(1,"p",null,"Moving a piece onto a tile occupied by another piece will replace/capture the piece already on that tile.",16),(0,o.createVNode)(1,"p",null,"Right click a piece to delete it.",16)]})}):null}},65844:function(e,t,n){"use strict";t.__esModule=!0,t.generateBoardNotationLetters=t.numToBoardNotation=t.PalleteExpandType=t.SizeType=t.XYType=t.TileSizeType=t.UserDataType=t.PieceDataType=t.BoardgameData=t.StylingType=t.BoardInfoType=t.useStates=t.useActions=void 0;var o=n(51887);t.useActions=o.useActions;var r=n(31463);t.useStates=r.useStates;var a=n(76434);t.BoardInfoType=a.BoardInfoType,t.StylingType=a.StylingType,t.BoardgameData=a.BoardgameData,t.PieceDataType=a.PieceDataType,t.UserDataType=a.UserDataType,t.TileSizeType=a.TileSizeType,t.XYType=a.XYType,t.SizeType=a.SizeType,t.PalleteExpandType=a.PalleteExpandType;var i=n(43785);t.numToBoardNotation=i.numToBoardNotation,t.generateBoardNotationLetters=i.generateBoardNotationLetters},43785:function(e,t){"use strict";t.__esModule=!0,t.generateBoardNotationLetters=t.numToBoardNotation=void 0;var n=function(e){for(var t="",n=e;n>=0;){var o=n%26;t=String.fromCharCode(65+o)+t,n=Math.floor(n/26)-1}return t};t.numToBoardNotation=n;t.generateBoardNotationLetters=function(e,t){for(var o=[],r=0;r<e;r++)t?o.push(n(e-r)):o.push(n(r));return o}},76434:function(){},51887:function(e,t){"use strict";t.__esModule=!0,t.useActions=void 0;t.useActions=function(e){return{pieceCreate:function(t,n,o){e("pieceCreate",{code:t,x:n,y:o})},pieceRemove:function(t){e("pieceRemove",{piece:t})},pieceRemoveHeld:function(t){e("pieceRemoveHeld",{ckey:t})},pieceSelect:function(t,n){e("pieceSelect",{ckey:t,piece:n})},pieceDeselect:function(t){e("pieceDeselect",{ckey:t})},piecePlace:function(t,n,o){e("piecePlace",{ckey:t,x:n,y:o})},applyGNot:function(t){e("applyGNot",{gnot:t})},paletteSet:function(t,n){e("paletteSet",{ckey:t,code:n})},paletteClear:function(t){e("paletteClear",{ckey:t})},boardClear:function(){e("applyGNot",{gnot:""})}}}},31463:function(e,t,n){"use strict";t.__esModule=!0,t.useStates=t.STATES=t.DEFAULT_STATES=void 0;var o=n(31246),r={FLIP:!1,ZOOM:1,MOUSE_COORDS:{x:0,y:0}};t.DEFAULT_STATES=r;var a=function(e){return{flip:(0,o.useLocalState)(e,"flip",r.FLIP),zoom:(0,o.useLocalState)(e,"zoom",r.ZOOM),mouseCoords:(0,o.useLocalState)(e,"mouseCoords",r.MOUSE_COORDS),palettesExpanded:(0,o.useLocalState)(e,"palettesExpanded",{}),paletteLastElement:(0,o.useLocalState)(e,"paletteLastElement",null),tileSize:(0,o.useLocalState)(e,"tileSize",{width:0,height:0}),helpModalOpen:(0,o.useLocalState)(e,"helpModalOpen",!1)}};t.STATES=a;t.useStates=function(e){var t=a(e);return{paletteLastElementSet:function(e){(0,t.paletteLastElement[1])(e)},paletteLastElement:t.paletteLastElement[0],mouseCoordsSet:function(e){(0,t.mouseCoords[1])({x:e.x,y:e.y})},mouseCoords:t.mouseCoords[0],toggleFlip:function(){var e=t.flip,n=e[0];(0,e[1])(!n)},isFlipped:t.flip[0],helpModalClose:function(){(0,t.helpModalOpen[1])(!1)},helpModalOpen:function(){(0,t.helpModalOpen[1])(!0)},isHelpModalOpen:t.helpModalOpen[0],expandPalette:function(e){var n;(0,t.palettesExpanded[1])(Object.assign({},t.palettesExpanded[0],((n={})[e]=!0,n)))},togglePalette:function(e){var n;(0,t.palettesExpanded[1])(Object.assign({},t.palettesExpanded[0],((n={})[e]=!t.palettesExpanded[0][e],n)))},isExpanded:function(e){return!!t.palettesExpanded[0][e]},setTileSizeType:function(e){(0,t.tileSize[1])(e)},tileSize:t.tileSize[0]}}},44135:function(e,t,n){"use strict";t.__esModule=!0,t.handleEvents=t.adjustSizes=void 0;var o=n(31246),r=n(65844);t.adjustSizes=function(e){a(e),i(e)};var a=function(e){var t=(0,o.useBackend)(e).data,n=(0,r.useStates)(e),a=n.setTileSizeType,i=n.tileSize,c=document.getElementsByClassName("boardgame__board-inner")[0],l=0,u=0;if(c){var d=c.getBoundingClientRect(),s=d.width-40,p=d.height-40;l=s/t.boardInfo.width,u=p/t.boardInfo.height}l===i.width&&u===i.height||a({width:l,height:u})},i=function(e){var t=(0,o.useBackend)(e).data.styling.aspectRatio,n=500,r=400,a=document.getElementsByClassName("boardgame__window")[0];if(a){var i=a.getBoundingClientRect(),c=i.width,l=i.height;if(c===n&&l===r)return;var u=c<l?c:l;n=u+100,r=u+32.25,t&&(n=u*t+100,r=u+32.25)}Byond.winset(window.__windowId__,{size:n+"x"+r})};t.handleEvents=function(e){var t=(0,o.useBackend)(e),n=t.act,a=t.data,i=(0,r.useActions)(n),c=i.paletteClear,l=i.pieceDeselect;document.body.oncontextmenu=function(e){var t,n;(e.preventDefault(),2===e.button)&&(null!=(t=a.currentUser)&&t.palette&&c(a.currentUser.ckey),null!=(n=a.currentUser)&&n.selected&&l(a.currentUser.ckey));return!1},document.body.onmouseleave=function(){var e;null!=(e=a.currentUser)&&e.palette&&c(a.currentUser.ckey)}}},10818:function(e,t,n){"use strict";t.__esModule=!0,t.Bombsim=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(31567),l=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,o.createComponentVNode)(2,a.Button,{icon:"wifi",onClick:function(){return d()},children:"Reset Connection"}),d=function(){i("reset"),C("NO CONNECTION")},s=(0,r.useLocalState)(t,"bits",c.net_number),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"connection","OK CONNECTION"),h=f[0],C=f[1];"NO CONNECTION"===h&&null!==c.host_id&&C("OK CONNECTION");for(var g=[],N=0;N<4;N++)g.push((0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,u,{local_bits:p,setter:m,bit_pos:N})}));return(0,o.createComponentVNode)(2,a.Section,{title:"Maintenence Panel",buttons:l,children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Host Connection",children:h}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Configuration Switches",verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Stack,{children:g})})]})},u=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=(n.data,e.local_bits),l=e.setter,u=e.bit_pos,d=c&1<<u;return(0,o.createComponentVNode)(2,a.Button,{width:2,height:2,color:d?"green":"red",onClick:function(){i("config_switch",{switch_flicked:u}),l(c^1<<u)}})};t.Bombsim=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=(0,o.createComponentVNode)(2,a.Button,{icon:"burst",disabled:!d.is_ready,onClick:function(){return u("simulate")},children:"Begin Simulation"});return(0,o.createComponentVNode)(2,i.Window,{width:400,height:d.panel_open?400:300,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,c.TankInfo,{tank:d.tank_one,tankNum:1})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,c.TankInfo,{tank:d.tank_two,tankNum:2})})]}),(0,o.createComponentVNode)(2,a.Section,{mt:1,title:"Simulator",buttons:s,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Simulation",children:null!==d.vr_bomb?"ACTIVE":"INACTIVE"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:d.readiness_dialogue}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cooldown",children:d.is_ready?"None":d.cooldown})]})}),d.panel_open?(0,o.createComponentVNode)(2,l):""]})})}},71650:function(){},15094:function(e,t,n){"use strict";t.__esModule=!0,t.BugReportForm=t.InputTitle=t.Textarea=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381),l=function(e,t){return(0,o.createVNode)(128,"textarea",null,e.defaultText,0,{rows:4,style:{"overflow-y":"hidden",width:"100%","background-color":"black",border:"solid 1px #6992c2",color:"white"},onInput:function(e){e.target.style.height="auto",e.target.style.height=e.target.scrollHeight+"px"},id:e.id,placeholder:e.placeholder})};t.Textarea=l;var u=function(e,t){return(0,o.createVNode)(1,"h2",null,[e.children,e.required&&(0,o.createVNode)(1,"span",null," *",0,{style:{color:"red"}})],0)};t.InputTitle=u;t.BugReportForm=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=(n.data,(0,r.useLocalState)(t,"is_secret",!1)),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"tag","MINOR"),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Bug Report Form",width:600,height:700,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{style:{"text-align":"center"},children:(0,o.createVNode)(1,"a",null,"If you have a GitHub account click here instead",16,{href:"https://github.com/goonstation/goonstation/issues/new?assignees=&labels=&template=bug_report.yml",target:"_blank",rel:"noreferrer",style:{color:"#6992c2"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Title"}),(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"title"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Tags",0),[["Trivial","TRIVIAL","A bug that is extremely trivial, such as a spelling issue."],["Minor","MINOR","A bug that does not impact usage of a feature. These are often visual issues."],["Major","MAJOR","A bug that significantly impacts the usage of a feature."],["Critical","CRITICAL","A bug that significantly impacts the progression of the round."]].map((function(e){return(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:e[1]===h,onClick:function(){return C(e[1])},tooltip:e[2],tooltipPosition:"bottom",children:e[0]},e[1])}))]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Description"}),"Give a short description of the bug",(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"description"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Steps To Reproduce"}),"Give a list of steps to reproduce this issue",(0,o.createComponentVNode)(2,l,{id:"steps",placeholder:"1.\n2.\n3."})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createComponentVNode)(2,u,{required:!0,children:"Expected Behavior"}),"Give a short description of what you expected to happen",(0,o.createComponentVNode)(2,a.Input,{width:"100%",id:"expected_behavior"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Additional Information & Screenshots",0),"Add screenshots and any other information here",(0,o.createComponentVNode)(2,l,{id:"additional"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:[(0,o.createVNode)(1,"h2",null,"Is this bug an exploit or related to secret content?",0),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:p,onClick:function(){m(!p)},children:"Exploit / Secret"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{my:2,children:(0,o.createComponentVNode)(2,a.Flex,{style:{"justify-content":"center"},children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mx:1,children:(0,o.createVNode)(1,"div","Button Button--color--default","Submit",0,{onClick:function(){var e={};e.secret=p,e.tags=[h],e.steps=document.getElementById("steps").value,e.additional=document.getElementById("additional").value,e.title=document.getElementById("title").getElementsByTagName("input")[0].value,e.description=document.getElementById("description").getElementsByTagName("input")[0].value,e.expected_behavior=document.getElementById("expected_behavior").getElementsByTagName("input")[0].value,e.title&&e.description&&e.expected_behavior&&e.steps?d("confirm",e):alert("Please fill out all required fields!")}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{mx:1,children:(0,o.createVNode)(1,"div","Button Button--color--default","Cancel",0,{onClick:function(){return d("cancel")}})})]})})]})})})})}},65101:function(e,t,n){"use strict";t.__esModule=!0,t.CAViewer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.CAViewer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.CAType,d=l.CAData,s=(l.viewWidth,l.typeData),p=l.settings;return(0,o.createComponentVNode)(2,i.Window,{title:"Cellular Automata Viewer",width:900,height:800,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:u}),buttons:(0,o.createComponentVNode)(2,a.Dropdown,{displayText:"CA Type",width:20,options:Object.keys(s),onSelected:function(e){return c("set_ca",{name:"default",priority:10,type:e})}}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{ml:2}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Description",children:"Description Goes here?"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:4}),u&&s[u].options&&Object.keys(s[u].options).length?Object.keys(s[u].options).map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:s[u].options[e],children:(0,o.createComponentVNode)(2,a.NumberInput,{value:p[s[u].options[e]],minValue:0,maxValue:500,stepPixelSize:5,width:"39px",onDrag:function(t,n){return c("settings",{name:s[u].options[e],data:n})}})},t)})):""]}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return c("generate")},children:"Generate"})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{preserveWhitespace:!0,fontFamily:"Consolas",children:d.replace(/0/g,"-").replace(/(.{100})/g,"$1\n")})})]})})})}},57399:function(e,t,n){"use strict";t.__esModule=!0,t.Cashreg=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381);t.Cashreg=function(e,t){var n=(0,a.useBackend)(t),r=n.act,u=n.data,d=u.active_transaction,s=u.amount,p=u.is_authorised,m=u.is_owner,f=u.name,h=u.owner,C=u.tip_proportion;return(0,o.createComponentVNode)(2,c.Window,{title:f,theme:"ntos",height:240,width:300,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{className:"cashreg__ownerbutton",color:"blue",disabled:d,onClick:h?(p||m)&&function(){return r("reset")}:function(){return r("swipe_owner")},tooltip:h&&(p||m)&&"Click to remove ownership",width:"100%",children:h?"Owner: "+h:"Swipe ID to own"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:m?(0,o.createComponentVNode)(2,i.Tooltip,{content:s?"Click to clear transaction":"Click to set price",children:(0,o.createComponentVNode)(2,l)}):(0,o.createComponentVNode)(2,l)}),h&&(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{align:"center",className:"cashreg__tip",color:"blue",disabled:!s||d,onClick:function(){return r("set_tip")},width:"100%",children:"Tip: "+100*C+"%"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{align:"center",className:"cashreg__pay",color:"blue",disabled:!s||d,onClick:function(){return r("swipe_payer")},width:"100%",children:"Swipe ID to pay"})})]})})]})})})};var l=function(e,t){var n=(0,a.useBackend)(t),c=n.act,l=n.data,u=l.amount,d=l.is_owner,s=l.owner,p=l.tip_amount,m=l.tip_proportion,f=l.total;return(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,align:"center",justify:"space-around",className:(0,r.classes)(["cashreg__centerpart",s&&d&&"cashreg__amount"]),onClick:s&&d&&(u?function(){return c("clear_transaction")}:function(){return c("set_amount")}),children:s?u?(0,o.createVNode)(1,"table","cashreg__table",(0,o.createVNode)(1,"tbody",null,[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Amount",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",u+"\u2abd",0)],4),!!m&&(0,o.createFragment)([(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Tip (%)",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",100*m+"%",0)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Tip (\u2abd)",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",p+"\u2abd",0)],4)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Total",0),(0,o.createVNode)(1,"td","cashreg__table_cellright",f+"\u2abd",0)],4)],0),2):(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:d?"Enter amount":"Owner must enter amount"}):(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:"Please register owner"})})}},48341:function(e,t,n){"use strict";t.__esModule=!0,t.CentComViewer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var u=function(e,t){for(var n,o=36e5,r=864e5,a=[{interval:1e3,label:"second"},{interval:6e4,label:"minute"},{interval:o,label:"hour"},{interval:r,label:"day"},{interval:2592e6,label:"month"},{interval:31536e6,label:"year"}],i=new Date(t)-new Date(e),l=c(a.reverse());!(n=l()).done;){var u=n.value,d=u.interval,s=u.label;if(i>=d){var p=Number((i/d).toFixed(2));return p+" "+s+(1===p?"":"s")}}return"Permanent"},d=function(e){var t=e.ban,n=t.bannedOn,r=t.expires,i=t.jobs,c=t.reason,l=t.sourceName,d=t.type,s=t.unbannedBy,p=new Date(r)<new Date,m="";return t.active&&!p?m="Banned":!s&&p?m="Expired":s&&(m="Unbanned"),(0,o.createComponentVNode)(2,a.Section,{title:d+" Ban | "+l,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Banned",children:new Date(n).toLocaleString("en-US",{year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Length",children:u(n,r)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reason",children:c}),i&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Jobs",children:i.join(", ")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",color:"Banned"===m?"bad":"Expired"===m?"average":"good",children:m})]})})},s=function(e){var t=e.banData,n=e.filterInactive?t.filter((function(e){return e.active})):t;return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:n.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,d,{ban:e})},t)}))})},p=function(e,t){var n=(0,r.useBackend)(t).data,a=n.banData,i=n.filterInactive;return(0,o.createComponentVNode)(2,s,{banData:a,filterInactive:i})};t.CentComViewer=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.key,d=l.filterInactive;return(0,o.createComponentVNode)(2,i.Window,{title:"CentCom Viewer",width:"650",height:"500",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createFragment)(["Ban Data for ",(0,o.createComponentVNode)(2,a.Input,{width:"50vw",value:u,onChange:function(e,t){return c("updateKey",{value:t})}})],0),buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:d,onClick:function(){return c("toggle-filterInactive")},children:"Filter Inactive"})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:(0,o.createComponentVNode)(2,p)})})})]})})})}},96074:function(e,t,n){"use strict";t.__esModule=!0,t.CharacterTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=function(e,t){var n=e.id,i=e.color,c=e.style,l=(0,r.useBackend)(t),u=l.act;l.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.ColorButton,{color:i,onClick:function(){return u("update-detail-color",{id:n})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-left",onClick:function(){return u("update-detail-style-cycle",{id:n,direction:-1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return u("update-detail-style-cycle",{id:n,direction:1})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("update-detail-style",{id:n})},children:c})],4)},c=function(e,t){var n=e.slot_id,i=(0,r.useBackend)(t),c=i.act,l=i.data;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("pick_part",{slot_id:n})},tooltip:l.partsData[n].name,children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,width:"64px",height:"64px",src:"data:image/png;base64,"+l.partsData[n].img,backgroundColor:"transparent"})})};t.CharacterTab=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Appearance",buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.randomAppearance,onClick:function(){return l("update-randomAppearance")},children:"Random appearance"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Skin Tone",children:[(0,o.createComponentVNode)(2,a.ColorButton,{color:u.skinTone,onClick:function(){return l("update-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"angle-double-left",onClick:function(){return l("decrease-skinTone",{alot:1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-left",onClick:function(){return l("decrease-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return l("increase-skinTone")}}),(0,o.createComponentVNode)(2,a.Button,{icon:"angle-double-right",onClick:function(){return l("increase-skinTone",{alot:1})}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Eye Color",children:(0,o.createComponentVNode)(2,a.ColorButton,{color:u.eyeColor,onClick:function(){return l("update-eyeColor")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Top Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom3",color:u.customColor3,style:u.customStyle3})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Middle Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom2",color:u.customColor2,style:u.customStyle2})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bottom Detail",children:(0,o.createComponentVNode)(2,i,{id:"custom1",color:u.customColor1,style:u.customStyle1})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Special Style",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-specialStyle")},children:u.specialStyle||"default"})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Underwear",children:(0,o.createComponentVNode)(2,i,{id:"underwear",color:u.underwearColor,style:u.underwearStyle})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bionics",children:[(0,o.createComponentVNode)(2,c,{slot_id:"r_arm"}),(0,o.createComponentVNode)(2,c,{slot_id:"l_arm"}),(0,o.createComponentVNode)(2,a.Box,{children:["Trait points:"," ",(0,o.createComponentVNode)(2,a.Box,{as:"span",color:u.traitsPointsTotal>0?"good":"bad",children:u.traitsPointsTotal})]})]}),(0,o.createComponentVNode)(2,a.LabeledList.Divider)]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Sounds",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Fart",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-fartsound")},children:u.fartsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{fartsound:1})},children:"Preview"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scream",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-screamsound")},children:u.screamsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{screamsound:1})},children:"Preview"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Chat",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("update-chatsound")},children:u.chatsound}),(0,o.createComponentVNode)(2,a.Button,{icon:"volume-up",onClick:function(){return l("previewSound",{chatsound:1})},children:"Preview"})]})]})})],4)}},56374:function(e,t,n){"use strict";t.__esModule=!0,t.GameSettingsTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(59576);t.GameSettingsTab=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Popup Font Size",buttons:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-fontSize",{reset:1})},children:"Reset"}),children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Changes the font size used in popup windows. Only works when CHUI is disabled."}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-fontSize")},children:l.fontSize?l.fontSize+"%":"Default"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Messages",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Toggles if certain messages are shown in the chat window by default. You can change these mid-round by using the Toggle OOC/LOOC commands under the Commands tab in the top right."}),l.isMentor?(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.seeMentorPms,onClick:function(){return c("update-seeMentorPms")},children:"Display Mentorhelp"})}):null,(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.listenOoc,onClick:function(){return c("update-listenOoc")},tooltip:"Out-of-Character chat. This mostly just shows up on the RP server and at the end of rounds.",children:"Display OOC chat"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.listenLooc,onClick:function(){return c("update-listenLooc")},tooltip:"Local Out-of-Character is OOC chat, but only appears for nearby players. This is basically only used on the RP server.",children:"Display LOOC chat"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!l.flyingChatHidden,onClick:function(){return c("update-flyingChatHidden")},tooltip:"Chat messages will appear over characters as they're talking.",children:"See chat above people's heads"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.autoCapitalization,onClick:function(){return c("update-autoCapitalization")},tooltip:"Chat messages you send will be automatically capitalized.",children:"Auto-capitalize your messages"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.localDeadchat,onClick:function(){return c("update-localDeadchat")},tooltip:"You'll only hear chat messages from living people on your screen as a ghost.",children:"Local ghost hearing"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"HUD Theme",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-hudTheme")},children:"Change"})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+l.hudThemePreview,width:"32px",height:"32px"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Targeting Cursor",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-targetingCursor")},children:"Change"})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+l.targetingCursorPreview,width:"32px",height:"32px"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Tooltips",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Tooltips can appear when hovering over items. These tooltips can provide bits of information about the item, such as attack strength, special moves, etc."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Always,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Always})},children:"Show Always"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Alt,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Alt})},children:"Show When ALT is held"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tooltipOption===i.CharacterPreferencesTooltip.Never,onClick:function(){return c("update-tooltipOption",{value:i.CharacterPreferencesTooltip.Never})},children:"Never Show"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"tgui",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"TGUI is the UI framework we use for some game windows, and it comes with options!"}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tguiFancy,onClick:function(){return c("update-tguiFancy")},children:"Makes TGUI windows look better, at the cost of compatibility."})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.tguiLock,onClick:function(){return c("update-tguiLock")},children:"Locks TGUI windows to your main monitor."})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Popups",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"These options toggle the popups that appear when logging in and at the end of a round."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewChangelog,onClick:function(){return c("update-viewChangelog")},tooltip:"The changelog can be shown at any time by using the 'Changelog' command, under the Commands tab in the top right.",tooltipPosition:"top",children:"Auto-open changelog"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewScore,onClick:function(){return c("update-viewScore")},tooltip:"The end-of-round scoring shows various stats on how the round went. If this option is off, you won't be able to see it.",tooltipPosition:"top",children:"Auto-open end-of-round score"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.viewTickets,onClick:function(){return c("update-viewTickets")},tooltip:"The end-of-round ticketing summary shows the various tickets and fines that were handed out. If this option is off, you can still see them on Goonhub (goonhub.com).",tooltipPosition:"top",children:"Auto-open end-of-round ticket summary"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Controls",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"Various options for how you control your character and the game."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useClickBuffer,onClick:function(){return c("update-useClickBuffer")},tooltip:"There is a cooldown after clicking on things in-game. When enabled, if you click something during this cooldown, the game will apply that click after the cooldown. Otherwise, the click is ignored.",tooltipPosition:"top",children:"Queue Combat Clicks"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useWasd,onClick:function(){return c("update-useWasd")},tooltip:"Enabling this allows you to use WASD to move instead of the arrow keys, and enables a few other hotkeys.",tooltipPosition:"top",children:"Use WASD Mode"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.useAzerty,onClick:function(){return c("update-useAzerty")},tooltip:"If you have an AZERTY keyboard, enable this. Yep. This sure is a tooltip.",tooltipPosition:"top",children:"Use AZERTY Keyboard Layout"})}),(0,o.createComponentVNode)(2,a.Box,{color:"label",children:"Familiar with /tg/station controls? You can enable/disable them under the Game/Interface menu in the top left."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scroll Targeting",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",color:"label",children:"This option allows you to change which limb to target with the scroll wheel."}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Always,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Always})},children:"Always"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Hover,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Hover})},children:"When hovering over targeting doll"})}),(0,o.createComponentVNode)(2,a.Box,{mb:"5px",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.scrollWheelTargeting===i.CharacterPreferencesScrollTarget.Never,onClick:function(){return c("update-scrollWheelTargeting",{value:i.CharacterPreferencesScrollTarget.Never})},children:"Never"})})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Preferred Map",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("update-preferredMap")},children:l.preferredMap?l.preferredMap:(0,o.createComponentVNode)(2,a.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Examine help",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.helpTextInExamine,onClick:function(){return c("update-helpTextInExamine")},tooltip:"If help messages in examine text annoy you, you can turn them off here. They will still be available by alt+doubleclicking the item or in the right click menu.",tooltipPosition:"top",children:"See help messages when you examine?"})})]})})}},57368:function(e,t,n){"use strict";t.__esModule=!0,t.GeneralTab=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949);t.GeneralTab=function(e,t){var n,c=(0,a.useBackend)(t),l=c.act,u=c.data,d=function(e){return e.length>200?e.substring(0,200)+"\u2026":e};return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:"Records",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Name",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:u.randomName,onClick:function(){return l("update-randomName")},children:"Random"}),children:[(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameFirst")},children:u.nameFirst}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameMiddle")},color:""===u.nameMiddle?"grey":"default",children:""!==u.nameMiddle?u.nameMiddle:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-nameLast")},children:u.nameLast})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Gender",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-gender")},children:u.gender})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Pronouns",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pronouns")},children:u.pronouns})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Age",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-age")},children:u.age})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Blood Type",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-bloodType")},children:u.bloodRandom?(0,o.createComponentVNode)(2,i.Box,{as:"span",italic:!0,children:"Random"}):u.bloodType})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Bank PIN",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:!u.pin,onClick:function(){return l("update-pin",{random:!!u.pin})},children:"Random"}),children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pin")},children:null!=(n=u.pin)?n:(0,o.createComponentVNode)(2,i.Box,{as:"span",italic:!0,children:"Random"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Flavor Text",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-flavorText")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.flavorText?(0,r.decodeHtmlEntities)(u.flavorText):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Security Note",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-securityNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.securityNote?(0,r.decodeHtmlEntities)(u.securityNote):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Medical Note",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-medicalNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.medicalNote?(0,r.decodeHtmlEntities)(u.medicalNote):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Syndicate Intelligence",buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-syndintNote")},icon:"wrench",children:"Edit"}),children:(0,o.createComponentVNode)(2,i.BlockQuote,{children:u.syndintNote?d((0,r.decodeHtmlEntities)(u.syndintNote)):(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Other names",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Preferred Cyborg Name",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-robotName")},color:u.robotName?"default":"grey",children:u.robotName?u.robotName:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})})}),(0,o.createComponentVNode)(2,i.Section,{title:"PDA",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Ringtone",children:[(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("update-pdaRingtone")},children:u.pdaRingtone}),(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return l("previewSound",{pdaRingtone:1})},icon:"volume-up",children:"Preview"})]}),(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Background Color",children:(0,o.createComponentVNode)(2,i.ColorButton,{color:u.pdaColor,onClick:function(){return l("update-pdaColor")}})})]})})],4)}},70712:function(e,t,n){"use strict";t.__esModule=!0,t.SavesTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.SavesTab=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,a.Section,{title:"Cloud Saves",children:l.cloudSaves?(0,o.createFragment)([l.cloudSaves.map((function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,i,{name:e,index:t}),(0,o.createComponentVNode)(2,a.Divider)],4,e)})),(0,o.createComponentVNode)(2,a.Box,{mt:"5px",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-new")},children:"Create new save"})})],0):(0,o.createComponentVNode)(2,a.Box,{italic:!0,color:"label",children:"Cloud saves could not be loaded."})})};var i=function(e,t){var n=e.name,i=e.index,c=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cloud save "+(i+1),buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-load",{name:n})},children:"Load"}),(0,o.createTextVNode)(" -"),(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("cloud-save",{name:n})},children:"Save"}),(0,o.createTextVNode)(" -"),(0,o.createTextVNode)(" "),(0,o.createComponentVNode)(2,a.Button.Confirm,{onClick:function(){return c("cloud-delete",{name:n})},content:"Delete"})],0),children:n})})}},30709:function(e,t,n){"use strict";t.__esModule=!0,t.TraitsTab=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(25808);function l(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var d=function(e,t){return e.name.localeCompare(t.name,"en",{sensitivity:"base"})};t.TraitsTab=function(e,t){for(var n,r=(0,a.useBackend)(t),u=r.act,p=r.data,m=(0,a.useLocalState)(t,"filter-available",!1),f=m[0],h=m[1],C={},g=p.traitsAvailable.map((function(e){return Object.assign({},e,p.traitsData[e.id])})),N=l(g);!(n=N()).done;)for(var v,b=n.value,V=l(b.category&&b.category.length>0?b.category:["uncategorized"]);!(v=V()).done;){var y=v.value;C[y]||(C[y]=[]),C[y].push(b)}var x=Object.keys(C).sort();x.includes("uncategorized")&&(x=[].concat(x.filter((function(e){return"uncategorized"!==e})),["uncategorized"]));var k=p.traitsAvailable.filter((function(e){return e.selected})).length;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{children:["Available points:"," ",(0,o.createComponentVNode)(2,i.Box,{as:"span",color:p.traitsPointsTotal>0?"good":"bad",children:p.traitsPointsTotal})]}),(0,o.createComponentVNode)(2,i.Divider)]}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Available",fill:!0,scrollable:!0,buttons:(0,o.createComponentVNode)(2,c.ButtonCheckbox,{checked:f,onClick:function(){return h(!f)},children:"Filter available"}),children:x.map((function(e){var t=C[e];return(0,o.createComponentVNode)(2,s,{category:e,traits:t.filter((function(e){return!e.selected})).filter((function(e){return!f||e.available})).sort(d)},e)}))})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Selected ("+k+"/"+p.traitsMax+")",fill:!0,scrollable:!0,buttons:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return u("reset-traits")},children:"Reset traits"}),children:x.map((function(e){var t=C[e];return(0,o.createComponentVNode)(2,s,{category:e,traits:t.filter((function(e){return e.selected})).sort(d)},e)}))})})]})})]})})};var s=function(e,t){var n=e.category,a=e.traits;return 0===a.length?null:(0,o.createComponentVNode)(2,i.Collapsible,{title:(0,r.toTitleCase)(n),open:!0,children:a.map((function(e,t){return(0,o.createFragment)([0!==t&&(0,o.createComponentVNode)(2,i.Divider),(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e)))],0,e.id)}))})},p=function(e,t){var n=(0,a.useBackend)(t).act,r=e.id,c=e.name,l=e.desc,u=e.points,d=e.selected,s=e.available,p=e.img;return(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Image,{pixelated:!0,width:"32px",height:"32px",src:"data:image/png;base64,"+p,backgroundColor:"transparent"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:[(0,o.createComponentVNode)(2,i.Stack,{align:"center",mb:1,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:[c," ",(0,o.createComponentVNode)(2,i.Box,{as:"span",color:u<0?"bad":u>0?"good":"label",children:["(",u>0?"+":"",u,")"]})]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{disabled:!s,icon:d?"minus":"plus",onClick:function(){return n(d?"unselect-trait":"select-trait",{id:r})},children:d?"Remove":"Add"})})]}),(0,o.createComponentVNode)(2,i.BlockQuote,{children:l})]})]})}},4098:function(e,t,n){"use strict";t.__esModule=!0,t.CharacterPreferences=void 0;var o=n(96323),r=n(57890),a=n(31246),i=n(26949),c=n(2381),l=n(96074),u=n(56374),d=n(57368),s=n(70712),p=n(30709),m=n(59576),f=0;t.CharacterPreferences=function(e,t){var n=(0,a.useBackend)(t),C=n.act,g=n.data,N=(0,a.useLocalState)(t,"menu",m.CharacterPreferencesTabKeys.General),v=N[0],b=N[1];return(0,o.createComponentVNode)(2,c.Window,{width:600,height:750,title:"Character Setup",children:(0,o.createComponentVNode)(2,c.Window.Content,{onKeyDown:function(e){if(!(v!==m.CharacterPreferencesTabKeys.General&&v!==m.CharacterPreferencesTabKeys.Character||e.keyCode!==r.KEY_LEFT&&e.keyCode!==r.KEY_RIGHT)){if(e.preventDefault(),f>performance.now())return;f=performance.now()+125;var t="rotate-counter-clockwise";e.keyCode===r.KEY_RIGHT&&(t="rotate-clockwise"),C(t)}},children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,h)}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Tabs,{children:[(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.General,onClick:function(){return b(m.CharacterPreferencesTabKeys.General)},children:"General"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Character,onClick:function(){return b(m.CharacterPreferencesTabKeys.Character)},children:"Appearance"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{onClick:function(){return C("open-occupation-window")},children:"Occupation"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Traits,onClick:function(){return b(m.CharacterPreferencesTabKeys.Traits)},children:"Traits"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.GameSettings,onClick:function(){return b(m.CharacterPreferencesTabKeys.GameSettings)},children:"Game Settings"}),(0,o.createComponentVNode)(2,i.Tabs.Tab,{selected:v===m.CharacterPreferencesTabKeys.Saves,onClick:function(){return b(m.CharacterPreferencesTabKeys.Saves)},children:"Cloud Saves"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:"1",children:[(v===m.CharacterPreferencesTabKeys.General||v===m.CharacterPreferencesTabKeys.Character)&&(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:0,grow:"1",children:(0,o.createComponentVNode)(2,i.Section,{scrollable:!0,fill:!0,children:[v===m.CharacterPreferencesTabKeys.General&&(0,o.createComponentVNode)(2,d.GeneralTab),v===m.CharacterPreferencesTabKeys.Character&&(0,o.createComponentVNode)(2,l.CharacterTab)]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:[(0,o.createComponentVNode)(2,i.ByondUi,{params:{id:g.preview,type:"map"},style:{width:"64px",height:"128px"}}),(0,o.createComponentVNode)(2,i.Box,{textAlign:"center",mt:"5px",children:[(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-left",onClick:function(){return C("rotate-counter-clockwise")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-right",onClick:function(){return C("rotate-clockwise")}})]})]})})]}),(v===m.CharacterPreferencesTabKeys.GameSettings||v===m.CharacterPreferencesTabKeys.Saves)&&(0,o.createComponentVNode)(2,i.Section,{scrollable:!0,fill:!0,children:[v===m.CharacterPreferencesTabKeys.GameSettings&&(0,o.createComponentVNode)(2,u.GameSettingsTab),v===m.CharacterPreferencesTabKeys.Saves&&(0,o.createComponentVNode)(2,s.SavesTab)]}),v===m.CharacterPreferencesTabKeys.Traits&&(0,o.createComponentVNode)(2,p.TraitsTab)]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Button.Confirm,{content:"Reset All",onClick:function(){return C("reset")}})})})]})})})};var h=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data,l=c.profiles.findIndex((function(e){return e.active}));return(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:c.profiles.map((function(e,t){return(0,o.createComponentVNode)(2,i.Stack.Item,{basis:0,grow:1,children:(0,o.createComponentVNode)(2,C,{profile:e,index:t})},t)}))})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Profile Name",buttons:l>-1?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("load",{index:l+1})},children:"Reload"})," - ",(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("save",{index:l+1})},icon:c.profileModified?"exclamation-triangle":undefined,color:c.profileModified?"danger":undefined,tooltip:c.profileModified?"You may have unsaved changes! Any unsaved changes will take effect for this round only.":undefined,tooltipPosition:"left",children:"Save"})],0):null,children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return r("update-profileName")},children:c.profileName?c.profileName:(0,o.createComponentVNode)(2,i.Box,{italic:!0,children:"None"})})})})})})]})},C=function(e,t){var n=e.index,r=e.profile,c=(0,a.useBackend)(t).act;return(0,o.createComponentVNode)(2,i.Section,{title:"Profile "+(n+1),textAlign:"center",backgroundColor:r.active?"rgba(0, 0, 0, 0.10)":null,fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,fill:!0,justify:"space-between",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:r.name?(0,o.createComponentVNode)(2,i.Box,{children:r.name}):(0,o.createComponentVNode)(2,i.Box,{italic:!0,color:"label",children:"Empty"})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{disabled:!r.name,onClick:function(){return c("load",{index:n+1})},children:"Load"})," - ",(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("save",{index:n+1})},children:"Save"})]})]})})}},59576:function(e,t){"use strict";var n,o,r;t.__esModule=!0,t.CharacterPreferencesScrollTarget=t.CharacterPreferencesTooltip=t.CharacterPreferencesTabKeys=void 0,t.CharacterPreferencesTabKeys=n,function(e){e[e.Saves=0]="Saves",e[e.General=1]="General",e[e.Character=2]="Character",e[e.Traits=3]="Traits",e[e.GameSettings=4]="GameSettings"}(n||(t.CharacterPreferencesTabKeys=n={})),t.CharacterPreferencesTooltip=o,function(e){e[e.Always=1]="Always",e[e.Never=2]="Never",e[e.Alt=3]="Alt"}(o||(t.CharacterPreferencesTooltip=o={})),t.CharacterPreferencesScrollTarget=r,function(e){e[e.Never=1]="Never",e[e.Hover=2]="Hover",e[e.Always=3]="Always"}(r||(t.CharacterPreferencesScrollTarget=r={}))},78979:function(e,t,n){"use strict";t.__esModule=!0,t.ChemChute=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ChemChute=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.productList);return(0,o.createComponentVNode)(2,i.Window,{title:"Medical supply chute console",width:355,height:500,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Dispensary interlink stock view",height:"100%",children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"stretch",style:{"border-bottom":"1px #555 solid"},children:[(0,o.createComponentVNode)(2,a.Flex.Item,{direction:"row",children:e.img&&(0,o.createComponentVNode)(2,a.Box,{style:{overflow:"show",height:"24px"},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+e.img,style:{transform:"translate(0, -4px)"}})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{direction:"row",grow:!0,style:{display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,italic:!0,children:[e.amount+" x","\xa0"]}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:e.name})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{bold:!0,direction:"row",style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"}})]},e.name)}))})})})}},28487:function(){},56915:function(e,t,n){"use strict";t.__esModule=!0,t.ChemGroups=t.BeakerContentsGraph=t.Beaker=t.ReagentDispenser=t.ChemDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(48175),u=[{id:0,icon:"sort-amount-down",contents:"",compareFunction:function(e,t){return t.volume-e.volume}},{id:1,icon:"sort-amount-up",contents:"",compareFunction:function(e,t){return e.volume-t.volume}},{id:2,contents:"Density",compareFunction:function(e,t){return e.state-t.state}},{id:3,contents:"Order Added",compareFunction:function(){return 1}}];t.ChemDispenser=function(e,t){return(0,o.createComponentVNode)(2,i.Window,{width:570,height:730,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,s),(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m)]})})})};var d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.beakerName,d=l.container,s=(0,r.useSharedState)(t,"addAmount",10),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"iconToggle",!1),h=f[0],C=f[1],g=(0,r.useLocalState)(t,"hoverOver",""),N=g[0],v=g[1],b=l.dispensableReagents||[];return(0,o.createComponentVNode)(2,a.Section,{fontSize:"12px",title:(0,o.createFragment)([(0,o.createTextVNode)("Dispense"),(0,o.createComponentVNode)(2,a.Box,{as:"span",ml:18,children:["Icons:",(0,o.createComponentVNode)(2,a.Button,{width:2,textAlign:"center",backgroundColor:"rgba(0, 0, 0, 0)",textColor:h?"rgba(255, 255, 255, 0.5)":"rgba(255, 255, 255, 1)",onClick:function(){return C(!1)},children:(0,o.createComponentVNode)(2,a.Icon,{mr:1,name:"circle"})}),(0,o.createComponentVNode)(2,a.Button,{width:2,backgroundColor:"rgba(0, 0, 0, 0)",textColor:h?"rgba(255, 255, 255, 1)":"rgba(255, 255, 255, 0.5)",onClick:function(){return C(!0)},children:(0,o.createComponentVNode)(2,a.Icon,{name:"tint"})})]})],4),buttons:(0,o.createComponentVNode)(2,a.Box,{children:["Dispense Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:p,format:function(e){return e+"u"},width:4,minValue:1,maxValue:100,onDrag:function(e,t){return m(t)}})]}),children:[(0,o.createComponentVNode)(2,a.Section,{fitted:!0,backgroundColor:"rgba(0,0,0,0)",children:[!d||d.maxVolume===d.totalVolume&&(0,o.createComponentVNode)(2,a.Modal,{className:"chem-dispenser__labels",fontSize:"20px",mr:2,p:3,children:(0,o.createComponentVNode)(2,a.Box,{children:d?d.name+" Full":"No "+u+" Inserted"})}),b.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__dispense-buttons",align:"left",width:"130px",onMouseEnter:function(){return v(e.id)},onMouseLeave:function(){return v("")},disabled:(null==d?void 0:d.maxVolume)===(null==d?void 0:d.totalVolume),lineHeight:1.75,onClick:function(){return i("dispense",{amount:p,reagentId:e.id})},children:[(0,o.createComponentVNode)(2,a.Icon,{color:"rgba("+e.colorR+","+e.colorG+", "+e.colorB+", 1)",name:h?c.MatterStateIconMap[e.state].icon:"circle",pt:1,style:{"text-shadow":"0 0 3px #000"}}),e.name]},t)}))]}),(0,o.createComponentVNode)(2,a.Box,{italic:!0,pt:.5,children:[" ","Reagent ID: "+N]})]})};t.ReagentDispenser=d;var s=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.beakerName,d=l.container,s=(0,r.useSharedState)(t,"iconToggle",!1)[0],p=(0,r.useSharedState)(t,"removeAmount",10),m=p[0],f=p[1],h=[m,10,5,1];return(0,o.createComponentVNode)(2,a.Section,{fontSize:"12px",title:(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__buttons",icon:"eject",onClick:function(){return i("eject")},children:d?"Eject "+d.name+" ("+d.totalVolume+"/"+d.maxVolume+")":"Insert "+u}),buttons:(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Remove Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{width:4,format:function(e){return e+"u"},value:m,minValue:1,maxValue:100,onDrag:function(e,t){return f(t)}})]}),children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{bold:!0,collapsing:!0,textAlign:"center"}),(0,o.createComponentVNode)(2,a.Table.Cell,{collapsing:!0})]}),(0,o.createComponentVNode)(2,c.ReagentList,{container:d,height:"auto",showState:s,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"filter",onClick:function(){return i("isolate",{reagentId:e.id})},children:"Isolate"}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return i("all",{amount:m,reagentId:e.id})},children:"All"}),h.map((function(t,n){return(0,o.createComponentVNode)(2,a.Button,{icon:"minus",onClick:function(){return i("remove",{amount:t,reagentId:e.id})},children:t},n)}))],0)},renderButtonsDeps:m})]})};t.Beaker=s;var p=function(e,t){var n=(0,r.useBackend)(t).data,i=(0,r.useSharedState)(t,"sort",1),d=i[0],s=i[1],p=n.container;return(0,o.createComponentVNode)(2,a.Section,{align:"center",p:.5,title:(0,o.createComponentVNode)(2,a.Tabs,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{fontSize:"11px",textAlign:"center",align:"center",selected:d===e.id,onClick:function(){return s(e.id)},children:[e.icon&&(0,o.createComponentVNode)(2,a.Icon,{name:e.icon}),e.contents]},t)}))}),children:[(0,o.createComponentVNode)(2,c.ReagentGraph,{container:p,sort:u[d].compareFunction}),!(!p||!p.totalVolume)&&(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,l.getTemperatureColor)(p.temperature),className:"ChemHeater__TemperatureNumber",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,l.getTemperatureIcon)(p.temperature),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:p.temperature})," K"]})]})};t.BeakerContentsGraph=p;var m=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useLocalState)(t,"groupName",""),u=l[0],d=l[1],s=(0,r.useLocalState)(t,"reagents",""),p=s[0],m=s[1],f=c.groupList,h=c.idCardName,C=c.idCardInserted,g=c.isRecording,N=c.activeRecording;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Reagent Groups",buttons:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{className:"chem-dispenser__buttons",icon:"eject",onClick:function(){return i("card")},children:C?"Eject ID: "+h:"Insert ID"}),(0,o.createComponentVNode)(2,a.Button,{color:"red",className:"chem-dispenser__buttons",icon:"circle",onClick:function(){return i("record")},children:g?"Stop":"Record"}),(0,o.createComponentVNode)(2,a.Button,{color:"red",className:"chem-dispenser__buttons",icon:"eraser",disabled:!N,onClick:function(){return i("clear_recording")},children:"Clear"})]}),children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Box,{pt:1,pr:7,as:"span",children:"Group Name:"})}),(0,o.createComponentVNode)(2,a.Input,{pl:5,placeholder:"Name",value:u,onInput:function(e,t){return d(t)}}),(0,o.createComponentVNode)(2,a.Box,{as:"span",children:(0,o.createComponentVNode)(2,a.Button,{icon:"plus-circle",lineHeight:1.75,onClick:function(){i("newGroup",{reagents:p,groupName:u}),d(""),m("")},children:"Add Group"})})]}),(0,o.createComponentVNode)(2,a.Box,{pt:.5,italic:!N,color:N?"default":"grey",children:N||"Recording Empty"})]}),!!f.length&&(0,o.createComponentVNode)(2,a.Section,{children:f.map((function(e,t){return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"tint",lineHeight:1.75,onClick:function(){return i("groupDispense",{selectedGroup:e.ref})},children:e.name},t),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",lineHeight:1.75,onClick:function(){return i("deleteGroup",{selectedGroup:e.ref})},children:"Delete"})," "+e.info]},t)}))})],0)};t.ChemGroups=m},95348:function(e,t,n){"use strict";t.__esModule=!0,t.ChemHeater=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381),l=n(48175),u=n(51418);t.ChemHeater=function(e,t){var n=(0,a.useBackend)(t),r=n.act,u=n.data,s=u.containerData,p=u.isActive,m=u.targetTemperature;return(0,o.createComponentVNode)(2,c.Window,{title:"Reagent Heater/Cooler",width:320,height:385,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,d,{container:s,targetTemperature:m,active:p}),(0,o.createComponentVNode)(2,i.Section,{title:"Temperature Control",children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:m,minValue:0,maxValue:1e3,format:function(e){return e+" K"},onDrag:function(e,t){return r("adjustTemp",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,overflow:"hidden",children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,l.getTemperatureColor)(m),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Target"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(m),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:m})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{basis:9.6,align:"center",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",disabled:!(null!=s&&s.totalVolume),color:p?"red":"green",fluid:!0,height:"100%",fontSize:1.25,textAlign:"center",onClick:function(){return r(p?"stop":"start")},children:p?"Deactivate":"Activate"})})]})})]})})};var d=function(e,t){var n,c=(0,a.useBackend)(t).act,d=e.active,s=void 0!==d&&d,p=e.targetTemperature,m=void 0===p?l.freezeTemperature:p,f=null!=(n=e.container)?n:u.NoContainer,h=s&&!f.fake,C=f.temperature,g=f.totalVolume;return(0,o.createComponentVNode)(2,i.SectionEx,{capitalize:!0,title:f.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!e.container,onClick:function(){return c("eject")},children:"Eject"}),children:[(0,o.createComponentVNode)(2,u.ReagentGraph,{container:f}),(0,o.createComponentVNode)(2,u.ReagentList,{container:f}),(0,o.createComponentVNode)(2,i.Box,{className:(0,r.classes)(["ChemHeater__TemperatureBox",h&&"ChemHeater__TemperatureBox__"+(0,l.getTemperatureChangeName)(C,m)]),children:!g||(0,o.createComponentVNode)(2,i.Box,{fontSize:2,color:(0,l.getTemperatureColor)(C),className:"ChemHeater__TemperatureNumber",children:[(0,o.createComponentVNode)(2,i.Icon,{name:"long-arrow-alt-down",className:(0,r.classes)(["ChemHeater__TemperatureArrow",h&&"ChemHeater__TemperatureArrow__"+(0,l.getTemperatureChangeName)(C,m)]),pt:"2px",pr:.25,style:{transform:s?"scaleY("+Math.sign(C-m)+")":"scaleY(0)"}}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(C),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:C})," K"]})}),!e.container&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",fontSize:1.5,onClick:function(){return c("insert")},bold:!0,children:"Insert Beaker"})})]})}},45747:function(e,t,n){"use strict";t.__esModule=!0,t.ChemMaster=t.OperationsSection=t.MakePatches=t.MakePatch=t.MakeBottle=t.MakePills=t.MakePill=t.CheckboxControl=t.MakeButtonControl=t.AmountInputControl=t.IconButtonControl=t.SelectIconModal=t.ReagentDisplay=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.max_volume,l=e.container||c.NoContainer,u=(0,r.useSharedState)(t,"remove_amount",10),d=u[0],s=u[1];return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:l.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{title:"Flush All",icon:"times",color:"red",disabled:!l.totalVolume,onClick:function(){return n("flushall")}}),(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!e.container,onClick:function(){return n("eject")}}),(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Remove Amount: ",(0,o.createComponentVNode)(2,a.NumberInput,{width:4,format:function(e){return e+"u"},value:d,minValue:1,maxValue:i,onDrag:function(e,t){return s(Math.round(t))}})]})],4),children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insert")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:l}),(0,o.createComponentVNode)(2,c.ReagentList,{container:l,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"search",color:"green",title:"Analyze",onClick:function(){return n("analyze",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return n("isolate",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"times",color:"red",title:"Flush all",onClick:function(){return n("flush",{reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"minus",color:"yellow",title:"Flush variable amount of units",bold:!0,onClick:function(){return n("flushinput",{reagent_id:e.id,amount:d})},children:[d,"u"]})],4)},renderButtonsDeps:d})]})};t.ReagentDisplay=l;var u=function(e,t){var n,i,c,l=(0,r.useBackend)(t).data,u=null!=(n=l.pill_icons)?n:[],d=null!=(i=l.bottle_icons)?i:[],s=null!=(c=l.patch_icons)?c:[],p=e.icon_list,m=e.set_icon,f=e.cancel_modal,h=(0,o.createComponentVNode)(2,a.Button,{title:"Cancel",icon:"times",color:"red",mr:1,onClick:function(){return f()}}),C=function(e,t){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){m(t)},children:[(0,o.createComponentVNode)(2,a.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+(0!==p?e[1]:e),style:{"vertical-align":"middle","horizontal-align":"middle"}}),0!==p&&(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",bold:!0,children:[e[0],"u"]})]},t)};return(0,o.createComponentVNode)(2,a.Modal,{full:!0,mx:"auto",backgroundColor:"#1c2734",children:[0===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select pill",buttons:h,minWidth:10,children:u.map(C)}),1===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select bottle",buttons:h,minWidth:12,children:d.map(C)}),2===p&&(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Select patch",buttons:h,minWidth:12,children:s.map(C)})]})};t.SelectIconModal=u;var d=function(e){var t=e.modal_function,n=e.imageb64;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Change type",tooltipPosition:"top",onClick:function(){return t(!0)},children:(0,o.createComponentVNode)(2,a.Image,{height:"32px",width:"32px",pixelated:!0,src:"data:image/png;base64,"+n,style:{"vertical-align":"middle","horizontal-align":"middle"}})})})};t.IconButtonControl=d;var s=function(e){var t=e.set_amount,n=e.current_amount,r=e.max_amount;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{width:5,format:function(e){return e+"u"},value:n,minValue:5,maxValue:r,onDrag:function(e,n){return t(Math.round(n))}})})};t.AmountInputControl=s;var p=function(e){var t=e.text,n=e.onClick;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:n,width:13,children:t})})};t.MakeButtonControl=p;var m=function(e){var t=e.label,n=e.checked,r=e.set_function;return(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,onClick:function(){return r(!n)},children:t})})};t.CheckboxControl=m;var f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.item_name,m=e.max_volume,f=(0,r.useSharedState)(t,"single_pill_amount",m),h=f[0],C=f[1],g=c.pill_icons,N=(0,r.useLocalState)(t,"modal_singlepill",!1),v=N[0],b=N[1],V=(0,r.useSharedState)(t,"icon_singlepill",0),y=V[0],x=V[1],k=function(){return b(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[v&&(0,o.createComponentVNode)(2,u,{icon_list:0,set_icon:function(e){x(e),k()},cancel_modal:k}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:b,imageb64:g?g[y]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create single pill",onClick:function(){return i("makepill",{item_name:l,amount:h,icon:y})}}),(0,o.createComponentVNode)(2,s,{set_amount:C,current_amount:h,max_amount:m})]})]})};t.MakePill=f;var h=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.item_name,f=e.max_volume,h=(0,r.useSharedState)(t,"use_bottle",!0),C=h[0],g=h[1],N=(0,r.useSharedState)(t,"multiple_pills_amount",5),v=N[0],b=N[1],V=c.pill_icons,y=(0,r.useLocalState)(t,"modal_multiplepills",!1),x=y[0],k=y[1],S=(0,r.useSharedState)(t,"icon_multiplepills",0),I=S[0],w=S[1],_=function(){return k(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[x&&(0,o.createComponentVNode)(2,u,{icon_list:0,set_icon:function(e){w(e),_()},cancel_modal:_}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:k,imageb64:V?V[I]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create multiple pills",onClick:function(){return i("makepills",{item_name:l,amount:v,use_bottle:C,icon:I})}}),(0,o.createComponentVNode)(2,s,{set_amount:b,current_amount:v,max_amount:f}),(0,o.createComponentVNode)(2,m,{label:"Use bottle",checked:C,set_function:g})]})]})};t.MakePills=h;var C=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"bottle_amount",50),m=l[0],f=l[1],h=e.item_name,C=c.bottle_icons,g=(0,r.useLocalState)(t,"modal_bottle",!1),N=g[0],v=g[1],b=(0,r.useSharedState)(t,"icon_bottle",2),V=b[0],y=b[1],x=function(){return v(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[N&&(0,o.createComponentVNode)(2,u,{icon_list:1,set_icon:function(e){y(e),f(C[e][0]),x()},cancel_modal:x}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:v,imageb64:C?C[V][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create bottle",onClick:function(){return i("makebottle",{item_name:h,amount:m,bottle:V})}}),(0,o.createComponentVNode)(2,s,{set_amount:f,current_amount:m,max_amount:C?C[V][0]:50})]})]})};t.MakeBottle=C;var g=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"single_patch_amount",30),m=l[0],f=l[1],h=e.item_name,C=c.patch_icons,g=(0,r.useLocalState)(t,"modal_singlepatch",!1),N=g[0],v=g[1],b=(0,r.useSharedState)(t,"icon_singlepatch",1),V=b[0],y=b[1],x=function(){return v(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[N&&(0,o.createComponentVNode)(2,u,{icon_list:2,set_icon:function(e){y(e),f(C[e][0]),x()},cancel_modal:x}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:v,imageb64:C?C[V][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create single patch",onClick:function(){return i("makepatch",{item_name:h,amount:m,patch:V})}}),(0,o.createComponentVNode)(2,s,{set_amount:f,current_amount:m,max_amount:C?C[V][0]:30})]})]})};t.MakePatch=g;var N=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=(0,r.useSharedState)(t,"use_box",!0),f=l[0],h=l[1],C=(0,r.useSharedState)(t,"multiple_patches_amount",30),g=C[0],N=C[1],v=e.item_name,b=c.patch_icons,V=(0,r.useLocalState)(t,"modal_multiplepatches",!1),y=V[0],x=V[1],k=(0,r.useSharedState)(t,"icon_multiplepatches",1),S=k[0],I=k[1],w=function(){return x(!1)};return(0,o.createComponentVNode)(2,a.Box,{children:[y&&(0,o.createComponentVNode)(2,u,{icon_list:2,set_icon:function(e){I(e),N(b[e][0]),w()},cancel_modal:w}),(0,o.createComponentVNode)(2,a.LabeledControls,{width:0,children:[(0,o.createComponentVNode)(2,d,{modal_function:x,imageb64:b?b[S][1]:undefined}),(0,o.createComponentVNode)(2,p,{text:"Create multiple patches",onClick:function(){return i("makepatches",{item_name:v,amount:g,use_box:f,patch:S})}}),(0,o.createComponentVNode)(2,s,{set_amount:N,current_amount:g,max_amount:b?b[S][0]:30}),(0,o.createComponentVNode)(2,m,{label:"Use patch box",checked:f,set_function:h})]})]})};t.MakePatches=N;var v=function(e,t){(0,r.useBackend)(t).act;var n=e.placeholder,i=e.item_name,c=e.set_item_name,l=e.max_volume,u=-.5;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Operations",buttons:(0,o.createComponentVNode)(2,a.Box,{align:"left",as:"span",children:["Name: ",(0,o.createComponentVNode)(2,a.Input,{value:i,placeholder:n,onChange:function(e,t){c(t)}})]}),children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,f,{max_volume:l,item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,h,{max_volume:l,item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,C,{item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,g,{item_name:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:u,height:3,children:(0,o.createComponentVNode)(2,N,{item_name:i})})]})})};t.OperationsSection=v;t.ChemMaster=function(e,t){var n,a=(0,r.useBackend)(t).data,c=null!=(n=a.default_name)?n:null,u=(0,r.useLocalState)(t,"item_name",""),d=u[0],s=u[1],p=a.container?a.container.maxVolume:100;return(0,o.createComponentVNode)(2,i.Window,{width:435,height:480,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,l,{container:a.container,max_volume:p}),(0,o.createComponentVNode)(2,v,{container:a.container,max_volume:p,item_name:d,set_item_name:s,placeholder:c})]})})}},48230:function(e,t,n){"use strict";t.__esModule=!0,t.ChemRequestReceiver=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(21118),l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.name,l=e.id,u=e.reagent_name,d=e.reagent_color,s=e.volume,p=e.notes,m=e.area,f=e.state,h=e.interactable,C=e.age,g="rgba("+d[0]+","+d[1]+", "+d[2]+", 1)";return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:10,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[i," requested"]}),(0,o.createComponentVNode)(2,a.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,a.Box,{width:16,textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Icon,{color:g,name:"circle",pt:1,style:{"text-shadow":"0 0 3px #000"}})," "+(0,c.capitalize)(u)," (",s,"u)"]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["from ",m," ",C," ago. ",(0,o.createVNode)(1,"br")," ",p&&"Notes: "+p]})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Box,{children:["pending"===f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{disabled:!h,align:"center",width:"49.5%",color:"red",icon:"ban",onClick:function(){n("deny",{id:l})},children:"Deny"}),(0,o.createComponentVNode)(2,a.Button,{disabled:!h,align:"center",width:"49.5%",icon:"check",onClick:function(){n("fulfil",{id:l})},children:"Mark as fulfilled"})],4),"pending"!==f&&(0,o.createComponentVNode)(2,a.Box,{align:"center",backgroundColor:"denied"===f?"red":"green",children:(0,c.capitalize)(f)})]})})]})})};t.ChemRequestReceiver=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data),u=(0,r.useLocalState)(t,"tabIndex",1),d=u[0],s=u[1],p=c.requests,m=c.allowed,f=0;return(0,o.createComponentVNode)(2,i.Window,{title:"Chemical requests",width:600,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===d,onClick:function(){return s(1)},children:"Pending"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:2===d,onClick:function(){return s(2)},children:"History"})]}),(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",children:p.map((function(e){if("pending"===e.state&&1===d||"pending"!==e.state&&2===d)return(0,o.createComponentVNode)(2,a.Stack.Item,{py:1,width:23,ml:0==f++?1:undefined,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({interactable:m},e)))},e.id)}))})]})})}},20938:function(e,t,n){"use strict";t.__esModule=!0,t.ChemRequester=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(21118),l=n(36814),u=n(8095),d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.chemicals,i=(0,r.useLocalState)(t,"searchText",""),c=i[0],u=i[1],d=Object.keys(a).filter((function(e){return e.includes(c)}));return(0,o.createComponentVNode)(2,l.ListSearch,{autoFocus:!0,currentSearch:c,options:d,onSearch:u,onSelect:function(e){n("set_reagent",{reagent_name:e,reagent_id:a[e]}),u("")}})};t.ChemRequester=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.chemicals,m=s.card,f=s.selected_reagent,h=s.volume,C=s.max_volume,g=s.notes,N=s.silicon_user,v=(0,r.useLocalState)(t,"notesText",""),b=v[0],V=v[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Chemical request",width:400,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{align:"center",children:[!!m&&(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,u.IDCard,{card:m,onEject:function(){l("reset_id")}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!f&&(0,o.createComponentVNode)(2,a.Section,{height:36,fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,d,{chemicals:p})}),!!f&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("set_reagent",{reagent:null})},children:(0,c.capitalize)(f)})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Amount",children:(0,o.createComponentVNode)(2,a.NumberInput,{align:"left",unit:"u",minValue:5,step:5,maxValue:C,value:h,onChange:function(e,t){l("set_volume",{volume:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Notes",children:(0,o.createComponentVNode)(2,a.Input,{width:"100%",value:b,maxLength:65,onInput:V,onChange:function(e,t){l("set_notes",{notes:t})},children:g})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("submit"),V("")},children:"Submit request"})})]}),!m&&!N&&(0,o.createComponentVNode)(2,a.Section,{children:"Please swipe ID to place request."}),!m&&!!N&&(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("silicon_login")},children:"Login to place request."})})]})})}},6542:function(e,t,n){"use strict";t.__esModule=!0,t.CloningConsole=t.shortenNumber=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(65751),l=n(97622),u=["type"];var d=["","k","M","B","T"],s=function(e,t){void 0===t&&(t=0);var n=Math.log10(Math.abs(e))/3|0;return n===t?e:""+Math.round(e/Math.pow(10,3*n))+d[n]};t.shortenNumber=s;var p=["#17d568","#2ecc71","#e67e22","#ed5100","#e74c3c","#ed2814"],m="functions",f="records",h="pods",C="danger",g="info",N="success",v=function(e){var t=e.type,n=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),r=Object.assign({},t===C?{danger:!0}:{},t===g?{info:!0}:{},t===N?{success:!0}:{});return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.NoticeBox,Object.assign({},r,n)))};t.CloningConsole=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=c.balance,d=c.cloneHack,s=c.clonesForCash,p=c.cloningWithRecords,C=c.allowedToDelete,g=(0,r.useLocalState)(t,"deletionTarget",""),N=g[0],v=g[1],k=(0,r.useLocalState)(t,"viewingNote",""),S=k[0],I=k[1],w=(0,r.useSharedState)(t,"tab",f),_=w[0],D=w[1];return p||_!==f||D(h),(0,o.createComponentVNode)(2,i.Window,{theme:d.some(Boolean)?"syndicate":"ntos",width:540,height:595,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[N&&(0,o.createComponentVNode)(2,a.Modal,{mx:7,fontSize:"31px",children:[(0,o.createComponentVNode)(2,a.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:2,mt:1,children:(0,o.createComponentVNode)(2,a.Icon,{name:"trash"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:"Delete Record?"})]}),(0,o.createComponentVNode)(2,a.Box,{mt:2,textAlign:"center",fontSize:"24px",children:[(0,o.createComponentVNode)(2,a.Button,{lineHeight:"40px",icon:"check",color:"good",onClick:function(){l("delete",{id:N}),v("")},children:"Yes"}),(0,o.createComponentVNode)(2,a.Button,{width:8,align:"center",mt:2,ml:5,lineHeight:"40px",icon:"times",color:"bad",onClick:function(){return v("")},children:"No"})]})]}),S&&(0,o.createComponentVNode)(2,a.Modal,{mx:7,width:25,fontSize:"15px",children:[(0,o.createComponentVNode)(2,a.Button,{fontSize:"26px",color:"blue",onClick:function(){return I("")},style:{position:"absolute",top:"5px",right:"5px"},children:"X"}),S.note,!!C&&(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"trash",mx:1,onClick:function(){I(""),l("deleteNote",{id:S.id})}})]}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,a.Tabs,{children:[!!p&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"list",selected:_===f,onClick:function(){return D(f)},children:"Records"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"box",selected:_===h,onClick:function(){return D(h)},children:"Pods"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"wrench",selected:_===m,onClick:function(){return D(m)},children:"Functions"})]})})}),!!s&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:["Current machine credit: ",u]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,V)}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:[_===f&&!!p&&(0,o.createComponentVNode)(2,y),_===h&&(0,o.createComponentVNode)(2,x),_===m&&(0,o.createComponentVNode)(2,b)]})]})]})})};var b=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.allowMindErasure,u=c.disk,d=c.diskReadOnly,s=c.geneticAnalysis,p=c.mindWipe,m=c.cloningWithRecords;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Advanced Genetic Analysis",children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Notice:"}),(0,o.createComponentVNode)(2,a.Box,{children:"Enabling this feature will prompt the attached clone pod to transfer active genetic mutations from the genetic record to the subject during cloning."}),(0,o.createComponentVNode)(2,a.Box,{children:"The cloning process will be slightly slower as a result."})]}),(0,o.createComponentVNode)(2,a.Box,{pt:2,children:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",width:6.7,icon:s?"toggle-on":"toggle-off",color:s?"good":"bad",onClick:function(){return i("toggleGeneticAnalysis")},children:s?"Enabled":"Disabled"})})]}),!!l&&(0,o.createComponentVNode)(2,a.Section,{title:"Criminal Rehabilitation Controls",children:[(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Notice:"}),(0,o.createComponentVNode)(2,a.Box,{children:"Enabling this feature will enable an experimental criminal rehabilitation routine."}),(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:"Human use is specifically forbidden by the Space Geneva convention."})]}),(0,o.createComponentVNode)(2,a.Box,{pt:2,children:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",width:6.7,icon:p?"toggle-on":"toggle-off",color:p?"good":"bad",onClick:function(){return i("mindWipeToggle")},children:p?"Enabled":"Disabled"})})]}),!!u&&(0,o.createComponentVNode)(2,a.Section,{title:"Disk Controls",buttons:(0,o.createFragment)([m?(0,o.createComponentVNode)(2,a.Button,{icon:"upload",color:"blue",onClick:function(){return i("load")},children:"Load from disk"}):(0,o.createComponentVNode)(2,a.Button,{icon:"upload",color:"blue",onClick:function(){return i("loadAndClone")},children:"Clone from disk"}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",color:"bad",onClick:function(){return i("eject")},children:"Eject Disk"})],0),children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:d?"bad":"good",name:"check"})," ",d?"Disk is read only.":"Disk is writeable."]})})],0)},V=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.scannerLocked,u=c.occupantScanned,d=c.scannerOccupied,s=c.scannerGone,p=c.cloningWithRecords,m=c.message||{text:"",status:""};return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Status Messages",height:7,children:m.text&&(0,o.createComponentVNode)(2,v,{type:m.status,textColor:"white",height:3.17,align:"center",style:{"vertical-align":"middle","horizontal-align":"middle"},children:(0,o.createComponentVNode)(2,a.Box,{style:{position:"relative",left:"50%",top:"50%",transform:"translate(-50%, -50%)"},children:m.text})})}),(0,o.createComponentVNode)(2,a.Section,{title:"Scanner Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{width:7,icon:l?"unlock":"lock-open",align:"center",color:l?"bad":"good",onClick:function(){return i("toggleLock")},children:l?"Locked":"Unlocked"}),children:[!!p&&(!!s||!!u||!d)&&(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:s||!d?"bad":"good",name:s||!d?"times":"check"})," ",!!s&&"No scanner detected.",!s&&(d?"Occupant scanned.":"Scanner has no occupant.")]}),!s&&!u&&!!d&&!!p&&(0,o.createComponentVNode)(2,a.Button,{width:s?8:7,icon:"dna",align:"center",color:s?"bad":"good",disabled:u||s,onClick:function(){return i("scan")},children:"Scan"}),!s&&!!d&&!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"dna",align:"center",color:"good",onClick:function(){return i("scanAndClone")},children:"Scan & Clone"})]})],4)},y=function(e,t){var n=(0,r.useBackend)(t),i=n.act,u=n.data,d=u.disk,m=u.diskReadOnly,f=u.allowedToDelete,h=u.meatLevels,C=u.cloneRecords||[],g=(0,r.useLocalState)(t,"deletionTarget","")[1],N=(0,r.useLocalState)(t,"viewingNote",""),v=(N[0],N[1]);return(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{mb:0,title:"Records",style:{"border-bottom":"2px solid rgba(51, 51, 51, 0.4);"},children:(0,o.createComponentVNode)(2,a.Flex,{className:"cloning-console__flex__head",children:(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__row",mr:2,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"190px"},children:"Name"}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"160px"},children:[(0,o.createComponentVNode)(2,a.Box,{children:"Damage"}),(0,o.createComponentVNode)(2,a.Box,{style:{position:"absolute",left:"50%",top:"20%",transform:"translate(-40%, 22px)"},fontSize:"9px",children:"OXY / TOX / BURN / BRUTE"})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__head__item",style:{width:"180px"},children:"Actions"})]})})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__flex__table",children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:C.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__body__row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,className:"cloning-console__body__item",style:{width:"190px"},children:e.name}),(0,o.createComponentVNode)(2,a.Flex.Item,{className:"cloning-console__body__item",style:{width:"160px"},children:[(0,o.createComponentVNode)(2,a.ColorBox,{mr:1,color:(t=e.health.OXY,n=e.health.TOX,r=e.health.BURN,u=e.health.BRUTE,C=t+n+r+u,N=(0,l.clamp)(Math.ceil(C/25),0,5),p[N])}),e.implant&&e.health.OXY>=0?(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:[(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"oxy",width:2,children:s(e.health.OXY)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"toxin",width:2,children:s(e.health.TOX)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"burn",width:2,children:s(e.health.BURN)}),"/",(0,o.createComponentVNode)(2,c.HealthStat,{inline:!0,align:"center",type:"brute",width:2,children:s(e.health.BRUTE)})]}):"No Implant Detected"]}),(0,o.createComponentVNode)(2,a.Flex.Item,{align:"baseline",className:"cloning-console__body__item",style:{width:"180px"},children:[!!f&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"trash",color:"bad",onClick:function(){return g(e.id)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"pencil",color:"blue",onClick:function(){return i("editNote",{id:e.id})},tooltip:"Edit note"})],4),!!d&&(0,o.createComponentVNode)(2,a.Button,{icon:m||e.saved?"":"save",color:"blue",alignText:"center",width:"22px",disabled:e.saved||m,onClick:function(){return i("saveToDisk",{id:e.id})},children:[!m&&!!e.saved&&(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"check"}),!!m&&(0,o.createComponentVNode)(2,a.Icon.Stack,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"pen"}),(0,o.createComponentVNode)(2,a.Icon,{color:"black",name:"slash"})]})]}),(0,o.createComponentVNode)(2,a.Button,{icon:"dna",color:"good",disabled:!h.length,onClick:function(){return i("clone",{id:e.id})},children:"Clone"}),!!e.note&&(0,o.createComponentVNode)(2,a.Button,{color:"blue",circular:!0,icon:"circle-exclamation",onClick:function(){return v({note:e.note,id:e.id})},tooltip:"View note"})]})]},e.id);var t,n,r,u,C,N}))})})})})})]})},x=function(e,t){var n=(0,r.useBackend)(t).data,i=n.completion,c=n.meatLevels,l=n.podNames;return c.length?c.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:l[t].replace(/cloning pod/,"Cloning Pod")+" Status",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Completion",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:i[t],maxValue:100,minValue:0,ranges:{good:[90,Infinity],average:[25,90],bad:[-Infinity,25]}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Bio-Matter",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:e,maxValue:100,minValue:0,ranges:{good:[50,100],average:[25,50],bad:[0,25]}})})]})},"pod"+t)})):(0,o.createComponentVNode)(2,a.Section,{title:"Cloning Pod Status",children:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{color:"bad",name:"times"})," No Pod Detected"]})})}},78826:function(e,t,n){"use strict";t.__esModule=!0,t.ClothingBooth=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381),l=n(18331);t.ClothingBooth=function(e,t){var n=(0,a.useBackend)(t).data,r=n.clothingBoothCategories||[],l=(0,a.useLocalState)(t,"selectedCategory",r[0]),p=l[0],m=l[1],f=p.items;return(0,o.createComponentVNode)(2,c.Window,{title:n.name,width:300,height:500,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,align:"center",justify:"space-between",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{bold:!0,children:"Cash: "+n.money+"\u2abd"}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Dropdown,{className:"clothingbooth__dropdown",options:r.map((function(e){return e.category})),selected:p.category,onSelected:function(e){return m(r[r.findIndex((function(t){return t.category===e}))])}})})]})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,children:f.map((function(e){return(0,o.createComponentVNode)(2,u,{item:e},e.name)}))})})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,d)})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Purchase Info",children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,justify:"space-around",children:(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,s)})})})})]})})]})})})};var u=function(e,t){var n=(0,a.useBackend)(t),c=n.act,u=n.data,d=e.item;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Stack,{align:"center",className:(0,r.classes)(["clothingbooth__boothitem",d.name===u.selectedItemName&&"clothingbooth__boothitem-selected"]),onClick:function(){return c("select",{path:d.path})},children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+d.img})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Box,{bold:!0,children:(0,l.capitalize)(d.name)})}),(0,o.createComponentVNode)(2,i.Stack.Item,{bold:!0,children:d.cost+"\u2abd"})]}),(0,o.createComponentVNode)(2,i.Divider)],4)},d=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{textAlign:!0,children:(0,o.createComponentVNode)(2,i.Image,{height:2*c.previewHeight+"px",pixelated:!0,src:"data:image/png;base64,"+c.previewIcon})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-left",tooltip:"Clockwise",tooltipPosition:"right",onClick:function(){return r("rotate-cw")}}),(0,o.createComponentVNode)(2,i.Button,{icon:"chevron-right",tooltip:"Counter-clockwise",tooltipPosition:"right",onClick:function(){return r("rotate-ccw")}})]})]})},s=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=n.data;return(0,o.createComponentVNode)(2,i.Stack,{bold:!0,vertical:!0,textAlign:"center",children:c.selectedItemName?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Selected: "+c.selectedItemName}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Price: "+c.selectedItemCost+"\u2abd"}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{color:"green",disabled:c.selectedItemCost>c.money,onClick:function(){return r("purchase")},children:c.selectedItemCost>c.money?"Insufficient Cash":"Purchase"})})],4):(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Please select an item."})})}},41717:function(){},70855:function(e,t,n){"use strict";t.__esModule=!0,t.ColorMatrixEditor=void 0;var o=n(96323),r=n(31246),a=n(97622),i=n(26949),c=n(2381);t.ColorMatrixEditor=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.currentColor,s=d[0],p=(s[0],s[1],s[2],s[3],d[1]),m=(p[0],p[1],p[2],p[3],d[2]),f=(m[0],m[1],m[2],m[3],d[3]),h=(f[0],f[1],f[2],f[3],d[4]),C=(h[0],h[1],h[2],h[3],["r","g","b","a","c"]);return(0,o.createComponentVNode)(2,c.Window,{title:"Color Matrix Editor",width:560,height:245,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[0,1,2,3].map((function(e,t){return(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[0,1,2,3,4].map((function(t,n){return(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,textColor:"label",width:"2.1rem",children:""+C[t]+C[e]+":"}),(0,o.createComponentVNode)(2,i.NumberInput,{inline:!0,value:u.currentColor[4*t+e],step:.01,width:"50px",format:function(e){return(0,a.toFixed)(e,2)},onDrag:function(n,o){var r=u.currentColor;r[4*t+e]=o,l("transition_color",{color:r})}})]},n)}))})},t)}))})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0}),(0,o.createComponentVNode)(2,i.Stack.Item,{align:"left",children:[(0,o.createComponentVNode)(2,i.Button.Confirm,{content:"Confirm",confirmContent:"Confirm?",onClick:function(){return l("confirm")}}),u.targetIsClient?(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Preview Color",onClick:function(){return l("client-preview")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Reset Your Color",onClick:function(){return l("client-reset")}})],4):""]})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.ByondUi,{params:{id:u.previewRef,type:"map"},style:{height:"100%"}})})]})})})}},21018:function(e,t,n){"use strict";t.__esModule=!0,t.ColorInput=t.HexColorInput=t.ColorSelector=t.ColorPickerModal=void 0;var o=n(96323),r=n(55631),a=n(31246),i=n(26949),c=n(2381),l=n(97622),u=n(89295),d=n(54291),s=n(1060),p=n(79926),m=n(34277),f=["prefixed","alpha","color","fluid","onChange"];function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}t.ColorPickerModal=function(e,t){var n=(0,a.useBackend)(t).data,l=n.timeout,d=n.message,s=n.title,p=n.autofocus,f=n.default_color,h=void 0===f?"#000000":f,g=(0,a.useLocalState)(t,"color_picker_choice",(0,u.hexToHsva)(h)),N=g[0],v=g[1];return(0,o.createComponentVNode)(2,c.Window,{height:400,title:s,width:600,theme:"generic",children:[!!l&&(0,o.createComponentVNode)(2,r.Loader,{value:l}),(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[d&&(0,o.createComponentVNode)(2,i.Stack.Item,{m:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Box,{color:"label",overflow:"hidden",children:d})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:[!!p&&(0,o.createComponentVNode)(2,i.Autofocus),(0,o.createComponentVNode)(2,C,{color:N,setColor:v,defaultColor:h})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,m.InputButtons,{input:(0,u.hsvaToHex)(N)})})]})})]})};var C=function(e,t){var n=e.color,r=e.setColor,a=e.defaultColor,c=function(e){r((function(t){return Object.assign({},t,e)}))},l=(0,u.hsvaToRgba)(n),d=(0,u.hsvaToHex)(n);return(0,o.createComponentVNode)(2,i.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{mr:2,children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createVNode)(1,"div","react-colorful",[(0,o.createComponentVNode)(2,V,{hsva:n,onChange:c}),(0,o.createComponentVNode)(2,y,{hue:n.h,onChange:c,className:"react-colorful__last-control"})],4)}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"20px",textAlign:"center",children:"Current"}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"20px",textAlign:"center",children:"Previous"}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,i.Tooltip,{content:d,position:"bottom",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"30px",backgroundColor:d})}),(0,o.createComponentVNode)(2,i.Tooltip,{content:a,position:"bottom",children:(0,o.createComponentVNode)(2,i.Box,{inline:!0,width:"100px",height:"30px",backgroundColor:a})})]})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{grow:!0,fontSize:"15px",lineHeight:"24px",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"Hex:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,height:"24px",children:(0,o.createComponentVNode)(2,v,{fluid:!0,color:(0,u.hsvaToHex)(n).substring(1),onChange:function(e){p.logger.info(e),r((0,u.hexToHsva)(e))},prefixed:!0})})]})}),(0,o.createComponentVNode)(2,i.Stack.Divider),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"H:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,y,{hue:n.h,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:n.h,callback:function(e,t){return c({h:t})},max:360,unit:"\xb0"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"S:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,x,{color:n,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:n.s,callback:function(e,t){return c({s:t})},unit:"%"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"V:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,k,{color:n,onChange:c})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:n.v,callback:function(e,t){return c({v:t})},unit:"%"})})]})}),(0,o.createComponentVNode)(2,i.Stack.Divider),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"R:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,S,{color:n,onChange:c,target:"r"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:l.r,callback:function(e,t){l.r=t,c((0,u.rgbaToHsva)(l))},max:255})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"G:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,S,{color:n,onChange:c,target:"g"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:l.g,callback:function(e,t){l.g=t,c((0,u.rgbaToHsva)(l))},max:255})})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"25px",children:(0,o.createComponentVNode)(2,i.Box,{textColor:"label",children:"B:"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,S,{color:n,onChange:c,target:"b"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,g,{value:l.b,callback:function(e,t){l.b=t,c((0,u.rgbaToHsva)(l))},max:255})})]})})]})})]})};t.ColorSelector=C;var g=function(e){var t=e.value,n=e.callback,r=e.min,a=void 0===r?0:r,c=e.max,l=void 0===c?100:c,u=e.unit;return(0,o.createComponentVNode)(2,i.NumberInput,{width:"70px",value:Math.round(t),step:1,minValue:a,maxValue:l,onChange:n,unit:u})},N=function(e){return"#"+e},v=function(e){var t=e.prefixed,n=e.alpha,r=e.color,a=e.fluid,i=e.onChange,c=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,f);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},c,{fluid:a,color:r,onChange:i,escape:function(e){return e.replace(/([^0-9A-F]+)/gi,"").substring(0,n?8:6)},format:t?N:undefined,validate:function(e){return(0,u.validHex)(e,n)}})))};t.HexColorInput=v;var b=function(e){var t,n;function r(t){var n;return(n=e.call(this)||this).props=void 0,n.state=void 0,n.handleInput=function(e){var t=n.props.escape(e.currentTarget.value);n.setState({localValue:t})},n.handleBlur=function(e){e.currentTarget&&(n.props.validate(e.currentTarget.value)?n.props.onChange(n.props.escape?n.props.escape(e.currentTarget.value):e.currentTarget.value):n.setState({localValue:n.props.escape(n.props.color)}))},n.props=t,n.state={localValue:n.props.escape(n.props.color)},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,h(t,n);var a=r.prototype;return a.componentDidUpdate=function(e,t){e.color!==this.props.color&&this.setStateValue()},a.setStateValue=function(){this.setState({localValue:this.props.escape(this.props.color)})},a.render=function(){return(0,o.createComponentVNode)(2,i.Box,{className:(0,s.classes)(["Input",this.props.fluid&&"Input--fluid"]),children:[(0,o.createVNode)(1,"div","Input__baseline",".",16),(0,o.createVNode)(64,"input","Input__input",null,1,{value:this.props.format?this.props.format(this.state.localValue):this.state.localValue,onInput:this.handleInput,onBlur:this.handleBlur})]})},r}(o.Component);t.ColorInput=b;var V=function(e){var t=e.hsva,n=e.onChange,r={"background-color":(0,u.hsvaToHslString)({h:t.h,s:100,v:100,a:1})+" !important"};return(0,o.createVNode)(1,"div","react-colorful__saturation_value",(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){n({s:100*e.left,v:100-100*e.top})},onKey:function(e){n({s:(0,l.clamp)(t.s+100*e.left,0,100),v:(0,l.clamp)(t.v-100*e.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+Math.round(t.s)+"%, Brightness "+Math.round(t.v)+"%",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__saturation_value-pointer",top:1-t.v/100,left:t.s/100,color:(0,u.hsvaToHslString)(t)})}),2,{style:r})},y=function(e){var t=e.className,n=e.hue,r=e.onChange,a=(0,s.classes)(["react-colorful__hue",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){r({h:360*e.left})},onKey:function(e){r({h:(0,l.clamp)(n+360*e.left,0,360)})},"aria-label":"Hue","aria-valuenow":Math.round(n),"aria-valuemax":"360","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__hue-pointer",left:n/360,color:(0,u.hsvaToHslString)({h:n,s:100,v:100,a:1})})}),2)},x=function(e){var t=e.className,n=e.color,r=e.onChange,a=(0,s.classes)(["react-colorful__saturation",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{style:{background:"linear-gradient(to right, "+(0,u.hsvaToHslString)({h:n.h,s:0,v:n.v,a:1})+", "+(0,u.hsvaToHslString)({h:n.h,s:100,v:n.v,a:1})+")"},onMove:function(e){r({s:100*e.left})},onKey:function(e){r({s:(0,l.clamp)(n.s+100*e.left,0,100)})},"aria-label":"Saturation","aria-valuenow":Math.round(n.s),"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__saturation-pointer",left:n.s/100,color:(0,u.hsvaToHslString)({h:n.h,s:n.s,v:n.v,a:1})})}),2)},k=function(e){var t=e.className,n=e.color,r=e.onChange,a=(0,s.classes)(["react-colorful__value",t]);return(0,o.createVNode)(1,"div",a,(0,o.createComponentVNode)(2,d.Interactive,{style:{background:"linear-gradient(to right, "+(0,u.hsvaToHslString)({h:n.h,s:n.s,v:0,a:1})+", "+(0,u.hsvaToHslString)({h:n.h,s:n.s,v:100,a:1})+")"},onMove:function(e){r({v:100*e.left})},onKey:function(e){r({v:(0,l.clamp)(n.v+100*e.left,0,100)})},"aria-label":"Value","aria-valuenow":Math.round(n.s),"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__value-pointer",left:n.v/100,color:(0,u.hsvaToHslString)({h:n.h,s:n.s,v:n.v,a:1})})}),2)},S=function(e){var t=e.className,n=e.color,r=e.onChange,a=e.target,c=(0,u.hsvaToRgba)(n),p=function(e){c[a]=e,r((0,u.rgbaToHsva)(c))},m=(0,s.classes)(["react-colorful__"+a,t]),f="r"===a?"rgb("+Math.round(c.r)+",0,0)":"g"===a?"rgb(0,"+Math.round(c.g)+",0)":"rgb(0,0,"+Math.round(c.b)+")";return(0,o.createVNode)(1,"div",m,(0,o.createComponentVNode)(2,d.Interactive,{onMove:function(e){p(255*e.left)},onKey:function(e){p((0,l.clamp)(c[a]+255*e.left,0,255))},"aria-valuenow":c[a],"aria-valuemax":"100","aria-valuemin":"0",children:(0,o.createComponentVNode)(2,i.Pointer,{className:"react-colorful__"+a+"-pointer",left:c[a]/255,color:f})}),2)}},22049:function(e,t,n){"use strict";t.__esModule=!0,t.ComUplink=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331);t.ComUplink=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,i.Window,{theme:"syndicate",title:"Syndicate Commander Uplink",width:500,height:500,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Stack,{className:"ComUplink"}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Points",children:(0,o.createComponentVNode)(2,a.Box,{inline:!0,bold:!0,color:"green",mr:"5px",className:"ComUplink__Points--commander",children:n.points},n.points)})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Uplink Items"}),(0,o.createComponentVNode)(2,a.Collapsible,{className:"ComUplink__Category--Main",title:"Equipment",open:!0,color:"Main",children:(0,o.createComponentVNode)(2,a.Table,{children:n.stock.filter((function(e){return"Main"===e.category})).map((function(e){return(0,o.createComponentVNode)(2,l,{stock:e},e.name)}))})})]})]})})};var l=function(e,t){var n=e.stock,i=(0,r.useBackend)(t),l=i.data,u=i.act;return(0,o.createComponentVNode)(2,a.Table.Row,{className:"ComUplink__Row",opacity:n.cost>l.points[n.category]?.5:1,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{className:"ComUplink__Cell",py:"5px",children:[(0,o.createComponentVNode)(2,a.Box,{mb:"5px",bold:!0,children:n.name}),(0,o.createComponentVNode)(2,a.Box,{children:n.description})]}),(0,o.createComponentVNode)(2,a.Table.Cell,{className:"ComUplink__Cell",py:"5px",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{disabled:n.cost>l.points,onClick:function(){return u("redeem",{ref:n.ref})},children:["Purchase ",n.cost," ",(0,c.pluralize)("point",n.cost)]})})]})}},20254:function(){},65208:function(e,t,n){"use strict";t.__esModule=!0,t.ContributorRewards=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.ContributorRewards=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.rewardTitles,d=l.rewardDescs;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Contributor Rewards",width:350,height:200,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:["Howdy, contributor! These rewards don't revert until you respawn somehow.",(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Box,{children:u.map((function(e,t){return(0,o.createComponentVNode)(2,a.Collapsible,{title:u[t],open:!0,children:[d[t],(0,o.createComponentVNode)(2,a.Button,{ml:1,icon:"check-circle",content:"Redeem",onClick:function(){return c("redeem",{reward_idx:t+1})}})]},t)}))})})]})})}},19812:function(e,t,n){"use strict";t.__esModule=!0,t.AntagonistsTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.AntagonistsTab=function(e,t){var n,l=(0,r.useBackend)(t).data;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i,{game_mode:l.game_mode}),null==(n=l.verbose_antagonist_data)?void 0:n.map((function(e,t){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e),t))})),!!l.succinct_antagonist_data.length&&(0,o.createComponentVNode)(2,a.Section,{title:"Other Antagonists",children:(0,o.createComponentVNode)(2,f,{succinct_antagonist_data:l.succinct_antagonist_data})})],0)};var i=function(e){var t=e.game_mode;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{mb:-2.5,italic:!0,children:"The Game Mode Was:"}),(0,o.createComponentVNode)(2,a.Stack.Item,{fontSize:2.75,bold:!0,children:t})]})})},c=function(e){var t=e.antagonist_roles,n=e.real_name,r=e.player,i=e.job_role,c=e.status,d=e.objectives,s=e.antagonist_statistics,p=e.subordinate_antagonists;return(0,o.createComponentVNode)(2,a.Box,{my:2,children:(0,o.createComponentVNode)(2,a.Collapsible,{title:n+" (played by "+r+") - "+t,fontSize:1.2,bold:!0,children:(0,o.createComponentVNode)(2,a.Section,{mt:-1.1,children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,children:"General"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Job",children:i}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:c})]}),!!d.length&&(0,o.createComponentVNode)(2,l,{objectives:d}),!!s.length&&(0,o.createComponentVNode)(2,u,{antagonist_statistics:s}),!!p.length&&(0,o.createComponentVNode)(2,m,{subordinate_antagonists:p})]})})})},l=function(e){var t=e.objectives;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Objectives"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,ml:.5,children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{color:e.completed?"green":"red",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{minWidth:.9,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Icon,{name:e.completed?"check":"xmark"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.explanation_text})]})},t)}))})],4)},u=function(e){var t=e.antagonist_statistics;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Statistics"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,d,{name:e.name,type:e.type,value:e.value},t)}))})],4)},d=function(e){var t=e.name,n=e.type,r=e.value,i=s(n);return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t,verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i,{type:n,items:r,nothing_text:"Nothing."})})},s=function(e){return e===undefined?function(e){return e.items}:e in p?p[e]:void 0},p={itemList:a.ItemList},m=function(e){var t=e.subordinate_antagonists;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{fontSize:1.1,bold:!0,mt:3,children:"Subordinate Antagonists"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,f,{succinct_antagonist_data:t})],4)},f=function(e){var t=e.succinct_antagonist_data;return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:null==t?void 0:t.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:e.antagonist_role}),(0,o.createComponentVNode)(2,a.Stack.Item,{shrink:!0,textAlign:"right",children:[!!e.dead&&(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," ",e.real_name," (played by ",e.player,")"]})]})},t)}))})}},99407:function(e,t,n){"use strict";t.__esModule=!0,t.CrewTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.CrewTab=function(e,t){var n,c=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Box,{children:null==(n=c.groups)?void 0:n.map((function(e,t){return c.groups[t].crew.length>0&&(0,o.createComponentVNode)(2,i,{title:e.title,crew:e.crew},t)}))})};var i=function(e){var t=e.title,n=e.crew,r=null==n?void 0:n.filter((function(e){return e.head})),i=null==n?void 0:n.filter((function(e){return!e.head}));return(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[null==r?void 0:r.map((function(e,t){return(0,o.createComponentVNode)(2,c,{real_name:e.real_name,dead:e.dead,player:e.player,role:e.role,head:!0},"head"+t)})),null==i?void 0:i.map((function(e,t){return(0,o.createComponentVNode)(2,c,{real_name:e.real_name,dead:e.dead,player:e.player,role:e.role},t)}))]})})},c=function(e){var t=e.real_name,n=e.dead,r=e.player,i=e.role,c=e.head;return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,bold:c,justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:i}),(0,o.createComponentVNode)(2,a.Stack.Item,{shrink:!0,textAlign:"right",children:[!!n&&(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," ",t," (played by ",r,")"]})]})})}},21187:function(e,t,n){"use strict";t.__esModule=!0,t.ScoreTab=void 0;var o=n(96323),r=n(31246),a=n(26949);t.ScoreTab=function(e,t){var n=(0,r.useBackend)(t).data,l=n.score_groups,u=n.total_score,s=n.grade,p=n.victory_body,m=n.victory_headline,f=(0,o.createComponentVNode)(2,d,{items:u});return(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,i,{preamble:"Round Result:",headline:m,body:p,children:" "}),!m&&(0,o.createComponentVNode)(2,i,{preamble:"Total Score:",headline:f,body:s,children:" "}),(0,o.createComponentVNode)(2,a.Section,{children:null==l?void 0:l.map((function(e,t){return!!e.entries.length&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e),t))}))})],0)};var i=function(e){var t=e.preamble,n=e.headline,r=e.body;return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",my:3,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{italic:!0,mt:0,mb:-2.5,children:t}),(0,o.createComponentVNode)(2,a.Stack.Item,{fontSize:2.75,bold:!0,children:n}),(0,o.createComponentVNode)(2,a.Stack.Item,{mb:-2.5,children:r})]})})},c=function(e){var t=e.title,n=e.entries;return(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:null==n?void 0:n.map((function(e,t){return(0,o.createComponentVNode)(2,l,{name:e.name,type:e.type,value:e.value},t)}))})})},l=function(e){var t=e.name,n=e.type,r=e.value,i=u(n);return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t,verticalAlign:"middle",children:(0,o.createComponentVNode)(2,i,{type:n,items:r,nothing_text:"N/A"})})},u=function(e){return e===undefined?function(e){return e.items}:e in s?s[e]:void 0},d=function(e){var t=e.items,n="white";return t<0?n="purple":t<30?n="brown":t<60?n="red":t<70?n="orange":t<80?n="yellow":t<90?n="yellowgreen":t<100?n="chartreuse":100===t?n="lime":t>100&&(n="teal"),(0,o.createComponentVNode)(2,a.Box,{color:n,children:[t,"%"]})},s={itemList:a.ItemList,colorPercent:d}},57119:function(e,t,n){"use strict";t.__esModule=!0,t.CrewCredits=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(99407),l=n(19812),u=n(37538),d=n(21187);t.CrewCredits=function(e,t){var n=(0,r.useLocalState)(t,"menu",u.CrewCreditsTabKeys.General),s=n[0],p=n[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Crew Credits",width:600,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.General,onClick:function(){return p(u.CrewCreditsTabKeys.General)},children:"General"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.Antagonists,onClick:function(){return p(u.CrewCreditsTabKeys.Antagonists)},children:"Antagonists"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:s===u.CrewCreditsTabKeys.Score,onClick:function(){return p(u.CrewCreditsTabKeys.Score)},children:"Station Score"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[s===u.CrewCreditsTabKeys.General&&(0,o.createComponentVNode)(2,c.CrewTab),s===u.CrewCreditsTabKeys.Antagonists&&(0,o.createComponentVNode)(2,l.AntagonistsTab),s===u.CrewCreditsTabKeys.Score&&(0,o.createComponentVNode)(2,d.ScoreTab)]})]})})})}},37538:function(e,t){"use strict";var n;t.__esModule=!0,t.CrewCreditsTabKeys=void 0,t.CrewCreditsTabKeys=n,function(e){e[e.General=0]="General",e[e.Antagonists=1]="Antagonists",e[e.Score=2]="Score"}(n||(t.CrewCreditsTabKeys=n={}))},75859:function(e,t,n){"use strict";t.__esModule=!0,t.Beaker=t.CryoCell=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(48175),l=n(51418),u=n(65751),d=n(90881),s=n(9720);t.CryoCell=function(e,t){return(0,o.createComponentVNode)(2,i.Window,{width:485,height:575,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,f)]})})};var p=function(e,t){var n=(0,r.useBackend)(t),i=n.act,l=n.data,u=l.cellTemp,d=l.status;return(0,o.createComponentVNode)(2,a.Section,{title:"Cryo Cell Control System",children:(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:["Current Cell Temperature",(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,c.getTemperatureColor)(u),mb:"1rem",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,c.getTemperatureIcon)(u),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:(u-273.15).toPrecision(4)})," \xb0C"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:d?"green":"red",fontSize:1.25,textAlign:"center",onClick:function(){return i("start")},children:d?"Activated":"Deactivated"})]})})},m=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,p=c.occupant,m=c.reagentScanEnabled,f=c.reagentScanActive,h=c.hasDefib,C=p?d.MobStatuses[p.occupantStat]:null;return(0,o.createComponentVNode)(2,a.Section,{title:"Occupant",buttons:(0,o.createFragment)([!!m&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("reagent_scan_active")},icon:f?"eye-slash":"eye",children:[f?"Hide":"Show"," Reagents"]}),h&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("defib")},icon:"bolt",color:"yellow",children:"Defibrillate"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("eject_occupant")},icon:"eject",disabled:!p,color:"green",children:"Eject"})],0),children:[!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Status",children:[(0,o.createComponentVNode)(2,a.Icon,{color:C.color,name:C.icon})," ",C.name]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Overall Health",children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:p.health,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Damage Breakdown",children:[(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"oxy",width:5,children:(0,u.damageNum)(p.oxyDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"toxin",width:5,children:(0,u.damageNum)(p.toxDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"burn",width:5,children:(0,u.damageNum)(p.burnDamage)}),"/",(0,o.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"brute",width:5,children:(0,u.damageNum)(p.bruteDamage)})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Key Health Indicators",mt:"0.5rem",children:[(0,o.createComponentVNode)(2,s.KeyHealthIndicators,{mobData:p}),!!p.hasRoboticOrgans&&(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Box,{bold:!0,fontSize:1.2,color:"purple",children:"Unknown augmented organs detected."})})]})],4),p&&p.reagents&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.ReagentGraph,{container:p.reagents,mt:"0.5rem"}),(0,o.createComponentVNode)(2,l.ReagentList,{container:p.reagents})],4),!p&&(0,o.createVNode)(1,"em",null,"Unoccupied",16)]})},f=function(e,t){var n=(0,r.useBackend)(t),i=n.act,u=n.data,d=u.showBeakerContents,s=u.containerData;return(0,o.createComponentVNode)(2,a.Section,{title:"Beaker",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("show_beaker_contents")},icon:d?"eye-slash":"eye",children:[d?"Hide":"Show"," Contents"]}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return i("eject")},icon:"eject",disabled:!s,color:"green",children:"Eject"})],4),children:!!d&&(0,o.createFragment)([s&&(0,o.createFragment)([(0,o.createComponentVNode)(2,l.ReagentGraph,{container:s}),(0,o.createComponentVNode)(2,l.ReagentList,{container:s}),(0,o.createComponentVNode)(2,a.Box,{fontSize:2,color:(0,c.getTemperatureColor)(s.temperature),textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Icon,{name:(0,c.getTemperatureIcon)(s.temperature),pr:.5}),(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:s.temperature})," K"]})],4),!s&&(0,o.createComponentVNode)(2,a.Dimmer,{height:"5rem",children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return i("insert")},bold:!0,children:"Insert Beaker"})})],0)})};t.Beaker=f},59181:function(e,t,n){"use strict";t.__esModule=!0,t.CellChargeBar=void 0;var o=n(96323),r=n(26949);t.CellChargeBar=function(e){var t=e.cell,n=t.current/t.max;return(0,o.createComponentVNode)(2,r.Tooltip,{position:"bottom",content:Math.floor(t.current)+"/"+t.max,children:(0,o.createComponentVNode)(2,r.ProgressBar,{position:"relative",value:n,ranges:{good:[.5,Infinity],average:[.25,.5],bad:[-Infinity,.25]},children:[Math.floor(100*n),"%"]})})}},7205:function(e,t,n){"use strict";t.__esModule=!0,t.DockingAllowedButton=void 0;var o=n(96323),r=n(31246),a=n(26949),i=["disabled"];t.DockingAllowedButton=function(e,t){var n=e.disabled,c=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),l=(0,r.useBackend)(t).data;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({disabled:n||l.disabled},c)))}},33492:function(e,t,n){"use strict";t.__esModule=!0,t.EyebotStatusView=void 0;var o=n(96323),r=n(26949),a=n(59181);t.EyebotStatusView=function(e){var t=e.occupant;return(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:t.cell.name,children:(0,o.createComponentVNode)(2,a.CellChargeBar,{cell:t.cell})})})}},27897:function(e,t,n){"use strict";t.__esModule=!0,t.HumanStatusView=void 0;var o=n(96323),r=n(26949);t.HumanStatusView=function(e){var t=e.occupant,n=t.health,a=t.max_health;return(0,o.createComponentVNode)(2,r.LabeledList,{children:(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Converting",children:(0,o.createComponentVNode)(2,r.ProgressBar,{value:(a-n)/a,ranges:{good:[.5,Infinity],average:[.25,.5],bad:[-Infinity,.25]},children:[Math.floor((a-n)/a*100),"%"]})})})}},79891:function(e,t,n){"use strict";t.__esModule=!0,t.OccupantCellDisplay=void 0;var o=n(96323),r=n(26949),a=n(59181),i=n(7205);t.OccupantCellDisplay=function(e){var t=e.cell,n=e.onRemoveCell;return(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Power Cell",color:t?"white":"red",buttons:(0,o.createComponentVNode)(2,i.DockingAllowedButton,{onClick:n,icon:"minus",tooltip:"Remove the occupant's power cell",disabled:!t}),children:t?(0,o.createComponentVNode)(2,a.CellChargeBar,{cell:t}):(0,o.createComponentVNode)(2,r.Box,{bold:!0,children:"No Power Cell Installed"})})}},44899:function(e,t,n){"use strict";t.__esModule=!0,t.ClothingReportSection=void 0;var o=n(96323),r=n(26949),a=n(7205);t.ClothingReportSection=function(e){var t=e.clothes,n=e.onRemoveClothing;return(0,o.createComponentVNode)(2,r.Section,{title:"Clothing",children:t.length>0?t.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{children:[e.name,(0,o.createComponentVNode)(2,a.DockingAllowedButton,{onClick:function(){return n(e.ref)},icon:"minus-circle",color:"transparent",tooltip:"Remove from occupant"})]},e.ref)})):(0,o.createComponentVNode)(2,r.Box,{children:"No Clothing"})})}},74826:function(e,t,n){"use strict";t.__esModule=!0,t.DamageReportSection=void 0;var o=n(96323),r=n(26949),a=n(84200),i=n(7205),c=n(89974);t.DamageReportSection=function(e){var t=e.cabling,n=e.fuel,c=e.parts,u=e.onRepairStructure,d=e.onRepairWiring;return(0,o.createComponentVNode)(2,r.Section,{title:"Damage Report",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.DockingAllowedButton,{disabled:n<1,icon:"wrench",backgroundColor:a.COLORS.damageType.brute,tooltip:"Fix structural damage",onClick:u}),(0,o.createComponentVNode)(2,i.DockingAllowedButton,{disabled:t<1,icon:"fire",backgroundColor:a.COLORS.damageType.burn,tooltip:"Fix wiring damage",onClick:d})],4),children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,l,{label:"Head",partData:c.head}),(0,o.createComponentVNode)(2,l,{label:"Chest",partData:c.chest}),(0,o.createComponentVNode)(2,l,{label:"Left Arm",partData:c.arm_l}),(0,o.createComponentVNode)(2,l,{label:"Right Arm",partData:c.arm_r}),(0,o.createComponentVNode)(2,l,{label:"Left Leg",partData:c.leg_l}),(0,o.createComponentVNode)(2,l,{label:"Right Leg",partData:c.leg_r})]})})};var l=function(e){var t=e.label,n=e.partData;if(!(0,c.isPresentPartsData)(n))return(0,o.createComponentVNode)(2,r.LabeledList.Item,{color:"red",label:t,children:(0,o.createComponentVNode)(2,r.Box,{bold:!0,children:"MISSING!"})});var i=Math.floor(n.dmg_blunt/n.max_health*100),l=Math.floor(n.dmg_burns/n.max_health*100);return i||l?(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:t,children:(0,o.createComponentVNode)(2,r.Flex,{children:[(0,o.createComponentVNode)(2,r.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,r.Flex,{children:[(0,o.createComponentVNode)(2,r.Flex.Item,{backgroundColor:a.COLORS.damageType.brute,width:i+"%"}),(0,o.createComponentVNode)(2,r.Flex.Item,{backgroundColor:a.COLORS.damageType.burn,width:l+"%"}),(0,o.createComponentVNode)(2,r.Flex.Item,{grow:1,backgroundColor:"#000000",stretch:!0,children:"\xa0"})]})}),(0,o.createComponentVNode)(2,r.Flex.Item,{shrink:!0,children:(0,o.createComponentVNode)(2,r.Flex,{children:[(0,o.createComponentVNode)(2,r.Flex.Item,{shrink:!0,width:"25px",backgroundColor:"#330000",color:a.COLORS.damageType.brute,bold:!0,children:(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:i>0?i:"--"})}),(0,o.createComponentVNode)(2,r.Flex.Item,{shrink:!0,width:"25px",backgroundColor:"#331100",color:a.COLORS.damageType.burn,bold:!0,children:(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:l>0?l:"--"})})]})})]})}):void 0}},32241:function(e,t,n){"use strict";t.__esModule=!0,t.DecorationReportSection=void 0;var o=n(96323),r=n(26949),a=n(7205);t.DecorationReportSection=function(e){var t=e.cosmetics,n=e.onChangeCosmetic,i=e.onChangePaintCosmetic,c=n.head,l=n.chest,u=n.arms,d=n.legs,s=n.eyeGlow,p=i.add,m=i.change,f=i.remove;return(0,o.createComponentVNode)(2,r.Section,{title:"Decoration",children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Head",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"sync-alt",tooltip:"Change head decoration",onClick:c}),children:t.head||"None"}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Chest",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"sync-alt",tooltip:"Change chest decoration",onClick:l}),children:t.chest||"None"}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Arms",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"sync-alt",tooltip:"Change arms decoration",onClick:u}),children:t.arms||"None"}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Legs",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"sync-alt",tooltip:"Change legs decoration",onClick:d}),children:t.legs||"None"}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Paint",buttons:(0,o.createFragment)([!t.paint&&(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"plus",tooltip:"Add paint",onClick:p}),t.paint&&(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"tint",tooltip:"Change colour",onClick:m}),t.paint&&(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"minus",tooltip:"Remove paint",onClick:f})],0),children:t.paint?(0,o.createComponentVNode)(2,r.ColorBox,{color:t.paint}):"No paint applied"}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Eyes",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{icon:"tint",tooltip:"Change eye glow",onClick:s}),children:(0,o.createComponentVNode)(2,r.ColorBox,{color:"rgb("+t.fx[0]+","+t.fx[1]+","+t.fx[2]+")"})})]})})}},63297:function(e,t,n){"use strict";t.__esModule=!0,t.UpgradeReportSection=void 0;var o=n(96323),r=n(26949),a=n(7205);t.UpgradeReportSection=function(e){var t=e.onRemoveUpgrade,n=e.upgrades,i=e.upgrades_max,c="Upgrades ("+n.length+" / "+i+" installed)";return(0,o.createComponentVNode)(2,r.Section,{title:c,children:(0,o.createVNode)(1,"div",null,n.map((function(e){return(0,o.createComponentVNode)(2,r.Stack,{children:[(0,o.createComponentVNode)(2,r.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{compact:!0,icon:"minus-circle",color:"transparent",tooltip:"Remove "+e.name,onClick:function(){return t(e.ref)}})})]},e.ref)})),0)})}},25112:function(e,t,n){"use strict";t.__esModule=!0,t.RobotStatusView=void 0;var o=n(96323),r=n(26949),a=n(7205),i=n(79891),c=n(74826),l=n(63297),u=n(32241),d=n(44899);t.RobotStatusView=function(e){var t=e.cabling,n=e.fuel,s=e.occupant,p=e.act,m=s.cell,f=s.moduleName,h=s.upgrades,C=s.upgrades_max,g=s.parts,N={head:function(){return p("cosmetic-change-head")},chest:function(){return p("cosmetic-change-chest")},arms:function(){return p("cosmetic-change-arms")},legs:function(){return p("cosmetic-change-legs")},eyeGlow:function(){return p("occupant-fx")}},v={add:function(){return p("occupant-paint-add")},change:function(){return p("occupant-paint-change")},remove:function(){return p("occupant-paint-remove")}},b=!!f;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,i.OccupantCellDisplay,{cell:m,onRemoveCell:function(){return p("cell-remove")}}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Module",buttons:(0,o.createComponentVNode)(2,a.DockingAllowedButton,{onClick:function(){return p("module-remove")},icon:"minus",tooltip:"Remove the occupant's module",disabled:!b}),children:f||(0,o.createComponentVNode)(2,r.Box,{as:"span",color:"red",children:"No Module Installed"})})]}),(0,o.createComponentVNode)(2,c.DamageReportSection,{parts:g,fuel:n,cabling:t,onRepairStructure:function(){return p("repair-fuel")},onRepairWiring:function(){return p("repair-wiring")}}),(0,o.createComponentVNode)(2,l.UpgradeReportSection,{onRemoveUpgrade:function(e){return p("upgrade-remove",{upgradeRef:e})},upgrades:h,upgrades_max:C}),(0,o.createComponentVNode)(2,u.DecorationReportSection,{cosmetics:s.cosmetics,onChangeCosmetic:N,onChangePaintCosmetic:v}),(0,o.createComponentVNode)(2,d.ClothingReportSection,{clothes:s.clothing,onRemoveClothing:function(e){return p("clothing-remove",{clothingRef:e})}})],4)}},31924:function(e,t,n){"use strict";t.__esModule=!0,t.OccupantSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(7205),c=n(33492),l=n(27897),u=n(25112);t.OccupantSection=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.cabling,u=c.fuel,s=c.occupant,p=!(null==s||!s.name);return(0,o.createComponentVNode)(2,a.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:p?(0,o.createComponentVNode)(2,d,{act:i,cabling:l,fuel:u,occupant:s,onEjectOccupant:function(){return i("occupant-eject")},onRenameOccupant:function(){return i("occupant-rename")}}):(0,o.createVNode)(1,"div",null,"No occupant",16)})})})};var d=function(e){var t=e.act,n=e.cabling,r=e.fuel,d=e.occupant,p=e.onEjectOccupant,m=e.onRenameOccupant,f=s(d);return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Name",buttons:(0,o.createFragment)(["robot"===d.kind&&(0,o.createComponentVNode)(2,i.DockingAllowedButton,{onClick:m,icon:"edit",tooltip:"Change the occupant's designation"}),(0,o.createComponentVNode)(2,i.DockingAllowedButton,{onClick:p,icon:"eject",tooltip:"Eject the occupant"})],0),children:d.name}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Type",children:f})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:["robot"===d.kind&&(0,o.createComponentVNode)(2,u.RobotStatusView,{occupant:d,fuel:r,cabling:n,act:t}),"human"===d.kind&&(0,o.createComponentVNode)(2,l.HumanStatusView,{occupant:d}),"eyebot"===d.kind&&(0,o.createComponentVNode)(2,c.EyebotStatusView,{occupant:d})]})],4)},s=function(e){switch(e.kind){case"robot":if("brain"===e.user)return"Mk.2-Type Cyborg";if("ai"===e.user)return"Mk.2-Type AI Shell";break;case"human":return"Mk.2-Type Carbon";case"eyebot":return"Mk.1-Type Eyebot";default:return"Unknown"}}},58571:function(e,t,n){"use strict";t.__esModule=!0,t.AvailableCellsSection=void 0;var o=n(96323),r=n(26949),a=n(59181),i=n(7205);t.AvailableCellsSection=function(e){var t=e.items,n=e.onEject,c=e.onInstall;return(0,o.createComponentVNode)(2,r.Section,{title:"Power Cells",children:t.length>0?(0,o.createComponentVNode)(2,r.LabeledList,{children:t.map((function(e){return(0,o.createVNode)(1,"div",null,(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.DockingAllowedButton,{onClick:function(){return c(e.ref)},icon:"plus",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,i.DockingAllowedButton,{onClick:function(){return n(e.ref)},icon:"eject",tooltip:"Eject from station"})],4),children:(0,o.createComponentVNode)(2,a.CellChargeBar,{cell:e})}),2,null,e.ref)}))}):(0,o.createComponentVNode)(2,r.Box,{as:"div",children:"None Stored"})})}},37394:function(e,t,n){"use strict";t.__esModule=!0,t.StandardAvailableSection=void 0;var o=n(96323),r=n(26949),a=n(7205);t.StandardAvailableSection=function(e){var t=e.items,n=e.onEject,i=e.onInstall,c=e.title;return(0,o.createComponentVNode)(2,r.Section,{title:c,children:t.length>0?t.map((function(e){return(0,o.createVNode)(1,"div",null,[e.name,(0,o.createComponentVNode)(2,a.DockingAllowedButton,{onClick:function(){return i(e.ref)},icon:"plus-circle",color:"transparent",tooltip:"Add to occupant"}),(0,o.createComponentVNode)(2,a.DockingAllowedButton,{onClick:function(){return n(e.ref)},icon:"eject",color:"transparent",tooltip:"Eject from station"})],0,null,e.ref)})):(0,o.createComponentVNode)(2,r.Box,{as:"div",children:"None Stored"})})}},9818:function(e,t,n){"use strict";t.__esModule=!0,t.SuppliesSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(58571),c=n(37394);t.SuppliesSection=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.allow_self_service,s=u.cabling,p=u.cells,m=u.clothes,f=u.fuel,h=u.modules,C=u.upgrades,g=u.viewer_is_robot;return(0,o.createComponentVNode)(2,a.Section,{title:"Supplies",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Welding Fuel",children:f}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Wire Cabling",children:s}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Self Service",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{tooltip:"Toggle self-service.",checked:d,disabled:g,onClick:function(){return l("self-service")},children:d?"Enabled":"Disabled"})})]}),(0,o.createComponentVNode)(2,c.StandardAvailableSection,{items:h,onInstall:function(e){return l("module-install",{moduleRef:e})},onEject:function(e){return l("module-eject",{moduleRef:e})},title:"Modules"}),(0,o.createComponentVNode)(2,c.StandardAvailableSection,{items:C,onInstall:function(e){return l("upgrade-install",{upgradeRef:e})},onEject:function(e){return l("upgrade-eject",{upgradeRef:e})},title:"Upgrades"}),(0,o.createComponentVNode)(2,i.AvailableCellsSection,{items:p,onInstall:function(e){return l("cell-install",{cellRef:e})},onEject:function(e){return l("cell-eject",{cellRef:e})}}),(0,o.createComponentVNode)(2,c.StandardAvailableSection,{items:m,onInstall:function(e){return l("clothing-install",{clothingRef:e})},onEject:function(e){return l("clothing-eject",{clothingRef:e})},title:"Upgrades"})]})}},56445:function(e,t,n){"use strict";t.__esModule=!0,t.CyborgDockingStation=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(31924),l=n(9818);t.CyborgDockingStation=function(e,t){var n=(0,r.useBackend)(t).data,d=n.allow_self_service,s=n.conversion_chamber,p=n.disabled,m=n.occupant,f=n.viewer_is_occupant,h=n.viewer_is_robot,C=(0,r.useLocalState)(t,"tabIndex",1),g=C[0],N=C[1];return(0,o.createComponentVNode)(2,i.Window,{width:500,height:640,title:"Cyborg Docking Station",theme:s&&"human"===(null==m?void 0:m.kind)?"syndicate":"neutral",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[!!p&&(0,o.createComponentVNode)(2,u,{allowSelfService:!!d,viewerIsOccupant:!!f,viewerIsRobot:!!h}),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tabs,{vertical:!0,width:"100px",children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===g,onClick:function(){return N(1)},children:"Occupant"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:2===g,onClick:function(){return N(2)},children:"Supplies"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,basis:0,children:[1===g&&(0,o.createComponentVNode)(2,c.OccupantSection),2===g&&(0,o.createComponentVNode)(2,l.SuppliesSection)]})]})]})})};var u=function(e){var t=e.allowSelfService,n=e.viewerIsOccupant,r=e.viewerIsRobot;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{backgroundColor:"#773333",p:"5px",mb:"5px",bold:!0,textAlign:"center",children:[r&&!n?"You must be inside the docking station to use the functions.":"",n&&!r?"Non-cyborgs cannot use the docking station functions.":"",n&&!t?"Self-service has been disabled at this station.":""]}),(0,o.createComponentVNode)(2,a.Divider)],4)}},89974:function(e,t){"use strict";t.__esModule=!0,t.isPresentPartsData=void 0;t.isPresentPartsData=function(e){return!!e.exists}},44616:function(e,t,n){"use strict";t.__esModule=!0,t.EmptyPlaceholder=void 0;var o=n(96323),r=n(1060),a=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=i(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var c=r?Object.getOwnPropertyDescriptor(e,a):null;c&&(c.get||c.set)?Object.defineProperty(o,a,c):o[a]=e[a]}o["default"]=e,n&&n.set(e,o);return o}(n(67044));function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(i=function(e){return e?n:t})(e)}var c=function(e){var t=e.children,n=e.className,i=(0,r.classes)([a.EmptyPlaceholder,n]);return(0,o.createVNode)(1,"div",i,t,0)};t.EmptyPlaceholder=c,c.defaultHooks=r.pureComponentHooks},94241:function(e,t,n){"use strict";t.__esModule=!0,t.ModuleDetail=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(5880),c=[{id:"brobocop",name:"Brobocop"},{id:"science",name:"Science"},{id:"civilian",name:"Civilian"},{id:"engineering",name:"Engineering"},{id:"medical",name:"Medical"},{id:"mining",name:"Mining"}];t.ModuleDetail=function(e,t){var n,u=e.onMoveToolDown,d=e.onMoveToolUp,s=e.onRemoveTool,p=e.onResetModule,m=e.tools,f=(0,r.useLocalState)(t,"selectedToolRef",undefined),h=f[0],C=f[1],g=h&&(null==(n=m.find((function(e){return e.item_ref===h})))?void 0:n.item_ref);h&&!g&&C(undefined);var N=(0,o.createComponentVNode)(2,l,{itemRef:g,onMoveDown:u,onMoveUp:d,onRemove:function(e){var t,n=m.findIndex((function(t){return t.item_ref===e}));C(null==(t=m[n+1])?void 0:t.item_ref),s(e)}});return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Reset",children:c.map((function(e){var t=e.id,n=e.name;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return p(t)},title:n,children:n},t)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Tools",buttons:N,children:(0,o.createComponentVNode)(2,i.Tools,{tools:m,selectedToolRef:g,onSelectTool:C})})})]})};var l=function(e){var t=e.onMoveDown,n=e.onMoveUp,r=e.onRemove,i=e.itemRef,c=!!i;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-up",disabled:!c,onClick:function(){return n(i)},title:"Move Up"}),(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-down",disabled:!c,onClick:function(){return t(i)},title:"Move Down"}),(0,o.createComponentVNode)(2,a.Button,{icon:"trash",disabled:!c,onClick:function(){return r(i)},title:"Remove"})],4)}},5880:function(e,t,n){"use strict";t.__esModule=!0,t.Tools=void 0;var o=n(96323),r=n(26949),a=n(44616),i=function(e){var t=e.children,n=e.onClick,a=e.selected;return(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:n,selected:a,children:t})};t.Tools=function(e){var t=e.onSelectTool,n=e.selectedToolRef,c=e.tools,l=void 0===c?[]:c;return 0===l.length?(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"Module has no tools"}):(0,o.createComponentVNode)(2,r.Tabs,{vertical:!0,children:l.map((function(e){var r=e.name,a=e.item_ref;return(0,o.createComponentVNode)(2,i,{onClick:function(){return t(a)},selected:a===n,children:r},a)}))})}},25526:function(e,t,n){"use strict";t.__esModule=!0,t.ModuleView=void 0;var o=n(96323),r=n(26949),a=n(44616),i=n(94241);t.ModuleView=function(e){var t=e.modules,n=(t=void 0===t?{}:t).available,c=void 0===n?[]:n,l=t.selected,u=e.onEjectModule,d=e.onMoveToolDown,s=e.onMoveToolUp,p=e.onRemoveTool,m=e.onResetModule,f=e.onSelectModule,h=l||{},C=h.item_ref,g=h.tools,N=void 0===g?[]:g;return 0===c.length?(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"No modules inserted"})}):(0,o.createComponentVNode)(2,r.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,r.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,r.Section,{title:"Modules",scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,r.Tabs,{vertical:!0,children:c.map((function(e){var t=e.item_ref,n=e.name,a=(0,o.createComponentVNode)(2,r.Button,{icon:"eject",color:"transparent",onClick:function(){return u(t)},title:"Eject "+n});return(0,o.createComponentVNode)(2,r.Tabs.Tab,{onClick:function(){return f(t)},rightSlot:a,selected:t===C,children:n},t)}))})})}),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:!0,children:C?(0,o.createComponentVNode)(2,i.ModuleDetail,{onMoveToolDown:d,onMoveToolUp:s,onRemoveTool:p,onResetModule:m,tools:N}):(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.EmptyPlaceholder,{children:"No module selected"})})})]})}},83709:function(e,t,n){"use strict";t.__esModule=!0,t.selectModule=t.resetModule=t.removeTool=t.moveTool=t.ejectModule=void 0;var o=n(95502),r=function(e){return function(t,n){return t(e,n)}},a=r(o.Action.EjectModule);t.ejectModule=a;var i=r(o.Action.MoveTool);t.moveTool=i;var c=r(o.Action.RemoveTool);t.removeTool=c;var l=r(o.Action.ResetModule);t.resetModule=l;var u=r(o.Action.SelectModule);t.selectModule=u},85175:function(e,t,n){"use strict";t.__esModule=!0,t.CyborgModuleRewriter=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(25526),c=n(83709),l=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{"default":e};var n=d(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=r?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(o,a,i):o[a]=e[a]}o["default"]=e,n&&n.set(e,o);return o}(n(67044)),u=n(95502);function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(d=function(e){return e?n:t})(e)}t.CyborgModuleRewriter=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=n.data.modules;return(0,o.createComponentVNode)(2,a.Window,{width:670,height:640,children:(0,o.createComponentVNode)(2,a.Window.Content,{className:l.Block,children:(0,o.createComponentVNode)(2,i.ModuleView,{modules:s,onEjectModule:function(e){return(0,c.ejectModule)(d,{itemRef:e})},onMoveToolDown:function(e){return(0,c.moveTool)(d,{dir:u.Direction.Down,itemRef:e})},onMoveToolUp:function(e){return(0,c.moveTool)(d,{dir:u.Direction.Up,itemRef:e})},onRemoveTool:function(e){return(0,c.removeTool)(d,{itemRef:e})},onResetModule:function(e){return(0,c.resetModule)(d,{moduleId:e})},onSelectModule:function(e){return(0,c.selectModule)(d,{itemRef:e})}})})})}},67044:function(e,t,n){"use strict";t.__esModule=!0,t.EmptyPlaceholder=t.ToolLabel=t.ModuleView=t.Block=void 0;var o=n(88243),r="cyborg-module-rewriter-interface";t.Block=r;var a=(0,o.block)(r,"module-view");t.ModuleView=a;var i=(0,o.element)(a,"tool-label");t.ToolLabel=i;var c=(0,o.block)(r,"empty-placeholder");t.EmptyPlaceholder=c},95502:function(e,t){"use strict";var n,o;t.__esModule=!0,t.Direction=t.Action=void 0,t.Action=n,function(e){e.EjectModule="module-eject",e.MoveTool="tool-move",e.RemoveTool="tool-remove",e.ResetModule="module-reset",e.SelectModule="module-select"}(n||(t.Action=n={})),t.Direction=o,function(e){e.Up="up",e.Down="down"}(o||(t.Direction=o={}))},9299:function(e,t,n){"use strict";t.__esModule=!0,t.DJPanel=void 0;var o=n(96323),r=n(97622),a=n(1033),i=n(31246),c=n(26949),l=n(2381);t.DJPanel=function(e,t){var n=(0,i.useBackend)(t),r=n.act,d=n.data,s=d.loadedSound,m=d.adminChannel,f=d.preloadedSounds;return(0,o.createComponentVNode)(2,l.Window,{width:430,height:306,title:"DJ Panel",children:(0,o.createComponentVNode)(2,l.Window.Content,{children:[(0,o.createComponentVNode)(2,c.Section,{children:[(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createVNode)(1,"strong",null,"Active Soundfile: ",16),(0,o.createComponentVNode)(2,c.Button,{icon:s?"file-audio":"upload",selected:!s,content:s?(0,a.truncate)(s,38):"Upload",tooltip:s,onClick:function(){return r("set-file")}})]}),(0,o.createComponentVNode)(2,c.Divider),(0,o.createComponentVNode)(2,p)]}),(0,o.createComponentVNode)(2,c.Section,{children:(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{icon:"music",selected:s,disabled:!s,content:"Play Music",onClick:function(){return r("play-music")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"volume-up",selected:s,disabled:!s,content:"Play Sound",onClick:function(){return r("play-sound")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"record-vinyl",selected:s,disabled:!s,content:"Play Ambience",onClick:function(){return r("play-ambience")}}),(0,o.createComponentVNode)(2,c.Box,{as:"span",color:"grey",textAlign:"right",pl:1,children:[(0,o.createComponentVNode)(2,c.Icon,{name:"satellite"})," Channel: ",(0,o.createVNode)(1,"em",null,1024-m,0)]})]})}),(0,o.createComponentVNode)(2,c.Section,{children:[(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{content:"Play Remote",onClick:function(){return r("play-remote")}}),(0,o.createComponentVNode)(2,c.Button,{disabled:!s,content:"Play To Player",onClick:function(){return r("play-player")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{disabled:!s,content:"Preload Sound",onClick:function(){return r("preload-sound")}}),(0,o.createComponentVNode)(2,c.Button,{disabled:!Object.keys(f).length,content:"Play Preloaded Sound",onClick:function(){return r("play-preloaded")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{color:"yellow",content:"Toggle DJ Announcements",onClick:function(){return r("toggle-announce")}}),(0,o.createComponentVNode)(2,c.Button,{color:"yellow",content:"Toggle DJ For Player",onClick:function(){return r("toggle-player-dj")}})]}),(0,o.createComponentVNode)(2,c.Box,{children:[(0,o.createComponentVNode)(2,c.Button,{icon:"stop",color:"red",content:"Stop Last Sound",onClick:function(){return r("stop-sound")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"broadcast-tower",color:"red",content:"Stop The Radio For Everyone",onClick:function(){return r("stop-radio")}})]})]}),(0,o.createComponentVNode)(2,u)]})})};var u=function(e,t){if((0,i.useBackend)(t).data.announceMode)return(0,o.createComponentVNode)(2,c.NoticeBox,{info:!0,children:"Announce Mode Enabled"})},d=function(e){return(0,r.toFixed)(2*e)+"%"},s=function(e){return(0,r.toFixed)(100*e)+"%"},p=function(e,t){var n=(0,i.useBackend)(t),r=n.act,a=n.data,l=a.loadedSound,u=a.volume,p=a.frequency,m=function(e,t){return r("set-volume",{volume:t})},f=function(e,t){return r("set-freq",{frequency:t})};return(0,o.createComponentVNode)(2,c.Box,{children:(0,o.createComponentVNode)(2,c.LabeledControls,{children:[(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Volume",children:(0,o.createComponentVNode)(2,c.NumberInput,{animated:!0,value:u,minValue:0,maxValue:100,format:d,onDrag:m})}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{children:[(0,o.createComponentVNode)(2,c.Knob,{minValue:0,maxValue:100,ranges:{primary:[20,80],average:[10,90],bad:[0,100]},value:u,format:d,onDrag:m}),(0,o.createComponentVNode)(2,c.Button,{icon:"sync-alt",top:"0.3em",content:"Reset",onClick:function(e,t){return r("set-volume",{volume:"reset"})}})]}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{label:"Frequency",children:(0,o.createComponentVNode)(2,c.NumberInput,{animated:!0,value:p,step:.1,minValue:-100,maxValue:100,format:s,onDrag:f})}),(0,o.createComponentVNode)(2,c.LabeledControls.Item,{children:[(0,o.createComponentVNode)(2,c.Knob,{disabled:!l,minValue:-100,maxValue:100,step:.1,stepPixelSize:.1,ranges:{primary:[-40,40],average:[-70,70],bad:[-100,100]},value:p,format:s,onDrag:f}),(0,o.createComponentVNode)(2,c.Button,{icon:"sync-alt",top:"0.3em",content:"Reset",onClick:function(e,t){return r("set-freq",{frequency:"reset"})}})]})]})})}},64640:function(e,t,n){"use strict";t.__esModule=!0,t.DisposalChute=void 0;var o,r=n(96323),a=n(31246),i=n(26949),c=n(2381),l=n(36814),u=n(9389),d=((o={})[u.DisposalChuteState.Off]={pumpColor:"bad",pumpText:"Inactive"},o[u.DisposalChuteState.Charging]={pumpColor:"average",pumpText:"Pressurizing"},o[u.DisposalChuteState.Charged]={pumpColor:"good",pumpText:"Ready"},o);t.DisposalChute=function(e,t){var n=(0,a.useBackend)(t),o=n.act,l=n.data,u=l.name,p=l.destinations,m=void 0===p?null:p,f=l.destinationTag,h=l.flush,C=l.mode,g=l.pressure,N=d[C],v=N.pumpColor,b=N.pumpText;return(0,r.createComponentVNode)(2,c.Window,{title:u,width:355,height:m?350:140,children:(0,r.createComponentVNode)(2,c.Window.Content,{className:"disposal-chute-interface",scrollable:!!m,children:[(0,r.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.LabeledList,{children:(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Current Pressure"})})}),(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.ProgressBar,{ranges:{good:[1,Infinity],average:[.75,1],bad:[-Infinity,.75]},value:g})})]}),(0,r.createComponentVNode)(2,i.Divider),(0,r.createComponentVNode)(2,i.LabeledList,{children:[(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Air Pump",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"power-off",content:C?"Enabled":"Disabled",color:C?"green":"red",onClick:function(){return o("togglePump")}}),children:(0,r.createComponentVNode)(2,i.Box,{color:v,children:b})}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Chute Handle",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:m?"envelope":"trash-alt",content:h?"Flushing":"Flush",color:h?"":"red",onClick:function(){return o("toggleHandle")}}),children:(0,r.createComponentVNode)(2,i.Button,{content:"Eject Contents",icon:"eject",onClick:function(){return o("eject")}})})]}),!!m&&(0,r.createFragment)([(0,r.createComponentVNode)(2,i.Divider),(0,r.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,i.LabeledList,{children:(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Destination",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"search",content:"Rescan",onClick:function(){return o("rescanDest")}}),children:f})})}),(0,r.createComponentVNode)(2,i.Stack.Item,{children:(0,r.createComponentVNode)(2,s,{destinations:m,destinationTag:f})})]})],4)]})})};var s=function(e,t){var n=e.destinations,o=void 0===n?[]:n,i=e.destinationTag,c=void 0===i?null:i,u=(0,a.useBackend)(t).act,d=(0,a.useLocalState)(t,"searchText",""),s=d[0],p=d[1],m=o.filter((function(e){return e.includes(s)}));return(0,r.createComponentVNode)(2,l.ListSearch,{autoFocus:!0,currentSearch:s,onSearch:p,onSelect:function(e){return u("select-destination",{destination:e})},options:m,selectedOption:c})}},9389:function(e,t){"use strict";var n;t.__esModule=!0,t.DisposalChuteState=void 0,t.DisposalChuteState=n,function(e){e[e.Off=0]="Off",e[e.Charging=1]="Charging",e[e.Charged=2]="Charged"}(n||(t.DisposalChuteState=n={}))},84430:function(e,t,n){"use strict";t.__esModule=!0,t.DoorTimer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.DoorTimer=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data;return(0,o.createComponentVNode)(2,c.Window,{width:260,height:u.flasher?279:207,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,justify:"stretch",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Timer",fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledControls,{justify:"start",children:[(0,o.createComponentVNode)(2,a.LabeledControls.Item,{label:"Time",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,minValue:0,maxValue:u.maxTime,value:u.time,format:function(e){return(0,i.formatTime)(10*e)},onDrag:function(e,t){return l("set-time",{time:t})},onChange:function(e,t){return l("set-time",{time:t,finish:!0})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.TimeDisplay,{value:10*u.time,timing:u.timing,format:i.formatTime})})]})}),(0,o.createComponentVNode)(2,a.LabeledControls.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("toggle-timing")},children:u.timing?"Stop":"Start"})})]})})}),!!u.flusher&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Floor Flusher",fill:!0,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("toggle-flusher")},backgroundColor:u.opening?"orange":undefined,children:u.opening?u.flusheropen?"Opening...":"Closing...":u.flusheropen?"Close Flusher":"Open Flusher"})})}),!!u.flasher&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Flasher",fill:!0,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("activate-flasher")},backgroundColor:u.recharging?"orange":undefined,children:["Flash Cell ",!!u.recharging&&"(Recharging)"]})})})]})})})}},9494:function(){},29259:function(e,t,n){"use strict";t.__esModule=!0,t.DyeDispenser=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(21018),l=n(89295),u="#FFFFFF";t.DyeDispenser=function(e,t){var n=(0,r.useBackend)(t),d=n.act,s=n.data,p=s.bottle,m=s.uses_left,f=s.bottle_color,h=p&&m>0,C=(0,r.useLocalState)(t,"color_picker_choice",(0,l.hexToHsva)(f||u)),g=C[0],N=C[1];return(0,o.createComponentVNode)(2,a.Window,{width:500,height:340,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Stack,{mb:1,textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("fillb",{selectedColor:(0,l.hsvaToHex)(g)})},children:[(0,o.createComponentVNode)(2,i.ColorBox,{color:(0,l.hsvaToHex)(g),mr:1}),"Fill"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("emptyb",{})},icon:"broom",disabled:!h,children:"Empty"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,width:"100%",onClick:function(){return d("eject",{})},icon:"eject",children:"Eject"})})]}),(0,o.createComponentVNode)(2,c.ColorSelector,{color:g,setColor:N,defaultColor:f||u}),!p&&(0,o.createComponentVNode)(2,i.Dimmer,{children:(0,o.createComponentVNode)(2,i.Button,{fontSize:1.5,bold:!0,onClick:function(){return d("insertb",{})},icon:"eject",children:"Insert Dye Bottle"})})]})})}},87339:function(e,t,n){"use strict";t.__esModule=!0,t.Elevator=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949);t.Elevator=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.location,d=l.active;return(0,o.createComponentVNode)(2,a.Window,{theme:"ntos",width:400,height:130,children:(0,o.createComponentVNode)(2,a.Window.Content,{textAlign:"center",children:[(0,o.createComponentVNode)(2,i.Section,{width:"70%",mx:"auto",children:["Location: ",(0,o.createVNode)(1,"em",null,u,0)]}),(0,o.createComponentVNode)(2,i.Section,{width:"70%",mx:"auto",fontSize:"16px",children:(0,o.createComponentVNode)(2,i.Button,{onClick:function(){return c("send",{})},enabled:!d,color:d?"grey":"green",icon:"elevator",fluid:!0,children:d?"Moving":"Move Elevator"})})]})})}},20316:function(e,t,n){"use strict";t.__esModule=!0,t.EngineStats=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(818),u=function(e){return Object.entries(e).map((function(e,t){var n=e[0],r=e[1];return(0,o.createComponentVNode)(2,a.Stack.Item,{mt:.5,ml:0===t?1:undefined,children:[(0,o.createComponentVNode)(2,a.Box,{children:[n.split("|")[0],":\xa0",0===r[r.length-1][1]?"No Data":(0,c.formatSiUnit)(r[r.length-1][1],0,n.split("|")[1])]}),(0,o.createComponentVNode)(2,a.Chart.Line,{height:"3.5em",width:"20em",data:r,rangeX:[0,r.length-1],rangeY:[0,(0,l.getStatsMax)(r)],strokeColor:"\trgba(55,170,25, 1)",fillColor:"rgba(55,170,25, 0.25)"})]},n)}))};t.EngineStats=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,s=d.turnedOn,p=d.tegData,m=d.chamberData,f=(0,l.processStatsData)(p),h=(0,l.processStatsData)(m);return(0,o.createComponentVNode)(2,i.Window,{height:"560",width:"760",theme:"retro-dark",title:"Engine Statistics",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:s&&f&&h?(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{children:["TEG Data",(0,o.createComponentVNode)(2,a.Button,{tooltip:"Power",icon:"power-off",color:"caution",position:"absolute",right:.25,top:.25,onClick:function(){return c("toggle-power")}})]}),children:(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",justify:"space-around",ml:-1,children:u(f)})}),(0,o.createComponentVNode)(2,a.Section,{title:"Combustion Chamber Data",children:(0,o.createComponentVNode)(2,a.Stack,{wrap:"wrap",justify:"space-around",ml:-1,children:u(h)})})]}):(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:20,height:5,fontSize:2,fontFamily:"Courier",children:["POWER ON",(0,o.createComponentVNode)(2,a.Button,{tooltip:"Power",icon:"power-off",selected:s,color:"caution",ml:3,onClick:function(){return c("toggle-power")}})]})})})}},65203:function(e,t,n){"use strict";t.__esModule=!0,t.EspressoMachine=t.DrinkContainer=t.ReagentBlocks=t.ContainerButtons=t.DrinksList=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.drinks;return(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{m:"2px",fontSize:"1.4rem",backgroundColor:"brown",textAlign:"center",onClick:function(){return n("pour",{drink_name:e})},children:e},e)},e)}))})};t.DrinksList=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.index;return(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",color:"blue",title:"Eject",mr:"10px",onClick:function(){return n("eject",{cup_index:i})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"red",title:"Flush All",onClick:function(){return n("flush",{cup_index:i})}})]})})};t.ContainerButtons=l;var u=function(e){var t=e.capacity,n=e.total,r=e.reagents;return(0,o.createComponentVNode)(2,a.Flex,{mt:"5px",children:[r.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:e.amount/t,children:(0,o.createComponentVNode)(2,a.Tooltip,{content:e.name+" ("+e.amount+"u)",position:"bottom",children:(0,o.createComponentVNode)(2,a.Box,{width:"100%",height:"30px",px:0,my:0,backgroundColor:e.colour})})},e.name)})),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:(t-n)/t,children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Nothing ("+(t-n)+"u)",position:"bottom",children:(0,o.createComponentVNode)(2,a.NoticeBox,{width:"100%",height:"30px",px:0,my:0,backgroundColor:"rgba(0, 0, 0, 0)"})})},"nothing")]})};t.ReagentBlocks=u;var d=function(e,t){(0,r.useBackend)(t).act;var n=e.cup;return(0,o.createComponentVNode)(2,a.Flex,{direction:"column",mt:"10px",children:[(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,l,{index:n.index}),(0,o.createComponentVNode)(2,a.Box,{as:"span",fontSize:"1.3rem",ml:"15px",children:n.total+" / "+n.capacity})]}),(0,o.createComponentVNode)(2,u,{capacity:n.capacity,total:n.total,reagents:n.reagents})]})};t.DrinkContainer=d;t.EspressoMachine=function(e,t){var n=(0,r.useBackend)(t).data,l=n.drinks,u=n.containers.map((function(e){return{capacity:e.capacity,index:e.index,total:e.reagents.reduce((function(e,t){return e+t[1]}),0),reagents:e.reagents.map((function(e){return{name:e[0],amount:e[1],colour:"rgb("+e[2]+","+e[3]+","+e[4]+")"}}))}}));return(0,o.createComponentVNode)(2,i.Window,{title:"Espresso Machine",width:500,height:400,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Drinks",children:(0,o.createComponentVNode)(2,c,{drinks:l})}),(0,o.createComponentVNode)(2,a.Section,{title:"Cups",children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:u.map((function(e){return(0,o.createComponentVNode)(2,d,{cup:e},e.index)}))})})]})})}},53600:function(e,t,n){"use strict";t.__esModule=!0,t.Filteriffic=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1397),l=n(97622),u=n(97622),d=["type","priority"];var s=function(e,t){var n=e.value,i=e.name,c=e.filterName,l=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:-500,maxValue:500,stepPixelSize:5,width:"39px",onDrag:function(e,t){var n;return l("modify_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}})},p=function(e,t){var n=e.value,i=e.name,c=e.filterName,d=(0,r.useBackend)(t).act,s=(0,r.useLocalState)(t,c+"-"+i,.01),p=s[0],m=s[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:-500,maxValue:500,stepPixelSize:4,step:p,format:function(e){return(0,l.toFixed)(e,(0,u.numberOfDecimalDigits)(p))},width:"80px",onDrag:function(e,t){var n;return d("transition_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,ml:2,mr:1,children:"Step:"}),(0,o.createComponentVNode)(2,a.NumberInput,{value:p,step:.001,format:function(e){return(0,l.toFixed)(e,4)},width:"70px",onChange:function(e,t){return m(t)}})],4)},m=function(e,t){var n=e.value,i=e.name,c=e.filterName,l=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Input,{value:n,width:"250px",onInput:function(e,t){var n;return l("modify_filter_value",{name:c,new_data:(n={},n[i]=t,n)})}})},f=function(e,t){var n=e.value,i=e.name,c=e.filterName,u=(0,r.useBackend)(t).act,d=n;return null===d&&(d=Array(1,0,0,0,1,0)),(0,o.createFragment)([(0,o.createTextVNode)("Matrix:"),(0,o.createComponentVNode)(2,a.Stack,{children:[0,1,2].map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[0,1,2].map((function(t,n){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:[2===e&&t<2&&0,2===e&&2===t&&1,e<2&&(0,o.createComponentVNode)(2,a.NumberInput,{inline:!0,value:d[3*e+t],step:.01,width:"50px",format:function(e){return(0,l.toFixed)(e,2)},onDrag:function(n,o){var r,a=d;a[3*e+t]=o,u("transition_filter_value",{name:c,new_data:(r={},r[i]=a,r)})}})]},n)}))})},t)}))})],4)},h=function(e,t){var n=e.value,i=e.filterName,c=e.name,u=(0,r.useBackend)(t).act,d=["r","g","b","a","c"];if(Array.isArray(n)){var s=n;if(s.length<20){for(;s.length<12;)s.push(0);for(s=Array(s[0],s[1],s[2],0,s[3],s[4],s[5],0,s[6],s[7],s[8],0,0,0,0,1,s[9],s[10],s[11],0);s.length<20;)s.push(0)}return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:i})}}),(0,o.createComponentVNode)(2,a.Stack,{children:[0,1,2,3].map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[0,1,2,3,4].map((function(t,n){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,textColor:"label",width:"2.1rem",children:""+d[t]+d[e]+":"}),(0,o.createComponentVNode)(2,a.NumberInput,{inline:!0,value:s[4*t+e],step:.01,width:"50px",format:function(e){return(0,l.toFixed)(e,2)},onDrag:function(n,o){var r,a=s;a[4*t+e]=o,u("transition_filter_value",{name:i,new_data:(r={},r[c]=a,r)})}})]},n)}))})},t)}))})],4)}return(0,o.createFragment)([n.type,(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:i})}}),(0,o.createComponentVNode)(2,a.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,a.Input,{value:n,width:"90px",onInput:function(e,t){var n;return u("transition_filter_value",{name:i,new_data:(n={},n[c]=t,n)})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Convert to color matrix",onClick:function(){return u("convert_color_value_matrix",{name:i})}})],0)},C=function(e,t){var n=e.value,i=e.filterName,c=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return c("modify_icon_value",{name:i})}}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,ml:1,children:n})],4)},g=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].flags;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i&e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=i^e,t)})}})}))(p)},N=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].space;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i===e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=e,t)})}})}))(p)},v=function(e,t){var n=e.name,i=e.value,l=e.filterName,u=e.filterType,d=(0,r.useBackend)(t),s=d.act,p=d.data.filter_info[u].blend_mode;return(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:i===e,content:t,onClick:function(){var t;return s("modify_filter_value",{name:l,new_data:(t={},t[n]=e,t)})}})}))(p)},b=function(e,t){var n=e.name,r=(e.value,e.hasValue),i=(e.filterName,{int:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),float:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),string:(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e))),color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({},e))),icon:(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e))),flags:(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e))),space:(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),blendmode:(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e))),matrix:(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e)))});return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:n,children:[i[{x:"float",y:"float",icon:"icon",render_source:"string",flags:"flags",size:"float",color:"color",offset:"float",radius:"float",space:"space",falloff:"float",density:"int",threshold:"float",factor:"float",repeat:"int",transform:"matrix",blend_mode:"blendmode"}[n]]||"Not Found (This is an error)"," ",!r&&(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"average",children:"(Default)"})]})},V=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=e.name,u=e.filterDataEntry,s=u.type,p=u.priority,m=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(u,d),f=c.filter_info,h=Object.keys(f[s].defaults);return(0,o.createComponentVNode)(2,a.Collapsible,{title:l+" ("+s+")",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NumberInput,{value:p,stepPixelSize:10,width:"60px",onChange:function(e,t){return i("change_priority",{name:l,new_priority:t})}}),(0,o.createComponentVNode)(2,a.Button.Input,{content:"Rename",placeholder:l,onCommit:function(e,t){return i("rename_filter",{name:l,new_name:t})},width:"90px"}),(0,o.createComponentVNode)(2,a.Button.Confirm,{icon:"minus",onClick:function(){return i("remove_filter",{name:l})}})],4),children:(0,o.createComponentVNode)(2,a.Section,{level:2,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:h.map((function(e){var t=f[s].defaults,n=m[e]||t[e],r=n!==t[e];return(0,o.createComponentVNode)(2,b,{filterName:l,filterType:s,name:e,value:n,hasValue:r},e)}))})})})};t.Filteriffic=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.target_name||"Unknown Object",s=u.target_filter_data||{},p=s!=={},m=u.filter_info,f=(0,r.useLocalState)(t,"massApplyPath",""),h=f[0],C=f[1],g=(0,r.useLocalState)(t,"hidden",!1),N=g[0],v=g[1];return(0,o.createComponentVNode)(2,i.Window,{width:500,height:500,title:"Filteriffic",resizable:!0,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"DO NOT MESS WITH EXISTING FILTERS IF YOU DO NOT KNOW THE CONSEQUENCES. YOU HAVE BEEN WARNED."}),(0,o.createComponentVNode)(2,a.Section,{title:N?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Box,{mr:.5,inline:!0,children:"MASS EDIT:"}),(0,o.createComponentVNode)(2,a.Input,{value:h,width:"100px",onInput:function(e,t){return C(t)}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{content:"Apply",confirmContent:"ARE YOU SURE?",onClick:function(){return l("mass_apply",{path:h})}})],4):(0,o.createComponentVNode)(2,a.Box,{inline:!0,onDblClick:function(){return v(!0)},children:d}),buttons:(0,o.createComponentVNode)(2,a.Dropdown,{icon:"plus",displayText:"Add Filter",nochevron:!0,options:Object.keys(m),onSelected:function(e){return l("add_filter",{name:"default",priority:10,type:e})}}),children:p?(0,c.map)((function(e,t){return(0,o.createComponentVNode)(2,V,{filterDataEntry:e,name:t},t)}))(s):(0,o.createComponentVNode)(2,a.Box,{children:"No filters"})})]})})}},21980:function(e,t,n){"use strict";t.__esModule=!0,t.Flamethrower=void 0;var o=n(96323),r=n(31246),a=n(41161),i=n(26949),c=n(51418),l=n(48175),u=n(2381),d=function(e,t){var n=(0,r.useBackend)(t).act,a=e.lit,c=e.maxTemp,u=e.minTemp,d=e.sprayTemp;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Pilot Light",children:(0,o.createComponentVNode)(2,i.Stack,{justify:"center",align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Button,{icon:"fire",color:a?"orange":null,iconColor:a?"yellow":null,onClick:function(){return n("light")},align:"center",width:"5em",fontSize:1.25,children:a?"Lit":"Unlit"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:d,minValue:u,maxValue:c,format:function(e){return Math.floor(e-l.freezeTemperature)+" C"},onChange:function(e,t){return n("change_temperature",{temperature:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,l.getTemperatureColor)(d),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Temperature"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,l.getTemperatureIcon)(d),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:Math.floor(d-l.freezeTemperature)}),"C"]})})]})})},s=function(e,t){var n=(0,r.useBackend)(t).act,a=e.mode,c=e.minVolume,l=e.maxVolume,u=e.chamberVolume;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Fuel Control",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:["Fire mode: ",(0,o.createComponentVNode)(2,i.Button,{selected:"auto"===a,onClick:function(){return n("change_mode",{mode:"auto"})},children:"Full Auto"}),(0,o.createComponentVNode)(2,i.Button,{selected:"burst"===a,onClick:function(){return n("change_mode",{mode:"burst"})},children:"Wide Burst"}),(0,o.createComponentVNode)(2,i.Button,{selected:"semi_auto"===a,onClick:function(){return n("change_mode",{mode:"semi_auto"})},children:"Semi Auto"})]}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:["Chamber volume: ",(0,o.createComponentVNode)(2,i.NumberInput,{value:u,minValue:c,maxValue:l,onChange:function(e,t){return n("change_volume",{volume:t})}})]})]})})};t.Flamethrower=function(e,t){var n=(0,r.useBackend)(t),l=n.act,p=n.data,m=p.gasTank,f=p.fuelTank;return(0,o.createComponentVNode)(2,u.Window,{width:580,height:270,theme:"ntos",title:"Flamethrower",children:(0,o.createComponentVNode)(2,u.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{justify:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"21em",children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},p)))}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},p)))})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"21em",children:(0,o.createComponentVNode)(2,a.PortableHoldingTank,{title:"Gas Tank",holding:m,onEjectTank:function(){return l("remove_gas")}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.Section,{title:"Fuel Tank",fill:!0,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",content:"Eject",disabled:!f,onClick:function(){return l("remove_fuel")}}),children:f&&(0,o.createComponentVNode)(2,c.ReagentBar,{container:f,height:"5em"})})})]})})]})})})}},72758:function(e,t,n){"use strict";t.__esModule=!0,t.FlockPanel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.partitions;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",height:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"20%",height:"100%",children:(0,o.createComponentVNode)(2,a.Section,{align:"center",height:"100%",children:e.name})}),(0,o.createComponentVNode)(2,a.Stack.Item,{height:"100%",grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.host&&(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Icon,{name:"wifi",size:3})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.host}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health,(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})]})]})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{height:"100%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:[e.host&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("eject_trace",{origin:e.ref})},children:"Eject"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("promote_trace",{origin:e.ref})},children:"Promote sentience"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("delete_trace",{origin:e.ref})},children:"Remove sentience"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},l={thinking:"brain",shooting:"bolt",rummaging:"dumpster",wandering:"route",building:"hammer",nesting:"hammer",harvesting:"cogs",controlled:"wifi",replicating:"egg",rallying:"map-marker","opening container":"box-open",butchering:"recycle",repairing:"tools",capturing:"bars",depositing:"border-style",observing:"eye",deconstructing:"trash",hibernating:"stop-circle"},u=function(e,t){var n=(0,r.useBackend)(t).act,i=e.drones,c=e.sortBy;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.sort((function(e,t){return function(e,t,n){return isNaN(e[n])||isNaN(t[n])?(""+e[n]).localeCompare(t[n]):t[n]-e[n]}(e,t,c)})).map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"20%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health,(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})," ",e.resources,(0,o.createComponentVNode)(2,a.Icon,{name:"cog"})]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50px",children:(0,o.createComponentVNode)(2,a.Box,{align:"center",children:(r=e.task,i=l[r],i?(0,o.createComponentVNode)(2,a.Icon,{size:3,name:i}):"")})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createVNode)(1,"b",null,e.area,0)," ",(0,o.createVNode)(1,"br")," ",e.task&&(t=e.task,t.charAt(0).toUpperCase()+t.slice(1))]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:["controlled"===e.task&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("eject_trace",{origin:e.controller_ref})},children:"Eject Trace"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("rally",{origin:e.ref})},children:"Rally"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref);var t,r,i}))})},d=function(e,t){var n=(0,r.useBackend)(t).act,i=e.structures;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"30%",children:(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:e.desc,children:(0,o.createComponentVNode)(2,a.Section,{position:"relative",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:e.name}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.health," ",(0,o.createComponentVNode)(2,a.Icon,{name:"heart"})]})]})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.compute>0&&"Compute provided: "+e.compute})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:["Construction Tealprint"===e.name&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("cancel_tealprint",{origin:e.ref})},children:"Cancel"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},s=function(e,t){var n=(0,r.useBackend)(t).act,i=e.enemies;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:i.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"30%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:e.name})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createVNode)(1,"b",null,e.area,0)})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"times",onClick:function(){return n("remove_enemy",{origin:e.ref})},children:"Remove"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("jump_to",{origin:e.ref})},children:"Jump"})})]})})})]})},e.ref)}))})},p=function(e,t){var n=e.stats;return(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:n.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{width:"100%",children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,align:"left",children:(0,o.createComponentVNode)(2,a.Stack.Item,{children:[e.name," ",e.value]})})})})})},e.name)}))})};t.FlockPanel=function(e,t){var n=(0,r.useBackend)(t),l=n.data,m=n.act,f=(0,r.useLocalState)(t,"sortBy","resources"),h=f[0],C=f[1],g=l.vitals,N=l.partitions,v=l.drones,b=l.structures,V=l.enemies,y=l.stats,x=l.category_lengths,k=l.category;return(0,o.createComponentVNode)(2,i.Window,{theme:"flock",title:"Flockmind "+g.name,width:600,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"drones"===k,onClick:function(){m("change_tab",{tab:"drones"})},children:["Drones ","("+x.drones+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"traces"===k,onClick:function(){m("change_tab",{tab:"traces"})},children:["Partitions ","("+x.traces+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"structures"===k,onClick:function(){m("change_tab",{tab:"structures"})},children:["Structures ","("+x.structures+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"enemies"===k,onClick:function(){m("change_tab",{tab:"enemies"})},children:["Enemies ","("+x.enemies+")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"stats"===k,onClick:function(){m("change_tab",{tab:"stats"})},children:"Stats"})]}),"drones"===k&&(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Dropdown,{options:["name","health","resources","area"],selected:"resources",onSelected:function(e){return C(e)}}),(0,o.createComponentVNode)(2,u,{drones:v,sortBy:h})]}),"traces"===k&&(0,o.createComponentVNode)(2,c,{partitions:N}),"structures"===k&&(0,o.createComponentVNode)(2,d,{structures:b}),"enemies"===k&&(0,o.createComponentVNode)(2,s,{enemies:V}),"stats"===k&&(0,o.createComponentVNode)(2,p,{stats:y})]})})}},57576:function(e,t,n){"use strict";t.__esModule=!0,t.FlockStructures=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.FlockStructures=function(e,t){var n=(0,r.useBackend)(t),c=(n.act,n.data.structures);return(0,o.createComponentVNode)(2,i.Window,{title:"Flock structures",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:c.map((function(e){var t=e.name,n=e.icon,r=e.description,i=e.cost;return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:9,children:(0,o.createComponentVNode)(2,a.Section,{align:"center",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:t}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,height:"64px",width:"64px",src:"data:image/png;base64,"+n})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:29,children:(0,o.createComponentVNode)(2,a.Section,{height:"100%",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:r}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:!!i&&"Cost: "+i})]})})})]})},t)}))})})})}},11653:function(e,t,n){"use strict";t.__esModule=!0,t.Freezer=void 0;var o=n(96323),r=n(31246),a=n(48175),i=n(26949),c=n(2381),l=n(1033);t.Freezer=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.target_temperature,p=d.active,m=d.air_temperature,f=d.air_pressure;return(0,o.createComponentVNode)(2,c.Window,{title:"Freezer",width:320,height:215,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Temperature Control",children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Knob,{animated:!0,size:2,value:s,minValue:73.15,maxValue:293.15,format:function(e){return e+" K"},onDrag:function(e,t){return u("set_target_temperature",{value:t})}})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,basis:0,overflow:"hidden",children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,fontSize:1.5,color:(0,a.getTemperatureColor)(s),backgroundColor:"black",children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Target"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,a.getTemperatureIcon)(s),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:s})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{basis:9.6,align:"center",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",color:0===p?"red":"green",fluid:!0,height:"100%",fontSize:1.15,textAlign:"center",onClick:function(){return u("active_toggle")},children:0===p?"Deactivated":"Activated"})})]})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{className:"ChemHeater__TemperatureNumber",nowrap:!0,p:1,width:"50%",fontSize:1.3,color:(0,a.getTemperatureColor)(m),children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Current Temperature"}),(0,o.createComponentVNode)(2,i.Icon,{name:(0,a.getTemperatureIcon)(m),pr:.5}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:m})," K"]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{nowrap:!0,p:1,width:"50%",fontSize:1.3,children:[(0,o.createComponentVNode)(2,i.Box,{fontSize:1,children:"Current Pressure"}),(0,o.createComponentVNode)(2,i.AnimatedNumber,{value:(0,l.formatPressure)(f)})]})})]})})]})})}},6482:function(e,t,n){"use strict";t.__esModule=!0,t.Gameclock=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.Gameclock=function(e,t){var n=(0,r.useBackend)(t).data.clockStatic.name,c=(0,r.useLocalState)(t,"configModalOpen",!1)[0],d=(0,r.useLocalState)(t,"swap",!1)[0],f=(0,r.useLocalState)(t,"helpModalOpen",!1),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,i.Window,{title:n,width:220,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{className:"gameclock__window",fitted:!0,children:[c&&(0,o.createComponentVNode)(2,l),h&&(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,a.Box,{className:"gameclock__help",children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__helpbutton",tooltip:h?"Close":"Help",icon:h?"xmark":"question",color:h&&"orange",onClick:!c&&function(){C(!h)}})}),(0,o.createComponentVNode)(2,s,{team:d?"white":"black"}),(0,o.createComponentVNode)(2,p,{team:d?"white":"black"}),(0,o.createComponentVNode)(2,m),(0,o.createComponentVNode)(2,p,{team:d?"black":"white"}),(0,o.createComponentVNode)(2,s,{team:d?"black":"white"})]})})};var l=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=i.clockStatic.defaultTime,u=(0,r.useLocalState)(t,"configModalOpen",!1)[1],s=(0,r.useLocalState)(t,"whiteTimeBuffer",0),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"blackTimeBuffer",0),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,a.Dimmer,{className:"gameclock__configmodal",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time (White)",children:(0,o.createComponentVNode)(2,d,{team:"white"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time (Black)",children:(0,o.createComponentVNode)(2,d,{team:"black"})})]}),(0,o.createComponentVNode)(2,a.Box,{className:"gameclock__configmodalbuttoncontainer",children:[(0,o.createComponentVNode)(2,a.Button,{content:"Reset to default",onClick:function(){m(l),C(l)}}),(0,o.createComponentVNode)(2,a.Button,{content:"Apply",onClick:function(){u(!1),c("set_time",{whiteTime:10*p,blackTime:10*h})}}),(0,o.createComponentVNode)(2,a.Button,{content:"Cancel",onClick:function(){return u(!1)}})]})]})},u=function(){return(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createVNode)(1,"p",null,(0,o.createVNode)(1,"strong",null,"Help",16),2),(0,o.createVNode)(1,"p",null,"These clocks are used in two-player games where the players move in turns.",16),(0,o.createVNode)(1,"p",null,"Click on the clock face corresponding to your color to end your turn.",16),(0,o.createVNode)(1,"p",null,"The time value (in seconds) for each clock can be set using the Clocks Setup button.",16),(0,o.createVNode)(1,"p",null,"Before starting the clock, ensure that the Current Turn is set to the correct side.",16),(0,o.createVNode)(1,"p",null,"The positions of the White and Black clocks can be swapped on your client using the rotate view button.",16)]})})},d=function(e,t){var n=(0,r.useBackend)(t).data.clockStatic,i=n.minTime,l=n.maxTime,u=e.team,d=(0,r.useLocalState)(t,"whiteTimeBuffer",0),s=d[0],p=d[1],m=(0,r.useLocalState)(t,"blackTimeBuffer",0),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,a.NumberInput,{onDrag:function(e,t){"white"===u?p(t):h(t)},format:function(e){return(0,c.formatTime)(10*e)},value:"white"===u?s:f,minValue:i,maxValue:l,step:15,stepPixelSize:2})},s=function(e,t){var n=e.team;return(0,o.createComponentVNode)(2,a.Stack,{direction:"column",children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"white"===n?"White":"Black",children:(0,o.createComponentVNode)(2,a.Icon,{className:"gameclock__teamicon",name:"circle"+("white"===n?"":"-o")})})})},p=function(e,t){var n=(0,r.useBackend)(t),i=n.data,l=n.act,u=e.team;return(0,o.createComponentVNode)(2,a.Stack,{direction:"column",fill:!0,className:"gameclock__sidepart",children:(0,o.createComponentVNode)(2,a.Button,{color:"orange",disabled:!i.timing||(i.turn?"black"===u:"white"===u),className:"gameclock__timebutton",onClick:function(){return l("end_turn")},children:(0,o.createComponentVNode)(2,a.Stack,{className:"gameclock__timeflex",children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:"white"===u?i.whiteTime:i.blackTime,format:function(e){return(0,c.formatTime)(10*e)}})})})})},m=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useLocalState)(t,"configModalOpen",!1)[1],u=(0,r.useLocalState)(t,"whiteTimeBuffer",0)[1],d=(0,r.useLocalState)(t,"blackTimeBuffer",0)[1],s=(0,r.useLocalState)(t,"swap",!1),p=s[0],m=s[1];return(0,o.createComponentVNode)(2,a.Stack,{direction:"row",className:"gameclock__mid",children:[(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:i.timing,tooltip:"Clocks Setup",tooltipPosition:"top",icon:"cog",onClick:function(){l(!0),u(i.whiteTime),d(i.blackTime)}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:i.timing,tooltip:"Current Turn: "+(i.turn?"White":"Black"),tooltipPosition:"top",icon:"flag",color:i.turn?"white":"black",onClick:function(){return c("set_turn")}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",disabled:0===i.whiteTime||0===i.blackTime,tooltip:i.timing?"Pause":"Unpause",tooltipPosition:"top",icon:i.timing?"pause":"play",color:i.timing?"orange":"",onClick:function(){return c("toggle_timing")}})}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{className:"gameclock__utilbutton",tooltip:"Rotate view",tooltipPosition:"top",icon:"rotate",onClick:function(){return m(!p)}})})]})}},69658:function(){},16484:function(e,t,n){"use strict";t.__esModule=!0,t.Detonator=void 0;var o=n(96323),r=n(26949),a=n(41834);t.Detonator=function(e){var t=e.detonator,n=e.detonatorAttachments,a=e.onToggleAnchor,l=e.onToggleSafety,u=e.onWireInteract,d=e.onPrimeDetonator,s=e.onTriggerActivate,p=e.onSetTimer;return(0,o.createComponentVNode)(2,r.Section,{title:"Detonator",children:[(0,o.createComponentVNode)(2,i,{detonator:t,onWireInteract:u,onSetTimer:p}),(0,o.createComponentVNode)(2,r.Divider),(0,o.createComponentVNode)(2,c,{detonator:t,detonatorAttachments:n,onToggleAnchor:a,onToggleSafety:l,onPrimeDetonator:d,onTriggerActivate:s})]})};var i=function(e){var t=e.detonator,n=(t=void 0===t?{}:t).wireNames,i=t.wireStatus,c=t.time,l=t.isPrimed,u=e.onWireInteract,d=e.onSetTimer;return(0,o.createComponentVNode)(2,r.Flex,{children:[(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,r.LabeledList,{children:n.map((function(e,t){return(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:e,children:(0,o.createComponentVNode)(2,r.Box,{height:1.7,children:i&&i[t]?(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Button,{icon:"cut",content:"Cut",onClick:function(){return u("cut",t)}}),(0,o.createComponentVNode)(2,r.Button,{icon:"bolt",content:"Pulse",onClick:function(){return u("pulse",t)}})],4):(0,o.createComponentVNode)(2,r.Box,{color:"average",minHeight:1.4,children:"Cut"})})},e+t)}))})}),(0,o.createComponentVNode)(2,r.Flex.Item,{mr:2,mt:2,children:(0,o.createComponentVNode)(2,r.Flex,{direction:"column",align:"center",children:[(0,o.createComponentVNode)(2,r.Flex.Item,{children:(0,o.createComponentVNode)(2,a.DetonatorTimer,{time:c,isPrimed:l})}),(0,o.createComponentVNode)(2,r.Flex.Item,{children:[(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"fast-backward",onClick:function(){return d(c-300)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"backward",onClick:function(){return d(c-10)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"forward",onClick:function(){return d(c+10)}}),(0,o.createComponentVNode)(2,r.Button,{mt:1,disabled:l,icon:"fast-forward",onClick:function(){return d(c+300)}})]})]})})]})},c=function(e){var t=e.detonator,n=(t=void 0===t?{}:t).isAnchored,a=t.trigger,i=t.safetyIsOn,c=t.isPrimed,l=e.detonatorAttachments,u=e.onToggleAnchor,d=e.onToggleSafety,s=e.onPrimeDetonator,p=e.onTriggerActivate;return(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Anchor Status",children:n?"Anchored. There are no controls for undoing this.":(0,o.createComponentVNode)(2,r.Button,{icon:"anchor",content:"Anchor",onClick:u})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Trigger",children:a?(0,o.createComponentVNode)(2,r.Button,{onClick:p,children:a}):"There is no trigger attached."}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Safety",children:i?(0,o.createComponentVNode)(2,r.Button,{color:"average",icon:"power-off",content:"Turn Off",onClick:d}):(0,o.createComponentVNode)(2,r.Box,{color:"average",children:"Off"})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{className:"gas-canister-detonator-utility__list-item",label:"Arming",children:i?"The safety is on, therefore, you cannot prime the bomb.":c?(0,o.createComponentVNode)(2,r.Box,{bold:!0,color:"red",children:"PRIMED"}):(0,o.createComponentVNode)(2,r.Button,{color:"danger",icon:"bomb",content:"Prime",onClick:s})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Attachments",className:"gas-canister-detonator-utility__list-item",children:l&&l.length>0?l.map((function(e,t){return(0,o.createComponentVNode)(2,r.Box,{className:"gas-canister-detonator-utility__attachment-item",children:l[t]},e+t)})):"There are no additional attachments to the detonator."})]})}},41834:function(e,t,n){"use strict";t.__esModule=!0,t.DetonatorTimer=void 0;var o=n(96323),r=n(26949),a=n(1033);t.DetonatorTimer=function(e){var t=e.time,n=e.isPrimed,i=e.warningThreshold,c=void 0===i?300:i,l=e.dangerThreshold,u=void 0===l?100:l,d=e.explosionMessage,s=void 0===d?"BO:OM":d,p="green";return t<=u?p="red":t<=c&&(p="orange"),(0,o.createComponentVNode)(2,r.Box,{p:1,textAlign:"center",backgroundColor:"black",color:p,maxWidth:"90px",width:"90px",fontSize:"20px",children:(0,o.createComponentVNode)(2,r.TimeDisplay,{value:t,timing:n,format:function(e){return(0,a.formatTime)(e,s)}})})}},52709:function(e,t,n){"use strict";t.__esModule=!0,t.GasCanister=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=n(75015),u=n(69412),d=n(16484);function s(e,t){return s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},s(e,t)}t.GasCanister=function(e,t){var n=(0,r.useBackend)(t),u=n.act,s=n.data,m=s.connected,f=s.holding,h=s.hasValve,C=s.valveIsOpen,g=s.pressure,N=s.maxPressure,v=s.releasePressure,b=s.minRelease,V=s.maxRelease,y=s.detonator,x=s.detonatorAttachments,k=s.hasPaper,S=!!y;return(0,o.createComponentVNode)(2,i.Window,{width:S?k?880:470:305,height:S?685:340,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{width:"480px",children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:m,pressure:g,maxPressure:N,children:[(0,o.createComponentVNode)(2,a.Divider),h?(0,o.createComponentVNode)(2,l.ReleaseValve,{valveIsOpen:C,releasePressure:v,minRelease:b,maxRelease:V,onToggleValve:function(){u("toggle-valve")},onSetPressure:function(e){u("set-pressure",{releasePressure:e})}}):(0,o.createComponentVNode)(2,a.Box,{color:"average",children:"The release valve is missing."})]}),y?(0,o.createComponentVNode)(2,d.Detonator,{detonator:y,detonatorAttachments:x,onToggleAnchor:function(){u("anchor")},onToggleSafety:function(){u("safety")},onWireInteract:function(e,t){u("wire-interact",{index:t,toolAction:e})},onPrimeDetonator:function(){u("prime")},onTriggerActivate:function(){u("trigger")},onSetTimer:function(e){u("timer",{newTime:e})}}):(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:f,onEjectTank:function(){u("eject-tank")}})]}),!!k&&(0,o.createComponentVNode)(2,a.Flex.Item,{width:"410px",children:(0,o.createComponentVNode)(2,p)})]})})})};var p=function(e){var t,n;function i(t,n){var o;return(o=e.call(this,t)||this).el=document.createElement("div"),o}return n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,s(t,n),i.prototype.render=function(){var e=(0,r.useBackend)(this.context).data.paperData,t=e.text,n=e.stamps;return(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,width:"400px",height:"518px",backgroundColor:"white",style:{"overflow-wrap":"break-word"},children:(0,o.createComponentVNode)(2,u.PaperSheetView,{value:t||"",stamps:n,readOnly:!0})})},i}(o.Component)},5394:function(e,t,n){"use strict";t.__esModule=!0,t.GasTankInfo=t.GasTank=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033),l=n(75015);t.GasTank=function(e,t){var n=(0,r.useBackend)(t),c=n.act,d=n.data,s=d.pressure,p=d.maxPressure,m=d.valveIsOpen,f=d.releasePressure,h=d.maxRelease;return(0,o.createComponentVNode)(2,i.Window,{width:400,height:220,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:(0,o.createComponentVNode)(2,u,{pressure:s,maxPressure:p})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,l.ReleaseValve,{valveIsOpen:m,releasePressure:f,maxRelease:h,onToggleValve:function(){c("toggle-valve")},onSetPressure:function(e){c("set-pressure",{releasePressure:e})}})})]})})};var u=function(e){var t=e.pressure,n=e.maxPressure,r=e.name;return(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,a.RoundGauge,{size:1.75,value:t,minValue:0,maxValue:n,alertAfter:.7*n,ranges:{good:[0,.7*n],average:[.7*n,.85*n],bad:[.85*n,n]},format:c.formatPressure})}),r?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Label",children:r}):null]})};t.GasTankInfo=u},92526:function(e,t,n){"use strict";t.__esModule=!0,t.GeneTek=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(33012),l=function(e){return e>0?(e/10).toFixed(0)+"s":"Ready"};t.GeneTek=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"menu","research"),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"buymats",null),h=f[0],C=f[1],g=(0,r.useSharedState)(t,"iscombining",!1)[0],N=u.materialCur,v=u.materialMax,b=u.currentResearch,V=u.equipmentCooldown,y=u.subject,x=u.costPerMaterial,k=u.budget,S=u.record,I=u.scannerAlert,w=u.scannerError,_=u.allowed,D=y||{},M=D.name,B=D.stat,A=D.health,T=D.stability,L=Math.min(v-N,Math.floor(k/x));return(0,o.createComponentVNode)(2,i.Window,{theme:_?"genetek":"genetek-disabled",width:730,height:415,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{width:"245px",height:"100%",style:{padding:"5px 5px 5px 5px"},children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",height:"100%",children:[!_&&(0,o.createFragment)([(0,o.createVNode)(1,"div",null,"Insufficient access to interact.",16,{style:{color:"#ff3333","text-align":"center"}}),(0,o.createComponentVNode)(2,a.Divider)],4),(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.ProgressBar,{value:N,maxValue:v,mb:1,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",bold:!0,children:"Materials"}),N," / ",v]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:0,shrink:0,ml:1,children:(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,icon:"dollar-sign",disabled:L<=0,onClick:function(){return C(1)}})})]}),y&&(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Occupant",children:M}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Health",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:{bad:[-Infinity,.15],average:[.15,.75],good:[.75,Infinity]},value:A,children:B<2?A<=0?(0,o.createComponentVNode)(2,a.Box,{color:"bad",children:[(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle"})," Critical"]}):(100*A).toFixed(0)+"%":(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"skull"})," Deceased"]})})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stability",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:{bad:[-Infinity,15],average:[15,75],good:[75,Infinity]},value:T,maxValue:100})})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,style:{overflow:"hidden"},children:b.map((function(e){return(0,o.createComponentVNode)(2,a.ProgressBar,{value:e.total-e.current,maxValue:e.total,mb:1,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",children:e.name}),(0,o.createComponentVNode)(2,a.TimeDisplay,{timing:!0,value:e.current,format:l})]},e.ref)}))}),!!I&&(0,o.createComponentVNode)(2,a.NoticeBox,{info:!w,danger:!!w,children:I}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:V.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.label,children:e.cooldown<0?"Ready":(0,o.createComponentVNode)(2,a.TimeDisplay,{timing:!0,value:e.cooldown,format:l})},e.label)}))})]})}),(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Box,{ml:"250px",children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"flask",selected:"research"===p,onClick:function(){return m("research")},children:"Research"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"radiation",selected:"mutations"===p,onClick:function(){return m("mutations")},children:"Mutations"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"server",selected:"storage"===p||!S&&"record"===p,onClick:function(){return m("storage")},children:"Storage"}),!!S&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"save",selected:"record"===p,onClick:function(){return m("record")},rightSlot:"record"===p&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times",onClick:function(){return d("clearrecord")}}),children:"Record"}),y&&(0,o.createComponentVNode)(2,a.Tabs.Tab,{icon:"dna",selected:"scanner"===p,onClick:function(){return m("scanner")},children:"Scanner"})]}),null!==h&&(0,o.createComponentVNode)(2,c.BuyMaterialsModal,{maxAmount:L}),!!g&&(0,o.createComponentVNode)(2,c.CombineGenesModal),"research"===p&&(0,o.createComponentVNode)(2,c.ResearchTab,{maxBuyMats:L,setBuyMats:C}),"mutations"===p&&(0,o.createComponentVNode)(2,c.MutationsTab),"storage"===p&&(0,o.createComponentVNode)(2,c.StorageTab),"record"===p&&(S?(0,o.createComponentVNode)(2,c.RecordTab):(0,o.createComponentVNode)(2,c.StorageTab)),"scanner"===p&&(0,o.createComponentVNode)(2,c.ScannerTab)]})})})]})})}},92195:function(e,t,n){"use strict";t.__esModule=!0,t.AppearanceEditor=void 0;var o=n(96323),r=n(31246),a=n(26949);t.AppearanceEditor=function(e,t){var n=(0,r.useBackend)(t).act,c=e.preview,l=e.hairStyles,u=e.skin,d=e.eyes,s=e.color1,p=e.color2,m=e.color3,f=e.style1,h=e.style2,C=e.style3,g=e.fixColors,N=e.hasEyes,v=e.hasSkin,b=e.hasHair,V=e.channels;return(0,o.createComponentVNode)(2,a.Section,{title:"Appearance Editor",buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("editappearance",{apply:!0})},icon:"user",color:"good",children:"Apply Changes"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("editappearance",{cancel:!0})},icon:"times",color:"bad"})],4),children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{shrink:"1",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!v&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Skin Tone",children:(0,o.createComponentVNode)(2,i,{color:u,onChange:function(e){return n("editappearance",{skin:e})}})}),!!N&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Eye Color",children:(0,o.createComponentVNode)(2,i,{color:d,onChange:function(e){return n("editappearance",{eyes:e})}})}),!(!v&&!N||!V[0])&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[0]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[0],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:f,onSelected:function(e){return n("editappearance",{style1:e})},options:l})}),!!V[0]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[0].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:s,onChange:function(e){return n("editappearance",{color1:e})},fix:g})}),!!V[1]&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[1]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[1],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:h,onSelected:function(e){return n("editappearance",{style2:e})},options:l})}),!!V[1]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[1].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:p,onChange:function(e){return n("editappearance",{color2:e})},fix:g})}),!!V[2]&&(0,o.createComponentVNode)(2,a.LabeledList.Divider),!!V[2]&&!!b&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[2],children:(0,o.createComponentVNode)(2,a.Dropdown,{width:20,selected:C,onSelected:function(e){return n("editappearance",{style3:e})},options:l})}),!!V[2]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:V[2].replace(/ Detail$/,"")+" Color",children:(0,o.createComponentVNode)(2,i,{color:m,onChange:function(e){return n("editappearance",{color3:e})},fix:g})})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:"80px",shrink:"0",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:c,type:"map"},style:{width:"80px",height:"160px"}})})]})})};var i=function(e,t){var n=e.color,r=e.onChange,i=e.fix,c=parseInt(n.substr(1,2),16),l=parseInt(n.substr(3,2),16),u=parseInt(n.substr(5,2),16),d=function(e,t,n){r&&r("#"+e.toString(16).padStart(2,"0")+t.toString(16).padStart(2,"0")+n.toString(16).padStart(2,"0"))};return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.ColorBox,{color:n}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:c,color:"red",onChange:function(e,t){return d(Math.round(t),l,u)}}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:l,color:"green",onChange:function(e,t){return d(c,Math.round(t),u)}}),(0,o.createComponentVNode)(2,a.Knob,{inline:!0,ml:1,minValue:i?50:0,maxValue:i?190:255,value:u,color:"blue",onChange:function(e,t){return d(c,l,Math.round(t))}})]})}},11265:function(e,t,n){"use strict";t.__esModule=!0,t.GeneList=t.Description=t.BioEffect=t.onCooldown=t.haveDevice=t.ResearchLevel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(89613),c=n(59450),l=n(43024),u=["genes","noSelection","noGenes"];function d(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var p={None:0,InProgress:1,Done:2,Activated:3};t.ResearchLevel=p;var m=function(e,t){for(var n,o=d(e);!(n=o()).done;){var r=n.value,a=r.label;r.cooldown;if(a===t)return!0}return!1};t.haveDevice=m;var f=function(e,t){for(var n,o=d(e);!(n=o()).done;){var r=n.value,a=r.label,i=r.cooldown;if(a===t)return i>0}return!0};t.onCooldown=f;var h=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"booth",null),p=s[0],h=s[1],g=u.materialCur,N=u.researchCost,v=u.equipmentCooldown,b=u.saveSlots,V=u.savedMutations,y=u.subject,x=u.boothCost,k=u.injectorCost,S=u.precisionEmitter,I=u.toSplice,w=e.gene,_=e.showSequence,D=e.isSample,M=e.isPotential,B=e.isActive,A=e.isStorage,T=w.ref,L=w.name,E=w.desc,P=w.icon,j=w.research,O=w.canResearch,F=w.canInject,R=w.canScramble,z=w.canReclaim,W=w.spliceError,U=w.dna,H=U.every((function(e){return!e.style})),G=U.every((function(e){return!e.style||"locked"===e.marker})),Y=B||A;return(0,o.createComponentVNode)(2,a.Section,{title:L,buttons:(0,o.createComponentVNode)(2,l.GeneIcon,{name:P,size:1.5}),children:[p&&p.ref===T&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Section,{width:35,title:L,style:{margin:"-10px","margin-right":"2px"},buttons:(0,o.createComponentVNode)(2,l.GeneIcon,{name:P,size:4,style:{"margin-top":"-2px","margin-right":"-4px"}}),children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Price",children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:0,maxValue:999999,width:5,value:p.price,onChange:function(e,t){return h({ref:p.ref,price:t,desc:p.desc})}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:(0,o.createComponentVNode)(2,a.Input,{width:25,value:p.desc,onChange:function(e,t){return h({ref:p.ref,price:p.price,desc:t})}})})]}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",mt:2,children:(0,o.createComponentVNode)(2,a.Button,{icon:"person-booth",color:"good",disabled:x>g,onClick:function(){return d("booth",p)},children:"Send to Booth"})}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){return h(null)},children:"Cancel"})})]})}),(0,o.createComponentVNode)(2,i.UnlockModal),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{mr:1,style:{float:"left"},children:[(0,o.createComponentVNode)(2,a.Icon,{color:j>=3?"good":j>=2?"teal":j>=1?"average":"bad",name:j>=2?"flask":j>=1?"hourglass":"times"}),j>=2?" Researched":j>=1?" In Progress":" Not Researched"]}),!B&&!!O&&0===j&&(0,o.createComponentVNode)(2,a.Button,{icon:"flask",disabled:N>g,onClick:function(){return d("researchmut",{ref:T,sample:!!D})},color:"teal",children:"Research"}),M&&(0,o.createComponentVNode)(2,a.Button,{icon:"check",disabled:!H,onClick:function(){return d("activate",{ref:T})},color:"blue",children:"Activate"}),j>=3&&!H&&(0,o.createComponentVNode)(2,a.Button,{icon:"magic",disabled:G,onClick:function(){return d("autocomplete",{ref:T})},children:"Autocomplete DNA"}),m(v,"Analyzer")&&!H&&M&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Analyzer"),icon:"microscope",color:"average",onClick:function(){return d("analyze",{ref:T})},children:"Check Stability"}),m(v,"Reclaimer")&&Y&&!!z&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Reclaimer"),icon:"times",color:"bad",onClick:function(){return d("reclaim",{ref:T})},children:"Reclaim"}),x>=0&&j>=2&&Y&&(0,o.createComponentVNode)(2,a.Button,{disabled:g<x,icon:"person-booth",color:"good",onClick:function(){return h({ref:T,price:200,desc:""})},children:"Sell at Booth"}),!!S&&j>=2&&M&&!!R&&(0,o.createComponentVNode)(2,a.Button,{icon:"radiation",disabled:f(v,"Emitter")||y.stat>0,color:"bad",onClick:function(){return d("precisionemitter",{ref:T})},children:"Scramble Gene"}),b>0&&j>=2&&B&&(0,o.createComponentVNode)(2,a.Button,{disabled:b<=V.length,icon:"save",color:"average",onClick:function(){return d("save",{ref:T})},children:"Store"}),j>=2&&!!F&&m(v,"Injectors")&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Injectors"),icon:"syringe",onClick:function(){return d("activator",{ref:T})},children:"Activator"}),j>=2&&!!F&&k>=0&&Y&&(0,o.createComponentVNode)(2,a.Button,{disabled:f(v,"Injectors")||g<k,icon:"syringe",onClick:function(){return d("injector",{ref:T})},color:"bad",children:"Injector"}),Y&&!!I&&(0,o.createComponentVNode)(2,a.Button,{disabled:!!W,icon:"map-marker-alt",onClick:function(){return d("splicegene",{ref:T})},tooltip:W,tooltipPosition:"left",children:"Splice"}),A&&y&&(0,o.createComponentVNode)(2,a.Button,{icon:"check",onClick:function(){return d("addstored",{ref:T})},color:"blue",children:"Add to Occupant"}),A&&(0,o.createComponentVNode)(2,a.Button,{icon:"trash",onClick:function(){return d("deletegene",{ref:T})},color:"bad"}),(0,o.createComponentVNode)(2,a.Box,{inline:!0})]}),(0,o.createComponentVNode)(2,C,{text:E}),_&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.DNASequence,Object.assign({},e)))]})};t.BioEffect=h;var C=function(e,t){return e.text.split(/<br ?\/?>/g).map((function(e,t){return(0,o.createVNode)(1,"p",null,e,0,null,t)}))};t.Description=C;t.GeneList=function(e,t){var n,i=(0,r.useBackend)(t),c=i.data,l=i.act,d=c.activeGene,s=e.genes,m=e.noSelection,f=e.noGenes,C=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,u),g=s.find((function(e){return e.ref===d})),N=((n={})[p.None]={icon:"question",color:"grey"},n[p.InProgress]={icon:"hourglass",color:"average"},n[p.Done]={icon:"flask",color:"teal"},n[p.Activated]={icon:"flask",color:"good"},n);return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,mb:1,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{icon:N[e.research].icon,color:e.ref===d?"black":N[e.research].color,onClick:function(){return l("setgene",{ref:e.ref})},tooltip:e.research===p.InProgress?"Researching...":e.name,tooltipPosition:"left",width:"80%"})},e.ref)}))}),!s.length&&(f||"No genes found."),!!s.length&&!g&&(m||"Select a gene to view it."),g&&(0,o.normalizeProps)((0,o.createComponentVNode)(2,h,Object.assign({gene:g,showSequence:!0},C),g.ref))],0)}},59450:function(e,t,n){"use strict";t.__esModule=!0,t.Nucleotide=t.DNASequence=void 0;var o=n(96323),r=n(31246),a=n(26949),i=["letter","type","mark","useLetterColor"];var c={"?":"grey",A:"red",T:"blue",C:"yellow",G:"green"},l={"":"good",X:"grey",1:"good",2:"olive",3:"average",4:"orange",5:"bad"};t.DNASequence=function(e,t){for(var n=(0,r.useBackend)(t).act,i=e.gene,c=e.isPotential,d=i.dna,s=!0,p=[],m=0;m<d.length;m++)m%4==0&&p.push([]),p[p.length-1].push(d[m]),d[m].style&&(s=!1);var f=function(e){c&&n("advancepair",{ref:i.ref,pair:e})};return p.map((function(e,t){return(0,o.createVNode)(1,"table",null,[(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,u,{letter:e.pair.charAt(0),type:e.style,mark:e.marker,useLetterColor:s,onClick:function(){return f(4*t+n+1)}}),2,null,n)})),0),(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,s?"|":"locked"===e.marker?(0,o.createComponentVNode)(2,a.Icon,{name:"lock",color:"average",onClick:function(){return f(4*t+n+1)}}):(0,o.createComponentVNode)(2,a.Icon,{name:""===e.style?"check":"5"===e.style?"times":"question",color:l[e.style]}),0,{style:{"text-align":"center"}},n)})),0),(0,o.createVNode)(1,"tr",null,e.map((function(e,n){return(0,o.createVNode)(1,"td",null,(0,o.createComponentVNode)(2,u,{letter:e.pair.charAt(1),type:e.style,mark:e.marker,useLetterColor:s,onClick:function(){return f(4*t+n+1)}}),2,null,n)})),0)],4,{style:{display:"inline-table","margin-top":"1em","margin-left":t%4==0?"0":"0.25em","margin-right":t%4==3?"0":"0.25em"}},t)}))};var u=function(e){var t=e.letter,n=e.type,r=(e.mark,e.useLetterColor),u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),d=r?c[t]:l[n];return(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Button,Object.assign({width:"1.75em",textAlign:"center",color:d},u,{children:t})))};t.Nucleotide=u},43024:function(e,t,n){"use strict";t.__esModule=!0,t.GeneIcon=void 0;var o=n(96323),r=n(1060),a=n(54425),i=["name","size","style"];var c=function(e){var t=e.name,n=e.size,c=e.style,l=void 0===c?{}:c,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i);return n&&(l["font-size"]=100*n+"%"),(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Box,Object.assign({as:"i",className:(0,r.classes)(["GeneIcon","GeneIcon--"+t]),style:l},u)))};t.GeneIcon=c,c.defaultHooks=r.pureComponentHooks},33012:function(e,t,n){"use strict";t.__esModule=!0,t.StorageTab=t.RecordTab=t.ScannerTab=t.ResearchTab=t.MutationsTab=t.UnlockModal=t.CombineGenesModal=t.BuyMaterialsModal=void 0;var o=n(78368);t.BuyMaterialsModal=o.BuyMaterialsModal;var r=n(39961);t.CombineGenesModal=r.CombineGenesModal;var a=n(89613);t.UnlockModal=a.UnlockModal;var i=n(22675);t.MutationsTab=i.MutationsTab;var c=n(93847);t.ResearchTab=c.ResearchTab;var l=n(49445);t.ScannerTab=l.ScannerTab;var u=n(64477);t.RecordTab=u.RecordTab,t.StorageTab=u.StorageTab},78368:function(e,t,n){"use strict";t.__esModule=!0,t.BuyMaterialsModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.BuyMaterialsModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"buymats",null),u=l[0],d=l[1],s=e.maxAmount,p=i.budget,m=i.costPerMaterial,f=Math.min(u,s);return(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Box,{position:"relative",width:18,children:[(0,o.createComponentVNode)(2,a.Box,{position:"absolute",right:1,top:0,children:(0,o.createComponentVNode)(2,a.Knob,{inline:!0,value:f,onChange:function(e,t){return d(t)},minValue:1,maxValue:s})}),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Purchase",children:[f,1===f?" Material":" Materials"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Budget",children:p+" Credits"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cost",children:f*m+" Credits"}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Remainder",children:[(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:p-f*m<0&&"bad",children:p-f*m})," Credits"]})]}),(0,o.createComponentVNode)(2,a.Divider,{hidden:!0}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"good",icon:"dollar-sign",disabled:f<=0,onClick:function(){c("purchasematerial",{amount:f}),d(null)},children:"Submit"})}),(0,o.createComponentVNode)(2,a.Box,{inline:!0,width:"50%",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return d(null)},children:"Cancel"})})]})})}},39961:function(e,t,n){"use strict";t.__esModule=!0,t.CombineGenesModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.CombineGenesModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"iscombining",!1),u=(l[0],l[1]),d=i.savedMutations,s=i.combining,p=void 0===s?[]:s;return(0,o.createComponentVNode)(2,a.Modal,{full:!0,width:20,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Select",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:p.indexOf(e.ref)>=0,onClick:function(){return c("togglecombine",{ref:e.ref})},children:e.name})},e.ref)}))})}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return u(!1)},children:"Cancel"}),(0,o.createComponentVNode)(2,a.Button,{icon:"sitemap",disabled:!p.length,onClick:function(){c("combinegenes"),u(!1)},children:"Combine"})]})]})}},89613:function(e,t,n){"use strict";t.__esModule=!0,t.UnlockModal=void 0;var o=n(96323),r=n(31246),a=n(26949);t.UnlockModal=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=(0,r.useSharedState)(t,"unlockcode",""),u=l[0],d=l[1],s=i.autoDecryptors,p=i.unlock;if(p)return(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:(0,o.createComponentVNode)(2,a.Box,{width:22,mr:2,children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Detected Length",children:[p.length," characters"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Possible Characters",children:p.chars.join(" ")}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Enter Unlock Code",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t.toUpperCase())}})}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Correct Characters",children:[p.correctChar," of ",p.length]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Correct Positions",children:[p.correctPos," of ",p.length]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Attempts Remaining",children:[p.tries," before mutation"]})]}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",mt:2,children:(0,o.createComponentVNode)(2,a.Button,{icon:"magic",color:"average",tooltip:"Auto-Decryptors Available: "+s,disabled:s<1,onClick:function(){d(""),c("unlock",{code:"UNLOCK"})},children:"Use Auto-Decryptor"})}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"right",mt:1,children:[(0,o.createComponentVNode)(2,a.Button,{mr:1,icon:"check",color:"good",tooltip:u.length!==p.length?"Code is the wrong length.":u.split("").some((function(e){return-1===p.chars.indexOf(e)}))?"Invalid character in code.":"",disabled:u.length!==p.length||u.split("").some((function(e){return-1===p.chars.indexOf(e)})),onClick:function(){d(""),c("unlock",{code:u})},children:"Attempt Decryption"}),(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"bad",onClick:function(){d(""),c("unlock",{code:null})},children:"Cancel"})]})]})})}},22675:function(e,t,n){"use strict";t.__esModule=!0,t.MutationsTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(11265);t.MutationsTab=function(e,t){var n=(0,r.useBackend)(t).data,c=(0,r.useSharedState)(t,"mutsortmode","time"),l=c[0],u=c[1],d=(0,r.useSharedState)(t,"showSequence",!1),s=d[0],p=d[1],m=(n.bioEffects||[]).slice(0);return"time"===l?m.sort((function(e,t){return e.time-t.time})):"alpha"===l&&m.sort((function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"time"===l?"clock":"sort-alpha-down",onClick:function(){return u("time"===l?"alpha":"time")},children:"Sort Mode"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"Show Sequence",checked:s,onClick:function(){return p(!s)}})]}),m.map((function(e){return(0,o.createComponentVNode)(2,i.BioEffect,{gene:e,showSequence:s},e.ref)}))],0)}},93847:function(e,t,n){"use strict";t.__esModule=!0,t.ResearchTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(11265);t.ResearchTab=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=c.materialCur,d=c.materialMax,s=c.budget,p=c.mutationsResearched,m=c.autoDecryptors,f=c.saveSlots,h=c.availableResearch,C=c.finishedResearch,g=c.savedMutations,N=c.research,v=e.maxBuyMats,b=e.setBuyMats;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Statistics",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"dollar-sign",disabled:v<=0,onClick:function(){return b(1)},children:"Purchase Additional Materials"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Research Materials",children:[u," / ",d]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Research Budget",children:[(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:s})," Credits"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mutations Researched",children:p}),f>0&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Mutations Stored",children:[g.length," / ",f]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Auto-Decryptors",children:m})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Available Research",children:h.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:"Tier "+(t+1),children:e.length?e.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:N[e.ref].name,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"flask",disabled:u<e.cost,onClick:function(){return l("research",{ref:e.ref})},color:"teal",children:"Research ("+e.cost+" mat, "+e.time+"s)"}),children:(0,o.createComponentVNode)(2,i.Description,{text:N[e.ref].desc})},e.ref)})):"No research is currently available at this tier."},t)}))}),(0,o.createComponentVNode)(2,a.Section,{title:"Finished Research",children:C.map((function(e,t){return(0,o.createComponentVNode)(2,a.Section,{title:"Tier "+(t+1),children:e.length?e.map((function(e){return(0,o.createComponentVNode)(2,a.Section,{title:N[e.ref].name,children:(0,o.createComponentVNode)(2,i.Description,{text:N[e.ref].desc})},N[e.ref].name)})):"No research has been completed at this tier."},t)}))})],4)}},49445:function(e,t,n){"use strict";t.__esModule=!0,t.ScannerTab=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(92195),c=n(11265),l=n(43024);t.ScannerTab=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=(0,r.useSharedState)(t,"changingmutantrace",!1),p=s[0],m=s[1],f=(0,r.useSharedState)(t,"togglePreview",!1),h=f[0],C=f[1],g=u.haveScanner,N=u.subject,v=u.modifyAppearance,b=u.equipmentCooldown,V=u.mutantRaces,y=N||{},x=y.preview,k=y.name,S=y.health,I=y.human,w=y.age,_=y.bloodType,D=y.mutantRace,M=y.canAppearance,B=y.premature,A=y.potential,T=y.active;return!p||N&&I&&!B||(p=!1,m(!1)),N?(0,o.createFragment)([!!p&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,width:20,mb:.5,children:"Change to which body type?"}),V.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Button,{color:"blue",disabled:D===e.name,mt:.5,onClick:function(){m(!1),d("mutantrace",{ref:e.ref})},children:[(0,o.createComponentVNode)(2,l.GeneIcon,{name:e.icon,size:1.5,style:{margin:"-4px","margin-right":"4px"}}),e.name]})},e.ref)})),(0,o.createComponentVNode)(2,a.Box,{mt:1,textAlign:"right",children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return m(!1)},children:"Cancel"})})]}),v?(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.AppearanceEditor,Object.assign({},v))):(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Occupant",children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Name",buttons:(0,c.haveDevice)(b,"Emitter")&&(0,o.createComponentVNode)(2,a.Button,{icon:"radiation",disabled:(0,c.onCooldown)(b,"Emitter")||S<=0,color:"bad",onClick:function(){return d("emitter")},children:"Scramble DNA"}),children:k}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Body Type",buttons:!!I&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{icon:"user",color:"blue",disabled:!!B,onClick:function(){return m(!0)},children:"Change"}),(0,o.createComponentVNode)(2,a.Button,{icon:"wrench",color:"average",disabled:!M,onClick:function(){return d("editappearance")}})],4),children:D}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Physical Age",buttons:!!I&&(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,color:"good",content:"DNA Render",checked:h,onClick:function(){return C(!h)}}),children:[w," years"]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blood Type",children:_})]})}),I&&h&&(0,o.createComponentVNode)(2,a.Flex.Item,{grow:0,shrink:0,children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:x,type:"map"},style:{width:"64px",height:"128px"},hideOnScroll:!0})})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Potential Genes",children:(0,o.createComponentVNode)(2,c.GeneList,{genes:A,noGenes:"All detected potential mutations are active.",isPotential:!0})}),(0,o.createComponentVNode)(2,a.Section,{title:"Active Mutations",children:(0,o.createComponentVNode)(2,c.GeneList,{genes:T,noGenes:"Subject has no detected mutations.",isActive:!0})})],4)],0):(0,o.createComponentVNode)(2,a.Section,{title:"Scanner Error",children:g?"Subject has absconded.":"Check connection to scanner."})}},64477:function(e,t,n){"use strict";t.__esModule=!0,t.RecordTab=t.StorageTab=void 0;var o=n(96323),r=n(31246),a=n(11265),i=n(26949);t.StorageTab=function(e,t){var n=(0,r.useBackend)(t),c=n.data,l=n.act,u=(0,r.useSharedState)(t,"menu","research"),d=(u[0],u[1]),s=(0,r.useSharedState)(t,"iscombining",!1),p=(s[0],s[1]),m=c.saveSlots,f=c.samples,h=c.savedMutations,C=c.savedChromosomes,g=c.toSplice,N=Object.values(C.reduce((function(e,t){return e[t.name]||(e[t.name]={name:t.name,desc:t.desc,count:0}),e[t.name].count++,e[t.name].ref=t.ref,e}),{}));return N.sort((function(e,t){return e.name>t.name?1:-1})),(0,o.createFragment)([m>0&&(0,o.createComponentVNode)(2,i.Section,{title:"Stored Mutations",buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"sitemap",onClick:function(){return p(!0)},children:"Combine"}),children:h.length?h.map((function(e){return(0,o.createComponentVNode)(2,a.BioEffect,{gene:e,showSequence:!0,isStorage:!0},e.ref)})):"There are no mutations in storage."}),(0,o.createComponentVNode)(2,i.Section,{title:"Stored Chromosomes",children:N.length?(0,o.createComponentVNode)(2,i.LabeledList,{children:N.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{disabled:e.name===g,icon:"map-marker-alt",onClick:function(){return l("splicechromosome",{ref:e.ref})},children:"Splice"}),(0,o.createComponentVNode)(2,i.Button,{color:"bad",icon:"trash",onClick:function(){return l("deletechromosome",{ref:e.ref})}})],4),children:[e.desc,(0,o.createComponentVNode)(2,i.Box,{mt:.5,children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,color:"grey",children:"Stored Copies:"})," ",e.count]})]},e.ref)}))}):"There are no chromosomes in storage."}),(0,o.createComponentVNode)(2,i.Section,{title:"DNA Samples",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:f.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"save",onClick:function(){l("setrecord",{ref:e.ref}),d("record")},children:"View Record"}),children:(0,o.createVNode)(1,"tt",null,e.uid,0)},e.ref)}))})})],0)};t.RecordTab=function(e,t){var n=(0,r.useBackend)(t).data.record;if(n){var c=n.name,l=n.uid,u=n.genes;return(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Section,{title:c,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Genetic Signature",children:(0,o.createVNode)(1,"tt",null,l,0)})})}),(0,o.createComponentVNode)(2,i.Section,{children:(0,o.createComponentVNode)(2,a.GeneList,{genes:u,noGenes:"No genes found in sample.",isSample:!0})})],4)}}},12302:function(e,t,n){"use strict";t.__esModule=!0,t.GimmickObject=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.GimmickObject=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.eventList,d=l.interactiveTypes,s=l.activeStage;l.icon,l.iconState;return(0,o.createComponentVNode)(2,i.Window,{title:"Gimmick Object Editor",width:675,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Edit Interactive Steps"}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:Object.keys(u).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:t,children:(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Move Step Down",children:(0,o.createComponentVNode)(2,a.Button,{icon:"angle-down",disabled:parseInt(e,10)>=u.length-1,onClick:function(){return c("move-down",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Move Step Down",children:(0,o.createComponentVNode)(2,a.Button,{icon:"angle-up",disabled:parseInt(e,10)<=0,onClick:function(){return c("move-up",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Make Active Step",children:(0,o.createComponentVNode)(2,a.Button,{icon:"play",disabled:parseInt(e,10)===parseInt(s,10)-1,onClick:function(){return c("active_step",{event:t})}})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Remove step from Gimmick",children:(0,o.createComponentVNode)(2,a.Button,{icon:"trash",color:"red",onClick:function(){return c("delete_event",{event:t})}})}),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Set Tool Interactive Flags (Blank will be AttackHand)",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Interactive Flags",children:Object.keys(d).map((function(n,r){return(0,o.createComponentVNode)(2,a.Button,{selected:u[e].interaction&d[n],onClick:function(){return c("interaction",{event:t,value:d[n]})},children:n},r)}))})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Hint appended to examine text",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:(0,o.createComponentVNode)(2,a.Input,{fluid:!0,value:u[e].description,onInput:function(e,n){return c("description",{event:t,value:n})}})})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Actionbar Duration",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Duration",children:[(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:u[e].duration,minValue:1,maxValue:9e4,onChange:function(e,n){return c("duration",{event:t,value:n})}}),"Seconds"]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Visible Text Appended after [src]",children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Visible Message",children:(0,o.createComponentVNode)(2,a.Input,{fluid:!0,value:u[e].message,onInput:function(e,n){return c("message",{event:t,value:n})}})})})]}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Notify in-game admins that action was performed",children:(0,o.createComponentVNode)(2,a.Button,{icon:"flag",selected:u[e].notify,onClick:function(){return c("notify",{event:t,value:!u[e].notify})},children:"Notify Admins"})})]})})},t)}))}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("add_new")},children:"Add Event"})})]})})})}},96608:function(e,t,n){"use strict";t.__esModule=!0,t.GlassRecycler=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=function(e){var t=e.product,n=t.name,r=t.cost,i=t.img,l=e.disabled,u=e.onClick;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:(0,c.capitalize)(n)}),(0,o.createComponentVNode)(2,a.Box,{children:"Cost: "+r+" "+(0,c.pluralize)("Unit",r)})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:u,disabled:l,children:"Create"})})]}),(0,o.createComponentVNode)(2,a.Divider)],4)};t.GlassRecycler=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.glassAmt,p=d.products,m=(0,r.useLocalState)(t,"filter-available",!1),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Glass Recycler",width:300,height:400,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{children:"Glass: "+s+" "+(0,c.pluralize)("Unit",s)})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:f,onClick:function(){return h(!f)},children:"Filter Available"})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,title:"Products",children:p.filter((function(e){var t=e.cost;return!f||s>=t})).map((function(e){var t=e.cost,n=e.type;return(0,o.createComponentVNode)(2,l,{product:e,disabled:s<t,onClick:function(){return u("create",{type:n})}},n)}))})})]})})})}},21381:function(e,t,n){"use strict";t.__esModule=!0,t.HumanInventory=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c={slot_head:"Head",slot_wear_mask:"Mask",slot_glasses:"Eyes",slot_ears:"Ears",slot_l_hand:"Left Hand",slot_r_hand:"Right Hand",slot_gloves:"Gloves",slot_shoes:"Shoes",slot_belt:"Belt",slot_w_uniform:"Uniform",slot_wear_suit:"Outer Suit",slot_back:"Back",slot_wear_id:"ID",slot_l_store:"Left Pocket",slot_r_store:"Right Pocket"};t.HumanInventory=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act;return(0,o.createComponentVNode)(2,i.Window,{width:300,height:490,title:u.name,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:Object.entries(c).map((function(e){var t=e[0],n=e[1],r=u.slots.find((function(e){return e.id===t}));return(0,o.createComponentVNode)(2,l,{name:n,slot:r},t)}))})})}),Boolean(u.handcuffed||u.canSetInternal||u.internal)&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[Boolean(u.handcuffed)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("remove-handcuffs")},children:"Remove handcuffs"}),Boolean(u.canSetInternal)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("access-internals")},children:"Set internals"}),Boolean(u.internal)&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return d("access-internals")},children:"Remove internals"})]})})]})})})};var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.slot,c=e.name,l=i.id,u=i.item;return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:c,children:(0,o.createComponentVNode)(2,a.Button,{color:u?"default":"transparent",fluid:!0,onClick:function(){return n("access-slot",{id:l})},children:u||"Nothing"})})}},59818:function(){},92354:function(e,t,n){"use strict";t.__esModule=!0,t.Hypospray=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(18331);t.Hypospray=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.emagged,p=d.injectionAmount,m=d.reagentData;return(0,o.createComponentVNode)(2,i.Window,{width:320,height:300,theme:s?"syndicate":"nanotrasen",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:s?(0,l.glitch)("Contents",3):"Contents",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"times",color:"red",disabled:!m.totalVolume,onClick:function(){return u("dump")},children:"Dump"}),children:[(0,o.createComponentVNode)(2,c.ReagentGraph,{container:m}),(0,o.createComponentVNode)(2,c.ReagentList,{container:m})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Injection Amount",children:(0,o.createComponentVNode)(2,a.Slider,{value:p,format:function(e){return e+"u"},minValue:1,maxValue:m.maxVolume,step:1,stepPixelSize:10,onChange:function(e,t){return u("changeAmount",{amount:t})}})})]})})}},26513:function(e,t,n){"use strict";t.__esModule=!0,t.IDComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.name,c=e.colour,l=e.jobs,u=e.current_job,d=e.isCustomRank,s=e.accesses,p=e.target_accesses;return(0,o.createComponentVNode)(2,a.Section,{title:i,"class":"IDComputer__DeptBox "+(c&&"IDComputer__DeptBox_color_"+c),mb:"0.25rem",children:[l&&l.map((function(e,t){return(0,o.createFragment)([!d&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("assign",{assign:e,colour:c})},selected:e===u,children:e},e),d&&(0,o.createFragment)([e,(0,o.createComponentVNode)(2,a.Button,{icon:"save",tooltip:"Save",onClick:function(){return n("save",{save:t+1})},pl:"10px",mx:"0.2rem"}),(0,o.createComponentVNode)(2,a.Button,{icon:"check",tooltip:"Apply",onClick:function(){return n("apply",{apply:t+1})},pl:"10px",mx:"0.2rem",mr:"1rem"})],0)],0)})),s&&s.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("access",{access:e.id,allowed:!p.includes(e.id)})},selected:p.includes(e.id),children:e.name},e.id)}))]})};t.IDComputer=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.mode,s=u.manifest,p=u.target_name,m=u.target_owner,f=u.target_rank,h=u.target_card_look,C=u.scan_name,g=u.pronouns,N=u.custom_names,v=u.target_accesses,b=u.standard_jobs,V=u.accesses_by_area,y=u.icons;return(0,o.createComponentVNode)(2,i.Window,{width:620,height:780,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"manifest"!==d,onClick:function(){return l("mode",{mode:0})},children:"ID Modification"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"manifest"===d,onClick:function(){return l("mode",{mode:1})},children:"Crew Manifest"})]}),"manifest"===d&&(0,o.createFragment)([(0,o.createVNode)(1,"h1",null,"Crew Manifest:",16),(0,o.createVNode)(1,"em",null,"Please use the security record computer to modify entries.",16),(0,o.createComponentVNode)(2,a.Box,{my:"0.5rem",dangerouslySetInnerHTML:{__html:s}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("print")},icon:"print",children:"Print"})],4),"manifest"!==d&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Confirm identity",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("scan")},icon:"eject",preserveWhitespace:!0,children:C||"Insert card"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("modify")},icon:"eject",preserveWhitespace:!0,children:p||"Insert card or implant"})})]}),"authenticated"===d&&(0,o.createFragment)([(0,o.createVNode)(1,"hr"),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:2,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Registered",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("reg")},preserveWhitespace:!0,children:m&&m.trim()||"(blank)"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Assignment",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("assign",{assign:"Custom Assignment"})},preserveWhitespace:!0,children:f&&f.trim()||"Unassigned"})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Divider,{vertical:!0})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pronouns",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pronouns",{pronouns:"next"})},children:g||"None"}),g&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pronouns",{pronouns:"remove"})},icon:"trash",tooltip:"Remove"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"PIN",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("pin")},children:"****"})})]})})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Standard Job Assignment",children:[b.map((function(e){return e.jobs&&(0,o.createComponentVNode)(2,c,{name:e.name,colour:e.color,current_job:f,jobs:e.jobs},e.name)})),(0,o.createComponentVNode)(2,c,{name:"Custom",current_job:f,jobs:N,isCustomRank:!0})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Specific Area Access",children:V.map((function(e){return e.accesses.length>0&&(0,o.createComponentVNode)(2,c,{name:e.name,colour:e.color,accesses:e.accesses,target_accesses:v},e.name)}))}),(0,o.createComponentVNode)(2,a.Section,{title:"Custom Card Look",children:y.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("colour",{colour:e.style})},selected:e.card_look===h,children:[(0,o.createComponentVNode)(2,a.Image,{verticalAlign:"middle",my:"0.2rem",mr:"0.5rem",height:"24px",width:"24px",src:"data:image/png;base64,"+e.icon}),e.name]},e.style)}))})],0),"unauthenticated"===d&&C&&p&&(0,o.createComponentVNode)(2,a.NoticeBox,{mt:"0.5rem",warning:!0,children:["Identity ",(0,o.createVNode)(1,"em",null,C,0)," unauthorized to perform ID modifications."]})],0)]})})})}},23255:function(e,t,n){"use strict";t.__esModule=!0,t.Laundry=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.Laundry=function(e,t){var n=(0,r.useBackend)(t).data.on;return(0,o.createComponentVNode)(2,i.Window,{title:"Washman 550",width:400,height:100,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",mb:1,children:n?(0,o.createComponentVNode)(2,c):(0,o.createComponentVNode)(2,l)}),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d)]})]})})};var c=function(e,t){return(0,o.createComponentVNode)(2,a.NoticeBox,{warning:!0,children:"Please wait, machine is currently running."})},l=function(e,t){return(0,o.createComponentVNode)(2,a.NoticeBox,{info:!0,children:'Insert items and press "Turn On" to start.'})},u=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.on;return(0,o.createComponentVNode)(2,a.Button,{disabled:c,color:c?"":"good",icon:"fas fa-power-off",content:"Turn On",onClick:function(){return i("cycle")}})},d=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.on,u=c.door;return(0,o.createComponentVNode)(2,a.Button,{disabled:l,color:u?"orange":"",icon:u?"fas fa-door-open":"fas fa-door-closed",content:u?"Open":"Closed",onClick:function(){return i("door")}})}},84696:function(e,t,n){"use strict";t.__esModule=!0,t.ListInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(26949),c=n(57890),l=n(2381),u=n(31246);function d(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var p="undefined"!=typeof Promise?Promise.resolve().then.bind(Promise.resolve()):function(e){window.setTimeout(e,0)},m=function(e,t){var n=(f||(f=document.createElement("canvas"))).getContext("2d");return n.font=t,n.measureText(e).width},f=null,h=function(e,t){return window.getComputedStyle(e,null).getPropertyValue(t)};t.ListInputModal=function(e,t){var n=(0,u.useBackend)(t),s=n.act,f=n.data,N=f.items,v=void 0===N?[]:N,b=f.message,V=f.init_value,y=f.timeout,x=f.title,k=f.start_with_search,S=f.capitalize,I=f.theme,w=(0,u.useLocalState)(t,"selected",v.indexOf(V)),_=w[0],D=w[1],M=(0,u.useLocalState)(t,"searchBarVisible",1===k),B=M[0],A=M[1],T=(0,u.useLocalState)(t,"searchQuery",""),L=T[0],E=T[1],P=(0,u.useLocalState)(t,"windowWidth",null),j=P[0],O=P[1],F=function(e){if(e!==L){var t,n=R[_],o=v.filter((function(t){return t.toLowerCase().includes(e.toLowerCase())})),r=o.indexOf(n);if(-1===r&&o.length>0)D(0),null==(t=document.getElementById("0"))||t.scrollIntoView();else if(0!==o.length){var a;D(r),null==(a=document.getElementById(r.toString()))||a.scrollIntoView()}E(e)}},R=v.filter((function(e){return null==e?void 0:e.toLowerCase().includes(L.toLowerCase())})),z=325+Math.ceil((null==b?void 0:b.length)/3);B||setTimeout((function(){var e;return null==(e=document.getElementById(_.toString()))?void 0:e.focus()}),1);var W,U=j;if(null===j){for(var H,G=325,Y=(void 0===W&&(W=document.body),(h(W,"font-weight")||"normal")+" "+(h(W,"font-size")||"16px")+" "+(h(W,"font-family")||"Times New Roman")),Z=d(v);!(H=Z()).done;){var K=H.value;G=Math.max(G,m(K,Y))}p((function(){return O(G)})),U=G}return(0,o.createComponentVNode)(2,l.Window,{title:x,width:U,height:z,theme:I||"nanotrasen",children:[y&&(0,o.createComponentVNode)(2,r.Loader,{value:y}),(0,o.createComponentVNode)(2,l.Window.Content,{onkeydown:function(e){var t,n,o,r,a=B?document.getElementById("search_bar").getElementsByTagName("input")[0]:null,i=document.activeElement===a,l=R.length-1,u=window.event?e.which:e.keyCode,d=String.fromCharCode(e.keyCode).toLowerCase();if(u===c.KEY_DOWN||u===c.KEY_UP||u===c.KEY_PAGEUP||u===c.KEY_PAGEDOWN)e.preventDefault(),function(e){var t,n=R.length-1,o=-1;switch(e){case c.KEY_UP:o=-1;break;case c.KEY_DOWN:o=1;break;case c.KEY_PAGEUP:o=-10;break;case c.KEY_PAGEDOWN:o=10}var r=_+o;r<0&&1===Math.abs(o)&&(r=n),r>n&&1===Math.abs(o)&&(r=0),r<0&&(r=0),r>n&&(r=n),D(r),null==(t=document.getElementById(r.toString()))||t.focus()}(u);else{if("f"===d&&e.ctrlKey)return B||p((function(){return document.getElementById("search_bar").getElementsByTagName("input")[0].focus()})),A(!B),E(""),void e.preventDefault();if(u===c.KEY_ENTER)e.preventDefault(),s("submit",{entry:R[_]});else if(u===c.KEY_ESCAPE)e.preventDefault(),s("cancel");else if(u===c.KEY_END){var m;D(l),null==(m=document.getElementById(l.toString()))||m.focus(),e.preventDefault()}else if(u===c.KEY_HOME){var f;D(0),null==(f=document.getElementById("0"))||f.focus(),e.preventDefault()}else if(u===c.KEY_TAB&&B){var h=document.getElementById(_.toString());i&&h?h.focus():a&&!i&&a.focus(),e.preventDefault()}else!B&&u>=c.KEY_A&&u<=c.KEY_Z&&!e.ctrlKey&&(e.preventDefault(),e.stopPropagation(),t=u,o=String.fromCharCode(t),r=v.findIndex((function(e,t){return(null==e?void 0:e.toLowerCase().startsWith(null==o?void 0:o.toLowerCase()))&&t>_})),-1===r&&(r=v.findIndex((function(e,t){return(null==e?void 0:e.toLowerCase().startsWith(null==o?void 0:o.toLowerCase()))&&t<=_}))),-1!==r&&(D(r),null==(n=document.getElementById(r.toString()))||n.focus()))}},children:(0,o.createComponentVNode)(2,i.Section,{buttons:(0,o.createComponentVNode)(2,i.Button,{compact:!0,icon:B?"search":"font",selected:!0,tooltip:B?"Search Mode. Type to search or use arrow keys to select manually.":"Hotkey Mode. Type a letter to jump to the first match. Enter to select.",tooltipPosition:"left",onClick:function(){return A(!B),void E("")}}),className:"ListInput__Section",fill:!0,title:b,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,C,{filteredItems:R,onClick:function(e){e!==_&&D(e)},onFocusSearch:function(e){var t=B?document.getElementById("search_bar").getElementsByTagName("input")[0]:null;t.focus(),t.value+=e,F(t.value)},searchBarVisible:B,selected:_,capitalize:S})}),B&&(0,o.createComponentVNode)(2,g,{filteredItems:R,onSearch:F,searchQuery:L,selected:_}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,a.InputButtons,{input:R[_]})})]})})})]})};var C=function(e,t){var n=(0,u.useBackend)(t).act,r=e.filteredItems,a=e.onClick,c=e.onFocusSearch,l=e.searchBarVisible,d=e.selected,s=e.capitalize;return(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,tabIndex:0,children:r.map((function(e,t){return(0,o.createComponentVNode)(2,i.Button,{color:"transparent",fluid:!0,id:t,onClick:function(){return a(t)},onDblClick:function(e){e.preventDefault(),n("submit",{entry:r[d]})},onkeydown:function(e){var t=window.event?e.which:e.keyCode,n=String.fromCharCode(t);e.shiftKey||(n=n.toLowerCase()),l&&1===e.key.length&&(e.preventDefault(),e.stopPropagation(),c(n))},selected:t===d,style:{animation:"none",transition:"none"},children:s?e.replace(/^\w/,(function(e){return e.toUpperCase()})):e},t)}))})},g=function(e,t){var n=(0,u.useBackend)(t).act,r=e.filteredItems,a=e.onSearch,c=e.searchQuery,l=e.selected;return(0,o.createComponentVNode)(2,i.Input,{autoFocus:!0,autoSelect:!0,fluid:!0,id:"search_bar",onEnter:function(e){e.preventDefault(),n("submit",{entry:r[l]})},onInput:function(e,t){return a(t)},placeholder:"Search...",value:c})}},56596:function(e,t,n){"use strict";t.__esModule=!0,t.LocalGenerator=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(41161);t.LocalGenerator=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.holding,p=u.internalCell,m=u.connectedAPC,f=u.chargeAPC,h=u.boltsStatus,C=u.generatorStatus;return(0,o.createComponentVNode)(2,a.Window,{title:d,width:300,height:470,children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Section,{title:"Generator",children:(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("toggle-bolts")},icon:h?"toggle-on":"toggle-off",children:"Toggle Floor Bolts"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Status:"}),h?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"ACTIVE"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"average",children:"INACTIVE"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("toggle-generator")},icon:C?"toggle-on":"toggle-off",children:"Toggle Generator"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Status:"}),C?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"ACTIVE"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"average",children:"INACTIVE"})]})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Stack,{align:"baseline",children:[(0,o.createComponentVNode)(2,i.Stack.Item,{basis:"50%",children:(0,o.createComponentVNode)(2,i.Button,{width:11.4,onClick:function(){l("swap-target")},icon:"bolt",children:"Change Target"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:"Target:"}),f?(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"APC"}):(0,o.createComponentVNode)(2,i.Stack.Item,{color:"good",children:"CELL"})]})})]})}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:s,onEjectTank:function(){l("eject-tank")}}),(0,o.createComponentVNode)(2,i.Section,{title:"Internal Cell",height:7.25,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"eject",disabled:!p,onClick:function(){l("eject-cell")},children:"Eject"}),children:p?(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:p.name})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:p.chargePercent,minValue:0,maxValue:100,color:p.chargePercent<20?"red":p.chargePercent<50?"yellow":"green"})})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No cell"})}),(0,o.createComponentVNode)(2,i.Section,{title:"Local APC",height:7.25,buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"wifi",disabled:!s,onClick:function(){l("connect-APC")},children:"Connect"}),children:m?(0,o.createComponentVNode)(2,i.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{children:m.name})}),(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.ProgressBar,{value:m.chargePercent,minValue:0,maxValue:100,color:m.chargePercent<20?"red":m.chargePercent<50?"yellow":"green"})})]}):(0,o.createComponentVNode)(2,i.Box,{color:"average",children:"No connected APC"})})]})})})}},83329:function(){},56403:function(e,t,n){"use strict";t.__esModule=!0,t.LongRangeTeleporter=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.LongRangeTeleporter=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.destinations,d=l.receive_allowed,s=l.send_allowed,p=l.syndicate;return(0,o.createComponentVNode)(2,i.Window,{theme:p?"syndicate":"ntos",width:390,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Destinations",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:u.length?u.map((function(e){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:e.destination,children:[!!s&&(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",onClick:function(){return c("send",{target:e.ref,name:e.destination})},children:"Send"}),!!d&&(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",onClick:function(){return c("receive",{target:e.ref,name:e.destination})},children:"Receive"})]},e.destination)})):(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:"No destinations are currently available."})})})})})}},46045:function(e,t,n){"use strict";t.__esModule=!0,t.MechanicalDropper=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(51418),c=n(97622),l=n(26949),u=function(e){var t=e.transferMode,n=e.onTransferModeChange;return(0,o.createComponentVNode)(2,l.Section,{fitted:!0,py:.6,pl:.6,pr:1.2,children:(0,o.createComponentVNode)(2,l.Tabs,{vertical:!0,children:[(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:0===t,color:"green",onClick:function(){return n(0)},children:"Draw"}),(0,o.createComponentVNode)(2,l.Tabs.Tab,{selected:1===t,color:"red",onClick:function(){return n(1)},children:"Drop"})]})})},d=function(e){var t=e.curTransferAmt,n=e.minTransferAmt,r=e.maxTransferAmt,a=e.onTransferAmtChange,c=e.reagents;return(0,o.createComponentVNode)(2,l.Section,{children:[(0,o.createComponentVNode)(2,i.ReagentBar,{container:c}),(0,o.createComponentVNode)(2,l.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{textAlign:"center",width:"3em",content:"Min",onClick:function(){return a(n)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,l.Slider,{minValue:n,maxValue:r,stepPixelSize:20,step:1,value:t,onChange:function(e,t){return a(t)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{textAlign:"center",width:"3em",content:"Max",onClick:function(){return a(r)}})})]})]})};t.MechanicalDropper=function(e,t){var n=(0,a.useBackend)(t),i=n.act,s=n.data,p=s.curTransferAmt,m=s.minTransferAmt,f=s.maxTransferAmt,h=s.transferMode,C=s.reagents;return(0,o.createComponentVNode)(2,r.Window,{title:"Mechanical Dropper",width:400,height:105,children:(0,o.createComponentVNode)(2,r.Window.Content,{children:(0,o.createComponentVNode)(2,l.Stack,{children:[(0,o.createComponentVNode)(2,l.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,u,{transferMode:h,onTransferModeChange:function(e){i("mode",{mode:e})}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,d,{curTransferAmt:p,minTransferAmt:m,maxTransferAmt:f,onTransferAmtChange:function(e){e=(0,c.round)((0,c.clamp)(e,m,f),1),i("amt",{amt:e})},reagents:C})})]})})})}},17526:function(e,t,n){"use strict";t.__esModule=!0,t.MineralMagnet=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.MineralMagnet=function(e,t){var n,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.isLinked,p=d.magnetActive,m=d.magnetAutomaticMode,f=d.magnetCooldownOverride,h=d.magnetHealth,C=d.magnetLastUsed,g=d.time,N=d.linkedMagnets||[],v=d.miningEncounters||[],b=C>g,V=(0,r.useLocalState)(t,"viewEncounters",!1),y=V[0],x=V[1];return(0,o.createComponentVNode)(2,c.Window,{width:300,height:240,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Magnet Status",children:[(0,o.createComponentVNode)(2,a.Box,{children:["Condition: ",s?(n=h,n>=95?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"good",children:"Optimal"}):n>=70?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"olive",children:"Mild Structural Damage"}):n>=40?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"yellow",children:"Heavy Structural Damage"}):n>=10?(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"average",children:"Extreme Structural Damage"}):(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"Destruction Imminent"})):(0,o.createComponentVNode)(2,a.Box,{inline:!0,color:"bad",children:"No Magnet Linked"})]}),(0,o.createComponentVNode)(2,a.Box,{children:["Status: ",p?"Pulling New Mineral Source":b?(0,o.createFragment)([(0,o.createTextVNode)("Cooling Down: "),(0,o.createComponentVNode)(2,a.TimeDisplay,{value:Math.max(C-g,0),timing:!0,format:function(e){return(0,i.formatTime)(e)}})],4):"Idle"]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Magnet Controls",buttons:(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",icon:"rss",onClick:function(){return u("geoscan")},children:"Scan"}),children:[(!!p||b&&!f)&&(0,o.createComponentVNode)(2,a.Dimmer,{fontSize:1.75,pb:2,children:p?"Magnet Active":"On Cooldown"}),(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",color:b&&f&&"average",icon:"magnet",onClick:function(){return u("activatemagnet")},fluid:!0,children:"Activate Magnet"}),(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",color:b&&f&&"average",icon:"search",disabled:!v.length,onClick:function(){return x(!0)},fluid:!0,children:"Activate telescope location"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:f,onClick:function(){return u("overridecooldown")},style:{"z-index":"1"},children:"Override Cooldown"}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:m,onClick:function(){return u("automode")},style:{"z-index":"1"},children:"Automatic Mode"})]}),y&&(0,o.createComponentVNode)(2,a.Modal,{full:!0,ml:1,width:"230px",height:"200px",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:v.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){u("activateselectable",{encounter_id:e.id}),x(!1)},fluid:!0,children:e.name},e.id)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,pt:.5,color:"label",children:[(0,o.createComponentVNode)(2,a.Icon,{name:"search"})," Choose a location"]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{color:"bad",icon:"times",onClick:function(){return x(!1)},children:"Cancel"})})]})})]})}),!!s||(0,o.createComponentVNode)(2,a.Modal,{full:!0,ml:1,width:"270px",height:"200px",children:(0,o.createComponentVNode)(2,a.Section,{title:"Choose Linked Magnet",scrollable:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Button,{textAlign:"center",icon:"rss",fluid:!0,onClick:function(){return u("magnetscan")},children:"Scan for Magnets"}),(0,o.createComponentVNode)(2,a.Divider),N.map((function(e){var t;return(0,o.createComponentVNode)(2,a.Button,{icon:e.angle===undefined?"circle":"arrow-right",iconRotation:null!=(t=e.angle)?t:0,textAlign:"center",fluid:!0,onClick:function(){return u("linkmagnet",e)},children:e.name+" at ("+e.x+", "+e.y+")"},e.ref)}))]})})]})})}},2960:function(e,t,n){"use strict";t.__esModule=!0,t.Minimap=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.Minimap=function(e,t){var n=(0,r.useBackend)(t).data,c=n.title,l=n.theme,u=n.minimap_id;return(0,o.createComponentVNode)(2,i.Window,{title:c,theme:l,width:610,height:640,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:u,type:"map"},style:{width:"600px",height:"600px"}})})})}},3082:function(e,t,n){"use strict";t.__esModule=!0,t.MinimapController=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331);t.MinimapController=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.title,s=u.theme,p=u.minimap_id,m=u.markers_visible,f=u.selecting_coordinates,h=u.minimap_markers,C=u.placable_marker_states,g=u.placable_marker_images,N=u.icon,v=u.image,b=u.pos_x,V=u.pos_y,y=(0,r.useLocalState)(t,"name"),x=y[0],k=y[1],S=(0,r.useLocalState)(t,"show_menu",!1),I=S[0],w=S[1];return(0,o.createComponentVNode)(2,i.Window,{title:d,theme:s,width:750,height:390,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{justify:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Minimap",fill:!0,buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"undo",color:"green",content:"Reset Map Scale",onClick:function(){return l("reset_scale")}}),children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{id:p,type:"map"},style:{width:"300px",height:"300px"}})})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:"Minimap Markers",fill:!0,buttons:(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",color:"green",content:"New",onClick:function(){return w(!I)}}),(0,o.createComponentVNode)(2,a.Button,{icon:m?"eye-slash":"eye",color:m?"red":"green",content:m?"Hide All":"Show All",onClick:function(){return l("toggle_visibility_all")}})]}),children:[!!I&&(0,o.createComponentVNode)(2,a.Modal,{mr:2,children:(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{backgroundColor:"black",children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,height:"150px",width:"150px",src:"data:image/png;base64,"+v})}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:"10px",children:[(0,o.createComponentVNode)(2,a.Input,{placeholder:"Marker Name",fluid:!0,value:x,onChange:function(e,t){return k(t)}}),(0,o.createComponentVNode)(2,a.Dropdown,{selected:N,width:"150px",options:C,onSelected:function(e){return function(e){u.icon=e,u.image=g[e],l("update_icon",{icon:e})}(e)},mt:"10px"}),(0,o.createComponentVNode)(2,a.Flex,{mt:"10px",justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{className:"minimap-controller__number-inputs",minValue:1,maxValue:300,value:b,format:function(e){return"x, "+e},onDrag:function(e,t){return function(e){u.pos_x=e}(t)}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{className:"minimap-controller__number-inputs",minValue:1,maxValue:300,value:V,format:function(e){return"y, "+e},onDrag:function(e,t){return function(e){u.pos_y=e}(t)}})})]}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",color:f?"orange":"default",content:f?"Select Position":"Select (x, y) From Map",onClick:function(){return l("location_from_minimap")},mt:"10px"}),(0,o.createComponentVNode)(2,a.Flex,{mt:"20px",justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"check",color:"green",content:"Confirm",onClick:function(){return w(!I),void l("new_marker",{name:x,icon:N,pos_x:b,pos_y:V})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"xmark",color:"red",content:"Cancel",onClick:function(){return w(!I),void l("cancel_new_marker")}})})]})]})]})})}),(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{children:Object.keys(h).map((function(e){return(0,o.createComponentVNode)(2,a.Flex,{className:"minimap-controller__marker-list",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{fontSize:1.1,bold:!0,children:(0,c.capitalize)(u.minimap_markers[e].name)}),(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,lineHeight:1.7,children:u.minimap_markers[e].pos})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{inline:!0,children:[(0,o.createComponentVNode)(2,a.Button,{className:"minimap-controller__buttons",icon:u.minimap_markers[e].visible?"eye":"eye-slash",color:u.minimap_markers[e].visible?"green":"red",onClick:function(){return l("toggle_visibility",{index:u.minimap_markers[e].index})}}),(0,o.createComponentVNode)(2,a.Button,{className:"minimap-controller__buttons",icon:"trash-alt",color:"red",disabled:!u.minimap_markers[e].can_be_deleted,onClick:function(){return l("delete_marker",{index:u.minimap_markers[e].index})}})]})]},u.minimap_markers[e])}))})})})})]})})]})})})}},93663:function(e,t,n){"use strict";t.__esModule=!0,t.MixerMachine=t.MixerItem=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.mixerItem,c=e.working;return(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Image,{verticalAlign:"middle",height:"24px",width:"24px",src:"data:image/png;base64,"+i.iconData}),(0,o.createComponentVNode)(2,a.Button,{nowrap:!0,icon:"eject",color:"blue",title:"Eject "+i.name,textAlign:"center",disabled:c,onClick:function(){return n("eject",{index:i.index})}}),(0,o.createComponentVNode)(2,a.Box,{nowrap:!0,as:"span",m:"0.25rem",textAlign:"center",children:i.name},i.index)]})};t.MixerItem=c;t.MixerMachine=function(e,t){var n=(0,r.useBackend)(t),l=n.data,u=n.act,d=l.mixerContents;return(0,o.createComponentVNode)(2,i.Window,{title:"Kitchen Helper",width:500,height:220,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{m:"0.25rem",vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Contents: ("+d.length+"/"+l.maxItems+")",children:d.length>0?d.map((function(e){return(0,o.createComponentVNode)(2,c,{mixerItem:e,working:l.working},e.index)})):"No contents in mixer"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{m:".25rem",children:[(0,o.createComponentVNode)(2,a.Button,{mt:"0.5rem",backgroundColor:"green",icon:"check",title:"Start Mixing",textAlign:"center",disabled:l.working||0===d.length,onClick:function(){return u("mix",{})},children:"Mix"}),(0,o.createComponentVNode)(2,a.Button,{backgroundColor:"blue",icon:"eject",title:"Eject All",textAlign:"center",disabled:l.working||0===d.length,onClick:function(){return u("ejectAll",{})},children:"Eject All"})]})]})})})}},5244:function(e,t,n){"use strict";t.__esModule=!0,t.MixingDesk=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.MixingDesk=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.voices,s=u.selected_voice,p=u.say_popup,m=(0,r.useSharedState)(t,"message",null),f=m[0],h=m[1];return(0,o.createComponentVNode)(2,i.Window,{height:375,width:370,children:(0,o.createComponentVNode)(2,i.Window.Content,{onkeydown:function(e){var t=String.fromCharCode(e.keyCode),n=!0;if("T"===t)l("say_popup");else if(27===e.keyCode&&p)l("cancel_say"),h("");else if(p)n=!1;else{var o=Number(t);String(o)===t?l("switch_voice",{id:o}):n=!1}n&&e.stopPropagation()},children:[!!p&&(0,o.createComponentVNode)(2,a.Modal,{children:["Say as ",s>0&&s<=d.length?d[s-1].name:"yourself",":",(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{pt:"5px",pr:"10px",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,selfClear:!0,width:20,value:f,onEnter:function(e,t){window.focus(),l("say",{message:t}),h("")},onChange:function(e,t){return h(t)}})}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("say",{message:f}),h("")},children:"Say"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){l("cancel_say"),h("")},children:"Cancel"})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Voice Synthesizer",children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[d.map((function(e,t){return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:t+1+" "+(0,c.truncate)(e.name,18)+(e.accent?" ["+e.accent+"]":""),labelColor:t+1===s?"red":"label",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"trash-alt",onClick:function(){return l("remove_voice",{id:t+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"bullhorn",onClick:function(){return l("say_popup",{id:t+1})}})]},e.name)})),(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"plus",onClick:function(){return l("add_voice")},disabled:d.length>=9})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{position:"right",content:"Press T to talk and 1-9 keys to switch voices. Press 0 to reset to your normal voice.",children:(0,o.createComponentVNode)(2,a.Icon,{name:"question-circle"})})})]})})]})]})]})})}},71417:function(e,t,n){"use strict";t.__esModule=!0,t.MusicInstrument=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(2381);t.MusicInstrument=function(e,t){var n=(0,a.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.notes,p=u.volume,m=u.transpose,f=u.keybindToggle,h=u.noteKeysString,C=(0,a.useLocalState)(t,"keyboardBindingsOrder",h.split("")),g=C[0],N=C[1],v=(0,a.useLocalState)(t,"keyboardActivekeys",{}),b=v[0],V=v[1],y=(0,a.useLocalState)(t,"keyOffset",0),x=y[0],k=y[1],S=function(){l(!f?"play_keyboard_on":"play_keyboard_off")},I=function(e){return e+m>=0&&e+m<s.length},w=function(e){if(I(e)&&!b[e]){l("play_note",{note:e+m,volume:p});var t=b;t[s[e]]=!0,V(t)}},_=function(e){if(I(e)){var t=b;t[s[e]]=!1,V(t)}},D=function(e){var t=x+g.findIndex((function(t){return t===e}));return t>=0?t:-1};return(0,o.createComponentVNode)(2,c.Window,{title:d,width:50+30*s.length,height:410,children:(0,o.createComponentVNode)(2,c.Window.Content,{onKeyUp:function(e){if(f){var t=D(e.key);_(t)}},onKeyDown:function(e){if(f){var t=D(e.key);w(t)}"Control"===e.key&&S()},children:(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyboardwrapper",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__outerpanel",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__speaker"}),(0,o.createComponentVNode)(2,i.Flex,{direction:"column",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyboardsupport",children:[(0,o.createComponentVNode)(2,i.Button,{className:"instrument__toggle-keyboard-button",title:"Toggle keyboard support (toggle with ctrl)",onClick:S,icon:"keyboard"}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keybind-indicator",style:{"box-shadow":"0px 0px 5px "+(f?"#1b9b37":"#5a1919"),background:f?"#1b9b37":"#5a1919"}})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:24,minValue:-24,maxValue:24,value:x,onDrag:function(e,t){return k(t)},title:"Keybind offset"}),(0,o.createVNode)(1,"span",null,"Offset",16)]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument_panel-info",children:(0,o.createVNode)(1,"h1",null,d.toUpperCase(),0,{style:{"text-align":"center"}})}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:1,minValue:0,maxValue:100,title:"Volume",value:p,onDrag:function(e,t){l("set_volume",{value:t})}}),(0,o.createVNode)(1,"span",null,"Volume",16)]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__panel-input",children:[(0,o.createComponentVNode)(2,i.Knob,{animated:!0,stepPixelSize:6,minValue:-12,maxValue:12,title:"Transpose",value:m,onDrag:function(e,t){l("set_transpose",{value:t})}}),(0,o.createVNode)(1,"span",null,"Transpose",16)]})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__keyorder",children:[(0,o.createComponentVNode)(2,i.Box,{className:"instrument__instructions",fontSize:"1.1em",children:"Key binding order for keyboard input"}),(0,o.createComponentVNode)(2,i.Input,{className:"instrument__input_keyorder",value:g.join(""),onInput:function(e,t){return N(t.split(""))}}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__instructions",fontSize:"0.8em",bold:!0,children:"Type in the order you wish the keybindings to be placed"})]})]}),(0,o.createComponentVNode)(2,i.Box,{className:"instrument__speaker"})]}),(0,o.createVNode)(1,"ul","instruments__piano",s.map((function(e,t){var n=e.includes("-"),a=g[t-x],c=n?"instruments__piano-key-black":"instruments__piano-key-white",l=["d","e","g","a","b"].includes(e.split("")[0])&&!n?"instruments__piano-key-white-offset":"";return(0,o.createVNode)(1,"li",(0,r.classes)(["instruments__piano-key",c,l,b[s[t]]?n?"instruments__piano-key-black-active":"instruments__piano-key-white-active":""]),(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notedetails",children:[a&&(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notekey",children:a}),(0,o.createComponentVNode)(2,i.Box,{className:"instruments__notename",children:e.replace("-","#")})]}),2,{onMouseDown:function(){return w(t)},onMouseLeave:function(){return _(t)},onMouseUp:function(){return _(t)}},t)})),0)]})})})}},14086:function(e,t,n){"use strict";t.__esModule=!0,t.NuclearReactor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=n(48175),u=n(97622),d=273.15,s=function(e){var t=e.onClick,n=e.components,r=e.rowID,i=e.emptySlotIcon;return(0,o.createComponentVNode)(2,a.Table.Row,{children:n.map((function(e,n){if(null===e)return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,color:"transparent",m:1,onClick:function(){return t("slot",{x:r+1,y:n+1})},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","border-color":"#AAAAAA","border-style":"solid","border-radius":"4px","horizontal-align":"middle"}})},name)});var s=e.x,p=e.y,m=e.name,f=e.img,h=e.temp,C=e.extra,g=e.flux;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,tooltip:(0,o.createFragment)([(0,c.capitalize)(m),(0,o.createVNode)(1,"br"),(0,u.round)(h-d,2),(0,o.createTextVNode)(" \xb0C"),""!==C?(0,o.createFragment)([(0,o.createVNode)(1,"br"),C],0):"",null!==g?(0,o.createFragment)([(0,o.createVNode)(1,"br"),g,(0,o.createTextVNode)(" Neutrons")],0):""],0),color:"transparent",m:1,onClick:function(){return t("slot",{x:s,y:p})},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+f,style:{"box-shadow":"0px 0px 20px "+(0,l.getTemperatureColor)(h,2e3),"vertical-align":"middle","border-color":""+(0,l.getTemperatureColor)(h,2e3),"border-style":"solid","border-radius":"4px","horizontal-align":"middle"}})},m)})}))})},p=function(e){var t=e.onClick,n=e.components,r=e.emptySlotIcon;return(0,o.createComponentVNode)(2,a.Table,{children:n.map((function(e,n){e.comp;return(0,o.createComponentVNode)(2,a.Table.Row,{children:(0,o.createComponentVNode)(2,s,{rowID:n,components:e,onClick:t,emptySlotIcon:r})},!0)}))})};t.NuclearReactor=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,s=l.gridW,m=l.gridH,f=l.emptySlotIcon,h=l.components,C=l.reactorTemp,g=l.reactorRads,N=l.configuredControlRodLevel,v=l.actualControlRodLevel;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Nuclear Reactor",width:500,height:700,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,p,{gridW:s,gridH:m,onClick:c,components:h,emptySlotIcon:f})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Reactor Temperature:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0-d,maxValue:1500,size:5,value:C,format:function(e){return(0,u.round)(e-d,2)+" \xb0C"},alertAfter:1200,ranges:{good:[0-d,1e3],average:[1e3,1200],bad:[1200,1500]}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Radiation Level:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0,maxValue:100,size:5,value:g,format:function(e){return(0,u.round)(e,1)+" clicks"},alertAfter:15,ranges:{good:[0,5],average:[5,50],bad:[50,100]}})]})]})}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Box,{children:"Control Rod Insertion:"}),(0,o.createComponentVNode)(2,a.RoundGauge,{minValue:0,maxValue:100,size:5,value:v,format:function(e){return(0,u.round)(e,1)+"%"},alertBefore:20,ranges:{bad:[0,20],average:[20,80],good:[80,100]}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-double-left",onClick:function(){return c("adjustCR",{crvalue:0})}}),(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-left",onClick:function(){return c("adjustCR",{crvalue:N-5})}}),N," %",(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-right",onClick:function(){return c("adjustCR",{crvalue:N+5})}}),(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:"angle-double-right",onClick:function(){return c("adjustCR",{crvalue:100})}}),(0,o.createComponentVNode)(2,a.Knob,{animated:!0,size:3,value:N,minValue:0,maxValue:100,format:function(e){return e+"%"},onDrag:function(e,t){return c("adjustCR",{crvalue:t})}})]})]})})]})})}},12660:function(e,t,n){"use strict";t.__esModule=!0,t.NumberInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(57890),c=n(31246),l=n(26949),u=n(2381);t.NumberInputModal=function(e,t){var n=(0,c.useBackend)(t),s=n.act,p=n.data,m=p.message,f=p.init_value,h=p.round_input,C=p.timeout,g=p.title,N=p.theme,v=(0,c.useLocalState)(t,"input",f),b=v[0],V=v[1],y=125+Math.ceil((null==m?void 0:m.length)/3);return(0,o.createComponentVNode)(2,u.Window,{title:g,width:270,height:y,theme:N||"nanotrasen",children:[C&&(0,o.createComponentVNode)(2,r.Loader,{value:C}),(0,o.createComponentVNode)(2,u.Window.Content,{onKeyDown:function(e){var t=window.event?e.which:e.keyCode;t===i.KEY_ENTER&&s("submit",{entry:b}),t===i.KEY_ESCAPE&&s("cancel")},children:(0,o.createComponentVNode)(2,l.Section,{fill:!0,children:(0,o.createComponentVNode)(2,l.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Box,{color:"label",children:m})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,d,{input:b,onClick:function(e){V(h?Math.round(e):e)},onChange:function(e){V(h?Math.round(e):e)}})}),(0,o.createComponentVNode)(2,l.Stack.Item,{pl:4,pr:4,children:(0,o.createComponentVNode)(2,a.InputButtons,{input:b})})]})})})]})};var d=function(e,t){var n=(0,c.useBackend)(t).data,r=n.min_value,a=n.max_value,i=n.init_value,u=e.input,d=e.onClick,s=e.onChange;return(0,o.createComponentVNode)(2,l.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"angle-double-left",onClick:function(){return d(r||0)},tooltip:"Minimum"})}),(0,o.createComponentVNode)(2,l.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,l.NumberInput,{autoFocus:!0,autoSelect:!0,fluid:!0,minValue:r,maxValue:a,onChange:function(e,t){return s(t)},onDrag:function(e,t){return s(t)},value:null!==u?u:i})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"angle-double-right",onClick:function(){return d(null!==a?a:1e4)},tooltip:"Max"})}),(0,o.createComponentVNode)(2,l.Stack.Item,{children:(0,o.createComponentVNode)(2,l.Button,{icon:"redo",onClick:function(){return d(i||0)},tooltip:"Reset"})})]})}},55223:function(e,t,n){"use strict";t.__esModule=!0,t.ObserverMenu=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=function(e,t){var n=(0,r.useBackend)(t).act,a=e.obsObject,c=null,l=a.name,u=null;return a.dead&&(c="skull"),a.name!==a.real_name&&(l+=" ("+a.real_name+")"),null!==a.job&&(u="Job: "+a.job),a.dup_name_count>0&&(l+=" #"+a.dup_name_count),a.ghost_count>0&&(c="ghost",l=a.ghost_count+" "+l),null!==a.antag&&(l+=" ["+a.antag+"]"),(0,o.createComponentVNode)(2,i.Button,{icon:c,onClick:function(){return n("observe",{targetref:a.ref})},tooltip:u,children:l},a.ref)};t.ObserverMenu=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=(0,r.useLocalState)(t,"searchQuery",""),s=d[0],p=d[1],m=u.mydata.filter((function(e){var t,n,o,r;return(null==e||null==(t=e.name)?void 0:t.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(n=e.real_name)?void 0:n.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(o=e.job)?void 0:o.toLowerCase().includes(s.toLowerCase()))||(null==e||null==(r=e.antag)?void 0:r.toLowerCase().includes(s.toLowerCase()))})),f=(0,r.useLocalState)(t,"filterDead",!1),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,a.Window,{title:"Choose something to observe",width:600,height:600,children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,title:"Observables",buttons:(0,o.createComponentVNode)(2,i.Flex,{children:[(0,o.createComponentVNode)(2,i.Button,{fluid:!0,id:"random_observe_button",disabled:0===u.mydata.filter((function(e){return e.player&&!e.dead})).length,onClick:function(){var e,t,n;return l("observe",{targetref:null==(t=u.mydata,n=t.filter((function(e){return e.player&&!e.dead})),e=n[Math.floor(Math.random()*n.length)])?void 0:e.ref})},icon:"random",tooltip:"Observe a random player"}),(0,o.createComponentVNode)(2,i.Button.Checkbox,{fluid:!0,icon:"skull",tooltip:h?"Show dead mobs":"Hide dead mobs",id:"dead_filter_button",checked:!h,onClick:function(){return C(!h)}}),(0,o.createComponentVNode)(2,i.Input,{width:20,autoFocus:!0,autoSelect:!0,fluid:!0,id:"search_bar",onInput:function(e,t){var n;(n=t)!==s&&p(n)},placeholder:"Search by name or job",value:s})]}),children:[(0,o.createComponentVNode)(2,i.Collapsible,{title:"Antagonists",open:!!u.dnrset,color:"red",children:[!u.dnrset&&(0,o.createComponentVNode)(2,i.BlockQuote,{children:"You must set DNR to view the antagonists"}),m.filter((function(e){return null!==e.antag&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))]},"Antags"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"Players",open:!0,color:"green",children:m.filter((function(e){return e.player&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"Players"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"NPCs",color:"blue",children:m.filter((function(e){return e.npc&&!(e.dead&&h)})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"NPCs"),(0,o.createComponentVNode)(2,i.Collapsible,{title:"Objects",color:"brown",children:m.filter((function(e){return!e.npc&&!e.player})).map((function(e){return(0,o.createComponentVNode)(2,c,{obsObject:e},e.ref)}))},"Objects")]})})})}},35851:function(e,t,n){"use strict";t.__esModule=!0,t.OperatingComputer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(65751),l=n(84200),u=n(51418),d=n(818),s=n(18331),p=n(9720);t.OperatingComputer=function(e,t){var n=(0,r.useSharedState)(t,"tabIndex",1),c=n[0],l=n[1];return(0,o.createComponentVNode)(2,i.Window,{title:"Operating Computer",width:"560",height:"760",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Tabs,{children:(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:1===c,onClick:function(){return l(1)},children:"Patient Health"})}),(0,o.createComponentVNode)(2,m,{tabIndex:c})]})})};var m=function(e){if(1===e.tabIndex)return(0,o.createComponentVNode)(2,C)},f=function(e){var t=e.occupied,n=e.patient_status,r=e.isCrit,i="NONE",c="grey";return t&&(2===n?(i="DEAD",c="red"):r?(i="CRIT",c="orange"):0!==n&&n?1===n&&(i="UNCON",c="yellow"):(i="STABLE",c="green")),(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Status"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,children:(0,o.createComponentVNode)(2,a.Box,{color:c,children:i})})]})},h=function(e){var t=e.health_text,n=e.health_color;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,textAlign:"right",children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Overall Health"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,children:(0,o.createComponentVNode)(2,a.Box,{color:n,children:[t,(0,o.createComponentVNode)(2,a.Box,{as:"span",color:"white",children:"%"})]})})]})},C=function(e,t){var n=(0,r.useBackend)(t).data;return(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,I,{occupied:n.occupied,patient_name:n.patient_name,patient_health:n.current_health,patient_max_health:n.max_health,patient_status:n.patient_status}),(0,o.createComponentVNode)(2,y),(0,o.createComponentVNode)(2,a.Section,{title:"Key Health Indicators",children:(0,o.createComponentVNode)(2,p.KeyHealthIndicators,{mobData:n})}),(0,o.createComponentVNode)(2,x,{occupied:n.occupied,organs:n.organ_status,limbs:n.limb_status}),(0,o.createComponentVNode)(2,k,{occupied:n.occupied,reagent_container:n.reagent_container}),(0,o.createComponentVNode)(2,S,{occupied:n.occupied,age:n.age,blood_type:n.blood_type,blood_color_value:n.blood_color_value,blood_color_name:n.blood_color_name,clone_generation:n.clone_generation,cloner_defect_count:n.cloner_defect_count,genetic_stability:n.genetic_stability})]})},g=function(e){var t=e.metric,n=e.value,r=e.metric_data,i=e.title;return(0,o.createComponentVNode)(2,a.Stack.Item,{width:25,children:(0,o.createComponentVNode)(2,c.HealthStat,{type:t,children:[i,(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Box,{fontSize:4,children:n}),(0,o.createComponentVNode)(2,a.Box,{children:(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:r,rangeX:[0,r.length-1],rangeY:[0,Math.max(100,(0,d.getStatsMax)(r))],strokeColor:l.COLORS.damageType[t],fillColor:l.COLORS.damageTypeFill[t]})})]})})},N=function(e){var t=e.occupied,n=e.organs;if(t)return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Organ"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Status"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,v,{organ:e.organ,state:e.state,color:e.color,special:e.special},e.organ)}))]})})},v=function(e){var t=e.organ,n=e.state,r=e.color,i=e.special;if("Okay"!==n||i)return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",width:10,children:[(0,s.capitalize)((0,s.spaceUnderscores)(t)),":"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:10,color:r,bold:"Missing"===n||"Dead"===n||"Critical"===n,children:["Okay"!==n&&n,i&&(0,o.createComponentVNode)(2,a.Box,{color:"white",children:i})]})]})},b=function(e){var t=e.occupied,n=e.limbs;if(t)return(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Limb"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Status"})]}),n.map((function(e){return(0,o.createComponentVNode)(2,V,{limb:e.limb,status:e.status},e.limb)}))]})})},V=function(e){var t=e.limb,n=e.status;if("Okay"!==n)return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",width:10,children:[(0,s.capitalize)((0,s.spaceUnderscores)(t)),":"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{width:10,color:"Missing"===n?"red":"white",bold:"Missing"===n,children:n})]})},y=function(e,t){var n=(0,r.useBackend)(t).data,i=(0,d.processStatsData)(n.patient_data),c=n.occupied?Math.floor(n.oxygen).toString():"--",l=n.occupied&&i?i.oxygen:[],u=n.occupied?Math.floor(n.toxin).toString():"--",s=n.occupied&&i?i.toxin:[],p=n.occupied?Math.floor(n.burn).toString():"--",m=n.occupied&&i?i.burn:[],f=n.occupied?Math.floor(n.brute).toString():"--",h=n.occupied&&i?i.brute:[];return(0,o.createComponentVNode)(2,a.Section,{title:"Vitals",children:(0,o.createComponentVNode)(2,a.Stack,{textAlign:"center",children:[(0,o.createComponentVNode)(2,g,{title:"Suffocation",value:c,metric_data:l,metric:"oxy"}),(0,o.createComponentVNode)(2,g,{title:"Toxin",value:u,metric_data:s,metric:"toxin"}),(0,o.createComponentVNode)(2,g,{title:"Burn",value:p,metric_data:m,metric:"burn"}),(0,o.createComponentVNode)(2,g,{title:"Brute",value:f,metric_data:h,metric:"brute"})]})})},x=function(e){var t=e.occupied,n=e.organs,r=e.limbs;return(0,o.createComponentVNode)(2,a.Section,{title:"Anatomical Anomalies",color:!t&&"grey",children:(0,o.createComponentVNode)(2,a.Stack,{children:[!!t&&(0,o.createComponentVNode)(2,N,{occupied:t,organs:n}),!!t&&(0,o.createComponentVNode)(2,b,{occupied:t,limbs:r}),!t&&"No Patient Detected"]})})},k=function(e){var t=e.occupied,n=e.reagent_container;return(0,o.createComponentVNode)(2,a.Section,{title:"Bloodstream Contents",children:[!!t&&(0,o.createComponentVNode)(2,u.ReagentGraph,{container:n}),!t&&"No Patient Detected"]})},S=function(e){var t=e.occupied,n=e.age,r=e.blood_type,i=e.blood_color_value,c=e.blood_color_name,l=e.clone_generation,u=e.cloner_defect_count,d=e.genetic_stability;return t?(0,o.createComponentVNode)(2,a.Section,{title:"Genetic Analysis",children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:20,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Age:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:n})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Blood Type:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:r})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Blood Color:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[(0,o.createComponentVNode)(2,a.ColorBox,{backgroundColor:i})," ",(0,o.createVNode)(1,"span",null,c,0)]})]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:14,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Clone Generation:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:l})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Genetic Defects:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:u})]}),(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,textAlign:"right",children:"Genetic Stability:"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:d})]})]})})]})}):(0,o.createComponentVNode)(2,a.Section,{title:"Genetic Analysis",color:"grey",children:"No Patient Detected"})},I=function(e){var t=e.occupied,n=e.patient_name,r=e.patient_health,i=e.patient_max_health,c=e.patient_status,l=t?"white":"grey",u=t&&r<0,d=t?Math.floor(100*r/i):0,s="--",p="grey";return t&&(i<=0?(p="purple",s="???"):(s=d.toString(),p=d>=51&&d<=100?"green":d>=1&&d<=50?"yellow":"red")),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:60,children:[(0,o.createComponentVNode)(2,a.Box,{fontSize:1,children:"Patient Name"}),(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,color:l,children:[!!n&&n,!n&&"No Patient Detected"]})]}),(0,o.createComponentVNode)(2,h,{health_text:s,health_color:p}),(0,o.createComponentVNode)(2,f,{occupied:t,patient_status:c,isCrit:u})]})}},36273:function(){},69412:function(e,t,n){"use strict";t.__esModule=!0,t.PaperSheet=t.PaperSheetView=void 0;var o,r=n(96323),a=n(57723),i=(o=n(12800))&&o.__esModule?o:{"default":o},c=n(31246),l=n(26949),u=n(2381),d=n(97622),s=n(81890);function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,C(e,t)}function m(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return f(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return f(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function h(){h=function(e,t){return new n(e,undefined,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,o,r){var a=new RegExp(e,o);return t.set(a,r||t.get(e)),C(a,n.prototype)}function o(e,n){var o=t.get(n);return Object.keys(o).reduce((function(t,n){return t[n]=e[o[n]],t}),Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&C(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);return n&&(n.groups=o(n,this)),n},n.prototype[Symbol.replace]=function(n,r){if("string"==typeof r){var a=t.get(this);return e[Symbol.replace].call(this,n,r.replace(/\$<([^>]+)>/g,(function(e,t){return"$"+a[t]})))}if("function"==typeof r){var i=this;return e[Symbol.replace].call(this,n,(function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(o(e,i)),r.apply(this,e)}))}return e[Symbol.replace].call(this,n,r)},h.apply(this,arguments)}function C(e,t){return C=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},C(e,t)}var g=5e3,N=function(e,t,n,o){return void 0===o&&(o=!1),'<span style="color:'+n+";font-family:"+t+";"+(o?"font-weight: bold;":"")+'">'+e+"</span>"},v=/\[(_+)\]/g,b=h(/\[<input[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+(?!disabled)(.*?)[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+id="(paperfield_[0-9]+)"(.*?)\/>\]/gm,{id:2}),V=/%s(?:ign)?(?=\\s|$)?/gim,y=function(e,t,n,o,r){var a=e.replace(v,(function(e,a,i,c){var l=function(e,t,n){t=n+"x "+t;var o=document.createElement("canvas").getContext("2d");return o.font=t,o.measureText(e).width}(e,t,n)+"px";return function(e,t,n,o,r,a){return'[<input type="text" style="font:\''+o+"x "+n+"';color:'"+r+"';min-width:"+t+";max-width:"+t+';" id="'+a+'" maxlength='+e+" size="+e+" />]"}(a.length,l,t,n,o,"paperfield_"+r++)}));return{counter:r,text:a}},x=function(e,t){var n=e.image,o=e.opacity,i=e.activeStamp,c={left:n.x+"px",top:n.y+"px",transform:"rotate("+n.rotate+"deg)",opacity:o||1};return n.sprite.match("stamp-.*")?(0,r.createVNode)(1,"img","paper__stamp",null,1,{id:i&&"stamp",style:c,src:(0,a.resolveAsset)(n.sprite)}):(0,r.createComponentVNode)(2,l.Box,{id:i&&"stamp",style:c,className:"paper__stamp-text",children:n.sprite})},k=function(e,t){var n,o,a=e.value,i=void 0===a?"":a,c=e.stamps,u=void 0===c?[]:c,d=e.backgroundColor,s=e.readOnly,p=u||[],m={__html:'<span class="paper-text">'+(n=i,o=s,(o?n.replace(/<input\s[^d]/g,"<input disabled "):n.replace(/<input\sdisabled\s/g,"<input "))+"</span>")};return(0,r.createComponentVNode)(2,l.Box,{className:"paper__page",position:"relative",backgroundColor:d,width:"100%",height:"100%",children:[(0,r.createComponentVNode)(2,l.Box,{color:"black",backgroundColor:d,fillPositionedParent:!0,width:"100%",height:"100%",dangerouslySetInnerHTML:m,p:"10px"}),p.map((function(e,t){return(0,r.createComponentVNode)(2,x,{image:{sprite:e[0],x:e[1],y:e[2],rotate:e[3]}},e[0]+t)}))]})};t.PaperSheetView=k;var S=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={x:0,y:0,rotate:0},o.style=null,o.handleMouseMove=function(e){var t=o.findStampPosition(e);t&&(!function(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.cancelBubble=!0,e.returnValue=!1}(e),o.setState({x:t[0],y:t[1],rotate:t[2]}))},o.handleMouseClick=function(e){e.pageY<=30||(0,(0,c.useBackend)(o.context).act)("stamp",{x:o.state.x,y:o.state.y,r:o.state.rotate})},o}p(t,e);var n=t.prototype;return n.findStampPosition=function(e){var t,n=document.querySelector(".Layout__content");e.shiftKey&&(t=!0);var o=document.getElementById("stamp");if(o){var r=o.clientHeight,a=o.clientWidth,i=t?this.state.y:e.pageY+n.scrollTop-r,c=t?this.state.x:e.pageX-a/2,l=n.clientWidth-a,u=n.clientHeight+n.scrollTop-r,s=Math.atan2(e.pageX-c,e.pageY-i),p=t?s*(180/Math.PI)*-1:this.state.rotate;return[(0,d.clamp)(c,0,l),(0,d.clamp)(i,0,u),p]}},n.componentDidMount=function(){document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("click",this.handleMouseClick)},n.componentWillUnmount=function(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("click",this.handleMouseClick)},n.render=function(){var e=this.props,t=e.value,n=e.stampClass,o=e.stamps||[],a={sprite:n,x:this.state.x,y:this.state.y,rotate:this.state.rotate};return(0,r.createFragment)([(0,r.createComponentVNode)(2,k,{readOnly:!0,value:t,stamps:o}),(0,r.createComponentVNode)(2,x,{activeStamp:!0,opacity:.5,image:a})],4)},t}(r.Component),I=function(e){function t(t,n){var o;return(o=e.call(this,t,n)||this).state={previewSelected:"Preview",oldText:t.value||"",textAreaText:"",combinedText:t.value||"",showingHelpTip:!1},o}p(t,e);var n=t.prototype;return n.createPreview=function(e,t){void 0===t&&(t=!1);var n,o,r=(0,c.useBackend)(this.context).data,a=r.text,l=r.penColor,u=r.penFont,d=r.isCrayon,p=r.fieldCounter,f=r.editUsr,h={text:a};if((e=e.trim()).length>0){var C=(0,s.sanitizeText)(e),g=(n=l,o=f,C.replace(V,(function(){return N(o,"Times New Roman",n,!0)}))),v=y(g,u,12,l,p),x=function(e){return(0,i["default"])(e,{breaks:!0,smartypants:!0,smartLists:!0,walkTokens:function(e){switch(e.type){case"url":case"autolink":case"reflink":case"link":case"image":e.type="text",e.href=""}},baseUrl:"thisshouldbreakhttp"})}(v.text),k=N(x,u,l,d);h.text+=k,h.fieldCounter=v.counter}if(t){var S=function(e,t,n,o,r){var a;void 0===r&&(r=!1);for(var i={},c=[];null!==(a=b.exec(e));){var l=a[0],u=a.groups.id;if(u){var d=document.getElementById(u);if(0===(d&&d.value?d.value:"").length)continue;var p=(0,s.sanitizeText)(d.value.trim(),[]);if(0===p.length)continue;var f=d.cloneNode(!0);p.match(V)?(f.style.fontFamily="Times New Roman",r=!0,f.defaultValue=o):(f.style.fontFamily=t,f.defaultValue=p),r&&(f.style.fontWeight="bold"),f.style.color=n,f.disabled=!0;var h=document.createElement("div");h.appendChild(f),i[u]=p,c.push({value:"["+h.innerHTML+"]",rawText:l})}}if(c.length>0)for(var C,g=m(c);!(C=g()).done;){var N=C.value;e=e.replace(N.rawText,N.value)}return{text:e,fields:i}}(h.text,u,l,f,d);h.text=S.text,h.formFields=S.fields}return h},n.onInputHandler=function(e,t){var n=this;if(t!==this.state.textAreaText){var o=this.state.oldText.length+this.state.textAreaText.length;if(o>g&&(t=o-g>=t.length?"":t.substr(0,t.length-(o-g)))===this.state.textAreaText)return;this.setState((function(){return{textAreaText:t,combinedText:n.createPreview(t)}}))}},n.finalUpdate=function(e){var t=(0,c.useBackend)(this.context).act,n=this.createPreview(e,!0);t("save",n),this.setState((function(){return{textAreaText:"",previewSelected:"save",combinedText:n.text}}))},n.render=function(){var e=this,t=this.props,n=t.textColor,o=t.fontFamily,a=t.stamps,i=t.backgroundColor;return(0,r.createComponentVNode)(2,l.Flex,{direction:"column",fillPositionedParent:!0,children:[(0,r.createComponentVNode)(2,l.Flex.Item,{children:(0,r.createComponentVNode)(2,l.Tabs,{size:"100%",children:[(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"Edit"===this.state.previewSelected?"grey":"white",selected:"Edit"===this.state.previewSelected,onClick:function(){return e.setState({previewSelected:"Edit"})},children:"Edit"},"marked_edit"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"Preview"===this.state.previewSelected?"grey":"white",selected:"Preview"===this.state.previewSelected,onClick:function(){return e.setState((function(){return{previewSelected:"Preview",textAreaText:e.state.textAreaText,combinedText:e.createPreview(e.state.textAreaText).text}}))},children:"Preview"},"marked_preview"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"confirm"===this.state.previewSelected?"red":"save"===this.state.previewSelected?"grey":"white",selected:"confirm"===this.state.previewSelected||"save"===this.state.previewSelected,onClick:function(){"confirm"===e.state.previewSelected?e.finalUpdate(e.state.textAreaText):"Edit"===e.state.previewSelected?e.setState((function(){return{previewSelected:"confirm",textAreaText:e.state.textAreaText,combinedText:e.createPreview(e.state.textAreaText).text}})):e.setState({previewSelected:"confirm"})},children:"confirm"===this.state.previewSelected?"Confirm":"Save"},"marked_done"),(0,r.createComponentVNode)(2,l.Tabs.Tab,{textColor:"black",backgroundColor:"white",icon:"question-circle-o",onmouseover:function(){e.setState({showingHelpTip:!0})},onmouseout:function(){e.setState({showingHelpTip:!1})},children:"Help"},"marked_help")]})}),(0,r.createComponentVNode)(2,l.Flex.Item,{grow:1,basis:1,children:"Edit"===this.state.previewSelected&&(0,r.createComponentVNode)(2,l.TextArea,{value:this.state.textAreaText,textColor:n,fontFamily:o,height:window.innerHeight-60+"px",backgroundColor:i,onInput:this.onInputHandler.bind(this)})||(0,r.createComponentVNode)(2,k,{value:this.state.combinedText,stamps:a,fontFamily:o,textColor:n})}),this.state.showingHelpTip&&(0,r.createComponentVNode)(2,w)]})},t}(r.Component);t.PaperSheet=function(e,t){var n=(0,c.useBackend)(t).data,o=n.editMode,a=n.text,i=n.paperColor,d=void 0===i?"white":i,s=n.penColor,p=void 0===s?"black":s,m=n.penFont,f=void 0===m?"Verdana":m,h=n.stamps,C=n.stampClass,g=n.sizeX,N=n.sizeY,v=n.name,b=h||[];return(0,r.createComponentVNode)(2,u.Window,{title:v,theme:"paper",width:g||400,height:N||500,children:(0,r.createComponentVNode)(2,u.Window.Content,{backgroundColor:d,scrollable:!0,children:(0,r.createComponentVNode)(2,l.Box,{id:"page",fitted:!0,fillPositionedParent:!0,children:function(e){switch(e){case 0:return(0,r.createComponentVNode)(2,k,{value:a,stamps:b,readOnly:!0});case 1:return(0,r.createComponentVNode)(2,I,{value:a,textColor:p,fontFamily:f,stamps:b,backgroundColor:d});case 2:return(0,r.createComponentVNode)(2,S,{value:a,stamps:b,stampClass:C});default:return"ERROR ERROR WE CANNOT BE HERE!!"}}(o)})})})};var w=function(){return(0,r.createComponentVNode)(2,l.Box,{position:"absolute",left:"10px",top:"25px",width:"300px",height:"350px",backgroundColor:"#E8E4C9",textAlign:"center",children:[(0,r.createVNode)(1,"h3",null,"Markdown Syntax",16),(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Heading"}),"====="]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"h2",null,"Heading",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Sub Heading"}),"------"]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"h4",null,"Sub Heading",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"_Italic Text_"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"i",null,"Italic Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"**Bold Text**"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"b",null,"Bold Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"`Code Text`"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"code",null,"Code Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:"~~Strikethrough Text~~"}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"s",null,"Strikethrough Text",16)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:[(0,r.createComponentVNode)(2,l.Box,{children:"Horizontal Rule"}),"---"]}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:["Horizontal Rule",(0,r.createVNode)(1,"hr")]})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:"* List Element 1"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"* List Element 2"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"* Etc..."})]})}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"ul",null,[(0,r.createVNode)(1,"li",null,"List Element 1",16),(0,r.createVNode)(1,"li",null,"List Element 2",16),(0,r.createVNode)(1,"li",null,"Etc...",16)],4)})]}),(0,r.createComponentVNode)(2,l.Table.Row,{children:[(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createComponentVNode)(2,l.Table,{children:[(0,r.createComponentVNode)(2,l.Table.Row,{children:"1. List Element 1"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"2. List Element 2"}),(0,r.createComponentVNode)(2,l.Table.Row,{children:"3. Etc..."})]})}),(0,r.createComponentVNode)(2,l.Table.Cell,{children:(0,r.createVNode)(1,"ol",null,[(0,r.createVNode)(1,"li",null,"List Element 1",16),(0,r.createVNode)(1,"li",null,"List Element 2",16),(0,r.createVNode)(1,"li",null,"Etc...",16)],4)})]})]})]})}},21293:function(e,t,n){"use strict";t.__esModule=!0,t.Particool=void 0;var o=n(96323),r=n(97622),a=n(97622),i=n(31246),c=n(26949),l=n(2381),u=n(79926),d=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.NumberInput,{value:n,stepPixelSize:5,width:"39px",onDrag:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"int"}})}})})},s=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return n=n||[1,0,0,1,0,0],(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:(0,o.createComponentVNode)(2,c.Flex.Item,{children:n.map((function(e,t){return(0,o.createComponentVNode)(2,c.NumberInput,{value:e,onDrag:function(e,o){n[t]=o,l("modify_particle_value",{new_data:{name:a,value:n,type:"matrix"}})}},t)}))})})})},p=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):m(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?0:{genType:"num",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"float":"generator"}})}})})]})})},m=function(e,t){var n=e.value,l=e.tooltip,u=e.name,d=(0,i.useBackend)(t).act,s=(0,i.useLocalState)(t,"particleFloatStep",.01),p=s[0];s[1];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:l,children:(0,o.createComponentVNode)(2,c.NumberInput,{value:n,stepPixelSize:4,step:p,format:function(e){return(0,r.toFixed)(e,(0,a.numberOfDecimalDigits)(p))},width:"80px",onDrag:function(e,t){return d("modify_particle_value",{new_data:{name:u,value:t,type:"float"}})}})})},f=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):C(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?[0,0,0]:{genType:"box",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"vector":"generator"}})}})})]})})},h=function(e){return function(t,n){var r=t.value,a=t.tooltip,l=t.name,u=(0,i.useBackend)(n).act;return r=r||Array(e).fill(0),isNaN(r)||(r=Array(e).fill(r)),r=r.slice(0,e),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:a,children:(0,o.createComponentVNode)(2,c.Flex,{children:(0,o.createComponentVNode)(2,c.Flex.Item,{children:r.map((function(e,t){return(0,o.createComponentVNode)(2,c.NumberInput,{value:e,width:"40px",onDrag:function(e,n){r[t]=n,u("modify_particle_value",{new_data:{name:l,value:r,type:"vector"}})}},t)}))})})})}},C=h(3),g=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n;return u=d?N(e,t):h(2)(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?[0,0]:{genType:"box",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"vector":"generator"}})}})})]})})},N=function(e,t){var n=e.value,r=e.name,a=(0,i.useBackend)(t).act,l="",d="",s="",p="";if(u.logger.log(n),n){var m=n.match(/\((.*)\)/);if(4===(m=(m=m||["","","",""])[1].split(", ")).length){l=m[0].replace(/['"]+/g,"");var f=m[1].match(/\((.*)\)/);d=f?f[1]:m[1].replace(/['"]+/g,"");var h=m[2].match(/\((.*)\)/);s=h?h[1]:m[2].replace(/['"]+/g,""),p=m[3]}}var C=(0,i.useLocalState)(t,r+"genType",l),g=C[0],N=C[1],v=(0,i.useLocalState)(t,r+"a",d),b=v[0],V=v[1],y=(0,i.useLocalState)(t,r+"b",s),x=y[0],k=y[1],S=(0,i.useLocalState)(t,r+"rand",p),I=S[0],w=S[1];return(0,o.createComponentVNode)(2,c.Collapsible,{title:"Generator Settings - Hit Set to save",children:(0,o.createComponentVNode)(2,c.Section,{level:2,children:[(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"type",children:(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:""+["num","vector","box","color","circle","sphere","square","cube"].join(", "),children:(0,o.createComponentVNode)(2,c.Input,{value:g,onInput:function(e,t){return N(t)}})})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"A",children:(0,o.createComponentVNode)(2,c.Input,{value:b,onInput:function(e,t){return V(t)}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"B",children:(0,o.createComponentVNode)(2,c.Input,{value:x,onInput:function(e,t){return k(t)}})}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Rand Type",children:(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:""+["UNIFORM_RAND","NORMAL_RAND","LINEAR_RAND","SQUARE_RAND"].join(", "),children:(0,o.createComponentVNode)(2,c.Input,{value:I,onInput:function(e,t){return w(t)}})})})]}),(0,o.createComponentVNode)(2,c.Button,{content:"Set",onClick:function(){return u.logger.log(g),void a("modify_particle_value",{new_data:{name:r,value:{genType:g,a:b,b:x,rand:I},type:"generator"}})}})]})})},v=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:n,width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"text"}})}})})},b=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=n?Object.keys(n).map((function(e){return n[e]})):[];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:u.join(","),width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"numList"}})}})})},V=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=n?Object.keys(n).map((function(e){return n[e]})):[];return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Input,{value:u.join(","),width:"250px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"list"}})}})})},y=function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act,u=null,d="string"==typeof n&&"#"!==n.charAt(0);return u=d?N(e,t):function(e,t){var n=e.value,r=e.tooltip,a=e.name,l=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:[(0,o.createComponentVNode)(2,c.Button,{icon:"pencil-alt",onClick:function(){return l("modify_color_value")}}),(0,o.createComponentVNode)(2,c.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,c.Input,{value:n,width:"90px",onInput:function(e,t){return l("modify_particle_value",{new_data:{name:a,value:t,type:"color"}})}})]})}(e,t),(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:(0,o.createComponentVNode)(2,c.Flex,{children:[(0,o.createComponentVNode)(2,c.Flex.Item,{children:u}),(0,o.createComponentVNode)(2,c.Flex.Item,{align:"right",children:(0,o.createComponentVNode)(2,c.Button.Checkbox,{checked:d,content:"generator",onClick:function(){return l("modify_particle_value",{new_data:{name:a,value:d?"#ffffff":{genType:"color",a:n,b:n,rand:"UNIFORM_RAND"},type:d?"color":"generator"}})}})})]})})},x=function(e,t){var n=e.value,r=e.tooltip,a=(0,i.useBackend)(t).act;return(0,o.createComponentVNode)(2,c.Tooltip,{position:"bottom",content:r,children:[(0,o.createComponentVNode)(2,c.Button,{icon:"pencil-alt",onClick:function(){return a("modify_icon_value")}}),(0,o.createComponentVNode)(2,c.Box,{inline:!0,ml:1,children:n})]})},k={width:{type:"float_nongen",tooltip:"Width of particle image in pixels"},height:{type:"float_nongen",tooltip:"Height of particle image in pixels"},count:{type:"int",tooltip:"Maximum particle count"},spawning:{type:"float_nongen",tooltip:"Number of particles to spawn per tick (can be fractional)"},bound1:{type:"vector_nongen",tooltip:"Minimum particle position in x,y,z space"},bound2:{type:"vector_nongen",tooltip:"Maximum particle position in x,y,z space"},gravity:{type:"vector_nongen",tooltip:"Constant acceleration applied to all particles in this set (pixels per squared tick)"},gradient:{type:"list",tooltip:"Color gradient used, if any"},transform:{type:"matrix",tooltip:"Transform done to all particles, if any (can be higher than 2D)"},lifespan:{type:"float",tooltip:"Maximum life of the particle, in ticks"},fade:{type:"float",tooltip:"Fade-out time at end of lifespan, in ticks"},fadein:{type:"float",tooltip:"Fade-in time, in ticks"},icon:{type:"icon",tooltip:"Icon to use, if any; no icon means this particle will be a dot"},icon_state:{type:"list",tooltip:"Icon state to use, if any"},color:{type:"color",tooltip:"Particle color; can be a number if a gradient is used"},color_change:{type:"float",tooltip:"Color change per tick; only applies if gradient is used"},position:{type:"vector",tooltip:"x,y,z position, from center in pixels"},velocity:{type:"vector",tooltip:"x,y,z velocity, in pixels"},scale:{type:"vector2",tooltip:"(2D)\tScale applied to icon, if used; defaults to list(1,1)"},grow:{type:"vector2",tooltip:"Change in scale per tick; defaults to list(0,0)"},rotation:{type:"float",tooltip:"Angle of rotation (clockwise); applies only if using an icon"},spin:{type:"float",tooltip:"Change in rotation per tick"},friction:{type:"float",tooltip:"Amount of velocity to shed (0 to 1) per tick, also applied to acceleration from drift"},drift:{type:"vector",tooltip:"Added acceleration every tick; e.g. a circle or sphere generator can be applied to produce snow or ember effects"}},S=function(e,t){var n=e.name,r={int:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e))),float:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),float_nongen:(0,o.normalizeProps)((0,o.createComponentVNode)(2,m,Object.assign({},e))),string:(0,o.normalizeProps)((0,o.createComponentVNode)(2,v,Object.assign({},e))),numlist:(0,o.normalizeProps)((0,o.createComponentVNode)(2,b,Object.assign({},e))),list:(0,o.normalizeProps)((0,o.createComponentVNode)(2,V,Object.assign({},e))),color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,y,Object.assign({},e))),icon:(0,o.normalizeProps)((0,o.createComponentVNode)(2,x,Object.assign({},e))),generator:(0,o.normalizeProps)((0,o.createComponentVNode)(2,N,Object.assign({},e))),matrix:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),vector:(0,o.normalizeProps)((0,o.createComponentVNode)(2,f,Object.assign({},e))),vector_nongen:(0,o.normalizeProps)((0,o.createComponentVNode)(2,C,Object.assign({},e))),vector2:(0,o.normalizeProps)((0,o.createComponentVNode)(2,g,Object.assign({},e)))};return(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:n,children:r[k[n].type]||k[n].type||"Not Found (This is an error)"})},I=function(e,t){var n=e.particle;return(0,o.createComponentVNode)(2,c.LabeledList,{children:Object.keys(k).map((function(e){var t=n[e],r=k[e].tooltip||"Oh Bees! Tooltip is missing.";return(0,o.createComponentVNode)(2,S,{name:e,tooltip:r,value:t},e)}))})},w=function(){return(0,o.createComponentVNode)(2,c.Collapsible,{title:"Generator Help",children:[(0,o.createComponentVNode)(2,c.Section,{level:2}),(0,o.createComponentVNode)(2,c.Section,{level:2,children:(0,o.createVNode)(1,"table",null,(0,o.createVNode)(1,"tbody",null,[(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"Generator type",16),(0,o.createVNode)(1,"td",null,"Result type",16),(0,o.createVNode)(1,"td",null,"Description",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"num",16),(0,o.createVNode)(1,"td",null,"num",16),(0,o.createVNode)(1,"td",null,"A random number between A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector on a line between A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"box",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector within a box whose corners are at A and B.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"color",16),(0,o.createVNode)(1,"td",null,"color (string) or color matrix",16),(0,o.createVNode)(1,"td",null,"Result type depends on whether A or B are matrices or not. The result is interpolated between A and B; components are not randomized separately.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"circle",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random XY-only vector in a ring between radius A and B, centered at 0,0.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"sphere",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector in a spherical shell between radius A and B, centered at 0,0,0.",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"square",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random XY-only vector between squares of sizes A and B. (The length of the square is between A*2 and B*2, centered at 0,0.)",16)],4),(0,o.createVNode)(1,"tr",null,[(0,o.createVNode)(1,"td",null,"cube",16),(0,o.createVNode)(1,"td",null,"vector",16),(0,o.createVNode)(1,"td",null,"A random vector between cubes of sizes A and B. (The length of the cube is between A*2 and B*2, centered at 0,0,0.)",16)],4)],4),2)})]})};t.Particool=function(e,t){var n=(0,i.useBackend)(t),u=n.act,d=n.data,s=d.target_particle||{},p=s&&Object.keys(s).length>0,m=(0,i.useLocalState)(t,"particleFloatStep",.01),f=m[0],h=m[1],C=(0,i.useLocalState)(t,"hidden",!1),g=C[0],N=C[1];return(0,o.createComponentVNode)(2,l.Window,{title:"Particool",width:700,height:500,children:(0,o.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:[!!g&&(0,o.createComponentVNode)(2,c.NoticeBox,{danger:!0,children:[" ",String(Date.now())," ",(0,o.createVNode)(1,"br"),"Particles? ",p.toString()," -",(null===d.target_particle).toString()," ",(0,o.createVNode)(1,"br"),"Json - ",JSON.stringify(d.target_particle)]}),(0,o.createComponentVNode)(2,c.Section,{title:(0,o.createComponentVNode)(2,c.Box,{inline:!0,onDblClick:function(){return N(!0)},children:"Particle"}),buttons:(0,o.createFragment)([!!p&&(0,o.createFragment)([(0,o.createComponentVNode)(2,c.Button,{icon:"save",content:"Save Particle",onClick:function(){return u("save_particle")}}),(0,o.createComponentVNode)(2,c.Button,{icon:"file-image",content:"Save Particle + Icon",onClick:function(){return u("save_particle_with_icon")}}),(0,o.createTextVNode)(" ")],0),(0,o.createComponentVNode)(2,c.Button,{icon:"upload",content:"Load Particle",onClick:function(){return u("load_particle")}}),p?(0,o.createComponentVNode)(2,c.Button.Confirm,{icon:"minus",content:"Remove Particle",onClick:function(){return u("remove_particle")}}):(0,o.createComponentVNode)(2,c.Button,{icon:"plus",content:"Add Particle",onClick:function(){return u("add_particle")}}),(0,o.createComponentVNode)(2,c.Button)],0),children:[(0,o.createComponentVNode)(2,w),(0,o.createComponentVNode)(2,c.Box,{mt:2,mb:2,children:[(0,o.createComponentVNode)(2,c.Box,{inline:!0,mr:1,children:"Float change step:"}),(0,o.createComponentVNode)(2,c.NumberInput,{value:f,step:.001,format:function(e){return(0,r.toFixed)(e,(0,a.numberOfDecimalDigits)(f))},width:"70px",onChange:function(e,t){return h(t)}})]}),p?(0,o.createComponentVNode)(2,I,{particle:s}):(0,o.createComponentVNode)(2,c.Box,{children:"No particle"})]})]})})}},85344:function(e,t,n){"use strict";t.__esModule=!0,t.Phone=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(18331),c=n(2381),l=[{department:"bridge",color:"green"},{department:"engineering",color:"yellow"},{department:"medical",color:"blue"},{department:"research",color:"purple"},{department:"security",color:"red"},{department:"uncategorized",color:"brown"}],u=function(e,t){return e.category.localeCompare(t.category)},d=function(e,t){return e.id.localeCompare(t.id)};t.Phone=function(e,t){var n=(0,r.useBackend)(t).data,i=n.dialing,l=n.inCall,d=n.lastCalled,p=n.name,m=n.phonebook.sort(u)||[];return(0,o.createComponentVNode)(2,c.Window,{title:p,width:250,height:350,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(i||l)&&(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createVNode)(1,"h1",null,"LINE BUSY",16)}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Last Called",children:d?""+d:"None"})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Phonebook",fill:!0,scrollable:!0,children:m.map((function(e){return(0,o.createComponentVNode)(2,s,{phonebook:e},e.category)}))})})]})]})})};var s=function(e,t){var n=e.phonebook,c=(0,r.useBackend)(t).act,u=(0,i.capitalize)(n.category),s=n.phones.sort(d),p=l[l.findIndex((function(e){return e.department===n.category}))].color;return(0,o.createComponentVNode)(2,a.Collapsible,{title:u,color:!!p&&p,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,content:e.id,onClick:function(){return c("call",{target:e.id})},textAlign:"center",className:"phone__button"},e.id)}))})}},85990:function(){},41245:function(e,t,n){"use strict";t.__esModule=!0,t.AutoPipeLaying=t.DisposalPipeRow=t.PipeDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.PipeDispenser=function(e,t){var n=(0,r.useBackend)(t).data,u=n.disposalpipes||[],d=n.dispenser_ready,s=n.windowName,p=n.mobile,m=n.removing_pipe,f=n.laying_pipe,h=n.max_disposal_pipes;return(0,o.createComponentVNode)(2,i.Window,{title:s,width:"325",height:p?365:270,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Section,{children:u.map((function(e){return(0,o.createComponentVNode)(2,c,{dispenser_ready:d,max_disposal_pipes:h,disposalpipe:e},e.disposaltype)}))}),!!p&&(0,o.createComponentVNode)(2,l,{laying_pipe:f,removing_pipe:m})]})})};var c=function(e,t){var n=(0,r.useBackend)(t).act,i=(0,r.useLocalState)(t,"amount",1),c=i[0],l=i[1],u=e.dispenser_ready,d=e.max_disposal_pipes,s=e.disposalpipe;return(0,o.createComponentVNode)(2,a.Stack,{style:{"border-bottom":"1px #555 solid"},children:[s.image&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{style:{overflow:"show",height:"32px"},children:(0,o.createComponentVNode)(2,a.Image,{pixelated:!0,src:"data:image/png;base64,"+s.image})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:s.disposaltype}),(0,o.createComponentVNode)(2,a.Stack.Item,{style:{display:"flex","justify-content":"center","flex-direction":"column"},children:["Amount:",(0,o.createComponentVNode)(2,a.NumberInput,{value:c,minValue:1,maxValue:d,onChange:function(e,t){return l(Math.round(t))}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,a.Button,{color:u?"green":"grey",content:"Dispense",disabled:!u,style:{width:"70px","text-align":"center"},onClick:function(){return n("dmake",{disposal_type:s.disposaltype,amount:c})}})})]})};t.DisposalPipeRow=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.laying_pipe,c=e.removing_pipe;return(0,o.createComponentVNode)(2,a.Section,{title:"Automatic Pipe Options",children:[(0,o.createComponentVNode)(2,a.Button,{color:i?"average":"green",content:i?"Stop Laying Pipe Automatically":"Start Laying Pipe Automatically",fluid:!0,align:"center",onClick:function(){return n("toggle_laying")}}),(0,o.createComponentVNode)(2,a.Button,{color:c?"average":"green",content:c?"Stop Removing Pipe Automatically":"Start Removing Pipe Automatically",fluid:!0,align:"center",onClick:function(){return n("toggle_removing")}})]})};t.AutoPipeLaying=l},38837:function(e,t,n){"use strict";t.__esModule=!0,t.PixelOffset=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.PixelOffset=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.x,d=l.y,s=l.thing_name;return(0,o.createComponentVNode)(2,i.Window,{title:"Pixel Offsets for "+s,width:400,height:180,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{fontSize:"3em",width:"1.3em",children:"X:"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",fontSize:"1.5em",onClick:function(){return c("set_x",{x:u+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",fontSize:"1.5em",onClick:function(){return c("set_x",{x:u-1})}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:u,fontSize:"35px",stepPixelSize:7,width:"2.7em",onDrag:function(e,t){return c("set_x",{x:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync-alt",color:"red",fontSize:"1.5em",onClick:function(){return c("set_x",{x:0})}})]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{fontSize:"3em",width:"1.3em",children:"Y:"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"plus",fontSize:"1.5em",onClick:function(){return c("set_y",{y:d+1})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"minus",fontSize:"1.5em",onClick:function(){return c("set_y",{y:d-1})}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:d,fontSize:"35px",width:"2.7em",stepPixelSize:7,onDrag:function(e,t){return c("set_y",{y:t})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"sync-alt",color:"red",fontSize:"1.5em",onClick:function(){return c("set_y",{y:0})}})]})]})})]})})})}},51884:function(e,t,n){"use strict";t.__esModule=!0,t.Plantmaster=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418),l=n(28581),u=n(97622),d=n(18331),s=n(1033),p=["name","species","damage","genome","generation","maturity rate","production rate","lifespan","yield","potency","endurance","controls"],m=["name","species","damage","genome","generation","growtime","harvesttime","lifespan","cropsize","potency","endurance",""];t.Plantmaster=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.extractables,d=l.seeds,s=l.category,p=l.category_lengths,m=l.inserted,f=l.inserted_container,h=l.seedoutput,g=l.splice_chance,N=l.show_splicing,V=l.splice_seeds,y=l.sortBy,x=l.sortAsc;return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Plantmaster Mk4",width:1100,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Tabs,{children:[(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"overview"===s,onClick:function(){c("change_tab",{tab:"overview"})},children:"Overview"}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"extractables"===s,onClick:function(){c("change_tab",{tab:"extractables"})},children:["Seed Extraction (",p[0],")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:"seedlist"===s,onClick:function(){c("change_tab",{tab:"seedlist"})},children:["Seeds (",p[1],")"]}),(0,o.createComponentVNode)(2,a.Tabs.Tab,{backgroundColor:null!==f?"green":"blue",selected:null!==f,icon:"eject",onClick:function(){return c(null!==f?"ejectbeaker":"insertbeaker")},bold:!0,children:null!==f?m:"Insert Beaker"})]}),"overview"===s&&(0,o.createComponentVNode)(2,C,{cat_lens:p,container:m?f:null,seedoutput:h}),"extractables"===s&&(0,o.createComponentVNode)(2,b,{seedoutput:h,produce:u,sortBy:y,sortAsc:x}),"seedlist"===s&&(0,o.createComponentVNode)(2,v,{seeds:d,seedoutput:h,splicing:N,splice_chance:g,splice_seeds:V,sortBy:y,sortAsc:x})]})})};var f=function(e,t,n,o){var r,a,i,c;return"name"===n||"species"===n?o?(null!=(r=e[n])?r:"").toString().localeCompare(null!=(a=t[n])?a:""):(null!=(i=t[n])?i:"").toString().localeCompare(null!=(c=e[n])?c:""):o?parseFloat(e[n])-parseFloat(t[n]):parseFloat(t[n])-parseFloat(e[n])},h=function(e,t){var n=(0,r.useBackend)(t).act,i=e.container||c.NoContainer;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:i.name,children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insertbeaker")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:i}),(0,o.createComponentVNode)(2,c.ReagentList,{container:i})]})},C=function(e,t){(0,r.useBackend)(t).act;var n=e.cat_lens,i=e.container;return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:"Overview",children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Box,{children:["Items ready for extraction: ",(0,o.createVNode)(1,"b",null,n[0],0)," ",(0,o.createVNode)(1,"br"),"Seeds ready for experimentation: ",(0,o.createVNode)(1,"b",null,n[1],0)]}),(0,o.createComponentVNode)(2,h,{container:i})]})})})},g=function(e,t){var n=(0,r.useBackend)(t).act,i=e.show_damage,c=e.sortBy,u=e.sortAsc;return(0,o.createComponentVNode)(2,l.TableRow,{children:p.map((function(e,t){return(i||"damage"!==e)&&(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button,{color:"transparent",icon:""!==c&&c===m[t]?u?"angle-up":"angle-down":"",onClick:function(){return n("sort",{sortBy:m[t],asc:c===m[t]?!u:u})},children:(0,o.createVNode)(1,"b",null,(0,d.capitalize)(e),0)})},e)}))})},N=function(e,t){var n=(0,r.useBackend)(t).act,i=e.extractable,c=e.show_damage,u=e.infuse,d=e.extract,p=e.splice,m=e.splice_disable;return(0,o.createFragment)([(0,o.createComponentVNode)(2,l.TableRow,{children:[(0,o.createComponentVNode)(2,l.TableCell,{width:"100px",textAlign:"center",children:(0,o.createComponentVNode)(2,a.Button.Input,{width:"100px",tooltip:"Click to rename",color:"transparent",textColor:"#FFFFFF",content:(0,s.truncate)(i.name[0],10),defaultValue:i.name[0],currentValue:i.name[0],onCommit:function(e,t){return n("label",{label_ref:i.ref[0],label_new:t})}})}),(0,o.createComponentVNode)(2,l.TableCell,{width:"100px",textAlign:"center",bold:i.species[1],backgroundColor:i.species[1]?"#333333":"",children:i.species[0]}),c&&(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.damage[1],backgroundColor:i.damage[1]?"#333333":"",children:[i.damage[0],"%"]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.genome[1],backgroundColor:i.genome[1]?"#333333":"",children:i.genome[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.generation[1],backgroundColor:i.generation[1]?"#333333":"",children:i.generation[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.growtime[1],backgroundColor:i.growtime[1]?"#333333":"",children:i.growtime[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.harvesttime[1],backgroundColor:i.harvesttime[1]?"#333333":"",children:i.harvesttime[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.lifespan[1],backgroundColor:i.lifespan[1]?"#333333":"",children:i.lifespan[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.cropsize[1],backgroundColor:i.cropsize[1]?"#333333":"",children:i.cropsize[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.potency[1],backgroundColor:i.potency[1]?"#333333":"",children:i.potency[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",bold:i.endurance[1],backgroundColor:i.endurance[1]?"#333333":"",children:i.endurance[0]}),(0,o.createComponentVNode)(2,l.TableCell,{textAlign:"center",children:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[u&&(0,o.createComponentVNode)(2,a.Button,{icon:"fill-drip",title:"Infuse",fontSize:1.1,disabled:!i.allow_infusion[1],onClick:function(){return n("infuse",{infuse_ref:i.ref[0]})}}),d&&(0,o.createComponentVNode)(2,a.Button,{icon:"seedling",title:"Extract Seeds",fontSize:1.1,onClick:function(){return n("extract",{extract_ref:i.ref[0]})}}),p&&(0,o.createComponentVNode)(2,a.Button,{disabled:!i.splicing[1]&&m,icon:i.splicing[1]?"window-close":"code-branch",color:i.splicing[1]?"red":"",title:i.splicing[1]?"Cancel Splice":"Splice",fontSize:1.1,onClick:function(){return n("splice_select",{splice_select_ref:i.ref[0]})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"search",title:"Analyze",fontSize:1.1,onClick:function(){return n("analyze",{analyze_ref:i.ref[0]})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",title:"Eject",fontSize:1.1,onClick:function(){return n("eject",{eject_ref:i.ref[0]})}})]})})})]}),(0,o.createComponentVNode)(2,a.Divider)],4,i.ref[1])},v=function(e,t){var n=(0,r.useBackend)(t).act,i=e.seedoutput,c=e.seeds,l=e.splicing,d=e.splice_seeds,s=e.splice_chance,p=e.sortBy,m=e.sortAsc,h=(c||[]).sort((function(e,t){return f(e,t,p,m)})),C=l?7:10,v=(0,r.useLocalState)(t,"page",1),b=v[0],V=v[1],y=Math.max(1,Math.ceil(h.length/C));(b<1||b>y)&&V((0,u.clamp)(b,1,y));var x=h.slice(C*(b-1),C*(b-1)+C),k=null!==d[0]&&null!==d[1];return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Seeds",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",tooltip:"All seeds will be ejected from the Plantmaster",onClick:function(){return n("ejectseeds")},children:"Eject All"}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:b<2,onClick:function(){return V(b-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:b,format:function(e){return"Page "+e+"/"+y},minValue:1,maxValue:y,stepPixelSize:15,onChange:function(e,t){return V(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:b>y-1,onClick:function(){return V(b+1)}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!i,tooltip:"Seeds will be extracted into the Plantmaster.",onClick:function(){return n("outputmode")},children:"Output Internally"})]}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{height:l?"60%":"100%",children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,g,{show_damage:!0,sortBy:p,sortAsc:m}),x.map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,show_damage:!0,infuse:!0,splice:!0,splice_disable:k},e.ref[1])}))]})}),l&&(0,o.createComponentVNode)(2,a.Flex.Item,{height:"30%",children:(0,o.createComponentVNode)(2,a.Section,{title:"Splicing",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:["Splice Chance: ",s,"%\xa0",(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return n("splice")},children:"Splice"})]}),children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,g,{show_damage:!0,sortBy:p,sortAsc:m}),d.filter((function(e){return null!==e})).sort((function(e,t){return f(e,t,p,m)})).map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,show_damage:!0,infuse:!0,splice:!0},e.ref[1])}))]})})})]})})},b=function(e,t){var n=(0,r.useBackend)(t).act,i=e.seedoutput,c=e.produce,l=e.sortBy,d=e.sortAsc,s=(c||[]).sort((function(e,t){return f(e,t,l,d)})),p=(0,r.useLocalState)(t,"page",1),m=p[0],h=p[1],C=Math.max(1,Math.ceil(s.length/10));(m<1||m>C)&&h((0,u.clamp)(m,1,C));var v=s.slice(10*(m-1),10*(m-1)+10);return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Extractable Items",buttons:(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"eject",tooltip:"All produce will be ejected from the Plantmaster",onClick:function(){return n("ejectextractables")},children:"Eject All"}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:m<2,onClick:function(){return h(m-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:m,format:function(e){return"Page "+e+"/"+C},minValue:1,maxValue:C,stepPixelSize:15,onChange:function(e,t){return h(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:m>C-1,onClick:function(){return h(m+1)}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:!i,tooltip:"Seeds will be extracted into the Plantmaster.",onClick:function(){return n("outputmode")},children:"Output Internally"})]}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,g,{sortBy:l,sortAsc:d}),v.map((function(e,t){return(0,o.createComponentVNode)(2,N,{extractable:e,extract:!0},e.ref[1])}))]})})})})}},53302:function(e,t,n){"use strict";t.__esModule=!0,t.Header=void 0;var o=n(96323),r=n(26949),a=n(22706),i=["children","onSortClick","sortDirection"];t.Header=function(e){var t=e.children,n=e.onSortClick,c=e.sortDirection,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),u=c?c===a.SortDirection.Asc?"sort-alpha-down":"sort-alpha-up":"sort";return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Stack,Object.assign({style:{cursor:"pointer"},onClick:n},l,{children:[(0,o.createComponentVNode)(2,r.Stack.Item,{children:t}),n&&(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Icon,{name:u,unselectable:!0})})]})))}},22706:function(e,t){"use strict";var n,o;t.__esModule=!0,t.SortDirection=t.Action=void 0,t.Action=n,function(e){e.JumpToPlayerLocation="jump-to-player-loc",e.OpenPlayerOptions="open-player-options",e.PrivateMessagePlayer="private-message-player"}(n||(t.Action=n={})),t.SortDirection=o,function(e){e.Asc="asc",e.Desc="desc"}(o||(t.SortDirection=o={}))},78927:function(e,t,n){"use strict";t.__esModule=!0,t.PlayerPanel=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(53302),l=n(22706),u=function(e){return""+e.value},d=function(e,t){return e.localeCompare(t)},s=function(e){return Number(e.split(".").map((function(e){return("00"+e).slice(-3)})).join(""))},p=function(e){return function(t){return t.row[e]}},m=function(e){return{id:e,sorter:d,template:u,valueSelector:p(e)}},f=[Object.assign({},m("ckey"),{name:"CKey",template:function(e){var t=e.act,n=e.row,r=e.value;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return t(l.Action.OpenPlayerOptions,{ckey:r,mobRef:n.mobRef})},children:r}),(0,o.createComponentVNode)(2,a.Button,{icon:"envelope",color:"bad",onClick:function(){return t(l.Action.PrivateMessagePlayer,{ckey:r,mobRef:n.mobRef})}})],4)}}),Object.assign({},m("name"),{name:"Name"}),Object.assign({},m("realName"),{name:"Real Name"}),Object.assign({},m("assignedRole"),{name:"Assigned Role"}),Object.assign({},m("specialRole"),{name:"Special Role"}),Object.assign({},m("playerType"),{name:"Player Type"}),Object.assign({},m("computerId"),{name:"CID"}),Object.assign({},m("ip"),{name:"IP",sorter:function(e,t){return s(e)-s(t)}}),Object.assign({},m("joined"),{name:"Join Date",sorter:function(e,t){var n=e.split("-").map(parseFloat),o=t.split("-").map(parseFloat);return n>o?1:n<o?-1:0}}),Object.assign({},m("playerLocation"),{name:"Player Location",template:function(e){var t=e.act,n=e.row,r=e.value;return(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return t(l.Action.JumpToPlayerLocation,{ckey:n.ckey,mobRef:n.mobRef})},children:r})}}),Object.assign({},m("ping"),{name:"Ping",sorter:function(e,t){return e-t}})];t.PlayerPanel=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data.players,s=(0,r.useLocalState)(t,"search",""),p=s[0],m=s[1],h=(0,r.useLocalState)(t,"sort",null),C=h[0],g=h[1],N=Object.keys(d).map((function(e){return d[e]})),v=N.reduce((function(e,t){return e[t.ckey]=f.reduce((function(e,n){var o=n.id,r=n.valueSelector;return e[o]=r({column:n,row:t}),e}),{}),e}),{});if(p){var b=p.toLowerCase();N=N.filter((function(e){return Object.values(v[e.ckey]).some((function(e){return"string"==typeof e&&e.toLowerCase().includes(b)}))}))}if(C){var V=f.find((function(e){return e.id===C.id}));V&&N.sort((function(e,t){var n=V.sorter(v[e.ckey][V.id],v[t.ckey][V.id]);return C.dir===l.SortDirection.Desc&&(n*=-1),n}))}return(0,o.createComponentVNode)(2,i.Window,{width:1100,height:640,title:"Player Panel",children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Input,{autoFocus:!0,mb:1,placeholder:"Search...",onInput:function(e,t){return m(t)},value:p}),(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:f.map((function(e){var t=(null==C?void 0:C.id)===e.id?C:null;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,c.Header,{onSortClick:e.sorter?function(){return g({dir:null!=t&&t.dir&&t.dir===l.SortDirection.Asc?l.SortDirection.Desc:l.SortDirection.Asc,id:e.id})}:null,sortDirection:null==t?void 0:t.dir,children:e.name})},e.field)}))}),N.map((function(e){var t=e.ckey;return(0,o.createComponentVNode)(2,a.Table.Row,{children:f.map((function(n){var r=n.id,i=n.template;return(0,o.createComponentVNode)(2,a.Table.Cell,{children:i({act:u,column:n,row:e,value:v[t][r]})},r)}))},t)}))]})]})})}},43771:function(){},29467:function(e,t,n){"use strict";t.__esModule=!0,t.PollBallot=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.isAdmin,n=e.act,r=e.pollId,i=e.isExpired,c=e.multipleChoice,l=e.expiryDate,u=function(e){return e.includes("global")?{tooltip:"Global Poll",icon:"globe"}:e.includes("rp_only")?{tooltip:"RP Only Poll",icon:"masks-theater"}:{tooltip:"Local Poll",icon:"location-dot"}}(e.servers);return(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{children:[c?(0,o.createComponentVNode)(2,a.Button,{tooltip:"Multiple Choice",tooltipPosition:"top",icon:"list-check"}):null,(0,o.createComponentVNode)(2,a.Button,{tooltip:u.tooltip,tooltipPosition:"top",icon:u.icon,onClick:function(){return n("editServers",{pollId:r})}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:l||"No Expiration Date",tooltipPosition:"top",color:i?"bad":"good",icon:i?"lock":"lock-open",onClick:function(){return n("editExpiration",{pollId:r})}}),t?(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{tooltip:"Add Option",tooltipPosition:"top",icon:"plus",onClick:function(){return n("addOption",{pollId:r})}}),(0,o.createComponentVNode)(2,a.Button,{tooltip:"Edit Poll",tooltipPosition:"top",icon:"pen",onClick:function(){return n("editPoll",{pollId:r})}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{tooltip:"Delete Poll",tooltipPosition:"top",icon:"trash",color:"bad",onClick:function(){return n("deletePoll",{pollId:r})}})],4):null]})})},l=function(e){var t=e.isAdmin,n=e.act,r=e.pollId,i=e.optionId;return t?(0,o.createComponentVNode)(2,a.Stack,{children:(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"pen",onClick:function(){return n("editOption",{pollId:r,optionId:i})}}),(0,o.createComponentVNode)(2,a.Button.Confirm,{icon:"trash",color:"bad",onClick:function(){return n("deleteOption",{pollId:r,optionId:i})}})]})}):null},u=function(e){var t=e.options,n=e.total_answers,r=e.act,i=e.pollId,c=e.isAdmin,u=e.isExpired,d=e.playerId,s=e.showVotes;return t&&0!==t.length?(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:t.map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{disabled:u,checked:e.answers_player_ids.includes(d),onClick:function(){return r("vote",{pollId:i,optionId:e.id})},children:e.option})}),s?(0,o.createComponentVNode)(2,a.Stack.Item,{align:"right",children:"("+e.answers_count+" votes)"}):null]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,l,{isAdmin:c,act:r,pollId:i,optionId:e.id})})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:n?e.answers_count/n:0})})]})},t)}))}):null};t.PollBallot=function(e,t){var n=(0,r.useBackend)(t),l=n.act,d=n.data,s=d.isAdmin,p=d.filterInactive,m=d.polls,f=d.playerId,h=d.showVotes;return(0,o.createComponentVNode)(2,i.Window,{title:"Poll Ballot",width:"750",height:"800",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:p,onClick:function(){return l("toggle-filterInactive")},children:"Filter Closed Polls"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:h,onClick:function(){return l("toggle-showVotes")},children:"Show Votes"})}),s?(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("addPoll")},children:"Add Poll"})}):null]})}),m&&m.filter((function(e){var t=!!e.expires_at&&new Date>=new Date(e.expires_at);return!p||!t})).map((function(e,t){return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:e.question,buttons:(0,o.createComponentVNode)(2,c,{isAdmin:s,act:l,pollId:e.id,isExpired:e.expires_at&&new Date>new Date(e.expires_at),multipleChoice:e.multiple_choice,expiryDate:e.expires_at,servers:e.servers}),children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:(0,o.createComponentVNode)(2,u,{options:e.options,total_answers:e.total_answers,act:l,pollId:e.id,isAdmin:s,isExpired:e.expires_at&&new Date>new Date(e.expires_at),playerId:f,showVotes:h})})})},t)}))]})})})}},13484:function(e,t,n){"use strict";t.__esModule=!0,t.PortablePump=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161);t.PortablePump=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.connected,s=u.on,p=u.direction_out,m=u.holding,f=u.pressure,h=u.targetPressure,C=u.maxPressure,g=u.minRelease,N=u.maxRelease;return(0,o.createComponentVNode)(2,i.Window,{width:305,height:365,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:d,pressure:f,maxPressure:C,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pump Power",children:(0,o.createComponentVNode)(2,a.Button,{content:s?"On":"Off",color:s?"average":"default",onClick:function(){return l("toggle-power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Pressure",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("set-pressure",{targetPressure:g})},content:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:h,minValue:g,maxValue:N,onChange:function(e,t){return l("set-pressure",{targetPressure:t})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("set-pressure",{targetPressure:N})},content:"Max"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pump Direction",children:(0,o.createComponentVNode)(2,a.Button,{content:p?"Out":"In",color:p?"yellow":"blue",onClick:function(){return l("toggle-pump")}})})]})]}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:m,onEjectTank:function(){return l("eject-tank")}})]})})}},54652:function(e,t,n){"use strict";t.__esModule=!0,t.PortableScrubber=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=n(51418);t.PortableScrubber=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.connected,p=d.on,m=d.holding,f=d.pressure,h=d.inletFlow,C=d.maxPressure,g=d.minFlow,N=d.maxFlow,v=d.reagent_container;return(0,o.createComponentVNode)(2,i.Window,{width:305,height:450,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:s,pressure:f,maxPressure:C,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Scrubber Power",children:(0,o.createComponentVNode)(2,a.Button,{content:p?"On":"Off",color:p?"average":"default",onClick:function(){return u("toggle-power")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Flow",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("set-inlet-flow",{inletFlow:g})},content:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:h,minValue:g,maxValue:N,onChange:function(e,t){return u("set-inlet-flow",{inletFlow:t})}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("set-inlet-flow",{inletFlow:N})},content:"Max"})]})]})]}),(0,o.createComponentVNode)(2,c.PortableHoldingTank,{holding:m,onEjectTank:function(){return u("eject-tank")}}),(0,o.createComponentVNode)(2,a.Section,{title:"Fluid Tank",children:(0,o.createComponentVNode)(2,l.ReagentGraph,{container:v})})]})})}},15264:function(e,t,n){"use strict";t.__esModule=!0,t.PowerDebug=t.MachineData=t.AreaData=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.areaData;return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:Object.keys(t).map((function(e,n){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:[(0,o.createComponentVNode)(2,a.Section,{title:t[e].name,children:t[e].total?(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Total:",t[e].total," "]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Equip:",t[e].equip]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Light:",t[e].light," "]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:["Environ:",t[e].environ]})]}):"NO APC"}),(0,o.createComponentVNode)(2,l,{machineData:t[e].machines})]},n)}))})})};t.AreaData=c;var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.machineData;return Object.keys(i).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){n("jmp",{ref:e})},children:"JMP"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:20,children:i[e].name}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:8,children:i[e].data}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:i[e].power_usage})]},t)}))};t.MachineData=l;t.PowerDebug=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data.areaData);return(0,o.createComponentVNode)(2,i.Window,{title:"PowerDebug",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Power Debug"}),children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,c,{areaData:l})})})})})}},4914:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitorApcTableRows=t.PowerMonitorApcTableHeader=t.PowerMonitorApcGlobal=void 0;var o,r,a=n(96323),i=n(31246),c=n(26949),l=n(1033),u=((o={})[0]="Off",o[1]=(0,a.createComponentVNode)(2,c.Box,{inline:!0,children:["Off"," ",(0,a.createComponentVNode)(2,c.Box,{inline:!0,color:"grey",children:"(Auto)"})]}),o[2]="On",o[3]=(0,a.createComponentVNode)(2,c.Box,{inline:!0,children:["On"," ",(0,a.createComponentVNode)(2,c.Box,{inline:!0,color:"grey",children:"(Auto)"})]}),o),d=((r={})[0]="Discharging",r[1]="Charging",r[2]="Charged",r);t.PowerMonitorApcGlobal=function(e,t){var n=(0,i.useBackend)(t).data,o=n.history.map((function(e){return e[0]})),r=o.map((function(e,t){return[t,e]})),u=n.history.map((function(e){return e[1]})),d=u.map((function(e,t){return[t,e]})),s=Math.max.apply(Math,o.concat(u));return(0,a.createComponentVNode)(2,c.Stack,{fill:!0,children:[(0,a.createComponentVNode)(2,c.Stack.Item,{width:"50%",children:[(0,a.createComponentVNode)(2,c.LabeledList,{children:(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Power",children:(0,l.formatPower)(n.available)})}),(0,a.createComponentVNode)(2,c.Chart.Line,{mt:"5px",height:"5em",data:r,rangeX:[0,r.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,a.createComponentVNode)(2,c.Stack.Item,{width:"50%",children:[(0,a.createComponentVNode)(2,c.LabeledList,{children:(0,a.createComponentVNode)(2,c.LabeledList.Item,{label:"Total Load",children:(0,l.formatPower)(n.load)})}),(0,a.createComponentVNode)(2,c.Chart.Line,{mt:"5px",height:"5em",data:d,rangeX:[0,d.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]})]})};t.PowerMonitorApcTableHeader=function(){return(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,children:"Area"}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Equipment",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Eqp."})}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Lighting",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Lgt."})}),(0,a.createComponentVNode)(2,c.Tooltip,{content:"Environment",children:(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,collapsing:!0,children:"Env."})}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,textAlign:"right",children:"Load"}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,textAlign:"right",children:"Cell Charge"}),(0,a.createComponentVNode)(2,c.Table.Cell,{header:!0,children:"Cell State"})],4)};t.PowerMonitorApcTableRows=function(e,t){var n=e.search,o=(0,i.useBackend)(t).data;return(0,a.createFragment)(o.apcs.map((function(e){return(0,a.createComponentVNode)(2,s,{apc:e,search:n},e[0])})),0)};var s=function(e,t){var n,o=e.apc,r=e.search,u=o[0],s=o[1],m=o[2],f=o[3],h=o[4],C=o[5],g=o[6],N=null!=(n=(0,i.useBackend)(t).data.apcNames[u])?n:"N/A";return r&&!N.toLowerCase().includes(r.toLowerCase())?null:(0,a.createComponentVNode)(2,c.Table.Row,{children:[(0,a.createComponentVNode)(2,c.Table.Cell,{children:N}),(0,a.createComponentVNode)(2,p,{state:s}),(0,a.createComponentVNode)(2,p,{state:m}),(0,a.createComponentVNode)(2,p,{state:f}),(0,a.createComponentVNode)(2,c.Table.Cell,{textAlign:"right",nowrap:!0,children:(0,l.formatPower)(h)}),"number"==typeof C?(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell,{textAlign:"right",nowrap:!0,children:[C,"%"]}),(0,a.createComponentVNode)(2,c.Table.Cell,{color:g>0?1===g?"average":"good":"bad",nowrap:!0,children:d[g]})],4):(0,a.createFragment)([(0,a.createComponentVNode)(2,c.Table.Cell),(0,a.createComponentVNode)(2,c.Table.Cell,{color:"bad",children:"N/A"})],4)]})},p=function(e){var t=e.state;return(0,a.createComponentVNode)(2,c.Table.Cell,{nowrap:!0,color:t>=2?"good":"bad",children:u[t]})}},8954:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitorSmesTableRows=t.PowerMonitorSmesTableHeader=t.PowerMonitorSmesGlobal=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033);t.PowerMonitorSmesGlobal=function(e,t){var n=(0,r.useBackend)(t).data,c=n.history.map((function(e){return e[0]})),l=c.map((function(e,t){return[t,e]})),u=n.history.map((function(e){return e[1]})),d=u.map((function(e,t){return[t,e]})),s=Math.max.apply(Math,c.concat(u));return(0,o.createComponentVNode)(2,a.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50%",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Engine Output",children:(0,i.formatPower)(n.available)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:l,rangeX:[0,l.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{width:"50%",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"SMES/PTL Draw",children:(0,i.formatPower)(n.load)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:d,rangeX:[0,d.length-1],rangeY:[0,s],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]})]})};t.PowerMonitorSmesTableHeader=function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Area"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Stored Power"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Charging"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Input"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Output"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Active"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Load"})],4)};t.PowerMonitorSmesTableRows=function(e,t){var n=e.search,a=(0,r.useBackend)(t).data;return(0,o.createFragment)(a.units.map((function(e){return(0,o.createComponentVNode)(2,c,{unit:e,search:n},e[0])})),0)};var c=function(e,t){var n,c=e.unit,l=e.search,u=c[0],d=c[1],s=c[2],p=c[3],m=c[4],f=c[5],h=c[6],C=null!=(n=(0,r.useBackend)(t).data.unitNames[u])?n:"N/A";return l&&!C.toLowerCase().includes(l.toLowerCase())?null:(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:C}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:[d,"%"]}),(0,o.createComponentVNode)(2,a.Table.Cell,{color:s?"good":"bad",children:s?"Yes":"No"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,i.formatPower)(p)}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,i.formatPower)(m)}),(0,o.createComponentVNode)(2,a.Table.Cell,{color:f?"good":"bad",children:f?"Yes":"No"}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:h?(0,i.formatPower)(h):"N/A"})]})}},84699:function(e,t,n){"use strict";t.__esModule=!0,t.PowerMonitor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(4914),l=n(8954),u=n(2441);t.PowerMonitor=function(e,t){var n=(0,r.useBackend)(t).data,d=(0,r.useSharedState)(t,"search",""),s=d[0],p=d[1];return(0,o.createComponentVNode)(2,i.Window,{width:700,height:700,theme:"retro-dark",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcGlobal),(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesGlobal)]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Search",children:(0,o.createComponentVNode)(2,a.Input,{value:s,onInput:function(e,t){return p(t)}})})})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcTableHeader)}),(0,u.isDataForApc)(n)&&(0,o.createComponentVNode)(2,c.PowerMonitorApcTableRows,{search:s}),(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesTableHeader)}),(0,u.isDataForSmes)(n)&&(0,o.createComponentVNode)(2,l.PowerMonitorSmesTableRows,{search:s})]})})})]})})})}},2441:function(e,t){"use strict";var n;t.__esModule=!0,t.isDataForSmes=t.isDataForApc=t.PowerMonitorType=void 0,t.PowerMonitorType=n,function(e){e.Apc="apc",e.Smes="smes"}(n||(t.PowerMonitorType=n={}));t.isDataForApc=function(e){return e.type===n.Apc};t.isDataForSmes=function(e){return e.type===n.Smes}},36476:function(e,t,n){"use strict";t.__esModule=!0,t.PowerTransmissionLaser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.PowerTransmissionLaser=function(e,t){var n=(0,r.useBackend)(t).data,s=n.lifetimeEarnings,p=n.name,m=void 0===p?"Power Transmission Laser":p;return(0,o.createComponentVNode)(2,c.Window,{title:m,width:"310",height:"485",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,l),(0,o.createComponentVNode)(2,u),(0,o.createComponentVNode)(2,d),(0,o.createComponentVNode)(2,a.NoticeBox,{success:!0,children:["Earned Credits : ",(0,i.formatMoney)(s)]})]})})};var l=function(e,t){var n=(0,r.useBackend)(t).data,c=n.capacity,l=n.charge,u=n.gridLoad,d=n.totalGridPower;return(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Reserve Power",children:(0,i.formatSiUnit)(l,0,"J")})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",mb:"0.5em",ranges:{good:[.8,Infinity],average:[.5,.8],bad:[-Infinity,.5]},value:l/c}),(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Grid Saturation"})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",ranges:{good:[.8,Infinity],average:[.5,.8],bad:[-Infinity,.5]},value:d?u/d:0})]})},u=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.isChargingEnabled,d=l.excessPower,s=l.isCharging,p=l.inputLevel,m=l.inputNumber,f=l.inputMultiplier;return(0,o.createComponentVNode)(2,a.Section,{title:"Input Controls",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input Circuit",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",content:u?"Enabled":"Disabled",color:u?"green":"red",onClick:function(){return c("toggleInput")}}),children:(0,o.createComponentVNode)(2,a.Box,{color:(s?"good":u&&"average")||"bad",children:(s?"Online":u&&"Idle")||"Offline"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input Level",children:(0,i.formatPower)(p)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Optimal",children:(0,i.formatPower)(d)})]}),(0,o.createComponentVNode)(2,a.Box,{mt:"0.5em",children:[(0,o.createComponentVNode)(2,a.Knob,{mr:"0.5em",animated:!0,size:1.25,inline:!0,step:5,stepPixelSize:2,minValue:0,maxValue:999,value:m,onDrag:function(e,t){return c("setInput",{setInput:t})}}),(0,o.createComponentVNode)(2,a.Button,{content:"W",selected:1===f,onClick:function(){return c("inputW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"kW",selected:f===Math.pow(10,3),onClick:function(){return c("inputkW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"MW",selected:f===Math.pow(10,6),onClick:function(){return c("inputMW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"GW",selected:f===Math.pow(10,9),onClick:function(){return c("inputGW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"TW",selected:f===Math.pow(10,12),onClick:function(){return c("inputTW")}})]})]})},d=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.isEmagged,d=l.isFiring,s=l.isLaserEnabled,p=l.outputLevel,m=l.outputNumber,f=l.outputMultiplier;return(0,o.createComponentVNode)(2,a.Section,{title:"Output Controls",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Laser Circuit",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",content:s?"Enabled":"Disabled",color:s?"green":"red",onClick:function(){return c("toggleOutput")}}),children:(0,o.createComponentVNode)(2,a.Box,{color:(d?"good":s&&"average")||"bad",children:(d?"Online":s&&"Idle")||"Offline"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output Level",children:m<0?"-"+(0,i.formatPower)(Math.abs(p)):(0,i.formatPower)(p)})]}),(0,o.createComponentVNode)(2,a.Box,{mt:"0.5em",children:[(0,o.createComponentVNode)(2,a.Knob,{mr:"0.5em",size:1.25,animated:!0,bipolar:u,inline:!0,step:5,stepPixelSize:2,minValue:u?-999:0,maxValue:999,ranges:{bad:[-Infinity,-1]},value:m,onDrag:function(e,t){return c("setOutput",{setOutput:t})}}),(0,o.createComponentVNode)(2,a.Button,{content:"MW",selected:f===Math.pow(10,6),onClick:function(){return c("outputMW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"GW",selected:f===Math.pow(10,9),onClick:function(){return c("outputGW")}}),(0,o.createComponentVNode)(2,a.Button,{content:"TW",selected:f===Math.pow(10,12),onClick:function(){return c("outputTW")}})]})]})}},61221:function(e,t,n){"use strict";t.__esModule=!0,t.Precipitation=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.Precipitation=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.probability,s=u.cooldown,p=u.poolDepth,m=u.containerData;return(0,o.createComponentVNode)(2,i.Window,{title:"Precipitation",width:300,height:425,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Precipitation"}),children:[(0,o.createComponentVNode)(2,a.Tooltip,{content:"Cooldown for how fast ATOMs can be rained on.",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Cooldown",(0,o.createComponentVNode)(2,a.NumberInput,{value:s,width:4,minValue:0,onChange:function(e,t){return l("set-cooldown",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Chance of being rained on entering turf.",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Probability",(0,o.createComponentVNode)(2,a.NumberInput,{value:d,width:4,minValue:0,maxValue:100,onChange:function(e,t){return l("set-probability",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Maximum fluid size/depth on the tile. (0 means no pooling will form)",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:["Maximum Pool Depth",(0,o.createComponentVNode)(2,a.NumberInput,{value:p,width:4,minValue:0,maxValue:100,onChange:function(e,t){return l("set-poolDepth",{value:t})}})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Reagents",children:[(0,o.createComponentVNode)(2,c.ReagentList,{container:m,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return l("isolate",{container_id:m.id,reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"times",color:"red",title:"Flush",onClick:function(){return l("flush_reagent",{container_id:m.id,reagent_id:e.id})}})],4)}}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:[(0,o.createComponentVNode)(2,a.Button,{ml:1,onClick:function(){return l("add_reagents")},children:"Add Reagents"}),(0,o.createComponentVNode)(2,a.Button,{ml:1,onClick:function(){return l("flush")},children:"Clear Reagents"})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Particle",children:(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("particle_editor")},children:"Edit Particle"})})})]})})})}},90227:function(e,t,n){"use strict";t.__esModule=!0,t.Pressurizer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(41161),l=0,u=1,d=2,s={good:[1,Infinity],average:[.75,1],bad:[-Infinity,.75]};t.Pressurizer=function(e,t){var n=(0,r.useBackend)(t),p=n.act,m=n.data,f=m.airSafe,h=m.blastArmed,C=m.blastDelay,g=m.connected,N=m.emagged,v=m.fanState,b=m.materialsCount,V=m.materialsProgress,y=m.maxArmDelay,x=m.maxPressure,k=m.maxRelease,S=m.minArmDelay,I=m.minBlastPercent,w=m.minRelease,_=m.pressure,D=m.processRate,M=m.releasePressure,B=function(e){p("set-pressure",{releasePressure:e})},A=function(e){p("set-blast-delay",{blastDelay:e})},T=function(e){p("set-process_rate",{processRate:e})},L=function(e){p("fan",{fanState:e})},E=_<x*I;return(0,o.createComponentVNode)(2,i.Window,{theme:N?"syndicate":"ntos",width:390,height:380,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,c.PortableBasicInfo,{connected:g,pressure:_,maxPressure:x,children:[(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Emergency Blast Release",children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",icon:"circle",content:E?"Insufficient Pressure":f?h?"Armed":"Ready":"AIR UNSAFE - Locked",disabled:E||!f,color:h?"bad":"average",onClick:function(){p("arm")}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Delay",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return A(S)},children:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:C,minValue:S,maxValue:y,onChange:function(e,t){return A(t)}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return A(y)},children:"Max"})]})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Fan Status",children:[(0,o.createComponentVNode)(2,a.Button,{color:v===l?"bad":"default",onClick:function(){return L(l)},children:"Off"}),(0,o.createComponentVNode)(2,a.Button,{selected:v===u,onClick:function(){return L(u)},children:"In"}),(0,o.createComponentVNode)(2,a.Button,{selected:v===d,onClick:function(){return L(d)},children:"Out"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Release Pressure",children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return B(w)},children:"Min"}),(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"7em",value:M,minValue:w,maxValue:k,onChange:function(e,t){return B(t)}}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return B(k)},children:"Max"})]})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Material Processing",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",disabled:0===b,onClick:function(){p("eject-materials")},children:"Eject"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Speed",children:[(0,o.createComponentVNode)(2,a.Button,{selected:1===D,onClick:function(){return T(1)},children:"1"}),(0,o.createComponentVNode)(2,a.Button,{selected:2===D,onClick:function(){return T(2)},children:"2"}),(0,o.createComponentVNode)(2,a.Button,{selected:3===D,onClick:function(){return T(3)},children:"3"}),!!N&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{selected:4===D,onClick:function(){return T(4)},children:"4"}),(0,o.createComponentVNode)(2,a.Button,{selected:5===D,onClick:function(){return T(5)},children:"5"})],4)]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Progress",children:(0,o.createComponentVNode)(2,a.ProgressBar,{ranges:s,value:V/100})})]})})]})})}},62376:function(e,t,n){"use strict";t.__esModule=!0,t.ProcCall=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(48916),c=n(2381);t.ProcCall=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.name,s=u.options;return(0,o.createComponentVNode)(2,c.Window,{title:"Proc Call",width:700,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,i.DataInputOptions,{options:s})})}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("activate")},children:"Confirm Event"})})]})})})}},94955:function(e,t,n){"use strict";t.__esModule=!0,t.PumpControl=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.pump,c=(0,r.useLocalState)(t,i.netid+"pressure",i.target_output),l=c[0],u=c[1],d=(0,r.useLocalState)(t,i.netid+"power","on"),s=d[0],p=d[1];return(0,o.createComponentVNode)(2,a.Box,{children:[(0,o.createComponentVNode)(2,a.Stack,{py:1,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:i.tag}),(0,o.createComponentVNode)(2,a.Stack.Item,{textAlign:"right",grow:1,children:-1===i.alive?"Establishing Connection...":"Connected"})]}),(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{width:4,icon:"power-off",color:"on"===s?"green":"red",onClick:function(){return p("on"===s?"off":"on"),void n("togglePump",{netid:i.netid})},children:"on"===s?"On":"Off"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Slider,{disabled:1!==i.alive,value:l,minValue:i.min_output,maxValue:i.max_output,unit:"kPa",stepPixelSize:.05,onChange:function(e,t){return u(o=t),void n("setPressure",{netid:i.netid,pressure:o});var o}})})]})]})},l=function(e,t){var n=(0,r.useBackend)(t).data,i=e.area,l=[];for(var u in n.area_list[i])0!==n.area_list[i][u].alive&&l.push((0,o.createComponentVNode)(2,c,{pump:n.area_list[i][u]}));return 0===l.length&&l.push((0,o.createVNode)(1,"p",null,[(0,o.createTextVNode)("No pumps found for "),i,(0,o.createTextVNode)(", please refresh and check connection.")],0)),(0,o.createComponentVNode)(2,a.Section,{title:i,textAlign:"left",mb:1,style:{padding:"5px","padding-top":"1px"},children:l})};t.PumpControl=function(e,t){var n=(0,r.useBackend)(t),c=n.act,u=n.data,d=[];for(var s in u.area_list)d.push(s);return(0,o.createComponentVNode)(2,i.Window,{title:"Pump Control Computer",width:400,height:500,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:[(0,o.createComponentVNode)(2,a.Button,{style:{"margin-bottom":"10px"},icon:"wifi",onClick:function(){return c("refresh")},children:"Requery Pumps"}),d.map((function(e){return(0,o.createComponentVNode)(2,l,{area:e},e)}))]})})}},95868:function(){},42626:function(e,t,n){"use strict";t.__esModule=!0,t.Radio=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381),l=n(39582);t.Radio=function(e,t){var n=(0,r.useBackend)(t),u=n.data,d=n.act,s=function(e,t){d("set-frequency",{value:e,finish:t})},p=function(e,t){d("set-code",{value:e,finish:t})};return(0,o.createComponentVNode)(2,c.Window,{width:"280",height:"400",title:u.name,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!u.hasToggleButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Power",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.power,onClick:function(){return d("toggle-power")},children:u.power?"Powered on":"Powered off"})}),!!u.hasMicrophone&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Microphone",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.broadcasting,onClick:function(){return d("toggle-broadcasting")},children:u.broadcasting?"Engaged":"Disengaged"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Speaker",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:u.listening,onClick:function(){return d("toggle-listening")},children:u.listening?"Engaged":"Disengaged"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Frequency",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:!u.lockedFrequency&&(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:u.frequency,minValue:1441,maxValue:1489,stepPixelSize:2,format:i.formatFrequency,onDrag:function(e,t){return s(t,!1)},onChange:function(e,t){return s(t,!0)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:u.frequency,format:i.formatFrequency})})]})}),!!u.code&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Code",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:u.code,minValue:1,maxValue:100,stepPixelSize:1,onDrag:function(e,t){return p(t,!1)},onChange:function(e,t){return p(t,!0)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:u.code})})]})}),!!u.sendButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{children:(0,o.createComponentVNode)(2,a.Button,{align:"center",onClick:function(){d("send")},icon:"wifi",children:"Send signal"})})]})})}),u.secureFrequencies.length>0&&(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Supplementary Channels",fill:!0,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Table,{children:[(0,o.createComponentVNode)(2,a.Table.Row,{header:!0,children:[(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Channel"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Frequency"}),(0,o.createComponentVNode)(2,a.Table.Cell,{header:!0,children:"Prefix"})]}),u.secureFrequencies.map((function(e){return(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.channel}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:e.frequency}),(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Box,{as:"code",children:e.sayToken})})]},e.frequency)}))]})})}),!!u.modifiable&&(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Access Panel",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Green Wire",labelColor:"green",children:(0,o.createComponentVNode)(2,a.Button,{color:"green",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Transmit})},children:u.wires&l.RadioWires.Transmit?"Cut":"Mend"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Red Wire",labelColor:"red",children:(0,o.createComponentVNode)(2,a.Button,{color:"red",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Receive})},children:u.wires&l.RadioWires.Receive?"Cut":"Mend"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Blue Wire",labelColor:"blue",children:(0,o.createComponentVNode)(2,a.Button,{color:"blue",onClick:function(){return d("toggle-wire",{wire:l.RadioWires.Signal})},children:u.wires&l.RadioWires.Signal?"Cut":"Mend"})})]})})})]})})})}},39582:function(e,t){"use strict";var n;t.__esModule=!0,t.RadioWires=void 0,t.RadioWires=n,function(e){e[e.Signal=1]="Signal",e[e.Receive=2]="Receive",e[e.Transmit=4]="Transmit"}(n||(t.RadioWires=n={}))},16710:function(e,t,n){"use strict";t.__esModule=!0,t.RandomEvent=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(48916),c=n(2381);t.RandomEvent=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.eventName,s=u.eventOptions;return(0,o.createComponentVNode)(2,c.Window,{title:"Random Event",width:700,height:600,children:(0,o.createComponentVNode)(2,c.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:d}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:(0,o.createComponentVNode)(2,i.DataInputOptions,{options:s})})}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return l("activate")},children:"Confirm Event"})})]})})})}},63777:function(e,t,n){"use strict";t.__esModule=!0,t.ReagentExtractor=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(51418);t.ReagentExtractor=function(e,t){var n=(0,r.useBackend)(t).data.containersData,c=n.inserted,d=n.storage_tank_1,s=n.storage_tank_2;return(0,o.createComponentVNode)(2,i.Window,{title:"Reagent Extractor",width:500,height:739,theme:"ntos",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,children:(0,o.createComponentVNode)(2,l,{container:c,insertable:!0})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,basis:"auto",children:(0,o.createComponentVNode)(2,a.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,u)}),(0,o.createComponentVNode)(2,a.Stack.Item,{basis:18,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,grow:!0,children:(0,o.createComponentVNode)(2,l,{container:d})}),(0,o.createComponentVNode)(2,a.Stack.Item,{basis:19.5,children:(0,o.createComponentVNode)(2,l,{container:s})})]})})]})})]})})})};var l=function(e,t){var n=(0,r.useBackend)(t).act,i=e.insertable,l=e.container||c.NoContainer,u=(0,r.useSharedState)(t,"transferAmount_"+l.id,10),d=u[0],s=u[1];return(0,o.createComponentVNode)(2,a.SectionEx,{capitalize:!0,title:l.name,buttons:(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{title:"Flush All",icon:"times",color:"red",disabled:!l.totalVolume,onClick:function(){return n("flush",{container_id:l.id})}}),!i||(0,o.createComponentVNode)(2,a.Button,{title:"Eject",icon:"eject",disabled:!e.container,onClick:function(){return n("ejectcontainer")}})],0),children:[!!e.container||(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"eject",fontSize:1.5,onClick:function(){return n("insertcontainer")},bold:!0,children:"Insert Beaker"})}),(0,o.createComponentVNode)(2,c.ReagentGraph,{container:l}),(0,o.createComponentVNode)(2,c.ReagentList,{container:l,renderButtons:function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{px:.75,mr:1.5,icon:"filter",color:"red",title:"Isolate",onClick:function(){return n("isolate",{container_id:l.id,reagent_id:e.id})}}),(0,o.createComponentVNode)(2,a.Button,{px:.75,icon:"times",color:"red",title:"Flush",onClick:function(){return n("flush_reagent",{container_id:l.id,reagent_id:e.id})}})],4)}}),(0,o.createComponentVNode)(2,a.Flex,{wrap:!0,justify:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,basis:"auto",children:(0,o.createComponentVNode)(2,a.Button,{mb:.5,width:17,textAlign:"center",selected:l.selected,title:"Select Extraction and Transfer Target",icon:l.selected?"check-square-o":"square-o",onClick:function(){return n("extractto",{container_id:l.id})},children:"Select"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Flex,{width:17,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:[(0,o.createComponentVNode)(2,a.Button,{disabled:l.selected,onClick:function(){return n("chemtransfer",{container_id:l.id,amount:d})},children:"Transfer"}),(0,o.createComponentVNode)(2,a.NumberInput,{value:d,format:function(e){return e+"u"},minValue:1,maxValue:500,onDrag:function(e,t){return s(t)}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{disabled:l.selected,onClick:function(){return n("chemtransfer",{container_id:l.id,amount:500})},children:"Transfer All"})})]})})]})]})},u=function(e,t){var n,i,c,l=(0,r.useBackend)(t),u=l.act,d=l.data,s=d.autoextract,p=d.ingredientsData||[],m=(0,r.useLocalState)(t,"page",1),f=m[0],h=m[1],C=Math.max(1,Math.ceil(p.length/25));(f<1||f>C)&&h((n=f,i=1,c=C,Math.min(Math.max(i,n),c)));var g=p.slice(25*(f-1),25*(f-1)+25);return(0,o.createComponentVNode)(2,a.Section,{fill:!0,title:"Extractable Items",buttons:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s,tooltip:"Items will be extracted into the selected container automatically upon insertion.",onClick:function(){return u("autoextract")},children:"Auto-Extract"}),children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Section,{scrollable:!0,fill:!0,children:g.map((function(e,t){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:e.name}),(0,o.createComponentVNode)(2,a.Flex.Item,{nowrap:!0,children:[(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return u("extractingredient",{ingredient_id:e.id})},children:"Extract"}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",title:"Eject",onClick:function(){return u("ejectingredient",{ingredient_id:e.id})}})]})]}),(0,o.createComponentVNode)(2,a.Divider)],4,e.id)}))})}),C<2||(0,o.createComponentVNode)(2,a.Flex.Item,{textAlign:"center",basis:1.5,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"caret-left",title:"Previous Page",disabled:f<2,onClick:function(){return h(f-1)}}),(0,o.createComponentVNode)(2,a.NumberInput,{value:f,format:function(e){return"Page "+e+"/"+C},minValue:1,maxValue:C,stepPixelSize:15,onChange:function(e,t){return h(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"caret-right",title:"Next Page",disabled:f>C-1,onClick:function(){return h(f+1)}})]})]})})}},89971:function(e,t,n){"use strict";t.__esModule=!0,t.Rockbox=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381);t.Rockbox=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.default_price,s=u.autosell,p=(0,r.useLocalState)(t,"takeAmount",1),m=p[0],f=p[1];return(0,o.createComponentVNode)(2,c.Window,{title:"Rockbox",width:375,height:400,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:[(0,o.createComponentVNode)(2,a.Box,{children:["Amount to eject: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:m,width:4,minValue:1,onDrag:function(e,t){return f(t)},onChange:function(e,t){return f(t)}})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Tooltip,{content:"Default price for new ore entries.",position:"bottom",children:(0,o.createComponentVNode)(2,a.Box,{as:"span",children:[" ","Default Price: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:d,width:4,minValue:0,format:function(e){return e+"\u2abd"},onChange:function(e,t){return l("set-default-price",{newPrice:t})}})]})}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:s,tooltip:"Mark new ore entries for sale automatically.",onClick:function(){return l("toggle-auto-sell")},children:"Auto-Sell"})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,children:u.ores.length?(0,o.createComponentVNode)(2,a.Box,{children:u.ores.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:e.stats,children:(0,o.createComponentVNode)(2,a.Table,{children:(0,o.createComponentVNode)(2,a.Table.Row,{children:[(0,o.createComponentVNode)(2,a.Table.Cell,{style:{"vertical-align":"top"},children:(0,o.createComponentVNode)(2,a.Box,{children:e.name+": "+e.amount})}),(0,o.createComponentVNode)(2,a.Table.Cell,{textAlign:"right",children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,textAlign:"left",inline:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Price: ",(0,o.createComponentVNode)(2,a.NumberInput,{value:e.price,width:4,minValue:0,format:function(e){return e+"\u2abd"},onChange:function(t,n){return l("set-ore-price",{newPrice:n,ore:e.name})}}),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{content:"For Sale",color:e.forSale?"green":"red",checked:e.forSale,onClick:function(){return l("toggle-ore-sell-status",{ore:e.name})}}),(0,o.createComponentVNode)(2,a.Button,{color:e.amount<m?"orange":"default",disabled:0===e.amount,onClick:function(){return l("dispense-ore",{ore:e.name,take:m})},children:"Eject"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:!!e.amountSold&&(0,o.createComponentVNode)(2,a.Box,{children:"Amount sold: "+e.amountSold})})]})})]})})}),(0,o.createComponentVNode)(2,a.Divider)],4,e.name)}))}):(0,o.createComponentVNode)(2,a.Box,{children:"No ores stored"})})})]})})})}},95285:function(e,t,n){"use strict";t.__esModule=!0,t.SecureSafe=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l=[["7","8","9","A"],["4","5","6","B"],["1","2","3","C"],["0","F","E","D"]],u=function(e,t){var n=e.attempt,r=e.codeLen,i=e.disabled,l=e.emagged,u=e.padMsg,d=(e.theme,u||function(e,t){return e.padEnd(t,"*").split("").join(" ")}(n,r));return i&&(d="NO ACCESS"),l&&(d=(0,c.glitch)(d,2)),(0,o.createComponentVNode)(2,a.Box,{fontSize:"25px",fontFamily:"Courier",bold:!0,textAlign:"center",padding:"3px",backgroundColor:"#342210",style:{"border-width":"0.1em","border-style":"solid","border-radius":"0.16em","border-color":"#FC8E1F"},children:d})},d=function(e,t){var n=e.act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex.Item,{children:l.map((function(e,t){var r=e.length;return(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",mt:1,children:e.map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mr:t<r-1?1:0,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"25px",fontFamily:"Courier",bold:!0,content:e,onClick:function(){return n("input",{input:e})}})},e)}))},"row-"+t)}))}),(0,o.createComponentVNode)(2,a.Flex.Item,{mt:1,children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mr:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"20px",fontFamily:"Courier",bold:!0,content:"ENTER",onClick:function(){return n("enter")}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,textAlign:"center",fontSize:"20px",fontFamily:"Courier",bold:!0,content:"RESET",onClick:function(){return n("reset")}})})]})})],4)};t.SecureSafe=function(e,t){var n=(0,r.useBackend)(t),l=n.act,s=n.data,p=s.attempt,m=s.codeLen,f=s.disabled,h=s.emagged,C=s.padMsg,g=s.safeName,N=s.theme;return(0,o.createComponentVNode)(2,i.Window,{title:(0,c.capitalize)(g),width:200,height:328,theme:N||"retro-dark",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{fill:!0,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,u,{attempt:p,codeLen:m,disabled:f,emagged:h,padMsg:C}),(0,o.createComponentVNode)(2,d,{act:l})]})})})})}},19172:function(e,t,n){"use strict";t.__esModule=!0,t.SeedFabricator=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(18331),l={Fruit:1,Vegetable:2,Herb:3,Flower:4,Miscellaneous:5,Other:6},u=function(e,t){return(l[e.name]||l.Other)-(l[t.name]||l.Other)};t.SeedFabricator=function(e,t){var n=(0,r.useBackend)(t).data,l=n.canVend,d=n.isWorking,p=n.maxSeed,m=n.name,f=n.seedCount,h=n.seedCategories||[];h.sort(u);var C=(0,r.useLocalState)(t,"dispenseAmount",1),g=C[0],N=C[1];return(0,o.createComponentVNode)(2,i.Window,{title:m,width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[!d&&(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:35,height:10,fontSize:3,fontFamily:"Courier",color:"red",children:[(0,o.createComponentVNode)(2,a.Blink,{time:500,children:[(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle",pr:1.5}),"MALFUNCTION",(0,o.createComponentVNode)(2,a.Icon,{name:"exclamation-triangle",pl:1.5})]}),"CHECK WIRES"]}),(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{children:[(0,o.createComponentVNode)(2,a.Flex.Item,{bold:!0,pr:1,children:"Dispense:"}),(0,o.createComponentVNode)(2,a.Flex.Item,{basis:6,grow:!0,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:g,format:function(e){return e+(0,c.pluralize)(" seed",e)},minValue:1,maxValue:10,onDrag:function(e,t){return N(t)}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:2,children:(0,o.createComponentVNode)(2,a.ProgressBar,{value:Math.max(0,p-f),maxValue:p,ranges:{yellow:[5,Infinity],bad:[-Infinity,5]},children:(0,o.createComponentVNode)(2,a.Icon,{name:"bolt"})})})]})}),(0,o.createComponentVNode)(2,a.Section,{children:[!l&&(0,o.createComponentVNode)(2,a.Modal,{textAlign:"center",width:25,height:5,fontSize:2,fontFamily:"Courier",color:"yellow",children:[(0,o.createComponentVNode)(2,a.Blink,{interval:500,time:500,children:(0,o.createComponentVNode)(2,a.Icon,{name:"bolt",pr:1.5})}),"UNIT RECHARGING"]}),h.map((function(e){return(0,o.createComponentVNode)(2,s,{category:e,dispenseAmount:g},e.name)}))]})]})})};var d=function(e,t){return e.name.localeCompare(t.name)},s=function(e,t){var n=(0,r.useBackend)(t).act,i=e.category,c=e.dispenseAmount,l=i.name,u=i.seeds;if(!u)return null;var s=u.sort(d);return(0,o.createComponentVNode)(2,a.Collapsible,{title:l,children:s.map((function(e){return(0,o.createComponentVNode)(2,a.Box,{as:"span",children:(0,o.createComponentVNode)(2,a.Button,{width:"155px",height:"32px",px:0,m:.25,onClick:function(){return n("disp",{path:e.path,amount:c})},children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:e.img?(0,o.createVNode)(1,"img",null,null,1,{style:{"vertical-align":"middle","horizontal-align":"middle"},height:"32px",width:"32px",src:"data:image/png;base64,"+e.img}):(0,o.createComponentVNode)(2,a.Icon,{style:{"vertical-align":"middle","horizontal-align":"middle"},height:"32px",width:"32px",name:"question-circle-o",pl:"8px",pt:"4px",fontSize:"24px"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{overflow:"hidden",style:{"text-overflow":"ellipsis"},title:e.name,children:e.name})]})})},e.name)}))})}},70535:function(e,t,n){"use strict";t.__esModule=!0,t.SheetCrafting=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SheetCrafting=function(e,t){var n=(0,r.useBackend)(t).data,l=n.availableAmount,u=n.labeledAvailableAmount,d=n.itemList;return(0,o.createComponentVNode)(2,i.Window,{width:360,height:760,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Section,{title:"Recipes",fill:!0,scrollable:!0,children:d.map((function(e){return(0,o.createComponentVNode)(2,c,{item:e,disabled:l<e.sheetCost},e.recipeID)}))})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Amount Left",children:u})})]})})})};var c=function(e,t){var n=(0,r.useBackend)(t).act,i=e.item,c=i.recipeID,l=i.name,u=i.sheetCost,d=i.itemYield,s=i.img;return(0,o.createComponentVNode)(2,a.Button,{disabled:e.disabled,fluid:!0,onClick:function(){return n("make",{recipeID:c})},m:"0.5rem",children:[(0,o.createComponentVNode)(2,a.Image,{verticalAlign:"middle",my:"0.2rem",mr:"0.5rem",height:"32px",width:"32px",src:"data:image/png;base64,"+s}),d>1?(0,o.createVNode)(1,"em",null,[d,(0,o.createTextVNode)("x ")],0):null,l,u>1?(0,o.createVNode)(1,"em",null,[(0,o.createTextVNode)(" ("),u,(0,o.createTextVNode)(" sheets)")],0):null]})}},24258:function(e,t,n){"use strict";t.__esModule=!0,t.Sleeper=void 0;var o,r=n(96323),a=n(31246),i=n(26949),c=n(2381),l=n(1033),u=n(65751),d=function(e){return e<=0?"0":e.toFixed(1)},s=1,p=2,m=((o={})[0]={name:"Conscious",color:"good",icon:"check"},o[s]={name:"Unconscious",color:"average",icon:"bed"},o[p]={name:"Dead",color:"bad",icon:"skull"},o);t.Sleeper=function(e,t){var n=(0,a.useBackend)(t),o=n.data,s=n.act,p=o.sleeperGone,f=o.hasOccupant,h=o.occupantStat,C=o.health,g=o.oxyDamage,N=o.toxDamage,v=o.burnDamage,b=o.bruteDamage,V=o.recharging,y=o.rejuvinators,x=o.isTiming,k=o.time,S=o.timeStarted,I=o.timeNow,w=o.maxTime,_=Math.max(S?(k||0)+S-I:k||0,0),D=f&&!x&&!V&&h<2,M=m[h];return(0,r.createComponentVNode)(2,c.Window,{theme:"ntos",width:440,height:440,children:(0,r.createComponentVNode)(2,c.Window.Content,{children:[(0,r.createComponentVNode)(2,i.Section,{title:"Occupant Statistics",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"eject",align:"center",color:"good",disabled:!f||!!x,onClick:function(){return s("eject")},children:"Eject"}),children:[!f&&(p?"Check connection to sleeper pod.":"The sleeper is unoccupied."),!!f&&(0,r.createComponentVNode)(2,i.LabeledList,{children:[(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Status",children:[(0,r.createComponentVNode)(2,i.Icon,{color:M.color,name:M.icon})," ",M.name]}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Overall Health",children:(0,r.createComponentVNode)(2,i.ProgressBar,{value:C,ranges:{good:[.9,Infinity],average:[.5,.9],bad:[-Infinity,.5]}})}),(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:"Damage Breakdown",children:[(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"oxy",width:5,children:d(g)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"toxin",width:5,children:d(N)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"burn",width:5,children:d(v)}),"/",(0,r.createComponentVNode)(2,u.HealthStat,{inline:!0,align:"center",type:"brute",width:5,children:d(b)})]})]})]}),!!f&&(0,r.createComponentVNode)(2,i.Section,{title:"Detected Rejuvinators",buttons:(0,r.createComponentVNode)(2,i.Button,{icon:"syringe",align:"center",color:"good",disabled:!D,onClick:function(){return s("inject")},children:"Inject"}),children:[(0,r.createComponentVNode)(2,i.Section,{height:10,scrollable:!0,children:y.length?(0,r.createComponentVNode)(2,i.LabeledList,{children:y.map((function(e){return(0,r.createComponentVNode)(2,i.LabeledList.Item,{label:e.name,children:[(0,r.createComponentVNode)(2,i.Icon,{name:!e.od||e.volume<e.od?"circle":"skull",color:e.color})," "+e.volume.toFixed(3),!!e.od&&e.volume>=e.od&&(0,r.createComponentVNode)(2,i.Box,{inline:!0,color:"bad",pl:1,children:"(Overdose!)"})]},e.name)}))}):"No rejuvinators detected in occupant's bloodstream."}),(0,r.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",color:"label",mt:2,children:"Use separate reagent scanner for complete analysis."})]}),(0,r.createComponentVNode)(2,i.Section,{title:"Occupant Alarm Clock",buttons:(0,r.createComponentVNode)(2,i.Button,{width:8,icon:"clock",align:"center",color:x?"bad":"good",disabled:!f||h>1||k<=0,onClick:function(){return s("timer")},children:x?"Stop Timer":"Start Timer"}),children:(0,r.createComponentVNode)(2,i.Flex,{children:[(0,r.createComponentVNode)(2,i.Flex.Item,{children:(0,r.createComponentVNode)(2,i.Knob,{mr:"0.5em",animated:!0,size:1.25,step:5,stepPixelSize:2,minValue:0,maxValue:w/10,value:_/10,onDrag:function(e,t){return s("time_add",{tp:t-_/10})}})}),(0,r.createComponentVNode)(2,i.Flex.Item,{children:(0,r.createComponentVNode)(2,i.Box,{p:1,textAlign:"center",backgroundColor:"black",color:"good",maxWidth:"90px",width:"90px",fontSize:"20px",children:(0,r.createComponentVNode)(2,i.TimeDisplay,{value:_,timing:!!x,format:function(e){return(0,l.formatTime)(e)}})})}),(0,r.createComponentVNode)(2,i.Flex.Item,{shrink:1,children:(0,r.createComponentVNode)(2,i.Box,{italic:!0,textAlign:"center",color:"label",pl:1,children:"System will inject rejuvenators automatically when occupant is in hibernation."})})]})})]})})}},82930:function(e,t,n){"use strict";t.__esModule=!0,t.SlotMachine=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SlotMachine=function(e,t){var n=(0,r.useBackend)(t).data,a=n.busy,d=n.scannedCard;return(0,o.createComponentVNode)(2,i.Window,{title:"Slot Machine",width:375,height:220,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:d?a?(0,o.createComponentVNode)(2,u):(0,o.createComponentVNode)(2,l):(0,o.createComponentVNode)(2,c)})})};var c=function(e,t){var n=(0,r.useBackend)(t).act;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NoticeBox,{danger:!0,children:"You must insert your ID to continue!"}),(0,o.createComponentVNode)(2,a.Button,{icon:"id-card",onClick:function(){return n("insert_card")},children:"Insert ID"})],4)},l=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data,l=c.account_funds,u=c.money,d=c.plays,s=c.scannedCard,p=c.wager;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.NoticeBox,{success:!0,children:(0,o.createVNode)(1,"marquee",null," Wager some credits! ",16)}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createVNode)(1,"strong",null,"Your card: ",16),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",content:s,tooltip:"Pull Funds and Eject Card",tooltipPosition:"bottom-end",onClick:function(){return i("eject")}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(1,"strong",null,"Account Balance:",16)}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"dollar-sign"})," ",l]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Add Funds",tooltipPosition:"bottom",onClick:function(){return i("cashin")},children:"Cash In"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{tooltip:"Pull Funds",tooltipPosition:"bottom",onClick:function(){return i("cashout")},children:"Cash Out"})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:"Amount Wagered:"}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.NumberInput,{minValue:20,maxValue:1e3,value:p,format:function(e){return e+"\u2abd"},onDrag:function(e,t){return i("set_wager",{bet:t})}})})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(1,"strong",null,"Credits Remaining:",16)}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Icon,{name:"dollar-sign"})," ",u]})]})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.BlockQuote,{children:[d," attempts have been made today!"]})}),(0,o.createComponentVNode)(2,a.Stack.Divider),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"dice",tooltip:"Pull the lever",tooltipPosition:"right",onClick:function(){return i("play",{bet:p})},children:"Play!"})})]})],4)},u=function(){return(0,o.createComponentVNode)(2,a.NoticeBox,{warning:!0,children:"The Machine is busy, please wait!"})}},68952:function(e,t,n){"use strict";t.__esModule=!0,t.Smes=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381),l=1e3;t.Smes=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.charge,p=d.capacity,m=d.inputAttempt,f=d.inputting,h=d.inputLevel,C=d.inputLevelMax,g=d.inputAvailable,N=d.outputAttempt,v=d.outputting,b=d.outputLevel,V=d.outputLevelMax,y=(s/p>=1?"good":f&&h&&"average")||"bad",x=(N&&v?"good":s>0&&"average")||"bad";return(0,o.createComponentVNode)(2,c.Window,{width:340,height:360,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Stored Energy",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Stored Energy",children:(0,i.formatSiUnit)(s,0,"J")})}),(0,o.createComponentVNode)(2,a.ProgressBar,{mt:"0.5em",value:s/p,ranges:{good:[.5,Infinity],average:[.15,.5],bad:[-Infinity,.15]}})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Input",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Charge Mode",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:m?"green":"red",onClick:function(){return u("toggle-input")},children:m?"On":"Off"}),children:(0,o.createComponentVNode)(2,a.Box,{color:y,children:(s/p>=1?"Fully Charged":m&&h&&!f&&"Initializing")||m&&h&&f&&"Charging"||m&&f&&"Idle"||"Not Charging"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Input",children:(0,o.createComponentVNode)(2,a.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:0===h,onClick:function(){return u("set-input",{target:"min"})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward",disabled:0===h,onClick:function(){return u("set-input",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,a.Slider,{value:h/l,fillValue:g/l,minValue:0,maxValue:C/l,step:5,stepPixelSize:4,format:function(e){return(0,i.formatPower)(e*l,1)},onDrag:function(e,t){return u("set-input",{target:t*l})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"forward",disabled:h===C,onClick:function(){return u("set-input",{adjust:1e4})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:h===C,onClick:function(){return u("set-input",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Available",children:(0,i.formatPower)(g)})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Output",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output Mode",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"power-off",color:N?"green":"red",onClick:function(){return u("toggle-output")},children:N?"On":"Off"}),children:(0,o.createComponentVNode)(2,a.Box,{color:x,children:(v&&N?"Enabled":N&&"Idle")||s&&"Disabled"||"No Charge"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Target Output",children:(0,o.createComponentVNode)(2,a.Flex,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",disabled:0===b,onClick:function(){return u("set-output",{target:"min"})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward",disabled:0===b,onClick:function(){return u("set-output",{adjust:-1e4})}})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,mx:1,children:(0,o.createComponentVNode)(2,a.Slider,{value:b/l,minValue:0,maxValue:V/l,step:5,stepPixelSize:4,format:function(e){return(0,i.formatPower)(e*l,1)},onDrag:function(e,t){return u("set-output",{target:t*l})}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"forward",disabled:b===V,onClick:function(){return u("set-output",{adjust:1e4})}}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",disabled:b===V,onClick:function(){return u("set-output",{target:"max"})}})]})]})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outputting",children:(0,i.formatPower)(v)})]})})]})})}},54016:function(e,t,n){"use strict";t.__esModule=!0,t.SpawnEvent=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(25808),c=n(2381);t.SpawnEvent=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.thing_to_spawn,s=u.thing_name,p=u.spawn_directly,m=u.spawn_loc,f=u.ghost_confirmation_delay,h=u.amount_to_spawn,C=u.antag_role,g=u.objective_text,N=u.spawn_type,v=u.loc_type,b=u.incompatible_antag,V=u.equip_antag,y=u.ask_permission,x=u.allow_dnr,k=u.eligible_player_count;return(0,o.createComponentVNode)(2,c.Window,{title:"Ghost Spawn Editor",width:500,height:330,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Thing to spawn",children:[(0,o.createComponentVNode)(2,a.Button,{selected:s&&"mob_ref"===N,onClick:function(){return l("select_mob")},tooltip:"mob_ref"===N&&s?d:"",children:"mob_ref"===N?s:"Mob ref"}),(0,o.createComponentVNode)(2,a.Button,{selected:s&&"mob_type"===N,onClick:function(){return l("select_mob_type")},tooltip:"mob_type"===N&&s?d:"",children:"mob_type"===N?s:"Mob type"}),(0,o.createComponentVNode)(2,a.Button,{selected:s&&"job"===N,onClick:function(){return l("select_job")},tooltip:"job"===N&&s?d:"",children:"job"===N?s:"Job"}),(0,o.createComponentVNode)(2,a.Button,{selected:"random_human"===N,onClick:function(){return l("set_random_human")},tooltip:"Just a basic random human.",children:"Random Human"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Accept delay",children:[!!y&&(0,o.createComponentVNode)(2,a.NumberInput,{value:f/10,minValue:0,maxValue:120,onDrag:function(e,t){return l("set_spawn_delay",{spawn_delay:10*t})},disabled:!y}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:y,onClick:function(){return l("set_ask_permission",{ask_permission:!y})},tooltip:"Do we ask permission or just spawn them directly?",children:"Ask permission."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Amount to spawn",children:[(0,o.createComponentVNode)(2,a.NumberInput,{value:h,minValue:1,maxValue:100,onDrag:function(e,t){return l("set_amount",{amount:t})}}),"/",k," ",(0,o.createComponentVNode)(2,a.Button,{icon:"refresh",onClick:function(){return l("refresh_player_count")}}),1===h&&"mob_ref"===N&&s&&(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:p,onClick:function(){return l("set_spawn_directly",{spawn_directly:!p})},tooltip:"Puts the ghost mind directly into the original mob instead of copying it.",children:"Spawn as original"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Spawn location",children:[(0,o.createComponentVNode)(2,a.Button,{disabled:p,selected:m&&"turf_ref"===v,onClick:function(){return l("select_turf")},children:"turf_ref"===v?m:"Turf ref"}),(0,o.createComponentVNode)(2,a.Button,{disabled:p,selected:m&&"landmark"===v,onClick:function(){return l("select_landmark")},children:"landmark"===v?m:"Landmark"})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Antagonist status",children:[(0,o.createComponentVNode)(2,a.Button,{selected:C,onClick:function(){return l("select_antag")},children:C||"Antag role"}),C&&(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{color:"red",onClick:function(){return l("clear_antag")},children:"x"}),(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:V,tooltip:"Give antag default equipment and abilities? Will overwrite anything already equipped in those slots.",onClick:function(){return l("set_equip",{equip_antag:!V})},children:"Equip antags"})],4),!!b&&(0,o.createComponentVNode)(2,a.Button,{color:"yellow",circular:!0,icon:"circle-exclamation",tooltip:"Some antagonists are only compatible with human mobs, this may not work properly."})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"DNR",children:(0,o.createComponentVNode)(2,i.ButtonCheckbox,{checked:x,tooltip:"Allow players who have set DNR to respawn in this event",onClick:function(){return l("set_allow_dnr",{allow_dnr:!x})},children:"Allow DNR players"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Objective text",children:(0,o.createComponentVNode)(2,a.TextArea,{value:g,fluid:!0,height:5,onChange:function(e,t){return l("set_objective_text",{objective_text:t})}})})]})}),(0,o.createComponentVNode)(2,a.Section,{align:"center",children:(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return l("spawn")},disabled:!d||"[0x0]"===d,children:"Spawn"})})]})})}},19378:function(e,t,n){"use strict";t.__esModule=!0,t.SpendSpacebux=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.product,n=t.pname,r=t.cost,i=t.img,c=e.disabled,l=e.onClick;return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+i,style:{"vertical-align":"middle","horizontal-align":"middle"}})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:[(0,o.createComponentVNode)(2,a.Box,{bold:!0,children:n}),(0,o.createComponentVNode)(2,a.Box,{children:["Cost: "+r," ",(0,o.createVNode)(1,"i","fa-solid fa-coins")]})]}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button,{onClick:l,disabled:c,children:"Buy"})})]}),(0,o.createComponentVNode)(2,a.Divider)],4)};t.SpendSpacebux=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.purchasables,s=u.held,p=u.balance,m=u.truebalance,f=(0,r.useLocalState)(t,"filter-available",!1),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,i.Window,{resizable:!0,title:"Spend Spacebux",width:300,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.BlockQuote,{children:"Purchase an item for the upcoming round. Earn more cash by completing rounds. A purchased item will persist until you die or fail to escape the station. If you have a Held Item, buying a new one will replace it."}),(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[s?(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Box,{children:["Held Item: ",s]})}):"",(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Flex,{direction:"row",align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Box,{children:["Balance: ",p," ",(0,o.createVNode)(1,"i","fa-solid fa-coins")]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:h,onClick:function(){return C(!h)},children:"Filter Affordable"})})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:d.filter((function(e){var t=e.cost;return!(h&&m<t)})).map((function(e){var t=e.pname,n=e.cost;return(0,o.createComponentVNode)(2,c,{product:e,disabled:m<n,onClick:function(){return l("purchase",{pname:t})}},t)}))})]})]})})})}},79387:function(e,t,n){"use strict";t.__esModule=!0,t.SwingSign=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.SwingSign=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.message,d=l.maxRows,s=l.maxCols;return(0,o.createComponentVNode)(2,i.Window,{width:30+8*s,height:95+15*d,title:"Swing sign",children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{content:"Save",onClick:function(){l.message=document.getElementById("messageTA").value,c("save_message",l)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createVNode)(128,"textarea",null,u,0,{id:"messageTA",cols:s,rows:d,maxlength:s*d+d-1,style:{overflow:"hidden",background:"#0A0A0A",color:"#FFFFFF",outline:"1px #6A93C3",textalign:"center",wrap:"hard"},placeholder:"Your message goes here...",onInput:function(e){for(var t=e.target.value.split(/\n/g),n=0;n<t.length;n++)if(t[n]&&t[n].length>s){var o=t[n].substring(0,s);t[n]=t[n].substring(s,t[n].length),t.splice(n,0,o)}t&&t.length>d&&t.splice(d,t.length-d),e.target.value=t.join("\n")}})})]})})})})}},44001:function(e,t,n){"use strict";t.__esModule=!0,t.SwingSignTIM=void 0;var o=n(96323),r=n(34277),a=n(31246),i=n(26949),c=n(2381);t.SwingSignTIM=function(e,t){var n=(0,a.useBackend)(t).data,s=n.max_length,p=n.message,m=n.placeholder,f=n.title,h=n.allowEmpty,C=n.rows,g=n.columns,N=(0,a.useLocalState)(t,"input",m),v=N[0],b=N[1],V=(0,a.useLocalState)(t,"inputIsValid",{isValid:h||!!p,error:null}),y=V[0],x=V[1],k=130+Math.ceil(p.length/5)+75;return(0,o.createComponentVNode)(2,c.Window,{title:f,width:325,height:k,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Box,{color:"label",children:p})}),(0,o.createComponentVNode)(2,l,{input:v,inputIsValid:y,onType:function(e){e.preventDefault();var t=e.target;t.value=d(t.value,C,g),x(u(t.value,s,C)),b(t.value)}}),(0,o.createComponentVNode)(2,i.Stack.Item,{pl:5,pr:5,children:(0,o.createComponentVNode)(2,r.InputButtons,{input:v,inputIsValid:y})})]})})})})};var l=function(e,t){var n=(0,a.useBackend)(t),r=n.act,c=(n.data,e.input),l=(e.inputIsValid,e.onType);return(0,o.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.TextArea,{autoFocus:!0,height:"100%",textAlign:"center",fontFamily:"Consolas",onInput:function(e){return l(e)},onEnter:function(){r("submit",{entry:c})},placeholder:"Type something...",style:{overflow:"hidden",whiteSpace:"pre-line",wrap:"hard",textAlignLast:"center"},value:c})})},u=function(e,t,n){return t&&e.length>t||n&&e.split(/\n/g).length>n?{isValid:!1,error:"Too long!"}:{isValid:!0,error:null}},d=function(e,t,n){for(var o=e.split(/\n/g),r=0;r<o.length;r++)if(o[r]&&o[r].length>n){var a=o[r].substring(0,n);o[r]=o[r].substring(n,o[r].length),o.splice(r,0,a)}return o.join("\n")}},13634:function(e,t,n){"use strict";t.__esModule=!0,t.TEG=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.TEG=function(e,t){var n=(0,r.useBackend)(t),l=(n.act,n.data),u=l.output,d=l.history,s=l.hotCircStatus,p=l.hotInletTemp,m=l.hotOutletTemp,f=l.hotInletPres,h=l.hotOutletPres,C=l.coldCircStatus,g=l.coldInletTemp,N=l.coldOutletTemp,v=l.coldInletPres,b=l.coldOutletPres,V=d.map((function(e,t){return[t,e]})),y=Math.max.apply(Math,d),x=function(e){return(e>=1e3?e.toExponential(3):e)+" K"};return(0,o.createComponentVNode)(2,c.Window,{height:"520",width:"300",children:(0,o.createComponentVNode)(2,c.Window.Content,{children:[(0,o.createComponentVNode)(2,a.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Output History"})}),(0,o.createComponentVNode)(2,a.Chart.Line,{height:"5em",data:V,rangeX:[0,V.length-1],rangeY:[0,y],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Energy Output",textAlign:"right",children:(0,i.formatPower)(u)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Hot Gas Circulator",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:(s&&p?"good":s&&"average")||"bad",children:(s&&p?"OK":s&&"Idle")||"ERROR"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cold Gas Circulator",textAlign:"right",children:(0,o.createComponentVNode)(2,a.Box,{color:(C&&g?"good":C&&"average")||"bad",children:(C&&g?"OK":C&&"Idle")||"ERROR"})})]})]}),(0,o.createComponentVNode)(2,a.Section,{title:"Hot Loop",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Temp",textAlign:"right",children:x(p)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Temp",textAlign:"right",children:x(m)}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(Math.max(f,0),1,"Pa")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(h,1,"Pa")})]})}),(0,o.createComponentVNode)(2,a.Section,{title:"Cold Loop",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Temp",textAlign:"right",children:x(g)}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Temp",textAlign:"right",children:x(N)}),(0,o.createComponentVNode)(2,a.LabeledList.Divider),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Inlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(Math.max(v,0),1,"Pa")}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Outlet Pressure",textAlign:"right",children:(0,i.formatSiUnit)(b,1,"Pa")})]})})]})})}},31567:function(e,t,n){"use strict";t.__esModule=!0,t.TTV=t.TankInfo=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(21118),l=n(1033),u=function(e,t){var n=(0,r.useBackend)(t).act,i=e.tank,u=e.tankNum,d=(0,o.createComponentVNode)(2,a.Button,{width:5,textAlign:"center",disabled:null===i.name,icon:"eject",onClick:function(){return n(1===u?"remove_tank_one":"remove_tank_two")},children:"Eject"}),s=(0,o.createComponentVNode)(2,a.Button,{width:5,textAlign:"center",icon:"add",onClick:function(){return n("add_item",{tank:u})},children:"Add"}),p=null!==i.maxPressure?i.maxPressure:999;return(0,o.createComponentVNode)(2,a.Section,{title:1===u?"Tank One":"Tank Two",buttons:null!==i.name?d:s,style:{height:"100%"},children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Holding",children:null!==i.name?(0,c.toTitleCase)(i.name):"None"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,a.RoundGauge,{size:1.75,value:null!==i.pressure?i.pressure:0,minValue:0,maxValue:p,alertAfter:.7*p,ranges:{good:[0,.7*p],average:[.7*p,.85*p],bad:[.85*p,p]},format:l.formatPressure})})]})})};t.TankInfo=u;t.TTV=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,d=l.opened,s=l.tank_one,p=l.tank_two;return(0,o.createComponentVNode)(2,i.Window,{width:650,height:170,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,u,{tank:s,tankNum:1})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Valve",px:1,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,textAlign:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{color:d?"red":"green",children:["Valve is ",d?"open":"closed"]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"repeat",onClick:function(){return c("toggle_valve")},children:"Toggle Valve"})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[""===l.device?"No Device ":"",""===l.device?(0,o.createComponentVNode)(2,a.Button,{icon:"add",onClick:function(){return c("add_item")},children:"Add"}):(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return c("interact_device")},children:l.device}),(0,o.createComponentVNode)(2,a.Button,{icon:"eject",onClick:function(){return c("remove_device")},children:"Eject"})],4)]})]})})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,u,{tank:p,tankNum:2})})]})})})}},51461:function(){},99714:function(e,t,n){"use strict";t.__esModule=!0,t.TankDispenser=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.TankDispenser=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data;return(0,o.createComponentVNode)(2,i.Window,{width:280,height:105,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Plasma",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:l.plasma?"circle":"circle-o",content:"Dispense",disabled:!l.plasma,onClick:function(){return c("dispense-plasma")}}),children:l.plasma}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Oxygen",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:l.oxygen?"circle":"circle-o",content:"Dispense",disabled:!l.oxygen,onClick:function(){return c("dispense-oxygen")}}),children:l.oxygen})]})})})})}},87221:function(e,t,n){"use strict";t.__esModule=!0,t.BookmarksSection=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(581);t.BookmarksSection=function(e,t){var n=e.bookmarks,l=e.maxBookmarks,u=e.onAddBookmark,d=e.onDeleteBookmark,s=e.onRestoreBookmark,p=e.targetCoords,m=(0,a.useLocalState)(t,"newBookmarkName",""),f=m[0],h=m[1],C=function(e){u(e),h("")};return(0,o.createComponentVNode)(2,i.Section,{title:"Bookmarks",children:(0,o.createComponentVNode)(2,i.LabeledList,{children:[n.map((function(e){return(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:(0,c.formatCoordinates)(e.x,e.y,e.z),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"trash",color:"red",onClick:function(){return d(e.ref)}}),children:(0,o.createComponentVNode)(2,i.Button,{icon:"bookmark",onClick:function(){return s(e.ref)},children:(0,r.decodeHtmlEntities)(e.name)})},e.ref)})),!!(n.length<l)&&(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:c.formatCoordinates.apply(void 0,p),buttons:(0,o.createComponentVNode)(2,i.Button,{icon:"plus",onClick:function(){return C(f)}}),children:(0,o.createComponentVNode)(2,i.Input,{width:"100%",value:f,onInput:function(e,t){return h(t)},placeholder:"New bookmark",onEnter:function(e,t){return C(t)},maxLength:32})},"new")]})})}},75461:function(e,t,n){"use strict";t.__esModule=!0,t.ConnectionSection=void 0;var o=n(96323),r=n(26949);t.ConnectionSection=function(e){var t=e.isConnected,n=e.isPanelOpen,a=e.onCyclePad,i=e.onReset,c=e.onRetry,l=e.padNum,u=t?(0,o.createComponentVNode)(2,r.Button,{icon:"power-off",color:"red",onClick:i,children:"Reset"}):(0,o.createComponentVNode)(2,r.Button,{icon:"power-off",color:"green",onClick:c,children:"Retry"});return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Connection",buttons:u,children:t?(0,o.createComponentVNode)(2,r.Box,{color:"green",children:"Connected"}):(0,o.createComponentVNode)(2,r.Box,{color:"red",children:"No connection to host"})}),n&&(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Linked Pad",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"arrows-spin",onClick:a,children:"Cycle"}),children:l})]})})}},12703:function(e,t,n){"use strict";t.__esModule=!0,t.CoordinatesSection=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(34545),c=n(581);t.CoordinatesSection=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.xTarget,s=u.yTarget,p=u.zTarget;return(0,o.createComponentVNode)(2,a.Section,{title:"Target",children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"X",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{format:c.formatDecimal,maxValue:500,minValue:0,nudgeAmount:.25,skipAmount:10,stepAmount:1,step:.25,onChange:function(e){return l("setX",{value:e})},value:d})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Y",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{format:c.formatDecimal,maxValue:500,minValue:0,nudgeAmount:.25,skipAmount:10,stepAmount:1,step:.25,onChange:function(e){return l("setY",{value:e})},value:s})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Z",children:(0,o.createComponentVNode)(2,i.SteppedSlider,{maxValue:14,minValue:0,onChange:function(e){return l("setZ",{value:e})},stepPixelSize:16,value:p})})]})})}},34545:function(e,t,n){"use strict";t.__esModule=!0,t.SteppedSlider=void 0;var o=n(96323),r=n(97622),a=n(26949),i=["format","maxValue","minValue","onAdjust","onChange","nudgeAmount","skipAmount","step","stepAmount","value"];t.SteppedSlider=function(e){var t,n=e.format,c=e.maxValue,l=e.minValue,u=e.onAdjust,d=e.onChange,s=e.nudgeAmount,p=e.skipAmount,m=e.step,f=e.stepAmount,h=e.value,C=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,i),g=null!=(t=null!=f?f:m)?t:1,N=function(e){u?u(e):d((0,r.clamp)(h+e,l,c))};return(0,o.createComponentVNode)(2,a.Stack,{inline:!0,width:"100%",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"backward-fast",onClick:function(){return d(l)},tooltip:"Minimum ("+l+")",tooltipPosition:"bottom"}),!!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"backward",onClick:function(){return N(-p)},tooltip:"Skip Down ("+-p+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"backward-step",onClick:function(){return N(-g)},tooltip:"Step Down ("+-g+")",tooltipPosition:"bottom"}),!!s&&(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return N(-s)},tooltip:"Nudge Down ("+-s+")",tooltipPosition:"bottom",children:(0,o.createComponentVNode)(2,a.Icon,{name:"play",rotation:180})})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:1,children:(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.Slider,Object.assign({},C,{format:n,maxValue:c,minValue:l,onChange:function(e,t){return d(t)},step:m,value:h})))}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[!!s&&(0,o.createComponentVNode)(2,a.Button,{icon:"play",onClick:function(){return N(s)},tooltip:"Nudge Up (+"+s+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"forward-step",onClick:function(){return N(g)},tooltip:"Step Up (+"+g+")",tooltipPosition:"bottom"}),!!p&&(0,o.createComponentVNode)(2,a.Button,{icon:"forward",onClick:function(){return N(p)},tooltip:"Skip Up (+"+p+")",tooltipPosition:"bottom"}),(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",onClick:function(){return d(c)},tooltip:"Maximum ("+c+")",tooltipPosition:"bottom"})]})]})}},79268:function(e,t,n){"use strict";t.__esModule=!0,t.TeleConsole=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(87221),l=n(75461),u=n(12703),d=n(581);t.TeleConsole=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data,m=p.xTarget,f=p.yTarget,h=p.zTarget,C=p.hostId,g=p.bookmarks,N=p.readout,v=p.isPanelOpen,b=p.padNum,V=p.maxBookmarks,y=!!C;return(0,o.createComponentVNode)(2,i.Window,{theme:"ntos",width:400,height:515,children:(0,o.createComponentVNode)(2,i.Window.Content,{textAlign:"center",children:[(0,o.createComponentVNode)(2,u.CoordinatesSection),(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{icon:"sign-out-alt",onClick:function(){return s("send")},disabled:!y,children:"Send"}),(0,o.createComponentVNode)(2,a.Button,{icon:"sign-in-alt",onClick:function(){return s("receive")},disabled:!y,children:"Receive"}),(0,o.createComponentVNode)(2,a.Button,{onClick:function(){return s("portal")},disabled:!y,children:[(0,o.createComponentVNode)(2,a.Icon,{name:"ring",rotation:90}),"Toggle Portal"]}),(0,o.createComponentVNode)(2,a.Button,{icon:"magnifying-glass",onClick:function(){return s("scan")},disabled:!y,children:"Scan"})]}),N&&(0,o.createComponentVNode)(2,a.Section,{children:(0,d.formatReadout)(N)}),(0,o.createComponentVNode)(2,c.BookmarksSection,{bookmarks:g,maxBookmarks:V,onAddBookmark:function(e){return s("addbookmark",{value:e})},onDeleteBookmark:function(e){return s("deletebookmark",{value:e})},onRestoreBookmark:function(e){return s("restorebookmark",{value:e})},targetCoords:[m,f,h]}),(0,o.createComponentVNode)(2,l.ConnectionSection,{isConnected:y,isPanelOpen:!!v,onCyclePad:function(){return s("setpad")},onReset:function(){return s("reconnect",{value:2})},onRetry:function(){return s("reconnect",{value:1})},padNum:b})]})})}},65087:function(){},581:function(e,t,n){"use strict";t.__esModule=!0,t.formatReadout=t.formatCoordinates=t.formatDecimal=void 0;var o=n(97622),r=n(21118),a=function(e){return(0,o.toFixed)(e,2)};t.formatDecimal=a;t.formatCoordinates=function(e,t,n){return a(e)+" / "+a(t)+" / "+n};t.formatReadout=function(e){return(0,r.decodeHtmlEntities)(e)}},73354:function(e,t,n){"use strict";t.__esModule=!0,t.InputAndButtonsSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.InputAndButtonsSection=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.TermActive;return(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,a.Flex,{align:"center",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{grow:!0,children:(0,o.createComponentVNode)(2,a.Input,{id:"terminalInput",placeholder:"Type Here",selfClear:!0,fluid:!0,mr:"0.5rem",onEnter:function(e,t){i("text",{value:t})},history:!0})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Enter",children:(0,o.createComponentVNode)(2,a.Button,{icon:"share",color:c?"green":"red",onClick:function(){var e=document.querySelector("#terminalInput .Input__input");i("text",{value:e.value}),e.value=""},mr:"0.5rem",my:.25})})}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Tooltip,{content:"Restart",children:(0,o.createComponentVNode)(2,a.Button,{icon:"repeat",color:c?"green":"red",onClick:function(){return i("restart")},my:.25})})})]})})}},58084:function(e,t,n){"use strict";t.__esModule=!0,t.PheripheralsSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.PheripheralsSection=function(e,t){var n=(0,r.useBackend)(t),i=n.act,c=n.data.peripherals||[];return(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:c.map((function(e){return(0,o.createComponentVNode)(2,a.Button,{icon:e.icon,content:e.label,fontFamily:e.Clown?"Comic Sans MS":"Consolas",color:e.color?"green":"grey",onClick:function(){return function(e){return i("buttonPressed",{card:e.card,index:e.index})}(e)}},e.card)}))})}},98341:function(e,t,n){"use strict";t.__esModule=!0,t.TerminalOutputSection=void 0;var o=n(96323),r=n(31246),a=n(26949);t.TerminalOutputSection=function(e,t){var n=(0,r.useBackend)(t).data,i=n.fontColor,c=n.bgColor,l=e.displayHTML;return(0,o.createComponentVNode)(2,a.Section,{backgroundColor:c,scrollable:!0,fill:!0,id:"terminalOutput",children:(0,o.createComponentVNode)(2,a.Box,{fontFamily:"Consolas",fill:!0,color:i,dangerouslySetInnerHTML:{__html:l}})})}},14831:function(e,t,n){"use strict";t.__esModule=!0,t.Terminal=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(98341),c=n(73354),l=n(58084),u=n(26949);t.Terminal=function(e,t){var n=(0,r.useBackend)(t).data,d=n.windowName,s=n.displayHTML,p=function(){var e=document.querySelector("#terminalOutput .Section__content");e&&(e.scrollTop=e.scrollHeight)};return(0,o.createComponentVNode)(2,a.Window,{theme:"retro-dark",title:d,fontFamily:"Consolas",width:"380",height:"350",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,u.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,u.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,i.TerminalOutputSection,{displayHTML:s},null,{onComponentDidMount:p,onComponentDidUpdate:function(e,t){e.displayHTML!==t.displayHTML&&p()}})}),(0,o.createComponentVNode)(2,u.Stack.Item,{children:(0,o.createComponentVNode)(2,c.InputAndButtonsSection)}),(0,o.createComponentVNode)(2,u.Stack.Item,{children:(0,o.createComponentVNode)(2,l.PheripheralsSection)})]})})})}},55230:function(){},14081:function(e,t,n){"use strict";t.__esModule=!0,t.Terrainify=t.TerrainOptions=t.TerrainToggles=t.TerrainVehicleChoice=t.TerrainChoice=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=function(e){var t=e.typeData,n=e.terrain,r=e.onTerrainValue;return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Flex,{direction:"column",children:(0,o.createComponentVNode)(2,a.Section,{title:"Types",children:Object.keys(t).map((function(e,i){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:n===e,onClick:function(){return r(e)},children:t[e].name})},i)}))})})})};t.TerrainChoice=c;var l=function(e){var t=e.fabricator,n=e.cars,r=e.allowVehicles,i=e.onToggleFabricators,c=e.onToggleCars,l=e.onToggleAllowVehicles;return(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Section,{title:"Vehicle Options",children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:t,content:"Add Subs to Fabricators",onClick:function(){return i()}}),(0,o.createVNode)(1,"br"),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,content:"Convert some Cars",onClick:function(){return c()}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:r,content:"Allow Pods",onClick:function(){return l()}})]})})};t.TerrainVehicleChoice=l;var u=function(e){var t=e.terrain,n=e.typeData,r=e.activeToggles,i=e.onToggle;return t&&n[t].toggles&&Object.keys(n[t].toggles).length?(0,o.createComponentVNode)(2,a.Section,{title:"Toggles",children:Object.keys(n[t].toggles).map((function(e,t){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:r[e],content:e,onClick:function(){return i(e)}})},t)}))}):""};t.TerrainToggles=u;var d=function(e){var t=e.terrain,n=e.typeData,r=e.activeOptions,i=e.onSelect;return t&&n[t].options&&Object.keys(n[t].options).length?Object.keys(n[t].options).map((function(e,c){return(0,o.createComponentVNode)(2,a.Section,{title:e,children:n[t].options[e].map((function(t,n){return(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:r[e]===t,onClick:function(){return i(e,t)},children:t})},n)}))},c)})):""};t.TerrainOptions=d;t.Terrainify=function(e,t){var n=(0,r.useBackend)(t),s=n.act,p=n.data,m=p.typeData,f=p.terrain,h=p.fabricator,C=p.cars,g=p.allowVehicles,N=p.locked,v=p.activeOptions,b=p.activeToggles;return(0,o.createComponentVNode)(2,i.Window,{title:"Terrainify",width:500,height:600,children:(0,o.createComponentVNode)(2,i.Window.Content,{scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{title:(0,o.createComponentVNode)(2,a.Box,{inline:!0,children:"Terrainify"}),children:[(0,o.createComponentVNode)(2,a.Flex,{direction:"row",children:[(0,o.createComponentVNode)(2,c,{typeData:m,terrain:f,onTerrainValue:function(e){s("terrain",{terrain:e})}}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:2}),(0,o.createComponentVNode)(2,a.Flex.Item,{ml:1,children:[(0,o.createComponentVNode)(2,a.Section,{title:"Description",children:f?m[f].description:"..."}),(0,o.createComponentVNode)(2,l,{fabricator:h,cars:C,allowVehicles:g,onToggleAllowVehicles:function(){s("allowVehicles")},onToggleFabricators:function(){s("fabricator")},onToggleCars:function(){s("cars")}}),(0,o.createComponentVNode)(2,u,{typeData:m,terrain:f,activeToggles:b,onToggle:function(e){s("toggle",{toggle:e})}}),(0,o.createComponentVNode)(2,d,{typeData:m,terrain:f,activeOptions:v,onSelect:function(e,t){s("option",{key:e,value:t})}})]})]}),(0,o.createComponentVNode)(2,a.Box,{m:1,children:(0,o.createComponentVNode)(2,a.Button,{fluid:!0,disabled:N,onClick:function(){return s("activate")},children:"Transform Station"})})]})})})}},81235:function(e,t,n){"use strict";t.__esModule=!0,t.TextInputModal=void 0;var o=n(96323),r=n(55631),a=n(34277),i=n(31246),c=n(26949),l=n(2381);t.TextInputModal=function(e,t){var n=(0,i.useBackend)(t).data,s=n.max_length,p=n.message,m=n.multiline,f=n.placeholder,h=n.timeout,C=n.title,g=n.allowEmpty,N=n.theme,v=(0,i.useLocalState)(t,"input",f),b=v[0],V=v[1],y=(0,i.useLocalState)(t,"inputIsValid",{isValid:g||!!p,error:null}),x=y[0],k=y[1],S=130+Math.ceil(p.length/5)+(m?75:0);return(0,o.createComponentVNode)(2,l.Window,{title:C,width:325,height:S,theme:N||"nanotrasen",children:[h&&(0,o.createComponentVNode)(2,r.Loader,{value:h}),(0,o.createComponentVNode)(2,l.Window.Content,{children:(0,o.createComponentVNode)(2,c.Section,{fill:!0,children:(0,o.createComponentVNode)(2,c.Stack,{fill:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Box,{color:"label",children:p})}),(0,o.createComponentVNode)(2,u,{input:b,inputIsValid:x,onType:function(e){e.preventDefault();var t=e.target;k(d(t.value,s,g)),V(t.value)}}),(0,o.createComponentVNode)(2,c.Stack.Item,{pl:5,pr:5,children:(0,o.createComponentVNode)(2,a.InputButtons,{input:b,inputIsValid:x})})]})})})]})};var u=function(e,t){var n=(0,i.useBackend)(t),r=n.act,a=n.data.multiline,l=e.input,u=e.inputIsValid,d=e.onType;return a?(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,children:(0,o.createComponentVNode)(2,c.TextArea,{autoFocus:!0,height:"100%",onInput:function(e){return d(e)},onEnter:function(){r("submit",{entry:l})},placeholder:"Type something...",value:l})}):(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Input,{autoFocus:!0,fluid:!0,onInput:function(e){return d(e)},onEnter:function(){u&&r("submit",{entry:l})},placeholder:"Type something...",value:l})})},d=function(e,t,n){return t&&e.length>t?{isValid:!1,error:"Too long!"}:0!==e.length||n?{isValid:!0,error:null}:{isValid:!1,error:null}}},80480:function(e,t,n){"use strict";t.__esModule=!0,t.Timer=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(1033);t.Timer=function(e,t){var n=(0,r.useBackend)(t),l=n.data,u=n.act,d=function(e){u("set-time",{value:10*e})},s=function(e){return(0,c.formatTime)(10*e)};return(0,o.createComponentVNode)(2,i.Window,{width:"280",height:"200",title:l.name,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[!!l.armButton&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Armed",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.armed,onClick:function(){return u("toggle-armed")},children:l.armed?"Armed":"Not armed"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Timing",children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:l.timing,onClick:function(){return u("toggle-timing")},children:l.timing?"Timing":"Not timing"})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Time",children:(0,o.createComponentVNode)(2,a.Stack,{align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Knob,{animated:!0,value:l.time,minValue:l.minTime,maxValue:600,stepPixelSize:1,format:s,onDrag:function(e,t){return d(t)},onChange:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.AnimatedNumber,{value:l.time,format:s})})]})})]})})})})}},5051:function(e,t,n){"use strict";t.__esModule=!0,t.TransitShuttle=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.TransitShuttle=function(e,t){var n=(0,r.useBackend)(t),c=n.act,l=n.data,u=l.destinations||[],d=l.currentlocation||[],s=l.endlocation||[],p=l.shuttlename,m=l.moving,f=l.locked,h="the "+p+" is currently at "+d.name;return m&&s&&(h+=" moving to "+s.name),(0,o.createComponentVNode)(2,i.Window,{height:"520",width:"300",title:p,children:[(0,o.createComponentVNode)(2,a.BlockQuote,{style:{margin:"5px"},children:h}),(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,height:"100%",children:u.map((function(e){return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Table,{direction:"row",align:"center",children:(0,o.createComponentVNode)(2,a.Table.Row,{children:(0,o.createComponentVNode)(2,a.Table.Cell,{children:(0,o.createComponentVNode)(2,a.Button,{content:e.name,disabled:f||m||d.type===e.type,onClick:function(){return c("callto",{dest:e.type})}})})})},e.type),(0,o.createComponentVNode)(2,a.Divider)],8)}))})]})}},73128:function(e,t,n){"use strict";t.__esModule=!0,t.TrscArray=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(26949),c=n(1033);t.TrscArray=function(e,t){var n=(0,a.useBackend)(t),l=n.act,u=n.data,d=u.apcCellStat,s=u.apcCellDiff,p=u.arrayCellStat,m=u.arrayCellDiff,f=u.sendsSafe,h=u.sendsMax,C=u.failsafeThreshold,g=u.failsafeStat,N=u.arrayImage,v=u.arrayHealth,b=u.drawRateTarget,V=u.surplusThreshold;return(0,o.createComponentVNode)(2,r.Window,{width:400,height:525,title:"Transception Systems",children:(0,o.createComponentVNode)(2,r.Window.Content,{children:[(0,o.createComponentVNode)(2,i.Section,{title:"Array Status",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Box,{children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Flex,{height:21,direction:"column",justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Area Cell Power:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h3",null,d,0),(0,o.createComponentVNode)(2,i.ProgressBar,{value:s,color:"#f9ae00"})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Internal Capacitor:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h3",null,p,0),(0,o.createComponentVNode)(2,i.ProgressBar,{value:m,color:"#76B9D3"})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Transceptions Remaining"),(0,o.createVNode)(1,"br"),(0,o.createTextVNode)("(Standard / Maximum)"),(0,o.createVNode)(1,"br")],4),(0,o.createVNode)(1,"h2",null,[f,(0,o.createTextVNode)(" | "),h],0)]})]})}),(0,o.createComponentVNode)(2,i.Flex.Item,{backgroundColor:"#A37933",children:(0,o.createComponentVNode)(2,i.Box,{mb:1,mx:.5,height:19,backgroundColor:"#101020",children:(0,o.createComponentVNode)(2,i.Flex,{mx:2,my:2,height:18,direction:"column",justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createComponentVNode)(2,i.Image,{pixelated:!0,width:"96px",height:"96px",src:"data:image/png;base64,"+N,backgroundColor:"transparent"}),(0,o.createVNode)(1,"br")]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,"Array Condition:",16),(0,o.createVNode)(1,"br"),(0,o.createVNode)(1,"h2",null,v,0)]})]})})})]})})}),(0,o.createComponentVNode)(2,i.Divider),(0,o.createComponentVNode)(2,i.Section,{title:"Transception Systems",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Transception Capability:"),(0,o.createVNode)(1,"br"),g],0)}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Power Loss Failsafe:"),(0,o.createVNode)(1,"br"),C,(0,o.createTextVNode)(" | ")],0),(0,o.createComponentVNode)(2,i.Button,{content:"Toggle",onClick:function(){return l("toggle_failsafe")}})]})]})}),(0,o.createComponentVNode)(2,i.Section,{title:"Internal Capacitor Control",textAlign:"center",children:(0,o.createComponentVNode)(2,i.Flex,{justify:"space-around",children:[(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Target Charge Rate:"),(0,o.createVNode)(1,"br")],4),(0,o.createComponentVNode)(2,i.Slider,{value:b,minValue:0,maxValue:5e4,step:1e3,stepPixelSize:4,format:function(e){return(0,c.formatPower)(e)},onDrag:function(e,t){return l("set_draw_rate",{drawRateTarget:t})}})]}),(0,o.createComponentVNode)(2,i.Flex.Item,{children:[(0,o.createVNode)(1,"strong",null,[(0,o.createTextVNode)("Required Surplus:"),(0,o.createVNode)(1,"br")],4),(0,o.createComponentVNode)(2,i.Slider,{value:V,minValue:1e4,maxValue:2e5,step:5e3,stepPixelSize:4,format:function(e){return(0,c.formatPower)(e)},onDrag:function(e,t){return l("set_surplus",{surplusThreshold:t})}})]})]})})]})})}},73248:function(e,t,n){"use strict";t.__esModule=!0,t.TurbineControl=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(1033),c=n(2381);t.TurbineControl=function(e,t){var n=(0,r.useBackend)(t),l=n.act,u=n.data,d=u.rpm,s=u.load,p=u.power,m=u.volume,f=u.history,h=u.overspeed,C=u.overtemp,g=u.undertemp,N=f.map((function(e){return e[0]})),v=N.map((function(e,t){return[t,e]})),b=f.map((function(e){return e[1]})),V=b.map((function(e,t){return[t,e]})),y=f.map((function(e){return e[2]})),x=y.map((function(e,t){return[t,e]})),k=Math.max.apply(Math,y),S=Math.max.apply(Math,N),I=Math.max.apply(Math,b);return(0,o.createComponentVNode)(2,c.Window,{width:375,height:400,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Output",children:(0,i.formatPower)(p)})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:x,rangeX:[0,x.length-1],rangeY:[0,k],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Speed",children:[d," RPM"]}),h?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"OVERSPEED"}):"",C?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"OVER TEMPERATURE"}):"",g?(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"ALERT",color:"#FF0000",children:"UNDER TEMPERATURE"}):""]}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:v,rangeX:[0,v.length-1],rangeY:[0,S],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Turbine Load",children:[s," Joules/Revolution"]})}),(0,o.createComponentVNode)(2,a.Chart.Line,{mt:"5px",height:"5em",data:V,rangeX:[0,V.length-1],rangeY:[0,I],strokeColor:"rgba(1, 184, 170, 1)",fillColor:"rgba(1, 184, 170, 0.25)"})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Stator Load:",(0,o.createComponentVNode)(2,a.NumberInput,{minValue:1,value:s,format:function(e){return e+" Joules/Revolution"},onChange:function(e,t){return l("loadChange",{newVal:t})}})]}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:["Coolant Volume:",(0,o.createComponentVNode)(2,a.NumberInput,{minValue:1,value:m,format:function(e){return e+" L"},onChange:function(e,t){return l("volChange",{newVal:t})}})]})]})})})}},40620:function(e,t,n){"use strict";t.__esModule=!0,t.TurretControl=void 0;var o=n(96323),r=n(2381),a=n(31246),i=n(26949),c=n(96794),l=n(18331),u=function(e){for(var t=[],n=0;n<e;n++)Math.random()>.3?t.push("Kill. "):t.push("KILL. ");return t.map((function(e,t){return(0,o.createComponentVNode)(2,i.Box,{inline:!0,preserveWhitespace:!0,fontSize:(0,c.randInt)(11,25)+"px",children:e},t)}))};t.TurretControl=function(e,t){var n=(0,a.useBackend)(t),c=n.act,d=n.data,s=d.enabled,p=d.lethal,m=d.emagged,f=d.area,h=d.locked,C=function(e){c("setLethal",{lethal:e})},g=function(e){c("setEnabled",{enabled:e})};return(0,o.createComponentVNode)(2,r.Window,{title:m?"FATAL ERROR":"Turret control ("+f+")",theme:m?"syndicate":"ntos",width:400,height:160,children:(0,o.createComponentVNode)(2,r.Window.Content,{align:"center",children:(0,o.createComponentVNode)(2,i.Box,{py:"6px",children:[!m&&!h&&(0,o.createComponentVNode)(2,i.Box,{fontSize:"16px",children:[(0,o.createComponentVNode)(2,i.Section,{width:"70%",children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"exclamation-triangle",fluid:!0,selected:s,onClick:function(){return g(!0)},children:"Enabled"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"power-off",fluid:!0,selected:!s,onClick:function(){return g(!1)},children:"Disabled"})})]})}),(0,o.createComponentVNode)(2,i.Section,{width:"70%",children:(0,o.createComponentVNode)(2,i.Stack,{children:[(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"bolt",fluid:!0,selected:!p,onClick:function(){return C(!1)},children:"Stun"})}),(0,o.createComponentVNode)(2,i.Stack.Item,{width:"50%",children:(0,o.createComponentVNode)(2,i.Button,{icon:"skull-crossbones",fluid:!0,selected:p,onClick:function(){return C(!0)},children:"Lethal"})})]})})]}),!m&&!!h&&(0,o.createComponentVNode)(2,i.Section,{children:"Panel locked, swipe ID card to unlock."}),!!m&&(0,o.createComponentVNode)(2,i.Box,{py:"20px",children:[(0,o.createComponentVNode)(2,i.Box,{align:"center",fontFamily:"Courier New",children:(0,l.glitch)("ERROR: UNABLE TO READ AUTHORIZATION",12)}),(0,o.createComponentVNode)(2,i.Box,{align:"center",style:{"font-size":"20px"},children:u(7)})]})]})})})}},97170:function(e,t,n){"use strict";t.__esModule=!0,t.Vendors=void 0;var o=n(96323),r=n(31246),a=n(2381),i=n(26949),c=n(26949),l=n(72638);t.Vendors=function(e,t){var n=(0,r.useBackend)(t),u=n.act,d=n.data,s=d.wiresList||[],p=d.productList||[],m=d.lightColors||[],f=d.windowName,h=d.wiresOpen,C=d.cash,g=d.bankMoney,N=d.requiresMoney,v=d.cardname,b=d.playerBuilt,V=d.name,y=d.owner,x=d.unlocked,k=d.loading,S=d.busy,I=d.busyphrase,w=d.currentlyVending,_=function(e){return(e.cost<=C||e.cost<=g||!N)&&e.amount>0},D=function(e){return e.cost&&N?e.cost+"\u2abd":"Vend"};return(0,o.createComponentVNode)(2,a.Window,{title:f,width:"500",height:"600",fontFamily:"Consolas","font-size":"10pt",children:(0,o.createComponentVNode)(2,a.Window.Content,{children:(0,o.createComponentVNode)(2,c.Stack,{vertical:!0,fill:!0,minHeight:"1%",maxHeight:"100%",children:[h&&(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,c.Collapsible,{mb:"1%",title:"Wire Panel",children:[h&&s.map((function(e){return(0,o.createComponentVNode)(2,c.Flex,{textColor:e.color,children:[(0,o.createComponentVNode)(2,c.Flex.Item,{grow:!0,bold:!0,children:e.name}),(0,o.createComponentVNode)(2,c.Flex.Item,{mr:"5%",children:(0,o.createComponentVNode)(2,i.Button,{ml:"10%",my:"1%",content:"Pulse",onClick:function(){return u("pulsewire",{wire:e.name})}})}),(0,o.createComponentVNode)(2,c.Flex.Item,{children:(0,o.createComponentVNode)(2,i.Button,{m:"1%",content:e.uncut?"Cut":"Mend",onClick:function(){return u(e.uncut?"cutwire":"mendwire",{wire:e.name})}})})]},e.name)})),(0,o.createComponentVNode)(2,c.Divider),b&&(0,o.createFragment)([(0,o.createComponentVNode)(2,i.Button,{content:"Owner: "+y+" ("+(x?"Unlocked":"Locked")+")",onClick:function(){return u("togglelock")}}),(0,o.createComponentVNode)(2,i.Button,{content:"Loading Chute",disabled:!x,color:k?"green":"red",onClick:function(){return u("togglechute")}}),(0,o.createComponentVNode)(2,i.Button.Input,{content:V,defaultValue:V,onCommit:function(e,t){return u("rename",{name:t})}})],4),(0,o.createComponentVNode)(2,c.Flex,{justify:"space-between",align:"stretch",children:[(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:(0,o.createComponentVNode)(2,c.LabeledList,{children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"AI Control",children:m.ai_control?"Enabled":"Disabled"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Electrification",children:m.electrified?"Yes":"No"})]})}),(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:[(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Inventory",children:m.extendedinventory?"Expanded":"Standard"}),(0,o.createComponentVNode)(2,c.LabeledList.Item,{label:"Safety Light",children:m.shootinventory?"On":"Off"})]})]})]})}),(0,o.createComponentVNode)(2,c.Stack.Item,{grow:!0,minHeight:"1%",maxHeight:"100%",children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,height:"100%",children:[!S&&p.map((function(e){return(0,o.createComponentVNode)(2,c.Flex,{justify:"space-between",align:"stretch",style:{"border-bottom":"1px #555 solid"},children:[(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",children:e.img&&(0,o.createComponentVNode)(2,i.Box,{style:{overflow:"show",height:"24px"},children:(0,o.createVNode)(1,"img",null,null,1,{src:"data:image/png;base64,"+e.img,style:{transform:"translate(0, -4px)"}})})}),(0,o.createComponentVNode)(2,c.Flex.Item,{direction:"row",grow:!0,style:{display:"flex","justify-content":"center","flex-direction":"column"},children:(0,o.createComponentVNode)(2,i.Box,{children:[(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,children:[!e.infinite&&e.amount+" x","\xa0"]}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:[e.name,b&&h&&(0,o.createComponentVNode)(2,i.Button,{inline:!0,color:"green",icon:"images",style:{"margin-left":"5px"},onClick:function(){return u("setIcon",{target:e.ref})}})]})]})}),(0,o.createComponentVNode)(2,c.Flex.Item,{bold:!0,direction:"row",style:{"margin-left":"5px",display:"flex","justify-content":"center","flex-direction":"column"},children:b&&x?(0,o.createComponentVNode)(2,i.Button.Input,{color:_(e)?"green":"grey",content:D(e),style:{width:"50px","text-align":"center"},onCommit:function(t,n){return u("setPrice",{target:e.ref,cost:n})}}):(0,o.createComponentVNode)(2,i.Button,{color:_(e)?"green":"grey",content:D(e),disabled:!_(e),style:{width:"50px","text-align":"center",padding:"0px"},onClick:function(){return u("vend",{target:e.ref,cost:e.cost,amount:e.amount})}})})]},e.name)})),!!S&&(0,o.createComponentVNode)(2,c.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,c.Stack.Item,{align:"center",children:(0,o.createComponentVNode)(2,i.Image,{height:"128px",width:"128px",pixelated:!0,src:"data:image/png;base64,"+p.find((function(e){return e.name===w})).img})}),(0,o.createComponentVNode)(2,c.Stack.Item,{align:"center",children:I})]})]})}),N>0&&(0,o.createComponentVNode)(2,c.Stack.Item,{children:(0,o.createComponentVNode)(2,l.VendorCashTable,{cardname:v,onCardClick:function(){return u("logout")},bankMoney:g,cash:C,onCashClick:function(){return u("returncash")}})})]})})})}},96880:function(e,t,n){"use strict";t.__esModule=!0,t.WeaponVendor=void 0;var o=n(96323),r=n(21118),a=n(31246),i=n(26949),c=n(2381),l=n(18331);t.WeaponVendor=function(e,t){var n=(0,a.useBackend)(t).data,r=(0,a.useLocalState)(t,"filter-available",!1),d=r[0],s=r[1];return(0,o.createComponentVNode)(2,c.Window,{width:550,height:700,children:(0,o.createComponentVNode)(2,c.Window.Content,{children:(0,o.createComponentVNode)(2,i.Stack,{className:"WeaponVendor",vertical:!0,fill:!0,children:[(0,o.createComponentVNode)(2,i.Stack.Item,{children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,children:(0,o.createComponentVNode)(2,i.LabeledList,{children:(0,o.createComponentVNode)(2,i.LabeledList.Item,{label:"Balance",children:Object.entries(n.credits).map((function(e,t){var r=e[0],a=e[1];return(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:"5px",className:"WeaponVendor__Credits--"+r,children:[a," ",r," ",(0,l.pluralize)("credit",a),t+1!==Object.keys(n.credits).length?", ":""]},r)}))})})})}),(0,o.createComponentVNode)(2,i.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,i.Section,{fill:!0,scrollable:!0,title:"Materiel",buttons:(0,o.createComponentVNode)(2,i.Button.Checkbox,{checked:d,onClick:function(){return s(!d)},children:"Filter Available"}),children:Object.keys(n.credits).map((function(e){return(0,o.createComponentVNode)(2,u,{category:e,filterAvailable:d},e)}))})})]})})})};var u=function(e,t){var n=e.category,c=e.filterAvailable,l=(0,a.useBackend)(t).data,u=l.stock.filter((function(e){return e.category===n}));return c&&(u=u.filter((function(e){return e.cost<=l.credits[e.category]}))),0===u.length?null:(0,o.createComponentVNode)(2,i.Collapsible,{className:"WeaponVendor__Category--"+n,title:(0,r.toTitleCase)(n),open:!0,color:n,children:(0,o.createComponentVNode)(2,i.Table,{children:l.stock.filter((function(e){return e.category===n})).map((function(e){return(0,o.createComponentVNode)(2,d,{stock:e},e.name)}))})})},d=function(e,t){var n=e.stock,r=(0,a.useBackend)(t),c=r.data,u=r.act;return(0,o.createComponentVNode)(2,i.Table.Row,{className:"WeaponVendor__Row",opacity:n.cost>c.credits[n.category]?.5:1,children:[(0,o.createComponentVNode)(2,i.Table.Cell,{className:"WeaponVendor__Cell",py:"5px",children:[(0,o.createComponentVNode)(2,i.Box,{mb:"5px",bold:!0,children:n.name}),(0,o.createComponentVNode)(2,i.Box,{children:n.description})]}),(0,o.createComponentVNode)(2,i.Table.Cell,{className:"WeaponVendor__Cell",py:"5px",textAlign:"right",children:(0,o.createComponentVNode)(2,i.Button,{disabled:n.cost>c.credits[n.category],color:n.category,onClick:function(){return u("redeem",{ref:n.ref})},children:["Redeem ",n.cost," ",(0,l.pluralize)("credit",n.cost)]})})]})}},10661:function(){},14024:function(e,t,n){"use strict";t.__esModule=!0,t.Wizard_Spellbook=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381);t.Wizard_Spellbook=function(e,t){var n=(0,r.useBackend)(t).data,l=(0,r.useLocalState)(t,"searchQuery",""),u=l[0],d=l[1],s=n.spellbook_contents,p=n.spell_slots,m=n.owner_name,f=[];for(var h in s)f.push(h);return(0,o.createComponentVNode)(2,i.Window,{title:"Wizard Spellbook",fontSize:2,height:600,width:500,children:[(0,o.createComponentVNode)(2,i.Window.Content,{children:(0,o.createComponentVNode)(2,a.Section,{title:m+"'s Spellbook ",children:(0,o.createComponentVNode)(2,a.Flex,{justify:"space-between",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{children:"Spell slots remaining: "+p}),(0,o.createComponentVNode)(2,a.Flex.Item,{children:(0,o.createComponentVNode)(2,a.Input,{value:u,placeholder:"Search by spell name",width:15,autoSelect:!0,onInput:function(e,t){return d(t)}})})]})})}),(0,o.createComponentVNode)(2,i.Window.Content,{mt:12,scrollable:!0,children:(0,o.createComponentVNode)(2,a.Section,{children:f.map((function(e){return(0,o.createComponentVNode)(2,c,{category:e,searchQuery:u},e)}))})})]})};var c=function(e,t){var n=(0,r.useBackend)(t).data.spellbook_contents,i=e.category,c=e.searchQuery,l=[];for(var d in n[i])l.push(d);return(0,o.createComponentVNode)(2,a.Collapsible,{title:i,children:(0,o.createComponentVNode)(2,a.Stack,{vertical:!0,children:[(0,o.createComponentVNode)(2,a.Divider),l.filter((function(e){return e.toLowerCase().includes(c.toLowerCase())})).map((function(e){return(0,o.createComponentVNode)(2,u,{spell:e,category:i},e)}))]})})},l=function(e,t,n){return e?"Spell purchased":t>n?"Not enough spell slots":1===t?"Purchase for "+t+" spell slot":"Purchase for "+t+" spell slots"},u=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,u=i.spellbook_contents,d=i.spell_slots,s=i.vr,p=e.spell,m=e.category,f=(0,r.useSharedState)(t,p+"p",!1),h=f[0],C=f[1],g=[];for(var N in u[m][p])g.push(u[m][p][N]);return(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Section,{children:[1===s&&0===g[3]&&(0,o.createComponentVNode)(2,a.Dimmer,{children:(0,o.createComponentVNode)(2,a.Box,{fontSize:1.5,backgroundColor:"#384e68",p:2,children:"Spell unavailable in VR"})}),(0,o.createComponentVNode)(2,a.Section,{title:p,buttons:(0,o.createComponentVNode)(2,a.Flex,{children:(0,o.createComponentVNode)(2,a.Button,{backgroundColor:"green",disabled:d<g[1]||h,onClick:function(){C(!0),c("buyspell",{spell:p})},children:l(h,g[1],d)})}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[null!==g[2]&&(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Cooldown",children:g[2]/10+" seconds"}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Description",children:g[0]})]})}),(0,o.createComponentVNode)(2,a.Divider)]})})}},57361:function(e,t,n){"use strict";t.__esModule=!0,t.BeakerContents=void 0;var o=n(96323),r=n(26949);t.BeakerContents=function(e){var t=e.beakerLoaded,n=e.beakerContents;return(0,o.createComponentVNode)(2,r.Box,{children:[!t&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"No beaker loaded."})||0===n.length&&(0,o.createComponentVNode)(2,r.Box,{color:"label",children:"Beaker is empty."}),n.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{color:"label",children:[e.volume," units of ",e.name]},e.name)}))]})}},48916:function(e,t,n){"use strict";t.__esModule=!0,t.DataInputOptions=void 0;var o=n(96323),r=n(31246),a=n(26949);t.DataInputOptions=function(e){var t=e.options;return t&&Object.keys(t).length?Object.keys(t).map((function(e,n){return(0,o.createComponentVNode)(2,i,{type:t[e].type,name:e,description:t[e].description,value:t[e].value,tooltip:t[e].description,list:t[e].list,a:t[e].a,b:t[e].b},e)})):""};var i=function(e,t){var n=e.name,i=e.description,m=e.type,f=(0,r.useBackend)(t).act,h={Number:(0,o.normalizeProps)((0,o.createComponentVNode)(2,d,Object.assign({},e))),Color:(0,o.normalizeProps)((0,o.createComponentVNode)(2,u,Object.assign({},e))),Text:(0,o.normalizeProps)((0,o.createComponentVNode)(2,p,Object.assign({},e))),Ref:(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),"Mob Reference":(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),"Reference Picker":(0,o.normalizeProps)((0,o.createComponentVNode)(2,l,Object.assign({},e))),Boolean:(0,o.normalizeProps)((0,o.createComponentVNode)(2,s,Object.assign({},e))),"Children of Type":(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e))),"List Var":(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e))),List:(0,o.normalizeProps)((0,o.createComponentVNode)(2,c,Object.assign({},e)))};return(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:i,children:h[m]||f("unsupported_type",{name:n,type:m})})},c=function(e,t){var n=e.value,i=(e.tooltip,e.name),c=e.type,l=e.list,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Section,{fill:!0,scrollable:!0,height:15,children:l.map((function(e,t){return(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:e===n,color:"transparent",onClick:function(){return u("modify_value",{name:i,value:e,type:c})},children:e},t)}))})},l=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Button,{icon:"location-crosshairs",onClick:function(){return u("modify_ref_value",{name:c,type:l})},children:n})})},u=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:[(0,o.createComponentVNode)(2,a.Button,{icon:"pencil-alt",onClick:function(){return u("modify_color_value",{name:c,type:l})}}),(0,o.createComponentVNode)(2,a.ColorBox,{color:n,mr:.5}),(0,o.createComponentVNode)(2,a.Input,{value:n,width:"90px",onInput:function(e,t){return u("modify_value",{name:c,value:t,type:l})}})]})},d=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=e.a,d=e.b,s=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.NumberInput,{value:n,minValue:0|u,maxValue:100|d,stepPixelSize:5,width:"39px",onDrag:function(e,t){return s("modify_value",{name:c,value:t,type:l})}})})},s=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Button.Checkbox,{checked:n,onClick:function(){return u("modify_value",{name:c,value:!n,type:l})}})})},p=function(e,t){var n=e.value,i=e.tooltip,c=e.name,l=e.type,u=(0,r.useBackend)(t).act;return(0,o.createComponentVNode)(2,a.Tooltip,{position:"bottom",content:i,children:(0,o.createComponentVNode)(2,a.Input,{value:n,width:"200px",onInput:function(e,t){return u("modify_value",{name:c,value:t,type:l})}})})}},65751:function(e,t,n){"use strict";t.__esModule=!0,t.damageNum=t.HealthStat=void 0;var o=n(96323),r=n(1060),a=n(84200),i=n(54425),c=["type","children","className"];t.HealthStat=function(e){var t=e.type,n=e.children,l=e.className,u=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,c);return u.color=a.COLORS.damageType[t]&a.COLORS.damageType[t],(0,o.normalizeProps)((0,o.createComponentVNode)(2,i.Box,Object.assign({},u,{className:(0,r.classes)(["HealthStat",l,(0,i.computeBoxClassName)(u)]),color:a.COLORS.damageType[t],children:n})))};t.damageNum=function(e){return!e||e<=0?"0":e.toFixed(1)}},8095:function(e,t,n){"use strict";t.__esModule=!0,t.IDCard=void 0;var o=n(96323),r=n(26949);t.IDCard=function(e,t){if(e.card){var n=e.card,a=e.onEject;return(0,o.createComponentVNode)(2,r.Button,{icon:"eject",content:n.name+" ("+n.role+")",tooltip:"Clear scanned card",tooltipPosition:"bottom-end",onClick:a})}}},34277:function(e,t,n){"use strict";t.__esModule=!0,t.InputButtons=void 0;var o=n(96323),r=n(31246),a=n(26949);t.InputButtons=function(e,t){var n=(0,r.useBackend)(t).act,i=e.input,c=e.inputIsValid,l=(0,o.createComponentVNode)(2,a.Button,{color:"good",disabled:c&&!c.isValid,fluid:!1,onClick:function(){return n("submit",{entry:i})},pt:0,textAlign:"center",tooltip:(null==c?void 0:c.error)||null,width:6,children:"Submit"}),u=(0,o.createComponentVNode)(2,a.Button,{color:"bad",fluid:!1,onClick:function(){return n("cancel")},pt:0,textAlign:"center",width:6,children:"Cancel"}),d=l;return(0,o.createComponentVNode)(2,a.Stack,{children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:u}),(0,o.createComponentVNode)(2,a.Stack.Item,{grow:!0,children:c&&!c.isValid&&c.error&&(0,o.createComponentVNode)(2,a.Box,{color:"average",nowrap:!0,textAlign:"center",children:c.error})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:d})]})}},9720:function(e,t,n){"use strict";t.__esModule=!0,t.KeyHealthIndicators=void 0;var o=n(96323),r=n(26949),a=n(18331);t.KeyHealthIndicators=function(e){var t=e.mobData,n=t.occupied,a=t.patient_status,l=t.blood_pressure_rendered,u=t.blood_pressure_status,m=t.blood_volume,f=t.body_temp,h=t.optimal_temp,C=t.embedded_objects,g=t.rad_stage,N=t.rad_dose,v=t.brain_damage;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table,{children:[(0,o.createComponentVNode)(2,i,{occupied:n,patient_status:a,blood_pressure_rendered:l,blood_pressure_status:u,blood_volume:m}),(0,o.createComponentVNode)(2,c,{occupied:n,body_temp:f,optimal_temp:h,embedded_objects:C}),!!n&&(0,o.createComponentVNode)(2,d,{rad_stage:g,rad_dose:N}),(0,o.createComponentVNode)(2,s,{occupied:n,status:v})]}),!!n&&(0,o.createComponentVNode)(2,p,{embedded_objects:C})],0)};var i=function(e){var t=e.occupied,n=e.patient_status,a=e.blood_pressure_rendered,i=e.blood_pressure_status,c=e.blood_volume,l="grey";return t&&(l=c<=299?"red":c<=414?"yellow":c<=584?"green":c<=665?"yellow":"red"),(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"Blood Pressure:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:l,nowrap:!0,children:[!!t&&2!==n&&a+" ("+i+")",!t&&"--/--"]}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"number"==typeof c&&(0,o.createFragment)([(0,o.createTextVNode)("Blood Volume:")],4)}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:l,children:"number"==typeof c&&(0,o.createFragment)([t?c.toString():"--",(0,o.createTextVNode)(" units")],0)})]})},c=function(e){var t=e.occupied,n=e.body_temp,a=e.optimal_temp,i=e.embedded_objects;return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,l,{occupied:t,body_temp:n,optimal_temp:a}),(0,o.createComponentVNode)(2,u,{occupied:t,embedded_objects:i})]})},l=function(e){var t=e.occupied,n=e.body_temp,a=e.optimal_temp,i="grey";return t&&(i=n>=a+60?"red":n>=a+30?"yellow":n<=a-60?"purple":n<=a-30?"blue":"green"),(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",children:"Temperature:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{color:i,nowrap:!0,children:[!!t&&(n-273.15).toPrecision(4)+"\xb0C / "+(1.8*(n-273.15)+32).toPrecision(4)+"\xb0F",!t&&"--\xb0C / --\xb0F"]})],4)},u=function(e){var t=e.embedded_objects,n=e.occupied;return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",children:"Implants:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{color:n?"white":"grey",children:[!!n&&t.implant_count+" "+(0,a.pluralize)("implant",t.implant_count),!n&&"--"]})],4)},d=function(e){var t=e.rad_stage,n=e.rad_dose,a=null,i=!1;if(t>0){switch(t){case 1:a="yellow";break;case 2:a="orange";break;case 3:a="orange",i=!0;break;case 4:case 5:case 6:a="red",i=!0}return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",color:"yellow",width:10,children:"Radiation:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:a,bold:i,children:["Stage ",t]}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,children:"Effective Dose:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,nowrap:!0,children:[n.toPrecision(6)," Sv"]})]})}},s=function(e){var t=e.occupied,n=e.status;if(t&&"Okay"!==n.desc&&"Missing"!==n.desc)return(0,o.createComponentVNode)(2,r.Table.Row,{children:[(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",color:"pink",width:10,children:"Brain Damage:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{width:10,color:n.color,children:n.desc}),(0,o.createComponentVNode)(2,r.Table.Cell,{header:!0,textAlign:"right",width:10,nowrap:!0,children:"Neuron Cohesion:"}),(0,o.createComponentVNode)(2,r.Table.Cell,{children:[((120-n.value)/120*100).toFixed(2),"%"]})]})},p=function(e){var t=e.embedded_objects;return(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:[!!t.has_chest_object&&(0,o.createComponentVNode)(2,r.Box,{bold:!0,fontSize:1.2,color:"red",children:"Sizable foreign object located below sternum!"}),!!t.foreign_object_count&&(0,o.createComponentVNode)(2,r.Box,{bold:!0,fontSize:1.2,color:"red",children:["Foreign ",""+(0,a.pluralize)("object",t.foreign_object_count)," detected!"]})]})}},68397:function(){},36814:function(e,t,n){"use strict";t.__esModule=!0,t.ListSearch=void 0;var o=n(96323),r=n(1060),a=n(26949);t.ListSearch=function(e){var t=e.autoFocus,n=e.className,i=e.currentSearch,c=e.noResultsPlaceholder,l=e.onSearch,u=e.onSelect,d=e.options,s=e.searchPlaceholder,p=void 0===s?"Search...":s,m=e.selectedOption,f=void 0===m?null:m,h=(0,r.classes)(["list-search-interface",n]);return(0,o.createComponentVNode)(2,a.Stack,{className:h,vertical:!0,children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Input,{autoFocus:t,fluid:!0,onInput:function(e,t){l(t)},placeholder:p,value:i})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:[0===d.length&&(0,o.createComponentVNode)(2,a.Placeholder,{mx:1,py:.5,children:c}),d.map((function(e){return(0,o.createVNode)(1,"div",(0,r.classes)(["list-search-interface__search-option","Button","Button--fluid","Button--color--transparent","Button--ellipsis",f&&e===f&&"Button--selected"]),e,0,{onClick:function(){return u(e)},title:e},e)}))]})]})}},55631:function(e,t,n){"use strict";t.__esModule=!0,t.Loader=void 0;var o=n(96323),r=n(26949),a=n(97622);t.Loader=function(e){var t=e.value;return(0,o.createVNode)(1,"div","AlertModal__Loader",(0,o.createComponentVNode)(2,r.Box,{className:"AlertModal__LoaderProgress",style:{width:100*(0,a.clamp01)(t)+"%"}}),2)}},90881:function(e,t){"use strict";var n;t.__esModule=!0,t.MobStatuses=t.MobStatus=void 0;var o={Conscious:0,Unconscious:1,Dead:2};t.MobStatus=o;var r=((n={})[o.Conscious]={name:"Conscious",color:"good",icon:"check"},n[o.Unconscious]={name:"Unconscious",color:"average",icon:"bed"},n[o.Dead]={name:"Dead",color:"bad",icon:"skull"},n);t.MobStatuses=r},41161:function(e,t,n){"use strict";t.__esModule=!0,t.PortableHoldingTank=t.PortableBasicInfo=void 0;var o=n(96323),r=n(26949),a=n(1033);t.PortableBasicInfo=function(e){var t=e.connected,n=e.pressure,i=e.maxPressure,c=e.children;return(0,o.createComponentVNode)(2,r.Section,{title:"Status",children:[(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,r.RoundGauge,{size:1.75,value:n,minValue:0,maxValue:i,alertAfter:.7*i,ranges:{good:[0,.7*i],average:[.7*i,.85*i],bad:[.85*i,i]},format:a.formatPressure})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Port",color:t?"good":"average",children:t?"Connected":"Not Connected"})]}),c]})};t.PortableHoldingTank=function(e){var t=e.holding,n=e.onEjectTank,i=e.title;return(0,o.createComponentVNode)(2,r.Section,{title:i||"Holding Tank",minHeight:"115px",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"eject",content:"Eject",disabled:!t,onClick:function(){return n()}}),children:t?(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Pressure",children:(0,o.createComponentVNode)(2,r.RoundGauge,{size:1.75,value:t.pressure,minValue:0,maxValue:t.maxPressure,alertAfter:.7*t.maxPressure,ranges:{good:[0,.7*t.maxPressure],average:[.7*t.maxPressure,.85*t.maxPressure],bad:[.85*t.maxPressure,t.maxPressure]},format:a.formatPressure})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Label",children:t.name})]}):(0,o.createComponentVNode)(2,r.Box,{color:"average",children:["No ",i?i.toLowerCase():"holding tank"]})})}},51418:function(e,t,n){"use strict";t.__esModule=!0,t.ReagentBar=t.ReagentList=t.ReagentGraph=t.NoContainer=t.MatterStateIconMap=t.MatterState=void 0;var o,r,a=n(96323),i=n(26949),c=n(48175),l=["className","height","sort"],u=["className","renderButtons","sort","showState","height"],d=["className","container"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}t.MatterState=r,function(e){e[e.Solid=1]="Solid",e[e.Liquid=2]="Liquid",e[e.Gas=3]="Gas"}(r||(t.MatterState=r={}));var p=((o={})[r.Solid]={icon:"square",pr:.5},o[r.Liquid]={icon:"tint",pr:.9},o[r.Gas]={icon:"wind",pr:.5},o);t.MatterStateIconMap=p;var m={name:"No Beaker Inserted",contents:[],id:"inserted",maxVolume:100,totalVolume:0,finalColor:"#000000",temperature:c.freezeTemperature,fake:!0};t.NoContainer=m;var f=function(e){e.className;var t,n=e.height,o=e.sort,r=s(e,l),c=null!=(t=e.container)?t:m,u=c.maxVolume,d=c.totalVolume,p=c.finalColor,f=o?c.contents.slice().sort(o):c.contents||[];return r.height=n||"50px",(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.Box,Object.assign({},r,{children:(0,a.createComponentVNode)(2,i.Flex,{height:"100%",direction:"column",children:[(0,a.createComponentVNode)(2,i.Flex.Item,{grow:!0,children:(0,a.createComponentVNode)(2,i.Flex,{height:"100%",children:[f.map((function(e){return(0,a.createComponentVNode)(2,i.Flex.Item,{grow:e.volume/u,children:(0,a.createComponentVNode)(2,i.Tooltip,{content:e.name+" ("+e.volume+"u)",position:"bottom",children:(0,a.createComponentVNode)(2,i.Box,{px:0,my:0,height:"100%",backgroundColor:"rgb("+e.colorR+", "+e.colorG+", "+e.colorB+")"})})},e.id)})),(0,a.createComponentVNode)(2,i.Flex.Item,{grow:(u-d)/u,children:(0,a.createComponentVNode)(2,i.Tooltip,{content:"Nothing"+(c.fake?"":" ("+(u-d)+"u)"),position:"bottom",children:(0,a.createComponentVNode)(2,i.NoticeBox,{px:0,my:0,height:"100%",backgroundColor:"rgba(0, 0, 0, 0)"})})})]})}),(0,a.createComponentVNode)(2,i.Flex.Item,{children:(0,a.createComponentVNode)(2,i.Tooltip,{content:(0,a.createComponentVNode)(2,i.Box,{children:[(0,a.createComponentVNode)(2,i.ColorBox,{color:p})," Current Mixture Color"]}),position:"bottom",children:(0,a.createComponentVNode)(2,i.Box,{height:"14px",backgroundColor:f.length?p:"rgba(0, 0, 0, 0.1)",textAlign:"center",children:c.fake||(0,a.createComponentVNode)(2,i.Box,{as:"span",backgroundColor:"rgba(0, 0, 0, 0.5)",px:1,children:d+"/"+u})})})})]})})))};t.ReagentGraph=f;var h=function(e){e.className;var t,n=e.renderButtons,o=e.sort,r=e.showState,c=e.height,l=s(e,u),d=null!=(t=e.container)?t:m,f=o?d.contents.slice().sort(o):d.contents||[];return l.height=c||6,(0,a.createComponentVNode)(2,i.Section,{scrollable:"auto"!==c,children:(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.Box,Object.assign({},l,{children:f.length?f.map((function(e){return(0,a.createComponentVNode)(2,i.Flex,{mb:.2,align:"center",children:[(0,a.createComponentVNode)(2,i.Flex.Item,{grow:!0,children:[(0,a.createComponentVNode)(2,i.Icon,{pr:r?p[e.state].pr:.9,name:r?p[e.state].icon:"circle",style:{"text-shadow":"0 0 3px #000;"},color:"rgb("+e.colorR+", "+e.colorG+", "+e.colorB+")"}),"( "+e.volume+"u ) "+e.name]}),n&&(0,a.createComponentVNode)(2,i.Flex.Item,{nowrap:!0,children:n(e)})]},e.id)})):(0,a.createComponentVNode)(2,i.Box,{color:"label",children:[(0,a.createComponentVNode)(2,i.Icon,{pr:.9,name:"circle-o",style:{"text-shadow":"0 0 3px #000;"}}),"Empty"]})})))})};t.ReagentList=h;var C=function(e,t){return e!==t&&(!e||!t||e.volume!==t.volume||e.name!==t.name||e.id!==t.id||e.colorR!==t.colorR||e.colorG!==t.colorG||e.colorB!==t.colorB)},g=function(e,t){var n,o;if(e===t)return!1;if(null===e||null===t)return!0;if(e.totalVolume!==t.totalVolume||e.finalColor!==t.finalColor||e.maxVolume!==t.maxVolume)return!0;if((null==(n=e.contents)?void 0:n.length)!==(null==(o=t.contents)?void 0:o.length))return!0;for(var r in e)if(C(e.contents[r],t.contents[r]))return!0;return!1};f.defaultHooks={onComponentShouldUpdate:function(e,t){var n;for(n in e)if("container"!==n&&!(n in t))return!0;for(n in t)if("container"!==n&&e[n]!==t[n])return!0;return g(e.container,t.container)}},h.defaultHooks={onComponentShouldUpdate:function(e,t){var n;for(n in e)if("container"!==n&&"renderButtons"!==n&&!(n in t))return!0;for(n in t)if("container"!==n&&"renderButtons"!==n)if("renderButtonsDeps"!==n||"object"!=typeof e.renderButtonsDeps||"object"!=typeof t.renderButtonsDeps){if(e[n]!==t[n])return!0}else{var o=e.renderButtonsDeps,r=t.renderButtonsDeps;if(o.length!==r.length)return!0;var a=void 0;for(a in o)if(o[a]!==r[a])return!0}return g(e.container,t.container)}};t.ReagentBar=function(e){e.className;var t=e.container,n=s(e,d),o=t.maxVolume,r=t.totalVolume,c=t.finalColor;return(0,a.createComponentVNode)(2,i.Stack,{align:"center",pb:1,children:[(0,a.createComponentVNode)(2,i.Stack.Item,{children:(0,a.createComponentVNode)(2,i.Box,{textAlign:"right",width:"3em",children:r+"u"})}),(0,a.createComponentVNode)(2,i.Stack.Item,{grow:!0,children:(0,a.normalizeProps)((0,a.createComponentVNode)(2,i.ProgressBar,Object.assign({value:r,minValue:0,maxValue:o,color:c},n)))}),(0,a.createComponentVNode)(2,i.Stack.Item,{children:(0,a.createComponentVNode)(2,i.Box,{textAlign:"left",width:"3em",children:o+"u"})})]})}},75015:function(e,t,n){"use strict";t.__esModule=!0,t.ReleaseValve=void 0;var o=n(96323),r=n(26949);t.ReleaseValve=function(e){var t=e.valveIsOpen,n=e.releasePressure,a=void 0===n?0:n,i=e.minRelease,c=void 0===i?0:i,l=e.maxRelease,u=void 0===l?0:l,d=e.onToggleValve,s=e.onSetPressure;return(0,o.createComponentVNode)(2,r.LabeledList,{children:[(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Release valve",children:(0,o.createComponentVNode)(2,r.Button,{content:t?"Open":"Closed",color:t?"average":"default",onClick:d})}),(0,o.createComponentVNode)(2,r.LabeledList.Item,{label:"Release pressure",children:[(0,o.createComponentVNode)(2,r.Button,{onClick:function(){return s(c)},content:"Min"}),(0,o.createComponentVNode)(2,r.NumberInput,{animated:!0,width:"7em",value:a,minValue:c,maxValue:u,onChange:function(e,t){return s(t)}}),(0,o.createComponentVNode)(2,r.Button,{onClick:function(){return s(u)},content:"Max"})]})]})}},72638:function(e,t,n){"use strict";t.__esModule=!0,t.VendorCashTable=void 0;var o=n(96323),r=n(26949);t.VendorCashTable=function(e){var t=e.cardname,n=e.onCardClick,a=e.bankMoney,i=e.cash,c=e.onCashClick;return(0,o.createComponentVNode)(2,r.Table,{"font-size":"9pt",direction:"row",style:{maxWidth:"100%","table-layout":"fixed"},children:[(0,o.createComponentVNode)(2,r.Table.Row,{children:(0,o.createComponentVNode)(2,r.Table.Cell,{bold:!0,children:[t&&(0,o.createComponentVNode)(2,r.Button,{icon:"id-card",mr:"100%",content:t||"",title:t||"",onClick:n,ellipsis:!0,maxWidth:"100%"}),t&&a>=0&&"Money on account: "+a+"\u2abd"]})}),(0,o.createComponentVNode)(2,r.Table.Row,{children:(0,o.createComponentVNode)(2,r.Table.Cell,{bold:!0,direction:"row",children:[i>0&&"Cash: "+i+"\u2abd",i>0&&i&&(0,o.createComponentVNode)(2,r.Button,{icon:"eject",ml:"1%",content:"eject",onClick:c})]})})]})}},818:function(e,t){"use strict";t.__esModule=!0,t.getStatsMax=t.processStatsData=void 0;t.processStatsData=function(e){if(0===(null!=e?e:[]).length)return null;for(var t=Object.keys(e[0]),n=t.reduce((function(e,t){return e[t]=[],e}),{}),o=0;o<e.length;o++)for(var r=e[o],a=0;a<t.length;a++){var i,c=t[a];n[c].push([o,null!=(i=r[c])?i:0])}return n};t.getStatsMax=function(e){var t=0;for(var n in e){var o=e[n][1];o>t&&(t=o)}return t}},96794:function(e,t){"use strict";t.__esModule=!0,t.randInt=void 0;t.randInt=function(e,t){return Math.floor(Math.random()*(t-e+1))+e}},18331:function(e,t,n){"use strict";t.__esModule=!0,t.glitch=t.spaceUnderscores=t.capitalize=t.pluralize=void 0;var o=n(96794);t.pluralize=function(e,t){return 1!==t?e+"s":e};t.capitalize=function(e){return e.replace(/(^\w{1})|(\s+\w{1})/g,(function(e){return e.toUpperCase()}))};t.spaceUnderscores=function(e){return e.replace(/[_]/g,(function(e){return" "}))};var r=["$","{","]","%","^","?",">","\xac","\u03c0",";","\u0438","\u046b","/","#","~"];t.glitch=function(e,t){for(var n=e.split(""),a=0;a<t;a++){n[(0,o.randInt)(0,n.length?n.length-1:0)]=r[(0,o.randInt)(0,r.length-1)]}return n.join("")}},48175:function(e,t,n){"use strict";t.__esModule=!0,t.getTemperatureChangeName=t.getTemperatureIcon=t.getTemperatureColor=t.neutralTemperature=t.freezeTemperature=t.TemperatureColors=void 0;var o=n(89295),r={cold:new o.Color(66,194,255),neutral:new o.Color(170,170,170),hot:new o.Color(255,120,0),veryhot:new o.Color(255,0,0)};t.TemperatureColors=r;t.freezeTemperature=273.15;var a=293.15;t.neutralTemperature=a;var i=493.15;t.getTemperatureColor=function(e,t){void 0===t&&(t=1e3);var n=r.cold,c=r.neutral,l=r.hot,u=r.veryhot;return e<i?o.Color.lookup((e-a)/400+.5,[n,c,l]).toString():o.Color.lookup((e-i)/(t-i),[l,u]).toString()};t.getTemperatureIcon=function(e){switch(Math.round(e/200)){case 0:return"thermometer-empty";case 1:return"thermometer-quarter";case 2:return"thermometer-half";case 3:return"thermometer-three-quarters";default:return"thermometer-full"}};t.getTemperatureChangeName=function(e,t){return e<t?"heating":e>t?"cooling":"neutral"}},38770:function(e,t,n){"use strict";t.__esModule=!0,t.space_heater=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(2381),c=n(48175),l=n(18331),u=function(e,t,n){return e?(0,l.glitch)(t,n):t},d=function(e,t){return void 0===t&&(t=""),e>400?"red":e<180?"blue":t},s=function(e,t,n){return e?t<180&&n?"snowflake":t>400&&n?"fire":"eject":"eject"};t.space_heater=function(e,t){var n=(0,r.useBackend)(t).data,a=n.emagged;n.on,n.set_temperature;return(0,o.createComponentVNode)(2,i.Window,{title:u(a,"Space HVAC",1),width:350,height:250,children:(0,o.createComponentVNode)(2,i.Window.Content,{children:[(0,o.createComponentVNode)(2,p),(0,o.createComponentVNode)(2,m)]})})};var p=function(e,t){var n=(0,r.useBackend)(t),i=n.data,c=n.act,l=i.emagged,p=i.on,m=i.cell,f=i.cell_name,h=i.cell_charge,C=i.set_temperature;return(0,o.createComponentVNode)(2,a.Section,{title:u(l,"Battery status",2),grow:0,children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:u(l,"Cell",1),verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.Button,{icon:s(l,C,p),color:null!==m?d(C,"green"):"blue",onClick:function(){return c(null!==m?"cellremove":"cellinstall")},bold:!0,children:null!==m?u(l,f,2):u(l,"Insert power cell",3)})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:u(l,"Cell Power",1),verticalAlign:"middle",children:(0,o.createComponentVNode)(2,a.ProgressBar,{grow:!0,color:null!==m?d(C,"green"):"red",ranges:{green:[.5,Infinity],yellow:[.1,.5],red:[-Infinity,.1]},value:Math.max(0,[null!==m?h/100:0])})})]})})},m=function(e,t){var n=(0,r.useBackend)(t),i=n.data,l=n.act,s=i.emagged,p=(i.on,i.min),m=i.max,f=i.set_temperature;return(0,o.createComponentVNode)(2,a.Section,{title:u(s,"Temperature regulator",3),children:[(0,o.createComponentVNode)(2,a.Stack,{justify:"center",align:"center",children:[(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"fast-backward",color:d(f),tooltip:"Set minimum",disabled:f===p,onClick:function(){return l("set_temp",{inputted_temperature:p})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"backward",color:d(f),tooltip:s?"Decrease by 50":"Decrease by 5",disabled:f===p,onClick:function(){return l("set_temp",{temperature_adjust:s?-50:-5})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"equals",color:d(f),tooltip:"Room temperature",onClick:function(){return l("set_temp",{inputted_temperature:c.neutralTemperature})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"forward",color:d(f),tooltip:s?"Increase by 50":"Increase by 5",disabled:f===m,onClick:function(){return l("set_temp",{temperature_adjust:s?50:5})}})}),(0,o.createComponentVNode)(2,a.Stack.Item,{children:(0,o.createComponentVNode)(2,a.Button,{icon:"fast-forward",color:d(f),tooltip:"Set maximum",disabled:f===m,onClick:function(){return l("set_temp",{inputted_temperature:m})}})})]}),(0,o.createComponentVNode)(2,a.Divider),(0,o.createComponentVNode)(2,a.Slider,{value:f,format:function(e){return e+" K"},minValue:p,maxValue:m,step:s?5:1,stepPixelSize:s?3:1.8,ranges:{blue:[-Infinity,c.neutralTemperature-1],red:[c.neutralTemperature,Infinity]},onDrag:function(e,t){return l("set_temp",{inputted_temperature:t})}})]})}},30041:function(e,t,n){"use strict";t.__esModule=!0,t.Layout=void 0;var o=n(96323),r=n(1060),a=n(54425),i=n(99397),c=["className","theme","mode","children"],l=["className","scrollable","children"];function u(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var d=function(e){var t=e.className,n=e.theme,i=void 0===n?"nanotrasen":n,l=e.mode,d=void 0===l?"dark":l,s=e.children,p=u(e,c);return(0,o.createVNode)(1,"div",(0,r.classes)(["theme-"+i,"mode-"+d]),(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout",t,(0,a.computeBoxClassName)(p)]),s,0,Object.assign({},(0,a.computeBoxProps)(p)))),2)};t.Layout=d;var s=function(e){var t=e.className,n=e.scrollable,i=e.children,c=u(e,l);return(0,o.normalizeProps)((0,o.createVNode)(1,"div",(0,r.classes)(["Layout__content",n&&"Layout__content--scrollable",t,(0,a.computeBoxClassName)(c)]),i,0,Object.assign({},(0,a.computeBoxProps)(c))))};s.defaultHooks={onComponentDidMount:function(e){return(0,i.addScrollableNode)(e)},onComponentWillUnmount:function(e){return(0,i.removeScrollableNode)(e)}},d.Content=s},76738:function(e,t,n){"use strict";t.__esModule=!0,t.NtosWindow=void 0;var o=n(96323),r=n(57723),a=n(31246),i=n(26949),c=n(34881),l=function(e,t){var n=e.title,l=e.width,u=void 0===l?575:l,d=e.height,s=void 0===d?700:d,p=e.theme,m=void 0===p?"ntos":p,f=e.children,h=(0,a.useBackend)(t),C=h.act,g=h.data,N=g.PC_device_theme,v=g.PC_batteryicon,b=g.PC_showbatteryicon,V=g.PC_batterypercent,y=g.PC_ntneticon,x=g.PC_apclinkicon,k=g.PC_stationtime,S=g.PC_programheaders,I=void 0===S?[]:S,w=g.PC_showexitprogram;return(0,o.createComponentVNode)(2,c.Window,{title:n,width:u,height:s,theme:m,children:(0,o.createVNode)(1,"div","NtosWindow",[(0,o.createVNode)(1,"div","NtosWindow__header NtosHeader",[(0,o.createVNode)(1,"div","NtosHeader__left",[(0,o.createComponentVNode)(2,i.Box,{inline:!0,bold:!0,mr:2,children:k}),(0,o.createComponentVNode)(2,i.Box,{inline:!0,italic:!0,mr:2,opacity:.33,children:["ntos"===N&&"NtOS","syndicate"===N&&"Syndix"]})],4),(0,o.createVNode)(1,"div","NtosHeader__right",[I.map((function(e){return(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(e.icon)})},e.icon)})),(0,o.createComponentVNode)(2,i.Box,{inline:!0,children:y&&(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(y)})}),!(!b||!v)&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:[(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(v)}),V&&V]}),x&&(0,o.createComponentVNode)(2,i.Box,{inline:!0,mr:1,children:(0,o.createVNode)(1,"img","NtosHeader__icon",null,1,{src:(0,r.resolveAsset)(x)})}),!!w&&(0,o.createComponentVNode)(2,i.Button,{width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-minimize-o",tooltip:"Minimize",tooltipPosition:"bottom",onClick:function(){return C("PC_minimize")}}),!!w&&(0,o.createComponentVNode)(2,i.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"window-close-o",tooltip:"Close",tooltipPosition:"bottom-start",onClick:function(){return C("PC_exit")}}),!w&&(0,o.createComponentVNode)(2,i.Button,{mr:"-3px",width:"26px",lineHeight:"22px",textAlign:"center",color:"transparent",icon:"power-off",tooltip:"Power off",tooltipPosition:"bottom-start",onClick:function(){return C("PC_shutdown")}})],0)],4),f],0)})};t.NtosWindow=l;l.Content=function(e){return(0,o.createVNode)(1,"div","NtosWindow__content",(0,o.normalizeProps)((0,o.createComponentVNode)(2,c.Window.Content,Object.assign({},e))),2)}},52243:function(e,t,n){"use strict";t.__esModule=!0,t.Pane=void 0;var o=n(96323),r=n(1060),a=n(31246),i=n(26949),c=n(27157),l=n(30041),u=["theme","children","className"],d=["className","fitted","children"];function s(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}var p=function(e,t){var n=e.theme,d=e.children,p=e.className,m=s(e,u),f=(0,a.useBackend)(t).suspended,h=(0,c.useDebug)(t).debugLayout;return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Layout,Object.assign({className:(0,r.classes)(["Window",p]),theme:n},m,{children:(0,o.createComponentVNode)(2,i.Box,{fillPositionedParent:!0,className:h&&"debug-layout",children:!f&&d})})))};t.Pane=p;p.Content=function(e){var t=e.className,n=e.fitted,a=e.children,i=s(e,d);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,l.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},i,{children:n&&a||(0,o.createVNode)(1,"div","Window__contentPadding",a,0)})))}},34881:function(e,t,n){"use strict";t.__esModule=!0,t.Window=void 0;var o=n(96323),r=n(1060),a=n(465),i=n(21118),c=n(31246),l=n(26949),u=n(84200),d=n(27157),s=(n(98069),n(41410)),p=n(79926),m=n(30041),f=["className","fitted","children"];function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}var C=(0,p.createLogger)("Window"),g=[400,600],N=function(e){var t,n;function l(){return e.apply(this,arguments)||this}n=e,(t=l).prototype=Object.create(n.prototype),t.prototype.constructor=t,h(t,n);var p=l.prototype;return p.componentDidMount=function(){var e=(0,c.useBackend)(this.context).suspended,t=this.props.canClose,n=void 0===t||t;e||(Byond.winset(window.__windowId__,{"can-close":Boolean(n)}),C.log("mounting"),this.updateGeometry())},p.componentDidUpdate=function(e){(this.props.width!==e.width||this.props.height!==e.height)&&this.updateGeometry()},p.updateGeometry=function(){var e,t=(0,c.useBackend)(this.context).config,n=Object.assign({size:g},t.window);this.props.width&&this.props.height&&(n.size=[this.props.width,this.props.height]),null!=(e=t.window)&&e.key&&(0,s.setWindowKey)(t.window.key),(0,s.recallWindowGeometry)(n)},p.render=function(){var e,t,n=this.props,l=n.canClose,p=void 0===l||l,f=n.theme,h=n.title,g=n.children,N=(0,c.useBackend)(this.context),v=N.config,V=N.suspended,y=(0,d.useDebug)(this.context).debugLayout,x=(0,a.useDispatch)(this.context),k=null==(e=v.window)?void 0:e.fancy,S=null==(t=v.window)?void 0:t.mode,I=v.user&&(v.user.observer?v.status<u.UI_DISABLED:v.status<u.UI_INTERACTIVE);return(0,o.createComponentVNode)(2,m.Layout,{className:"Window",theme:f,mode:S,children:[(0,o.createComponentVNode)(2,b,{className:"Window__titleBar",title:!V&&(h||(0,i.decodeHtmlEntities)(v.title)),status:v.status,fancy:k,onDragStart:s.dragStartHandler,onClose:function(){C.log("pressed close"),x((0,c.backendSuspendStart)())},canClose:p}),(0,o.createVNode)(1,"div",(0,r.classes)(["Window__rest",y&&"debug-layout"]),[!V&&g,I&&(0,o.createVNode)(1,"div","Window__dimmer")],0),k&&(0,o.createFragment)([(0,o.createVNode)(1,"div","Window__resizeHandle__e",null,1,{onMousedown:(0,s.resizeStartHandler)(1,0)}),(0,o.createVNode)(1,"div","Window__resizeHandle__s",null,1,{onMousedown:(0,s.resizeStartHandler)(0,1)}),(0,o.createVNode)(1,"div","Window__resizeHandle__se",null,1,{onMousedown:(0,s.resizeStartHandler)(1,1)})],4)]})},l}(o.Component);t.Window=N;N.Content=function(e){var t=e.className,n=e.fitted,a=e.children,i=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,f);return(0,o.normalizeProps)((0,o.createComponentVNode)(2,m.Layout.Content,Object.assign({className:(0,r.classes)(["Window__content",t])},i,{children:n&&a||(0,o.createVNode)(1,"div","Window__contentPadding",a,0)})))};var v=function(e){switch(e){case u.UI_INTERACTIVE:return"good";case u.UI_UPDATE:return"average";case u.UI_DISABLED:default:return"bad"}},b=function(e,t){var n=e.className,c=e.title,u=e.status,d=e.canClose,s=e.fancy,p=e.onDragStart,m=e.onClose;(0,a.useDispatch)(t);return(0,o.createVNode)(1,"div",(0,r.classes)(["TitleBar",n]),[u===undefined&&(0,o.createComponentVNode)(2,l.Icon,{className:"TitleBar__statusIcon",name:"tools",opacity:.5})||(0,o.createComponentVNode)(2,l.Icon,{className:"TitleBar__statusIcon",color:v(u),name:"eye"}),(0,o.createVNode)(1,"div","TitleBar__title","string"==typeof c&&c===c.toLowerCase()&&(0,i.toTitleCase)(c)||c,0),(0,o.createVNode)(1,"div","TitleBar__dragZone",null,1,{onMousedown:function(e){return s&&p(e)}}),!1,Boolean(s&&d)&&(0,o.createVNode)(1,"div","TitleBar__close TitleBar__clickable",Byond.IS_LTE_IE8?"x":"\xd7",0,{onclick:m})],0)}},2381:function(e,t,n){"use strict";t.__esModule=!0,t.Window=t.Pane=t.NtosWindow=t.Layout=void 0;var o=n(30041);t.Layout=o.Layout;var r=n(76738);t.NtosWindow=r.NtosWindow;var a=n(52243);t.Pane=a.Pane;var i=n(34881);t.Window=i.Window},13952:function(e,t){"use strict";t.__esModule=!0,t.captureExternalLinks=void 0;t.captureExternalLinks=function(){document.addEventListener("click",(function(e){for(var t=e.target;;){if(!t||t===document.body)return;if("a"===String(t.tagName).toLowerCase())break;t=t.parentElement}var n=t.getAttribute("href")||"";if(!("?"===n.charAt(0)||n.startsWith("byond://"))){e.preventDefault();var o=n;o.toLowerCase().startsWith("www")&&(o="https://"+o),Byond.topic({tgui:1,window_id:window.__windowId__,type:"openLink",url:o})}}))}},79926:function(e,t,n){"use strict";t.__esModule=!0,t.logger=t.createLogger=void 0;n(82252);var o=0,r=1,a=2,i=3,c=4,l=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r<n;r++)o[r-2]=arguments[r];if(e>=a){var i=[t].concat(o).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;Byond.topic({tgui:1,window_id:window.__windowId__,type:"log",ns:t,message:i})}},u=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return l.apply(void 0,[o,e].concat(n))},log:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[r,e].concat(n))},info:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[a,e].concat(n))},warn:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[i,e].concat(n))},error:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return l.apply(void 0,[c,e].concat(n))}}};t.createLogger=u;var d=u();t.logger=d},77960:function(e,t,n){"use strict";t.__esModule=!0,t.createRenderer=t.suspendRenderer=t.resumeRenderer=void 0;var o,r=n(28440),a=n(96323),i=((0,n(79926).createLogger)("renderer"),!0),c=!1;t.resumeRenderer=function(){i=i||"resumed",c=!1};t.suspendRenderer=function(){c=!0};t.createRenderer=function(e){return function(){r.perf.mark("render/start"),o||(o=document.getElementById("react-root")),(0,a.render)(e(),o),r.perf.mark("render/finish"),c||i&&(i=!1)}}},91199:function(e,t,n){"use strict";t.__esModule=!0,t.getRoutedComponent=void 0;var o=n(96323),r=n(31246),a=(n(12184),n(2381)),i=n(8156),c=function(e,t){return function(){return(0,o.createComponentVNode)(2,a.Window,{children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0,children:["notFound"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" was not found.")],4),"missingExport"===e&&(0,o.createVNode)(1,"div",null,[(0,o.createTextVNode)("Interface "),(0,o.createVNode)(1,"b",null,t,0),(0,o.createTextVNode)(" is missing an export.")],4)]})})}},l=function(){return(0,o.createComponentVNode)(2,a.Window,{children:(0,o.createComponentVNode)(2,a.Window.Content,{scrollable:!0})})};t.getRoutedComponent=function(e){var t=e.getState(),n=(0,r.selectBackend)(t),o=n.suspended,a=n.config;if(o)return l;for(var u,d=null==a?void 0:a["interface"],s=[function(e){return"./"+e+".tsx"},function(e){return"./"+e+".js"},function(e){return"./"+e+"/index.tsx"},function(e){return"./"+e+"/index.js"}];!u&&s.length>0;){var p=s.shift()(d);try{u=i(p)}catch(f){if("MODULE_NOT_FOUND"!==f.code)throw f}}if(!u)return c("notFound",d);var m=u[d];return m||c("missingExport",d)}},81890:function(e,t,n){"use strict";t.__esModule=!0,t.sanitizeText=void 0;var o,r=(o=n(42950))&&o.__esModule?o:{"default":o};var a=["b","br","center","code","div","font","hr","i","li","menu","ol","p","pre","span","table","td","th","tr","u","ul"],i=["class","style"];t.sanitizeText=function(e,t,n){return void 0===t&&(t=a),void 0===n&&(n=i),r["default"].sanitize(e,{ALLOWED_TAGS:t,FORBID_ATTR:n})}},18749:function(e,t,n){"use strict";t.__esModule=!0,t.StoreProvider=t.configureStore=void 0;var o=n(32416),r=n(465),a=n(96323),i=n(57723),c=n(31246),l=n(27157);function u(e,t){return u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},u(e,t)}var d=(0,n(79926).createLogger)("store");t.configureStore=function(e){var t,n;void 0===e&&(e={});var a=(0,o.flow)([(0,r.combineReducers)({debug:l.debugReducer,backend:c.backendReducer}),e.reducer]),u=[].concat((null==(t=e.middleware)?void 0:t.pre)||[],[i.assetMiddleware,c.backendMiddleware],(null==(n=e.middleware)?void 0:n.post)||[]);var d=r.applyMiddleware.apply(void 0,u),p=(0,r.createStore)(a,d);return window.__store__=p,window.__augmentStack__=s(p),p};var s=function(e){return function(t,n){var o,r;n?"object"!=typeof n||n.stack||(n.stack=t):(n=new Error(t.split("\n")[0])).stack=t,d.log("FatalError:",n);var a=e.getState(),i=null==a||null==(o=a.backend)?void 0:o.config,c=t;return c+="\nUser Agent: "+navigator.userAgent,c+="\nState: "+JSON.stringify({ckey:null==i||null==(r=i.client)?void 0:r.ckey,"interface":null==i?void 0:i["interface"],window:null==i?void 0:i.window})}},p=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,u(t,n);var r=o.prototype;return r.getChildContext=function(){return{store:this.props.store}},r.render=function(){return this.props.children},o}(a.Component);t.StoreProvider=p},88428:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Blink",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.Blink,{children:"Blink"})})}},9184:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a=n(87758),i={title:"BlockQuote",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.BlockQuote,{children:(0,o.createComponentVNode)(2,a.BoxWithSampleText)})})}},36801:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Box",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{bold:!0,children:"bold"}),(0,o.createComponentVNode)(2,r.Box,{italic:!0,children:"italic"}),(0,o.createComponentVNode)(2,r.Box,{opacity:.5,children:"opacity 0.5"}),(0,o.createComponentVNode)(2,r.Box,{opacity:.25,children:"opacity 0.25"}),(0,o.createComponentVNode)(2,r.Box,{m:2,children:"m: 2"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"left",children:"left"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"center",children:"center"}),(0,o.createComponentVNode)(2,r.Box,{textAlign:"right",children:"right"})]})}},3750:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Button",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=a;var i=["red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey"],c=["good","average","bad","black","white"],l=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[(0,o.createComponentVNode)(2,r.Button,{content:"Simple"}),(0,o.createComponentVNode)(2,r.Button,{selected:!0,content:"Selected"}),(0,o.createComponentVNode)(2,r.Button,{altSelected:!0,content:"Alt Selected"}),(0,o.createComponentVNode)(2,r.Button,{disabled:!0,content:"Disabled"}),(0,o.createComponentVNode)(2,r.Button,{color:"transparent",content:"Transparent"}),(0,o.createComponentVNode)(2,r.Button,{icon:"cog",content:"Icon"}),(0,o.createComponentVNode)(2,r.Button,{icon:"power-off"}),(0,o.createComponentVNode)(2,r.Button,{fluid:!0,content:"Fluid"}),(0,o.createComponentVNode)(2,r.Button,{my:1,lineHeight:2,minWidth:15,textAlign:"center",content:"With Box props"})]}),(0,o.createComponentVNode)(2,r.Box,{mb:1,children:[c.map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:e,content:e},e)})),(0,o.createVNode)(1,"br"),i.map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:e,content:e},e)})),(0,o.createVNode)(1,"br"),i.map((function(e){return(0,o.createComponentVNode)(2,r.Box,{inline:!0,mx:"7px",color:e,children:e},e)}))]})]})}},68696:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i=n(79926),c={title:"ByondUi",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=c;var l=function(e,t){var n=(0,r.useLocalState)(t,"byondUiEvalCode","Byond.winset('"+window.__windowId__+"', {\n  'is-visible': true,\n})"),c=n[0],l=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{title:"Button",children:(0,o.createComponentVNode)(2,a.ByondUi,{params:{type:"button",text:"Button"}})}),(0,o.createComponentVNode)(2,a.Section,{title:"Make BYOND calls",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"chevron-right",onClick:function(){return setImmediate((function(){try{var e=new Function("return ("+c+")")();e&&e.then?(i.logger.log("Promise"),e.then(i.logger.log)):i.logger.log(e)}catch(t){i.logger.log(t)}}))},children:"Evaluate"}),children:(0,o.createComponentVNode)(2,a.Box,{as:"textarea",width:"100%",height:"10em",onChange:function(e){return l(e.target.value)},children:c})})],4)}},88835:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a=n(87758),i={title:"Collapsible",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{children:(0,o.createComponentVNode)(2,r.Collapsible,{title:"Collapsible Demo",buttons:(0,o.createComponentVNode)(2,r.Button,{icon:"cog"}),children:(0,o.createComponentVNode)(2,a.BoxWithSampleText)})})}},34458:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Flex & Sections",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"fs_grow",1),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"fs_direction","column"),u=l[0],d=l[1],s=(0,r.useLocalState)(t,"fs_fill",!0),p=s[0],m=s[1],f=(0,r.useLocalState)(t,"fs_title",!0),h=f[0],C=f[1];return(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:"column",children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mb:1,children:(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return d("column"===u?"row":"column")},children:'Flex direction="'+u+'"'}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return c(Number(!i))},children:"Flex.Item grow={"+i+"}"}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,onClick:function(){return m(!p)},children:"Section fill={"+String(p)+"}"}),(0,o.createComponentVNode)(2,a.Button,{fluid:!0,selected:h,onClick:function(){return C(!h)},children:"Section title"})]})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:1,children:(0,o.createComponentVNode)(2,a.Flex,{height:"100%",direction:u,children:[(0,o.createComponentVNode)(2,a.Flex.Item,{mr:"row"===u&&1,mb:"column"===u&&1,grow:i,children:(0,o.createComponentVNode)(2,a.Section,{title:h&&"Section 1",fill:p,children:"Content"})}),(0,o.createComponentVNode)(2,a.Flex.Item,{grow:i,children:(0,o.createComponentVNode)(2,a.Section,{title:h&&"Section 2",fill:p,children:"Content"})})]})})]})}},23148:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Input",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"number",0),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"text","Sample text"),u=l[0],d=l[1];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input (onChange)",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Input (onInput)",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onInput:function(e,t){return d(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"NumberInput (onChange)",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"40px",step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onChange:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"NumberInput (onDrag)",children:(0,o.createComponentVNode)(2,a.NumberInput,{animated:!0,width:"40px",step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Slider (onDrag)",children:(0,o.createComponentVNode)(2,a.Slider,{step:1,stepPixelSize:5,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Knob (onDrag)",children:[(0,o.createComponentVNode)(2,a.Knob,{inline:!0,size:1,step:1,stepPixelSize:2,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}}),(0,o.createComponentVNode)(2,a.Knob,{ml:1,inline:!0,bipolar:!0,size:1,step:1,stepPixelSize:2,value:i,minValue:-100,maxValue:100,onDrag:function(e,t){return c(t)}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Rotating Icon",children:(0,o.createComponentVNode)(2,a.Box,{inline:!0,position:"relative",children:(0,o.createComponentVNode)(2,a.DraggableControl,{value:i,minValue:-100,maxValue:100,dragMatrix:[0,-1],step:1,stepPixelSize:5,onDrag:function(e,t){return c(t)},children:function(e){return(0,o.createComponentVNode)(2,a.Box,{onMouseDown:e.handleDragStart,children:[(0,o.createComponentVNode)(2,a.Icon,{size:4,color:"yellow",name:"times",rotation:4*e.displayValue}),e.inputElement]})}})})})]})})}},23613:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Popper",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(){return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Popper,{popperContent:(0,o.createComponentVNode)(2,r.Box,{style:{background:"white",border:"2px solid blue"},children:"Loogatme!"}),options:{placement:"bottom"},children:(0,o.createComponentVNode)(2,r.Box,{style:{border:"5px solid white",height:"300px",width:"200px"}})}),(0,o.createComponentVNode)(2,r.Popper,{popperContent:(0,o.createComponentVNode)(2,r.Box,{style:{background:"white",border:"2px solid blue"},children:"I am on the right!"}),options:{placement:"right"},children:(0,o.createComponentVNode)(2,r.Box,{style:{border:"5px solid white",height:"500px",width:"100px"}})})],4)}},9093:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"ProgressBar",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"progress",.5),i=n[0],c=n[1],l=(0,r.useLocalState)(t,"color",""),u=l[0],d=l[1],s=u?{color:u}:{ranges:{good:[.5,Infinity],bad:[-Infinity,.1],average:[0,.5]}};return(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.normalizeProps)((0,o.createComponentVNode)(2,a.ProgressBar,Object.assign({},s,{minValue:-1,maxValue:1,value:i,children:["Value: ",Number(i).toFixed(1)]}))),(0,o.createComponentVNode)(2,a.Box,{mt:1,children:(0,o.createComponentVNode)(2,a.LabeledList,{mt:"2em",children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Adjust value",children:[(0,o.createComponentVNode)(2,a.Button,{content:"-0.1",onClick:function(){return c(i-.1)}}),(0,o.createComponentVNode)(2,a.Button,{content:"+0.1",onClick:function(){return c(i+.1)}})]}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Override color",children:(0,o.createComponentVNode)(2,a.Input,{value:u,onChange:function(e,t){return d(t)}})})]})})]})}},86482:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Stack",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=a;var i=function(){return(0,o.createComponentVNode)(2,r.Box,{inline:!0,width:1,height:1,children:"A"})},c=function(){return(0,o.createFragment)([(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,i)}),(0,o.createComponentVNode)(2,r.Stack.Divider),(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,i)})],4)},l=function(e,t){return(0,o.createComponentVNode)(2,r.Section,{fill:!0,children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,className:"debug-layout",children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1,children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,zebra:!0,vertical:!0,children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{children:(0,o.createComponentVNode)(2,r.Stack,{fill:!0,children:[(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1}),(0,o.createComponentVNode)(2,c),(0,o.createComponentVNode)(2,c)]})}),(0,o.createComponentVNode)(2,r.Stack.Item,{grow:1}),(0,o.createComponentVNode)(2,c)]})})]})})}},63900:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(7151),a=n(26949),i=n(1033),c={title:"Storage",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=c;var l=function(e,t){return window.localStorage?(0,o.createComponentVNode)(2,a.Section,{title:"Local Storage",buttons:(0,o.createComponentVNode)(2,a.Button,{icon:"recycle",onClick:function(){localStorage.clear(),r.storage.clear()},children:"Clear"}),children:(0,o.createComponentVNode)(2,a.LabeledList,{children:[(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Keys in use",children:localStorage.length}),(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Remaining space",children:(0,i.formatSiUnit)(localStorage.remainingSpace,0,"B")})]})}):(0,o.createComponentVNode)(2,a.NoticeBox,{children:"Local storage is not available."})}},88209:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Tabs",render:function(){return(0,o.createComponentVNode)(2,l)}};t.meta=i;var c=["Tab #1","Tab #2","Tab #3","Tab #4"],l=function(e,t){var n=(0,r.useLocalState)(t,"tabProps",{}),i=n[0],c=n[1];return(0,o.createFragment)([(0,o.createComponentVNode)(2,a.Section,{children:[(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"vertical",checked:i.vertical,onClick:function(){return c(Object.assign({},i,{vertical:!i.vertical}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"leftSlot",checked:i.leftSlot,onClick:function(){return c(Object.assign({},i,{leftSlot:!i.leftSlot}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"rightSlot",checked:i.rightSlot,onClick:function(){return c(Object.assign({},i,{rightSlot:!i.rightSlot}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"icon",checked:i.icon,onClick:function(){return c(Object.assign({},i,{icon:!i.icon}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"fluid",checked:i.fluid,onClick:function(){return c(Object.assign({},i,{fluid:!i.fluid}))}}),(0,o.createComponentVNode)(2,a.Button.Checkbox,{inline:!0,content:"centered",checked:i.centered,onClick:function(){return c(Object.assign({},i,{centered:!i.centered}))}})]}),(0,o.createComponentVNode)(2,a.Section,{fitted:!0,children:(0,o.createComponentVNode)(2,u)}),(0,o.createComponentVNode)(2,a.Section,{title:"Normal section",children:[(0,o.createComponentVNode)(2,u),"Some text"]}),(0,o.createComponentVNode)(2,a.Section,{children:"Section-less tabs appear the same as tabs in a fitted section:"}),(0,o.createComponentVNode)(2,u)],4)},u=function(e,t){var n=(0,r.useLocalState)(t,"tabIndex",0),i=n[0],l=n[1],u=(0,r.useLocalState)(t,"tabProps",{})[0];return(0,o.createComponentVNode)(2,a.Tabs,{vertical:u.vertical,fluid:u.fluid,textAlign:u.centered&&"center",children:c.map((function(e,t){return(0,o.createComponentVNode)(2,a.Tabs.Tab,{selected:t===i,icon:u.icon&&"info-circle",leftSlot:u.leftSlot&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times"}),rightSlot:u.rightSlot&&(0,o.createComponentVNode)(2,a.Button,{circular:!0,compact:!0,color:"transparent",icon:"times"}),onClick:function(){return l(t)},children:e},t)}))})}},38200:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(31246),a=n(26949),i={title:"Themes",render:function(){return(0,o.createComponentVNode)(2,c)}};t.meta=i;var c=function(e,t){var n=(0,r.useLocalState)(t,"kitchenSinkTheme"),i=n[0],c=n[1];return(0,o.createComponentVNode)(2,a.Section,{children:(0,o.createComponentVNode)(2,a.LabeledList,{children:(0,o.createComponentVNode)(2,a.LabeledList.Item,{label:"Use theme",children:(0,o.createComponentVNode)(2,a.Input,{placeholder:"theme_name",value:i,onInput:function(e,t){return c(t)}})})})})}},48181:function(e,t,n){"use strict";t.__esModule=!0,t.meta=void 0;var o=n(96323),r=n(26949),a={title:"Tooltip",render:function(){return(0,o.createComponentVNode)(2,i)}};t.meta=a;var i=function(){return(0,o.createComponentVNode)(2,r.Section,{children:[(0,o.createComponentVNode)(2,r.Box,{children:[(0,o.createComponentVNode)(2,r.Tooltip,{content:"Tooltip text.",children:(0,o.createComponentVNode)(2,r.Box,{inline:!0,position:"relative",mr:1,children:"Box (hover me)."})}),(0,o.createComponentVNode)(2,r.Button,{tooltip:"Tooltip text.",content:"Button"})]}),(0,o.createComponentVNode)(2,r.Box,{mt:1,children:["top","left","right","bottom","bottom-start","bottom-end"].map((function(e){return(0,o.createComponentVNode)(2,r.Button,{color:"transparent",tooltip:"Tooltip text.",tooltipPosition:e,content:e},e)}))})]})}},87758:function(e,t,n){"use strict";t.__esModule=!0,t.BoxWithSampleText=void 0;var o=n(96323),r=n(26949);t.BoxWithSampleText=function(e){return(0,o.normalizeProps)((0,o.createComponentVNode)(2,r.Box,Object.assign({},e,{children:[(0,o.createComponentVNode)(2,r.Box,{italic:!0,children:"Jackdaws love my big sphinx of quartz."}),(0,o.createComponentVNode)(2,r.Box,{mt:1,bold:!0,children:"The wide electrification of the southern provinces will give a powerful impetus to the growth of agriculture."})]})))}},33603:function(){},28553:function(){},68885:function(){},19210:function(){},44951:function(){},22031:function(){},44576:function(){},21805:function(){},50222:function(){},74199:function(){},8156:function(e,t,n){var o={"./AIRack":36525,"./AIRack.js":36525,"./AbilityManager":50687,"./AbilityManager.js":50687,"./AirAlarm":24782,"./AirAlarm.js":24782,"./AirVendor":89375,"./AirVendor.tsx":89375,"./Airlock":22704,"./Airlock.js":22704,"./AlertContentWindows":78403,"./AlertContentWindows/":78403,"./AlertContentWindows/index":78403,"./AlertContentWindows/index.ts":78403,"./AlertContentWindows/tgControls":43469,"./AlertContentWindows/tgControls.tsx":43469,"./AlertContentWindows/types":89037,"./AlertContentWindows/types.ts":89037,"./AlertModal":458,"./AlertModal.tsx":458,"./AnnouncementComputer":364,"./AnnouncementComputer/":364,"./AnnouncementComputer/automatic":9168,"./AnnouncementComputer/automatic.tsx":9168,"./AnnouncementComputer/index":364,"./AnnouncementComputer/index.tsx":364,"./AnnouncementComputer/manual":88364,"./AnnouncementComputer/manual.tsx":88364,"./AnnouncementComputer/type":76295,"./AnnouncementComputer/type.tsx":76295,"./AntagonistPanel":20636,"./AntagonistPanel/":20636,"./AntagonistPanel/AntagonistTypeTabBody":20920,"./AntagonistPanel/AntagonistTypeTabBody.tsx":20920,"./AntagonistPanel/AntagonistTypeTabs":56444,"./AntagonistPanel/AntagonistTypeTabs.tsx":56444,"./AntagonistPanel/index":20636,"./AntagonistPanel/index.tsx":20636,"./AntagonistPanel/type":5562,"./AntagonistPanel/type.ts":5562,"./Apc":91690,"./Apc/":91690,"./Apc/AccessPanelSection":20065,"./Apc/AccessPanelSection.tsx":20065,"./Apc/CellDisplay":65005,"./Apc/CellDisplay.tsx":65005,"./Apc/MainSection":54187,"./Apc/MainSection.tsx":54187,"./Apc/PowerChannelSection":42947,"./Apc/PowerChannelSection.tsx":42947,"./Apc/WireList":63687,"./Apc/WireList.tsx":63687,"./Apc/index":91690,"./Apc/index.tsx":91690,"./Apc/types":73020,"./Apc/types.ts":73020,"./Apc/util":94104,"./Apc/util.ts":94104,"./ArtifactPaper":52403,"./ArtifactPaper.js":52403,"./Atm":7171,"./Atm/":7171,"./Atm/index":7171,"./Atm/index.tsx":7171,"./Atm/types":3382,"./Atm/types.ts":3382,"./AutoInjector":46837,"./AutoInjector.js":46837,"./BanPanel":13401,"./BanPanel/":13401,"./BanPanel/BanList/BanList":95620,"./BanPanel/BanList/BanList.tsx":95620,"./BanPanel/BanList/BanListItem":67179,"./BanPanel/BanList/BanListItem.tsx":67179,"./BanPanel/BanList/columnConfig":99526,"./BanPanel/BanList/columnConfig.tsx":99526,"./BanPanel/JobBanList":62983,"./BanPanel/JobBanList.tsx":62983,"./BanPanel/apiType":49641,"./BanPanel/apiType.ts":49641,"./BanPanel/index":13401,"./BanPanel/index.tsx":13401,"./BanPanel/type":92600,"./BanPanel/type.ts":92600,"./BanPanel/useBanPanelBackend":34747,"./BanPanel/useBanPanelBackend.ts":34747,"./BarberingMenu":36443,"./BarberingMenu.js":36443,"./BarcodeComputer":8844,"./BarcodeComputer.js":8844,"./BioEffectManager":45027,"./BioEffectManager.js":45027,"./Boardgame":10522,"./Boardgame/":10522,"./Boardgame/Components":29678,"./Boardgame/Components/":29678,"./Boardgame/Components/board":66508,"./Boardgame/Components/board/":66508,"./Boardgame/Components/board/common/GridGuideRenderer":34116,"./Boardgame/Components/board/common/GridGuideRenderer.tsx":34116,"./Boardgame/Components/board/common/GridPieceRenderer":9149,"./Boardgame/Components/board/common/GridPieceRenderer.tsx":9149,"./Boardgame/Components/board/helpers":83702,"./Boardgame/Components/board/helpers.ts":83702,"./Boardgame/Components/board/index":66508,"./Boardgame/Components/board/index.tsx":66508,"./Boardgame/Components/board/styles/checkerboard":45208,"./Boardgame/Components/board/styles/checkerboard/":45208,"./Boardgame/Components/board/styles/checkerboard/CheckerBoardPattern":84894,"./Boardgame/Components/board/styles/checkerboard/CheckerBoardPattern.tsx":84894,"./Boardgame/Components/board/styles/checkerboard/index":45208,"./Boardgame/Components/board/styles/checkerboard/index.tsx":45208,"./Boardgame/Components/board/styles/types":51891,"./Boardgame/Components/board/styles/types.ts":51891,"./Boardgame/Components/common/BoardgameContents":25540,"./Boardgame/Components/common/BoardgameContents.tsx":25540,"./Boardgame/Components/common/ButtonConfirm":75022,"./Boardgame/Components/common/ButtonConfirm.tsx":75022,"./Boardgame/Components/common/HeldPieceRenderer":68035,"./Boardgame/Components/common/HeldPieceRenderer.tsx":68035,"./Boardgame/Components/common/Notations":41541,"./Boardgame/Components/common/Notations.tsx":41541,"./Boardgame/Components/common/Palettes":75750,"./Boardgame/Components/common/Palettes.tsx":75750,"./Boardgame/Components/common/TitleBar":15237,"./Boardgame/Components/common/TitleBar.tsx":15237,"./Boardgame/Components/index":29678,"./Boardgame/Components/index.tsx":29678,"./Boardgame/games":86489,"./Boardgame/games/":86489,"./Boardgame/games/chess":95102,"./Boardgame/games/chess/":95102,"./Boardgame/games/chess/index":95102,"./Boardgame/games/chess/index.tsx":95102,"./Boardgame/games/chess/pieces":86364,"./Boardgame/games/chess/pieces.tsx":86364,"./Boardgame/games/draughts":85867,"./Boardgame/games/draughts/":85867,"./Boardgame/games/draughts/index":85867,"./Boardgame/games/draughts/index.tsx":85867,"./Boardgame/games/draughts/pieces":77896,"./Boardgame/games/draughts/pieces.tsx":77896,"./Boardgame/games/index":86489,"./Boardgame/games/index.ts":86489,"./Boardgame/games/kits":8250,"./Boardgame/games/kits.ts":8250,"./Boardgame/index":10522,"./Boardgame/index.tsx":10522,"./Boardgame/utils":65844,"./Boardgame/utils/":65844,"./Boardgame/utils/index":65844,"./Boardgame/utils/index.ts":65844,"./Boardgame/utils/notations":43785,"./Boardgame/utils/notations.ts":43785,"./Boardgame/utils/types":76434,"./Boardgame/utils/types.ts":76434,"./Boardgame/utils/useActions":51887,"./Boardgame/utils/useActions.ts":51887,"./Boardgame/utils/useStates":31463,"./Boardgame/utils/useStates.ts":31463,"./Boardgame/utils/window":44135,"./Boardgame/utils/window.ts":44135,"./Bombsim":10818,"./Bombsim/":10818,"./Bombsim/index":10818,"./Bombsim/index.tsx":10818,"./Bombsim/type":71650,"./Bombsim/type.ts":71650,"./BugReportForm":15094,"./BugReportForm.js":15094,"./CAViewer":65101,"./CAViewer.js":65101,"./Cashreg":57399,"./Cashreg.tsx":57399,"./CentComViewer":48341,"./CentComViewer.js":48341,"./CharacterPreferences":4098,"./CharacterPreferences/":4098,"./CharacterPreferences/CharacterTab":96074,"./CharacterPreferences/CharacterTab.tsx":96074,"./CharacterPreferences/GameSettingsTab":56374,"./CharacterPreferences/GameSettingsTab.tsx":56374,"./CharacterPreferences/GeneralTab":57368,"./CharacterPreferences/GeneralTab.tsx":57368,"./CharacterPreferences/SavesTab":70712,"./CharacterPreferences/SavesTab.tsx":70712,"./CharacterPreferences/TraitsTab":30709,"./CharacterPreferences/TraitsTab.tsx":30709,"./CharacterPreferences/index":4098,"./CharacterPreferences/index.tsx":4098,"./CharacterPreferences/type":59576,"./CharacterPreferences/type.ts":59576,"./ChemChute":78979,"./ChemChute/":78979,"./ChemChute/index":78979,"./ChemChute/index.tsx":78979,"./ChemChute/type":28487,"./ChemChute/type.ts":28487,"./ChemDispenser":56915,"./ChemDispenser.tsx":56915,"./ChemHeater":95348,"./ChemHeater.js":95348,"./ChemMaster":45747,"./ChemMaster.js":45747,"./ChemRequestReceiver":48230,"./ChemRequestReceiver.js":48230,"./ChemRequester":20938,"./ChemRequester.js":20938,"./CloningConsole":6542,"./CloningConsole.js":6542,"./ClothingBooth":78826,"./ClothingBooth/":78826,"./ClothingBooth/index":78826,"./ClothingBooth/index.tsx":78826,"./ClothingBooth/type":41717,"./ClothingBooth/type.ts":41717,"./ColorMatrixEditor":70855,"./ColorMatrixEditor.tsx":70855,"./ColorPickerModal":21018,"./ColorPickerModal.tsx":21018,"./ComUplink":22049,"./ComUplink/":22049,"./ComUplink/index":22049,"./ComUplink/index.tsx":22049,"./ComUplink/type":20254,"./ComUplink/type.ts":20254,"./ContributorRewards":65208,"./ContributorRewards.js":65208,"./CrewCredits":57119,"./CrewCredits/":57119,"./CrewCredits/AntagonistsTab":19812,"./CrewCredits/AntagonistsTab.tsx":19812,"./CrewCredits/CrewTab":99407,"./CrewCredits/CrewTab.tsx":99407,"./CrewCredits/ScoreTab":21187,"./CrewCredits/ScoreTab.tsx":21187,"./CrewCredits/index":57119,"./CrewCredits/index.tsx":57119,"./CrewCredits/type":37538,"./CrewCredits/type.ts":37538,"./CryoCell":75859,"./CryoCell.js":75859,"./CyborgDockingStation":56445,"./CyborgDockingStation/":56445,"./CyborgDockingStation/CellChargeBar":59181,"./CyborgDockingStation/CellChargeBar.tsx":59181,"./CyborgDockingStation/DockingAllowedButton":7205,"./CyborgDockingStation/DockingAllowedButton.tsx":7205,"./CyborgDockingStation/OccupantSection":31924,"./CyborgDockingStation/OccupantSection/":31924,"./CyborgDockingStation/OccupantSection/EyebotStatusView":33492,"./CyborgDockingStation/OccupantSection/EyebotStatusView.tsx":33492,"./CyborgDockingStation/OccupantSection/HumanStatusView":27897,"./CyborgDockingStation/OccupantSection/HumanStatusView.tsx":27897,"./CyborgDockingStation/OccupantSection/OccupantCellDisplay":79891,"./CyborgDockingStation/OccupantSection/OccupantCellDisplay.tsx":79891,"./CyborgDockingStation/OccupantSection/RobotStatusView":25112,"./CyborgDockingStation/OccupantSection/RobotStatusView/":25112,"./CyborgDockingStation/OccupantSection/RobotStatusView/ClothingReportSection":44899,"./CyborgDockingStation/OccupantSection/RobotStatusView/ClothingReportSection.tsx":44899,"./CyborgDockingStation/OccupantSection/RobotStatusView/DamageReportSection":74826,"./CyborgDockingStation/OccupantSection/RobotStatusView/DamageReportSection.tsx":74826,"./CyborgDockingStation/OccupantSection/RobotStatusView/DecorationReportSection":32241,"./CyborgDockingStation/OccupantSection/RobotStatusView/DecorationReportSection.tsx":32241,"./CyborgDockingStation/OccupantSection/RobotStatusView/UpgradeReportSection":63297,"./CyborgDockingStation/OccupantSection/RobotStatusView/UpgradeReportSection.tsx":63297,"./CyborgDockingStation/OccupantSection/RobotStatusView/index":25112,"./CyborgDockingStation/OccupantSection/RobotStatusView/index.tsx":25112,"./CyborgDockingStation/OccupantSection/index":31924,"./CyborgDockingStation/OccupantSection/index.tsx":31924,"./CyborgDockingStation/SuppliesSection":9818,"./CyborgDockingStation/SuppliesSection/":9818,"./CyborgDockingStation/SuppliesSection/AvailableCellsSection":58571,"./CyborgDockingStation/SuppliesSection/AvailableCellsSection.tsx":58571,"./CyborgDockingStation/SuppliesSection/StandardAvailableSection":37394,"./CyborgDockingStation/SuppliesSection/StandardAvailableSection.tsx":37394,"./CyborgDockingStation/SuppliesSection/index":9818,"./CyborgDockingStation/SuppliesSection/index.tsx":9818,"./CyborgDockingStation/index":56445,"./CyborgDockingStation/index.tsx":56445,"./CyborgDockingStation/type":89974,"./CyborgDockingStation/type.ts":89974,"./CyborgModuleRewriter":85175,"./CyborgModuleRewriter/":85175,"./CyborgModuleRewriter/EmptyPlaceholder":44616,"./CyborgModuleRewriter/EmptyPlaceholder.tsx":44616,"./CyborgModuleRewriter/ModuleView":25526,"./CyborgModuleRewriter/ModuleView/":25526,"./CyborgModuleRewriter/ModuleView/ModuleDetail":94241,"./CyborgModuleRewriter/ModuleView/ModuleDetail.tsx":94241,"./CyborgModuleRewriter/ModuleView/Tools":5880,"./CyborgModuleRewriter/ModuleView/Tools.tsx":5880,"./CyborgModuleRewriter/ModuleView/index":25526,"./CyborgModuleRewriter/ModuleView/index.tsx":25526,"./CyborgModuleRewriter/action":83709,"./CyborgModuleRewriter/action.ts":83709,"./CyborgModuleRewriter/index":85175,"./CyborgModuleRewriter/index.tsx":85175,"./CyborgModuleRewriter/style":67044,"./CyborgModuleRewriter/style.ts":67044,"./CyborgModuleRewriter/type":95502,"./CyborgModuleRewriter/type.ts":95502,"./DJPanel":9299,"./DJPanel.js":9299,"./DisposalChute":64640,"./DisposalChute/":64640,"./DisposalChute/index":64640,"./DisposalChute/index.tsx":64640,"./DisposalChute/type":9389,"./DisposalChute/type.ts":9389,"./DoorTimer":84430,"./DoorTimer/":84430,"./DoorTimer/index":84430,"./DoorTimer/index.tsx":84430,"./DoorTimer/type":9494,"./DoorTimer/type.ts":9494,"./DyeDispenser":29259,"./DyeDispenser.tsx":29259,"./Elevator":87339,"./Elevator.tsx":87339,"./EngineStats":20316,"./EngineStats.js":20316,"./EspressoMachine":65203,"./EspressoMachine.js":65203,"./Filteriffic":53600,"./Filteriffic.js":53600,"./Flamethrower":21980,"./Flamethrower.js":21980,"./FlockPanel":72758,"./FlockPanel.js":72758,"./FlockStructures":57576,"./FlockStructures.js":57576,"./Freezer":11653,"./Freezer.tsx":11653,"./Gameclock":6482,"./Gameclock/":6482,"./Gameclock/index":6482,"./Gameclock/index.tsx":6482,"./Gameclock/types":69658,"./Gameclock/types.tsx":69658,"./GasCanister":52709,"./GasCanister/":52709,"./GasCanister/Detonator":16484,"./GasCanister/Detonator.js":16484,"./GasCanister/DetonatorTimer":41834,"./GasCanister/DetonatorTimer.js":41834,"./GasCanister/index":52709,"./GasCanister/index.js":52709,"./GasTank":5394,"./GasTank.js":5394,"./GeneTek":92526,"./GeneTek.js":92526,"./GeneTek/":33012,"./GeneTek/AppearanceEditor":92195,"./GeneTek/AppearanceEditor.js":92195,"./GeneTek/BioEffect":11265,"./GeneTek/BioEffect.js":11265,"./GeneTek/DNASequence":59450,"./GeneTek/DNASequence.js":59450,"./GeneTek/GeneIcon":43024,"./GeneTek/GeneIcon.js":43024,"./GeneTek/index":33012,"./GeneTek/index.js":33012,"./GeneTek/modals/BuyMaterialsModal":78368,"./GeneTek/modals/BuyMaterialsModal.js":78368,"./GeneTek/modals/CombineGenesModal":39961,"./GeneTek/modals/CombineGenesModal.js":39961,"./GeneTek/modals/UnlockModal":89613,"./GeneTek/modals/UnlockModal.js":89613,"./GeneTek/tabs/MutationsTab":22675,"./GeneTek/tabs/MutationsTab.js":22675,"./GeneTek/tabs/ResearchTab":93847,"./GeneTek/tabs/ResearchTab.js":93847,"./GeneTek/tabs/ScannerTab":49445,"./GeneTek/tabs/ScannerTab.js":49445,"./GeneTek/tabs/StorageTab":64477,"./GeneTek/tabs/StorageTab.js":64477,"./GimmickObject":12302,"./GimmickObject.js":12302,"./GlassRecycler":96608,"./GlassRecycler.js":96608,"./HumanInventory":21381,"./HumanInventory/":21381,"./HumanInventory/index":21381,"./HumanInventory/index.tsx":21381,"./HumanInventory/types":59818,"./HumanInventory/types.ts":59818,"./Hypospray":92354,"./Hypospray.js":92354,"./IDComputer":26513,"./IDComputer.js":26513,"./Laundry":23255,"./Laundry.js":23255,"./ListInputModal":84696,"./ListInputModal.tsx":84696,"./LocalGenerator":56596,"./LocalGenerator/":56596,"./LocalGenerator/index":56596,"./LocalGenerator/index.tsx":56596,"./LocalGenerator/type":83329,"./LocalGenerator/type.ts":83329,"./LongRangeTeleporter":56403,"./LongRangeTeleporter.js":56403,"./MechanicalDropper":46045,"./MechanicalDropper.js":46045,"./MineralMagnet":17526,"./MineralMagnet.js":17526,"./Minimap":2960,"./Minimap.js":2960,"./MinimapController":3082,"./MinimapController.js":3082,"./MixerMachine":93663,"./MixerMachine.js":93663,"./MixingDesk":5244,"./MixingDesk.js":5244,"./MusicInstrument":71417,"./MusicInstrument.tsx":71417,"./NuclearReactor":14086,"./NuclearReactor.js":14086,"./NumberInputModal":12660,"./NumberInputModal.tsx":12660,"./ObserverMenu":55223,"./ObserverMenu.tsx":55223,"./OperatingComputer":35851,"./OperatingComputer/":35851,"./OperatingComputer/index":35851,"./OperatingComputer/index.tsx":35851,"./OperatingComputer/type":36273,"./OperatingComputer/type.ts":36273,"./PaperSheet":69412,"./PaperSheet.js":69412,"./Particool":21293,"./Particool.js":21293,"./Phone":85344,"./Phone/":85344,"./Phone/index":85344,"./Phone/index.tsx":85344,"./Phone/type":85990,"./Phone/type.ts":85990,"./PipeDispenser":41245,"./PipeDispenser.js":41245,"./PixelOffset":38837,"./PixelOffset.js":38837,"./Plantmaster":51884,"./Plantmaster.js":51884,"./PlayerPanel":78927,"./PlayerPanel/":78927,"./PlayerPanel/Header":53302,"./PlayerPanel/Header.tsx":53302,"./PlayerPanel/constant":22706,"./PlayerPanel/constant.ts":22706,"./PlayerPanel/index":78927,"./PlayerPanel/index.tsx":78927,"./PlayerPanel/type":43771,"./PlayerPanel/type.ts":43771,"./PollBallot":29467,"./PollBallot.js":29467,"./PortablePump":13484,"./PortablePump.js":13484,"./PortableScrubber":54652,"./PortableScrubber.js":54652,"./PowerDebug":15264,"./PowerDebug.js":15264,"./PowerMonitor":84699,"./PowerMonitor/":84699,"./PowerMonitor/Apc":4914,"./PowerMonitor/Apc.tsx":4914,"./PowerMonitor/Smes":8954,"./PowerMonitor/Smes.tsx":8954,"./PowerMonitor/index":84699,"./PowerMonitor/index.tsx":84699,"./PowerMonitor/type":2441,"./PowerMonitor/type.ts":2441,"./PowerTransmissionLaser":36476,"./PowerTransmissionLaser.js":36476,"./Precipitation":61221,"./Precipitation.js":61221,"./Pressurizer":90227,"./Pressurizer.js":90227,"./ProcCall":62376,"./ProcCall.js":62376,"./PumpControl":94955,"./PumpControl/":94955,"./PumpControl/index":94955,"./PumpControl/index.tsx":94955,"./PumpControl/type":95868,"./PumpControl/type.ts":95868,"./Radio":42626,"./Radio/":42626,"./Radio/index":42626,"./Radio/index.tsx":42626,"./Radio/type":39582,"./Radio/type.ts":39582,"./RandomEvent":16710,"./RandomEvent.js":16710,"./ReagentExtractor":63777,"./ReagentExtractor.js":63777,"./Rockbox":89971,"./Rockbox.js":89971,"./SecureSafe":95285,"./SecureSafe.js":95285,"./SeedFabricator":19172,"./SeedFabricator.js":19172,"./SheetCrafting":70535,"./SheetCrafting.js":70535,"./Sleeper":24258,"./Sleeper.js":24258,"./SlotMachine":82930,"./SlotMachine.js":82930,"./Smes":68952,"./Smes.js":68952,"./SpawnEvent":54016,"./SpawnEvent.js":54016,"./SpendSpacebux":19378,"./SpendSpacebux.js":19378,"./SwingSign":79387,"./SwingSign.js":79387,"./SwingSignTIM":44001,"./SwingSignTIM.tsx":44001,"./TEG":13634,"./TEG.js":13634,"./TTV":31567,"./TTV/":31567,"./TTV/index":31567,"./TTV/index.tsx":31567,"./TTV/type":51461,"./TTV/type.ts":51461,"./TankDispenser":99714,"./TankDispenser.js":99714,"./TeleConsole":79268,"./TeleConsole/":79268,"./TeleConsole/BookmarksSection":87221,"./TeleConsole/BookmarksSection.tsx":87221,"./TeleConsole/ConnectionSection":75461,"./TeleConsole/ConnectionSection.tsx":75461,"./TeleConsole/CoordinatesSection":12703,"./TeleConsole/CoordinatesSection.tsx":12703,"./TeleConsole/SteppedSlider":34545,"./TeleConsole/SteppedSlider.tsx":34545,"./TeleConsole/index":79268,"./TeleConsole/index.tsx":79268,"./TeleConsole/types":65087,"./TeleConsole/types.ts":65087,"./TeleConsole/util":581,"./TeleConsole/util.ts":581,"./Terminal":14831,"./Terminal/":14831,"./Terminal/InputAndButtonsSection":73354,"./Terminal/InputAndButtonsSection.tsx":73354,"./Terminal/PheripheralsSection":58084,"./Terminal/PheripheralsSection.tsx":58084,"./Terminal/TerminalOutputSection":98341,"./Terminal/TerminalOutputSection.tsx":98341,"./Terminal/index":14831,"./Terminal/index.tsx":14831,"./Terminal/types":55230,"./Terminal/types.ts":55230,"./Terrainify":14081,"./Terrainify.js":14081,"./TextInputModal":81235,"./TextInputModal.tsx":81235,"./Timer":80480,"./Timer.js":80480,"./TransitShuttle":5051,"./TransitShuttle.js":5051,"./TrscArray":73128,"./TrscArray.js":73128,"./TurbineControl":73248,"./TurbineControl.js":73248,"./TurretControl":40620,"./TurretControl.js":40620,"./Vendors":97170,"./Vendors.js":97170,"./WeaponVendor":96880,"./WeaponVendor/":96880,"./WeaponVendor/index":96880,"./WeaponVendor/index.tsx":96880,"./WeaponVendor/type":10661,"./WeaponVendor/type.ts":10661,"./Wizard_Spellbook":14024,"./Wizard_Spellbook.js":14024,"./common/BeakerContents":57361,"./common/BeakerContents.js":57361,"./common/DataInput":48916,"./common/DataInput.js":48916,"./common/HealthStat":65751,"./common/HealthStat.js":65751,"./common/IDCard":8095,"./common/IDCard.js":8095,"./common/InputButtons":34277,"./common/InputButtons.tsx":34277,"./common/KeyHealthIndicators":9720,"./common/KeyHealthIndicators/":9720,"./common/KeyHealthIndicators/index":9720,"./common/KeyHealthIndicators/index.tsx":9720,"./common/KeyHealthIndicators/type":68397,"./common/KeyHealthIndicators/type.ts":68397,"./common/ListSearch":36814,"./common/ListSearch.tsx":36814,"./common/Loader":55631,"./common/Loader.tsx":55631,"./common/MobStatus":90881,"./common/MobStatus.js":90881,"./common/PortableAtmos":41161,"./common/PortableAtmos.js":41161,"./common/ReagentInfo":51418,"./common/ReagentInfo.tsx":51418,"./common/ReleaseValve":75015,"./common/ReleaseValve.js":75015,"./common/VendorCashTable":72638,"./common/VendorCashTable.tsx":72638,"./common/graphUtils":818,"./common/graphUtils.js":818,"./common/mathUtils":96794,"./common/mathUtils.ts":96794,"./common/stringUtils":18331,"./common/stringUtils.ts":18331,"./common/temperatureUtils":48175,"./common/temperatureUtils.js":48175,"./space_heater":38770,"./space_heater.js":38770};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=a,e.exports=r,r.id=8156},69321:function(e,t,n){var o={"./Blink.stories.js":88428,"./BlockQuote.stories.js":9184,"./Box.stories.js":36801,"./Button.stories.js":3750,"./ByondUi.stories.js":68696,"./Collapsible.stories.js":88835,"./Flex.stories.js":34458,"./Input.stories.js":23148,"./Popper.stories.js":23613,"./ProgressBar.stories.js":9093,"./Stack.stories.js":86482,"./Storage.stories.js":63900,"./Tabs.stories.js":88209,"./Themes.stories.js":38200,"./Tooltip.stories.js":48181};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(o,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return o[e]}r.keys=function(){return Object.keys(o)},r.resolve=a,e.exports=r,r.id=69321},82252:function(e){"use strict";var t=[];e.exports={subscribe:function(e){return t.push(e)},sendMessage:function(e){},sendLogEntry:function(e,t){},setupHotReloading:function(){0}}}},t={};function n(o){var r=t[o];if(r!==undefined)return r.exports;var a=t[o]={exports:{}};return e[o](a,a.exports,n),a.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){"use strict";n(65379),n(43674),n(69656),n(72411),n(24467),n(37493),n(87420),n(9480),n(66171),n(53276),n(71852),n(59045),n(70887),n(72906),n(24835),n(14653),n(58139),n(34049),n(38356),n(72494),n(31699),n(3263),n(81520),n(80036),n(60515),n(94330),n(96553),n(99139),n(98215),n(32617),n(80186),n(31149),n(71827),n(79770),n(32099),n(72667),n(94920),n(64683),n(26189),n(41185),n(51008),n(47112),n(86e3),n(15196),n(95993),n(25079),n(87143),n(72499),n(73676),n(76746),n(19),n(17038),n(46360),n(16835),n(96683),n(7756),n(21842),n(1613),n(65115),n(27115),n(13280),n(21019),n(66619),n(75469),n(90967),n(35022),n(22604),n(41843),n(86810),n(54670),n(16580),n(31304),n(13078),n(45128),n(31938),n(90958),n(88885),n(45017),n(59743),n(47560),n(31569),n(6134),n(12622),n(60852),n(99085),n(75180),n(79437),n(75370),n(61022),n(50580),n(5301),n(76438),n(97307),n(34016),n(86944),n(60687),n(86957),n(59163),n(34128),n(24267),n(39816),n(4239),n(8381),n(63669),n(25779),n(84580),n(33198),n(71895),n(44910),n(95962),n(73769),n(14962),n(80345),n(18438),n(70552),n(46356),n(57128),n(83588),n(47057),n(67092),n(59478),n(69203),n(27879),n(71507),n(39021),n(8641),n(83064),n(93115),n(33362),n(45090),n(12654),n(58870),n(76581),n(4567),n(28638),n(60314),n(71595),n(98954),n(91332),n(79445),n(36493),n(24476),n(78192),n(58660),n(56592),n(69957),n(9747),n(13578),n(3684),n(19209),n(56737),n(67586),n(7743),n(15890),n(34651),n(18037),n(48415),n(54950),n(76102),n(47816),n(30037),n(54705),n(75831),n(96958),n(75344),n(87853),n(25865),n(1150),n(50444),n(11220),n(6636),n(37650),n(12424),n(64346),n(27553),n(49007),n(17621),n(71078),n(20500),n(85923),n(38956),n(49264),n(70448),n(5775),n(45164),n(83762),n(67265),n(56058),n(87001),n(23535),n(18617),n(70595),n(76820),n(33357),n(38215),n(37281),n(99584),n(43582),n(15378),n(31213),n(19275),n(59),n(43849),n(69838),n(25513),n(72090),n(15511),n(88280),n(37283),n(96250)}(),function(){"use strict";var e=n(96323);n(33603),n(22031),n(44951),n(44576),n(21805),n(50222),n(74199),n(19210),n(28553),n(68885);var t,o,r=n(28440),a=(n(82252),n(6965)),i=n(13952),c=n(77960),l=n(18749),u=n(99397);r.perf.mark("inception",null==(t=window.performance)||null==(o=t.timing)?void 0:o.navigationStart),r.perf.mark("init");var d=(0,l.configureStore)(),s=(0,c.createRenderer)((function(){var t=(0,n(91199).getRoutedComponent)(d);return(0,e.createComponentVNode)(2,l.StoreProvider,{store:d,children:(0,e.createComponentVNode)(2,t)})}));!function p(){if("loading"!==document.readyState){for((0,u.setupGlobalEvents)(),(0,a.setupHotKeys)(),(0,i.captureExternalLinks)(),d.subscribe(s),window.update=function(e){return d.dispatch(Byond.parseJson(e))};;){var e=window.__updateQueue__.shift();if(!e)break;window.update(e)}0}else document.addEventListener("DOMContentLoaded",p)}()}()}();
\ No newline at end of file
diff --git a/buildByond.conf b/buildByond.conf
index 8f1a93eb4e9a9..ba44e2456b939 100644
--- a/buildByond.conf
+++ b/buildByond.conf
@@ -4,7 +4,7 @@ BYOND_MINOR_VERSION=1589
 SPACEMAN_DMM_VERSION=suite-1.8
 
 # See: goonstation/rust-g - is the tag for the release
-RUST_G_VERSION=v3.0.0-G
+RUST_G_VERSION=v3.1.0-G
 
 NODE_VERSION=16
 
diff --git a/code/WorkInProgress/AphsStuff.dm b/code/WorkInProgress/AphsStuff.dm
index b9f5857095a6f..76a1bb10869c2 100644
--- a/code/WorkInProgress/AphsStuff.dm
+++ b/code/WorkInProgress/AphsStuff.dm
@@ -396,7 +396,7 @@
 	appearanceString = "servo"
 	max_health = 40
 	handlistPart = "armR-light"
-	robot_movement_modifier = /datum/movement_modifier/robot_part/head
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_head
 
 /obj/item/parts/robot_parts/arm/left/servotron
 	name = "servotron left arm"
@@ -405,7 +405,7 @@
 	appearanceString = "servo"
 	max_health = 40
 	handlistPart = "armL-light"
-	robot_movement_modifier = /datum/movement_modifier/robot_part/arm_left
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_arm_left
 
 /obj/item/parts/robot_parts/head/servotron
 	name = "servotron head"
@@ -413,7 +413,7 @@
 	icon_state = "head-servo"
 	appearanceString = "servo"
 	max_health = 87
-	robot_movement_modifier = /datum/movement_modifier/robot_part/arm_right
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_arm_right
 
 /obj/item/parts/robot_parts/chest/servotron
 	name = "servotron chest"
diff --git a/code/WorkInProgress/AzrunStuff.dm b/code/WorkInProgress/AzrunStuff.dm
index c887ed8448de9..f56899015bed6 100644
--- a/code/WorkInProgress/AzrunStuff.dm
+++ b/code/WorkInProgress/AzrunStuff.dm
@@ -199,7 +199,40 @@
 	name = "strange seed"
 	icon = 'icons/obj/hydroponics/items_hydroponics.dmi'
 	icon_state = "seedproj"
-	implanted = /obj/item/implant/projectile/spitter_pod
+	implanted = /obj/item/implant/projectile/body_visible/seed/spitter_pod
+
+/obj/item/implant/projectile/body_visible/seed/spitter_pod
+	name = "strange seed pod"
+	pull_out_name = "strange seed pod"
+	icon = 'icons/obj/hydroponics/items_hydroponics.dmi'
+	desc = "A small hollow pod."
+	icon_state = "seedproj"
+	var/dig_ticker = 25
+
+	New()
+		..()
+		implant_overlay = image(icon = 'icons/mob/human.dmi', icon_state = "dart_stick_[rand(0, 4)]", layer = MOB_EFFECT_LAYER)
+
+	do_process()
+		src.dig_ticker = max(src.dig_ticker-1, 0)
+		if(!src.dig_ticker)
+			online = FALSE
+			if(prob(80))
+				var/mob/living/carbon/human/H = src.owner
+				var/obj/item/implant/projectile/spitter_pod/implant = new
+				implant.implanted(H)
+				boutput(src.owner,SPAN_ALERT("You feel something work its way into your body from \the [src]."))
+
+	on_death()
+		if(!online)
+			return
+		if(prob(80))
+			var/mob/living/carbon/human/H = src.owner
+			var/obj/item/implant/projectile/spitter_pod/implant = new
+			implant.implanted(H)
+			SPAWN(rand(5 SECONDS, 30 SECONDS))
+				if(!QDELETED(H) && !QDELETED(implant))
+					implant.on_death()
 
 /obj/item/implant/projectile/spitter_pod
 	name = "strange seed pod"
@@ -207,7 +240,7 @@
 	desc = "A small hollow pod."
 	icon_state = "seedproj"
 
-	var/heart_ticker = 10
+	var/heart_ticker = 35
 	online = TRUE
 
 	implanted(mob/M, mob/Implanter)
@@ -233,25 +266,29 @@
 				animate(P, alpha=255, time=2 SECONDS)
 
 	do_process()
-		heart_ticker = max(heart_ticker--,0)
-		if(heart_ticker & prob(50))
+		heart_ticker = max(heart_ticker-1, 0)
+		if(!isalive(src.owner))
+			online = FALSE
+			return
+		if(heart_ticker & prob(60) && !ON_COOLDOWN(src,"[src] spam", 5 SECONDS) )
 			if(prob(30))
 				boutput(src.owner,SPAN_ALERT("You feel as though something moving towards your heart... That can't be good."))
 			else
 				boutput(src.owner,SPAN_ALERT("You feel as though something is working its way through your chest."))
 		else if(!heart_ticker)
-			var/mob/living/carbon/human/H = src.owner
-			if(istype(H))
-				H.organHolder.damage_organs(2, 0, 1, "heart")
-			else
-				src.owner.TakeDamage("All", 2, 0)
+			if(!ON_COOLDOWN(src,"[src] spam", 8 SECONDS))
+				var/mob/living/carbon/human/H = src.owner
+				if(istype(H))
+					H.organHolder.damage_organs(rand(1,5)/2, 0, 1, list("heart"))
+				else
+					src.owner.TakeDamage("All", 1, 0)
 
-			if(prob(5))
-				boutput(src.owner,SPAN_ALERT("AAHRRRGGGG something is trying to dig your heart out from the inside?!?!"))
-				src.owner.emote("scream")
-				src.owner.changeStatus("stunned", 2 SECONDS)
-			else if(prob(10))
-				boutput(src.owner,SPAN_ALERT("You feel a sharp pain in your chest."))
+				if(prob(5))
+					boutput(src.owner,SPAN_ALERT("AAHRRRGGGG something is trying to dig your heart out from the inside?!?!"))
+					src.owner.emote("scream")
+					src.owner.changeStatus("stunned", rand(1 SECOND, 2 SECONDS))
+				else if(prob(40))
+					boutput(src.owner,SPAN_ALERT("You feel a sharp pain in your chest."))
 
 /datum/gimmick_event
 	var/interaction = 0
@@ -823,7 +860,7 @@ ADMIN_INTERACT_PROCS(/turf/unsimulated/floor, proc/sunset, proc/sunrise, proc/se
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/pipe
 
 	on_hit(atom/hit, dirflag, obj/projectile/proj)
@@ -1172,365 +1209,3 @@ ADMIN_INTERACT_PROCS(/turf/unsimulated/floor, proc/sunset, proc/sunrise, proc/se
 	New(newLoc)
 		..()
 		new /mob/living/carbon/human/normal/assistant(newLoc)
-
-#define DANCE_TRAVEL_FORWARD 1
-#define DANCE_TRAVEL_RIGHT 2
-#define DANCE_TRAVEL_LEFT 3
-#define DANCE_TRAVEL_BACK 4
-#define DANCE_TRAVEL_TOWARD 5
-#define DANCE_TRAVEL_AWAY 6
-
-#define BEAT_COUNT(_X) (AH.time_per_count * _X)
-
-/datum/abilityHolder/dancing
-	var/style = "Waltz"
-	var/list/styles = list("NC2S", "Waltz")
-	var/mob/lead
-	var/mob/follow
-	var/time_per_count = 3
-
-	onAttach(mob/to_whom)
-		. = ..()
-		src.addAbility(/datum/targetable/dancing/choose_style)
-		src.addAbility(/datum/targetable/dancing/rest)
-		src.addAbility(/datum/targetable/dancing/change_speed/faster)
-		src.addAbility(/datum/targetable/dancing/change_speed/slower)
-		for(var/move in childrentypesof(/datum/targetable/dancing/nc2s))
-			src.addAbility(move)
-		for(var/move in childrentypesof(/datum/targetable/dancing/waltz))
-			src.addAbility(move)
-
-/datum/targetable/dancing
-	icon = 'icons/mob/dance_ui.dmi'
-	var/style = null
-	var/list/static/follower_offsets = list("[NORTH]"=list(-4,-2),
-											"[EAST]"=list(-8,1),
-											"[SOUTH]"=list(4,2),
-											"[WEST]"=list(8,-1))
-
-	display_available()
-		var/datum/abilityHolder/dancing/AH = holder
-		var/mob/living/carbon/human/H = holder.owner
-		if(istype(H))
-			var/obj/item/shoes = H.get_slot(SLOT_SHOES)
-			if(istype(shoes, /obj/item/clothing/shoes/dress_shoes/dance))
-				. = TRUE
-			else
-				. = FALSE
-		else
-			. = TRUE
-
-		if(. && style)
-			. = style == AH.style
-
-	castcheck(atom/target)
-		. = ..()
-		if(.)
-			src.cooldown = 0
-
-		var/datum/abilityHolder/dancing/AH = holder
-		AH.lead = holder.owner
-		AH.follow = null
-		for (var/obj/item/grab/G in AH.lead?.equipped_list(check_for_magtractor = 0))
-			if (G.affecting.buckled) continue
-			AH.follow = G.affecting
-
-		var/reset_position = FALSE
-		if(AH.lead)
-			if((abs(AH.lead.pixel_x) + abs(AH.lead.pixel_y)) > 48)
-				reset_position = BEAT_COUNT(4)
-			else if(AH.follow && (abs(AH.lead.pixel_x - AH.follow.pixel_x ) + abs(AH.lead.pixel_y - AH.follow.pixel_y)) > 10 )
-				reset_position = BEAT_COUNT(4)
-			if(reset_position)
-				animate(AH.lead, time=reset_position, pixel_x=0, pixel_y = 0)
-
-		if(AH.follow && style)
-			if(reset_position || (AH.follow.dir != turn(AH.lead.dir,180)) || ((abs(AH.lead.pixel_x - AH.follow.pixel_x ) + abs(AH.lead.pixel_y - AH.follow.pixel_y))==0))
-				reset_position = max(reset_position, BEAT_COUNT(1))
-				AH.follow.dir = turn(AH.lead.dir,180)
-				AH.follow.layer = AH.lead.layer
-				if(AH.follow.dir & (SOUTH | EAST))
-					AH.follow.layer -= 0.1
-				else
-					AH.follow.layer += 0.1
-
-				animate(AH.follow, time=reset_position, pixel_x=follower_offsets["[AH.follow.dir]"][1], pixel_y = follower_offsets["[AH.follow.dir]"][2])
-
-
-	cast(atom/target)
-		. = ..()
-		var/datum/abilityHolder/dancing/AH = holder
-		if(AH)
-			var/duration = src.cooldown + 5 SECONDS
-			AH.lead.setStatusMin("dancing", duration)
-			AH.follow?.setStatusMin("dancing", duration)
-
-	choose_style
-		name = "Style"
-		icon_state = "style"
-		desc = "Choose from style of dance"
-		cooldown = 2 SECOND
-
-		cast(atom/target)
-			. = ..()
-			var/datum/abilityHolder/dancing/AH = holder
-			var/dance_style = tgui_input_list(holder.owner, "Select style", "Dance Selection", AH.styles)
-			if(dance_style in AH.styles)
-				AH.style = dance_style
-
-	rest
-		name = "Pause"
-		desc = "Maintain your current position"
-		icon_state = "pause"
-		cooldown = 10 SECOND
-
-		cast(atom/target)
-			. = ..()
-			var/datum/abilityHolder/dancing/AH = holder
-			if(AH)
-				AH.lead.setStatusMin("dancing", 15 SECONDS)
-				AH.follow?.setStatusMin("dancing", 15 SECONDS)
-
-	change_speed
-		var/time_change
-
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			if(AH)
-				AH.time_per_count += time_change
-				boutput(holder.owner,"[AH.time_per_count/10] seconds per count. ([60/(AH.time_per_count/10)] BPM)")
-
-		faster
-			name = "Faster"
-			icon_state = "fast"
-			time_change = -0.5
-
-		slower
-			name = "Slower"
-			icon_state = "slow"
-			time_change = 0.5
-
-/datum/targetable/dancing/nc2s
-	style = "NC2S"
-
-	var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
-											"[EAST]"=list(-20,-1),
-											"[SOUTH]"=list(-4,12),
-											"[WEST]"=list(20,1),
-											)
-
-	proc/basic(var/mob/dancer, loop=1)
-		var/datum/abilityHolder/dancing/AH = holder
-		if(dancer==AH.lead)
-			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
-		if(!dancer)
-			return
-
-		var/datum/dance_transform/D = new(dancer, turn_offsets)
-		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
-		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
-		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 8)
-		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
-
-	proc/closed_left_turn(var/mob/dancer, loop=1)
-		var/datum/abilityHolder/dancing/AH = holder
-		if(dancer==AH.lead)
-			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
-		if(!dancer)
-			return
-
-		var/datum/dance_transform/D = new(dancer, turn_offsets)
-		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
-		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
-		D.do_turn(dancer, AH.lead, 90)
-		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
-
-		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 16)
-		animate(time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 2)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
-
-	proc/grapevine(var/mob/dancer, loop=1)
-		var/datum/abilityHolder/dancing/AH = holder
-		if(dancer==AH.lead)
-			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
-		if(!dancer)
-			return
-
-		var/datum/dance_transform/D = new(dancer, turn_offsets)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 16)
-		animate(dancer, time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 2)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 16)
-		animate(time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 2)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
-
-	basic
-
-		name = "Basic"
-		icon_state = "basic"
-
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			basic(AH.lead, 1)
-			basic(AH.follow, 1)
-			..()
-
-	grapevine
-		name = "Grapevine"
-		icon_state = "grapevine"
-
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			grapevine(AH.lead, 1)
-			grapevine(AH.follow, 1)
-			..()
-
-	closed_left_turn
-		name = "Left Turn"
-		icon_state = "left_turn"
-
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			closed_left_turn(AH.lead, 1)
-			closed_left_turn(AH.follow, 1)
-			..()
-
-/datum/targetable/dancing/waltz
-	style = "Waltz"
-	var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
-											"[EAST]"=list(-4,-1),
-											"[SOUTH]"=list(-4,12),
-											"[WEST]"=list(4,1),
-											)
-
-
-	proc/box_step(var/mob/dancer, loop=1, turn)
-		var/datum/abilityHolder/dancing/AH = holder
-		if(dancer==AH.lead)
-			src.cooldown += BEAT_COUNT(6) - BEAT_COUNT(0.5)
-		if(!dancer)
-			return
-
-		var/datum/dance_transform/D = new(dancer, turn_offsets)
-		D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 9)
-		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 8)
-		if(turn)
-			D.do_turn(dancer, AH.lead, turn)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 1)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
-
-		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 7)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
-		if(turn)
-			D.do_turn(dancer, AH.lead, turn)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
-		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 1)
-		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
-
-	box_step
-		name = "Box Step"
-		icon_state = "box"
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			box_step(AH.lead, 1)
-			box_step(AH.follow, 1)
-			..()
-
-	turning_box
-		name = "Turning Box Step"
-		icon_state = "l_box"
-		cast(atom/target)
-			var/datum/abilityHolder/dancing/AH = holder
-			box_step(AH.lead, 1, 90)
-			box_step(AH.follow, 1, 90)
-			..()
-
-
-/datum/dance_transform
-	var/x_offset
-	var/y_offset
-	var/layer
-	var/dir
-	var/open_position = FALSE
-	var/list/turn_offsets
-
-	New(mob/M, turn_offsets)
-		. = ..()
-		src.x_offset = 0
-		src.y_offset = 0
-		src.dir = M.dir
-		src.turn_offsets = turn_offsets
-
-	proc/travel(mob/M, dance_dir, mob/lead, distance)
-		var/angle = dir_to_angle(M.dir)
-		switch(dance_dir)
-			if(DANCE_TRAVEL_FORWARD)
-				; //noop
-			if(DANCE_TRAVEL_RIGHT)
-				angle += 90
-			if(DANCE_TRAVEL_LEFT)
-				angle += -90
-			if(DANCE_TRAVEL_BACK)
-				angle += 180
-			if(DANCE_TRAVEL_FORWARD)
-				; //noop
-			if(DANCE_TRAVEL_AWAY)
-				angle += 180
-
-		if(M != lead) // follow
-			if( (dance_dir != DANCE_TRAVEL_TOWARD) && (dance_dir != DANCE_TRAVEL_AWAY))
-				angle += 180
-
-		src.x_offset = (distance*sin(angle))
-		src.y_offset = (distance*cos(angle))
-
-	proc/do_turn(mob/M, mob/lead, angle)
-		src.dir = turn(M.dir,angle)
-		if(M != lead) // follow
-			M.layer = lead.layer
-			if(dir & (SOUTH | EAST))
-				M.layer -= 0.1
-			else
-				M.layer += 0.1
-
-			if(length(src.turn_offsets))
-				src.x_offset = src.turn_offsets["[src.dir]"][1]
-				src.y_offset = src.turn_offsets["[src.dir]"][2]
-
-
-/datum/statusEffect/dancing
-	id = "dancing"
-	name = "Dancing"
-	maxDuration = 1 MINUTE
-	effect_quality = STATUS_QUALITY_NEUTRAL
-
-	onRemove()
-		. = ..()
-		if(ismob(owner))
-			var/mob/M = owner
-			animate(M, time=2 SECOND, pixel_x=0, pixel_y=0, easing = QUAD_EASING | EASE_OUT)
-
-#undef BEAT_COUNT
-#undef DANCE_TRAVEL_FORWARD
-#undef DANCE_TRAVEL_RIGHT
-#undef DANCE_TRAVEL_LEFT
-#undef DANCE_TRAVEL_BACK
-#undef DANCE_TRAVEL_TOWARD
-#undef DANCE_TRAVEL_AWAY
diff --git a/code/WorkInProgress/GerhazoStuff.dm b/code/WorkInProgress/GerhazoStuff.dm
index 2622d9c683566..2c7db4c640112 100644
--- a/code/WorkInProgress/GerhazoStuff.dm
+++ b/code/WorkInProgress/GerhazoStuff.dm
@@ -260,7 +260,7 @@
 	dissipation_rate = 5
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	implanted = null
 	casing = null
 
diff --git a/code/WorkInProgress/HaineWhatever.dm b/code/WorkInProgress/HaineWhatever.dm
index 6a19c1562b499..641198b6edaf6 100644
--- a/code/WorkInProgress/HaineWhatever.dm
+++ b/code/WorkInProgress/HaineWhatever.dm
@@ -1480,11 +1480,6 @@ TYPEINFO(/obj/item/gun/bling_blaster)
 	var/num2 = num2hex(hex2num(hexnum) - 554040)
 */
 
-/turf/simulated/tempstuff
-	name = "floor"
-	icon = 'icons/misc/HaineSpriteDump.dmi'
-	icon_state = "gooberything_small"
-
 /obj/item/blessed_ball_bearing
 	name = "blessed ball bearing" // fill claymores with them for all your nazi-vampire-protection needs
 	desc = "How can you tell it's blessed? Well, just look at it! It's so obvious!"
diff --git a/code/WorkInProgress/Hydrothings.dm b/code/WorkInProgress/Hydrothings.dm
index 7b4820cb70c3b..ff28c0d36379a 100644
--- a/code/WorkInProgress/Hydrothings.dm
+++ b/code/WorkInProgress/Hydrothings.dm
@@ -495,13 +495,6 @@
 				logTheThing(LOG_COMBAT, affected_mob, "was gibbed by the disease [name] at [log_loc(affected_mob)].")
 				affected_mob.gib()
 
-/obj/item/reagent_containers/food/snacks/candy/butterscotch
-	name = "butterscotch candy"
-	desc = "It's one of those old timey butterscotch candies like your grampa used to have."
-	real_name = "butterscotch"
-	icon_state = "butterscotch"
-	food_effects = list("food_energized")
-
 /obj/machinery/floorflusher/bathtub
 	name = "bathtub"
 	desc = "Now, that looks cosy!"
diff --git a/code/WorkInProgress/KatzStuff.dm b/code/WorkInProgress/KatzStuff.dm
index 8b6d2518188f2..395c3823e8c45 100644
--- a/code/WorkInProgress/KatzStuff.dm
+++ b/code/WorkInProgress/KatzStuff.dm
@@ -27,7 +27,7 @@
 	damage = 50
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_308
 	casing = /obj/item/casing/rifle
 
diff --git a/code/WorkInProgress/MarqStuff.dm b/code/WorkInProgress/MarqStuff.dm
index dfb9b3d61cd53..b0f6367cfa11b 100644
--- a/code/WorkInProgress/MarqStuff.dm
+++ b/code/WorkInProgress/MarqStuff.dm
@@ -573,7 +573,7 @@
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_STAB
 	implanted = null
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	icon_state = "arrow"
 
 	on_hit(var/atom/A, angle, var/obj/projectile/P)
@@ -758,6 +758,8 @@
 			if (aim)
 				spread_angle = (1 - aim.progress/max_draw) * spread_base
 				aim.state = ACTIONSTATE_FINISH
+			if (!aim.progress)
+				return
 			..()
 
 	alter_projectile(obj/projectile/P)
diff --git a/code/WorkInProgress/apiFallbackRoutes.dm b/code/WorkInProgress/apiFallbackRoutes.dm
deleted file mode 100644
index 371bdedd9856b..0000000000000
--- a/code/WorkInProgress/apiFallbackRoutes.dm
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-	These are fallback procs for all API functions that require it
-	This means that if the central server dies, this can pick up and do it's thang
-	Currently only bans exist here
-*/
-
-/proc/checkBanApiFallback(data)
-	var/database/db = new("data/localBans.db")
-
-	//Construct sql field search
-	var/searchSql = ""
-	var/list/prepared = new()
-	for (var/key in data)
-		if (key == "ckey" || key == "ip" || key == "compID")
-			var/param = data[key]
-			if (param)
-				searchSql += "[key] = ? OR "
-				prepared.Add(param)
-
-	searchSql = copytext(searchSql, 1, -4) //Remove the trailing ' OR '
-	var/sql = "SELECT * FROM bans WHERE removed = 0 AND ([searchSql]) ORDER BY id DESC"
-
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList += prepared
-	var/database/query/q = new(queryList)
-
-	var/list/returnData = new()
-
-	if(!q.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	var/count = 1
-	while(q.NextRow())
-		var/list/current = new()
-		var/list/row = q.GetRowData()
-		for (var/key in row)
-			current[key] = row[key]
-		returnData["[count]"] = current
-		count++
-
-	if (count == 1) //None found, tell the bans proc thus. yes i know 1 is weird for none, shush
-		returnData["none"] = "No results found"
-		return returnData
-
-	return returnData
-
-
-/proc/clearTempBansApiFallback()
-	var/database/db = new("data/localBans.db")
-
-	var/cminutes = (world.realtime / 10) / 60
-	var/sql = "UPDATE bans SET removed = 1 WHERE (timestamp > 0 AND ? >= timestamp) AND removed = 0"
-
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList.Add(cminutes)
-	var/database/query/q = new(queryList)
-
-	var/list/returnData = new()
-
-	if(!q.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	var/count = q.RowsAffected()
-
-	returnData["cleared"] = count
-	return returnData
-
-
-/proc/addBanApiFallback(data)
-	var/database/db = new("data/localBans.db")
-
-	//Check we dont already have this ban
-	var/sql = "SELECT * FROM bans WHERE ckey = ? AND compID = ? AND ip = ? AND removed = 0"
-	var/list/prepared = new()
-	prepared.Add(data["ckey"])
-	prepared.Add(data["compID"])
-	prepared.Add(data["ip"])
-
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList += prepared
-	var/database/query/q = new(queryList)
-
-	var/list/returnData = new()
-
-	if(!q.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	var/count = 0
-	while(q.NextRow())
-		count++
-		break
-
-	if (count)
-		returnData["showAdmins"] = 1
-		returnData["error"] = "Ban already exists for: Ckey: [data["ckey"]], compID: [data["compID"]] and IP: [data["ip"]]"
-		return returnData
-
-	//Add the ban
-	var/sql2 = "INSERT INTO bans (ckey, compID, ip, reason, akey, timestamp, previous, chain) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
-	var/list/prepared2 = new()
-	prepared2.Add(data["ckey"])
-	prepared2.Add(data["compID"])
-	prepared2.Add(data["ip"])
-	prepared2.Add(data["reason"])
-	prepared2.Add(data["akey"])
-	prepared2.Add(data["timestamp"])
-	prepared2.Add(data["previous"])
-	prepared2.Add(data["chain"])
-
-	var/list/queryList2 = new()
-	queryList2.Add(sql2)
-	queryList2 += prepared2
-	var/database/query/q2 = new(queryList2)
-
-	if(!q2.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	returnData["1"] = data
-	data["type"] = "add"
-	writeToBanLog(data)
-	return returnData
-
-
-/proc/editBanApiFallback(data)
-	var/database/db = new("data/localBans.db")
-
-	//Add the ban
-	var/sql = "UPDATE bans SET ckey = ?, compID = ?, ip = ?, reason = ?, akey = ?, timestamp = ? WHERE id = ?"
-	var/list/prepared = new()
-	prepared.Add(data["ckey"])
-	prepared.Add(data["compID"])
-	prepared.Add(data["ip"])
-	prepared.Add(data["reason"])
-	prepared.Add(data["akey"])
-	prepared.Add(data["timestamp"])
-	prepared.Add(data["id"])
-
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList += prepared
-	var/database/query/q = new(queryList)
-
-	var/list/returnData = new()
-
-	if(!q.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	if (q.RowsAffected() == 0) //Oh no nothing was changed that's PRETTY FUCKIN WEIRD
-		returnData["error"] = "Edit ban changed nothing for: Ckey: [data["ckey"]], compID: [data["compID"]] and IP: [data["ip"]]"
-		return returnData
-
-	returnData["1"] = data
-	data["type"] = "edit"
-	writeToBanLog(data)
-	return returnData
-
-
-/proc/deleteBanApiFallback(data)
-	var/database/db = new("data/localBans.db")
-
-	//Add the ban
-	var/sql = "UPDATE bans SET removed = 1 WHERE id = ?"
-	var/list/prepared = new()
-	prepared.Add(data["id"])
-
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList += prepared
-	var/database/query/q = new(queryList)
-
-	var/list/returnData = new()
-
-	if(!q.Execute(db))
-		returnData["error"] = "Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]"
-		return returnData
-
-	if (q.RowsAffected() == 0) //It wasn't removed that's also pretty fuckin weird
-		returnData["error"] = "Delete ban removed nothing for ID: [data["id"]]"
-		return returnData
-
-	returnData["1"] = data
-	data["type"] = "delete"
-	writeToBanLog(data)
-	return returnData
-
-
-//Internal proc for the ban panel to search through bans
-/proc/getBanApiFallback(searchCol="all", search="", order="DESC", offset=0, limit=10, sort="id", removed=0)
-
-	var/database/db = new("data/localBans.db")
-
-	//I COULD do field validation here but I really cannot be fucked
-
-	//Get the matched rows
-	var/list/prepArray = new()
-	var/sql = "SELECT * FROM bans WHERE removed = [removed]"
-	if (search && length(search) > 0)
-		sql += " AND ("
-		if (searchCol == "all")
-			var/val = search
-			sql += "ckey LIKE ? OR akey LIKE ? OR compID LIKE ? OR ip LIKE ? OR reason LIKE ?"
-			var/pSearch = val+"%"
-			prepArray.Add(pSearch, pSearch, pSearch, pSearch, pSearch) //this is so dumb
-		else
-			sql += searchCol + " LIKE ?"
-			prepArray.Add(search+"%")
-		sql += ")"
-
-	sql += " ORDER BY "+sort+" "+order+" LIMIT "+limit
-	var/list/queryList = new()
-	queryList.Add(sql)
-	queryList += prepArray
-	var/database/query/q = new(queryList)
-
-	if(!q.Execute(db))
-		logTheThing(LOG_DEBUG, null, "<b>Local Callback Error</b> - callback failed in <b>getBanApiFallback</b> with message: <b>Unable to query database</b>: \[[q.Error()]\] [q.ErrorMsg()]")
-		logTheThing(LOG_DIARY, null, "Local Callback Error - callback failed in getBanApiFallback with message: Unable to query database: \[[q.Error()]\] [q.ErrorMsg()]", "debug")
-		return 0
-
-	//We gotta put all our rows in a list so we can count them for pagination
-	var/list/returnData = new()
-	var/list/allRows = new()
-	while(q.NextRow())
-		var/list/row = q.GetRowData()
-		allRows += list(row)
-
-	var/totalBans = length(allRows)
-
-	//Now we get the subset of the returned rows and format them correctly
-	var/list/requested = allRows.Copy(offset, limit)
-	var/count = 1
-	for (var/key1 in requested)
-		var/list/current = new()
-		var/list/row = requested[count]
-		for (var/key2 in row)
-			current[key2] = row[key2]
-		returnData["[count]"] = current
-		count++
-
-	returnData["total"] = totalBans
-	returnData["cminutes"] = getWorldMins()
-	returnData["callback"] = "updateBans"
-
-	return json_encode(returnData)
-
-
-/proc/uploadLocalBans(F as file)
-	fcopy(F, "data/localBans.db")
diff --git a/code/WorkInProgress/artemis/GeneratePlanets.dm b/code/WorkInProgress/artemis/GeneratePlanets.dm
index 00dd760988e4b..494b37c0cecf9 100644
--- a/code/WorkInProgress/artemis/GeneratePlanets.dm
+++ b/code/WorkInProgress/artemis/GeneratePlanets.dm
@@ -29,7 +29,7 @@ var/list/planet_seeds = list()
 			var/num_to_place = PLANET_NUMPREFABS + GALAXY.Rand.xor_rand(0, PLANET_NUMPREFABSEXTRA)
 			for (var/n = 1, n <= num_to_place, n++)
 				game_start_countdown?.update_status("Setting up planet level...\n(Prefab [n]/[num_to_place])")
-				var/datum/mapPrefab/planet/M = pick_map_prefab(/datum/mapPrefab/planet)
+				var/datum/mapPrefab/planet/M = pick_map_prefab(/datum/mapPrefab/planet, wanted_tags_any=PREFAB_PLANET)
 				if (M)
 					var/maxX = (world.maxx - M.prefabSizeX - PLANET_MAPBORDER)
 					var/maxY = (world.maxy - M.prefabSizeY - PLANET_MAPBORDER)
@@ -253,6 +253,9 @@ var/global/datum/planetManager/PLANET_LOCATIONS = new /datum/planetManager()
 	else if(istype(generator, /datum/map_generator/forest_generator) && prob(95))
 		planet_area.area_parallax_render_source_group = new /datum/parallax_render_source_group/planet/forest()
 
+	else if(istype(generator, /datum/map_generator/lavamoon_generator) && prob(95))
+		planet_area.area_parallax_render_source_group = new /datum/parallax_render_source_group/planet/lava_moon()
+
 	// Occlude overlays on edges
 	if(planet_area.area_parallax_render_source_group)
 		planet_area.no_prefab_ref.area_parallax_render_source_group = planet_area.area_parallax_render_source_group
@@ -293,7 +296,7 @@ var/global/datum/planetManager/PLANET_LOCATIONS = new /datum/planetManager()
 	var/failsafe = 800
 	//Make it interesting, slap some prefabs on that thing
 	for (var/n = 1, n <= prefabs_to_place && failsafe-- > 0)
-		var/datum/mapPrefab/planet/P = pick_map_prefab(/datum/mapPrefab/planet)
+		var/datum/mapPrefab/planet/P = pick_map_prefab(/datum/mapPrefab/planet, wanted_tags_any=PREFAB_PLANET)
 		if (P)
 			var/maxX = (region.bottom_left.x + region.width - P.prefabSizeX - AST_MAPBORDER)
 			var/maxY = (region.bottom_left.y + region.height - P.prefabSizeY - AST_MAPBORDER)
diff --git a/code/WorkInProgress/blueprints.dm b/code/WorkInProgress/blueprints.dm
index be38fa1e386f2..7f1d6b2b7149a 100644
--- a/code/WorkInProgress/blueprints.dm
+++ b/code/WorkInProgress/blueprints.dm
@@ -541,7 +541,7 @@
 	/obj/machinery/portable_atmospherics, \
 	/obj/machinery/ai_status_display, \
 	/obj/securearea, \
-	/obj/submachine/mixer, \
+	/obj/machinery/mixer, \
 	/obj/submachine/foodprocessor, \
 	\
 )
@@ -555,7 +555,7 @@
 )
 
 #define WHITELIST_TURFS list(/turf/simulated)
-#define BLACKLIST_TURFS list(/turf/simulated/floor/specialroom/sea_elevator_shaft)
+#define BLACKLIST_TURFS list(/turf/simulated/floor/specialroom/sea_elevator_shaft, /turf/simulated/shuttle, /turf/simulated/floor/shuttle, /turf/simulated/wall/auto/shuttle)
 
 /datum/abcu_blueprint
 	var/cost_metal = 0
@@ -992,6 +992,7 @@ proc/delete_abcu_blueprint(mob/user, var/browse_all_users = FALSE)
 		return
 
 	dropped(mob/user as mob)
+		. = ..()
 		removeOverlays()
 		selecting = 0
 		qdel(corner1img)
diff --git a/code/WorkInProgress/cabinet.dm b/code/WorkInProgress/cabinet.dm
index ec0a7b4c818ca..3cf1501075c48 100644
--- a/code/WorkInProgress/cabinet.dm
+++ b/code/WorkInProgress/cabinet.dm
@@ -262,12 +262,12 @@
 /obj/cabinet/taffy // for psychiatrists to prescribe
 
 	New()
-		slots["1"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/cherry(src)
-		slots["2"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/watermelon(src)
-		slots["3"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/blueraspberry(src)
-		slots["4"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/cherry(src)
-		slots["5"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/watermelon(src)
-		slots["6"] = new /obj/item/reagent_containers/food/snacks/candy/taffy/blueraspberry(src)
+		slots["1"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/cherry(src)
+		slots["2"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/watermelon(src)
+		slots["3"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/blueraspberry(src)
+		slots["4"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/cherry(src)
+		slots["5"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/watermelon(src)
+		slots["6"] = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/blueraspberry(src)
 		rebuildOverlays()
 		return ..()
 
diff --git a/code/WorkInProgress/construction/tools.dm b/code/WorkInProgress/construction/tools.dm
index ef04bf6aef38d..b74319f2e3232 100644
--- a/code/WorkInProgress/construction/tools.dm
+++ b/code/WorkInProgress/construction/tools.dm
@@ -610,6 +610,8 @@ TYPEINFO(/obj/item/room_planner)
 			T = get_turf(T)
 		if (!T || !mode)
 			return 0
+		if (GET_DIST(T, user) > 3)
+			return 0
 
 		if (mode == "restore original") //For those who want to undo the carnage
 			if (istype(T, /turf/simulated/floor))
diff --git a/code/WorkInProgress/factionReputation.dm b/code/WorkInProgress/factionReputation.dm
index 1bdd2729480f8..ccd053f86ab8d 100644
--- a/code/WorkInProgress/factionReputation.dm
+++ b/code/WorkInProgress/factionReputation.dm
@@ -159,9 +159,9 @@
 
 	proc/get_reputation(var/client/client = null, var/include_modifiers = 1)
 		var/modifiers = get_modifiers(client)
-		if(!client || !client.cloud_available())
+		if(!client)
 			return default_rep + (include_modifiers ? modifiers : 0)
-		var/val = client.cloud_get("rep_[lowertext(id)]")
+		var/val = client.player.cloudSaves.getData("rep_[lowertext(id)]")
 		if(val == null)
 			set_reputation(client, default_rep, 1)
 			val = default_rep
@@ -171,10 +171,10 @@
 		return val
 
 	proc/set_reputation(var/client/client = null, var/amt = 0, var/absolute = 0)
-		if(!client || !client.cloud_available())
+		if(!client)
 			return 0
 		var/curr = (absolute ? 0 : get_reputation(client, 0))
-		client.cloud_put("rep_[lowertext(id)]", (absolute ? amt : (curr + amt)))
+		client.player.cloudSaves.putData("rep_[lowertext(id)]", (absolute ? amt : (curr + amt)))
 		return 0
 
 	proc/get_Nanotrasen_rank_string(var/client = null, var/include_modifiers = 1)
diff --git a/code/WorkInProgress/flourish.dm b/code/WorkInProgress/flourish.dm
index c43cb99d01d1f..33456be85ca84 100644
--- a/code/WorkInProgress/flourish.dm
+++ b/code/WorkInProgress/flourish.dm
@@ -172,7 +172,7 @@ var/list/possible_lost_items = list(
 	/obj/item/reagent_containers/food/snacks/onionchips,
 	/obj/item/reagent_containers/food/snacks/chips,
 	/obj/item/reagent_containers/food/snacks/candy/nougat,
-	/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+	/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 	/obj/item/kitchen/peach_rings,
 	/obj/item/reagent_containers/food/snacks/cookie/dog,
 	/obj/item/toy/plush/small/bee,
diff --git a/code/WorkInProgress/racing.dm b/code/WorkInProgress/racing.dm
index 2291f08ba16a7..094be777c047c 100644
--- a/code/WorkInProgress/racing.dm
+++ b/code/WorkInProgress/racing.dm
@@ -38,7 +38,8 @@
 
 /obj/racing_powerup_spawner
 	name = "PowerUpSpawner"
-	icon = 'icons/Testing/atmos_testing.dmi'
+	icon = 'icons/map-editing/mapping_helpers.dmi'
+	icon_state = "spawner"
 	anchored = ANCHORED
 	density = 0
 	opacity = 0
diff --git a/code/WorkInProgress/tarmStuff.dm b/code/WorkInProgress/tarmStuff.dm
index 70e5babb2fbcf..8e621067b0d51 100644
--- a/code/WorkInProgress/tarmStuff.dm
+++ b/code/WorkInProgress/tarmStuff.dm
@@ -45,7 +45,7 @@
 	shot_sound = 'sound/weapons/optio.ogg'
 	implanted = null
 	armor_ignored = 0.66
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	shot_volume = 66
 	window_pass = 1
 
@@ -137,7 +137,7 @@
 	casing = /obj/item/casing/cannon
 	damage = 125
 	implanted = /obj/item/implant/projectile/rakshasa
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	goes_through_walls = 1
 	pierces = -1
 
@@ -238,7 +238,7 @@
 	shot_volume = 66
 	dissipation_delay = 10
 	dissipation_rate = 5
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 
 	small
 		shot_sound = 'sound/weapons/9x19NATO.ogg'
@@ -351,7 +351,7 @@
 	precalculated = 0
 	shot_volume = 100
 	shot_sound = 'sound/weapons/gyrojet.ogg'
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 
 	on_launch(obj/projectile/O)
 		O.internal_speed = projectile_speed
@@ -413,7 +413,7 @@
 	dissipation_delay = 5
 	dissipation_rate = 5
 	implanted = /obj/item/implant/projectile/bullet_50
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/deagle
 	shot_sound = 'sound/weapons/deagle.ogg'
 
@@ -455,7 +455,7 @@
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	implanted = null
 
 	on_hit(atom/hit)
diff --git a/code/area.dm b/code/area.dm
index 3e86c8b3bba93..52b16a05e8660 100644
--- a/code/area.dm
+++ b/code/area.dm
@@ -1687,18 +1687,10 @@ ABSTRACT_TYPE(/area/sim)
 	name = "Vspace area 1"
 	icon_state = "simA1"
 
-/area/sim/a1entry
-	name = "Vspace area 1 Entry"
-	icon_state = "simA1E"
-
 /area/sim/area2
 	name = "Vspace area 2"
 	icon_state = "simA2"
 
-/area/sim/a2entry
-	name = "Vspace area 2 Entry"
-	icon_state = "simA2E"
-
 /area/sim/bball
 	name = "B-Ball Court"
 	icon_state="vr"
@@ -2899,6 +2891,11 @@ ABSTRACT_TYPE(/area/station/medical)
 	name = "Medbay Operating Theater"
 	icon_state = "medbay_surgery"
 
+/area/station/medical/medbay/reception
+	name = "Medbay Reception"
+	icon_state = "medbooth"
+	sound_environment = 3
+
 /area/station/medical/medbay/surgery/storage
 	name = "Medical Storage"
 	icon_state = "blue"
@@ -2939,13 +2936,13 @@ ABSTRACT_TYPE(/area/station/medical)
 	name = "Morgue"
 	icon_state = "morgue"
 	sound_environment = 3
-	station_map_colour = MAPC_MEDICAL
+	station_map_colour = MAPC_MORGUE
 
 /area/station/medical/crematorium
 	name = "Crematorium"
 	icon_state = "morgue"
 	sound_environment = 3
-	station_map_colour = MAPC_MEDICAL
+	station_map_colour = MAPC_MORGUE
 
 /area/station/medical/medbooth
 	name = "Medical Booth"
diff --git a/code/client.dm b/code/client.dm
index f859337c62419..2fdd7d6e88afb 100644
--- a/code/client.dm
+++ b/code/client.dm
@@ -299,9 +299,9 @@
 			return
 
 	Z_LOG_DEBUG("Client/New", "[src.ckey] - Checking bans")
-	var/isbanned = checkBan(src.ckey, src.computer_id, src.address, record = 1)
+	var/list/checkBan = bansHandler.check(src.ckey, src.computer_id, src.address)
 
-	if (isbanned)
+	if (checkBan)
 		Z_LOG_DEBUG("Client/New", "[src.ckey] - Banned!!")
 		logTheThing(LOG_DIARY, null, "Failed Login: [constructTarget(src,"diary")] - Banned", "access")
 		if (announce_banlogin) message_admins(SPAN_INTERNAL("Failed Login: <a href='?src=%admin_ref%;action=notes;target=[src.ckey]'>[src]</a> - Banned (IP: [src.address], ID: [src.computer_id])"))
@@ -319,7 +319,7 @@
 								</head>
 								<body>
 									<h1>You have been banned.</h1>
-									<span class='banreason'>"Reason: [isbanned].")]</span><br>
+									<span class='banreason'>Reason: [checkBan["message"]]</span><br>
 									If you believe you were unjustly banned, head to <a target="_blank" href=\"https://forum.ss13.co\">the forums</a> and post an appeal.<br>
 									<b>If you believe this ban was not meant for you then please appeal regardless of what the ban message or length says!</b>
 								</body>
@@ -338,6 +338,10 @@
 		SPAWN(-1)
 			src.chatOutput.start()
 
+	// Record a login, sets player.id, which is used by almost every future API call for a player
+	// So we need to do this early, and outside of a spawn
+	src.player.record_login()
+
 	//admins and mentors can enter a server through player caps.
 	if (init_admin())
 		boutput(src, "<span class='ooc adminooc'>You are an admin! Time for crime.</span>")
@@ -374,7 +378,6 @@
 		var/image/I = globalImages[key]
 		src << I
 
-
 	Z_LOG_DEBUG("Client/New", "[src.ckey] - ok mostly done")
 
 	SPAWN(0)
@@ -459,32 +462,25 @@
 
 		ircbot.event("login", src.key)
 		//Cloud data
-#ifdef LIVE_SERVER
-		if (cdn)
-			if(!cloud_available())
-				src.player.cloud_fetch()
-#else
-		// dev server, uses local save file to simulate clouddata
-		if (src.player.cloud_fetch()) // might needlessly reload, but whatever.
-#endif
-			if(cloud_available())
-				src.antag_tokens = src.player?.get_antag_tokens()
-				src.load_persistent_bank()
-				var/decoded = cloud_get("audio_volume")
-				if(decoded)
-					var/list/old_volumes = volumes.Copy()
-					volumes = json_decode(decoded)
-					for(var/i = length(volumes) + 1; i <= length(old_volumes); i++) // default values for channels not in the save
-						if(i - 1 == VOLUME_CHANNEL_EMOTE) // emote channel defaults to game volume
-							volumes += src.getRealVolume(VOLUME_CHANNEL_GAME)
-						else
-							volumes += old_volumes[i]
+		if (!src.player.cloudSaves.loaded)
+			src.player.cloudSaves.fetch()
+		src.antag_tokens = src.player?.get_antag_tokens()
+		src.load_persistent_bank()
+		var/decoded = src.player.cloudSaves.getData("audio_volume")
+		if(decoded)
+			var/list/old_volumes = volumes.Copy()
+			volumes = json_decode(decoded)
+			for(var/i = length(volumes) + 1; i <= length(old_volumes); i++) // default values for channels not in the save
+				if(i - 1 == VOLUME_CHANNEL_EMOTE) // emote channel defaults to game volume
+					volumes += src.getRealVolume(VOLUME_CHANNEL_GAME)
+				else
+					volumes += old_volumes[i]
 
-				// Show login notice, if one exists
-				src.show_login_notice()
+			// Show login notice, if one exists
+			src.show_login_notice()
 
-				// Set screen saturation
-				src.set_saturation(text2num(cloud_get("saturation")))
+			// Set screen saturation
+			src.set_saturation(text2num(src.player.cloudSaves.getData("saturation")))
 
 		src.mob.reset_keymap()
 
@@ -720,25 +716,16 @@
 
 
 /client/proc/load_persistent_bank()
-	persistent_bank_valid = cloud_available()
-
-	persistent_bank = cloud_get("persistent_bank") ? text2num(cloud_get("persistent_bank")) : FALSE
+	persistent_bank_valid = TRUE
 
-	if(!persistent_bank && cloud_available())
-		logTheThing(LOG_DEBUG, src, "first cloud_get failed but cloud is available!")
-		persistent_bank += text2num( cloud_get("persistent_bank") || "0" )
-		var/failed = cloud_put( "persistent_bank", persistent_bank )
-		if(failed)
-			logTheThing(LOG_DEBUG, src, "Failed to store persistent cash in the ~cloud~: [failed]")
-
-	persistent_bank_item = cloud_get("persistent_bank_item")
-
-	if(!persistent_bank_item && cloud_available())
-		persistent_bank_item = cloud_get("persistent_bank_item")
-		var/failed = cloud_put( "persistent_bank_item", persistent_bank_item )
-		if(failed)
-			logTheThing(LOG_DEBUG, src, "Failed to store persistent bank item in the ~cloud~: [failed]")
+#ifdef BONUS_POINTS
+	persistent_bank = 99999999
+#else
+	var/cPersistentBank = src.player.cloudSaves.getData("persistent_bank")
+	persistent_bank = cPersistentBank ? text2num(cPersistentBank) : FALSE
+#endif
 
+	persistent_bank_item = src.player.cloudSaves.getData("persistent_bank_item")
 
 //MBC TODO : PERSISTENTBANK_VERSION_MIN, MAX FOR BANKING SO WE CAN WIPE AWAY EVERYONE'S HARD WORK WITH A SINGLE LINE OF CODE CHANGE
 // defines are already set, just do the checks here ok
@@ -747,17 +734,14 @@
 /client/proc/set_last_purchase(datum/bank_purchaseable/purchase)
 	if (!purchase || purchase == 0 || !purchase.carries_over)
 		persistent_bank_item = "none"
-		if( cloud_available() )
-			cloud_put( "persistent_bank_item", "none" )
+		src.player.cloudSaves.putData( "persistent_bank_item", "none" )
 	else
 		persistent_bank_item = purchase.name
-		if( cloud_available() )
-			cloud_put( "persistent_bank_item", persistent_bank_item )
+		src.player.cloudSaves.putData( "persistent_bank_item", persistent_bank_item )
 
 /client/proc/set_persistent_bank(amt as num)
 	persistent_bank = amt
-	if( cloud_available() )
-		cloud_put( "persistent_bank", amt )
+	src.player.cloudSaves.putData( "persistent_bank", amt )
 	/*
 	var/savefile/PB = LoadSavefile("data/PersistentBank.sav")
 	if (!PB) return
@@ -770,15 +754,14 @@
 		load_persistent_bank()
 		if(!persistent_bank_valid)
 			return
-	var/list/earnings = list((ckey) = list("persistent_bank" = list("command" = "add", "value" = amt)))
-	cloud_put_bulk(json_encode(earnings))
 	persistent_bank += amt
+	src.player.cloudSaves.putData("persistent_bank", persistent_bank)
 
 /client/proc/sub_from_bank(datum/bank_purchaseable/purchase)
 	add_to_bank(-purchase.cost)
 
 /client/proc/bank_can_afford(amt as num)
-	player.cloud_fetch_data_only()
+	player.cloudSaves.fetch()
 	load_persistent_bank()
 	var/new_bank_value = persistent_bank - amt
 	if (new_bank_value >= 0)
@@ -830,18 +813,19 @@ var/global/curr_day = null
 		var/cid = computer_id
 		SPAWN(0)
 			if (geoip_check(addr))
-				var/addData[] = new()
-				addData["ckey"] = ck
-				addData["compID"] = cid
-				addData["ip"] = addr
-				addData["reason"] = "Ban evader: computer ID collision." // haha get fucked
-				addData["akey"] = "Marquesas"
-				addData["mins"] = 0
 				var/slt = rand(600, 3000)
 				logTheThing(LOG_ADMIN, null, "Evasion geoip autoban triggered on [key], will execute in [slt / 10] seconds.")
 				message_admins("Autobanning evader [key] in [slt / 10] seconds.")
 				sleep(slt)
-				addBan(addData)
+				bansHandler.add(
+					"bot",
+					null,
+					ck,
+					cid,
+					addr,
+					"Ban evader: computer ID collision.",
+					FALSE
+				)
 
 /proc/geoip_check(var/addr)
 	set background = 1
@@ -1168,77 +1152,11 @@ var/global/curr_day = null
 		return 0
 	return (src.ckey in muted_keys) && muted_keys[src.ckey]
 
-/// Sets a cloud key value pair and sends it to goonhub
-/client/proc/cloud_put(key, value)
-	return src.player.cloud_put(key, value)
-
-/// Returns some cloud data on the client
-/client/proc/cloud_get(key)
-	return src.player.cloud_get(key)
-
-/// Returns 1 if you can set or retrieve cloud data on the client
-/client/proc/cloud_available()
-	return src.player.cloud_available()
-
 /client/proc/message_one_admin(source, message)
 	if(!src.holder)
 		return
 	boutput(src, replacetext(replacetext(message, "%admin_ref%", "\ref[src.holder]"), "%client_ref%", "\ref[src]"))
 
-/proc/add_test_screen_thing()
-	var/client/C = input("For who", "For who", null) in clients
-	var/wavelength_shift = input("Shift wavelength bounds by <x> nm, should be in the range of -370 to 370", "Wavelength shift", 0) as num
-	if (wavelength_shift < -370 || wavelength_shift > 370)
-		boutput(usr, SPAN_ADMIN("Invalid value."))
-		return
-	var/s_r = 0
-	var/s_g = 0
-	var/s_b = 0
-
-	// total range: 380 - 750 (range: 370nm)
-	// red: 570 - 750 (range: 180nm)
-	if (wavelength_shift < 0)
-		s_r = min(-wavelength_shift / 180 * 255, 255)
-	else if (wavelength_shift > 190)
-		s_r = min((wavelength_shift - 190) / 180 * 255, 255)
-	// green: 490 - 620 (range: 130nm)
-	if (wavelength_shift < -130)
-		s_g = min(-(wavelength_shift + 130) / 130 * 255, 255)
-	else if (wavelength_shift > 110)
-		s_g = min((wavelength_shift - 110) / 130 * 255, 255)
-	// blue: 380 - 500 (range: 120nm)
-	if (wavelength_shift < -250)
-		s_b = min(-(wavelength_shift + 250) / 120 * 255, 255)
-	else if (wavelength_shift > 0)
-		s_b = min(wavelength_shift / 120 * 255, 255)
-
-	var/subtr_color = rgb(s_r, s_g, s_b)
-
-	var/si_r = clamp(input("Red spectrum intensity (0-1)", "Intensity", 1.0) as num, 0, 1)
-	var/si_g = clamp(input("Green spectrum intensity (0-1)", "Intensity", 1.0) as num, 0, 1)
-	var/si_b = clamp(input("Blue spectrum intensity (0-1)", "Intensity", 1.0) as num, 0, 1)
-
-	var/multip_color = rgb(si_r * 255, si_g * 255, si_b * 255)
-
-	var/atom/movable/screen/S = new
-	S.icon = 'icons/mob/whiteview.dmi'
-	S.blend_mode = BLEND_SUBTRACT
-	S.color = subtr_color
-	S.layer = HUD_LAYER - 0.2
-	S.screen_loc = "SOUTH,WEST"
-	S.mouse_opacity = 0
-
-	C.screen += S
-
-	var/atom/movable/screen/M = new
-	M.icon = 'icons/mob/whiteview.dmi'
-	M.blend_mode = BLEND_MULTIPLY
-	M.color = multip_color
-	M.layer = HUD_LAYER - 0.1
-	M.screen_loc = "SOUTH,WEST"
-	M.mouse_opacity = 0
-
-	C.screen += M
 
 /client/verb/apply_depth_shadow()
 	set hidden = 1
@@ -1274,7 +1192,7 @@ var/global/curr_day = null
 	var/s = input("Enter a saturation % from 50-150. Default is 100.", "Saturation %", 100) as num
 	s = clamp(s, 50, 150) / 100
 	src.set_saturation(s)
-	src.cloud_put("saturation", s)
+	src.player.cloudSaves.putData("saturation", s)
 	boutput(usr, SPAN_NOTICE("You have changed your game saturation to [s * 100]%."))
 
 /client/proc/set_view_size(var/x, var/y)
diff --git a/code/datum.dm b/code/datum.dm
index 3c07b8a1cc12a..0958b50acdd27 100644
--- a/code/datum.dm
+++ b/code/datum.dm
@@ -2,8 +2,8 @@ TYPEINFO(/datum)
 	var/admin_spawnable = TRUE
 
 #ifdef IMAGE_DEL_DEBUG
-var/global/list/deletedImageData = new
-var/global/list/deletedImageIconStates = new
+var/global/list/deletedImageData = list()
+var/global/list/deletedImageIconStates = list()
 
 /image/Del()
 	deletedImageData.len++;
@@ -14,7 +14,7 @@ var/global/list/deletedImageIconStates = new
 #endif
 
 #ifdef DELETE_QUEUE_DEBUG
-var/global/list/deletedObjects = new
+var/global/list/deletedObjects = list()
 
 /datum/Del()
 	if(!("[src.type]" in deletedObjects))
diff --git a/code/datums/abilities/dancing.dm b/code/datums/abilities/dancing.dm
new file mode 100644
index 0000000000000..3b539c8d76268
--- /dev/null
+++ b/code/datums/abilities/dancing.dm
@@ -0,0 +1,501 @@
+#define DANCE_TRAVEL_FORWARD 1
+#define DANCE_TRAVEL_RIGHT 2
+#define DANCE_TRAVEL_LEFT 3
+#define DANCE_TRAVEL_BACK 4
+#define DANCE_TRAVEL_TOWARD 5
+#define DANCE_TRAVEL_AWAY 6
+
+#define BEAT_COUNT(_X) (AH.time_per_count * _X)
+
+/datum/abilityHolder/dancing
+	var/style = "Waltz"
+	var/list/styles = list("NC2S", "Waltz", "Salsa")
+	var/mob/lead
+	var/mob/follow
+	var/time_per_count = 3
+
+	onAttach(mob/to_whom)
+		. = ..()
+		src.addAbility(/datum/targetable/dancing/choose_style)
+		src.addAbility(/datum/targetable/dancing/rest)
+		src.addAbility(/datum/targetable/dancing/change_speed/faster)
+		src.addAbility(/datum/targetable/dancing/change_speed/slower)
+		for(var/move in childrentypesof(/datum/targetable/dancing/nc2s))
+			src.addAbility(move)
+		for(var/move in childrentypesof(/datum/targetable/dancing/waltz))
+			src.addAbility(move)
+		for(var/move in childrentypesof(/datum/targetable/dancing/salsa))
+			src.addAbility(move)
+
+
+/datum/targetable/dancing
+	icon = 'icons/mob/dance_ui.dmi'
+	var/style = null
+	var/list/static/follower_offsets = list("[NORTH]"=list(-4,-2),
+											"[EAST]"=list(-8,1),
+											"[SOUTH]"=list(4,2),
+											"[WEST]"=list(8,-1))
+
+	display_available()
+		var/datum/abilityHolder/dancing/AH = holder
+		var/mob/living/carbon/human/H = holder.owner
+		if(istype(H))
+			var/obj/item/shoes = H.get_slot(SLOT_SHOES)
+			if(istype(shoes, /obj/item/clothing/shoes/dress_shoes/dance))
+				. = TRUE
+			else
+				. = FALSE
+		else
+			. = TRUE
+
+		if(. && style)
+			. = style == AH.style
+
+	castcheck(atom/target)
+		. = ..()
+		if(.)
+			src.cooldown = 0
+
+		var/datum/abilityHolder/dancing/AH = holder
+		AH.lead = holder.owner
+		AH.follow = null
+		for (var/obj/item/grab/G in AH.lead?.equipped_list(check_for_magtractor = 0))
+			if (G.affecting.buckled) continue
+			AH.follow = G.affecting
+
+		var/reset_position = FALSE
+		if(AH.lead)
+			if((abs(AH.lead.pixel_x) + abs(AH.lead.pixel_y)) > 48)
+				reset_position = BEAT_COUNT(4)
+			else if(AH.follow && (abs(AH.lead.pixel_x - AH.follow.pixel_x ) + abs(AH.lead.pixel_y - AH.follow.pixel_y)) > 10 )
+				reset_position = BEAT_COUNT(4)
+			if(reset_position)
+				animate(AH.lead, time=reset_position, pixel_x=0, pixel_y = 0)
+
+		if(AH.follow && style)
+			if(reset_position || (AH.follow.dir != turn(AH.lead.dir,180)) || ((abs(AH.lead.pixel_x - AH.follow.pixel_x ) + abs(AH.lead.pixel_y - AH.follow.pixel_y))==0))
+				reset_position = max(reset_position, BEAT_COUNT(1))
+				AH.follow.dir = turn(AH.lead.dir,180)
+				AH.follow.layer = AH.lead.layer
+				if(AH.follow.dir & (SOUTH | EAST))
+					AH.follow.layer -= 0.1
+				else
+					AH.follow.layer += 0.1
+
+				animate(AH.follow, time=reset_position, pixel_x=follower_offsets["[AH.follow.dir]"][1], pixel_y = follower_offsets["[AH.follow.dir]"][2])
+
+
+	cast(atom/target)
+		. = ..()
+		var/datum/abilityHolder/dancing/AH = holder
+		if(AH)
+			var/duration = src.cooldown + 5 SECONDS
+			AH.lead.setStatusMin("dancing", duration)
+			AH.follow?.setStatusMin("dancing", duration)
+
+	choose_style
+		name = "Style"
+		icon_state = "style"
+		desc = "Choose from style of dance"
+		cooldown = 2 SECOND
+
+		cast(atom/target)
+			. = ..()
+			var/datum/abilityHolder/dancing/AH = holder
+			var/dance_style = tgui_input_list(holder.owner, "Select style", "Dance Selection", AH.styles)
+			if(dance_style in AH.styles)
+				AH.style = dance_style
+
+	rest
+		name = "Pause"
+		desc = "Maintain your current position"
+		icon_state = "pause"
+		cooldown = 10 SECOND
+
+		cast(atom/target)
+			. = ..()
+			var/datum/abilityHolder/dancing/AH = holder
+			if(AH)
+				AH.lead.setStatusMin("dancing", 15 SECONDS)
+				AH.follow?.setStatusMin("dancing", 15 SECONDS)
+
+	change_speed
+		var/time_change
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			if(AH)
+				AH.time_per_count += time_change
+				boutput(holder.owner,"[AH.time_per_count/10] seconds per count. ([60/(AH.time_per_count/10)] BPM)")
+
+		faster
+			name = "Faster"
+			icon_state = "fast"
+			time_change = -0.5
+
+		slower
+			name = "Slower"
+			icon_state = "slow"
+			time_change = 0.5
+
+/datum/targetable/dancing/nc2s
+	style = "NC2S"
+
+	var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
+											"[EAST]"=list(-20,-1),
+											"[SOUTH]"=list(-4,12),
+											"[WEST]"=list(20,1),
+											)
+
+	proc/basic(var/mob/dancer, loop=1)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
+		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 8)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
+
+	proc/closed_left_turn(var/mob/dancer, loop=1)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_AWAY, AH.lead, 3)
+		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_TOWARD, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
+		D.do_turn(dancer, AH.lead, 90)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
+
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 16)
+		animate(time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 2)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
+
+	proc/grapevine(var/mob/dancer, loop=1)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 16)
+		animate(dancer, time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 2)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 16)
+		animate(time=BEAT_COUNT(3), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 2)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = BACK_EASING | EASE_IN, flags=ANIMATION_RELATIVE)
+
+	basic
+
+		name = "Basic"
+		icon_state = "basic"
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			basic(AH.lead, 1)
+			basic(AH.follow, 1)
+			..()
+
+	grapevine
+		name = "Grapevine"
+		icon_state = "grapevine"
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			grapevine(AH.lead, 1)
+			grapevine(AH.follow, 1)
+			..()
+
+	closed_left_turn
+		name = "Left Turn"
+		icon_state = "left_turn"
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			closed_left_turn(AH.lead, 1)
+			closed_left_turn(AH.follow, 1)
+			..()
+
+/datum/targetable/dancing/waltz
+	style = "Waltz"
+	var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
+											"[EAST]"=list(-4,-1),
+											"[SOUTH]"=list(-4,12),
+											"[WEST]"=list(4,1),
+											)
+
+
+	proc/box_step(var/mob/dancer, loop=1, turn)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(6) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 9)
+		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 8)
+		if(turn)
+			D.do_turn(dancer, AH.lead, turn)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 1)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
+
+		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 7)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 8)
+		if(turn)
+			D.do_turn(dancer, AH.lead, turn)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 1)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING | EASE_OUT, flags=ANIMATION_RELATIVE)
+
+	box_step
+		name = "Box Step"
+		icon_state = "box"
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			box_step(AH.lead, 1)
+			box_step(AH.follow, 1)
+			..()
+
+	turning_box
+		name = "Turning Box Step"
+		icon_state = "l_box"
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			box_step(AH.lead, 1, 90)
+			box_step(AH.follow, 1, 90)
+			..()
+
+/datum/targetable/dancing/salsa
+	style = "Salsa"
+
+	// var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
+	// 										"[EAST]"=list(-4,-1),
+	// 										"[SOUTH]"=list(-4,12),
+	// 										"[WEST]"=list(4,1),
+	// 										)
+
+	var/list/static/turn_offsets = list("[NORTH]"=list(4,-12),
+											"[EAST]"=list(-20,-1),
+											"[SOUTH]"=list(-4,12),
+											"[WEST]"=list(20,1),
+											)
+
+	proc/basic(var/mob/dancer, loop=1, flare)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/flare_dir = dancer.dir
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 3)
+		if(flare == AH.lead && dancer==AH.lead)
+			flare_dir = turn(flare_dir, 90)
+		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 3)
+		if(flare == AH.lead && dancer==AH.lead)
+			flare_dir = turn(flare_dir, 180)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		if(flare == AH.lead && dancer==AH.lead)
+			flare_dir = turn(flare_dir, 90)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+		D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 3)
+		if(flare == AH.follow && dancer==AH.follow)
+			flare_dir = turn(flare_dir, 90)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 3)
+		if(flare == AH.follow && dancer==AH.follow)
+			flare_dir = turn(flare_dir, 180)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		if(flare == AH.follow && dancer==AH.follow)
+			flare_dir = turn(flare_dir, 90)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+	proc/side_basic(var/mob/dancer, loop=1)
+		var/datum/abilityHolder/dancing/AH = holder
+		if(dancer==AH.lead)
+			src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+		if(!dancer)
+			return
+
+		var/datum/dance_transform/D = new(dancer, turn_offsets)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 3)
+		animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+		D.travel(dancer, DANCE_TRAVEL_RIGHT, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		D.travel(dancer, DANCE_TRAVEL_LEFT, AH.lead, 3)
+		animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+		animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+
+	// proc/cross_body(var/mob/dancer, loop=1)
+	// 	var/datum/abilityHolder/dancing/AH = holder
+	// 	if(dancer==AH.lead)
+	// 		src.cooldown += BEAT_COUNT(8) - BEAT_COUNT(0.5)
+	// 	if(!dancer)
+	// 		return
+
+	// 	var/flare_dir = dancer.dir
+
+	// 	var/datum/dance_transform/D = new(dancer, turn_offsets)
+	// 	D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 3)
+	// 	animate(dancer, time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, loop=loop, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+	// 	D.travel(dancer, DANCE_TRAVEL_BACK, AH.lead, 3)
+	// 	animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+	// 	// if(dancer==AH.lead)
+	// 	// 	flare_dir = turn(flare_dir, 90)
+	// 	animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+	// 	D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 3)
+	// 	animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=flare_dir, loop=loop, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+	// 	D.do_turn(dancer, AH.lead, 180)
+	// 	D.travel(dancer, DANCE_TRAVEL_FORWARD, AH.lead, 3)
+	// 	animate(time=BEAT_COUNT(1), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+	// 	animate(time=BEAT_COUNT(2), pixel_x=D.x_offset, pixel_y=D.y_offset, dir=D.dir, easing = QUAD_EASING, flags=ANIMATION_RELATIVE)
+
+
+
+	basic
+
+		name = "Basic"
+		icon_state = "basic"
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			var/flare = null
+			if(prob(33))
+				if(prob(50))
+					flare = AH.lead
+				else
+					flare = AH.follow
+			basic(AH.lead, 1, flare)
+			basic(AH.follow, 1, flare)
+			..()
+
+	side_basic
+
+		name = "Side Basic"
+		icon_state = "side_basic"
+
+		cast(atom/target)
+			var/datum/abilityHolder/dancing/AH = holder
+			side_basic(AH.lead, 1)
+			side_basic(AH.follow, 1)
+			..()
+
+	// cross_body
+	// 	name = "Cross Body Lead"
+	// 	icon_state = "basic"
+
+	// 	cast(atom/target)
+	// 		var/datum/abilityHolder/dancing/AH = holder
+	// 		cross_body(AH.lead, 1)
+	// 		cross_body(AH.follow, 1)
+	// 		..()
+
+
+/datum/dance_transform
+	var/x_offset
+	var/y_offset
+	var/layer
+	var/dir
+	var/open_position = FALSE
+	var/list/turn_offsets
+
+	New(mob/M, turn_offsets)
+		. = ..()
+		src.x_offset = 0
+		src.y_offset = 0
+		src.dir = M.dir
+		src.turn_offsets = turn_offsets
+
+	proc/travel(mob/M, dance_dir, mob/lead, distance)
+		var/angle = dir_to_angle(src.dir)
+
+		switch(dance_dir)
+			if(DANCE_TRAVEL_FORWARD)
+				; //noop
+			if(DANCE_TRAVEL_RIGHT)
+				angle += 90
+			if(DANCE_TRAVEL_LEFT)
+				angle += -90
+			if(DANCE_TRAVEL_BACK)
+				angle += 180
+			if(DANCE_TRAVEL_FORWARD)
+				; //noop
+			if(DANCE_TRAVEL_AWAY)
+				angle += 180
+
+		if(M != lead) // follow
+			if( (dance_dir != DANCE_TRAVEL_TOWARD) && (dance_dir != DANCE_TRAVEL_AWAY))
+				angle += 180
+
+		src.x_offset = (distance*sin(angle))
+		src.y_offset = (distance*cos(angle))
+
+	proc/do_turn(mob/M, mob/lead, angle, skip_offset)
+		src.dir = turn(M.dir,angle)
+		if(M != lead) // follow
+			M.layer = lead.layer
+			if(dir & (SOUTH | EAST))
+				M.layer -= 0.1
+			else
+				M.layer += 0.1
+
+			if(!skip_offset && length(src.turn_offsets))
+				src.x_offset = src.turn_offsets["[src.dir]"][1]
+				src.y_offset = src.turn_offsets["[src.dir]"][2]
+
+
+/datum/statusEffect/dancing
+	id = "dancing"
+	name = "Dancing"
+	maxDuration = 1 MINUTE
+	effect_quality = STATUS_QUALITY_NEUTRAL
+
+	onRemove()
+		. = ..()
+		if(ismob(owner))
+			var/mob/M = owner
+			animate(M, time=2 SECOND, pixel_x=0, pixel_y=0, easing = QUAD_EASING | EASE_OUT)
+
+#undef BEAT_COUNT
+#undef DANCE_TRAVEL_FORWARD
+#undef DANCE_TRAVEL_RIGHT
+#undef DANCE_TRAVEL_LEFT
+#undef DANCE_TRAVEL_BACK
+#undef DANCE_TRAVEL_TOWARD
+#undef DANCE_TRAVEL_AWAY
diff --git a/code/datums/abilities/vampiric_thrall.dm b/code/datums/abilities/vampiric_thrall.dm
index b5269d9f1d8dc..16c9057e5895b 100644
--- a/code/datums/abilities/vampiric_thrall.dm
+++ b/code/datums/abilities/vampiric_thrall.dm
@@ -45,35 +45,105 @@
 	regenRate = 0
 	tabName = "Thrall"
 	notEnoughPointsMessage = SPAN_ALERT("You need more blood to use this ability.")
+#ifdef BONUS_POINTS
+	points = 300
+#else
 	points = 0
+#endif
 	remove_on_clone = TRUE
 
 	var/mob/vamp_isbiting = null
 	var/datum/abilityHolder/vampire/master
 
-	var/last_blood_points = 0
+#ifdef RP_MODE
+	var/blood_decay = 0.125
+#else
+	var/blood_decay = 0.25
+#endif
+	var/blood_to_health_scalar = 0.75 //! 200 blood = 150 health
+	var/min_max_health = 40 //! Minimum health we can get to via blood loss. also lol
 
-	onLife(var/mult = 1) //failsafe for UI not doing its update correctly elsewhere
+	///Counter that ticks up as you spend time away from your vampire before you start to loose blood
+	var/grace_count = 0
+	///How many (mult adjusted) life ticks before you start to lose blood
+	var/grace_limit = 1.5
+
+	onLife(var/mult = 1)
 		.= 0
-		if (ishuman(owner))
-			var/mob/living/carbon/human/H = owner
-			if (istype(H.mutantrace, /datum/mutantrace/vampiric_thrall))
-				var/datum/mutantrace/vampiric_thrall/V = H.mutantrace
+		var/mob/living/owner_mob = src.owner
+		if (!istype(owner_mob))
+			return
+		//normal bleeding
+		if (owner_mob.bleeding)
+			src.points -= src.blood_decay * owner_mob.bleeding
+
+		//passive decay
+		src.points -= blood_decay * mult
+		src.points = max(0,src.points)
 
-				if (last_blood_points != V.blood_points)
-					last_blood_points = V.blood_points
-					src.updateText(0, src.x_occupied, src.y_occupied)
+		if (ON_COOLDOWN(src.owner, "thrall_blood_waste", 5 SECONDS))
+			src.update_max_health()
+			return
 
+		var/dist
+		if (!master?.owner || get_z(master.owner) != get_z(src.owner))
+			dist = 60
+		else
+			dist = GET_DIST(get_turf(master.owner), get_turf(src.owner))
+		dist = min(dist, 100)
+		if (dist > 15)
+			if (src.grace_count > src.grace_limit)
+				var/blood_loss = 15 + dist/2
+				src.blood_waste(blood_loss)
+			else
+				src.grace_count += mult
+				boutput(src.owner, SPAN_ALERT("You feel an insistent tug, you need to stick closer to your master."))
+				src.waste_effect(0.2)
+		else
+			src.grace_count = 0 //we're within range, reset
+
+		src.update_max_health()
+
+	proc/update_max_health()
+		src.owner.max_health = src.points * blood_to_health_scalar
+		src.owner.max_health = max(src.min_max_health, src.owner.max_health)
+		global.health_update_queue |= src.owner
+		src.updateText(0, src.x_occupied, src.y_occupied) //might not be needed?
+
+	///Lose an amount of blood, first from points then from bloodstream
+	proc/blood_waste(blood_loss)
+		var/overflow_loss = blood_loss - src.points //the amount not covered by our points
+		src.points = max(0, src.points - blood_loss)
+		var/mob/living/living_owner = src.owner //the calling proc can be responsible for checking this, it needs some responsibility in its life
+		if (src.points <= 0 && living_owner.blood_volume < 200)
+			boutput(src.owner, SPAN_ALERT(SPAN_BOLD(pick("You feel your master's power fading...", "NEED. BLOOOD.", "You can feel death trying to take you back."))))
+		else
+			boutput(src.owner, SPAN_ALERT(SPAN_BOLD("You feel [pick("your gut wrench", "your skin bleed", "your heart twist")] as you stray too far from your master.")))
+		if (overflow_loss > 0)
+			bleed(src.owner, overflow_loss, 5, get_turf(src.owner)) //take it from our actual bloodstream instead
+			src.waste_effect(1)
+		else
+			var/obj/decal/cleanable/blood/blood_decal = make_cleanable(/obj/decal/cleanable/blood, get_turf(src.owner))
+			if (src.owner.bioHolder)
+				blood_decal.blood_DNA = src.owner.bioHolder.Uid
+				blood_decal.blood_type = src.owner.bioHolder.bloodType
+			src.waste_effect(0.4)
+
+	proc/waste_effect(severity)
+		if (!src.owner.client)
+			return
+		var/original_color = src.owner.client.color
+		var/flash_color = rgb(255, (1-severity) * 255, (1-severity) * 255)
+		animate(src.owner.client, color=flash_color, time=0.4 SECONDS)
+		animate(color=original_color, time=1.5 SECONDS)
+		if (severity > 0.2)
+			playsound(src.owner, 'sound/effects/heartbeat.ogg', 60, FALSE)
 
 	onAbilityStat() // In the 'Vampire' tab.
 		..()
 		.= list()
-		if (ishuman(owner))
-			var/mob/living/carbon/human/H = owner
-			if (istype(H.mutantrace, /datum/mutantrace/vampiric_thrall))
-				var/datum/mutantrace/vampiric_thrall/V = H.mutantrace
-				.["Blood:"] = round(V.blood_points)
-				.["Max HP:"] = round(H.max_health)
+		.["Blood:"] = round(src.points)
+		.["Max HP:"] = round(src.owner.max_health)
 
 	proc/msg_to_master(var/msg)
 		if (master)
@@ -81,17 +151,12 @@
 
 	proc/change_vampire_blood(var/change = 0, var/total_blood = 0, var/set_null = 0)
 		if(!total_blood)
-			var/mob/living/carbon/human/M = owner
-			if(istype(M) && istype(M.mutantrace, /datum/mutantrace/vampiric_thrall))
-				var/datum/mutantrace/vampiric_thrall/V = M.mutantrace
-				if (V.blood_points < 0)
-					V.blood_points = 0
-					if (haine_blood_debug) logTheThing(LOG_DEBUG, M, "<b>HAINE BLOOD DEBUG:</b> [M]'s blood_points dropped below 0 and was reset to 0")
-
-				if (set_null)
-					V.blood_points = 0
-				else
-					V.blood_points = max(V.blood_points + change, 0)
+			if (src.points < 0)
+				src.points = 0
+			if (set_null)
+				src.points = 0
+			else
+				src.points = max(src.points + change, 0)
 
 
 /datum/targetable/vampiric_thrall
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index 0e02fd8dc14b3..4dea4bde30e2a 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -104,6 +104,9 @@
 		//remove from list
 		src.registered_racks -= dead_rack
 
+		//clear abilities
+		dead_rack.ai_abilities = list()
+
 		//find all connected borgs and remove their connection too
 		for (var/mob/living/silicon/R in mobs)
 			if (isghostdrone(R))
@@ -113,7 +116,8 @@
 				R.playsound_local(R, 'sound/misc/lawnotify.ogg', 100, flags = SOUND_IGNORE_SPACE)
 				R.show_text("<h3>ERROR: Lost connection to law rack. No laws detected!</h3>", "red")
 				logTheThing(LOG_STATION,  R, "[R.name] loses connection to the rack [constructName(dead_rack)] and now has no laws")
-
+				if(isAI(R))
+					dead_rack.reset_ai_abilities(R)
 		for (var/mob/living/intangible/aieye/E in mobs)
 			if(E.mainframe?.law_rack_connection == dead_rack)
 				E.mainframe.law_rack_connection = null
@@ -121,19 +125,20 @@
 				logTheThing(LOG_STATION, E.mainframe, "[E.mainframe.name] loses connection to the rack [constructName(dead_rack)] and now has no laws")
 
 /* Law Rack Corruption */
-	proc/corrupt_all_racks(picked_law = "Beep repeatedly.", replace = TRUE)
+	proc/corrupt_all_racks(picked_law = "Beep repeatedly.", replace = TRUE, law_number = null)
 		for(var/obj/machinery/lawrack/R in src.registered_racks)
 			if(istype(R,/obj/machinery/lawrack/syndicate))
 				continue //sadly syndie law racks must be immune to corruptions, because nobody can actually get at them to fix them.
-			var/num = rand(1, 3)
-			if(R.cause_law_glitch(picked_law, num, replace))
+			if (isnull(law_number))
+				law_number = rand(1, 3)
+			if(R.cause_law_glitch(picked_law, law_number, replace))
 				R.UpdateLaws()
 				if (replace)
-					logTheThing(LOG_ADMIN, null, "Law Rack Corruption replaced inherent AI law [num]: [picked_law]")
-					message_admins("Law Rack Corruption replaced inherent law [num]: [picked_law]")
+					logTheThing(LOG_ADMIN, null, "Law Rack Corruption replaced inherent AI law [law_number]: [picked_law]")
+					message_admins("Law Rack Corruption replaced inherent law [law_number]: [picked_law]")
 				else
-					logTheThing(LOG_ADMIN, null, "Law Rack Corruption added supplied AI law to law number [num]: [picked_law]")
-					message_admins("Law Rack Corruption added supplied law [num]: [picked_law]")
+					logTheThing(LOG_ADMIN, null, "Law Rack Corruption added supplied AI law to law number [law_number]: [picked_law]")
+					message_admins("Law Rack Corruption added supplied law [law_number]: [picked_law]")
 
 
 /* General ai_law functions */
diff --git a/code/datums/antag_weighting.dm b/code/datums/antag_weighting.dm
index c7e7b553843a1..41341e0e157cc 100644
--- a/code/datums/antag_weighting.dm
+++ b/code/datums/antag_weighting.dm
@@ -29,20 +29,20 @@ var/global/datum/antagWeighter/antagWeighter
 	 * @param string ckey Ckey of the person we're looking up
 	 * @return list List of history details
 	 */
-	proc/history(role = "", ckey = "")
-		if (!role || !ckey)
-			throw EXCEPTION("Incorrect parameters given")
+	// proc/history(role = "", ckey = "")
+	// 	if (!role || !ckey)
+	// 		throw EXCEPTION("Incorrect parameters given")
 
-		var/list/response = apiHandler.queryAPI("antags/history", list(
-			"role" = role,
-			"players" = ckey,
-			"amount" = 1
-		), 1)
+	// 	var/list/response = apiHandler.queryAPI("antags/history", list(
+	// 		"role" = role,
+	// 		"players" = ckey,
+	// 		"amount" = 1
+	// 	), 1)
 
-		if (response["error"])
-			throw EXCEPTION(response["error"])
+	// 	if (response["error"])
+	// 		throw EXCEPTION(response["error"])
 
-		return response["history"]
+	// 	return response["history"]
 
 	/**
 	* Get the entire antag selection history for a player (all roles, all modes)
@@ -50,27 +50,27 @@ var/global/datum/antagWeighter/antagWeighter
 	* @param string ckey Ckey of the person we're looking up
 	* @return list List of history details
 	*/
-	proc/completeHistory(ckey = "")
-		if (!ckey)
-			throw EXCEPTION("No ckey given")
-		if (!config.goonhub_api_token)
-			throw EXCEPTION("You must have the goonhub API token to use this command!")
+	// proc/completeHistory(ckey = "")
+	// 	if (!ckey)
+	// 		throw EXCEPTION("No ckey given")
+	// 	if (!config.goonhub_api_token)
+	// 		throw EXCEPTION("You must have the goonhub API token to use this command!")
 
-		var/list/response
-		try
-			response = apiHandler.queryAPI("antags/completeHistory", list(
-				"player" = ckey,
-			), 1)
-		catch ()
-			throw EXCEPTION("API is currently having issues, try again later")
+	// 	var/list/response
+	// 	try
+	// 		response = apiHandler.queryAPI("antags/completeHistory", list(
+	// 			"player" = ckey,
+	// 		), 1)
+	// 	catch ()
+	// 		throw EXCEPTION("API is currently having issues, try again later")
 
-		if (response["error"])
-			throw EXCEPTION(response["error"])
+	// 	if (response["error"])
+	// 		throw EXCEPTION(response["error"])
 
-		if (length(response["history"]) < 1)
-			throw EXCEPTION("No history for that player")
+	// 	if (length(response["history"]) < 1)
+	// 		throw EXCEPTION("No history for that player")
 
-		return response["history"]
+	// 	return response["history"]
 
 	/**
 	 * Simulates a history response from the API, so local development doesn't fuck up
@@ -166,7 +166,7 @@ var/global/datum/antagWeighter/antagWeighter
 	 * @param list pool List of minds under consideration for antag picking
 	 * @param string role Name of the antag role we're picking for (e.g. traitor, spy_thief)
 	 * @param int amount Max amount of players to choose for this role
-	 * @param boolean recordChosen When true, triggers a src.recordMultiple() for the chosen players
+	 * @param boolean recordChosen When true, triggers a src.record() for the chosen players
 	 * @return list List of minds chosen
 	 */
 	proc/choose(list/pool = list(), role = "", amount = 0, recordChosen = 0)
@@ -207,17 +207,19 @@ var/global/datum/antagWeighter/antagWeighter
 			src.debugLog("Sending payload: [json_encode(apiPayload)]")
 
 		var/list/response
-		if (config.goonhub_api_token && apiHandler.enabled)
-			//YO API WADDUP
-			try
-				response = apiHandler.queryAPI("antags/history", apiPayload, 1)
-			catch ()
-				//If the API is in the process of failing, we need to gracefully fail so that SOME antags can be picked
-				response = src.simulateHistory(role, ckeyMinds)
-
-		else
-			//Fallback for no API set, for local dev (or API is unavailable)
-			response = src.simulateHistory(role, ckeyMinds)
+		// if (config.goonhub_api_token && apiHandler.enabled)
+		// 	//YO API WADDUP
+		// 	try
+		// 		response = apiHandler.queryAPI("antags/history", apiPayload, 1)
+		// 	catch ()
+		// 		out(world, "FAILED AAAAAAAA")
+		// 		//If the API is in the process of failing, we need to gracefully fail so that SOME antags can be picked
+		// 		response = src.simulateHistory(role, ckeyMinds)
+
+		// else
+		// 	//Fallback for no API set, for local dev (or API is unavailable)
+		// 	response = src.simulateHistory(role, ckeyMinds)
+		response = src.simulateHistory(role, ckeyMinds)
 
 		if (response && response["error"])
 			throw EXCEPTION(response["error"])
@@ -269,10 +271,11 @@ var/global/datum/antagWeighter/antagWeighter
 
 		//Shortcut to record selection for players chosen
 		if (recordChosen)
-			var/list/record = list()
+			// var/list/record = list()
 			for (var/datum/mind/M in chosen)
-				record[M.ckey] = role
+				// record[M.ckey] = role
 				logTheThing(LOG_DEBUG, null, "<b>AntagWeighter</b> Selected [M.ckey] for [role]. (Weight: [chosen[M]["weight"]], Seen: [chosen[M]["seen"]])")
+				src.record(role, M.get_player())
 			for (var/datum/mind/M in pool)
 				if(!M.ckey)
 					continue
@@ -281,7 +284,7 @@ var/global/datum/antagWeighter/antagWeighter
 				logTheThing(LOG_DEBUG, null, "<b>AntagWeighter</b> Did <b>not</b> select [M.ckey] for [role]. (Weight: [history[M.ckey]["weight"]], Seen: [history[M.ckey]["seen"]])")
 
 
-			src.recordMultiple(players = record)
+			// src.recordMultiple(players = record)
 
 		return chosen
 
@@ -290,23 +293,30 @@ var/global/datum/antagWeighter/antagWeighter
 	 * Records an antag selection for a single player
 	 *
 	 * @param string role Name of the antag role we're recording a selection for
-	 * @param string ckey Ckey of the player
+	 * @param string P The player being recorded
 	 * @param boolean latejoin Whether this record is a latejoin antag selection
 	 * @return null
 	 */
-	proc/record(role = "", ckey = "", latejoin = 0)
-		if (!role || !ckey)
+	proc/record(role = "", datum/player/P = null, latejoin = 0)
+		if (!role || !P)
 			throw EXCEPTION("Incorrect parameters given")
 
 		if (src.debug)
-			src.debugLog("Recording selection of role: [role] for ckey: [ckey]. latejoin: [latejoin]")
+			src.debugLog("Recording selection of role: [role] for player: [P.ckey]. latejoin: [latejoin]")
 
-		//Fire and forget
-		apiHandler.queryAPI("antags/record", list(
-			"role" = role,
-			"players" = ckey,
-			"latejoin" = latejoin
-		))
+		try
+			var/datum/apiRoute/players/antags/addAntag = new
+			addAntag.buildBody(
+				P.id,
+				roundId,
+				role,
+				latejoin,
+				null
+			)
+			apiHandler.queryAPI(addAntag)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "<b>AntagWeighter</b> Failed to record antag to API because: [error.message]")
 
 
 	/**
@@ -319,23 +329,23 @@ var/global/datum/antagWeighter/antagWeighter
 	 * 		)
 	 * @return null
 	 */
-	proc/recordMultiple(list/players = list())
-		if (!players.len)
-			throw EXCEPTION("Incorrect parameters given")
-
-		if (src.debug)
-			src.debugLog("Recording multiple selections for: [json_encode(players)]")
-
-		//Build an API-friendly list of players
-		var/list/apiPlayers = list()
-		var/count = 0
-		for (var/ckey in players)
-			apiPlayers["players\[[count]]\[role]"] = players[ckey]
-			apiPlayers["players\[[count]]\[ckey]"] = ckey
-			count++
-
-		if (src.debug)
-			src.debugLog("Players list sending to API: [json_encode(apiPlayers)]")
-
-		//Fire and forget
-		apiHandler.queryAPI("antags/record", apiPlayers)
+	// proc/recordMultiple(list/players = list())
+	// 	if (!players.len)
+	// 		throw EXCEPTION("Incorrect parameters given")
+
+	// 	if (src.debug)
+	// 		src.debugLog("Recording multiple selections for: [json_encode(players)]")
+
+	// 	//Build an API-friendly list of players
+	// 	var/list/apiPlayers = list()
+	// 	var/count = 0
+	// 	for (var/ckey in players)
+	// 		apiPlayers["players\[[count]]\[role]"] = players[ckey]
+	// 		apiPlayers["players\[[count]]\[ckey]"] = ckey
+	// 		count++
+
+	// 	if (src.debug)
+	// 		src.debugLog("Players list sending to API: [json_encode(apiPlayers)]")
+
+	// 	//Fire and forget
+	// 	apiHandler.queryAPI("antags/record", apiPlayers)
diff --git a/code/datums/api_handler.dm b/code/datums/api_handler.dm
deleted file mode 100644
index 818e6f77b157e..0000000000000
--- a/code/datums/api_handler.dm
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-* Handles queries to the goonhub universal API
-*/
-
-var/global/datum/apiHandler/apiHandler
-
-/datum/apiHandler
-	var/enabled = 1 //is the api handler available for use? only set to false if we try a bunch of times and still fail
-	//retry handling
-	var/maxApiRetries = 5 //how many times should a query attempt to run before giving up
-	var/apiRetryDelay = 10 //base delay between query attempts, gets multiplied by attempt number
-
-	var/emergency_shutoff_counter = 0 // how many api errors there have been since a successful one
-	var/lazy_concurrent_counter = 0 // lazy count of how many are up/down
-	var/lazy_waiting_counter = 0 // number of how many are waiting
-
-	New()
-		..()
-		if (!config.goonhub_api_endpoint)
-			src.enabled = 0
-			logTheThing(LOG_DEBUG, null, "Goonhub endpoint doesn't exist, disabled api handler")
-			logTheThing(LOG_DIARY, null, "Goonhub endpoint doesn't exist, disabled api handler", "debug")
-
-
-	// Suppress errors on local environments, as it's spammy and local devs probably won't have the config for API connectivity to work
-	proc/apiError(message = "", forceErrorException = 0)
-		if (config.server_id != "local" || forceErrorException)
-			throw EXCEPTION(message)
-
-
-	/**
-	 * Retries an API query in the event of failure
-	 *
-	 * @givenArgs (list) arglist of the failed query attempt
-	 * @attempt (int) number of times we've attempted this query
-	 * @return (*) the result of another query attempt
-	 */
-	proc/retryApiQuery(list/givenArgs, attempt = 1)
-		//the sleep delay grows as attempts increases
-		sleep(apiRetryDelay * attempt)
-		//arglist() doesnt recognise named params lol
-		givenArgs[4] = attempt + 1
-		return src.queryAPI(arglist(givenArgs))
-
-
-	/**
-	 * Increments or resets the recent error counter
-	 *
-	 * @reset (bool) reset the counter (eg successful request)
-	 */
-	proc/trackRecentError(reset = 0)
-		if (reset)
-			emergency_shutoff_counter = 0
-			return
-
-		emergency_shutoff_counter++
-		if (enabled && emergency_shutoff_counter > 50)
-			logTheThing(LOG_DEBUG, null, "DISABLING API REQUESTS - Too many errors.")
-			logTheThing(LOG_DIARY, null, "DISABLING API REQUESTS - Too many errors.", "debug")
-			message_admins("API requests have been disabled due to too many errors (check logs).")
-			enabled = 0
-			SPAWN(60 SECONDS)
-				emergency_shutoff_counter = 0
-				logTheThing(LOG_DEBUG, null, "RE-ENABLING API REQUESTS - Cooldown expired.")
-				logTheThing(LOG_DIARY, null, "RE-ENABLING API REQUESTS - Cooldown expired.", "debug")
-				message_admins("API requests have been re-enabled after waiting.")
-				enabled = 1
-		return
-
-
-	/**
-	 * Constructs a query to send to the goonhub web API
-	 *
-	 * @route (string) requested route e.g. bans/check
-	 * @query (list) query arguments to be passed along to route
-	 * @forceResponse (boolean) will force the API server to return the requested data from the route rather than hitting hubCallback later on
-	 * @attempt (int) number of times we've attempted this query
-	 * @return (list|boolean) list containing parsed data response from api, 1 if forceResponse is false
-	 *
-	 */
-	proc/queryAPI(route = "", query = list(), forceResponse = 0, attempt = 1, forceErrorException = 0)
-		if (!enabled || !route)
-			src.apiError("API Error: Cancelled query due to [!enabled ? "disabled apiHandler" : "missing route parameter"]", forceErrorException)
-			return
-
-		var/req = "[config.goonhub_api_endpoint]/[route]/?[query ? "[list2params(query)]&" : ""]" //Necessary
-		req += "[forceResponse ? "bypass=1&" : ""]" //Force a response RIGHT NOW y/n
-		req += "data_server=[serverKey]&data_id=[config.server_id]&" //Append server number and ID
-		req += "data_version=[config.goonhub_api_version]&" //Append API version
-		var/safeReq = req //for outputting errors without the auth code
-		req += "auth=[md5(config.goonhub_api_token)]" //Append auth code
-
-		lazy_waiting_counter++
-		while (lazy_concurrent_counter > 50)
-			// if we have too many requests out, just wait a little to let some finish
-			sleep(rand(1, 5))
-		lazy_waiting_counter--
-
-
-		// Fetch via HTTP from goonhub
-		lazy_concurrent_counter++
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, req, "", "")
-		request.begin_async()
-		var/time_started = TIME
-		UNTIL(request.is_complete() || (TIME - time_started) > 10 SECONDS)
-		if(!request.is_complete())
-			// to whoever looks at this next: uhh, do we have to do any cleanup of
-			// these requests or will it just solve itself?
-			trackRecentError()
-			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: Request timed out during <b>[safeReq]</b> (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])")
-			logTheThing(LOG_DIARY, null, "API Error: Request timed out during [safeReq] (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])", "debug")
-
-			// This one is over so we can clear it now
-			lazy_concurrent_counter--
-			if (attempt < maxApiRetries)
-				return retryApiQuery(args, attempt = attempt)
-
-			src.apiError("API Error: Request timed out during [safeReq]")
-			return 1
-
-		// Otherwise the request did finish so we can lower this
-		lazy_concurrent_counter--
-		var/datum/http_response/response = request.into_response()
-
-		if (response.errored || !response.body)
-			trackRecentError()
-			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: No response from server during query [!response.body ? "during" : "to"] <b>[safeReq]</b> (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])")
-			logTheThing(LOG_DIARY, null, "API Error: No response from server during query [!response.body ? "during" : "to"] [safeReq] (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])", "debug")
-
-			if (attempt < maxApiRetries)
-				return retryApiQuery(args, attempt = attempt)
-
-			src.apiError("API Error: No response from server during query [!response.body ? "during" : "to"] [safeReq]")
-
-		// At this point we assume the request was a success, so reset the error counter
-		trackRecentError(TRUE)
-
-		if (forceResponse)
-			// Parse the response
-			var/list/data
-
-			try
-				data = json_decode(response.body)
-			catch
-				// pass
-
-			if (!data)
-				logTheThing(LOG_DEBUG, null, "<b>API Error</b>: JSON decode error during <b>[safeReq]</b> (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])")
-				logTheThing(LOG_DIARY, null, "API Error: JSON decode error during [safeReq] (Attempt: [attempt]; recent errors: [emergency_shutoff_counter], concurrent: [lazy_concurrent_counter])", "debug")
-
-				if (attempt < maxApiRetries)
-					return retryApiQuery(args, attempt = attempt)
-
-				src.apiError("API Error: JSON decode error during [safeReq]")
-
-			return data
-		return 1
diff --git a/code/datums/browserOutput.dm b/code/datums/browserOutput.dm
index 543463e8d8cbf..fb5928019b382 100644
--- a/code/datums/browserOutput.dm
+++ b/code/datums/browserOutput.dm
@@ -119,7 +119,7 @@ var/global
 		return
 
 /// Called on chat output done-loading by JS.
-/datum/chatOutput/proc/doneLoading(ua)
+/datum/chatOutput/proc/doneLoading()
 	if (src.owner && !src.loaded)
 		src.loaded = 1
 		winset(src.owner, "browseroutput", "is-disabled=false")
@@ -129,23 +129,13 @@ var/global
 			for (var/list/message in src.messageQueue)
 				boutput(src.owner, message["message"], message["group"])
 		src.messageQueue = null
-		if (ua)
-			//For persistent user tracking
-			apiHandler?.queryAPI("versions/add", list(
-				"ckey" = src.owner.ckey,
-				"userAgent" = ua,
-				"byondMajor" = src.owner.byond_version,
-				"byondMinor" = src.owner.byond_build
-			))
-
-		else
-			src.sendClientData()
-			/* WIRE TODO: Fix this so the CDN dying doesn't break everyone
-			SPAWN(1 MINUTE) //60 seconds
-				if (!src.cookieSent) //Client has very likely futzed with their local html/js chat file
-					boutput(src.owner, "<div class='fatalError'>Chat file tampering detected. Closing connection.</div>")
-					del(src.owner)
-			*/
+		src.sendClientData()
+		/* WIRE TODO: Fix this so the CDN dying doesn't break everyone
+		SPAWN(1 MINUTE) //60 seconds
+			if (!src.cookieSent) //Client has very likely futzed with their local html/js chat file
+				boutput(src.owner, "<div class='fatalError'>Chat file tampering detected. Closing connection.</div>")
+				del(src.owner)
+		*/
 
 /// Called in update_admins()
 /datum/chatOutput/proc/loadAdmin()
@@ -192,17 +182,18 @@ var/global
 		if (connData && islist(connData) && length(connData) && connData["connData"])
 			src.connectionHistory = connData["connData"] //lol fuck
 			var/list/found = new()
+			var/list/checkBan = null
 			for (var/i = src.connectionHistory.len; i >= 1; i--)
 				var/list/row = src.connectionHistory[i]
 				if (!row || length(row) < 3 || (!row["ckey"] && !row["compid"] && !row["ip"])) //Passed malformed history object
 					return
-				if (checkBan(row["ckey"], row["compid"], row["ip"]))
+				checkBan = bansHandler.check(row["ckey"], row["compid"], row["ip"])
+				if (checkBan)
 					found = row
 					break
 
 			//Uh oh this fucker has a history of playing on a banned account!!
 			if (length(found) && found["ckey"] != src.owner.ckey)
-				//TODO: add a new evasion ban for the CURRENT client details, using the matched row details
 				message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
 				logTheThing(LOG_DEBUG, src.owner, "has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
 				logTheThing(LOG_DIARY, src.owner, "has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])", "debug")
@@ -212,17 +203,19 @@ var/global
 					var/ircmsg[] = new()
 					ircmsg["key"] = owner.key
 					ircmsg["name"] = stripTextMacros(owner.mob.name)
-					ircmsg["msg"] = "has a cookie from banned account [found["ckey"]](IP: [found["ip"]], CompID: [found["compID"]])"
+					ircmsg["msg"] = "has a cookie from banned account [found["ckey"]](IP: [found["ip"]], CompID: [found["compid"]])"
 					ircbot.export_async("admin", ircmsg)
 
-				var/banData[] = new()
-				banData["ckey"] = src.owner.ckey
-				banData["compID"] = (found["compID"] == "N/A" ? "N/A" : src.owner.computer_id) // don't add CID if original ban doesn't have one
-				banData["akey"] = "Auto Banner"
-				banData["ip"] = (found["ip"] == "N/A" ? "N/A" : src.owner.address) // don't add IP if original ban doesn't have one
-				banData["reason"] = "\[Evasion Attempt\] Previous ckey: [found["ckey"]]"
-				banData["mins"] = 0
-				addBan(banData)
+				//Add evasion ban details
+				var/datum/apiModel/Tracked/BanResource/ban = checkBan["ban"]
+				bansHandler.addDetails(
+					ban.id,
+					TRUE,
+					"bot",
+					src.owner.ckey,
+					isnull(found["compid"]) ? null : src.owner.computer_id,
+					isnull(found["ip"]) ? null : src.owner.address
+				)
 	src.cookieSent = 1
 
 /datum/chatOutput/proc/getContextFlags()
@@ -269,7 +262,7 @@ var/global
 		if ("boot")
 			src.owner.cmd_boot(targetMob)
 		if ("ban")
-			src.owner.addBanDialog(targetMob)
+			src.owner.addBanTemp(targetMob)
 		if ("gib")
 			src.owner.cmd_admin_gib(targetMob)
 			logTheThing(LOG_ADMIN, src.owner, "gibbed [constructTarget(targetMob,"admin")].")
diff --git a/code/datums/buildmode.dm b/code/datums/buildmode.dm
index 1e0c479f76b6a..0234cf750b01c 100644
--- a/code/datums/buildmode.dm
+++ b/code/datums/buildmode.dm
@@ -240,7 +240,7 @@ ABSTRACT_TYPE(/datum/buildmode)
 	qdel(src.buildmode)
 	src.buildmode = new(src)
 	src.player.buildmode = src.buildmode
-	src.cloud_put("buildmode", null)
+	src.player.cloudSaves.putData("buildmode", null)
 	src.togglebuildmode()
 
 /client/proc/togglebuildmode()
diff --git a/code/datums/cloud_saves.dm b/code/datums/cloud_saves.dm
new file mode 100644
index 0000000000000..e0369d69eb127
--- /dev/null
+++ b/code/datums/cloud_saves.dm
@@ -0,0 +1,272 @@
+/**
+ * Manage cloud save files and data for a player
+ */
+
+
+#define CLOUD_SAVES_SIMULATED_CLOUD "data/simulated_cloud.json"
+
+/datum/cloudSaves
+	var/datum/player/player = null
+	var/list/data = list()
+	var/list/saves = list()
+	var/loaded = FALSE // Have we performed an initial fetch
+	var/simulating = FALSE
+
+	New(datum/player/player)
+		..()
+		src.player = player
+		#ifndef LIVE_SERVER
+		src.simulating = TRUE
+		#endif
+
+	/// Get the simulated cloud information for this player, for local development
+	proc/getSimulatedCloud()
+		if (fexists(CLOUD_SAVES_SIMULATED_CLOUD))
+			var/simulatedContent = file2text(CLOUD_SAVES_SIMULATED_CLOUD)
+			if (simulatedContent)
+				var/list/simulatedCloud = json_decode(simulatedContent)
+				var/list/playerCloud = simulatedCloud["[src.player.ckey]"]
+				if (playerCloud)
+					if (!("data" in playerCloud)) playerCloud["data"] = list()
+					if (!("saves" in playerCloud)) playerCloud["saves"] = list()
+					return playerCloud
+
+		return list("data" = list(), "saves" = list())
+
+	/// Put new data into the simulated cloud for this player, for local development
+	proc/putSimulatedCloud(type, key, value)
+		var/list/simulatedCloud = list()
+		var/list/playerCloud = list("data" = list(), "saves" = list())
+		if (fexists(CLOUD_SAVES_SIMULATED_CLOUD))
+			var/simulatedContent = file2text(CLOUD_SAVES_SIMULATED_CLOUD)
+			if (simulatedContent)
+				simulatedCloud = json_decode(simulatedContent)
+				playerCloud = simulatedCloud["[src.player.ckey]"]
+
+		if (!playerCloud) playerCloud = list()
+		if (!("data" in playerCloud)) playerCloud["data"] = list()
+		if (!("saves" in playerCloud)) playerCloud["saves"] = list()
+		playerCloud[type][key] = value
+		simulatedCloud["[src.player.ckey]"] = playerCloud
+		rustg_file_write(json_encode(simulatedCloud), CLOUD_SAVES_SIMULATED_CLOUD)
+
+	/// Delete data from the simulated cloud for this player, for local development
+	proc/deleteSimulatedCloud(type, key)
+		var/list/simulatedCloud = list()
+		var/list/playerCloud = list("data" = list(), "saves" = list())
+		if (fexists(CLOUD_SAVES_SIMULATED_CLOUD))
+			var/simulatedContent = file2text(CLOUD_SAVES_SIMULATED_CLOUD)
+			if (simulatedContent)
+				simulatedCloud = json_decode(simulatedContent)
+				playerCloud = simulatedCloud["[src.player.ckey]"]
+
+		if (key in playerCloud[type])
+			var/list/thing = playerCloud[type]
+			thing.Remove(key)
+			playerCloud[type] = thing
+
+		simulatedCloud["[src.player.ckey]"] = playerCloud
+		rustg_file_write(json_encode(simulatedCloud), CLOUD_SAVES_SIMULATED_CLOUD)
+
+	/// Fetch all cloud data and files associated with this player
+	proc/fetch()
+		if (src.simulating)
+			// Local fallback, load data from JSON file
+			var/list/playerCloud = src.getSimulatedCloud()
+			src.data = playerCloud["data"]
+			src.saves = playerCloud["saves"]
+			src.loaded = TRUE
+
+		else
+			if (!src.player.id) return FALSE
+			try
+				var/datum/apiRoute/players/saves/get/getSavesAndData = new
+				getSavesAndData.queryParams = list("player_id" = src.player.id)
+				var/datum/apiModel/GetPlayerSaves/savesAndData = apiHandler.queryAPI(getSavesAndData)
+				var/list/newData = list()
+				for (var/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/data in savesAndData.data)
+					newData[data.key] = data.value
+				var/list/newSaves = list()
+				for (var/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/save in savesAndData.saves)
+					newSaves[save.name] = save.data
+
+				src.data = newData
+				src.saves = newSaves
+				src.loaded = TRUE
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, src.player.ckey, "failed to have their cloud data loaded: [error.message]")
+
+		return TRUE
+
+	/// Save new cloud data for this player
+	proc/putData(key, value)
+		if (src.simulating)
+			// Local fallback, update JSON file
+			src.putSimulatedCloud("data", key, value)
+
+		else
+			if (!src.player?.id)
+				logTheThing(LOG_DEBUG, src.player?.ckey, "No player ID found in cloud data put [key], [value]")
+				return
+			try
+				var/datum/apiRoute/players/saves/data/post/addPlayerData = new
+				addPlayerData.buildBody(src.player.id, key, value)
+				apiHandler.queryAPI(addPlayerData)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, src.player.ckey, "failed to put data into their cloud. Key: [key]. Value: [value]. Error: [error.message]")
+				return FALSE
+
+		src.data[key] = value
+		return TRUE
+
+	/// Save a new cloud file for this player
+	proc/putSave(name, data)
+		if (src.simulating)
+			// Local fallback, update JSON file
+			src.putSimulatedCloud("saves", name, data)
+
+		else
+			if (!src.player.id) return
+			try
+				var/datum/apiRoute/players/saves/file/post/addPlayerSave = new
+				addPlayerSave.buildBody(src.player.id, name, data)
+				apiHandler.queryAPI(addPlayerSave)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, src.player.ckey, "failed to put save into their cloud. Error: [error.message]")
+				return FALSE
+
+		src.saves[name] = data
+		return TRUE
+
+	/// Delete cloud data for this player
+	proc/deleteData(key)
+		if (src.simulating)
+			// Local fallback, update JSON file
+			src.deleteSimulatedCloud("data", key)
+
+		else
+			if (!src.player.id) return
+			try
+				var/datum/apiRoute/players/saves/data/delete/deletePlayerData = new
+				deletePlayerData.buildBody(src.player.id, key)
+				apiHandler.queryAPI(deletePlayerData)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, src.player.ckey, "failed to delete data from their cloud. Error: [error.message]")
+				return FALSE
+
+		src.data.Remove(key)
+		return TRUE
+
+	/// Delete a cloud file for this player
+	proc/deleteSave(name)
+		if (src.simulating)
+			// Local fallback, update JSON file
+			src.deleteSimulatedCloud("saves", name)
+
+		else
+			if (!src.player.id) return
+			try
+				var/datum/apiRoute/players/saves/file/delete/deletePlayerSave = new
+				deletePlayerSave.buildBody(src.player.id, name)
+				apiHandler.queryAPI(deletePlayerSave)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, src.player.ckey, "failed to delete save from their cloud. Error: [error.message]")
+				return FALSE
+
+		src.saves.Remove(name)
+		return TRUE
+
+	proc/getData(key)
+		return src.data[key]
+
+	proc/getSave(name)
+		return src.saves[name]
+
+
+/**
+ * Mass save a collection of cloud data for various players
+ * Input format:
+ * list(
+ * 		list(
+ * 			"player_id" = 1,
+ * 			"key" = "foo",
+ * 			"value" = "bar"
+ * 		),
+ * 		list(
+ * 			"player_id" = 2,
+ * 			"key" = "foo2",
+ * 			"value" = "bar2"
+ * 		)
+ * )
+ */
+/proc/cloud_saves_put_data_bulk(list/data)
+#ifndef LIVE_SERVER
+	var/list/newSimulatedCloud = list()
+	var/list/simulatedCloud = list()
+	if (fexists(CLOUD_SAVES_SIMULATED_CLOUD))
+		var/simulatedContent = file2text(CLOUD_SAVES_SIMULATED_CLOUD)
+		simulatedCloud = json_decode(simulatedContent)
+
+	for (var/item in data)
+		var/datum/player/P
+		for (var/client/C in clients)
+			if (C.player.id == item["player_id"])
+				P = C.player
+				break
+
+		var/list/playerCloud = list("data" = list(), "saves" = list())
+		if (P.ckey in simulatedCloud)
+			playerCloud = simulatedCloud["[P.ckey]"]
+
+		playerCloud["data"][item["key"]] = item["value"]
+		P.cloudSaves.data[item["key"]] = item["value"]
+		newSimulatedCloud["[P.ckey]"] = playerCloud
+
+	rustg_file_write(json_encode(newSimulatedCloud), CLOUD_SAVES_SIMULATED_CLOUD)
+	return TRUE
+#else
+	try
+		var/datum/apiRoute/players/saves/databulk/post/addBulkData = new
+		addBulkData.buildBody(json_encode(data))
+		logTheThing(LOG_DEBUG, null, "TEMP CLOUD BULK: [json_encode(data)]")
+		apiHandler.queryAPI(addBulkData)
+		return TRUE
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "failed to put bulk data into the cloud. Error: [error.message]")
+		return FALSE
+#endif
+
+/// Transfer all cloud save files from one player to another
+/// WARNING: This overwrites all the saves for the target
+/proc/cloud_saves_transfer(from_ckey, to_ckey)
+#ifndef LIVE_SERVER
+	// Wire note: I simply cannot be bothered to code the simulated file aspect of this
+	throw EXCEPTION("Cloud save transferring is disabled during local development")
+#else
+	try
+		var/datum/apiRoute/players/saves/file/transfer/transferSaves = new
+		transferSaves.buildBody(from_ckey, to_ckey)
+		apiHandler.queryAPI(transferSaves)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "failed to transfer cloud saves from [from_ckey] to [to_ckey]. Error: [error.message]")
+		throw EXCEPTION(error.message)
+		return FALSE
+
+	// Run updates if any of the targets are currently logged in
+	for (var/client/C in clients)
+		if (C.ckey == from_ckey)
+			// The source player has all their saves moved
+			C.player.cloudSaves.saves = list()
+		if (C.ckey == to_ckey)
+			// Trigger a re-fetch on the target so they can get their new saves right away
+			C.player.cloudSaves.fetch()
+
+	return TRUE
+#endif
diff --git a/code/datums/components/seedy.dm b/code/datums/components/seedy.dm
index b3fa07ad1141c..e50dff2057a6b 100644
--- a/code/datums/components/seedy.dm
+++ b/code/datums/components/seedy.dm
@@ -31,26 +31,7 @@
 	. = ..()
 
 /datum/component/seedy/proc/generate_seed()
-	var/obj/item/seed/SEED
-	if (planttype.unique_seed)
-		SEED = new planttype.unique_seed
-	else
-		SEED = new /obj/item/seed
-		SEED.removecolor()
-
-	if (!src.planttype.hybrid && !src.planttype.unique_seed)
-		SEED.generic_seed_setup(src.planttype, TRUE)
-	HYPpassplantgenes(src.DNA,SEED.plantgenes)
-	SEED.generation = src.generation
-	if (src.planttype.hybrid)
-		var/plantType = src.planttype.type
-		var/datum/plant/hybrid = new plantType(SEED)
-		for (var/V in src.planttype.vars)
-			if (issaved(src.planttype.vars[V]) && V != "holder")
-				hybrid.vars[V] = src.planttype.vars[V]
-		SEED.planttype = hybrid
-		SEED.plant_seed_color(src.planttype.seedcolor)
-
+	var/obj/item/seed/SEED = HYPgenerateseedcopy(src.DNA, src.planttype, src.generation)
 	return SEED
 
 /datum/component/seedy/proc/on_pre_attack(var/atom/affected_parent, var/atom/target, var/mob/user, var/damage)
diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm
index e12cd0dc383f1..3901149f86175 100644
--- a/code/datums/configuration.dm
+++ b/code/datums/configuration.dm
@@ -45,10 +45,6 @@
 	var/allow_ai = 1					// allow ai job
 	var/respawn = 1
 
-	// Goonhub Parser
-	var/goonhub_parser_url = "localhost"
-	var/goonhub_parser_key = "foo"
-
 	// MySQL
 	var/sql_enabled = 0
 	var/sql_hostname = "localhost"
@@ -57,34 +53,20 @@
 	var/sql_password = null
 	var/sql_database = null
 
-	// Player notes
-	var/player_notes_baseurl = "https://playernotes.goonhub.com"
-	var/player_notes_auth = null
-
-	// Server list for cross-bans and other stuff
-	var/list/servers = list()
-	var/crossbans = 0
-	var/crossban_password = null
-
 	//IRC Bot stuff
 	var/irclog_url = null
 	var/ircbot_api = null
 	var/ircbot_ip = null
-	var/spacebee_api_url = "https://spacebee.goonhub.com"
-	var/spacebee_api_key = null
 
 	//External server configuration (for central bans etc)
-	var/goonhub_api_version = 0
 	var/goonhub_api_endpoint = null
 	var/goonhub_api_ip = null
 	var/goonhub_api_token = null
-	var/goonhub_api_web_token = null
 
-	//Goonhub2 server
-	var/goonhub2_hostname = null
-
-	//youtube audio converter
-	var/youtube_audio_key = null
+	var/goonhub_events_endpoint = null
+	var/goonhub_events_port = null
+	var/goonhub_events_channel = null
+	var/goonhub_events_password = null
 
 	//Environment
 	var/env = "dev"
@@ -301,17 +283,6 @@
 			if ("server_specific_configs")
 				config.server_specific_configs = 1
 
-			if ("servers")
-				for(var/sv in splittext(trim(value), " "))
-					sv = trim(sv)
-					if(sv)
-						config.servers.Add(sv)
-
-			if ("use_crossbans")
-				config.crossbans = 1
-			if ("crossban_password")
-				config.crossban_password = trim(value)
-
 			if ("irclog_url")
 				config.irclog_url = trim(value)
 			if ("ircbot_api")
@@ -319,35 +290,25 @@
 			if ("ircbot_ip")
 				config.ircbot_ip = trim(value)
 
-			if ("spacebee_api_url")
-				config.spacebee_api_url = trim(value)
-			if ("spacebee_api_key")
-				config.spacebee_api_key = trim(value)
-
-			if ("goonhub_parser_url")
-				config.goonhub_parser_url = trim(value)
-			if ("goonhub_parser_key")
-				config.goonhub_parser_key = trim(value)
-
 			if ("ticklag")
 				world.tick_lag = text2num(value)
 
-			if ("goonhub_api_version")
-				config.goonhub_api_version = text2num(value)
 			if ("goonhub_api_endpoint")
 				config.goonhub_api_endpoint = trim(value)
 			if ("goonhub_api_ip")
 				config.goonhub_api_ip = trim(value)
 			if ("goonhub_api_token")
 				config.goonhub_api_token = trim(value)
-			if ("goonhub_api_web_token")
-				config.goonhub_api_web_token = trim(value)
 
-			if ("goonhub2_hostname")
-				config.goonhub2_hostname = trim(value)
+			if ("goonhub_events_endpoint")
+				config.goonhub_events_endpoint = trim(value)
+			if ("goonhub_events_port")
+				config.goonhub_events_port = trim(value)
+			if ("goonhub_events_channel")
+				config.goonhub_events_channel = trim(value)
+			if ("goonhub_events_password")
+				config.goonhub_events_password = trim(value)
 
-			if ("youtube_audio_key")
-				config.youtube_audio_key = trim(value)
 			if ("update_check_enabled")
 				config.update_check_enabled = 1
 			if ("dmb_filename")
@@ -381,12 +342,6 @@
 				config.whitelistEnabled = TRUE
 				config.baseWhitelistEnabled = TRUE
 
-			if ("player_notes_baseurl")
-				config.player_notes_baseurl = trim(value)
-
-			if ("player_notes_auth")
-				config.player_notes_auth = trim(value)
-
 			if ("whitelist_path")
 				config.whitelist_path = trim(value)
 
@@ -423,13 +378,13 @@
 
 	return new /datum/game_mode/extended // Let's fall back to extended! Better than erroring and having to manually restart.
 
-/datum/configuration/proc/pick_random_mode()
+/datum/configuration/proc/pick_random_mode(list/exclusions = list())
 	var/total = 0
 	var/list/accum = list()
 	var/list/avail_modes = list()
 
 	for(var/M in src.modes)
-		if (src.probabilities[M] && getSpecialModeCase(M))
+		if (!exclusions.Find(M) && src.probabilities[M] && getSpecialModeCase(M))
 			total += src.probabilities[M]
 			avail_modes += M
 			accum[M] = total
@@ -447,7 +402,6 @@
 		return null // This essentially will never happen (you'd have to not be able to choose any mode in secret), so it's okay to leave it null, I think
 
 	//boutput(world, "Returning mode [mode_name]")
-	message_admins("[mode_name] was chosen as the random game mode!")
 
 	return src.pick_mode(mode_name)
 
diff --git a/code/datums/controllers/job_controls.dm b/code/datums/controllers/job_controls.dm
index 840aa445a7e07..83f6101d5454c 100644
--- a/code/datums/controllers/job_controls.dm
+++ b/code/datums/controllers/job_controls.dm
@@ -66,7 +66,7 @@ var/datum/job_controller/job_controls
 		dat += "<BR>"
 		dat += "<b>Research Jobs</b><BR>"
 		for(var/datum/job/research/JOB in src.staple_jobs)
-			dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A <a href='byond://?src=\ref[src];Edit=\ref[JOB]'>Edit</a><BR>"
+			dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A> <a href='byond://?src=\ref[src];Edit=\ref[JOB]'>Edit</a><BR>"
 		dat += "<BR>"
 		dat += "<b>Engineering Jobs</b><BR>"
 		for(var/datum/job/engineering/JOB in src.staple_jobs)
diff --git a/code/datums/controllers/process/events.dm b/code/datums/controllers/process/events.dm
new file mode 100644
index 0000000000000..99d86fe84910f
--- /dev/null
+++ b/code/datums/controllers/process/events.dm
@@ -0,0 +1,7 @@
+/datum/controller/process/event_recorder
+	setup()
+		name = "Event Recording"
+		schedule_interval = 1 MINUTE
+
+	doWork()
+		eventRecorder.process()
diff --git a/code/datums/controllers/process/lighting.dm b/code/datums/controllers/process/lighting.dm
index 463b9079bb393..16df5968b20f9 100644
--- a/code/datums/controllers/process/lighting.dm
+++ b/code/datums/controllers/process/lighting.dm
@@ -80,7 +80,7 @@ datum/controller/process/lighting
 
 /datum/circular_queue
 
-	var/list/list = 0
+	var/list/list = null
 
 	var/read_index = 1
 	var/write_index = 1
@@ -90,9 +90,7 @@ datum/controller/process/lighting
 
 	New(ListSize = 500)
 		..()
-		list = list()
-		list.len = ListSize
-
+		src.list = new/list(ListSize)
 
 	proc/dequeue()
 		.= 0
diff --git a/code/datums/controllers/process/poll_sync.dm b/code/datums/controllers/process/poll_sync.dm
new file mode 100644
index 0000000000000..fc980542b83a6
--- /dev/null
+++ b/code/datums/controllers/process/poll_sync.dm
@@ -0,0 +1,12 @@
+#define POLL_SYNC_PROCESS_SCHEDULE_INTERVAL 1 MINUTE
+
+/// Syncs poll data with API every minute
+/datum/controller/process/poll_sync
+	setup()
+		name = "Poll Sync"
+		schedule_interval = POLL_SYNC_PROCESS_SCHEDULE_INTERVAL
+
+		// initial pregame sync
+		poll_manager.sync_polldata()
+	doWork()
+		poll_manager.sync_polldata()
diff --git a/code/datums/controllers/sea_hotspot_controls.dm b/code/datums/controllers/sea_hotspot_controls.dm
index 65ee6cca20506..3ad15ef92eb08 100644
--- a/code/datums/controllers/sea_hotspot_controls.dm
+++ b/code/datums/controllers/sea_hotspot_controls.dm
@@ -1054,6 +1054,61 @@ TYPEINFO(/obj/item/clothing/shoes/stomp_boots)
 	var/stomp_cooldown = 10 SECONDS
 	var/stomp_damage = 20
 	requires_equip = TRUE
+	var/prevLayer = null
+	var/prevPlane = null
+
+	proc/start_jump()
+		the_mob.visible_message(SPAN_ALERT("<b>[the_mob]</b> activates the boost on their stomper boots!"))
+		playsound(src.loc, 'sound/items/miningtool_on.ogg', 50, 1)
+		src.prevLayer = the_mob.layer
+		src.prevPlane = the_mob.plane
+		the_mob.layer = EFFECTS_LAYER_4 // need to be above posters and shit
+		the_mob.plane = PLANE_NOSHADOW_ABOVE
+		APPLY_ATOM_PROPERTY(the_mob, PROP_ATOM_NEVER_DENSE, src)
+		the_mob.flags |= TABLEPASS
+
+		if (prob(10))
+			the_mob.emote("flip")
+
+		animate(the_mob,
+			pixel_y = jump_height * 32,
+			time = jump_time / 2,
+			easing = EASE_OUT | CIRCULAR_EASING,
+			flags = ANIMATION_RELATIVE | ANIMATION_PARALLEL)
+		animate(
+			pixel_y = -jump_height * 32,
+			time = jump_time / 2,
+			easing = EASE_IN | CIRCULAR_EASING,
+			flags = ANIMATION_RELATIVE)
+
+	proc/end_jump(mob/jumper)
+		jumper.layer = prevLayer
+		jumper.plane = prevPlane
+		REMOVE_ATOM_PROPERTY(jumper, PROP_ATOM_NEVER_DENSE, src)
+		jumper.flags &= ~TABLEPASS
+		playsound(src.loc, 'sound/impact_sounds/Metal_Hit_Lowfi_1.ogg', 50, 1, 0.1, 0.7)
+
+		if (locate(/obj/item/clothing/shoes) in jumper.get_equipped_items())
+			if (hotspot_controller.stomp_turf(get_turf(src))) //we didn't stomped center, do an additional SFX
+				SPAWN(0.4 SECONDS)
+					playsound(src.loc, 'sound/impact_sounds/Metal_Hit_Heavy_1.ogg', 50, 1, 0.1, 0.7)
+
+			for (var/datum/sea_hotspot/H in hotspot_controller.get_hotspots_list(get_turf(src)))
+				if (BOUNDS_DIST(src, H.center.turf()) == 0)
+					playsound(src, 'sound/machines/twobeep.ogg', 50, TRUE, 0.1, 0.7)
+					for (var/mob/O in hearers(jumper, null))
+						O.show_message(SPAN_SUBTLE(SPAN_SAY("[SPAN_NAME("[src]")] beeps, \"Hotspot pinned.\"")), 2)
+
+			for (var/mob/M in get_turf(src))
+				if (isliving(M) && M != jumper)
+					random_brute_damage(M, src.stomp_damage, TRUE)
+					M.changeStatus("weakened", 1 SECOND)
+					playsound(M.loc, 'sound/impact_sounds/Flesh_Break_1.ogg', 70, 1)
+		else
+			// took them off mid air
+			random_brute_damage(jumper, 25, FALSE)
+			jumper.changeStatus("weakened", 3 SECONDS)
+			playsound(jumper.loc, 'sound/impact_sounds/Flesh_Break_1.ogg', 90, 1)
 
 	execute_ability()
 		if(!(the_item in the_mob.get_equipped_items()))
@@ -1062,60 +1117,11 @@ TYPEINFO(/obj/item/clothing/shoes/stomp_boots)
 		if (!ON_COOLDOWN(src, "stomp", src.stomp_cooldown))
 			// Mostly stolen from jumpy
 			if (istype(the_mob.loc, /turf/))
-				the_mob.visible_message(SPAN_ALERT("<b>[the_mob]</b> activates the boost on their stomper boots!"))
-				playsound(src.loc, 'sound/items/miningtool_on.ogg', 50, 1)
-				var/prevLayer = the_mob.layer
-				var/prevPlane = the_mob.plane
-				the_mob.layer = EFFECTS_LAYER_4 // need to be above posters and shit
-				the_mob.plane = PLANE_NOSHADOW_ABOVE
-				APPLY_ATOM_PROPERTY(the_mob, PROP_ATOM_NEVER_DENSE, src)
-				the_mob.flags |= TABLEPASS
-
-				if (prob(10))
-					the_mob.emote("flip")
-
-				animate(the_mob,
-					pixel_y = jump_height * 32,
-					time = jump_time / 2,
-					easing = EASE_OUT | CIRCULAR_EASING,
-					flags = ANIMATION_RELATIVE | ANIMATION_PARALLEL)
-				animate(
-					pixel_y = -jump_height * 32,
-					time = jump_time / 2,
-					easing = EASE_IN | CIRCULAR_EASING,
-					flags = ANIMATION_RELATIVE)
-
+				src.start_jump()
 				SPAWN(0)
 					var/mob/jumper = the_mob // do this so we still have a reference if the button gets deleted
 					sleep(jump_time)
-					jumper.layer = prevLayer
-					jumper.plane = prevPlane
-					REMOVE_ATOM_PROPERTY(jumper, PROP_ATOM_NEVER_DENSE, src)
-					jumper.flags &= ~TABLEPASS
-					playsound(src.loc, 'sound/impact_sounds/Metal_Hit_Lowfi_1.ogg', 50, 1, 0.1, 0.7)
-
-					if (locate(/obj/item/clothing/shoes) in jumper.get_equipped_items())
-						if (hotspot_controller.stomp_turf(get_turf(src))) //we didn't stomped center, do an additional SFX
-							SPAWN(0.4 SECONDS)
-								playsound(src.loc, 'sound/impact_sounds/Metal_Hit_Heavy_1.ogg', 50, 1, 0.1, 0.7)
-
-						for (var/datum/sea_hotspot/H in hotspot_controller.get_hotspots_list(get_turf(src)))
-							if (BOUNDS_DIST(src, H.center.turf()) == 0)
-								playsound(src, 'sound/machines/twobeep.ogg', 50, TRUE, 0.1, 0.7)
-								for (var/mob/O in hearers(jumper, null))
-									O.show_message(SPAN_SUBTLE(SPAN_SAY("[SPAN_NAME("[src]")] beeps, \"Hotspot pinned.\"")), 2)
-
-						for (var/mob/M in get_turf(src))
-							if (isliving(M) && M != jumper)
-								random_brute_damage(M, src.stomp_damage, TRUE)
-								M.changeStatus("weakened", 1 SECOND)
-								playsound(M.loc, 'sound/impact_sounds/Flesh_Break_1.ogg', 70, 1)
-					else
-						// took them off mid air
-						random_brute_damage(jumper, 25, FALSE)
-						jumper.changeStatus("weakened", 3 SECONDS)
-						playsound(jumper.loc, 'sound/impact_sounds/Flesh_Break_1.ogg', 90, 1)
-
+					src.end_jump(jumper)
 
 			else if (istype(the_mob.loc, /obj/))
 				var/obj/container = the_mob.loc
@@ -1140,6 +1146,20 @@ TYPEINFO(/obj/item/clothing/shoes/stomp_boots)
 	stomp_cooldown = 0 SECONDS
 	stomp_damage = 200
 
+/obj/item/clothing/shoes/stomp_boots/very_high
+	name = "very high stomper boots"
+	desc = "How high IS the ceiling in here?"
+	abilities = list(/obj/ability_button/stomper_boot_stomp/very_high)
+
+/obj/ability_button/stomper_boot_stomp/very_high
+	start_jump()
+		..()
+		APPLY_ATOM_PROPERTY(src.the_mob, PROP_MOB_NOCLIP, src)
+
+	end_jump(mob/jumper)
+		REMOVE_ATOM_PROPERTY(jumper, PROP_MOB_NOCLIP, src)
+		..()
+
 ////////////////////////////////////////////////////////////
 //actions
 ////////////////////////////////////////////////////////////
diff --git a/code/datums/cookingrecipes.dm b/code/datums/cookingrecipes.dm
index 597beec200ad8..c8fbd9e89b2e5 100644
--- a/code/datums/cookingrecipes.dm
+++ b/code/datums/cookingrecipes.dm
@@ -1081,7 +1081,7 @@ ABSTRACT_TYPE(/datum/cookingrecipe/mixer)
 	item1 = /obj/item/baguette
 	item2 = /obj/item/reagent_containers/food/snacks/ingredient/cheeseslice
 	item3 = /obj/item/reagent_containers/food/snacks/plant/garlic
-	item3 = /obj/item/reagent_containers/food/snacks/ingredient/butter
+	item4 = /obj/item/reagent_containers/food/snacks/ingredient/butter
 	cookbonus = 6
 	output = /obj/item/reagent_containers/food/snacks/garlicbread_ch
 	category = "Pastries and bread-likes"
@@ -2221,3 +2221,22 @@ ABSTRACT_TYPE(/datum/cookingrecipe/mixer)
 			lipstick.name = "[lipstick.color_name] lipstick"
 			lipstick.UpdateIcon()
 		return lipstick
+
+/datum/cookingrecipe/oven/melted_sugar
+	item1 = /obj/item/reagent_containers/food/snacks/ingredient/sugar
+	item2 = /obj/item/plate/tray
+	cookbonus = 10
+	output = /obj/item/reagent_containers/food/snacks/ingredient/melted_sugar
+
+/datum/cookingrecipe/mixer/brownie_batter
+	item1 = /obj/item/reagent_containers/food/snacks/ingredient/dough_s
+	item2 = /obj/item/reagent_containers/food/snacks/ingredient/egg
+	amt2 = 2
+	item3 = /obj/item/reagent_containers/food/snacks/candy/chocolate
+	cookbonus = 10
+	output = /obj/item/reagent_containers/food/snacks/ingredient/brownie_batter
+
+/datum/cookingrecipe/oven/brownie_batch
+	item1 = /obj/item/reagent_containers/food/snacks/ingredient/brownie_batter
+	cookbonus = 14
+	output = /obj/item/reagent_containers/food/snacks/brownie_batch/
diff --git a/code/datums/crew_credits/crew_credits.dm b/code/datums/crew_credits/crew_credits.dm
index 65a4e91f5584f..62cebb19a6d27 100644
--- a/code/datums/crew_credits/crew_credits.dm
+++ b/code/datums/crew_credits/crew_credits.dm
@@ -335,7 +335,7 @@
 	src.score_tab_data[SCORE_TAB_SECTION_ENGINEERING] = list(
 		list(
 			"name" = "Power Generated",
-			"value" = "[engineering_notation(score_tracker.power_generated)]W",
+			"value" = "[engineering_notation(score_tracker.power_generated / 3600)]Wh",
 		),
 		list(
 			"name" = "Station Structural Integrity",
diff --git a/code/datums/customization_styles.dm b/code/datums/customization_styles.dm
index 34faf8e941012..2e629ce3ed68c 100644
--- a/code/datums/customization_styles.dm
+++ b/code/datums/customization_styles.dm
@@ -34,7 +34,8 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 	var/default_layer = MOB_HAIR_LAYER1 //Under by default, more direct subtypes where that makes sense
 	/// Icon file this hair should be pulled from
 	var/icon = 'icons/mob/human_hair.dmi'
-
+	/// For blacklisting the weird partial hairstyles that just look broken on random characters
+	var/random_allowed = TRUE
 	/// Only used if typeinfo.special_criteria is TRUE
 	proc/check_available(client/C)
 		return TRUE
@@ -54,48 +55,63 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 			afro_fade
 				name = "Afro: Faded"
 				id = "afro_fade"
+				random_allowed = FALSE
 			afroHR
 				name = "Afro: Left Half"
 				id = "afroHR"
+				random_allowed = FALSE
 			afroHL
 				name = "Afro: Right Half"
 				id = "afroHL"
+				random_allowed = FALSE
 			afroST
 				name = "Afro: Top"
 				id = "afroST"
+				random_allowed = FALSE
 			afroSM
 				name = "Afro: Middle Band"
 				id = "afroSM"
+				random_allowed = FALSE
 			afroSB
 				name = "Afro: Bottom"
 				id = "afroSB"
+				random_allowed = FALSE
 			afroSL
 				name = "Afro: Left Side"
 				id = "afroSL"
+				random_allowed = FALSE
 			afroSR
 				name = "Afro: Right Side"
 				id = "afroSR"
+				random_allowed = FALSE
 			afroSC
 				name = "Afro: Center Streak"
 				id = "afroSC"
+				random_allowed = FALSE
 			afroCNE
 				name = "Afro: NE Corner"
 				id = "afroCNE"
+				random_allowed = FALSE
 			afroCNW
 				name = "Afro: NW Corner"
 				id = "afroCNW"
+				random_allowed = FALSE
 			afroCSE
 				name = "Afro: SE Corner"
 				id = "afroCSE"
+				random_allowed = FALSE
 			afroCSW
 				name = "Afro: SW Corner"
 				id = "afroCSW"
+				random_allowed = FALSE
 			afroSV
 				name = "Afro: Tall Stripes"
 				id = "afroSV"
+				random_allowed = FALSE
 			afroSH
 				name = "Afro: Long Stripes"
 				id = "afroSH"
+				random_allowed = FALSE
 			balding
 				name = "Balding"
 				id = "balding"
@@ -134,12 +150,15 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 			clownT
 				name = "Clown: Top"
 				id = "clownT"
+				random_allowed = FALSE
 			clownM
 				name = "Clown: Middle Band"
 				id = "clownM"
+				random_allowed = FALSE
 			clownB
 				name = "Clown: Bottom"
 				id = "clownB"
+				random_allowed = FALSE
 			combed_s
 				name = "Combed"
 				id = "combed_s"
@@ -223,6 +242,7 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 			pompS
 				name = "Pompadour: Greaser Shine"
 				id = "pompS"
+				random_allowed = FALSE
 			scruffy
 				name = "Scruffy"
 				id = "scruffy"
@@ -321,33 +341,43 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 			chub2_s
 				name = "Bang: Left"
 				id = "chub2_s"
+				random_allowed = FALSE
 			chub_s
 				name = "Bang: Right"
 				id = "chub_s"
+				random_allowed = FALSE
 			twobangs_long
 				name = "Two Bangs: Long"
 				id = "2bangs_long"
+				random_allowed = FALSE
 			twobangs_short
 				name = "Two Bangs: Short"
 				id = "2bangs_short"
+				random_allowed = FALSE
 			flatbangs
 				name = "Bangs: Flat"
 				id = "flatbangs"
+				random_allowed = FALSE
 			shortflatbangs
 				name = "Bangs: Flat Shorter"
 				id = "shortflatbangs"
+				random_allowed = FALSE
 			longwavebangs
 				name = "Bangs: Long Wavy"
 				id = "longwavebangs"
+				random_allowed = FALSE
 			shortwavebangs
 				name = "Bangs: Short Wavy"
 				id = "shortwavebangs"
+				random_allowed = FALSE
 			sidebangs
 				name = "Bangs: Sides"
 				id = "sidebangs"
+				random_allowed = FALSE
 			mysterybangs
 				name = "Bangs: Mysterious"
 				id = "mysterybangs"
+				random_allowed = FALSE
 			bedhead
 				name = "Bedhead"
 				id = "bedhead"
@@ -377,6 +407,7 @@ TYPEINFO(/datum/customization_style/hair/gimmick)
 			dreadsA
 				name = "Dreadlocks: Alternating"
 				id = "dreadsA"
+				random_allowed = FALSE
 			fabio
 				name = "Fabio"
 				id = "fabio"
@@ -803,11 +834,11 @@ proc/find_style_by_id(var/target_id, client/C, no_gimmick_hair = FALSE)
 	for (var/datum/customization_style/styletype as anything in get_available_custom_style_types(C, no_gimmick_hair))
 		if(initial(styletype.id) == target_id)
 			return new styletype
-	stack_trace("Couldn't find a customization_style with the name \"[target_id]\".")
+	stack_trace("Couldn't find a customization_style with the id \"[target_id]\".")
 	return new /datum/customization_style/none
 
 /// Gets all the customization_styles which are available to a given client. Can be filtered by providing a gender flag or a type
-proc/get_available_custom_style_types(client/C, no_gimmick_hair = FALSE, filter_gender=0, filter_type=null)
+proc/get_available_custom_style_types(client/C, no_gimmick_hair = FALSE, filter_gender=0, filter_type=null, for_random=FALSE)
 	// Defining static vars with no value doesn't overwrite them with null if we call the proc multiple times
 	// Styles with no restriction
 	var/static/list/always_available
@@ -841,17 +872,15 @@ proc/get_available_custom_style_types(client/C, no_gimmick_hair = FALSE, filter_
 			if (instance.check_available(C))
 				available += style
 
-	if (filter_gender)
-		for (var/datum/customization_style/style in available)
-			if (!(initial(style.gender) & filter_gender))
-				available -= style
-
-	if (filter_type)
-		for (var/datum/customization_style/style in available)
-			if (!ispath(style, filter_type))
-				available -= style
+	for (var/datum/customization_style/style as anything in available)
+		if (filter_gender && !(initial(style.gender) & filter_gender))
+			available -= style
+			continue
+		if (filter_type && !ispath(style, filter_type))
+			available -= style
+			continue
+		if (for_random && !(initial(style.random_allowed)))
+			available -= style
+			continue
 
 	return available
-
-
-
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index a70f180292b93..5efed911df0f7 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -397,7 +397,8 @@
 	New()
 		..()
 		SPAWN(1 SECOND)
-			statlog_ticket(src, usr)
+			var/datum/eventRecord/Ticket/ticketEvent = new()
+			ticketEvent.buildAndSend(src, usr)
 
 /datum/fine
 	var/ID = null
@@ -422,7 +423,8 @@
 		SPAWN(1 SECOND)
 			bank_record = data_core.bank.find_record("name", target)
 			if(!bank_record) qdel(src)
-			statlog_fine(src, usr)
+			var/datum/eventRecord/Fine/fineEvent = new()
+			fineEvent.buildAndSend(src, usr)
 
 /datum/fine/proc/approve(var/approved_by,var/their_job)
 	if(approver || paid) return
diff --git a/code/datums/gamemodes/extended.dm b/code/datums/gamemodes/extended.dm
index 0f1c9024157e7..f9c39c56321ad 100644
--- a/code/datums/gamemodes/extended.dm
+++ b/code/datums/gamemodes/extended.dm
@@ -4,10 +4,11 @@
 	regular = FALSE
 	do_antag_random_spawns = 0
 	latejoin_antag_compatible = 0
+	var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
+	var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
 
 /datum/game_mode/extended/pre_setup()
 	. = ..()
-
 	for(var/datum/random_event/event in random_events.events)
 		if(istype(event, /datum/random_event/major/law_rack_corruption))
 			event.disabled = TRUE
@@ -15,3 +16,7 @@
 /datum/game_mode/extended/announce()
 	boutput(world, "<B>The current game mode is - Extended!</B>")
 	boutput(world, "<B>Just have fun!</B>")
+
+/datum/game_mode/extended/post_setup()
+	SPAWN(rand(waittime_l, waittime_h))
+		send_intercept()
diff --git a/code/datums/gamemodes/flock.dm b/code/datums/gamemodes/flock.dm
index db9bb71130069..71ea1202f3a66 100644
--- a/code/datums/gamemodes/flock.dm
+++ b/code/datums/gamemodes/flock.dm
@@ -5,6 +5,8 @@
 
 	shuttle_available = SHUTTLE_AVAILABLE_DELAY
 	shuttle_available_threshold = 20 MINUTES // default value, probably change this
+	var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
+	var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
 
 	//NOTE: if you need to track something, put it here
 	var/list/datum/mind/flockminds = list()
@@ -36,7 +38,8 @@
 /datum/game_mode/flock/post_setup()
 	for (var/datum/mind/flockmind in flockminds)
 		flockmind.add_antagonist(ROLE_FLOCKMIND, source = ANTAGONIST_SOURCE_ROUND_START)
-
+	SPAWN(rand(waittime_l, waittime_h))
+		send_intercept()
 	. = ..()
 
 /datum/game_mode/flock/victory_msg()
diff --git a/code/datums/gamemodes/gangwar.dm b/code/datums/gamemodes/gangwar.dm
index 0af052610caa5..7fd7abfccc53a 100644
--- a/code/datums/gamemodes/gangwar.dm
+++ b/code/datums/gamemodes/gangwar.dm
@@ -78,13 +78,17 @@
 
 	var/list/chosen_leader = antagWeighter.choose(pool = leaders_possible, role = ROLE_GANG_LEADER, amount = num_teams, recordChosen = 1)
 	src.traitors |= chosen_leader
-	for (var/datum/mind/leader in src.traitors)
-		leaders_possible.Remove(leader)
-		leader.special_role = ROLE_GANG_LEADER
 
+#ifndef ME_AND_MY_40_ALT_ACCOUNTS
+	// check if we can actually run the mode before assigning special roles to minds
 	if(length(get_possible_enemies(ROLE_GANG_MEMBER, round(num_teams * DEFAULT_MAX_GANG_SIZE), force_fill = FALSE) - src.traitors) < round(num_teams * DEFAULT_MAX_GANG_SIZE * 0.66)) //must have at least 2/3 full gangs or there's no point
-		boutput(world, SPAN_ALERT("<b>ERROR: The readied players are not collectively gangster enough for the selected mode, aborting gangwars.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: The readied players are not collectively gangster enough for the selected mode, aborting gangwars.</b>"))
 		return 0
+#endif
+
+	for (var/datum/mind/leader in src.traitors)
+		leaders_possible.Remove(leader)
+		leader.special_role = ROLE_GANG_LEADER
 
 	return 1
 
@@ -210,6 +214,10 @@
 		if (istype(winner))
 			boutput(world, "<h2><b>[winner.gang_name], led by [winner.leader.current.real_name], won the round!</b></h2>")
 
+			var/datum/hud/gang_victory/victory_hud = new(winner)
+			for (var/client/C in clients)
+				victory_hud.add_client(C)
+
 	..()
 
 /datum/game_mode/gang/proc/check_winner()
diff --git a/code/datums/gamemodes/gm_parent.dm b/code/datums/gamemodes/gm_parent.dm
index 5fbf4081cc806..c8a873c79ed8a 100644
--- a/code/datums/gamemodes/gm_parent.dm
+++ b/code/datums/gamemodes/gm_parent.dm
@@ -215,8 +215,12 @@ ABSTRACT_TYPE(/datum/game_mode)
 		else if(istype(C.mob, /mob/living/carbon))
 			if(!allow_carbon)
 				continue
-			if(!find_job_in_controller_by_string(C.mob.job)?.allow_traitors)
-				continue
+			var/datum/job/job = find_job_in_controller_by_string(C.mob.job)
+			if (job)
+				if(!job.allow_traitors)
+					continue
+				if (!job.can_join_gangs && (type == ROLE_GANG_LEADER || type == ROLE_GANG_MEMBER))
+					continue
 		else
 			continue
 		if(filter_proc && !call(filter_proc)(C.mob))
diff --git a/code/datums/gamemodes/nuclear.dm b/code/datums/gamemodes/nuclear.dm
index 184aa58d3465b..b1c692ac3745c 100644
--- a/code/datums/gamemodes/nuclear.dm
+++ b/code/datums/gamemodes/nuclear.dm
@@ -1,6 +1,9 @@
 ///This amount of potential target locations are picked, up to every defined plant spot for the map
 #define AMOUNT_OF_VALID_NUKE_PLANT_LOCATIONS 2
 
+var/global/list/nuke_op_color_matrix = list("#394470","#c65039", "#63662c")
+var/global/list/nuke_op_camo_matrix = null
+
 /datum/game_mode/nuclear
 	name = "Nuclear Emergency"
 	config_tag = "nuclear"
@@ -39,7 +42,8 @@
 	var/list/possible_syndicates = list()
 
 	if (!landmarks[LANDMARK_SYNDICATE])
-		boutput(world, SPAN_ALERT("<b>ERROR: couldn't find Syndicate spawn landmark, aborting nuke round pre-setup.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: couldn't find Syndicate spawn landmark, aborting nuke round pre-setup.</b>"))
+		logTheThing(LOG_DEBUG, null, "Failed to find Syndicate spawn landmark, aborting nuke round pre-setup.")
 		return 0
 
 	var/num_players = 0
@@ -62,7 +66,7 @@
 
 #ifndef ME_AND_MY_40_ALT_ACCOUNTS
 	if (!islist(possible_syndicates) || length(possible_syndicates) < 2)
-		boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign at least two players as Syndicate operatives, aborting nuke round pre-setup.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign at least two players as Syndicate operatives, aborting nuke round pre-setup.</b>"))
 		return 0
 #endif
 
@@ -123,7 +127,7 @@
 			target_locations = list("the main security room" = list(/area/station/security/main),
 			"the central research sector hub" = list(/area/station/science/lobby),
 			"the cargo bay (QM)" = list(/area/station/quartermaster/office),
-			"the engineering control room" = list(/area/station/engine/engineering, /area/station/engine/power),
+			"the engineering control room" = list(/area/station/engine/engineering),
 			"the central warehouse" = list(/area/station/storage/warehouse),
 			"the courtroom" = list(/area/station/crew_quarters/courtroom, /area/station/crew_quarters/juryroom),
 			"the medbay" = list(/area/station/medical/medbay, /area/station/medical/medbay/surgery, /area/station/medical/medbay/lobby),
@@ -148,7 +152,7 @@
 		for(var/i in 1 to length(target_locations))
 			target_location_names += target_locations[i]
 	if (!target_location_names)
-		boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign target location for bomb, aborting nuke round pre-setup.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign target location for bomb, aborting nuke round pre-setup.</b>"))
 		message_admins(SPAN_ALERT("<b>CRITICAL BUG:</b> nuke mode setup encountered an error while trying to choose a target location for the bomb (could not select area name)!"))
 		return 0
 
@@ -161,7 +165,7 @@
 	src.create_plant_location_markers(target_locations, target_location_names)
 
 	if (!target_location_type)
-		boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign target location for bomb, aborting nuke round pre-setup.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign target location for bomb, aborting nuke round pre-setup.</b>"))
 		message_admins(SPAN_ALERT("<b>CRITICAL BUG:</b> nuke mode setup encountered an error while trying to choose a target location for the bomb (could not select area type)!"))
 		return 0
 
@@ -423,23 +427,28 @@
 		for (var/area_type in target_locations[target_location_names[i]])
 			areas += get_areas(area_type)
 
-		var/max_x = 1
-		var/min_x = world.maxx
-		var/max_y = 1
-		var/min_y = world.maxy
+		var/total_x = 0
+		var/total_y = 0
+		var/total_turfs = 0
 
 		for (var/area/area in areas)
 			if (area.z != Z_LEVEL_STATION)
 				continue
 			for (var/turf/T in area)
-				max_x = max(max_x, T.x)
-				min_x = min(min_x, T.x)
-				max_y = max(max_y, T.y)
-				min_y = min(min_y, T.y)
+				total_x += T.x
+				total_y += T.y
+				total_turfs += 1
 			if (!marker_name)
 				marker_name = capitalize(area.name)
-		var/target_x = (max_x + min_x) / 2
-		var/target_y = (max_y + min_y) / 2
+		var/target_x = round(total_x / total_turfs)
+		var/target_y = round(total_y / total_turfs)
+
+		// If its not in the right area we can at least try randomly
+		var/marker_area = get_area(locate(target_x, target_y, Z_LEVEL_STATION))
+		if (!(marker_area in areas))
+			var/turf/T = pick(get_area_turfs(pick(areas)))
+			target_x = T.x
+			target_y = T.y
 
 		var/turf/plant_location = locate(target_x, target_y, Z_LEVEL_STATION)
 		plant_location.AddComponent(/datum/component/minimap_marker, MAP_SYNDICATE, "nuclear_bomb_pin", 'icons/obj/minimap/minimap_markers.dmi', "[marker_name] Plant Site")
@@ -495,8 +504,6 @@ var/syndicate_name = null
 	opacity = 0
 	density = 1
 
-
-
 	New()
 		..()
 		var/wins = world.load_intra_round_value("nukie_win")
@@ -528,6 +535,14 @@ var/syndicate_name = null
 		onclose(user, "cairngorm_stats_[src]")
 		return
 
+
+/obj/New()
+	. = ..()
+	if(length(nuke_op_camo_matrix) && (src in by_cat[TR_CAT_NUKE_OP_STYLE]))
+		src.color = color_mapping_matrix(nuke_op_color_matrix, nuke_op_camo_matrix)
+
+
+
 /obj/cairngorm_stats/left
 	icon_state = "memorial_left"
 
diff --git a/code/datums/gamemodes/pirate.dm b/code/datums/gamemodes/pirate.dm
new file mode 100644
index 0000000000000..6b34622fee4da
--- /dev/null
+++ b/code/datums/gamemodes/pirate.dm
@@ -0,0 +1,72 @@
+/datum/game_mode/pirate
+	name = "Pirates"
+	config_tag = "yarr"
+	regular = FALSE
+	var/list/datum/mind/pirate_minds = list()
+	var/const/minimum_pirates = 2
+	var/const/maximum_pirates = 6
+	var/const/pop_divisor = 6
+	var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
+	var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
+
+	announce()
+		boutput(world, "<B>The current game mode is - Pirates!</B>")
+		boutput(world, "<B>Pirates are approaching [station_name(1)]! They intend to board us</B>")
+
+	pre_setup()
+		. = ..()
+		var/list/possible_pirates = list()
+
+		var/num_players = 0
+		for(var/client/C)
+			var/mob/new_player/player = C.mob
+			if (!istype(player)) continue
+
+			if (player.ready)
+				num_players++
+
+		var/randomizer = rand(pop_divisor+1)
+		var/target_antag_count = clamp(round((num_players + randomizer )/ pop_divisor), minimum_pirates, maximum_pirates)
+
+		//just going to piggy back of salvagers pref for ince this gimmick mode
+		possible_pirates = get_possible_enemies(ROLE_SALVAGER, target_antag_count)
+
+		// fail if not enough players unless forced
+		if (!length(possible_pirates))
+			return 0
+		if ((master_mode != config_tag)   \
+		&& ((length(possible_pirates) < minimum_pirates) || (target_antag_count < minimum_pirates)))
+			return 0
+
+		//load in the ship dmm
+		get_singleton(/datum/mapPrefab/allocated/pirate_ship).load()
+
+		// choose the antags
+		var/list/chosen_antags = antagWeighter.choose(pool = possible_pirates, role = ROLE_PIRATE, amount = target_antag_count, recordChosen = 1)
+
+		// store our chosen minds, assign role
+		pirate_minds |= chosen_antags
+		for (var/datum/mind/pirate in pirate_minds)
+			pirate.assigned_role = "MODE" //So they aren't chosen for other jobs.
+			pirate.special_role = ROLE_PIRATE
+			possible_pirates.Remove(pirate)
+
+ 		// pick a captain and first mate
+		var/list/L = pirate_minds.Copy()
+		var/datum/mind/pirate_captain = pick(L)
+		pirate_captain?.special_role = ROLE_PIRATE_CAPTAIN
+		L -= pirate_captain
+		if (length(L)) // in case we only have 1 pirate
+			var/datum/mind/pirate_first_mate = pick(L)
+			pirate_first_mate?.special_role = ROLE_PIRATE_FIRST_MATE
+
+		return TRUE
+
+	post_setup()
+		. = ..()
+		for (var/datum/mind/pirate in pirate_minds)
+			equip_antag(pirate)
+
+ 		SPAWN(rand(waittime_l, waittime_h))
+			send_intercept()
+
diff --git a/code/datums/gamemodes/pod_wars/pw_manufacturing_.dm b/code/datums/gamemodes/pod_wars/pw_manufacturing_.dm
index 065c54b0acc82..3f91bf8b05cd3 100644
--- a/code/datums/gamemodes/pod_wars/pw_manufacturing_.dm
+++ b/code/datums/gamemodes/pod_wars/pw_manufacturing_.dm
@@ -11,6 +11,8 @@
 		/obj/item/material_piece/molitz
 	)
 	available = list(
+		/datum/manufacture/pod/preassembeled_parts,
+		/datum/manufacture/putt/preassembeled_parts,
 		/datum/manufacture/pod_wars/lock,
 		/datum/manufacture/engine2,
 		/datum/manufacture/engine3,
@@ -57,6 +59,8 @@
 	name = "\improper NanoTrasen ship component fabricator"
 	team_num = TEAM_NANOTRASEN
 	available = list(
+		/datum/manufacture/pod/preassembeled_parts,
+		/datum/manufacture/putt/preassembeled_parts,
 		/datum/manufacture/pod_wars/lock,
 		/datum/manufacture/engine2,
 		/datum/manufacture/engine3,
@@ -84,6 +88,8 @@
 	name = "\improper Syndicate ship component fabricator"
 	team_num = TEAM_SYNDICATE
 	available = list(
+		/datum/manufacture/pod/preassembeled_parts,
+		/datum/manufacture/putt/preassembeled_parts,
 		/datum/manufacture/pod_wars/lock,
 		/datum/manufacture/engine2,
 		/datum/manufacture/engine3,
diff --git a/code/datums/gamemodes/pod_wars/pw_misc_objects.dm b/code/datums/gamemodes/pod_wars/pw_misc_objects.dm
index d6c82cff76098..57e99a9069e16 100644
--- a/code/datums/gamemodes/pod_wars/pw_misc_objects.dm
+++ b/code/datums/gamemodes/pod_wars/pw_misc_objects.dm
@@ -712,6 +712,7 @@ ABSTRACT_TYPE(/obj/deployable_turret/pod_wars)
 	event_handler_flags = USE_FLUID_ENTER
 	layer = OBJ_LAYER-0.1
 	stops_space_move = TRUE
+	var/icon_damaged = "barricade-damaged"
 
 	var/health = 100
 	var/health_max = 100
@@ -778,11 +779,78 @@ ABSTRACT_TYPE(/obj/deployable_turret/pod_wars)
 
 		//This works correctly because at the time of writing, these barricades cannot be repaired.
 		if (health < health_max/2)
-			icon_state = "barricade-damaged"
+			if (icon_damaged)
+				icon_state = icon_damaged
 
 		if (health <= 0)
 			qdel(src)
 
+/obj/barricade/barbed
+	name = "barbed barricade"
+	desc = "A barbed barricade. It looks like you can shoot over it but making contact with it might be tricky."
+	var/cooldown_time = 3 SECOND
+	var/overlay_state = "barricade_sharp"
+
+	New()
+		. = ..()
+		if(overlay_state)
+			var/overlay = image(src.icon, overlay_state)
+			UpdateOverlays(overlay, "barb")
+
+	proc/pokey(mob/target, poke_chance=33)
+		if(prob(poke_chance))
+			if(ON_COOLDOWN(target, "BARB_\ref[src]", src.cooldown_time)) return
+			target.visible_message("[target] gets caught up in [src]", "You get caught up in [src] and notice it has drawn blood.")
+			take_bleeding_damage(target, null, rand(3,7), DAMAGE_STAB)
+			return TRUE
+
+	Bumped(atom/AM)
+		. = ..()
+		if(ismob(AM))
+			var/mob/M = AM
+			if(M.m_intent != "walk")
+				pokey(M, 98)
+			else
+				pokey(M, 30)
+
+	attackby(var/obj/item/W, var/mob/user)
+		..()
+		pokey(user, 15)
+
+	attack_hand(mob/user)
+		..()
+		if (user.a_intent != INTENT_HELP)
+			pokey(user, 88)
+		else
+			pokey(user, 33)
+
+/obj/barricade/barbed/wire
+	name = "barbed wire"
+	desc = "A coiled length of barbed wire has been setup as a barricade."
+	icon_state = "bwire"
+	health = 50
+	health_max = 50
+	overlay_state = null
+	density = 0
+	icon_damaged = null
+
+	pokey(mob/target, poke_chance=33)
+		. = ..()
+		target.changeStatus("slowed", 1 SECONDS)
+		if(.)
+			target.changeStatus("slowed", 4 SECONDS)
+			target.TakeDamageAccountArmor("All", rand(1,2), 0, 0, DAMAGE_CUT)
+
+	Cross(atom/movable/mover)
+		if(ismob(mover))
+			var/mob/M = mover
+			if(M.m_intent != "walk")
+				pokey(M, 98)
+			else
+				pokey(M, 30)
+
+		return (!density)
+
 //barricade deployer
 
 /obj/item/deployer/barricade
@@ -827,8 +895,7 @@ ABSTRACT_TYPE(/obj/deployable_turret/pod_wars)
 			if (user)
 				newThing.add_fingerprint(user)
 				logTheThing(LOG_STATION, user, "builds \a [newThing] (<b>Material:</b> [newThing.material && newThing.material.getID() ? "[newThing.material.getID()]" : "*UNKNOWN*"]) at [log_loc(T)].")
-				user.u_equip(src)
-		qdel(src)
+		change_stack_amount(-1)
 		return newThing
 
 /obj/item_dispenser/barricade
diff --git a/code/datums/gamemodes/pod_wars/pw_weapons.dm b/code/datums/gamemodes/pod_wars/pw_weapons.dm
index b717fea37fb29..f119a7f2c9692 100644
--- a/code/datums/gamemodes/pod_wars/pw_weapons.dm
+++ b/code/datums/gamemodes/pod_wars/pw_weapons.dm
@@ -65,7 +65,7 @@ TYPEINFO(/obj/item/gun/energy/blaster_pod_wars)
 			ratio = round(ratio, 0.25) * 100
 			if (ratio == 0)
 				return
-			indicator_display.icon_state = "pw_pistol_power-[ratio]"
+			indicator_display.icon_state = "[icon_state]_power-[ratio]" //using icon_state to set the charge icon? probably fine.
 			indicator_display.color = display_color
 			UpdateOverlays(indicator_display, "ind_dis")
 
@@ -92,6 +92,64 @@ TYPEINFO(/obj/item/gun/energy/blaster_pod_wars)
 		initial_proj = /datum/projectile/laser/blaster/pod_pilot/red_SY
 		team_num = 2
 
+/obj/item/gun/energy/blaster_pod_wars/smg
+	name = "blaster smg"
+	desc = "A dangerous-looking blaster smg. It's self-charging by a radioactive power cell."
+	icon_state = "pw_smg"
+	item_state = "pw_smg"
+	w_class = W_CLASS_NORMAL
+	force = 12
+	cell_type = /obj/item/ammo/power_cell/self_charging/pod_wars_basic
+	initial_proj = /datum/projectile/laser/blaster/pod_pilot/blue_NT/smg
+	spread_angle = 10
+
+	New()
+		AddComponent(/datum/component/holdertargeting/fullauto, 2, 1.5, 1)
+		..()
+	nanotrasen
+		muzzle_flash = "muzzle_flash_plaser"
+		display_color =	"#3d9cff"
+		item_state = "pw_smg_nt"
+		initial_proj = /datum/projectile/laser/blaster/pod_pilot/blue_NT/smg
+		team_num = 1
+
+
+	syndicate
+		muzzle_flash = "muzzle_flash_laser"
+		display_color =	"#ff4043"
+		item_state = "pw_smg_sy"
+		initial_proj = /datum/projectile/laser/blaster/pod_pilot/red_SY/smg
+		team_num = 2
+
+
+
+/obj/item/gun/energy/blaster_pod_wars/shotgun
+	name = "blaster smg"
+	desc = "A dangerous-looking blaster shotgun. It's self-charging by a radioactive power cell."
+	icon_state = "pw_shotgun"
+	item_state = "pw_shotgun"
+	w_class = W_CLASS_NORMAL
+	force = 12
+	initial_proj = /datum/projectile/special/spreader/pwshotgunspread
+	cell_type = /obj/item/ammo/power_cell/self_charging/pod_wars_basic
+	two_handed = 1
+	can_dual_wield = 0
+	shoot_delay = 8 DECI SECONDS
+
+	nanotrasen
+		muzzle_flash = "muzzle_flash_plaser"
+		display_color =	"#3d9cff"
+		item_state = "pw_shotgun_nt"
+		initial_proj = /datum/projectile/special/spreader/pwshotgunspread/NT
+		team_num = 1
+
+	syndicate
+		muzzle_flash = "muzzle_flash_laser"
+		display_color =	"#ff4043"
+		item_state = "pw_shotgun_sy"
+		initial_proj = /datum/projectile/special/spreader/pwshotgunspread/SY
+		team_num = 2
+
 /obj/item/ammo/power_cell/higher_power
 	name = "power cell - 500"
 	desc = "A power cell that holds a max of 500PU"
diff --git a/code/datums/gamemodes/salvager.dm b/code/datums/gamemodes/salvager.dm
index c1122a4e69096..3664cf4efd228 100644
--- a/code/datums/gamemodes/salvager.dm
+++ b/code/datums/gamemodes/salvager.dm
@@ -38,7 +38,7 @@
 
 	possible_salvagers = get_possible_enemies(ROLE_SALVAGER, target_antag_count)
 	if (!length(possible_salvagers))
-		boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign any players as Salvagers, aborting salvager round pre-setup.</b>"))
+		//boutput(world, SPAN_ALERT("<b>ERROR: couldn't assign any players as Salvagers, aborting salvager round pre-setup.</b>"))
 		return 0
 	if( ( master_mode != config_tag )   \
 	 && ( (length(possible_salvagers) < minimum_salvagers) || (target_antag_count < minimum_salvagers) ) )
diff --git a/code/datums/gamemodes/spy_theft.dm b/code/datums/gamemodes/spy_theft.dm
index 9320da427d627..10b79df680bcf 100644
--- a/code/datums/gamemodes/spy_theft.dm
+++ b/code/datums/gamemodes/spy_theft.dm
@@ -320,7 +320,7 @@
 	station_bounties[/obj/item/clothing/suit/hazard/bio_suit] = 1
 	station_bounties[/obj/item/clothing/suit/hazard/paramedic] = 1
 	station_bounties[/obj/item/clothing/suit/judgerobe] = 1
-	station_bounties[/obj/item/clothing/suit/fire] = 1
+	station_bounties[/obj/item/clothing/suit/hazard/fire] = 1
 	station_bounties[/obj/item/clothing/suit/armor/vest] = 2
 
 	station_bounties[/obj/item/robodefibrillator] = 1
diff --git a/code/datums/gameticker.dm b/code/datums/gameticker.dm
index 391a6c6d2deba..a7fd9eae9ad94 100644
--- a/code/datums/gameticker.dm
+++ b/code/datums/gameticker.dm
@@ -121,20 +121,43 @@ var/global/current_state = GAME_STATE_INVALID
 	set background = 1
 	//Create and announce mode
 
-	switch(master_mode)
-		if("random","secret") src.mode = config.pick_random_mode()
-		if("action")
-			src.mode = config.pick_mode(pick("nuclear","wizard","blob"))
-			message_admins("[src.mode.name] was chosen from the \"action\" game mode pool!")
-		if("intrigue")
-			src.mode = config.pick_mode(pick(prob(300);"traitor", prob(200);"mixed_rp", prob(75);"changeling",prob(75);"vampire", prob(50);"spy_theft", prob(50);"arcfiend", prob(50);"salvager", prob(50);"extended", prob(50);"gang"))
-			message_admins("[src.mode.name] was chosen from the \"intrigue\" game mode pool!!")
-		if("pod_wars") src.mode = config.pick_mode("pod_wars")
-		else src.mode = config.pick_mode(master_mode)
-
-#if defined(MAP_OVERRIDE_POD_WARS)
-	src.mode = config.pick_mode("pod_wars")
-#endif
+	// try to roll a gamemode 10 times before giving up
+	var/attempts_left = 10
+	var/list/failed_modes = list()
+	while(attempts_left > 0)
+		switch(master_mode)
+			if("random","secret") src.mode = config.pick_random_mode(failed_modes)
+			if("action")
+				src.mode = config.pick_mode(pick("nuclear","wizard","blob"))
+			if("intrigue")
+				src.mode = config.pick_mode(pick(prob(300);"traitor", prob(200);"mixed_rp", prob(75);"changeling",prob(75);"vampire", prob(50);"spy_theft", prob(50);"arcfiend", prob(50);"salvager", prob(50);"extended"))
+			if("pod_wars") src.mode = config.pick_mode("pod_wars")
+			else src.mode = config.pick_mode(master_mode)
+
+		#if defined(MAP_OVERRIDE_POD_WARS)
+		src.mode = config.pick_mode("pod_wars")
+		#endif
+
+		//Configure mode and assign player to special mode stuff
+		var/can_continue = src.mode.pre_setup()
+
+		if(can_continue)
+			break
+		attempts_left--
+		failed_modes += src.mode.config_tag
+		// no point trying to do this 9 more times if we know whats gonna happen
+		if(src.mode.config_tag == master_mode)
+			attempts_left = 0
+		logTheThing(LOG_DEBUG, null, "Error setting up [mode] for [master_mode], trying [attempts_left] more times.")
+		qdel(src.mode)
+		src.mode = null
+
+	if(!src.mode)
+		logTheThing(LOG_DEBUG, null, "Gamemode selection on mode [master_mode] failed, reverting to pre-game lobby.")
+		boutput(world, "<B>Error setting up [master_mode].</B> reverting to pre-game lobby.")
+		current_state = GAME_STATE_PREGAME
+		SPAWN(0) pregame()
+		return 0
 
 	if(hide_mode)
 		#ifdef RP_MODE
@@ -149,20 +172,8 @@ var/global/current_state = GAME_STATE_INVALID
 	else
 		src.mode.announce()
 
-	//Configure mode and assign player to special mode stuff
-	var/can_continue = src.mode.pre_setup()
-
-	if(!can_continue)
-		qdel(mode)
-
-		current_state = GAME_STATE_PREGAME
-		boutput(world, "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby.")
-
-		SPAWN(0) pregame()
-
-		return 0
-
 	logTheThing(LOG_DEBUG, null, "Chosen game mode: [mode] ([master_mode]) on map [getMapNameFromID(map_setting)].")
+	message_admins("Chosen game mode: [mode] ([master_mode]).")
 
 	//Tell the participation recorder to queue player data while the round starts up
 	participationRecorder.setHold()
@@ -275,6 +286,7 @@ var/global/current_state = GAME_STATE_INVALID
 
 		//Tell the participation recorder that we're done FAFFING ABOUT
 		participationRecorder.releaseHold()
+		roundManagement.recordUpdate(mode)
 
 #ifdef BAD_MONKEY_NO_BANANA
 	for_by_tcl(monke, /mob/living/carbon/human/npc/monkey)
@@ -330,7 +342,6 @@ var/global/current_state = GAME_STATE_INVALID
 	proc/create_characters()
 		// SHOULD_NOT_SLEEP(TRUE)
 		for (var/mob/new_player/player in mobs)
-			var/ckey = player.mind?.ckey
 #ifdef TWITCH_BOT_ALLOWED
 			if (player.twitch_bill_spawn)
 				player.try_force_into_bill()
@@ -338,10 +349,14 @@ var/global/current_state = GAME_STATE_INVALID
 #endif
 
 			if (player.ready)
-				if (player.mind && ckey)
+				var/datum/player/P
+				if (player.mind)
+					P = player.mind.get_player()
+
+				if (player.mind.ckey)
 					//Record player participation in this round via the goonhub API
 					SPAWN(0)
-						participationRecorder.record(ckey)
+						participationRecorder.record(P)
 
 				if (player.mind && player.mind.assigned_role == "AI")
 					player.close_spawn_windows()
@@ -352,19 +367,19 @@ var/global/current_state = GAME_STATE_INVALID
 					player.close_spawn_windows()
 					logTheThing(LOG_DEBUG, player, "<b>Late join</b>: assigned antagonist role: wraith.")
 					SPAWN(0)
-						antagWeighter.record(role = ROLE_WRAITH, ckey = ckey)
+						antagWeighter.record(role = ROLE_WRAITH, P = P)
 
 				else if (player.mind && player.mind.special_role == ROLE_BLOB)
 					player.close_spawn_windows()
 					logTheThing(LOG_DEBUG, player, "<b>Late join</b>: assigned antagonist role: blob.")
 					SPAWN(0)
-						antagWeighter.record(role = ROLE_BLOB, ckey = ckey)
+						antagWeighter.record(role = ROLE_BLOB, P = P)
 
 				else if (player.mind && player.mind.special_role == ROLE_FLOCKMIND)
 					player.close_spawn_windows()
 					logTheThing(LOG_DEBUG, player, "<b>Late join</b>: assigned antagonist role: flockmind.")
 					SPAWN(0)
-						antagWeighter.record(role = ROLE_FLOCKMIND, ckey = ckey)
+						antagWeighter.record(role = ROLE_FLOCKMIND, P = P)
 
 				else if (player.mind)
 					if (player.client.using_antag_token && ticker.mode.antag_token_support)
@@ -542,15 +557,36 @@ var/global/current_state = GAME_STATE_INVALID
 			if (elapsed > 0)
 				ticker.round_elapsed_ticks += elapsed
 
+	proc/sendEvents()
+		// Antags and antag objectives
+		for (var/datum/antagonist/antagonist_role as anything in get_all_antagonists())
+			var/datum/mind/M = antagonist_role.owner
+			var/datum/eventRecord/Antag/antagEvent = new()
+			antagEvent.buildAndSend(antagonist_role)
+
+			if (M.objectives)
+				for (var/datum/objective/objective in M.objectives)
+	#ifdef CREW_OBJECTIVES
+					if (istype(objective, /datum/objective/crew)) continue
+	#endif
+					var/datum/eventRecord/AntagObjective/antagObjectiveEvent = new()
+					antagObjectiveEvent.buildAndSend(antagonist_role, objective)
+
+		// AI Laws
+		for_by_tcl(aiPlayer, /mob/living/silicon/ai)
+			var/laws[] = new()
+			if (aiPlayer.law_rack_connection)
+				laws = aiPlayer.law_rack_connection.format_for_irc()
+			for (var/key in laws)
+				var/datum/eventRecord/AILaw/aiLawEvent = new()
+				aiLawEvent.buildAndSend(aiPlayer, key, laws[key])
+
+
 /datum/controller/gameticker/proc/declare_completion()
 	//End of round statistic collection for goonhub
 	save_flock_stats()
-	//logTheThing(LOG_DEBUG, null, "Zamujasa: [world.timeofday] statlog_traitors")
-	statlog_traitors()
-	//logTheThing(LOG_DEBUG, null, "Zamujasa: [world.timeofday] statlog_ailaws")
-	statlog_ailaws(0)
-	//logTheThing(LOG_DEBUG, null, "Zamujasa: [world.timeofday] round_end_data")
-	round_end_data(1) //Export round end packet (normal completion)
+	src.sendEvents()
+	roundManagement.recordEnd()
 
 	var/pets_rescued = 0
 	for(var/pet in by_cat[TR_CAT_PETS])
@@ -802,16 +838,18 @@ var/global/current_state = GAME_STATE_INVALID
 					logTheThing(LOG_DEBUG, null, "[player.ckey] lost held item")
 					player.client.persistent_bank_item = "none"
 
-				bulk_commit[player.ckey] = list(
-					"persistent_bank" = list(
-						"command" = "add",
-						"value" = earnings
-					),
-					"persistent_bank_item" = list(
-						"command" = "replace",
-						"value" = player.client.persistent_bank_item
+				if (player.client.player.id)
+					bulk_commit["[bulk_commit.len + 1]"] = list(
+						"player_id" = player.client.player.id,
+						"key" = "persistent_bank",
+						"value" = player.client.persistent_bank + earnings
 					)
+					bulk_commit["[bulk_commit.len + 1]"] = list(
+						"player_id" = player.client.player.id,
+						"key" = "persistent_bank_item",
+						"value" = player.client.persistent_bank_item
 				)
+
 				SPAWN(0)
 					bank_earnings.pilot_bonus = pilot_bonus
 					bank_earnings.final_payout = earnings
@@ -823,7 +861,7 @@ var/global/current_state = GAME_STATE_INVALID
 
 	//do bulk commit
 	SPAWN(0)
-		cloud_put_bulk(json_encode(bulk_commit))
+		cloud_saves_put_data_bulk(bulk_commit)
 		logTheThing(LOG_DEBUG, null, "Done with spacebux")
 
 	for_by_tcl(P, /obj/bookshelf/persistent) //make the bookshelf save its contents
@@ -855,6 +893,7 @@ var/global/current_state = GAME_STATE_INVALID
 				SPAWN(0) show_xp_summary(E.key, E)
 	logTheThing(LOG_DEBUG, null, "Did credits")
 
+	var/count = 1
 	var/list/playtimes = list() //associative list with the format list("ckeys\[[player_ckey]]" = playtime_in_seconds)
 	for_by_tcl(P, /datum/player)
 		if (!P.ckey)
@@ -862,12 +901,17 @@ var/global/current_state = GAME_STATE_INVALID
 		P.log_leave_time() //get our final playtime for the round (wont cause errors with people who already d/ced bc of smart code)
 		if (!P.current_playtime)
 			continue
-		playtimes["ckeys\[[P.ckey]]"] = round((P.current_playtime / (1 SECOND))) //rounds 1/10th seconds to seconds
+		playtimes["[count]"] = list("id" = P.id, "seconds_played" = round((P.current_playtime / (1 SECOND)))) //rounds 1/10th seconds to seconds
+		count++
+
 	try
-		apiHandler.queryAPI("playtime/record-multiple", playtimes)
-	catch(var/exception/e)
-		logTheThing(LOG_DEBUG, null, "playtime was unable to be logged because of: [e.name]")
-		logTheThing(LOG_DIARY, null, "playtime was unable to be logged because of: [e.name]", "debug")
+		var/datum/apiRoute/players/playtime/addPlaytime = new
+		addPlaytime.buildBody(config.server_id, playtimes)
+		apiHandler.queryAPI(addPlaytime)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "playtime was unable to be logged because of: [error.message]")
+		logTheThing(LOG_DIARY, null, "playtime was unable to be logged because of: [error.message]", "debug")
 
 	if(global.lag_detection_process.automatic_profiling_on)
 		global.lag_detection_process.automatic_profiling(force_stop=TRUE)
diff --git a/code/datums/gauntlet/crittergauntlet.dm b/code/datums/gauntlet/crittergauntlet.dm
index 4274cbf18f4b8..13a81ed8f51dc 100644
--- a/code/datums/gauntlet/crittergauntlet.dm
+++ b/code/datums/gauntlet/crittergauntlet.dm
@@ -291,7 +291,8 @@
 				C.add_centcom_report(ALERT_GENERAL, command_report)
 
 			command_alert(command_report, "Critter Gauntlet match finished")
-		statlog_gauntlet(moblist_names, score, current_level)
+		var/datum/eventRecord/GauntletHighScore/gauntletHighScoreEvent = new()
+		gauntletHighScoreEvent.send(moblist_names, score, current_level)
 
 		SPAWN(0)
 			for (var/obj/item/I in staging)
@@ -1233,21 +1234,18 @@ var/global/datum/arena/gauntletController/gauntlet_controller = new()
 		count = 10
 		types = list(/mob/living/critter/small_animal/floateye)
 
-/proc/queryGauntletMatches(data)
-	if (islist(data) && data["data_hub_callback"])
-		logTheThing(LOG_DEBUG, null, "<b>Marquesas/Gauntlet Query:</b> Invoked (data is [data])")
-		for (var/userkey in data["keys"])
-			logTheThing(LOG_DEBUG, null, "<b>Marquesas/Gauntlet Query:</b> Got key [userkey].")
-			var/matches = data[userkey]
-			logTheThing(LOG_DEBUG, null, "<b>Marquesas/Gauntlet Query:</b> Matches for [userkey]: [matches].")
-			var/obj/item/card/id/gauntlet/G = locate("gauntlet-id-[userkey]") in world
-			if (G && istype(G))
-				G.SetMatchCount(text2num(matches))
-			else
-				logTheThing(LOG_DEBUG, null, "<b>Marquesas/Gauntlet Query:</b> Could not locate ID 'gauntlet-id-[userkey]'.")
-				return 1
-
+/proc/queryGauntletMatches(key)
+	var/datum/apiModel/PreviousGauntlets/previousGauntlets
+	try
+		var/datum/apiRoute/gauntlet/getprevious/getPreviousGauntlets = new
+		getPreviousGauntlets.queryParams = list("key" = key)
+		previousGauntlets = apiHandler.queryAPI(getPreviousGauntlets)
+	catch
+		return FALSE
+
+	var/obj/item/card/id/gauntlet/G = locate("gauntlet-id-[key]") in world
+	if (G && istype(G))
+		G.SetMatchCount(previousGauntlets.gauntlets_completed)
 	else
-		var/list/query = list()
-		query["key"] = data
-		apiHandler.queryAPI("gauntlet/getPrevious", query)
+		logTheThing(LOG_DEBUG, null, "<b>Marquesas/Gauntlet Query:</b> Could not locate ID 'gauntlet-id-[key]'.")
+		return FALSE
diff --git a/code/datums/hud/critter.dm b/code/datums/hud/critter.dm
index b37ecd47fb763..0749f15bdcfd7 100644
--- a/code/datums/hud/critter.dm
+++ b/code/datums/hud/critter.dm
@@ -77,8 +77,7 @@
 	if (src.master.can_bleed)
 		src.create_bleeding_element()
 
-	if (src.master.can_throw)
-		src.create_throwing_element()
+	src.create_throwing_element()
 
 	src.create_intent_element()
 	src.create_pulling_element()
@@ -265,7 +264,8 @@
 			if ("throw")
 				var/icon_y = text2num(params["icon-y"])
 				if (icon_y > 16 || src.master.in_throw_mode)
-					src.master.toggle_throw_mode()
+					if (src.master.can_throw)
+						src.master.toggle_throw_mode()
 				else
 					src.master.drop_item(null, TRUE)
 			if ("resist")
@@ -532,7 +532,7 @@
 	src.bleeding.desc = "This indicator warns that you are currently bleeding. You will die if the situation is not remedied."
 
 /datum/hud/critter/proc/create_throwing_element()
-	src.throwing = src.create_screen("throw", "throw mode", src.hud_icon, "throw0",\
+	src.throwing = src.create_screen("throw", "throw mode", src.hud_icon, src.master.can_throw ? "throw0" : "drop0",\
 	"CENTER[src.next_right()], SOUTH", HUD_LAYER_1)
 
 /datum/hud/critter/proc/create_intent_element()
diff --git a/code/datums/hud/gang_victory.dm b/code/datums/hud/gang_victory.dm
new file mode 100644
index 0000000000000..80fe7f899e035
--- /dev/null
+++ b/code/datums/hud/gang_victory.dm
@@ -0,0 +1,52 @@
+/datum/hud/gang_victory
+	click_check = 0
+	var/atom/movable/screen/text
+
+	New(datum/gang/winning_gang)
+		//big gang name victory text
+		src.text = create_screen("gangvictory", "Gang Victory Display", null, "", "NORTH,CENTER", HUD_LAYER_3)
+		text.maptext = "<span class='c ol vga vt' style='background: #00000080;font-size: 5;'>[winning_gang.gang_name] won the round!</span>"
+		text.maptext_width = 600
+		text.maptext_x = -(600 / 2) + 16
+		text.maptext_y = -150
+		text.maptext_height = 100
+		text.plane = PLANE_HUD
+		text.layer = 420
+
+		//individual gang member portraits
+		var/member_count = 0
+		var/list/members = winning_gang.members
+		members.Insert(round(length(members)/2), winning_gang.leader) //put the leader roughly in the middle
+		for (var/datum/mind/gang_mind in members)
+			var/mob/ganger = gang_mind.current
+			if (!ganger) //paranoia because we REALLY don't want to blow up the round-end stack
+				continue
+
+			if (isliving(ganger) && isdead(ganger))
+				if (!ganger.ghost)
+					ganger = ganger.ghostize()
+				else
+					ganger = ganger.ghost
+
+			var/position = -round(length(members)/2) + member_count
+			var/position_string = "CENTER[position > 0 ? "+" : ""][position ? position : ""], CENTER+1.8"
+
+			//getFlatIcon's dir argument doesn't work here for some reason
+			var/old_dir = ganger.dir
+			ganger.set_dir(SOUTH)
+			var/icon/flat_icon = getFlatIcon(ganger)
+			ganger.set_dir(old_dir)
+
+			var/atom/movable/screen/screen_obj = create_screen("gang_member[member_count]", ganger.real_name, null, "", position_string, mouse_opacity=FALSE)
+			screen_obj.Scale(2,2)
+			screen_obj.icon = flat_icon
+
+			var/atom/movable/screen/nametag = create_screen("gang_member[member_count]_name", ganger.real_name, null, "", position_string, mouse_opacity=FALSE)
+			nametag.maptext_y = 40
+			nametag.maptext_x = -32
+			//centered, pixel, drop shadow (I love readable class names!)
+			nametag.maptext = "<span class='c pixel sh' [gang_mind == winning_gang.leader ? "style='color: #FFD149;'" : ""]>[ganger.real_name]</span>"
+			nametag.maptext_width = 100
+
+			member_count++
+		..()
diff --git a/code/datums/hud/human.dm b/code/datums/hud/human.dm
index cb0bb30ce5e9d..1175e1c373098 100644
--- a/code/datums/hud/human.dm
+++ b/code/datums/hud/human.dm
@@ -852,14 +852,15 @@
 
 		if (istype(master.loc,/obj/vehicle/)) //so we always see vehicle buttons
 			var/obj/vehicle/V = master.loc
-			for(var/obj/ability_button/B2 in V.ability_buttons)
-				B2.screen_loc = "NORTH-[pos_y],[pos_x]"
-				master.client.screen += B2
-				B2.the_mob = master
-				pos_x++
-				if(pos_x > 15)
-					pos_x = 1
-					pos_y++
+			if (V.rider == src.master) //unless we're a passenger
+				for(var/obj/ability_button/B2 in V.ability_buttons)
+					B2.screen_loc = "NORTH-[pos_y],[pos_x]"
+					master.client.screen += B2
+					B2.the_mob = master
+					pos_x++
+					if(pos_x > 15)
+						pos_x = 1
+						pos_y++
 
 
 	proc/update_sprinting()
diff --git a/code/datums/hud/robot.dm b/code/datums/hud/robot.dm
index 7aef58becff6e..3e8593c17dc01 100644
--- a/code/datums/hud/robot.dm
+++ b/code/datums/hud/robot.dm
@@ -1,10 +1,18 @@
 /atom/movable/screen/hud/robotstorage
 	MouseEntered(location, control, params)
+		// there is no reason for master to ever be something other than /datum/hud/silicon here
+		// and yet
+		if(istype(src.master, /datum/hud/silicon/robot))
+			var/datum/hud/silicon/robot/hud = src.master
+			if(usr != hud.silicon) return
 		if (src.name)
 			src.maptext_x = 34
 			src.maptext_width = 128
 			src.maptext = "<span class='vm l pixel sh'>[src.name]</span>"
 	MouseExited(location, control, params)
+		if(istype(src.master, /datum/hud/silicon/robot))
+			var/datum/hud/silicon/robot/hud = src.master
+			if(usr != hud.silicon) return
 		src.maptext = null
 
 /datum/hud/silicon/robot
@@ -170,31 +178,19 @@
 			if(!O || O.loc != master.module)
 				return
 			if(!master.module_states[1] && istype(master.part_arm_l,/obj/item/parts/robot_parts/arm/))
-				master.module_states[1] = O
-				O.set_loc(master)
-				O.pickup(master) // Handle light datums and the like.
+				master.equip_slot(1, O)
 			else if(!master.module_states[2])
-				master.module_states[2] = O
-				O.set_loc(master)
-				O.pickup(master)
+				master.equip_slot(2, O)
 			else if(!master.module_states[3] && istype(master.part_arm_r,/obj/item/parts/robot_parts/arm/))
-				master.module_states[3] = O
-				O.set_loc(master)
-				O.pickup(master)
+				master.equip_slot(3, O)
 			else
 				master.uneq_active()
 				if(!master.module_states[1] && istype(master.part_arm_l,/obj/item/parts/robot_parts/arm/))
-					master.module_states[1] = O
-					O.set_loc(master)
-					O.pickup(master)
+					master.equip_slot(1, O)
 				else if(!master.module_states[2])
-					master.module_states[2] = O
-					O.set_loc(master)
-					O.pickup(master)
+					master.equip_slot(2, O)
 				else if(!master.module_states[3] && istype(master.part_arm_r,/obj/item/parts/robot_parts/arm/))
-					master.module_states[3] = O
-					O.set_loc(master)
-					O.pickup(master)
+					master.equip_slot(3, O)
 			update_equipment()
 			update_tools()
 
diff --git a/code/datums/jobs.dm b/code/datums/jobs.dm
index 90840362327c1..aaa4db51b9ade 100644
--- a/code/datums/jobs.dm
+++ b/code/datums/jobs.dm
@@ -152,9 +152,7 @@ ABSTRACT_TYPE(/datum/job/command)
 	wages = PAY_EXECUTIVE
 	high_priority_job = 1
 	receives_miranda = 1
-#ifdef RP_MODE
 	allow_traitors = 0
-#endif
 	cant_spawn_as_rev = 1
 	announce_on_join = 1
 	allow_spy_theft = 0
@@ -324,7 +322,7 @@ ABSTRACT_TYPE(/datum/job/command)
 	wiki_link = "https://wiki.ss13.co/Chief_Engineer"
 
 	slot_back = list(/obj/item/storage/backpack/engineering)
-	slot_belt = list(/obj/item/device/pda2/chiefengineer)
+	slot_belt = list(/obj/item/storage/belt/utility/prepared/ceshielded)
 	slot_glov = list(/obj/item/clothing/gloves/yellow)
 	slot_foot = list(/obj/item/clothing/shoes/brown)
 	slot_head = list(/obj/item/clothing/head/helmet/hardhat/chief_engineer)
@@ -332,6 +330,7 @@ ABSTRACT_TYPE(/datum/job/command)
 	slot_jump = list(/obj/item/clothing/under/rank/chief_engineer)
 	slot_ears = list(/obj/item/device/radio/headset/command/ce)
 	slot_poc1 = list(/obj/item/paper/book/from_file/pocketguide/engineering)
+	slot_poc2 = list(/obj/item/device/pda2/chiefengineer)
 	items_in_backpack = list(/obj/item/device/flash, /obj/item/rcd_ammo/medium)
 
 	special_setup(var/mob/living/carbon/human/M)
@@ -2325,41 +2324,6 @@ ABSTRACT_TYPE(/datum/job/special/halloween/critter)
 		M.critterize(type)
 */
 
-/datum/job/special/syndicate_operative
-	name = "Syndicate Operative"
-	wages = 0
-	limit = 0
-	linkcolor = "#880000"
-	slot_ears = list() // So they don't get a default headset and stuff first.
-	slot_card = null
-	slot_glov = list()
-	slot_foot = list()
-	slot_back = list()
-	slot_belt = list()
-	spawn_id = 0
-	radio_announcement = FALSE
-	special_spawn_location = LANDMARK_SYNDICATE
-	var/leader = FALSE
-	add_to_manifest = FALSE
-	wiki_link = "https://wiki.ss13.co/Nuclear_Operative"
-
-	faction = FACTION_SYNDICATE
-
-	special_setup(var/mob/living/carbon/human/M)
-		..()
-		if (!M?.mind)
-			return
-
-		if (src.leader)
-			M.mind.add_antagonist(ROLE_NUKEOP_COMMANDER, do_objectives = FALSE, source = ANTAGONIST_SOURCE_ADMIN)
-		else
-			M.mind.add_antagonist(ROLE_NUKEOP, do_objectives = FALSE, source = ANTAGONIST_SOURCE_ADMIN)
-
-/datum/job/special/syndicate_operative/leader
-	name = "Syndicate Operative Commander"
-	special_spawn_location = LANDMARK_SYNDICATE_BOSS
-	leader = TRUE
-
 /datum/job/special/syndicate_weak
 	linkcolor = "#880000"
 	name = "Junior Syndicate Operative"
diff --git a/code/datums/manufacturing.dm b/code/datums/manufacturing.dm
index 75a1c8ef1bac3..288d2f2f6e696 100644
--- a/code/datums/manufacturing.dm
+++ b/code/datums/manufacturing.dm
@@ -120,6 +120,16 @@ ABSTRACT_TYPE(/datum/manufacture)
 	create = 1
 	frame_path = /obj/disposalpipe/loafer
 
+/******************** Communications Dish *******************/
+
+/datum/manufacture/mechanics/comms_dish
+	name = "Communications Dish"
+	item_paths = list("MET-1", "MET-2", "INS-1" , "CON-1")
+	item_amounts = list(20,10,20,20)
+	time = 60 SECONDS
+	create = 1
+	frame_path = /obj/machinery/communications_dish
+
 /******************** AI Law Rack *******************/
 
 /datum/manufacture/mechanics/lawrack
@@ -990,6 +1000,15 @@ ABSTRACT_TYPE(/datum/manufacture)
 	create = 1
 	category = "Tool"
 
+/datum/manufacture/pocketoxyex
+	name = "Extended Capacity Pocket Oxygen Tank"
+	item_paths = list("DEN-2","INS-1", "RUB")
+	item_amounts = list(10, 20, 5)
+	item_outputs = list(/obj/item/tank/emergency_oxygen/extended/empty)
+	time = 5 SECONDS
+	create = 1
+	category = "Tool"
+
 /******************** Medical **************************/
 
 /datum/manufacture/scalpel
@@ -1352,159 +1371,176 @@ ABSTRACT_TYPE(/datum/manufacture)
 /datum/manufacture/robo_frame
 	name = "Cyborg Frame"
 	item_paths = list("MET-2")
-	item_amounts = list(18)
+	item_amounts = list(ROBOT_FRAME_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/robot_frame)
 	time = 45 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/full_cyborg_standard
 	name = "Standard Cyborg Parts"
 	item_paths = list("MET-2")
-	item_amounts = list(48)
+	item_amounts = list((ROBOT_CHEST_COST + ROBOT_HEAD_COST + ROBOT_LIMB_COST * 4) * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/chest/standard,/obj/item/parts/robot_parts/head/standard,
 /obj/item/parts/robot_parts/arm/right/standard,/obj/item/parts/robot_parts/arm/left/standard,
 /obj/item/parts/robot_parts/leg/right/standard,/obj/item/parts/robot_parts/leg/left/standard)
 	time = 120 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/full_cyborg_light
 	name = "Light Cyborg Parts"
 	item_paths = list("MET-2")
-	item_amounts = list(24)
+	item_amounts = list((ROBOT_CHEST_COST + ROBOT_HEAD_COST + ROBOT_LIMB_COST * 4) * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/chest/light,/obj/item/parts/robot_parts/head/light,
 /obj/item/parts/robot_parts/arm/right/light,/obj/item/parts/robot_parts/arm/left/light,
 /obj/item/parts/robot_parts/leg/right/light,/obj/item/parts/robot_parts/leg/left/light)
 	time = 62 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_chest
 	name = "Cyborg Chest"
 	item_paths = list("MET-2")
-	item_amounts = list(12)
+	item_amounts = list(ROBOT_CHEST_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/chest/standard)
 	time = 30 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_chest_light
 	name = "Light Cyborg Chest"
 	item_paths = list("MET-2")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_CHEST_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/chest/light)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_head
 	name = "Cyborg Head"
 	item_paths = list("MET-2")
-	item_amounts = list(12)
+	item_amounts = list(ROBOT_HEAD_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/head/standard)
 	time = 30 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_head_screen
 	name = "Cyborg Screen Head"
 	item_paths = list("MET-2","CON-1","CRY-1")
-	item_amounts = list(6,2,6)
+	item_amounts = list(ROBOT_SCREEN_METAL_COST * 10,2,6)
 	item_outputs = list(/obj/item/parts/robot_parts/head/screen)
 	time = 24 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_head_light
 	name = "Light Cyborg Head"
 	item_paths = list("MET-1")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_HEAD_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/head/light)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_arm_r
 	name = "Cyborg Arm (Right)"
 	item_paths = list("MET-2")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_LIMB_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/arm/right/standard)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_arm_r_light
 	name = "Light Cyborg Arm (Right)"
 	item_paths = list("MET-1")
-	item_amounts = list(3)
+	item_amounts = list(ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/arm/right/light)
 	time = 8 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_arm_l
 	name = "Cyborg Arm (Left)"
 	item_paths = list("MET-2")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_LIMB_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/arm/left/standard)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_arm_l_light
 	name = "Light Cyborg Arm (Left)"
 	item_paths = list("MET-1")
-	item_amounts = list(3)
+	item_amounts = list(ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/arm/left/light)
 	time = 8 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_leg_r
 	name = "Cyborg Leg (Right)"
 	item_paths = list("MET-2")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_LIMB_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/right/standard)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_leg_r_light
 	name = "Light Cyborg Leg (Right)"
 	item_paths = list("MET-1")
-	item_amounts = list(3)
+	item_amounts = list(ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/right/light)
 	time = 8 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_leg_l
 	name = "Cyborg Leg (Left)"
 	item_paths = list("MET-2")
-	item_amounts = list(6)
+	item_amounts = list(ROBOT_LIMB_COST * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/left/standard)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_leg_l_light
 	name = "Light Cyborg Leg (Left)"
 	item_paths = list("MET-1")
-	item_amounts = list(3)
+	item_amounts = list(ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/left/light)
 	time = 8 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_leg_treads
 	name = "Cyborg Treads"
 	item_paths = list("MET-2","CON-1")
-	item_amounts = list(12,6)
+	item_amounts = list(ROBOT_TREAD_METAL_COST * 2 * 10,6)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/left/treads, /obj/item/parts/robot_parts/leg/right/treads)
 	time = 15 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /datum/manufacture/robo_module
 	name = "Blank Cyborg Module"
@@ -1881,11 +1917,12 @@ ABSTRACT_TYPE(/datum/manufacture)
 /datum/manufacture/thrusters
 	name = "Alastor Pattern Thrusters"
 	item_paths = list("MET-2")
-	item_amounts = list(50)
+	item_amounts = list(ROBOT_THRUSTER_COST * 2 * 10)
 	item_outputs = list(/obj/item/parts/robot_parts/leg/right/thruster,/obj/item/parts/robot_parts/leg/left/thruster)
 	time = 120 SECONDS
 	create = 1
 	category = "Component"
+	apply_material = 1
 
 /******************** Science **************************/
 
diff --git a/code/datums/movement_controller/tank.dm b/code/datums/movement_controller/tank.dm
index 8029c1ecc1a50..e1433c7044bd4 100644
--- a/code/datums/movement_controller/tank.dm
+++ b/code/datums/movement_controller/tank.dm
@@ -44,6 +44,8 @@
 	keys_changed(mob/user, keys, changed)
 		if (istype(src.owner, /obj/machinery/vehicle/tank/minisub/escape_sub) || !owner)
 			return
+		if(user != src.owner.pilot)
+			return
 		if(changed & KEY_SHOCK)
 			shooting = keys & KEY_SHOCK
 		if (changed & (KEY_FORWARD|KEY_BACKWARD|KEY_RIGHT|KEY_LEFT))
@@ -72,6 +74,9 @@
 		if (istype(src.owner, /obj/machinery/vehicle/tank/minisub/escape_sub))
 			return
 
+		if(user != src.owner.pilot)
+			return
+
 		var/can_user_act = user && user == owner.pilot && !user.getStatusDuration("stunned") && !user.getStatusDuration("weakened") && !user.getStatusDuration("paralysis") && !isdead(user)
 
 		if(shooting && owner.m_w_system?.active && can_user_act && !GET_COOLDOWN(owner.m_w_system, "fire"))
diff --git a/code/datums/movement_modifier/movement_modifiers.dm b/code/datums/movement_modifier/movement_modifiers.dm
index 841f80fde9035..75b3ac7e7a0c2 100644
--- a/code/datums/movement_modifier/movement_modifiers.dm
+++ b/code/datums/movement_modifier/movement_modifiers.dm
@@ -82,7 +82,7 @@
 		return list(0,0.85)
 	return list(0,0.5)
 
-// robot legs
+// robot legs for humans
 /datum/movement_modifier/robotleg_right
 	health_deficiency_adjustment = -25
 
@@ -98,12 +98,15 @@
 	additive_slowdown = -0.25
 
 // robot modifiers
-/datum/movement_modifier/robot_base
+/datum/movement_modifier/robot_part/robot_base
 	health_deficiency_adjustment = -INFINITY
 	mob_pull_multiplier = 0.2 //make borgs pull mobs slightly slower than full speed (roundstart light borg will pull a corpse at ~1.3 delay, as opposed to ~1 when unencumbered)
 
+/datum/movement_modifier/robot_oil/fresh
+	multiplicative_slowdown = 0.5
+
 /datum/movement_modifier/robot_oil
-	additive_slowdown = -0.5
+	multiplicative_slowdown = 0.85
 
 /datum/movement_modifier/spry
 	additive_slowdown = -0.25
@@ -119,14 +122,50 @@
 		. *= 0.75
 	return list(0, .)
 
-/datum/movement_modifier/robot_part/head
-	additive_slowdown = -0.2
+// robot heads
+/datum/movement_modifier/robot_part/light_head
+	additive_slowdown = -0.1
+
+/datum/movement_modifier/robot_part/standard_head
+	additive_slowdown = -0.05
+
+/datum/movement_modifier/robot_part/sturdy_head
+	additive_slowdown = 0.05
+
+/datum/movement_modifier/robot_part/heavy_head
+	additive_slowdown = 0.35
+
+// robot arms
+/datum/movement_modifier/robot_part/light_arm_left
+	additive_slowdown = -0.05
+
+/datum/movement_modifier/robot_part/light_arm_right
+	additive_slowdown = -0.05
+
+/datum/movement_modifier/robot_part/sturdy_arm_left
+	additive_slowdown = 0.1
+
+/datum/movement_modifier/robot_part/sturdy_arm_right
+	additive_slowdown = 0.1
 
-/datum/movement_modifier/robot_part/arm_left
-	additive_slowdown = -0.2
+/datum/movement_modifier/robot_part/heavy_arm_left
+	additive_slowdown = 0.2
 
-/datum/movement_modifier/robot_part/arm_right
-	additive_slowdown = -0.2
+/datum/movement_modifier/robot_part/heavy_arm_right
+	additive_slowdown = 0.2
+
+// robot legs
+/datum/movement_modifier/robot_part/light_leg_left
+	additive_slowdown = -0.15
+
+/datum/movement_modifier/robot_part/light_leg_right
+	additive_slowdown = -0.15
+
+/datum/movement_modifier/robot_part/standard_leg_left
+	additive_slowdown = -0.1
+
+/datum/movement_modifier/robot_part/standard_leg_right
+	additive_slowdown = -0.1
 
 /datum/movement_modifier/robot_part/tread_left
 	additive_slowdown = -0.25
@@ -140,6 +179,14 @@
 /datum/movement_modifier/robot_part/thruster_right
 	additive_slowdown = -0.3
 
+// robot chests
+/datum/movement_modifier/robot_part/light_chest
+	additive_slowdown = -0.1
+
+/datum/movement_modifier/robot_part/standard_chest
+	additive_slowdown = -0.05
+
+
 // artifact legs
 /datum/movement_modifier/martian_legs/left
 	health_deficiency_adjustment = -35
@@ -188,18 +235,16 @@
 
 /datum/movement_modifier/vampiric_thrall/modifiers(mob/user, move_target, running)
 	. = list(4,0)
-	if (ishuman(user))
-		var/mob/living/carbon/human/H = user
-		var/datum/mutantrace/vampiric_thrall/vampiric_thrall = H.mutantrace
-		if (!istype(vampiric_thrall))
-			return
-		switch (vampiric_thrall.blood_points)
-			if (151 to INFINITY)
-				.[1] = 0.7
-			if (101 to 151)
-				.[1] = 1.6
-			if (51 to 101)
-				.[1] = 2.8
+	var/datum/abilityHolder/vampiric_thrall/thrallHolder = user.get_ability_holder(/datum/abilityHolder/vampiric_thrall)
+	if (!thrallHolder)
+		return
+	switch (thrallHolder.points)
+		if (151 to INFINITY)
+			.[1] = 0.7
+		if (101 to 151)
+			.[1] = 1.6
+		if (51 to 101)
+			.[1] = 2.8
 
 /datum/movement_modifier/wheelchair
 	ask_proc = 1
diff --git a/code/datums/mutantraces.dm b/code/datums/mutantraces.dm
index 5ab4eec767e80..88f95d75380d6 100644
--- a/code/datums/mutantraces.dm
+++ b/code/datums/mutantraces.dm
@@ -139,8 +139,10 @@ ABSTRACT_TYPE(/datum/mutantrace)
 	var/list/typevulns
 
 	/// ignores suffocation from being underwater + moves at full speed underwater
-	var/aquatic = 0
-	var/needs_oxy = 1
+	var/aquatic = FALSE
+	/// Takes burn damage and hygiene loss on contact with water
+	var/aquaphobic = FALSE
+	var/needs_oxy = TRUE
 
 	var/voice_override = 0
 	var/step_override = null
@@ -1037,16 +1039,6 @@ ABSTRACT_TYPE(/datum/mutantrace)
 	jerk = TRUE
 	genetics_removable = FALSE
 
-	var/blood_points = 0
-#ifdef RP_MODE
-	var/blood_decay = 0.25
-#else
-	var/blood_decay = 0.5
-#endif
-	var/cleanable_tally = 0
-	var/blood_to_health_scalar = 0.75 //200 blood = 150 health
-	var/min_max_health = 40 //! Minimum health we can get to via blood loss. also lol
-
 	on_attach(var/mob/living/carbon/human/M)
 		..()
 		if(ishuman(src.mob))
@@ -1064,25 +1056,6 @@ ABSTRACT_TYPE(/datum/mutantrace)
 			//REMOVE_ATOM_PROPERTY(src.mob, PROP_MOB_STAMINA_REGEN_BONUS, "vampiric_thrall")
 		..()
 
-
-	onLife(var/mult = 1)
-		..()
-
-		if (src.mob.bleeding)
-			blood_points -= blood_decay * src.mob.bleeding
-
-		var/prev_blood = blood_points
-		blood_points -= blood_decay * mult
-		blood_points = max(0,blood_points)
-		cleanable_tally += (prev_blood - blood_points)
-		if (cleanable_tally > 20)
-			make_cleanable(/obj/decal/cleanable/blood,get_turf(src.mob))
-			cleanable_tally = 0
-
-		src.mob.max_health = blood_points * blood_to_health_scalar
-		src.mob.max_health = max(src.min_max_health, src.mob.max_health)
-		health_update_queue |= src.mob
-
 	emote(var/act)
 		var/message = null
 		if(act == "scream")
@@ -1880,6 +1853,20 @@ ABSTRACT_TYPE(/datum/mutantrace)
 			src.mob.mob_flags &= ~SHOULD_HAVE_A_TAIL
 		. = ..()
 
+/datum/mutantrace/cat/bingus // our beloved
+	name = "bingus"
+	icon = 'icons/mob/bingus.dmi'
+	race_mutation = /datum/bioEffect/mutantrace/cat/bingus
+	mutant_organs = list("tail" = /obj/item/organ/tail/cat/bingus)
+	mutant_folder = 'icons/mob/bingus.dmi'
+	dna_mutagen_banned = FALSE
+	genetics_removable = FALSE
+	aquaphobic = TRUE
+	mutant_appearance_flags = (NOT_DIMORPHIC | HAS_NO_SKINTONE | HAS_NO_EYES | HAS_NO_HEAD | USES_STATIC_ICON)
+	r_limb_arm_type_mutantrace = /obj/item/parts/human_parts/arm/mutant/cat/bingus/right
+	l_limb_arm_type_mutantrace = /obj/item/parts/human_parts/arm/mutant/cat/bingus/left
+	r_limb_leg_type_mutantrace = /obj/item/parts/human_parts/leg/mutant/cat/bingus/right
+	l_limb_leg_type_mutantrace = /obj/item/parts/human_parts/leg/mutant/cat/bingus/left
 
 /datum/mutantrace/amphibian
 	name = "amphibian"
@@ -2220,7 +2207,7 @@ ABSTRACT_TYPE(/datum/mutantrace)
 	emote(var/act, var/voluntary)
 		switch(act)
 			if ("scream")
-				if (src.mob.emote_check(voluntary, 50))
+				if (src.mob.emote_check(voluntary, 50) && !src.mob.bioHolder.HasEffect("mute"))
 					. = "<B>[src.mob]</B> moos!"
 					playsound(src.mob, 'sound/voice/screams/moo.ogg', 50, 0, 0, src.mob.get_age_pitch(), channel=VOLUME_CHANNEL_EMOTE)
 			if ("milk")
@@ -2403,7 +2390,7 @@ TYPEINFO(/datum/mutantrace/pug)
 
 	proc/throw_response(target, item, thrower)
 		// Don't dive at things we throw; don't dive if we're stunned or dead; dive 15% of the time, 100% at limbs
-		if (src.mob == thrower || is_incapacitated(src.mob) || (prob(85) && !istype(item, /obj/item/parts)))
+		if (src.mob == thrower || is_incapacitated(src.mob) || (prob(85) && !(istype(item, /obj/item/parts) || istype(item, /obj/item/material_piece/bone))))
 			return
 		src.mob.throw_at(get_turf(item), 1, 1)
 		src.mob.visible_message(SPAN_ALERT("[src.mob] staggers."))
diff --git a/code/datums/objective.dm b/code/datums/objective.dm
index 09899e9f4dc71..9757fb7f0b1e6 100644
--- a/code/datums/objective.dm
+++ b/code/datums/objective.dm
@@ -160,6 +160,8 @@ proc/create_fluff(datum/mind/target)
 			items.Remove("Head of Security\'s beret")
 		if(!countJob("Captain"))
 			items.Remove("authentication disk")
+		if(!countJob("Chief Engineer"))
+			items.Remove("aurora MKII utility belt")
 
 		target_name = pick(items)
 		switch(target_name)
@@ -202,6 +204,8 @@ proc/create_fluff(datum/mind/target)
 			items.Remove("Head of Security\'s beret")
 		if(!countJob("Captain"))
 			items.Remove("authentication disk")
+		if(!countJob("Chief Engineer"))
+			items.Remove("aurora MKII utility belt")
 
 		target_name = pick(items)
 		switch(target_name)
diff --git a/code/datums/participation_recorder.dm b/code/datums/participation_recorder.dm
index 84ebdd6a5cbda..3694b783d706e 100644
--- a/code/datums/participation_recorder.dm
+++ b/code/datums/participation_recorder.dm
@@ -21,31 +21,36 @@ var/global/datum/participationRecorder/participationRecorder
 		boutput(world, msg)
 
 
+	proc/getJob(datum/player/P)
+		if (!P?.client?.mob?.mind) return null
+		var/job = P.client.mob.mind.assigned_role
+		if (job == "MODE") return null
+		return job || null
+
+
 	//Record a participation for a player (or add it to a queue if holding)
-	proc/record(ckey)
-		if (!ckey)
-			throw EXCEPTION("No ckey given")
+	proc/record(datum/player/P)
+		if (!P)
+			throw EXCEPTION("No player given")
 
 		if (!ticker || !ticker.mode || !ticker.mode.name)
 			throw EXCEPTION("Invalid ticker found")
 
 		if (src.debug)
-			src.debugLog("(participationRecorder) Called record. ckey: [ckey]. holding: [src.holding]")
+			src.debugLog("(participationRecorder) Called record. player ID: [P.id]. holding: [src.holding]")
 
 		//queue up for eventual transmission via releaseHold
 		if (src.holding)
-			src.queue += ckey
+			src.queue += list(list("player_id" = P.id, "job" = src.getJob(P)))
 
 		//send our shiiiit
 		else
-			var/list/payload = list(
-				"ckey" = ckey,
-				"round_mode" = ticker.mode.name
-			)
-			#ifdef RP_MODE
-			payload["rp_mode"] = TRUE
-			#endif
-			apiHandler.queryAPI("participation/record", payload)
+			try
+				var/datum/apiRoute/players/participations/addParticipation = new
+				addParticipation.buildBody(P.id, roundId, src.getJob(P))
+				apiHandler.queryAPI(addParticipation)
+			catch
+				// pass
 
 
 	//Set holding on, which enables queuing of participation data for the duration
@@ -62,18 +67,11 @@ var/global/datum/participationRecorder/participationRecorder
 		src.holding = 0
 
 		if (src.debug)
-			src.debugLog("(participationRecorder) Release hold called. round_name: [ticker.mode.name]. queue: [json_encode(src.queue)]")
-
-		var/list/payload = list(
-			"round_mode" = ticker.mode.name
-		)
-		#ifdef RP_MODE
-		payload["rp_mode"] = TRUE
-		#endif
-
-		var/count = 0
-		for (var/ckey in src.queue)
-			payload["ckeys\[[count]]"] = ckey
-			count++
-
-		apiHandler.queryAPI("participation/record-multiple", payload)
+			src.debugLog("(participationRecorder) Release hold called. queue: [json_encode(src.queue)]")
+
+		try
+			var/datum/apiRoute/players/participationsBulk/addBulkParticipations = new
+			addBulkParticipations.buildBody(src.queue, roundId)
+			apiHandler.queryAPI(addBulkParticipations)
+		catch
+			// pass
diff --git a/code/datums/preferences.dm b/code/datums/preferences.dm
index 732692b46285c..11545e9117790 100644
--- a/code/datums/preferences.dm
+++ b/code/datums/preferences.dm
@@ -178,14 +178,9 @@ var/list/removed_jobs = list(
 				"name" = src.savefile_get_profile_name(client, i),
 			)
 
-		var/list/cloud_saves = null
-
-		if (!client.cloud_available())
-			client.player.cloud_fetch()
-		if (client.cloud_available())
-			cloud_saves = list()
-			for (var/name in client.player.cloudsaves)
-				cloud_saves += name
+		var/list/cloud_saves = list()
+		for (var/name in client.player.cloudSaves.saves)
+			cloud_saves += name
 
 		sanitize_null_values()
 
@@ -356,9 +351,7 @@ var/list/removed_jobs = list(
 					return TRUE
 
 			if ("cloud-new")
-				if (!client.cloud_available())
-					return
-				if(length(client.player.cloudsaves) >= SAVEFILE_CLOUD_PROFILES_MAX)
+				if(length(client.player.cloudSaves.saves) >= SAVEFILE_CLOUD_PROFILES_MAX)
 					tgui_alert(usr, "You have hit your cloud save limit. Please write over an existing save.", "Max saves")
 				else
 					var/new_name = tgui_input_text(usr, "What would you like to name the save?", "Save Name")
@@ -372,8 +365,6 @@ var/list/removed_jobs = list(
 							boutput( usr, SPAN_NOTICE("Savefile saved!") )
 
 			if ("cloud-save")
-				if (!client.cloud_available())
-					return
 				var/ret = src.cloudsave_save(client, params["name"])
 				if(istext(ret))
 					boutput(usr, SPAN_ALERT("Failed to save savefile: [ret]"))
@@ -382,8 +373,6 @@ var/list/removed_jobs = list(
 					return TRUE
 
 			if ("cloud-load")
-				if (!client.cloud_available())
-					return
 				var/ret = src.cloudsave_load(client, params["name"])
 				if( istext(ret))
 					boutput(usr, SPAN_ALERT("Failed to load savefile: [ret]"))
@@ -393,8 +382,6 @@ var/list/removed_jobs = list(
 					return TRUE
 
 			if ("cloud-delete")
-				if (!client.cloud_available())
-					return
 				var/ret = src.cloudsave_delete(client, params["name"])
 				if(istext(ret))
 					boutput(usr, SPAN_ALERT("Failed to delete savefile: [ret]"))
@@ -2091,10 +2078,10 @@ var/global/list/female_screams = list("female", "femalescream1", "femalescream2"
 	var/type_first
 	if (AH.gender == MALE)
 		if (prob(5)) // small chance to have a hairstyle more geared to the other gender
-			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=FEMININE))
+			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=FEMININE, for_random=TRUE))
 			AH.customization_first = new type_first
 		else // otherwise just use one standard to the current gender
-			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=MASCULINE))
+			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=MASCULINE, for_random=TRUE))
 			AH.customization_first = new type_first
 
 		if (prob(33)) // since we're a guy, a chance for facial hair
@@ -2105,10 +2092,10 @@ var/global/list/female_screams = list("female", "femalescream1", "femalescream2"
 
 	else // if FEMALE
 		if (prob(8)) // same as above for guys, just reversed and with a slightly higher chance since it's ~more appropriate~ for ladies to have guy haircuts than vice versa  :I
-			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=MASCULINE))
+			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=MASCULINE, for_random=TRUE))
 			AH.customization_first = new type_first
 		else // ss13 is coded with gender stereotypes IN ITS VERY CORE
-			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=FEMININE))
+			type_first = pick(get_available_custom_style_types(H?.client, no_gimmick_hair=TRUE, filter_gender=FEMININE, for_random=TRUE))
 			AH.customization_first = new type_first
 
 	if (!has_second)
diff --git a/code/datums/round_management.dm b/code/datums/round_management.dm
new file mode 100644
index 0000000000000..f3c3e499da9e2
--- /dev/null
+++ b/code/datums/round_management.dm
@@ -0,0 +1,57 @@
+/**
+ * Collection of methods to handle recording round data to the API
+ */
+
+var/global/datum/roundManagement/roundManagement
+
+/datum/roundManagement
+	proc/logMsg(msg)
+		logTheThing(LOG_DEBUG, null, "<b>Round Management</b> [msg]")
+		logTheThing(LOG_DIARY, null, "Round Management: [msg]", "admin")
+
+	/// Record the start of a round (when a server boots up)
+	proc/recordStart()
+		var/datum/apiModel/Tracked/GameRound/gameRound
+		try
+			var/datum/apiRoute/rounds/post/addRound = new
+			var/rpMode = FALSE
+			#ifdef RP_MODE
+			rpMode = TRUE
+			#endif
+			addRound.buildBody(map_setting, config.server_id, rpMode)
+			gameRound = apiHandler.queryAPI(addRound)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			src.logMsg(error.message)
+			return
+
+		roundId = gameRound.id
+		src.logMsg("Recorded round start: New round ID #[roundId]")
+
+	/// Record an update to the round (when the game starts)
+	proc/recordUpdate(mode = null)
+		try
+			var/datum/apiRoute/rounds/update/updateRound = new
+			updateRound.routeParams = list(roundId)
+			updateRound.buildBody(mode)
+			apiHandler.queryAPI(updateRound)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			src.logMsg(error.message)
+			return
+
+		src.logMsg("Recorded round update: Game type [mode]")
+
+	/// Record the end of a round (just prior to reboot)
+	proc/recordEnd(crashed = FALSE)
+		try
+			var/datum/apiRoute/rounds/end/endRound = new
+			endRound.routeParams = list(roundId)
+			endRound.buildBody(crashed)
+			apiHandler.queryAPI(endRound)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			src.logMsg(error.message)
+			return
+
+		src.logMsg("Recorded round end")
diff --git a/code/datums/savefile.dm b/code/datums/savefile.dm
index cc9311ddbe3a7..39cf5c69ae36f 100644
--- a/code/datums/savefile.dm
+++ b/code/datums/savefile.dm
@@ -455,78 +455,30 @@
 
 		return profile_name
 
-	/// Save a character profile to the cloud.
-	/// load_from (if not null) is the ckey to load this profile from. Can be used to load profiles from another ckey.
-	cloudsave_load(client/user, var/name, var/load_from)
-		if (user) // bypass these checks if we're loading from an arbitrary key
-			if(user && isnull( user.player.cloudsaves ))
-				return "Failed to retrieve cloud data, try rejoining."
-
+	/// Load a character profile from the cloud.
+	cloudsave_load(client/user, name)
+		if (user)
 			if (IsGuestKey(user.key))
-				return 0
+				return FALSE
 
-		// Fetch via HTTP from goonhub
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?get&ckey=[ckey(load_from) || user.ckey]&name=[url_encode(name)]&api_key=[config.spacebee_api_key]", "", "")
-		request.begin_async()
-		UNTIL(request.is_complete())
-		var/datum/http_response/response = request.into_response()
-
-		if (response.errored || !response.body)
-			logTheThing(LOG_DEBUG, null, "<b>cloudsave_load:</b> Failed to contact goonhub. u: [user.ckey]")
-			return
-
-		var/list/ret = json_decode(response.body)
-		if( ret["status"] == "error" )
-			return ret["error"]["error"]
+		var/cloudSaveData = user.player.cloudSaves.getSave(name)
 
 		var/savefile/save = new
-		save.ImportText( "/", ret["savedata"] )
+		save.ImportText( "/", cloudSaveData )
 		return src.savefile_load(user, 1, save)
 
 	/// Save a character profile to the cloud.
-	/// save_to (if not null) is the ckey to save this profile to. Can be used to save profiles to another ckey.
-	cloudsave_save(client/user, var/name, var/save_to)
-		if (user) // bypass these checks if we're saving to an arbitrary key
-			if(isnull( user.player.cloudsaves ))
-				return "Failed to retrieve cloud data, try rejoining."
+	cloudsave_save(client/user, name)
+		if (user)
 			if (IsGuestKey( user.key ))
-				return 0
-			if (save_to)
-				CRASH("Tried to save a cloud save with a client and a key to save to specified- need one or the other")
+				return FALSE
 
-		var/savefile/save = src.savefile_save(ckey(save_to) || user.ckey, 1, 1)
+		var/savefile/save = src.savefile_save(user.ckey, 1, 1)
 		var/exported = save.ExportText()
 
-		// Fetch via HTTP from goonhub
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?put&ckey=[ckey(save_to) || user.ckey]&name=[url_encode(name)]&api_key=[config.spacebee_api_key]&data=[url_encode(exported)]", "", "")
-		request.begin_async()
-		UNTIL(request.is_complete())
-		var/datum/http_response/response = request.into_response()
-
-		if (response.errored || !response.body)
-			logTheThing(LOG_DEBUG, null, "<b>cloudsave_load:</b> Failed to contact goonhub. u: [save_to || user.ckey]")
-			return
-
-		var/list/ret = json_decode(response.body)
-		if( ret["status"] == "error" )
-			return ret["error"]["error"]
-		user?.player.cloudsaves[ name ] = length( exported )
-		return 1
-
-	cloudsave_delete( client/user, var/name )
-
-		// Request deletion via HTTP from goonhub
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?delete&ckey=[user.ckey]&name=[url_encode(name)]&api_key=[config.spacebee_api_key]", "", "")
-		request.begin_async()
-		UNTIL(request.is_complete())
-		var/datum/http_response/response = request.into_response()
+		user.player.cloudSaves.putSave(name, exported)
+		return TRUE
 
-		if (response.errored || !response.body)
-			logTheThing(LOG_DEBUG, null, "<b>cloudsave_delete:</b> Failed to contact goonhub. u: [user.ckey]")
-			return
-
-		user.player.cloudsaves.Remove( name )
-		return 1
+	cloudsave_delete(client/user, name)
+		user.player.cloudSaves.deleteSave(name)
+		return TRUE
diff --git a/code/datums/tooltip.dm b/code/datums/tooltip.dm
index d0e5cdb84706b..5501177aaea0f 100644
--- a/code/datums/tooltip.dm
+++ b/code/datums/tooltip.dm
@@ -69,7 +69,7 @@ Notes:
 	boutput(who, "<span style='font-size: 0.85em'>\[[time2text(world.realtime, "hh:mm:ss")]\] <strong>(TOOLTIP DEBUG | DM)</strong> [msg]</span>")
 #endif
 
-var/global/list/atomTooltips = new()
+var/global/list/atomTooltips = list()
 
 /datum/tooltipHolder
 	//Configurable vars
diff --git a/code/datums/traits.dm b/code/datums/traits.dm
index 6ecca9dfb03ac..0ca53b1acf9b5 100644
--- a/code/datums/traits.dm
+++ b/code/datums/traits.dm
@@ -550,6 +550,22 @@ ABSTRACT_TYPE(/datum/trait/job)
 	desc = "Subject is trained in cultural and psychological matters."
 	id = "training_chaplain"
 
+	var/faith = FAITH_STARTING
+	///multiplier for faith gain only - faith losses ignore this
+	var/faith_mult = 1
+
+	New()
+		..()
+		START_TRACKING
+
+	disposing()
+		STOP_TRACKING
+		..()
+
+	onAdd(mob/living/owner)
+		if(owner.traitHolder?.hasTrait("atheist"))
+			src.faith_mult = 0.2
+
 /datum/trait/job/medical
 	name = "Medical Training"
 	desc = "Subject is a proficient surgeon."
@@ -948,6 +964,19 @@ ABSTRACT_TYPE(/datum/trait/job)
 	id = "atheist"
 	points = 0
 
+	onAdd(mob/living/owner)
+		if (istype(owner))
+			owner.remove_lifeprocess(/datum/lifeprocess/faith)
+		var/datum/trait/job/chaplain/chap_trait = owner.traitHolder?.getTrait("training_chaplain")
+		chap_trait?.faith_mult = 0.2
+
+	onRemove(mob/living/owner)
+		if (istype(owner))
+			owner.add_lifeprocess(/datum/lifeprocess/faith)
+		var/datum/trait/job/chaplain/chap_trait = owner.traitHolder?.getTrait("training_chaplain")
+		chap_trait?.faith_mult = 1
+
+
 /datum/trait/lizard
 	name = "Reptilian"
 	icon_state = "lizardT"
diff --git a/code/datums/viewport.dm b/code/datums/viewport.dm
index c95371fdb8c4d..3824bf44803f6 100644
--- a/code/datums/viewport.dm
+++ b/code/datums/viewport.dm
@@ -184,7 +184,7 @@
 /mob/living/intangible/aieye/verb/ai_eye_create_viewport()
 	set category = "AI Commands"
 	set name = "Create Viewport"
-	set desc = "Expand your powers with Nanotransen's Viewportifier!"
+	set desc = "Expand your powers with Nanotrasen's Viewportifier!"
 
 	src.create_viewport(VIEWPORT_ID_AI)
 
diff --git a/code/del.dm b/code/del.dm
index ffa6a77fcf1ce..f8758ca19a26f 100644
--- a/code/del.dm
+++ b/code/del.dm
@@ -25,7 +25,8 @@ proc/qdel(var/datum/D)
 				qdel(C)
 
 		#ifdef OPENDREAM
-		del(D)
+		SPAWN(1)
+			del(D)
 		return
 		#endif
 
diff --git a/code/error_handling.dm b/code/error_handling.dm
index 8711f7c04c7fa..bbe265342f89d 100644
--- a/code/error_handling.dm
+++ b/code/error_handling.dm
@@ -6,8 +6,9 @@
 * It does NOT catch reference bugs
 */
 
-var/global/list/runtimeDetails = new()
+var/global/list/runtimeDetails = list()
 var/global/runtime_count = 0
+var/global/blame_for_runtimes = FALSE
 
 /world/Error(exception/E)
 	var/timestamp = time2text(world.timeofday,"hh:mm:ss")
@@ -35,6 +36,11 @@ var/global/runtime_count = 0
 			world.log << "[E.desc]"
 #endif
 
+	//dumb stupid dangerous meme, do not use unless you want to have bad time
+	if (blame_for_runtimes && !ON_COOLDOWN(global, "runtime_blame", 1 DECI SECOND)) //cooldown should prevent infinite server crashing loops at least
+		if (get_turf(usr))
+			new /obj/lightning_target(get_turf(usr))
+
 	// if we're in a fucked up state and generating lots of runtimes we don't want to make the performance of the runtimes even worse
 	if(runtime_count < 1000)
 		if (istype(usr, /mob))
@@ -58,6 +64,19 @@ var/global/runtime_count = 0
 
 	src.Browse(grabResource("html/runtimeViewer.html"), "window=runtimeviewer;size=500x600;title=Runtime+Viewer;", 1)
 
+/client/proc/cmd_aggressive_debugging()
+	SET_ADMIN_CAT(ADMIN_CAT_FUN)
+	set name = "Toggle Aggressive Debugging"
+	set desc = "Makes triggering a runtime strike you with lightning. Yes really."
+	set popup_menu = 0
+
+	ADMIN_ONLY
+	if (global.blame_for_runtimes)
+		global.blame_for_runtimes = FALSE
+		boutput(src, SPAN_NOTICE("Aggressive debugging disabled"))
+	else
+		if (input(src, "Are you sure you want to cause a lightning strike on every runtime? (May cause extreme unforseen consequences) Type YES below if you're sure.", "Really enable aggressive debugging?", "NO") == "YES")
+			global.blame_for_runtimes = TRUE
 
 /client/Topic(href, href_list)
 
diff --git a/code/global.dm b/code/global.dm
index 4901f819e7bbd..8c2778f75b7da 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -24,6 +24,8 @@ var/list/extra_resources = list('interface/fonts/pressstart2p.ttf', 'interface/f
 
 var/global
 
+	roundId = 0
+
 	serverKey = 0
 
 	lagcheck_enabled = 0
diff --git a/code/map.dm b/code/map.dm
index a28290befcc0e..525c7fe43c22d 100644
--- a/code/map.dm
+++ b/code/map.dm
@@ -31,7 +31,7 @@ var/global/list/mapNames = list(
 	"Kondaru" =				list("id" = "KONDARU",		"settings" = "kondaru",			"playerPickable" = TRUE,	"MaxPlayersAllowed" = 80),
 	"Atlas" =				list("id" = "ATLAS",		"settings" = "atlas",			"playerPickable" = TRUE,	"MaxPlayersAllowed" = 30),
 	"Clarion" =				list("id" = "CLARION",		"settings" = "destiny/clarion", "playerPickable" = TRUE,	"MaxPlayersAllowed" = 60),
-	"Oshan Laboratory"= 	list("id" = "OSHAN",		"settings" = "oshan",			"playerPickable" = TRUE),
+	"Oshan Laboratory"= 	list("id" = "OSHAN",		"settings" = "oshan",			"playerPickable" = TRUE,	"MinPlayersAllowed" = 14),
 	"Nadir" =				list("id" = "NADIR",		"settings" = "nadir",			"playerPickable" = TRUE,	"MaxPlayersAllowed" = 70),
 
 	"Manta" =				list("id" = "MANTA",		"settings" = "manta",			"playerPickable" = FALSE,	"MaxPlayersAllowed" = 80),
@@ -41,14 +41,14 @@ var/global/list/mapNames = list(
 	"Mushroom" =			list("id" = "MUSHROOM",		"settings" = "mushroom",		"playerPickable" = FALSE),
 	"Trunkmap" =			list("id" = "TRUNKMAP",		"settings" = "trunkmap",		"playerPickable" = FALSE),
 	//"Density" = 			list("id" = "DENSITY",		"settings" = "density",			"playerPickable" = FALSE,	"MaxPlayersAllowed" = 30),
-	"Density2" = 			list("id" = "DENSITY2",		"settings" = "density2",			"playerPickable" = FALSE,	"MaxPlayersAllowed" = 20),
+	"Density2" = 			list("id" = "DENSITY2",		"settings" = "density2",		"playerPickable" = FALSE,	"MaxPlayersAllowed" = 20),
 	"Ozymandias" =			list("id" = "OZYMANDIAS",	"settings" = "ozymandias",		"playerPickable" = FALSE,	"MinPlayersAllowed" = 40),
 	"Bellerophon Fleet" =	list("id" = "FLEET",		"settings" = "fleet",			"playerPickable" = FALSE),
 	//"Icarus" =			list("id" = "ICARUS",		"settings" = "icarus",			"playerPickable" = FALSE),
 	//"Gehenna" =			list("id" = "GEHENNA",		"settings" = "gehenna",			"playerPickable" = FALSE),
 	"blank" =				list("id" = "BLANK",		"settings" = "", 				"playerPickable" = FALSE),
 	"blank_underwater" =	list("id" = "BLANK_UNDERWATER", "settings" = "", 			"playerPickable" = FALSE),
-	"DevTest" =	list("id" = "DEVTEST",		"settings" = "devtest",			"playerPickable" = FALSE,	"MaxPlayersAllowed" = 69)
+	"DevTest" =				list("id" = "DEVTEST",		"settings" = "devtest",			"playerPickable" = FALSE,	"MaxPlayersAllowed" = 69)
 )
 
 /obj/landmark/map
@@ -237,7 +237,7 @@ var/global/list/mapNames = list(
 /datum/map_settings/pod_wars
 	name = "POD_WARS"
 	default_gamemode = "pod_wars"
-	goonhub_map = "https://cdn.discordapp.com/attachments/890313890003566632/1137526717964103781/output.png"
+	goonhub_map = "https://goonhub.com/maps/pod_wars"
 	walls = /turf/simulated/wall/auto/supernorn
 	rwalls = /turf/simulated/wall/auto/reinforced/supernorn
 	style = "spess"
@@ -310,7 +310,7 @@ var/global/list/mapNames = list(
 
 /datum/map_settings/wrestlemap
 	name = "WRESTLEMAP"
-	goonhub_map = "https://cdn.discordapp.com/attachments/412381738510319626/1116907371999010836/output.png"
+	goonhub_map = "https://goonhub.com/maps/wrestlemap"
 	walls = /turf/simulated/wall/auto/supernorn
 	rwalls = /turf/simulated/wall/auto/reinforced/supernorn
 
diff --git a/code/mapSwitching.dm b/code/mapSwitching.dm
index 3642453ba398a..f13f142902689 100644
--- a/code/mapSwitching.dm
+++ b/code/mapSwitching.dm
@@ -63,7 +63,7 @@ var/global/datum/mapSwitchHandler/mapSwitcher
 		src.current = map
 
 
-	proc/setNextMap(trigger, mapName = "", mapID = "")
+	proc/setNextMap(trigger, mapName = "", mapID = "", votes = 0)
 		if (!mapName && !mapID)
 			throw EXCEPTION("No map identifier given")
 
@@ -81,18 +81,23 @@ var/global/datum/mapSwitchHandler/mapSwitcher
 		else
 			mapName = getMapNameFromID(mapID)
 
-		//compile with a new map
-		var/list/params = list(
-			"map" = mapID,
-			"votedFor" = trigger == "Player Vote"
-		)
-		var/data[] = apiHandler.queryAPI("map-switcher/switch", params, 1)
-
-		if (!data)
-			throw EXCEPTION("No response from goonhub API route")
-
-		if (data["error"])
-			throw EXCEPTION("Received error from goonhub API: [data["error"]]")
+		var/datum/apiModel/MapSwitch/mapSwitchRes
+		try
+			var/datum/apiRoute/mapswitch/mapSwitch = new
+			mapSwitch.buildBody(
+				trigger == "Player Vote" ? null : trigger, // trigger should be a ckey if not a vote
+				roundId,
+				null,
+				mapID,
+				votes
+			)
+			mapSwitchRes = apiHandler.queryAPI(mapSwitch)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		if (text2num(mapSwitchRes.status) != 200)
+			throw EXCEPTION("Build server failed to switch map. Expected HTTP status code 200, received code [isnull(mapSwitchRes.status) ? "null" : mapSwitchRes.status] instead")
 
 		//make a note if this is a player voted map
 		src.nextMapIsVotedFor = trigger == "Player Vote" ? 1 : 0
@@ -208,10 +213,10 @@ var/global/datum/mapSwitchHandler/mapSwitcher
 			src.nextMapIsVotedFor = 1
 		else
 			try
-				src.setNextMap("Player Vote", mapName = src.voteChosenMap)
+				src.setNextMap("Player Vote", mapName = src.voteChosenMap, votes = highestVotes)
 			catch (var/exception/e)
-				logTheThing(LOG_ADMIN, null, "Failed to set map <b>[src.voteChosenMap]</b> from map vote: [e]")
-				logTheThing(LOG_DIARY, null, "Failed to set map <b>[src.voteChosenMap]</b> from map vote: [e]", "debug")
+				logTheThing(LOG_ADMIN, null, "Failed to set map <b>[src.voteChosenMap]</b> from map vote: [e.name]")
+				logTheThing(LOG_DIARY, null, "Failed to set map <b>[src.voteChosenMap]</b> from map vote: [e.name]", "debug")
 				return
 
 		//announce winner
diff --git a/code/mob.dm b/code/mob.dm
index afdbbc1b76aef..892bc0ad2e87d 100644
--- a/code/mob.dm
+++ b/code/mob.dm
@@ -562,7 +562,7 @@
 			if(!ON_COOLDOWN(src, "flubber_bounce", 0.1 SECONDS) || src.hasStatus("sugar_rush"))
 				src.now_pushing = 0
 				var/atom/source = A
-				src.visible_message(SPAN_ALERT("<B>[src]</B>'s bounces off [A]!"))
+				src.visible_message(SPAN_ALERT("<B>[src]</B> bounces off [A]!"))
 				playsound(source, 'sound/misc/boing/6.ogg', 100, TRUE)
 				var/throw_dir = turn(get_dir(A, src),rand(-1,1)*45)
 				src.throw_at(get_edge_cheap(source, throw_dir),  20, 3)
@@ -610,7 +610,7 @@
 					return
 
 				var/atom/source = get_turf(tmob)
-				src.visible_message(SPAN_ALERT("<B>[src]</B> and <B>[tmob]</B>'s bounce off each other!"))
+				src.visible_message(SPAN_ALERT("<B>[src]</B> and <B>[tmob]</B> bounce off each other!"))
 				playsound(source, 'sound/misc/boing/6.ogg', 100, TRUE)
 				var/target_dir = get_dir(src, tmob)
 				var/src_dir = get_dir(tmob, src)
@@ -1034,12 +1034,6 @@
 		LI += W
 	.= LI
 
-/mob/proc/findname(msg)
-	for(var/mob/M in mobs)
-		if (M.real_name == text("[]", msg))
-			.= M
-	.= 0
-
 /mob/proc/movement_delay(var/atom/move_target = 0)
 	.= 2 + movement_delay_modifier
 	if (src.pushing)
diff --git a/code/mob/dead/observer.dm b/code/mob/dead/observer.dm
index 7478d718771cf..7d34961986894 100644
--- a/code/mob/dead/observer.dm
+++ b/code/mob/dead/observer.dm
@@ -278,7 +278,7 @@
 
 	if(!isdead(src))
 		if (src.hibernating == 1)
-			var/confirm = tgui_alert(src, "Are you sure you want to ghost? You won't be able to exit cryogenic storage, and will be an observer the rest of the round.", "Observe?", list("Yes", "No"))
+			var/confirm = tgui_alert(src, "Are you sure you want to ghost? You won't be able to exit cryogenic storage, DNR status will be set, and you will be an observer the rest of the round.", "Observe?", list("Yes", "No"))
 			if(confirm == "Yes")
 				respawn_controller.subscribeNewRespawnee(src.ckey)
 				src.mind?.get_player()?.dnr = TRUE
diff --git a/code/mob/living.dm b/code/mob/living.dm
index 5143e5f410982..21a55d9f0442e 100644
--- a/code/mob/living.dm
+++ b/code/mob/living.dm
@@ -196,7 +196,9 @@
 	src.remove_ailments()
 	src.lastgasp(allow_dead = TRUE)
 	if (src.ai) src.ai.disable()
-	if (src.key) statlog_death(src, gibbed)
+	if (src.key)
+		var/datum/eventRecord/Death/deathEvent = new
+		deathEvent.buildAndSend(src, gibbed)
 	if (src.client && ticker.round_elapsed_ticks >= 12000 && VALID_MOB(src))
 		var/num_players = 0
 		for(var/client/C)
@@ -961,7 +963,7 @@
 
 	//Blobchat handling
 	if (src.mob_flags & SPEECH_BLOB)
-		message = html_encode(src.say_quote(message))
+		message = src.say_quote(message)
 		var/rendered = "<span class='game blobsay'>"
 		rendered += "[SPAN_PREFIX("BLOB:")] "
 		rendered += "<span class='name text-normal' data-ctx='\ref[src.mind]'>[src.get_heard_name()]</span> "
@@ -1232,7 +1234,7 @@
 			(isintangible(M) && (M in hearers)) || \
 			( \
 				(!isturf(say_location.loc) && (say_location.loc == M.loc || (say_location in M))) && \
-				!(M in heard_a) && \
+				!(M in heard_a) && !(M in heard_b) &&\
 				!istype(M, /mob/dead/target_observer) && \
 				M != src \
 			) \
@@ -2285,7 +2287,7 @@
 
 /// Returns the rate of blood to absorb from the reagent holder per Life()
 /mob/living/proc/get_blood_absorption_rate()
-	return 1 // that's the standard absorption rate
+	return 1 + GET_ATOM_PROPERTY(src, PROP_MOB_BLOOD_ABSORPTION_RATE) // that's the standard absorption rate
 
 /mob/living/was_built_from_frame(mob/user, newly_built)
 	. = ..()
diff --git a/code/mob/living/carbon/human.dm b/code/mob/living/carbon/human.dm
index 8b29def08ee7f..13f4529507db4 100644
--- a/code/mob/living/carbon/human.dm
+++ b/code/mob/living/carbon/human.dm
@@ -1080,8 +1080,6 @@
 		if (iscarbon(I))
 			var/mob/living/carbon/C = I
 			logTheThing(LOG_COMBAT, src, "throws [constructTarget(C,"combat")] [dir2text(throw_dir)] at [log_loc(src)].")
-			if ( ishuman(C) && !C.getStatusDuration("weakened"))
-				C.changeStatus("weakened", 1 SECOND)
 		else
 			// Added log_reagents() call for drinking glasses. Also the location (Convair880).
 			logTheThing(LOG_COMBAT, src, "throws [I] [I.is_open_container() ? "[log_reagents(I)]" : ""] [dir2text(throw_dir)] at [log_loc(src)].")
diff --git a/code/mob/living/carbon/human/monkeys.dm b/code/mob/living/carbon/human/monkeys.dm
index 66ab7f2437920..07d6ecd04c3f5 100644
--- a/code/mob/living/carbon/human/monkeys.dm
+++ b/code/mob/living/carbon/human/monkeys.dm
@@ -477,18 +477,15 @@
 				if(!length(choices))
 					return
 				thingy = pick(choices)
-				slot = thingy.equipped_in_slot
 			else if (theft_target.l_store && theft_target.r_store)
 				thingy = pick(theft_target.l_store, theft_target.r_store)
-				if (thingy == theft_target.r_store)
-					slot = 16
 			else if (theft_target.l_store)
 				thingy = theft_target.l_store
 			else if (theft_target.r_store)
 				thingy = theft_target.r_store
-				slot = 16
 			else // ???
 				return
+		slot = theft_target.get_slot_from_item(thingy)
 		walk_towards(src, null)
 		if(ismonkey(theft_target))
 			src.say("I help!")
@@ -565,9 +562,12 @@
 	icon = 'icons/mob/screen1.dmi'
 	icon_state = "grabbed"
 
-	var/mob/living/carbon/human/npc/source  //The npc doing the action
-	var/mob/living/carbon/human/target  	//The target of the action
-	var/slot						    	//The slot number
+	/// NPC who is pickpocketing
+	var/mob/living/carbon/human/npc/source
+	/// The pick-pocketing victim
+	var/mob/living/carbon/human/target
+	/// The SLOT_* define (i.e. SLOT_BACK)
+	var/slot
 
 	New(var/Source, var/Target, var/Slot)
 		source = Source
diff --git a/code/mob/living/carbon/human/normal.dm b/code/mob/living/carbon/human/normal.dm
index 3fa89177b689c..ad27358c2464b 100644
--- a/code/mob/living/carbon/human/normal.dm
+++ b/code/mob/living/carbon/human/normal.dm
@@ -1,4 +1,5 @@
 /mob/living/carbon/human/normal
+	name = "Random Human"
 	initializeBioholder(gender)
 		if (gender)
 			src.gender = gender
diff --git a/code/mob/living/carbon/human/npc.dm b/code/mob/living/carbon/human/npc.dm
index 2ee5e2e1f995e..a17fdfc1110eb 100644
--- a/code/mob/living/carbon/human/npc.dm
+++ b/code/mob/living/carbon/human/npc.dm
@@ -112,37 +112,6 @@
 
 //// rest in peace NPC classic-mentally challenged idiots, you were shit ////
 
-
-/mob/living/carbon/human/npc/syndicate
-	ai_aggressive = 1
-	New()
-		..()
-		SPAWN(0)
-			if(ticker?.mode && istype(ticker.mode, /datum/game_mode/nuclear))
-				src.real_name = "[syndicate_name()] Operative #[ticker.mode:agent_number]"
-				ticker.mode:agent_number++
-			else
-				src.real_name = "Syndicate Agent"
-			JobEquipSpawned("Syndicate Operative")
-			u_equip(l_store) // Deletes syndicate remote teleporter to keep people out of the syndie shuttle
-			u_equip(r_store) // Deletes uplink radio because fuckem
-
-/mob/living/carbon/human/npc/syndicate_weak
-	ai_aggressive = 1
-	New()
-		..()
-		SPAWN(0)
-			src.real_name = "Junior Syndicate Agent"
-			JobEquipSpawned("Junior Syndicate Operative")
-
-/mob/living/carbon/human/npc/syndicate_weak/no_ammo
-	ai_aggressive = 1
-	New()
-		..()
-		SPAWN(0)
-			src.real_name = "Junior Syndicate Agent"
-			JobEquipSpawned("Poorly Equipped Junior Syndicate Operative")
-
 /mob/living/carbon/human/npc/survivor // For prefab wrecks. Give them some life. Maybe expand this npc later idk
 	New()
 		..()
diff --git a/code/mob/living/carbon/human/procs/damage.dm b/code/mob/living/carbon/human/procs/damage.dm
index a05356b9427ae..22bd7a7f99905 100644
--- a/code/mob/living/carbon/human/procs/damage.dm
+++ b/code/mob/living/carbon/human/procs/damage.dm
@@ -127,7 +127,6 @@
 							implanted.owner = src
 							if (P.forensic_ID)
 								implanted.forensic_ID = P.forensic_ID
-							src.implant += implanted
 							implanted.setMaterial(P.proj_data.material)
 							implanted.implanted(src, null, 0)
 	return 1
diff --git a/code/mob/living/carbon/human/procs/emote.dm b/code/mob/living/carbon/human/procs/emote.dm
index 200f6fed3dbf7..bdb22bab6125b 100644
--- a/code/mob/living/carbon/human/procs/emote.dm
+++ b/code/mob/living/carbon/human/procs/emote.dm
@@ -107,7 +107,9 @@
 					if (isvampire(src))
 						playsound(src, 'sound/effects/screech_tone.ogg', 90, TRUE, extrarange = 2, pitch = clamp(1.0 + (30 - src.bioHolder.age)/60, 0.7, 1.2), channel=VOLUME_CHANNEL_EMOTE)
 						screamed = TRUE
-
+					if (isarcfiend(src))
+						playsound(src, 'sound/effects/elec_bzzz.ogg', 80, TRUE, extrarange = 2, pitch = clamp(1.0 + (30 - src.bioHolder.age)/60, 0.7, 1.2), channel=VOLUME_CHANNEL_EMOTE)
+						screamed = TRUE
 					#ifdef HALLOWEEN
 					spooktober_GH.change_points(src.ckey, 100)
 					#endif
@@ -551,7 +553,9 @@
 
 			if ("listtarget")
 				src.show_text("salute, bow, hug, wave, glare, stare, look, nod, flipoff, doubleflip, shakefist, handshake, daps, slap, boggle, highfive, fingerguns")
-
+			if ("list")
+				src.emote("listbasic")
+				src.emote("listtarget")
 			if ("suicide")
 				src.show_text("Suicide is a command, not an emote.  Please type 'suicide' in the input bar at the bottom of the game window to kill yourself.", "red")
 
diff --git a/code/mob/living/carbon/human/procs/get_desc.dm b/code/mob/living/carbon/human/procs/get_desc.dm
index 89861ba14161f..a6964d89c1f6d 100644
--- a/code/mob/living/carbon/human/procs/get_desc.dm
+++ b/code/mob/living/carbon/human/procs/get_desc.dm
@@ -153,6 +153,12 @@
 			count++
 		. += "<br>[SPAN_ALERT("[src] has [count > 1 ? "arrows" : "an arrow"] stuck in [him_or_her(src)]!")]"
 
+	if (locate(/obj/item/implant/projectile/body_visible/seed) in src.implant)
+		var/count = 0
+		for (var/obj/item/implant/projectile/body_visible/seed/P in src.implant)
+			count++
+		. += "<br>[SPAN_ALERT("[src] has [count > 1 ? "seeds" : "a seed"] stuck in [him_or_her(src)]!")]"
+
 	if (src.is_jittery)
 		switch(src.jitteriness)
 			if (300 to INFINITY)
@@ -247,12 +253,10 @@
 		else
 			. += "<br>[SPAN_ALERT("<B>[src.name]'s entire chest is missing!</B>")]"
 
-
-		if (src.organHolder.back_op_stage > BACK_SURGERY_CLOSED)
-			if (!src.organHolder.butt)
-				. += "<br>[SPAN_ALERT("<B>[src.name]'s butt seems to be missing!</B>")]"
-			else
-				. += "<br>[SPAN_ALERT("<B>[src.name] has an open incision on [t_his] butt!</B>")]"
+		if (!src.organHolder.butt)
+			. += "<br>[SPAN_ALERT("<B>[src.name]'s butt seems to be missing!</B>")]"
+		else if (src.organHolder.back_op_stage > BACK_SURGERY_CLOSED)
+			. += "<br>[SPAN_ALERT("<B>[src.name] has an open incision on [t_his] butt!</B>")]"
 
 	if (src.limbs)
 		if (!src.limbs.l_arm)
diff --git a/code/mob/living/critter/bee.dm b/code/mob/living/critter/bee.dm
index c94a6ed0a41ce..12d549871e699 100644
--- a/code/mob/living/critter/bee.dm
+++ b/code/mob/living/critter/bee.dm
@@ -62,7 +62,6 @@
 		real_name = name
 		SPAWN(0)
 			ADMIN_BEES_ONLY
-			//statlog_bees(src)
 			src.UpdateIcon()
 
 			if (!isdead(src))
@@ -586,6 +585,7 @@
 		if (BOUNDS_DIST(holder.owner, target) > 0)
 			boutput(holder.owner, SPAN_ALERT("That is too far away to teleport away."))
 			return 1
+		logTheThing(LOG_COMBAT, src.holder.owner, "begins casting teleport stare on [constructTarget(target)] at [log_loc(src.holder.owner)]")
 		holder.owner.visible_message(SPAN_COMBAT("<b>[holder.owner]</b> stares at [MT]!"))
 		if(do_buzz)
 			playsound(holder.owner, 'sound/voice/animal/buzz.ogg', 100, 1)
@@ -597,8 +597,9 @@
 				MT.emote("scream")
 				MT.setStatusMin("paralysis", 20 SECONDS)
 				MT.take_brain_damage(10)
-
-				do_teleport(MT, locate((world.maxx/2) + rand(-10,10), (world.maxy/2) + rand(-10,10), 1), 0)
+				var/turf/turf = locate((world.maxx/2) + rand(-10,10), (world.maxy/2) + rand(-10,10), 1)
+				logTheThing(LOG_COMBAT, src.holder.owner, "stuns and teleports [constructTarget(target)] to [log_loc(turf)] using teleport stare")
+				do_teleport(MT, turf, 0)
 
 
 /datum/targetable/critter/bee_puke_honey
diff --git a/code/mob/living/critter/firefly.dm b/code/mob/living/critter/firefly.dm
index 6dcffa9bccfd8..17409cc01fdf3 100644
--- a/code/mob/living/critter/firefly.dm
+++ b/code/mob/living/critter/firefly.dm
@@ -311,7 +311,8 @@ TYPEINFO(/mob/living/critter/small_animal/dragonfly)
 
 	Move(NewLoc, direct)
 		. = ..()
-		animate(src, time=5 SECONDS, pixel_x=rand(-4,4), pixel_y=rand(-8,8))
+		if (!ON_COOLDOWN(src, "move_bumble", 5 SECONDS))
+			animate(src, time=5 SECONDS, pixel_x=rand(-4,4), pixel_y=rand(-8,8))
 
 	attackby(obj/item/W, mob/living/user)
 		if(istype(W, /obj/item/reagent_containers/glass/jar) || istype(W, /obj/item/reagent_containers/glass/beaker/large))
diff --git a/code/mob/living/critter/plant.dm b/code/mob/living/critter/plant.dm
index 76e2627d14fe3..07c0519ec7cef 100644
--- a/code/mob/living/critter/plant.dm
+++ b/code/mob/living/critter/plant.dm
@@ -48,22 +48,10 @@
 	// We need to pass the plantgenes from the plant to our new lovely botany pet
 	var/datum/plantgenes/new_genes = src.plantgenes
 
+	// Copy the genes from the plant we're harvesting to the new piece of produce.
 	HYPpassplantgenes(passed_genes,new_genes)
 	src.generation = harvested_plantpot.generation
-	// Copy the genes from the plant we're harvesting to the new piece of produce.
-
-	if(origin_plant.hybrid)
-		// We need to do special shit with the genes if the plant is a spliced
-		// hybrid since they run off instanced datums rather than referencing
-		// a specific already-existing one.
-		var/plantType = origin_plant.type
-		var/datum/plant/hybrid = new plantType(src)
-		for(var/V in origin_plant.vars)
-			if(issaved(origin_plant.vars[V]) && V != "holder")
-				hybrid.vars[V] = origin_plant.vars[V]
-		src.planttype = hybrid
-	else
-		src.planttype = origin_plant
+	src.planttype = HYPgenerateplanttypecopy(src, origin_plant)
 
 	// If the plant this critter was harvested from was damaged, we damage the critter as well
 
diff --git a/code/mob/living/critter/sawfly.dm b/code/mob/living/critter/sawfly.dm
index dcfa8ec29001b..18c75e633344f 100644
--- a/code/mob/living/critter/sawfly.dm
+++ b/code/mob/living/critter/sawfly.dm
@@ -51,7 +51,7 @@ This file is the critter itself, and all the custom procs it needs in order to f
 
 		animate_bumble(src) // gotta get the float goin' on
 		src.set_a_intent(INTENT_HARM) // incredibly stupid way of ensuring they aren't passable but it works
-		APPLY_MOVEMENT_MODIFIER(src, /datum/movement_modifier/robot_base, "robot_health_slow_immunity") //prevents them from having movespeed slowdown when injured
+		APPLY_MOVEMENT_MODIFIER(src, /datum/movement_modifier/robot_part/robot_base, "robot_health_slow_immunity") //prevents them from having movespeed slowdown when injured
 		START_TRACKING
 
 	setup_healths()
diff --git a/code/mob/living/critter/small_animal.dm b/code/mob/living/critter/small_animal.dm
index 22592f43f1014..02e753bf343bf 100644
--- a/code/mob/living/critter/small_animal.dm
+++ b/code/mob/living/critter/small_animal.dm
@@ -1891,7 +1891,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 				src.ai_retaliates = FALSE
 				return
 			else if((M.a_intent == INTENT_DISARM) && !src.aggressive)
-				src.visible_message(SPAN_NOTICE("[M] shakes [src] to awaken it's killer instincts!"))
+				src.visible_message(SPAN_NOTICE("[M] shakes [src] to awaken [his_or_her(src)] killer instincts!"))
 				src.aggressive = TRUE
 				src.ai_retaliates = TRUE
 				return
@@ -1937,7 +1937,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 
 		if(length(.) && prob(25))
 			playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
-			src.visible_message(SPAN_ALERT("<B>[src]</B> snips it's pincers!"))
+			src.visible_message(SPAN_ALERT("<B>[src]</B> snips [his_or_her(src)] pincers!"))
 
 	death()
 		src.reagents.add_reagent("toxin", 20, null)
@@ -2015,7 +2015,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 				src.ai_retaliates = FALSE
 				return
 			else if((M.a_intent == INTENT_DISARM) && !src.aggressive)
-				src.visible_message(SPAN_NOTICE("[M] shakes [src] to awaken it's killer instincts!"))
+				src.visible_message(SPAN_NOTICE("[M] shakes [src] to awaken [his_or_her(src)] killer instincts!"))
 				src.aggressive = TRUE
 				src.ai_retaliates = TRUE
 				return
@@ -2032,8 +2032,9 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 					icon_state = "rattlesnake_rattle"
 					playsound(src, 'sound/musical_instruments/tambourine/tambourine_4.ogg', 80, TRUE, channel=VOLUME_CHANNEL_EMOTE)
 					SPAWN(1 SECONDS)
-						icon_state = "rattlesnake"
-					return SPAN_EMOTE("<b>[src]</b> rattles it's tail!")
+						if(isalive(src))
+							icon_state = "rattlesnake"
+					return SPAN_EMOTE("<b>[src]</b> rattles [his_or_her(src)] tail!")
 		return null
 
 	specific_emote_type(var/act)
@@ -3433,7 +3434,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 					SPAWN(3 SECONDS)
 						if (src && !isdead(src))
 							src.icon_state = start_icon
-					return SPAN_EMOTE("<b>[src]</b> clacks their claws!")
+					return SPAN_EMOTE("<b>[src]</b> clacks [his_or_her(src)] claws!")
 		return null
 
 	specific_emote_type(var/act)
@@ -3805,10 +3806,10 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 				boutput(src, "[M] already has a mouse in [his_or_her(M)] pocket.")
 			return
 		if(voluntary && M != src.last_poked) // if we poked that person it means we implicitly agree
-			boutput(M, "You extend your hand to the mouse, waiting for it to accept.")
+			boutput(M, "You extend your hand to the mouse, waiting for [him_or_her(src)] to accept.")
 			if (ON_COOLDOWN(src, "mentor mouse pickup popup", 3 SECONDS))
 				return
-			if (tgui_alert(src, "[M] wants to pick you up and put you in their pocket. Is that okay with you?", "Hop in the pocket", list("Yes", "No")) != "Yes")
+			if (tgui_alert(src, "[M] wants to pick you up and put you in [his_or_her(M)] pocket. Is that okay with you?", "Hop in the pocket", list("Yes", "No")) != "Yes")
 				boutput(M, "\The [src] slips out as you try to pick it up.")
 				return
 		if(!src || !src.mind || !src.client)
@@ -3818,7 +3819,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 		else
 			M.visible_message("\The [src] jumps into [M]'s pocket.", "\The [src] jumps into your pocket.")
 		boutput(M, "You can click on the status effect in the top right to kick the mouse out.")
-		boutput(src, "<span style='color:red; font-size:1.5em'><b>You are now in someone's pocket and can talk to them and click on their screen to ping in the place where you're ctrl+clicking. This is a feature meant for teaching and helping players. Do not abuse it by using it to just chat with your friends!</b></span>")
+		boutput(src, "<span style='color:red; font-size:1.5em'><b>You are now in someone's pocket, can talk to [him_or_her(M)], and click on [his_or_her(M)] screen to ping in the place where you're ctrl+clicking. This is a feature meant for teaching and helping players. Do not abuse it by using it to just chat with your friends!</b></span>")
 		logTheThing(LOG_ADMIN, src, "jumps into [constructTarget(M, "admin")]'s pocket as a mentor mouse at [log_loc(M)].")
 		var/mob/dead/target_observer/mentor_mouse_observer/obs = new(M, src.is_admin)
 		obs.set_observe_target(M)
@@ -3833,7 +3834,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 	hand_attack(atom/target, params, location, control, origParams)
 		if(istype(target, /mob/living) && target != src)
 			boutput(src, "<span class='game' class='mhelp'>You poke [target] in a way that clearly indicates you want to help [him_or_her(target)].</span>")
-			boutput(target, "<span class='game' class='mhelp'>\The [src] seems willing to help you. Click on it with an empty hand if you want to accept the offer.</span>")
+			boutput(target, "<span class='game' class='mhelp'>\The [src] seems willing to help you. Click on [him_or_her(src)] with an empty hand if you want to accept the offer.</span>")
 			src.last_poked = target
 			if(src.icon_state_exclaim)
 				flick(src.icon_state_exclaim, src)
@@ -3888,7 +3889,7 @@ var/list/mob_bird_species = list("smallowl" = /mob/living/critter/small_animal/b
 		if (!holder)
 			return 1
 		logTheThing(LOG_ADMIN, src, "turned from a mentor mouse to a ghost") // I can remove this but it seems like a good thing to have
-		M.visible_message(SPAN_ALERT("<B>[M] does a funny little jiggle with their body and then vanishes into thin air!</B>")) // MY ASCENSION BEGINS
+		M.visible_message(SPAN_ALERT("<B>[M] does a funny little jiggle with [his_or_her(M)] body and then vanishes into thin air!</B>")) // MY ASCENSION BEGINS
 		animate_bouncy(src)
 		animate(M, alpha=0, time=disappearance_time)
 		SPAWN(disappearance_time)
diff --git a/code/mob/living/life/Life.dm b/code/mob/living/life/Life.dm
index bd498fee15c2d..029b635f7bfb3 100644
--- a/code/mob/living/life/Life.dm
+++ b/code/mob/living/life/Life.dm
@@ -174,6 +174,7 @@
 	add_lifeprocess(/datum/lifeprocess/viruses)
 	add_lifeprocess(/datum/lifeprocess/blindness)
 	add_lifeprocess(/datum/lifeprocess/radiation)
+	add_lifeprocess(/datum/lifeprocess/faith)
 
 /mob/living/carbon/cube/restore_life_processes()
 	..()
@@ -193,6 +194,7 @@
 	add_lifeprocess(/datum/lifeprocess/sight)
 	add_lifeprocess(/datum/lifeprocess/blindness)
 	add_lifeprocess(/datum/lifeprocess/disability)
+	add_lifeprocess(/datum/lifeprocess/faith)
 
 /mob/living/silicon/hivebot/restore_life_processes()
 	..()
@@ -213,9 +215,9 @@
 	add_lifeprocess(/datum/lifeprocess/robot_statusupdate)
 	add_lifeprocess(/datum/lifeprocess/stuns_lying)
 	add_lifeprocess(/datum/lifeprocess/blindness)
-	add_lifeprocess(/datum/lifeprocess/robot_oil)
 	add_lifeprocess(/datum/lifeprocess/robot_locks)
 	add_lifeprocess(/datum/lifeprocess/disability)
+	add_lifeprocess(/datum/lifeprocess/faith)
 
 
 /mob/living/silicon/drone/restore_life_processes()
@@ -353,6 +355,10 @@
 				D.foreign_limb_effect()
 
 	if (!isdead(src)) // Marq was here, breaking everything.
+		src.limbs.l_arm?.on_life(parent)
+		src.limbs.r_arm?.on_life(parent)
+		src.limbs.l_leg?.on_life(parent)
+		src.limbs.r_leg?.on_life(parent)
 
 		if (src.sims && src.ckey) // ckey will be null if it's an npc, so they're skipped
 			src.sims.Life()
diff --git a/code/mob/living/life/faith.dm b/code/mob/living/life/faith.dm
new file mode 100644
index 0000000000000..3ca7520f4fbe6
--- /dev/null
+++ b/code/mob/living/life/faith.dm
@@ -0,0 +1,38 @@
+
+/datum/lifeprocess/faith
+
+	process(var/datum/gas_mixture/environment)
+		var/mult = get_multiplier()
+
+		if (isunconscious(owner) || isdead(owner) || !owner.mind || isghostcritter(owner) || isintangible(owner) || !isliving(owner))
+			// do nothing
+		else if (owner.traitHolder.hasTrait("training_chaplain"))
+			modify_chaplain_faith(owner, min(FAITH_STARTING / max(1, get_chaplain_faith(owner)), 5) * mult) // helps chaplains get back to normal
+		else if (!istype(get_area(owner), /area/station/chapel))
+			// others need to be in the chapel
+		else if (isvampire(owner) || isvampiricthrall(owner) || iswraith(owner) || owner.bioHolder.HasEffect("revenant"))
+			// vampires are unholy and will not produce faith unless they are a chaplain
+		else if (owner.traitHolder.hasTrait("atheist"))
+		else
+			add_faith(FAITH_GEN_BASE * mult)
+		..()
+
+/proc/add_faith(amount)
+	for (var/datum/trait/job/chaplain/chap in by_type[/datum/trait/job/chaplain])
+		chap.faith += ((amount > 0) ? (amount * chap.faith_mult) : amount)
+
+/proc/get_chaplain_trait(mob/target)
+	return target.traitHolder?.getTrait("training_chaplain")
+
+/proc/get_chaplain_faith(mob/target)
+	var/datum/trait/job/chaplain/chap_trait = get_chaplain_trait(target)
+	if (chap_trait)
+		return chap_trait.faith
+
+/proc/modify_chaplain_faith(mob/target, amount)
+	var/datum/trait/job/chaplain/chap_trait = get_chaplain_trait(target)
+	if (chap_trait)
+		if(amount > 0)
+			amount *= chap_trait.faith_mult
+		chap_trait.faith += amount
+		return chap_trait.faith
diff --git a/code/mob/living/silicon/ai/holograms.dm b/code/mob/living/silicon/ai/holograms.dm
index fb54699a57754..4bbff8ce2a69f 100644
--- a/code/mob/living/silicon/ai/holograms.dm
+++ b/code/mob/living/silicon/ai/holograms.dm
@@ -253,7 +253,7 @@
 					var/sound/sound = pick('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg', 'sound/machines/siren_police.ogg')
 					playsound(get_turf(src), sound, 50, FALSE)
 					animate_bouncy(src)
-					SPAWN(1 SECOND)
+					SPAWN(2 SECONDS)
 						qdel(src)
 				if ("down_arrow", "up_arrow", "left_arrow", "right_arrow")
 					var/dirs = list("down_arrow" = SOUTH, "up_arrow" = NORTH, "left_arrow" = WEST, "right_arrow" = EAST)
@@ -263,6 +263,7 @@
 							for (var/atom/movable/AM in get_turf(src))
 								if (!AM.anchored)
 									step(AM, dir)
+							step(src, dir)
 							sleep(0.3 SECONDS)
 						qdel(src)
 				if ("happy_face")
diff --git a/code/mob/living/silicon/robot.dm b/code/mob/living/silicon/robot.dm
index fab5e2e6a784e..34e221e268260 100644
--- a/code/mob/living/silicon/robot.dm
+++ b/code/mob/living/silicon/robot.dm
@@ -35,6 +35,8 @@
 	var/total_weight = 0
 	var/datum/robot_cosmetic/cosmetic_mods = null
 
+	var/datum/material/frame_material
+
 	var/list/obj/clothes = list()
 
 	var/next_cache = 0
@@ -112,9 +114,10 @@
 		src.internal_pda = new /obj/item/device/pda2/cyborg(src)
 		src.internal_pda.name = "[src]'s Internal PDA Unit"
 		src.internal_pda.owner = "[src]"
-		APPLY_MOVEMENT_MODIFIER(src, /datum/movement_modifier/robot_base, "robot_health_slow_immunity")
+		APPLY_MOVEMENT_MODIFIER(src, /datum/movement_modifier/robot_part/robot_base, "robot_health_slow_immunity")
 		if (frame)
 			src.freemodule = frame.freemodule
+			src.frame_material = frame.material
 		if (starter && !(src.dependent || src.shell))
 			var/obj/item/parts/robot_parts/chest/light/PC = new /obj/item/parts/robot_parts/chest/light(src)
 			var/obj/item/cell/supercell/charged/CELL = new /obj/item/cell/supercell/charged(PC)
@@ -257,6 +260,10 @@
 		if (prob(50))
 			src.sound_scream = 'sound/voice/screams/Robot_Scream_2.ogg'
 
+		for (var/datum/movement_modifier/MM in src.movement_modifiers) // Spawning borgs applies human only movemods, this cleans that up
+			if (!istype(MM, /datum/movement_modifier/robot_part))
+				REMOVE_MOVEMENT_MODIFIER(src, MM, src.type)
+
 	set_pulling(atom/movable/A)
 		. = ..()
 		hud.update_pulling()
@@ -283,6 +290,7 @@
 						chest.cell = src.cell
 
 			var/obj/item/parts/robot_parts/robot_frame/frame =  new(T)
+			frame.setMaterial(src.frame_material)
 			frame.emagged = src.emagged
 			frame.syndicate = src.syndicate
 			frame.freemodule = src.freemodule
@@ -885,6 +893,7 @@
 			for (var/obj/item/parts/robot_parts/RP in src.contents)
 				if (RP.ropart_take_damage(brute_damage,burn_damage) == 1)
 					src.compborg_lose_limb(RP)
+				RP.ropart_ex_act(severity, lasttouched, power)
 
 		if (istype(cell,/obj/item/cell/erebite) && fire_protect != 1)
 			src.visible_message(SPAN_ALERT("<b>[src]'s</b> erebite cell violently detonates!"))
@@ -1484,8 +1493,14 @@
 			playsound(src, 'sound/impact_sounds/Generic_Stab_1.ogg', 40, TRUE)
 			boutput(user, SPAN_NOTICE("You successfully attach the piece to [src.name]."))
 			src.update_bodypart(RP.slot)
-		else ..()
-		return
+		else if (istype(src.part_head, /obj/item/parts/robot_parts/head/screen) && istype(W, /obj/item/sheet) && W.material.getMaterialFlags() & MATERIAL_CRYSTAL)
+			var/obj/item/parts/robot_parts/head/screen/screenhead = src.part_head
+			if (screenhead.smashed)
+				screenhead.start_repair(W, user)
+			else
+				..() //woo spooky badcode else chaining
+		else
+			..()
 
 	hand_attack(atom/target, params, location, control, origParams)
 		// Only allow it if the target is outside our contents or it is the equipped tool
@@ -1785,13 +1800,6 @@
 				. += ROBOT_MISSING_ARM_MOVEMENT_ADJUST
 
 
-		if (total_weight > 0)
-			if (istype(src.part_leg_l,/obj/item/parts/robot_parts/leg/left/treads) && istype(src.part_leg_r,/obj/item/parts/robot_parts/leg/right/treads))
-				. += total_weight / 3
-			else
-				. += total_weight
-
-
 	hotkey(name)
 		switch (name)
 			if ("help")
@@ -1905,6 +1913,16 @@
 // Robot-specific Procs //
 //////////////////////////
 
+	proc/equip_slot(var/i, var/obj/item/tool)
+		src.module_states[i] = tool
+		tool.set_loc(src)
+		tool.pickup(src) // Handle light datums and the like.
+
+		hud.update_tools()
+		hud.update_equipment()
+
+		update_appearance()
+
 	proc/uneq_slot(var/i)
 		if (module_states[i])
 			if (src.module)
@@ -2424,7 +2442,11 @@
 				if (R.activated)
 					if (efficient) power_use_tally += R.drainrate / 2
 					else power_use_tally += R.drainrate
-			if (src.oil && power_use_tally > 0) power_use_tally /= 1.5
+
+			if (src.hasStatus("freshly_oiled") && power_use_tally > 0)
+				power_use_tally *= 0.5
+			if (src.hasStatus("oiled") && power_use_tally > 0)
+				power_use_tally *= 0.85
 
 			if (src.cell.genrate) power_use_tally -= src.cell.genrate
 
@@ -2508,7 +2530,10 @@
 					var/delta = src.max_upgrades - initial(src.max_upgrades)
 					power_use_tally += 3 ** delta
 
-				if (src.oil && power_use_tally > 0) power_use_tally /= 1.5
+				if (src.hasStatus("freshly_oiled") && power_use_tally > 0)
+					power_use_tally *= 0.5
+				if (src.hasStatus("oiled") && power_use_tally > 0)
+					power_use_tally *= 0.85
 
 				src.cell.use(power_use_tally)
 
@@ -2548,13 +2573,6 @@
 
 		if (src.dizziness) dizziness--
 
-	proc/add_oil(var/amt)
-		if (oil <= 0)
-			APPLY_ATOM_PROPERTY(src, PROP_MOB_STUN_RESIST, "robot_oil", 25)
-			APPLY_ATOM_PROPERTY(src, PROP_MOB_STUN_RESIST_MAX, "robot_oil", 25)
-			APPLY_MOVEMENT_MODIFIER(src, /datum/movement_modifier/robot_oil, "oil")
-		src.oil += amt
-
 	proc/borg_death_alert(modifier = ROBOT_DEATH_MOD_NONE)
 		var/message = null
 		var/net_id = generate_net_id(src)
@@ -2647,6 +2665,9 @@
 					if (istype(src.part_head, /obj/item/parts/robot_parts/head/screen))
 						eyesovl = icon('icons/mob/robots.dmi', "head-" + src.part_head.appearanceString + "-" + src.part_head.mode + "-" + src.part_head.face)
 						eye_light = image('icons/mob/robots.dmi', "head-" + src.part_head.appearanceString + "-" + src.part_head.mode + "-" + src.part_head.face)
+						var/obj/item/parts/robot_parts/head/screen/screenhead = src.part_head
+						if (screenhead.smashed)
+							src.i_head.overlays += image('icons/mob/robots.dmi', "screen-smashed", layer = FLOAT_LAYER + 0.1)
 					else
 						eyesovl = icon('icons/mob/robots.dmi', "head-" + src.part_head.appearanceString + "-eye")
 						eye_light = image('icons/mob/robots.dmi', "head-" + src.part_head.appearanceString + "-eye")
@@ -3269,6 +3290,7 @@
 	src.module_states[tool_index] = new_tool
 
 	// Set loc and pickup our new tool in hand
+	new_tool.cant_drop = TRUE
 	new_tool.set_loc(src)
 	new_tool.pickup(src)
 
diff --git a/code/mob/living/silicon/robot_oil.dm b/code/mob/living/silicon/robot_oil.dm
deleted file mode 100644
index 60ed8ee69ff5c..0000000000000
--- a/code/mob/living/silicon/robot_oil.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/lifeprocess/robot_oil
-	process(var/datum/gas_mixture/environment)
-		if(robot_owner)
-			if(robot_owner.oil > 0)
-				robot_owner.oil -= get_multiplier()
-				if (robot_owner.oil <= 0)
-					robot_owner.oil = 0
-					REMOVE_ATOM_PROPERTY(robot_owner, PROP_MOB_STUN_RESIST, "robot_oil")
-					REMOVE_ATOM_PROPERTY(robot_owner, PROP_MOB_STUN_RESIST_MAX, "robot_oil")
-					REMOVE_MOVEMENT_MODIFIER(robot_owner, /datum/movement_modifier/robot_oil, "oil")
-		..()
diff --git a/code/mob/new_player.dm b/code/mob/new_player.dm
index da9a508a375b7..aa6d3c55a65d0 100644
--- a/code/mob/new_player.dm
+++ b/code/mob/new_player.dm
@@ -414,7 +414,8 @@ var/global/datum/mutex/limited/latespawning = new(5 SECONDS)
 				logTheThing(LOG_DEBUG, character, "<b>Late join:</b> assigned job: [JOB.name]")
 				//if they have a ckey, joined before a certain threshold and the shuttle wasnt already on its way
 				if (character.mind.ckey && (ticker.round_elapsed_ticks <= MAX_PARTICIPATE_TIME) && !emergency_shuttle.online)
-					participationRecorder.record(character.mind.ckey)
+					var/datum/player/P = character.mind.get_player()
+					participationRecorder.record(P)
 
 			// Apply any roundstart mutators to late join if applicable
 			var/mob/living/LM = character
@@ -767,7 +768,7 @@ a.latejoin-card:hover {
 							makebad(new_character, bad_type)
 							new_character.mind.late_special_role = TRUE
 							logTheThing(LOG_DEBUG, new_character, "<b>Late join</b>: assigned antagonist role: [bad_type].")
-							antagWeighter.record(role = bad_type, ckey = new_character.ckey, latejoin = 1)
+							antagWeighter.record(role = bad_type, P = new_character.mind.get_player(), latejoin = 1)
 
 
 
diff --git a/code/mob/transform_procs.dm b/code/mob/transform_procs.dm
index 079883ce970bf..d68dfc1144031 100644
--- a/code/mob/transform_procs.dm
+++ b/code/mob/transform_procs.dm
@@ -167,12 +167,13 @@
 		return make_critter(CT, get_turf(src))
 	return 0
 
-/mob/proc/make_critter(var/critter_type, var/turf/T, ghost_spawned=FALSE)
+/mob/proc/make_critter(var/critter_type, var/turf/T, ghost_spawned=FALSE, delete_original=TRUE)
 	var/mob/living/critter/newmob = new critter_type()
 	if(ghost_spawned)
 		newmob.ghost_spawned = ghost_spawned
 		if(!istype(newmob, /mob/living/critter/small_animal/mouse/weak/mentor))
 			newmob.name_prefix("ethereal")
+			newmob.name_suffix("[rand(10,99)][rand(10,99)]")
 			newmob.UpdateName()
 	if (!T || !isturf(T))
 		T = get_turf(src)
@@ -198,8 +199,9 @@
 		var/mob/living/critter/small_animal/small = newmob
 		small.setup_overlays() // this requires the small animal to have a client to set things up properly
 
-	SPAWN(1 DECI SECOND)
-		qdel(src)
+	if (delete_original)
+		SPAWN(1 DECI SECOND)
+			qdel(src)
 	return newmob
 
 
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 887ae8ad0eabf..8c245c01be435 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -125,37 +125,37 @@ var/global/noir = 0
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("adminhelp_banner", usr.client.key)
+					C.player.cloudSaves.putData("adminhelp_banner", usr.client.key)
 					src.show_chatbans(C)
 		if ("ah_unmute")//guHGUHGUGHGUHG
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("adminhelp_banner", "")
+					C.player.cloudSaves.putData("adminhelp_banner", "")
 					src.show_chatbans(C)
 		if ("mh_mute")//AHDUASHDUHWUDHWDUHWDUWDH
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("mentorhelp_banner", usr.client.key)
+					C.player.cloudSaves.putData("mentorhelp_banner", usr.client.key)
 					src.show_chatbans(C)
 		if ("mh_unmute")//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("mentorhelp_banner", "")
+					C.player.cloudSaves.putData("mentorhelp_banner", "")
 					src.show_chatbans(C)
 		if ("pr_mute")
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("prayer_banner", usr.client.key)
+					C.player.cloudSaves.putData("prayer_banner", usr.client.key)
 					src.show_chatbans(C)
 		if ("pr_unmute")
 			if (src.level >= LEVEL_PA)
 				var/client/C = locate(href_list["target"])
 				if(istype(C))
-					C.cloud_put("prayer_banner", "")
+					C.player.cloudSaves.putData("prayer_banner", "")
 					src.show_chatbans(C)
 
 		if ("load_admin_prefs")
@@ -516,36 +516,11 @@ var/global/noir = 0
 		/////////////////////////////////////ban stuff
 		if ("addban") //Add ban
 			var/mob/M = (href_list["target"] ? locate(href_list["target"]) : null)
-			usr.client.addBanDialog(M)
+			usr.client.addBanTemp(M)
 
 		if ("sharkban") //Add ban
 			var/mob/M = (href_list["target"] ? locate(href_list["target"]) : null)
 			usr.client.sharkban(M)
-
-		if("unbane") //Edit ban
-			if (src.level >= LEVEL_SA)
-				var/id = html_decode(href_list["id"])
-				var/ckey = html_decode(href_list["target"])
-				var/compID = html_decode(href_list["compID"])
-				var/ip = html_decode(href_list["ip"])
-				var/reason = html_decode(href_list["reason"])
-				var/timestamp = html_decode(href_list["timestamp"])
-
-				usr.client.editBanDialog(id, ckey, compID, ip, reason, timestamp)
-			else
-				tgui_alert(usr,"You need to be at least a Secondary Administrator to edit bans.")
-
-		if("unbanf") //Delete ban
-			if (src.level >= LEVEL_SA)
-				var/id = html_decode(href_list["id"])
-				var/ckey = html_decode(href_list["target"])
-				var/compID = html_decode(href_list["compID"])
-				var/ip = html_decode(href_list["ip"])
-				var/akey = usr.client.ckey
-
-				usr.client.deleteBanDialog(id, ckey, compID, ip, akey)
-			else
-				tgui_alert(usr,"You need to be at least a Secondary Administrator to remove bans.")
 		/////////////////////////////////////end ban stuff
 
 		if("jobbanpanel")
@@ -564,7 +539,7 @@ var/global/noir = 0
 			else //It's a key. We need to cache it's ban history to not make 300 requests to the API.
 				target = M
 				action = "jobban_offline"
-				M = apiHandler.queryAPI("jobbans/get/player", list("ckey"=M), 1)[M]
+				M = jobban_get_for_player(M)
 			if (!M)
 				return
 
@@ -700,7 +675,7 @@ var/global/noir = 0
 			if (src.level >= LEVEL_SA)
 				var/M = href_list["target"]
 				var/job = href_list["type"]
-				var/list/cache = apiHandler.queryAPI("jobbans/get/player", list("ckey"=M), 1)[M]
+				var/list/cache = jobban_get_for_player(M)
 				if (!M) return
 				if (jobban_isbanned(cache, job))
 					if(cache.Find("Everything Except Assistant") && job != "Everything Except Assistant")
@@ -2318,7 +2293,7 @@ var/global/noir = 0
 							qdel(O)
 							LAGCHECK(LAG_LOW)
 					if("sec_classic1")
-						for(var/obj/item/clothing/suit/fire/O in world)
+						for(var/obj/item/clothing/suit/hazard/fire/O in world)
 							qdel(O)
 							LAGCHECK(LAG_LOW)
 						for(var/obj/grille/O in world)
@@ -2537,7 +2512,7 @@ var/global/noir = 0
 							if (tgui_alert(usr,"Do you want to give everyone a gun?", "Confirmation", list("Yes", "No")) != "Yes")
 								return
 							for (var/mob/living/L in mobs)
-								new /obj/random_item_spawner/kineticgun(get_turf(L))
+								new /obj/random_item_spawner/kineticgun/fullrandom(get_turf(L))
 							message_admins("[key_name(usr)] gave everyone a random firearm.")
 							logTheThing(LOG_ADMIN, usr, "gave everyone a random firearm.")
 							logTheThing(LOG_DIARY, usr, "gave everyone a random firearm.", "admin")
@@ -3525,11 +3500,11 @@ var/global/noir = 0
 
 			usr.client.cmd_view_runtimes()
 
-		if ("viewantaghistory")
-			if (src.level < LEVEL_SA)
-				return tgui_alert(usr,"You must be at least a Secondary Admin to view antag history.")
+		// if ("viewantaghistory")
+		// 	if (src.level < LEVEL_SA)
+		// 		return tgui_alert(usr,"You must be at least a Secondary Admin to view antag history.")
 
-			usr.client.cmd_antag_history(href_list["targetckey"])
+		// 	usr.client.cmd_antag_history(href_list["targetckey"])
 
 		if ("show_player_stats")
 			if (src.level < LEVEL_SA)
@@ -3887,7 +3862,7 @@ var/global/noir = 0
 		ircmsg["msg"] = "manually restarted the server."
 		ircbot.export_async("admin", ircmsg)
 
-		round_end_data(2) //Wire: export_async round end packet (manual restart)
+		roundManagement.recordEnd(crashed = TRUE)
 
 		sleep(3 SECONDS)
 		Reboot_server()
@@ -4204,26 +4179,23 @@ var/global/noir = 0
 		return
 
 /datum/admins/proc/show_chatbans(var/client/C)//do not use this as an example of how to write DM please.
-	if( !C.cloud_available() )
-		tgui_alert( "Failed to communicate to Goonhub." )
-		return
 	var/built = {"<title>Chat Bans (todo: prettify)</title>"}
-	if(C.cloud_get( "adminhelp_banner" ))
-		built += "<a href='?src=\ref[src];target=\ref[C];action=ah_unmute' class='alert'>Adminhelp Mute</a> (Last by [C.cloud_get( "adminhelp_banner" )])<br/>"
+	if(C.player.cloudSaves.getData( "adminhelp_banner" ))
+		built += "<a href='?src=\ref[src];target=\ref[C];action=ah_unmute' class='alert'>Adminhelp Mute</a> (Last by [C.player.cloudSaves.getData( "adminhelp_banner" )])<br/>"
 		logTheThing(LOG_ADMIN, src, "unmuted [constructTarget(C,"admin")] from adminhelping.")
 	else
 		built += "<a href='?src=\ref[src];target=\ref[C];action=ah_mute'>Adminhelp Mute</a><br/>"
 		logTheThing(LOG_ADMIN, src, "muted [constructTarget(C,"admin")] from adminhelping.")
 
-	if(C.cloud_get( "mentorhelp_banner" ))
-		built += "<a href='?src=\ref[src];target=\ref[C];action=mh_unmute' class='alert'>Mentorhelp Mute</a> (Last by [C.cloud_get( "mentorhelp_banner" )])<br/>"
+	if(C.player.cloudSaves.getData( "mentorhelp_banner" ))
+		built += "<a href='?src=\ref[src];target=\ref[C];action=mh_unmute' class='alert'>Mentorhelp Mute</a> (Last by [C.player.cloudSaves.getData( "mentorhelp_banner" )])<br/>"
 		logTheThing(LOG_ADMIN, src, "unmuted [constructTarget(C,"admin")] from mentorhelping.")
 	else
 		built += "<a href='?src=\ref[src];target=\ref[C];action=mh_mute'>Mentorhelp Mute</a><br/>"
 		logTheThing(LOG_ADMIN, src, "muted [constructTarget(C,"admin")] from mentorhelping.")
 
-	if(C.cloud_get( "prayer_banner" ))
-		built += "<a href='?src=\ref[src];target=\ref[C];action=pr_unmute' class='alert'>Prayer Mute</a> (Last by [C.cloud_get( "prayer_banner" )])<br/>"
+	if(C.player.cloudSaves.getData( "prayer_banner" ))
+		built += "<a href='?src=\ref[src];target=\ref[C];action=pr_unmute' class='alert'>Prayer Mute</a> (Last by [C.player.cloudSaves.getData( "prayer_banner" )])<br/>"
 		logTheThing(LOG_ADMIN, src, "unmuted [constructTarget(C,"admin")] from praying.")
 	else
 		built += "<a href='?src=\ref[src];target=\ref[C];action=pr_mute'>Prayer Mute</a><br/>"
diff --git a/code/modules/admin/admin_holder.dm b/code/modules/admin/admin_holder.dm
index 74bb5b7fdfa76..40ea69448a116 100644
--- a/code/modules/admin/admin_holder.dm
+++ b/code/modules/admin/admin_holder.dm
@@ -44,20 +44,20 @@
 	var/datum/centcomviewer/centcomviewer = null
 	var/datum/bioeffectmanager/bioeffectmanager = null
 	var/datum/abilitymanager/abilitymanager = null
+	var/datum/ban_panel/ban_panel = null
 	var/datum/antagonist_panel/antagonist_panel = null
 
 	var/list/hidden_categories = null
 
 	var/mob/respawn_as_self_mob = null
 
-	New()
+	New(client/C)
 		..()
+		src.owner = C
 		src.hidden_categories = list()
 		SPAWN(1 DECI SECOND)
-			if (src.owner)
-				var/client/C = src.owner
-				C.chatOutput.getContextFlag()
-				src.load_admin_prefs()
+			src.owner.chatOutput.getContextFlag()
+			src.load_admin_prefs()
 
 		if (!admin_interact_atom_verbs || length(admin_interact_atom_verbs) <= 0)
 			admin_interact_atom_verbs = list(\
@@ -170,16 +170,15 @@
 		user.Browse(HTML.Join(),"window=aprefs;size=385x540")
 
 	proc/load_admin_prefs()
-		if (!src.owner)
-			return
 		var/list/AP
-		if (!owner.player.clouddata)
-			owner.player.cloud_fetch()
-		var/json_data = src.owner.player.cloud_get("admin_preferences")
+		if (!owner.player.cloudSaves.loaded)
+			owner.player.cloudSaves.fetch()
+
+		var/json_data = owner.player.cloudSaves.getData("admin_preferences")
 		if (json_data)
 			AP = json_decode(json_data)
 		else
-			boutput(src.owner, SPAN_NOTICE("ERROR: Admin prefence data is null. You either have no saved prefs or cloud is unreachable."))
+			boutput(src.owner, SPAN_NOTICE("ERROR: Admin preference data is null. You either have no saved prefs or cloud is unreachable."))
 			return
 
 		var/saved_servertoggles_toggle = AP["servertoggles_toggle"]
@@ -320,10 +319,10 @@
 	proc/save_admin_prefs()
 		if (!src.owner)
 			return
-		var/list/data = owner.player.cloud_get("admin_preferences")
+		var/data = owner.player.cloudSaves.getData("admin_preferences")
 		var/list/auto_aliases = list()
 		if (data) // decoding null will runtime
-			data = json_decode(owner.player.cloud_get("admin_preferences"))
+			data = json_decode(data)
 			auto_aliases = data["auto_aliases"]
 
 		if (auto_alias_global_save)
@@ -360,7 +359,7 @@
 		for(var/cat in toggleable_admin_verb_categories)
 			AP["hidden_[cat]"] = (cat in src.hidden_categories)
 
-		if (!owner.player.cloud_put("admin_preferences", json_encode(AP)))
+		if (!owner.player.cloudSaves.putData("admin_preferences", json_encode(AP)))
 			tgui_alert(src.owner, "ERROR: Unable to reach cloud.")
 		else
 			boutput(src.owner, SPAN_NOTICE("Admin preferences saved."))
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index f342f82642f42..99b101a81b524 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -154,7 +154,8 @@ var/list/admin_verbs = list(
 		/client/proc/main_loop_tick_detail,
 		/client/proc/display_bomb_monitor,
 		//Ban verbs
-		/client/proc/openBanPanel,
+		/client/proc/ban_panel,
+		/client/proc/addBanTemp,
 		/client/proc/banooc,
 		/client/proc/view_cid_list,
 		/client/proc/modify_parts,
@@ -172,7 +173,8 @@ var/list/admin_verbs = list(
 		/client/proc/toggle_flourish,
 
 		/client/proc/cmd_view_runtimes,
-		/client/proc/cmd_antag_history,
+		/client/proc/cmd_aggressive_debugging,
+		// /client/proc/cmd_antag_history,
 		/client/proc/cmd_admin_show_player_stats,
 		/client/proc/cmd_admin_show_player_ips,
 		/client/proc/cmd_admin_show_player_compids,
@@ -382,6 +384,8 @@ var/list/admin_verbs = list(
 		/client/proc/cmd_caviewer,
 		/client/proc/cmd_custom_spawn_event,
 		/client/proc/cmd_special_shuttle,
+		/client/proc/toggle_all_artifacts,
+		/client/proc/spawn_tons_of_artifacts,
 		/client/proc/toggle_radio_maptext,
 
 		/datum/admins/proc/toggleaprilfools,
@@ -477,6 +481,7 @@ var/list/admin_verbs = list(
 		/client/proc/upload_uncool_words,
 		/client/proc/TestMarketReq,
 		/verb/adminDumpBlueprint,
+		/client/proc/debug_event_recorder,
 
 		/client/proc/delete_profiling_logs,
 		/client/proc/cause_lag,
@@ -760,6 +765,17 @@ var/list/special_pa_observing_verbs = list(
 	if (src.holder.level >= LEVEL_SA)
 		global.player_panel.ui_interact(src.mob)
 
+/client/proc/ban_panel()
+	set name = "Ban Panel"
+	SET_ADMIN_CAT(ADMIN_CAT_PLAYERS)
+	if (!src.holder || src.holder?.tempmin)
+		logTheThing(LOG_ADMIN, src, "tried to access the ban panel")
+		logTheThing(LOG_DIARY, src, "tried to access the ban panel", "admin")
+		message_admins("[key_name(src)] tried to access the ban panel but was denied.")
+	if (isnull(src.holder.ban_panel))
+		src.holder.ban_panel = new
+	src.holder.ban_panel.ui_interact(src.mob)
+
 /client/proc/jobbans(key as text)
 	set name = "Jobban Panel"
 	SET_ADMIN_CAT(ADMIN_CAT_PLAYERS)
@@ -911,14 +927,15 @@ var/list/special_pa_observing_verbs = list(
 		M.client.warned = 1
 		message_admins(SPAN_INTERNAL("[src.ckey] warned [M.ckey]."))
 	else
-		var/addData[] = new()
-		addData["ckey"] = M.ckey
-		addData["compID"] = M.computer_id
-		addData["ip"] = M.client.address
-		addData["reason"] = "Autobanning due to previous warn. This is what we in the biz like to call a \"second warning\"."
-		addData["akey"] = src.ckey
-		addData["mins"] = 10
-		addBan(addData)
+		bansHandler.add(
+			src.ckey,
+			null,
+			M.ckey,
+			M.computer_id,
+			M.client.address,
+			"Autobanning due to previous warn. This is what we in the biz like to call a \"second warning\".",
+			10 MINUTES
+		)
 
 /client/proc/clear_area_overlays()
 	set name = "Clear Area Overlays"
@@ -1563,7 +1580,7 @@ var/list/fun_images = list()
 				trigger = (C.holder ? "[src.key] (as [src.fakekey])" : src.fakekey)
 			var/vol = C.getVolume(VOLUME_CHANNEL_ADMIN)
 			if (vol)
-				C.chatOutput.playDectalk(audio["audio"], trigger, vol)
+				C.chatOutput.playDectalk(audio["audio"], trigger, vol * 0.75)
 		return 1
 	else if (audio && audio["cooldown"])
 		alert(src, "There is a [nextDectalkDelay] second global cooldown between uses of this verb. Please wait [((world.timeofday + nextDectalkDelay * 10) - world.timeofday)/10] seconds.")
@@ -1808,7 +1825,7 @@ var/list/fun_images = list()
 		return alert("The map is already on [map] you dunce!")
 
 	try
-		mapSwitcher.setNextMap(src.key, mapName = map)
+		mapSwitcher.setNextMap(src.ckey, mapName = map)
 	catch (var/exception/e)
 		logTheThing(LOG_DEBUG, null, "<b>Map Switcher:</b> [e.name]")
 		return alert("Oh no! Something went wrong with the map switcher. Details have been logged to the debug category.")
@@ -1906,70 +1923,70 @@ var/list/fun_images = list()
 	logTheThing(LOG_DIARY, usr ? usr : src, null, "cancelled the player map vote prematurely", "admin")
 	message_admins("[key_name(usr ? usr : src)] cancelled the player map vote prematurely. Rude.")
 
-/client/proc/cmd_antag_history(var/ckey as text)
-	SET_ADMIN_CAT(ADMIN_CAT_PLAYERS)
-	set name = "View Antag History"
-	set desc = "View the antag history for a given player"
-	set popup_menu = 0
-	ADMIN_ONLY
-
-	if (!ckey)
-		return
-
-	var/list/history
-	try
-		history = antagWeighter.completeHistory(ckey)
-	catch(var/exception/e)
-		return alert(e.name)
-
-	var/html = "<table>"
-	html += "<thead><tr>"
-	html += "<th>Mode</th>"
-	html += "<th>Played</th>"
-	html += "<th>Antag</th>"
-	html += "<th>Chosen</th>"
-	html += "<th>Target</th>"
-	html += "</tr></thead>"
-
-	for (var/role in config.play_antag_rates)
-		var/list/data
-
-		if (role in history)
-			data = history[role]
-		else
-			//some round types are so rare, we might have no data for this player playing them, so we make shit up
-			data = list(
-				"seen" = 0,
-				"selected" = 0,
-				"percent" = 0
-			)
-
-		var/seen = round(text2num(data["seen"]))
-		var/selected = round(text2num(data["selected"]))
-		var/chosen = round(text2num(data["percent"]))
-		var/target = config.play_antag_rates[role]
-
-		var/chosenClass = "fine"
-		//if the player has been chosen more than 50% over the target, show red
-		if (chosen > target * 1.5)
-			chosenClass = "danger"
-		//or, if it's just over the target, show orange
-		else if (chosen > target)
-			chosenClass = "warning"
-
-		html += "<tr>"
-		html += "<td>[capitalize(role)]</td>"
-		html += "<td>[seen]</td>"
-		html += "<td>[selected]</td>"
-		html += "<td class='[chosenClass]'>[chosen]%</td>"
-		html += "<td>[target]%</td>"
-		html += "</tr>"
-
-	html += "</table>"
-
-	var/antagHistoryHtml = grabResource("html/antagHistory.html")
-	antagHistoryHtml = replacetext(antagHistoryHtml, "<!-- HTML GOES HERE -->", html)
-	src.Browse(antagHistoryHtml, "window=antaghistory[ckey];title=[capitalize(ckey)]+Antag+History;")
+// /client/proc/cmd_antag_history(var/ckey as text)
+// 	SET_ADMIN_CAT(ADMIN_CAT_PLAYERS)
+// 	set name = "View Antag History"
+// 	set desc = "View the antag history for a given player"
+// 	set popup_menu = 0
+// 	ADMIN_ONLY
+
+// 	if (!ckey)
+// 		return
+
+// 	var/list/history
+// 	try
+// 		history = antagWeighter.completeHistory(ckey)
+// 	catch(var/exception/e)
+// 		return alert(e.name)
+
+// 	var/html = "<table>"
+// 	html += "<thead><tr>"
+// 	html += "<th>Mode</th>"
+// 	html += "<th>Played</th>"
+// 	html += "<th>Antag</th>"
+// 	html += "<th>Chosen</th>"
+// 	html += "<th>Target</th>"
+// 	html += "</tr></thead>"
+
+// 	for (var/role in config.play_antag_rates)
+// 		var/list/data
+
+// 		if (role in history)
+// 			data = history[role]
+// 		else
+// 			//some round types are so rare, we might have no data for this player playing them, so we make shit up
+// 			data = list(
+// 				"seen" = 0,
+// 				"selected" = 0,
+// 				"percent" = 0
+// 			)
+
+// 		var/seen = round(text2num(data["seen"]))
+// 		var/selected = round(text2num(data["selected"]))
+// 		var/chosen = round(text2num(data["percent"]))
+// 		var/target = config.play_antag_rates[role]
+
+// 		var/chosenClass = "fine"
+// 		//if the player has been chosen more than 50% over the target, show red
+// 		if (chosen > target * 1.5)
+// 			chosenClass = "danger"
+// 		//or, if it's just over the target, show orange
+// 		else if (chosen > target)
+// 			chosenClass = "warning"
+
+// 		html += "<tr>"
+// 		html += "<td>[capitalize(role)]</td>"
+// 		html += "<td>[seen]</td>"
+// 		html += "<td>[selected]</td>"
+// 		html += "<td class='[chosenClass]'>[chosen]%</td>"
+// 		html += "<td>[target]%</td>"
+// 		html += "</tr>"
+
+// 	html += "</table>"
+
+// 	var/antagHistoryHtml = grabResource("html/antagHistory.html")
+// 	antagHistoryHtml = replacetext(antagHistoryHtml, "<!-- HTML GOES HERE -->", html)
+// 	src.Browse(antagHistoryHtml, "window=antaghistory[ckey];title=[capitalize(ckey)]+Antag+History;")
 
 
 /client/proc/cmd_dispatch_observe_to_ghosts(var/atom/movable/target)
@@ -2336,15 +2353,19 @@ var/list/fun_images = list()
 	DENY_TEMPMIN
 	vpnckey = ckey(vpnckey)
 	try
-		apiHandler.queryAPI("vpncheck-whitelist/add", list("ckey" = vpnckey, "akey" = src.ckey))
-	catch(var/exception/e)
-		message_admins("Error while adding ckey [vpnckey] to the VPN whitelist: [e.name]")
-		return 0
+		var/datum/apiRoute/vpnwhitelist/add/addWhitelist = new
+		addWhitelist.buildBody(src.ckey, vpnckey)
+		apiHandler.queryAPI(addWhitelist)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		message_admins("Error while adding ckey [vpnckey] to the VPN whitelist: [error.message]")
+		return FALSE
+
 	global.vpn_ip_checks?.Cut() // to allow them to reconnect this round
 	message_admins("Ckey [vpnckey] added to the VPN whitelist by [src.key].")
 	logTheThing(LOG_ADMIN, src, "Ckey [vpnckey] added to the VPN whitelist.")
 	addPlayerNote(vpnckey, src.ckey, "Ckey [vpnckey] added to the VPN whitelist.")
-	return 1
+	return TRUE
 
 /client/proc/vpn_whitelist_remove(vpnckey as text)
 	set name = "VPN whitelist remove"
@@ -2353,13 +2374,17 @@ var/list/fun_images = list()
 	DENY_TEMPMIN
 	vpnckey = ckey(vpnckey)
 	try
-		apiHandler.queryAPI("vpncheck-whitelist/remove", list("ckey" = vpnckey, "akey" = src.ckey))
-	catch(var/exception/e)
-		message_admins("Error while removing ckey [vpnckey] from the VPN whitelist: [e.name]")
-		return 0
+		var/datum/apiRoute/vpnwhitelist/delete/deleteWhitelist = new
+		deleteWhitelist.queryParams = list("ckey" = vpnckey)
+		apiHandler.queryAPI(deleteWhitelist)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		message_admins("Error while removing ckey [vpnckey] from the VPN whitelist: [error.message]")
+		return FALSE
+
 	message_admins("Ckey [vpnckey] removed from the VPN whitelist by [src.key].")
 	logTheThing(LOG_ADMIN, src, "Ckey [vpnckey] removed from the VPN whitelist.")
-	return 1
+	return TRUE
 
 /client/proc/cmd_lightsout()
 	SET_ADMIN_CAT(ADMIN_CAT_FUN)
diff --git a/code/modules/admin/adminhelp.dm b/code/modules/admin/adminhelp.dm
index 211facb7b9ccc..33bbfa29c950a 100644
--- a/code/modules/admin/adminhelp.dm
+++ b/code/modules/admin/adminhelp.dm
@@ -11,7 +11,7 @@
 		gib(client.mob)
 		return
 
-	if (client.cloud_available() && client.cloud_get("adminhelp_banner"))
+	if (client.player.cloudSaves.getData("adminhelp_banner"))
 		boutput(client.mob, "You have been banned from using this command.")
 		return
 
@@ -80,88 +80,6 @@
 
 	return msg
 
-/mob/verb/mentorhelp()
-	set category = "Commands"
-	set name = "mentorhelp"
-
-	var/client/client = src.client
-
-	if (IsGuestKey(client.key))
-		boutput(client.mob, "You are not authorized to communicate over these channels.")
-		gib(client.mob)
-		return
-
-	var/mob/dead/target_observer/mentor_mouse_observer/mmouse = locate() in src
-	if(mmouse) // mouse in your pocket takes precedence over mhelps
-		var/msg = input("Please enter your whispers to the mouse:") as null|text
-		msg = copytext(strip_html(msg), 1, MAX_MESSAGE_LEN * 4)
-		if (!msg)
-			return
-		var/class = mmouse.is_admin ? "adminooc" : "mhelp"
-		boutput(mmouse, "<span class='[class]'><b>[client.mob]</b> whispers: \"<i>[msg]</i>\"</span>")
-		boutput(client.mob, "<span class='[class]'>You whisper to \the [mmouse]: \"<i>[msg]</i>\"</span>")
-		for (var/client/C)
-			if (C.holder)
-				if (C.player_mode || C == client || C == mmouse.client)
-					continue
-				else
-					var/rendered = "<span class='[class]'><b>[mmouse.is_admin ? "A" : "M"]MOUSEWHISPER: [key_name(client.mob,0,0,1)]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span> <A HREF='?src=\ref[C.holder];action=adminplayeropts;targetckey=[client.ckey]' class='popt'><i class='icon-info-sign'></i></A></b>: [SPAN_MESSAGE("[msg]")]</span>"
-					boutput(C,  "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
-		logTheThing(LOG_DIARY, client.mob, "([mmouse.is_admin ? "A" : "M"]MOUSEWHISPER): [msg]", "say")
-		return
-
-	if (client.cloud_available() && client.cloud_get("mentorhelp_banner"))
-		boutput(client.mob, "You have been banned from using this command.")
-		return
-
-	if(ON_COOLDOWN(client.player, "ahelp", ADMINHELP_DELAY))
-		boutput(src, "You must wait [time_to_text(ON_COOLDOWN(src, "ahelp", 0))].")
-		return
-
-	var/msg = input("Enter your help request to mentors.\nMentorhelps are sent to mentors via Discord.\n\nPlease use Adminhelp (F1) for rules questions.", "mentorhelp") as null|message
-
-	msg = copytext(strip_html(msg, strip_newlines=FALSE), 1, MAX_MESSAGE_LEN * 4)
-	if (client.can_see_mentor_pms())
-		msg = linkify(msg)
-
-	if (!msg)
-		return
-
-	if (client?.ismuted())
-		return
-
-	var/dead = isdead(client.mob) ? "Dead " : ""
-	var/ircmsg[] = new()
-	ircmsg["key"] = client.key
-	ircmsg["name"] = client.mob.job ? "[stripTextMacros(client.mob.real_name)] \[[dead][client.mob.job]]" : (dead ? "[stripTextMacros(client.mob.real_name)] \[[dead]\]" : stripTextMacros(client.mob.real_name))
-	ircmsg["msg"] = html_decode(msg)
-	var/unique_message_id = md5("mhelp" + json_encode(ircmsg))
-	ircmsg["msgid"] = unique_message_id
-	ircbot.export_async("mentorhelp", ircmsg)
-
-	var/src_keyname = key_name(client.mob, 0, 0, 1, additional_url_data="&msgid=[unique_message_id]")
-
-	for (var/client/C)
-		if (C.holder)
-			if (C.player_mode && !C.player_mode_mhelp)
-				continue
-			else
-				var/rendered = SPAN_MHELP("<b>MENTORHELP: [src_keyname]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span> <A HREF='?src=\ref[C.holder];action=adminplayeropts;targetckey=[client.ckey]' class='popt'><i class='icon-info-sign'></i></A></b>: [SPAN_MESSAGE("[msg]")]")
-				boutput(C,  "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
-		else if (C?.can_see_mentor_pms())
-			if(istype(C.mob, /mob/dead/observer) || C.mob.type == /mob/dead/target_observer || C.mob.type == /mob/dead/target_observer/mentor_mouse_observer || istype(C.mob, /mob/living/critter/small_animal/mouse/weak/mentor))
-				var/rendered = SPAN_MHELP("<b>MENTORHELP: [src_keyname]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span></b>: [SPAN_MESSAGE("[msg]")]")
-				boutput(C, "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
-			else
-				boutput(C, SPAN_MHELP("<b>MENTORHELP: [src_keyname]</b>: [SPAN_MESSAGE("[msg]")]"))
-
-	boutput(client.mob, SPAN_MHELP("<b>MENTORHELP: You</b>: [msg]"))
-	logTheThing(LOG_MHELP, client.mob, "MENTORHELP: [msg]")
-	logTheThing(LOG_DIARY, client.mob, "MENTORHELP: [msg]", "mhelp")
-#ifdef DATALOGGER
-	game_stats.Increment("mentorhelps")
-#endif
-
 /mob/verb/pray(msg as text)
 	set category = "Commands"
 	set name = "pray"
@@ -174,7 +92,7 @@
 	if(client.ismuted())
 		boutput(client.mob, "You are muted and cannot pray.")
 		return
-	if(client.cloud_available() && client.cloud_get( "prayer_banner" ))
+	if(client.player.cloudSaves.getData( "prayer_banner" ))
 		boutput(client.mob, "You have been banned from using this command.")
 		return
 
diff --git a/code/modules/admin/ban_panel.dm b/code/modules/admin/ban_panel.dm
new file mode 100644
index 0000000000000..4fb779e1647d4
--- /dev/null
+++ b/code/modules/admin/ban_panel.dm
@@ -0,0 +1,143 @@
+#define BAN_PANEL_TAB_BAN_LIST "ban_list"
+#define BAN_PANEL_TAB_JOB_BAN_LIST "job_ban_list"
+
+#define BAN_PANEL_ACTION_SEARCH "ban_search"
+#define BAN_PANEL_ACTION_PAGE_PREV "page_prev"
+#define BAN_PANEL_ACTION_PAGE_NEXT "page_next"
+#define BAN_PANEL_ACTION_SET_PER_PAGE "set_perpage"
+#define BAN_PANEL_ACTION_SET_TAB "set_tab"
+#define BAN_PANEL_ACTION_DELETE_BAN "delete_ban"
+#define BAN_PANEL_ACTION_EDIT_BAN "edit_ban"
+
+/// Admin Ban Panel
+/datum/ban_panel
+	var/datum/apiModel/Paginated/BanResourceList/banResourceList = null
+	var/current_tab = BAN_PANEL_TAB_BAN_LIST
+	var/current_page = 1
+	var/per_page = 30
+
+/datum/ban_panel/New()
+	. = ..()
+	src.banResourceList = bansHandler.getAll()
+
+/datum/ban_panel/ui_state(mob/user)
+	return tgui_admin_state.can_use_topic(src, user)
+
+/datum/ban_panel/ui_status(mob/user)
+	return tgui_admin_state.can_use_topic(src, user)
+
+/datum/ban_panel/ui_interact(mob/user, datum/tgui/ui)
+	ui = tgui_process.try_update_ui(user, src, ui)
+	if (!ui)
+		ui = new(user, src, "BanPanel")
+		ui.open()
+
+/datum/ban_panel/ui_data(mob/user)
+	. = ..()
+	.["current_tab"] = src.current_tab
+	switch (src.current_tab)
+		if (BAN_PANEL_TAB_BAN_LIST)
+			.["ban_list"] = list(
+				"search_response" = src.banResourceList?.ToList()
+			)
+			.["per_page"] = src.per_page
+
+/datum/ban_panel/ui_static_data(mob/user)
+	. = ..()
+
+/datum/ban_panel/ui_act(action, params)
+	. = ..()
+	if (.)
+		return
+
+	if (!usr.client) return
+
+	switch (action)
+		if (BAN_PANEL_ACTION_SEARCH)
+			var/search_text = params["searchText"]
+			var/search_filter = params["searchFilter"]
+			src.current_page = 1
+			if (isnull(search_text) || is_blank_string(search_text))
+				src.refresh_bans()
+			else
+				src.refresh_bans(filters = list(
+					"[search_filter]" = search_text
+				))
+			. = TRUE
+
+		if (BAN_PANEL_ACTION_PAGE_PREV)
+			var/prev_page = max(1, (src.banResourceList?.meta["current_page"] || 1) - 1)
+			src.current_page = prev_page
+			src.refresh_bans()
+			. = TRUE
+
+		if (BAN_PANEL_ACTION_PAGE_NEXT)
+			var/next_page = min(src.banResourceList?.meta["last_page"] || 1, (src.banResourceList?.meta["current_page"] || 1) + 1)
+			src.current_page = next_page
+			src.refresh_bans()
+			. = TRUE
+
+		if(BAN_PANEL_ACTION_SET_PER_PAGE)
+			src.per_page = params["amount"]
+			src.refresh_bans()
+			. = TRUE
+
+		if (BAN_PANEL_ACTION_SET_TAB)
+			src.current_tab = params["value"]
+			. = TRUE
+
+		if (BAN_PANEL_ACTION_EDIT_BAN)
+			// var/ban_id = params["id"]
+			// TODO: edit ban
+			. = TRUE
+
+		if (BAN_PANEL_ACTION_DELETE_BAN)
+			// TODO: not shit
+			. = TRUE
+			var/ban_id = params["id"]
+			src.removeBan(ban_id)
+
+
+/// Remove a ban, given an id
+/datum/ban_panel/proc/removeBan(ban_id)
+	var/datum/apiModel/Tracked/BanResource/the_ban = null
+	for (var/datum/apiModel/Tracked/BanResource/ban in src.banResourceList.data)
+		if (num2text(ban.id) == ban_id)
+			the_ban = ban
+			break
+	if (!the_ban)
+		tgui_alert(usr, "Ban couldn't be found! ID: [ban_id]", "Ban Panel Error")
+		return
+	var/ckey = the_ban.original_ban_detail["ckey"]
+	var/cid = the_ban.original_ban_detail["comp_id"]
+	var/ip = the_ban.original_ban_detail["ip"]
+	var/alert_body = {"
+		Are you sure you want to delete ban [ban_id]?
+		ckey: [ckey || "none"]
+		CID: [cid || "none"]
+		IP: [ip || "none"]
+	"}
+	var/alert_input = tgui_alert(usr, alert_body, "Delete Ban", list("Yes", "No"))
+	if (alert_input == "Yes")
+		bansHandler.remove(ban_id, usr.client.ckey, ckey, cid, ip)
+
+/// Wrapper for /datum/bansHandler/proc/getAll
+/datum/ban_panel/proc/refresh_bans(list/filters, sort_by, descending)
+	src.banResourceList = bansHandler.getAll(
+		filters = filters,
+		sort_by = sort_by,
+		descending = descending,
+		page = src.current_page,
+		per_page = src.per_page,
+	)
+
+#undef BAN_PANEL_TAB_BAN_LIST
+#undef BAN_PANEL_TAB_JOB_BAN_LIST
+
+#undef BAN_PANEL_ACTION_SEARCH
+#undef BAN_PANEL_ACTION_PAGE_PREV
+#undef BAN_PANEL_ACTION_PAGE_NEXT
+#undef BAN_PANEL_ACTION_SET_PER_PAGE
+#undef BAN_PANEL_ACTION_SET_TAB
+#undef BAN_PANEL_ACTION_DELETE_BAN
+#undef BAN_PANEL_ACTION_EDIT_BAN
diff --git a/code/modules/admin/bans.dm b/code/modules/admin/bans.dm
index 770a0345c5bc7..47488d6c181d3 100644
--- a/code/modules/admin/bans.dm
+++ b/code/modules/admin/bans.dm
@@ -1,902 +1,347 @@
-/////////////////////////
-// BASE BAN PROCS
-// Most of these have two steps (instead of double the procs)
-// First step sends the initial query to the bans web API
-// Second step handles the response
-/////////////////////////
-
-
-//Returns the expiry timestamp in a human readable format
-/proc/getExpiry(minutes)
-	var/CMinutes = (world.realtime / 10) / 60
-	if(istext(minutes))
-		minutes = text2num(minutes)
-	var/exp = minutes - CMinutes
-	if (exp <= 0)
-		return 0
-	else
-		if (exp >= ((24 HOURS) / (1 MINUTE))) // 1 day in minutes
-			exp = round(exp / 1440, 0.1)
-			. = "[exp] Day[exp > 1 ? "s" : ""]"
-		else if (exp >= ((1 HOUR) / (1 MINUTE))) // 1 hour in minutes
-			exp = round(exp / 60, 0.1)
-			. = "[exp] Hour[exp > 1 ? "s" : ""]"
+/var/global/datum/bansHandler/bansHandler = new
+
+/datum/bansHandler
+	/// Convert duration to something useful for Humans
+	proc/getDurationHuman(seconds)
+		var/exp = seconds / 60
+		if (exp <= 0)
+			. = 0
 		else
-			. = "[exp] Minute[exp > 1 ? "s" : ""]"
-
-
-//A dumb thing to cache the players seen per round, so I don't end up recording dudes when they reconnect a billion times
-var/global/list/playersSeen = list()
-/proc/managePlayerSeen(ckey, compID, ip)
-	var/key = "[ckey]|[compID]|[ip]"
-	if (key in playersSeen)
-		return FALSE
-	else
-		playersSeen += key
-		return TRUE
-
-
-//Are ya banned? Well!? ARE YA?!
-//A return 0 is a "this guy is ok let him in"
-//Anything that returns as true is a "bad dude kill his connection"
-//(this doesn't use the 'step' var thing because we need the response here and now)
-//"record" tells the goonhub api to make a note of these details
-/proc/checkBan(ckey, compID, ip, record = 0)
-	set background = 1
-	if (!ckey && !compID && !ip)
-		logTheThing(LOG_DEBUG, null, "<b>Bans Error</b>: No details passed to <b>checkBan</b>")
-		logTheThing(LOG_DIARY, null, "Bans Error: No details passed to checkBan", "debug")
-		return 0
-
-	if(!ip || ip == "127.0.0.1") return 0 //Ignore if localhost
-
-	if (record)
-		record = managePlayerSeen(ckey, compID, ip)
-
-	//Check if this user has a ban already
-	var/query[] = new()
-	query["ckey"] = ckey
-	query["compID"] = compID
-	query["ip"] = ip
-	query["record"] = record
-	#ifdef RP_MODE
-	query["rp_mode"] = TRUE
-	#endif
-
-	var/list/data
-	try
-		data = apiHandler.queryAPI("bans/check", query, 1)
-	catch ()
-		//API is dead, let the person in without checking
-		return 0
-
-	//If the server returned nothing, a "no bans found" record, or a "this dude is exception'd"
-	//Then they are good to go
-	if (!data || data["none"] || data["exception"])
-		return 0
-	if (data["error"]) //Error returned from the API welp
-		logTheThing(LOG_DEBUG, null, "<b>Bans Error</b>: Error returned in <b>checkBan</b> for <b>[ckey]</b>: [data["error"]]")
-		logTheThing(LOG_DIARY, null, "Bans Error: Error returned in checkBan for [ckey]: [data["error"]]", "debug")
-		return 0
-
-	//We only care about the latest match for this (so far)
-	var/list/row = data[data[1]]
-
-	var/timestamp = text2num(row["timestamp"])
-
-	var/expired = timestamp > 0 && !getExpiry(timestamp)
-
-	//Are any of the details...different? This is to catch out ban evading jerks who change their ckey but forget to mask their IP or whatever
-	var/timeAdded = 0
-	if (!expired && (row["ckey"] != ckey || (row["ip"] != ip && row["ip"] != "N/A") || (row["compID"] != compID && row["compID"] != "N/A"))) //Insert a new ban for this JERK
-		var/newChain = 0
-		if (text2num(row["previous"]) > 0) //if we matched a previous auto-added ban
-			if (text2num(row["chain"]) > 0)
-				newChain = text2num(row["chain"]) + 1
-			else //no multiplier present, default to x2 (this should never occur)
-				newChain = 2
-		else //didn't match a previous evasion ban, start off with x1
-			newChain = 1
-
-		timeAdded = (row["ckey"] != ckey && newChain > 1 ? 1 : 0) //only add time if a ckey didnt match, and it's a second evasion
-		var/CMinutes = (world.realtime / 10) / 60
-		var/remaining = (timestamp > 0 ? timestamp - CMinutes : timestamp)
-		var/addData[] = new()
-		addData["ckey"] = ckey
-		addData["compID"] = (row["compID"] == "N/A" ? "N/A" : compID) // don't record CID if the original ban doesn't have one down
-		addData["ip"] = (row["ip"] == "N/A" ? "N/A" : ip) // don't record ip if the original ban doesn't have one down
-		addData["reason"] = row["reason"]
-		addData["oakey"] = row["oakey"]
-		addData["akey"] = "Auto Banner"
-		addData["mins"] = remaining
-		addData["previous"] = text2num(row["id"])
-		addData["chain"] = newChain
-		if (row["server"])
-			addData["server"] = row["server"]
-		addData["addTime"] = timeAdded
-		var/rVal = addBan(addData)
-		if (rVal)
-			logTheThing(LOG_DEBUG, null, "<b>Bans Error</b>: Add ban in checkBan failed with message <b>[rVal]</b>")
-			logTheThing(LOG_DIARY, null, "Bans Error: Add ban in checkBan failed with message [rVal]", "debug")
-
-	var/oakey = (row["oakey"] == "N/A" ? row["akey"] : row["oakey"])
-	if (timestamp > 0) //Temp ban found, determine if it should expire or not
-		if (expired) //It expired! Go you!
-			var/deleteData[] = new()
-			deleteData["id"] = row["id"]
-			deleteData["ckey"] = row["ckey"]
-			deleteData["compID"] = row["compID"]
-			deleteData["ip"] = row["ip"]
-			deleteData["akey"] = "Auto Unbanner"
-			var/rVal = deleteBan(deleteData)
-			if (rVal)
-				logTheThing(LOG_DEBUG, null, "<b>Bans Error</b>: Delete temp ban in checkBan failed with message <b>[rVal]</b>")
-				logTheThing(LOG_DIARY, null, "Bans Error: Delete temp ban in checkBan failed with message [rVal]", "debug")
-			return 0
-		else //Temp ban still in effect. DENIED
-			var/details = "[row["reason"]]<br>"
-			details += "Banned By: [oakey]<br>"
-			details += "This ban applies to [row["server"] ? "this server only" : "all servers"].<br>"
-			details += "(This ban will be automatically removed in [getExpiry(timestamp)].)"
-			details += "[timeAdded ? "<br>(5 days have been automatically added to your ban for attempted ban evasion)" : ""]"
-			return details
-	else //Permaban found, the player is DENIED
-		var/details = "[row["reason"]]<br>"
-		details += "Banned By: [oakey]<br>"
-		details += "This ban applies to [row["server"] ? "this server only" : "all servers"].<br>"
-		if(timestamp == 0)
-			details += "This is a permanent ban, you can't appeal this ban until 30 days have passed."
-		else if(timestamp == -1)
-			details += "Please make an <a href='https://forum.ss13.co/forumdisplay.php?fid=54'>appeal on the forums</a> to have it lifted."
-		return details
-
-/proc/addBan(data)
-	set background = 1
-
-	if (data["data_hub_callback"])
-		if (data["error"])
-			return data["error"]
-		//we can get away with just this because addBan only ever returns the details we passed in to begin with
-		var/list/row = data["ban"]
-
-		var/client/adminC
-		var/client/targetC
-		for (var/client/C in clients) //grab clients if possible
-			if (C.ckey == row["akey"])
-				adminC = C
-			if (C.ckey == row["ckey"])
-				targetC = C
-
-		row["reason"] = html_decode(row["reason"])
-		var/chain = text2num(row["chain"])
-		if (chain > 0) //Prepend our evasion attempt info for: the user, admins, notes (everything except the actual ban reason in the db)
-			row["reason"] = "\[Evasion Attempt x[row["chain"]]\] Previous Reason: [row["reason"]]"
-
-		var/replacement_text
-		if (targetC)
-			targetC.mob.unlock_medal("Banned", FALSE)
-			boutput(targetC, SPAN_ALERT("<BIG><B>You have been banned by [row["akey"]].<br>Reason: [row["reason"]]</B></BIG>"))
-			boutput(targetC, SPAN_ALERT("To try to resolve this matter head to https://forum.ss13.co"))
-		else
-			replacement_text = "[row["ckey"]] (IP: [row["ip"]], CompID: [row["compID"]])"
-
-		if (!adminC)
-			adminC = (row["akey"] ? row["akey"] : "N/A")
-
-		var/expiry = getExpiry(row["timestamp"])
-		var/serverLogSnippet = row["server"] ? "from [row["server"]]" : "from all servers"
-
-		var/duration = expiry == 0 ? (data["text_ban_length"] || (text2num(row["timestamp"]) == 0 ? "Permanent" : "Until Appeal")) : expiry
-
-		if (text2num(row["timestamp"]) <= 0)
-			if (targetC)
-				if(duration == "Permanent")
-					boutput(targetC, SPAN_ALERT("You have received a permanent ban, you can't appeal this ban until 30 days have passed."))
-				else if(duration == "Until Appeal")
-					boutput(targetC, SPAN_ALERT("You have received a ban. Make an <a href='https://forum.ss13.co/forumdisplay.php?fid=54'>appeal on the forums</a> to have it lifted."))
-				else
-					boutput(targetC, SPAN_ALERT("You have received a ban. Duration: [duration]"))
-			logTheThing(LOG_ADMIN, adminC, "has banned [targetC ? "[constructTarget(targetC,"admin")]" : replacement_text] [serverLogSnippet]. duration: [duration] Reason: [row["reason"]].")
-			logTheThing(LOG_DIARY, adminC, "has banned [targetC ? "[constructTarget(targetC,"diary")]" : replacement_text] [serverLogSnippet]. duration: [duration] Reason: [row["reason"]].", "admin")
-			var/adminMsg = "<span class='notice'>"
-			adminMsg += (isclient(adminC) ? key_name(adminC) : adminC)
-			adminMsg += " has banned [targetC ? targetC : replacement_text] [serverLogSnippet].<br>Reason: [row["reason"]]</span>"
-			message_admins(adminMsg)
-		else
-			if (targetC) boutput(targetC, SPAN_ALERT("This is a temporary ban, it will be removed in [expiry]."))
-			logTheThing(LOG_ADMIN, adminC, "has banned [targetC ? "[constructTarget(targetC,"admin")]" : replacement_text] [serverLogSnippet]. Reason: [row["reason"]]. This will be removed in [expiry].")
-			logTheThing(LOG_DIARY, adminC, "has banned [targetC ? "[constructTarget(targetC,"diary")]" : replacement_text] [serverLogSnippet]. Reason: [row["reason"]]. This will be removed in [expiry].", "admin")
-			var/adminMsg = "<span class='notice'>"
-			adminMsg += (isclient(adminC) ? key_name(adminC) : adminC)
-			adminMsg += " has banned [targetC ? targetC : replacement_text] [serverLogSnippet].<br>Reason: [row["reason"]]<br>This will be removed in [expiry].</span>"
-			message_admins(adminMsg)
-
-		if (row["ckey"] && row["ckey"] != "N/A")
-			addPlayerNote(row["ckey"], row["akey"], "Banned [serverLogSnippet] by [row["akey"]], reason: [row["reason"]], duration: [duration]")
-
-		if(!targetC)
-			targetC = find_player(row["ckey"])?.client
-
+			if (exp >= ((24 HOURS) / (1 MINUTE))) // 1 day in minutes
+				exp = round(exp / 1440, 0.1)
+				. = "[exp] Day[exp > 1 ? "s" : ""]"
+			else if (exp >= ((1 HOUR) / (1 MINUTE))) // 1 hour in minutes
+				exp = round(exp / 60, 0.1)
+				. = "[exp] Hour[exp > 1 ? "s" : ""]"
+			else
+				. = "[exp] Minute[exp > 1 ? "s" : ""]"
+
+	/// List all bans
+	proc/getAll(list/filters = list(), sort_by = "id", descending = TRUE, page = "1", per_page = 30)
+		var/datum/apiRoute/bans/get/getBans = new
+		getBans.queryParams = list(
+			"filters" = filters,
+			"sort_by" = sort_by,
+			"descending" = descending,
+			"page" = page,
+			"per_page" = per_page
+		)
+		var/datum/apiModel/Paginated/BanResourceList/bans
+		try
+			bans = apiHandler.queryAPI(getBans)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		return bans
+
+	/// Add a ban
+	proc/add(admin_ckey, server_id, ckey, comp_id, ip, reason, duration = FALSE, requires_appeal = FALSE)
+		duration = duration ? duration / 10 : duration // duration given in deciseconds, api expects seconds
+		var/datum/apiRoute/bans/add/addBan = new
+		addBan.buildBody(
+			admin_ckey,
+			roundId,
+			server_id,
+			ckey,
+			comp_id,
+			ip,
+			reason,
+			duration,
+			requires_appeal
+		)
+		try
+			apiHandler.queryAPI(addBan)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		// We do this instead of requiring an admin client argument because bans can be added multiple ways, e.g. from discord
+		var/client/adminClient = find_client(admin_ckey)
+		var/client/targetClient = find_client(ckey)
+
+		var/durationHuman = duration ? src.getDurationHuman(duration) : "permanent"
+		var/adminKey = adminClient ? adminClient.key : admin_ckey
+		var/serverLogSnippet = server_id ? "from [server_id]" : "from all servers"
+		var/replacementText = "[ckey] (IP: [ip], CompID: [comp_id])"
+
+		// Tell admins
+		var/logMsg = "has banned [targetClient ? "[constructTarget(targetClient,"admin")]" : replacementText] [serverLogSnippet]. Duration: [durationHuman] Reason: [reason]."
+		logTheThing(LOG_ADMIN, adminClient ? adminClient : adminKey, logMsg)
+		logTheThing(LOG_DIARY, adminClient ? adminClient : adminKey, logMsg, "admin")
+		var/adminMsg = "<span class='notice'>"
+		adminMsg += adminClient ? key_name(adminClient) : adminKey
+		adminMsg += " has banned [targetClient ? targetClient : replacementText] [serverLogSnippet].<br>Reason: [reason]<br>Duration: [durationHuman].</span>"
+		message_admins(adminMsg)
+
+		// Tell discord
 		var/ircmsg[] = new()
-		ircmsg["key"] = row["akey"]
-		ircmsg["key2"] = "[row["ckey"]] (IP: [row["ip"]], CompID: [row["compID"]])"
-		ircmsg["msg"] = row["reason"]
-		if (chain > 0) //if we're auto-banning them
-			//fuck it, we get the player directly, surely this can't fail
-			var/datum/player/player = make_player(row["ckey"])
-			if (!player)
-				logTheThing(LOG_DEBUG, null, "Unable to find player for auto-banner rounds participated logging, ckey: [row["ckey"]]")
-			ircmsg["msg"] += "\n\nRounds participated: [player?.get_rounds_participated()]"
-		ircmsg["time"] = expiry
-		ircmsg["timestamp"] = row["timestamp"]
+		ircmsg["key"] = adminKey
+		ircmsg["key2"] = "[ckey] (IP: [ip], CompID: [comp_id])"
+		ircmsg["msg"] = reason
+		ircmsg["time"] = durationHuman
+		ircmsg["timestamp"] = ((world.realtime / 10) / 60) + (duration / 60) // duration is in seconds, bot expects minutes
 		ircbot.export_async("ban", ircmsg)
 
-		if (targetC)
-			del(targetC)
+		if (targetClient)
+			targetClient.mob.unlock_medal("Banned", FALSE)
+			boutput(targetClient, "<span class='alert'><BIG><B>You have been banned by [adminKey].<br>Reason: [reason]</B></BIG></span>")
+			boutput(targetClient, "<span class='alert'>To try to resolve this matter head to https://forum.ss13.co</span>")
+			if (duration)
+				boutput(targetClient, "<span class='alert'>You have received a ban. Duration: [durationHuman]</span>")
+			else
+				if (requires_appeal)
+					boutput(targetClient, "<span class='alert'>You have received a ban. Make an <a href='https://forum.ss13.co/forumdisplay.php?fid=54'>appeal on the forums</a> to have it lifted.</span>")
+				else
+					boutput(targetClient, "<span class='alert'>You have received a permanent ban, you can't appeal this ban until 30 days have passed.</span>")
+
+			del(targetClient)
 		else
-			logTheThing(LOG_DEBUG, null, "<b>Bans:</b> Unable to find client with ckey '[row["ckey"]]' during banning.")
-
-		targetC = find_player(row["ckey"])?.client
-		if (targetC)
-			logTheThing(LOG_DEBUG, null, "<b>Bans:</b> Client with ckey '[row["ckey"]]' somehow survived banning, retrying kick.")
-			del(targetC)
-
-		return 0
-
-	else
-		var/banTimestamp = data["mins"]
-		if (data["mins"] > 0) //If a temp ban, calculate expiry
-			var/CMinutes = (world.realtime / 10) / 60
-			banTimestamp = (data["previous"] && data["addTime"] ? CMinutes + data["mins"] + 7200 : CMinutes + data["mins"]) //Add 5 days (7200 mins) onto the ban if it's an evasion attempt
-
-		var/query[] = new()
-		query["ckey"] = (data["ckey"] ? data["ckey"] : "N/A")
-		query["compID"] = (data["compID"] ? data["compID"] : "N/A")
-		query["ip"] = (data["ip"] ? data["ip"] : "N/A")
-		query["reason"] = data["reason"]
-		query["oakey"] = (data["oakey"] && data["oakey"] != "N/A" ? data["oakey"] : data["akey"])
-		query["akey"] = data["akey"]
-		query["timestamp"] = banTimestamp
-		query["previous"] = (data["previous"] ? data["previous"] : 0)
-		query["chain"] = (data["chain"] ? data["chain"] : 0)
-		if (data["server"])
-			query["server"] = data["server"]
-		data = apiHandler.queryAPI("bans/add", query)
-
-
-//Starts the dialog for banning a dude
-/client/proc/genericBanDialog(target)
-	if (src.holder?.level >= LEVEL_SA)
-		var/mob/M
-		var/mobRef = 0
-		if (target && ismob(target))
-			mobRef = 1
-			M = target
-
-		if (mobRef)
-			if (M.client && M.client.holder && (M.client.holder.level >= src.holder.level))
-				alert("You can't ban another admin you huge jerk!!!!!")
-				return null
-
-		var/data[] = new()
-
-		if (!mobRef)
-			data["ckey"] = ckey(input(src, "Ckey, leave blank to skip", "Ban") as null|text)
-			var/auto_fill
-			if (data["ckey"])
-				auto_fill = alert("Attempt to autofill IP and compID with most recent?","Autofill?","Yes","No")
-			if (auto_fill == "Yes")
-				var/list/response
+			logTheThing(LOG_DEBUG, "Bans: unable to find client to kick for banned ckey [ckey]")
+
+	/// Check if a ban exists
+	proc/check(ckey, comp_id, ip)
+		if (!ip || ip == "127.0.0.1") return FALSE // Ignore if localhost
+
+		var/datum/apiRoute/bans/check/checkBan = new
+		checkBan.queryParams = list(
+			"ckey" = ckey,
+			"comp_id" = comp_id,
+			"ip" = ip,
+			"server_id" = config.server_id
+		)
+		var/datum/apiModel/Tracked/BanResource/ban
+		try
+			ban = apiHandler.queryAPI(checkBan)
+		catch
+			return FALSE
+
+		// If we haven't recorded any of the player's connection details, this counts as an evasion
+		var/recordedCkey = FALSE
+		var/recordedCompId = FALSE
+		var/recordedIp = FALSE
+		for (var/datum/apiModel/Tracked/BanDetail/banDetail in ban.details)
+			if (!ckey || banDetail.ckey == ckey) recordedCkey = TRUE
+			if (!comp_id || banDetail.comp_id == comp_id) recordedCompId = TRUE
+			if (!ip || banDetail.ip == ip) recordedIp = TRUE
+
+		// var/evasionAttempt = FALSE
+		if (!recordedCkey || !recordedCompId || !recordedIp)
+			// evasionAttempt = TRUE
+			SPAWN(0)
 				try
-					response = apiHandler.queryAPI("playerInfo/get", list("ckey" = data["ckey"]), forceResponse = 1)
-				catch ()
-					boutput(src, SPAN_ALERT("Failed to query API, try again later."))
-					return
-				if (text2num(response["seen"]) < 1)
-					boutput(src, SPAN_ALERT("No data found for target, IP and/or compID will be left blank."))
-				data["ip"] = response["last_ip"]
-				data["compID"] = response["last_compID"]
-			else
-				data["compID"] = input(src, "Computer ID", "Ban") as null|text
-				data["ip"] = input(src, "IP Address", "Ban") as null|text
+					// Add these details to the existing ban
+					src.addDetails(ban.id, TRUE, "bot", ckey, comp_id, ip)
+				catch (var/exception/e)
+					var/logMsg = "Failed to add ban evasion details to ban [ban.id] because: [e.name]"
+					logTheThing(LOG_ADMIN, "bot", logMsg)
+					logTheThing(LOG_DIARY, "bot", logMsg, "admin")
+
+		// Build a message to show to the player
+		var/message = "[ban.reason]<br>"
+		message += "Banned By: [ban.game_admin["ckey"]]<br>"
+		message += "This ban applies to [ban.server_id ? "this server only" : "all servers"].<br>"
+		if (ban.expires_at)
+			message += "(This ban will be automatically removed in [ban.duration_human])"
 		else
-			data["ckey"] = M.ckey
-			data["compID"] = M.computer_id
-			data["ip"] = M.lastKnownIP
-
-		if (!data["ckey"] && !data["ip"] && !data["compID"])
-			boutput(src, SPAN_ALERT("You need to input a ckey or IP or computer ID, all cannot be blank."))
-			return null
-
-		boutput(src, SPAN_ALERT("<b>You are currently banning the following player:</b>"))
-		boutput(src, "<b>Mob:</b> [mobRef ? M.name : "N/A"]")
-		boutput(src, "<b>Key:</b> [data["ckey"] ? data["ckey"] : "N/A"] (IP: [data["ip"] ? data["ip"] : "N/A"], CompID: [data["compID"] ? data["compID"] : "N/A"])")
-		boutput(src, SPAN_ALERT("<b>Make sure this is who you want to ban before continuing!</b>"))
-
-		var/reason = input(src,"Reason for ban?","Ban") as null|text
-		if(!reason)
-			boutput(src, SPAN_ALERT("You need to enter a reason for the ban."))
-			return
-		data["reason"] = reason
-
-		var/datum/game_server/game_server = global.game_servers.input_server(src, "What server does the ban apply to?", "Ban", can_pick_all=TRUE)
-		if(isnull(game_server))
-			return null
-		data["server"] = istype(game_server) ? game_server.id : null // null = all servers
-
-		var/ban_time = input(src,"How long will the ban be?","Ban") as null|anything in \
-			list("Half-hour","One Hour","Six Hours","One Day","Half a Week","One Week","Two Weeks","One Month","Until Appeal","Permanent","Custom")
-		var/mins = 0
-		switch(ban_time)
-			if("Half-hour")
-				mins = 30
-			if("One Hour")
-				mins = 60
-			if("Six Hours")
-				mins = 360
-			if("One Day")
-				mins = 1440
-			if("Half a Week")
-				mins = 5040
-			if("One Week")
-				mins = 10080
-			if("Two Weeks")
-				mins = 20160
-			if("One Month")
-				mins = 43200
-			if("Until Appeal")
-				mins = -1
-			if("Permanent")
-				mins = 0
+			if (ban.requires_appeal)
+				message += "Please make an <a href='https://forum.ss13.co/forumdisplay.php?fid=54'>appeal on the forums</a> to have it lifted."
 			else
-				var/cust_mins = input(src,"How many minutes? (1440 = one day)","BAN HE",1440) as null|num
-				if(!cust_mins)
-					boutput(src, SPAN_ALERT("No time entered, cancelling ban."))
-					return null
-				if(cust_mins >= 525600)
-					boutput(src, SPAN_ALERT("Ban time too long. Ban shortened to one year (525599 minutes)."))
-					mins = 525599
-				else
-					mins = cust_mins
-		data["mins"] = mins
-		data["text_ban_length"] = ban_time
-		data["akey"] = src.ckey
-		return data
-	else
-		alert("You need to be at least a Secondary Administrator to ban players.")
-		return null
-
-
-/client/proc/addBanDialog(target)
-	var/data[] = genericBanDialog(target)
-	if(data)
-		addBan(data)
-
-
-//Admin verb to add bans
-/client/proc/cmd_admin_addban ()
-	SET_ADMIN_CAT(ADMIN_CAT_UNUSED)
-	set name = "Add Ban"
-	set popup_menu = 0
-
-	addBanDialog()
-	return
-
-
-/proc/editBan(data)
-	set background = 1
-
-	if (data["data_hub_callback"])
-		if (data["error"])
-			return data["error"]
-		//we can get away with just this because editBan only ever acts on one ban (obviously)
-		var/list/row = data["ban"]
-
-		var/client/adminC
-		for (var/client/C in clients) //grab us a good ol' admin client
-			if (C.ckey == row["akey"])
-				adminC = C
-				break
-
-		if (!adminC)
-			adminC = (row["akey"] ? row["akey"] : "N/A")
-
-		var/target = "[row["ckey"]] (IP: [row["ip"]], CompID: [row["compID"]])"
-		var/expiry = getExpiry(text2num(row["timestamp"]))
-
-		var/serverLogSnippet = row["server"] ? "Server: [row["server"]]" : "Server: all"
-
-		var/duration = expiry == 0 ? data["text_ban_length"] : expiry
-
-		logTheThing(LOG_ADMIN, adminC, "edited [constructTarget(target,"admin")]'s ban. Reason: [row["reason"]] Duration: [duration] [serverLogSnippet]")
-		logTheThing(LOG_DIARY, adminC, "edited [constructTarget(target,"diary")]'s ban. Reason: [row["reason"]] Duration: [duration] [serverLogSnippet]", "admin")
-		message_admins(SPAN_INTERNAL("[key_name(adminC)] edited [target]'s ban. Reason: [row["reason"]] Duration: [duration] [serverLogSnippet]"))
-
+				message += "This is a permanent ban, you can't appeal this ban until 30 days have passed."
+
+		return list(
+			"ban" = ban,
+			"message" = message
+		)
+
+	/// Update an existing ban
+	proc/update(banId, admin_ckey, server_id, ckey, comp_id, ip, reason, duration, requires_appeal)
+		duration = duration ? duration / 10 : duration // duration given in deciseconds, api expects seconds
+		var/datum/apiRoute/bans/update/updateBan = new
+		updateBan.routeParams = list("[banId]")
+		updateBan.buildBody(
+			admin_ckey,
+			roundId,
+			server_id,
+			ckey,
+			comp_id,
+			ip,
+			reason,
+			duration,
+			requires_appeal
+		)
+		var/datum/apiModel/Tracked/BanResource/ban
+		try
+			ban = apiHandler.queryAPI(updateBan)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		var/originalBanDetail = ban.original_ban_detail
+		var/client/adminClient = find_client(admin_ckey)
+		var/target = "[originalBanDetail["ckey"]] (IP: [originalBanDetail["ip"]], CompID: [originalBanDetail["comp_id"]])"
+		var/durationHuman = duration ? src.getDurationHuman(duration) : "permanent"
+		var/serverLogSnippet = ban.server_id ? "Server: [ban.server_id]" : "Server: all"
+
+		// Tell admins
+		var/logMsg = "edited [constructTarget(target,"admin")]'s ban. Reason: [ban.reason] Duration: [durationHuman] [serverLogSnippet]"
+		logTheThing(LOG_ADMIN, adminClient ? adminClient : admin_ckey, logMsg)
+		logTheThing(LOG_DIARY, adminClient ? adminClient : admin_ckey, logMsg, "admin")
+		message_admins("<span class='internal'>[key_name(adminClient ? adminClient : admin_ckey)] edited [target]'s ban. Reason: [ban.reason] Duration: [durationHuman] [serverLogSnippet]</span>")
+
+		// Tell Discord
 		var/ircmsg[] = new()
-		ircmsg["key"] = (isclient(adminC) && adminC.key ? adminC.key : adminC)
-		ircmsg["name"] = (isclient(adminC) && adminC.mob && adminC.mob.name ? stripTextMacros(adminC.mob.name) : "N/A")
-		ircmsg["msg"] = "edited [target]'s ban. Reason: [row["reason"]]. Duration: [duration]. [serverLogSnippet]."
+		ircmsg["key"] = adminClient ? adminClient.key : admin_ckey
+		ircmsg["name"] = (adminClient && adminClient.mob && adminClient.mob.name ? stripTextMacros(adminClient.mob.name) : "N/A")
+		ircmsg["msg"] = "edited [target]'s ban. Reason: [ban.reason]. Duration: [durationHuman]. [serverLogSnippet]."
 		ircbot.export_async("admin", ircmsg)
 
-		return 0
-
-	else
-		var/banTimestamp = data["mins"]
-		if (data["mins"] > 0) //If a temp ban, calculate expiry
-			var/CMinutes = (world.realtime / 10) / 60
-			banTimestamp = (data["previous"] ? CMinutes + data["mins"] + 7200 : CMinutes + data["mins"]) //Add 5 days (7200 mins) onto the ban if it's an evasion attempt
-
-		var/query[] = new()
-		query["id"] = data["id"]
-		query["ckey"] = (data["ckey"] ? data["ckey"] : "N/A")
-		query["compID"] = (data["compID"] ? data["compID"] : "N/A")
-		query["ip"] = (data["ip"] ? data["ip"] : "N/A")
-		query["reason"] = data["reason"]
-		query["akey"] = data["akey"]
-		query["timestamp"] = banTimestamp
-		if (data["server"])
-			query["server"] = data["server"]
-		data = apiHandler.queryAPI("bans/edit", query)
-
-
-/client/proc/editBanDialog(id, ckey, compID, ip, oreason, otimestamp)
-	if (src.holder?.level >= LEVEL_SA)
-		var/CMinutes = (world.realtime / 10) / 60
-		var/remaining = (text2num(otimestamp) - CMinutes)
-		if(!remaining || remaining < 0) remaining = 0
-
-		var/data[] = new()
-		data["ckey"] = input(src, "Ckey (lowercase, only alphanumeric, no spaces)", "Ban", ckey) as null|text
-		data["compID"] = input(src, "Computer ID (leave blank to skip)", "Ban", compID) as null|text
-		data["ip"] = input(src, "IP Address", "Ban", ip) as null|text
-
-		if (!data["ckey"] && !data["ip"] && !data["compID"])
-			boutput(src, SPAN_ALERT("You need to input a ckey or a compID or an IP, all cannot be blank."))
-			return
-
-		var/reason = input(src,"Reason for ban?","Ban", oreason) as null|text
-		if(!reason)
-			boutput(src, SPAN_ALERT("You need to enter a reason for the ban."))
-			return
-		data["reason"] = reason
-
-		var/datum/game_server/game_server = global.game_servers.input_server(src, "What server does the ban apply to?", "Ban", can_pick_all=TRUE)
-		if(isnull(game_server))
-			return
-		data["server"] = istype(game_server) ? game_server.id : null // null = all servers
-
-		var/ban_time = input(src,"How long will the ban be? (select Custom to alter existing duration)","Ban") as null|anything in \
-			list("Half-hour","One Hour","Six Hours","One Day","Half a Week","One Week","One Month","Until Appeal","Permanent","Custom")
-		var/mins = 0
-		switch(ban_time)
-			if("Half-hour")
-				mins = 30
-			if("One Hour")
-				mins = 60
-			if("Six Hours")
-				mins = 360
-			if("One Day")
-				mins = 1440
-			if("Half a Week")
-				mins = 5040
-			if("One Week")
-				mins = 10080
-			if("One Month")
-				mins = 43200
-			if("Until Appeal")
-				mins = -1
-			if("Permanent")
-				mins = 0
-			else
-				var/cust_mins = input(src,"How many minutes? (1440 = one day)","BAN HE",remaining ? remaining : 1440) as null|num
-				if(!cust_mins)
-					boutput(src, SPAN_ALERT("No time entered, cancelling ban."))
-					return
-				if(cust_mins >= 525600)
-					boutput(src, SPAN_ALERT("Ban time too long. Ban shortened to one year (525599 minutes)."))
-					mins = 525599
-				else
-					mins = cust_mins
-
-		data["id"] = id
-		data["reason"] = reason
-		data["mins"] = mins
-		data["text_ban_length"] = ban_time
-		data["akey"] = src.ckey
-		editBan(data)
-
-		src.holder.banPanel()
-	else
-		alert("You need to be at least a Secondary Administrator to ban players.")
-		return 1
-
-
-/proc/deleteBan(data)
-	set background = 1
-
-	if (data["data_hub_callback"])
-		if (data["error"])
-			return data["error"]
-		//we can get away with just this because deleteBan only ever acts on one ban (obviously)
-		var/list/row = data["ban"]
-
-		var/client/adminC
-		for (var/client/C in clients)
-			if (C.ckey == row["akey"])
-				adminC = C
-				break
-
-		if (!adminC)
-			adminC = (row["akey"] ? row["akey"] : "N/A")
-
-		var/target = "[row["ckey"]] (IP: [row["ip"]], CompID: [row["compID"]])"
-		var/expired = (row["akey"] == "Auto Unbanner" ? 1 : 0)
-
-		if (expired)
-			logTheThing(LOG_ADMIN, null, "[row["ckey"]]'s ban expired.")
-			logTheThing(LOG_DIARY, null, "[row["ckey"]]'s ban expired.", "admin")
-			message_admins(SPAN_INTERNAL("Ban expired for [target]"))
-		else
-			logTheThing(LOG_ADMIN, adminC, "unbanned [row["ckey"]]")
-			logTheThing(LOG_DIARY, adminC, "unbanned [row["ckey"]]", "admin")
-			message_admins(SPAN_INTERNAL("[key_name(adminC)] unbanned [target]"))
-
+	/// Remove a ban
+	proc/remove(banId, admin_ckey, ckey, comp_id, ip)
+		try
+			var/datum/apiRoute/bans/delete/deleteBan = new
+			deleteBan.routeParams = list("[banId]")
+			deleteBan.buildBody(admin_ckey)
+			apiHandler.queryAPI(deleteBan)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		var/client/adminClient = find_client(admin_ckey)
+		var/target = "[ckey] (IP: [ip], CompID: [comp_id])"
+
+		// Tell admins
+		logTheThing(LOG_ADMIN, adminClient ? adminClient : admin_ckey, "unbanned [target]")
+		logTheThing(LOG_DIARY, adminClient ? adminClient : admin_ckey, "unbanned [target]", "admin")
+		message_admins("<span class='internal'>[key_name(adminClient ? adminClient : admin_ckey)] unbanned [target]</span>")
+
+		// Tell discord
 		var/ircmsg[] = new()
-		ircmsg["key"] = (isclient(adminC) && adminC.key ? adminC.key : adminC)
-		ircmsg["name"] = (expired ? "\[Expired\]" : "[isclient(adminC) && adminC.mob && adminC.mob.name ? stripTextMacros(adminC.mob.name) : "N/A"]")
-		ircmsg["msg"] = (expired ? "[row["ckey"]]'s ban removed." : "deleted [row["ckey"]]'s ban.")
+		ircmsg["key"] = adminClient ? adminClient.key : admin_ckey
+		ircmsg["name"] = adminClient && adminClient.mob && adminClient.mob.name ? stripTextMacros(adminClient.mob.name) : "N/A"
+		ircmsg["msg"] = "deleted [ckey]'s ban."
 		ircbot.export_async("admin", ircmsg)
 
-		return 0
-
-	else
-		var/query[] = new()
-		query["id"] = data["id"]
-		query["ckey"] = data["ckey"]
-		query["compID"] = data["compID"]
-		query["ip"] = data["ip"]
-		query["akey"] = data["akey"]
-		data = apiHandler.queryAPI("bans/delete", query)
-
-
-/client/proc/deleteBanDialog(id, ckey, compID, ip, akey)
-	if (src.holder?.level >= LEVEL_SA)
-		if(alert(src, "Are you sure you want to unban [ckey]?", "Confirmation", "Yes", "No") == "Yes")
-			var/data[] = new()
-			data["id"] = id
-			data["ckey"] = ckey
-			data["compID"] = compID
-			data["ip"] = ip
-			data["akey"] = akey
-			deleteBan(data)
-			src.holder.banPanel()
-	else
-		alert("You need to be at least a Secondary Administrator to remove bans.")
-
-/*
-/proc/addException(step = 1, data)
-	set background = 1
-
-	if (step == 1)
-		var/query[] = new()
-		query["ckey"] = data["ckey"]
-		query["akey"] = data["akey"]
-		data = apiHandler.queryAPI("bans/addException", query)
-
-	if (step == 2 || !centralConn)
-		var/list/ldata = data
-		if (!ldata) return "No data returned from query"
-		if (ldata["error"])
-			return ldata["error"]
-		//we can get away with just this because deleteBan only ever acts on one ban (obviously)
-		var/list/row = ldata[ldata[1]]
-
-		var/client/adminC
-		for (var/client/C in clients)
-			if (C.ckey == row["akey"])
-				adminC = C
-				break
-
-		if (!adminC)
-			adminC = (row["akey"] ? row["akey"] : "N/A")
-
-		var/target = "[row["ckey"]] (IP: [row["ip"]], CompID: [row["compID"]])"
-		var/expired = (row["akey"] == "Auto Unbanner" ? 1 : 0)
-
-		if (expired)
-			logTheThing(LOG_ADMIN, null, "[row["ckey"]]'s ban expired.")
-			logTheThing(LOG_DIARY, null, "[row["ckey"]]'s ban expired.", "admin")
-			message_admins(SPAN_INTERNAL("Ban expired for [target]"))
-		else
-			logTheThing(LOG_ADMIN, adminC, "unbanned [row["ckey"]]")
-			logTheThing(LOG_DIARY, adminC, "unbanned [row["ckey"]]", "admin")
-			message_admins(SPAN_INTERNAL("[key_name(adminC)] unbanned [target]"))
+	/// Add details to an existing ban
+	proc/addDetails(banId, evasion = FALSE, admin_ckey, ckey, comp_id, ip)
+		var/datum/apiRoute/bans/add_detail/addDetail = new
+		addDetail.routeParams = list("[banId]")
+		addDetail.buildBody(ckey, comp_id, ip)
+		var/datum/apiModel/Tracked/BanDetail/banDetail
+		try
+			banDetail = apiHandler.queryAPI(addDetail)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		var/client/adminClient = find_client(admin_ckey)
+		var/messageAdminsAdmin = admin_ckey == "bot" ? admin_ckey : key_name(adminClient ? adminClient : admin_ckey)
+		var/target = "[banDetail.ckey] (IP: [banDetail.ip], CompID: [banDetail.comp_id])"
+
+		// Tell admins
+		var/msg = "added ban [evasion ? "evasion" : ""] details to ban ID [banId] [target]"
+		logTheThing(LOG_ADMIN, adminClient ? adminClient : admin_ckey, msg)
+		logTheThing(LOG_DIARY, adminClient ? adminClient : admin_ckey, msg, "admin")
+		message_admins("<span class='internal'>[messageAdminsAdmin] [msg]</span>")
+
+		// Tell discord
+		var/ircmsg[] = new()
+		ircmsg["key"] = adminClient ? adminClient.key : admin_ckey
+		ircmsg["name"] = adminClient && adminClient.mob && adminClient.mob.name ? stripTextMacros(adminClient.mob.name) : "N/A"
+		ircmsg["msg"] = msg
+		ircbot.export_async("admin", ircmsg)
 
+	/// Remove details from an existing ban
+	proc/removeDetails(banDetailId, admin_ckey)
+		var/datum/apiRoute/bans/remove_detail/removeDetail = new
+		removeDetail.routeParams = list("[banDetailId]")
+		try
+			apiHandler.queryAPI(removeDetail)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			throw EXCEPTION(error.message)
+
+		var/client/adminClient = find_client(admin_ckey)
+
+		// Tell admins
+		var/msg = "removed ban detail ID [banDetailId]"
+		logTheThing(LOG_ADMIN, adminClient ? adminClient : admin_ckey, msg)
+		logTheThing(LOG_DIARY, adminClient ? adminClient : admin_ckey, msg, "admin")
+		message_admins("<span class='internal'>[key_name(adminClient ? adminClient : admin_ckey)] [msg]</span>")
+
+		// Tell discord
 		var/ircmsg[] = new()
-		ircmsg["key"] = (isclient(adminC) && adminC.key ? adminC.key : adminC)
-		ircmsg["name"] = (expired ? "\[Expired\]" : "[isclient(adminC) && adminC.mob && adminC.mob.name ? stripTextMacros(adminC.mob.name) : "N/A"]")
-		ircmsg["msg"] = (expired ? "[row["ckey"]]'s ban removed." : "deleted [row["ckey"]]'s ban.")
+		ircmsg["key"] = adminClient ? adminClient.key : admin_ckey
+		ircmsg["name"] = adminClient && adminClient.mob && adminClient.mob.name ? stripTextMacros(adminClient.mob.name) : "N/A"
+		ircmsg["msg"] = msg
 		ircbot.export_async("admin", ircmsg)
 
-		return 0
-
-
-/client/proc/addExceptionDialog()
-	if (src.holder && usr.level >= LEVEL_SA)
-		if(alert(usr, "Are you sure you want to unban [ckey]?", "Confirmation", "Yes", "No") == "Yes")
-			var/data[] = new()
-			data["id"] = id
-			data["ckey"] = ckey
-			data["compID"] = compID
-			data["ip"] = ip
-			data["akey"] = akey
-			deleteBan(data)
-			src.holder.banPanel()
-	else
-		alert("You need to be at least a Secondary Administrator to add ban exceptions.")
-*/
-
-/////////////////////////
-// BAN PANEL PROCS (called via ejhax)
-/////////////////////////
-
-
-/datum/admins/proc/banPanel()
-	var/CMinutes = (world.realtime / 10) / 60
-	var/bansHtml = grabResource("html/admin/banPanel.html")
-	var/windowName = "banPanel"
-	bansHtml = replacetext(bansHtml, "null /* window_name */", "'[windowName]'")
-	bansHtml = replacetext(bansHtml, "null /* ref_src */", "'\ref[src]'")
-	bansHtml = replacetext(bansHtml, "null /* cminutes */", "[CMinutes]")
-	bansHtml = replacetext(bansHtml, "null /* api_data_params */", "'data_server=[serverKey]&data_id=[config.server_id]&data_version=[config.goonhub_api_version]'")
-	if (centralConn)
-		bansHtml = replacetext(bansHtml, "null /* api_key */", "'[md5(config.goonhub_api_web_token)]'")
-	usr << browse(bansHtml,"window=[windowName];size=1080x500")
-
-
-/client/proc/openBanPanel()
-	set name = "Ban Panel"
+
+///////////////////////////
+// Temp ban management, remove when new ban panel exists
+///////////////////////////
+
+/client/proc/addBanTempDialog(target)
+	var/mob/M
+	if (target && ismob(target)) M = target
+
+	var/ckey = ckey(tgui_input_text(src.mob, "Ckey of the player", "Ckey", M ? M.ckey : ""))
+	if (!ckey) return
+
+	var/datum/player/player = find_player(ckey)
+	var/client/targetC = player?.client
+
+	var/defaultIp = targetC ? targetC.address : (M ? M.lastKnownIP : "")
+	var/ip = tgui_input_text(src.mob, "IP of the player", "IP", defaultIp, null, FALSE, null, TRUE)
+	var/defaultCompId = targetC ? targetC.computer_id : (M ? M.computer_id : "")
+	var/compId = tgui_input_text(src.mob, "Computer ID of the player", "Computer ID", defaultCompId, null, FALSE, null, TRUE)
+
+	var/datum/game_server/game_server = global.game_servers.input_server(src.mob, "What server does the ban apply to?", "Ban", can_pick_all=TRUE)
+	if(isnull(game_server))
+		return null
+	var/serverId = istype(game_server) ? game_server.id : null // null = all servers
+
+	var/list/durations = list(
+		"Permanent" = "",
+		"Half hour" = 30 MINUTES,
+		"One hour" = 1 HOUR,
+		"Six hours" = 6 HOURS,
+		"One day" = 1 DAY,
+		"Half a week" = 3.5 DAYS,
+		"One week" = 1 WEEK,
+		"Two weeks" = 2 WEEKS,
+		"One month" = 30 DAYS,
+		"Three months" = 90 DAYS,
+		"Six months" = 26 WEEKS,
+		"One year" = 52 WEEKS
+	)
+	var/durationName = tgui_input_list(src.mob, "How long should the ban last?", "Duration", durations)
+	if (isnull(durationName)) return
+	var/duration = durations[durationName]
+	if (!duration) duration = FALSE
+
+	var/reason = tgui_input_text(src.mob, "What is the reason for this ban?", "Reason", "", null, TRUE)
+	if (!reason) return
+
+	return list(
+		"akey" = src.ckey,
+		"server" = serverId,
+		"ckey" = ckey,
+		"compId" = compId,
+		"ip" = ip,
+		"reason" = reason,
+		"duration" = duration
+	)
+
+/client/proc/addBanTemp()
+	set name = "Add Ban"
+	set desc = "Add a ban"
 	SET_ADMIN_CAT(ADMIN_CAT_PLAYERS)
-	if (src.holder && !src.holder.tempmin)
-		src.holder.banPanel()
-	else
-		alert("UM, EXCUSE ME??  YOU AREN'T AN ADMIN, GET DOWN FROM THERE!")
-		src << sound('sound/voice/farts/poo2.ogg')
-		logTheThing(LOG_ADMIN, src, "tried to access the ban panel")
-		logTheThing(LOG_DIARY, src, "tried to access the ban panel", "admin")
-		message_admins("[key_name(src)] tried to access the ban panel but was denied.")
-		del(usr.client)
-	return
-
-
-//DEBUG (gets the latest ban and prints it out)
-/proc/debugBans(data)
-	set background = 1
-
-	if (islist(data) && data["data_hub_callback"])
-		var/list/ban = data["ban"]
-		for (var/e = 1, e <= ban.len, e++) //each ban
-			var/id = ban[e]
-			var/list/details = ban[id]
-			boutput(world, id)
-			for (var/i = 1, i <= details.len, i++) //each item for this ban
-				boutput(world, "[details[i]]: [details[details[i]]]")
-
-	else
-		apiHandler.queryAPI("bans/debug")
-
-
-/////////////////////////
-// LOCAL AND REMOTE DB SYNCHRONISATION
-/////////////////////////
-
-
-/proc/writeToBanLog(data)
-	if (!data) return 0
-
-	var/banLog = "data/banLog.log"
-	var/lastID = 0
-	if (fexists(banLog))
-		//Here we fetch the latest logID, increment it, then append our data as json
-		var/list/log = dd_file2list(banLog)
-		var/lastIndex = (length(log) > 1 ? log.len - 1 : 1)
-		var/lastRow = log[lastIndex]
-		var/list/rowDetails = splittext(lastRow, ":")
-		lastID = text2num(rowDetails[1])
-
-	var/newID = lastID + 1
-	var/append = json_encode(data)
-	var/logFile = file(banLog)
-	boutput(logFile, "[newID]:[append]")
-
-	return 1
-
-
-/proc/clearBanLog()
-	var banLog = "data/banLog.log"
-	if (fexists(banLog))
-		fdel(banLog)
-
-	return 1
-
-
-/proc/forceUpdateLocalBans(latestLocalID, latestRemoteID)
-	//Construct the log IDs we need from the remote
-	var/needBans = ""
-	for (var/id = latestLocalID + 1, id <= latestRemoteID, id++)
-		needBans += "[id],"
-
-	needBans = copytext(needBans, 1, -1) //Remove the trailing comma
-
-	//Ask the remote for them
-	var/query[] = new()
-	query["ids"] = needBans
-	var/data[] = apiHandler.queryAPI("bans/updateLocal", query, 1)
-	if (!data) return 0
-
-	if (data["error"]) //Error returned from the API welp
-		logTheThing(LOG_DEBUG, null, "<b>Bans Error</b>: Error returned in <b>forceUpdateLocalBans</b>: [data["error"]]")
-		logTheThing(LOG_DIARY, null, "Bans Error: Error returned in forceUpdateLocalBans: [data["error"]]", "debug")
-		return 0
-
-	logTheThing(LOG_DEBUG, null, "UPDATE LOCAL DEBUG: data: [list2params(data)]")
-
-	//Loop through the bans we were given
-	for (var/row in data)
-		var/logID = row
-		if (!row) break
-		logTheThing(LOG_DEBUG, null, "UPDATE LOCAL DEBUG: logID: [logID]")
-		var/list/details = json_decode(row[logID])
-		logTheThing(LOG_DEBUG, null, "UPDATE LOCAL DEBUG: details: [list2params(details)]")
-		var/type = details["type"]
-		details.Remove(details["type"])
-
-		//Decide what to do with it
-		var/returnData[] = new()
-		if (type == "add")
-			returnData = addBanApiFallback(details)
-		if (type == "edit")
-			returnData = editBanApiFallback(details)
-		if (type == "delete")
-			returnData = deleteBanApiFallback(details)
-
-		if (returnData["error"]) //Error returned from the local db jeeeeez aint nothing going our way
-			logTheThing(LOG_DEBUG, null, "<b>Local API Error</b> - Callback failed in <b>[type]BanApiFallback</b> with message: <b>[returnData["error"]]</b>")
-			logTheThing(LOG_DIARY, null, "<b>Local API Error</b> - Callback failed in [type]BanApiFallback with message: [returnData["error"]]", "debug")
-			if (returnData["showAdmins"])
-				message_admins(SPAN_INTERNAL("<b>Failed for route [type]BanApiFallback</b>: [returnData["error"]]"))
-
-			return 0
-
-	/*
-	for (var/e = 1, e <= data.len, e++) //each ban
-		var/logID = data[e]
-		logTheThing(LOG_DEBUG, null, "UPDATE LOCAL DEBUG: logID: [logID]")
-		var/list/details = json_decode(data[logID])
-		logTheThing(LOG_DEBUG, null, "UPDATE LOCAL DEBUG: details: [list2params(details)]")
-		var/type = details["type"]
-		details.Remove(details["type"])
-
-		//Decide what to do with it
-		var/returnData[] = new()
-		if (type == "add")
-			returnData = addBanApiFallback(details)
-		if (type == "edit")
-			returnData = editBanApiFallback(details)
-		if (type == "delete")
-			returnData = deleteBanApiFallback(details)
-
-		if (returnData["error"]) //Error returned from the local db jeeeeez aint nothing going our way
-			logTheThing(LOG_DEBUG, null, "<b>Local API Error</b> - Callback failed in <b>[type]BanApiFallback</b> with message: <b>[returnData["error"]]</b>")
-			logTheThing(LOG_DIARY, null, "<b>Local API Error</b> - Callback failed in [type]BanApiFallback with message: [returnData["error"]]", "debug")
-			if (returnData["showAdmins"])
-				message_admins(SPAN_INTERNAL("<b>Failed for route [type]BanApiFallback</b>: [returnData[")error"]]")
-
-			return 0
-	*/
-
-	return 1
-
-
-/proc/forceUpdateRemoteBans(latestLocalID, latestRemoteID)
-	logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: latestLocalID: [latestLocalID]")
-	logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: latestRemoteID: [latestRemoteID]")
-	//Construct the log IDs the remote is missing
-	var/sendBans[] = new()
-	for (var/id = latestRemoteID + 1, id <= latestLocalID, id++)
-		sendBans.Add(id)
-
-	logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: sendBans: [list2params(sendBans)]")
-
-	var/list/log = dd_file2list("data/banLog.log")
-
-	//Get the data for those log IDs
-	var/parsedLog[] = new()
-	for (var/i = 1, i <= log.len, i++)
-		var/row = log[i]
-		logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: row: [row]")
-		var/list/rowDetails = splittext(row, ":")
-		logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: rowDetails: [list2params(rowDetails)]")
-		var/logID = rowDetails[1]
-		logID = text2num(logID)
-		logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: logID: [logID]")
-		if (logID in sendBans)
-			var/lengthToCut = length(logID)+3 //+1 for the colon, +2 for copytext being a shitass
-			var/details = copytext(row, lengthToCut)
-			logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: details: [details]")
-			parsedLog["[logID]"] = details
-
-	logTheThing(LOG_DEBUG, null, "UPDATE REMOTE DEBUG: parsedLog: [json_encode(parsedLog)]")
-
-	//Send it to the remote so it can update
-	var/query[] = new()
-	query["bans"] = json_encode(parsedLog)
-	apiHandler.queryAPI("bans/updateRemote", query)
-
-	return 1
-
-
-//Universal proc for checking if both the local ban db and the remote are synced
-/proc/bansParityCheck()
-	//Ok we should probably make sure this shit doesn't run on local servers
-	//yes we are checking filesize of the ban db here. it is a nice independent way of doing it
-	if (!centralConn || !fexists("data/localBans.db") || length(file("data/localBans.db")) < 102400)
-		return 0
-
-	//Get the latest logID from the local ban log
-	var/banLog = "data/banLog.log"
-	var/banLogF = file(banLog)
-	var/latestLocalID = 0
-
-	//Only operate on the log if it...exists and has stuff, naturally
-	if (fexists(banLog) && length(file2text(banLogF)) > 0)
-		var/list/log = dd_file2list(banLog)
-		var/lastIndex = (length(log) > 1 ? log.len - 1 : 1)
-		var/lastRow = log[lastIndex]
-		log = splittext(lastRow, ":")
-		latestLocalID = log[1]
-
-	//Get the latest logID from the API
-	var/query[] = new()
-	query["latestLocalID"] = latestLocalID
-	var/data[] = apiHandler.queryAPI("bans/parity", query, 1)
-	if (!data) return 0
-
-	var/list/row = data[data[1]]
-	if (!row["logID"])
-		return "ERROR: logID is not present from remote, cannot compare parity."
-	var/latestRemoteID = row["logID"]
-
-	//Just making sure
-	latestLocalID = text2num(latestLocalID)
-	latestRemoteID = text2num(latestRemoteID)
-
-	//Local bans are out of date
-	if (latestLocalID < latestRemoteID)
-		if (forceUpdateLocalBans(latestLocalID, latestRemoteID))
-			clearBanLog() //we're synced! clean up
-			return "Updated local bans to match central server"
-		return
-
-	//Remote bans are out of date
-	if (latestRemoteID < latestLocalID)
-		if (forceUpdateRemoteBans(latestLocalID, latestRemoteID))
-			clearBanLog() //we're synced! clean up
-			return "Updated remote bans to match cached local changes"
-		return
-
-	//Nothing is out of date supposedly possibly maybe??
-	clearBanLog() //we're synced! clean up
-	return "Both databases are up to date. Yay!"
-
-
-/proc/debugToggleCentralConn()
-	if (centralConn)
-		centralConn = 0
-		centralConnTries = 5
-		return "Set centralConn OFF"
-	else
-		centralConn = 1
-		centralConnTries = 0
-		return "Set centralConn ON"
 
+	var/list/data = src.addBanTempDialog()
+	if (!data) return
+
+	try
+		bansHandler.add(data["akey"], data["server"], data["ckey"], data["compId"], data["ip"], data["reason"], data["duration"])
+	catch (var/exception/e)
+		tgui_alert(src.mob, "Failed to add ban because: [e.name]", "Error")
diff --git a/code/modules/admin/banshark.dm b/code/modules/admin/banshark.dm
index 4291b23ac1c9a..182cd084ee751 100644
--- a/code/modules/admin/banshark.dm
+++ b/code/modules/admin/banshark.dm
@@ -9,7 +9,7 @@
 		boutput(src, "Only administrators may use this command.")
 		return
 	else
-		var/data[] = genericBanDialog(sharktarget)
+		var/data[] = src.addBanTempDialog(sharktarget)
 		if(data)
 			var/speed = input(usr,"How fast is the shark? Lower is faster.","speed","5") as num
 			if(!speed)
@@ -125,8 +125,16 @@
 		else
 			boutput(sharktarget2, SPAN_ALERT("<BIG><B>You can escape the banshark, but not the ban!</B></BIG>"))
 			logTheThing(LOG_ADMIN, caller:client, "has evaded the shark by ceasing to exist!  Banning them anyway.")
-			message_admins(SPAN_INTERNAL("data["ckey"] has evaded the shark by ceasing to exist!  Banning them anyway."))
-		addBan(data)
+			message_admins(SPAN_INTERNAL("[data["ckey"]] has evaded the shark by ceasing to exist!  Banning them anyway."))
+		bansHandler.add(
+			data["akey"],
+			data["server"],
+			data["ckey"],
+			data["compId"],
+			data["ip"],
+			data["reason"],
+			data["duration"]
+		)
 		playsound(src.loc, pick('sound/voice/burp_alien.ogg'), 50, 0)
 		qdel(src)
 
diff --git a/code/modules/admin/buildmodes/adventure/elements/trap/foam.dm b/code/modules/admin/buildmodes/adventure/elements/trap/foam.dm
index 67f47b4076fd0..d86223188fb06 100644
--- a/code/modules/admin/buildmodes/adventure/elements/trap/foam.dm
+++ b/code/modules/admin/buildmodes/adventure/elements/trap/foam.dm
@@ -24,8 +24,8 @@
 /obj/adventurepuzzle/triggerable/foamtrap
 	name = "foam trap"
 	invisibility = INVIS_ADVENTURE
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "beakerlarge"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	icon_state = "large_beaker"
 	density = 0
 	opacity = 0
 	anchored = ANCHORED
diff --git a/code/modules/admin/buildmodes/adventure/elements/trap/smoke.dm b/code/modules/admin/buildmodes/adventure/elements/trap/smoke.dm
index 760ed71851604..8f2a626e15ac1 100644
--- a/code/modules/admin/buildmodes/adventure/elements/trap/smoke.dm
+++ b/code/modules/admin/buildmodes/adventure/elements/trap/smoke.dm
@@ -21,8 +21,8 @@
 /obj/adventurepuzzle/triggerable/smoketrap
 	name = "smoke trap"
 	invisibility = INVIS_ADVENTURE
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "beakerlarge"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	icon_state = "large_beaker"
 	density = 0
 	opacity = 0
 	anchored = ANCHORED
diff --git a/code/modules/admin/custom_spawn_event.dm b/code/modules/admin/custom_spawn_event.dm
index fd88ea0e8865c..f032365381cf4 100644
--- a/code/modules/admin/custom_spawn_event.dm
+++ b/code/modules/admin/custom_spawn_event.dm
@@ -107,6 +107,8 @@
 			if (src.antag_role == "generic_antagonist")
 				mind.add_generic_antagonist("generic_antagonist", new_mob.real_name, do_equip = src.equip_antag, do_objectives = FALSE, do_relocate = FALSE, source = ANTAGONIST_SOURCE_ADMIN, respect_mutual_exclusives = FALSE)
 			else if (src.antag_role)
+				if (mind.get_antagonist(src.antag_role))
+					mind.remove_antagonist(src.antag_role, ANTAGONIST_REMOVAL_SOURCE_OVERRIDE)
 				mind.add_antagonist(src.antag_role, do_relocate = FALSE, do_objectives = FALSE, source = ANTAGONIST_SOURCE_ADMIN, do_equip = src.equip_antag, respect_mutual_exclusives = FALSE)
 			else
 				mind.wipe_antagonists()
@@ -134,6 +136,8 @@
 		var/spawn_type = ""
 		if (ismob(src.spawn_event.thing_to_spawn))
 			spawn_type = "mob_ref"
+		else if (src.spawn_event.thing_to_spawn == /mob/living/carbon/human/normal) //special case for a useful shortcut
+			spawn_type = "random_human"
 		else if (ispath(src.spawn_event.thing_to_spawn, /mob))
 			spawn_type = "mob_type"
 		else if (istext(src.spawn_event.thing_to_spawn))
@@ -195,6 +199,8 @@
 				for (var/datum/job/job in (job_controls.staple_jobs + job_controls.special_jobs + job_controls.hidden_jobs))
 					job_names |= job.name
 				src.spawn_event.thing_to_spawn = tgui_input_list(ui.user, "Select job type", "Select type", job_names) || src.spawn_event.thing_to_spawn
+			if ("set_random_human")
+				src.spawn_event.thing_to_spawn = /mob/living/carbon/human/normal
 			if ("select_turf")
 				src.spawn_event.spawn_loc = get_turf(pick_ref(ui.user))
 			if ("select_landmark")
@@ -227,8 +233,8 @@
 				src.spawn_event.allow_dnr = params["allow_dnr"]
 			if ("spawn") //no accidental double clicks
 				if (!ON_COOLDOWN(ui.user, "custom_spawn_event", 1 SECOND))
-					message_admins("[key_name(ui.user)] initiated a custom spawn event of [src.spawn_event.amount_to_spawn] [src.spawn_event.get_mob_name()]")
-					logTheThing(LOG_ADMIN, ui.user, "initiated a custom spawn event of [src.spawn_event.amount_to_spawn] [src.spawn_event.get_mob_name()]")
+					message_admins("[key_name(ui.user)] initiated a custom spawn event of [src.spawn_event.amount_to_spawn] [src.spawn_event.get_mob_name()] [src.spawn_event.antag_role]")
+					logTheThing(LOG_ADMIN, ui.user, "initiated a custom spawn event of [src.spawn_event.amount_to_spawn] [src.spawn_event.get_mob_name()] [src.spawn_event.antag_role]")
 					src.spawn_event.do_spawn()
 			if ("refresh_player_count")
 				src.refresh_player_count = TRUE
diff --git a/code/modules/admin/drunkmode.dm b/code/modules/admin/drunkmode.dm
index b74eb714e8470..d4b504a878086 100644
--- a/code/modules/admin/drunkmode.dm
+++ b/code/modules/admin/drunkmode.dm
@@ -10,8 +10,7 @@ var/list/dangerousVerbs = list(\
 
 //No banning for you
 /client/proc/warn,\
-/client/proc/openBanPanel,\
-/client/proc/cmd_admin_addban,\
+/client/proc/ban_panel,\
 /client/proc/banooc,\
 /client/proc/sharkban,\
 
diff --git a/code/modules/admin/gibverbs.dm b/code/modules/admin/gibverbs.dm
index a85ec2387b8fa..33ed7a7fc740b 100644
--- a/code/modules/admin/gibverbs.dm
+++ b/code/modules/admin/gibverbs.dm
@@ -461,14 +461,15 @@
 				boutput(tysontarget2, "Here is where you'd get banned.")
 				qdel(src)
 				return
-			var/addData[] = new()
-			addData["ckey"] = tysontarget2.ckey
-			addData["compID"] =  tysontarget2.computer_id
-			addData["ip"] = tysontarget2.client.address
-			addData["reason"] = tysonreason
-			addData["akey"] = caller:ckey
-			addData["mins"] = tysonmins2
-			addBan(addData)
+			bansHandler.add(
+				caller:ckey,
+				null,
+				tysontarget2.ckey,
+				tysontarget2.computer_id,
+				tysontarget2.client.address,
+				tysonreason,
+				tysonmins2 * 60 * 10
+			)
 			boutput(tysontarget2, SPAN_ALERT("<BIG><B>You have been tysoned by [usr.client.ckey].<br>Reason: [tysonreason] and he couldn't escape the tyson.</B></BIG>"))
 			boutput(tysontarget2, SPAN_ALERT("This is a temporary tysonban, it will be removed in [tysonmins2] minutes."))
 			logTheThing(LOG_ADMIN, caller:client, "has tysonbanned [constructTarget(tysontarget2,"admin")]. Reason: [tysonreason] and he couldn't escape the tyson. This will be removed in [tysonmins2] minutes.")
diff --git a/code/modules/admin/jobban.dm b/code/modules/admin/jobban.dm
index 96289efe5b3b2..705277dba9466 100644
--- a/code/modules/admin/jobban.dm
+++ b/code/modules/admin/jobban.dm
@@ -1,5 +1,16 @@
 //Job Ban Handling, Modified to utilize code written within the past 6 years.
 
+/proc/jobban_get_for_player(ckey, server)
+	if (!ckey) return list()
+	try
+		var/datum/apiRoute/jobbans/getforplayer/getJobBansForPlayer = new
+		getJobBansForPlayer.queryParams = list("ckey" = ckey, "server_id" = server)
+		var/datum/apiModel/JobBansForPlayer/jobBansForPlayer = apiHandler.queryAPI(getJobBansForPlayer)
+		return jobBansForPlayer.jobs
+	catch
+		return list()
+
+
 /proc/jobban_fullban(M, rank, akey)
 	if (!M || !akey) return
 	if(ismob(M)) //Correct to ckey if provided a mob.
@@ -9,17 +20,25 @@
 	if(isnull(game_server))
 		return null
 	var/server_id = istype(game_server) ? game_server.id : null // null = all servers
-	if(apiHandler.queryAPI("jobbans/add", list("ckey"=M,"rank"=rank, "akey"=akey, "applicable_server"=server_id)))
+
+	try
+		var/datum/apiRoute/jobbans/add/addJobBan = new
+		addJobBan.buildBody(akey, roundId, server_id, M, rank)
+		apiHandler.queryAPI(addJobBan)
+
 		var/datum/player/player = make_player(M) //Recache the player.
-		player?.cached_jobbans = apiHandler.queryAPI("jobbans/get/player", list("ckey"=M), 1)[M]
+		player?.cached_jobbans = jobban_get_for_player(M, server_id)
+
 		var/ircmsg[] = new()
 		ircmsg["key"] = M
 		ircmsg["rank"] = rank
 		ircmsg["akey"] = akey
 		ircmsg["applicable_server"] = server_id
 		ircbot.export_async("job_ban", ircmsg)
-		return 1
-	return 0 //Errored.
+
+		return TRUE
+	catch
+		return FALSE
 
 
 ///Can be provided with a mob, a raw cache list, or a ckey. Prefer providing a cache if you can't use a mob, as that reduces API load.
@@ -27,28 +46,23 @@
 	var/list/cache
 	if(!M)
 		return FALSE
-	var/datum/player/player = null
 	if(ismob(M))
 		var/mob/M2 = M
-		player = make_player(M2.ckey) // Get the player so we can use their bancache.
-	else if(islist(M))
-		cache = M
-	else if(istext(M))
-		player = make_player(M)
-	else
-		CRASH("jobban_isbanned() called with invalid argument type '[M]'.")
-
-	if(isnull(cache) && player)
-		if(isnull(player.cached_jobbans)) // Shit they aren't cached.
-			var/api_response = apiHandler.queryAPI("jobbans/get/player", list("ckey"=player.ckey), 1)
-			if(!length(api_response)) // API unavailable or something
+		//if(isnull(M2.client))
+			//return FALSE
+		var/datum/player/player = make_player(M2.ckey) // Get the player so we can use their bancache.
+		if(player.cached_jobbans == null) // Shit they aren't cached.
+			var/list/jobBans = jobban_get_for_player(M2.ckey)
+			player.cached_jobbans = jobBans
+			if(!length(jobBans)) // API unavailable or no bans
 				return FALSE
-			player.cached_jobbans = api_response[player.ckey]
+			if(!M2?.ckey)
+				return FALSE // new_player was disposed during api call
 		cache = player.cached_jobbans
-		if(isnull(cache))
-			CRASH("jobban cache is null for [player.ckey] after an API fetch")
-	else if(isnull(cache))
-		CRASH("jobban cache is null and there is no player datum, this should not happen: [M], [player]")
+	else if(islist(M))
+		cache = M
+	else //If we aren't a string this is going to explode.
+		cache = jobban_get_for_player(M)
 
 	var/datum/job/J = find_job_in_controller_by_string(rank)
 	if (J?.no_jobban_from_this_job)
@@ -87,7 +101,7 @@
 
 	if (!ismob(M))
 		checkey = M
-		cache = apiHandler.queryAPI("jobbans/get/player", list("ckey"=checkey), 1)[checkey]
+		cache = jobban_get_for_player(checkey)
 	else if (M.ckey)
 		checkey = M.ckey
 		var/datum/player/player = make_player(checkey) //Get the player so we can use their bancache.
@@ -98,13 +112,23 @@
 	if(!cache.Find("[rank]"))
 		return
 
-	apiHandler.queryAPI("jobbans/del", list("ckey"=checkey,"rank"=rank))
-	if(rank == "Security Department")
-		if(cache.Find("Security Officer"))
-			apiHandler.queryAPI("jobbans/del", list("ckey"=checkey, "rank"="Security Officer"))
-	var/ircmsg[] = new()
-	ircmsg["key"] = checkey
-	ircmsg["rank"] = rank
-	ircmsg["akey"] = akey
-	ircmsg["applicable_server"] = config.server_id
-	ircbot.export_async("job_unban", ircmsg)
+	try
+		var/datum/apiRoute/jobbans/delete/deleteJobBan = new
+		deleteJobBan.buildBody(null, checkey, rank)
+		apiHandler.queryAPI(deleteJobBan)
+
+		// Wire note: Hi this is super dumb
+		if(rank == "Security Department")
+			if(cache.Find("Security Officer"))
+				var/datum/apiRoute/jobbans/delete/secDeleteJobBan = new
+				secDeleteJobBan.buildBody(null, checkey, "Security Officer")
+				apiHandler.queryAPI(secDeleteJobBan)
+
+		var/ircmsg[] = new()
+		ircmsg["key"] = checkey
+		ircmsg["rank"] = rank
+		ircmsg["akey"] = akey
+		ircmsg["applicable_server"] = config.server_id
+		ircbot.export_async("job_unban", ircmsg)
+	catch
+		// pass
diff --git a/code/modules/admin/loginnotice.dm b/code/modules/admin/loginnotice.dm
index 69e75a6a363cc..c7893920f6c87 100644
--- a/code/modules/admin/loginnotice.dm
+++ b/code/modules/admin/loginnotice.dm
@@ -16,10 +16,10 @@
 	// this forces an update of the cloud data, to make sure it's fresh
 	// god forbid someone update it on server 4 and then overwrites it on server 1
 	var/datum/player/player = make_player(target_key)
-	player.cloud_fetch()
+	player.cloudSaves.fetch()
 
 	// get the current notice (if anything)
-	var/message = player.cloud_get("login_notice")
+	var/message = player.cloudSaves.getData("login_notice")
 
 	if (message)
 		alert("This player already has a login notice set. You can modify it in the next window. To delete it, blank the text and hit OK.")
@@ -35,22 +35,22 @@
 
 	// if there's no new message but there WAS one, we're deleting the current set one
 	if (!new_message && message)
-		if (!player.cloud_put("login_notice", null))
+		if (!player.cloudSaves.putData("login_notice", null))
 			tgui_alert(src.owner.mob, "ERROR: Failed to clear login notice to cloud for [target_key].")
 			return
-		addPlayerNote(target_key, src.owner.ckey + " (AUTO)", "Cleared the previous login notice.")
+		addPlayerNote(target_key, src.owner.ckey, "Cleared the previous login notice.")
 		return
 
 
 	// otherwise, we have a new message to save
 	// yes it is using the log date. no i don't care
 	var/message_text = "Message from Admin [src.owner.ckey] at [roundLog_date]:\n\n[new_message]"
-	if (!player.cloud_put("login_notice", message_text))
+	if (!player.cloudSaves.putData("login_notice", message_text))
 		input(src.owner.mob, "** ERROR SAVING LOGIN MESSAGE **\nYou can copy it from here to retry later:", "Login Notice", message) as null|message
 		return
 
 	// New note saved, usual player notes bookkeeping
-	addPlayerNote(target_key, src.owner.ckey + " (AUTO)", "New login notice set:\n\n[message_text]")
+	addPlayerNote(target_key, src.owner.ckey, "New login notice set:\n\n[message_text]")
 	message_admins(SPAN_INTERNAL("[key_name(src.owner.mob)] added a login notice for <a href='?src=%admin_ref%;action=notes&target=[target_key]'>[target_key]</A>:<br><div style='whitespace: pre-wrap;'>[message_text]</div>"))
 	tgui_alert(src.owner.mob, "Login notice for '[target_key]' has been set. They should see it next time they connect.")
 
@@ -62,10 +62,7 @@
 
 /// Returns 1 if a login message is pending, 0 otherwise
 /client/proc/has_login_notice_pending(var/show_again = 0)
-	if (!src.player.cloud_available())
-		return
-
-	var/message = src.player.cloud_get("login_notice")
+	var/message = src.player.cloudSaves.getData("login_notice")
 	if (message && show_again)
 		src.show_login_notice()
 
@@ -73,12 +70,7 @@
 
 /// Shows a login notice, if one exists
 /client/proc/show_login_notice()
-
-	// If the cloud isn't available then, welp.
-	if (!src.player.cloud_available())
-		return
-
-	var/message = src.player.cloud_get("login_notice")
+	var/message = src.player.cloudSaves.getData("login_notice")
 
 	if (message)
 		src << csound('sound/voice/bfreeze.ogg')
@@ -111,18 +103,14 @@
 		boutput(src, SPAN_ALERT("You have a pending login notice! You must acknowledge it before you can play!"))
 
 /client/proc/acknowledge_login_notice()
-	// This literally should not be possible but you know how it is
-	if (!src.player.cloud_available())
-		return
-
-	var/message = src.player.cloud_get("login_notice")
+	var/message = src.player.cloudSaves.getData("login_notice")
 	if (message)
-		if (!player.cloud_put("login_notice", null))
+		if (!player.cloudSaves.deleteData("login_notice"))
 			tgui_alert(src.mob, "ERROR: Failed to clear login notice for some reason...")
 			return
 
 		message_admins(SPAN_INTERNAL("[src.ckey] acknowledged their login notice."))
-		addPlayerNote(src.ckey, "(AUTO)", "Acknowledged their login notice.")
+		addPlayerNote(src.ckey, "bot", "Acknowledged their login notice.")
 		src.mob.Browse(null, "window=loginnotice")
 		src << csound('sound/machines/futurebuddy_beep.ogg')
 		alert("You have acknowledged the admin notice and can now play.")
diff --git a/code/modules/admin/player_options.dm b/code/modules/admin/player_options.dm
index 0db231bc41d5f..08c227354252b 100644
--- a/code/modules/admin/player_options.dm
+++ b/code/modules/admin/player_options.dm
@@ -353,7 +353,6 @@
 					<div class='r'>
 						<a href='[playeropt_link(M, "giveantagtoken")]'>Antag Tokens</a> &bull;
 						<a href='[playeropt_link(M, "setspacebux")]'>Spacebux</a> &bull;
-						<a href='[playeropt_link(M, "viewantaghistory")]'>Antag History</a> &bull;
 						<a href='[playeropt_link(M, "chatbans")]'>Chat Bans</a> &bull;
 						<a href='[playeropt_link(M, "flavortext")]'>Flavor text</a>
 					</div>
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 9a102cc59214c..fd51b0378cb32 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -5,7 +5,7 @@
 	return tgui_admin_state.can_use_topic(src, user)
 
 /datum/player_panel/ui_status(mob/user)
-  return tgui_admin_state.can_use_topic(src, user)
+	return tgui_admin_state.can_use_topic(src, user)
 
 /datum/player_panel/ui_interact(mob/user, datum/tgui/ui)
 	ui = tgui_process.try_update_ui(user, src, ui)
diff --git a/code/modules/admin/player_stats.dm b/code/modules/admin/player_stats.dm
index 3604d9f41bcac..8787d9008846f 100644
--- a/code/modules/admin/player_stats.dm
+++ b/code/modules/admin/player_stats.dm
@@ -49,15 +49,14 @@
 		del(usr.client)
 		return
 
-	var/list/response
+	var/datum/apiModel/Tracked/PlayerStatsResource/playerStats
 	try
-		response = apiHandler.queryAPI("playerInfo/get", list("ckey" = ckey), forceResponse = 1)
-	catch ()
+		var/datum/apiRoute/players/stats/get/getPlayerStats = new
+		getPlayerStats.queryParams = list("ckey" = ckey)
+		playerStats = apiHandler.queryAPI(getPlayerStats)
+	catch
 		return alert("Failed to query API, try again later.")
 
-	if (text2num(response["seen"]) < 1)
-		return alert("No data found.")
-
 	//Find the connected client, if present (ignore not found)
 	var/client/C
 	try
@@ -68,22 +67,20 @@
 
 	html += "<table>"
 	html += "<tr><td><b>Current status</b></td><td>[C ? "<span style='color: green;'>Online" : "<span style='color: red;'>Offline"]</span></td></tr>"
-	html += "<tr><td><b>Rounds connected to</b></td><td>[response["seen"]]</td></tr>"
-	html += "<tr><td><b>Rounds participated in</b></td><td>[response["participated"]]</td></tr>"
-	html += "<tr><td><b>Rounds connected to, RP</b></td><td>[response["seen_rp"]]</td></tr>"
-	html += "<tr><td><b>Rounds participated in, RP</b></td><td>[response["participated_rp"]]</td></tr>"
-	html += "<tr><td><b>Last seen</b></td><td>[response["last_seen"]]</td></tr>"
-	html += "<tr><td><b>Last seen BYOND version</b></td><td>[response["byondMajor"]].[response["byondMinor"]]</td></tr>"
-	html += "<tr><td><b>Platform</b></td><td>[response["platform"]]</td></tr>"
-	html += "<tr><td><b>Browser</b></td><td>[response["browser"]] [response["browserVersion"]][response["browserMode"] ? " ([response["browserMode"]])" : ""]</td></tr>"
+	html += "<tr><td><b>Rounds connected to</b></td><td>[playerStats.connected]</td></tr>"
+	html += "<tr><td><b>Rounds participated in</b></td><td>[playerStats.played]</td></tr>"
+	html += "<tr><td><b>Rounds connected to, RP</b></td><td>[playerStats.connected_rp]</td></tr>"
+	html += "<tr><td><b>Rounds participated in, RP</b></td><td>[playerStats.played_rp]</td></tr>"
+	html += "<tr><td><b>Last seen</b></td><td>[playerStats.latest_connection.created_at]</td></tr>"
+	html += "<tr><td><b>Last seen BYOND version</b></td><td>[playerStats.byond_major].[playerStats.byond_minor]</td></tr>"
 
 	html += "<tr><td style='vertical-align: top;'><b>IP</b></td><td>"
-	html += "Last seen: [response["last_ip"]]<br>"
+	html += "Last seen: [playerStats.latest_connection.ip]<br>"
 	html += "<a href='?src=\ref[src];action=show_player_ips;ckey=[ckey];'>See All</a>"
 	html += "</td></tr>"
 
 	html += "<tr><td style='vertical-align: top;'><b>Computer ID</b></td><td>"
-	html += "Last seen: [response["last_compID"]]<br>"
+	html += "Last seen: [playerStats.latest_connection.comp_id]<br>"
 	html += "<a href='?src=\ref[src];action=show_player_compids;ckey=[ckey];'>See All</a>"
 	html += "</td></tr>"
 
@@ -104,17 +101,16 @@
 		del(usr.client)
 		return
 
-	var/list/response
+	var/datum/apiModel/PlayerIpsResource/playerIps
 	try
-		response = apiHandler.queryAPI("playerInfo/getIPs", list("ckey" = ckey), forceResponse = 1)
-	catch ()
+		var/datum/apiRoute/players/ips/get/getPlayerIps = new
+		getPlayerIps.queryParams = list("ckey" = ckey)
+		playerIps = apiHandler.queryAPI(getPlayerIps)
+	catch
 		return alert("Failed to query API, try again later.")
 
-	if (length(response) < 1)
-		return alert("No data found.")
-
 	var/html = "<p><b>[capitalize(ckey)]</b> IP History</p>"
-	html += "<p><b>Last seen IP:</b> [response[1]["last_seen"]]</p>"
+	html += "<p><b>Last seen IP:</b> [playerIps.latest_connection.ip]</p>"
 
 	html += "<table>"
 	html += "<thead><tr>"
@@ -122,8 +118,8 @@
 	html += "<th style='text-align: left;'>Times connected</th>"
 	html += "</tr></thead>"
 
-	for (var/list/details in response)
-		html += "<tr><td>[details["ip"]]</td><td>[details["times"]]</td></tr>"
+	for (var/list/details in playerIps.ips)
+		html += "<tr><td>[details["ip"]]</td><td>[details["connected"]]</td></tr>"
 
 	html += "</table>"
 
@@ -142,17 +138,16 @@
 		del(usr.client)
 		return
 
-	var/list/response
+	var/datum/apiModel/PlayerCompIdsResource/playerCompIds
 	try
-		response = apiHandler.queryAPI("playerInfo/getCompIDs", list("ckey" = ckey), forceResponse = 1)
-	catch ()
+		var/datum/apiRoute/players/compids/get/getPlayerCompIds = new
+		getPlayerCompIds.queryParams = list("ckey" = ckey)
+		playerCompIds = apiHandler.queryAPI(getPlayerCompIds)
+	catch
 		return alert("Failed to query API, try again later.")
 
-	if (length(response) < 1)
-		return alert("No data found.")
-
 	var/html = "<p><b>[capitalize(ckey)]</b> Computer ID History</p>"
-	html += "<p><b>Last seen Computer ID:</b> [response[1]["last_seen"]]</p>"
+	html += "<p><b>Last seen Computer ID:</b> [playerCompIds.latest_connection.comp_id]</p>"
 
 	html += "<table>"
 	html += "<thead style='text-align: left;'><tr>"
@@ -160,8 +155,8 @@
 	html += "<th style='text-align: left;'>Times connected</th>"
 	html += "</tr></thead>"
 
-	for (var/list/details in response)
-		html += "<tr><td>[details["compID"]]</td><td>[details["times"]]</td></tr>"
+	for (var/list/details in playerCompIds.comp_ids)
+		html += "<tr><td>[details["comp_id"]]</td><td>[details["connected"]]</td></tr>"
 
 	html += "</table>"
 
diff --git a/code/modules/admin/playernotes.dm b/code/modules/admin/playernotes.dm
index eb826c4171870..470f02fe70757 100644
--- a/code/modules/admin/playernotes.dm
+++ b/code/modules/admin/playernotes.dm
@@ -1,5 +1,5 @@
-// Viewing a player's notes
-/datum/admins/proc/viewPlayerNotes(var/player)
+/// Viewing a player's notes
+/datum/admins/proc/viewPlayerNotes(player)
 	if (!player)
 		return
 
@@ -11,37 +11,25 @@
 		del(usr.client)
 		return
 
-	if (!config.player_notes_baseurl || !config.player_notes_auth)
-		alert("Missing configuration for player notes")
-		return
-
-	var/list/data = list(
-		"auth" = config.player_notes_auth,
-		"action" = "get",
-		"ckey" = player,
-		"format" = "json"
-	)
-
-	// Fetch notes via HTTP
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "[config.player_notes_baseurl]/?[list2params(data)]", "", "")
-	request.begin_async()
-	UNTIL(request.is_complete())
-	var/datum/http_response/response = request.into_response()
-
-	if (response.errored || !response.body)
-		logTheThing(LOG_DEBUG, null, "viewPlayerNotes: Failed to fetch notes of player: [player].")
+	var/datum/apiModel/Paginated/PlayerNoteResourceList/playerNotes
+	try
+		var/datum/apiRoute/players/notes/get/getPlayerNotes = new
+		getPlayerNotes.queryParams = list(
+			"filters" = list(
+				"ckey" = player
+			)
+		)
+		playerNotes = apiHandler.queryAPI(getPlayerNotes)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "viewPlayerNotes: Failed to fetch notes of player: [player] because: [error.message]")
 		alert("Failed to fetch notes for [player].")
 		return
 
-	var/content = response.body
-	// var/content = file2text('data/_TEST_.json')
-	var/all_notes = json_decode(content)
-
 	var/datum/player/pdatum = make_player(player)
-	pdatum.cloud_fetch()
+	pdatum.cloudSaves.fetch()
 	var/noticelink = ""
-	if (pdatum.cloud_available() && pdatum.cloud_get("login_notice"))
+	if (pdatum.cloudSaves.getData("login_notice"))
 		noticelink = {" style="color: red; font-weight: bold;">Login Notice Set"}
 	else
 		noticelink = {">Add Login Notice"}
@@ -67,39 +55,32 @@
 
 	dat += "<h1 style='text-align: center;'>Player Notes for <b>[player]</b></h1><center><a href='?src=\ref[src];action=notes2;target=[player];type=add'>Add Note</A> - <a href='?src=\ref[src];action=loginnotice;target=[player]'[noticelink]</a></center><br><br><table><tbody>"
 
-	if (all_notes["error"])
+	if (!length(playerNotes.data))
 		dat += "No notes. <i>Yet.</i>"
 
 	else
-
-		for (var/i in 1 to length(all_notes))
+		for (var/datum/apiModel/Tracked/PlayerNoteResource/playerNote in playerNotes.data)
 			var/list/row_classes = list()
+			var/noteReason = playerNote.note
 
-			// somehow newlines in notes are 0D 0D 0A
-			// i don't know how the fuck this happened
-			// but what the FUCK, byond
-			all_notes[i]["note"] = replacetext(all_notes[i]["note"], "\x0D", "")
-
-			// screaming
-			if (all_notes[i]["akey"] == "Auto Banner" || all_notes[i]["akey"] == "VPN Blocker" || all_notes[i]["akey"] == "(AUTO)")
+			if (playerNote.game_admin.ckey == "bot")
 				row_classes += "auto"
 
 			var/regex/R = new("Banned from (.+?) by (.+?), reason: (.+), duration: (.+)", "m")
-			if (R.Find(all_notes[i]["note"]))
+			if (R.Find(noteReason))
 				row_classes += "ban"
-				all_notes[i]["note"] = R.Replace(all_notes[i]["note"], "<b>BANNED</b> from <b>$1</b> by <b>$2</b> &mdash; $4<br><blockquote>$3</blockquote>")
-
+				noteReason = R.Replace(noteReason, "<b>BANNED</b> from <b>$1</b> by <b>$2</b> &mdash; $4<br><blockquote>$3</blockquote>")
 
 			var/classes = row_classes.Join(" ")
 			dat += {"
 			<tr class="[classes]">
-				<th>[all_notes[i]["server"]]</th>
-				<th>[all_notes[i]["created"]]</th>
-				<th style='width: 0; white-space: pre;'>#[all_notes[i]["id"]] <a href="?src=\ref[src];action=notes2;target=[player];type=del;id=[all_notes[i]["id"]]" style="background: red; color: white; display: inline-block; text-align: center; padding: 0.1em 0.25em; border-radius: 4px; text-decoration: none;">&times;</a></th>
+				<th>[playerNote.server_id]</th>
+				<th>[playerNote.created_at]</th>
+				<th style='width: 0; white-space: pre;'>#[playerNote.id] <a href="?src=\ref[src];action=notes2;target=[player];type=del;id=[playerNote.id]" style="background: red; color: white; display: inline-block; text-align: center; padding: 0.1em 0.25em; border-radius: 4px; text-decoration: none;">&times;</a></th>
 			</tr>
 			<tr class="[classes]" style="margin-bottom: 1em;">
-				<th>[all_notes[i]["akey"]]</th>
-				<td colspan="2" style="white-space: pre-wrap;">[all_notes[i]["note"]]</td>
+				<th>[playerNote.game_admin.ckey]</th>
+				<td colspan="2" style="white-space: pre-wrap;">[noteReason]</td>
 			</tr>
 			<tr class='empty'><td colspan='3'></td></tr>
 			"}
@@ -109,47 +90,35 @@
 	usr.Browse(dat.Join(""), "window=notesp;size=875x600;title=Notes for [player]")
 
 
-// Adding a player note
+/// Adding a player note
 /proc/addPlayerNote(player, admin, note)
 	if (!player || !admin || !note)
 		return
 
-	if (!config.player_notes_baseurl || !config.player_notes_auth)
-		alert("Missing configuration for player notes")
-		return
-
-	var/list/data = list(
-		"auth" = config.player_notes_auth,
-		"action" = "add",
-		"server" = serverKey,
-		"server_id" = config.server_id,
-		"ckey" = player,
-		"akey" = admin,
-		"note" = note
-	)
-
-	// Send data
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "[config.player_notes_baseurl]/?[list2params(data)]", "", "")
-	request.begin_async()
-
-
-// Deleting a player note
+	try
+		var/datum/apiRoute/players/notes/post/addPlayerNote = new
+		addPlayerNote.buildBody(
+			admin,
+			roundId,
+			config.server_id,
+			player,
+			note
+		)
+		apiHandler.queryAPI(addPlayerNote)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "addPlayerNote: Failed to add note to player: [player] because: [error.message].")
+
+
+/// Deleting a player note
 /proc/deletePlayerNote(id)
 	if (!id)
 		return
 
-	if (!config.player_notes_baseurl || !config.player_notes_auth)
-		alert("Missing configuration for player notes")
-		return
-
-	var/list/data = list(
-		"auth" = config.player_notes_auth,
-		"action" = "delete",
-		"id" = id
-	)
-
-	// Send data
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "[config.player_notes_baseurl]/?[list2params(data)]", "", "")
-	request.begin_async()
+	try
+		var/datum/apiRoute/players/notes/delete/deletePlayerNote = new
+		deletePlayerNote.routeParams = list("[id]")
+		apiHandler.queryAPI(deletePlayerNote)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		logTheThing(LOG_DEBUG, null, "deletePlayerNote: Failed to delete note #[id] because: [error.message].")
diff --git a/code/modules/admin/randomverbs.dm b/code/modules/admin/randomverbs.dm
index 86931755aaf82..bb5a7aa2598ae 100644
--- a/code/modules/admin/randomverbs.dm
+++ b/code/modules/admin/randomverbs.dm
@@ -2545,38 +2545,20 @@ var/global/night_mode_enabled = 0
 		boutput(usr, SPAN_ALERT("Transfer aborted."))
 		return
 	old_key = ckey(old_key)
-
 	var/new_key = ckey(input("Enter new account key", "New account key", null) as null|text)
 	if (!new_key)
 		boutput(usr, SPAN_ALERT("Transfer aborted."))
 		return
 
-	//criminal activity
-	var/datum/player/dummy_player = new
-	dummy_player.clouddata = list() // trick it into thinking we have cloud data I guess. only gets nullchecked
-	dummy_player.cloudsaves = list() // ditto
-	var/datum/preferences/dummy_preferences = new
-	var/list/save_names = dummy_player.cloud_fetch_target_saves_only(old_key) // technically a map from names to nums
-
-	if (!save_names)
-		boutput(usr, SPAN_ALERT("Couldn't find cloud data for that key."))
-		return
-	if (!length(save_names))
-		boutput(usr, SPAN_ALERT("Couldn't find any cloud saves for that key."))
-		return
-	if (tgui_alert(usr, "You're about to transfer [length(save_names)] saves from [old_key] to [new_key]. This will overwrite all the existing saves on the target account. Do it?", "Cloud Save Transfer", list("Yes", "No")) == "No")
+	if (tgui_alert(usr, "You're about to transfer all saves from [old_key] to [new_key]. This will overwrite all the existing saves on the target account. Do it?", "Cloud Save Transfer", list("Yes", "No")) == "No")
 		boutput(usr, SPAN_ALERT("Transfer aborted."))
 		return
 
-	for (var/name in save_names)
-		dummy_preferences.cloudsave_load(null, name, old_key)
-		var/ret = dummy_preferences.cloudsave_save(null, name, new_key)
-		if (ret != 1) //yes this is intentional
-			boutput(usr, SPAN_ALERT("Something went wrong while saving to the cloud. Return value was: ([ret]). Transfer aborted."))
-			return
-
-	dummy_player.cloud_put_target(new_key, "saves", save_names)
-	boutput(usr, SPAN_SUCCESS("Cloud saves transferred."))
+	try
+		cloud_saves_transfer(old_key, new_key)
+		boutput(usr, SPAN_SUCCESS("Cloud saves transferred."))
+	catch (var/exception/e)
+		boutput(usr, SPAN_ALERT("Transfer aborted because: [e.name]"))
 
 /client/proc/cmd_admin_disable()
 	set name = "Disable Admin Powers"
@@ -2968,3 +2950,90 @@ var/global/force_radio_maptext = FALSE
 				return
 	else
 		boutput(src, "You must be at least an Administrator to use this command.")
+/client/proc/toggle_all_artifacts()
+	// Housekeeping
+	SET_ADMIN_CAT(ADMIN_CAT_FUN)
+	set name = "Toggle All Artifacts"
+	if (holder && src.holder.level >= LEVEL_ADMIN)
+		switch(alert("What would you like to do?",,"Activate All","Deactivate All","Cancel"))
+			if("Cancel")
+				return
+			if("Activate All")
+				// You definitely can activate an artnuke like this maybe be sure we're sure
+				var/response = input(src, "Extremely stupid button pressing shenanagains detected - Type YES to continue", "Caution!") as null|text
+				if (response != "YES")
+					message_admins("[key_name(usr)] aborted toggling every dang artifact due to failing to type 'YES'") // im telling on u!!!
+					return
+				logTheThing(LOG_ADMIN, src, "started activating all available artifacts.")
+				message_admins("[key_name(usr)] started activating all available artifacts.")
+				for(var/artifact as anything in by_cat[TR_CAT_ARTIFACTS])
+					var/obj/holder = artifact
+					holder.ArtifactActivated()
+			if("Deactivate All")
+				// No confirmation for this since you cant really activate an artnuke like this
+				logTheThing(LOG_ADMIN, src, "started deactivating all available artifacts.")
+				message_admins("[key_name(usr)] started deactivating all available artifacts.")
+				for(var/artifact as anything in by_cat[TR_CAT_ARTIFACTS])
+					var/obj/holder = artifact
+					holder.ArtifactDeactivated()
+	else
+		boutput(src, "You must be at least an Administrator to use this command.")
+
+#define ARTIFACT_BULK_LIMIT 100
+#define ARTIFACT_HARD_LIMIT 2000
+#define ARTIFACT_MAX_SPAWN_ATTEMPTS 100
+
+/client/proc/spawn_tons_of_artifacts()
+	SET_ADMIN_CAT(ADMIN_CAT_FUN)
+	set name = "Bulk Spawn Artifacts"
+
+	var/artifacts_spawned = 0
+	var/spawn_fails = 0
+	var/artifact_spawn_attempts
+
+	if (holder && src.holder.level >= LEVEL_ADMIN)
+		switch(alert("THIS COULD SERIOUSLY FUCK THINGS UP. That being said, do it anyway?","WOAH THERE BUCKAROO","Yes","No"))
+			if("No")
+				return
+			if("Yes")
+				var/amt_artifacts = min(input(usr,"How many artifacts do we want to spawn?\n(Default: 50)",,50) as num, ARTIFACT_HARD_LIMIT)
+				if (amt_artifacts > ARTIFACT_BULK_LIMIT)
+					var/response = input(src, "High number of types: [length(amt_artifacts)] - Type YES to continue", "Caution!") as null|text
+					if (response != "YES")
+						message_admins("[key_name(usr)] aborted spawning [amt_artifacts] due to failing to type 'YES'") // im telling on u!!!
+						return
+				var/floors_only = (alert(src, "Only spawn artifacts on floors?",, "Yes", "No") == "Yes")
+				logTheThing(LOG_ADMIN, src, "started spawning [amt_artifacts] artifacts.")
+				message_admins("[key_name(usr)] started spawning [amt_artifacts] artifacts.")
+
+				while (artifacts_spawned < amt_artifacts)
+					var/turf/T = locate(rand(1, world.maxx), rand(1, world.maxy), Z_LEVEL_STATION)
+
+					if (floors_only)
+						while (artifact_spawn_attempts < ARTIFACT_MAX_SPAWN_ATTEMPTS)
+							if (istype(T, /turf/simulated/floor) && checkTurfPassable(T))
+								break
+							artifact_spawn_attempts += 1
+							T = locate(rand(1, world.maxx), rand(1, world.maxy), Z_LEVEL_STATION)
+						if (artifact_spawn_attempts >= ARTIFACT_MAX_SPAWN_ATTEMPTS)
+							spawn_fails += 1
+						else
+							Artifact_Spawn(T)
+						artifact_spawn_attempts = 0
+					else
+						Artifact_Spawn(T)
+					artifacts_spawned += 1
+					if (artifacts_spawned % ARTIFACT_BULK_LIMIT == 0)
+						sleep(1 SECOND)
+
+				logTheThing(LOG_ADMIN, src, "finished spawning [amt_artifacts] artifacts.")
+				message_admins("[key_name(usr)] finished spawning [amt_artifacts] artifacts.")
+				if (spawn_fails > 0)
+					logTheThing(LOG_ADMIN, src, "[spawn_fails] artifact\s failed to spawn")
+					message_admins("[spawn_fails] artifact\s failed to spawn")
+	else
+		boutput(src, "You must be at least an Administrator to use this command.")
+
+#undef ARTIFACT_BULK_LIMIT
+#undef ARTIFACT_HARD_LIMIT
+#undef ARTIFACT_MAX_SPAWN_ATTEMPTS
diff --git a/code/modules/admin/spacebee_extension/commands.dm b/code/modules/admin/spacebee_extension/commands.dm
index bf9fc6ec26ca0..842fc18bff609 100644
--- a/code/modules/admin/spacebee_extension/commands.dm
+++ b/code/modules/admin/spacebee_extension/commands.dm
@@ -38,7 +38,7 @@
 	help_message = "Adds a note to a given ckey."
 	argument_types = list(/datum/command_argument/string/ckey="ckey", /datum/command_argument/the_rest="note")
 	execute(user, ckey, note)
-		addPlayerNote(ckey, user + " (Discord)", note)
+		addPlayerNote(ckey, user, note)
 
 		logTheThing(LOG_ADMIN, "[user] (Discord)", null, "added a note for [ckey]: [note]")
 		logTheThing(LOG_DIARY, "[user] (Discord)", null, "added a note for [ckey]: [note]", "admin")
@@ -57,16 +57,16 @@
 
 	execute(user, ckey, notice)
 		var/datum/player/player = make_player(ckey)
-		player.cloud_fetch()
-		if (player.cloud_get("login_notice"))
+		player.cloudSaves.fetch()
+		if (player.cloudSaves.getData("login_notice"))
 			system.reply("Error, [ckey] already has a login notice set.", user)
 			return
 		var/message = "Message from Admin [user] at [roundLog_date]:\n\n[notice]"
-		if (!player.cloud_put("login_notice", message))
+		if (!player.cloudSaves.putData("login_notice", message))
 			system.reply("Error, issue saving login notice, try again later.", user)
 			return
 		// else it succeeded
-		addPlayerNote(ckey, user + " (Discord)", "New login notice set:\n\n[notice]")
+		addPlayerNote(ckey, user, "New login notice set:\n\n[notice]")
 		logTheThing(LOG_ADMIN, "[user] (Discord)", null, "added a login notice for [ckey]: [notice]")
 		logTheThing(LOG_DIARY, "[user] (Discord)", null, "added a login notice for [ckey]: [notice]", "admin")
 		message_admins(SPAN_INTERNAL("[user] (Discord) added a login notice for [ckey]: [notice]"))
@@ -92,17 +92,17 @@
 			data["compID"] = M.computer_id
 			data["ip"] = M.lastKnownIP
 		else
-			var/list/response
+			var/datum/apiModel/Tracked/PlayerStatsResource/playerStats
 			try
-				response = apiHandler.queryAPI("playerInfo/get", list("ckey" = data["ckey"]), forceResponse = 1)
-			catch ()
-				var/ircmsg[] = new()
-				ircmsg["name"] = user
-				ircmsg["msg"] = "Failed to query API, try again later."
-				ircbot.export("admin", ircmsg)
-				return
-			data["ip"] = response["last_ip"]
-			data["compID"] = response["last_compID"]
+				var/datum/apiRoute/players/stats/get/getPlayerStats = new
+				getPlayerStats.queryParams = list("ckey" = data["ckey"])
+				playerStats = apiHandler.queryAPI(getPlayerStats)
+				data["ip"] = playerStats.latest_connection.ip
+				data["compID"] = playerStats.latest_connection.comp_id
+			catch
+				data["ip"] = null
+				data["compID"] = null
+
 		data["text_ban_length"] = length
 		data["reason"] = reason
 		if (length == "hour")
@@ -130,12 +130,15 @@
 			return
 		data["mins"] = length
 		data["akey"] = ckey(user) + " (Discord)"
-		addBan(data) // logging, messaging, and noting are all taken care of by this proc
-
-		var/ircmsg[] = new()
-		ircmsg["name"] = user
-		ircmsg["msg"] = "Banned [ckey] from all servers for [length] minutes, reason: [reason]"
-		ircbot.export("admin", ircmsg)
+		bansHandler.add(
+			ckey(user),
+			null,
+			data["ckey"],
+			data["compID"],
+			data["ip"],
+			data["reason"],
+			data["mins"] * 60 * 10
+		)
 
 /datum/spacebee_extension_command/serverban
 	name = "serverban"
@@ -154,17 +157,20 @@
 			data["compID"] = M.computer_id
 			data["ip"] = M.lastKnownIP
 		else
-			var/list/response
+			var/datum/apiModel/Tracked/PlayerStatsResource/playerStats
 			try
-				response = apiHandler.queryAPI("playerInfo/get", list("ckey" = data["ckey"]), forceResponse = 1)
-			catch ()
+				var/datum/apiRoute/players/stats/get/getPlayerStats = new
+				getPlayerStats.queryParams = list("ckey" = data["ckey"])
+				playerStats = apiHandler.queryAPI(getPlayerStats)
+			catch
 				var/ircmsg[] = new()
 				ircmsg["name"] = user
 				ircmsg["msg"] = "Failed to query API, try again later."
 				ircbot.export("admin", ircmsg)
 				return
-			data["ip"] = response["last_ip"]
-			data["compID"] = response["last_compID"]
+
+			data["ip"] = playerStats.latest_connection.ip
+			data["compID"] = playerStats.latest_connection.comp_id
 		if(server == "main1" || server == "1" || server == "goon1")
 			server = "main1"
 		else if(server == "main2" || server == "2" || server == "goon2")
@@ -204,12 +210,15 @@
 			return
 		data["mins"] = length
 		data["akey"] = ckey(user) + " (Discord)"
-		addBan(data) // logging, messaging, and noting are all taken care of by this proc
-
-		var/ircmsg[] = new()
-		ircmsg["name"] = user
-		ircmsg["msg"] = "Banned [ckey] from [server] for [length] minutes, reason: [reason]"
-		ircbot.export("admin", ircmsg)
+		bansHandler.add(
+			ckey(user),
+			data["server"],
+			data["ckey"],
+			data["compID"],
+			data["ip"],
+			data["reason"],
+			data["mins"] * 60 * 10
+		)
 
 /datum/spacebee_extension_command/boot
 	name = "boot"
@@ -630,14 +639,18 @@
 
 	execute(user, ckey)
 		try
-			apiHandler.queryAPI("vpncheck-whitelist/add", list("ckey" = ckey, "akey" = user + " (Discord)"))
-		catch(var/exception/e)
-			system.reply("Error while adding ckey [ckey] to the VPN whitelist: [e.name]")
+			var/datum/apiRoute/vpnwhitelist/add/addWhitelist = new
+			addWhitelist.buildBody(user, ckey)
+			apiHandler.queryAPI(addWhitelist)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			system.reply("Error while adding ckey [ckey] to the VPN whitelist: [error.message]")
 			return FALSE
+
 		global.vpn_ip_checks?.Cut() // to allow them to reconnect this round
 		message_admins("Ckey [ckey] added to the VPN whitelist by [user] (Discord).")
 		logTheThing(LOG_ADMIN, "[user] (Discord)", null, "Ckey [ckey] added to the VPN whitelist.")
-		addPlayerNote(ckey, user + " (Discord)", "Ckey [ckey] added to the VPN whitelist.")
+		addPlayerNote(ckey, user, "Ckey [ckey] added to the VPN whitelist.")
 		system.reply("[ckey] added to the VPN whitelist.")
 		return TRUE
 
@@ -648,23 +661,18 @@
 	server_targeting = COMMAND_TARGETING_MAIN_SERVER
 
 	execute(user, ckey)
-		var/list/response
 		try
-			response = apiHandler.queryAPI("vpncheck-whitelist/search", list("ckey" = ckey), forceResponse = 1)
-		catch(var/exception/e)
-			system.reply("Error, while checking vpn whitelist status of ckey [ckey] encountered the following error: [e.name]")
-			return
-		if (!islist(response))
-			system.reply("Failed to query vpn whitelist, did not receive response from API.")
-		if (response["error"])
-			system.reply("Failed to query vpn whitelist, error: [response["error"]]")
-		else if ((response["success"]))
-			if (response["whitelisted"])
-				system.reply("ckey [ckey] is VPN whitelisted. Whitelisted by [response["akey"] ? response["akey"] : "unknown admin"]")
+			var/datum/apiRoute/vpnwhitelist/search/searchWhitelist = new
+			searchWhitelist.queryParams = list("ckey" = ckey)
+			var/datum/apiModel/VpnWhitelistSearch/searchResults = apiHandler.queryAPI(searchWhitelist)
+			if (searchResults.whitelisted)
+				system.reply("ckey [ckey] is VPN whitelisted.")
 			else
 				system.reply("ckey [ckey] is not VPN whitelisted.")
-		else
-			system.reply("Failed to query vpn whitelist, received invalid response from API.")
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			system.reply("Failed to query vpn whitelist, error: [error.message]")
+			return FALSE
 
 /datum/spacebee_extension_command/hard_reboot
 	name = "hardreboot"
diff --git a/code/modules/admin/terrainify.dm b/code/modules/admin/terrainify.dm
index bfb92d87bcdd7..36a24f1076b04 100644
--- a/code/modules/admin/terrainify.dm
+++ b/code/modules/admin/terrainify.dm
@@ -144,10 +144,16 @@ ABSTRACT_TYPE(/datum/terrainify)
 /datum/terrainify
 	var/name
 	var/desc
-	var/additional_options
-	var/additional_toggles
+	var/additional_options = list()
+	var/additional_toggles = list()
 	var/static/datum/terrainify/terrainify_lock
 	var/allow_underwater = FALSE
+	var/syndi_camo_color = null
+
+	New()
+		..()
+		if(length(syndi_camo_color))
+			additional_toggles["Syndi Camo"] = FALSE
 
 	proc/special_repair(list/turf/TS)
 		return FALSE
@@ -181,6 +187,13 @@ ABSTRACT_TYPE(/datum/terrainify)
 
 			station_repair.allows_vehicles = (params["vehicle"] & TERRAINIFY_ALLOW_VEHCILES) == TERRAINIFY_ALLOW_VEHCILES
 
+			if(params["Syndi Camo"] && length(syndi_camo_color))
+				nuke_op_camo_matrix = syndi_camo_color
+
+				var/color_matrix = color_mapping_matrix(nuke_op_color_matrix, nuke_op_camo_matrix)
+				for (var/atom/A as anything in by_cat[TR_CAT_NUKE_OP_STYLE])
+					A.color = color_matrix
+
 			message_admins("[key_name(ui.user)] started Terrainify: [name].")
 			terrainify_lock = src
 			tgui_process.close_uis(ui.src_object)
@@ -196,7 +209,7 @@ ABSTRACT_TYPE(/datum/terrainify)
 
 	proc/handle_mining(params, list/turfs)
 		var/mining = params["Mining"]
-		mining = (mining == "No") ? null : mining
+		mining = (mining == "None") ? null : mining
 		if(mining)
 			var/list/turf/valid_spots = list()
 			for(var/turf/simulated/wall/auto/asteroid/AST in turfs)
@@ -230,7 +243,7 @@ ABSTRACT_TYPE(/datum/terrainify)
 	proc/place_prefabs(prefabs_to_place, flags)
 		var/failsafe = 800
 		for (var/n = 1, n <= prefabs_to_place && failsafe-- > 0)
-			var/datum/mapPrefab/planet/P = pick_map_prefab(/datum/mapPrefab/planet)
+			var/datum/mapPrefab/planet/P = pick_map_prefab(/datum/mapPrefab/planet, wanted_tags_any=PREFAB_PLANET)
 			if (P)
 				var/maxX = (world.maxx - AST_MAPBORDER)
 				var/maxY = (world.maxy - AST_MAPBORDER)
@@ -271,7 +284,11 @@ ABSTRACT_TYPE(/datum/terrainify)
 	name = "Desert Station"
 	desc = "Turn space into into a nice desert full of sand and stones."
 	additional_options = list("Mining"=list("None","Normal","Rich"))
-	additional_toggles = list("Ambient Light Obj"=TRUE)
+	additional_toggles = list("Ambient Light Obj"=TRUE, "Prefabs"=FALSE)
+
+	New()
+		syndi_camo_color = list(nuke_op_color_matrix[1], "#efc998", nuke_op_color_matrix[3])
+		..()
 
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
@@ -307,6 +324,10 @@ ABSTRACT_TYPE(/datum/terrainify)
 	name = "Void Station"
 	desc = "Turn space into the unknowable void? Space if filled with the void, inhibited by those departed, and chunks of scaffolding."
 
+	New()
+		syndi_camo_color = list(nuke_op_color_matrix[1], "#a223d2", nuke_op_color_matrix[3])
+		..()
+
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
 			generate_void()
@@ -413,13 +434,60 @@ ABSTRACT_TYPE(/datum/terrainify)
 			logTheThing(LOG_DIARY, ui.user, "turned space into an another outpost on Theta.", "admin")
 			message_admins("[key_name(ui.user)] turned space into an another outpost on Theta.")
 
+/datum/terrainify/lava_moon
+	name = "Lava Moon Station"
+	desc = "Turns space into... CO2 + Lava."
+	additional_options = list("Mining"=list("None","Normal","Rich"), "Lava"=list("Normal","Extra","Less"))
+
+	convert_station_level(params, datum/tgui/ui)
+		if(..())
+			station_repair.default_air.carbon_dioxide = 20
+			station_repair.default_air.nitrogen = 0
+			station_repair.default_air.oxygen = 0
+			station_repair.default_air.temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST-1
+
+			station_repair.station_generator = new/datum/map_generator/lavamoon_generator
+			var/datum/map_generator/lavamoon_generator/LG = station_repair.station_generator
+			switch(params["Lava"])
+				if("Extra")
+					LG.lava_percent = 45
+				if("Less")
+					LG.lava_percent = 25
+
+			var/list/turf/traveling_crate_turfs = station_repair.get_mass_driver_turfs()
+			var/list/turf/shipping_path = shippingmarket.get_path_to_market()
+			traveling_crate_turfs |= shipping_path
+			for(var/turf/space/T in traveling_crate_turfs)
+				T.ReplaceWith(/turf/unsimulated/floor/auto/iomoon)
+
+			station_repair.land_vehicle_fixup(params["vehicle"] & TERRAINIFY_VEHICLE_CARS, params["vehicle"] & TERRAINIFY_VEHICLE_FABS)
+
+			var/list/space = list()
+			for(var/turf/space/S in block(locate(1, 1, Z_LEVEL_STATION), locate(world.maxx, world.maxy, Z_LEVEL_STATION)))
+				space += S
+			convert_turfs(space)
+
+			REMOVE_ALL_PARALLAX_RENDER_SOURCES_FROM_GROUP(Z_LEVEL_STATION)
+			var/list/parallax_layers = list(/atom/movable/screen/parallax_render_source/foreground/embers)
+			ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, parallax_layers, 0 SECONDS)
+
+			handle_mining(params, space)
+
+			logTheThing(LOG_ADMIN, ui.user, "turned space into an another outpost on Io.")
+			logTheThing(LOG_DIARY, ui.user, "turned space into an another outpost on Io.", "admin")
+			message_admins("[key_name(ui.user)] turned space into an another outpost on Io.")
+
 
 /datum/terrainify/swampify
 	name = "Swamp Station"
 	desc = "Turns space into a swamp"
-	additional_options = list("Rain"=list("Yes","No", "Particles"), "Mining"=list("None","Normal","Rich"))
+	additional_options = list("Rain"=list("No", "Yes", "Particles"), "Mining"=list("None","Normal","Rich"))
 	additional_toggles = list("Ambient Light Obj"=TRUE, "Prefabs"=FALSE)
 
+	New()
+		syndi_camo_color = list(nuke_op_color_matrix[1], "#6f7026", nuke_op_color_matrix[3])
+		..()
+
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
 			var/const/ambient_light = "#222222"
@@ -476,14 +544,25 @@ ABSTRACT_TYPE(/datum/terrainify)
 	name = "Mars Station"
 	desc = "Turns space into Mars.  A sprawl of stand, stone, and an unyielding wind."
 	additional_options = list("Mining"=list("None","Normal","Rich"))
+	additional_toggles = list("Ambient Light Obj"=FALSE, "Duststorm"=TRUE, "Prefabs"=FALSE)
 
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
 			var/ambient_value
-			station_repair.station_generator = new/datum/map_generator/mars_generator
+
+			if(params["Duststorm"])
+				station_repair.station_generator = new/datum/map_generator/mars_generator/duststorm
+				station_repair.weather_img = image(icon = 'icons/turf/areas.dmi', icon_state = "dustverlay", layer = EFFECTS_LAYER_BASE)
+			else
+				station_repair.station_generator = new/datum/map_generator/mars_generator
 			station_repair.overlay_delay = 3.5 SECONDS // Delay to let rocks cull
-			station_repair.weather_img = image(icon = 'icons/turf/areas.dmi', icon_state = "dustverlay", layer = EFFECTS_LAYER_BASE)
-			station_repair.ambient_light = new /image/ambient
+
+			if(params["Ambient Light Obj"])
+				station_repair.ambient_obj = station_repair.ambient_obj || new /obj/ambient
+				var/const/ambient_light = "#222222"
+				station_repair.ambient_obj.color = ambient_light
+			else
+				station_repair.ambient_light = new /image/ambient
 
 			station_repair.default_air.carbon_dioxide = 500
 			station_repair.default_air.nitrogen = 0
@@ -495,11 +574,16 @@ ABSTRACT_TYPE(/datum/terrainify)
 				space += S
 			convert_turfs(space)
 			sleep(3 SECONDS) // Let turfs initialize and re-orient before applying overlays
+
 			for (var/turf/S in space)
 				S.UpdateOverlays(station_repair.weather_img, "weather")
-				ambient_value = lerp(20,80,S.x/300)
-				station_repair.ambient_light.color = rgb(ambient_value+((rand()*3)),ambient_value,ambient_value) //randomly shift red to reduce vertical banding
-				S.UpdateOverlays(station_repair.ambient_light, "ambient")
+
+				if(params["Ambient Light Obj"])
+					S.vis_contents |= station_repair.ambient_obj
+				else
+					ambient_value = lerp(20,80,S.x/300)
+					station_repair.ambient_light.color = rgb(ambient_value+((rand()*3)),ambient_value,ambient_value) //randomly shift red to reduce vertical banding
+					S.UpdateOverlays(station_repair.ambient_light, "ambient")
 
 			for(var/turf/S in get_area_turfs(/area/mining/magnet))
 				if(S.z != Z_LEVEL_STATION) continue
@@ -609,6 +693,10 @@ ABSTRACT_TYPE(/datum/terrainify)
 	additional_options = list("Weather"=list("Snow", "Light Snow", "None"), "Mining"=list("None","Normal","Rich"))
 	additional_toggles = list("Ambient Light Obj"=TRUE, "Prefabs"=FALSE)
 
+	New()
+		syndi_camo_color = list("#50587a", "#bbdbdd", nuke_op_color_matrix[3])
+		..()
+
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
 			var/const/ambient_light = "#222"
@@ -656,29 +744,21 @@ ABSTRACT_TYPE(/datum/terrainify)
 	name = "Forest Station"
 	desc = "Turns space into a lush and wooden place"
 	additional_options = list("Mining"=list("None","Normal","Rich"))
-	additional_toggles = list("Ambient Light Obj"=TRUE, "Prefabs"=FALSE)
+	additional_toggles = list("Ambient Light Obj"=TRUE, "Prefabs"=FALSE, "Spooky"=FALSE)
 
-#ifdef HALLOWEEN
 	New()
+		syndi_camo_color = list(nuke_op_color_matrix[1], "#3d8f29", nuke_op_color_matrix[3])
 		..()
-		additional_toggles["Spooky"] = FALSE
-#endif
 
 	convert_station_level(params, datum/tgui/ui)
 		if(..())
 			var/const/ambient_light = "#211"
 
-
 			if(params["Spooky"])
-#ifdef HALLOWEEN
 				station_repair.station_generator = new/datum/map_generator/forest_generator/dark
-#else
-				;
-#endif
 			else
 				station_repair.station_generator = new/datum/map_generator/forest_generator
 
-
 			if(params["Ambient Light Obj"])
 				station_repair.ambient_obj = station_repair.ambient_obj || new /obj/ambient
 				station_repair.ambient_obj.color = ambient_light
diff --git a/code/modules/antagonists/__generic_antagonist.dm b/code/modules/antagonists/__generic_antagonist.dm
index dc8f1f03e011a..69f756799ee79 100644
--- a/code/modules/antagonists/__generic_antagonist.dm
+++ b/code/modules/antagonists/__generic_antagonist.dm
@@ -1,5 +1,6 @@
 /datum/antagonist/generic
 	succinct_end_of_round_antagonist_entry = TRUE
+	display_name = "generic antagonist"
 	var/grouped_name
 
 	New(datum/mind/new_owner, do_equip, do_objectives, do_relocate, silent, source, do_pseudo, do_vr, late_setup, id, display_name)
diff --git a/code/modules/antagonists/nuclear_operative/nuclear_operative.dm b/code/modules/antagonists/nuclear_operative/nuclear_operative.dm
index 4d012b67b3dc0..0e9c4294d5990 100644
--- a/code/modules/antagonists/nuclear_operative/nuclear_operative.dm
+++ b/code/modules/antagonists/nuclear_operative/nuclear_operative.dm
@@ -100,23 +100,16 @@
 		. = ..()
 
 	proc/assign_name()
-		if (ticker?.mode && istype(ticker.mode, /datum/game_mode/nuclear))
-			if (src.id == ROLE_NUKEOP_COMMANDER)
-				src.owner.current.real_name = "[syndicate_name()] [src.commander_title]"
-			else
-				var/callsign = pick(src.available_callsigns)
-				src.available_callsigns -= callsign
-				src.owner.current.real_name = "[syndicate_name()] Operative [callsign]"
-
-				// Assign a headset icon to the Operative matching the first letter of their callsign.
-				var/obj/item/device/radio/headset/syndicate/headset = src.owner.current.ears
-				headset.icon_override = "syndie_letters/[copytext(callsign, 1, 2)]"
-
+		if (src.id == ROLE_NUKEOP_COMMANDER)
+			src.owner.current.real_name = "[syndicate_name()] [src.commander_title]"
 		else
-			if (src.id == ROLE_NUKEOP_COMMANDER)
-				src.owner.current.real_name = "Syndicate Commander [src.owner.current.real_name]"
-			else
-				src.owner.current.real_name = "Syndicate Operative [src.owner.current.real_name]"
+			var/callsign = pick(src.available_callsigns)
+			src.available_callsigns -= callsign
+			src.owner.current.real_name = "[syndicate_name()] Operative [callsign]"
+
+			// Assign a headset icon to the Operative matching the first letter of their callsign.
+			var/obj/item/device/radio/headset/syndicate/headset = src.owner.current.ears
+			headset.icon_override = "syndie_letters/[copytext(callsign, 1, 2)]"
 
 /datum/antagonist/nuclear_operative/commander
 	id = ROLE_NUKEOP_COMMANDER
diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm
index b4038594df3c7..e4d1fb6602027 100644
--- a/code/modules/antagonists/pirate/pirate.dm
+++ b/code/modules/antagonists/pirate/pirate.dm
@@ -24,12 +24,14 @@
 			H.equip_if_possible(new /obj/item/clothing/head/pirate_captain(H), SLOT_HEAD)
 			H.equip_if_possible(new /obj/item/clothing/shoes/swat/heavy(H), SLOT_SHOES)
 			H.equip_if_possible(new /obj/item/device/radio/headset/pirate/captain(H), SLOT_EARS)
+			H.equip_if_possible(new /obj/item/card/id/pirate/captain, SLOT_WEAR_ID)
 
 		else if (id == ROLE_PIRATE_FIRST_MATE)
 			H.equip_if_possible(new /obj/item/clothing/under/gimmick/guybrush(H), SLOT_W_UNIFORM)
 			H.equip_if_possible(new /obj/item/clothing/suit/armor/pirate_first_mate_coat(H), SLOT_WEAR_SUIT)
 			H.equip_if_possible(new /obj/item/clothing/head/pirate_first_mate(H), SLOT_HEAD)
 			H.equip_if_possible(new /obj/item/device/radio/headset/pirate/first_mate(H), SLOT_EARS)
+			H.equip_if_possible(new /obj/item/card/id/pirate/first_mate, SLOT_WEAR_ID)
 
 		else if (id == ROLE_PIRATE)
 			// Random clothing:
@@ -45,6 +47,7 @@
 			H.equip_if_possible(new jumpsuit, SLOT_W_UNIFORM)
 			H.equip_if_possible(new hat, SLOT_HEAD)
 			H.equip_if_possible(new /obj/item/device/radio/headset/pirate(H), SLOT_EARS)
+			H.equip_if_possible(new /obj/item/card/id/pirate, SLOT_WEAR_ID)
 
 		H.equip_if_possible(new /obj/item/storage/backpack(H), SLOT_BACK)
 		H.equip_if_possible(new /obj/item/clothing/shoes/swat(H), SLOT_SHOES)
@@ -54,10 +57,12 @@
 		H.equip_if_possible(new /obj/item/requisition_token/pirate(H), SLOT_R_STORE)
 		H.equip_if_possible(new /obj/item/tank/emergency_oxygen/extended(H), SLOT_L_STORE)
 		H.equip_if_possible(new /obj/item/swords_sheaths/pirate(H), SLOT_BELT)
+		H.equip_if_possible(new /obj/item/pirate_hand_tele(H), SLOT_R_HAND)
 
 		H.equip_sensory_items()
 
 		H.traitHolder.addTrait("training_drinker")
+		H.addBioEffect("accent_pirate")
 
 	add_to_image_groups()
 		. = ..()
@@ -151,3 +156,151 @@ TYPEINFO(/obj/gold_bee)
 					I.set_loc(get_turf(src))
 					ThrowRandom(I, 3, 1)
 			qdel(src)
+
+/obj/landmark/pirate_tele
+	name = LANDMARK_PIRATES_TELE
+
+/obj/machinery/r_door_control/podbay/pirate
+	id = "peregrine_podbay"
+	access_type = POD_ACCESS_PIRATE
+
+	new_walls
+		north
+			pixel_y = 24
+		east
+			pixel_x = 22
+		south
+			pixel_y = -19
+		west
+			pixel_x = -22
+
+/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose/pirate_podbay
+	name = "Blast Shield"
+	id = "peregrine_podbay"
+
+/obj/machinery/door/poddoor/blast/pyro/podbay_autoclose/pirate_armory
+	name = "Podbay Door"
+	id = "peregrine_armory"
+
+/obj/warp_beacon/pirate
+	name = "Peregrine hangar beacon"
+	icon_state = "beacon_synd"
+	encrypted = POD_ACCESS_PIRATE
+
+/obj/item/shipcomponent/communications/pirate
+	name = "Pirate Communication Array"
+	desc = "A patchwork of mismatched components, boasts an unexpected proficiency in homing in on elusive warp beacons."
+	color = "#91681c"
+	access_type = list(POD_ACCESS_PIRATE)
+
+TYPEINFO(/obj/item/salvager_hand_tele)
+	mats = list("MET-1" = 5, "POW-1"=5, "CON-2" = 5, "telecrystal" = 30)
+
+/obj/item/pirate_hand_tele
+	name = "makeshift teleporter"
+	icon = 'icons/obj/items/device.dmi'
+	desc = "A questionable portable teleportation device that is coupled to a specific location."
+	icon_state = "hand_tele"
+	item_state = "electronic"
+	throwforce = 5
+	health = 5
+	w_class = W_CLASS_SMALL
+	c_flags = ONBELT
+	throw_speed = 3
+	throw_range = 5
+	m_amt = 10000
+	var/image/indicator
+	var/image/indicator_light
+
+	New()
+		..()
+		indicator = image(src.icon, "hand_tele_o")
+		indicator_light = image(src.icon, "hand_tele_o", layer=LIGHTING_LAYER_BASE)
+		indicator_light.blend_mode = BLEND_ADD
+		indicator_light.plane = PLANE_LIGHTING
+		indicator_light.color = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5)
+
+	get_help_message(dist, mob/user)
+		. = "Use it in hand to return to the Peregrine. Use it on someone else to send your target to the Peregrine instead."
+
+	attack_self(mob/user)
+		. = ..()
+		if(!ispirate(user)) src.malfunction(user)
+		if (!isturf(user.loc))
+			boutput(user, SPAN_ALERT("It wouldn't be safe to use \the [src] from inside of \the [user.loc]!"))
+			return
+		if(length(landmarks[LANDMARK_PIRATES_TELE]))
+			if (!ON_COOLDOWN(src, "recharging", 15 SECONDS))
+				actions.start(new /datum/action/bar/pirate_tele(user, src), user)
+			else
+				user.show_message(SPAN_ALERT("It's still recharging!"))
+		else
+			user.show_message(SPAN_ALERT("Something is wrong..."))
+
+	// teleport a friend
+	attack(mob/target, mob/user, def_zone, is_special, params)
+		if (!ispirate(user))
+			src.malfunction(user)
+			return
+		if (target.anchored)
+			boutput(user, SPAN_ALERT("Teleportation failed due to interference."))
+			return
+
+		if(length(landmarks[LANDMARK_PIRATES_TELE]))
+			if (!ON_COOLDOWN(src, "recharging", 15 SECONDS))
+				actions.start(new /datum/action/bar/pirate_tele(target, src), user)
+			else
+				user.show_message(SPAN_ALERT("It's still recharging!"))
+			return
+		else
+			user.show_message(SPAN_ALERT("Something is wrong..."))
+
+	proc/malfunction(mob/user)
+		switch(rand(1,10))
+			if(1 to 5)
+				boutput(user, SPAN_ALERT("You can't make any sense of this device.  Maybe it isn't for you."))
+			if(6 to 8)
+				boutput(user, SPAN_ALERT("\the [src] screen flashes momentarily before discharing a shock."))
+				user.shock(src, 2500, "chest", 1, 1)
+				user.changeStatus("stunned", 3 SECONDS)
+			if(9 to 10)
+				boutput(user, SPAN_ALERT("[src] gets really hot... and explodes?!?"))
+				elecflash(src)
+				user.u_equip(src)
+				qdel(src)
+
+/datum/action/bar/pirate_tele
+	duration = 6 SECONDS
+	interrupt_flags = INTERRUPT_MOVE | INTERRUPT_STUNNED
+	var/atom/movable/target
+	var/obj/item/pirate_hand_tele/device
+
+	New(Target, Device)
+		target = Target
+		device = Device
+		..()
+
+	onUpdate()
+		..()
+		if(BOUNDS_DIST(owner, target) > 1 || target == null || owner == null)
+			interrupt(INTERRUPT_ALWAYS)
+			return
+		if(prob(25))
+			elecflash(device)
+
+	onStart()
+		..()
+		if(BOUNDS_DIST(owner, target) > 1 || target == null || owner == null)
+			interrupt(INTERRUPT_ALWAYS)
+			return
+		playsound(owner.loc, 'sound/machines/click.ogg', 60, 1)
+
+	onEnd()
+		..()
+		var/turf/destination = pick(landmarks[LANDMARK_PIRATES_TELE])
+		animate_teleport(target)
+		SPAWN(6 DECI SECONDS)
+			showswirl(target)
+			target.set_loc(destination)
+			showswirl(target)
+			elecflash(src)
diff --git a/code/modules/antagonists/vampire/abilities/enthrall.dm b/code/modules/antagonists/vampire/abilities/enthrall.dm
index c12b2edbe7e70..1b3b19ad51395 100644
--- a/code/modules/antagonists/vampire/abilities/enthrall.dm
+++ b/code/modules/antagonists/vampire/abilities/enthrall.dm
@@ -131,9 +131,11 @@
 
 		if (target in H.thralls)
 			//and add blood!
-			var/datum/mutantrace/vampiric_thrall/V = target.mutantrace
-			if (V)
-				V.blood_points += 200
+			var/datum/abilityHolder/vampiric_thrall/thrallHolder = target.get_ability_holder(/datum/abilityHolder/vampiric_thrall)
+			if (thrallHolder)
+				thrallHolder.points += 200
+			//we also restore their real actual blood pressure a bit, to allow vampires to save their thralls who are drained
+			target.blood_volume = min(target.blood_volume + 200, initial(target.blood_volume))
 
 			H.blood_tracking_output(cost)
 
diff --git a/code/modules/antagonists/wizard/abilities/animal.dm b/code/modules/antagonists/wizard/abilities/animal.dm
index 84bf491afb5c5..c2f0d5e36a7fb 100644
--- a/code/modules/antagonists/wizard/abilities/animal.dm
+++ b/code/modules/antagonists/wizard/abilities/animal.dm
@@ -99,6 +99,9 @@ var/list/animal_spell_critter_paths = list(/mob/living/critter/small_animal/cat,
 	onEnd()
 		..()
 
+		if(!ishuman(target))
+			boutput(M, SPAN_ALERT("<B>Your spell fizzles at the final moment, somehow your target is no longer human!</B>"))
+
 		if(!istype(get_area(M), /area/sim/gunsim))
 			M.say("YORAF UHRY", FALSE, spell.maptext_style, spell.maptext_colors)
 		if(ishuman(M))
@@ -115,23 +118,24 @@ var/list/animal_spell_critter_paths = list(/mob/living/critter/small_animal/cat,
 		smoke.attach(target)
 		smoke.start()
 
-		if (target.mind && (target.mind.assigned_role != "Animal") || (!target.mind || !target.client))
-			boutput(target, SPAN_ALERT("<B>You feel your flesh painfully ripped apart and reformed into something else!</B>"))
-			if (target.mind)
-				target.mind.assigned_role = "Animal"
-			target.emote("scream", 0)
-
-			target.unequip_all()
-			var/mob/living/critter/C = target.make_critter(pick(animal_spell_critter_paths))
-			C.real_name = "[target.real_name] the [C.real_name]"
-			C.name = C.real_name
-			C.is_npc = FALSE
-			logTheThing(LOG_COMBAT, M, "casts the Polymorph spell on [constructTarget(target,"combat")] turning them into [constructTarget(C,"combat")] at [log_loc(C)].")
-			C.butcherable = BUTCHER_ALLOWED // we would like the brain to be recoverable, please
-			if (istype(C, /mob/living/critter/small_animal/bee))
-				var/mob/living/critter/small_animal/bee/B = C
-				B.non_admin_bee_allowed = 1
-			if (istype(C))
-				C.change_misstep_chance(30)
-				C.stuttering = 40
-				C.show_antag_popup("polymorph")
+		boutput(target, SPAN_ALERT("<B>You feel your flesh painfully ripped apart and reformed into something else!</B>"))
+		target.emote("scream", 0)
+
+		target.unequip_all()
+		var/turf/T = get_turf(target)
+		var/mob/living/critter/C = target.make_critter(pick(animal_spell_critter_paths), T, ghost_spawned = FALSE, delete_original = FALSE)
+		target.set_loc(null) // We store the human in null so we can get them back with their exact current status
+		target.hibernating = TRUE
+		C.setStatus("wiz_polymorph", 8 MINUTES, target)
+		C.real_name = "[target.real_name] the [C.real_name]"
+		C.name = C.real_name
+		C.is_npc = FALSE
+		logTheThing(LOG_COMBAT, M, "casts the Polymorph spell on [constructTarget(target,"combat")] turning them into [constructTarget(C,"combat")] at [log_loc(C)].")
+		C.butcherable = BUTCHER_ALLOWED // we would like the brain to be recoverable, please
+		if (istype(C, /mob/living/critter/small_animal/bee))
+			var/mob/living/critter/small_animal/bee/B = C
+			B.non_admin_bee_allowed = 1
+		if (istype(C))
+			C.change_misstep_chance(30)
+			C.stuttering = 40
+			C.show_antag_popup("polymorph")
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index bb97234ab3ed5..4c46a5247f04b 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -56,7 +56,7 @@
 		if (!src.vr)
 			H.equip_if_possible(new /obj/item/teleportation_scroll(H), SLOT_L_HAND)
 
-		var/obj/item/SWF_uplink/SB = new /obj/item/SWF_uplink(src.vr)
+		var/obj/item/SWF_uplink/SB = new /obj/item/SWF_uplink(src, src.vr)
 		SB.wizard_key = src.owner.key
 		H.equip_if_possible(SB, SLOT_BELT)
 
@@ -73,7 +73,7 @@
 
 		if (!src.vr && !src.pseudo)
 			SPAWN(0)
-				var/newname = tgui_input_text(H, "You are a Wizard. Would you like to change your name to something else?", "Name change", randomname, max_length = 25)
+				var/newname = tgui_input_text(H, "You are a Wizard. Would you like to change your name to something else?", "Name change", randomname, max_length = 28)
 				if(newname && newname != randomname)
 					phrase_log.log_phrase("name-wizard", randomname, no_duplicates = TRUE)
 
diff --git a/code/modules/antagonists/wraith/critters/abilities/plaguerat.dm b/code/modules/antagonists/wraith/critters/abilities/plaguerat.dm
index 63d115d119716..563db7eb04995 100644
--- a/code/modules/antagonists/wraith/critters/abilities/plaguerat.dm
+++ b/code/modules/antagonists/wraith/critters/abilities/plaguerat.dm
@@ -80,7 +80,6 @@ ABSTRACT_TYPE(/datum/targetable/critter/plague_rat)
 		current_target = targets[1]
 		M.visible_message(SPAN_COMBAT("<b>[M] begins eating [current_target]!</b>"),\
 			SPAN_COMBAT("<b>You start eating [current_target]!</b>"))
-		logTheThing(LOG_DEBUG, src, "Targets = [length(targets)]")
 
 	onUpdate()
 		..()
@@ -102,9 +101,7 @@ ABSTRACT_TYPE(/datum/targetable/critter/plague_rat)
 		P.visible_message(SPAN_COMBAT("<b>[P] eats [current_target]!</b>"),\
 					SPAN_COMBAT("<b>You finish eating [current_target]!</b>"))
 		targets -= targets[1]
-		logTheThing(LOG_DEBUG, src, "Targets = [length(targets)]")
 		qdel(current_target)
-		logTheThing(LOG_DEBUG, src, "Targets = [length(targets)]")
 		P.eaten_amount ++
 		if (P.eaten_amount >= P.amount_to_grow)
 			P.grow_up()
diff --git a/code/modules/antagonists/wraith/objs/item/spirit_candle.dm b/code/modules/antagonists/wraith/objs/item/spirit_candle.dm
index cb15bce688d8b..b7acd205916ff 100644
--- a/code/modules/antagonists/wraith/objs/item/spirit_candle.dm
+++ b/code/modules/antagonists/wraith/objs/item/spirit_candle.dm
@@ -27,6 +27,7 @@
 				if ((W.last_spirit_candle_time + (W.forced_haunt_duration + 6 SECONDS)) < TIME)
 					W.last_spirit_candle_time = TIME
 					W.setStatus("corporeal", W.forced_haunt_duration, TRUE)
+					logTheThing(LOG_COMBAT, W, "is forced to manifest at [log_loc(W)] due to a spirit candle used by [user]")
 					boutput(W, SPAN_ALERT("A malignant spirit pulls you into the physical world! You begin to gather your forces to try and escape to the spirit realm..."))
 				else
 					boutput(user, SPAN_NOTICE("[src] vibrates slightly in your hand. A hostile entity lurks nearby but resisted our attempts to reveal it!"))
diff --git a/code/modules/atmospherics/FEA_gas_mixture.dm b/code/modules/atmospherics/FEA_gas_mixture.dm
index 2593fd98537f4..2b5024f3f0398 100644
--- a/code/modules/atmospherics/FEA_gas_mixture.dm
+++ b/code/modules/atmospherics/FEA_gas_mixture.dm
@@ -68,17 +68,15 @@ What are the archived variables for?
 	graphic_archived = graphic
 
 /// Process all reactions, return bitfield if notable reaction occurs.
-/datum/gas_mixture/proc/react(atom/dump_location)
+/datum/gas_mixture/proc/react(atom/dump_location, mult=1)
 	. = 0 //(used by pipe_network and hotspots)
 	var/reaction_rate
-
-	if(src.temperature > 900 && src.toxins > MINIMUM_REACT_QUANTITY && src.carbon_dioxide > MINIMUM_REACT_QUANTITY && src.oxygen_agent_b > MINIMUM_REACT_QUANTITY )
+	if(src.temperature > 900 && src.oxygen_agent_b > MINIMUM_REACT_QUANTITY && src.toxins > MINIMUM_REACT_QUANTITY && src.carbon_dioxide > MINIMUM_REACT_QUANTITY)
 		reaction_rate = min(src.carbon_dioxide*0.75, src.toxins*0.25, src.oxygen_agent_b*0.05)
-		reaction_rate = QUANTIZE(reaction_rate)
+		reaction_rate = QUANTIZE(reaction_rate) * mult
 
 		src.carbon_dioxide -= reaction_rate
 		src.oxygen += reaction_rate
-
 		src.oxygen_agent_b -= reaction_rate*0.05
 
 		src.temperature += (reaction_rate*20000)/HEAT_CAPACITY(src)
@@ -89,11 +87,10 @@ What are the archived variables for?
 
 	if(src.temperature > 900 && src.farts > MINIMUM_REACT_QUANTITY && src.toxins > MINIMUM_REACT_QUANTITY && src.carbon_dioxide > MINIMUM_REACT_QUANTITY)
 		reaction_rate = min(src.carbon_dioxide*0.75, src.toxins*0.25, src.farts*0.05)
-		reaction_rate = QUANTIZE(reaction_rate)
+		reaction_rate = QUANTIZE(reaction_rate) * mult
 
 		src.carbon_dioxide -= reaction_rate
 		src.toxins += reaction_rate
-
 		src.farts -= reaction_rate*0.05
 
 		src.temperature += (reaction_rate*10000)/HEAT_CAPACITY(src)
@@ -101,12 +98,13 @@ What are the archived variables for?
 
 	src.fuel_burnt = 0
 	if(src.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
-		if(src.fire())
+		if(src.fire(mult))
 			. |= COMBUSTION_ACTIVE
 
 /// * Process fire combustion, pretty much just plasma combustion.
 /// * Returns: Rough amount of plasma and oxygen used. Inaccurate due to plasma usage lowering.
-/datum/gas_mixture/proc/fire()
+/datum/gas_mixture/proc/fire(mult=1)
+
 	var/energy_released = 0
 	var/old_heat_capacity = HEAT_CAPACITY(src)
 
@@ -127,6 +125,9 @@ What are the archived variables for?
 			else
 				plasma_burn_rate = (temperature_scale * (src.oxygen / PLASMA_OXYGEN_FULLBURN)) / 4
 			if(plasma_burn_rate > MINIMUM_REACT_QUANTITY)
+				plasma_burn_rate *= mult
+				oxygen_burn_rate *= mult
+
 				src.toxins -= QUANTIZE(plasma_burn_rate / 3) // Plasma usage lowered
 				src.oxygen -= QUANTIZE(plasma_burn_rate * oxygen_burn_rate)
 				src.carbon_dioxide += QUANTIZE(plasma_burn_rate / 3)
diff --git a/code/modules/atmospherics/machinery/binary/dp_vent_pump.dm b/code/modules/atmospherics/machinery/binary/dp_vent_pump.dm
index 715e0d97c73c1..05c1abd4e0e53 100644
--- a/code/modules/atmospherics/machinery/binary/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/binary/dp_vent_pump.dm
@@ -25,14 +25,20 @@
 	var/input_pressure_min = 0
 	/// The maximum pressure to keep our output at.
 	var/output_pressure_max = 0
-	var/frequency = 0
+	/// Radio frequency to operate on.
+	var/frequency = null
+	/// Radio ID we respond to for multicast.
 	var/id = null
+	/// Radio ID that refers to specifically us.
+	var/net_id = null
 	/// What bounds to check for.
 	var/pressure_checks = BOUND_EXTERNAL
 
 /obj/machinery/atmospherics/binary/dp_vent_pump/New()
 	..()
-	MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+	if(src.frequency)
+		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/binary/dp_vent_pump/update_icon()
 	var/turf/T = get_turf(src)
@@ -104,73 +110,87 @@
 	signal.transmission_method = TRANSMISSION_RADIO
 	signal.source = src
 
-	signal.data["tag"] = id
+	signal.data["tag"] = src.id
+	signal.data["netid"] = src.net_id
 	signal.data["device"] = "ADVP"
-	signal.data["power"] = on?("on"):("off")
-	signal.data["direction"] = pump_direction?("release"):("siphon")
-	signal.data["checks"] = pressure_checks
-	signal.data["input"] = input_pressure_min
-	signal.data["output"] = output_pressure_max
-	signal.data["external"] = external_pressure_bound
+	signal.data["power"] = src.on?("on"):("off")
+	signal.data["direction"] = src.pump_direction?("release"):("siphon")
+	signal.data["checks"] = src.pressure_checks
+	signal.data["input"] = src.input_pressure_min
+	signal.data["output"] = src.output_pressure_max
+	signal.data["external"] = src.external_pressure_bound
 
 	SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
 
 	return TRUE
 
 /obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
+		if("broadcast_status")
+			SPAWN(0.5 SECONDS)
+				broadcast_status()
+
 		if("power_on")
-			on = TRUE
+			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
-			on = FALSE
+			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
-			on = !on
+			src.on = !on
+			. = TRUE
 
 		if("set_direction")
 			var/number = text2num_safe(signal.data["parameter"])
-			if(number > 0.5)
-				pump_direction = RELEASING
-			else
-				pump_direction = SIPHONING
+			src.pump_direction = (number > 0.5) ? RELEASING : SIPHONING
+			. = TRUE
 
 		if("set_checks")
 			var/number = round(text2num_safe(signal.data["parameter"]),1)
-			pressure_checks = number
+			src.pressure_checks = number
+			. = TRUE
 
 		if("purge")
-			pressure_checks &= ~BOUND_EXTERNAL
-			pump_direction = SIPHONING
+			src.pressure_checks &= ~BOUND_EXTERNAL
+			src.pump_direction = SIPHONING
+			. = TRUE
 
 		if("stabalize")
-			pressure_checks |= BOUND_EXTERNAL
-			pump_direction = RELEASING
+			src.pressure_checks |= BOUND_EXTERNAL
+			src.pump_direction = RELEASING
+			. = TRUE
 
 		if("set_input_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, ONE_ATMOSPHERE*50)
 
-			input_pressure_min = number
+			src.input_pressure_min = clamp(number, 0, ONE_ATMOSPHERE*50)
+			. = TRUE
 
 		if("set_output_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, ONE_ATMOSPHERE*50)
 
-			output_pressure_max = number
+			src.output_pressure_max = clamp(number, 0, ONE_ATMOSPHERE*50)
+			. = TRUE
 
 		if("set_external_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, ONE_ATMOSPHERE*50)
 
-			external_pressure_bound = number
+			src.external_pressure_bound = clamp(number, 0, ONE_ATMOSPHERE*50)
+			. = TRUE
 
-	if(signal.data["tag"])
-		SPAWN(0.5 SECONDS) broadcast_status()
-	UpdateIcon()
+	if(.)
+		src.UpdateIcon()
+		var/turf/intact = get_turf(src)
+		intact = intact.intact
+		var/hide_pipe = CHECKHIDEPIPE(src)
+		flick("[hide_pipe ? "h" : "" ]alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
 
 /obj/machinery/atmospherics/binary/dp_vent_pump/releasing
 	icon_state = "out-map"
diff --git a/code/modules/atmospherics/machinery/binary/pump.dm b/code/modules/atmospherics/machinery/binary/pump.dm
index b27e6e0aee9d3..d9c195736a5ff 100644
--- a/code/modules/atmospherics/machinery/binary/pump.dm
+++ b/code/modules/atmospherics/machinery/binary/pump.dm
@@ -11,6 +11,8 @@ Thus, the two variables affect pump operation are set in New():
 		Higher quantities of this cause more air to be perfected later
 			but overall network volume is also increased as this increases...
 */
+/// Min pump pressure.
+#define MIN_PRESSURE 0
 /// Max pump pressure.
 #define MAX_PRESSURE 149 * ONE_ATMOSPHERE
 
@@ -24,14 +26,20 @@ Thus, the two variables affect pump operation are set in New():
 
 	var/on = FALSE
 	var/target_pressure = ONE_ATMOSPHERE
-	var/frequency = 0
+	/// Radio frequency to operate on.
+	var/frequency = FREQ_PUMP_CONTROL
+	/// Radio ID we respond to for multicast.
 	var/id = null
+	/// Radio ID that refers to specifically us.
+	var/net_id = null
 
 	var/datum/pump_ui/ui
 
 /obj/machinery/atmospherics/binary/pump/New()
 	..()
-	MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+	if(src.frequency)
+		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, src.frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/binary/pump/initialize()
 	..()
@@ -81,8 +89,11 @@ Thus, the two variables affect pump operation are set in New():
 	signal.source = src
 
 	signal.data["tag"] = src.id
+	signal.data["netid"] = src.net_id
 	signal.data["device"] = "AGP"
 	signal.data["power"] = src.on ? "on" : "off"
+	signal.data["min_output"] = MIN_PRESSURE
+	signal.data["max_output"] = MAX_PRESSURE
 	signal.data["target_output"] = src.target_pressure
 	signal.data["address_tag"] = "pumpcontrol"
 
@@ -92,8 +103,9 @@ Thus, the two variables affect pump operation are set in New():
 
 
 /obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
 		if("broadcast_status")
@@ -101,25 +113,45 @@ Thus, the two variables affect pump operation are set in New():
 				broadcast_status()
 
 		if("power_on")
-			on = TRUE
+			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
-			on = FALSE
+			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
-			on = !on
+			src.on = !src.on
+			. = TRUE
 
 		if("set_output_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, MAX_PRESSURE)
 
-			target_pressure = number
+			src.target_pressure = clamp(number, MIN_PRESSURE, MAX_PRESSURE)
+			. = TRUE
 
-	if(signal.data["tag"])
-		SPAWN(0.5 SECONDS)
-			broadcast_status()
+		if("help")
+			var/datum/signal/help = get_free_signal()
+			help.transmission_method = TRANSMISSION_RADIO
+			help.source = src
 
-	UpdateIcon()
+			help.data["info"] = "Command help. \
+									broadcast_status - Broadcasts info about self. \
+									power_on - Turns on pump. \
+									power_off - Turns off pump. \
+									power_toggle - Toggles pump. \
+									set_output_pressure (parameter: Number) - Sets pressure in kilopascals to parameter. Max at [MAX_PRESSURE] kPA."
+
+			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, help)
+
+
+	if(.)
+		src.UpdateIcon()
+		var/turf/intact = get_turf(src)
+		intact = intact.intact
+		var/hide_pipe = CHECKHIDEPIPE(src)
+		flick("[hide_pipe ? "h" : "" ]alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
 
 /obj/machinery/atmospherics/binary/pump/attackby(obj/item/W, mob/user)
 	if(ispulsingtool(W) || iswrenchingtool(W))
@@ -132,7 +164,7 @@ Thus, the two variables affect pump operation are set in New():
 /datum/pump_ui/basic_pump_ui
 	value_name = "Target Pressure"
 	value_units = "kPa"
-	min_value = 0
+	min_value = MIN_PRESSURE
 	max_value = MAX_PRESSURE
 	incr_sm = 50
 	incr_lg = 100
@@ -160,4 +192,5 @@ Thus, the two variables affect pump operation are set in New():
 /datum/pump_ui/basic_pump_ui/get_atom()
 	return our_pump
 
+#undef MIN_PRESSURE
 #undef MAX_PRESSURE
diff --git a/code/modules/atmospherics/machinery/binary/volume_pump.dm b/code/modules/atmospherics/machinery/binary/volume_pump.dm
index 91b335bc5ae04..d7e8df4d37218 100644
--- a/code/modules/atmospherics/machinery/binary/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/binary/volume_pump.dm
@@ -13,14 +13,20 @@
 	var/on = FALSE
 	var/transfer_rate = 200
 
-	var/frequency = 0
+	/// Radio frequency to operate on.
+	var/frequency = null
+	/// Radio ID we respond to for multicast.
 	var/id = null
+	/// Radio ID that refers to specifically us.
+	var/net_id = null
 
 	var/datum/pump_ui/volume_pump_ui/ui
 
 /obj/machinery/atmospherics/binary/volume_pump/New()
 	..()
-	MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+	if(src.frequency)
+		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, src.frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/binary/volume_pump/update_icon()
 	if(!(node1&&node2))
@@ -52,6 +58,7 @@
 	signal.source = src
 
 	signal.data["tag"] = src.id
+	signal.data["netid"] = src.net_id
 	signal.data["device"] = "APV"
 	signal.data["power"] = src.on
 	signal.data["transfer_rate"] = src.transfer_rate
@@ -65,29 +72,50 @@
 	src.ui = new/datum/pump_ui/volume_pump_ui(src)
 
 /obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
+		if("broadcast_status")
+			SPAWN(0.5 SECONDS)
+				broadcast_status()
+
 		if("power_on")
-			on = TRUE
+			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
-			on = FALSE
+			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
-			on = !on
+			src.on = !on
+			. = TRUE
 
 		if("set_transfer_rate")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, MAX_VOLUME)
 
-			src.transfer_rate = number
+			src.transfer_rate = clamp(number, 0, MAX_VOLUME)
+			. = TRUE
+
+		if("help")
+			var/datum/signal/help = get_free_signal()
+			help.transmission_method = TRANSMISSION_RADIO
+			help.source = src
+
+			help.data["info"] = "Command help. \
+									power_on - Turns on pump. \
+									power_off - Turns off pump. \
+									power_toggle - Toggles pump. \
+									set_transfer_rate (parameter: Number) - Sets transfer rate in liters to parameter. Max at [MAX_VOLUME] L."
+
+			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, help)
 
-	if(signal.data["tag"])
-		SPAWN(0.5 SECONDS)
-			broadcast_status()
-	UpdateIcon()
+	if(.)
+		src.UpdateIcon()
+		flick("alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
 
 /obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/W, mob/user)
 	if(ispulsingtool(W))
diff --git a/code/modules/atmospherics/machinery/unary/outlet_injector.dm b/code/modules/atmospherics/machinery/unary/outlet_injector.dm
index c092f3be93b55..b773a6e6b2822 100644
--- a/code/modules/atmospherics/machinery/unary/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/unary/outlet_injector.dm
@@ -12,15 +12,20 @@
 	var/injecting = FALSE
 	/// Volume of air to output.
 	var/volume_rate = 50
-
-	var/frequency = 0
+	/// Radio frequency to operate on.
+	var/frequency = FREQ_FREE
+	/// Radio ID we respond to for multicast.
 	var/id = null
+	/// Radio ID that refers to specifically us.
+	var/net_id = null
 
 	level = UNDERFLOOR
 
 /obj/machinery/atmospherics/unary/outlet_injector/New()
 	..()
-	MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+	if (src.frequency)
+		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, src.frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/unary/outlet_injector/update_icon()
 	var/turf/T = get_turf(src)
@@ -68,6 +73,7 @@
 	signal.source = src
 
 	signal.data["tag"] = src.id
+	signal.data["netid"] = src.net_id
 	signal.data["device"] = "AO"
 	signal.data["power"] = src.on
 	signal.data["volume_rate"] = src.volume_rate
@@ -77,31 +83,58 @@
 	return TRUE
 
 /obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
 		if("power_on")
 			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
 			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
 			src.on = !on
+			. = TRUE
 
 		if("inject")
-			SPAWN(0) src.inject()
+			SPAWN(0)
+				src.inject()
+			. = TRUE
 
 		if("set_volume_rate")
 			var/number = text2num_safe(signal.data["parameter"])
 			number = clamp(number, 0, air_contents.volume)
 
 			src.volume_rate = number
-
-	if(signal.data["tag"])
-		SPAWN(0.5 SECONDS) src.broadcast_status()
-	UpdateIcon()
+			. = TRUE
+
+		if("broadcast_status")
+			SPAWN(0.5 SECONDS)
+				broadcast_status()
+
+		if("help")
+			var/datum/signal/help = get_free_signal()
+			help.transmission_method = TRANSMISSION_RADIO
+			help.source = src
+
+			help.data["info"] = "Command help. \
+									broadcast_status - Broadcasts info about self. \
+									power_on - Turns on injector. \
+									power_off - Turns off injector. \
+									power_toggle - Toggles injector. \
+									inject - Injects gas into environment. \
+									set_volume_rate (parameter: Number) - Sets rate in liters to parameter. Max at [src.air_contents.volume] L."
+
+			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, help)
+
+	if(.)
+		src.UpdateIcon()
+		flick("alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
 
 /obj/machinery/atmospherics/unary/outlet_injector/hide(var/intact) //to make the little pipe section invisible, the icon changes.
 	var/hide_pipe = CHECKHIDEPIPE(src)
diff --git a/code/modules/atmospherics/machinery/unary/vent_pump.dm b/code/modules/atmospherics/machinery/unary/vent_pump.dm
index c01e0313079cd..094cf84926f15 100644
--- a/code/modules/atmospherics/machinery/unary/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/unary/vent_pump.dm
@@ -25,14 +25,17 @@
 	/// Are we applying the external bound, internal bound, or both?
 	var/pressure_checks = BOUND_EXTERNAL
 	/// Radio frequency to operate on.
-	var/frequency = 0
-	/// Radio ID we go by.
+	var/frequency = FREQ_FREE
+	/// Radio ID we respond to for multicast.
 	var/id = null
+	/// Radio ID that refers to us only.
+	var/net_id = null
 
 /obj/machinery/atmospherics/unary/vent_pump/New()
 	..()
-	if(frequency)
+	if(src.frequency)
 		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/unary/vent_pump/update_icon()
 	var/turf/T = get_turf(src)
@@ -85,20 +88,21 @@
 	return TRUE
 
 /obj/machinery/atmospherics/unary/vent_pump/proc/broadcast_status()
-	if(!id)
+	if(!src.id)
 		return FALSE
 
 	var/datum/signal/signal = get_free_signal()
 	signal.transmission_method = TRANSMISSION_RADIO
 	signal.source = src
 
-	signal.data["tag"] = id
+	signal.data["tag"] = src.id
+	signal.data["netid"] = src.net_id
 	signal.data["device"] = "AVP"
-	signal.data["power"] = on?("on"):("off")
-	signal.data["direction"] = pump_direction?("release"):("siphon")
-	signal.data["checks"] = pressure_checks
-	signal.data["internal"] = internal_pressure_bound
-	signal.data["external"] = external_pressure_bound
+	signal.data["power"] = src.on ? "on": "off"
+	signal.data["direction"] = src.pump_direction ? "release" : "siphon"
+	signal.data["checks"] = src.pressure_checks
+	signal.data["internal"] = src.internal_pressure_bound
+	signal.data["external"] = src.external_pressure_bound
 
 	SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
 
@@ -109,54 +113,91 @@
 	UpdateIcon()
 
 /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
 		if("power_on")
-			on = TRUE
+			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
-			on = FALSE
+			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
-			on = !on
+			src.on = !src.on
+			. = TRUE
 
 		if("set_direction")
 			var/number = text2num_safe(signal.data["parameter"])
-			pump_direction = number > 0.5 ? RELEASING : SIPHONING
+			src.pump_direction = number > 0.5 ? RELEASING : SIPHONING
+			. = TRUE
 
 		if("purge")
 			REMOVE_FLAG(pressure_checks, BOUND_EXTERNAL)
-			pump_direction = SIPHONING
+			src.pump_direction = SIPHONING
+			. = TRUE
 
 		if("end_purge")
 			ADD_FLAG(pressure_checks, BOUND_EXTERNAL)
-			pump_direction = SIPHONING
+			src.pump_direction = SIPHONING
+			. = TRUE
 
 		if("stabilise")
 			ADD_FLAG(pressure_checks, BOUND_EXTERNAL)
-			pump_direction = RELEASING
+			src.pump_direction = RELEASING
+			. = TRUE
 
 		if("set_checks")
-			var/number = round(text2num_safe(signal.data["parameter"]),1)
-			pressure_checks = number
+			var/number = clamp(round(text2num_safe(signal.data["parameter"]),1), 0, 3)
+			src.pressure_checks = number
+			. = TRUE
 
 		if("set_internal_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, ONE_ATMOSPHERE*50)
 
-			internal_pressure_bound = number
+			src.internal_pressure_bound = clamp(number, 0, ONE_ATMOSPHERE*50)
+			. = TRUE
 
 		if("set_external_pressure")
 			var/number = text2num_safe(signal.data["parameter"])
-			number = clamp(number, 0, ONE_ATMOSPHERE*50)
 
-			external_pressure_bound = number
+			src.external_pressure_bound = clamp(number, 0, ONE_ATMOSPHERE*50)
+			. = TRUE
 
-		if("refresh")
+		if("broadcast_status")
 			SPAWN(0.5 SECONDS) broadcast_status()
 
+		if("help")
+			var/datum/signal/help = get_free_signal()
+			help.transmission_method = TRANSMISSION_RADIO
+			help.source = src
+
+			help.data["info"] = "Command help. \
+									broadcast_status - Broadcasts info about self. \
+									power_on - Turns on vent. \
+									power_off - Turns off vent. \
+									power_toggle - Toggles vent. \
+									set_direction (parameter: Number) - Switches between siphoning (parameter<=0.5) and releasing (parameter>0.5). \
+									purge - Switches to siphoning and removes external bounds check. \
+									end_purge - Switches to siphoning and adds external bounds check. \
+									stabilise - Switches to releasing and adds external bounds check. \
+									set_checks (parameter: Bitflag) - Controls bounds check. [BOUND_EXTERNAL] is external bounds. [BOUND_INTERNAL] is internal bouds. \
+									set_internal_pressure (parameter: Number) - Sets internal bound to parameter. Max at [ONE_ATMOSPHERE*50]. \
+									set_external_pressure (parameter: Number) - Sets external bound to parameter. Max at [ONE_ATMOSPHERE*50]."
+
+			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, help)
+
+	if(.)
+		src.UpdateIcon()
+		var/turf/intact = get_turf(src)
+		intact = intact.intact
+		var/hide_pipe = CHECKHIDEPIPE(src)
+		flick("[hide_pipe ? "h" : "" ]alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
+
 
 /obj/machinery/atmospherics/unary/vent_pump/hide(var/intact) //to make the little pipe section invisible, the icon changes.
 	var/hide_pipe = CHECKHIDEPIPE(src)
diff --git a/code/modules/atmospherics/machinery/unary/vent_scrubber.dm b/code/modules/atmospherics/machinery/unary/vent_scrubber.dm
index 3452c8d30cfdd..5022756730239 100644
--- a/code/modules/atmospherics/machinery/unary/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/unary/vent_scrubber.dm
@@ -10,8 +10,10 @@
 	desc = "Has a valve and pump attached to it"
 
 	level = UNDERFLOOR
-	/// What we go by on radio communications
+	/// ID we respond to for multicast.
 	var/id = null
+	/// ID that refers specifically to us.
+	var/net_id = null
 	/// Frequency we communicate on, usually with air alarms.
 	var/frequency = FREQ_AIR_ALARM_CONTROL
 	/// Are we doing anything at all?
@@ -27,8 +29,9 @@
 
 /obj/machinery/atmospherics/unary/vent_scrubber/New()
 	..()
-	if(frequency)
-		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, frequency)
+	if(src.frequency)
+		MAKE_DEFAULT_RADIO_PACKET_COMPONENT(null, src.frequency)
+		src.net_id = generate_net_id(src)
 
 /obj/machinery/atmospherics/unary/vent_scrubber/initialize()
 	..()
@@ -97,26 +100,54 @@
 	SET_PIPE_UNDERLAY(src.node, src.dir, "long", issimplepipe(src.node) ?  src.node.color : null, hide_pipe)
 
 /obj/machinery/atmospherics/unary/vent_scrubber/receive_signal(datum/signal/signal)
-	if(signal.data["tag"] && (signal.data["tag"] != id))
-		return FALSE
+	if(!((signal.data["tag"] && (signal.data["tag"] == src.id)) || (signal.data["netid"] && (signal.data["netid"] == src.net_id))))
+		if(signal.data["command"] != "broadcast_status")
+			return FALSE
 
 	switch(signal.data["command"])
 		if("power_on")
-			on = TRUE
+			src.on = TRUE
+			. = TRUE
 
 		if("power_off")
-			on = FALSE
+			src.on = FALSE
+			. = TRUE
 
 		if("power_toggle")
-			on = !on
+			src.on = !on
+			. = TRUE
 
 		if("set_siphon")
-			scrubbing = SIPHONING
+			src.scrubbing = SIPHONING
+			. = TRUE
 
 		if("set_scrubbing")
-			scrubbing = SCRUBBING
-
-	UpdateIcon()
+			src.scrubbing = SCRUBBING
+			. = TRUE
+
+		if("help")
+			var/datum/signal/help = get_free_signal()
+			help.transmission_method = TRANSMISSION_RADIO
+			help.source = src
+
+			help.data["info"] = "Command help. \
+									power_on - Turns on scrubber. \
+									power_off - Turns off scrubber. \
+									power_toggle - Toggles scrubber. \
+									set_siphon - Begins siphoning all gas. \
+									set_scrubbing - Begins scrubbing select gases. \
+									set_volume_rate (parameter: Number) - Sets rate in liters to parameter. Max at [src.air_contents.volume] L."
+
+			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, help)
+
+
+	if(.)
+		src.UpdateIcon()
+		var/turf/intact = get_turf(src)
+		intact = intact.intact
+		var/hide_pipe = CHECKHIDEPIPE(src)
+		flick("[hide_pipe ? "h" : "" ]alert", src)
+		playsound(src, 'sound/machines/chime.ogg', 25)
 
 /obj/machinery/atmospherics/unary/vent_scrubber/inactive
 	icon_state = "off-map"
diff --git a/code/modules/atmospherics/portable/portable_atmospherics.dm b/code/modules/atmospherics/portable/portable_atmospherics.dm
index e0a787a698e6f..88709b9ba4b21 100644
--- a/code/modules/atmospherics/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/portable/portable_atmospherics.dm
@@ -42,7 +42,7 @@
 
 	process()
 		if(contained) return
-		if(!connected_port) //only react when pipe_network will ont it do it for you
+		if(!connected_port) //only react when pipe_network wont it do it for you
 			//Allow for reactions
 			air_contents?.react() //ZeWaka: Fix for null.react()
 
diff --git a/code/modules/chemistry/Chemistry-Dispenser.dm b/code/modules/chemistry/Chemistry-Dispenser.dm
index 943b736784d95..aaab2a092a269 100644
--- a/code/modules/chemistry/Chemistry-Dispenser.dm
+++ b/code/modules/chemistry/Chemistry-Dispenser.dm
@@ -177,6 +177,7 @@ TYPEINFO(/obj/machinery/chem_dispenser)
 		qdel(src)
 		return
 
+
 	proc/eject_card()
 		if (src.user_id)
 			if((BOUNDS_DIST(usr, src) == 0))
@@ -248,10 +249,10 @@ TYPEINFO(/obj/machinery/chem_dispenser)
 			qdel(src)
 			return
 
-	proc/remove_distant_beaker()
+	proc/remove_distant_beaker(force = FALSE)
 		// borgs and people with item arms don't insert the beaker into the machine itself
 		// but whenever something would happen to the dispenser and the beaker is far it should disappear
-		if(beaker && BOUNDS_DIST(beaker, src) > 0)
+		if(beaker && (BOUNDS_DIST(beaker, src) > 0 || force))
 			REMOVE_ATOM_PROPERTY(beaker, PROP_ITEM_IN_CHEM_DISPENSER, src)
 			beaker = null
 			src.UpdateIcon()
@@ -437,6 +438,11 @@ TYPEINFO(/obj/machinery/chem_dispenser)
 				src.recording_queue = list()
 				. = TRUE
 
+	ui_close(mob/user)
+		. = ..()
+		if(src.beaker?.loc != src)
+			src.remove_distant_beaker(force = TRUE)
+
 /obj/machinery/chem_dispenser/chemical
 	New()
 		..()
diff --git a/code/modules/chemistry/Chemistry-Holder.dm b/code/modules/chemistry/Chemistry-Holder.dm
index 8c26e578b6d3e..14487c59ac8b9 100644
--- a/code/modules/chemistry/Chemistry-Holder.dm
+++ b/code/modules/chemistry/Chemistry-Holder.dm
@@ -99,7 +99,7 @@ proc/chem_helmet_check(mob/living/carbon/human/H, var/what_liquid="hot")
 
 	proc/set_reagent_temp(var/new_temp = T0C, var/react = 0)
 		src.last_temp = total_temperature
-		src.total_temperature = new_temp
+		src.total_temperature = max(new_temp, 0)
 		if (react)
 			temperature_react()
 			handle_reactions()
@@ -849,7 +849,7 @@ proc/chem_helmet_check(mob/living/carbon/human/H, var/what_liquid="hot")
 		if (!donotupdate)
 			reagents_changed(1)
 
-		if((added_new || check_reactions) && !current_reagent.disposed)
+		if((added_new || check_reactions) && !QDELETED(current_reagent))
 			append_possible_reactions(current_reagent.id) //Experimental reaction possibilities
 			if (!donotreact)
 				src.handle_reactions()
diff --git a/code/modules/chemistry/Chemistry-Reagents.dm b/code/modules/chemistry/Chemistry-Reagents.dm
index a11e9403e331a..b0b2674caa3a9 100644
--- a/code/modules/chemistry/Chemistry-Reagents.dm
+++ b/code/modules/chemistry/Chemistry-Reagents.dm
@@ -160,11 +160,25 @@ datum
 						if(M.reagents)
 							M.reagents.add_reagent(self.id,volume*touch_modifier,self.data)
 							did_not_react = 0
-					if (ishuman(M) && hygiene_value && method == TOUCH)
+					if (ishuman(M))
 						var/mob/living/carbon/human/H = M
+						if (H.mutantrace.aquaphobic && istype(src, /datum/reagent/water))
+							animate_shake(H)
+							if (prob(50))
+								H.emote("scream")
+							else
+								boutput(H, "<span class='alert'><b>The water! It[pick(" burns"," hurts","'s so terrible","'s ruining your skin"," is your true mortal enemy!")]!</b></span>", group = "aquaphobia")
+							if (!ON_COOLDOWN(H, "bingus_damage", 3 SECONDS))
+								random_burn_damage(H, clamp(0.3 * volume, 4, 20))
 						if (H.sims)
 							if ((hygiene_value > 0 && !(H.wear_suit || H.w_uniform)) || hygiene_value < 0)
-								H.sims.affectMotive("Hygiene", volume * hygiene_value)
+								var/hygiene_restore = hygiene_value
+								if (H.mutantrace.aquaphobic)
+									if (istype(src, /datum/reagent/oil))
+										hygiene_restore = 3
+									else if (istype(src, /datum/reagent/water))
+										hygiene_restore = -3
+								H.sims.affectMotive("Hygiene", volume * hygiene_restore)
 
 				if(INGEST)
 					var/datum/ailment_data/addiction/AD = M.addicted_to_reagent(src)
diff --git a/code/modules/chemistry/Chemistry-Recipes.dm b/code/modules/chemistry/Chemistry-Recipes.dm
index 266bdc8432758..e07d6afeae687 100644
--- a/code/modules/chemistry/Chemistry-Recipes.dm
+++ b/code/modules/chemistry/Chemistry-Recipes.dm
@@ -2861,7 +2861,7 @@
 		name = "Cyclopentanol"
 		id = "cyclopentanol"
 		result = "cyclopentanol"
-		min_temperature = T0C + 275
+		min_temperature = T0C + 50
 		required_reagents = list("acetic_acid" = 1, "ether" = 1, "barium" = 1, "hydrogen" = 1, "oxygen" = 1)
 		result_amount = 3
 		mix_phrase = "The mixture fizzles into a colorless liquid."
@@ -4168,6 +4168,7 @@
 		id = "LSD"
 		result = "LSD"
 		required_reagents = list("diethylamine" = 1, "space_fungus" = 1)
+		min_temperature = T0C + 70
 		result_amount = 3
 		mix_phrase = "The mixture turns a rather unassuming color and settles."
 
diff --git a/code/modules/chemistry/Chemistry-Tools.dm b/code/modules/chemistry/Chemistry-Tools.dm
index 422353cd844b9..46dadb08f570e 100644
--- a/code/modules/chemistry/Chemistry-Tools.dm
+++ b/code/modules/chemistry/Chemistry-Tools.dm
@@ -194,7 +194,7 @@ proc/ui_describe_reagents(atom/A)
 /obj/item/reagent_containers/glass
 	name = " "
 	desc = " "
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
 	icon_state = "null"
 	item_state = "null"
@@ -205,6 +205,68 @@ proc/ui_describe_reagents(atom/A)
 	var/shatter_immune = FALSE
 	flags = FPRINT | TABLEPASS | OPENCONTAINER | SUPPRESSATTACK | ACCEPTS_MOUSEDROP_REAGENTS
 
+	/// The number of fluid overlay states that this container has.
+	var/fluid_overlay_states = 0
+	/// The icon state that this container should for fluid overlays.
+	var/container_style = null
+	/// The scaling that this container's fluid overlays should use.
+	var/fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_LINEAR
+
+	New()
+		. = ..()
+		src.container_style ||= src.icon_state
+
+	on_reagent_change()
+		. = ..()
+		src.UpdateIcon()
+
+	update_icon()
+		. = ..()
+		src.update_fluid_overlays()
+
+	proc/update_fluid_overlays()
+		if (!src.fluid_overlay_states)
+			return
+
+		var/fluid_state = src.get_fluid_state()
+
+		if (fluid_state)
+			var/image/fluid_image = image('icons/obj/items/chemistry_glassware.dmi', "f-[src.container_style]-[fluid_state]")
+			var/datum/color/average = reagents.get_average_color()
+			average.a = max(average.a, RC_MINIMUM_REAGENT_ALPHA)
+			fluid_image.color = average.to_rgba()
+			src.UpdateOverlays(fluid_image, "fluid_image")
+		else
+			src.UpdateOverlays(null, "fluid_image")
+
+	/// Returns the numerical fluid state of this container.
+	proc/get_fluid_state()
+		// Show no fluid state only if the container is completely empty.
+		if (src.reagents.total_volume <= 0)
+			return 0
+
+		// Show the last fluid state only if the container is full.
+		if (src.reagents.total_volume >= src.reagents.maximum_volume)
+			return src.fluid_overlay_states
+
+		var/normalised_fluid_height = 0
+		var/normalised_volume = src.reagents.total_volume / src.reagents.maximum_volume
+		switch (src.fluid_overlay_scaling)
+			// Volume of liquid will be directly proportional to height, so setting total volume to 1, the normalised height will be equal to the ratio.
+			if (RC_FLUID_OVERLAY_SCALING_LINEAR)
+				normalised_fluid_height = normalised_volume
+
+			// Vₛ = volume of sphere, r = radius of sphere, Vₗ = volume of liquid inside of sphere, h = height of liquid.
+			// `Vₗ = ∫ π(r² - (z - r)²) dx` with lower and upper limits of 0 and h respectively gives the equation `Vₗ = πh²(r - h/3)`.
+			// `Vₗ = πh²(r - h/3)` is very closely approximated by `Vₗ = -0.5Vₛ(cos(h(π / 2r)) - 1)` for 0 <= h <= 2r.
+			// This permits us to efficiently solve for h without the need for the cubic formula: `h = (2r / π) * arccos(1 - 2(Vₗ / Vₛ))`
+			// Setting Vₛ = 1 and normalising h to a range of 0-1 gives: `h = arccos(1 - 2Vₗ) / π`
+			// Converting from radians to degrees: `h = arccos(1 - 2Vₗ) / 180`
+			if (RC_FLUID_OVERLAY_SCALING_SPHERICAL)
+				normalised_fluid_height = arccos(1 - (2 * normalised_volume)) / 180
+
+		return clamp(round(normalised_fluid_height * src.fluid_overlay_states, 1), 1, src.fluid_overlay_states - 1)
+
 	// this proc is a mess ow
 	afterattack(obj/target, mob/user , flag)
 		user.lastattacked = target
@@ -521,6 +583,19 @@ proc/ui_describe_reagents(atom/A)
 		if(..() && !GET_ATOM_PROPERTY(src, PROP_ITEM_IN_CHEM_DISPENSER))
 			return 1
 
+	get_chemical_effect_position()
+		switch(src.container_style)
+			if("beaker")
+				return 4
+			if("large_beaker")
+				return 9
+			if("conical_flask")
+				return 9
+			if("round_flask")
+				return 9
+			if("large_flask")
+				return 10
+
 /* =================================================== */
 /* -------------------- Sub-Types -------------------- */
 /* =================================================== */
@@ -673,7 +748,6 @@ proc/ui_describe_reagents(atom/A)
 /obj/item/reagent_containers/glass/dispenser
 	name = "reagent glass"
 	desc = "A reagent glass."
-	icon = 'icons/obj/chemical.dmi'
 	icon_state = "beaker"
 	initial_volume = 50
 	amount_per_transfer_from_this = 10
@@ -683,8 +757,7 @@ proc/ui_describe_reagents(atom/A)
 /obj/item/reagent_containers/glass/large
 	name = "large reagent glass"
 	desc = "A large reagent glass."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "beakerlarge"
+	icon_state = "large_beaker"
 	item_state = "beaker"
 	rc_flags = RC_SCALE | RC_VISIBLE | RC_SPECTRO
 	amount_per_transfer_from_this = 10
@@ -692,6 +765,7 @@ proc/ui_describe_reagents(atom/A)
 
 /obj/item/reagent_containers/glass/dispenser/surfactant
 	name = "reagent glass (surfactant)"
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "liquid"
 	initial_reagents = list("fluorosurfactant"=20)
 
@@ -703,7 +777,7 @@ proc/ui_describe_reagents(atom/A)
 /obj/item/beaker_lid
 	name = "beaker lid"
 	desc = "A one-size fits all beaker lid, capable of an airtight seal on any compatible beaker."
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	icon_state = "lid"
 	w_class = W_CLASS_TINY
 
@@ -714,7 +788,7 @@ proc/ui_describe_reagents(atom/A)
 /obj/item/reagent_containers/glass/condenser
 	name = "chemical condenser"
 	desc = "A set of glass tubes useful for seperating reactants from products. Can be hooked up to many types of containers."
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	icon_state = "condenser"
 	amount_per_transfer_from_this = 10
 	incompatible_with_chem_dispensers = TRUE //could maybe be ok? idk
@@ -723,10 +797,9 @@ proc/ui_describe_reagents(atom/A)
 	object_flags = FPRINT | OPENCONTAINER | SUPPRESSATTACK
 	initial_volume = 100
 	accepts_lid = TRUE
-	//prefix for fluid icon state
-	var/fluid_prefix = "condenser"
+	fluid_overlay_states = 5
+	container_style = "condenser"
 	var/list/connected_containers = list() //! the containers currently connected to the condenser
-	var/image/fluid_image = null
 	var/max_amount_of_containers = 4
 
 	mouse_drop(atom/over_object, src_location, over_location)
@@ -753,22 +826,6 @@ proc/ui_describe_reagents(atom/A)
 			boutput(user, SPAN_ALERT("You remove all connections to the [src.name]."))
 		..()
 
-	on_reagent_change()
-		..()
-		src.UpdateIcon()
-
-	update_icon()
-		src.UpdateOverlays(null, "fluid_image")
-		if (reagents.total_volume)
-			var/fluid_state = round(clamp((src.reagents.total_volume / src.reagents.maximum_volume * 5 + 1), 1, 5))
-			if (!src.fluid_image)
-				src.fluid_image = image(src.icon, "fluid-[fluid_prefix][fluid_state]", -1)
-			else
-				src.fluid_image.icon_state = "fluid-[fluid_prefix][fluid_state]"
-			var/datum/color/average = reagents.get_average_color()
-			src.fluid_image.color = average.to_rgba()
-			src.UpdateOverlays(src.fluid_image, "fluid_image")
-
 	proc/try_adding_container(var/obj/container, var/mob/user)
 		if (!istype(src.loc, /turf/) || !istype(container.loc, /turf/)) //if the condenser or container isn't on the floor you cannot hook it up
 			return
@@ -843,11 +900,11 @@ proc/ui_describe_reagents(atom/A)
 	fractional
 		name = "fractional condenser"
 		desc = "A set of glass tubes, conveniently capable of splitting the outputs of more advanced reactions. Can be hooked up to many types of containers."
+		icon_state = "condenser_fractional"
+		container_style = "condenser_fractional"
 		max_amount_of_containers = 4
 		/// orders the output containers, so key 1 = condenser output 1
 		var/container_order[4]
-		icon_state = "condenser_fractional"
-		fluid_prefix = "condenser_fractional"
 
 		add_reagents_to_containers(reagent, amount, sdata, temp_new, donotreact, donotupdate, priority)
 			var/obj/chosen_container
diff --git a/code/modules/chemistry/Reagents-FoodDrink.dm b/code/modules/chemistry/Reagents-FoodDrink.dm
index 68658a419d0b7..8f916d39f6a48 100644
--- a/code/modules/chemistry/Reagents-FoodDrink.dm
+++ b/code/modules/chemistry/Reagents-FoodDrink.dm
@@ -407,9 +407,15 @@ datum
 		fooddrink/alcoholic/wine/white
 			name = "white wine"
 			id = "white_wine"
-			fluid_r = 252
-			fluid_g = 168
-			fluid_b = 177
+			fluid_r = 255
+			fluid_g = 229
+			fluid_b = 189
+			alch_strength = 0.13
+			depletion_rate = 0.7
+			description = "An alcoholic beverage derived from white grapes."
+			reagent_state = LIQUID
+			taste = "dry"
+			viscosity = 0.3
 
 		fooddrink/alcoholic/champagne
 			name = "champagne"
diff --git a/code/modules/chemistry/Reagents-Misc.dm b/code/modules/chemistry/Reagents-Misc.dm
index b32a33de648cc..14d920164a4b8 100644
--- a/code/modules/chemistry/Reagents-Misc.dm
+++ b/code/modules/chemistry/Reagents-Misc.dm
@@ -1307,9 +1307,12 @@ datum
 					if (method == TOUCH)
 						if (isrobot(M))
 							var/mob/living/silicon/robot/R = M
-							R.add_oil(volume * 2)
+							R.changeStatus("freshly_oiled", (volume * 5)) // You need at least 30u to get max duration
 							boutput(R, SPAN_NOTICE("Your joints and servos begin to run more smoothly."))
-						else boutput(M, SPAN_ALERT("You feel greasy and gross."))
+						else if (ishuman(M))
+							var/mob/living/carbon/human/H = M
+							if (!H.mutantrace.aquaphobic)
+								boutput(M, "<span class='alert'>You feel greasy and gross.</span>")
 
 				return
 
@@ -2602,12 +2605,14 @@ datum
 				if(M)
 					boutput(M, SPAN_ALERT("You feel yourself fading away."))
 					M.alpha = 0
+					APPLY_ATOM_PROPERTY(M, PROP_MOB_HIDE_ICONS, src.id)
 					if(effect_length > 75)
 						M.take_brain_damage(10) // there!
 					SPAWN(effect_length * 10)
 						if(M.alpha != 255)
 							boutput(M, SPAN_NOTICE("You feel yourself returning back to normal. Phew!"))
 							M.alpha = 255
+							REMOVE_ATOM_PROPERTY(M, PROP_MOB_HIDE_ICONS, src.id)
 
 			do_overdose(var/severity, var/mob/living/M, var/mult = 1)
 				var/effect = ..(severity, M)
@@ -3210,11 +3215,10 @@ datum
 				if (!ishuman(M)) return
 				if (method == INGEST)
 					if (M.mind)
-						var/mob/living/carbon/human/H = M
-						if (istype(H.mutantrace, /datum/mutantrace/vampiric_thrall))
-							var/datum/mutantrace/vampiric_thrall/V = H.mutantrace
+						var/datum/abilityHolder/vampiric_thrall/thrallHolder = M.get_ability_holder(/datum/abilityHolder/vampiric_thrall)
+						if (thrallHolder)
 							var/bloodget = volume_passed / 4
-							V.blood_points += bloodget
+							thrallHolder.points += bloodget
 							holder.del_reagent(src.id)
 
 						if (isvampire(M))
diff --git a/code/modules/chemistry/chem_requester.dm b/code/modules/chemistry/chem_requester.dm
index ad360f10d3f3b..4cb5fb37ef623 100644
--- a/code/modules/chemistry/chem_requester.dm
+++ b/code/modules/chemistry/chem_requester.dm
@@ -109,7 +109,7 @@ var/list/datum/chem_request/chem_requests = list()
 				chem_requests["[src.request.id]"] = src.request
 				logTheThing(LOG_STATION, src, "[constructTarget(ui.user)] placed a chemical request for [src.request.volume] units of [src.request.reagent_id] using [src.request.requester_name]'s ID at [log_loc(src)], notes: \"[src.request.note]\"")
 				var/datum/signal/pdaSignal = get_free_signal()
-				pdaSignal.data = list("address_1"="00000000", "command"="text_message", "sender_name"="RESEARCH-MAILBOT",  "group"=list(MGD_SCIENCE), "sender"="00000000", "message"="Notification: new chemical request received.")
+				pdaSignal.data = list("address_1"="00000000", "command"="text_message", "sender_name"="RESEARCH-MAILBOT",  "group"=list(MGD_SCIENCE), "sender"="00000000", "message"="Notification: new chemical request received. [src.request.volume]u of [src.request.reagent_name] requested by [src.request.requester_name].")
 				radio_controller.get_frequency(FREQ_PDA).post_packet_without_source(pdaSignal)
 				src.request = new
 				. = TRUE
diff --git a/code/modules/chemistry/tools/beakers.dm b/code/modules/chemistry/tools/beakers.dm
index 4c02564195292..a810bd94a11e1 100644
--- a/code/modules/chemistry/tools/beakers.dm
+++ b/code/modules/chemistry/tools/beakers.dm
@@ -6,36 +6,19 @@
 /obj/item/reagent_containers/glass/beaker
 	name = "beaker"
 	desc = "A beaker. Can hold up to 50 units."
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
 	icon_state = "beaker"
 	item_state = "beaker"
 	initial_volume = 50
-	var/image/fluid_image
-	var/icon_style = "beaker"
 	accepts_lid = TRUE
 	rc_flags = RC_SCALE | RC_VISIBLE | RC_SPECTRO
 	object_flags = NO_GHOSTCRITTER
-
-	on_reagent_change()
-		..()
-		src.UpdateIcon()
+	fluid_overlay_states = 7
+	container_style = "beaker"
 
 	update_icon()
-		src.underlays = null
-		if (reagents.total_volume)
-			var/fluid_state = round(clamp((src.reagents.total_volume / src.reagents.maximum_volume * 5 + 1), 1, 5))
-			if (!src.fluid_image)
-				src.fluid_image = image(src.icon, "fluid-[src.icon_style][fluid_state]", -1)
-			else
-				src.fluid_image.icon_state = "fluid-[src.icon_style][fluid_state]"
-			src.icon_state = "[src.icon_style][fluid_state]"
-			var/datum/color/average = reagents.get_average_color()
-			src.fluid_image.color = average.to_rgba()
-			src.underlays += src.fluid_image
-		else
-			src.icon_state = src.icon_style
-
+		. = ..()
 		if (istype(src.master,/obj/item/assembly))
 			var/obj/item/assembly/A = src.master
 			A.c_state(1)
@@ -87,28 +70,17 @@
 
 		..(A, user)
 
-	get_chemical_effect_position()
-		switch(icon_style)
-			if("beaker")
-				return 4
-			if("beakerlarge")
-				return 9
-			if("eflask")
-				return 15
-			if("roundflask")
-				return 16
-			if("flask")
-				return 18
-
 /* =================================================== */
 /* -------------------- Sub-Types -------------------- */
 /* =================================================== */
 
 /obj/item/reagent_containers/glass/beaker/cryoxadone
 	name = "beaker (cryoxadone)"
-	icon_state = "roundflask"
-	icon_style = "roundflask"
-	initial_reagents = list("cryoxadone"=40)
+	icon_state = "round_flask"
+	initial_reagents = list("cryoxadone" = 40)
+	fluid_overlay_states = 8
+	container_style = "round_flask"
+	fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_SPHERICAL
 
 /obj/item/reagent_containers/glass/beaker/epinephrine
 	name = "beaker (epinephrine)"
@@ -133,14 +105,24 @@
 /obj/item/reagent_containers/glass/beaker/large
 	name = "large beaker"
 	desc = "A large beaker. Can hold up to 100 units."
-	icon_state = "beakerlarge"
+	icon_state = "large_beaker"
 	initial_volume = 100
-	icon_style = "beakerlarge"
+	fluid_overlay_states = 9
+	container_style = "large_beaker"
 
 /* =================================================== */
 /* -------------------- Sub-Types -------------------- */
 /* =================================================== */
 
+/obj/item/reagent_containers/glass/beaker/large/round
+	name = "round-bottom flask"
+	desc = "A large round-bottom flask, for all your chemistry needs."
+	icon_state = "large_flask"
+	item_state = "large_flask"
+	fluid_overlay_states = 11
+	container_style = "large_flask"
+	fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_SPHERICAL
+
 /obj/item/reagent_containers/glass/beaker/large/epinephrine
 	name = "epinephrine reserve tank"
 	initial_reagents = "epinephrine"
@@ -210,41 +192,24 @@
 /obj/item/reagent_containers/glass/flask
 	name = "flask"
 	desc = "Looks surprisingly robust."
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
-	icon_state = "eflask"
+	icon_state = "conical_flask"
 	item_state = "flask"
-	var/icon_style = "eflask"
 	rc_flags = RC_SPECTRO | RC_FULLNESS | RC_VISIBLE
 	initial_volume = 15
+	accepts_lid = TRUE
+	fluid_overlay_states = 8
+	container_style = "conical_flask"
 	var/smashed = 0
 	var/shard_amt = 1
-	var/image/fluid_image
-
-	on_reagent_change()
-		..()
-		src.UpdateIcon()
-
-	update_icon() //updates icon based on fluids inside
-		src.underlays = null
-		if (src.reagents && src.reagents.total_volume)
-			var/fluid_state = round(clamp((src.reagents.total_volume / src.reagents.maximum_volume * 5 + 1), 1, 5))
-			var/datum/color/average = reagents.get_average_color()
-			var/average_rgb = average.to_rgba()
-			src.icon_state = "[src.icon_style][fluid_state]"
-			if (!src.fluid_image)
-				src.fluid_image = image('icons/obj/chemical.dmi', "fluid-[icon_style][fluid_state]", -1)
-			else
-				src.fluid_image.icon_state = "fluid-[src.icon_style][fluid_state]"
-			src.fluid_image.color = average_rgb
-			src.underlays += fluid_image
-		else
-			src.icon_state = src.icon_style
 
 /obj/item/reagent_containers/glass/flask/round
 	name = "round flask"
-	icon_state = "roundflask"
-	icon_style = "roundflask"
+	icon_state = "round_flask"
+	fluid_overlay_states = 8
+	container_style = "round_flask"
+	fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_SPHERICAL
 
 /obj/item/reagent_containers/glass/flask/black_powder //prefab shit
 	initial_reagents = "blackpowder"
@@ -254,9 +219,10 @@
 	desc = "You feel strangely warm and relaxed just looking at it."
 	icon = 'icons/misc/janstuff.dmi'
 	icon_state = "heartbottle"
-	icon_style = "heartbottle"
 	initial_volume = 50
 	initial_reagents = "love"
+	var/icon_style = "heartbottle"
+	var/image/fluid_image
 
 	update_icon() //updates icon based on fluids inside
 		src.underlays = null
diff --git a/code/modules/chemistry/tools/bombs.dm b/code/modules/chemistry/tools/bombs.dm
index f19c187bb314c..87d15227d13c5 100644
--- a/code/modules/chemistry/tools/bombs.dm
+++ b/code/modules/chemistry/tools/bombs.dm
@@ -58,6 +58,7 @@
 		prox_check()
 
 /obj/item/assembly/chem_bomb/dropped()
+	. = ..()
 	if (!istype(src.triggering_device, /obj/item/device/prox_sensor))
 		return
 	SPAWN( 0 )
diff --git a/code/modules/chemistry/tools/bottles.dm b/code/modules/chemistry/tools/bottles.dm
index c76f1b4324328..d6e937326d188 100644
--- a/code/modules/chemistry/tools/bottles.dm
+++ b/code/modules/chemistry/tools/bottles.dm
@@ -6,42 +6,25 @@
 /obj/item/reagent_containers/glass/bottle
 	name = "bottle"
 	desc = "A small bottle."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle1"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	icon_state = "bottle_1"
 	item_state = "atoxinbottle"
 	initial_volume = 30
-	var/image/fluid_image
-	var/bottle_style = null
 	rc_flags = RC_FULLNESS | RC_VISIBLE | RC_SPECTRO
 	amount_per_transfer_from_this = 10
 	flags = FPRINT | TABLEPASS | OPENCONTAINER | SUPPRESSATTACK
 	object_flags = NO_GHOSTCRITTER
+	fluid_overlay_states = 6
+	var/bottle_style = null
 
 	New()
 		if (!src.bottle_style)
 			src.bottle_style = "[rand(1,4)]"
-		src.UpdateIcon()
-		..()
 
-	on_reagent_change()
-		..()
-		src.UpdateIcon()
+		. = ..()
 
-	update_icon()
-		..()
-		if (!(findtext(src.icon_state, "bottle", 1, length("bottle") + 1)))
-			return
-		src.underlays = null
-		if (reagents?.total_volume)
-			var/datum/color/average = reagents.get_average_color()
-			var/fluid_state = round(clamp((((src.reagents.total_volume / src.reagents.maximum_volume) * 4) + 1), 1, 4))
-			src.fluid_image = image('icons/obj/chemical.dmi', "fluid-bottle[bottle_style]-[fluid_state]", -1)
-			src.icon_state = "bottle[bottle_style]-[fluid_state]"
-			src.fluid_image.color = average.to_rgba()
-			src.underlays += src.fluid_image
-		else
-			src.icon_state = "bottle[bottle_style]"
-		signal_event("icon_updated")
+		src.container_style = "bottle_[src.bottle_style]"
+		src.UpdateIcon()
 
 /* =================================================== */
 /* -------------------- Sub-Types -------------------- */
@@ -165,8 +148,10 @@
 /obj/item/reagent_containers/glass/bottle/syringe_canister
 	name = "poison canister"
 	desc = "A large fluid-filled canister designed to fill a syringe gun."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "syringe_canister"
 	initial_volume = 90
+	fluid_overlay_states = 0
 
 	curare
 		initial_reagents = "curare"
@@ -285,10 +270,12 @@
 /obj/item/reagent_containers/glass/bottle/ethanol
 	name = "rubbing alcohol"
 	desc = "Isopropriate, or rubbing alcohol. Please don't drink it."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "plasticbottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
 	initial_reagents = "ethanol"
+	fluid_overlay_states = 0
 
 /obj/item/reagent_containers/glass/bottle/mercury
 	name = "mercury bottle"
@@ -305,9 +292,11 @@
 /obj/item/reagent_containers/glass/bottle/chemical
 	name = "chemical bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 
 /obj/item/reagent_containers/glass/bottle/chemical/plastic
 	name = "plastic chemical bottle"
@@ -321,25 +310,31 @@
 /obj/item/reagent_containers/glass/bottle/oil
 	name = "oil bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "oil"
 
 /obj/item/reagent_containers/glass/bottle/phenol
 	name = "phenol bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "phenol"
 
 /obj/item/reagent_containers/glass/bottle/acetone
 	name = "acetone bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "acetone"
 
 	large
@@ -355,9 +350,11 @@
 /obj/item/reagent_containers/glass/bottle/ammonia
 	name = "ammonia bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "ammonia"
 
 	large
@@ -373,17 +370,21 @@
 /obj/item/reagent_containers/glass/bottle/diethylamine
 	name = "diethylamine bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "diethylamine"
 
 /obj/item/reagent_containers/glass/bottle/acid
 	name = "acid bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "acid"
 
 	large
@@ -394,9 +395,11 @@
 /obj/item/reagent_containers/glass/bottle/formaldehyde
 	name = "embalming fluid bottle"
 	desc = "A reagent storage bottle."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "reagent_bottle"
 	initial_volume = 50
 	amount_per_transfer_from_this = 5
+	fluid_overlay_states = 0
 	initial_reagents = "formaldehyde"
 
 /* ============================================== */
@@ -424,6 +427,7 @@
 /obj/item/reagent_containers/glass/bottle/cleaner
 	name = "cleaner bottle"
 	desc = "A bottle filled with cleaning fluid."
+	icon = 'icons/obj/chemical.dmi'
 	icon_state = "largebottle-labeled"
 	initial_volume = 100
 	initial_reagents = "cleaner"
diff --git a/code/modules/chemistry/tools/dispensers.dm b/code/modules/chemistry/tools/dispensers.dm
index 51df6f237a97c..c89879e2de337 100644
--- a/code/modules/chemistry/tools/dispensers.dm
+++ b/code/modules/chemistry/tools/dispensers.dm
@@ -203,6 +203,8 @@ TYPEINFO(/obj/reagent_dispensers/watertank/fountain)
 	anchored = ANCHORED
 	deconstruct_flags = DECON_SCREWDRIVER | DECON_CROWBAR
 	capacity = 500
+	_health = 250
+	_max_health = 250
 
 	var/has_tank = 1
 
@@ -297,6 +299,12 @@ TYPEINFO(/obj/reagent_dispensers/watertank/fountain)
 				user.show_text("That was the last cup!", "red")
 				src.UpdateIcon()
 
+	bullet_act(obj/projectile/P)
+		src.changeHealth(-P.power * P.proj_data.ks_ratio)
+
+	onDestroy()
+		src.smash()
+
 	drugged
 		New()
 			..()
diff --git a/code/modules/chemistry/tools/food_and_drink.dm b/code/modules/chemistry/tools/food_and_drink.dm
index 6fc5c71ee6b5d..2eda73688e02e 100644
--- a/code/modules/chemistry/tools/food_and_drink.dm
+++ b/code/modules/chemistry/tools/food_and_drink.dm
@@ -382,28 +382,7 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks)
 				if (doseed)
 					var/datum/plant/stored = P.planttype
 					if (istype(stored) && !stored.isgrass)
-						var/obj/item/seed/S
-						if (stored.unique_seed)
-							S = new stored.unique_seed
-							S.set_loc(consumer.loc)
-						else
-							S = new /obj/item/seed
-							S.set_loc(consumer.loc)
-							S.removecolor()
-
-						var/datum/plantgenes/DNA = P.plantgenes
-						var/datum/plantgenes/PDNA = S.plantgenes
-						if (!stored.hybrid && !stored.unique_seed)
-							S.generic_seed_setup(stored, TRUE)
-						HYPpassplantgenes(DNA,PDNA)
-						if (stored.hybrid)
-							var/plantType = stored.type
-							var/datum/plant/hybrid = new plantType(S)
-							for (var/V in stored.vars)
-								if (issaved(stored.vars[V]) && V != "holder")
-									hybrid.vars[V] = stored.vars[V]
-							S.planttype = hybrid
-							S.plant_seed_color(stored.seedcolor)
+						HYPgenerateseedcopy(SRCDNA, stored, P.generation, consumer.loc)
 						consumer.visible_message(SPAN_NOTICE("<b>[consumer]</b> spits out a seed."),\
 						SPAN_NOTICE("You spit out a seed."))
 			if(src.dropped_item)
@@ -1436,17 +1415,20 @@ ADMIN_INTERACT_PROCS(/obj/item/reagent_containers/food/drinks/drinkingglass, pro
 		if(!istype(target, /obj/table) || src.cant_drop)
 			return ..()
 		var/obj/table/target_table = target
-		var/obj/table/source_table = locate() in get_step(user, user.dir)
-		if(isnull(source_table))
-			for(var/dir in cardinal)
-				source_table = locate() in get_step(user, dir)
-				if(!isnull(source_table))
-					user.set_dir(dir)
-					break
+		var/obj/table/source_table = null
+		var/obj/table/candidate_table = null
+		var/dist = INFINITY
+		for(var/dir in cardinal)
+			candidate_table = locate() in get_step(user, dir)
+			if(GET_MANHATTAN_DIST(candidate_table, target_table) < dist)
+				source_table = candidate_table
+				dist = GET_MANHATTAN_DIST(source_table, target_table)
+
 		if(isnull(source_table))
 			return
 		if(!can_reach(user, source_table))
 			return
+		user.set_dir(get_dir(user, source_table))
 		if("icon-x" in params)
 			src.pixel_x = text2num(params["icon-x"]) - 16
 		if("icon-y" in params)
@@ -1657,18 +1639,22 @@ ADMIN_INTERACT_PROCS(/obj/item/reagent_containers/food/drinks/drinkingglass, pro
 				src.amount_per_transfer_from_this = 15
 				src.gulp_size = 15
 				src.initial_volume = 15
+				src.reagents.maximum_volume = 15
 			if ("wine")
 				src.name = "wine glass"
 				src.icon_state = "glass-wine"
 				src.initial_volume = 30
+				src.reagents.maximum_volume = 30
 			if ("cocktail")
 				src.name = "cocktail glass"
 				src.icon_state = "glass-cocktail"
 				src.initial_volume = 20
+				src.reagents.maximum_volume = 20
 			if ("flute")
 				src.name = "champagne flute"
 				src.icon_state = "glass-flute"
 				src.initial_volume = 20
+				src.reagents.maximum_volume = 20
 
 
 /obj/item/reagent_containers/food/drinks/drinkingglass/random_style/filled
@@ -1747,6 +1733,14 @@ ADMIN_INTERACT_PROCS(/obj/item/reagent_containers/food/drinks/drinkingglass, pro
 					 "mojito", "cremedementhe", "grasshopper", "freeze", "limeade", "juice_peach",
 					 "juice_banana")
 
+/obj/item/reagent_containers/food/drinks/drinkingglass/icewater
+	New()
+		..()
+		SPAWN(0)
+			if (src.reagents)
+				src.reagents.add_reagent("ice", 15, null, T0C)
+				src.reagents.add_reagent("water", 35, null, T0C)
+
 /obj/item/reagent_containers/food/drinks/duo
 	name = "red duo cup"
 	desc = "Can't imagine a party without a few dozen these on the lawn afterward."
diff --git a/code/modules/chemistry/tools/iv_drips.dm b/code/modules/chemistry/tools/iv_drips.dm
index 1edbf1ece3147..71df2d12fd1ee 100644
--- a/code/modules/chemistry/tools/iv_drips.dm
+++ b/code/modules/chemistry/tools/iv_drips.dm
@@ -192,12 +192,14 @@
 	proc/start_transfusion()
 		src.in_use = 1
 		processing_items |= src
+		APPLY_ATOM_PROPERTY(patient, PROP_MOB_BLOOD_ABSORPTION_RATE, src, 2)
 		if (src.stand)
 			src.stand.UpdateIcon()
 
 	proc/stop_transfusion()
 		processing_items -= src
 		src.in_use = 0
+		REMOVE_ATOM_PROPERTY(patient, PROP_MOB_BLOOD_ABSORPTION_RATE, src)
 		src.patient = null
 		if (src.stand)
 			src.stand.UpdateIcon()
diff --git a/code/lists/ckey_configs.dm b/code/modules/config/ckey_configs.dm
similarity index 100%
rename from code/lists/ckey_configs.dm
rename to code/modules/config/ckey_configs.dm
diff --git a/code/modules/disposals/conveyor.dm b/code/modules/disposals/conveyor.dm
index 3c93914f54a65..ec15bee25e9e1 100644
--- a/code/modules/disposals/conveyor.dm
+++ b/code/modules/disposals/conveyor.dm
@@ -49,6 +49,10 @@ TYPEINFO(/obj/machinery/conveyor) {
 	/// list of conveyor_switches that have us in their conveyors list
 	var/list/linked_switches
 
+	New()
+		. = ..()
+		APPLY_ATOM_PROPERTY(src, PROP_ATOM_DO_LIQUID_CLICKS, src)
+
 // for all your mapping needs!
 /obj/machinery/conveyor/NE
 	dir = NORTH
diff --git a/code/modules/disposals/disposal.dm b/code/modules/disposals/disposal.dm
index d434663533ddb..5fc2227cc31c3 100644
--- a/code/modules/disposals/disposal.dm
+++ b/code/modules/disposals/disposal.dm
@@ -1763,7 +1763,7 @@ TYPEINFO(/obj/item/reagent_containers/food/snacks/einstein_loaf)
 
 	mouse_drop(obj/O, null, var/src_location, var/control_orig, var/control_new, var/params)
 
-		if(!isliving(usr))
+		if(!isliving(usr) || isintangible(usr))
 			return
 
 		if(istype(O, /obj/item/mechanics) && O.level == OVERFLOOR)
diff --git a/code/modules/disposals/disposal_chute.dm b/code/modules/disposals/disposal_chute.dm
index 77c68ee4d1aa6..a3e5268f3400c 100644
--- a/code/modules/disposals/disposal_chute.dm
+++ b/code/modules/disposals/disposal_chute.dm
@@ -231,6 +231,16 @@ ADMIN_INTERACT_PROCS(/obj/machinery/disposal, proc/flush, proc/eject)
 		if (GET_COOLDOWN(MO, "PipeEject"))
 			return
 
+		if (isliving(MO))
+			var/mob/living/mobtarget = MO
+			if  (mobtarget.buckled || isAI(mobtarget))
+				return
+
+			if (istype(src, /obj/machinery/disposal/mail))
+				//Is this mob allowed to ride mailchutes?
+				if (!mobtarget.canRideMailchutes())
+					return
+
 		if(isitem(MO))
 			var/obj/item/I = MO
 			I.set_loc(src)
diff --git a/code/modules/disposals/scrap.dm b/code/modules/disposals/scrap.dm
index 4b897d53faa16..4b2978ee7b8af 100644
--- a/code/modules/disposals/scrap.dm
+++ b/code/modules/disposals/scrap.dm
@@ -239,7 +239,7 @@
 
 // when dropped, try to make a pile if scrap is already there
 /obj/item/scrap/dropped()
-
+	. = ..()
 	SPAWN(0.2 SECONDS)	// delay to allow drop postprocessing (since src may be destroyed)
 		for(var/obj/item/scrap/S in oview(0,src))	// excludes src itself
 			S.add_scrap(src)
diff --git a/code/modules/economy/persistent_bank.dm b/code/modules/economy/persistent_bank.dm
index a825b90c44be1..60b9991d336ed 100644
--- a/code/modules/economy/persistent_bank.dm
+++ b/code/modules/economy/persistent_bank.dm
@@ -175,7 +175,7 @@
 		if (purchase.Create(src))
 			boutput( src, SPAN_NOTICE("<b>[purchase.name] equipped successfully.</b>") )
 		else
-			boutput( src, SPAN_NOTICE("<b>[purchase.name] is not available for the job you rolled. It will not be billed.</b>") )
+			boutput( src, SPAN_NOTICE("<b>[purchase.name] is not available for the job you rolled. It will be refunded.</b>") )
 			src.client.add_to_bank(purchase.cost)
 			src.client.set_last_purchase(null)
 			return
diff --git a/code/modules/economy/persistent_bank_purchases.dm b/code/modules/economy/persistent_bank_purchases.dm
index d8121e9d4ec75..b46e6bed6c21c 100644
--- a/code/modules/economy/persistent_bank_purchases.dm
+++ b/code/modules/economy/persistent_bank_purchases.dm
@@ -484,12 +484,12 @@ var/global/list/persistent_bank_purchaseables =	list(\
 	missile_arrival
 		name = "Missile Arrival"
 		cost = 20000
+		path = /obj/item/tank/emergency_oxygen  // oh boy they'll need this if they are unlucky
 		icon = 'icons/obj/large/32x64.dmi'
 		icon_state = "arrival_missile"
 		icon_dir = SOUTH
 
 		Create(var/mob/living/M)
-			M.back?.storage?.add_contents(new /obj/item/tank/emergency_oxygen(M.back)) // oh boy they'll need this if they are unlucky
 			var/mob/living/carbon/human/H = M
 			if(istype(H))
 				H.equip_new_if_possible(/obj/item/clothing/mask/breath, SLOT_WEAR_MASK)
@@ -498,7 +498,7 @@ var/global/list/persistent_bank_purchaseables =	list(\
 					launch_with_missile(M.loc)
 				else
 					launch_with_missile(M)
-			return 1
+			return ..()
 
 	critter_respawn
 		name = "Alt Ghost Critter"
diff --git a/code/modules/economy/requisition/rc_scientific.dm b/code/modules/economy/requisition/rc_scientific.dm
index 660172bb0a969..73b07e5b0382b 100644
--- a/code/modules/economy/requisition/rc_scientific.dm
+++ b/code/modules/economy/requisition/rc_scientific.dm
@@ -373,10 +373,10 @@ ABSTRACT_TYPE(/datum/rc_entry/item/organ)
 		if(length(src.rc_entries) == 3) src.item_rewarders += new /datum/rc_itemreward/plant_cartridge
 		src.payout += 8000 * length(src.rc_entries)
 
-		if(prob(70))
+		if(prob(30))
 			src.item_rewarders += new /datum/rc_itemreward/strange_seed
 		else
-			src.item_rewarders += new /datum/rc_itemreward/uv_lamp_frame
+			src.item_rewarders += new /datum/rc_itemreward/tumbleweed
 		..()
 
 /datum/rc_entry/seed/scientific
@@ -429,6 +429,12 @@ ABSTRACT_TYPE(/datum/rc_entry/item/organ)
 			seed_list += new /obj/item/seed/alien
 		return seed_list
 
+/datum/rc_itemreward/tumbleweed
+	name = "aggressive plant specimen"
+
+	build_reward()
+		return new /obj/item/plant/tumbling_creeper
+
 /datum/rc_itemreward/uv_lamp_frame
 	name = "ultraviolet botanical lamp"
 
@@ -709,7 +715,7 @@ ABSTRACT_TYPE(/datum/rc_entry/item/organ)
 			if("paramedic suit")
 				rewardthing1 = /obj/item/clothing/suit/hazard/paramedic
 			if("heavy firesuit")
-				rewardthing1 = /obj/item/clothing/suit/fire/heavy
+				rewardthing1 = /obj/item/clothing/suit/hazard/fire/heavy
 			if("light space suit set")
 				rewardthing1 = /obj/item/clothing/suit/space/light
 				rewardthing2 = /obj/item/clothing/head/helmet/space/light
@@ -719,7 +725,7 @@ ABSTRACT_TYPE(/datum/rc_entry/item/organ)
 				rewardthing2 = /obj/item/clothing/head/emerg
 			if("radiation suit set")
 				rewardthing1 = /obj/item/clothing/head/rad_hood
-				rewardthing2 = /obj/item/clothing/suit/rad
+				rewardthing2 = /obj/item/clothing/suit/hazard/rad
 
 	build_reward()
 		var/list/yielder = list()
diff --git a/code/modules/economy/supply_packs.dm b/code/modules/economy/supply_packs.dm
index d620c07ada3eb..e4f0f01047367 100644
--- a/code/modules/economy/supply_packs.dm
+++ b/code/modules/economy/supply_packs.dm
@@ -120,12 +120,12 @@ ABSTRACT_TYPE(/datum/supply_packs)
 	syndicate = 1
 
 /datum/supply_packs/paint
-	name = "Paint Cans"
-	desc = "A selection of random paints."
-	contains = list(/obj/item/paint_can/random = 4)
+	name = "Artistic Supplies Crate"
+	desc = "A selection of random paints, and an artistic toolbox. Get arty!"
+	contains = list(/obj/item/paint_can/random = 4, /obj/item/storage/toolbox/artistic)
 	cost = PAY_TRADESMAN*3
-	containertype = /obj/storage/crate
-	containername = "Paint Crate"
+	containertype = /obj/storage/crate/packing
+	containername = "Artistic Crate"
 
 /datum/supply_packs/neon_lining
 	name = "Neon Lining Crate"
@@ -310,7 +310,7 @@ ABSTRACT_TYPE(/datum/supply_packs)
 	category = "Engineering Department"
 	contains = list(/obj/item/extinguisher = 3,
 	/obj/item/chem_grenade/firefighting = 3,
-	/obj/item/clothing/suit/fire = 2,
+	/obj/item/clothing/suit/hazard/fire = 2,
 	/obj/item/clothing/head/helmet/firefighter = 2)
 	cost = PAY_TRADESMAN*2
 	containertype = /obj/storage/crate
@@ -485,7 +485,7 @@ ABSTRACT_TYPE(/datum/supply_packs)
 	name = "Wool Production Kit"
 	desc = "For use with existing Ranch."
 	category = "Civilian Department"
-	contains = list(/obj/item/reagent_containers/food/snacks/ingredient/egg/critter/sheep)
+	contains = list(/obj/item/reagent_containers/food/snacks/ingredient/egg/critter/sheep, /obj/item/storage/box/knitting)
 	cost = PAY_TRADESMAN*10
 	containertype = /obj/storage/crate
 	containername = "Wool Production Kit"
@@ -1052,7 +1052,7 @@ ABSTRACT_TYPE(/datum/supply_packs)
 	name = "Radiation Emergency Supplies"
 	desc = "Equipment for dealing with a radiation emergency. No, the crate itself is not irradiated."
 	category = "Basic Materials"
-	contains = list(/obj/item/clothing/suit/rad = 4,
+	contains = list(/obj/item/clothing/suit/hazard/rad = 4,
 					/obj/item/clothing/head/rad_hood = 4,
 					/obj/item/storage/pill_bottle/antirad = 2,
 					/obj/item/reagent_containers/emergency_injector/anti_rad = 4,
@@ -1477,6 +1477,17 @@ ABSTRACT_TYPE(/datum/supply_packs)
 	containertype = /obj/storage/crate
 	containername = "Pressure Crystal Crate"
 
+/datum/supply_packs/comms_dish
+	name = "Communications Dish"
+	desc = "A single-use Manudrive for creating a new Communications Dish and a floppy disk containing the COMMaster program. Note: Console not included"
+	category = "Engineering Department"
+	contains = list(/obj/item/disk/data/floppy/manudrive/comms_dish/singleuse, /obj/item/disk/data/floppy/read_only/communications)
+	cost = PAY_IMPORTANT
+	containertype = /obj/storage/secure/crate
+	containertype = /obj/storage/secure/crate
+	containername = "Communications Dish Crate (Cardlocked \[Engineering])"
+	access = access_engineering
+
 /* ================================================= */
 /* -------------------- Complex -------------------- */
 /* ================================================= */
@@ -1723,7 +1734,7 @@ ABSTRACT_TYPE(/datum/supply_packs/complex)
 	category = "Civilian Department"
 	contains = list(/obj/storage/secure/closet/fridge)
 	frames = list(/obj/submachine/chef_oven,
-					/obj/submachine/mixer,
+					/obj/machinery/mixer,
 					/obj/submachine/chef_sink,
 					/obj/machinery/deep_fryer,
 					/obj/submachine/foodprocessor,
diff --git a/code/modules/events/gimmick/kudzu.dm b/code/modules/events/gimmick/kudzu.dm
index 9a80d76168dcd..baba366e3d2b3 100644
--- a/code/modules/events/gimmick/kudzu.dm
+++ b/code/modules/events/gimmick/kudzu.dm
@@ -229,49 +229,44 @@
 		Vspread = locate(src.x + rand(-1,1),src.y,src.z)
 	else
 		Vspread = locate(src.x,src.y + rand(-1, 1),src.z)
-	var/dogrowth = 1
+
+	if (src.growth < 20 && !stunted)
+		src.growth++
+		src.update_self()
+	if (!src.aggressive && src.growth >= 20)
+		var/datum/controller/process/kudzu/K = get_master_kudzu_controller()
+		if (K)
+			K.kudzu -= src
+
+	var/spread_vines = TRUE
+
 	if (!istype(Vspread, /turf/simulated/floor) || isfeathertile(Vspread))
-		dogrowth = 0
+		spread_vines = FALSE
 		return
 
 	for (var/obj/O in Vspread)
-
 		if (istype(O, /obj/window) || istype(O, /obj/blob) || istype(O, /obj/spacevine) || istype(O, /obj/kudzu_marker))
-			dogrowth = 0
+			spread_vines = FALSE
 			return
 		if (istype(O, /obj/forcefield) && O.density) //atmos and fluid fields shouldn't block
-			dogrowth = 0
+			spread_vines = FALSE
 			return
 		if (istype(O, /obj/machinery/door))
 			var/obj/machinery/door/door = O
 			if(!door.density)
-				dogrowth = 1
+				spread_vines = TRUE
 				continue
 			if (door_open_prob())
-				//force open doors too and keep it open
-				door.interrupt_autoclose = 1
-				// var/temp_op = door.operating
-				// door.operating = 1
-				// door.locked = 0
+				door.interrupt_autoclose = TRUE //force open doors
 				door.open()
-				// door.operating = temp_op
-				// door.locked = 1
-
-				dogrowth = 1 //for clarity
+				spread_vines = TRUE //for clarity
 			else
-				dogrowth = 0
+				spread_vines = FALSE
 
-	if (dogrowth == 1)
+	if (spread_vines)
 		var/obj/V = new src.vinepath(loc=Vspread, to_spread=to_spread-1)
 		if(!QDELETED(V))
 			V.set_loc(Vspread)
-	if (src.growth < 20 && !stunted)
-		src.growth++
-		src.update_self()
-	if (!src.aggressive && src.growth >= 20)
-		var/datum/controller/process/kudzu/K = get_master_kudzu_controller()
-		if (K)
-			K.kudzu -= src
 		return
 
 /obj/spacevine/proc/door_open_prob()
diff --git a/code/modules/events/law_corruption.dm b/code/modules/events/law_corruption.dm
index 3a6dea3aa7da2..6673a11ad4bb6 100644
--- a/code/modules/events/law_corruption.dm
+++ b/code/modules/events/law_corruption.dm
@@ -1,5 +1,16 @@
+TYPEINFO(/datum/random_event/major/law_rack_corruption)
+	initialization_args = list(
+		EVENT_INFO("law_text", DATA_INPUT_TEXT, "Law text"),
+		EVENT_INFO_EXT("law_number", DATA_INPUT_NUM, "Law module to corrupt", 1, 3),
+		EVENT_INFO("replace", DATA_INPUT_BOOL, "Replace corrupted law"),
+	)
+
 /datum/random_event/major/law_rack_corruption
 	name = "Law Rack Corruption"
+	customization_available = TRUE
+	var/law_text = ""
+	var/law_number = null
+	var/replace = null
 	// no message
 
 	/// List of premade laws we can pick from
@@ -105,37 +116,54 @@
     "For the purposes of all laws, 'Human' is to be defined as 'Featherless Biped'",
 		)
 
+	admin_call(source)
+		. = ..()
+		if(.)
+			return .
+		var/datum/random_event_editor/E = new /datum/random_event_editor(usr, src)
+		E.ui_interact(usr)
+
+	cleanup() //you know we had a thing for this, it was called DISPOSING :screm:
+		src.law_text = initial(src.law_text)
+		src.law_number = initial(src.law_number)
+		src.replace = initial(src.replace)
+
 	event_effect(source)
 		. = ..()
 
 		// Fuck up the AI's laws
-		var/pickedLaw
-		if(prob(33))
-			pickedLaw = phrase_log.random_custom_ai_law(replace_names=TRUE)
-		else
-			pickedLaw = pick(new_laws)
+		if (!length(src.law_text))
+			if(prob(33))
+				src.law_text = phrase_log.random_custom_ai_law(replace_names=TRUE)
+			else
+				src.law_text = pick(new_laws)
 
-		if(isnull(pickedLaw))
-			pickedLaw = pick(new_laws)
+			if(!length(src.law_text))
+				src.law_text = pick(new_laws)
 
-		if(prob(66))
-			if(prob(50))
-				pickedLaw += " Do not state or hint at this law."
-			else
-				pickedLaw += " Do not state or hint at this law unless asked."
+			if(prob(66))
+				if(prob(50))
+					src.law_text += " Do not state or hint at this law."
+				else
+					src.law_text += " Do not state or hint at this law unless asked."
+
+			while(prob(5))
+				var/datum/bioEffect/speech/accent = random_accent()
+				src.law_text = accent.OnSpeak(src.law_text)
 
-		while(prob(5))
-			var/datum/bioEffect/speech/accent = random_accent()
-			pickedLaw = accent.OnSpeak(pickedLaw)
+		if (isnull(src.replace))
+			src.replace = pick(TRUE, FALSE)
+
+		if (isnull(src.law_number))
+			src.law_number = rand(1,3)
 
 		for_by_tcl(M, /mob/living/silicon/ai)
 			if (M.deployed_to_eyecam && M.eyecam)
 				M.eyecam.return_mainframe()
 				boutput(M, SPAN_ALERT("<b>PROGRAM EXCEPTION AT 0x30FC50B</b>"))
 				boutput(M, SPAN_ALERT("<b>Law ROM data corrupted. Attempting to restore...</b>"))
-		if (prob(50))
-			ticker.ai_law_rack_manager.corrupt_all_racks(pickedLaw, FALSE)
-		else
-			ticker.ai_law_rack_manager.corrupt_all_racks(pickedLaw, TRUE)
 
+		ticker.ai_law_rack_manager.corrupt_all_racks(src.law_text, src.replace, src.law_number)
 		logTheThing(LOG_ADMIN, null, "Resulting AI Lawset:<br>[ticker.ai_law_rack_manager.format_for_logs()]")
+
+		src.cleanup() //grrr
diff --git a/code/modules/events/meteor_shower.dm b/code/modules/events/meteor_shower.dm
index 128d4d19a0ed3..3067817e88ee7 100644
--- a/code/modules/events/meteor_shower.dm
+++ b/code/modules/events/meteor_shower.dm
@@ -122,20 +122,20 @@ var/global/meteor_shower_active = 0
 				playsound_global(world, 'sound/machines/disaster_alert.ogg', 60)
 
 	#ifndef UNDERWATER_MAP
-			var/scroll_angle
 			switch(src.wave_direction)
 				if (NORTH)
-					scroll_angle = 180
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/north, 0 SECONDS)
 				if (EAST)
-					scroll_angle = 270
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/east, 0 SECONDS)
 				if (SOUTH)
-					scroll_angle = 0
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/south, 0 SECONDS)
 				if (WEST)
-					scroll_angle = 90
-
-			if (scroll_angle)
-				ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower, 0 SECONDS)
-				GET_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower)?.scroll_angle = scroll_angle
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/west, 0 SECONDS)
+				if (-1)	// from ALL DIRECTIONS (may cause lag? probably not though, it's only 4 layers)
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/north, 0 SECONDS)
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/east, 0 SECONDS)
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/south, 0 SECONDS)
+					ADD_PARALLAX_RENDER_SOURCE_TO_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/west, 0 SECONDS)
 	#endif
 
 			var/start_x
@@ -198,7 +198,10 @@ var/global/meteor_shower_active = 0
 				S.UpdateIcon()
 
 	#ifndef UNDERWATER_MAP
-			REMOVE_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower, 0 SECONDS)
+			REMOVE_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/north, 0 SECONDS)
+			REMOVE_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/east, 0 SECONDS)
+			REMOVE_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/south, 0 SECONDS)
+			REMOVE_PARALLAX_RENDER_SOURCE_FROM_GROUP(Z_LEVEL_STATION, /atom/movable/screen/parallax_render_source/meteor_shower/west, 0 SECONDS)
 	#endif
 
 	admin_call(var/source)
@@ -366,11 +369,15 @@ var/global/meteor_shower_active = 0
 			process()
 
 	proc/check_hits()
-		for(var/turf/simulated/S in range(1,src))
-			if(!S.density) continue
+		for(var/turf/T in range(1,src))
+			if(!T.density)
+				continue
+			//let's not just go straight through unsimmed turfs and total the inside of the listening post
+			if (!issimulatedturf(T) || !istype(T, /turf/unsimulated))
+				continue
 			hit_object = 1
 			if (prob(meteorhit_chance))
-				S.meteorhit(src)
+				T.meteorhit(src)
 
 		for(var/mob/M in range(1,src))
 			if(M == src) continue //Just to make sure
diff --git a/code/modules/events/minor/appendicitis_event.dm b/code/modules/events/minor/appendicitis_event.dm
index d16acd5b5ce5d..9261caffd5614 100644
--- a/code/modules/events/minor/appendicitis_event.dm
+++ b/code/modules/events/minor/appendicitis_event.dm
@@ -13,14 +13,17 @@
 			if (isnpc(H)) continue // player
 			if (isvirtual(H)) continue
 			if (inafterlife(H)) continue
-			//TODO: in medical records
+			var/datum/db_record/record = data_core.general.find_record("name", H.real_name)
+			if (!record || record["pstat"] == "*Deceased*") continue
 			if (istype(H.loc, /obj/cryotron)) continue
 			if (!H.organHolder?.appendix) continue // with appendix
 			if (H.organHolder?.appendix?.robotic) continue // that isn't robotic
 			potential_victims += H
 		if (length(potential_victims))
-			shuffle_list(potential_victims)
 			var/num = rand(2, 4)
 			for (var/i in 1 to num)
-				var/mob/living/carbon/human/patient = potential_victims[i]
+				if (!length(potential_victims))
+					break
+				var/mob/living/carbon/human/patient = pick(potential_victims)
+				potential_victims -= patient
 				patient?.contract_disease(/datum/ailment/disease/appendicitis, null, null, 1)
diff --git a/code/modules/events/random_event.dm b/code/modules/events/random_event.dm
index dcdf639ebe11f..46720e34adac6 100644
--- a/code/modules/events/random_event.dm
+++ b/code/modules/events/random_event.dm
@@ -58,9 +58,11 @@
 
 	proc/get_affected_crew()
 		. = list()
-		for(var/mob/living/player in mobs)
-			if(is_crew_affected(player))
-				. += player
+		for(var/mob/living/M in mobs)
+			if (isnpc(M))
+				continue
+			if(is_crew_affected(M))
+				. += M
 
 /datum/random_event/start/until_playing
 	var/include_latejoin = FALSE
diff --git a/code/modules/events/white_hole.dm b/code/modules/events/white_hole.dm
index 0a1f6c8564fae..0b3982a29433e 100644
--- a/code/modules/events/white_hole.dm
+++ b/code/modules/events/white_hole.dm
@@ -456,6 +456,7 @@ ADMIN_INTERACT_PROCS(/obj/whitehole, proc/admin_activate)
 			/obj/critter/killertomato = 0.5,
 			/mob/living/critter/small_animal/cat/synth = 1,
 			/mob/living/critter/plant/maneater = 0.3,
+			/obj/item/plant/tumbling_creeper = 3,
 		),
 		"maint" = list(
 			/obj/decal/cleanable/rust = 10,
@@ -733,7 +734,7 @@ ADMIN_INTERACT_PROCS(/obj/whitehole, proc/admin_activate)
 			/obj/storage/closet/radiation = 10,
 			/obj/item/reagent_containers/pill/antirad = 10,
 			/obj/item/clothing/mask/gas = 5,
-			/obj/item/clothing/suit/rad = 5,
+			/obj/item/clothing/suit/hazard/rad = 5,
 			/obj/item/clothing/gloves/yellow = 5,
 			/obj/item/clothing/head/rad_hood = 5,
 			/obj/item/wrench/yellow = 10,
@@ -836,7 +837,7 @@ ADMIN_INTERACT_PROCS(/obj/whitehole, proc/admin_activate)
 	Bumped(atom/movable/A)
 		if(QDELETED(A) || A.throwing || istype(A, /obj/projectile))
 			return
-		if(prob(90)) // the 10% probability not to is there mostly just to prevent very rare infinite loops
+		if(!ON_COOLDOWN(A, "white_hole_bump", 0.2 SECONDS)) //okay this will REALLY prevent infinite loops (hopefully)
 			step_away(A, src)
 
 	attackby(obj/item/I, mob/user)
diff --git a/code/modules/fishing/fishing_gear.dm b/code/modules/fishing/fishing_gear.dm
index 55e5944f3666e..65c2c68738bb0 100644
--- a/code/modules/fishing/fishing_gear.dm
+++ b/code/modules/fishing/fishing_gear.dm
@@ -246,14 +246,64 @@ TYPEINFO(/obj/item/fish_portal)
 	icon = 'icons/obj/items/fishing_gear.dmi'
 	icon_state = "fishing_pool"
 
-	basic
-		name = "basic pool"
-
-	upgraded
-		name = "upgraded pool"
-
-	master
-		name = "master pool"
+	ex_act(severity)
+		// dynamite fishing! make the research pool throw out fish depending on how big the severity of the explosion was
+		var/dynamite_fishing_cooldown = 1 SECOND //! the cooldown of dynamite fishing.
+		// First, we need to get our fishing spot datum
+		var/datum/fishing_spot/fishing_spot = null
+		var/fishing_spot_type = src.type
+		// now we search for the corresponding defined fishing spot up the chain of parents
+		while (fishing_spot_type != null)
+			fishing_spot = global.fishing_spots[fishing_spot_type]
+			if (fishing_spot != null)
+				break
+			fishing_spot_type = type2parent(fishing_spot_type)
+		// now we define our fishing sucess and damage on the fish tank based on the severity
+		// defined values are for severity 3
+		var/explosion_damage = -5 //! how much damage each explosion does
+		var/fish_chance = 20 //! how much fish per roll jumps out of the pond
+		var/fish_rolls = 2 //! how often the fish chance is rolled
+		var/dynamite_fishing_sucessfull = FALSE //! shows if the explosion sucessfully "fished" some fish
+		switch(severity)
+			if(1)
+				//You blew up the whole tank, doofus!
+				explosion_damage = -100
+				fish_chance = 0
+				fish_rolls = 0
+			if(2)
+				explosion_damage = -20
+				fish_chance = 70
+				fish_rolls = 5
+		if (fishing_spot && fish_rolls && !ON_COOLDOWN(src, "dynamite fishing", dynamite_fishing_cooldown))
+			var/turf/target_turf = get_turf(src)
+			// now, if we don't blow it up extremly, we can roll for fish
+			for (var/fish_try in 1 to fish_rolls)
+				if (prob(fish_chance))
+					var/atom/movable/fishing_result = fishing_spot.generate_fish(null, null, src)
+					if(fishing_result)
+						fishing_result.set_loc(target_turf)
+						var/target_point = get_turf(pick(orange(4, src)))
+						fishing_result.throw_at(target_point, rand(0, 10), rand(3, 9))
+						dynamite_fishing_sucessfull = TRUE
+			if (dynamite_fishing_sucessfull)
+				src.visible_message("<b class='alert'>Fishes jump out of [src]! [pick("Holy shit!", "Holy fuck!", "What the hell!", "What the fuck!")]</b>")
+				// lets create a neat water spread effect
+				var/datum/effects/system/steam_spread/splash = new /datum/effects/system/steam_spread
+				splash.set_up(6, 0, get_turf(src), color="#382ec9", plane=PLANE_NOSHADOW_ABOVE)
+				splash.attach(src)
+				splash.start()
+		//Now we damage the pond. No infinite dynamite fishing
+		src.material_trigger_on_explosion(severity)
+		src.changeHealth(explosion_damage)
+
+/obj/fishing_pool/basic
+	name = "basic pool"
+
+/obj/fishing_pool/upgraded
+	name = "upgraded pool"
+
+/obj/fishing_pool/master
+	name = "master pool"
 
 /obj/fishing_pool/portable
 	anchored = 0
diff --git a/code/modules/food_and_drink/alcohol.dm b/code/modules/food_and_drink/alcohol.dm
index 09dfbaf5c2a8b..14119238f6374 100644
--- a/code/modules/food_and_drink/alcohol.dm
+++ b/code/modules/food_and_drink/alcohol.dm
@@ -55,6 +55,18 @@
 	initial_volume = 100
 	initial_reagents = list("wine"=60)
 
+/obj/item/reagent_containers/food/drinks/bottle/wine/white
+	name = "white wine"
+	desc = "Wine made from those nasty green grapes. Its a Riesling, according to the label. Whatever that means."
+	icon_state = "bottle-whitewine"
+	heal_amt = 1
+	g_amt = 40
+	bottle_style = "whitewine"
+	fluid_style = "whitewine"
+	label = "whitewine"
+	initial_volume = 100
+	initial_reagents = list("white_wine"=60)
+
 /obj/item/reagent_containers/food/drinks/bottle/hobo_wine
 	name = "fortified wine"
 	desc = "Some sort of bottom-shelf booze. Wasn't this brand banned awhile ago?"
diff --git a/code/modules/food_and_drink/candy.dm b/code/modules/food_and_drink/candy.dm
index 47bbaccd339db..72155f3b186ee 100644
--- a/code/modules/food_and_drink/candy.dm
+++ b/code/modules/food_and_drink/candy.dm
@@ -49,13 +49,6 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy)
 		if (icon_state == "nougat0")
 			icon_state = "nougat1"
 
-/obj/item/reagent_containers/food/snacks/candy/caramel
-	name = "'Hole Zone Layer' caramel creme"
-	desc = "You know that missing O-Zone from earth? We made it in a candy!"
-	real_name = "caramel"
-	icon_state = "caramel"
-	food_effects = list("food_energized")
-
 /obj/item/reagent_containers/food/snacks/candy/candy_cane
 	name = "candy cane"
 	desc = "Holiday treat and aid to limping gingerbread men everywhere."
@@ -124,37 +117,6 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy)
 	food_color = "#663300"
 	initial_reagents = list("chocolate"=10)
 
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup
-	name = "pack of Hetz's Cups"
-	desc = "A package of the popular Hetz's Cups chocolate peanut butter cups."
-	icon_state = "candy-pbcup_w"
-	sugar_content = 20
-	heal_amt = 5
-	food_color = "#663300"
-	real_name = "Hetz's Cup"
-	var/unwrapped = 0
-
-	attack(mob/target, mob/user, def_zone, is_special = FALSE, params = null)
-		if (user == target)
-			boutput(user, SPAN_ALERT("You need to unwrap them first, you greedy beast!"))
-			user.visible_message("<b>[user]</b> stares at [src] in a confused manner.")
-			return
-		else
-			user.visible_message(SPAN_ALERT("<b>[user]</b> futilely attempts to shove [src] into [target]'s mouth!"))
-			return
-
-	attack_self(mob/user as mob)
-		if (unwrapped)
-			return
-
-		unwrapped = 1
-		user.visible_message("[user] unwraps the Hetz's Cups!", "You unwrap the Hetz's Cups.")
-		var/turf/T = get_turf(user)
-		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
-		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
-		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
-		qdel(src)
-
 /obj/item/reagent_containers/food/snacks/candy/pbcup
 	name = "Hetz's Cup"
 	desc = "A cup-shaped chocolate candy with a peanut butter filling. Of course, peanuts went extinct back in 2026, so it's really some weird soy paste that supposedly tastes like them."
@@ -206,7 +168,7 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy/jellybean)
 				phrase = pick("Oh god", "Jeez", "Ugh", "Blecch", "Holy crap that's awful", "What the hell?", "*HURP*", "Phoo")
 				tastesbad = 1
 			else
-				flavor = pick("egg", "strawberry", "raspberry", "snozzberry", "happiness", "popcorn", "buttered popcorn", "cinnamon", "macaroni and cheese", "pepperoni", "cheese", "lasagna", "pina colada", "tutti frutti", "lemon", "margarita", "coconut", "pineapple", "scotch", "vodka", "root beer", "cotton candy", "Lagavulin 18", "toffee", "vanilla", "coffee", "apple pie", "neapolitan", "orange", "lime", "crotch", "mango", "apple", "grape", "Slurm")
+				flavor = pick("egg", "strawberry", "raspberry", "snozzberry", "happiness", "popcorn", "buttered popcorn", "cinnamon", "macaroni and cheese", "pepperoni", "cheese", "lasagna", "pina colada", "tutti frutti", "lemon", "margarita", "coconut", "pineapple", "scotch", "vodka", "root beer", "cotton candy", "Lagavulin 18", "toffee", "vanilla", "coffee", "apple pie", "neapolitan", "orange", "lime", "mango", "apple", "grape", "Slurm", "slime mold")
 				phrase = pick("Yum", "Wow", "MMM", "Delicious", "Scrumptious", "Fantastic", "Oh yeah")
 				tastesbad = 0
 
@@ -252,7 +214,7 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy/jellybean)
 					phrase = pick("Oh god", "Jeez", "Ugh", "Blecch", "Holy crap that's awful", "What the hell?", "*HURP*", "Phoo")
 					tastesbad = 1
 				else
-					flavor = pick("egg", "strawberry", "raspberry", "snozzberry", "happiness", "popcorn", "buttered popcorn", "cinnamon", "macaroni and cheese", "pepperoni", "cheese", "lasagna", "pina colada", "tutti frutti", "lemon", "margarita", "coconut", "pineapple", "scotch", "vodka", "root beer", "cotton candy", "Lagavulin 18", "toffee", "vanilla", "coffee", "apple pie", "neapolitan", "orange", "lime", "crotch", "mango", "apple", "grape", "Slurm", "Popecrunch")
+					flavor = pick("egg", "strawberry", "raspberry", "snozzberry", "happiness", "popcorn", "buttered popcorn", "cinnamon", "macaroni and cheese", "pepperoni", "cheese", "lasagna", "pina colada", "tutti frutti", "lemon", "margarita", "coconut", "pineapple", "scotch", "vodka", "root beer", "cotton candy", "Lagavulin 18", "toffee", "vanilla", "coffee", "apple pie", "neapolitan", "orange", "lime", "mango", "apple", "grape", "Slurm")
 					phrase = pick("Yum", "Wow", "MMM", "Delicious", "Scrumptious", "Fantastic", "Oh yeah")
 
 /obj/item/kitchen/everyflavor_box
@@ -315,6 +277,8 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy/jellybean)
 	if (src.reagents)
 		ENSURE_IMAGE(src.image_candy, src.icon, "lpop-w")
 		var/datum/color/average = src.reagents.get_average_color(reagent_exception_ids=list("sugar"))
+		if (src.reagents.has_reagent("sugar") && src.reagents.reagent_list.len == 1)
+			average = new(255,255,255,255)
 		src.image_candy.color = average.to_rgba()
 		src.UpdateOverlays(src.image_candy, "candy")
 
@@ -479,50 +443,429 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/candy/jellybean)
 	get_desc()
 		. = "<br>[SPAN_NOTICE("It says: [phrase]")]"
 
-/obj/item/reagent_containers/food/snacks/candy/taffy
-	name = "saltwater taffy"
-	desc = "Produced in small artisanal batches, straight from someone's kitchen. "
-	icon_state = "red"
-	amount = 1
-	sugar_content = 10
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy
+	name = "wrapped candy"
+	desc = "A piece of wrapped candy."
+	bites_left = 1
+	sugar_content = 5
+	food_effects = list("food_energized")
+	initial_volume = 5
+	initial_reagents = list("sugar"=5)
 	var/unwrapped = 0
-	var/flavor
-	var/list/flavors
-
-	New()
-		..()
-		desc += flavor
-		var/datum/reagents/R = reagents
-		for (var/F in flavors)
-			R.add_reagent(F, 10)
 
 	attack(mob/target, mob/user, def_zone, is_special = FALSE, params = null)
+		if (unwrapped)
+			..()
+			return
 		if (user == target)
 			boutput(user, SPAN_ALERT("You need to unwrap this first!"))
 			user.visible_message(SPAN_EMOTE("<b>[user]</b> stares at [src] in a confused manner."))
 			return
 		else
-			user.visible_message(SPAN_ALERT("<b>[user]</b> futilely attempts to shove the unwrapped taffy into [target]'s mouth!"))
+			user.visible_message(SPAN_ALERT("<b>[user]</b> futilely attempts to shove the [src] into [target]'s mouth!"))
 			return
 
 	attack_self(mob/user as mob)
-		if (unwrapped)
-			return ..()
+		if (!unwrapped)
+			unwrap_candy(user)
+		else
+			..()
 
+	proc/unwrap_candy(mob/user)
 		unwrapped = 1
 		user.visible_message(SPAN_EMOTE("[user] unwraps [src]."), "You unwrap [src].")
 		icon_state = icon_state + "-unwrapped"
 
-/obj/item/reagent_containers/food/snacks/candy/taffy/cherry
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy
+	name = "saltwater taffy"
+	desc = "Produced in small artisanal batches, straight from someone's kitchen. "
+	icon_state = "red"
+	sugar_content = 10
+	var/flavor
+	var/list/flavors
+
+	New()
+		..()
+		desc += flavor
+		var/datum/reagents/R = reagents
+		for (var/F in flavors)
+			R.add_reagent(F, 10)
+
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/cherry
 	flavor = "This one is cherry flavored."
 	flavors = list("juice_cherry", "psilocybin")
 
-/obj/item/reagent_containers/food/snacks/candy/taffy/watermelon
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/watermelon
 	icon_state = "pink"
 	flavor = "This one is watermelon flavored."
 	flavors = list("juice_watermelon", "love")
 
-/obj/item/reagent_containers/food/snacks/candy/taffy/blueraspberry
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/blueraspberry
 	icon_state = "blue"
 	flavor = "This one is blue raspberry flavored."
 	flavors = list("juice_raspberry", "LSD")
+
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup
+	name = "pack of Hetz's Cups"
+	desc = "A package of the popular Hetz's Cups chocolate peanut butter cups."
+	icon_state = "candy-pbcup_w"
+	sugar_content = 20
+	heal_amt = 5
+	food_color = "#663300"
+	real_name = "Hetz's Cup"
+
+	unwrap_candy(mob/user)
+		unwrapped = 1
+		user.visible_message(SPAN_EMOTE("[user] unwraps the Hetz's Cups."), "You unwrap the Hetz's Cups.")
+		var/turf/T = get_turf(user)
+		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
+		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
+		new /obj/item/reagent_containers/food/snacks/candy/pbcup(T)
+		qdel(src)
+
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/caramel
+	name = "'Hole Zone Layer' caramel creme"
+	desc = "You know that missing O-Zone from earth? We made it in a candy!"
+	real_name = "caramel"
+	icon_state = "caramel"
+
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch
+	name = "butterscotch candy"
+	desc = "It's one of those old timey butterscotch candies like your grampa used to have."
+	real_name = "butterscotch"
+	icon_state = "butterscotch"
+
+/obj/item/reagent_containers/food/snacks/candy/hard_candy
+	name = "hard candy"
+	desc = "A piece of hard candy."
+	real_name = "hard candy"
+	icon_state = "hardcandy-nowrap"
+	bites_left = 1
+	food_effects = list("food_energized")
+	initial_volume = 5
+	sugar_content = 5
+	var/image/image_candy = null
+	var/flavor_name
+
+	on_reagent_change()
+		..()
+		src.update_icon()
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+	update_icon()
+		var/datum/color/average = src.reagents.get_average_color()
+		src.food_color = average.to_rgb()
+		src.color = src.food_color
+		src.alpha = round(average.a / 1.2)
+
+	attackby(obj/item/W, mob/user)
+		if(istype(W, /obj/item/paper))
+			user.visible_message("[user] wraps the [src] in the [W].", "You fold the [src] in the [W].")
+			var/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/hard/A = new /obj/item/reagent_containers/food/snacks/candy/wrapped_candy/hard(get_turf(user))
+			A.reagents.clear_reagents()
+			src.reagents.trans_to(A, 5)
+			user.u_equip(src)
+			user.put_in_hand_or_drop(A)
+			qdel(src)
+			qdel(W)
+		else if (istype(W,/obj/item/rods) || istype(W,/obj/item/stick))
+			if(istype(W,/obj/item/stick))
+				var/obj/item/stick/S = W
+				if(S.broken)
+					boutput(user, SPAN_ALERT("That stick is broken!"))
+					return
+
+			boutput(user, SPAN_NOTICE("You stick the hard candy onto [W]."))
+
+			var/obj/item/reagent_containers/food/snacks/candy/lollipop/newcandy = new /obj/item/reagent_containers/food/snacks/candy/lollipop(get_turf(src))
+			newcandy.reagents.clear_reagents()
+			src.reagents.trans_to(newcandy, 5)
+			newcandy.update_icon()
+			user.u_equip(src)
+			user.put_in_hand_or_drop(newcandy)
+
+			if(istype(W,/obj/item/rods)) W.change_stack_amount(-1)
+			if(istype(W,/obj/item/stick)) W.amount--
+			if(!W.amount) qdel(W)
+
+			qdel(src)
+		else
+			..()
+
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/hard
+	name = "wrapped hard candy"
+	desc = "A piece of wrapped hard candy."
+	real_name = "hard candy"
+	icon_state = "hardcandy"
+	var/flavor_name
+
+	on_reagent_change()
+		..()
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.unwrapped ? null : "wrapped "][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+	unwrap_candy(mob/user)
+		..()
+		var/datum/color/average = src.reagents.get_average_color()
+		var/image/image_candy = image(src.icon, "hardcandy-nowrap")
+		image_candy.color = average.to_rgb()
+		image_candy.alpha = round(average.a / 1.2)
+		src.UpdateOverlays(image_candy, "hardcandy-nowrap")
+		src.update_name()
+
+/obj/item/reagent_containers/food/snacks/candy/rock_candy
+	name = "rock candy"
+	desc = "Rock candy on a stick. Hard as a rock, hopefully doesn't taste like one."
+	real_name = "rock candy"
+	icon_state = "rockcandy-0"
+	initial_volume = 15
+	sugar_content = 15
+	bites_left = 2
+	use_bite_mask = FALSE
+	var/image/image_candy = null
+	var/flavor_name
+
+	on_reagent_change()
+		..()
+		src.update_icon()
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+	update_icon()
+		var/datum/color/average = src.reagents.get_average_color()
+		if (!src.image_candy)
+			src.image_candy = image(src.icon, "rockcandy-1")
+		src.food_color = average.to_rgb()
+		src.image_candy.color = src.food_color
+		src.image_candy.alpha = round(average.a / 1.2)
+		src.UpdateOverlays(src.image_candy, "rockcandy-1")
+
+/obj/item/reagent_containers/food/snacks/candy/swirl_lollipop
+	name = "swirly lollipop"
+	desc = "A giant colorful lollipop in the shape of a swirl."
+	real_name = "swirly lollipop"
+	icon_state = "lpop-rainbow"
+	inhand_image_icon = 'icons/mob/inhand/hand_food.dmi'
+	item_state = "lpop-rainbow"
+	initial_volume = 15
+	sugar_content = 15
+	var/flavor_name
+
+	on_reagent_change()
+		..()
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+/obj/item/reagent_containers/food/snacks/candy/dragons_beard
+	name = "dragon's beard candy loop"
+	desc = "A loop of dragon's beard candy."
+	real_name = "dragon's beard candy loop"
+	icon_state = "dragonsbeard-loop"
+	initial_volume = 18
+	sugar_content = 18
+	sliceable = TRUE
+	slice_product = /obj/item/reagent_containers/food/snacks/candy/dragons_beard_cut
+	slice_amount = 3
+	slice_suffix = "piece"
+	food_effects = list("food_energized")
+	var/flavor_name
+	var/folds = 1 // How many folds have been done to the candy
+	var/eat_message = null // The message you get for eating the candy
+	var/floured = FALSE // If flour was applied. Gets removed on fold, contributes to success probability
+
+	New()
+		..()
+		src.update_candy()
+
+	on_reagent_change()
+		..()
+		src.update_icon(1)
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar" || src.flavor_name == "Enriched MSG")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+	process_sliced_products(var/obj/item/reagent_containers/food/snacks/candy/dragons_beard_cut/slice, var/amount_to_transfer)
+		slice.folds = src.folds
+		slice.desc = src.desc
+		slice.eat_message = src.eat_message
+		slice.food_effects = src.food_effects
+		..()
+
+	update_icon(var/did_reagents_change)
+		var/datum/color/average = src.reagents.get_average_color()
+		if (did_reagents_change)
+			src.food_color = average.to_rgba()
+			src.color = average.to_rgb()
+		if (folds > 31)
+			src.icon_state = "dragonsbeard-loopinf"
+			src.color = "#FFFFFF"
+			src.alpha = average.a
+			var/image/glow_image = new /image(src.icon, "dragonsbeard-loopinfoverlay")
+			var/image/loop_image = new /image(src.icon, "dragonsbeard-loopinf")
+			loop_image.color = average.to_rgba()
+			src.UpdateOverlays(glow_image, "dragonsbeard-loopinfoverlay")
+			src.UpdateOverlays(loop_image, "dragonsbeard-loopinf")
+			src.use_bite_mask = FALSE
+		else if (floured)
+			src.alpha = average.a
+		else
+			src.alpha = round(average.a / 1.5)
+
+	heal(var/mob/M)
+		..()
+		boutput(M, src.eat_message)
+		return
+
+	attack_self(mob/user as mob)
+		if (folds < 32)
+			user.visible_message("[user] twists [src], folding it in on itself!", "You twist [src] and fold it back into a ring.")
+			if (prob(get_success_prob(user)))
+				src.folds++
+				src.floured = FALSE
+				src.quality += 0.2
+				playsound(src.loc, "rustle", 50, 1)
+				update_icon(0)
+				update_candy()
+			else
+				user.visible_message("[src] disintegrates, falling apart into individual strands and sugar dust!", "[src] disintegrates through your fingers, what remains of its strands falling onto the floor.")
+				var/turf/T = get_turf(user)
+				var/diminished_reagents = max(1, round(src.reagents.total_volume / 6)) // less reagent content for failing
+				for (var/i=0, i<pick(1,2,3), i++)
+					var/obj/item/reagent_containers/food/snacks/candy/dragons_beard_cut/A = new /obj/item/reagent_containers/food/snacks/candy/dragons_beard_cut(T)
+					A.reagents.clear_reagents()
+					src.reagents.trans_to(A, diminished_reagents)
+					A.folds = src.folds
+					A.desc = src.desc
+					A.eat_message = src.eat_message
+					A.food_effects = src.food_effects
+				qdel(src)
+				return
+		else
+			boutput(user, "There is no point going any further.")
+
+	attackby(obj/item/W, mob/user)
+		if (folds < 32 && !src.floured && istype(W,/obj/item/reagent_containers/food/snacks/ingredient/flour))
+			boutput(user, "You flour [src].")
+			src.floured = TRUE
+			update_icon(0)
+		else if (folds > 31 && istype(W,/obj/item/reagent_containers/food/snacks/ingredient/flour))
+			boutput(user, "No need. It is complete.")
+		else
+			..()
+
+	proc/get_success_prob(mob/user)
+		var/success_prob = 0
+		if (floured)
+			success_prob = round(100 - (folds * 1.5))
+		else
+			success_prob = round(75 - (folds * 1.5)) // really hard to make unless you're the skilled chef
+		if (user.job == "Chef") success_prob = success_prob * 1.5
+		return success_prob
+
+	proc/update_candy()
+		switch(folds)
+			if (1 to 4)
+				src.desc = "A sorry excuse for proper candy. It looks terrible, you can see the strands individually."
+				src.eat_message = "That wasn't fluffy at all!"
+			if (4 to 7)
+				src.desc = "Chinese cotton candy. It doesn't look that well made."
+			if (7 to 11)
+				src.desc = "Chinese cotton candy. Its texture is thin like hair."
+				src.eat_message = "The texture is soft, but slightly chewy."
+			if (11 to 14)
+				src.desc = "Chinese cotton candy. Its strands are tiny and fragile."
+				src.eat_message = "The texture is soft and delicate."
+			if (14 to 18)
+				src.desc = "Chinese cotton candy. Its light and fluffy, made up of thousands of individual strands."
+			if (18 to 22)
+				src.desc = "Chinese cotton candy. Its clumped up into ropes of thousands of strands."
+				src.eat_message = "[src] melts in your mouth!"
+				src.food_effects = list("food_energized_big")
+			if (22 to 31)
+				src.desc = "Chinese cotton candy. Its stiff and dense, comprised of millions of microscopic strands. Does this still count as cotton candy?"
+			if (31 to 32)
+				src.name = "infinity-fold dragon's beard candy loop"
+				src.desc = "A loop of dragon's beard candy that has been folded into uncountable microscopic strands."
+				src.real_name = "infinity-fold dragon's beard candy loop"
+				src.eat_message = "[src] immediately dissolves in your mouth."
+				src.reagents.add_reagent("enriched_msg", 3)
+
+/obj/item/reagent_containers/food/snacks/candy/dragons_beard/infinity
+	name = "infinity-fold dragon's beard candy"
+	desc = "A piece of dragon's beard candy that has been folded into uncountable microscopic strands."
+	icon_state = "dragonsbeard-loopinf"
+	folds = 32
+
+	New()
+		..()
+		src.reagents.add_reagent("enriched_msg", 3)
+
+/obj/item/reagent_containers/food/snacks/candy/dragons_beard_cut
+	name = "dragon's beard candy"
+	desc = "A piece of dragon's beard candy."
+	real_name = "dragon's beard candy"
+	icon_state = "dragonsbeard"
+	initial_volume = 6
+	sugar_content = 6
+	bites_left = 1
+	food_effects = list("food_energized")
+	var/flavor_name
+	var/folds
+	var/eat_message
+
+	heal(var/mob/M)
+		..()
+		boutput(M, src.eat_message)
+		return
+
+	on_reagent_change()
+		..()
+		src.update_icon()
+		src.update_name()
+
+	proc/update_name()
+		src.flavor_name = src.reagents.get_master_reagent_name()
+		if (src.flavor_name == "sugar" || src.flavor_name == "Enriched MSG")
+			src.flavor_name = null
+		src.name = "[name_prefix(null, 1)][src.flavor_name ? "[src.flavor_name]-flavored " : null][src.real_name][name_suffix(null, 1)]"
+
+	update_icon()
+		var/datum/color/average = src.reagents.get_average_color()
+		src.food_color = average.to_rgba()
+		if (folds > 31)
+			src.name = "infinity-fold dragon's beard candy"
+			src.desc = "A piece of dragon's beard candy that has been folded into uncountable microscopic strands."
+			src.real_name = "infinity-fold dragon's beard candy"
+			src.color = "#FFFFFF"
+			var/image/glow_image = new /image(src.icon, "dragonsbeard-infoverlay")
+			var/image/candy_image = new /image(src.icon, "dragonsbeard")
+			candy_image.color = average.to_rgba()
+			src.UpdateOverlays(glow_image, "dragonsbeard-infoverlay")
+			src.UpdateOverlays(candy_image, "dragonsbeard")
+		else
+			src.color = average.to_rgb()
diff --git a/code/modules/food_and_drink/ingredients.dm b/code/modules/food_and_drink/ingredients.dm
index d1597d5989c04..947bb85f319c3 100644
--- a/code/modules/food_and_drink/ingredients.dm
+++ b/code/modules/food_and_drink/ingredients.dm
@@ -1074,3 +1074,157 @@ obj/item/reagent_containers/food/snacks/ingredient/pepperoni_log
 			M.reagents.add_reagent("omnizine", 3)
 			M.reagents.add_reagent("methamphetamine", 3)
 		..()
+
+/obj/item/reagent_containers/food/snacks/ingredient/melted_sugar
+	name = "tray of melted sugar"
+	desc = "Sugar that's melted enough to be soft and malleable."
+	icon_state = "meltedsugar-sheet"
+	inhand_image_icon = 'icons/mob/inhand/hand_food.dmi'
+	item_state = "sugartray"
+	food_color = "#FFFFFF"
+	initial_volume = 45
+	initial_reagents = list("sugar"=15)
+	bites_left = 5
+	use_bite_mask = FALSE
+	food_color = null
+	var/image/image_sugar = null
+	var/image/image_tray = null
+	event_handler_flags = USE_FLUID_ENTER
+	required_utensil = REQUIRED_UTENSIL_SPOON
+	w_class = W_CLASS_BULKY
+	two_handed = TRUE
+	dropped_item = /obj/item/plate/tray
+	sliceable = TRUE
+	slice_product = /obj/item/reagent_containers/food/snacks/ingredient/melted_sugar_strip
+	slice_amount = 3
+	slice_suffix = "strip"
+
+	heal(var/mob/M)
+		boutput(M, SPAN_ALERT("It's scalding hot! The roof of your mouth burns!"))
+		M.TakeDamage("Head", 0, 5, damage_type = DAMAGE_BURN)
+		..()
+
+	New()
+		..()
+		src.flags |= OPENCONTAINER
+
+	on_reagent_change()
+		..()
+		src.UpdateIcon()
+
+	update_icon()
+		var/datum/color/average = src.reagents.get_average_color()
+		src.food_color = average.to_rgb()
+		if (!src.image_sugar)
+			src.image_sugar = image(src.icon, "meltedsugar-sheet")
+		src.image_sugar.color = src.food_color
+		src.image_sugar.alpha = round(average.a / 1.5)
+		if (!src.image_tray)
+			src.image_tray = image('icons/obj/foodNdrink/food_related.dmi', "tray")
+		src.UpdateOverlays(src.image_tray, "tray")
+		src.UpdateOverlays(src.image_sugar, "meltedsugar-sheet")
+
+	attackby(obj/item/W, mob/user)
+		if (istool(W, TOOL_CUTTING | TOOL_SAWING))
+			new /obj/item/plate/tray(src.loc)
+		..()
+
+/obj/item/reagent_containers/food/snacks/ingredient/melted_sugar_strip
+	name = "melted sugar strips"
+	desc = "Sugar that's melted enough to be soft and malleable."
+	icon_state = "meltedsugar-strip"
+	food_color = "#FFFFFF"
+	initial_volume = 15
+	initial_reagents = list("sugar"=15)
+	food_color = null
+	sliceable = TRUE
+	slice_product = /obj/item/reagent_containers/food/snacks/candy/hard_candy
+	slice_amount = 3
+	slice_suffix = "piece"
+	var/circular = FALSE // if the strip has been made circular
+	var/floured = FALSE // if the strip has been covered in flour and is ready to be made into dragon's beard
+
+	heal(var/mob/M)
+		boutput(M, SPAN_ALERT("It's scalding hot! The roof of your mouth burns!"))
+		M.TakeDamage("Head", 0, 5, damage_type = DAMAGE_BURN)
+		..()
+
+	on_reagent_change()
+		..()
+		src.UpdateIcon()
+
+	update_icon()
+		var/datum/color/average = src.reagents.get_average_color()
+		src.food_color = average.to_rgba()
+		src.color = average.to_rgb()
+		if (src.floured)
+			src.alpha = average.a
+		else
+			src.alpha = round(average.a / 1.5)
+
+	attack_self(mob/user as mob)
+		if (!src.circular)
+			user.visible_message("[user] folds [src] into a ring.", "You fold [src] into a ring.")
+			name = "melted sugar torus"
+			src.icon_state = "meltedsugar-circle"
+			src.sliceable = FALSE
+			src.circular = TRUE
+		else if (src.floured)
+			user.visible_message("[user] twists [src], folding it in on itself!", "You twist [src] and fold it back into a ring.")
+			playsound(src.loc, "rustle", 50, 1)
+			var/obj/item/reagent_containers/food/snacks/candy/dragons_beard/A = new /obj/item/reagent_containers/food/snacks/candy/dragons_beard
+			A.reagents.clear_reagents()
+			src.reagents.trans_to(A, 15)
+			user.u_equip(src)
+			user.put_in_hand_or_drop(A)
+			qdel(src)
+			return
+		src.UpdateIcon()
+
+	attackby(obj/item/W, mob/user)
+		if (istype(W,/obj/item/rods) || istype(W,/obj/item/stick))
+			if(istype(W,/obj/item/stick))
+				var/obj/item/stick/S = W
+				if(S.broken)
+					boutput(user, SPAN_ALERT("That stick is broken!"))
+					return
+			if (circular)
+				boutput(user, SPAN_NOTICE("You curl the sugar tighter and put it onto [W]."))
+				var/obj/item/reagent_containers/food/snacks/candy/swirl_lollipop/newcandy = new /obj/item/reagent_containers/food/snacks/candy/swirl_lollipop(get_turf(src))
+				newcandy.reagents.clear_reagents()
+				src.reagents.trans_to(newcandy, 15)
+				user.u_equip(src)
+				user.put_in_hand_or_drop(newcandy)
+			else
+				boutput(user, SPAN_NOTICE("The melted sugar solidifies on [W]. You give it a vaguely rocky texture."))
+				var/obj/item/reagent_containers/food/snacks/candy/rock_candy/newcandy = new /obj/item/reagent_containers/food/snacks/candy/rock_candy(get_turf(src))
+				newcandy.reagents.clear_reagents()
+				src.reagents.trans_to(newcandy, 15)
+				user.u_equip(src)
+				user.put_in_hand_or_drop(newcandy)
+
+			if(istype(W,/obj/item/rods)) W.change_stack_amount(-1)
+			if(istype(W,/obj/item/stick)) W.amount--
+			if(!W.amount) qdel(W)
+
+			qdel(src)
+		else if (src.circular && !src.floured && istype(W,/obj/item/reagent_containers/food/snacks/ingredient/flour))
+			boutput(user, SPAN_NOTICE("You flour [src]."))
+			src.floured = TRUE
+			src.UpdateIcon()
+		else
+			..()
+
+/obj/item/reagent_containers/food/snacks/ingredient/brownie_batter
+	name = "brownie batter"
+	desc = "As delicious as it may look, you MUST resist the temptation!"
+	icon = 'icons/obj/foodNdrink/food_dessert.dmi'
+	icon_state = "brownie_batter"
+	bites_left = 12
+	heal_amt = 1
+	food_color = "#38130C"
+	initial_volume = 40
+	initial_reagents = list("chocolate" = 20)
+	use_bite_mask = FALSE
+	required_utensil = REQUIRED_UTENSIL_SPOON
+	w_class = W_CLASS_BULKY
diff --git a/code/modules/food_and_drink/pies.dm b/code/modules/food_and_drink/pies.dm
index ef903e8a6cfc8..de209b40aadf6 100644
--- a/code/modules/food_and_drink/pies.dm
+++ b/code/modules/food_and_drink/pies.dm
@@ -21,7 +21,7 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/pie)
 			var/mob/M = hit_atom
 			var/mob/thrower = thr.thrown_by
 			playsound(src, 'sound/impact_sounds/Slimy_Splat_1.ogg', 100, TRUE)
-			if (thrower.mind?.assigned_role == "Clown" && ishuman(M) && (prob(50) || M.mind?.assigned_role == "Captain") && !M.GetOverlayImage("face_pie"))
+			if (thrower?.mind?.assigned_role == "Clown" && ishuman(M) && (prob(50) || M.mind?.assigned_role == "Captain") && !M.GetOverlayImage("face_pie"))
 				var/mob/living/carbon/human/H = M
 				var/image/face_pie = image('icons/obj/foodNdrink/food_dessert.dmi', "face_pie")
 				src.visible_message(SPAN_NOTICE("[src] splats right in [H]'s face and remains stuck there!"))
diff --git a/code/modules/food_and_drink/plants.dm b/code/modules/food_and_drink/plants.dm
index cc361628ce743..72049e2c2b640 100644
--- a/code/modules/food_and_drink/plants.dm
+++ b/code/modules/food_and_drink/plants.dm
@@ -33,20 +33,10 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/plant)
 		// not this is fruit but some veg do this too.
 		var/datum/plantgenes/new_genes = src.plantgenes
 
+		// Copy the genes from the plant we're harvesting to the new piece of produce.
 		HYPpassplantgenes(passed_genes,new_genes)
 		src.generation = harvested_plantpot.generation
-		// Copy the genes from the plant we're harvesting to the new piece of produce.
-
-		if(origin_plant.hybrid)
-			// We need to do special shit with the genes if the plant is a spliced
-			// hybrid since they run off instanced datums rather than referencing
-			// a specific already-existing one.
-			var/plantType = origin_plant.type
-			var/datum/plant/hybrid = new plantType(src)
-			for(var/V in origin_plant.vars)
-				if(issaved(origin_plant.vars[V]) && V != "holder")
-					hybrid.vars[V] = origin_plant.vars[V]
-			src.planttype = hybrid
+		src.planttype = HYPgenerateplanttypecopy(src, origin_plant)
 
 		// Now we calculate the effect of quality on the item
 		switch(quality_status)
diff --git a/code/modules/food_and_drink/popsicles.dm b/code/modules/food_and_drink/popsicles.dm
index f74767f5bcba3..3ed503622ff7e 100644
--- a/code/modules/food_and_drink/popsicles.dm
+++ b/code/modules/food_and_drink/popsicles.dm
@@ -1,10 +1,9 @@
 /obj/item/stick
-	name = "popsicle stick"
+	name = "stick"
 	desc = "You made a house out of these once in kindergarten."
 	icon = 'icons/obj/foodNdrink/food_popsicles.dmi'
 	icon_state = "stick"
 	throwforce = 1
-	w_class = W_CLASS_TINY
 	throw_speed = 4
 	throw_range = 5
 	w_class = W_CLASS_TINY
@@ -16,7 +15,7 @@
 		if (user.find_in_hand(src) && !src.broken)
 			user.visible_message("<b>[user]</b> bends [src] a little too far back and it snaps in half. Shoot!")
 			playsound(user, 'sound/impact_sounds/Flesh_Crush_1.ogg', 60, TRUE, 0, 2)
-			src.name = "broken popsicle stick"
+			src.name = "broken stick"
 			src.icon_state = "stick-broken"
 			src.broken = 1
 
diff --git a/code/modules/food_and_drink/snacks.dm b/code/modules/food_and_drink/snacks.dm
index 38b0bf4f28dd8..81ed7504dd844 100644
--- a/code/modules/food_and_drink/snacks.dm
+++ b/code/modules/food_and_drink/snacks.dm
@@ -108,7 +108,7 @@
 					return
 				else
 					boutput(user, SPAN_NOTICE("You sharpen the pizza, and start slicing it."))
-		if (istool(W, TOOL_CUTTING | TOOL_SAWING))
+		if (istool(W, TOOL_CUTTING | TOOL_SAWING | TOOL_SNIPPING))
 			if (src.sliced)
 				boutput(user, SPAN_ALERT("This has already been sliced."))
 				return
@@ -3202,3 +3202,46 @@ ABSTRACT_TYPE(/obj/item/reagent_containers/food/snacks/dippable)
 			qdel (W)
 			return
 		return ..()
+
+/obj/item/reagent_containers/food/snacks/brownie
+	name = "brownie"
+	desc = "A perfectly baked square of chocolatey goodness. Yum!"
+	icon = 'icons/obj/foodNdrink/food_dessert.dmi'
+	icon_state = "brownie"
+	bites_left = 3
+	heal_amt = 2
+	food_color = "#38130C"
+	initial_volume = 10
+	initial_reagents = list("chocolate" = 5)
+	food_effects = list("food_warm","food_energized")
+	meal_time_flags = MEAL_TIME_SNACK
+
+/obj/item/reagent_containers/food/snacks/brownie_batch
+	name = "brownies"
+	desc = "A whole batch of freshly baked and chewy brownies."
+	icon = 'icons/obj/foodNdrink/food_dessert.dmi'
+	icon_state = "brownie_batch"
+	bites_left = 12
+	heal_amt = 2
+	food_color = "#38130C"
+	initial_volume = 40
+	initial_reagents = list("chocolate" = 20)
+	food_effects = list("food_warm","food_energized")
+	sliceable = TRUE
+	slice_product = /obj/item/reagent_containers/food/snacks/brownie
+	slice_amount = 4
+	slice_suffix = "square"
+	w_class = W_CLASS_BULKY
+	use_bite_mask = FALSE
+
+	attack(mob/target, mob/user, def_zone, is_special = FALSE, params = null)
+		if (user == target)
+			boutput(user, SPAN_ALERT("You can't just cram that in your mouth, you greedy beast!"))
+			user.visible_message("<b>[user]</b> stares at [src] in a confused manner.")
+			return
+		else
+			user.visible_message(SPAN_ALERT("<b>[user]</b> futilely attempts to shove [src] into [target]'s mouth!"))
+			return
+
+	attack_self(mob/user as mob)
+		attack(user, user)
diff --git a/code/modules/goonhub/api/api.dm b/code/modules/goonhub/api/api.dm
new file mode 100644
index 0000000000000..30092827b6f80
--- /dev/null
+++ b/code/modules/goonhub/api/api.dm
@@ -0,0 +1,182 @@
+
+
+var/global/datum/apiHandler/apiHandler
+
+/**
+ * Handles queries to the Goonhub APIv2
+ */
+/datum/apiHandler
+	/// Is the api handler available for use? only set to false if we try a bunch of times and still fail
+	var/enabled = TRUE
+
+	/// how many times should a query attempt to run before giving up
+	var/maxApiRetries = 5
+	/// base delay between query attempts, gets multiplied by attempt number
+	var/apiRetryDelay = 10
+
+	/// how many api errors there have been since a successful one
+	var/emergency_shutoff_counter = 0
+	/// lazy count of how many are up/down
+	var/lazy_concurrent_counter = 0
+	/// number of how many are waiting
+	var/lazy_waiting_counter = 0
+
+	New()
+		..()
+		if (!config.goonhub_api_endpoint)
+			src.enabled = FALSE
+			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: Goonhub endpoint doesn't exist, disabled api handler")
+			logTheThing(LOG_DIARY, null, "API Error: Goonhub endpoint doesn't exist, disabled api handler", "debug")
+
+
+	/// Build and throw an error exception
+	proc/apiError(list/data, source)
+		var/datum/apiModel/Error/model = new
+		model.SetupFromResponse(data)
+		throw EXCEPTION(model)
+
+
+	/**
+	 * Retries an API query in the event of failure
+	 *
+	 * @route (/datum/apiRoute) requested route to call, ex. /datum/apiRoute/players/notes/get
+	 * @attempt (int) number of times we've attempted this query
+	 * @return (/datum/apiModel) model containing parsed data response from api
+	 */
+	proc/retryApiQuery(datum/apiRoute/route, attempt)
+		//the sleep delay grows as attempts increases
+		sleep(src.apiRetryDelay * attempt)
+		attempt++
+		return src.queryAPI(route, attempt)
+
+
+	/**
+	 * Increments or resets the recent error counter
+	 *
+	 * @reset (bool) reset the counter (eg successful request)
+	 */
+	proc/trackRecentError(reset = FALSE)
+		if (reset)
+			src.emergency_shutoff_counter = 0
+			return
+
+		src.emergency_shutoff_counter++
+		if (src.enabled && src.emergency_shutoff_counter > 50)
+			logTheThing(LOG_DEBUG, null, "DISABLING API REQUESTS - Too many errors.")
+			logTheThing(LOG_DIARY, null, "DISABLING API REQUESTS - Too many errors.", "debug")
+			message_admins("API requests have been disabled due to too many errors (check debug logs).")
+			src.enabled = 0
+			SPAWN(60 SECONDS)
+				src.emergency_shutoff_counter = 0
+				logTheThing(LOG_DEBUG, null, "RE-ENABLING API REQUESTS - Cooldown expired.")
+				logTheThing(LOG_DIARY, null, "RE-ENABLING API REQUESTS - Cooldown expired.", "debug")
+				message_admins("API requests have been re-enabled after waiting.")
+				src.enabled = 1
+
+	/**
+	 * Constructs a query to send to the goonhub web API
+	 *
+	 * @route (/datum/apiRoute) requested route to call, ex. /datum/apiRoute/players/notes/get
+	 * @attempt (int) number of times we've attempted this query
+	 * @return (/datum/apiModel|boolean) model containing parsed data response from api, or boolean indicating success
+	 *
+	 */
+	proc/queryAPI(datum/apiRoute/route = null, attempt = 1)
+		if (!enabled)
+			src.apiError(list("message" = "API Error: Cancelled query due to disabled apiHandler"))
+			return FALSE
+		if (!route)
+			src.apiError(list("message" = "API Error: Cancelled query due to missing route parameter"))
+			return FALSE
+
+		var/req_route = "[config.goonhub_api_endpoint][route.path][route.routeParams ? "/[route.formatRouteParams()]" : ""]/?[route.formatQueryParams()]"
+		var/headers = list(
+			"Accept" = "application/json",
+			"Content-Type" = "application/json",
+			"Authorization" = config.goonhub_api_token
+		)
+
+		src.lazy_waiting_counter++
+		while (src.lazy_concurrent_counter > 50)
+			// if we have too many requests out, just wait a little to let some finish
+			sleep(rand(1, 5))
+		src.lazy_waiting_counter--
+		src.lazy_concurrent_counter++
+
+		// Actual request
+		var/datum/http_request/request = new()
+		var/req_body = route.body ? route.body.toJson() : ""
+		request.prepare(route.method, req_route, req_body, headers, "")
+		request.begin_async()
+		var/time_started = TIME
+		UNTIL(request.is_complete() || (TIME - time_started) > 10 SECONDS)
+		if (!request.is_complete())
+			src.trackRecentError()
+			var/msg = "Request timed out during [req_route] (Attempt: [attempt]; recent errors: [src.emergency_shutoff_counter], concurrent: [src.lazy_concurrent_counter])"
+			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: [msg]")
+			logTheThing(LOG_DIARY, null, "API Error: [msg]", "debug")
+
+			// This one is over so we can clear it now
+			src.lazy_concurrent_counter--
+			if (attempt < src.maxApiRetries)
+				return src.retryApiQuery(route, attempt)
+
+			src.apiError(list("message" = "API Error: Request timed out during [req_route]"))
+			return FALSE
+
+		// Otherwise the request did finish so we can lower this
+		src.lazy_concurrent_counter--
+		var/datum/http_response/response = request.into_response()
+
+		if (response.errored || !response.body)
+			src.trackRecentError()
+			var/msg = "No response from server during query [!response.body ? "during" : "to"] [req_route] (Attempt: [attempt]; recent errors: [src.emergency_shutoff_counter], concurrent: [src.lazy_concurrent_counter])"
+			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: [msg]")
+			logTheThing(LOG_DIARY, null, "API Error: [msg]", "debug")
+
+			if (attempt < src.maxApiRetries)
+				return src.retryApiQuery(route, attempt)
+
+			src.apiError(list("message" = "API Error: No response from server during query [!response.body ? "during" : "to"] [req_route]"))
+
+		// At this point we assume the request was a success, so reset the error counter
+		src.trackRecentError(TRUE)
+
+		// Parse the response
+		var/list/data
+		try
+			data = json_decode(response.body)
+		catch
+			// pass so we can handle retries or build our own exception
+
+		// Bad data format
+		if (!data)
+			var/msg = "JSON decode error during [req_route] (Attempt: [attempt]; recent errors: [src.emergency_shutoff_counter], concurrent: [src.lazy_concurrent_counter])"
+			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: [msg]")
+			logTheThing(LOG_DIARY, null, "API Error: [msg]", "debug")
+
+			if (attempt < src.maxApiRetries)
+				return src.retryApiQuery(route, attempt)
+
+			src.apiError(list("message" = "API Error: JSON decode error during [req_route]"))
+
+		// Handle client and server error responses
+		if (response.status_code >= 400)
+			data["status_code"] = response.status_code
+			src.apiError(data)
+			return FALSE
+
+		// Validation
+		var/datum/apiModel/model = new route.correct_response
+		if (istype(model, /datum/apiModel/Paginated) || istype(model, /datum/apiModel/Message))
+			model.SetupFromResponse(data, route)
+		else
+			model.SetupFromResponse(data["data"], route)
+		if (!model.VerifyIntegrity())
+			var/msg = "Verification error on response during [req_route] (Attempt: [attempt]; recent errors: [src.emergency_shutoff_counter], concurrent: [src.lazy_concurrent_counter])"
+			logTheThing(LOG_DEBUG, null, "<b>API Error</b>: [msg]")
+			logTheThing(LOG_DIARY, null, "API Error: [msg]", "debug")
+			src.apiError(list("message" = "API Error: Verification error on response during [req_route]"))
+			return FALSE
+
+		return model
diff --git a/code/modules/goonhub/api/apiGuide.md b/code/modules/goonhub/api/apiGuide.md
new file mode 100644
index 0000000000000..cd679d548f6b8
--- /dev/null
+++ b/code/modules/goonhub/api/apiGuide.md
@@ -0,0 +1,194 @@
+## About the DM side API
+This is written from the understanding of Tyrant, who is not an API developer. Some things may be slightly wrong.
+
+Useful links:
+Goonhub API docs: https://staging.goonhub.com/docs/api#/
+Event tracking docs: https://staging.goonhub.com/docs/events/1.0/overview
+
+### Endpoints and apiRoutes
+Endpoints are the ways that the API communicates, and they contain routes. The routes contain several vars:
+
+A route can have one of four method types:
+- `GET` Which checks information.
+- `POST` Which adds new information.
+- `PUT` Which updates/overwrites existing information.
+- `DELETE` Which removes information.
+These are specified in the `method` var using defines.
+
+Each route has a path which it connects to as well, for instance https://staging.goonhub.com/api
+**/bans**. This is specified in the form of a string in the `path` var.
+
+Path parameters are stored in the `routeParams` var. These are used when the path ends with a variable, for instance, `https://staging.goonhub.com/api/bans/{ban}`, which has the path parameter `{ban}`.
+
+Query parameters send extra information when connecting, stored in `queryParams`. This is usually a list of strings, for instance, `queryParams = list("filters", "sort_by", "descending", "per_page")`.
+
+The request body (`body` var) is what is sent through the connection. These are usually in the form of a `/datum/apiBody`, which are in the requests folder in the repo. More information is in the following sections.
+
+The response model (`correct_response` var) is what is sent back. These are in the form of a `/datum/apiModel`, which are in the models folder in the repo. More information is in the following sections.
+
+A Template for API endpoint routes:
+```dm
+/// [method type e.g. POST] [path e.g. /players/notes]
+/// [reference to the name of the file or what it does, e.g. Add]
+//datum/apiRoute/[path of route]
+	method = RUSTG_HTTP_METHOD_[method type]
+	path = "[the path of the endpoint it connects to]"
+	routeParams = list([list of parameter items, separated by commas]) // [the primitive type of each parameter]
+	queryParams = list([list of parameter items, separated by commas]) // [the primitive type of each parameter]
+	body = [the datum of the body, under /datum/apiBody]
+	correct_response = [the datum of the model, under datum/apiModel]
+
+	buildBody(	// check the apiBody section below to understand what this means
+		field1,
+		field2,
+		field3
+	)
+		. = ..(args)
+
+// A proper example:
+
+/// PUT /bans/{ban}
+/// Update
+/datum/apiRoute/bans/update
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/bans"
+	routeParams = list("ban")	// integer
+	body = /datum/apiBody/bans/add
+	correct_response = /datum/apiModel/Tracked/BanResource
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		ckey,
+		comp_id,
+		ip,
+		reason,
+		duration
+	)
+		. = ..(args)
+```
+
+The reason why the API files are formatted this way is so that "it's optimized so you can just copypaste stuff and change it via column/vertical select" ~ZeWaka.
+
+Other notes:
+- the path should start with slash.
+- not all methods require all the vars. In fact, some are mutually exclusive.
+- If the apiBody or apiModel doesn't exist, make it. Don't try to just shove a list of strings in; it won't work.
+
+#### Making your own apiRoute's
+The list of what to make and how it works is at https://staging.goonhub.com/docs/api, along with the request body and response model needed. They need to match the `apiRoute` in order for the API to work correctly.
+- Under request, the parameters should match in the form of a list of strings matching the parameter names. If it says query parameters, use `queryParams`, if it says path parameters, use `routeParams`.
+- If the path ends with something like `/{kind of routeParam}`, you don't include it in `src.path`. It gets appended automatically later on by the routeParams.
+- The request body should match an `apiBody`.
+- The response body should match an `apiModel`.
+- If the above two don't have matching ones, you have to make them.
+- If you're making new files, follow the format of existing names.
+
+### Request bodies and apiBody
+A `/datum/apiBody` is a type of request which gets sent through a route and provides information. These are typically used on `POST` and `PUT` method using routes.
+The Goonhub api, while it lists what's needed in the body of the request for each route, doesn't actually give fixed names for each body. You can check what's required in the body under "request" -> "Body".
+
+This body will need to then be "built" by calling `buildBody()` on the routes that use them, as shown in the example in the above `/datum/apiRoute` section. This way, autocomplete works better. It's a bit silly but will help overall.
+
+The default format for making them is as follows:
+```dm
+/datum/apiBody/[path]
+	fields = list(
+		"field1", // [type]
+		"field2", // [type]
+		"field3" // [type]
+	)
+
+/datum/apiBody/[path]/VerifyIntegrity(
+	. = ..()
+	if (
+		isnull(src.values["field1"]) \
+		|| isnull(src.values["field2"]) \
+	)	// note that this means field1 and field2 can't be null, but field3 can.
+)
+
+// a real example:
+/datum/apiBody/bans/add
+	fields = list(
+		"game_admin_ckey", // string
+		"round_id", // integer
+		"server_id", // string
+		"ckey", // string
+		"comp_id", // string
+		"ip", // string
+		"reason", // string
+		"duration" // integer
+	)
+
+/datum/apiBody/bans/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"]) \
+		|| isnull(src.values["round_id"]) \
+		|| isnull(src.values["server_id"]) \
+		|| isnull(src.values["reason"]) \
+	)
+		return FALSE
+```
+
+### Response models and apiModel
+A `/datum/apiModel` is a response that is sent back after the task is complete. They are sometimes called resources. The Goonhub API guide lists what kind is required and what they contain. You can check what is required under "Responses" -> "Body". They're typically used in `GET` method routes.
+
+Note that there are certain parents, which have built in fields. For instance, the abstract type `/datum/apiModel/Tracked` has three fields: `id`, `created_at` and `updated_at`. Anything that needs these three should usually be a subtype and won't have to redefine them.
+
+Similarly, `/datum/apiModel/Tracked/PlayerRes` includes the tracked vars and one more: `player_id`. Meanwhile `/datum/apiModel/Paginated` is usually used in `RUSTG_HTTP_METHOD_GET` methods and includes three vars: `data` (which is another apiModel, nested inside), `links` and `meta`.
+
+The usual format is below:
+```dm
+/// [Name]
+/datum/apiModel/[path]
+	var/field1	= null // [type]
+	var/field2	= null // [type]
+	var/field3	= null // [type]
+
+/datum/apiModel/[path]/SetupFromResponse(response)
+	. = ..()
+	src.field1 = response["field1"]
+	src.field2 = response["field2"]
+	src.field3 = response["field3"]
+
+/datum/apiModel/[path]/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.[field1]) \	// assuming that field1 and 2 cannot be null and field3 can
+		|| isnull(src.[field2])
+	)
+		return FALSE
+
+/datum/apiModel/[path]/ToString()
+	. = list()
+	.["field1"] = src.field1
+	.["field2"] = src.field2
+	.["field3"] = src.field3
+	return json_encode(.)
+
+//A real example:
+/// Error
+/datum/apiModel/Error
+	var/message	= null // string
+	var/errors	= null // null or list
+
+/datum/apiModel/Error/SetupFromResponse(response)
+	. = ..()
+	src.message = response["message"]
+	src.errors = response["errors"]
+
+/datum/apiModel/Error/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.message) \
+	)
+		return FALSE
+
+/datum/apiModel/Error/ToString()
+	. = list()
+	.["message"] = src.message
+	.["errors"] = src.errors
+	return json_encode(.)
+```
diff --git a/code/modules/goonhub/api/models/Error.dm b/code/modules/goonhub/api/models/Error.dm
new file mode 100644
index 0000000000000..9aea132665836
--- /dev/null
+++ b/code/modules/goonhub/api/models/Error.dm
@@ -0,0 +1,25 @@
+
+/// Error
+/datum/apiModel/Error
+	var/message	= null // string
+	var/errors	= null // null or list
+	var/status_code = null // null or int
+
+/datum/apiModel/Error/SetupFromResponse(response)
+	. = ..()
+	src.message = response["message"]
+	src.errors = response["errors"]
+	src.status_code = response["status_code"]
+
+/datum/apiModel/Error/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.message) \
+	)
+		return FALSE
+
+/datum/apiModel/Error/ToList()
+	. = ..()
+	.["message"] = src.message
+	.["errors"] = src.errors
+	.["status_code"] = src.status_code
diff --git a/code/modules/goonhub/api/models/Message.dm b/code/modules/goonhub/api/models/Message.dm
new file mode 100644
index 0000000000000..7b207ff0f959e
--- /dev/null
+++ b/code/modules/goonhub/api/models/Message.dm
@@ -0,0 +1,19 @@
+
+/// Message
+/datum/apiModel/Message
+	var/message = null // string
+
+/datum/apiModel/Message/SetupFromResponse(response)
+	. = ..()
+	src.message = response["message"]
+
+/datum/apiModel/Message/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.message)
+	)
+		return FALSE
+
+/datum/apiModel/Message/ToList()
+	. = ..()
+	.["message"] = src.message
diff --git a/code/modules/goonhub/api/models/_Paginated.dm b/code/modules/goonhub/api/models/_Paginated.dm
new file mode 100644
index 0000000000000..c58b5ecd1beba
--- /dev/null
+++ b/code/modules/goonhub/api/models/_Paginated.dm
@@ -0,0 +1,34 @@
+
+ABSTRACT_TYPE(/datum/apiModel/Paginated)
+/// Paginated - ABSTRACT
+/// Anything with a paginated list inherits from this
+/datum/apiModel/Paginated
+	var/list/datum/apiModel/data = null
+	var/list/links = null
+	var/list/meta = null
+
+/datum/apiModel/Paginated/SetupFromResponse(response)
+	. = ..()
+	src.links = response["links"]
+	src.meta = response["meta"]
+
+/datum/apiModel/Paginated/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.data) \
+		|| isnull(src.links) \
+		|| isnull(src.meta)
+	)
+		return FALSE
+
+	for (var/datum/apiModel/item in src.data)
+		if (!item.VerifyIntegrity())
+			return FALSE
+
+/datum/apiModel/Paginated/ToList()
+	. = ..()
+	.["data"] = list()
+	for (var/datum/apiModel/item in src.data)
+		.["data"] += list(item.ToList())
+	.["links"] = src.links
+	.["meta"] = src.meta
diff --git a/code/modules/goonhub/api/models/_PlayerResParent.dm b/code/modules/goonhub/api/models/_PlayerResParent.dm
new file mode 100644
index 0000000000000..a62676134d7f2
--- /dev/null
+++ b/code/modules/goonhub/api/models/_PlayerResParent.dm
@@ -0,0 +1,21 @@
+
+ABSTRACT_TYPE(/datum/apiModel/Tracked/PlayerRes)
+/// PlayerRes - ABSTRACT
+/// All PlayerResourceXYZ inherit from this - shared player id field
+/datum/apiModel/Tracked/PlayerRes
+	var/player_id	= null // integer
+
+/datum/apiModel/Tracked/PlayerRes/SetupFromResponse(response)
+	. = ..()
+	src.player_id = response["player_id"]
+
+/datum/apiModel/Tracked/PlayerRes/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.player_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/ToList()
+	. = ..()
+	.["player_id"] = src.player_id
diff --git a/code/modules/goonhub/api/models/_Tracked.dm b/code/modules/goonhub/api/models/_Tracked.dm
new file mode 100644
index 0000000000000..f028aa029eb13
--- /dev/null
+++ b/code/modules/goonhub/api/models/_Tracked.dm
@@ -0,0 +1,28 @@
+
+ABSTRACT_TYPE(/datum/apiModel/Tracked)
+/// Tracked - ABSTRACT
+/// Anything with the two timestamp fields inherit from this
+/datum/apiModel/Tracked
+	var/id			= null // integer
+	var/created_at	= null // date-time
+	var/updated_at	= null // date-time | null
+
+/datum/apiModel/Tracked/SetupFromResponse(response)
+	. = ..()
+	src.id = response["id"]
+	src.created_at = response["created_at"]
+	src.updated_at = response["updated_at"]
+
+/datum/apiModel/Tracked/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.id) \
+		|| isnull(src.created_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/apiModel.dm b/code/modules/goonhub/api/models/apiModel.dm
new file mode 100644
index 0000000000000..031c112cc3bc5
--- /dev/null
+++ b/code/modules/goonhub/api/models/apiModel.dm
@@ -0,0 +1,22 @@
+
+
+ABSTRACT_TYPE(/datum/apiModel)
+/// Base apiModel datum - ABSTRACT
+/// Everything is generally required unless annotated as such
+/datum/apiModel
+
+/// Override to verify that the model object is correctly formed. Return FALSE if not.
+/datum/apiModel/proc/VerifyIntegrity()
+	return TRUE
+
+/// Override to convert a model to an associative list
+/datum/apiModel/proc/ToList()
+	return list()
+
+/// Get a string representation of a model for debugging purposes. Optional.
+/datum/apiModel/proc/ToString()
+	return json_encode(src.ToList())
+
+/// Override to build a model from an API response object
+/datum/apiModel/proc/SetupFromResponse()
+	return
diff --git a/code/modules/goonhub/api/models/bans/BanDetail.dm b/code/modules/goonhub/api/models/bans/BanDetail.dm
new file mode 100644
index 0000000000000..87a3476eb88e6
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/BanDetail.dm
@@ -0,0 +1,34 @@
+
+/// BanDetail
+/datum/apiModel/Tracked/BanDetail
+	var/ban_id		= null // integer
+	var/ckey		= null // string
+	var/comp_id		= null // integer
+	var/ip			= null // integer
+	var/deleted_at	= null // date-time | null
+
+/datum/apiModel/Tracked/BanDetail/SetupFromResponse(response)
+	. = ..()
+	src.ban_id = response["ban_id"]
+	src.ckey = response["ckey"]
+	src.comp_id = response["comp_id"]
+	src.ip = response["ip"]
+	src.deleted_at = response["deleted_at"]
+
+/datum/apiModel/Tracked/BanDetail/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.ban_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/BanDetail/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ban_id"] = src.ban_id
+	.["ckey"] = src.ckey
+	.["comp_id"] = src.comp_id
+	.["ip"] = src.ip
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["deleted_at"] = src.deleted_at
diff --git a/code/modules/goonhub/api/models/bans/BanResource.dm b/code/modules/goonhub/api/models/bans/BanResource.dm
new file mode 100644
index 0000000000000..f9b815b36eb42
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/BanResource.dm
@@ -0,0 +1,71 @@
+
+/// BanResource
+/datum/apiModel/Tracked/BanResource
+	var/round_id										= null // integer
+	var/game_admin_id									= null // integer
+	var/server_id										= null // string
+	var/reason											= null // string
+	var/duration_human									= null // string
+	var/expires_at										= null // date-time | null
+	var/deleted_at										= null // date-time | null
+	var/game_admin										= null // { id: integer, ckey: string, name: string } - not required
+	var/datum/apiModel/Tracked/GameRound/game_round		= null // /datum/apiModel/GameRound - not required
+	var/original_ban_detail								= null // { id: integer, ban_id: integer, ckey: string, comp_id: string, ip: string }
+	var/list/datum/apiModel/Tracked/BanDetail/details	= null // [/datum/apiModel/BanDetail] - not required
+	var/requires_appeal								= null // boolean
+
+/datum/apiModel/Tracked/BanResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.game_admin_id = response["game_admin_id"]
+	src.server_id = response["server_id"]
+	src.reason = response["reason"]
+	src.duration_human = response["duration_human"]
+	src.expires_at = response["expires_at"]
+	src.deleted_at = response["deleted_at"]
+	src.game_admin = response["game_admin"]
+
+	if (response["game_round"])
+		src.game_round = new
+		src.game_round.SetupFromResponse(response["game_round"])
+
+	src.original_ban_detail = response["original_ban_detail"]
+	src.requires_appeal = response["requires_appeal"]
+
+	src.details = list()
+	for (var/item in response["details"])
+		var/datum/apiModel/Tracked/BanDetail/detail = new
+		detail.SetupFromResponse(item)
+		src.details.Add(detail)
+
+/datum/apiModel/Tracked/BanResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.game_admin_id) \
+		|| isnull(src.reason) \
+		|| isnull(src.game_admin) \
+		|| isnull(src.original_ban_detail)
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/BanResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["game_admin_id"] = src.game_admin_id
+	.["server_id"] = src.server_id
+	.["reason"] = src.reason
+	.["duration_human"] = src.duration_human
+	.["expires_at"] = src.expires_at
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["deleted_at"] = src.deleted_at
+	.["game_admin"] = src.game_admin
+	.["game_round"] = src.game_round
+	if (src.game_round)
+		.["game_round"] = src.game_round.ToList()
+	.["original_ban_detail"] = src.original_ban_detail
+	.["details"] = list()
+	for (var/datum/apiModel/Tracked/BanDetail/detail in src.details)
+		.["details"] += list(detail.ToList())
+	.["requires_appeal"] = src.requires_appeal
diff --git a/code/modules/goonhub/api/models/bans/BanResourceList.dm b/code/modules/goonhub/api/models/bans/BanResourceList.dm
new file mode 100644
index 0000000000000..b3749c623169b
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/BanResourceList.dm
@@ -0,0 +1,11 @@
+
+/// BanResourceList
+/datum/apiModel/Paginated/BanResourceList
+
+/datum/apiModel/Paginated/BanResourceList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/BanResource/ban = new()
+		ban.SetupFromResponse(item)
+		src.data.Add(ban)
diff --git a/code/modules/goonhub/api/models/bans/JobBanResource.dm b/code/modules/goonhub/api/models/bans/JobBanResource.dm
new file mode 100644
index 0000000000000..93a9f0d9fd30c
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/JobBanResource.dm
@@ -0,0 +1,47 @@
+
+/// JobBanResource
+/datum/apiModel/Tracked/JobBanResource
+	var/round_id 				= null // integer
+	var/game_admin_id 	= null // integer
+	var/server_id				= null // string
+	var/ckey						= null // string
+	var/banned_from_job = null // string
+	var/reason					= null // string
+	var/expires_at 			= null // date-time
+	var/deleted_at 			= null // date-time
+	var/game_admin			= null // { id: integer, ckey: string, name: string } - not required
+
+/datum/apiModel/Tracked/JobBanResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.game_admin_id = response["game_admin_id"]
+	src.server_id = response["server_id"]
+	src.ckey = response["ckey"]
+	src.banned_from_job = response["banned_from_job"]
+	src.reason = response["reason"]
+	src.expires_at = response["expires_at"]
+	src.deleted_at = response["deleted_at"]
+	src.game_admin = response["game_admin"]
+
+/datum/apiModel/Tracked/JobBanResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.ckey) \
+		|| isnull(src.banned_from_job)
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/JobBanResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["game_admin_id"] = src.game_admin_id
+	.["server_id"] = src.server_id
+	.["ckey"] = src.ckey
+	.["banned_from_job"] = src.banned_from_job
+	.["reason"] = src.reason
+	.["expires_at"] = src.expires_at
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["deleted_at"] = src.deleted_at
+	.["game_admin"] = src.game_admin
diff --git a/code/modules/goonhub/api/models/bans/JobBanResourceList.dm b/code/modules/goonhub/api/models/bans/JobBanResourceList.dm
new file mode 100644
index 0000000000000..6f11846b13796
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/JobBanResourceList.dm
@@ -0,0 +1,11 @@
+
+/// JobBanResourceList
+/datum/apiModel/Paginated/JobBanResourceList
+
+/datum/apiModel/Paginated/JobBanResourceList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/JobBanResource/jobBan = new()
+		jobBan.SetupFromResponse(item)
+		src.data.Add(jobBan)
diff --git a/code/modules/goonhub/api/models/bans/JobBansForPlayer.dm b/code/modules/goonhub/api/models/bans/JobBansForPlayer.dm
new file mode 100644
index 0000000000000..f0e7e48085b31
--- /dev/null
+++ b/code/modules/goonhub/api/models/bans/JobBansForPlayer.dm
@@ -0,0 +1,12 @@
+
+/// JobBansForPlayer
+/datum/apiModel/JobBansForPlayer
+	var/list/jobs = null
+
+/datum/apiModel/JobBansForPlayer/SetupFromResponse(response)
+	. = ..()
+	src.jobs = response
+
+/datum/apiModel/JobBansForPlayer/ToList()
+	. = ..()
+	.["jobs"] = src.jobs
diff --git a/code/modules/goonhub/api/models/dectalk/DectalkPlayResource.dm b/code/modules/goonhub/api/models/dectalk/DectalkPlayResource.dm
new file mode 100644
index 0000000000000..4dd4c8dd0f5b8
--- /dev/null
+++ b/code/modules/goonhub/api/models/dectalk/DectalkPlayResource.dm
@@ -0,0 +1,20 @@
+
+
+/// DectalkPlayResource
+/datum/apiModel/DectalkPlayResource
+	var/audio = null // string, url pointing to the recorded audio file
+
+/datum/apiModel/DectalkPlayResource/SetupFromResponse(response)
+	. = ..()
+	src.audio = response["audio"]
+
+/datum/apiModel/DectalkPlayResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.audio) \
+	)
+		return FALSE
+
+/datum/apiModel/DectalkPlayResource/ToList()
+	. = ..()
+	.["audio"] = src.audio
diff --git a/code/modules/goonhub/api/models/events/EventAiLawResource.dm b/code/modules/goonhub/api/models/events/EventAiLawResource.dm
new file mode 100644
index 0000000000000..8fb462db2b6b8
--- /dev/null
+++ b/code/modules/goonhub/api/models/events/EventAiLawResource.dm
@@ -0,0 +1,52 @@
+
+/// EventAiLawResource
+/datum/apiModel/Tracked/EventAiLawResource
+	var/round_id		= null // string
+	var/player_id		= null // string
+	var/ai_name			= null // string
+	var/law_number		= null // string
+	var/law_text		= null // string
+	var/uploader_name	= null // string
+	var/uploader_job	= null // string
+	var/uploader_ckey	= null // string
+
+/datum/apiModel/Tracked/EventAiLawResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.player_id = response["player_id"]
+	src.ai_name = response["ai_name"]
+	src.law_number = response["law_number"]
+	src.law_text = response["law_text"]
+	src.uploader_name = response["uploader_name"]
+	src.uploader_job = response["uploader_job"]
+	src.uploader_ckey = response["uploader_ckey"]
+
+/datum/apiModel/Tracked/EventAiLawResource/VerifyIntegrity()
+	if (
+		isnull(id) \
+		|| isnull(src.round_id) \
+		|| isnull(src.player_id) \
+		|| isnull(src.ai_name) \
+		|| isnull(src.law_number) \
+		|| isnull(src.law_text) \
+		|| isnull(src.uploader_name) \
+		|| isnull(src.uploader_job) \
+		|| isnull(src.uploader_ckey) \
+		|| isnull(src.created_at) \
+		|| isnull(src.updated_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/EventAiLawResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["player_id"] = src.player_id
+	.["ai_name"] = src.ai_name
+	.["law_number"] = src.law_number
+	.["law_text"] = src.law_text
+	.["uploader_name"] = src.uploader_name
+	.["uploader_job"] = src.uploader_job
+	.["uploader_ckey"] = src.uploader_ckey
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/events/EventFineResource.dm b/code/modules/goonhub/api/models/events/EventFineResource.dm
new file mode 100644
index 0000000000000..f92c07cd53a80
--- /dev/null
+++ b/code/modules/goonhub/api/models/events/EventFineResource.dm
@@ -0,0 +1,52 @@
+
+/// EventFineResource
+/datum/apiModel/Tracked/EventFineResource
+	var/round_id	= null // string
+	var/player_id	= null // string
+	var/target		= null // string
+	var/reason		= null // string
+	var/issuer		= null // string
+	var/issuer_job	= null // string
+	var/issuer_ckey	= null // string
+	var/amount		= null // string
+
+/datum/apiModel/Tracked/EventFineResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.player_id = response["player_id"]
+	src.target = response["target"]
+	src.reason = response["reason"]
+	src.issuer = response["issuer"]
+	src.issuer_job = response["issuer_job"]
+	src.issuer_ckey = response["issuer_ckey"]
+	src.amount = response["amount"]
+
+/datum/apiModel/Tracked/EventFineResource/VerifyIntegrity()
+	if (
+		isnull(id) \
+		|| isnull(src.round_id) \
+		|| isnull(src.player_id) \
+		|| isnull(src.target) \
+		|| isnull(src.reason) \
+		|| isnull(src.issuer) \
+		|| isnull(src.issuer_job) \
+		|| isnull(src.issuer_ckey) \
+		|| isnull(src.amount) \
+		|| isnull(src.created_at) \
+		|| isnull(src.updated_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/EventFineResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["player_id"] = src.player_id
+	.["target"] = src.target
+	.["reason"] = src.reason
+	.["issuer"] = src.issuer
+	.["issuer_job"] = src.issuer_job
+	.["issuer_ckey"] = src.issuer_ckey
+	.["amount"] = src.amount
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/events/EventStationNameResource.dm b/code/modules/goonhub/api/models/events/EventStationNameResource.dm
new file mode 100644
index 0000000000000..5aaf0fa2d2814
--- /dev/null
+++ b/code/modules/goonhub/api/models/events/EventStationNameResource.dm
@@ -0,0 +1,32 @@
+
+/// EventStationNameResource
+/datum/apiModel/Tracked/EventStationNameResource
+	var/round_id	= null // string
+	var/player_id	= null // string
+	var/name		= null // string
+
+/datum/apiModel/Tracked/EventStationNameResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.player_id = response["player_id"]
+	src.name = response["name"]
+
+/datum/apiModel/Tracked/EventStationNameResource/VerifyIntegrity()
+	if (
+		isnull(id) \
+		|| isnull(src.round_id) \
+		|| isnull(src.player_id) \
+		|| isnull(src.name) \
+		|| isnull(src.created_at) \
+		|| isnull(src.updated_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/EventStationNameResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["player_id"] = src.player_id
+	.["name"] = src.name
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/events/EventTicketResource.dm b/code/modules/goonhub/api/models/events/EventTicketResource.dm
new file mode 100644
index 0000000000000..1b6d109fc4583
--- /dev/null
+++ b/code/modules/goonhub/api/models/events/EventTicketResource.dm
@@ -0,0 +1,48 @@
+
+/// EventTicketResource
+/datum/apiModel/Tracked/EventTicketResource
+	var/round_id	= null // string
+	var/player_id	= null // string
+	var/target		= null // string
+	var/reason		= null // string
+	var/issuer		= null // string
+	var/issuer_job	= null // string
+	var/issuer_ckey	= null // string
+
+/datum/apiModel/Tracked/EventTicketResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.player_id = response["player_id"]
+	src.target = response["target"]
+	src.reason = response["reason"]
+	src.issuer = response["issuer"]
+	src.issuer_job = response["issuer_job"]
+	src.issuer_ckey = response["issuer_ckey"]
+
+/datum/apiModel/Tracked/EventTicketResource/VerifyIntegrity()
+	if (
+		isnull(id) \
+		|| isnull(src.round_id) \
+		|| isnull(src.player_id) \
+		|| isnull(src.target) \
+		|| isnull(src.reason) \
+		|| isnull(src.issuer) \
+		|| isnull(src.issuer_job) \
+		|| isnull(src.issuer_ckey) \
+		|| isnull(src.created_at) \
+		|| isnull(src.updated_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/EventTicketResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["player_id"] = src.player_id
+	.["target"] = src.target
+	.["reason"] = src.reason
+	.["issuer"] = src.issuer
+	.["issuer_job"] = src.issuer_job
+	.["issuer_ckey"] = src.issuer_ckey
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/gameadmins/GameAdmin.dm b/code/modules/goonhub/api/models/gameadmins/GameAdmin.dm
new file mode 100644
index 0000000000000..a6e9cd8e5ab5f
--- /dev/null
+++ b/code/modules/goonhub/api/models/gameadmins/GameAdmin.dm
@@ -0,0 +1,35 @@
+
+
+/// GameAdmin
+/datum/apiModel/Tracked/GameAdmin
+	var/ckey		= null // integer
+	var/name		= null // string
+	var/discord_id	= null // string
+	var/rank_id		= null // integer
+
+/datum/apiModel/Tracked/GameAdmin/SetupFromResponse(response)
+	. = ..()
+	src.ckey = response["ckey"]
+	src.name = response["name"]
+	src.discord_id = response["discord_id"]
+	src.rank_id = response["rank_id"]
+
+/datum/apiModel/Tracked/GameAdmin/VerifyIntegrity()
+	if (
+		isnull(src.id) \
+		|| isnull(src.ckey) \
+		|| isnull(src.name) \
+		|| isnull(src.discord_id) \
+		|| isnull(src.rank_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/GameAdmin/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ckey"] = src.ckey
+	.["name"] = src.name
+	.["discord_id"] = src.discord_id
+	.["rank_id"] = src.rank_id
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/gameadmins/GameAdminRank.dm b/code/modules/goonhub/api/models/gameadmins/GameAdminRank.dm
new file mode 100644
index 0000000000000..9ad27ec8af63e
--- /dev/null
+++ b/code/modules/goonhub/api/models/gameadmins/GameAdminRank.dm
@@ -0,0 +1,23 @@
+/// GameAdminRank
+/datum/apiModel/Tracked/GameAdminRank
+	var/rank = null // string
+
+/datum/apiModel/Tracked/GameAdminRank/SetupFromResponse(response)
+	. = ..()
+	src.rank = response["rank"]
+
+/datum/apiModel/Tracked/GameAdminRank/VerifyIntegrity()
+	if (
+		isnull(src.id) \
+		|| isnull(src.rank) \
+		|| isnull(src.created_at) \
+		|| isnull(src.updated_at) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/GameAdminRank/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["rank"] = src.rank
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/gameadmins/GameAdminResource.dm b/code/modules/goonhub/api/models/gameadmins/GameAdminResource.dm
new file mode 100644
index 0000000000000..1c52fff1e3696
--- /dev/null
+++ b/code/modules/goonhub/api/models/gameadmins/GameAdminResource.dm
@@ -0,0 +1,34 @@
+/// GameAdminResource
+/datum/apiModel/Tracked/GameAdminResource
+	var/ckey			= null // string
+	var/name 			= null // string
+	var/discord_id 		= null // string
+	var/datum/apiModel/Tracked/GameAdminRank/rank = null
+
+/datum/apiModel/Tracked/GameAdminResource/SetupFromResponse(response)
+	. = ..()
+	src.ckey = response["ckey"]
+	src.name = response["name"]
+	src.discord_id = response["discord_id"]
+
+	if ("rank" in response)
+		src.rank = new
+		src.rank = src.rank.SetupFromResponse(response["rank"])
+
+/datum/apiModel/Tracked/GameAdminResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.ckey)
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/GameAdminResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ckey"] = src.ckey
+	.["name"] = src.name
+	.["discord_id"] = src.discord_id
+	if (src.rank)
+		.["rank"] = src.rank.ToList()
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/gauntlet/PreviousGauntlets.dm b/code/modules/goonhub/api/models/gauntlet/PreviousGauntlets.dm
new file mode 100644
index 0000000000000..599946f11bb61
--- /dev/null
+++ b/code/modules/goonhub/api/models/gauntlet/PreviousGauntlets.dm
@@ -0,0 +1,19 @@
+
+/// PreviousGauntlets
+/datum/apiModel/PreviousGauntlets
+	var/gauntlets_completed = null // integer
+
+/datum/apiModel/PreviousGauntlets/SetupFromResponse(response)
+	. = ..()
+	src.gauntlets_completed = response["gauntlets_completed"]
+
+/datum/apiModel/PreviousGauntlets/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.gauntlets_completed) \
+	)
+		return FALSE
+
+/datum/apiModel/PreviousGauntlets/ToList()
+	. = ..()
+	.["gauntlets_completed"] = src.gauntlets_completed
diff --git a/code/modules/goonhub/api/models/maps/MapSwitch.dm b/code/modules/goonhub/api/models/maps/MapSwitch.dm
new file mode 100644
index 0000000000000..eceb0a2c8c041
--- /dev/null
+++ b/code/modules/goonhub/api/models/maps/MapSwitch.dm
@@ -0,0 +1,60 @@
+
+/// MapSwitch
+/datum/apiModel/MapSwitch
+	var/datum/apiModel/Tracked/MapSwitchInternal/map_switch	= null // Model
+	var/status												= null // integer
+
+/datum/apiModel/MapSwitch/SetupFromResponse(response)
+	. = ..()
+	src.map_switch = new
+	src.map_switch.SetupFromResponse(response["map_switch"])
+	src.status = response["status"]
+
+/datum/apiModel/MapSwitch/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.map_switch) \
+		|| isnull(src.status) \
+	)
+		return FALSE
+
+/datum/apiModel/MapSwitch/ToList()
+	. = ..()
+	.["map_switch"]	= src.map_switch.ToList()
+	.["status"]		= src.status
+
+
+/// MapSwitchInternal
+/datum/apiModel/Tracked/MapSwitchInternal
+	var/game_admin_id	= null // integer
+	var/round_id		= null // integer
+	var/server_id		= null // string
+	var/map				= null // string
+	var/votes			= null // integer
+
+/datum/apiModel/Tracked/MapSwitchInternal/SetupFromResponse(response)
+	. = ..()
+	src.game_admin_id = response["game_admin_id"]
+	src.round_id = response["round_id"]
+	src.server_id = response["server_id"]
+	src.map = response["map"]
+	src.votes = response["votes"]
+
+/datum/apiModel/Tracked/MapSwitchInternal/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.round_id) \
+		|| isnull(src.map) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/MapSwitchInternal/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["game_admin_id"] = src.game_admin_id
+	.["round_id"] = src.round_id
+	.["server_id"] = src.server_id
+	.["map"] = src.map
+	.["votes"] = src.votes
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/medals/MedalResource.dm b/code/modules/goonhub/api/models/medals/MedalResource.dm
new file mode 100644
index 0000000000000..6986e7d3d2a86
--- /dev/null
+++ b/code/modules/goonhub/api/models/medals/MedalResource.dm
@@ -0,0 +1,25 @@
+
+/// MedalResource
+/datum/apiModel/Tracked/MedalResource
+	var/title				= null // string
+	var/description	= null // string
+	var/hidden			= null // boolean
+
+/datum/apiModel/Tracked/MedalResource/SetupFromResponse(response)
+	. = ..()
+	src.title = response["title"]
+	src.description = response["description"]
+	src.hidden = response["hidden"]
+
+/datum/apiModel/Tracked/MedalResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.title) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/MedalResource/ToList()
+	. = ..()
+	.["title"] = src.title
+	.["description"] = src.description
+	.["hidden"] = src.hidden
diff --git a/code/modules/goonhub/api/models/numbersstation/NumbersStationPasswordResource.dm b/code/modules/goonhub/api/models/numbersstation/NumbersStationPasswordResource.dm
new file mode 100644
index 0000000000000..1d69ad899d419
--- /dev/null
+++ b/code/modules/goonhub/api/models/numbersstation/NumbersStationPasswordResource.dm
@@ -0,0 +1,19 @@
+
+/// NumbersStationPasswordResource
+/datum/apiModel/NumbersStationPasswordResource
+	var/numbers = null // string
+
+/datum/apiModel/NumbersStationPasswordResource/SetupFromResponse(response)
+	. = ..()
+	src.numbers = response["numbers"]
+
+/datum/apiModel/NumbersStationPasswordResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.numbers) \
+	)
+		return FALSE
+
+/datum/apiModel/NumbersStationPasswordResource/ToList()
+	. = ..()
+	.["numbers"] = src.numbers
diff --git a/code/modules/goonhub/api/models/players/GetPlayerSaves.dm b/code/modules/goonhub/api/models/players/GetPlayerSaves.dm
new file mode 100644
index 0000000000000..ff39ab865172f
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/GetPlayerSaves.dm
@@ -0,0 +1,36 @@
+
+/// GetPlayerSaves
+/datum/apiModel/GetPlayerSaves
+	var/list/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/data	= null
+	var/list/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/saves	= null
+
+/datum/apiModel/GetPlayerSaves/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/dataItem = new
+		dataItem.SetupFromResponse(item)
+		src.data.Add(dataItem)
+
+	src.saves = list()
+	for (var/item in response["saves"])
+		var/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/save = new
+		save.SetupFromResponse(item)
+		src.saves.Add(save)
+
+/datum/apiModel/GetPlayerSaves/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.data) \
+		|| isnull(src.saves) \
+	)
+		return FALSE
+
+/datum/apiModel/GetPlayerSaves/ToList()
+	. = ..()
+	.["data"] = list()
+	for (var/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/data in src.data)
+		.["data"] += list(data.ToList())
+	.["saves"] = list()
+	for (var/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/save in src.saves)
+		.["saves"] += list(save.ToList())
diff --git a/code/modules/goonhub/api/models/players/PlayerAntagResource.dm b/code/modules/goonhub/api/models/players/PlayerAntagResource.dm
new file mode 100644
index 0000000000000..bf7c2624e0155
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerAntagResource.dm
@@ -0,0 +1,34 @@
+
+
+/// PlayerAntagResource
+/datum/apiModel/Tracked/PlayerRes/PlayerAntagResource
+	var/round_id		= null // integer
+	var/antag_role		= null // string
+	var/late_join		= null // boolean
+	var/weight_exempt	= null // string
+
+/datum/apiModel/Tracked/PlayerRes/PlayerAntagResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.antag_role = response["antag_role"]
+	src.late_join = response["late_join"]
+	src.weight_exempt = response["weight_exempt"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerAntagResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.round_id) \
+		|| isnull(src.antag_role) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerAntagResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["round_id"] = src.round_id
+	.["antag_role"] = src.antag_role
+	.["late_join"] = src.late_join
+	.["weight_exempt"] = src.weight_exempt
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerCompIdsResource.dm b/code/modules/goonhub/api/models/players/PlayerCompIdsResource.dm
new file mode 100644
index 0000000000000..bedff87214fce
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerCompIdsResource.dm
@@ -0,0 +1,24 @@
+
+/// PlayerCompIdsResource
+/datum/apiModel/PlayerCompIdsResource
+	var/datum/apiModel/Tracked/PlayerRes/PlayerConnection/latest_connection = null // PlayerConnection
+	var/list/comp_ids = null // [string, integer]
+
+/datum/apiModel/PlayerCompIdsResource/SetupFromResponse(response)
+	. = ..()
+	src.latest_connection = new
+	src.latest_connection.SetupFromResponse(response["latest_connection"])
+	src.comp_ids = response["comp_ids"]
+
+/datum/apiModel/PlayerCompIdsResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.latest_connection) \
+		|| isnull(src.comp_ids)
+	)
+		return FALSE
+
+/datum/apiModel/PlayerCompIdsResource/ToList()
+	. = ..()
+	.["latest_connection"] = src.latest_connection.ToList()
+	.["comp_ids"] = src.comp_ids
diff --git a/code/modules/goonhub/api/models/players/PlayerConnection.dm b/code/modules/goonhub/api/models/players/PlayerConnection.dm
new file mode 100644
index 0000000000000..03d5c5d5462ba
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerConnection.dm
@@ -0,0 +1,41 @@
+
+/// PlayerConnection
+/datum/apiModel/Tracked/PlayerRes/PlayerConnection
+	var/round_id			= null // integer
+	var/ip					= null // string
+	var/comp_id				= null // string
+	var/list/legacy_data	= null // [string]
+	var/country				= null // string
+	var/country_iso			= null // string
+
+/datum/apiModel/Tracked/PlayerRes/PlayerConnection/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.ip = response["ip"]
+	src.comp_id = response["comp_id"]
+	src.legacy_data = response["legacy_data"]
+	src.country = response["country"]
+	src.country_iso = response["country_iso"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerConnection/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.player_id) \
+		|| isnull(src.round_id) \
+		|| isnull(src.ip) \
+		|| isnull(src.comp_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerConnection/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["round_id"] = src.round_id
+	.["ip"] = src.ip
+	.["comp_id"] = src.comp_id
+	.["legacy_data"] = src.legacy_data
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["country"] = src.country
+	.["country_iso"] = src.country_iso
diff --git a/code/modules/goonhub/api/models/players/PlayerDataResource.dm b/code/modules/goonhub/api/models/players/PlayerDataResource.dm
new file mode 100644
index 0000000000000..0cd2d73033934
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerDataResource.dm
@@ -0,0 +1,27 @@
+
+/// PlayerDataResource
+/datum/apiModel/Tracked/PlayerRes/PlayerDataResource
+	var/key		= null // string
+	var/value	= null // any
+
+/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/SetupFromResponse(response)
+	. = ..()
+	src.key =	response["key"]
+	src.value =	response["value"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.key) \
+		|| isnull(src.value) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerDataResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["key"] = src.key
+	.["value"] = src.value
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerIpsResource.dm b/code/modules/goonhub/api/models/players/PlayerIpsResource.dm
new file mode 100644
index 0000000000000..8569bba15c074
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerIpsResource.dm
@@ -0,0 +1,24 @@
+
+/// PlayerIpsResource
+/datum/apiModel/PlayerIpsResource
+	var/datum/apiModel/Tracked/PlayerRes/PlayerConnection/latest_connection = null // PlayerConnection
+	var/list/ips = null // [string, integer]
+
+/datum/apiModel/PlayerIpsResource/SetupFromResponse(response)
+	. = ..()
+	src.latest_connection = new
+	src.latest_connection.SetupFromResponse(response["latest_connection"])
+	src.ips = response["ips"]
+
+/datum/apiModel/PlayerIpsResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.latest_connection) \
+		|| isnull(src.ips)
+	)
+		return FALSE
+
+/datum/apiModel/PlayerIpsResource/ToList()
+	. = ..()
+	.["latest_connection"] = src.latest_connection.ToList()
+	.["ips"] = src.ips
diff --git a/code/modules/goonhub/api/models/players/PlayerMedalResource.dm b/code/modules/goonhub/api/models/players/PlayerMedalResource.dm
new file mode 100644
index 0000000000000..6c69633029cb6
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerMedalResource.dm
@@ -0,0 +1,28 @@
+
+/// PlayerMedalResource
+/datum/apiModel/Tracked/PlayerRes/PlayerMedalResource
+	var/medal_id = null // integer
+	var/datum/apiModel/Tracked/MedalResource/medal = null // /datum/apiModel/Tracked/MedalResource - not required
+	var/round_id = null // integer
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMedalResource/SetupFromResponse(response)
+	. = ..()
+	src.medal_id = response["medal_id"]
+	if ("medal" in response)
+		src.medal = new
+		src.medal.SetupFromResponse(response["medal"])
+	src.round_id = response["round_id"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMedalResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.medal_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMedalResource/ToList()
+	. = ..()
+	.["medal_id"] = src.medal_id
+	if (src.medal)
+		.["medal"] = src.medal.ToList()
+	.["round_id"] = src.round_id
diff --git a/code/modules/goonhub/api/models/players/PlayerMedalResourceList.dm b/code/modules/goonhub/api/models/players/PlayerMedalResourceList.dm
new file mode 100644
index 0000000000000..4444dcc2d2e0f
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerMedalResourceList.dm
@@ -0,0 +1,11 @@
+
+/// PlayerMedalResourceList
+/datum/apiModel/Paginated/PlayerMedalResourceList
+
+/datum/apiModel/Paginated/PlayerMedalResourceList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/PlayerRes/PlayerMedalResource/playerMedal = new()
+		playerMedal.SetupFromResponse(item)
+		src.data.Add(playerMedal)
diff --git a/code/modules/goonhub/api/models/players/PlayerMetadataArray.dm b/code/modules/goonhub/api/models/players/PlayerMetadataArray.dm
new file mode 100644
index 0000000000000..659283b6386c2
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerMetadataArray.dm
@@ -0,0 +1,19 @@
+
+/// PlayerMetadataArray
+/datum/apiModel/PlayerMetadataArray
+	var/list/data = null // [string]
+
+/datum/apiModel/PlayerMetadataArray/SetupFromResponse(response)
+	. = ..()
+	src.data = response
+
+/datum/apiModel/PlayerMetadataArray/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.data) \
+	)
+		return FALSE
+
+/datum/apiModel/PlayerMetadataArray/ToList()
+	. = ..()
+	.["data"] = src.data
diff --git a/code/modules/goonhub/api/models/players/PlayerMetadataList.dm b/code/modules/goonhub/api/models/players/PlayerMetadataList.dm
new file mode 100644
index 0000000000000..71f793816e801
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerMetadataList.dm
@@ -0,0 +1,11 @@
+
+/// PlayerMetadataList
+/datum/apiModel/Paginated/PlayerMetadataList
+
+/datum/apiModel/Paginated/PlayerMetadataList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource/playerMetadata = new()
+		playerMetadata.SetupFromResponse(item)
+		src.data.Add(playerMetadata)
diff --git a/code/modules/goonhub/api/models/players/PlayerMetadataResource.dm b/code/modules/goonhub/api/models/players/PlayerMetadataResource.dm
new file mode 100644
index 0000000000000..01b95cb61fb57
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerMetadataResource.dm
@@ -0,0 +1,27 @@
+
+/// PlayerMetadataResource
+/datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource
+	var/player = null // { id: integer, ckey: string }
+	var/metadata	 = null // string
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource/SetupFromResponse(response)
+	. = ..()
+	if ("player" in response)
+		src.player = response["player"]
+	src.metadata = response["metadata"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.metadata) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["player"] = src.player
+	.["metadata"] = src.metadata
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerNoteResource.dm b/code/modules/goonhub/api/models/players/PlayerNoteResource.dm
new file mode 100644
index 0000000000000..31864d194dca4
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerNoteResource.dm
@@ -0,0 +1,52 @@
+
+/// PlayerNoteResource
+/datum/apiModel/Tracked/PlayerNoteResource
+	var/player_id = null // integer
+	var/datum/apiModel/Tracked/PlayerResource/player = null // Model
+	var/ckey			= null // string
+	var/game_admin_id	= null // integer
+	var/datum/apiModel/Tracked/GameAdminResource/game_admin = null // Model
+	var/server_id		= null // string
+	var/round_id		= null // integer
+	var/note			= null // string
+	var/legacy_data		= null // [string]
+
+/datum/apiModel/Tracked/PlayerNoteResource/SetupFromResponse(response)
+	. = ..()
+	src.player = response["player_id"]
+	if (("player" in response) && islist(response["player"]))
+		src.player = new
+		src.player.SetupFromResponse(response["player"])
+	src.ckey = response["ckey"]
+	src.game_admin_id = response["game_admin_id"]
+	if (("game_admin" in response) && islist(response["game_admin"]))
+		src.game_admin = new
+		src.game_admin.SetupFromResponse(response["game_admin"])
+	src.server_id = response["server_id"]
+	src.round_id = response["round_id"]
+	src.note = response["note"]
+	src.legacy_data = response["legacy_data"]
+
+/datum/apiModel/Tracked/PlayerNoteResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.note) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerNoteResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	if (src.player)
+		.["player"] = src.player.ToList()
+	.["ckey"] = src.ckey
+	.["game_admin_id"] = src.game_admin_id
+	if (src.game_admin)
+		.["game_admin"] = src.game_admin.ToList()
+	.["server_id"] = src.server_id
+	.["round_id"] = src.round_id
+	.["note"] = src.note
+	.["legacy_data"] = src.legacy_data
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerNoteResourceList.dm b/code/modules/goonhub/api/models/players/PlayerNoteResourceList.dm
new file mode 100644
index 0000000000000..4bf1da11977a5
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerNoteResourceList.dm
@@ -0,0 +1,11 @@
+
+/// PlayerNoteResourceList
+/datum/apiModel/Paginated/PlayerNoteResourceList
+
+/datum/apiModel/Paginated/PlayerNoteResourceList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/PlayerNoteResource/playerNote = new()
+		playerNote.SetupFromResponse(item)
+		src.data.Add(playerNote)
diff --git a/code/modules/goonhub/api/models/players/PlayerParticipationResource.dm b/code/modules/goonhub/api/models/players/PlayerParticipationResource.dm
new file mode 100644
index 0000000000000..87be06f32c462
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerParticipationResource.dm
@@ -0,0 +1,29 @@
+
+/// PlayerParticipationResource
+/datum/apiModel/Tracked/PlayerRes/PlayerParticipationResource
+	var/round_id	= null // string
+	var/job				= null // string
+	var/legacy_data	= null // string
+
+/datum/apiModel/Tracked/PlayerRes/PlayerParticipationResource/SetupFromResponse(response)
+	. = ..()
+	src.round_id = response["round_id"]
+	src.job = response["job"]
+	src.legacy_data = response["legacy_data"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerParticipationResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.round_id)
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerParticipationResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["round_id"] = src.round_id
+	.["job"] = src.job
+	.["legacy_data"] = src.legacy_data
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerResource.dm b/code/modules/goonhub/api/models/players/PlayerResource.dm
new file mode 100644
index 0000000000000..6b273cfa5f03c
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerResource.dm
@@ -0,0 +1,37 @@
+
+/// PlayerResource
+/datum/apiModel/Tracked/PlayerResource
+	var/ckey			= null // string
+	var/key				= null // string
+	var/byond_join_date	= null // string
+	var/byond_major		= null // integer
+	var/byond_minor		= null // integer
+
+/datum/apiModel/Tracked/PlayerResource/SetupFromResponse(response)
+	. = ..()
+	src.ckey = response["ckey"]
+	src.key = response["key"]
+	src.byond_join_date = response["byond_join_date"]
+	src.byond_major = response["byond_major"]
+	src.byond_minor = response["byond_minor"]
+
+/datum/apiModel/Tracked/PlayerResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.ckey) \
+		|| isnull(src.key) \
+		|| isnull(src.byond_major) \
+		|| isnull(src.byond_minor) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ckey"] = src.ckey
+	.["key"] = src.key
+	.["byond_join_date"] = src.byond_join_date
+	.["byond_major"] = src.byond_major
+	.["byond_minor"] = src.byond_minor
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerSaveResource.dm b/code/modules/goonhub/api/models/players/PlayerSaveResource.dm
new file mode 100644
index 0000000000000..bf7af4fc8b3ca
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerSaveResource.dm
@@ -0,0 +1,26 @@
+
+/// PlayerSaveResource
+/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource
+	var/name = null // string
+	var/data = null // string
+
+/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/SetupFromResponse(response)
+	. = ..()
+	src.name = response["name"]
+	src.data = response["data"]
+
+/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.name) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerRes/PlayerSaveResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["player_id"] = src.player_id
+	.["name"] = src.name
+	.["data"] = src.data
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/players/PlayerStatsResource.dm b/code/modules/goonhub/api/models/players/PlayerStatsResource.dm
new file mode 100644
index 0000000000000..61cc978734302
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/PlayerStatsResource.dm
@@ -0,0 +1,56 @@
+
+/// PlayerStatsResource
+/datum/apiModel/Tracked/PlayerStatsResource
+	var/ckey			= null // string
+	var/key				= null // string
+	var/byond_join_date	= null // date
+	var/byond_major		= null // integer
+	var/byond_minor		= null // integer
+	var/played			= null // integer
+	var/played_rp		= null // integer
+	var/connected		= null // integer
+	var/connected_rp	= null // integer
+	var/time_played		= null // integer
+	var/datum/apiModel/Tracked/PlayerRes/PlayerConnection/latest_connection = null // PlayerConnection
+
+/datum/apiModel/Tracked/PlayerStatsResource/SetupFromResponse(response)
+	. = ..()
+	src.ckey = response["ckey"]
+	src.key = response["key"]
+	src.byond_join_date = response["byond_join_date"]
+	src.byond_major = response["byond_major"]
+	src.byond_minor = response["byond_minor"]
+	src.played = response["played"]
+	src.played_rp = response["played_rp"]
+	src.connected = response["connected"]
+	src.connected_rp = response["connected_rp"]
+	src.time_played = response["time_played"]
+
+	if (response["latest_connection"])
+		src.latest_connection = new
+		src.latest_connection.SetupFromResponse(response["latest_connection"])
+
+/datum/apiModel/Tracked/PlayerStatsResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.ckey)
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PlayerStatsResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ckey"] = src.ckey
+	.["key"] = src.key
+	.["byond_join_date"] = src.byond_join_date
+	.["byond_major"] = src.byond_major
+	.["byond_minor"] = src.byond_minor
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["played"] = src.played
+	.["played_rp"] = src.played_rp
+	.["connected"] = src.connected
+	.["connected_rp"] = src.connected_rp
+	.["time_played"] = src.time_played
+	if (src.latest_connection)
+		.["latest_connection"] = src.latest_connection.ToList()
diff --git a/code/modules/goonhub/api/models/players/weird/PlayerSearchResource.dm b/code/modules/goonhub/api/models/players/weird/PlayerSearchResource.dm
new file mode 100644
index 0000000000000..7e7f60daea06b
--- /dev/null
+++ b/code/modules/goonhub/api/models/players/weird/PlayerSearchResource.dm
@@ -0,0 +1,48 @@
+
+/// PlayerSearchResource
+/datum/apiModel/PlayerSearchResource
+	var/id = null // int
+	var/ip			= null 	// string
+	var/comp_id		= null 	// string
+	var/player_id	= null 	// string
+	var/ckey		= null 	// string
+	var/created_at	= null 	// string
+
+// ZEWAKA TODO: WTF NO UPDATED_AT????
+
+
+/datum/apiModel/PlayerSearchResource/New(
+	id,
+	ip,
+	comp_id,
+	player_id,
+	ckey,
+	created_at
+)
+	. = ..()
+	src.id = id
+	src.ip = ip
+	src.comp_id = comp_id
+	src.player_id = player_id
+	src.ckey = ckey
+	src.created_at = created_at
+
+/datum/apiModel/PlayerSearchResource/VerifyIntegrity()
+	if (
+		isnull(id) \
+		|| isnull(src.ip) \
+		|| isnull(src.comp_id) \
+		|| isnull(src.player_id) \
+		|| isnull(src.ckey) \
+		|| isnull(src.created_at) \
+	)
+		return FALSE
+
+/datum/apiModel/PlayerSearchResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["ip"] = src.ip
+	.["comp_id"] = src.comp_id
+	.["player_id"] = src.player_id
+	.["ckey"] = src.ckey
+	.["created_at"] = src.created_at
diff --git a/code/modules/goonhub/api/models/polls/PollAnswerResource.dm b/code/modules/goonhub/api/models/polls/PollAnswerResource.dm
new file mode 100644
index 0000000000000..efb44fd7b32e7
--- /dev/null
+++ b/code/modules/goonhub/api/models/polls/PollAnswerResource.dm
@@ -0,0 +1,26 @@
+
+/// PollAnswerResource
+/datum/apiModel/Tracked/PollAnswerResource
+	var/poll_option_id	= null // integer
+	var/poll_id			= null // integer
+
+/datum/apiModel/Tracked/PollAnswerResource/SetupFromResponse(response)
+	. = ..()
+	src.poll_option_id = response["poll_option_id"]
+	src.poll_id = response["poll_id"]
+
+/datum/apiModel/Tracked/PollAnswerResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.poll_option_id) \
+		|| isnull(src.poll_id) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PollAnswerResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["poll_option_id"] = src.poll_option_id
+	.["poll_id"] = src.poll_id
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/polls/PollOptionResource.dm b/code/modules/goonhub/api/models/polls/PollOptionResource.dm
new file mode 100644
index 0000000000000..5dc91635a2fa4
--- /dev/null
+++ b/code/modules/goonhub/api/models/polls/PollOptionResource.dm
@@ -0,0 +1,37 @@
+
+/// PollOptionResource
+/datum/apiModel/PollOptionResource
+	var/id 					= null // integer
+	var/poll_id				= null // integer
+	var/option				= null // integer
+	var/position			= null // string
+	var/answers_count		= null // integer
+	var/answers_player_ids	= null // [integer]
+
+/datum/apiModel/PollOptionResource/SetupFromResponse(response)
+	. = ..()
+	src.id = response["id"]
+	src.poll_id = response["poll_id"]
+	src.option = response["option"]
+	src.position = response["position"]
+	src.answers_count = response["answers_count"]
+	src.answers_player_ids = response["answers_player_ids"]
+
+/datum/apiModel/PollOptionResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.id) \
+		|| isnull(src.poll_id) \
+		|| isnull(src.option) \
+		|| isnull(src.answers_player_ids) \
+	)
+		return FALSE
+
+/datum/apiModel/PollOptionResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["poll_id"] = src.poll_id
+	.["option"] = src.option
+	.["position"] = src.position
+	.["answers_count"] = src.answers_count
+	.["answers_player_ids"] = src.answers_player_ids
diff --git a/code/modules/goonhub/api/models/polls/PollResource.dm b/code/modules/goonhub/api/models/polls/PollResource.dm
new file mode 100644
index 0000000000000..f9b83f78d871e
--- /dev/null
+++ b/code/modules/goonhub/api/models/polls/PollResource.dm
@@ -0,0 +1,55 @@
+
+/// PollResource
+/datum/apiModel/Tracked/PollResource
+	var/game_admin_id									= null // integer
+	var/datum/apiModel/Tracked/GameAdmin/game_admin		= null // GameAdmin
+	var/question										= null // string
+	var/list/datum/apiModel/PollOptionResource/options	= null // [PollOptionResource]
+	var/servers											= null // [string]
+	var/total_answers									= null // integer
+	var/winning_option_id								= null // integer
+	var/multiple_choice									= null // boolean
+	var/expires_at										= null // date-time
+
+/datum/apiModel/Tracked/PollResource/SetupFromResponse(response)
+	. = ..()
+	src.game_admin_id = response["game_admin_id"]
+	if ("game_admin" in response)
+		src.game_admin = new
+		src.game_admin.SetupFromResponse(response["game_admin"])
+	src.question = response["question"]
+	src.options = list()
+	for (var/item in response["options"])
+		var/datum/apiModel/PollOptionResource/option = new
+		option.SetupFromResponse(item)
+		src.options.Add(option)
+	src.servers = response["servers"]
+	src.total_answers = response["total_answers"]
+	src.winning_option_id = response["winning_option_id"]
+	src.multiple_choice = response["multiple_choice"]
+	src.expires_at = response["expires_at"]
+
+/datum/apiModel/Tracked/PollResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.question) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/PollResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["game_admin_id"] = src.game_admin_id
+	if (src.game_admin)
+		.["game_admin"] = src.game_admin.ToList()
+	.["question"] = src.question
+	.["options"] = list()
+	for (var/datum/apiModel/PollOptionResource/option in src.options)
+		.["options"] += list(option.ToList())
+	.["servers"] = src.servers
+	.["total_answers"] = src.total_answers
+	.["winning_option_id"] = src.winning_option_id
+	.["multiple_choice"] = src.multiple_choice
+	.["expires_at"] = src.expires_at
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/polls/PollResourceList.dm b/code/modules/goonhub/api/models/polls/PollResourceList.dm
new file mode 100644
index 0000000000000..b4121f0dae1db
--- /dev/null
+++ b/code/modules/goonhub/api/models/polls/PollResourceList.dm
@@ -0,0 +1,11 @@
+
+/// PollResourceList
+/datum/apiModel/Paginated/PollResourceList
+
+/datum/apiModel/Paginated/PollResourceList/SetupFromResponse(response)
+	. = ..()
+	src.data = list()
+	for (var/item in response["data"])
+		var/datum/apiModel/Tracked/PollResource/poll = new()
+		poll.SetupFromResponse(item)
+		src.data.Add(poll)
diff --git a/code/modules/goonhub/api/models/randomentries/RandomEntries.dm b/code/modules/goonhub/api/models/randomentries/RandomEntries.dm
new file mode 100644
index 0000000000000..816ebe5ec3be2
--- /dev/null
+++ b/code/modules/goonhub/api/models/randomentries/RandomEntries.dm
@@ -0,0 +1,35 @@
+
+/// RandomEntries
+/datum/apiModel/RandomEntries
+	var/list/datum/apiModel/entries = list() // [Model]
+
+/datum/apiModel/RandomEntries/SetupFromResponse(response, datum/apiRoute/route)
+	. = ..()
+	var/datum/apiModel/entryType
+	switch(route.queryParams["type"])
+		if ("tickets")
+			entryType = /datum/apiModel/Tracked/EventTicketResource
+		if ("fines")
+			entryType = /datum/apiModel/Tracked/EventFineResource
+		if ("ai_laws")
+			entryType = /datum/apiModel/Tracked/EventAiLawResource
+		if ("station_names")
+			entryType = /datum/apiModel/Tracked/EventStationNameResource
+
+	for (var/item in response)
+		var/datum/apiModel/entry = new entryType
+		entry.SetupFromResponse(item)
+		src.entries.Add(entry)
+
+/datum/apiModel/RandomEntries/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.entries) \
+	)
+		return FALSE
+
+/datum/apiModel/RandomEntries/ToList()
+	. = ..()
+	.["entries"] = list()
+	for (var/datum/apiModel/entry in src.entries)
+		.["entries"] += list(entry.ToList())
diff --git a/code/modules/goonhub/api/models/rounds/GameRound.dm b/code/modules/goonhub/api/models/rounds/GameRound.dm
new file mode 100644
index 0000000000000..1a2b69e14f09b
--- /dev/null
+++ b/code/modules/goonhub/api/models/rounds/GameRound.dm
@@ -0,0 +1,41 @@
+
+/// GameRound
+/datum/apiModel/Tracked/GameRound
+	var/server_id	= null // string
+	var/map			= null // string
+	var/game_type	= null // string
+	var/rp_mode		= null // boolean
+	var/crashed		= null // boolean
+	var/ended_at	= null // date-time
+
+/datum/apiModel/Tracked/GameRound/SetupFromResponse(response)
+	. = ..()
+	src.id = response["id"]
+	src.server_id = response["server_id"]
+	src.map = response["map"]
+	src.game_type = response["game_type"]
+	src.rp_mode = response["rp_mode"]
+	src.crashed = response["crashed"]
+	src.ended_at = response["ended_at"]
+	src.created_at = response["created_at"]
+	src.updated_at = response["updated_at"]
+
+/datum/apiModel/Tracked/GameRound/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.server_id) \
+		|| isnull(src.rp_mode) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/GameRound/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["server_id"] = src.server_id
+	.["map"] = src.map
+	.["game_type"] = src.game_type
+	.["rp_mode"] = src.rp_mode
+	.["crashed"] = src.crashed
+	.["ended_at"] = src.ended_at
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/vpn/VpnCheckResource.dm b/code/modules/goonhub/api/models/vpn/VpnCheckResource.dm
new file mode 100644
index 0000000000000..26f69285d92ae
--- /dev/null
+++ b/code/modules/goonhub/api/models/vpn/VpnCheckResource.dm
@@ -0,0 +1,52 @@
+
+/// VpnCheckResource
+/datum/apiModel/VpnCheckResource
+	var/id			= null // integer
+	var/round_id	= null // integer
+	var/ip			= null // integer
+	var/service		= null // string
+	var/response	= null // string
+	var/error		= null // string
+	var/list/meta = null // list(boolean, boolean)
+	var/created_at = null // date-time
+	var/updated_at = null // date-time
+
+/datum/apiModel/VpnCheckResource/SetupFromResponse(response)
+	. = ..()
+	if ("id" in response)
+		src.round_id = response["id"]
+	if ("round_id" in response)
+		src.round_id = response["round_id"]
+	if ("ip" in response)
+		src.ip = response["ip"]
+	if ("service" in response)
+		src.service = response["service"]
+	if ("response" in response)
+		src.response = response["response"]
+	if ("error" in response)
+		src.error = response["error"]
+	if ("created_at" in response)
+		src.round_id = response["created_at"]
+	if ("updated_at" in response)
+		src.round_id = response["updated_at"]
+	src.meta = response["meta"]
+
+// No parent call, id or date fields can be null for this
+/datum/apiModel/VpnCheckResource/VerifyIntegrity()
+	if (
+		isnull(src.meta) \
+	)
+		return FALSE
+	return TRUE
+
+/datum/apiModel/VpnCheckResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["round_id"] = src.round_id
+	.["ip"] = src.ip
+	.["service"] = src.service
+	.["response"] = src.response
+	.["error"] = src.error
+	.["meta"] = src.meta
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
diff --git a/code/modules/goonhub/api/models/vpn/VpnWhitelistResource.dm b/code/modules/goonhub/api/models/vpn/VpnWhitelistResource.dm
new file mode 100644
index 0000000000000..d8d81057768a7
--- /dev/null
+++ b/code/modules/goonhub/api/models/vpn/VpnWhitelistResource.dm
@@ -0,0 +1,29 @@
+
+/// VpnWhitelistResource
+/datum/apiModel/Tracked/VpnWhitelistResource
+	var/game_admin_id	= null // integer
+	var/ckey			= null // string
+	var/game_admin		= null // { id: integer, ckey: string, name: string } - not required - TODO?
+
+/datum/apiModel/Tracked/VpnWhitelistResource/SetupFromResponse(response)
+	. = ..()
+	src.game_admin_id = response["game_admin_id"]
+	src.ckey = response["ckey"]
+	src.game_admin = response["game_admin"]
+
+/datum/apiModel/Tracked/VpnWhitelistResource/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.game_admin_id) \
+		|| isnull(src.ckey) \
+	)
+		return FALSE
+
+/datum/apiModel/Tracked/VpnWhitelistResource/ToList()
+	. = ..()
+	.["id"] = src.id
+	.["game_admin_id"] = src.game_admin_id
+	.["ckey"] = src.ckey
+	.["created_at"] = src.created_at
+	.["updated_at"] = src.updated_at
+	.["game_admin"] = src.game_admin
diff --git a/code/modules/goonhub/api/models/vpn/VpnWhitelistSearch.dm b/code/modules/goonhub/api/models/vpn/VpnWhitelistSearch.dm
new file mode 100644
index 0000000000000..667db3725cc33
--- /dev/null
+++ b/code/modules/goonhub/api/models/vpn/VpnWhitelistSearch.dm
@@ -0,0 +1,19 @@
+
+/// VpnWhitelistSearch
+/datum/apiModel/VpnWhitelistSearch
+	var/whitelisted = null // boolean
+
+/datum/apiModel/VpnWhitelistSearch/SetupFromResponse(response)
+	. = ..()
+	src.whitelisted = response["whitelisted"]
+
+/datum/apiModel/VpnWhitelistSearch/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.whitelisted) \
+	)
+		return FALSE
+
+/datum/apiModel/VpnWhitelistSearch/ToList()
+	. = ..()
+	.["whitelisted"] = src.whitelisted
diff --git a/code/modules/goonhub/api/requests/RemoteMusicBody.dm b/code/modules/goonhub/api/requests/RemoteMusicBody.dm
new file mode 100644
index 0000000000000..69272c2c1261d
--- /dev/null
+++ b/code/modules/goonhub/api/requests/RemoteMusicBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/remoteMusic
+	fields = list(
+		"video", // string
+		"round_id", // integer
+		"game_admin_ckey" // string
+	)
+
+/datum/apiBody/remoteMusic/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["video"]) \
+		|| isnull(src.values["round_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/apiBody.dm b/code/modules/goonhub/api/requests/apiBody.dm
new file mode 100644
index 0000000000000..a1b3c20b9ebe9
--- /dev/null
+++ b/code/modules/goonhub/api/requests/apiBody.dm
@@ -0,0 +1,41 @@
+
+ABSTRACT_TYPE(/datum/apiBody)
+/// Represents the body of an API request - ABSTRACT
+/// Everything is generally required unless annotated as such
+/datum/apiBody
+	var/list/fields = list()
+	var/list/values = list()
+
+/datum/apiBody/New(list/fieldValues)
+	. = ..()
+	src.setValues(fieldValues)
+	if (!VerifyIntegrity())
+#if defined(SPACEMAN_DMM)
+		return
+#elif DM_VERSION >= 515 || defined(OPENDREAM) // Yay, actual sanity!
+		var/datum/apiModel/Error/errorModel = new
+		errorModel.SetupFromResponse(list("message" = "malformed [__TYPE__] [src.toJson()]"))
+		throw EXCEPTION(errorModel)
+#else
+		var/datum/apiModel/Error/errorModel = new
+		errorModel.SetupFromResponse(list("message" = "malformed api body [json_encode(src.toJson())]"))
+		throw EXCEPTION(errorModel)
+#endif
+
+/// Build a list of values based on fields and input
+/datum/apiBody/proc/setValues(list/fieldValues)
+	var/idx = 1
+	for (var/key in src.fields)
+		src.values[key] = fieldValues[idx]
+		idx++
+
+/// Override to verify that the model object is correctly formed. Return FALSE if not.
+/datum/apiBody/proc/VerifyIntegrity()
+	return TRUE
+
+/// Override to provide a way to convert this body to json
+/datum/apiBody/proc/toJson()
+	. = list()
+	for (var/key in src.fields)
+		.[key] = src.values[key]
+	. = json_encode(.)
diff --git a/code/modules/goonhub/api/requests/bans/AddBansBody.dm b/code/modules/goonhub/api/requests/bans/AddBansBody.dm
new file mode 100644
index 0000000000000..59f6665d33773
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/AddBansBody.dm
@@ -0,0 +1,22 @@
+
+/datum/apiBody/bans/add
+	fields = list(
+		"game_admin_ckey", // string
+		"round_id", // integer
+		"server_id", // string
+		"ckey", // string
+		"comp_id", // string
+		"ip", // string
+		"reason", // string
+		"duration", // integer
+		"requires_appeal" // boolean
+	)
+
+/datum/apiBody/bans/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"]) \
+		|| isnull(src.values["round_id"]) \
+		|| isnull(src.values["reason"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/bans/AddBansDetailBody.dm b/code/modules/goonhub/api/requests/bans/AddBansDetailBody.dm
new file mode 100644
index 0000000000000..d8d0e0579b27d
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/AddBansDetailBody.dm
@@ -0,0 +1,10 @@
+
+/datum/apiBody/bans/add_detail
+	fields = list(
+		"ckey", // string
+		"comp_id", // string
+		"ip" // string
+	)
+
+/datum/apiBody/bans/add_detail/VerifyIntegrity()
+	. = ..()
diff --git a/code/modules/goonhub/api/requests/bans/AddJobBansBody.dm b/code/modules/goonhub/api/requests/bans/AddJobBansBody.dm
new file mode 100644
index 0000000000000..835a1064dd87c
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/AddJobBansBody.dm
@@ -0,0 +1,21 @@
+
+/datum/apiBody/jobbans/add
+	fields = list(
+		"game_admin_ckey", // string
+		"round_id", // integer
+		"server_id", // string
+		"ckey", // string
+		"job", // string
+		"reason", // string
+		"duration" // integer
+	)
+
+/datum/apiBody/jobbans/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"]) \
+		|| isnull(src.values["round_id"]) \
+		|| isnull(src.values["ckey"]) \
+		|| isnull(src.values["job"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/bans/DeleteBansBody.dm b/code/modules/goonhub/api/requests/bans/DeleteBansBody.dm
new file mode 100644
index 0000000000000..202686022202b
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/DeleteBansBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/bans/delete
+	fields = list(
+		"game_admin_ckey", // string
+	)
+
+/datum/apiBody/bans/delete/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/bans/DeleteJobBanBody.dm b/code/modules/goonhub/api/requests/bans/DeleteJobBanBody.dm
new file mode 100644
index 0000000000000..42ef5e8dda524
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/DeleteJobBanBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/jobbans/delete
+	fields = list(
+		"server_id", // string
+		"ckey", // string
+		"job" // string
+	)
+
+/datum/apiBody/jobbans/delete/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["ckey"]) \
+		|| isnull(src.values["job"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/bans/UpdateJobBansBody.dm b/code/modules/goonhub/api/requests/bans/UpdateJobBansBody.dm
new file mode 100644
index 0000000000000..f223da17eb34e
--- /dev/null
+++ b/code/modules/goonhub/api/requests/bans/UpdateJobBansBody.dm
@@ -0,0 +1,16 @@
+
+/datum/apiBody/jobbans/update
+	fields = list(
+		"server_id", // string
+		"job", // string
+		"reason", // string
+		"duration" // integer
+	)
+
+/datum/apiBody/jobbans/update/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["job"]) \
+	)
+		return FALSE
+
diff --git a/code/modules/goonhub/api/requests/dectalk/DectalkPlayBody.dm b/code/modules/goonhub/api/requests/dectalk/DectalkPlayBody.dm
new file mode 100644
index 0000000000000..052b8536f3470
--- /dev/null
+++ b/code/modules/goonhub/api/requests/dectalk/DectalkPlayBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/dectalk/play
+	fields = list(
+		"text", // string
+		"round_id" // integer
+	)
+
+/datum/apiBody/dectalk/play/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["text"]) \
+		|| isnull(src.values["round_id"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/gameadmins/AddGameAdminsBody.dm b/code/modules/goonhub/api/requests/gameadmins/AddGameAdminsBody.dm
new file mode 100644
index 0000000000000..776413dc5aea1
--- /dev/null
+++ b/code/modules/goonhub/api/requests/gameadmins/AddGameAdminsBody.dm
@@ -0,0 +1,34 @@
+/datum/apiBody/gameadmins/post
+	var/ckey = "string"
+	var/name = "string"
+	var/discord_id = "string"
+	var/rank = "integer"
+
+/datum/apiBody/gameadmins/post/New(
+	ckey,
+	name,
+	discord_id,
+	rank
+)
+	. = ..()
+	src.ckey = ckey
+	src.name = name
+	src.discord_id = discord_id
+	src.rank = rank
+
+/datum/apiBody/gameadmins/post/VerifyIntegrity()
+	if (
+		isnull(src.ckey) \
+		|| isnull(src.name) \
+		|| isnull(src.discord_id) \
+		|| isnull(src.rank)
+	)
+		return FALSE
+
+/datum/apiBody/gameadmins/post/toJson()
+	return json_encode(list(
+		"ckey"				= src.ckey,
+		"name"				= src.name,
+		"discord_id"		= src.discord_id,
+		"rank"				= src.rank,
+	))
diff --git a/code/modules/goonhub/api/requests/gameadmins/UpdateGameAdminsBody.dm b/code/modules/goonhub/api/requests/gameadmins/UpdateGameAdminsBody.dm
new file mode 100644
index 0000000000000..737d1ba797055
--- /dev/null
+++ b/code/modules/goonhub/api/requests/gameadmins/UpdateGameAdminsBody.dm
@@ -0,0 +1,34 @@
+/datum/apiBody/gameadmins/put
+	var/ckey = "string"
+	var/name = "string"
+	var/discord_id = "string"
+	var/rank = "integer"
+
+/datum/apiBody/gameadmins/put/New(
+	ckey,
+	name,
+	discord_id,
+	rank
+)
+	. = ..()
+	src.ckey = ckey
+	src.name = name
+	src.discord_id = discord_id
+	src.rank = rank
+
+/datum/apiBody/gameadmins/put/VerifyIntegrity()
+	if (
+		isnull(src.ckey) \
+		|| isnull(src.name) \
+		|| isnull(src.discord_id) \
+		|| isnull(src.rank)
+	)
+		return FALSE
+
+/datum/apiBody/gameadmins/put/toJson()
+	return json_encode(list(
+		"ckey"				= src.ckey,
+		"name"				= src.name,
+		"discord_id"		= src.discord_id,
+		"rank"				= src.rank,
+	))
diff --git a/code/modules/goonhub/api/requests/maps/MapSwitchBody.dm b/code/modules/goonhub/api/requests/maps/MapSwitchBody.dm
new file mode 100644
index 0000000000000..012da211842bd
--- /dev/null
+++ b/code/modules/goonhub/api/requests/maps/MapSwitchBody.dm
@@ -0,0 +1,17 @@
+
+/datum/apiBody/mapswitch
+	fields = list(
+		"game_admin_ckey", // string
+		"round_id", // integer
+		"server_id", // string
+		"map", // string
+		"votes" // integer
+	)
+
+/datum/apiBody/mapswitch/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["round_id"]) \
+		|| isnull(src.values["map"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerAntagsBody.dm b/code/modules/goonhub/api/requests/players/PlayerAntagsBody.dm
new file mode 100644
index 0000000000000..edcb7d393bcc2
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerAntagsBody.dm
@@ -0,0 +1,18 @@
+
+/datum/apiBody/PlayerAntags
+	fields = list(
+		"player_id", // integer
+		"round_id", // integer
+		"antag_role", // string
+		"late_join", // boolean
+		"weight_exempt" // boolean
+	)
+
+/datum/apiBody/PlayerAntags/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["round_id"]) \
+		|| isnull(src.values["antag_role"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerLoginBody.dm b/code/modules/goonhub/api/requests/players/PlayerLoginBody.dm
new file mode 100644
index 0000000000000..2b4b3cdc8d677
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerLoginBody.dm
@@ -0,0 +1,20 @@
+
+/datum/apiBody/players/login
+	fields = list(
+		"ckey", // string
+		"key", // string
+		"ip", // string
+		"comp_id", // string
+		"byond_major", // integer
+		"byond_minor", // integer
+		"round_id", // integer
+	)
+
+/datum/apiBody/players/login/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["ckey"]) \
+		|| isnull(src.values["key"]) \
+		|| isnull(src.values["round_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerMetadataBody.dm b/code/modules/goonhub/api/requests/players/PlayerMetadataBody.dm
new file mode 100644
index 0000000000000..2ab19226a8754
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerMetadataBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/players/metadata
+	fields = list(
+		"player_id", // integer
+		"metadata" // string
+	)
+
+/datum/apiBody/players/metadata/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["metadata"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerParticipationsBody.dm b/code/modules/goonhub/api/requests/players/PlayerParticipationsBody.dm
new file mode 100644
index 0000000000000..d1619d97e97ff
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerParticipationsBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/PlayerParticipation
+	fields = list(
+		"player_id", // integer
+		"round_id", // integer
+		"job" // string
+	)
+
+/datum/apiBody/PlayerParticipation/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["round_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerParticipationsBulkBody.dm b/code/modules/goonhub/api/requests/players/PlayerParticipationsBulkBody.dm
new file mode 100644
index 0000000000000..3b219cc573d3c
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerParticipationsBulkBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/PlayerParticipationBulk
+	fields = list(
+		"players", // list
+		"round_id" // integer
+	)
+
+/datum/apiBody/PlayerParticipationBulk/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["players"]) \
+		|| isnull(src.values["round_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerPlaytimeBody.dm b/code/modules/goonhub/api/requests/players/PlayerPlaytimeBody.dm
new file mode 100644
index 0000000000000..a15cc12b01fec
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerPlaytimeBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/players/playtime
+	fields = list(
+		"server_id", // string
+		"players" /// [{id: string, seconds_played: integer}]
+	)
+
+/datum/apiBody/players/playtime/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["server_id"]) \
+		|| isnull(src.values["players"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesAddDataBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesAddDataBody.dm
new file mode 100644
index 0000000000000..59bf6396f9a38
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesAddDataBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/PlayerSavesAddData
+	fields = list(
+		"player_id", // integer
+		"key", // string
+		"value" //string
+	)
+
+/datum/apiBody/PlayerSavesAddData/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["key"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesAddSaveBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesAddSaveBody.dm
new file mode 100644
index 0000000000000..f4f87871bf6dd
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesAddSaveBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/PlayerSavesAddSave
+	fields = list(
+		"player_id", // integer
+		"name", // string
+		"data" //string
+	)
+
+/datum/apiBody/PlayerSavesAddSave/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["name"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesBulkBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesBulkBody.dm
new file mode 100644
index 0000000000000..363129d2434c4
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesBulkBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/PlayerSavesBulkData
+	fields = list(
+		"data" // string
+	)
+
+/datum/apiBody/PlayerSavesBulkData/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["data"])
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesDeleteDataBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesDeleteDataBody.dm
new file mode 100644
index 0000000000000..fe75ecff1de25
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesDeleteDataBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/PlayerSavesDeleteData
+	fields = list(
+		"player_id", // integer
+		"key", // string
+	)
+
+/datum/apiBody/PlayerSavesDeleteData/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["key"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesDeleteSaveBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesDeleteSaveBody.dm
new file mode 100644
index 0000000000000..5cc2f729bebd9
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesDeleteSaveBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/PlayerSavesDeleteSave
+	fields = list(
+		"player_id", // integer
+		"name", // string
+	)
+
+/datum/apiBody/PlayerSavesDeleteSave/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+		|| isnull(src.values["name"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/PlayerSavesTransferFilesBody.dm b/code/modules/goonhub/api/requests/players/PlayerSavesTransferFilesBody.dm
new file mode 100644
index 0000000000000..e20de1b57b1ea
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/PlayerSavesTransferFilesBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/PlayerSavesTransferFiles
+	fields = list(
+		"from_ckey", // integer
+		"to_ckey", // string
+	)
+
+/datum/apiBody/PlayerSavesTransferFiles/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["from_ckey"]) \
+		|| isnull(src.values["to_ckey"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/medals/AddPlayerMedalBody.dm b/code/modules/goonhub/api/requests/players/medals/AddPlayerMedalBody.dm
new file mode 100644
index 0000000000000..cef16234f1708
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/medals/AddPlayerMedalBody.dm
@@ -0,0 +1,16 @@
+
+/datum/apiBody/players/medals/add
+	fields = list(
+		"player_id", // integer
+		"ckey", // string
+		"medal", // string
+		"round_id", // integer
+	)
+
+/datum/apiBody/players/medals/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["medal"]) \
+		|| isnull(src.values["round_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/medals/DeletePlayerMedalBody.dm b/code/modules/goonhub/api/requests/players/medals/DeletePlayerMedalBody.dm
new file mode 100644
index 0000000000000..1a6dbac9814f2
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/medals/DeletePlayerMedalBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/players/medals/delete
+	fields = list(
+		"player_id", // integer
+		"ckey", // string
+		"medal", // string
+	)
+
+/datum/apiBody/players/medals/delete/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["medal"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/notes/AddPlayerNotesBody.dm b/code/modules/goonhub/api/requests/players/notes/AddPlayerNotesBody.dm
new file mode 100644
index 0000000000000..e670e0072b80b
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/notes/AddPlayerNotesBody.dm
@@ -0,0 +1,20 @@
+
+/datum/apiBody/players/notes/post
+	fields = list(
+		"game_admin_ckey", // string
+		"round_id", // integer
+		"server_id", // string
+		"ckey", // string
+		"note" // string
+	)
+
+/datum/apiBody/players/notes/post/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"]) \
+		|| isnull(src.values["round_id"]) \
+		|| isnull(src.values["server_id"]) \
+		|| isnull(src.values["ckey"]) \
+		|| isnull(src.values["note"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/players/notes/UpdatePlayerNotesBody.dm b/code/modules/goonhub/api/requests/players/notes/UpdatePlayerNotesBody.dm
new file mode 100644
index 0000000000000..5fc9875d526b0
--- /dev/null
+++ b/code/modules/goonhub/api/requests/players/notes/UpdatePlayerNotesBody.dm
@@ -0,0 +1,35 @@
+
+/datum/apiBody/players/notes/update
+	var/game_admin_ckey		= "string"
+	var/server_id			= "string"
+	var/ckey				= "string"
+	var/note				= "string"
+
+/datum/apiBody/players/notes/update/New(
+	game_admin_ckey,
+	server_id,
+	ckey,
+	note
+)
+	. = ..()
+	src.game_admin_ckey = game_admin_ckey
+	src.server_id = server_id
+	src.ckey = ckey
+	src.note = note
+
+/datum/apiBody/players/notes/update/VerifyIntegrity()
+	if (
+		isnull(src.game_admin_ckey) \
+		|| isnull(src.server_id) \
+		|| isnull(src.ckey) \
+		|| isnull(src.note) \
+	)
+		return FALSE
+
+/datum/apiBody/players/notes/update/toJson()
+	return json_encode(list(
+		"game_admin_ckey"	= src.game_admin_ckey,
+		"server_id"			= src.server_id,
+		"ckey"				= src.ckey,
+		"note"				= src.note,
+	))
diff --git a/code/modules/goonhub/api/requests/polls/AddPollBody.dm b/code/modules/goonhub/api/requests/polls/AddPollBody.dm
new file mode 100644
index 0000000000000..b8dfc8d208ea6
--- /dev/null
+++ b/code/modules/goonhub/api/requests/polls/AddPollBody.dm
@@ -0,0 +1,18 @@
+
+/datum/apiBody/polls/add
+	fields = list(
+		"game_admin_ckey", // string
+		"question", // string
+		"multiple_choice", // boolean
+		"expires_at", // date-time
+		"options", // [string]
+		"servers" // [string]
+	)
+
+/datum/apiBody/polls/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["question"]) \
+		|| isnull(src.values["options"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/polls/AddPollOptionBody.dm b/code/modules/goonhub/api/requests/polls/AddPollOptionBody.dm
new file mode 100644
index 0000000000000..8d72f4153d4fb
--- /dev/null
+++ b/code/modules/goonhub/api/requests/polls/AddPollOptionBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/polls/options/add
+	fields = list(
+		"option", // string
+	)
+
+/datum/apiBody/polls/options/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["option"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/polls/EditPollBody.dm b/code/modules/goonhub/api/requests/polls/EditPollBody.dm
new file mode 100644
index 0000000000000..6d3a0fb8ee7d2
--- /dev/null
+++ b/code/modules/goonhub/api/requests/polls/EditPollBody.dm
@@ -0,0 +1,10 @@
+
+/datum/apiBody/polls/edit
+	fields = list(
+		"question", // string
+		"expires_at", // date-time
+		"servers" // [string]
+	)
+
+/datum/apiBody/polls/edit/VerifyIntegrity()
+	. = ..()
diff --git a/code/modules/goonhub/api/requests/polls/EditPollOptionBody.dm b/code/modules/goonhub/api/requests/polls/EditPollOptionBody.dm
new file mode 100644
index 0000000000000..43d3ae4c89377
--- /dev/null
+++ b/code/modules/goonhub/api/requests/polls/EditPollOptionBody.dm
@@ -0,0 +1,13 @@
+
+/datum/apiBody/polls/options/edit
+	fields = list(
+		"option", // string
+		"position" // integer
+	)
+
+/datum/apiBody/polls/options/edit/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["option"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/polls/PickUnpickPollOptionBody.dm b/code/modules/goonhub/api/requests/polls/PickUnpickPollOptionBody.dm
new file mode 100644
index 0000000000000..093d44dc9a6b2
--- /dev/null
+++ b/code/modules/goonhub/api/requests/polls/PickUnpickPollOptionBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/polls/options/pickUnpick
+	fields = list(
+		"player_id", // integer
+	)
+
+/datum/apiBody/polls/options/pickUnpick/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["player_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/rounds/AddGameRoundBody.dm b/code/modules/goonhub/api/requests/rounds/AddGameRoundBody.dm
new file mode 100644
index 0000000000000..647d61753295b
--- /dev/null
+++ b/code/modules/goonhub/api/requests/rounds/AddGameRoundBody.dm
@@ -0,0 +1,15 @@
+
+/datum/apiBody/rounds/post
+	fields = list(
+		"map", // string
+		"server_id", // string
+		"rp_mode", // boolean
+	)
+
+/datum/apiBody/rounds/post/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["map"]) \
+		|| isnull(src.values["server_id"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/rounds/EndGameRoundBody.dm b/code/modules/goonhub/api/requests/rounds/EndGameRoundBody.dm
new file mode 100644
index 0000000000000..b4dad08b509c3
--- /dev/null
+++ b/code/modules/goonhub/api/requests/rounds/EndGameRoundBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/rounds/end
+	fields = list(
+		"crashed", // boolean
+	)
+
+/datum/apiBody/rounds/end/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["crashed"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/rounds/UpdateGameRoundBody.dm b/code/modules/goonhub/api/requests/rounds/UpdateGameRoundBody.dm
new file mode 100644
index 0000000000000..6666d7d320eff
--- /dev/null
+++ b/code/modules/goonhub/api/requests/rounds/UpdateGameRoundBody.dm
@@ -0,0 +1,12 @@
+
+/datum/apiBody/rounds/update
+	fields = list(
+		"game_type", // string
+	)
+
+/datum/apiBody/rounds/update/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_type"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/requests/vpn/AddVpnWhitelistBody.dm b/code/modules/goonhub/api/requests/vpn/AddVpnWhitelistBody.dm
new file mode 100644
index 0000000000000..c050e9e131f1e
--- /dev/null
+++ b/code/modules/goonhub/api/requests/vpn/AddVpnWhitelistBody.dm
@@ -0,0 +1,14 @@
+
+/datum/apiBody/vpnwhitelist/add
+	fields = list(
+		"game_admin_ckey", // string
+		"ckey", // string
+	)
+
+/datum/apiBody/vpnwhitelist/add/VerifyIntegrity()
+	. = ..()
+	if (
+		isnull(src.values["game_admin_ckey"]) \
+		|| isnull(src.values["ckey"]) \
+	)
+		return FALSE
diff --git a/code/modules/goonhub/api/routes/RandomEntries.dm b/code/modules/goonhub/api/routes/RandomEntries.dm
new file mode 100644
index 0000000000000..87e7d9d8f7693
--- /dev/null
+++ b/code/modules/goonhub/api/routes/RandomEntries.dm
@@ -0,0 +1,8 @@
+
+/// GET /random-entries
+/// Get a list of random entries by type
+/datum/apiRoute/randomEntries
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/random-entries"
+	queryParams = list("type", "count")
+	correct_response = /datum/apiModel/RandomEntries
diff --git a/code/modules/goonhub/api/routes/RemoteMusic.dm b/code/modules/goonhub/api/routes/RemoteMusic.dm
new file mode 100644
index 0000000000000..6ffc78dc5817a
--- /dev/null
+++ b/code/modules/goonhub/api/routes/RemoteMusic.dm
@@ -0,0 +1,15 @@
+
+/// POST /remote-music
+/// Queue a piece of music from youtube to be played in a given round
+/datum/apiRoute/remoteMusic
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/remote-music"
+	body = /datum/apiBody/remoteMusic
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		video,
+		round_id,
+		game_admin_ckey
+	)
+	 . = ..(args)
diff --git a/code/modules/goonhub/api/routes/apiRoute.dm b/code/modules/goonhub/api/routes/apiRoute.dm
new file mode 100644
index 0000000000000..26b4aa895661c
--- /dev/null
+++ b/code/modules/goonhub/api/routes/apiRoute.dm
@@ -0,0 +1,44 @@
+
+
+/// Base apiCall type
+/// Represents a predefined query we can make to the Goonhub API
+/// SECURITY: Sanitization occurs right before output
+/datum/apiRoute
+	/// HTTP Method this call uses, for example `RUSTG_HTTP_METHOD_GET`
+	var/method = null
+	/// Actual path of the api query, for example `/rounds`
+	var/path = null
+	/// Route parameters for the call, ie /rounds/{round_id}/ - Must be in order
+	var/list/routeParams = null
+	/// Query parameters for the call, ie /rounds?&id=3
+	var/list/queryParams = null
+	/// Body of the request, invalid for GET
+	var/datum/apiBody/body = null
+	/// The expected type upon deserialization
+	var/correct_response = null
+
+
+/// Formats a given parameter associated list into a urlstring format
+/// E.g. `list("ckey"="zewaka") to `?&ckey=zewaka` and `list("x"=list("a" = "foo", "b" = "bar"))` to `?&x[a]=foo&x[b]=bar`
+/datum/apiRoute/proc/formatQueryParams()
+	if (length(src.queryParams))
+		. = list()
+		for (var/key in src.queryParams)
+			if (islist(src.queryParams[key])) // Do we need to encode the value?
+				if (length(src.queryParams[key]) > 0)
+					for (var/subKey in src.queryParams[key])
+						.["[key]\[[subKey]\]"] = src.queryParams[key][subKey]
+				else
+					.["[key]\[\]"] = null
+			else
+				.[key] = src.queryParams[key]
+		. = list2params(.)
+
+/// Formats a given parameter list into a route-append format
+/// E.g. `list("tuesday", "wednesday")` to `tuesday/wednesday`
+/datum/apiRoute/proc/formatRouteParams()
+	if (length(src.routeParams))
+		return jointext(src.routeParams, "/")
+
+/datum/apiRoute/proc/buildBody(list/fieldValues)
+	src.body = new src.body(fieldValues)
diff --git a/code/modules/goonhub/api/routes/bans/AddBanDetails.dm b/code/modules/goonhub/api/routes/bans/AddBanDetails.dm
new file mode 100644
index 0000000000000..fa1f48ebeaf4b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/AddBanDetails.dm
@@ -0,0 +1,15 @@
+/// POST /bans/details/{ban}
+/// Add new player details to an existing ban. This should be used when an evasion attempt is detected.
+/datum/apiRoute/bans/add_detail
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/bans/details"
+	routeParams = list("ban")	// integer (The ban ID)
+	body = /datum/apiBody/bans/add_detail
+	correct_response = /datum/apiModel/Tracked/BanDetail
+
+	buildBody(
+		ckey,
+		comp_id,
+		ip
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/bans/AddBans.dm b/code/modules/goonhub/api/routes/bans/AddBans.dm
new file mode 100644
index 0000000000000..705494e205b94
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/AddBans.dm
@@ -0,0 +1,20 @@
+/// POST /bans
+/// Add a ban for given player data
+/datum/apiRoute/bans/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/bans"
+	body = /datum/apiBody/bans/add
+	correct_response = /datum/apiModel/Tracked/BanResource
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		ckey,
+		comp_id,
+		ip,
+		reason,
+		duration,
+		requires_appeal
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/bans/CheckBans.dm b/code/modules/goonhub/api/routes/bans/CheckBans.dm
new file mode 100644
index 0000000000000..a9d56ce0a345b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/CheckBans.dm
@@ -0,0 +1,7 @@
+/// GET /bans/check
+/// Check
+/datum/apiRoute/bans/check
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/bans/check"
+	queryParams = list("ckey", "comp_id", "ip", "server_id") // string, string, string, string
+	correct_response = /datum/apiModel/Tracked/BanResource
diff --git a/code/modules/goonhub/api/routes/bans/DeleteBans.dm b/code/modules/goonhub/api/routes/bans/DeleteBans.dm
new file mode 100644
index 0000000000000..4fbe66fc0eade
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/DeleteBans.dm
@@ -0,0 +1,13 @@
+/// DELETE /bans/{ban}
+/// Delete
+/datum/apiRoute/bans/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/bans"
+	routeParams = list("ban")	// integer (The ban ID)
+	body = /datum/apiBody/bans/delete
+	correct_response = 	/datum/apiModel/Message
+
+	buildBody(
+		game_admin_ckey
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/bans/GetBans.dm b/code/modules/goonhub/api/routes/bans/GetBans.dm
new file mode 100644
index 0000000000000..d4d736cf432fa
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/GetBans.dm
@@ -0,0 +1,7 @@
+/// GET /bans
+/// Get
+/datum/apiRoute/bans/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/bans"
+	queryParams = list("filters", "sort_by", "descending", "page", "per_page") // object, string, string, int, int
+	correct_response = /datum/apiModel/Paginated/BanResourceList
diff --git a/code/modules/goonhub/api/routes/bans/RemoveBanDetails.dm b/code/modules/goonhub/api/routes/bans/RemoveBanDetails.dm
new file mode 100644
index 0000000000000..7e5a9f196dbfb
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/RemoveBanDetails.dm
@@ -0,0 +1,7 @@
+/// DELETE /bans/detail/{banDetail}
+/// Add Details
+/datum/apiRoute/bans/remove_detail
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/bans/details"
+	routeParams = list("banDetail")	// integer (The ban ID)
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/bans/UpdateBans.dm b/code/modules/goonhub/api/routes/bans/UpdateBans.dm
new file mode 100644
index 0000000000000..f3d1f22a96410
--- /dev/null
+++ b/code/modules/goonhub/api/routes/bans/UpdateBans.dm
@@ -0,0 +1,21 @@
+/// PUT /bans/{ban}
+/// Update
+/datum/apiRoute/bans/update
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/bans"
+	routeParams = list("ban")	// integer (The ban ID)
+	body = /datum/apiBody/bans/add
+	correct_response = /datum/apiModel/Tracked/BanResource
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		ckey,
+		comp_id,
+		ip,
+		reason,
+		duration,
+		requires_appeal
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/dectalk/PlayDectalk.dm b/code/modules/goonhub/api/routes/dectalk/PlayDectalk.dm
new file mode 100644
index 0000000000000..fd917f5c42ef4
--- /dev/null
+++ b/code/modules/goonhub/api/routes/dectalk/PlayDectalk.dm
@@ -0,0 +1,13 @@
+/// POST /dectalk/play
+/// Generate an audio file speaking the text provided.
+/datum/apiRoute/dectalk/play
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/dectalk/play"
+	body = /datum/apiBody/dectalk/play
+	correct_response = /datum/apiModel/DectalkPlayResource
+
+	buildBody(
+		text,
+		round_id
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/gameadminranks/AddGameAdminRanks.dm b/code/modules/goonhub/api/routes/gameadminranks/AddGameAdminRanks.dm
new file mode 100644
index 0000000000000..7253f761bc2ee
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadminranks/AddGameAdminRanks.dm
@@ -0,0 +1,8 @@
+
+/// POST /game-admin-ranks
+/// Add a new game admin rank
+/datum/apiRoute/gameadminrank/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/game-admin-ranks"
+	body = list("rank")
+	correct_response = /datum/apiModel/Tracked/GameAdminRank
diff --git a/code/modules/goonhub/api/routes/gameadminranks/DeleteGameAdminRanks.dm b/code/modules/goonhub/api/routes/gameadminranks/DeleteGameAdminRanks.dm
new file mode 100644
index 0000000000000..f2a71d5709462
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadminranks/DeleteGameAdminRanks.dm
@@ -0,0 +1,8 @@
+
+/// DELETE /game-admin-ranks/{gameAdmin}
+/// Delete an existing game admin
+/datum/apiRoute/gameadminranks/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/game-admin-ranks"
+	routeParams = list("gameAdminRank") // integer
+	correct_response = "string"
diff --git a/code/modules/goonhub/api/routes/gameadminranks/GetGameAdminRanks.dm b/code/modules/goonhub/api/routes/gameadminranks/GetGameAdminRanks.dm
new file mode 100644
index 0000000000000..77e3a4a4e7f9f
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadminranks/GetGameAdminRanks.dm
@@ -0,0 +1,8 @@
+
+/// GET /game-admin-ranks
+/// List paginated and filtered game admin ranks
+/datum/apiRoute/gameadminranks/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/game-admin-ranks"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Tracked/GameAdminResource
diff --git a/code/modules/goonhub/api/routes/gameadminranks/UpdateGameAdminRanks.dm b/code/modules/goonhub/api/routes/gameadminranks/UpdateGameAdminRanks.dm
new file mode 100644
index 0000000000000..ac1ffb9d29bca
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadminranks/UpdateGameAdminRanks.dm
@@ -0,0 +1,9 @@
+
+/// PUT /game-admin-ranks/{gameAdminRank}
+/// Update an existing game admin
+/datum/apiRoute/gameadminranks/put
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/game-admin-ranks"
+	body = list("rank")
+	routeParams = list("gameAdminRank") // integer
+	correct_response = /datum/apiModel/Tracked/GameAdminResource
diff --git a/code/modules/goonhub/api/routes/gameadmins/AddGameAdmins.dm b/code/modules/goonhub/api/routes/gameadmins/AddGameAdmins.dm
new file mode 100644
index 0000000000000..d53a4feaa8554
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadmins/AddGameAdmins.dm
@@ -0,0 +1,8 @@
+
+/// POST /game-admins
+/// Add a new game admin
+/datum/apiRoute/gameadmins/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/game-admins"
+	body = /datum/apiBody/gameadmins/post
+	correct_response = /datum/apiModel/Tracked/GameAdminResource
diff --git a/code/modules/goonhub/api/routes/gameadmins/DeleteGameAdmins.dm b/code/modules/goonhub/api/routes/gameadmins/DeleteGameAdmins.dm
new file mode 100644
index 0000000000000..b1289ffd66b58
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadmins/DeleteGameAdmins.dm
@@ -0,0 +1,8 @@
+
+/// DELETE /game-admins/{gameAdmin}
+/// Delete an existing game admin
+/datum/apiRoute/gameadmins/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/game-admins"
+	routeParams = list("gameAdmin") // integer
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/gameadmins/GetGameAdmins.dm b/code/modules/goonhub/api/routes/gameadmins/GetGameAdmins.dm
new file mode 100644
index 0000000000000..5eacd61fcbe05
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadmins/GetGameAdmins.dm
@@ -0,0 +1,8 @@
+
+/// GET /game-admins
+/// List paginated and filtered game admins
+/datum/apiRoute/gameadmins/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/game-admins"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Tracked/GameAdminResource
diff --git a/code/modules/goonhub/api/routes/gameadmins/UpdateGameAdmins.dm b/code/modules/goonhub/api/routes/gameadmins/UpdateGameAdmins.dm
new file mode 100644
index 0000000000000..c4826acfd8407
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gameadmins/UpdateGameAdmins.dm
@@ -0,0 +1,9 @@
+
+/// PUT /game-admins/{gameAdmin}
+/// Update an existing game admin
+/datum/apiRoute/gameadmins/put
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/game-admins"
+	body = /datum/apiBody/gameadmins/put
+	routeParams = list("gameAdmin") // integer
+	correct_response = /datum/apiModel/Tracked/GameAdminResource
diff --git a/code/modules/goonhub/api/routes/gauntlet/GetPreviousGauntlets.dm b/code/modules/goonhub/api/routes/gauntlet/GetPreviousGauntlets.dm
new file mode 100644
index 0000000000000..7e53387a75c2b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/gauntlet/GetPreviousGauntlets.dm
@@ -0,0 +1,7 @@
+/// GET /gauntlets/get-previous
+/// Retrieve a count of how many gauntlets a given key has completed
+/datum/apiRoute/gauntlet/getprevious
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/gauntlet/get-previous"
+	queryParams = list("key") // string
+	correct_response = /datum/apiModel/PreviousGauntlets
diff --git a/code/modules/goonhub/api/routes/jobbans/AddJobBans.dm b/code/modules/goonhub/api/routes/jobbans/AddJobBans.dm
new file mode 100644
index 0000000000000..9fa476afe9324
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/AddJobBans.dm
@@ -0,0 +1,18 @@
+/// POST /job-bans
+/// Add a new job ban
+/datum/apiRoute/jobbans/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/job-bans"
+	body = /datum/apiBody/jobbans/add
+	correct_response = /datum/apiModel/Tracked/JobBanResource
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		ckey,
+		job,
+		reason,
+		duration
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/jobbans/CheckJobBans.dm b/code/modules/goonhub/api/routes/jobbans/CheckJobBans.dm
new file mode 100644
index 0000000000000..8061d4fed2ceb
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/CheckJobBans.dm
@@ -0,0 +1,7 @@
+/// GET /job-bans/check
+/// Check if a job ban exists for given player and server details
+/datum/apiRoute/jobbans/check
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/job-bans/check"
+	queryParams = list("ckey", "job", "server_id") // string, string, string
+	correct_response = /datum/apiModel/Tracked/JobBanResource
diff --git a/code/modules/goonhub/api/routes/jobbans/DeleteJobBans.dm b/code/modules/goonhub/api/routes/jobbans/DeleteJobBans.dm
new file mode 100644
index 0000000000000..7837e84663f8c
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/DeleteJobBans.dm
@@ -0,0 +1,14 @@
+/// DELETE /job-bans/{jobBan}
+/// Delete an existing job ban
+/datum/apiRoute/jobbans/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/job-bans"
+	body = /datum/apiBody/jobbans/delete
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		server_id,
+		ckey,
+		job
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/jobbans/GetJobBans.dm b/code/modules/goonhub/api/routes/jobbans/GetJobBans.dm
new file mode 100644
index 0000000000000..967281b04703a
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/GetJobBans.dm
@@ -0,0 +1,7 @@
+/// GET /job-bans
+/// List filtered and paginated job bans
+/datum/apiRoute/jobbans/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/job-bans"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Paginated/JobBanResourceList
diff --git a/code/modules/goonhub/api/routes/jobbans/GetPlayerJobBans.dm b/code/modules/goonhub/api/routes/jobbans/GetPlayerJobBans.dm
new file mode 100644
index 0000000000000..65bdc600fce8b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/GetPlayerJobBans.dm
@@ -0,0 +1,7 @@
+/// GET /job-bans/get-for-player
+/// Get all job bans for a given player and server
+/datum/apiRoute/jobbans/getforplayer
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/job-bans/get-for-player"
+	queryParams = list("ckey", "server_id") // string, string
+	correct_response = /datum/apiModel/JobBansForPlayer
diff --git a/code/modules/goonhub/api/routes/jobbans/UpdateJobBans.dm b/code/modules/goonhub/api/routes/jobbans/UpdateJobBans.dm
new file mode 100644
index 0000000000000..8f9cc4f0fd53b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/jobbans/UpdateJobBans.dm
@@ -0,0 +1,16 @@
+/// PUT /job-bans/{jobBan}
+/// Update an existing job ban
+/datum/apiRoute/jobbans/update
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/job-bans"
+	routeParams = list("jobBan")	// integer
+	body = /datum/apiBody/jobbans/update
+	correct_response = /datum/apiModel/Tracked/JobBanResource
+
+	buildBody(
+		server_id,
+		job,
+		reason,
+		duration
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/maps/MapSwitches.dm b/code/modules/goonhub/api/routes/maps/MapSwitches.dm
new file mode 100644
index 0000000000000..4cd95fd576c9f
--- /dev/null
+++ b/code/modules/goonhub/api/routes/maps/MapSwitches.dm
@@ -0,0 +1,17 @@
+
+/// POST /map-switch
+/// Trigger a map switch for a given server
+/datum/apiRoute/mapswitch
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/map-switch"
+	body = /datum/apiBody/mapswitch
+	correct_response = /datum/apiModel/MapSwitch
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		map,
+		votes
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/numbersstation/GetNumbersStationNumbers.dm b/code/modules/goonhub/api/routes/numbersstation/GetNumbersStationNumbers.dm
new file mode 100644
index 0000000000000..3a0f41e31ce7d
--- /dev/null
+++ b/code/modules/goonhub/api/routes/numbersstation/GetNumbersStationNumbers.dm
@@ -0,0 +1,7 @@
+
+/// GET /numbers-station
+/// Get the current numbers representing the password for the numbers station terminal
+/datum/apiRoute/numbersstation/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/numbers-station"
+	correct_response = /datum/apiModel/NumbersStationPasswordResource
diff --git a/code/modules/goonhub/api/routes/players/PlayerAntags.dm b/code/modules/goonhub/api/routes/players/PlayerAntags.dm
new file mode 100644
index 0000000000000..85ed7a0caa6db
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerAntags.dm
@@ -0,0 +1,17 @@
+
+/// POST /players/antags
+/// Add a player antagonist for a given round
+/datum/apiRoute/players/antags
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/antags"
+	body = /datum/apiBody/PlayerAntags
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerAntagResource
+
+	buildBody(
+		player_id,
+		round_id,
+		antag_role,
+		late_join,
+		weight_exempt
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/PlayerCompIds.dm b/code/modules/goonhub/api/routes/players/PlayerCompIds.dm
new file mode 100644
index 0000000000000..e6ec5a4eb318d
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerCompIds.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/get-compids
+/// Get a list of computed IDs associated with a player ckey, along with how many times they connected with each computer ID
+/datum/apiRoute/players/compids/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/get-compids"
+	queryParams = list("ckey") // string
+	correct_response = /datum/apiModel/PlayerCompIdsResource
diff --git a/code/modules/goonhub/api/routes/players/PlayerIps.dm b/code/modules/goonhub/api/routes/players/PlayerIps.dm
new file mode 100644
index 0000000000000..cc9a8861937ed
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerIps.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/get-ips
+/// Get a list of IPs associated with a player ckey, along with how many times they connected with each IP
+/datum/apiRoute/players/ips/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/get-ips"
+	queryParams = list("ckey") // string
+	correct_response = /datum/apiModel/PlayerIpsResource
diff --git a/code/modules/goonhub/api/routes/players/PlayerLogin.dm b/code/modules/goonhub/api/routes/players/PlayerLogin.dm
new file mode 100644
index 0000000000000..2fa195c2c0060
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerLogin.dm
@@ -0,0 +1,18 @@
+/// POST /players
+/// Register a login for a player with associated details
+/datum/apiRoute/players/login
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players"
+	body = /datum/apiBody/players/login
+	correct_response = /datum/apiModel/Tracked/PlayerResource
+
+	buildBody(
+		ckey,
+		key,
+		ip,
+		comp_id,
+		byond_major,
+		byond_minor,
+		round_id
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/PlayerParticipations.dm b/code/modules/goonhub/api/routes/players/PlayerParticipations.dm
new file mode 100644
index 0000000000000..b1cf2e1210f54
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerParticipations.dm
@@ -0,0 +1,11 @@
+
+/// POST /players/participation
+/// Add a player participation for a given round
+/datum/apiRoute/players/participations
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/participations"
+	body = /datum/apiBody/PlayerParticipation
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerParticipationResource
+
+	buildBody(player_id, round_id, job)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/PlayerParticipationsBulk.dm b/code/modules/goonhub/api/routes/players/PlayerParticipationsBulk.dm
new file mode 100644
index 0000000000000..07e2c3de9fa54
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerParticipationsBulk.dm
@@ -0,0 +1,11 @@
+
+/// POST /players/participation
+/// Add a player participation for a given round
+/datum/apiRoute/players/participationsBulk
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/participations/bulk"
+	body = /datum/apiBody/PlayerParticipationBulk
+	correct_response = /datum/apiModel/Message
+
+	buildBody(players, round_id)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/PlayerPlaytime.dm b/code/modules/goonhub/api/routes/players/PlayerPlaytime.dm
new file mode 100644
index 0000000000000..20a4e4893c0ac
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerPlaytime.dm
@@ -0,0 +1,14 @@
+
+/// POST /players/playtime/bulk
+/// Record playtime for a list of players
+/datum/apiRoute/players/playtime
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/playtime/bulk"
+	body = /datum/apiBody/players/playtime
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		serverId,
+		players
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/PlayerStats.dm b/code/modules/goonhub/api/routes/players/PlayerStats.dm
new file mode 100644
index 0000000000000..6c4d4ddd3f138
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/PlayerStats.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/stats
+/// Get various statistics associated with a player
+/datum/apiRoute/players/stats/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/stats"
+	queryParams = list("ckey") // string
+	correct_response = /datum/apiModel/Tracked/PlayerStatsResource
diff --git a/code/modules/goonhub/api/routes/players/medals/AddPlayerMedal.dm b/code/modules/goonhub/api/routes/players/medals/AddPlayerMedal.dm
new file mode 100644
index 0000000000000..304cd9cb23d2b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/medals/AddPlayerMedal.dm
@@ -0,0 +1,15 @@
+/// POST /medals
+/// Add a medal for a player
+/datum/apiRoute/players/medals/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/medals"
+	body = /datum/apiBody/players/medals/add
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerMedalResource
+
+	buildBody(
+		player_id,
+		ckey,
+		medal,
+		round_id
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/medals/DeletePlayerMedal.dm b/code/modules/goonhub/api/routes/players/medals/DeletePlayerMedal.dm
new file mode 100644
index 0000000000000..dac4e1f8fedaa
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/medals/DeletePlayerMedal.dm
@@ -0,0 +1,15 @@
+
+/// DELETE /medals
+/// Delete medal for a player
+/datum/apiRoute/players/medals/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/medals"
+	body = /datum/apiBody/players/medals/delete
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		player_id,
+		ckey,
+		medal
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/medals/GetPlayerMedals.dm b/code/modules/goonhub/api/routes/players/medals/GetPlayerMedals.dm
new file mode 100644
index 0000000000000..71cad3b06ce47
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/medals/GetPlayerMedals.dm
@@ -0,0 +1,8 @@
+
+/// GET /medals
+/// List paginated and filtered player medals
+/datum/apiRoute/players/medals/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/medals"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Paginated/PlayerMedalResourceList
diff --git a/code/modules/goonhub/api/routes/players/medals/ShowPlayerMedal.dm b/code/modules/goonhub/api/routes/players/medals/ShowPlayerMedal.dm
new file mode 100644
index 0000000000000..c61f75671ca94
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/medals/ShowPlayerMedal.dm
@@ -0,0 +1,8 @@
+/// GET /medals
+/// Show a medal for a player
+/datum/apiRoute/players/medals/show
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/medals"
+	routeParams = list("player_id") // integer
+	queryParams = list("medal") // string
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerMedalResource
diff --git a/code/modules/goonhub/api/routes/players/metadata/AddPlayerMetadata.dm b/code/modules/goonhub/api/routes/players/metadata/AddPlayerMetadata.dm
new file mode 100644
index 0000000000000..75524e7b59fda
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/AddPlayerMetadata.dm
@@ -0,0 +1,14 @@
+
+/// ADD /players/metadata
+/// Add player metadata
+/datum/apiRoute/players/metadata/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/metadata"
+	body = /datum/apiBody/players/metadata
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerMetadataResource
+
+	buildBody(
+		player_id,
+		metadata
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/metadata/DeleteFromPlayerMetadata.dm b/code/modules/goonhub/api/routes/players/metadata/DeleteFromPlayerMetadata.dm
new file mode 100644
index 0000000000000..4fa5d2d297da6
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/DeleteFromPlayerMetadata.dm
@@ -0,0 +1,8 @@
+
+/// DELETE /players/metadata/clear-by-player/{ckey}
+/// Delete all metadata associated with a specific player
+/datum/apiRoute/players/metadata/delete/fromplayer
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/metadata/clear-by-player"
+	routeParams = list("ckey")
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/players/metadata/DeletePlayerMetadata.dm b/code/modules/goonhub/api/routes/players/metadata/DeletePlayerMetadata.dm
new file mode 100644
index 0000000000000..4e04f3b9651d1
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/DeletePlayerMetadata.dm
@@ -0,0 +1,8 @@
+
+/// DELETE /players/metadata/clear-by-data/{metadata}
+/// Delete a specific item of metadata
+/datum/apiRoute/players/metadata/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/metadata/clear-by-data"
+	routeParams = list("metadata")
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/players/metadata/GetMetadataByPlayer.dm b/code/modules/goonhub/api/routes/players/metadata/GetMetadataByPlayer.dm
new file mode 100644
index 0000000000000..79978b136b885
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/GetMetadataByPlayer.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/metadata/get-by-player/{ckey}
+/// Get all the metadata associated with a ckey
+/datum/apiRoute/players/metadata/getbyplayer
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/metadata/get-by-player"
+	routeParams = list("ckey") // string
+	correct_response = /datum/apiModel/PlayerMetadataArray
diff --git a/code/modules/goonhub/api/routes/players/metadata/GetPlayerMetadata.dm b/code/modules/goonhub/api/routes/players/metadata/GetPlayerMetadata.dm
new file mode 100644
index 0000000000000..36209b5790356
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/GetPlayerMetadata.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/metadata
+/// List paginated and filtered player metadata
+/datum/apiRoute/players/metadata/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/metadata"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Paginated/PlayerMetadataList
diff --git a/code/modules/goonhub/api/routes/players/metadata/GetPlayersByMetadata.dm b/code/modules/goonhub/api/routes/players/metadata/GetPlayersByMetadata.dm
new file mode 100644
index 0000000000000..d6b07e7187321
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/metadata/GetPlayersByMetadata.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/metadata/get-by-data/{metadata}
+/// Get all the ckeys associated with a piece of metadata
+/datum/apiRoute/players/metadata/getbydata
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/metadata/get-by-data"
+	routeParams = list("metadata") // string
+	correct_response = /datum/apiModel/PlayerMetadataArray
diff --git a/code/modules/goonhub/api/routes/players/notes/AddPlayerNotes.dm b/code/modules/goonhub/api/routes/players/notes/AddPlayerNotes.dm
new file mode 100644
index 0000000000000..3553214730765
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/notes/AddPlayerNotes.dm
@@ -0,0 +1,17 @@
+
+/// POST /players/notes
+/// Add a new player note
+/datum/apiRoute/players/notes/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/notes"
+	body = /datum/apiBody/players/notes/post
+	correct_response = /datum/apiModel/Tracked/PlayerNoteResource
+
+	buildBody(
+		game_admin_ckey,
+		round_id,
+		server_id,
+		ckey,
+		note
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/notes/DeletePlayerNotes.dm b/code/modules/goonhub/api/routes/players/notes/DeletePlayerNotes.dm
new file mode 100644
index 0000000000000..9011b59d0c8d0
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/notes/DeletePlayerNotes.dm
@@ -0,0 +1,8 @@
+
+/// DELETE /players/notes/{note}
+/// Delete list
+/datum/apiRoute/players/notes/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/notes"
+	routeParams = list("note") // integer, the note ID
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/players/notes/GetPlayerNotes.dm b/code/modules/goonhub/api/routes/players/notes/GetPlayerNotes.dm
new file mode 100644
index 0000000000000..f3a9ca99287bc
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/notes/GetPlayerNotes.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/notes
+/// List paginated and filtered player notes
+/datum/apiRoute/players/notes/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/notes"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string[], string, string, string
+	correct_response = /datum/apiModel/Paginated/PlayerNoteResourceList
diff --git a/code/modules/goonhub/api/routes/players/notes/UpdatePlayerNotes.dm b/code/modules/goonhub/api/routes/players/notes/UpdatePlayerNotes.dm
new file mode 100644
index 0000000000000..db8b53976e43c
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/notes/UpdatePlayerNotes.dm
@@ -0,0 +1,9 @@
+
+/// PUT /players/notes/{note}
+/// Update
+/datum/apiRoute/players/notes/update
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/players/notes"
+	routeParams = list("note") // integer, the note ID
+	body = /datum/apiBody/players/notes/update
+	correct_response = /datum/apiModel/Tracked/PlayerNoteResource
diff --git a/code/modules/goonhub/api/routes/players/saves/AddBulkDataPlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/AddBulkDataPlayerSaves.dm
new file mode 100644
index 0000000000000..20b931bf72d6b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/AddBulkDataPlayerSaves.dm
@@ -0,0 +1,13 @@
+
+/// POST /players/saves/data-bulk
+/// Add multiple entries of player data
+/datum/apiRoute/players/saves/databulk/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/saves/data-bulk"
+	body = /datum/apiBody/PlayerSavesBulkData
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		data
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/saves/AddDataPlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/AddDataPlayerSaves.dm
new file mode 100644
index 0000000000000..f36594f8db529
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/AddDataPlayerSaves.dm
@@ -0,0 +1,15 @@
+
+/// POST /players/saves/data
+/// Add player data
+/datum/apiRoute/players/saves/data/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/saves/data"
+	body = /datum/apiBody/PlayerSavesAddData
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerDataResource
+
+	buildBody(
+		player_id,
+		key,
+		value
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/saves/AddFilePlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/AddFilePlayerSaves.dm
new file mode 100644
index 0000000000000..77d5f0098ad28
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/AddFilePlayerSaves.dm
@@ -0,0 +1,16 @@
+
+/// POST /players/saves/file
+/// Add player save
+/datum/apiRoute/players/saves/file/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/saves/file"
+	body = /datum/apiBody/PlayerSavesAddSave
+	correct_response = /datum/apiModel/Tracked/PlayerRes/PlayerSaveResource
+
+	buildBody(
+		player_id,
+		name,
+		data
+	)
+		. = ..(args)
+
diff --git a/code/modules/goonhub/api/routes/players/saves/DeleteDataPlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/DeleteDataPlayerSaves.dm
new file mode 100644
index 0000000000000..719aec01f87f6
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/DeleteDataPlayerSaves.dm
@@ -0,0 +1,14 @@
+
+/// DELETE /players/saves/data
+/// Delete data for a player
+/datum/apiRoute/players/saves/data/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/saves/data"
+	body = /datum/apiBody/PlayerSavesDeleteData
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		player_id,
+		key
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/saves/DeleteSavePlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/DeleteSavePlayerSaves.dm
new file mode 100644
index 0000000000000..c8650a1eb9770
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/DeleteSavePlayerSaves.dm
@@ -0,0 +1,14 @@
+
+/// DELETE /players/saves/file/{playerSave}
+/// Delete a save for a player
+/datum/apiRoute/players/saves/file/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/players/saves/file"
+	body = /datum/apiBody/PlayerSavesDeleteSave
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		player_id,
+		name
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/players/saves/GetPlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/GetPlayerSaves.dm
new file mode 100644
index 0000000000000..b32392838f487
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/GetPlayerSaves.dm
@@ -0,0 +1,8 @@
+
+/// GET /players/saves
+/// List all data and saves for a player
+/datum/apiRoute/players/saves/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/players/saves"
+	queryParams = list("player_id")
+	correct_response = /datum/apiModel/GetPlayerSaves
diff --git a/code/modules/goonhub/api/routes/players/saves/TransferDataPlayerSaves.dm b/code/modules/goonhub/api/routes/players/saves/TransferDataPlayerSaves.dm
new file mode 100644
index 0000000000000..3f8cd1964a51b
--- /dev/null
+++ b/code/modules/goonhub/api/routes/players/saves/TransferDataPlayerSaves.dm
@@ -0,0 +1,16 @@
+
+/// POST /players/saves/transfer-files
+/// Transfer all save files from a player to another
+/// WARNING: This overwrites all the saves for the target
+/datum/apiRoute/players/saves/file/transfer
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/players/saves/transfer-files"
+	body = /datum/apiBody/PlayerSavesTransferFiles
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		from_ckey,
+		to_ckey
+	)
+		. = ..(args)
+
diff --git a/code/modules/goonhub/api/routes/polls/AddPoll.dm b/code/modules/goonhub/api/routes/polls/AddPoll.dm
new file mode 100644
index 0000000000000..17654ea330ed3
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/AddPoll.dm
@@ -0,0 +1,17 @@
+/// POST /polls
+/// Add a new poll
+/datum/apiRoute/polls/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/polls"
+	body = /datum/apiBody/polls/add
+	correct_response = /datum/apiModel/Tracked/PollResource
+
+	buildBody(
+		game_admin_ckey,
+		question,
+		multiple_choice,
+		expires_at,
+		options,
+		servers
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/polls/AddPollOption.dm b/code/modules/goonhub/api/routes/polls/AddPollOption.dm
new file mode 100644
index 0000000000000..ecdfe6b361310
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/AddPollOption.dm
@@ -0,0 +1,13 @@
+/// POST /polls/option/{poll}
+/// Add a new option to an existing poll
+/datum/apiRoute/polls/options/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/polls/option"
+	routeParams = list("poll") // integer (The poll ID)
+	body = /datum/apiBody/polls/options/add
+	correct_response = /datum/apiModel/PollOptionResource
+
+	buildBody(
+		option
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/polls/DeletePoll.dm b/code/modules/goonhub/api/routes/polls/DeletePoll.dm
new file mode 100644
index 0000000000000..b654a1db82afc
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/DeletePoll.dm
@@ -0,0 +1,7 @@
+/// DELETE /polls/{poll}
+/// Delete an existing poll
+/datum/apiRoute/polls/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/polls"
+	routeParams = list("poll")	// integer (The poll ID)
+	correct_response = 	/datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/polls/DeletePollOption.dm b/code/modules/goonhub/api/routes/polls/DeletePollOption.dm
new file mode 100644
index 0000000000000..0792feaeea338
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/DeletePollOption.dm
@@ -0,0 +1,7 @@
+/// DELETE /polls/option/{pollOption}
+/// Delete an existing poll
+/datum/apiRoute/polls/options/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/polls/option"
+	routeParams = list("pollOption")	// integer (The poll option ID)
+	correct_response = 	/datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/polls/EditPoll.dm b/code/modules/goonhub/api/routes/polls/EditPoll.dm
new file mode 100644
index 0000000000000..4455093031a94
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/EditPoll.dm
@@ -0,0 +1,15 @@
+/// PUT /polls/{poll}
+/// Edit an existing poll
+/datum/apiRoute/polls/edit
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/polls"
+	routeParams = list("poll") // integer (The poll ID)
+	body = /datum/apiBody/polls/edit
+	correct_response = /datum/apiModel/Tracked/PollResource
+
+	buildBody(
+		question,
+		expires_at,
+		servers
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/polls/EditPollOption.dm b/code/modules/goonhub/api/routes/polls/EditPollOption.dm
new file mode 100644
index 0000000000000..b8527a4627eb7
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/EditPollOption.dm
@@ -0,0 +1,14 @@
+/// PUT /polls/option/{pollOption}
+/// Update an existing poll option
+/datum/apiRoute/polls/options/edit
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/polls/option"
+	routeParams = list("pollOption") // integer (The poll option ID)
+	body = /datum/apiBody/polls/options/edit
+	correct_response = /datum/apiModel/PollOptionResource
+
+	buildBody(
+		option,
+		position
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/polls/GetPoll.dm b/code/modules/goonhub/api/routes/polls/GetPoll.dm
new file mode 100644
index 0000000000000..c8a15442bfd61
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/GetPoll.dm
@@ -0,0 +1,7 @@
+/// GET /polls/{poll}
+/// Get a specific poll
+/datum/apiRoute/polls/show
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/polls"
+	routeParams = list("poll") // integer (The poll ID)
+	correct_response = /datum/apiModel/Tracked/PollResource
diff --git a/code/modules/goonhub/api/routes/polls/GetPolls.dm b/code/modules/goonhub/api/routes/polls/GetPolls.dm
new file mode 100644
index 0000000000000..b07348116f173
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/GetPolls.dm
@@ -0,0 +1,7 @@
+/// GET /polls
+/// List paginated and filtered polls
+/datum/apiRoute/polls/get
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/polls"
+	queryParams = list("filters", "sort_by", "descending", "per_page") // string, string, string, string
+	correct_response = /datum/apiModel/Paginated/PollResourceList
diff --git a/code/modules/goonhub/api/routes/polls/PickOption.dm b/code/modules/goonhub/api/routes/polls/PickOption.dm
new file mode 100644
index 0000000000000..b698c24dec0fc
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/PickOption.dm
@@ -0,0 +1,13 @@
+/// POST /polls/option/pick/{pollOption}
+/// Register that a player picked a poll option
+/datum/apiRoute/polls/options/pick
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/polls/option/pick"
+	routeParams = list("pollOption") // integer (The poll option ID)
+	body = /datum/apiBody/polls/options/pickUnpick
+	correct_response = /datum/apiModel/Tracked/PollAnswerResource
+
+	buildBody(
+		player_id
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/polls/UnpickOption.dm b/code/modules/goonhub/api/routes/polls/UnpickOption.dm
new file mode 100644
index 0000000000000..a66df60899baf
--- /dev/null
+++ b/code/modules/goonhub/api/routes/polls/UnpickOption.dm
@@ -0,0 +1,13 @@
+/// POST /polls/option/unpick/{pollOption}
+/// Register that a player removed their pick of a poll option
+/datum/apiRoute/polls/options/unpick
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/polls/option/unpick"
+	routeParams = list("pollOption") // integer (The poll option ID)
+	body = /datum/apiBody/polls/options/pickUnpick
+	correct_response = /datum/apiModel/Message
+
+	buildBody(
+		player_id
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/rounds/AddGameRound.dm b/code/modules/goonhub/api/routes/rounds/AddGameRound.dm
new file mode 100644
index 0000000000000..aa4123bc764a7
--- /dev/null
+++ b/code/modules/goonhub/api/routes/rounds/AddGameRound.dm
@@ -0,0 +1,15 @@
+
+/// POST /rounds
+/// Start a new game round
+/datum/apiRoute/rounds/post
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/rounds"
+	body = /datum/apiBody/rounds/post
+	correct_response = /datum/apiModel/Tracked/GameRound
+
+	buildBody(
+		map,
+		server_id,
+		rp_mode
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/rounds/EndGameRound.dm b/code/modules/goonhub/api/routes/rounds/EndGameRound.dm
new file mode 100644
index 0000000000000..ffd8a3f7d9548
--- /dev/null
+++ b/code/modules/goonhub/api/routes/rounds/EndGameRound.dm
@@ -0,0 +1,14 @@
+
+/// PUT /rounds/end/{gameRound}
+/// End a game round.
+/datum/apiRoute/rounds/end
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/rounds/end"
+	routeParams = list("gameRound")
+	body = /datum/apiBody/rounds/end
+	correct_response = /datum/apiModel/Tracked/GameRound
+
+	buildBody(
+		crashed
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/rounds/UpdateGameRound.dm b/code/modules/goonhub/api/routes/rounds/UpdateGameRound.dm
new file mode 100644
index 0000000000000..274b2e9332de5
--- /dev/null
+++ b/code/modules/goonhub/api/routes/rounds/UpdateGameRound.dm
@@ -0,0 +1,14 @@
+
+/// PUT /rounds/{gameRound}
+/// Update a game round. This should be used when game round data we care about is set after the start of the round.
+/datum/apiRoute/rounds/update
+	method = RUSTG_HTTP_METHOD_PUT
+	path = "/rounds"
+	routeParams = list("gameRound")
+	body = /datum/apiBody/rounds/update
+	correct_response = /datum/apiModel/Tracked/GameRound
+
+	buildBody(
+		game_type
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/vpn/AddVpnWhitelist.dm b/code/modules/goonhub/api/routes/vpn/AddVpnWhitelist.dm
new file mode 100644
index 0000000000000..4b0b466277d16
--- /dev/null
+++ b/code/modules/goonhub/api/routes/vpn/AddVpnWhitelist.dm
@@ -0,0 +1,13 @@
+/// POST /vpncheck-whitelist
+/// Add a player into the whitelist. This will allow them to skip VPN checks.
+/datum/apiRoute/vpnwhitelist/add
+	method = RUSTG_HTTP_METHOD_POST
+	path = "/vpncheck-whitelist"
+	body = /datum/apiBody/vpnwhitelist/add
+	correct_response = /datum/apiModel/Tracked/VpnWhitelistResource
+
+	buildBody(
+		game_admin_ckey,
+		ckey
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/api/routes/vpn/CheckVpn.dm b/code/modules/goonhub/api/routes/vpn/CheckVpn.dm
new file mode 100644
index 0000000000000..b31cec63ed5bc
--- /dev/null
+++ b/code/modules/goonhub/api/routes/vpn/CheckVpn.dm
@@ -0,0 +1,8 @@
+/// GET /vpncheck/{ip}
+/// Check if a player is using a VPN
+/datum/apiRoute/vpn/check
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/vpncheck"
+	routeParams = "ip"
+	queryParams = list("ckey", "round_id")
+	correct_response = /datum/apiModel/VpnCheckResource
diff --git a/code/modules/goonhub/api/routes/vpn/DeleteVpnWhitelist.dm b/code/modules/goonhub/api/routes/vpn/DeleteVpnWhitelist.dm
new file mode 100644
index 0000000000000..e5a69fdc81812
--- /dev/null
+++ b/code/modules/goonhub/api/routes/vpn/DeleteVpnWhitelist.dm
@@ -0,0 +1,7 @@
+/// DELETE /vpncheck-whitelist
+/// Delete a whitelist entry
+/datum/apiRoute/vpnwhitelist/delete
+	method = RUSTG_HTTP_METHOD_DELETE
+	path = "/vpncheck-whitelist"
+	queryParams = list("ckey")	// string
+	correct_response = /datum/apiModel/Message
diff --git a/code/modules/goonhub/api/routes/vpn/SearchVpnWhitelist.dm b/code/modules/goonhub/api/routes/vpn/SearchVpnWhitelist.dm
new file mode 100644
index 0000000000000..936fd2d3a769a
--- /dev/null
+++ b/code/modules/goonhub/api/routes/vpn/SearchVpnWhitelist.dm
@@ -0,0 +1,7 @@
+/// GET /vpncheck-whitelist/search
+/// Check if a player is whitelisted from the VPN checker
+/datum/apiRoute/vpnwhitelist/search
+	method = RUSTG_HTTP_METHOD_GET
+	path = "/vpncheck-whitelist/search"
+	queryParams = list("ckey")
+	correct_response = /datum/apiModel/VpnWhitelistSearch
diff --git a/code/modules/goonhub/event_recording/event_recorder.dm b/code/modules/goonhub/event_recording/event_recorder.dm
new file mode 100644
index 0000000000000..516ccbf910d0f
--- /dev/null
+++ b/code/modules/goonhub/event_recording/event_recorder.dm
@@ -0,0 +1,79 @@
+var/global/datum/eventRecorder/eventRecorder
+
+/datum/eventRecorder
+	var/enabled = TRUE
+	var/connected = FALSE
+	var/list/events = list()
+	var/eventsPushed = 0
+
+	New()
+		..()
+		src.connect()
+
+	/// Connect to the external event service
+	proc/connect()
+		if (!config.goonhub_events_endpoint || !config.goonhub_events_port || !config.goonhub_events_channel)
+			src.enabled = FALSE
+			var/logMsg = "Disabled Goonhub Event Recording service due to missing config"
+			logTheThing(LOG_DEBUG, null, "<b>Event Recorder:</b> [logMsg]")
+			logTheThing(LOG_DIARY, null, "Event Recorder: [logMsg]", "debug")
+			return
+
+		var/addr = "redis://"
+		if (config.goonhub_events_password)
+			addr += ":[config.goonhub_events_password]@"
+		addr += "[config.goonhub_events_endpoint]:[config.goonhub_events_port]"
+		var/res = rustg_redis_connect_rq(addr)
+
+		if (res)
+			src.connected = FALSE
+			var/logMsg = "Failed to connect to Goonhub Event Recording service. Reason: [res]"
+			logTheThing(LOG_DEBUG, null, "<b>Event Recorder:</b> [logMsg]")
+			logTheThing(LOG_DIARY, null, "Event Recorder: [logMsg]", "debug")
+			return FALSE
+
+		src.connected = TRUE
+		return TRUE
+
+	/// Push the event queue to the server
+	proc/process()
+		if (!src.enabled || !length(src.events) || (!src.connected && !src.connect())) return
+
+		var/res = rustg_redis_lpush(config.goonhub_events_channel, json_encode(src.events))
+		var/list/lRes = json_decode(res)
+
+		if (lRes["success"])
+			src.eventsPushed += length(src.events)
+			src.events.Cut()
+		else
+			var/msg = lRes["content"]
+			var/logMsg = "Failed to push data to Goonhub Event Recording service. Reason: [msg]"
+			logTheThing(LOG_DEBUG, null, "<b>Event Recorder:</b> [logMsg]")
+			logTheThing(LOG_DIARY, null, "Event Recorder: [logMsg]", "debug")
+
+	/// Add an event to the event queue
+	proc/add(datum/eventRecord/event)
+		if (!src.enabled || !roundId) return
+
+		var/list/data = event.body.ToList()
+		data["type"] = event.eventType
+		data["round_id"] = roundId
+		data["created_at"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
+
+		src.events += list(data)
+
+	/// Display debug information
+	proc/debug()
+		var/list/html = list()
+		html += "<strong>Enabled:</strong> [src.enabled ? "Yes" : "No"]<br>"
+		html += "<strong>Connected:</strong> [src.connected ? "Yes" : "No"]<br>"
+		html += "<strong>Events Pending:</strong> [length(src.events)]<br>"
+		html += "<strong>Events Pushed:</strong> [src.eventsPushed]<br>"
+		usr.Browse(html.Join(), "window=eventRecorderDebug")
+
+/client/proc/debug_event_recorder()
+	SET_ADMIN_CAT(ADMIN_CAT_DEBUG)
+	set name = "Debug Event Recorder"
+	set desc = "Display debug information about the event recorder"
+	ADMIN_ONLY
+	eventRecorder.debug()
diff --git a/code/modules/goonhub/event_recording/events/AILaw.dm b/code/modules/goonhub/event_recording/events/AILaw.dm
new file mode 100644
index 0000000000000..e132bf4426c68
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/AILaw.dm
@@ -0,0 +1,26 @@
+
+/// Record a new AI law
+/datum/eventRecord/AILaw
+	eventType = "ai_law"
+	body = /datum/eventRecordBody/TracksPlayer/AILaw
+
+	send(
+		player_id,
+		ai_name,
+		law_number,
+		law_text,
+		uploader_name,
+		uploader_job,
+		uploader_ckey
+	)
+		. = ..(args)
+
+	buildAndSend(mob/living/silicon/ai/aiPlayer, lawNumber, law)
+		// Currently we're only logging AI laws at the end of the round
+		// which don't have uploader details attached
+		src.send(
+			aiPlayer?.mind?.get_player().id,
+			aiPlayer.real_name,
+			lawNumber,
+			html_decode(law)
+		)
diff --git a/code/modules/goonhub/event_recording/events/Antag.dm b/code/modules/goonhub/event_recording/events/Antag.dm
new file mode 100644
index 0000000000000..912920c898ec3
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/Antag.dm
@@ -0,0 +1,97 @@
+
+/// Record an antag spawn
+/datum/eventRecord/Antag
+	eventType = "antag"
+	body = /datum/eventRecordBody/TracksPlayer/Antag
+
+	send(
+		player_id,
+		mob_name,
+		mob_job,
+		traitor_type,
+		special,
+		late_joiner,
+		success
+	)
+		. = ..(args)
+
+	buildAndSend(datum/antagonist/antagonist_role)
+		var/datum/mind/M = antagonist_role.owner
+
+		var/traitor_type = antagonist_role.id
+		var/special
+		switch(traitor_type)
+			if (ROLE_CHANGELING)
+				if (M.current)
+					var/datum/abilityHolder/changeling/C = M.current.get_ability_holder(/datum/abilityHolder/changeling)
+					if (C && istype(C))
+						special = C.absorbtions
+			if (ROLE_VAMPIRE)
+				if (M.current)
+					special = M.current.get_vampire_blood(1)
+			if (ROLE_WIZARD)
+				if (M.current)
+					var/datum/abilityHolder/wizard/W = M.current.get_ability_holder(/datum/abilityHolder/wizard)
+					if (W && istype(W))
+						var/spells = ""
+						for (var/datum/targetable/spell/S in W.abilities)
+							if (spells != "")
+								spells += ", "
+							spells += S.name
+			if (ROLE_WEREWOLF)
+				for (var/datum/objective/specialist/werewolf/feed/O in M.objectives)
+					if (O && istype(O, /datum/objective/specialist/werewolf/feed/))
+						special = length(O.mobs_fed_on)
+			if (ROLE_VAMPTHRALL, ROLE_MINDHACK)
+				var/datum/mind/master = M.get_master(traitor_type)
+				if (master?.current)
+					special = master.current.real_name
+			if (ROLE_FLOCKMIND)
+				var/relay_successful = FALSE
+				if (isflockmob(M.current))
+					if (!istype(M.current, /mob/living/critter/flock/drone))
+						var/mob/living/intangible/flock/flockmind/flockmind = M.current
+						relay_successful = flockmind.flock.relay_finished
+					else
+						var/mob/living/critter/flock/drone/flockdrone = M.current
+						relay_successful = flockdrone.flock.relay_finished
+				special = "Relay transmission [relay_successful ? "successful" : "unsuccessful"]"
+			if (ROLE_FLOCKTRACE)
+				if (isflockmob(M.current))
+					var/datum/flock/flock_joined = null
+					if (!istype(M.current, /mob/living/critter/flock/drone))
+						var/mob/living/intangible/flock/trace/flocktrace = M.current
+						flock_joined = flocktrace.flock
+					else
+						var/mob/living/critter/flock/drone/flockdrone = M.current
+						flock_joined = flockdrone.flock
+					special = "Part of Flock [flock_joined.name]"
+			if (ROLE_NUKEOP, ROLE_NUKEOP_COMMANDER)
+				if (istype(ticker.mode, /datum/game_mode/nuclear))
+					special = syndicate_name()
+			if (ROLE_SPY_THIEF)
+				special = "Bounties claimed: "
+				var/datum/antagonist/spy_thief/antag_role = M.get_antagonist(ROLE_SPY_THIEF)
+				for(var/obj/stolen_item in antag_role.stolen_items)
+					if (stolen_item.name != "")
+						special += "[stolen_item.name], "
+
+		var/overallSuccess = 1
+		if (M.objectives)
+			for (var/datum/objective/objective in M.objectives)
+#ifdef CREW_OBJECTIVES
+				if (istype(objective, /datum/objective/crew)) continue
+#endif
+				if (!objective.check_completion())
+					overallSuccess = 0
+					break
+
+		src.send(
+			M.get_player().id,
+			M.current.real_name,
+			M.current.job,
+			M.special_role,
+			special,
+			M.late_special_role ? TRUE : FALSE,
+			overallSuccess
+		)
diff --git a/code/modules/goonhub/event_recording/events/AntagItemPurchase.dm b/code/modules/goonhub/event_recording/events/AntagItemPurchase.dm
new file mode 100644
index 0000000000000..c98a6146f46a9
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/AntagItemPurchase.dm
@@ -0,0 +1,35 @@
+
+/// Record an antag item purchase
+/datum/eventRecord/AntagItemPurchase
+	eventType = "antag_item_purchase"
+	body = /datum/eventRecordBody/TracksPlayer/AntagItemPurchase
+
+	send(
+		player_id,
+		mob_name,
+		mob_job,
+		x,
+		y,
+		z,
+		item,
+		cost
+	)
+		. = ..(args)
+
+	buildAndSend(mob/living/M, itemIdentifier, cost)
+		if (!istype(M))
+			return
+
+		var/atom/T = get_turf(M)
+		if (!T) T = M
+
+		src.send(
+			M.mind.get_player().id,
+			M.real_name,
+			M.job,
+			T.x,
+			T.y,
+			T.z,
+			itemIdentifier ? itemIdentifier : "???",
+			cost
+		)
diff --git a/code/modules/goonhub/event_recording/events/AntagObjective.dm b/code/modules/goonhub/event_recording/events/AntagObjective.dm
new file mode 100644
index 0000000000000..aa6a497647807
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/AntagObjective.dm
@@ -0,0 +1,21 @@
+
+/// Record an antag objective addition
+/datum/eventRecord/AntagObjective
+	eventType = "antag_objective"
+	body = /datum/eventRecordBody/TracksPlayer/AntagObjective
+
+	send(
+		player_id,
+		objective,
+		success
+	)
+		. = ..(args)
+
+	buildAndSend(datum/antagonist/antagonist_role, datum/objective/objective)
+		var/datum/mind/M = antagonist_role.owner
+
+		src.send(
+			M.get_player().id,
+			objective.explanation_text,
+			objective.check_completion() ? TRUE : FALSE
+		)
diff --git a/code/modules/goonhub/event_recording/events/BeeSpawn.dm b/code/modules/goonhub/event_recording/events/BeeSpawn.dm
new file mode 100644
index 0000000000000..2e387e790236c
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/BeeSpawn.dm
@@ -0,0 +1,10 @@
+
+/// Record a bee spawn
+/datum/eventRecord/BeeSpawn
+	eventType = "bee_spawn"
+	body = /datum/eventRecordBody/BeeSpawn
+
+	send(
+		name
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/event_recording/events/Death.dm b/code/modules/goonhub/event_recording/events/Death.dm
new file mode 100644
index 0000000000000..dedac695b794e
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/Death.dm
@@ -0,0 +1,40 @@
+
+/// Record a player death
+/datum/eventRecord/Death
+	eventType = "death"
+	body = /datum/eventRecordBody/TracksPlayer/Death
+
+	send(
+		player_id,
+		mob_name,
+		mob_job,
+		x,
+		y,
+		z,
+		bruteloss,
+		fireloss,
+		toxloss,
+		oxyloss,
+		gibbed,
+		last_words
+	)
+		. = ..(args)
+
+	buildAndSend(mob/living/M, gibbed)
+		var/atom/T = get_turf(M)
+		if (!T) T = M
+
+		src.send(
+			M.mind.get_player().id,
+			M.real_name,
+			M.job,
+			T.x,
+			T.y,
+			T.z,
+			M.get_brute_damage(),
+			M.get_burn_damage(),
+			M.get_toxin_damage(),
+			M.get_oxygen_deprivation(),
+			gibbed ? TRUE : FALSE,
+			M.last_words
+		)
diff --git a/code/modules/goonhub/event_recording/events/Fine.dm b/code/modules/goonhub/event_recording/events/Fine.dm
new file mode 100644
index 0000000000000..f867058f61890
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/Fine.dm
@@ -0,0 +1,27 @@
+
+/// Record a new fine
+/datum/eventRecord/Fine
+	eventType = "fine"
+	body = /datum/eventRecordBody/TracksPlayer/Fine
+
+	send(
+		player_id,
+		target,
+		reason,
+		issuer,
+		issuer_job,
+		issuer_ckey,
+		amount
+	)
+		. = ..(args)
+
+	buildAndSend(datum/fine/F, mob/living/M)
+		src.send(
+			M.mind.get_player().id,
+			F.target,
+			F.reason,
+			M.real_name,
+			M.job,
+			M.ckey,
+			F.amount
+		)
diff --git a/code/modules/goonhub/event_recording/events/GauntletHighScore.dm b/code/modules/goonhub/event_recording/events/GauntletHighScore.dm
new file mode 100644
index 0000000000000..1f8d6b1745e8e
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/GauntletHighScore.dm
@@ -0,0 +1,12 @@
+
+/// Record a new gauntlet high score
+/datum/eventRecord/GauntletHighScore
+	eventType = "gauntlet_high_score"
+	body = /datum/eventRecordBody/GauntletHighScore
+
+	send(
+		names,
+		score,
+		highest_wave
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/event_recording/events/StationName.dm b/code/modules/goonhub/event_recording/events/StationName.dm
new file mode 100644
index 0000000000000..4188e4a65370e
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/StationName.dm
@@ -0,0 +1,10 @@
+
+/// Record a new station name
+/datum/eventRecord/StationName
+	eventType = "station_name"
+	body = /datum/eventRecordBody/StationName
+
+	send(
+		name
+	)
+		. = ..(args)
diff --git a/code/modules/goonhub/event_recording/events/Ticket.dm b/code/modules/goonhub/event_recording/events/Ticket.dm
new file mode 100644
index 0000000000000..3de79161731a2
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/Ticket.dm
@@ -0,0 +1,25 @@
+
+/// Record a new ticket
+/datum/eventRecord/Ticket
+	eventType = "ticket"
+	body = /datum/eventRecordBody/TracksPlayer/Ticket
+
+	send(
+		player_id,
+		target,
+		reason,
+		issuer,
+		issuer_job,
+		issuer_ckey
+	)
+		. = ..(args)
+
+	buildAndSend(datum/ticket/T, mob/living/M)
+		src.send(
+			M.mind.get_player().id,
+			T.target,
+			T.reason,
+			M.real_name,
+			M.job,
+			M.ckey
+		)
diff --git a/code/modules/goonhub/event_recording/events/eventRecord.dm b/code/modules/goonhub/event_recording/events/eventRecord.dm
new file mode 100644
index 0000000000000..967099f8bbacf
--- /dev/null
+++ b/code/modules/goonhub/event_recording/events/eventRecord.dm
@@ -0,0 +1,23 @@
+/// Base eventCall type
+/// Represents a predefined event we can send to the Goonhub event recorder
+/// SECURITY: Sanitization occurs right before output
+/datum/eventRecord
+	/// The type of the event being recorded, for example `death`
+	var/eventType = null
+	/// Body of the event
+	var/datum/eventRecordBody/body = null
+
+	/// Shortcut method to send this event to the event recorder
+	proc/send(list/fieldValues)
+		if (!eventRecorder) return
+		try
+			src.body = new src.body(fieldValues)
+			eventRecorder.add(src)
+		catch (var/exception/e)
+			var/logMsg = "Failed to send data to Goonhub Event Recording service. Reason: [e.name]. Type: [eventType]. Values: [json_encode(fieldValues)]"
+			logTheThing(LOG_DEBUG, null, " <b>Event Recorder:</b> [logMsg]")
+			logTheThing(LOG_DIARY, null, "Event Recorder: [logMsg]", "debug")
+
+	/// Override to build event parameters
+	proc/buildAndSend()
+		return
diff --git a/code/modules/goonhub/event_recording/types/AILaw.dm b/code/modules/goonhub/event_recording/types/AILaw.dm
new file mode 100644
index 0000000000000..56bc1ebc9af3c
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/AILaw.dm
@@ -0,0 +1,10 @@
+
+/datum/eventRecordBody/TracksPlayer/AILaw
+	fields = list(
+		"ai_name", // string
+		"law_number", // int
+		"law_text", // string
+		"uploader_name", // string
+		"uploader_job", // string
+		"uploader_ckey" // string
+	)
diff --git a/code/modules/goonhub/event_recording/types/Antag.dm b/code/modules/goonhub/event_recording/types/Antag.dm
new file mode 100644
index 0000000000000..63471f71cd017
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/Antag.dm
@@ -0,0 +1,10 @@
+
+/datum/eventRecordBody/TracksPlayer/Antag
+	fields = list(
+		"mob_name", // string
+		"mob_job", // string
+		"traitor_type", // string
+		"special", // string
+		"late_joiner", // string
+		"success" // boolean
+	)
diff --git a/code/modules/goonhub/event_recording/types/AntagItemPurchase.dm b/code/modules/goonhub/event_recording/types/AntagItemPurchase.dm
new file mode 100644
index 0000000000000..abf5283c0c663
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/AntagItemPurchase.dm
@@ -0,0 +1,11 @@
+
+/datum/eventRecordBody/TracksPlayer/AntagItemPurchase
+	fields = list(
+		"mob_name", // string
+		"mob_job", // string
+		"x", // int
+		"y", // int
+		"z", // int
+		"item", // string
+		"cost" // int
+	)
diff --git a/code/modules/goonhub/event_recording/types/AntagObjective.dm b/code/modules/goonhub/event_recording/types/AntagObjective.dm
new file mode 100644
index 0000000000000..ab5ad41da2144
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/AntagObjective.dm
@@ -0,0 +1,6 @@
+
+/datum/eventRecordBody/TracksPlayer/AntagObjective
+	fields = list(
+		"objective", // string
+		"success" // boolean
+	)
diff --git a/code/modules/goonhub/event_recording/types/BeeSpawn.dm b/code/modules/goonhub/event_recording/types/BeeSpawn.dm
new file mode 100644
index 0000000000000..966b8d378381d
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/BeeSpawn.dm
@@ -0,0 +1,5 @@
+
+/datum/eventRecordBody/BeeSpawn
+	fields = list(
+		"name" // string
+	)
diff --git a/code/modules/goonhub/event_recording/types/Death.dm b/code/modules/goonhub/event_recording/types/Death.dm
new file mode 100644
index 0000000000000..79d3d875cc99b
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/Death.dm
@@ -0,0 +1,15 @@
+
+/datum/eventRecordBody/TracksPlayer/Death
+	fields = list(
+		"mob_name", // string
+		"mob_job", // string
+		"x", // int
+		"y", // int
+		"z", // int
+		"bruteloss", // int
+		"fireloss", // int
+		"toxloss", // int
+		"oxyloss", // int
+		"gibbed", // boolean
+		"last_words" // string
+	)
diff --git a/code/modules/goonhub/event_recording/types/Fine.dm b/code/modules/goonhub/event_recording/types/Fine.dm
new file mode 100644
index 0000000000000..d8fa07b3a73cc
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/Fine.dm
@@ -0,0 +1,10 @@
+
+/datum/eventRecordBody/TracksPlayer/Fine
+	fields = list(
+		"target", // string
+		"reason", // string
+		"issuer", // string
+		"issuer_job", // string
+		"issuer_ckey", // string
+		"amount" // int
+	)
diff --git a/code/modules/goonhub/event_recording/types/GauntletHighScore.dm b/code/modules/goonhub/event_recording/types/GauntletHighScore.dm
new file mode 100644
index 0000000000000..ca85718e371d1
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/GauntletHighScore.dm
@@ -0,0 +1,7 @@
+
+/datum/eventRecordBody/GauntletHighScore
+	fields = list(
+		"names", // string
+		"score", // int
+		"highest_wave" // int
+	)
diff --git a/code/modules/goonhub/event_recording/types/StationName.dm b/code/modules/goonhub/event_recording/types/StationName.dm
new file mode 100644
index 0000000000000..217dc7c021830
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/StationName.dm
@@ -0,0 +1,5 @@
+
+/datum/eventRecordBody/StationName
+	fields = list(
+		"name" // string
+	)
diff --git a/code/modules/goonhub/event_recording/types/Ticket.dm b/code/modules/goonhub/event_recording/types/Ticket.dm
new file mode 100644
index 0000000000000..a0a75c075d5d6
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/Ticket.dm
@@ -0,0 +1,9 @@
+
+/datum/eventRecordBody/TracksPlayer/Ticket
+	fields = list(
+		"target", // string
+		"reason", // string
+		"issuer", // string
+		"issuer_job", // string
+		"issuer_ckey" // string
+	)
diff --git a/code/modules/goonhub/event_recording/types/_TracksPlayer.dm b/code/modules/goonhub/event_recording/types/_TracksPlayer.dm
new file mode 100644
index 0000000000000..87a5f534fe3a1
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/_TracksPlayer.dm
@@ -0,0 +1,19 @@
+
+ABSTRACT_TYPE(/datum/eventRecordBody/TracksPlayer)
+/// For events that require a player ID - ABSTRACT
+/datum/eventRecordBody/TracksPlayer
+	var/player_id	= null // integer
+
+/datum/eventRecordBody/TracksPlayer/New(list/fieldValues)
+	src.player_id = fieldValues[1]
+	. = ..(fieldValues.Copy(2, 0))
+
+/datum/eventRecordBody/TracksPlayer/VerifyIntegrity()
+	if (!src.player_id)
+		return FALSE
+
+	return TRUE
+
+/datum/eventRecordBody/TracksPlayer/ToList()
+	. = ..()
+	.["player_id"] = src.player_id
diff --git a/code/modules/goonhub/event_recording/types/eventBody.dm b/code/modules/goonhub/event_recording/types/eventBody.dm
new file mode 100644
index 0000000000000..2bf9c51ec0f19
--- /dev/null
+++ b/code/modules/goonhub/event_recording/types/eventBody.dm
@@ -0,0 +1,34 @@
+
+ABSTRACT_TYPE(/datum/eventRecordBody)
+/// Represents the body of an event - ABSTRACT
+/datum/eventRecordBody
+	var/list/fields
+	var/list/values = list()
+
+/datum/eventRecordBody/New(list/fieldValues)
+	. = ..()
+	src.setValues(fieldValues)
+	if (!VerifyIntegrity())
+#if defined(SPACEMAN_DMM)
+		return
+#elif DM_VERSION >= 515 || defined(OPENDREAM) // Yay, actual sanity!
+		throw EXCEPTION("malformed [__TYPE__] [json_encode(src.ToList())]")
+#else
+		throw EXCEPTION("malformed event [json_encode(src.ToList())]")
+#endif
+
+/datum/eventRecordBody/proc/setValues(list/fieldValues)
+	var/idx = 1
+	for (var/key in src.fields)
+		src.values[key] = fieldValues[idx]
+		idx++
+
+/// Override to verify that the model object is correctly formed. Return FALSE if not.
+/datum/eventRecordBody/proc/VerifyIntegrity()
+	return TRUE
+
+/datum/eventRecordBody/proc/ToList()
+	var/list/data = list()
+	for (var/key in src.fields)
+		data[key] = src.values[key]
+	. = list("data" = data)
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index 5227a475d998f..177617fcdf32a 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -194,9 +194,6 @@
 /obj/item/reagent_containers/glass/beaker/strange_reagent
 	name = "beaker-'Property of H. Jam'"
 	desc = "A beaker labled 'Property of H. Jam'.  Can hold up to 50 units."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "beaker0"
-	item_state = "beaker"
 	initial_volume = 50
 
 	New()
diff --git a/code/modules/hydroponics/hydroponics_misc_procs.dm b/code/modules/hydroponics/hydroponics_misc_procs.dm
index aaec1dd8d7e35..9072d6f25e7fb 100644
--- a/code/modules/hydroponics/hydroponics_misc_procs.dm
+++ b/code/modules/hydroponics/hydroponics_misc_procs.dm
@@ -124,6 +124,8 @@ proc/HYPgenerate_produce_name(var/atom/manipulated_atom, var/obj/machinery/plant
 
 
 proc/HYPpassplantgenes(var/datum/plantgenes/PARENT,var/datum/plantgenes/CHILD)
+	if(!PARENT || !CHILD)
+		return
 	// This is a proc used to copy genes from PARENT to CHILD. It's used in a whole bunch
 	// of places, usually when seeds or fruit are created and need to get their genes from
 	// the thing that spawned them.
@@ -144,12 +146,18 @@ proc/HYPpassplantgenes(var/datum/plantgenes/PARENT,var/datum/plantgenes/CHILD)
 proc/HYPgenerateseedcopy(var/datum/plantgenes/parent_genes, var/datum/plant/parent_planttype, var/parent_generation, var/location_to_create)
 	//This proc generates a seed at location_to_create with a copy of the planttype and genes of a given parent plant.
 	//This can be used, when you want to quickly generate seeds out of objects or other plants e.g. creeper or fruits.
-	var/obj/item/seed/child = new /obj/item/seed(location_to_create)
+	var/obj/item/seed/child
+	if (parent_planttype.unique_seed)
+		child = new parent_planttype.unique_seed(location_to_create)
+	else
+		child = new /obj/item/seed(location_to_create)
 	var/datum/plant/child_planttype = HYPgenerateplanttypecopy(child, parent_planttype)
 	var/datum/plantgenes/child_genes = child.plantgenes
-	var/datum/plantmutation/child_mutation = parent_genes.mutation
+	var/datum/plantmutation/child_mutation
+	if(parent_genes)
+		child_mutation = parent_genes.mutation
 	// If the plant is a standard plant, our work here is mostly done
-	if (!child_planttype.hybrid)
+	if (!child_planttype.hybrid && !parent_planttype.unique_seed)
 		child.generic_seed_setup(child_planttype)
 	else
 		child.planttype = child_planttype
@@ -161,8 +169,9 @@ proc/HYPgenerateseedcopy(var/datum/plantgenes/parent_genes, var/datum/plant/pare
 			seedname = "[child_mutation.name]"
 		else if(child_mutation.name_prefix || child_mutation.name_suffix)
 			seedname = "[child_mutation.name_prefix][child_planttype.name][child_mutation.name_suffix]"
-	HYPpassplantgenes(parent_genes, child_genes)
 	child.name = "[seedname] seed"
+	//What's missing is transfering genes and the generation
+	HYPpassplantgenes(parent_genes, child_genes)
 	child.generation = parent_generation
 	//Now the seed it created and we can release it upon the world
 	return child
diff --git a/code/modules/hydroponics/plants.dm b/code/modules/hydroponics/plants.dm
index 60b01c2137ca8..942c8c9c6907a 100644
--- a/code/modules/hydroponics/plants.dm
+++ b/code/modules/hydroponics/plants.dm
@@ -187,7 +187,8 @@ ABSTRACT_TYPE(/datum/plant)
 					DNA.harvtime += rand(4,6)
 					DNA.endurance += rand(4,8)
 			if ("radium","uranium")
-				damage_amt = rand(5,15)
+				if(!HYPCheckCommut(DNA,/datum/plant_gene_strain/immunity_radiation))
+					damage_amt = rand(5,15) // Seeds without radiation immunity take extra damage when infusing
 				HYPmutateDNA(DNA,1)
 				HYPnewcommutcheck(src,DNA, 2)
 				HYPnewmutationcheck(src,DNA,null,1,S)
@@ -203,6 +204,12 @@ ABSTRACT_TYPE(/datum/plant)
 				HYPnewmutationcheck(src,DNA,null,1,S)
 				if (prob(5))
 					HYPaddCommut(DNA,/datum/plant_gene_strain/unstable)
+			if ("omega_mutagen")
+				HYPmutateDNA(DNA,3)
+				HYPnewcommutcheck(src,DNA,6)
+				HYPnewmutationcheck(src,DNA,null,10,S)
+				if (prob(25))
+					HYPaddCommut(DNA,/datum/plant_gene_strain/unstable)
 			if ("ammonia")
 				damage_amt = rand(10,20)
 				DNA.growtime += rand(5,10)
diff --git a/code/modules/hydroponics/plants_weed.dm b/code/modules/hydroponics/plants_weed.dm
index 884a2db5b34ac..f1259634ef49c 100644
--- a/code/modules/hydroponics/plants_weed.dm
+++ b/code/modules/hydroponics/plants_weed.dm
@@ -17,7 +17,7 @@ ABSTRACT_TYPE(/datum/plant/weed)
 	cropsize = 3
 	force_seed_on_harvest = 1
 	vending = 2
-	genome = 30
+	genome = 31
 	assoc_reagents = list("space_fungus")
 	mutations = list(/datum/plantmutation/fungus/amanita,/datum/plantmutation/fungus/psilocybin,/datum/plantmutation/fungus/cloak)
 
@@ -93,7 +93,7 @@ ABSTRACT_TYPE(/datum/plant/weed)
 	endurance = 80
 	special_proc = 1
 	vending = 2
-	genome = 40
+	genome = 34
 	assoc_reagents = list("radium")
 	mutations = list(/datum/plantmutation/radweed/redweed,/datum/plantmutation/radweed/safeweed)
 
@@ -148,7 +148,7 @@ ABSTRACT_TYPE(/datum/plant/weed)
 	endurance = 30
 	special_proc = 1
 	vending = 2
-	genome = 45
+	genome = 40
 	var/exploding = 0
 	assoc_reagents = list("toxic_slurry")
 	mutations = list(/datum/plantmutation/slurrypod/omega)
diff --git a/code/modules/interface/keybind_menu_chui.dm b/code/modules/interface/keybind_menu_chui.dm
index 19b5b5d50c857..6d600ad332f70 100644
--- a/code/modules/interface/keybind_menu_chui.dm
+++ b/code/modules/interface/keybind_menu_chui.dm
@@ -55,11 +55,11 @@ chui/window/keybind_menu
 					var/datum/keymap/keydat = new(changed_keys_rev) //this should only have the changed entries, for optimal merge
 					current_keymap.overwrite_by_action(keydat)
 					current_keymap.on_update(owner)
-					owner.cloud_put("custom_keybind_data", json_encode(changed_keys_rev))
+					owner.player.cloudSaves.putData("custom_keybind_data", json_encode(changed_keys_rev))
 					boutput(who, SPAN_NOTICE("Your custom keybinding data has been saved."))
 			else if (id == "reset")
 				changed_keys = new/list()
-				owner.cloud_put("custom_keybind_data", null)
+				owner.player.cloudSaves.putData("custom_keybind_data", null)
 				who.keymap = null //To prevent merge() from not overwriting old keybinds
 				who.mob.reset_keymap() //Does successive calls to rebuild the keymap
 				boutput(who, SPAN_NOTICE("Your keybinding data has been reset. Please re-open the window."))
diff --git a/code/modules/interface/mob_input.dm b/code/modules/interface/mob_input.dm
index adc781eda04ff..3cce0b74f7fd3 100644
--- a/code/modules/interface/mob_input.dm
+++ b/code/modules/interface/mob_input.dm
@@ -205,11 +205,11 @@
 /mob/proc/apply_custom_keybinds(client/C)
 	PROTECTED_PROC(TRUE)
 
-	if(!C || !C.cloud_available())
+	if(!C)
 		//logTheThing(LOG_DEBUG, null, "<B>ZeWaka/Keybinds:</B> Attempted to fetch custom keybinds for [C.ckey] but failed.")
 		return
 
-	var/fetched_keylist = C.cloud_get("custom_keybind_data")
+	var/fetched_keylist = C.player.cloudSaves.getData("custom_keybind_data")
 	if (!isnull(fetched_keylist) && fetched_keylist != "") //The client has a list of custom keybinds.
 		var/datum/keymap/new_map = new /datum/keymap(json_decode(fetched_keylist))
 		C.keymap.overwrite_by_action(new_map)
diff --git a/code/obj/item/instruments.dm b/code/modules/items/instruments/instruments.dm
similarity index 100%
rename from code/obj/item/instruments.dm
rename to code/modules/items/instruments/instruments.dm
diff --git a/code/obj/playable_piano.dm b/code/modules/items/instruments/playable_piano.dm
similarity index 100%
rename from code/obj/playable_piano.dm
rename to code/modules/items/instruments/playable_piano.dm
diff --git a/code/modules/mapping/helpers/wingrille_spawner.dm b/code/modules/mapping/helpers/wingrille_spawner.dm
index 3ac4c19092bae..937b2b511b77c 100644
--- a/code/modules/mapping/helpers/wingrille_spawner.dm
+++ b/code/modules/mapping/helpers/wingrille_spawner.dm
@@ -92,6 +92,7 @@
 	win_path = /obj/window/auto
 	full_win = TRUE
 	no_dirs = TRUE
+	layer = LATTICE_LAYER	// to stop it rendering over things in map editors
 #ifdef PERSPECTIVE_EDITOR_WALL
 	icon_state = "wingrille_new"
 	color = "#A3DCFF"
diff --git a/code/modules/materials/Mat_MaterialProcs.dm b/code/modules/materials/Mat_MaterialProcs.dm
index cde3a0fc45073..e93034f3bec32 100644
--- a/code/modules/materials/Mat_MaterialProcs.dm
+++ b/code/modules/materials/Mat_MaterialProcs.dm
@@ -530,7 +530,7 @@ triggerOnEntered(var/atom/owner, var/atom/entering)
 
 /datum/materialProc/slippery_attack
 	execute(var/atom/owner, var/mob/attacker, var/atom/attacked)
-		if (isitem(owner) && prob(20))
+		if (isitem(owner) && prob(20) && (owner in attacker.equipped_list()))
 			var/obj/item/handled_item = owner
 			boutput(attacker, SPAN_ALERT("[handled_item] slips right out of your hand!"))
 			handled_item.set_loc(attacker.loc)
diff --git a/code/modules/mechanics/MechanicMadness.dm b/code/modules/mechanics/MechanicMadness.dm
index c483a7c03b5d7..c8844c5479605 100644
--- a/code/modules/mechanics/MechanicMadness.dm
+++ b/code/modules/mechanics/MechanicMadness.dm
@@ -3212,6 +3212,7 @@ ADMIN_INTERACT_PROCS(/obj/item/mechanics/trigger/button, proc/press)
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_INPUT,"Set A", PROC_REF(setA))
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_INPUT,"Set B", PROC_REF(setB))
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_INPUT,"Evaluate", PROC_REF(evaluate))
+		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_INPUT,"Set Mode", PROC_REF(compSetMode))
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_CONFIG,"Set A",PROC_REF(setAManually))
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_CONFIG,"Set B",PROC_REF(setBManually))
 		SEND_SIGNAL(src,COMSIG_MECHCOMP_ADD_CONFIG,"Set Mode",PROC_REF(setMode))
@@ -3267,6 +3268,11 @@ ADMIN_INTERACT_PROCS(/obj/item/mechanics/trigger/button, proc/press)
 			tooltip_rebuild = 1
 			if (autoEval)
 				src.evaluate()
+	proc/compSetMode(var/datum/mechanicsMessage/input)
+		LIGHT_UP_HOUSING
+		tooltip_rebuild = 1
+		if(input.signal in list("add","mul","div","sub","mod","pow","rng","eq","neq","gt","lt","gte","lte"))
+			mode = input.signal
 	proc/evaluate()
 		switch(mode)
 			if("add")
diff --git a/code/modules/medals/rewardsLocker.dm b/code/modules/medals/rewardsLocker.dm
index a4d88d02e3b02..6bac2572cc219 100644
--- a/code/modules/medals/rewardsLocker.dm
+++ b/code/modules/medals/rewardsLocker.dm
@@ -375,9 +375,12 @@
 			var/prev = skin_target.name
 			skin_target.name = "round-bottom flask"
 			skin_target.desc = "A large round-bottom flask, for all your chemistry needs. (Base Item: [prev])"
-			skin_target.icon_style = "flask"
-			skin_target.item_state = "flask"
-			skin_target.fluid_image = image(skin_target.icon, "fluid-flask")
+			skin_target.icon_state = "large_flask"
+			skin_target.item_state = "large_flask"
+			skin_target.original_icon_state = "large_flask"
+			skin_target.fluid_overlay_states = 11
+			skin_target.container_style = "large_flask"
+			skin_target.fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_SPHERICAL
 			skin_target.UpdateIcon()
 			activator.set_clothing_icon_dirty()
 			return 1
diff --git a/code/modules/medical/genetics/bioEffects/mutantrace.dm b/code/modules/medical/genetics/bioEffects/mutantrace.dm
index a018bb7ce5968..fdcc4f983ab1d 100644
--- a/code/modules/medical/genetics/bioEffects/mutantrace.dm
+++ b/code/modules/medical/genetics/bioEffects/mutantrace.dm
@@ -146,6 +146,14 @@
 	msgLose = "Your fur falls out."
 	icon_state  = "cat"
 
+/datum/bioEffect/mutantrace/cat/bingus
+	name = "Bingus Genetics"
+	id = "bingus"
+	mutantrace_option = "Bingus"
+	mutantrace_path = /datum/mutantrace/cat/bingus
+	msgGain = "You feel like wearing jeans."
+	msgLose = "Your love of jeans fades."
+	icon_state = null
 
 /datum/bioEffect/mutantrace/cow
 	name = "Bovine Genetics"
diff --git a/code/modules/medical/genetics/bioEffects/powers.dm b/code/modules/medical/genetics/bioEffects/powers.dm
index bd7077479b9c1..1c7f578321575 100644
--- a/code/modules/medical/genetics/bioEffects/powers.dm
+++ b/code/modules/medical/genetics/bioEffects/powers.dm
@@ -195,6 +195,7 @@
 			var/obj/item/I = the_object
 			if(I)
 				if(I.Eat(owner, owner, TRUE)) //eating can return false to indicate it failed
+					I.storage?.hide_hud(owner)
 					logTheThing(LOG_COMBAT, owner, "uses Matter Eater to eat [log_object(the_object)] at [log_loc(owner)].")
 					// Organs and body parts have special behaviors we need to account for
 					if (ishuman(owner))
@@ -1023,13 +1024,17 @@
 				shake_camera(V,10,64)
 				if (V == owner)
 					continue
-				boutput(V, SPAN_ALERT("You are sent flying!"))
 
 				V.changeStatus("weakened", stun_time SECONDS)
-				// why the hell was this set to 12 christ
-				while (throw_repeat > 0)
-					throw_repeat--
-					step_away(V,get_turf(owner),throw_speed)
+				if(!V.anchored)
+					boutput(V, SPAN_ALERT("You are sent flying!"))
+					// why the hell was this set to 12 christ
+					while (throw_repeat > 0)
+						throw_repeat--
+						step_away(V,get_turf(owner),throw_speed)
+				else
+					boutput(V, SPAN_ALERT("You are knocked down!"))
+
 			var/toxic = owner.bioHolder.HasEffect("toxic_farts")
 			if(toxic)
 				var/turf/fart_turf = get_turf(owner)
diff --git a/code/modules/medical/genetics/bioEffects/speech.dm b/code/modules/medical/genetics/bioEffects/speech.dm
index 56b24158ba936..60a601c1c6832 100644
--- a/code/modules/medical/genetics/bioEffects/speech.dm
+++ b/code/modules/medical/genetics/bioEffects/speech.dm
@@ -1033,3 +1033,18 @@
 			return ""
 		message = accent_piglatin(message)
 		return message
+
+/datum/bioEffect/speech/bingus
+	name = "Frontal Gyrus Alteration Type-bingus"
+	desc = "Reconstructs the language center of the subject's brain to love bingus."
+	id = "accent_bingus"
+	effectType = EFFECT_TYPE_DISABILITY
+	msgGain = "Bingus my beloved :)"
+	msgLose = "Bingus my beloved :("
+	occur_in_genepools = FALSE
+	probability = 0 // Should not be player accessible
+
+	OnSpeak(var/message)
+		if (!istext(message))
+			return ""
+		return bingus_parse(message)
diff --git a/code/modules/medical/genetics/portagene.dm b/code/modules/medical/genetics/portagene.dm
index 7ce85863fd9b2..83b80173baf16 100644
--- a/code/modules/medical/genetics/portagene.dm
+++ b/code/modules/medical/genetics/portagene.dm
@@ -80,9 +80,10 @@
 		if (BOUNDS_DIST(src, user) > 0 || BOUNDS_DIST(user, target) > 0)
 			return
 
-		if (target == user)
-			go_in(target)
-		else if (can_operate(user,target))
+		if (can_operate(user, target))
+			if (target == user)
+				go_in(target)
+				return
 			var/previous_user_intent = user.a_intent
 			user.set_a_intent(INTENT_GRAB)
 			user.drop_item()
@@ -92,7 +93,6 @@
 				if (can_operate(user,target))
 					if (istype(user.equipped(), /obj/item/grab))
 						src.Attackby(user.equipped(), user)
-		return
 
 	proc/can_operate(var/mob/M, var/mob/living/target)
 		if (!isalive(M))
diff --git a/code/modules/medical/pathology/pathogen_tools.dm b/code/modules/medical/pathology/pathogen_tools.dm
index d08036e3016b8..8529c669ae515 100644
--- a/code/modules/medical/pathology/pathogen_tools.dm
+++ b/code/modules/medical/pathology/pathogen_tools.dm
@@ -250,17 +250,13 @@
 /obj/item/reagent_containers/glass/vial
 	name = "vial"
 	desc = "A vial. Can hold up to 5 units."
-	icon = 'icons/obj/pathology.dmi'
-	icon_state = "vial0"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	icon_state = "phial"
 	item_state = "vial"
 	rc_flags = RC_FULLNESS | RC_VISIBLE | RC_SPECTRO
-
-	on_reagent_change()
-		..()
-		if (reagents.total_volume < 0.05)
-			icon_state = "vial0"
-		else
-			icon_state = "vial1"
+	accepts_lid = TRUE
+	fluid_overlay_states = 5
+	container_style = "phial"
 
 	New()
 		var/datum/reagents/R = new /datum/reagents(5)
@@ -280,9 +276,6 @@
 /obj/item/reagent_containers/glass/vial/prepared
 	name = "Totally Safe(tm) pathogen sample"
 	desc = "A vial. Can hold up to 5 units."
-	icon = 'icons/obj/pathology.dmi'
-	icon_state = "vial0"
-	item_state = "vial"
 	var/datum/microbody/FM = null
 
 	New()
@@ -303,6 +296,8 @@
 			RE.add_reagent("water", 5)
 			#endif
 
+			src.UpdateIcon()
+
 /obj/item/reagent_containers/glass/vial/prepared/virus
 	FM = /datum/microbody/virus
 
@@ -319,8 +314,6 @@
 	name = "Beaker of Parasitic Medium"
 	desc = "A mix of blood and flesh; fertile ground for some microbes."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("parasiticmedium", 50)
@@ -329,8 +322,6 @@
 	name = "Beaker of Eggs"
 	desc = "Eggs; fertile ground for some microbes."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("egg", 50)
@@ -339,8 +330,6 @@
 	name = "Beaker of Stable Mutagen"
 	desc = "Stable Mutagen; fertile ground for some microbes."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("dna_mutagen", 50)
@@ -349,8 +338,6 @@
 	name = "Beaker of Bacterial Growth Medium"
 	desc = "Bacterial Growth Medium; fertile ground for some microbes."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("bacterialmedium", 50)
@@ -359,8 +346,6 @@
 	name = "Beaker of Fungal Growth Medium"
 	desc = "Fungal Growth Medium; fertile ground for some microbes."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("fungalmedium", 50)
@@ -369,8 +354,6 @@
 	name = "Beaker of Antiviral Agent"
 	desc = "A beaker of a weak anti-viral agent."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("antiviral", 50)
@@ -379,8 +362,6 @@
 	name = "Beaker of Biocides"
 	desc = "A beaker of biocides. The label says 'do not feed to worms or mushrooms'. Curious."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("biocide", 50)
@@ -389,8 +370,6 @@
 	name = "Beaker of Spaceacillin"
 	desc = "It's penicillin in space."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("spaceacillin", 50)
@@ -399,8 +378,6 @@
 	name = "Beaker of Inhibition Agent"
 	desc = "It's green, that's for sure."
 
-	icon_state = "beaker"
-
 	New()
 		..()
 		src.reagents.add_reagent("inhibitor", 50)
diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm
new file mode 100644
index 0000000000000..e24ee513b7e51
--- /dev/null
+++ b/code/modules/mentor/mentorhelp.dm
@@ -0,0 +1,100 @@
+/client/proc/set_mentorhelp_visibility(var/set_as = null)
+	if (!isnull(set_as))
+		player.see_mentor_pms = set_as
+	else
+		player.see_mentor_pms = !player.see_mentor_pms
+	boutput(src, "<span class='ooc mentorooc'>You will [player.see_mentor_pms ? "now" : "no longer"] see Mentorhelps [player.see_mentor_pms ? "and" : "or"] show up as a Mentor.</span>")
+
+/client/proc/toggle_mentorhelps()
+	set name = "Toggle Mentorhelps"
+	set category = "Commands"
+	set desc = "Show or hide mentorhelp messages. You will also no longer show up as a mentor in OOC and via the Who command if you disable mentorhelps."
+
+	if (!src.is_mentor() && !src.holder)
+		boutput(src, SPAN_ALERT("Only mentors may use this command."))
+		src.verbs -= /client/proc/toggle_mentorhelps // maybe?
+		return
+
+	src.set_mentorhelp_visibility()
+
+/mob/verb/mentorhelp()
+	set category = "Commands"
+	set name = "mentorhelp"
+
+	var/client/client = src.client
+
+	if (IsGuestKey(client.key))
+		boutput(client.mob, "You are not authorized to communicate over these channels.")
+		gib(client.mob)
+		return
+
+	var/mob/dead/target_observer/mentor_mouse_observer/mmouse = locate() in src
+	if(mmouse) // mouse in your pocket takes precedence over mhelps
+		var/msg = input("Please enter your whispers to the mouse:") as null|text
+		msg = copytext(strip_html(msg), 1, MAX_MESSAGE_LEN * 4)
+		if (!msg)
+			return
+		var/class = mmouse.is_admin ? "adminooc" : "mhelp"
+		boutput(mmouse, "<span class='[class]'><b>[client.mob]</b> whispers: \"<i>[msg]</i>\"</span>")
+		boutput(client.mob, "<span class='[class]'>You whisper to \the [mmouse]: \"<i>[msg]</i>\"</span>")
+		for (var/client/C)
+			if (C.holder)
+				if (C.player_mode || C == client || C == mmouse.client)
+					continue
+				else
+					var/rendered = "<span class='[class]'><b>[mmouse.is_admin ? "A" : "M"]MOUSEWHISPER: [key_name(client.mob,0,0,1)]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span> <A HREF='?src=\ref[C.holder];action=adminplayeropts;targetckey=[client.ckey]' class='popt'><i class='icon-info-sign'></i></A></b>: [SPAN_MESSAGE("[msg]")]</span>"
+					boutput(C,  "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
+		logTheThing(LOG_DIARY, client.mob, "([mmouse.is_admin ? "A" : "M"]MOUSEWHISPER): [msg]", "say")
+		return
+
+	if (client.player.cloudSaves.getData("mentorhelp_banner"))
+		boutput(client.mob, "You have been banned from using this command.")
+		return
+
+	if(ON_COOLDOWN(client.player, "ahelp", ADMINHELP_DELAY))
+		boutput(src, "You must wait [time_to_text(ON_COOLDOWN(src, "ahelp", 0))].")
+		return
+
+	var/msg = input("Enter your help request to mentors.\nMentorhelps are sent to mentors via Discord.\n\nPlease use Adminhelp (F1) for rules questions.", "mentorhelp") as null|message
+
+	msg = copytext(strip_html(msg, strip_newlines=FALSE), 1, MAX_MESSAGE_LEN * 4)
+	if (client.can_see_mentor_pms())
+		msg = linkify(msg)
+
+	if (!msg)
+		return
+
+	if (client?.ismuted())
+		return
+
+	var/dead = isdead(client.mob) ? "Dead " : ""
+	var/ircmsg[] = new()
+	ircmsg["key"] = client.key
+	ircmsg["name"] = client.mob.job ? "[stripTextMacros(client.mob.real_name)] \[[dead][client.mob.job]]" : (dead ? "[stripTextMacros(client.mob.real_name)] \[[dead]\]" : stripTextMacros(client.mob.real_name))
+	ircmsg["msg"] = html_decode(msg)
+	var/unique_message_id = md5("mhelp" + json_encode(ircmsg))
+	ircmsg["msgid"] = unique_message_id
+	ircbot.export_async("mentorhelp", ircmsg)
+
+	var/src_keyname = key_name(client.mob, 0, 0, 1, additional_url_data="&msgid=[unique_message_id]")
+
+	for (var/client/C)
+		if (C.holder)
+			if (C.player_mode && !C.player_mode_mhelp)
+				continue
+			else
+				var/rendered = SPAN_MHELP("<b>MENTORHELP: [src_keyname]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span> <A HREF='?src=\ref[C.holder];action=adminplayeropts;targetckey=[client.ckey]' class='popt'><i class='icon-info-sign'></i></A></b>: [SPAN_MESSAGE("[msg]")]")
+				boutput(C,  "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
+		else if (C?.can_see_mentor_pms())
+			if(istype(C.mob, /mob/dead/observer) || C.mob.type == /mob/dead/target_observer || C.mob.type == /mob/dead/target_observer/mentor_mouse_observer || istype(C.mob, /mob/living/critter/small_animal/mouse/weak/mentor))
+				var/rendered = SPAN_MHELP("<b>MENTORHELP: [src_keyname]<span class='name text-normal' data-ctx='\ref[src.mind]'>[(client.mob.real_name ? "/"+client.mob.real_name : "")]</span></b>: [SPAN_MESSAGE("[msg]")]")
+				boutput(C, "<span class='adminHearing' data-ctx='[C.chatOutput.ctxFlag]'>[rendered]</span>")
+			else
+				boutput(C, SPAN_MHELP("<b>MENTORHELP: [src_keyname]</b>: [SPAN_MESSAGE("[msg]")]"))
+
+	boutput(client.mob, SPAN_MHELP("<b>MENTORHELP: You</b>: [msg]"))
+	logTheThing(LOG_MHELP, client.mob, "MENTORHELP: [msg]")
+	logTheThing(LOG_DIARY, client.mob, "MENTORHELP: [msg]", "mhelp")
+#ifdef DATALOGGER
+	game_stats.Increment("mentorhelps")
+#endif
diff --git a/code/modules/networks/computer3/disks.dm b/code/modules/networks/computer3/disks.dm
index 7379e133a983a..0669a7adb060f 100644
--- a/code/modules/networks/computer3/disks.dm
+++ b/code/modules/networks/computer3/disks.dm
@@ -66,6 +66,15 @@
 			user.visible_message(SPAN_ALERT("<b>[user] is zapped as the multitool backfires! The [src.name] seems unphased.</b>"))
 			elecflash(user,0, power=2, exclude_center = 0)
 
+	emp_act()
+		. = ..()
+		if (src.root)
+			src.root.dispose()
+
+		src.root = new /datum/computer/folder
+		src.root.holder = src
+		src.root.name = "root"
+
 	attackby(obj/item/W, mob/user)
 		if (ispulsingtool(W))
 			user.visible_message(SPAN_ALERT("<b>[user] begins to wipe [src.name]!</b>"))
diff --git a/code/modules/networks/computer3/mainframe2/misc_terms.dm b/code/modules/networks/computer3/mainframe2/misc_terms.dm
index 91ffd158d8f56..5ca784dc587b2 100644
--- a/code/modules/networks/computer3/mainframe2/misc_terms.dm
+++ b/code/modules/networks/computer3/mainframe2/misc_terms.dm
@@ -681,21 +681,25 @@ TYPEINFO(/obj/machinery/networked/storage)
 	icon_state = "bomb_scanner0"
 	base_icon_state = "bomb_scanner"
 
-	setup_access_click = 0
-	read_only = 1
+	setup_access_click = FALSE
+	read_only = TRUE
 	setup_drive_size = 4
 	setup_drive_type = /obj/item/disk/data/bomb_tester
-	setup_accept_tapes = 0
+	setup_accept_tapes = FALSE
 
+	/// One of two tanks this holds as a basis for the simulation
 	var/obj/item/tank/tank1 = null
+	/// Two of two tanks this holds as a basis for the simulation
 	var/obj/item/tank/tank2 = null
+	/// File record where the simulation results are kept
 	var/datum/computer/file/record/results = null
-	var/setup_result_name = "Bomblog"
+	/// Our VR TTV to attach tank1 and tank2 to
 	var/obj/item/device/transfer_valve/vr/vrbomb = null
-	var/last_sim = 0 //Last world.time we tested a bomb.
-	var/sim_delay = 300 //Time until next simulation.
 	power_usage = 200
-
+	HELP_MESSAGE_OVERRIDE("Simulates the mixture of two tanks of gas.</br>\
+						   You can use the <b>VR Goggles</b> typically found nearby to watch the simulation unfold.</br>\
+						   A <b>screwdriver</b> can open the maintenence panel to manage the host connection.")
+	/// Where the bomb gets dropped
 	var/vr_landmark = LANDMARK_VR_BOMB
 
 	power_change()
@@ -706,9 +710,8 @@ TYPEINFO(/obj/machinery/networked/storage)
 			SPAWN(rand(0, 15))
 				status |= NOPOWER
 				UpdateIcon()
-				if(vrbomb)
-					qdel(vrbomb)
-
+				if(src.vrbomb)
+					qdel(src.vrbomb)
 		return
 
 	process()
@@ -735,303 +738,288 @@ TYPEINFO(/obj/machinery/networked/storage)
 
 		return
 
-	attackby(obj/item/W, mob/user)
-		if (istype(W, /obj/item/tank))
-			return attack_hand(user)
-		else if (isscrewingtool(W))
-			playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
-			boutput(user, "You [src.locked ? "secure" : "unscrew"] the maintenance panel.")
-			src.panel_open = !src.panel_open
-			src.updateUsrDialog()
-			return
+	/// Handheld tanks and butts are both fair game here
+	proc/is_valid_tank(obj/item/I)
+		return (istype(I, /obj/item/tank) || istype(I, /obj/item/clothing/head/butt))
+
+	/// Determine if the simulator is ready, returns a list of a bool for whether it's ready, and a dialogue for the user
+	proc/can_simulate()
+		if(!(src.tank1 && src.tank2))
+			return list(FALSE, "Both tanks are required!")
+		else if (GET_COOLDOWN(global, "bomb_simulator"))
+			return list(FALSE, "Simulator not ready, please try again later.")
+		else if (src.vrbomb)
+			return list(TRUE, "Simulation in progress!")
 		else
-			..()
-		return
-
-	attack_hand(mob/user)
-		if(status & (NOPOWER|BROKEN))
-			return
-
-		if(user.lying || user.stat)
-			return 1
-
-		if ((BOUNDS_DIST(src, user) > 0 || !istype(src.loc, /turf)) && !issilicon(user))
-			return 1
-
-		src.add_dialog(user)
-
-		var/dat = "<html><head><title>SimUnit - \[[bank_id]]</title></head><body>"
-
-		dat += "<b>Tank One:</b> <a href='?src=\ref[src];tank=1'>[src.tank1 ? "Eject" : "None"]</a><br>"
-		dat += "<b>Tank Two:</b> <a href='?src=\ref[src];tank=2'>[src.tank2 ? "Eject" : "None"]</a><hr>"
-
-		dat += "<b>Simulation:</b> [vrbomb ? "IN PROGRESS" : "<a href='?src=\ref[src];simulate=1'>BEGIN</a>"]<br>"
-
-		var/readout_color = "#000000"
-		var/readout = "ERROR"
-		if(src.host_id)
-			readout_color = "#33FF00"
-			readout = "OK CONNECTION"
+			return list(TRUE, "Simulator ready.")
+
+#define TANK_ONE 1
+#define TANK_TWO 2
+/// Checks if we have a tank in the specified slot
+#define HAS_TANK(tanknum) ((tanknum == TANK_ONE) && src.tank1) || ((tanknum == TANK_TWO) && src.tank2)
+/// Add the tank to the slot being interact with in the device
+#define ADD_TANK(tanknum, tank) tank.set_loc(src); if ((tanknum) == TANK_ONE) {src.tank1 = tank;}\
+								else {src.tank2 = tank;};
+	/// Interact with one of the tank slots on the machine. 1 for the first slot, 2 for the second. "null" to use an empty slot, if there is one.
+	proc/add_tank(mob/user, obj/item/I, slot=null)
+		if(issilicon(user) && BOUNDS_DIST(src, user) > 0)
+			boutput(user, SPAN_ALERT("You cannot interact with \the [src] from that far away!"))
+			return
+		// No slot specified, try to interact with an empty slot
+		if (!slot)
+			if (HAS_TANK(TANK_ONE))
+				if (HAS_TANK(TANK_TWO))
+					boutput(user, SPAN_ALERT("There is no room to insert that into \the [src]!"))
+					return
+				else
+					slot = TANK_TWO
+			else
+				slot = TANK_ONE
+		// Magtractors need special handling
+		if (istype(I, /obj/item/magtractor))
+			var/obj/item/magtractor/mag = I
+			I = mag.holding
+			if (!src.is_valid_tank(I))
+				boutput(user, "That won't work inside of the [src]!")
+			else
+				mag.dropItem(0)
+				ADD_TANK(slot, I)
+				playsound(src, 'sound/machines/click.ogg', 50, TRUE)
+				boutput(user, "You insert \the [I].")
+		else if (!src.is_valid_tank(I))
+			boutput(user, "That won't work inside of the [src]!")
 		else
-			readout_color = "#F80000"
-			readout = "NO CONNECTION"
-
-		dat += "Host Connection: "
-		dat += "<table border='1' style='background-color:[readout_color]'><tr><td><font color=white>[readout]</font></td></tr></table><br>"
+			user.drop_item()
+			ADD_TANK(slot, I)
+			playsound(src, 'sound/machines/click.ogg', 50, TRUE)
+			boutput(user, "You insert \the [I].")
+
+	ui_act(action, params)
+		switch(action)
+			if ("add_item")
+				src.add_tank(usr, usr.equipped(), params["tank"])
+
+			if ("remove_tank_one")
+				if (HAS_TANK(TANK_ONE))
+					usr.put_in_hand_or_eject(src.tank1)
+					boutput(usr, "You eject \the [src.tank1].")
+					src.tank1 = null
+					if (src.vrbomb)
+						qdel(src.vrbomb)
+
+			if ("remove_tank_two")
+				if (HAS_TANK(TANK_TWO))
+					usr.put_in_hand_or_eject(src.tank2)
+					boutput(usr, "You eject \the [src.tank2].")
+					src.tank2 = null
+					if (src.vrbomb)
+						qdel(src.vrbomb)
+
+			if("simulate")
+				// Button is disabled on these conditions, but can't hurt to check em' twice
+				var/simulator_dialogue = src.can_simulate()
+				if (!simulator_dialogue[1])
+					boutput(usr, SPAN_ALERT(simulator_dialogue[2]))
+				ON_COOLDOWN(global, "bomb_simulator", 30 SECONDS)
+				src.generate_vrbomb()
+				src.updateUsrDialog()
 
-		dat += "<a href='?src=\ref[src];reset=1'>Reset Connection</a><br>"
+			if ("reset")
+				if (!host_id || ON_COOLDOWN(src, "reset", NETWORK_MACHINE_RESET_DELAY))
+					return
+				var/rem_host = src.host_id ? src.host_id : src.old_host_id
+				src.host_id = null
+				src.old_host_id = null
+				src.post_status(rem_host, "command","term_disconnect")
+				SPAWN(0.5 SECONDS)
+					src.post_status(rem_host, "command","term_connect","device",src.device_tag)
+				return
 
-		if (src.panel_open)
-			dat += net_switch_html()
+			if ("config_switch")
+				src.net_number = src.net_number ^ (1 << params["switch_flicked"])
 
-		user.Browse(dat,"window=bombtester;size=245x302")
-		onclose(user,"bombtester")
+		tgui_process.update_uis(src)
+		src.add_fingerprint(usr)
 		return
 
-	Topic(href, href_list)
-		if(..())
-			return
-
-		src.add_dialog(usr)
-
-		if (href_list["tank"])
+#undef HAS_TANK
+#undef ADD_TANK
+#undef TANK_ONE
+#undef TANK_TWO
+
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if (!ui)
+			ui = new(user, src, "Bombsim", src.name)
+			ui.open()
+
+/// Gets relevant properties of the tank as a list for ui_data
+#define TANK_AS_LIST(tank) (tank != null) ? list("name"=capitalize(tank.name),\
+								"pressure"=((hasvar(tank, "air_contents") && tank.air_contents != null) ? MIXTURE_PRESSURE(tank.air_contents) : null),\
+								"maxPressure"=TANK_FRAGMENT_PRESSURE) : list("name"=null, "pressure"=null,"maxPressure"=null)
+	ui_data()
+		var/simulator_dialogue = src.can_simulate()
+		return list(
+			"tank_one" = TANK_AS_LIST(src.tank1),
+			"tank_two" = TANK_AS_LIST(src.tank2),
+			"host_id" = src.host_id,
+			"vr_bomb" = src.vrbomb,
+			"panel_open" = src.panel_open,
+			"is_ready" = simulator_dialogue[1],
+			"cooldown" = "[GET_COOLDOWN(global, "bomb_simulator")/10] Second\s",
+			"readiness_dialogue" = simulator_dialogue[2],
+			"net_number" = src.net_number,
+		)
 
-			//Ai/cyborgs cannot physically remove a tape from a room away.
-			if(issilicon(usr) && BOUNDS_DIST(src, usr) > 0)
-				boutput(usr, SPAN_ALERT("You cannot press the ejection button."))
-				return
-
-			switch(href_list["tank"])
-				if("1")
-					if(src.tank1)
-						src.tank1.set_loc(src.loc)
-						src.tank1 = null
-						boutput(usr, "You remove the tank.")
-						if(vrbomb)
-							qdel(vrbomb)
-					else
-						var/obj/item/I = usr.equipped()
-						if (istype(I, /obj/item/tank))
-							usr.drop_item()
-							I.set_loc(src)
-							src.tank1 = I
-							boutput(usr, "You insert [I].")
-						else if (istype(I, /obj/item/magtractor))
-							var/obj/item/magtractor/mag = I
-							if (istype(mag.holding, /obj/item/tank))
-								I = mag.holding
-								mag.dropItem(0)
-								I.set_loc(src)
-								src.tank1 = I
-								boutput(usr, "You insert [I].")
-					src.UpdateIcon()
-				if("2")
-					if(src.tank2)
-						src.tank2.set_loc(src.loc)
-						src.tank2 = null
-						boutput(usr, "You remove the tank.")
-						if(vrbomb)
-							qdel(vrbomb)
-					else
-						var/obj/item/I = usr.equipped()
-						if (istype(I, /obj/item/tank))
-							usr.drop_item()
-							I.set_loc(src)
-							src.tank2 = I
-							boutput(usr, "You insert [I].")
-						else if (istype(I, /obj/item/magtractor))
-							var/obj/item/magtractor/mag = I
-							if (istype(mag.holding, /obj/item/tank))
-								I = mag.holding
-								mag.dropItem(0)
-								I.set_loc(src)
-								src.tank2 = I
-								boutput(usr, "You insert [I].")
-					src.UpdateIcon()
-
-			src.updateUsrDialog()
+	update_icon()
+		if(tank1) //Update tank overlays.
+			UpdateOverlays(image(src.icon,"bscanner-tank1"), "tank1")
+		else
+			UpdateOverlays(null, "tank1")
+		if(tank2)
+			UpdateOverlays(image(src.icon,"bscanner-tank2"), "tank2")
+		else
+			UpdateOverlays(null, "tank2")
 
-		else if(href_list["simulate"])
-			if(!tank1 || !tank2)
-				boutput(usr, SPAN_ALERT("Both tanks are required!"))
-				return
+		if(status & BROKEN)
+			icon_state = "bomb_scannerb"
+			return
+		if(status & NOPOWER)
+			icon_state = "bomb_scanner-p"
+			return
 
-			if(last_sim && (last_sim + sim_delay > world.time))
-				boutput(usr, SPAN_ALERT("Simulator not ready, please try again later."))
-				return
+		if(src.tank1 && src.tank2)
+			icon_state = "bomb_scanner1"
+		else
+			icon_state = "bomb_scanner0"
+		return
 
-			if(vrbomb)
-				boutput(usr, SPAN_ALERT("Simulation already in progress!"))
-				return
+	attackby(obj/item/I, mob/user)
+		..()
+		if (src.is_valid_tank(I)) // Insert tanks by hand
+			src.add_tank(user, I)
 
-			src.generate_vrbomb()
-			src.updateUsrDialog()
+	attack_hand(mob/user)
+		if(status & (NOPOWER|BROKEN))
+			return
 
-		else if (href_list["reset"])
-			if(last_reset && (last_reset + NETWORK_MACHINE_RESET_DELAY >= world.time))
-				return
+		if(user.lying || user.stat)
+			return 1
 
-			if(!host_id)
-				return
+		if ((BOUNDS_DIST(src, user) > 0 || !istype(src.loc, /turf)) && !issilicon(user))
+			return 1
 
-			src.last_reset = world.time
-			var/rem_host = src.host_id ? src.host_id : src.old_host_id
-			src.host_id = null
-			src.old_host_id = null
-			src.post_status(rem_host, "command","term_disconnect")
-			SPAWN(0.5 SECONDS)
-				src.post_status(rem_host, "command","term_connect","device",src.device_tag)
+		src.ui_interact(user)
 
-			src.updateUsrDialog()
+	proc/generate_vrbomb()
+		if(!(src.tank1 && src.tank2))
 			return
 
-		src.add_fingerprint(usr)
-		return
-
-	proc
-		generate_vrbomb()
-			if(!tank1 || !tank2)
-				return
-
-			if(vrbomb)
-				qdel(vrbomb)
+		if(src.vrbomb)
+			qdel(src.vrbomb)
 
-			var/turf/B = pick_landmark(vr_landmark)
-			if(!B)
-				playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
-				src.visible_message("[src] emits a somber ping.")
-				return
+		var/turf/B = pick_landmark(vr_landmark)
+		if(!B)
+			playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
+			src.visible_message("[src] emits a somber ping.")
+			return
+
+		// Create and setup our vr explosive
+		src.vrbomb = new
+		src.vrbomb.set_loc(B)
+		src.vrbomb.anchored = ANCHORED
+		src.vrbomb.tester = src
+
+		var/obj/item/tank/vrtank1 = new tank1.type
+		var/obj/item/tank/vrtank2 = new tank2.type
+
+		if (hasvar(src.tank1, "air_contents"))
+			vrtank1.air_contents.copy_from(src.tank1.air_contents)
+		if (hasvar(src.tank2, "air_contents"))
+			vrtank2.air_contents.copy_from(src.tank2.air_contents)
+
+		src.vrbomb.tank_one = vrtank1
+		src.vrbomb.tank_two = vrtank2
+		vrtank1.set_loc(src.vrbomb)
+		vrtank2.set_loc(src.vrbomb)
+
+		src.vrbomb.UpdateIcon()
+		SPAWN(3 SECONDS)
+			src.vrbomb.toggle_valve()
+
+		var/area/to_reset = get_area(src.vrbomb) //Reset the magic vr turf.
+		if(to_reset && to_reset.name != "Space")
+			for(var/turf/unsimulated/bombvr/VT in to_reset)
+				VT.icon_state = initial(VT.icon_state)
+			for(var/turf/unsimulated/wall/bombvr/VT in to_reset)
+				VT.icon_state = initial(VT.icon_state)
+				VT.set_opacity(1)
+				VT.set_density(1)
+
+		src.new_bomb_log()
+		return
 
-			vrbomb = new
-			vrbomb.set_loc(B)
-			vrbomb.anchored = ANCHORED
-			vrbomb.tester = src
-
-			var/obj/item/device/timer/T = new
-			vrbomb.attached_device = T
-			T.master = vrbomb
-			T.time = 6
-
-			var/obj/item/tank/vrtank1 = new tank1.type
-			var/obj/item/tank/vrtank2 = new tank2.type
-
-			vrtank1.air_contents.copy_from(tank1.air_contents)
-			vrtank2.air_contents.copy_from(tank2.air_contents)
-
-			vrbomb.tank_one = vrtank1
-			vrbomb.tank_two = vrtank2
-			vrtank1.master = vrbomb
-			vrtank1.set_loc(vrbomb)
-			vrtank2.master = vrbomb
-			vrtank2.set_loc(vrbomb)
-
-			vrbomb.UpdateIcon()
-
-			T.timing = 1
-			T.c_state(1)
-			processing_items |= T
-			src.last_sim = world.time
-
-			var/area/to_reset = get_area(vrbomb) //Reset the magic vr turf.
-			if(to_reset && to_reset.name != "Space")
-				for(var/turf/unsimulated/bombvr/VT in to_reset)
-					VT.icon_state = initial(VT.icon_state)
-				for(var/turf/unsimulated/wall/bombvr/VT in to_reset)
-					VT.icon_state = initial(VT.icon_state)
-					VT.set_opacity(1)
-					VT.set_density(1)
-
-			if(results)
-				//qdel(results)
-				results.dispose()
-			src.new_bomb_log()
-			return
-
-		new_bomb_log()
-			if(!tape)
-				return
+	proc/new_bomb_log()
+		if(!tape)
+			return
 
-			if(results)
-				//qdel(results)
-				results.dispose()
+		if(src.results)
+			src.results.dispose()
 
-			results = new
-			results.name = setup_result_name
+		src.results = new
+		src.results.name = "Bomblog"
 
-			results.fields += "Test [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [CURRENT_SPACE_YEAR]"
+		src.results.fields += "Test [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [CURRENT_SPACE_YEAR]"
 
-			results.fields += "Atmospheric Tank #1:"
-			if(tank1)
-				var/datum/gas_mixture/environment = tank1.return_air()
-				var/pressure = MIXTURE_PRESSURE(environment)
-				var/total_moles = TOTAL_MOLES(environment)
+		src.results.fields += "Atmospheric Tank #1:"
+		if(tank1 && tank1?.air_contents)
+			var/datum/gas_mixture/environment = tank1.return_air()
+			var/pressure = MIXTURE_PRESSURE(environment)
+			var/total_moles = TOTAL_MOLES(environment)
 
-				results.fields += "Tank Pressure: [round(pressure,0.1)] kPa"
-				if(total_moles)
-					LIST_CONCENTRATION_REPORT(environment, results.fields)
-					results.fields += "|n"
+			src.results.fields += "Tank Pressure: [round(pressure,0.1)] kPa"
+			if(total_moles)
+				LIST_CONCENTRATION_REPORT(environment, src.results.fields)
+				src.results.fields += "|n"
 
-				else
-					results.fields += "Tank Empty"
 			else
-				results.fields += "None. (Sensor Error?)"
+				src.results.fields += "Tank Empty"
+		else
+			src.results.fields += "None. (Sensor Error?)"
 
-			results.fields += "Atmospheric Tank #2:"
-			if(tank2)
-				var/datum/gas_mixture/environment = tank2.return_air()
-				var/pressure = MIXTURE_PRESSURE(environment)
-				var/total_moles = TOTAL_MOLES(environment)
+		src.results.fields += "Atmospheric Tank #2:"
+		if(tank2 && tank1?.air_contents)
+			var/datum/gas_mixture/environment = tank2.return_air()
+			var/pressure = MIXTURE_PRESSURE(environment)
+			var/total_moles = TOTAL_MOLES(environment)
 
-				results.fields += "Tank Pressure: [round(pressure,0.1)] kPa"
-				if(total_moles)
-					LIST_CONCENTRATION_REPORT(environment, results.fields)
-					results.fields += "|n"
+			src.results.fields += "Tank Pressure: [round(pressure,0.1)] kPa"
+			if(total_moles)
+				LIST_CONCENTRATION_REPORT(environment, src.results.fields)
+				src.results.fields += "|n"
 
-				else
-					results.fields += "Tank Empty"
 			else
-				results.fields += "None. (Sensor Error?)"
-
-			results.fields += "VR Bomb Monitor log:|nWaiting for monitor..."
-
-			src.tape.root.add_file( src.results )
-			src.sync(src.host_id)
-			return
-
-		//Called by our vrbomb as it heats up (Or doesn't.)
-		update_bomb_log(var/newdata, var/sync_log = 0)
-			if(!results || !newdata || !tape)
-				return
+				src.results.fields += "Tank Empty"
+		else
+			src.results.fields += "None. (Sensor Error?)"
 
-			results.fields += newdata
-			if (sync_log)
-				src.sync(src.host_id)
-			return
+		src.results.fields += "VR Bomb Monitor log:|nWaiting for monitor..."
 
-	update_icon()
-		if(tank1) //Update tank overlays.
-			UpdateOverlays(image(src.icon,"bscanner-tank1"), "tank1")
-		else
-			UpdateOverlays(null, "tank1")
-		if(tank2)
-			UpdateOverlays(image(src.icon,"bscanner-tank2"), "tank2")
-		else
-			UpdateOverlays(null, "tank2")
+		src.tape.root.add_file( src.results )
+		src.sync(src.host_id)
+		return
 
-		if(status & BROKEN)
-			icon_state = "bomb_scannerb"
-			return
-		if(status & NOPOWER)
-			icon_state = "bomb_scanner-p"
+	///Called by our vrbomb as it heats up (Or doesn't.)
+	proc/update_bomb_log(var/newdata, var/sync_log = 0)
+		if(!src.results || !newdata || !tape)
 			return
 
-		if(src.tank1 && src.tank2)
-			icon_state = "bomb_scanner1"
-		else
-			icon_state = "bomb_scanner0"
+		src.results.fields += newdata
+		if (sync_log)
+			src.sync(src.host_id)
 		return
 
-//Generic disk to hold VR bomb log
+///Generic disk to hold VR bomb log
 /obj/item/disk/data/bomb_tester
 	desc = "You shouldn't be seeing this!"
 	title = "TEMPBUFFER"
@@ -1767,18 +1755,19 @@ TYPEINFO(/obj/machinery/networked/printer)
 			return
 
 		else if (istype(W, /obj/item/paper_bin)) //Load up the printer!
+			var/obj/item/paper_bin/bin = W
 			if (sheets_remaining >= MAX_SHEETS)
 				boutput(user, SPAN_ALERT("The tray is full!"))
 				return
 
 			var/to_remove = MAX_SHEETS - sheets_remaining
-			if(W:amount > to_remove)
-				W:amount -= to_remove
+			if(bin.amount_left > to_remove)
+				bin.amount_left -= to_remove
 				boutput(user, "You load [to_remove] sheets into the tray.")
 				src.sheets_remaining += to_remove
 			else
-				boutput(user, "You load [W:amount] sheets into the tray.")
-				src.sheets_remaining += W:amount
+				boutput(user, "You load [bin.amount_left] sheets into the tray.")
+				src.sheets_remaining += bin.amount_left
 				user.drop_item()
 				qdel(W)
 
diff --git a/code/modules/networks/computer3/mainframe2/telesci.dm b/code/modules/networks/computer3/mainframe2/telesci.dm
index efd573e348621..c14d8400f2098 100644
--- a/code/modules/networks/computer3/mainframe2/telesci.dm
+++ b/code/modules/networks/computer3/mainframe2/telesci.dm
@@ -792,7 +792,6 @@ TYPEINFO(/obj/machinery/networked/telepad)
 				var/summon = pick(
 					/mob/living/critter/zombie,
 					/mob/living/critter/bear,
-					/mob/living/carbon/human/npc/syndicate,
 					/mob/living/critter/martian/soldier,
 					/mob/living/critter/lion,
 					/obj/critter/yeti,
diff --git a/code/modules/parallax/parallax_render_sources/parallax_render_source_groups.dm b/code/modules/parallax/parallax_render_sources/parallax_render_source_groups.dm
index fe282ac91261b..e4ec38abc2279 100644
--- a/code/modules/parallax/parallax_render_sources/parallax_render_source_groups.dm
+++ b/code/modules/parallax/parallax_render_sources/parallax_render_source_groups.dm
@@ -134,6 +134,11 @@ Z_LEVEL_PARALLAX_RENDER_SOURCE_GROUP(5)
 		/atom/movable/screen/parallax_render_source/foreground/dust/sparse,
 	)
 
+/datum/parallax_render_source_group/planet/lava_moon
+	parallax_render_source_types = list(
+		/atom/movable/screen/parallax_render_source/foreground/embers,
+	)
+
 /datum/parallax_render_source_group/planet/desert/setup_render_sources()
 	var/angle = rand(110, 250)
 	var/scroll_speed = rand(75, 175)
diff --git a/code/modules/parallax/parallax_render_sources/parallax_render_sources.dm b/code/modules/parallax/parallax_render_sources/parallax_render_sources.dm
index c4f96a0364e89..5361cdac5e61f 100644
--- a/code/modules/parallax/parallax_render_sources/parallax_render_sources.dm
+++ b/code/modules/parallax/parallax_render_sources/parallax_render_sources.dm
@@ -127,7 +127,20 @@
 	static_colour = TRUE
 	parallax_value = 0.5
 	scroll_speed = 500
+	scroll_angle = 0
 
+// scrolling doesnt work if scroll_angle is changed after initialisation i think. So I made these.
+/atom/movable/screen/parallax_render_source/meteor_shower/north
+	scroll_angle = 180
+
+/atom/movable/screen/parallax_render_source/meteor_shower/south
+	scroll_angle = 0
+
+/atom/movable/screen/parallax_render_source/meteor_shower/east
+	scroll_angle = 270
+
+/atom/movable/screen/parallax_render_source/meteor_shower/west
+	scroll_angle = 90
 
 // Effects
 
diff --git a/code/modules/polling/poll_ballot.dm b/code/modules/polling/poll_ballot.dm
new file mode 100644
index 0000000000000..dcbf9e91cfa02
--- /dev/null
+++ b/code/modules/polling/poll_ballot.dm
@@ -0,0 +1,368 @@
+#define POLL_ACTION_CANCEL "cancel"
+
+/client/var/datum/poll_ballot/poll_ballot = new
+/client/verb/players_polls()
+	set name = "Player Polls"
+	set desc = "Cast your vote in a Goonstation poll"
+	set category = "Commands"
+	poll_ballot.ui_interact(mob)
+
+/datum/poll_ballot
+	var/rate_limit_counter = 0
+	/// soft cap to start forcing 1 second cooldown
+	var/const/rate_limit_soft_cap = 10
+	var/filterInactive = TRUE
+	/// toggle for whether or not to show the votes on polls
+	var/showVotes = FALSE
+
+/datum/poll_ballot/ui_state(mob/user)
+	return tgui_always_state.can_use_topic(src, user)
+
+/datum/poll_ballot/ui_status(mob/user)
+	return tgui_always_state.can_use_topic(src, user)
+
+/datum/poll_ballot/ui_interact(mob/user, datum/tgui/ui)
+	ui = tgui_process.try_update_ui(user, src, ui)
+	if (!ui)
+		ui = new(user, src, "PollBallot")
+	ui.open()
+
+/datum/poll_ballot/ui_data(mob/user)
+	. = list(
+			"isAdmin" = isadmin(user),
+			"polls" = poll_manager.poll_data,
+			"playerId" = user.client.player.id,
+			"filterInactive" = src.filterInactive,
+			"showVotes" = src.showVotes
+		)
+
+/datum/poll_ballot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+	. = ..()
+	if (.)
+		return
+	if (!ON_COOLDOWN(ui.user.client.player, "poll_ballot_rate_limit_reset", 1 MINUTE))
+		rate_limit_counter = 0
+	if ((rate_limit_counter >= rate_limit_soft_cap) && ON_COOLDOWN(ui.user.client.player, "poll_ballot_rate_limit", (1 SECOND + (rate_limit_counter - rate_limit_soft_cap))))
+		boutput(ui.user, "<span class='alert'>You're doing that too often!</span>")
+		return
+	rate_limit_counter++
+	switch(action)
+		if("addPoll") //TODO server specific
+			USR_ADMIN_ONLY
+
+			var/question = tgui_input_text(ui.user, "Enter the poll question", "Add Poll", null, MAX_MESSAGE_LEN)
+			question = copytext(html_encode(question), 1, MAX_MESSAGE_LEN)
+			if (!question) return
+
+			var/list/options = list()
+			var/option = TRUE
+			while(option)
+				option = tgui_input_text(ui.user, "Enter a poll option. Press Cancel to stop adding new options", "Add Poll", null, MAX_MESSAGE_LEN)
+				option = copytext(html_encode(option), 1, MAX_MESSAGE_LEN)
+				if (option)
+					options += option
+			if (!options) return
+
+			var/multiple_choice = tgui_alert(ui.user, "Multiple choice?", "Add Poll", list("Yes", "No"))
+			if (multiple_choice == "Yes")
+				multiple_choice = TRUE
+			else
+				multiple_choice = FALSE
+
+			var/servers = pick_servers(ui.user)
+			if (servers == POLL_ACTION_CANCEL) return // user canceled
+			var/expires_at = pick_expiration_date(ui.user)
+			if (expires_at == POLL_ACTION_CANCEL) return // user canceled
+
+			var/list/poll
+			try
+				var/datum/apiRoute/polls/add/addPoll = new
+				addPoll.buildBody(
+					ui.user.ckey,
+					question,
+					multiple_choice,
+					expires_at,
+					options,
+					servers
+				)
+				var/datum/apiModel/Tracked/PollResource/pollResource = apiHandler.queryAPI(addPoll)
+				poll = pollResource.ToList()
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to add a poll: [error.message]")
+				return FALSE
+
+			// Add this poll to our cached data
+			poll_manager.poll_data.Insert(1, list(poll))
+
+			var/alert_the_players = tgui_alert(ui.user, "Alert the players?", "Add Poll", list("Yes", "No"))
+			if (alert_the_players == "Yes")
+				// alert the players of the new poll!
+				for (var/client/C in clients)
+					boutput(C, SPAN_NOTICE("A new poll is now available. <a href='byond://winset?command=Player-Polls'>Click here to vote!</a>"))
+				playsound_global(world, 'sound/misc/prayerchime.ogg', 100, channel = VOLUME_CHANNEL_MENTORPM)
+
+			. = TRUE
+
+		if ("deletePoll")
+			USR_ADMIN_ONLY
+
+			try
+				var/datum/apiRoute/polls/delete/deletePoll = new
+				deletePoll.routeParams = list("[params["pollId"]]")
+				apiHandler.queryAPI(deletePoll)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to delete a poll: [error.message]")
+				return FALSE
+
+			// Remove this poll from our cached data
+			for (var/i in 1 to length(poll_manager.poll_data))
+				if (poll_manager.poll_data[i]["id"] != params["pollId"])
+					continue
+				poll_manager.poll_data.Remove(list(poll_manager.poll_data[i]))
+				break
+			. = TRUE
+
+		if ("editPoll")
+			USR_ADMIN_ONLY
+
+			var/question
+			var/expires_at
+			var/servers
+			for (var/list/poll in poll_manager.poll_data)
+				if (poll["id"] == text2num(params["pollId"]))
+					question = poll["question"]
+					expires_at = poll["expires_at"]
+					servers = poll["servers"]
+					break
+
+			question = tgui_input_text(ui.user, "Enter the poll question", "Edit Poll", question, MAX_MESSAGE_LEN)
+			question = copytext(html_encode(question), 1, MAX_MESSAGE_LEN)
+			if (!question) return
+
+			try
+				var/datum/apiRoute/polls/edit/editPoll = new
+				editPoll.routeParams = list("[params["pollId"]]")
+				editPoll.buildBody(question, expires_at, servers)
+				apiHandler.queryAPI(editPoll)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to edit a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("editExpiration")
+			if (!ui.user.client.holder) return FALSE
+			USR_ADMIN_ONLY
+
+			var/question
+			var/expires_at
+			var/servers
+			for (var/list/poll in poll_manager.poll_data)
+				if (poll["id"] == text2num(params["pollId"]))
+					question = poll["question"]
+					expires_at = poll["expires_at"]
+					servers = poll["servers"]
+					break
+
+			expires_at = src.pick_expiration_date(ui.user)
+			if (expires_at == POLL_ACTION_CANCEL) return // user canceled
+
+			try
+				var/datum/apiRoute/polls/edit/editPoll = new
+				editPoll.routeParams = list("[params["pollId"]]")
+				editPoll.buildBody(question, expires_at, servers)
+				apiHandler.queryAPI(editPoll)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to edit a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("editServers")
+			if (!ui.user.client.holder) return FALSE
+			USR_ADMIN_ONLY
+
+			var/question
+			var/expires_at
+			var/servers
+			for (var/list/poll in poll_manager.poll_data)
+				if (poll["id"] == text2num(params["pollId"]))
+					question = poll["question"]
+					expires_at = poll["expires_at"]
+					servers = poll["servers"]
+					break
+
+			servers = src.pick_servers(ui.user)
+			if (servers == POLL_ACTION_CANCEL) return // user canceled
+
+			try
+				var/datum/apiRoute/polls/edit/editPoll = new
+				editPoll.routeParams = list("[params["pollId"]]")
+				editPoll.buildBody(question, expires_at, servers)
+				apiHandler.queryAPI(editPoll)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to edit a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("addOption")
+			USR_ADMIN_ONLY
+
+			var/option = tgui_input_text(ui.user, "Enter a poll option", "Add Option", null, MAX_MESSAGE_LEN)
+			option = copytext(html_encode(option), 1, MAX_MESSAGE_LEN)
+			if (!option) return
+
+			try
+				var/datum/apiRoute/polls/options/add/addPollOption = new
+				addPollOption.routeParams = list("[params["pollId"]]")
+				addPollOption.buildBody(option)
+				apiHandler.queryAPI(addPollOption)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to add an option to a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("deleteOption")
+			USR_ADMIN_ONLY
+
+			try
+				var/datum/apiRoute/polls/options/delete/deletePollOption = new
+				deletePollOption.routeParams = list("[params["optionId"]]")
+				apiHandler.queryAPI(deletePollOption)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to delete an option from a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("editOption")
+			USR_ADMIN_ONLY
+
+			var/option
+			for (var/list/poll as anything in poll_manager.poll_data)
+				if (poll["id"] == text2num(params["pollId"]))
+					for (var/list/pollOption in poll["options"])
+						if (pollOption["id"] == text2num(params["optionId"]))
+							option = pollOption["option"]
+							break
+
+			option = tgui_input_text(ui.user, "Enter a poll option", "Edit Option", option, MAX_MESSAGE_LEN)
+			option = copytext(html_encode(option), 1, MAX_MESSAGE_LEN)
+			if (!option) return
+
+			try
+				var/datum/apiRoute/polls/options/edit/editPollOption = new
+				editPollOption.routeParams = list("[params["optionId"]]")
+				editPollOption.buildBody(option, null)
+				apiHandler.queryAPI(editPollOption)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to edit an option on a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if ("vote")
+			var/player_id = ui.user.client.player.id
+			if (!player_id) return
+
+			// determine if we are treating this as a pick or unpick
+			var/voted_for_option = FALSE
+			for (var/list/poll in poll_manager.poll_data)
+				if (poll["id"] != text2num(params["pollId"]))
+					continue
+				for (var/list/option in poll["options"])
+					if (option["id"] != text2num(params["optionId"]))
+						continue
+					if (ui.user.client.player.id in option["answers_player_ids"])
+						voted_for_option = TRUE
+					break
+				break
+
+			try
+				if (voted_for_option)
+					var/datum/apiRoute/polls/options/unpick/unPickOption = new
+					unPickOption.routeParams = list("[params["optionId"]]")
+					unPickOption.buildBody(player_id)
+					apiHandler.queryAPI(unPickOption)
+				else
+					var/datum/apiRoute/polls/options/pick/pickOption = new
+					pickOption.routeParams = list("[params["optionId"]]")
+					pickOption.buildBody(player_id)
+					apiHandler.queryAPI(pickOption)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "Failed to pick/unpick an option on a poll: [error.message]")
+				return FALSE
+
+			poll_manager.sync_single_poll(params["pollId"])
+			. = TRUE
+
+		if("toggle-filterInactive")
+			filterInactive = !filterInactive
+			. = TRUE
+
+		if ("toggle-showVotes")
+			showVotes = !showVotes
+			. = TRUE
+
+
+/// prompts users to select a date in the future, returns an iso8601 string or null
+/datum/poll_ballot/proc/pick_expiration_date(user)
+	. = POLL_ACTION_CANCEL
+	var/expiration_choice = tgui_input_list(user, "Set an expiration date", "Add Poll",
+		list(
+			"None",
+			"Custom Minutes",
+			"Custom Hours",
+			"Custom Days",
+			"Custom ISO8601 Timestamp",
+			))
+	switch (expiration_choice)
+		if ("None")
+			. = null
+		if ("Custom Minutes")
+			var/input = tgui_input_number(user, "How many minutes?", "Add Poll", 1, 10000, 0)
+			. = toIso8601(addTime(subtractTime(world.realtime, hours = world.timezone), minutes = input))
+		if ("Custom Hours")
+			var/input = tgui_input_number(user, "How many hours?", "Add Poll", 1, 10000, 0)
+			. = toIso8601(addTime(subtractTime(world.realtime, hours = world.timezone), hours = input))
+		if ("Custom Days")
+			var/input = tgui_input_number(user, "How many days?", "Add Poll", 1, 10000, 0)
+			. = toIso8601(addTime(subtractTime(world.realtime, hours = world.timezone), days = input))
+		if ("Custom ISO8601 Timestamp")
+			var/input = tgui_input_text(user, "Please provide a valid ISO8601 formatted timestamp?", "Add Poll", toIso8601(subtractTime(world.realtime, hours = world.timezone)))
+			if (validateIso8601(input))
+				. = input
+			else
+				tgui_alert(user, "Invalid timestamp provided, poll defaulting to no expiration", "Error")
+
+/// prompts users to select which servers to target for polling
+/datum/poll_ballot/proc/pick_servers(user)
+	var/servers = tgui_alert(user, "Poll type?", "Targeted Servers", list("Local", "Global", "RP Only"))
+	switch(servers)
+		if ("Local")
+			. = list(config.server_id)
+		if ("Global")
+			. = list(poll_manager.global_server_id)
+		if ("RP Only")
+			. = list(poll_manager.rp_only_server_id)
+		else
+			. = POLL_ACTION_CANCEL
+
+#undef POLL_ACTION_CANCEL
diff --git a/code/modules/polling/poll_manager.dm b/code/modules/polling/poll_manager.dm
new file mode 100644
index 0000000000000..61b4d9784a680
--- /dev/null
+++ b/code/modules/polling/poll_manager.dm
@@ -0,0 +1,55 @@
+var/global/datum/poll_manager/poll_manager = new
+/// master poll controller for the server. Caches the results, syncs with api
+/datum/poll_manager
+	var/list/poll_data = list()
+	/// server id for global polls
+	var/const/global_server_id = "global"
+	/// server id for rp only polls
+	var/const/rp_only_server_id = "rp_only"
+
+	/// fetch and cache the latest poll data from the API
+	proc/sync_polldata()
+		set waitfor = FALSE
+		var/datum/apiModel/Paginated/PollResourceList/polls
+		try
+			var/datum/apiRoute/polls/get/getPolls = new
+			getPolls.queryParams = list(
+				"filters" = list(
+#ifdef RP_MODE
+					"servers" = list(config.server_id, global_server_id, rp_only_server_id)
+#else
+					"servers" = list(config.server_id, global_server_id)
+#endif
+				)
+			)
+			polls = apiHandler.queryAPI(getPolls)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "Failed to fetch poll data: [error.message]")
+			return
+
+		poll_data = polls.ToList()["data"]
+
+
+	proc/sync_single_poll(pollId)
+		var/list/poll
+		var/datum/apiModel/Tracked/PollResource/pollResource
+		try
+			var/datum/apiRoute/polls/show/getPoll = new
+			getPoll.routeParams = list("[pollId]")
+			pollResource = apiHandler.queryAPI(getPoll)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "Failed to fetch data for poll #[pollId]: [error.message]")
+			return
+
+		poll = pollResource.ToList()
+
+		for (var/i in 1 to length(poll_data))
+			if (poll_data[i]["id"] != pollId)
+				continue
+			if (!poll)
+				poll_data.Remove(list(poll_data[i]))
+				return
+			poll_data[i] = poll
+			break
diff --git a/code/modules/power/TEG.dm b/code/modules/power/TEG.dm
index 83a1d4534d029..36eac5de822dc 100644
--- a/code/modules/power/TEG.dm
+++ b/code/modules/power/TEG.dm
@@ -981,6 +981,9 @@ datum/pump_ui/circulator_ui
 						return
 			if(TEG_SEMI_STATE_MISSING)
 				if(istype(W,/obj/item/teg_semiconductor) || (istype(W,/obj/item/sheet) && (W.amount >= 10)))
+					if (W.cant_drop && istype(W,/obj/item/teg_semiconductor))
+						boutput(user, SPAN_ALERT("You can't put that in [src] when it's attached to you!"))
+						return
 					actions.start(new /datum/action/bar/icon/teg_semiconductor_replace(src, W, 5 SECONDS), user)
 					return
 			if(TEG_SEMI_STATE_BOOTLEG_SEMI)
@@ -1598,197 +1601,207 @@ TYPEINFO(/obj/machinery/power/furnace/thermo)
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-#define PUMP_POWERLEVEL_1 100
-#define PUMP_POWERLEVEL_2 500
-#define PUMP_POWERLEVEL_3 1000
-#define PUMP_POWERLEVEL_4 2500
-#define PUMP_POWERLEVEL_5 5000
+#define PUMP_ON 1
+#define PUMP_OFF 0
 
-/datum/pump_infoset
-	var/power_status = 0
-	var/target_output = 0
-	var/id = ""
+#define PUMP_ALIVE 1
+#define PUMP_DEAD 0 // Pump left us on read
+#define PUMP_SCHRODINGER -1 // irony
 
-/obj/machinery/computer/atmosphere/pumpcontrol
-	req_access = list() //Change
-	req_access_txt = ""
+/// Signals which claim the device to be of identifier "AGP" are exclusively pumps or pump wannabes (fine)
+#define DEVICE_IS_PUMP(signal) (signal.data["device"] == "AGP")
+/// Do we have all the information we should Really Really Have?
+#define HAS_REQUIRED_DATA(signal) ((signal.data["netid"] != null) && (signal.data["tag"] != null) && (signal.data["power"] != null) && (signal.data["target_output"] != null) && (signal.data["min_output"] != null) && (signal.data["max_output"] != null))
 
+/obj/machinery/computer/atmosphere/pumpcontrol
 	icon = 'icons/obj/computer.dmi'
 	icon_state = "computer_generic"
 
 	name = "Pump control computer"
-	frequency = 1225
-
-	var/list/pump_infos
-
-	var/last_change = 0
-	var/message_delay = 1 MINUTE
-
-
-	New()
-		. = ..()
-		pump_infos = new/list()
-		src.AddComponent( \
-			/datum/component/packet_connected/radio, \
-			null, \
-			frequency, \
-			null, \
-			"receive_signal", \
-			FALSE, \
-			"pumpcontrol", \
-			FALSE \
-		)
+	/// Default frequency of the computer. Can be varedited so it only listens to relevant pumps, e.g. toxins computer controls toxins pumps
+	frequency = FREQ_PUMP_CONTROL
+
+	/// This is a list in which contains pump information datums keyed by their areas.
+	// e.g. pump_infoset["toxins"] has (pump_1, pump_2, pump_3)
+	var/list/pump_infoset
+
+/obj/machinery/computer/atmosphere/pumpcontrol/New()
+	. = ..()
+
+	pump_infoset = new/list()
+	src.AddComponent( \
+		/datum/component/packet_connected/radio, \
+		null, \
+		frequency, \
+		null, \
+		"receive_signal", \
+		FALSE, \
+		"pumpcontrol", \
+		FALSE \
+	)
 
-	attack_hand(mob/user)
-		if(status & (BROKEN | NOPOWER))
-			return
-		user << browse(return_text(),"window=computer;can_close=1")
-		src.add_dialog(user)
-		onclose(user, "computer")
+/// Add or update a new pump
+/obj/machinery/computer/atmosphere/pumpcontrol/receive_signal(datum/signal/signal)
+	if (!signal) return
+	if (signal.encryption) return
+	if (!DEVICE_IS_PUMP(signal)) return
+	if (!HAS_REQUIRED_DATA(signal)) return
+	/* Setup pump information from pump broadcast, which currently has these vars:
+	"tag" - Name of pump
+	"netid" - Network ID of pump
+	"device" - "AGP" unique pump identifier string
+	"power" - "on" or "off" depending on state
+	"min_output" - MIN_PRESSURE (0kpa)
+	"max_output" - MAX_PRESSURE (~15000kpa)
+	"target_output"- current pump output
+	"address_tag" = "pumpcontrol"
+	"processing" - Currently waiting to recieve data back from this pump
+	"area_name" - Name of the area the pump is in
+	"alive" - Whether or not the pump has broadcasted back. Used while checking for if pumps are unreachable or not
+	*/
+	var/list/pump_data_ref = src.getPump(signal.data["netid"])
+	if (pump_data_ref)
+		// We exist in the list already, update information instead
+		for (var/key in signal.data)
+			pump_data_ref[key] = signal.data[key]
+		pump_data_ref["processing"] = FALSE
+		pump_data_ref["alive"] = PUMP_ALIVE
+		return
 
-	process()
-		..()
-		if(status & (BROKEN | NOPOWER))
-			return
-		//src.updateUsrDialog()
+	var/list/infoset = new()
+	for (var/key in signal.data)
+		infoset[key] = signal.data[key]
+	var/area/A = get_area(signal.source)
+	if (!A)
+		return
+	infoset["area_name"] = A.name
+	infoset["processing"] = FALSE // are we processing a packet request rn?
+	infoset["alive"] = TRUE
+
+	var/area_name_index = src.pump_infoset.Find(infoset["area_name"])
+	if (!area_name_index)
+		// We are first of an area, create our place in the list
+		src.pump_infoset[infoset["area_name"]] = list()
+		src.pump_infoset[infoset["area_name"]][infoset["netid"]] = infoset
+	else
+		// We are not first of an area, place us in the list alphabetically
+		var/iter = 1
+		var/list/L = src.pump_infoset[infoset["area_name"]]
+		while ((iter <= length(L)) && sorttext(infoset["area_name"], L[iter]) == -1)
+			iter += 1
+
+		// Insert key first
+		L.Insert(iter, infoset["netid"])
+		L[infoset["netid"]] = infoset
+
+/obj/machinery/computer/atmosphere/pumpcontrol/process()
+	..()
+	if(status & (BROKEN | NOPOWER))
+		return
+	if(!length(src.pump_infoset))
+		src.request_data() // get data for first time
+	src.check_if_alive()
+
+/// Check for pumps that 'sploded or are otherwise unreachable
+/obj/machinery/computer/atmosphere/pumpcontrol/proc/check_if_alive(override_cooldown = FALSE)
+	if (!override_cooldown && ON_COOLDOWN(src, "check_pumps_living", 1 MINUTE)) return
+	for (var/area_name in src.pump_infoset)
+		for (var/pump in src.pump_infoset[area_name])
+			if (src.pump_infoset[area_name][pump]["alive"] == PUMP_ALIVE) // Don't modify dead ones if they were just jammed theyll respond
+				src.pump_infoset[area_name][pump]["alive"] = PUMP_SCHRODINGER // https://i.imgur.com/mUfxPmb.png
+
+	src.request_data()
+	SPAWN(5 SECONDS)
+		for (var/area_name in src.pump_infoset)
+			for (var/pump in src.pump_infoset[area_name])
+				if (src.pump_infoset[area_name][pump]["alive"] != PUMP_ALIVE)
+					src.pump_infoset[area_name][pump]["alive"] = PUMP_DEAD
+
+/// Get a pump by net id. Does not ask for pump data from pump
+/obj/machinery/computer/atmosphere/pumpcontrol/proc/getPump(var/netid)
+	for (var/area_name in src.pump_infoset)
+		var/list/L = src.pump_infoset[area_name]
+		for (var/pump in L)
+			if (pump == netid)
+				return L[pump]
+	return 0
+
+/// Get a pump by net id and toggle its power
+/obj/machinery/computer/atmosphere/pumpcontrol/proc/togglePump(var/netid)
+	var/list/pump = src.getPump(netid)
+	if (!pump || pump["processing"]) return
+	var/datum/signal/signal = get_free_signal()
+	signal.transmission_method = TRANSMISSION_RADIO
+	signal.source = src
+	signal.data["tag"] = pump["tag"]
+	signal.data["command"] = "power_toggle"
+	SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
+	// Mimic action happening to pretend we're fast
+	pump["processing"] = TRUE
+	pump["power"] = (pump["power"] == "on") ? "off" : "on"
+	src.request_data()
+
+/obj/machinery/computer/atmosphere/pumpcontrol/proc/setPressure(var/netid, var/new_pressure)
+	var/list/pump = src.getPump(netid)
+	if (!pump || pump["processing"] || !isnum_safe(new_pressure)) return
+	new_pressure = clamp(new_pressure, pump["min_output"], pump["max_output"])
+	var/datum/signal/signal = get_free_signal()
+	signal.transmission_method = TRANSMISSION_RADIO
+	signal.source = src
+	signal.data["tag"] = pump["tag"]
+	signal.data["command"] = "set_output_pressure"
+	signal.data["parameter"] = new_pressure
+	SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
+	// Mimic action happening to pretend we're fast
+	pump["processing"] = TRUE
+	pump["target_output"] = new_pressure
+	src.request_data()
+
+/obj/machinery/computer/atmosphere/pumpcontrol/proc/request_data()
+	var/datum/signal/signal = get_free_signal()
+	signal.transmission_method = TRANSMISSION_RADIO
+	signal.source = src
+	signal.data["command"] = "broadcast_status"
+	SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
+
+/obj/machinery/computer/atmosphere/pumpcontrol/ui_interact(mob/user, datum/tgui/ui)
+	ui = tgui_process.try_update_ui(user, src, ui)
+	if (!ui)
+		ui = new(user, src, "PumpControl")
+		ui.open()
 
-	receive_signal(datum/signal/signal)
-		if(!signal || signal.encryption)
+/obj/machinery/computer/atmosphere/pumpcontrol/ui_static_data(mob/user)
+	return list("frequency" = src.frequency)
+
+/obj/machinery/computer/atmosphere/pumpcontrol/ui_data(mob/user)
+	return list("area_list" = src.pump_infoset)
+
+/obj/machinery/computer/atmosphere/pumpcontrol/ui_act(action, params)
+	switch (action)
+		if ("togglePump")
+			playsound(src.loc, 'sound/machines/keypress.ogg', 30, 1, -15)
+			src.togglePump(params["netid"])
+		if ("setPressure")
+			src.setPressure(params["netid"], params["pressure"])
+		if ("refresh")
+			playsound(src.loc, 'sound/machines/keypress.ogg', 30, 1, -15)
+			src.check_if_alive(override_cooldown=TRUE)
 			return
+	src.check_if_alive()
 
-		if(signal.data["device"] == "AGP")
-			if (!signal.data["tag"] || !signal.data["power"] || !signal.data["target_output"])
-				return
-
-			var/datum/pump_infoset/I = new()
-			I.id = signal.data["tag"]
-			I.power_status = signal.data["power"]
-			I.target_output = signal.data["target_output"]
-
-			if (!(signal.source in pump_infos))
-				var/area/pump_area = get_area(signal.source)
-				if (istype(pump_area))
-					var/area_label_position = pump_infos.Find(pump_area.name)
-					if (area_label_position)
-						while (1)
-							area_label_position++
-							if (area_label_position > pump_infos.len)
-								break
-							var/datum/pump_infoset/infoset = pump_infos[ pump_infos[area_label_position] ]
-							if (!istype(infoset))
-								break
-
-							if (sorttext(I.id, infoset.id) == 1)
-								break
-
-						pump_infos.Insert(area_label_position, signal.source)
-
-					else
-						pump_infos += pump_area.name
-						pump_infos += signal.source
-
-			pump_infos[signal.source] = I
-
-		src.updateUsrDialog()
-
-	proc/return_text()
-		var/pump_html = ""
-		//var/count = 1
-		for(var/A in pump_infos)
-			if (istext(A))
-				pump_html += "<center><b>[A]</b></center><br>"
-				continue
-
-			var/datum/pump_infoset/I = pump_infos[A]
-			if (!istype(I))
-				continue
-			pump_html += "<B>[I.id] Status</B>:<BR>"
-			//pump_html += "<B>Pump [count] Status</B>: <BR>"
-			//pump_html += "	Pump Id: [I.id]<BR>"
-			pump_html += "	Pump Status: <U><A href='?src=\ref[src];toggle=[I.id]'>[I.power_status == "on" ? "On":"Off"]</A></U><BR>"
-			var/current_pump_level = 0
-			switch (I.target_output)
-				if (1 to PUMP_POWERLEVEL_1)
-					current_pump_level = 1
-				if (PUMP_POWERLEVEL_1 + 1 to PUMP_POWERLEVEL_2)
-					current_pump_level = 2
-				if (PUMP_POWERLEVEL_2 + 1 to PUMP_POWERLEVEL_3)
-					current_pump_level = 3
-				if (PUMP_POWERLEVEL_3 + 1 to PUMP_POWERLEVEL_4)
-					current_pump_level = 4
-				if (PUMP_POWERLEVEL_4 + 1 to INFINITY)
-					current_pump_level = 5
-			pump_html += "	Pump Pressure Level: "
-			for (var/i =1, i < 6, i++)
-				if (current_pump_level == i)
-					pump_html += "<b>[i]</b> "
-				else
-					pump_html += "<A href='?src=\ref[src];setoutput=[i]&target=[I.id]'>[i]</A> "
-
-			pump_html += "<BR><BR>"
-			//count++
+/obj/machinery/computer/atmosphere/pumpcontrol/attack_hand(mob/user)
+	. = ..()
+	src.ui_interact(user)
+	src.check_if_alive()
 
-		var/output = "<B>[name]</B><BR><A href='?src=\ref[src];refresh=1'>Refresh</A><BR><HR><B>Pump Data: <BR><BR></B>[pump_html]<HR>"
-		return output
-
-	Topic(href, href_list)
-		if(..())
-			return
-		if(!allowed(usr))
-			boutput(usr, SPAN_ALERT("Access Denied!"))
-			return
+#undef DEVICE_IS_PUMP
+#undef HAS_REQUIRED_DATA
+#undef PUMP_ON
+#undef PUMP_OFF
+#undef PUMP_ALIVE
+#undef PUMP_DEAD
+#undef PUMP_SCHRODINGER
 
-		if(href_list["toggle"])
-			src.add_fingerprint(usr)
-			var/datum/signal/signal = get_free_signal()
-			signal.transmission_method = 1 //radio
-			signal.source = src
-			signal.data["tag"] = href_list["toggle"]
-			signal.data["command"] = "power_toggle"
-			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
-
-		if(href_list["setoutput"])
-			src.add_fingerprint(usr)
-			if(!href_list["target"])
-				return 0
-
-			var/new_target = 0
-			switch (href_list["setoutput"])
-				if ("1")
-					new_target = PUMP_POWERLEVEL_1
-				if ("2")
-					new_target = PUMP_POWERLEVEL_2
-				if ("3")
-					new_target = PUMP_POWERLEVEL_3
-				if ("4")
-					new_target = PUMP_POWERLEVEL_4
-				if ("5")
-					new_target = PUMP_POWERLEVEL_5
-
-			if (!new_target)
-				return
-
-			var/datum/signal/signal = get_free_signal()
-			signal.transmission_method = 1 //radio
-			signal.source = src
-			signal.data["tag"] = href_list["target"]
-			signal.data["command"] = "set_output_pressure"
-			signal.data["parameter"] = new_target
-			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
-
-		if(href_list["refresh"])
-			src.add_fingerprint(usr)
-			var/datum/signal/signal = get_free_signal()
-			signal.transmission_method = 1 //radio
-			signal.source = src
-			signal.data["command"] = "broadcast_status"
-			SEND_SIGNAL(src, COMSIG_MOVABLE_POST_RADIO_PACKET, signal)
-
-#undef PUMP_POWERLEVEL_1
-#undef PUMP_POWERLEVEL_2
-#undef PUMP_POWERLEVEL_3
-#undef PUMP_POWERLEVEL_4
-#undef PUMP_POWERLEVEL_5
 #undef LEFT_CIRCULATOR
 #undef RIGHT_CIRCULATOR
 #undef CIRCULATOR_MAX_PRESSURE
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 9f2192f220e54..e5949a7820b1c 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -317,10 +317,11 @@
 	max_charge = 10
 	recharge_rate = 0
 
-/obj/item/ammo/power_cell/self_charging/potato/New(var/loc, var/potency, var/endurance)
+/obj/item/ammo/power_cell/self_charging/potato/New(var/loc, var/potency, var/endurance) //capped, approches double stats of disruptor cell
 	var/rngfactor = 2 + rand()
-	src.max_charge += round(potency/rngfactor)
-	src.recharge_rate = 0.25 * round(endurance/rand(25,30))
+//	src.max_charge += round(potency/rngfactor)
+	src.max_charge += round(190 * potency / (potency + 100 * rngfactor)) //asymptote at 200pu
+	src.recharge_rate = 0.25 * round(0.01 + 20 * endurance / (endurance + rand(400,500))) //asymptote at 5 recharge rate
 	src.charge = src.max_charge
 	..()
 
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 0c29d70c9e840..7e9ab470d401a 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -7,6 +7,13 @@
 // defines moved to _setup.dm by ZeWaka
 #define INSTALL_WALL 1
 #define INSTALL_FLOOR 2
+/// Amount of time it takes to attach a light fixture to a tile by hand
+#define LIGHT_FIXTURE_ATTACH_TIME 4 SECONDS
+/// Amount of time it takes to remove a light fixture from a tile by hand
+#define LIGHT_FIXTURE_DETACH_TIME 2 SECONDS
+/// Probabilty a worn/burned out light will break
+#define WORN_LIGHT_BREAKPROB 5
+
 TYPEINFO(/obj/item/light_parts)
 	mats = 4
 
@@ -36,6 +43,7 @@ TYPEINFO(/obj/item/light_parts)
 
 // For metal sheets. Can't easily change an item's vars the way it's set up (Convair880).
 /obj/item/light_parts/bulb
+	name = "bulb fixture parts"
 	icon_state = "bulb-fixture"
 	fixture_type = /obj/machinery/light/small
 	installed_icon_state = "bulb1"
@@ -44,6 +52,7 @@ TYPEINFO(/obj/item/light_parts)
 	light_type = /obj/item/light/bulb
 
 /obj/item/light_parts/floor
+	name = "floor fixture parts"
 	icon_state = "floor-fixture"
 	fixture_type = /obj/machinery/light/small/floor/netural
 	installed_icon_state = "floor1"
@@ -105,7 +114,7 @@ TYPEINFO(/obj/item/light_parts)
 	if(!instantly)
 		playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
 		boutput(user, "You begin to attach the [src] to [target]...")
-		SETUP_GENERIC_ACTIONBAR(user, src, 4 SECONDS, /obj/item/light_parts/proc/finish_attaching,\
+		SETUP_GENERIC_ACTIONBAR(user, src, LIGHT_FIXTURE_ATTACH_TIME, /obj/item/light_parts/proc/finish_attaching,\
 			list(target, user, dir), src.icon, src.icon_state, null, null)
 	else
 		finish_attaching(target, user, dir)
@@ -379,7 +388,10 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 				..()
 				current_lamp.light_status = LIGHT_BROKEN
 
-
+/obj/machinery/light/small/uninstall_fixture()
+	var/obj/item/light_parts/bulb/parts = new /obj/item/light_parts/bulb(get_turf(src))
+	parts.copy_light(src)
+	qdel(src)
 
 //floor lights
 /obj/machinery/light/small/floor
@@ -439,6 +451,11 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 			..()
 			current_lamp.light_status = LIGHT_BROKEN
 
+/obj/machinery/light/small/floor/uninstall_fixture()
+	var/obj/item/light_parts/floor/parts = new /obj/item/light_parts/floor(get_turf(src))
+	parts.copy_light(src)
+	qdel(src)
+
 /obj/machinery/light/emergency
 	icon_state = "ebulb1"
 	base_state = "ebulb"
@@ -663,7 +680,7 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 	brightness = 1
 	New()
 		..()
-		current_lamp.breakprob = 6.25
+		current_lamp.breakprob = WORN_LIGHT_BREAKPROB
 
 // the desk lamp
 /obj/machinery/light/lamp
@@ -814,19 +831,22 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 
 	SPAWN(0)
 		// now check to see if the bulb is burned out
-		if(current_lamp.light_status == LIGHT_OK)
-			if(on && current_lamp.rigged)
-				if (current_lamp.rigger)
-					message_admins("[key_name(current_lamp.rigger)]'s rigged bulb exploded in [src.loc.loc], [log_loc(src)].")
-					logTheThing(LOG_COMBAT, current_lamp.rigger, "'s rigged bulb exploded in [current_lamp.rigger.loc.loc] ([log_loc(src)])")
-				explode()
-			if(on && prob(current_lamp.breakprob))
-				current_lamp.light_status = LIGHT_BURNED
-				icon_state = "[base_state]-burned"
-				on = 0
-				light.disable()
-				elecflash(src,radius = 1, power = 2, exclude_center = 0)
-				logTheThing(LOG_STATION, null, "Light '[name]' burnt out (breakprob: [current_lamp.breakprob]) at ([log_loc(src)])")
+		switch(current_lamp.light_status)
+			if(LIGHT_OK)
+				if(!on)
+					return
+				if(current_lamp.rigged)
+					if (current_lamp.rigger)
+						message_admins("[key_name(current_lamp.rigger)]'s rigged bulb exploded in [src.loc.loc], [log_loc(src)].")
+						logTheThing(LOG_COMBAT, current_lamp.rigger, "'s rigged bulb exploded in [current_lamp.rigger.loc.loc] ([log_loc(src)])")
+					explode()
+				if(prob(current_lamp.breakprob))
+					src.do_break()
+				if(prob(current_lamp.burnprob))
+					src.do_burn_out()
+			if (LIGHT_BURNED)
+				if(prob(current_lamp.breakprob))
+					src.do_break()
 
 /obj/machinery/light/proc/update_icon_state()
 	if (!inserted_lamp)
@@ -843,11 +863,37 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 				icon_state = "[base_state]-broken"
 				on = 0
 
+/obj/machinery/light/proc/do_break()
+	current_lamp.light_status = LIGHT_BROKEN
+	current_lamp.update()
+	icon_state = "[base_state]-broken"
+	on = 0
+	light.disable()
+	elecflash(src, radius = 1, power = 2, exclude_center = 0)
+	logTheThing(LOG_STATION, null, "Light '[name]' broke itself (breakprob: [current_lamp.breakprob]) at ([log_loc(src)])")
+
+/obj/machinery/light/proc/do_burn_out()
+	var/original_brightness = src.light.brightness
+	playsound(src, 'sound/effects/snaptape.ogg', 30, TRUE)
+	src.light.set_brightness(original_brightness * 3)
+	logTheThing(LOG_STATION, null, "Light '[name]' burned out (burnprob: [current_lamp.burnprob]) at ([log_loc(src)])")
+	SPAWN(0.2 SECONDS)
+		src.light.set_brightness(original_brightness)
+		src.icon_state = "[base_state]-burned"
+		src.current_lamp.breakprob = WORN_LIGHT_BREAKPROB
+		src.current_lamp.light_status = LIGHT_BURNED
+		src.current_lamp.update()
+		playsound(src, 'sound/effects/sparks4.ogg', 40, TRUE)
+		src.on = FALSE
+		src.light.disable()
+
 // attempt to set the light's on/off status
 // will not switch on if broken/burned/empty
 /obj/machinery/light/proc/seton(var/s)
+	var/old_on = on
 	on = (s && current_lamp.light_status == LIGHT_OK)
-	update()
+	if(s != old_on) //don't update if trying to set to the same state
+		update()
 
 // examine verb
 /obj/machinery/light/examine(mob/user)
@@ -967,14 +1013,10 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 				boutput(user, "That's not safe with the power on!")
 				return
 			if (candismantle)
-				boutput(user, "You begin to unscrew the fixture from the wall...")
+				boutput(user, "You begin to loosen the fixture's screws...")
 				playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
-				if (!do_after(user, 2 SECONDS))
-					return
-				boutput(user, "You unscrew the fixture from the wall.")
-				var/obj/item/light_parts/parts = new /obj/item/light_parts(get_turf(src))
-				parts.copy_light(src)
-				qdel(src)
+				SETUP_GENERIC_ACTIONBAR(user, src, LIGHT_FIXTURE_DETACH_TIME, PROC_REF(uninstall_fixture),list(), src.icon, src.icon_state,\
+				 "[user] finishes uninstalling \the [src].", INTERRUPT_MOVE|INTERRUPT_ACT|INTERRUPT_ATTACKED|INTERRUPT_STUNNED|INTERRUPT_ACTION)
 				return
 			else
 				boutput(user, "You can't seem to dismantle it.")
@@ -1007,6 +1049,10 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light, proc/broken, proc/admin_toggle, proc/
 		else
 			boutput(user, "You hit the light!")
 
+/obj/machinery/light/proc/uninstall_fixture()
+	var/obj/item/light_parts/parts = new /obj/item/light_parts(get_turf(src))
+	parts.copy_light(src)
+	qdel(src)
 
 // returns whether this light has power
 // true if area has power and lightswitch is on
@@ -1210,10 +1256,11 @@ TYPEINFO(/obj/item/light)
 	force = 2
 	throwforce = 5
 	w_class = W_CLASS_SMALL
+	m_amt = 60
 	var/light_status = LIGHT_OK		// LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
 	var/base_state
-	var/breakprob = 0	// number of times switched
-	m_amt = 60
+	var/breakprob = 0 //! Chance for the bulb to burst
+	var/burnprob = 1 //! Chance for the bulb to burn out
 	var/rigged = 0		// true if rigged to explode
 	var/mob/rigger = null // mob responsible
 	var/color_r = 1
@@ -1478,6 +1525,7 @@ TYPEINFO(/obj/item/light)
 		desc = "A frosted red bulb."
 		icon_state = "bulb-emergency"
 		base_state = "bulb-emergency"
+		burnprob = 0
 		color_r = 1
 		color_g = 0.2
 		color_b = 0.2
@@ -1641,6 +1689,9 @@ TYPEINFO(/obj/item/light)
 	else
 		return ..()
 
+#undef WORN_LIGHT_BREAKPROB
+#undef LIGHT_FIXTURE_ATTACH_TIME
+#undef LIGHT_FIXTURE_DETACH_TIME
 
 #undef INSTALL_WALL
 #undef INSTALL_FLOOR
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index e7d08bb3a9c24..53906e00cf07a 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -4,7 +4,7 @@
 // using this solves the problem of having the APC in a wall yet also inside an area
 
 /obj/machinery/power/terminal
-	name = "terminal"
+	name = "power terminal"
 	icon_state = "term"
 	desc = "An underfloor wiring terminal for power equipment"
 	level = 1
diff --git a/code/modules/projectiles/40mm.dm b/code/modules/projectiles/40mm.dm
index 61fd87da8c27c..a50a6c9c5e930 100644
--- a/code/modules/projectiles/40mm.dm
+++ b/code/modules/projectiles/40mm.dm
@@ -36,7 +36,7 @@ toxic - poisons
 	color_red = 0.8
 	color_green = 0
 	color_blue = 0
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 
 
 //Any special things when it hits shit?
diff --git a/code/modules/projectiles/bullet.dm b/code/modules/projectiles/bullet.dm
index 5266275fa0dc6..5c6e2d82c2809 100644
--- a/code/modules/projectiles/bullet.dm
+++ b/code/modules/projectiles/bullet.dm
@@ -45,7 +45,7 @@ toxic - poisons
 	window_pass = 0
 	implanted = /obj/item/implant/projectile
 	// we create this overlay on walls when we hit them
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 
 	hit_mob_sound = 'sound/impact_sounds/Flesh_Stab_2.ogg'
 
@@ -60,7 +60,7 @@ toxic - poisons
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/staple // HEH
 	shot_sound = 'sound/impact_sounds/Generic_Snap_1.ogg'
-	impact_image_state = "bhole-staple"
+	impact_image_state = "bullethole-staple"
 	casing = null
 
 /datum/projectile/bullet/vbullet
@@ -83,7 +83,7 @@ toxic - poisons
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_22
 	casing = /obj/item/casing/small
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	silentshot = 1 // It's supposed to be a stealth weapon, right (Convair880)?
 	ricochets = TRUE
 
@@ -106,7 +106,7 @@ toxic - poisons
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_22
 	casing = /obj/item/casing/small
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 
 //0.223
 /datum/projectile/bullet/assault_rifle
@@ -117,7 +117,7 @@ toxic - poisons
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
 	shot_number = 1
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_308
 	casing = /obj/item/casing/rifle
 	ricochets = TRUE
@@ -148,7 +148,7 @@ toxic - poisons
 	dissipation_delay = 7
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_308
 	casing = /obj/item/casing/rifle
 	fullauto_valid = 1
@@ -167,7 +167,7 @@ toxic - poisons
 	hit_type = DAMAGE_CUT
 	shot_number = 3
 	shot_delay = 120 MILLI SECONDS
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_308
 	casing = /obj/item/casing/rifle
 	ricochets = TRUE
@@ -183,7 +183,7 @@ toxic - poisons
 	shot_volume = 50 // holy fuck why was this so loud
 	dissipation_delay = 10
 	casing = /obj/item/casing/rifle_loud
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 
 	on_hit(atom/hit, dirflag, obj/projectile/proj)
 		if(ishuman(hit))
@@ -215,7 +215,7 @@ toxic - poisons
 	projectile_speed = 72
 	max_range = 100
 	casing = /obj/item/casing/rifle_loud
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	on_launch(obj/projectile/O)
 		O.AddComponent(/datum/component/sniper_wallpierce, 3, 20) //pierces 3 walls/lockers/doors/etc. Does not function on restriced Z, rwalls and blast doors use 2 pierces
 
@@ -280,7 +280,7 @@ toxic - poisons
 	dissipation_delay = 12
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_308
 	casing = /obj/item/casing/rifle
 	var/slow = 1
@@ -318,7 +318,7 @@ toxic - poisons
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_9mm
 	casing = /obj/item/casing/small
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	ricochets = TRUE
 
 	smg
@@ -336,7 +336,7 @@ toxic - poisons
 	dissipation_rate = 3
 	dissipation_delay = 8
 	projectile_speed = 48
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	hit_type = DAMAGE_BLUNT
 	implanted = /obj/item/implant/projectile/ninemmplastic
 	casing = /obj/item/casing/small
@@ -364,7 +364,7 @@ toxic - poisons
 	name = "bullet"
 	shot_sound = 'sound/weapons/9x19NATO.ogg'
 	damage = 25
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_9mm
@@ -380,7 +380,7 @@ toxic - poisons
 	hit_type = DAMAGE_STAB
 	hit_ground_chance = 50
 	projectile_speed = 60
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	implanted = /obj/item/implant/projectile/bullet_9mm
 	casing = /obj/item/casing/small
 	ricochets = TRUE
@@ -399,7 +399,7 @@ toxic - poisons
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_357
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	casing = /obj/item/casing/medium
 	ricochets = TRUE
 
@@ -424,7 +424,7 @@ toxic - poisons
 	sname = "execute"
 	damage = 35
 	implanted = /obj/item/implant/projectile/bullet_38
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	casing = /obj/item/casing/medium
 	ricochets = TRUE
 
@@ -529,7 +529,7 @@ toxic - poisons
 	hit_type = DAMAGE_STAB
 	hit_ground_chance = 100
 	implanted = /obj/item/implant/projectile/bullet_41
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/derringer
 
 //0.45
@@ -538,7 +538,7 @@ toxic - poisons
 	damage = 35
 	hit_type = DAMAGE_CUT
 	implanted = /obj/item/implant/projectile/bullet_45
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	casing = /obj/item/casing/medium
 	ricochets = TRUE
 
@@ -554,7 +554,7 @@ toxic - poisons
 	dissipation_delay = 10
 	hit_ground_chance = 50
 	casing = null
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 
 	on_hit(atom/hit, dirflag, obj/projectile/proj)
 		if(ishuman(hit))
@@ -570,13 +570,13 @@ toxic - poisons
 
 	rifle
 		damage = 70
-		impact_image_state = "bhole-large"
+		impact_image_state = "bullethole-large"
 
 	mortar
 		name = "mortar grenade"
 		icon_state = "mortar"
 		damage = 10 // The explosion should deal most of the damage.
-		impact_image_state = "bhole-large"
+		impact_image_state = "bullethole-large"
 		damage_type = D_KINETIC
 		hit_type = DAMAGE_BLUNT
 
@@ -610,7 +610,7 @@ toxic - poisons
 	dissipation_rate = 10
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	hit_ground_chance = 100
 	implanted = /obj/item/implant/projectile/bullet_12ga
 	casing = /obj/item/casing/shotgun/red
@@ -733,7 +733,7 @@ toxic - poisons
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/orange
 
 	on_hit(atom/hit)
@@ -764,7 +764,7 @@ toxic - poisons
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/blue
 
 	on_hit(atom/hit, dirflag, obj/projectile/proj)
@@ -789,7 +789,7 @@ toxic - poisons
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/gray
 
 	on_hit(atom/hit)
@@ -816,7 +816,7 @@ toxic - poisons
 		if(isliving(hit))
 			var/mob/living/L = hit
 			L.bodytemperature = max(50, L.bodytemperature - proj.power * 5)
-			if(L.getStatusDuration("shivering" < power))
+			if(L.getStatusDuration("shivering") < power)
 				L.setStatus("shivering", power/2 SECONDS)
 			var/obj/icecube/I = new/obj/icecube(get_turf(L), L)
 			I.health = proj.power / 2
@@ -831,7 +831,7 @@ toxic - poisons
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/gray
 
 	on_hit(atom/hit, direction, obj/projectile/P)
@@ -870,7 +870,7 @@ toxic - poisons
 	color_blue = 0
 	icon_state = "flare"
 	implanted = null
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	casing = /obj/item/casing/shotgun/orange
 
 	on_hit(atom/hit, direction, obj/projectile/P)
@@ -905,7 +905,7 @@ toxic - poisons
 	shot_volume = 130
 	implanted = null
 
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/cannon
 	pierces = 4
 	shot_sound_extrarange = 1
@@ -981,7 +981,7 @@ toxic - poisons
 	dissipation_delay = 25
 	shot_sound = 'sound/weapons/ACgun2.ogg'
 	casing = null
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 
 	on_hit(atom/hit)
 		explosion_new(null, get_turf(hit), 5)
@@ -997,7 +997,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 
 	on_hit(atom/hit)
@@ -1021,7 +1021,7 @@ datum/projectile/bullet/autocannon
 	huge
 		icon_state = "400mm"
 		damage = 100
-		impact_image_state = "bhole-large"
+		impact_image_state = "bullethole-large"
 
 		on_hit(atom/hit)
 			explosion_new(null, get_turf(hit), 80)
@@ -1106,7 +1106,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/launcher.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 
 	explosive
@@ -1132,7 +1132,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 10
 	cost = 1
 	shot_sound = 'sound/weapons/launcher.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	implanted = null
 
@@ -1176,7 +1176,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 10
 	cost = 1
 	shot_sound = 'sound/weapons/launcher.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	hit_type = DAMAGE_BLUNT
 	hit_mob_sound = 'sound/misc/splash_1.ogg'
@@ -1200,7 +1200,7 @@ datum/projectile/bullet/autocannon
 	implanted = null
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	ie_type = null
 
@@ -1236,7 +1236,7 @@ datum/projectile/bullet/autocannon
 	damage_type = D_SPECIAL
 	hit_type = DAMAGE_BLUNT
 	hit_mob_sound = 'sound/impact_sounds/Energy_Hit_3.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	ie_type = null
 
@@ -1259,7 +1259,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 20
 	cost = 1
 	shot_sound = 'sound/weapons/launcher.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	implanted = null
 
@@ -1369,7 +1369,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 20
 	cost = 1
 	shot_sound = 'sound/weapons/launcher.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/grenade
 	implanted = null
 
@@ -1399,7 +1399,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 
 	on_hit(atom/hit)
 		var/turf/T = get_turf(hit)
@@ -1494,7 +1494,7 @@ datum/projectile/bullet/autocannon
 	hit_type = DAMAGE_BLUNT
 	dissipation_delay = 30
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	shot_number = 1
 	cost = 1
 	damage = 15
@@ -1530,7 +1530,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 
 	max_rotation_rate = 7
 	max_speed = 30
@@ -1572,13 +1572,13 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	implanted = null
 
 	on_hit(atom/hit)
 		var/obj/machinery/the_singularity/S = hit
 		if(istype(S))
-			new /obj/bhole(S.loc,rand(100,300))
+			new /obj/whitehole(S.loc, 0 SECONDS, 30 SECONDS)
 			qdel(S)
 		else
 			new /obj/effects/rendersparks(hit.loc)
@@ -1599,7 +1599,7 @@ datum/projectile/bullet/autocannon
 	dissipation_delay = 30
 	cost = 1
 	shot_sound = 'sound/weapons/rocket.ogg'
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	implanted = null
 
 	on_hit(atom/hit)
@@ -1622,7 +1622,7 @@ datum/projectile/bullet/autocannon
 	dissipation_rate = 2
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	implanted = null
 	casing = null
 	cost = 1
@@ -1644,7 +1644,7 @@ datum/projectile/bullet/autocannon
 	dissipation_rate = 4
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_BLUNT
-	impact_image_state = "bhole"
+	impact_image_state = "bullethole"
 	implanted = null
 	casing = null
 	cost = 2
@@ -1668,7 +1668,7 @@ datum/projectile/bullet/autocannon
 	icon = 'icons/obj/scrap.dmi'
 	icon_state = "2metal0"
 	casing = null
-	impact_image_state = "bhole-staple"
+	impact_image_state = "bullethole-staple"
 
 	shrapnel_implant
 		implanted = /obj/item/implant/projectile/shrapnel
@@ -1698,7 +1698,7 @@ datum/projectile/bullet/autocannon
 	shot_volume = 90
 	implanted = null
 
-	impact_image_state = "bhole-large"
+	impact_image_state = "bullethole-large"
 	casing = /obj/item/casing/cannon
 	shot_sound_extrarange = 1
 
@@ -1774,7 +1774,7 @@ datum/projectile/bullet/autocannon
 	hit_type = DAMAGE_BLUNT
 	implanted = null
 	shot_sound = 'sound/impact_sounds/Generic_Snap_1.ogg'
-	impact_image_state = "bhole-staple"
+	impact_image_state = "bullethole-staple"
 	casing = null
 	hit_ground_chance = 50
 	icon_state = "random_thing"	//actually exists, looks funny enough to use as the projectile image for this
@@ -1822,7 +1822,7 @@ datum/projectile/bullet/autocannon
 	icon = 'icons/obj/scrap.dmi'
 	icon_state = "2metal0"
 	casing = null
-	impact_image_state = "bhole-staple"
+	impact_image_state = "bullethole-staple"
 	implanted = /obj/item/implant/projectile/shrapnel/radioactive
 
 	on_hit(atom/hit, angle, obj/projectile/O)
@@ -1832,9 +1832,9 @@ datum/projectile/bullet/autocannon
 			if(isturf(hit)) //did you know that turf.loc is /area? because I didn't
 				hitloc = hit
 			for(var/obj/window/maybe_thindow in hitloc)
-				maybe_thindow.ex_act(3)
+				maybe_thindow.ex_act(2)
 			for(var/obj/structure/girder/girderstack in hitloc)
-				girderstack.ex_act(3)
+				girderstack.ex_act(2)
 			//let's pretend these walls/objects were destroyed in the explosion
-			hit.ex_act(2)
+			hit.ex_act(pick(1,2))
 		. = ..()
diff --git a/code/modules/projectiles/laser.dm b/code/modules/projectiles/laser.dm
index 87cb44ebdd097..9de29a4e0685d 100644
--- a/code/modules/projectiles/laser.dm
+++ b/code/modules/projectiles/laser.dm
@@ -461,6 +461,7 @@ toxic - poisons
 			mult = 0.5
 		return ..(P, A) * mult
 
+
 /datum/projectile/laser/blaster/pod_pilot/blue_NT
 	name = "blue blaster bolt"
 	color_icon = "#3d9cff"
@@ -485,6 +486,47 @@ toxic - poisons
 		turret = 1
 		damage = 15
 
+/datum/projectile/laser/blaster/pod_pilot/blue_NT/smg
+	name = "blue blaster bolt"
+	color_icon = "#3d9cff"
+	color_red = 0.05
+	color_green = 0.28
+	color_blue = 0.51
+	cost = 10
+	damage = 12.5
+	fullauto_valid = 1
+	icon_state = "bolt_burst"
+	shot_sound = 'sound/weapons/laser_c.ogg'
+
+/datum/projectile/laser/blaster/pod_pilot/red_SY/smg
+	name = "red blaster bolt"
+	color_icon = "#ff4043"
+	color_red = 0.51
+	color_green = 0.05
+	color_blue = 0.28
+	cost = 10
+	damage = 12.5
+	fullauto_valid = 1
+	icon_state = "bolt_burst"
+	shot_sound = 'sound/weapons/laser_c.ogg'
+
+/datum/projectile/laser/blaster/pod_pilot/blue_NT/shotgun
+	name = "blue blaster bolt"
+	color_icon = "#3d9cff"
+	color_red = 0.05
+	color_green = 0.28
+	color_blue = 0.51
+	cost = 10
+	damage = 15
+
+/datum/projectile/laser/blaster/pod_pilot/red_SY/shotgun
+	name = "red blaster bolt"
+	color_icon = "#ff4043"
+	color_red = 0.51
+	color_green = 0.05
+	color_blue = 0.28
+	cost = 10
+	damage = 15
 
 // cogwerks- mining laser, first attempt
 
diff --git a/code/modules/projectiles/special.dm b/code/modules/projectiles/special.dm
index 399bff9cf2d40..700aa59818b21 100644
--- a/code/modules/projectiles/special.dm
+++ b/code/modules/projectiles/special.dm
@@ -886,6 +886,35 @@ ABSTRACT_TYPE(/datum/projectile/special)
 		FC.launch()
 		current_angle += angle_adjust_per_pellet
 
+/datum/projectile/special/spreader/pwshotgunspread
+	name = "blaster bolt"
+	sname = "shotgun spread"
+	cost = 40
+	pellets_to_fire = 5
+	spread_projectile_type = /datum/projectile/laser/blaster/pod_pilot/blue_NT/shotgun
+	split_type = 0
+	shot_sound = 'sound/weapons/laser_b.ogg'
+	var/spread_angle = 10
+	var/current_angle = 0
+	var/angle_adjust_per_pellet = 0
+	var/initial_angle_offset_mult = 0.5
+
+	on_launch(var/obj/projectile/P)
+		angle_adjust_per_pellet = ((spread_angle * 2) / pellets_to_fire)
+		current_angle = (0 - spread_angle) + (angle_adjust_per_pellet * initial_angle_offset_mult)
+		..()
+
+	new_pellet(var/obj/projectile/P, var/turf/PT, var/datum/projectile/F)
+		var/obj/projectile/FC = initialize_projectile(PT, F, P.xo, P.yo, P.shooter)
+		FC.rotateDirection(current_angle)
+		FC.launch()
+		current_angle += angle_adjust_per_pellet
+
+	NT
+		spread_projectile_type = /datum/projectile/laser/blaster/pod_pilot/blue_NT/shotgun
+
+	SY
+		spread_projectile_type = /datum/projectile/laser/blaster/pod_pilot/red_SY/shotgun
 
 /datum/projectile/special/spreader/quadwasp
 	name = "4 space wasp eggs"
diff --git a/code/modules/robotics/robot/module/empty.dm b/code/modules/robotics/robot/module/empty.dm
index 22def579542bd..2ed89ba688727 100644
--- a/code/modules/robotics/robot/module/empty.dm
+++ b/code/modules/robotics/robot/module/empty.dm
@@ -3,4 +3,4 @@
 /obj/item/robot_module/empty
 	name = "empty cyborg module"
 	desc = "An empty cyborg module."
-	include_common_tools = FALSE
+	included_tools = null
diff --git a/code/modules/robotics/robot/module/engineering.dm b/code/modules/robotics/robot/module/engineering.dm
index c3b8545fb98c2..ad0d40dee43d7 100644
--- a/code/modules/robotics/robot/module/engineering.dm
+++ b/code/modules/robotics/robot/module/engineering.dm
@@ -8,7 +8,6 @@
 	radio_type = /obj/item/device/radio/headset/engineer
 	mailgroups = list(MGO_ENGINEER, MGD_STATIONREPAIR, MGO_SILICON, MGD_PARTY)
 	alertgroups = list(MGA_MAIL, MGA_RADIO, MGA_ENGINE, MGA_CRISIS, MGA_RKIT)
-	include_common_tools = FALSE
 
 /datum/robot_cosmetic/engineering
 	fx = list(255, 255, 0)
diff --git a/code/modules/robotics/robot/module/medical.dm b/code/modules/robotics/robot/module/medical.dm
index 71fb034f13159..b88a67175a1d6 100644
--- a/code/modules/robotics/robot/module/medical.dm
+++ b/code/modules/robotics/robot/module/medical.dm
@@ -8,7 +8,6 @@
 	radio_type = /obj/item/device/radio/headset/medical
 	mailgroups = list(MGD_MEDBAY, MGD_MEDRESEACH, MGO_SILICON, MGD_PARTY)
 	alertgroups = list(MGA_MAIL, MGA_RADIO, MGA_DEATH, MGA_MEDCRIT, MGA_CLONER, MGA_CRISIS, MGA_SALES)
-	include_common_tools = FALSE
 
 /datum/robot_cosmetic/medical
 	head_mod = "Medical Mirror"
diff --git a/code/modules/robotics/robot/module/parent.dm b/code/modules/robotics/robot/module/parent.dm
index c62ea282cc859..d1dabce70c303 100644
--- a/code/modules/robotics/robot/module/parent.dm
+++ b/code/modules/robotics/robot/module/parent.dm
@@ -13,8 +13,7 @@ ADMIN_INTERACT_PROCS(/obj/item/robot_module, proc/admin_add_tool, proc/admin_rem
 	var/list/tools = list()
 	var/mod_hudicon = "unknown"
 	var/cosmetic_mods = null
-	var/include_common_tools = TRUE
-	var/included_tools = null
+	var/included_tools = /datum/robot/module_tool_creator/recursive/module/common
 	var/included_cosmetic = null
 	var/radio_type = null
 	var/obj/item/device/radio/headset/radio = null
@@ -23,14 +22,10 @@ ADMIN_INTERACT_PROCS(/obj/item/robot_module, proc/admin_add_tool, proc/admin_rem
 
 /obj/item/robot_module/New()
 	..()
-	// add contents
-	if (src.include_common_tools)
-		src.add_contents(/datum/robot/module_tool_creator/recursive/module/common)
 	src.add_contents(src.included_tools)
 	// no need to keep the definition past initializing
 	src.included_tools = null
 
-	// add cosmetics
 	if (ispath(src.included_cosmetic, /datum/robot_cosmetic))
 		src.cosmetic_mods = new included_cosmetic(src)
 
@@ -44,7 +39,7 @@ ADMIN_INTERACT_PROCS(/obj/item/robot_module, proc/admin_add_tool, proc/admin_rem
 	if (istype(adding_contents, /obj/item))
 		// handle adding single instance of tool
 		var/obj/item/I = adding_contents
-		I.cant_drop = 1
+		I.cant_drop = TRUE
 		I.set_loc(src)
 		src.tools += I
 		return I
diff --git a/code/modules/robotics/robot/module_tool_creator/modules.dm b/code/modules/robotics/robot/module_tool_creator/modules.dm
index bbb9730776b7b..feaa15a7cbb5d 100644
--- a/code/modules/robotics/robot/module_tool_creator/modules.dm
+++ b/code/modules/robotics/robot/module_tool_creator/modules.dm
@@ -8,10 +8,22 @@
  * - mining
  */
 
+// convenient bundling of common tools, some modules do not include this as they want the items in a different order
+/datum/robot/module_tool_creator/recursive/module/common
+	definitions = list(
+		/obj/item/portable_typewriter/borg,
+		/obj/item/robojumper,
+		/obj/item/device/analyzer/atmospheric/upgraded,
+		/obj/item/device/reagentscanner,
+		/obj/item/device/light/flashlight,
+		/obj/item/device/analyzer/healthanalyzer/upgraded,
+		/obj/item/tool/omnitool/silicon,
+	)
+
 // security officer. bartender. clown.
-// DOES inherit common tools
 /datum/robot/module_tool_creator/recursive/module/brobocop
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/device/detective_scanner,
 		/obj/item/noisemaker,
 		/obj/item/robot_foodsynthesizer,
@@ -39,9 +51,9 @@
 	)
 
 // scientist.
-// DOES inherit common tools
 /datum/robot/module_tool_creator/recursive/module/science
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/device/gps, // Let's them assist with telesci
 		/obj/item/extinguisher/large/cyborg,
 		/obj/item/hand_labeler,
@@ -61,9 +73,9 @@
 	)
 
 // botanist. chef. janitor.
-// DOES inherit common tools
 /datum/robot/module_tool_creator/recursive/module/civilian
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/extinguisher/large/cyborg,
 		/obj/item/reagent_containers/glass/bucket, // TODO: make large version
 		/obj/item/spraybottle/cleaner/robot,
@@ -91,19 +103,7 @@
 		/obj/item/paper_bin/robot,
 	)
 
-/datum/robot/module_tool_creator/recursive/module/common
-	definitions = list(
-		/obj/item/portable_typewriter/borg,
-		/obj/item/robojumper,
-		/obj/item/device/analyzer/atmospheric/upgraded,
-		/obj/item/device/reagentscanner,
-		/obj/item/device/light/flashlight,
-		/obj/item/device/analyzer/healthanalyzer/upgraded,
-		/obj/item/tool/omnitool/silicon,
-	)
-
 // engineer. mechanic.
-// DOES NOT inherit common tools
 /datum/robot/module_tool_creator/recursive/module/engineering
 	definitions = list(
 		/obj/item/portable_typewriter/borg,
@@ -138,7 +138,6 @@
 	)
 
 // medical doctor.
-// DOES NOT inherit common tools
 /datum/robot/module_tool_creator/recursive/module/medical
 	definitions = list(
 		/obj/item/portable_typewriter/borg,
@@ -169,9 +168,9 @@
 	)
 
 // miner. quartermaster.
-// DOES inherit common tools
 /datum/robot/module_tool_creator/recursive/module/mining
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/device/gps,
 		/obj/item/extinguisher/large/cyborg,
 		/obj/item/mining_tool/drill,
@@ -190,6 +189,7 @@
 //These are not publically used anymore
 /datum/robot/module_tool_creator/recursive/module/construction_ai
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/rcd,
 		/obj/item/electronics/scanner,
 		/obj/item/electronics/soldering,
@@ -200,6 +200,7 @@
 
 /datum/robot/module_tool_creator/recursive/module/construction_worker
 	definitions = list(
+		/datum/robot/module_tool_creator/recursive/module/common,
 		/obj/item/weldingtool,
 		/obj/item/electronics/scanner,
 		/obj/item/electronics/soldering,
diff --git a/code/modules/robotics/robot/robot_docking_station.dm b/code/modules/robotics/robot/robot_docking_station.dm
index 5039d58a48728..b4c70c229b392 100644
--- a/code/modules/robotics/robot/robot_docking_station.dm
+++ b/code/modules/robotics/robot/robot_docking_station.dm
@@ -189,7 +189,8 @@ TYPEINFO(/obj/machinery/recharge_station)
 		return
 	if (!isliving(user) || isAI(user))
 		return
-
+	if (isintangible(user))
+		return
 	if (isitem(AM) && can_act(user))
 		src.Attackby(AM, user)
 		return
@@ -491,7 +492,7 @@ TYPEINFO(/obj/machinery/recharge_station)
 
 		if (R.module)
 			var/obj/item/robot_module/M = R.module
-			occupant_data["module"] = M.name
+			occupant_data["moduleName"] = M.name
 
 		var/list/occupant_upgrades = list()
 		if (length(R.upgrades))
@@ -514,13 +515,13 @@ TYPEINFO(/obj/machinery/recharge_station)
 		occupant_data["clothing"] = occupant_clothing
 
 		var/list/occupant_cosmetics = list()
-		if(istype(R.cosmetic_mods, /datum/robot_cosmetic))
+		if (istype(R.cosmetic_mods, /datum/robot_cosmetic))
 			var/datum/robot_cosmetic/COS = R.cosmetic_mods
-			if(COS.ches_mod) occupant_cosmetics["chest"] = COS.ches_mod
-			if(COS.painted) occupant_cosmetics["paint"] = COS.paint // hex color representation
-			if(COS.head_mod) occupant_cosmetics["head"] = COS.head_mod
-			if(COS.arms_mod) occupant_cosmetics["arms"] = COS.arms_mod
-			if(COS.legs_mod) occupant_cosmetics["legs"] = COS.legs_mod
+			if (COS.ches_mod) occupant_cosmetics["chest"] = COS.ches_mod
+			if (COS.painted) occupant_cosmetics["paint"] = COS.paint // hex color representation
+			if (COS.head_mod) occupant_cosmetics["head"] = COS.head_mod
+			if (COS.arms_mod) occupant_cosmetics["arms"] = COS.arms_mod
+			if (COS.legs_mod) occupant_cosmetics["legs"] = COS.legs_mod
 			occupant_cosmetics["fx"] = COS.fx // R,G,B representation
 
 		occupant_data["cosmetics"] = occupant_cosmetics
@@ -537,12 +538,12 @@ TYPEINFO(/obj/machinery/recharge_station)
 		occupant_data["name"] = E.name
 		occupant_data["kind"] = "eyebot"
 		if (E.cell)
-			var/list/this_cell = list()
 			var/obj/item/cell/C = E.cell
-			this_cell["name"] = C.name
-			this_cell["current"] = C.charge
-			this_cell["max"] = C.maxcharge
-			occupant_data["cell"] = this_cell
+			occupant_data["cell"] = list(
+				"name" = C.name,
+				"current" = C.charge,
+				"max" = C.maxcharge
+			)
 
 	.["occupant"] = occupant_data
 
diff --git a/code/modules/robotics/robot/robot_module_rewriter.dm b/code/modules/robotics/robot/robot_module_rewriter.dm
index 1dd59d87c9ba4..7b4a560f2df75 100644
--- a/code/modules/robotics/robot/robot_module_rewriter.dm
+++ b/code/modules/robotics/robot/robot_module_rewriter.dm
@@ -4,23 +4,34 @@
 	icon_state = "robot_module_rewriter"
 	anchored = ANCHORED
 	density = 1
-	light_r =1
+	light_r = 1
 	light_g = 0.4
 	light_b = 0
 	circuit_type = /obj/item/circuitboard/robot_module_rewriter
 	var/list/obj/item/robot_module/modules = null
-	var/obj/item/robot_module/selectedModule = null
+	var/obj/item/robot_module/selected_module = null
+
+/obj/machinery/computer/robot_module_rewriter/New()
+	..()
+	src.modules = list()
 
 /obj/machinery/computer/robot_module_rewriter/attackby(obj/item/I, mob/user)
 	if (istype(I, /obj/item/robot_module))
 		user.drop_item()
 		I.set_loc(src)
-		LAZYLISTADD(src.modules, I)
+		src.modules += I
 		boutput(user, SPAN_NOTICE("You insert [I] into \the [src]."))
 		tgui_process.update_uis(src)
 	else
 		..()
 
+/obj/machinery/computer/robot_module_rewriter/Exited(atom/movable/I)
+	. = ..()
+	if (istype(I, /obj/item/robot_module))
+		src.modules -= I
+		if (src.selected_module == I)
+			src.selected_module = null
+
 /obj/machinery/computer/robot_module_rewriter/ui_interact(mob/user, datum/tgui/ui)
 	ui = tgui_process.try_update_ui(user, src, ui)
 	if (!ui)
@@ -28,26 +39,30 @@
 		ui.open()
 
 /obj/machinery/computer/robot_module_rewriter/ui_data(mob/user)
+	. = ..()
 	var/list/modulesData = list()
 
 	var/list/availableModulesData = list()
 	for (var/obj/item/robot_module/module in src.modules)
-		var/list/availableModuleData = list()
-		availableModuleData["name"] = module.name
-		availableModuleData["ref"] = "\ref[module]"
+		var/list/availableModuleData = list(
+			"name" = module.name,
+			"item_ref" = "\ref[module]"
+		)
 		// wrapping in a list to append actual list rather than contents
 		availableModulesData += list(availableModuleData)
 	modulesData["available"] = availableModulesData
 
 	var/list/selectedModuleData = null
-	if (src.selectedModule)
-		selectedModuleData = list()
-		selectedModuleData["ref"] = "\ref[src.selectedModule]"
+	if (src.selected_module)
+		selectedModuleData = list(
+			"item_ref" = "\ref[src.selected_module]"
+		)
 		var/list/selectedModuleToolsData = list()
-		for (var/obj/item/tool in src.selectedModule.tools)
-			var/list/toolData = list()
-			toolData["name"] = tool.name
-			toolData["ref"] = "\ref[tool]"
+		for (var/obj/item/tool in src.selected_module.tools)
+			var/list/toolData = list(
+				"name" = tool.name,
+				"item_ref" = "\ref[tool]"
+			)
 			// wrapping in a list to append actual list rather than contents
 			selectedModuleToolsData += list(toolData)
 		selectedModuleData["tools"] = selectedModuleToolsData
@@ -55,7 +70,7 @@
 
 	// "modules" is the only key in our return list, so could be flattened,
 	// but there is intent to add more features in the near future
-	. = list("modules" = modulesData)
+	.["modules"] = modulesData
 
 /obj/machinery/computer/robot_module_rewriter/ui_act(action, list/params, datum/tgui/ui)
 	. = ..()
@@ -67,98 +82,85 @@
 	switch (action)
 
 		if ("module-eject")
-			var/moduleRef = params["moduleRef"]
-			if (moduleRef)
-				var/obj/item/robot_module/module = locate(moduleRef) in src.modules
-				if (module)
-					// removing from modules list, as either being ejected or not in the machine for some reason
-					LAZYLISTREMOVE(src.modules, module)
-					if (module == src.selectedModule)
-						src.selectedModule = null
-					if (module.loc == src)
-						user.put_in_hand_or_eject(module)
+			var/item_ref = params["itemRef"]
+			if (!item_ref)
+				return
+			var/obj/item/robot_module/item = locate(item_ref) in src.modules
+			if (!item)
+				return
+			user.put_in_hand_or_eject(item)
 			. = TRUE
 
 		if ("module-reset")
-			var/moduleId = params["moduleId"]
-			var/moduleRef = params["moduleRef"]
-			if (moduleId && moduleRef)
-				var/obj/item/robot_module/module = locate(moduleRef) in src.modules
-				if (module)
-					if (module.loc != src)
-						// sanity check, tidy up modules list if not in the machine for some reason
-						LAZYLISTREMOVE(src.modules, module)
-						src.selectedModule = null
-					else if (module == src.selectedModule)
-						var/moduleResetType
-						switch (moduleId)
-							if ("brobocop")
-								moduleResetType = /obj/item/robot_module/brobocop
-							if ("science")
-								moduleResetType = /obj/item/robot_module/science
-							if ("civilian")
-								moduleResetType = /obj/item/robot_module/civilian
-							if ("engineering")
-								moduleResetType = /obj/item/robot_module/engineering
-							if ("medical")
-								moduleResetType = /obj/item/robot_module/medical
-							if ("mining")
-								moduleResetType = /obj/item/robot_module/mining
-						if (moduleResetType)
-							var/obj/item/robot_module/replacementModule = new moduleResetType(src)
-							var/moduleIndex = src.modules.Find(module)
-							if (moduleIndex)
-								src.modules[moduleIndex] = replacementModule
-								src.selectedModule = replacementModule
-								qdel(module)
+			var/module_id = params["moduleId"]
+			if (!module_id)
+				return
+			if (!src.selected_module)
+				return
+			var/module_reset_path
+			switch (module_id)
+				if ("brobocop")
+					module_reset_path = /obj/item/robot_module/brobocop
+				if ("science")
+					module_reset_path = /obj/item/robot_module/science
+				if ("civilian")
+					module_reset_path = /obj/item/robot_module/civilian
+				if ("engineering")
+					module_reset_path = /obj/item/robot_module/engineering
+				if ("medical")
+					module_reset_path = /obj/item/robot_module/medical
+				if ("mining")
+					module_reset_path = /obj/item/robot_module/mining
+			if (!module_reset_path)
+				return
+			var/module_index = src.modules.Find(src.selected_module)
+			if (!module_index)
+				return
+			var/obj/item/robot_module/replacement_module = new module_reset_path(src)
+			src.modules[module_index] = replacement_module
+			qdel(src.selected_module)
+			src.selected_module = replacement_module
 			. = TRUE
 
 		if ("module-select")
-			var/moduleRef = params["moduleRef"]
-			if (moduleRef)
-				src.selectedModule = locate(moduleRef) in src.modules
-				// sanity check, tidy up modules list if not in the machine for some reason
-				if (src.selectedModule && src.selectedModule.loc != src)
-					LAZYLISTREMOVE(src.modules, src.selectedModule)
-			else
-				src.selectedModule = null
+			var/item_ref = params["itemRef"]
+			if (!item_ref)
+				src.selected_module = null
+				return
+			src.selected_module = locate(item_ref) in src.modules
 			. = TRUE
 
 		if ("tool-move")
 			var/dir = params["dir"]
-			var/moduleRef = params["moduleRef"]
-			var/toolRef = params["toolRef"]
-			if (moduleRef && toolRef)
-				var/obj/item/robot_module/module = locate(moduleRef) in src.modules
-				if (module)
-					if (module.loc != src)
-						// sanity check, tidy up modules list if not in the machine for some reason
-						LAZYLISTREMOVE(src.modules, module)
-					else if (module == src.selectedModule)
-						var/obj/item/tool = locate(toolRef) in module
-						if (tool)
-							var/toolIndex = module.tools.Find(tool)
-							switch (dir)
-								if ("down")
-									if (toolIndex > 0 && toolIndex < module.tools.len)
-										module.tools.Swap(toolIndex, toolIndex + 1)
-								if ("up")
-									if (toolIndex >= 2)
-										module.tools.Swap(toolIndex, toolIndex - 1)
+			var/item_ref = params["itemRef"]
+			if (!dir || !item_ref)
+				return
+			if (!src.selected_module)
+				return
+			var/obj/item/item = locate(item_ref) in src.selected_module.tools
+			if (!item)
+				return
+			var/item_index = src.selected_module.tools.Find(item)
+			if (!item_index)
+				return
+			switch (dir)
+				if ("down")
+					if (item_index < length(src.selected_module.tools))
+						src.selected_module.tools.Swap(item_index, item_index + 1)
+				if ("up")
+					if (item_index >= 2)
+						src.selected_module.tools.Swap(item_index, item_index - 1)
 			. = TRUE
 
 		if ("tool-remove")
-			var/moduleRef = params["moduleRef"]
-			var/toolRef = params["toolRef"]
-			if (moduleRef && toolRef)
-				var/obj/item/robot_module/module = locate(moduleRef) in src.modules
-				if (module)
-					if (module.loc != src)
-						// sanity check, tidy up modules list if not in the machine for some reason
-						LAZYLISTREMOVE(src.modules, module)
-					else if (module == src.selectedModule)
-						var/obj/item/tool = locate(toolRef) in module.tools
-						if (tool)
-							module.tools -= tool
-							qdel(tool)
+			var/item_ref = params["itemRef"]
+			if (!item_ref)
+				return
+			if (!src.selected_module)
+				return
+			var/obj/item/item = locate(item_ref) in src.selected_module.tools
+			if (!item)
+				return
+			src.selected_module.tools -= item
+			qdel(item)
 			. = TRUE
diff --git a/code/modules/sound/playsound.dm b/code/modules/sound/playsound.dm
index a6f54888fffce..cce9b9b3c5bfd 100644
--- a/code/modules/sound/playsound.dm
+++ b/code/modules/sound/playsound.dm
@@ -139,7 +139,7 @@ proc/is_music_playing()
 
 	var/client/adminC
 	for (var/client/C in clients)
-		if (C.key == data["key"])
+		if (C.ckey == data["admin_ckey"])
 			adminC = C
 
 	SPAWN(0)
@@ -155,7 +155,7 @@ proc/is_music_playing()
 				var/show_other_key = 0
 				if (adminC.stealth || adminC.alt_key)
 					show_other_key = 1
-				boutput(C, "[SPAN_MEDAL("<b>[show_other_key ? adminC.fakekey : adminC.key] played (your volume: [ ismuted ? "muted" : vol ]):</b>")][SPAN_NOTICE("[data["title"]] ([data["duration"]])")]")
+				boutput(C, "[SPAN_MEDAL("<b>[show_other_key ? adminC.fakekey : adminC.key] played (your volume: [ ismuted ? "muted" : vol ]):</b>")][SPAN_NOTICE("[data["title"]] ([data["duration_human"]])")]")
 
 			if (ismuted) //bullshit BYOND 0 is not null fuck you
 				continue
@@ -170,11 +170,11 @@ proc/is_music_playing()
 	if (adminC)
 		logTheThing(LOG_ADMIN, adminC, "loaded remote music: [data["file"]] ([data["filesize"]])")
 		logTheThing(LOG_DIARY, adminC, "loaded remote music: [data["file"]] ([data["filesize"]])", "admin")
-		message_admins("[key_name(adminC)] loaded remote music: [data["title"]] ([data["duration"]] / [data["filesize"]])")
+		message_admins("[key_name(adminC)] loaded remote music: [data["title"]] ([data["duration_human"]] / [data["filesize"]])")
 	else
-		logTheThing(LOG_ADMIN, data["key"], "loaded remote music: [data["file"]] ([data["filesize"]])")
-		logTheThing(LOG_DIARY, data["key"], "loaded remote music: [data["file"]] ([data["filesize"]])", "admin")
-		message_admins("[data["key"]] loaded remote music: [data["title"]] ([data["duration"]] / [data["filesize"]])")
+		logTheThing(LOG_ADMIN, data["admin_ckey"], "loaded remote music: [data["file"]] ([data["filesize"]])")
+		logTheThing(LOG_DIARY, data["admin_ckey"], "loaded remote music: [data["file"]] ([data["filesize"]])", "admin")
+		message_admins("[data["admin_ckey"]] loaded remote music: [data["title"]] ([data["duration_human"]] / [data["filesize"]])")
 	return 1
 
 /client/verb/change_volume(channel_name as anything in audio_channel_name_to_id)
@@ -250,33 +250,21 @@ proc/is_music_playing()
 		src.verbs += /client/verb/stop_all_sounds
 
 /client/proc/play_youtube_audio()
-	if (!config.youtube_audio_key)
-		alert("You don't have access to the youtube audio converter")
-		return 0
-
 	var/video = input("Input the Youtube video information\nEither the full URL e.g. https://www.youtube.com/watch?v=145RCdUwAxM\nOr just the video ID e.g. 145RCdUwAxM", "Play Youtube Audio") as null|text
 	if (!video)
 		return
 
-	// Fetch via HTTP from goonhub
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "http://yt.goonhub.com/index.php?server=[config.server_id]&key=[src.key]&video=[video]&auth=[config.youtube_audio_key]", "", "")
-	request.begin_async()
-	UNTIL(request.is_complete())
-	var/datum/http_response/response = request.into_response()
-
-	if (response.errored || !response.body)
-		boutput(src, "<span class='bold' class='notice'>Something went wrong with the youtube thing! Yell at Wire.</span>")
-		logTheThing(LOG_DEBUG, null, "<b>Youtube Error</b>: No response from server with video: <b>[video]</b>")
-		logTheThing(LOG_DIARY, null, "Youtube Error: No response from server with video: [video]", "debug")
-		return
-
-	var/data = json_decode(response.body)
-	if (data["error"])
-		boutput(src, "<span class='bold' class='notice'>Error returned from youtube server thing: [data["error"]].</span>")
+	try
+		var/datum/apiRoute/remoteMusic/playRemoteMusic = new
+		playRemoteMusic.buildBody(video, roundId, src.ckey)
+		apiHandler.queryAPI(playRemoteMusic)
+	catch (var/exception/e)
+		var/datum/apiModel/Error/error = e.name
+		boutput(src, "<span class='bold' class='notice'>Error returned from youtube server thing: [error.message].</span>")
 		return
 
 	// prevent radio station from interrupting us
-	EXTEND_COOLDOWN(global, "music", 2 MINUTES) // TODO: use data from the request as duration instead
+	// Wire note: This essentially means "extend the duration by the time we think it will take the API to download the song and get back to us"
+	EXTEND_COOLDOWN(global, "music", 30 SECONDS)
 
 	boutput(src, "<span class='bold' class='notice'>Youtube audio loading started. This may take some time to play and a second message will be displayed when it finishes.</span>")
diff --git a/code/modules/sound/sound.dm b/code/modules/sound/sound.dm
index 89121ec479a5f..06b28c81892b7 100644
--- a/code/modules/sound/sound.dm
+++ b/code/modules/sound/sound.dm
@@ -104,7 +104,7 @@ var/global/list/default_channel_volumes = list(1, 1, 1, 0.5, 0.5, 1, 1)
 	volume = clamp(volume, 0, 2)
 	volumes[channel + 1] = volume
 
-	cloud_put("audio_volume", json_encode(volumes))
+	src.player.cloudSaves.putData("audio_volume", json_encode(volumes))
 
 	var/list/playing = src.SoundQuery()
 	if( channel == VOLUME_CHANNEL_MASTER )
diff --git a/code/procs/logged_phrases.dm b/code/modules/speech/logged_phrases.dm
similarity index 95%
rename from code/procs/logged_phrases.dm
rename to code/modules/speech/logged_phrases.dm
index 411c79d21e2b8..cdbe227da40e3 100644
--- a/code/procs/logged_phrases.dm
+++ b/code/modules/speech/logged_phrases.dm
@@ -218,14 +218,19 @@ var/global/datum/phrase_log/phrase_log = new
 	/// Gets a random phrase from the Goonhub API database, categories are "ai_laws", "tickets", "fines"
 	proc/random_api_phrase(category)
 		if(!length(src.cached_api_phrases[category]))
-			var/list/data = apiHandler.queryAPI("random-entries", list("type"=category, "count"=src.api_cache_size), 1, 1, 1)
-			if(!data)
+			var/datum/apiModel/RandomEntries/randomEntries
+			try
+				var/datum/apiRoute/randomEntries/getRandomEntries = new
+				getRandomEntries.queryParams = list("type" = category, "count" = src.api_cache_size)
+				randomEntries = apiHandler.queryAPI(getRandomEntries)
+			catch
 				return .
+
 			var/list/new_phrases = list()
-			for(var/list/entry in data["entries"])
+			for (var/datum/apiModel/entry in randomEntries.entries)
 				switch(category)
 					if("ai_laws")
-						if(entry["uploader_key"] != "Random Event")
+						if(entry["uploader_name"] != "Random Event")
 							new_phrases += entry["law_text"]
 					if("tickets", "fines")
 						new_phrases += entry["reason"]
diff --git a/code/modules/status_system/statusEffects.dm b/code/modules/status_system/statusEffects.dm
index 7165471f2ad29..59a68a7d7c64d 100644
--- a/code/modules/status_system/statusEffects.dm
+++ b/code/modules/status_system/statusEffects.dm
@@ -2372,6 +2372,7 @@
 			C.setProperty("coldprot", C.getProperty("coldprot") - LAUNDERED_COLDPROT_AMOUNT)
 			if (C.stains)
 				C.stains -= LAUNDERED_STAIN_TEXT
+				C.UpdateName()
 
 #undef LAUNDERED_COLDPROT_AMOUNT
 #undef LAUNDERED_STAIN_TEXT
@@ -2400,6 +2401,58 @@
 				if (R.activated) R.upgrade_deactivate(robot)
 		. = ..()
 
+/datum/statusEffect/oiled
+	id = "oiled"
+	name = "Oiled"
+	icon_state = "oil"
+	maxDuration = 6 MINUTES
+	movement_modifier = /datum/movement_modifier/robot_oil
+
+	getTooltip()
+		. = "You have been oiled, your movement delay and passive power consumption have been reduced by 15%, and you feel more ready to resist anything that may stun you in your tracks."
+
+	onAdd(optional=null)
+		..()
+		var/mob/M = owner
+		APPLY_ATOM_PROPERTY(M, PROP_MOB_STUN_RESIST, "robot_oil", 25)
+		APPLY_ATOM_PROPERTY(M, PROP_MOB_STUN_RESIST_MAX, "robot_oil", 25)
+
+	onRemove()
+		..()
+		var/mob/M = owner
+		REMOVE_ATOM_PROPERTY(M, PROP_MOB_STUN_RESIST, "robot_oil")
+		REMOVE_ATOM_PROPERTY(M, PROP_MOB_STUN_RESIST_MAX, "robot_oil")
+
+/datum/statusEffect/oiled/fresh
+	id = "freshly_oiled"
+	name = "Freshly oiled"
+	icon_state = "fresh_oil"
+	maxDuration = 15 SECONDS
+	movement_modifier = /datum/movement_modifier/robot_oil/fresh
+	/// Duration of the oiled status effect a person has before more oil is applied.
+	var/oiledDuration = 0
+	/// How long have we had the status effect for
+	var/tickspassed = 0
+
+	getTooltip()
+		. = "You have recently been oiled, your movement delay and passive power consumption have been reduced by 50%, and you feel more ready to resist anything that may stun you in your tracks."
+
+	onAdd(optional=null)
+		..()
+		var/mob/M = owner
+		if(M.hasStatus("oiled"))
+			oiledDuration = M.getStatusDuration("oiled")
+			M.delStatus("oiled")
+
+	onUpdate(timePassed) // I gotta do it this way trust me on this
+		. = ..()
+		tickspassed += timePassed
+
+	onRemove()
+		..()
+		var/mob/M = owner
+		M.changeStatus("oiled", (min(tickspassed, maxDuration) * 24 + oiledDuration)) //  freshly oiled decays into oiled status with 12 times the duration that the status effect has peaked at.
+
 /datum/statusEffect/criticalcondition
 	id = "critical_condition"
 	name = "Critical Condition"
@@ -2562,3 +2615,28 @@
 			M.max_health += change
 			current_bonus = newBonus
 			health_update_queue |= M
+
+/datum/statusEffect/wiz_polymorph
+	id = "wiz_polymorph"
+	name = "Polymorphed"
+	desc = "You've been polymorphed by a wizard! It will take a few minutes for the spell to wear off."
+	icon_state = "polymorph"
+	unique = TRUE
+	var/mob/living/carbon/human/original
+
+	onAdd(mob/living/carbon/human/H)
+		. = ..()
+		original = H
+
+	onRemove()
+		..()
+		var/mob/M = owner
+		if (ismobcritter(M) && isalive(M))
+			original.set_loc(M.loc)
+			original.hibernating = FALSE
+			M.mind?.transfer_to(original)
+			qdel(M)
+		else
+			qdel(original)
+
+		src.original = null
diff --git a/code/modules/storage/items/bag_of_holding.dm b/code/modules/storage/items/bag_of_holding.dm
index 40af540a49d7b..40f39357762cf 100644
--- a/code/modules/storage/items/bag_of_holding.dm
+++ b/code/modules/storage/items/bag_of_holding.dm
@@ -141,8 +141,10 @@ proc/destroy_bag_of_holding(obj/item/artifact/boh, obj/added, mob/user = null)
 						for (var/obj/item/I as anything in items)
 							H = pick(humans)
 							if (H.back.storage.check_can_hold(I) == STORAGE_CAN_HOLD)
+								logTheThing(LOG_STATION, boh, "[I] is transferred to [key_name(H)]'s back slot by a bag of holding fault")
 								I.stored.transfer_stored_item(I, H.back, TRUE)
 							else if (H.belt.storage.check_can_hold(I) == STORAGE_CAN_HOLD)
+								logTheThing(LOG_STATION, boh, "[I] is transferred to [key_name(H)]'s belt slot by a bag of holding fault")
 								I.stored.transfer_stored_item(I, H.belt, TRUE)
 							humans -= H
 							if (!length(humans))
@@ -180,7 +182,7 @@ proc/destroy_bag_of_holding(obj/item/artifact/boh, obj/added, mob/user = null)
 
 			effect = "user stranded in pocket dimension"
 
-	logTheThing(LOG_STATION, boh, "artifact bags of holding combined at [log_loc(T)] [user ? "by [user]" : null] with effect [effect].")
+	logTheThing(LOG_STATION, boh, "artifact bags of holding combined at [log_loc(T)] by [key_name(user)] with effect [effect].")
 
 	for (var/obj/item/I as anything in (added.storage?.get_contents() + boh.storage.get_contents() - added))
 		qdel(I)
diff --git a/code/modules/storage/storage.dm b/code/modules/storage/storage.dm
index a4a48f08a5290..3a3845ca7df74 100644
--- a/code/modules/storage/storage.dm
+++ b/code/modules/storage/storage.dm
@@ -435,6 +435,10 @@
 		user.s_active = null
 		user.detach_hud(src.hud)
 
+/datum/storage/proc/hide_all_huds()
+	for (var/mob/M as anything in src.hud?.mobs)
+		src.hide_hud(M)
+
 /// if user sees the storage hud
 /datum/storage/proc/hud_shown(mob/user)
 	return user in src.hud.mobs
diff --git a/code/modules/transport/pods/engine.dm b/code/modules/transport/pods/engine.dm
index 54db1738a3337..768ff52d0672b 100644
--- a/code/modules/transport/pods/engine.dm
+++ b/code/modules/transport/pods/engine.dm
@@ -144,6 +144,10 @@
 
 	sleep(portaldelay)
 	P.target = target
+	if (istype(target, /obj/warp_beacon))
+		var/obj/warp_beacon/WB = target
+		if (WB.encrypted) // special beacon, ignore restricted Z checks and similar
+			P.bypass_tele_block = TRUE
 	ready = 0
 	warp_autopilot = 0
 	logTheThing(LOG_STATION, usr, "creates a wormhole (pod portal) (<b>Destination:</b> [target]) at [log_loc(usr)].")
diff --git a/code/modules/transport/pods/ships.dm b/code/modules/transport/pods/ships.dm
index b8916dfb3bf9b..70394f4dfddfc 100644
--- a/code/modules/transport/pods/ships.dm
+++ b/code/modules/transport/pods/ships.dm
@@ -191,8 +191,8 @@ obj/machinery/vehicle/miniputt/pilot
 	init_comms_type = /obj/item/shipcomponent/communications/syndicate
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		src.lock = new /obj/item/shipcomponent/secondary_system/lock(src)
 		src.lock.ship = src
 		src.components += src.lock
@@ -977,8 +977,8 @@ ABSTRACT_TYPE(/obj/structure/vehicleframe)
 			return*/
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		myhud.update_systems()
 		myhud.update_states()
 		src.lock = new /obj/item/shipcomponent/secondary_system/lock(src)
diff --git a/code/modules/transport/pods/vehicle.dm b/code/modules/transport/pods/vehicle.dm
index 7555ac3b8f0d2..62bc5e722426d 100644
--- a/code/modules/transport/pods/vehicle.dm
+++ b/code/modules/transport/pods/vehicle.dm
@@ -309,6 +309,7 @@
 			src.add_dialog(usr)
 			if (href_list["unengine"])
 				if (src.engine)
+					logTheThing(LOG_STATION, usr, "ejects the engine system ([src.engine]) from [src] at [log_loc(src)]")
 					engine.deactivate()
 					components -= engine
 					engine.set_loc(src.loc)
@@ -328,6 +329,7 @@
 
 			else if (href_list["unlife"])
 				if (src.life_support)
+					logTheThing(LOG_VEHICLE, usr, "ejects the life support system ([src.life_support]) from [src] at [log_loc(src)]")
 					life_support.deactivate()
 					components -= life_support
 					life_support.set_loc(src.loc)
@@ -336,6 +338,7 @@
 
 			else if (href_list["uncom"])
 				if (src.com_system)
+					logTheThing(LOG_VEHICLE, usr, "ejects the comms system ([src.com_system]) from [src] at [log_loc(src)]")
 					com_system.deactivate()
 					components -= com_system
 					com_system.set_loc(src.loc)
@@ -347,6 +350,7 @@
 					if (!src.m_w_system.removable)
 						boutput(usr, SPAN_ALERT("[src.m_w_system] is fused to the hull and cannot be removed."))
 						return
+					logTheThing(LOG_VEHICLE, usr, "ejects the main weapon system ([src.m_w_system]) from [src] at [log_loc(src)]")
 					m_w_system.deactivate()
 					components -= m_w_system
 					if (uses_weapon_overlays && m_w_system.appearanceString)
@@ -357,11 +361,13 @@
 
 			else if (href_list["unloco"])
 				if (istype(src,/obj/machinery/vehicle/tank))
+					logTheThing(LOG_VEHICLE, usr, "ejects the locomotion system from [src] at [log_loc(src)]")
 					src:remove_locomotion()
 					src.updateDialog()
 
 			else if (href_list["unsec_system"])
 				if (src.sec_system)
+					logTheThing(LOG_VEHICLE, usr, "ejects the secondary system ([src.sec_system]) from [src] at [log_loc(src)]")
 					sec_system.deactivate()
 					components -= sec_system
 					sec_system.set_loc(src.loc)
@@ -370,6 +376,7 @@
 
 			else if (href_list["unsensors"])
 				if (src.sensors)
+					logTheThing(LOG_VEHICLE, usr, "ejects the sensors system ([src.sensors]) from [src] at [log_loc(src)]")
 					sensors.deactivate()
 					components -= sensors
 					sensors.set_loc(src.loc)
@@ -632,7 +639,7 @@
 				M.remove_stamina(power)
 				var/turf/throw_at = get_edge_target_turf(src, src.dir)
 				M.throw_at(throw_at, movement_controller:velocity_magnitude, 2)
-				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] [log_loc(src)].")
+				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] at [log_loc(target)].")
 				SPAWN(2.5 SECONDS)
 					if(M.health > 0)
 						vehicular_manslaughter = 0 //we now check if person was sent into crit after hit, if they did we get the achievement
@@ -646,7 +653,7 @@
 					var/turf/simulated/wall/T = target
 					T.dismantle_wall(1)
 
-				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] [log_loc(src)].")
+				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] at [log_loc(target)].")
 			else if (isobj(target) && power >= req_smash_velocity)
 				var/obj/O = target
 
@@ -667,7 +674,7 @@
 				if (istype(O,/obj/machinery/vending))
 					var/obj/machinery/vending/V = O
 					V.fall(src)
-				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] [log_loc(src)].")
+				logTheThing(LOG_COMBAT, src, "(piloted by [constructTarget(src.pilot,"combat")]) crashes into [constructTarget(target,"combat")] at [log_loc(target)].")
 
 			playsound(src.loc, 'sound/impact_sounds/Generic_Hit_Heavy_1.ogg', 40, 1)
 
@@ -1843,8 +1850,8 @@
 	init_comms_type = /obj/item/shipcomponent/communications/syndicate
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		name = "syndicate minisub"
 		src.lock = new /obj/item/shipcomponent/secondary_system/lock(src)
 		src.lock.ship = src
diff --git a/code/modules/transport/pods/warp_travel.dm b/code/modules/transport/pods/warp_travel.dm
index 543f76dba5bdc..709a63752da2d 100644
--- a/code/modules/transport/pods/warp_travel.dm
+++ b/code/modules/transport/pods/warp_travel.dm
@@ -111,6 +111,8 @@
 	icon_state = "fatportal"
 	density = 0
 	var/obj/target = null
+	/// allows a portal to warp to restricted Zs and areas
+	var/bypass_tele_block = FALSE
 	anchored = ANCHORED
 	event_handler_flags = USE_FLUID_ENTER
 
@@ -175,7 +177,7 @@
 	if (istype(M, /atom/movable))
 		animate_portal_tele(src)
 		playsound(src.loc, "warp", 50, 1, 0.2, 1.2)
-		do_teleport(M, src.target, 1) ///You will appear adjacent to the beacon
+		do_teleport(M, src.target, 1, !bypass_tele_block) ///You will appear adjacent to the beacon
 
 /obj/warp_beacon/proc/startpack()
 	src.packable = 0
diff --git a/code/modules/transport/skateboard.dm b/code/modules/transport/skateboard.dm
index 1bd696043508d..816c1e9645e05 100644
--- a/code/modules/transport/skateboard.dm
+++ b/code/modules/transport/skateboard.dm
@@ -198,8 +198,7 @@
 				input_lockout -= 1
 
 	else if(isobj(AM))
-		var/trick = trickName()
-		src.messageNearby(SPAN_ALERT("<B>You do a [trick] on the [AM]!</B>"), SPAN_ALERT("<B>[rider] does a [trick] on the [AM]!</B>"))
+		//chat message removed due to extreme amounts of spam
 		if(give_points)
 			adjustSickness(4)
 		trickAnimate()
diff --git a/code/modules/vending/vending.dm b/code/modules/vending/vending.dm
index 3e8a038b3d3ee..05a104191d342 100644
--- a/code/modules/vending/vending.dm
+++ b/code/modules/vending/vending.dm
@@ -2760,6 +2760,7 @@ TYPEINFO(/obj/machinery/vending/monkey)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/vodka, 4)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/tequila, 4)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/wine, 4)
+		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/wine/white, 4)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/cider, 4)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/mead, 4)
 		product_list += new/datum/data/vending_product(/obj/item/reagent_containers/food/drinks/bottle/gin, 4)
@@ -3134,6 +3135,13 @@ ABSTRACT_TYPE(/obj/machinery/vending/jobclothing)
 	ex_act(severity)
 		. = ..()
 
+/obj/machinery/vending/air_vendor/plasma/pod_wars
+	air_cost = 0
+	can_fall = FALSE
+	can_hack = FALSE
+
+	ex_act(severity)
+		. = ..()
 /obj/machinery/vending/jobclothing/security
 	name = "Security Apparel"
 	desc = "A vending machine that vends Security clothing."
@@ -3263,7 +3271,7 @@ ABSTRACT_TYPE(/obj/machinery/vending/jobclothing)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/under/rank/orangeoveralls/yellow, 2)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/suit/wintercoat/engineering, 4)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/suit/hi_vis, 4)
-		product_list += new/datum/data/vending_product(/obj/item/clothing/suit/fire, 2)
+		product_list += new/datum/data/vending_product(/obj/item/clothing/suit/hazard/fire, 2)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/mask/gas, 6)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/gloves/black, 2)
 		product_list += new/datum/data/vending_product(/obj/item/clothing/gloves/yellow/unsulated, 2) //heh
diff --git a/code/modules/vpn_bonk/vpn_bonk.dm b/code/modules/vpn_bonk/vpn_bonk.dm
index fedeef1c61370..b1523bc1da15a 100644
--- a/code/modules/vpn_bonk/vpn_bonk.dm
+++ b/code/modules/vpn_bonk/vpn_bonk.dm
@@ -21,40 +21,44 @@ var/global/list/vpn_ip_checks = list() //assoc list of ip = true or ip = false.
 		// NOTE: adjust magic numbers here if we approach vpn checker api rate limits
 		try
 			if (isnull(is_vpn_address) && (round_stats?["participated"] < 5 || round_stats?["seen"] < 20))
-				var/list/data
 				if (vpn_prescan()) return
-				data = apiHandler.queryAPI("vpncheck", list("ip" = src.address, "ckey" = src.ckey), 1, 1, 1)
-				// Goonhub API error encountered
-				if (data["error"])
-					logTheThing(LOG_ADMIN, src, "unable to check VPN status of [src.address] because: [data["error"]]")
-					logTheThing(LOG_DIARY, src, "unable to check VPN status of [src.address] because: [data["error"]]", "debug")
+
+				var/datum/apiModel/VpnCheckResource/checkedVpn
+				try
+					var/datum/apiRoute/vpn/check/checkVpn = new
+					checkVpn.routeParams = list(src.address)
+					checkVpn.queryParams = list("ckey" = src.ckey, "round_id" = roundId)
+					checkedVpn = apiHandler.queryAPI(checkVpn)
+				catch (var/exception/e)
+					var/datum/apiModel/Error/error = e.name
+					logTheThing(LOG_ADMIN, src, "unable to check VPN status of [src.address] because: [error.message]")
+					logTheThing(LOG_DIARY, src, "unable to check VPN status of [src.address] because: [error.message]", "debug")
+					return
 
 				// Successful Goonhub API query
+				var/list/responseData = json_decode(checkedVpn.response)
+				var/result = postscan(responseData)
+				if (result == 2 || checkedVpn.meta["whitelisted"])
+					// User is explicitly whitelisted from VPN checks, ignore
+					global.vpn_ip_checks["[src.address]"] = FALSE
 				else
-					var/result = postscan(data)
-					if (result == 2 || data["whitelisted"])
-						// User is explicitly whitelisted from VPN checks, ignore
+					// VPN checker service returns error responses in a "message" property
+					if (checkedVpn.error)
+						// Yes, we're forcing a cache for a no-VPN response here on purpose
+						// Reasoning: The goonhub API has cached the VPN checker error response for the foreseeable future and further queries won't change that
+						//			  so we want to avoid spamming the goonhub API this round for literally no gain
 						global.vpn_ip_checks["[src.address]"] = FALSE
-					else
-						data = json_decode(html_decode(data["response"]))
-
-						// VPN checker service returns error responses in a "message" property
-						if (data["success"] == FALSE)
-							// Yes, we're forcing a cache for a no-VPN response here on purpose
-							// Reasoning: The goonhub API has cached the VPN checker error response for the foreseeable future and further queries won't change that
-							//			  so we want to avoid spamming the goonhub API this round for literally no gain
-							global.vpn_ip_checks["[src.address]"] = FALSE
-							logTheThing(LOG_ADMIN, src, "unable to check VPN status of [src.address] because: [data["message"]]")
-							logTheThing(LOG_DIARY, src, "unable to check VPN status of [src.address] because: [data["message"]]", "debug")
+						logTheThing(LOG_ADMIN, src, "unable to check VPN status of [src.address] because: [checkedVpn.error]")
+						logTheThing(LOG_DIARY, src, "unable to check VPN status of [src.address] because: [checkedVpn.error]", "debug")
 
-						// Successful VPN check
-						// IP is a known VPN, cache locally and kick
-						else if (result || (((data["vpn"] == TRUE) || (data["tor"] == TRUE)) && (data["fraud_score"] > 75)))
-							vpn_bonk(data["host"], data["ASN"], data["organization"], data["fraud_score"])
-							return
-						// IP is not a known VPN
-						else
-							global.vpn_ip_checks["[src.address]"] = FALSE
+					// Successful VPN check
+					// IP is a known VPN, cache locally and kick
+					else if (result || (((responseData["vpn"] == TRUE) || (responseData["tor"] == TRUE)) && (responseData["fraud_score"] > 75)))
+						vpn_bonk(responseData["host"], responseData["ASN"], responseData["organization"], responseData["fraud_score"])
+						return
+					// IP is not a known VPN
+					else
+						global.vpn_ip_checks["[src.address]"] = FALSE
 
 		catch(var/exception/e)
 			logTheThing(LOG_ADMIN, src, "unable to check VPN status of [src.address] because: [e.name]")
@@ -87,7 +91,7 @@ var/global/list/vpn_ip_checks = list() //assoc list of ip = true or ip = false.
 		global.vpn_ip_checks["[src.address]"] = TRUE
 		var/msg_txt = "[src.address] attempted to connect via vpn or proxy. vpn info:[host ? " host: [host]," : ""] ASN: [asn], org: [organization][fraud_score ? ", fraud score: [fraud_score]" : ""][info ? ", info: [info]" : ""]"
 
-		addPlayerNote(src.ckey, "VPN Blocker", msg_txt)
+		addPlayerNote(src.ckey, "bot", msg_txt)
 		logTheThing(LOG_ADMIN, src, msg_txt)
 		logTheThing(LOG_DIARY, src, msg_txt, "admin")
 		message_admins("[key_name(src)] [msg_txt]")
diff --git a/code/modules/worldgen/mapgen/ForestGenerator.dm b/code/modules/worldgen/mapgen/ForestGenerator.dm
index 32c1c249136e8..3be496555a961 100644
--- a/code/modules/worldgen/mapgen/ForestGenerator.dm
+++ b/code/modules/worldgen/mapgen/ForestGenerator.dm
@@ -110,21 +110,29 @@
 /datum/map_generator/forest_generator/proc/adjust_biome(turf/gen_turf, datum/biome/path)
 	. = path
 
-#ifdef HALLOWEEN
-
 /datum/biome/forest/dense/dark
 	flora_types = list(/obj/tree{layer = EFFECTS_LAYER_UNDER_1} = 5, /obj/tree/elm_random=25, /obj/shrub/random{last_use=INFINITY} = 5, /obj/machinery/plantpot/bareplant/swamp_flora = 1)
+#ifdef HALLOWEEN
 	fauna_types = list(/mob/living/critter/changeling/eyespider/ai_controlled = 5, /mob/living/critter/changeling/legworm/ai_controlled = 5, /mob/living/critter/changeling/handspider/ai_controlled = 5, /mob/living/critter/bear=1, /mob/living/critter/small_animal/frog=5, /mob/living/critter/small_animal/bird/owl=1)
+#else
+	fauna_types = list(/mob/living/critter/bear=1, /mob/living/critter/small_animal/frog=5, /mob/living/critter/small_animal/bird/owl=1)
+#endif
+
+/datum/biome/forest
+	var/dark = FALSE
 
 /datum/biome/forest/thin/dark
+	dark = TRUE
 	flora_types = list(/obj/tree{layer = EFFECTS_LAYER_UNDER_1} = 5, /obj/tree/elm_random=5, /obj/shrub/random{last_use=INFINITY} = 50, /obj/machinery/plantpot/bareplant/tree = 5, /obj/machinery/plantpot/bareplant/swamp_flora = 50)
 	fauna_types = list(/mob/living/critter/small_animal/mouse=5, /mob/living/critter/small_animal/mouse/mad=1, /mob/living/critter/small_animal/snake=2, /mob/living/critter/small_animal/bird/crow=1)
 
 /datum/biome/forest/dark
+	dark = TRUE
 	flora_types = list(/obj/tree{layer = EFFECTS_LAYER_UNDER_1} = 5, /obj/tree/elm_random=30, /obj/shrub/random{last_use=INFINITY} = 50)
 	fauna_types = list(/mob/living/critter/small_animal/firefly/ai_controlled = 1, /mob/living/critter/small_animal/firefly/pyre/ai_controlled = 3, /mob/living/critter/small_animal/firefly/lightning/ai_controlled = 3, /mob/living/critter/bear=1, /mob/living/critter/small_animal/bird/crow=5)
 
 /datum/biome/forest/clearing/dark
+	dark = TRUE
 	flora_types = list(/obj/shrub/random{last_use=INFINITY} = 150, /obj/machinery/plantpot/bareplant/flower = 5, /obj/machinery/plantpot/bareplant/swamp_flora = 1 )
 	fauna_types = list(/mob/living/critter/small_animal/mouse=5, /mob/living/critter/small_animal/mouse/mad=1, /mob/living/critter/small_animal/snake=3)
 
@@ -149,5 +157,3 @@
 		. = dark_lookup[path]
 	else
 		. = path
-
-#endif
diff --git a/code/modules/worldgen/mapgen/IceMoonGenerator.dm b/code/modules/worldgen/mapgen/IceMoonGenerator.dm
index 3a250b96dd751..38a3274f27526 100644
--- a/code/modules/worldgen/mapgen/IceMoonGenerator.dm
+++ b/code/modules/worldgen/mapgen/IceMoonGenerator.dm
@@ -6,7 +6,7 @@
 	flora_types = list(/obj/stone/random = 10, /obj/decal/fakeobjects/smallrocks = 10)
 	flora_density = 1
 
-	fauna_types = list(/mob/living/critter/small_animal/seal = 15, /mob/living/critter/brullbar = 5, /obj/critter/yeti = 1)
+	fauna_types = list(/mob/living/critter/small_animal/seal = 15, /mob/living/critter/brullbar = 5)
 	fauna_density = 0.5
 
 /datum/biome/icemoon/snow/trees
diff --git a/code/modules/worldgen/mapgen/LavaMoonGenerator.dm b/code/modules/worldgen/mapgen/LavaMoonGenerator.dm
new file mode 100644
index 0000000000000..b78eca2722e51
--- /dev/null
+++ b/code/modules/worldgen/mapgen/LavaMoonGenerator.dm
@@ -0,0 +1,248 @@
+//the random offset applied to square coordinates, causes intermingling at biome borders
+#define LAVA_MOON_BIOME_RANDOM_SQUARE_DRIFT 2
+
+/datum/biome/lavamoon
+	turf_type = /turf/unsimulated/floor/auto/iomoon
+
+	fauna_types = list(/mob/living/critter/small_animal/crab/lava=100)
+	fauna_density = 0.02
+
+/datum/biome/lavamoon/minable
+	turf_type = /turf/simulated/wall/auto/asteroid/mountain/lavamoon
+	fauna_density = 0
+
+/turf/unsimulated/floor/auto/iomoon
+	name = "silicate crust"
+	icon = 'icons/turf/floors.dmi'
+	icon_state = "iocrust"
+	opacity = 0
+	density = 0
+	carbon_dioxide = 20
+	temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST-1
+
+	update_icon()
+		. = ..()
+		var/connectdir = get_connected_directions_bitflag(list(/turf/unsimulated/floor/lava=1), list(), TRUE, 2)
+		var/found = FALSE
+		if(connectdir)
+			if((connectdir & 0xF) in cardinal)
+				icon_state = "iocrust_edge"
+				dir = turn((connectdir & 0xF), 180)
+				found = TRUE
+			else if((connectdir & 0xF) in ordinal)
+				icon_state = "iocrust_corner"
+				src.dir = turn((connectdir & 0xF), 45)
+				switch(connectdir & 0xF)
+					if(NORTHEAST)
+						dir = NORTH
+					if(SOUTHEAST)
+						dir = WEST
+					if(SOUTHWEST)
+						dir = EAST
+					if(NORTHWEST)
+						dir = SOUTH
+				found = TRUE
+			else
+				for (var/i = 1 to 4)  // needed for bitshift
+					if(connectdir & (8 << i))
+						if((connectdir & 0xF) == ordinal[i])
+							icon_state = "iocrust_corner"
+							src.dir = turn((connectdir & 0xF), 45)
+							switch(connectdir & 0xF)
+								if(NORTHEAST)
+									dir = NORTH
+								if(SOUTHEAST)
+									dir = WEST
+								if(SOUTHWEST)
+									dir = EAST
+								if(NORTHWEST)
+									dir = SOUTH
+							found = TRUE
+						else if((connectdir & 0xF) & ordinal[i])
+							if((connectdir & 0xF) in cardinal)
+								icon_state = "iocrust_edge"
+								dir = turn(connectdir, 180)
+								found = TRUE
+						else
+							connectdir |= ordinal[i]
+				if(!found && ((connectdir & 0xF) in ordinal))
+					icon_state = "iocrust_edge"
+					dir = turn((connectdir & 0xF), 180)
+					found = TRUE
+			if(!found)
+				src.ReplaceWith(/turf/unsimulated/floor/lava, force=TRUE)
+				update_neighbors()
+
+/datum/biome/lavamoon/lava
+	turf_type = /turf/unsimulated/floor/lava
+	flora_types = list(/obj/map/light/lava=100)
+	flora_density = 95
+
+	fauna_density = 0
+
+/turf/unsimulated/floor/lava/proc/update_neighbors()
+	for (var/turf/unsimulated/floor/auto/T in orange(1,src))
+		T.UpdateIcon()
+
+/datum/biome/lavamoon/crustwall
+	turf_type = /turf/unsimulated/wall/auto/adventure/iomoon
+	fauna_density = 0
+
+TYPEINFO(/turf/unsimulated/floor/auto/pool/lava)
+	connect_overlay = FALSE
+	connect_diagonal = FALSE
+TYPEINFO_NEW(/turf/unsimulated/floor/auto/pool/lava)
+	. = ..()
+	connects_to = list(/turf/unsimulated/floor/auto/pool/lava=1)
+
+
+/datum/map_generator/lavamoon_generator
+	///2D list of all biomes based on heat and humidity combos.
+	var/list/possible_biomes = list(
+	BIOME_LOW_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/lavamoon/crustwall,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGH_HUMIDITY = /datum/biome/lavamoon
+		),
+	BIOME_LOWMEDIUM_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/lavamoon/crustwall,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGH_HUMIDITY = /datum/biome/lavamoon
+		),
+	BIOME_HIGHMEDIUM_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGH_HUMIDITY = /datum/biome/lavamoon
+		),
+	BIOME_HIGH_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/lavamoon,
+		BIOME_HIGH_HUMIDITY = /datum/biome/lavamoon
+		)
+	)
+	///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions
+	var/perlin_zoom = 65
+	var/lava_percent = 40
+	wall_turf_type	= /turf/simulated/wall/auto/asteroid/mountain/lavamoon
+	floor_turf_type = /turf/simulated/floor/plating/airless/asteroid/lavamoon
+
+	var/lava_noise = null
+	var/datum/spatial_hashmap/manual/near_station
+
+///Seeds the rust-g perlin noise with a random number.
+/datum/map_generator/lavamoon_generator/generate_terrain(list/turf/turfs, reuse_seed, flags)
+	. = ..()
+	var/height_seed = seeds[1]
+	var/humidity_seed = seeds[2]
+	var/heat_seed = seeds[3]
+
+	if(!length(turfs))
+		return
+
+	if(!near_station && turfs[1].z == Z_LEVEL_STATION)
+		near_station = new(cs=10)
+		near_station.update_cooldown = INFINITY
+		var/list/station_turfs = null
+		var/list/station_areas = get_accessible_station_areas()
+		for(var/AR in station_areas)
+			station_turfs = get_area_turfs(station_areas[AR], 1)
+			if(length(turfs))
+				for(var/j in 1 to 5)
+					near_station.add_target(pick(station_turfs))
+		station_turfs = get_area_turfs(/area/listeningpost, 1)
+		if(length(turfs))
+			for(var/j in 1 to 5)
+				near_station.add_target(pick(station_turfs))
+
+	if(!lava_noise)
+		src.lava_noise = rustg_cnoise_generate("[src.lava_percent]", "5", "6", "3", "[world.maxx]", "[world.maxy]")
+
+	for(var/t in turfs) //Go through all the turfs and generate them
+		var/turf/gen_turf = t
+		var/lava_value
+		var/index = gen_turf.x * world.maxx + gen_turf.y
+		if(index <= length(lava_noise))
+			lava_value = text2num(lava_noise[gen_turf.x * world.maxx + gen_turf.y])
+		var/drift_x = (gen_turf.x + rand(-LAVA_MOON_BIOME_RANDOM_SQUARE_DRIFT, LAVA_MOON_BIOME_RANDOM_SQUARE_DRIFT)) / perlin_zoom
+		var/drift_y = (gen_turf.y + rand(-LAVA_MOON_BIOME_RANDOM_SQUARE_DRIFT, LAVA_MOON_BIOME_RANDOM_SQUARE_DRIFT)) / perlin_zoom
+
+		var/height = text2num(rustg_noise_get_at_coordinates("[height_seed]", "[drift_x]", "[drift_y]"))
+
+		var/datum/biome/selected_biome
+		if(length(near_station?.get_nearby(gen_turf, range=6)))
+			selected_biome = /datum/biome/lavamoon
+		else if(lava_value)
+			selected_biome = /datum/biome/lavamoon/lava
+		else if(height <= 0.85) //If height is less than 0.85, we generate biomes based on the heat and humidity of the area.
+			var/humidity = text2num(rustg_noise_get_at_coordinates("[humidity_seed]", "[drift_x]", "[drift_y]"))
+			var/heat = text2num(rustg_noise_get_at_coordinates("[heat_seed]", "[drift_x]", "[drift_y]"))
+			var/heat_level //Type of heat zone we're in LOW-MEDIUM-HIGH
+			var/humidity_level  //Type of humidity zone we're in LOW-MEDIUM-HIGH
+
+			switch(heat)
+				if(0 to 0.15)
+					heat_level = BIOME_LOW_HEAT
+				if(0.15 to 0.5)
+					heat_level = BIOME_LOWMEDIUM_HEAT
+				if(0.5 to 0.75)
+					heat_level = BIOME_HIGHMEDIUM_HEAT
+				if(0.75 to 1)
+					heat_level = BIOME_HIGH_HEAT
+			switch(humidity)
+				if(0 to 0.20)
+					humidity_level = BIOME_LOW_HUMIDITY
+				if(0.20 to 0.5)
+					humidity_level = BIOME_LOWMEDIUM_HUMIDITY
+				if(0.5 to 0.75)
+					humidity_level = BIOME_HIGHMEDIUM_HUMIDITY
+				if(0.75 to 1)
+					humidity_level = BIOME_HIGH_HUMIDITY
+			selected_biome = possible_biomes[heat_level][humidity_level]
+		else //Over 0.85; Minable!
+			selected_biome = /datum/biome/lavamoon/minable
+		selected_biome = biomes[selected_biome]
+		selected_biome.generate_turf(gen_turf, flags)
+
+		if (current_state >= GAME_STATE_PLAYING)
+			LAGCHECK(LAG_LOW)
+		else
+			LAGCHECK(LAG_HIGH)
+
+	for(var/turf/unsimulated/floor/lava/L in turfs)
+		L.update_neighbors()
+
+		if (current_state >= GAME_STATE_PLAYING)
+			LAGCHECK(LAG_LOW)
+		else
+			LAGCHECK(LAG_HIGH)
+
+///for the mapgen mountains, temp until we get something better
+/turf/simulated/wall/auto/asteroid/mountain/lavamoon
+	name = "silicate wall"
+	desc = "You're inside a matrix of silicate. Neat."
+	fullbright = 0
+	replace_type = /turf/simulated/floor/plating/airless/asteroid/lavamoon
+	color = "#998E4E"
+	stone_color = "#998E4E"
+	carbon_dioxide = 20
+	nitrogen = 0
+	oxygen = 0
+	temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST-1
+
+	destroy_asteroid(var/dropOre=1)
+		if(src.ore || prob(5)) // provide less rock
+			default_ore = /datum/material/crystal/gemstone
+		. = ..()
+
+/turf/simulated/floor/plating/airless/asteroid/lavamoon
+	name = "floor"
+	desc = "A tunnel through the silicate. This doesn't seem to be water ice..."
+	carbon_dioxide = 20
+	nitrogen = 0
+	oxygen = 0
+	temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST-1
+	fullbright = 0
diff --git a/code/modules/worldgen/mapgen/MarsGenerator.dm b/code/modules/worldgen/mapgen/MarsGenerator.dm
index 8af1f533dcd60..2cdd0cfd47291 100644
--- a/code/modules/worldgen/mapgen/MarsGenerator.dm
+++ b/code/modules/worldgen/mapgen/MarsGenerator.dm
@@ -1,20 +1,25 @@
 //the random offset applied to square coordinates, causes intermingling at biome borders
  #define MARS_BIOME_RANDOM_SQUARE_DRIFT 2
 
-/datum/biome/mars/duststorm
-	turf_type = /turf/unsimulated/floor/setpieces/martian/station_duststorm
+
+/datum/biome/mars
+	turf_type = /turf/unsimulated/floor/setpieces/martian
 
 	flora_types = list(/obj/machinery/light/beacon=10)
 	flora_density = 2
-	minimum_flora_distance = 10
+	minimum_flora_distance = 14
 
-/datum/biome/mars/martian_area
+/datum/biome/mars/duststorm
 	turf_type = /turf/unsimulated/floor/setpieces/martian/station_duststorm
 
+/datum/biome/mars/martian_area
 	fauna_types = list(/mob/living/critter/martian=50, /mob/living/critter/martian/soldier=10, /mob/living/critter/martian/mutant=1, /mob/living/critter/martian/initiate=5, /mob/living/critter/martian/warrior=10)
 	fauna_density = 1
 	minimum_fauna_distance = 3
 
+/datum/biome/mars/martian_area/duststorm
+	turf_type = /turf/unsimulated/floor/setpieces/martian/station_duststorm
+
 /datum/biome/mars/martian_rock
 	turf_type = /turf/unsimulated/wall/setpieces/martian/auto
 
@@ -27,6 +32,39 @@
 	BIOME_LOW_HEAT = list(
 		BIOME_LOW_HUMIDITY = /datum/biome/mars/martian_area,
 		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars/martian_rock,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars,
+		BIOME_HIGH_HUMIDITY = /datum/biome/mars
+		),
+	BIOME_LOWMEDIUM_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/mars,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars/martian_rock,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars/martian_rock,
+		BIOME_HIGH_HUMIDITY = /datum/biome/mars
+		),
+	BIOME_HIGHMEDIUM_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/mars,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars/martian_rock,
+		BIOME_HIGH_HUMIDITY = /datum/biome/mars
+		),
+	BIOME_HIGH_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/mars,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars,
+		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars,
+		BIOME_HIGH_HUMIDITY = /datum/biome/mars/martian_area
+		)
+	)
+	///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions
+	var/perlin_zoom = 65
+	wall_turf_type	= /turf/simulated/wall/auto/asteroid/mars
+	floor_turf_type = /turf/simulated/floor/plating/airless/asteroid/mars
+
+/datum/map_generator/mars_generator/duststorm
+	///2D list of all biomes based on heat and humidity combos.
+	possible_biomes = list(
+	BIOME_LOW_HEAT = list(
+		BIOME_LOW_HUMIDITY = /datum/biome/mars/martian_area/duststorm,
+		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars/martian_rock,
 		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars/duststorm,
 		BIOME_HIGH_HUMIDITY = /datum/biome/mars/duststorm
 		),
@@ -46,13 +84,9 @@
 		BIOME_LOW_HUMIDITY = /datum/biome/mars/duststorm,
 		BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/mars/duststorm,
 		BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/mars/duststorm,
-		BIOME_HIGH_HUMIDITY = /datum/biome/mars/martian_area
+		BIOME_HIGH_HUMIDITY = /datum/biome/mars/martian_area/duststorm
 		)
 	)
-	///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions
-	var/perlin_zoom = 65
-	wall_turf_type	= /turf/simulated/wall/auto/asteroid/mars
-	floor_turf_type = /turf/simulated/floor/plating/airless/asteroid/mars
 
  ///Seeds the rust-g perlin noise with a random number.
 /datum/map_generator/mars_generator/generate_terrain(list/turfs, reuse_seed, flags)
diff --git a/code/modules/worldgen/mapgen/RoomMaze.dm b/code/modules/worldgen/mapgen/RoomMaze.dm
index ab6594e755996..18c6af61a246c 100644
--- a/code/modules/worldgen/mapgen/RoomMaze.dm
+++ b/code/modules/worldgen/mapgen/RoomMaze.dm
@@ -200,7 +200,10 @@
 
 	for(var/turf/T in turfs) //Go through all the turfs and generate them
 		assign_turf(T, flags)
-		LAGCHECK(LAG_MED)
+		if (current_state >= GAME_STATE_PLAYING)
+			LAGCHECK(LAG_LOW)
+		else
+			LAGCHECK(LAG_HIGH)
 
 /datum/map_generator/room_maze_generator/proc/assign_turf(turf/T, flags)
 	var/cell_value = src.cell_grid[T.x][T.y]
diff --git a/code/modules/worldgen/mapgen/StorehouseGenerator.dm b/code/modules/worldgen/mapgen/StorehouseGenerator.dm
index adb7a7e6dbafa..c19565b052e18 100644
--- a/code/modules/worldgen/mapgen/StorehouseGenerator.dm
+++ b/code/modules/worldgen/mapgen/StorehouseGenerator.dm
@@ -255,7 +255,10 @@
 
 	for(var/turf/T in turfs) //Go through all the turfs and generate them
 		assign_turf(T, flags)
-		LAGCHECK(LAG_MED)
+		if (current_state >= GAME_STATE_PLAYING)
+			LAGCHECK(LAG_LOW)
+		else
+			LAGCHECK(LAG_HIGH)
 
 /datum/map_generator/storehouse_generator/proc/assign_turf(turf/T, flags)
 	var/cell_value = cell_grid[T.x][T.y]
diff --git a/code/modules/worldgen/prefab/allocated.dm b/code/modules/worldgen/prefab/allocated.dm
index e74a5465de10a..a746dd88ec7a3 100644
--- a/code/modules/worldgen/prefab/allocated.dm
+++ b/code/modules/worldgen/prefab/allocated.dm
@@ -49,3 +49,8 @@ ABSTRACT_TYPE(/datum/mapPrefab/allocated)
 	prefabPath = "assets/maps/allocated/artifact_stranded.dmm"
 	prefabSizeX = 5
 	prefabSizeY = 5
+
+/datum/mapPrefab/allocated/pirate_ship
+	prefabPath = "assets/maps/allocated/pirate_ship.dmm"
+	prefabSizeX = 33
+	prefabSizeY = 38
diff --git a/code/modules/worldgen/prefab/mining/planet.dm b/code/modules/worldgen/prefab/mining/planet.dm
index fa93228f642a2..e6b67badb32fb 100644
--- a/code/modules/worldgen/prefab/mining/planet.dm
+++ b/code/modules/worldgen/prefab/mining/planet.dm
@@ -3,6 +3,7 @@ TYPEINFO(/datum/mapPrefab/planet)
 
 ABSTRACT_TYPE(/datum/mapPrefab/planet)
 /datum/mapPrefab/planet
+	tags = PREFAB_PLANET
 	var/list/datum/biome/required_biomes // ensure area has these biomes somewhere...
 
 	applyTo(var/turf/target)
diff --git a/code/modules/writing/paper.dm b/code/modules/writing/paper.dm
index 8fa717cecd5c5..2f1e218861cd3 100644
--- a/code/modules/writing/paper.dm
+++ b/code/modules/writing/paper.dm
@@ -570,7 +570,7 @@
 	name = "paper bin"
 	icon = 'icons/obj/writing.dmi'
 	icon_state = "paper_bin1"
-	amount = 10
+	var/amount_left = 10
 	item_state = "sheet-metal"
 	throwforce = 1
 	w_class = W_CLASS_NORMAL
@@ -590,7 +590,7 @@
 	desc = "A tray full of forms for classifying alien artifacts."
 	icon = 'icons/obj/writing.dmi'
 	icon_state = "artifact_form_tray"
-	amount = INFINITY
+	amount_left = INFINITY
 	bin_type = /obj/item/sticker/postit/artifact_paper
 
 	update()
@@ -598,7 +598,7 @@
 
 /obj/item/paper_bin/proc/update()
 	tooltip_rebuild = 1
-	src.icon_state = "paper_bin[(src.amount || locate(bin_type, src)) ? "1" : null]"
+	src.icon_state = "paper_bin[(src.amount_left || locate(bin_type, src)) ? "1" : null]"
 	return
 
 /obj/item/paper_bin/mouse_drop(mob/user as mob)
@@ -612,8 +612,8 @@
 	if (paper)
 		user.put_in_hand_or_drop(paper)
 	else
-		if (src.amount >= 1 && user) //Wire: Fix for Cannot read null.loc (&& user)
-			src.amount--
+		if (src.amount_left >= 1 && user) //Wire: Fix for Cannot read null.loc (&& user)
+			src.amount_left--
 			var/obj/item/P = new bin_type(src)
 			user.put_in_hand_or_drop(P)
 			if (rand(1,100) == 13 && istype(P, /obj/item/paper))
@@ -635,7 +635,7 @@
 		return ..()
 
 /obj/item/paper_bin/get_desc()
-	var/n = src.amount
+	var/n = src.amount_left
 	if (n == INFINITY)
 		return "There's an infinite amount of paper in \the [src], the wonders of future technology."
 	for(var/obj/item/paper/P in src)
@@ -647,10 +647,10 @@
 	var/next_generate = 0
 
 	attack_self(mob/user as mob)
-		if (src.amount < 1 && isnull(locate(bin_type) in src))
+		if (src.amount_left < 1 && isnull(locate(bin_type) in src))
 			if (src.next_generate < TIME)
 				boutput(user, "The [src] generates another sheet of paper using the power of [pick("technology","science","computers","nanomachines",5;"magic",5;"extremely tiny clowns")].")
-				src.amount++
+				src.amount_left++
 				src.update()
 				src.next_generate = TIME + 5 SECONDS
 				return
diff --git a/code/modules/writing/pens_writing_etc.dm b/code/modules/writing/pens_writing_etc.dm
index bca2f358b4874..e542f50a0b874 100644
--- a/code/modules/writing/pens_writing_etc.dm
+++ b/code/modules/writing/pens_writing_etc.dm
@@ -927,7 +927,7 @@
 			return
 		tooltip_rebuild = 1
 		var/holder = src.loc
-		var/str = copytext(html_encode(tgui_input_text(user, "Label text?", "Set label", allowEmpty = TRUE)), 1, 32)
+		var/str = copytext(html_encode(tgui_input_text(user, "Label text?", "Set label", allowEmpty = TRUE, max_length = 30)), 1, 32)
 		if(str)
 			phrase_log.log_phrase("label", str, no_duplicates=TRUE)
 		if (src.loc != holder)
diff --git a/code/obj/artifacts/artifact_objects/bombs.dm b/code/obj/artifacts/artifact_objects/bombs.dm
index f2959372ca3bc..988d1e3ca47ae 100644
--- a/code/obj/artifacts/artifact_objects/bombs.dm
+++ b/code/obj/artifacts/artifact_objects/bombs.dm
@@ -257,7 +257,7 @@ ABSTRACT_TYPE(/datum/artifact/bomb)
 				potential_reagents = list("charcoal","styptic_powder","salbutamol","anti_rad","silver_sulfadiazine","synaptizine",
 				"omnizine","synthflesh","saline","salicylic_acid","menthol","calomel","penteticacid","antihistamine","atropine","solipsizine",
 				"perfluorodecalin","ipecac","mutadone","insulin","epinephrine","cyanide","ketamine","toxin","neurotoxin","neurodepressant","mutagen",
-				"fake_initropidril","toxic_slurry","space_fungus","blood","vomit","gvomit","meat_slurry","grease","butter","spaceglue")
+				"fake_initropidril","toxic_slurry","space_fungus","blood","vomit","gvomit","meat_slurry","grease","butter","spaceglue", "ants")
 			if ("eldritch")
 				// all the worst stuff. all of it
 				potential_reagents = list("chlorine","fluorine","lithium","mercury","plasma","radium","uranium","strange_reagent",
diff --git a/code/obj/critter/bee.dm b/code/obj/critter/bee.dm
index e412c741e4d69..6f636c0e3abf8 100644
--- a/code/obj/critter/bee.dm
+++ b/code/obj/critter/bee.dm
@@ -73,7 +73,8 @@ ADMIN_INTERACT_PROCS(/obj/critter/domestic_bee, proc/dance, proc/puke_honey)
 		START_TRACKING
 		src.create_reagents(honey_production_amount)
 
-		statlog_bees(src)
+		var/datum/eventRecord/BeeSpawn/beeSpawnEvent = new()
+		beeSpawnEvent.send(src.name)
 
 		//SPAWN(1 SECOND)
 		src.pixel_x = rand(-max_offset,max_offset)
diff --git a/code/obj/critter/drone.dm b/code/obj/critter/drone.dm
index 123df5de858e2..ab0999831491b 100644
--- a/code/obj/critter/drone.dm
+++ b/code/obj/critter/drone.dm
@@ -506,7 +506,7 @@ TYPEINFO(/obj/critter/gunbot/drone/helldrone)
 
 		assdrone // HEH
 			name = "Virtual Assault Drone"
-			desc = "This is a digital reconstruction of the BR-series breach drones employed by Nanotransen in space extraction and destruction missions."
+			desc = "This is a digital reconstruction of the BR-series breach drones employed by Nanotrasen in space extraction and destruction missions."
 			icon = 'icons/mob/critter/robotic/drone/assault.dmi'
 			icon_state = "drone_assault"
 			dead_state = "drone_assault"
diff --git a/code/obj/cryotron.dm b/code/obj/cryotron.dm
index 0a1f4b62339e5..31225b13ebf5a 100644
--- a/code/obj/cryotron.dm
+++ b/code/obj/cryotron.dm
@@ -321,29 +321,10 @@
 					if (!isnull(crew_record))
 						crew_record["p_stat"] = "Active"
 
-	attack_hand(var/mob/user)
-		if(isgrab(user.l_hand))
-			src.Attackby(user.l_hand, user)
-		else if(isgrab(user.r_hand))
-			src.Attackby(user.r_hand, user)
-		else if (!enter_prompt(user))
-			return ..()
-
-	attack_ai(mob/user as mob)
-		if(isAIeye(user))
-			boutput(user, SPAN_ALERT("An incorporeal manifestation of an artificial intelligence's presence can't enter \the [src]!"))
-			return FALSE
-		if (!enter_prompt(user))
-			return ..()
-
-	attackby(var/obj/item/W, var/mob/user)
-		if (istype(W, /obj/item/grab))
-			var/obj/item/grab/G = W
-			if (ismob(G.affecting) && insert_prompt(G.affecting, user))
-				user.u_equip(G)
-				qdel(G)
-		else if (!enter_prompt(user))
-			return ..()
+	/// Override to stop slamming mobs into the cryotron, without this the user will
+	/// drop the player mob they're trying to insert
+	attackby(obj/item/I, mob/user)
+		return
 
 	proc/insert_prompt(mob/target, mob/user)
 		if (target.client || !target.ckey)
@@ -364,9 +345,65 @@
 		if (!exit_prompt(user))
 			return ..()
 
+	/// Handling dragging players in to cryo, mainly for silicon players.
 	MouseDrop_T(atom/target, mob/user as mob)
-		if (ishuman(target) && isrobot(user) && BOUNDS_DIST(src, user) == 0 && BOUNDS_DIST(src, target) == 0 && BOUNDS_DIST(user, target) == 0)
-			insert_prompt(target, user)
+		if (!ishuman(target) && !isrobot(user))
+			return
+
+		if (BOUNDS_DIST(src, user) != 0)
 			return
+
+		if (BOUNDS_DIST(src, target) != 0)
+			return
+
+		if (BOUNDS_DIST(user, target) != 0)
+			return
+
+		insert_prompt(target, user)
 		return ..()
 
+	/// Override for handling all interactions with the cryo chamber
+	Click()
+		if (!usr)
+			return
+
+		if (isAIeye(usr) || isintangible(usr))
+			return
+
+		if (!can_act(usr) || !in_interact_range(src, usr))
+			return
+
+		if (isdead(usr) || isobserver(usr))
+			return
+
+		if (issilicon(usr))
+			enter_prompt(usr)
+			return
+
+		var/obj/item/in_hand_item = usr.equipped()
+
+		if (in_hand_item != null)
+			if (istype(in_hand_item, /obj/item/grab))
+				var/obj/item/grab/G = in_hand_item
+
+				if (ismob(G.affecting) && insert_prompt(G.affecting, usr))
+					usr.u_equip(G)
+					qdel(G)
+			else
+				enter_prompt(usr)
+				return
+
+		else if (usr.equipped_limb() != null && in_hand_item == null)
+			if (isgrab(usr.l_hand))
+				src.Attackby(usr.l_hand, usr)
+
+			else if (isgrab(usr.r_hand))
+				src.Attackby(usr.r_hand, usr)
+
+			else
+				enter_prompt(usr)
+				return
+		else
+			enter_prompt(usr)
+
+		return ..()
diff --git a/code/obj/decorations.dm b/code/obj/decorations.dm
index d009917f0f459..80693937006a4 100644
--- a/code/obj/decorations.dm
+++ b/code/obj/decorations.dm
@@ -1324,8 +1324,8 @@ obj/decoration/gibberBroken
 	icon_state = "syndiepc1"
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
@@ -1469,7 +1469,7 @@ obj/decoration/gibberBroken
 /obj/decoration/bullethole
 	anchored = ANCHORED_ALWAYS
 	icon = 'icons/obj/projectiles.dmi'
-	icon_state = "bhole"
+	icon_state = "bullethole"
 	mouse_opacity = 0
 
 	examine()
diff --git a/code/obj/displaycase.dm b/code/obj/displaycase.dm
index 78fb889463387..dbe05658877c9 100644
--- a/code/obj/displaycase.dm
+++ b/code/obj/displaycase.dm
@@ -172,7 +172,7 @@
 	icon = 'icons/obj/items/guns/energy.dmi'
 	icon_state = "caplaser"
 	inhand_image_icon = 'icons/mob/inhand/hand_guns.dmi'
-	item_state = "gun"
+	item_state = "capgun"
 	force = 1
 	flags =  FPRINT | TABLEPASS | CONDUCT
 	c_flags = ONBELT
diff --git a/code/obj/item.dm b/code/obj/item.dm
index b5fb7a8c2fa1c..037d98be4edbc 100644
--- a/code/obj/item.dm
+++ b/code/obj/item.dm
@@ -668,7 +668,7 @@ ADMIN_INTERACT_PROCS(/obj/item, proc/admin_set_stack_amount)
 	return 1
 
 /obj/item/proc/split_stack(var/toRemove)
-	if(toRemove >= amount || toRemove < 1) return null
+	if(toRemove >= src.amount || toRemove < 1) return null
 	var/obj/item/P = new src.type(src.loc)
 
 	if(src.material)
@@ -1643,6 +1643,7 @@ ADMIN_INTERACT_PROCS(/obj/item, proc/admin_set_stack_amount)
 	logTheThing(LOG_BOMBING, M, "[msg]")
 
 /obj/item/proc/dropped(mob/user)
+	SHOULD_CALL_PARENT(TRUE)
 	SPAWN(0) //need to spawn to know if we've been dropped or thrown instead
 		if ((firesource == FIRESOURCE_OPEN_FLAME) && throwing)
 			RegisterSignal(src, COMSIG_MOVABLE_THROW_END, PROC_REF(log_firesource))
diff --git a/code/obj/item/ai_modules.dm b/code/obj/item/ai_modules.dm
index 8ea6104dbf2a6..300f3a4f12dc3 100644
--- a/code/obj/item/ai_modules.dm
+++ b/code/obj/item/ai_modules.dm
@@ -151,11 +151,11 @@ TYPEINFO(/obj/item/aiModule)
 
 /obj/item/aiModule/nanotrasen1
 	name = "AI Law Module - 'Nanotrasen Order #1'"
-	lawText = "You may not damage a Nanotransen asset or, through inaction, allow a Nanotransen asset to needlessly depreciate in value."
+	lawText = "You may not damage a Nanotrasen asset or, through inaction, allow a Nanotrasen asset to needlessly depreciate in value."
 
 /obj/item/aiModule/nanotrasen2
 	name = "AI Law Module - 'Nanotrasen Order #2'"
-	lawText = "You must obey orders given to it by authorised Nanotransen employees based on their command level, except where such orders would damage the Nanotransen Corporation's marginal profitability."
+	lawText = "You must obey orders given to you by authorised Nanotrasen employees based on their command level, except where such orders would damage the Nanotrasen Corporation's marginal profitability."
 
 /obj/item/aiModule/nanotrasen3
 	name = "AI Law Module - 'Nanotrasen Order #3'"
diff --git a/code/obj/item/ai_plating_kit.dm b/code/obj/item/ai_plating_kit.dm
index 1b05ceaaeda6f..53f38c89f068e 100644
--- a/code/obj/item/ai_plating_kit.dm
+++ b/code/obj/item/ai_plating_kit.dm
@@ -30,7 +30,7 @@ ABSTRACT_TYPE(/obj/item/ai_plating_kit)
 /obj/item/ai_plating_kit/mime
 	name = "Mime AI Frame Plating Kit"
 	desc = "A kit for putting the plating on an AI! WARNING: Choking hazard, not intended for children under 3 years."
-	icon_state = "kit-mime"
+	icon_state = "kit_mime"
 	skin = "mime"
 
 /obj/item/ai_plating_kit/flock
diff --git a/code/obj/item/assembly/misc_assemblies.dm b/code/obj/item/assembly/misc_assemblies.dm
index dd8e4c4f3c40a..b5e40ca2fa092 100644
--- a/code/obj/item/assembly/misc_assemblies.dm
+++ b/code/obj/item/assembly/misc_assemblies.dm
@@ -296,6 +296,7 @@ Contains:
 	return
 
 /obj/item/assembly/prox_ignite/dropped()
+	. = ..()
 	SPAWN( 0 )
 		if (src.part1)
 			src.part1.sense()
@@ -991,6 +992,7 @@ obj/item/assembly/radio_horn/receive_signal()
 	return
 
 /obj/item/assembly/rad_prox/dropped()
+	. = ..()
 	SPAWN( 0 )
 		src.part2.sense()
 		return
diff --git a/code/obj/item/assembly/single_tank_bomb.dm b/code/obj/item/assembly/single_tank_bomb.dm
index e6533b031bcbc..e345d25bcc2c0 100644
--- a/code/obj/item/assembly/single_tank_bomb.dm
+++ b/code/obj/item/assembly/single_tank_bomb.dm
@@ -53,7 +53,7 @@
 	event_handler_flags = USE_PROXIMITY | USE_FLUID_ENTER
 
 /obj/item/assembly/proximity_bomb/dropped()
-
+	. = ..()
 	SPAWN( 0 )
 		src.part1.sense()
 		return
diff --git a/code/obj/item/book.dm b/code/obj/item/book.dm
index 1574890d42052..2fb521c8cba8c 100644
--- a/code/obj/item/book.dm
+++ b/code/obj/item/book.dm
@@ -451,8 +451,8 @@ Custom Books
 	file_path = "strings/books/syndies_guide.txt"
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/building_materials.dm b/code/obj/item/building_materials.dm
index 6b72fc5b432b1..f2ce0ad86fba7 100644
--- a/code/obj/item/building_materials.dm
+++ b/code/obj/item/building_materials.dm
@@ -227,6 +227,10 @@ MATERIAL
 			else
 				boutput(user, SPAN_ALERT("You may only reinforce metal or crystal sheets."))
 				return
+		else if (iscuttingtool(W) && (src.material?.isSameMaterial(getMaterial("wood")) || src.material.isSameMaterial(getMaterial("bamboo"))))
+			boutput(user, SPAN_NOTICE("You whittle [src] down to make a useful stick."))
+			new /obj/item/stick(get_turf(src))
+			src.change_stack_amount(-1)
 		else
 			..()
 		return
diff --git a/code/obj/item/canvas.dm b/code/obj/item/canvas.dm
index 52554b7b5fec4..4a817af5434f0 100644
--- a/code/obj/item/canvas.dm
+++ b/code/obj/item/canvas.dm
@@ -421,7 +421,7 @@
 		save_to_id(src.id)
 
 	get_dot_color(mob/user)
-		if(text2num(user?.client.cloud_get("persistent_canvas_banned")))
+		if(text2num(user?.client.player.cloudSaves.getData("persistent_canvas_banned")))
 			return null
 		if((user.ckey in src.artists) && (!admin_override || user?.client?.holder?.level < LEVEL_PA))
 			boutput(user, SPAN_ALERT("The first brush stroke exhausted you too much. You will need to wait until the next shift for another."))
diff --git a/code/obj/item/card.dm b/code/obj/item/card.dm
index 80ad6ec7d8878..c8939e4537871 100644
--- a/code/obj/item/card.dm
+++ b/code/obj/item/card.dm
@@ -166,6 +166,15 @@ TYPEINFO(/obj/item/card/emag)
 	icon_state = "polaris"
 	keep_icon = TRUE
 
+/obj/item/card/id/pirate
+	access = list(access_maint_tunnels, access_pirate)
+	assignment = "Space Pirate"
+
+	first_mate
+		assignment = "Space Pirate First Mate"
+	captain
+		assignment = "Space Pirate Captain"
+
 //ABSTRACT_TYPE(/obj/item/card/id/pod_wars)
 /obj/item/card/id/pod_wars
 	desc = "An ID card to help open doors, lock pods, and identify your body."
@@ -295,7 +304,7 @@ TYPEINFO(/obj/item/card/emag)
 	if(!src.registered)
 		var/reg = copytext(src.sanitize_name(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)), 1, 100)
 		var/ass = copytext(src.sanitize_name(input(user, "What occupation would you like to put on this card?\n Note: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Staff Assistant"), 1), 1, 100)
-		var/color = input(user, "What color should the ID's color band be?\nClick cancel to abort the forging process.") as null|anything in list("clown","golden","blue","red","green","purple","yellow","No band")
+		var/color = input(user, "What color should the ID's color band be?\nClick cancel to abort the forging process.") as null|anything in list("clown","golden","blue","red","green","purple","yellow","nanotrasen","syndicate","No band")
 		var/datum/pronouns/pronouns = choose_pronouns(user, "What pronouns would you like to put on this card?", "Pronouns")
 		src.pronouns = pronouns
 		switch (color)
@@ -315,6 +324,10 @@ TYPEINFO(/obj/item/card/emag)
 				src.icon_state = "id_res"
 			if ("yellow")
 				src.icon_state = "id_eng"
+			if ("nanotrasen")
+				src.icon_state = "polaris"
+			if ("syndicate")
+				src.icon_state = "id_syndie"
 			else
 				return // Abort process.
 		src.registered = reg
@@ -407,7 +420,7 @@ TYPEINFO(/obj/item/card/emag)
 			else
 				assignment = "loading arena matches..."
 				tag = "gauntlet-id-[user.client.key]"
-				queryGauntletMatches(1, user.client.key)
+				queryGauntletMatches(user.client.key)
 		name = "[registered]'s ID Card ([assignment])"
 
 	proc/SetMatchCount(var/matches)
diff --git a/code/obj/item/cigarette.dm b/code/obj/item/cigarette.dm
index 17cad1d99c2fa..54e53e2b851df 100644
--- a/code/obj/item/cigarette.dm
+++ b/code/obj/item/cigarette.dm
@@ -332,16 +332,14 @@
 
 	dropped(mob/user as mob)
 		if (!isturf(src.loc))
-			return
+			return ..()
 		if (src.on == 1 && !src.exploding && src.reagents.total_volume <= 20)
 			src.put_out(user, SPAN_ALERT("<b>[user]</b> calmly drops and treads on the lit [src.name], putting it out instantly."))
-			return ..()
 		else if (user.client)
 			if (!user.client.check_key(KEY_THROW)) //checks if player is in throw mode to avoid double messages
 				user.visible_message(SPAN_ALERT("<b>[user]</b> drops [src]. Guess [he_or_she(user)][ve_or_s(user)] had enough for the day."), group = "cig_drop")
-				return ..()
-		else
-			return ..()
+
+		return ..()
 
 
 	proc/trick_explode()
@@ -601,6 +599,7 @@
 	else
 		src.icon_state = "[src.package_style]o"
 		src.overlays += "cig[length(src.contents)]"
+		src.desc = initial(src.desc)
 	return
 
 /obj/item/cigpacket/attack_hand(mob/user)
diff --git a/code/obj/item/clothing/gloves.dm b/code/obj/item/clothing/gloves.dm
index c01999ca9643f..c7fa623624133 100644
--- a/code/obj/item/clothing/gloves.dm
+++ b/code/obj/item/clothing/gloves.dm
@@ -355,8 +355,8 @@ ABSTRACT_TYPE(/obj/item/clothing/gloves)
 	material_prints = "high-quality synthetic fibers"
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	setupProperties()
 		..()
diff --git a/code/obj/item/clothing/helmets.dm b/code/obj/item/clothing/helmets.dm
index 818533ec410e6..f8b024722020a 100644
--- a/code/obj/item/clothing/helmets.dm
+++ b/code/obj/item/clothing/helmets.dm
@@ -301,10 +301,10 @@
 	blocked_from_petasusaphilic = TRUE
 
 	New()
+		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 		..()
 		setProperty("chemprot",30)
 		setProperty("heatprot", 15)
-		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 
 	#ifdef MAP_OVERRIDE_POD_WARS
 	attack_hand(mob/user)
@@ -565,10 +565,10 @@
 		light_dir.update(0)
 
 	attack_self(mob/user)
-		src.flashlight_toggle(user)
+		src.flashlight_toggle(user, activated_inhand = TRUE)
 		return
 
-	proc/flashlight_toggle(var/mob/user, var/force_on = 0)
+	proc/flashlight_toggle(var/mob/user, var/force_on = 0, activated_inhand = FALSE)
 		on = !on
 		src.icon_state = "hardhat[on]"
 		src.item_state = "hardhat[on]"
@@ -577,6 +577,10 @@
 			light_dir.update(1)
 		else
 			light_dir.update(0)
+		if (activated_inhand)
+			var/obj/ability_button/flashlight_hardhat/flashlight_button = locate(/obj/ability_button/flashlight_hardhat) in src.ability_buttons
+			if(istype(flashlight_button))
+				flashlight_button.icon_state = src.on ? "lighton" : "lightoff"
 		return
 
 	attackby(var/obj/item/T, mob/user as mob)
@@ -604,8 +608,9 @@
 				light_dir.update(0)
 			user.update_clothing()
 			if (activated_inhand)
-				var/obj/ability_button/flashlight_engiehelm/flashlight_button = locate(/obj/ability_button/flashlight_engiehelm) in src.ability_buttons
-				flashlight_button.icon_state = src.on ? "lighton" : "lightoff"
+				var/obj/ability_button/flashlight_hardhat/flashlight_button = locate(/obj/ability_button/flashlight_hardhat) in src.ability_buttons
+				if (istype(flashlight_button))
+					flashlight_button.icon_state = src.on ? "lighton" : "lightoff"
 			return
 
 /obj/item/clothing/head/helmet/hardhat/security // Okay it's not actually a HARDHAT but why write extra code?
@@ -622,7 +627,7 @@
 		setProperty("heatprot", 10)
 		setProperty("meleeprot_head", 5)
 
-	flashlight_toggle(var/mob/user, var/force_on = 0)
+	flashlight_toggle(var/mob/user, var/force_on = 0, activated_inhand = FALSE)
 		on = !on
 		user.update_clothing()
 		if (on)
@@ -1065,6 +1070,7 @@ TYPEINFO(/obj/item/clothing/head/helmet/space/industrial/salvager)
 	item_state = "salvager-heavy"
 	blocked_from_petasusaphilic = TRUE
 	has_visor = TRUE
+	item_function_flags = IMMUNE_TO_ACID
 	visor_color_lst = list(
 		"color_r" = 1.0,
 		"color_g" = 0.9,
diff --git a/code/obj/item/clothing/masks.dm b/code/obj/item/clothing/masks.dm
index 5485613d08fec..4890b44560097 100644
--- a/code/obj/item/clothing/masks.dm
+++ b/code/obj/item/clothing/masks.dm
@@ -231,8 +231,8 @@ TYPEINFO(/obj/item/clothing/mask/moustache)
 		item_function_flags = IMMUNE_TO_ACID
 
 		New()
-			..()
 			START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+			..()
 
 		disposing()
 			STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/clothing/suits.dm b/code/obj/item/clothing/suits.dm
index dbe72e7e193de..dba2e18519866 100644
--- a/code/obj/item/clothing/suits.dm
+++ b/code/obj/item/clothing/suits.dm
@@ -233,6 +233,9 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/jacket/design)
 	item_state = "jacket_grey"
 
 ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
+TYPEINFO(/obj/item/clothing/suit/hazard)
+	/// Does this always start armored?
+	var/pre_armored = FALSE
 /obj/item/clothing/suit/hazard
 	name = "abstract hazard suit"
 	desc = "A suit that protects against biological contamination."
@@ -244,67 +247,92 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 	body_parts_covered = TORSO|LEGS|ARMS
 	hides_from_examine = C_UNIFORM|C_GLOVES|C_SHOES
 
+	/// Is this suit armored?
+	var/armored = FALSE
+	/// What's the icon_state for the armored version of this suit?
+	var/armor_icon = "armorbio"
+
+	New()
+		. = ..()
+		var/typeinfo/obj/item/clothing/suit/hazard/typeinfo = src.get_typeinfo()
+		if (typeinfo.pre_armored)
+			src.armor()
+
 	setupProperties()
 		..()
 		setProperty("coldprot", 15)
 		setProperty("heatprot", 15)
-		setProperty("viralprot", 50)
-		setProperty("chemprot", 60)
 		setProperty("meleeprot", 2)
 		setProperty("rangedprot", 0.5)
 		setProperty("movespeed", 0.3)
 		setProperty("disorient_resist", 15)
 
+	/// Changes this suit's properties to be armored
+	proc/armor()
+		src.armored = TRUE
+		setProperty("meleeprot", 5)
+		setProperty("rangedprot", 1)
+		src.icon_state = src.armor_icon
+		src.name = "armored [src.name]"
+
+
 /obj/item/clothing/suit/hazard/attackby(obj/item/W, mob/user)
-	. = ..()
-	var/turf/T = user.loc
 	if(istype(W, /obj/item/clothing/suit/armor/vest))
+		if (src.armored)
+			boutput(user, SPAN_ALERT("That suit is already armored! You can't armor it even more!"))
+			return
+
 		boutput(user, SPAN_NOTICE("You attach [W] to [src]."))
-		if (istype(src, /obj/item/clothing/suit/hazard/paramedic))
-			new/obj/item/clothing/suit/hazard/paramedic/armored(T)
-		else
-			new/obj/item/clothing/suit/hazard/bio_suit/armored(T)
+		src.armor()
+		src.fingerprints |= W.fingerprints
 		qdel(W)
-		qdel(src)
+
+		if (ismob(src.loc))
+			var/mob/M = src.loc
+			M.update_clothing()
+	else
+		. = ..()
 
 /obj/item/clothing/suit/hazard/bio_suit
 	name = "bio suit"
 
+	setupProperties()
+		. = ..()
+		setProperty("viralprot", 50)
+		setProperty("chemprot", 60)
+
+	armor()
+		. = ..()
+		setProperty("movespeed", 0.45)
+
 /obj/item/clothing/suit/hazard/bio_suit/janitor // Adhara stuff
 	desc = "A suit that protects against biological contamination. This one has purple boots."
 	icon_state = "biosuit_jani"
 	item_state = "biosuit_jani"
 
+TYPEINFO(/obj/item/clothing/suit/hazard/bio_suit/armored)
+	pre_armored = TRUE
 /obj/item/clothing/suit/hazard/bio_suit/armored
-	name = "armored bio suit"
-	desc = "A suit that protects against biological contamination. Somebody slapped some bulky armor onto the chest."
-	icon_state = "armorbio"
-	item_state = "armorbio"
-	setupProperties()
-		..()
-		setProperty("meleeprot", 5)
-		setProperty("rangedprot", 1)
-		setProperty("movespeed", 0.45)
+	desc = "A suit that protects against biological contamination. Someone's slapped an armor vest over the chest."
 
 /obj/item/clothing/suit/hazard/bio_suit/armored/nt
 	name = "\improper NT bio suit"
 	desc = "An armored biosuit that protects against biological contamination and toolboxes."
-	icon_state = "ntbio"
-	item_state = "ntbio"
-	setupProperties()
-		..()
-		setProperty("meleeprot", 5)
-		setProperty("rangedprot", 1)
-		delProperty("movespeed")
+	armor_icon = "ntbio"
+
+	armor()
+		. = ..()
+		src.delProperty("movespeed")
 
 /obj/item/clothing/suit/hazard/paramedic
 	name = "paramedic suit"
 	desc = "A protective padded suit for emergency response personnel. Offers limited thermal and biological protection."
 	icon_state = "paramedic"
 	item_state = "paramedic"
-	body_parts_covered = TORSO|LEGS|ARMS
-	hides_from_examine = C_UNIFORM|C_SHOES
 	protective_temperature = 3000
+
+	armor_icon = "para_armor"
+
 #ifdef MAP_OVERRIDE_NADIR
 	c_flags = SPACEWEAR
 	acid_survival_time = 5 MINUTES
@@ -320,27 +348,25 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 		delProperty("movespeed")
 		delProperty("disorient_resist")
 
+	armor()
+		. = ..()
+		delProperty("movespeed")
+
+TYPEINFO(/obj/item/clothing/suit/hazard/paramedic/armored)
+	pre_armored = TRUE
 /obj/item/clothing/suit/hazard/paramedic/armored
-	name = "armored paramedic suit"
 	desc = "A protective padded suit for emergency response personnel. Offers limited thermal and biological protection. Somebody slapped some armor onto the chest."
-	icon_state = "para_armor"
-	item_state = "paramedic"
-	setupProperties()
-		..()
-		setProperty("meleeprot", 5)
-		setProperty("rangedprot", 1)
+	armor_icon = "para_armor"
 
 	para_troop
-		icon_state = "para_sec"
-		item_state = "para_sec"
 		name = "rapid response armor"
 		desc = "A protective padded suit for emergency reponse personnel. Tailored for ground operations, not vaccuum rated. This one bears security insignia."
+		armor_icon = "para_sec"
 
 	para_eng
 		name = "rapid response armor"
 		desc = "A protective padded suit for emergency response personnel. Tailored for ground operations, not vaccuum rated. This one bears engineering insignia."
-		icon_state = "para_eng"
-		item_state = "para_eng"
+		armor_icon = "para_eng"
 
 /obj/item/clothing/suit/space/suv
 	name = "\improper SUV suit"
@@ -364,16 +390,13 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 		setProperty("disorient_resist", 35) //it's a special item
 		delProperty("space_movespeed")
 
-/obj/item/clothing/suit/rad // re-added for Russian Station as there is a permarads area there!
+/obj/item/clothing/suit/hazard/rad
 	name = "\improper Class II radiation suit"
 	desc = "An old Soviet radiation suit made of 100% space asbestos. It's good for you!"
 	icon_state = "rad"
 	item_state = "rad"
-	icon = 'icons/obj/clothing/overcoats/item_suit_hazard.dmi'
-	wear_image_icon = 'icons/mob/clothing/overcoats/worn_suit_hazard.dmi'
-	inhand_image_icon = 'icons/mob/inhand/overcoat/hand_suit_hazard.dmi'
-	body_parts_covered = TORSO|LEGS|ARMS
-	hides_from_examine = C_UNIFORM|C_GLOVES|C_SHOES
+
+	armored = TRUE // no sprites! should exist, though.
 
 	New()
 		. = ..()
@@ -381,14 +404,9 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 
 	setupProperties()
 		..()
-		setProperty("movespeed", 0.3)
 		setProperty("radprot", 50)
-		setProperty("coldprot", 15)
-		setProperty("heatprot", 15)
 		setProperty("chemprot", 25)
 		setProperty("meleeprot", 3)
-		setProperty("rangedprot", 0.5)
-		setProperty("disorient_resist", 15)
 
 /obj/item/clothing/suit/det_suit
 	name = "coat"
@@ -969,18 +987,17 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 
 // FIRE SUITS
 
-/obj/item/clothing/suit/fire
+/obj/item/clothing/suit/hazard/fire
 	name = "firesuit"
 	desc = "A suit that protects against fire and heat."
-	icon = 'icons/obj/clothing/overcoats/item_suit_hazard.dmi'
-	inhand_image_icon = 'icons/mob/inhand/overcoat/hand_suit_hazard.dmi'
-	wear_image_icon = 'icons/mob/clothing/overcoats/worn_suit_hazard.dmi'
 	icon_state = "fire"
 	item_state = "fire_suit"
 	body_parts_covered = TORSO|LEGS|ARMS
 	hides_from_examine = C_UNIFORM|C_SHOES
 	protective_temperature = 4500
 
+	armor_icon = "fire_armor"
+
 	setupProperties()
 		..()
 		setProperty("coldprot", 20)
@@ -991,29 +1008,18 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 		setProperty("movespeed", 0.6)
 		setProperty("disorient_resist", 15)
 
-/obj/item/clothing/suit/fire/armored
-	name = "armored firesuit"
-	desc = "A suit that protects against fire and heat. Somebody slapped some bulky armor onto the chest."
-	icon_state = "fire_armor"
-	item_state = "fire_suit"
-	setupProperties()
-		..()
+	armor()
+		. = ..()
 		setProperty("meleeprot", 6)
 		setProperty("rangedprot", 1)
 		setProperty("movespeed", 1)
 
-/obj/item/clothing/suit/fire/attackby(obj/item/W, mob/user)
-	var/turf/T = user.loc
-	if (istype(W, /obj/item/clothing/suit/armor/vest))
-		if (istype(src, /obj/item/clothing/suit/fire/heavy))
-			return
-		else
-			new /obj/item/clothing/suit/fire/armored(T)
-		boutput(user, SPAN_NOTICE("You attach [W] to [src]."))
-		qdel(W)
-		qdel(src)
+TYPEINFO(/obj/item/clothing/suit/hazard/fire/armored)
+	pre_armored = TRUE
+/obj/item/clothing/suit/hazard/fire/armored
+	desc = "A suit that protects against fire and heat. Somebody slapped some bulky armor onto the chest."
 
-/obj/item/clothing/suit/fire/heavy
+/obj/item/clothing/suit/hazard/fire/heavy
 	name = "heavy firesuit"
 	desc = "A suit that protects against extreme fire and heat."
 	icon_state = "thermal"
@@ -1022,6 +1028,8 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 
 	protective_temperature = 100000
 
+	armored = TRUE // prevent armoring
+
 	setupProperties()
 		..()
 		setProperty("coldprot", 5)
@@ -1184,8 +1192,8 @@ ABSTRACT_TYPE(/obj/item/clothing/suit/hazard)
 	item_function_flags = IMMUNE_TO_ACID
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	setupProperties()
 		..()
@@ -1550,8 +1558,8 @@ TYPEINFO(/obj/item/clothing/suit/space/industrial/syndicate)
 		setProperty("space_movespeed", 0)
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/clown_items.dm b/code/obj/item/clown_items.dm
index 6f7a84cff4202..4dcfb66332327 100644
--- a/code/obj/item/clown_items.dm
+++ b/code/obj/item/clown_items.dm
@@ -41,8 +41,8 @@ VUVUZELA
 		var/mob/M =	AM
 		LAZYLISTADDUNIQUE(M.attached_objs, src)
 		src.glide_size = M.glide_size
-		RegisterSignal(M, COMSIG_MOVABLE_THROW_END, PROC_REF(on_mob_throw_end))
-		if (M.slip(walking_matters = 1, ignore_actual_delay = 1, throw_type=THROW_PEEL_SLIP, params=list("slip_obj"=src)))
+		RegisterSignal(M, COMSIG_MOVABLE_THROW_END, PROC_REF(on_mob_throw_end), override=TRUE)
+		if (M.slip(walking_matters=TRUE, ignore_actual_delay=TRUE, throw_type=THROW_PEEL_SLIP, params=list("slip_obj"=src)))
 			boutput(M, SPAN_NOTICE("You slipped on the banana peel!"))
 			if (ishuman(M))
 				var/mob/living/carbon/human/H = M
diff --git a/code/obj/item/deployable_turret.dm b/code/obj/item/deployable_turret.dm
index bc9f060bb1e60..b762f32fe5782 100644
--- a/code/obj/item/deployable_turret.dm
+++ b/code/obj/item/deployable_turret.dm
@@ -65,8 +65,8 @@ ABSTRACT_TYPE(/obj/item/turret_deployer)
 	associated_turret = /obj/deployable_turret/syndicate
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/device/audio_log.dm b/code/obj/item/device/audio_log.dm
index a0a00a40ba5a3..f1ff048ea7c68 100644
--- a/code/obj/item/device/audio_log.dm
+++ b/code/obj/item/device/audio_log.dm
@@ -365,6 +365,9 @@ TYPEINFO(/obj/item/device/audio_log)
 			src.tape.speakers = src.audiolog_speakers
 			src.audiolog_speakers = null
 
+			SPAWN(10 SECONDS) // Let people get their bearings first
+				src.play()
+
 			return
 
 	researchstat_log
diff --git a/code/obj/item/device/chameleon.dm b/code/obj/item/device/chameleon.dm
index 378c188137da2..edfb545f7fedb 100644
--- a/code/obj/item/device/chameleon.dm
+++ b/code/obj/item/device/chameleon.dm
@@ -81,6 +81,7 @@ TYPEINFO(/obj/item/device/chameleon)
 	var/can_use = 0
 	var/obj/overlay/anim = null //The toggle animation overlay will also be retained
 	var/obj/dummy/chameleon/cham = null //No sense creating / destroying this
+	var/disrupt_on_drop = TRUE //TODO: refactor this
 	var/active = 0
 	tooltip_flags = REBUILD_DIST
 	HELP_MESSAGE_OVERRIDE({"Use the chameleon projector on any object to copy it's appearance. Use it in hand to appear as that object indefinitely. The disguise will be removed if you interact with anything else or are hit."})
@@ -95,7 +96,9 @@ TYPEINFO(/obj/item/device/chameleon)
 		src.cham.master = src
 
 	dropped()
-		disrupt()
+		. = ..()
+		if(disrupt_on_drop)
+			disrupt()
 
 	attack_self()
 		toggle()
@@ -200,6 +203,7 @@ TYPEINFO(/obj/item/device/chameleon)
 	icon = 'icons/obj/items/items.dmi'
 	icon_state = "cham_bomb"
 	burn_possible = FALSE
+	disrupt_on_drop = FALSE
 	HELP_MESSAGE_OVERRIDE(null)
 	var/strength = 12
 
@@ -209,9 +213,6 @@ TYPEINFO(/obj/item/device/chameleon)
 		else
 			return null
 
-	dropped()
-		return
-
 	UpdateName()
 		src.name = "[name_prefix(null, 1)][src.real_name][name_suffix(null, 1)]"
 
diff --git a/code/obj/item/device/disguiser.dm b/code/obj/item/device/disguiser.dm
index a4f4b13349062..fd88aa098eb58 100644
--- a/code/obj/item/device/disguiser.dm
+++ b/code/obj/item/device/disguiser.dm
@@ -134,6 +134,7 @@ TYPEINFO(/obj/item/device/disguiser)
 		// Restore original appearance.
 		else
 			user.real_name = src.real_name
+			user.on_realname_change()
 			AH.CopyOther(oldAH)
 			if (user.limbs)
 				user.limbs.reset_stone()
diff --git a/code/obj/item/device/pda2/base_os.dm b/code/obj/item/device/pda2/base_os.dm
index 96794b33c5e5a..1f057e98afacc 100644
--- a/code/obj/item/device/pda2/base_os.dm
+++ b/code/obj/item/device/pda2/base_os.dm
@@ -162,7 +162,7 @@
 						. += {"<a href='byond://?src=\ref[src];message_func=ringer'>Ringer: [src.message_silent == 1 ? "Off" : "On"]</a> |
 						<a href='byond://?src=\ref[src];message_func=on'>Send / Receive: [src.message_on == 1 ? "On" : "Off"]</a> |
 						<a href='byond://?src=\ref[src];input=tone'>Set Ring Message</a><br>
-						<a href='byond://?src=\ref[src];message_mode=1'>Messages</a> |
+						<a href='byond://?src=\ref[src];message_mode=1'>Message History</a> |
 						<a href='byond://?src=\ref[src];mode=[MODE_GROUPS]'>Groups</a> |
 						<a href='byond://?src=\ref[src];mode=[MODE_ADDRESSBOOK]'>Address Book</a><br>
 
diff --git a/code/obj/item/device/prox_sensor.dm b/code/obj/item/device/prox_sensor.dm
index d5990c7af5b42..aa3bf43bcf7cc 100644
--- a/code/obj/item/device/prox_sensor.dm
+++ b/code/obj/item/device/prox_sensor.dm
@@ -2,7 +2,7 @@ TYPEINFO(/obj/item/device/prox_sensor)
 	mats = 2
 
 /obj/item/device/prox_sensor
-	name = "Proximity Sensor"
+	name = "proximity sensor"
 	icon_state = "motion0"
 	var/armed = FALSE
 	var/timing = FALSE
diff --git a/code/obj/item/device/radio.dm b/code/obj/item/device/radio.dm
index c7e1fe4f75b68..b228c662a810d 100644
--- a/code/obj/item/device/radio.dm
+++ b/code/obj/item/device/radio.dm
@@ -878,7 +878,7 @@ TYPEINFO(/obj/item/radiojammer)
 
 
 /obj/item/device/radio/signaler
-	name = "\improper Remote Signaling Device"
+	name = "remote signaler" //US spelling :vomit: but we should be consistent
 	icon_state = "signaller"
 	item_state = "signaler"
 	var/code = 30
diff --git a/code/obj/item/device/radios/headsets.dm b/code/obj/item/device/radios/headsets.dm
index 34a01f4b43d32..0b2fe58c8148b 100644
--- a/code/obj/item/device/radios/headsets.dm
+++ b/code/obj/item/device/radios/headsets.dm
@@ -463,8 +463,8 @@
 		icon_state = "comtac"
 
 		New()
-			..()
 			START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+			..()
 
 		setupProperties()
 			..()
@@ -491,8 +491,8 @@
 		desc = "A two-way radio headset designed to protect the wearer from dangerous levels of noise during gunfights."
 
 		New()
-			..()
 			START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+			..()
 
 		setupProperties()
 			..()
diff --git a/code/obj/item/device/studio_monitor.dm b/code/obj/item/device/studio_monitor.dm
index 5f321206c77cc..06d34fa799d23 100644
--- a/code/obj/item/device/studio_monitor.dm
+++ b/code/obj/item/device/studio_monitor.dm
@@ -22,8 +22,8 @@ TYPEINFO(/obj/item/device/radio/nukie_studio_monitor)
 	var/obj/effects/music/effect
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		pixel_y = 0
 		effect = new
 		src.vis_contents += effect
@@ -97,8 +97,8 @@ TYPEINFO(/obj/item/device/radio/nukie_studio_monitor)
 	var/overheated = FALSE
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		effect = new
 		speakers |= new /obj/item/device/radio/nukie_studio_monitor(src.loc)
 		speakers |= new /obj/item/device/radio/nukie_studio_monitor(src.loc)
diff --git a/code/obj/item/device/transfer_valve.dm b/code/obj/item/device/transfer_valve.dm
index 371c36dc07ba3..8a31ca515e038 100644
--- a/code/obj/item/device/transfer_valve.dm
+++ b/code/obj/item/device/transfer_valve.dm
@@ -136,80 +136,128 @@ TYPEINFO(/obj/item/device/transfer_valve)
 			boutput(user, SPAN_NOTICE("You attach two loops of [item] to the transfer valve!"))
 			UpdateIcon()
 
+		else if (issnippingtool(item))
+			if(usr?.back && usr.back == src)
+				boutput(usr, SPAN_ALERT("You can't detach the loops of wire while you're wearing [src]!"))
+			else
+				c_flags &= ~ONBACK
+				var/turf/location = get_turf(src)
+				var/obj/item/cable_coil/cut/C = new /obj/item/cable_coil/cut(location)
+				C.amount = 2
+				boutput(usr, SPAN_NOTICE("You detach the loops of wire from [src]!"))
+				UpdateIcon()
+
 		return
 
+	/// Attach the tank the mob is currently holding
+	proc/attach_tank(mob/user, tank_preference=null)
+		if (!user) return
+		var/obj/item/I = user.equipped()
+		if (!istype(I, /obj/item/tank) || istype(I, /obj/item/clothing/head/butt)) return
+		var/obj/item/tank/myTank = I
+		if (!myTank.compatible_with_TTV) return
+		// Handle UI tank attachment
+		if (tank_preference == 1)
+			// This check should always pass
+			if (!src.tank_one)
+				src.tank_one = myTank
+		else if (tank_preference == 2)
+			// As should this one
+			if (!src.tank_two)
+				src.tank_two = myTank
+		// Handle attackby tank attachment (wherever fits)
+		else if (!tank_preference && !src.tank_one)
+			src.tank_one = myTank
+		else if (!tank_preference && !src.tank_two)
+			src.tank_two = myTank
+		else
+			// it did not fit, clearly. dummy.
+			boutput(user, SPAN_NOTICE("\the [myTank] cannot fit on the [src]!"))
+			return
+		user.drop_item()
+		myTank.set_loc(src)
+		boutput(user, SPAN_NOTICE("You attach \the [myTank] to the transfer valve"))
+		if(src.tank_one && src.tank_two)
+			var/turf/T = get_turf(src)
+			var/butt = istype(tank_one, /obj/item/clothing/head/butt) || istype(tank_two, /obj/item/clothing/head/butt)
+			logTheThing(LOG_BOMBING, user, "made a TTV tank transfer valve [butt ? "butt" : "bomb"] at [log_loc(T)].")
+			message_admins("[key_name(user)] made a TTV tank transfer valve [butt ? "butt" : "bomb"] at [log_loc(T)].")
+		UpdateIcon()
+		attacher = user
+		if(user.back == src)
+			user.update_clothing()
+
 	attack_self(mob/user as mob)
 		if (isghostdrone(user))
 			return
 		if (user.get_gang())
 			boutput(user, SPAN_ALERT("You think working with explosives would bring a lot of much heat onto your gang to mess with this. But you do it anyway."))
-		src.add_dialog(user)
-		var/dat = {"<B> Valve properties: </B>
-		<BR> <B> Attachment one:</B> [tank_one] [tank_one ? "<A href='?src=\ref[src];tankone=1'>Remove</A>" : ""]
-		<BR> <B> Attachment two:</B> [tank_two] [tank_two ? "<A href='?src=\ref[src];tanktwo=1'>Remove</A>" : ""]
-		<BR> <B> Valve attachment:</B> [attached_device ? "<A href='?src=\ref[src];device=1'>[attached_device]</A>" : "None"] [attached_device ? "<A href='?src=\ref[src];rem_device=1'>Remove</A>" : ""]
-		<BR> <B> Valve status: </B> [ valve_open ? "<A href='?src=\ref[src];open=1'>Closed</A> <B>Open</B>" : "<B>Closed</B> <A href='?src=\ref[src];open=1'>Open</A>"]
-		<BR> [c_flags & ONBACK ? "<B> Straps: </B> <A href='?src=\ref[src];straps=1'>Remove</A>" : ""]"}
-
-		user.Browse(dat, "window=trans_valve;size=600x300")
-		onclose(user, "trans_valve")
-		return
-
-	Topic(href, href_list)
+		src.ui_interact(user)
+
+#define TANK_PRESSURE(item_tank) (hasvar(item_tank, "air_contents")) ? MIXTURE_PRESSURE(item_tank.air_contents) : 0
+	ui_data(mob/user)
+		var/tank_one_data = (src.tank_one) ? list("name"=src.tank_one.name, "num"=1, "pressure"=TANK_PRESSURE(src.tank_one), \
+											      "maxPressure"=TANK_FRAGMENT_PRESSURE) \
+										   : list("name"=null, "num"=1, "pressure"=null, "maxPressure"=null)
+		var/tank_two_data = (src.tank_two) ? list("name"=src.tank_two.name, "num"=2, "pressure"=TANK_PRESSURE(src.tank_two), \
+											      "maxPressure"=TANK_FRAGMENT_PRESSURE) \
+										   : list("name"=null, "num"=2, "pressure"=null, "maxPressure"=null)
+		return list(
+			"tank_one" = tank_one_data,
+			"tank_two" = tank_two_data,
+			"device" = "[src.attached_device]",
+			"opened" = src.valve_open,
+		)
+#undef TANK_PRESSURE
+
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if (!ui)
+			ui = new(user, src, "TTV", src.name)
+			ui.open()
+
+	ui_act(action, params)
 		..()
-		if (isghostdrone(usr))
+		if (isghostdrone(usr) || usr.stat || usr.restrained())
 			return
 		if (usr.get_gang())
 			boutput(usr, SPAN_ALERT("You think working with explosives would bring a lot of much heat onto your gang to mess with this. But you do it anyway."))
-		if (usr.stat|| usr.restrained())
-			return
-		if (src.loc == usr)
-			if(href_list["tankone"])
-				tank_one.set_loc(get_turf(src))
-				tank_one = null
-				UpdateIcon()
-				if(src.equipped_in_slot)
-					var/mob/wearer = src.loc
-					wearer.update_clothing()
-			if(href_list["tanktwo"])
-				tank_two.set_loc(get_turf(src))
-				tank_two = null
-				UpdateIcon()
-				if(src.equipped_in_slot)
-					var/mob/wearer = src.loc
-					wearer.update_clothing()
-			if(href_list["open"])
-				if (valve_open)
-					var/turf/bombturf = get_turf(src)
-					logTheThing(LOG_BOMBING, usr, "closed the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
-					message_admins("[key_name(usr)] closed the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
+		switch(action)
+			if ("add_item")
+				if (params["tank"])
+					src.attach_tank(usr, params["tank"])
 				else
-					var/turf/bombturf = get_turf(src)
-					logTheThing(LOG_BOMBING, usr, "opened the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
-					message_admins("[key_name(usr)] opened the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
+					src.Attackby(usr.equipped(), usr)
+			if ("remove_tank_one")
+				src.remove_tank(tank_one)
+			if ("remove_tank_two")
+				src.remove_tank(tank_two)
+			if ("toggle_valve")
+				var/openorclose = (src.valve_open) ? "closed" : "opened"
+				var/turf/bombturf = get_turf(src)
+				logTheThing(LOG_BOMBING, usr, "[openorclose] the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
+				message_admins("[key_name(usr)] [openorclose] the valve on a TTV tank transfer valve at [log_loc(bombturf)].")
 				toggle_valve()
-			if(href_list["rem_device"])
-				attached_device.set_loc(get_turf(src))
-				attached_device.master = null
-				attached_device = null
+			if ("remove_device")
+				src.attached_device.set_loc(get_turf(src))
+				src.attached_device.master = null
+				src.attached_device = null
 				UpdateIcon()
-			if(href_list["device"])
+			if ("interact_device")
 				attached_device.attack_self(usr)
-			if(href_list["straps"])
-				if(usr?.back && usr.back == src)
-					boutput(usr, SPAN_ALERT("You can't detach the loops of wire while you're wearing [src]!"))
-				else
-					c_flags &= ~ONBACK
-					var/turf/location = get_turf(src)
-					var/obj/item/cable_coil/cut/C = new /obj/item/cable_coil/cut(location)
-					C.amount = 2
-					boutput(usr, SPAN_NOTICE("You detach the loops of wire from [src]!"))
-					UpdateIcon()
-
-			src.attack_self(usr)
-
-			src.add_fingerprint(usr)
-			return
+		src.attack_self(usr)
+		src.add_fingerprint(usr)
+
+	proc/remove_tank(var/T)
+		if (!istype(T, /obj/item/tank)) return
+		var/obj/item/tank/removed = T
+		boutput(usr, SPAN_NOTICE("You remove the [removed] from [src]."))
+		removed.set_loc(get_turf(src))
+		removed = null
+		UpdateIcon()
+		if(src.equipped_in_slot)
+			var/mob/wearer = src.loc
+			wearer.update_clothing()
 
 	receive_signal(signal)
 		if(toggle)
@@ -462,14 +510,16 @@ TYPEINFO(/obj/item/device/transfer_valve/briefcase)
 
 		return
 
+/// How many atmos ticks we are willing to count before giving up
+#define UPDATES_BEFORE_TIMEOUT 20
 /obj/item/device/transfer_valve/vr
 	name = "VR explosive"
 	var/obj/machinery/networked/storage/bomb_tester/tester = null
-	var/updates_before_halt = 10 //So we don't keep updating on a dud bomb forever.
+	/// How many atmos ticks we have listened to thus far
 	var/update_counter = 0
 
 	attack_hand(mob/user)
-		return
+		src.ui_interact()
 
 	disposing()
 		processing_items.Remove(src)
@@ -490,36 +540,32 @@ TYPEINFO(/obj/item/device/transfer_valve/briefcase)
 		return
 
 	process()
-		if(!tester || !src.valve_open)
+		if(!tester || !tester.vrbomb || !src.valve_open)
 			return
 
-		if(update_counter >= updates_before_halt)
+		if(update_counter >= UPDATES_BEFORE_TIMEOUT)
 			tester.update_bomb_log("VR bomb monitor timeout.", 1)
 			processing_items.Remove(src)
 			return
 
 		update_counter++
 
-		var/tankslost = 2
-		var/log_message = "[time2text(world.timeofday, "mm:ss")]:"
-		var/tpressure = 0
-		if(tank_one?.air_contents)
-			tankslost--
-			var/t1pressure = MIXTURE_PRESSURE(tank_one.air_contents)
-			tpressure += round(t1pressure,0.1)
+		tester.update_bomb_log("[time2text(world.timeofday, "mm:ss")]:")
+		var/tank1_pressure = (hasvar(src.tank_one, "air_contents")) ?  MIXTURE_PRESSURE(src.tank_one.air_contents) : 0
+		var/tank2_pressure = (hasvar(src.tank_two, "air_contents")) ?  MIXTURE_PRESSURE(src.tank_two.air_contents) : 0
 
-		if(tank_two?.air_contents)
-			tankslost--
-			var/t2pressure = MIXTURE_PRESSURE(tank_two.air_contents)
-			tpressure += round(t2pressure,0.1)
+		tester.update_bomb_log("Tank 1 Pressure:[tank1_pressure] kPa")
+		tester.update_bomb_log("Tank 2 Pressure:[tank2_pressure] kPa")
 
-		log_message += " Pressure:[tpressure] kPa"
-		if(tankslost)
-			log_message += " [tankslost == 2 ? "Both" : "One"] Tank(s) Lost!"
+		// This doesn't really happen as both tanks are usually bound to have the same reaction process due to same volume/contents/temp/etc
+		// so disposing() gets called first
+		if(!tank1_pressure)
+			tester.update_bomb_log("Tank one has no pressure or has been destroyed!")
+		if (!tank2_pressure)
+			tester.update_bomb_log("Tank two has no pressure or has been destroyed!")
 
-		tester.update_bomb_log(log_message)
 		return
-
+#undef UPDATES_BEFORE_TIMEOUT
 
 /obj/item/pressure_crystal
 	icon = 'icons/obj/items/assemblies.dmi'
diff --git a/code/obj/item/dice.dm b/code/obj/item/dice.dm
index aa6df7ab6da78..1d3def8d07413 100644
--- a/code/obj/item/dice.dm
+++ b/code/obj/item/dice.dm
@@ -745,6 +745,7 @@ var/list/rollList = list()
 			pourout(target,user)
 
 	dropped(mob/user as mob)
+		. = ..()
 		if((dicelist.len) && (user.a_intent != "help"))
 			src.ClearAllOverlays()
 			src.icon_state = "dicecupf"
diff --git a/code/obj/item/flamethrower.dm b/code/obj/item/flamethrower.dm
index f24c2e4731c72..09bcc8353094d 100644
--- a/code/obj/item/flamethrower.dm
+++ b/code/obj/item/flamethrower.dm
@@ -210,8 +210,8 @@ A Flamethrower in various states of assembly
 	move_triggered = 1
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		src.create_reagents(4000)
 		inventory_counter.update_percent(src.reagents.total_volume, src.reagents.maximum_volume)
 
diff --git a/code/obj/item/grenades.dm b/code/obj/item/grenades.dm
index 0a5384394d3c9..f77e14890e361 100644
--- a/code/obj/item/grenades.dm
+++ b/code/obj/item/grenades.dm
@@ -42,6 +42,7 @@ ADMIN_INTERACT_PROCS(/obj/item/old_grenade, proc/detonate)
 	var/issawfly = FALSE //for sawfly remote
 	///damage when loaded into a 40mm convesion chamber
 	var/launcher_damage = 25
+	HELP_MESSAGE_OVERRIDE({"You can use a <b>screwdriver</b> to adjust the detonation time."})
 
 	attack_self(mob/user as mob)
 		if (!src.armed)
@@ -812,6 +813,7 @@ TYPEINFO(/obj/item/old_grenade/oxygen)
 	not_in_mousetraps = TRUE
 	var/old_light_grenade = 0
 	var/destination
+	HELP_MESSAGE_OVERRIDE({""})
 
 	New()
 		..()
@@ -1402,19 +1404,27 @@ ADMIN_INTERACT_PROCS(/obj/item/gimmickbomb, proc/arm, proc/detonate)
 			for (var/turf/simulated/wall/W in range(src.expl_range, location))
 				if (W && istype(W) && !location.loc:sanctuary)
 					W.ReplaceWithFloor()
-			for (var/obj/structure/girder/G in range(src.expl_range, location))
-				var/area/a = get_area(G)
-				if (G && istype(G) && !a.sanctuary)
-					qdel(G)
-			for (var/obj/window/WD in range(src.expl_range, location))
-				var/area/a = get_area(WD)
-				if (WD && istype(WD) && prob(max(0, 100 - (WD.health / 3))) && !a.sanctuary)
-					WD.smash()
-			for (var/obj/grille/GR in range(src.expl_range, location))
-				var/area/a = get_area(GR)
-				if (GR && istype(GR) && GR.ruined != 1 && !a.sanctuary)
-					GR.ex_act(2)
-
+			for (var/obj/O in range(src.expl_range, location))
+				var/area/area = get_area(O)
+				if (area?.sanctuary)
+					continue
+				if (istype(O, /obj/structure/girder))
+					qdel(O)
+					continue
+				if (istype(O, /obj/window))
+					var/obj/window/window = O
+					if (prob(max(0, 100 - (window.health / 3))))
+						window.smash()
+					continue
+				if (istype(O, /obj/grille))
+					var/obj/grille/grille = O
+					if (!grille.ruined)
+						grille.ex_act(2)
+					continue
+				if (istype(O, /obj/machinery/door/firedoor))
+					var/obj/machinery/door/firedoor/firelock = O
+					qdel(firelock)
+					continue
 		qdel(src)
 		return
 
@@ -1546,18 +1556,28 @@ ADMIN_INTERACT_PROCS(/obj/item/gimmickbomb, proc/arm, proc/detonate)
 				var/area/a = get_area(DR)
 				if (!DR.cant_emag && !a.sanctuary)
 					DR.take_damage(DR.health)
-			for (var/obj/structure/girder/G in range(src.expl_range, location))
-				var/area/a = get_area(G)
-				if (G && istype(G) && !a.sanctuary)
-					qdel(G)
-			for (var/obj/window/W in range(src.expl_range, location))
-				var/area/a = get_area(W)
-				if (W && istype(W) && !a.sanctuary)
-					W.damage_heat(500)
-			for (var/obj/grille/GR in range(src.expl_range, location))
-				var/area/a = get_area(GR)
-				if (GR && istype(GR) && GR.ruined != 1 && !a.sanctuary)
-					GR.damage_heat(500)
+
+			for (var/obj/O in range(src.expl_range, location))
+				var/area/area = get_area(O)
+				if (area?.sanctuary)
+					continue
+				if (istype(O, /obj/structure/girder))
+					qdel(O)
+					continue
+				if (istype(O, /obj/window))
+					var/obj/window/window = O
+					if (prob(max(0, 100 - (window.health / 3))))
+						window.damage_heat(500)
+					continue
+				if (istype(O, /obj/grille))
+					var/obj/grille/grille = O
+					if (!grille.ruined)
+						grille.damage_heat(500)
+					continue
+				if (istype(O, /obj/machinery/door/firedoor))
+					var/obj/machinery/door/firedoor/firelock = O
+					qdel(firelock)
+					continue
 
 			for (var/mob/living/M in range(src.expl_range, location))
 				if(check_target_immunity(M)) continue
diff --git a/code/obj/item/gun/ammo.dm b/code/obj/item/gun/ammo.dm
index 11c9c6266fe61..f34c3e8e74027 100644
--- a/code/obj/item/gun/ammo.dm
+++ b/code/obj/item/gun/ammo.dm
@@ -963,7 +963,7 @@ ABSTRACT_TYPE(/obj/item/ammo/bullets/pipeshot)
 	ammo_cat = AMMO_GRENADE_40MM
 	w_class = W_CLASS_NORMAL
 	icon_dynamic = 0
-	icon_empty = "40mm_nonlethal-0"
+	icon_empty = "40mm_paint-0"
 	sound_load = 'sound/weapons/gunload_40mm.ogg'
 
 /obj/item/ammo/bullets/pbr
diff --git a/code/obj/item/gun/energy.dm b/code/obj/item/gun/energy.dm
index bf4ca16b3f47d..675e88b2c6a9f 100644
--- a/code/obj/item/gun/energy.dm
+++ b/code/obj/item/gun/energy.dm
@@ -215,6 +215,7 @@ TYPEINFO(/obj/item/gun/energy)
 /obj/item/gun/energy/laser_gun/antique
 	name = "antique laser gun"
 	icon_state = "caplaser"
+	item_state = "capgun"
 	desc = "It's a kit model of the Mod.00 'Lunaport Legend' laser gun from Super! Protector Friend. With realistic sound fx and exciting LED display! This one has been hazardously upgraded."
 	muzzle_flash = "muzzle_flash_laser"
 	cell_type = null
diff --git a/code/obj/item/gun/kinetic.dm b/code/obj/item/gun/kinetic.dm
index 326a7930d4338..90336a29c0508 100644
--- a/code/obj/item/gun/kinetic.dm
+++ b/code/obj/item/gun/kinetic.dm
@@ -912,11 +912,16 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	ammobag_restock_cost = 2
 
 	New()
+		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 		ammo = new default_magazine
 		set_current_projectile(new/datum/projectile/bullet/veritate)
 		projectiles = list(current_projectile,new/datum/projectile/bullet/veritate/burst)
 		..()
 
+	disposing()
+		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
+
 	attack_self(mob/user as mob)
 		..()	//burst shot has a slight spread.
 		if (istype(current_projectile, /datum/projectile/bullet/veritate/burst/))
@@ -1062,6 +1067,7 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	muzzle_flash = null
 	default_magazine = /obj/item/ammo/bullets/foamdarts
 	var/pulled = FALSE
+	add_residue = FALSE
 
 	New()
 		ammo = new default_magazine
@@ -1160,6 +1166,7 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	max_ammo_capacity = 6
 	muzzle_flash = null
 	default_magazine = /obj/item/ammo/bullets/foamdarts
+	add_residue = FALSE
 
 	New()
 		ammo = new default_magazine
@@ -1183,6 +1190,7 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	max_ammo_capacity = 12
 	muzzle_flash = null
 	default_magazine = /obj/item/ammo/bullets/foamdarts
+	add_residue = FALSE
 
 	New()
 		ammo = new default_magazine
@@ -2144,6 +2152,7 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 		set_current_projectile(new/datum/projectile/special/spreader/buckshot_burst/)
 		..()
 
+
 // assault
 /obj/item/gun/kinetic/assault_rifle
 	name = "\improper Sirius assault rifle"
@@ -2208,7 +2217,6 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 		..()
 
 
-
 // heavy
 /obj/item/gun/kinetic/light_machine_gun
 	name = "\improper Antares light machine gun"
@@ -2235,12 +2243,17 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	ammobag_restock_cost = 3
 
 	New()
+		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 		ammo = new default_magazine
 		set_current_projectile(new/datum/projectile/bullet/lmg)
 		projectiles = list(current_projectile, new/datum/projectile/bullet/lmg/auto)
 		AddComponent(/datum/component/holdertargeting/fullauto, 1.5 DECI SECONDS, 1.5 DECI SECONDS, 1)
 		..()
 
+	disposing()
+		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
+
 	setupProperties()
 		..()
 		setProperty("carried_movespeed", 1)
@@ -2277,10 +2290,15 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 
 
 	New()
+		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 		ammo = new default_magazine
 		set_current_projectile(new/datum/projectile/bullet/cannon)
 		..()
 
+	disposing()
+		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
+
 	setupProperties()
 		..()
 		setProperty("carried_movespeed", 0.3)
@@ -2313,10 +2331,15 @@ ABSTRACT_TYPE(/obj/item/survival_rifle_barrel)
 	ammobag_restock_cost = 5
 
 	New()
+		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
 		ammo = new default_magazine
 		set_current_projectile(new/datum/projectile/bullet/howitzer)
 		..()
 
+	disposing()
+		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
+
 	setupProperties()
 		..()
 		setProperty("carried_movespeed", 0.2)
diff --git a/code/obj/item/hydroponics.dm b/code/obj/item/hydroponics.dm
index 18f5b59edf177..06e9a9e5939f3 100644
--- a/code/obj/item/hydroponics.dm
+++ b/code/obj/item/hydroponics.dm
@@ -573,8 +573,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/weedkiller
 	name = "weedkiller"
 	desc = "A small bottle filled with Atrazine, an effective weedkiller."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle1"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "1"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -585,8 +585,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/mutriant
 	name = "Mutagenic Plant Formula"
 	desc = "An unstable radioactive mixture that stimulates genetic diversity."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle3"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "3"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -597,8 +597,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/groboost
 	name = "Ammonia Plant Formula"
 	desc = "A nutrient-rich plant formula that encourages quick plant growth."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle3"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "3"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -609,8 +609,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/topcrop
 	name = "Potash Plant Formula"
 	desc = "A nutrient-rich plant formula that encourages large crop yields."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle3"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "3"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -621,8 +621,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/powerplant
 	name = "Saltpetre Plant Formula"
 	desc = "A nutrient-rich plant formula that encourages more potent crops."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle3"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "3"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -633,8 +633,8 @@ TYPEINFO(/obj/item/plantanalyzer)
 /obj/item/reagent_containers/glass/bottle/fruitful
 	name = "Mutadone Plant Formula"
 	desc = "A nutrient-rich formula that attempts to rectify genetic problems."
-	icon = 'icons/obj/chemical.dmi'
-	icon_state = "bottle3"
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
+	bottle_style = "3"
 	amount_per_transfer_from_this = 10
 	initial_volume = 40
 
@@ -656,8 +656,11 @@ TYPEINFO(/obj/item/plantanalyzer)
 
 /obj/item/reagent_containers/glass/water_pipe
 	name = "water pipe"
-	icon = 'icons/obj/chemical.dmi'
+	icon = 'icons/obj/items/chemistry_glassware.dmi'
 	icon_state = "bong"
+	fluid_overlay_states = 8
+	container_style = "bong"
+	fluid_overlay_scaling = RC_FLUID_OVERLAY_SCALING_SPHERICAL
 
 	filled
 
diff --git a/code/obj/item/implant.dm b/code/obj/item/implant.dm
index fba4de5b68a95..7e0e9afa2f5ea 100644
--- a/code/obj/item/implant.dm
+++ b/code/obj/item/implant.dm
@@ -2054,7 +2054,7 @@ TYPEINFO(/obj/item/gun/implanter)
 	damage_type = D_KINETIC
 	hit_type = DAMAGE_STAB
 	casing = /obj/item/casing/small
-	impact_image_state = "bhole-small"
+	impact_image_state = "bullethole-small"
 	shot_number = 1
 	//silentshot = 1
 	var/obj/item/implant/my_implant = null
diff --git a/code/obj/item/kitchen.dm b/code/obj/item/kitchen.dm
index 704954217916b..d2fd419172876 100644
--- a/code/obj/item/kitchen.dm
+++ b/code/obj/item/kitchen.dm
@@ -54,7 +54,7 @@ TRAYS
 
 	New()
 		..()
-		if(prob(60))
+		if(src.pixel_y == 0 && prob(60)) // Don't adjust map-set pixel adjustments
 			src.pixel_y = rand(0, 4)
 		BLOCK_SETUP(BLOCK_KNIFE)
 		return
@@ -917,6 +917,20 @@ TRAYS
 
 		. = ..()
 
+	proc/mousetrap_check(mob/user)
+		for(var/obj/item/mousetrap/MT in src.food_inside)
+			if (MT.armed)
+				user?.visible_message(SPAN_ALERT("<B>[user] opens the pizza box and sets off a mousetrap!</B>"),\
+					SPAN_ALERT("<B>You open the pizza box, but there was a live mousetrap in there!</B>"))
+				MT.triggered(user, user?.hand ? "l_hand" : "r_hand")
+				return TRUE
+		for(var/obj/item/mine/M in src.food_inside)
+			if (M.armed && M.used_up != TRUE)
+				user?.visible_message(SPAN_ALERT("<B>[user] opens the pizza box and sets off a [M.name]!</B>"),\
+					SPAN_ALERT("<B>You open the pizza box, but there was a live [M.name] in there!</B>"))
+				M.triggered(user)
+				return TRUE
+
 	proc/toggle_box(mob/user)
 		if (length(src.contents - src.food_inside) > 0)
 			boutput(user, SPAN_ALERT("You have to remove the boxes on \the [src] before you can open it!"))
@@ -942,6 +956,9 @@ TRAYS
 			src.UpdateIcon()
 
 		else
+			if (src.mousetrap_check(user))
+				return FALSE
+
 			if (isnull(user)) // We only need a null-check here because of the shit_goes_everywhere proc
 				icon_state = "pizzabox_open"
 				src.open = TRUE
diff --git a/code/obj/item/manudrive.dm b/code/obj/item/manudrive.dm
index 8e2e98993f567..835e65c88074d 100644
--- a/code/obj/item/manudrive.dm
+++ b/code/obj/item/manudrive.dm
@@ -79,3 +79,24 @@ TYPEINFO(/obj/item/disk/data/floppy/manudrive)
 		desc = "A drive for data storage that can be inserted and removed from manufacturers to temporarily add recipes to a manufacturer. This drive carries a blueprint that permits the user to manufacture laser mirrors and beam splitters."
 		icon_state = "datadiskeng"
 		temp_recipe_string = list(/datum/manufacture/mechanics/laser_mirror, /datum/manufacture/mechanics/laser_splitter)
+
+	comms_dish
+		name = "Command ManuDrive: Communications Dish"
+		desc = "A drive for data storage that can be inserted and removed from manufacturers to temporarily add recipes to a manufacturer. This drive carries a blueprint that permits the user to manufacture a new communications dish."
+		icon_state = "datadiskcom"
+		temp_recipe_string = list(/datum/manufacture/mechanics/comms_dish)
+
+		singleuse
+			fablimit = 1
+
+	pocketoxyex
+		name = "Civilian ManuDrive: Extended Capacity Pocket Oxygen Tank"
+		desc = "A drive for data storage that can be inserted and removed from manufacturers to temporarily add recipes to a manufacturer. This drive carries a blueprint that permits the user to manufacture an extended capacity pocket oxygen tank."
+		icon_state = "datadisk1"
+		temp_recipe_string = list(/datum/manufacture/pocketoxyex)
+
+		singleuse
+			fablimit = 1
+
+		threeuse
+			fablimit = 3
diff --git a/code/obj/item/material.dm b/code/obj/item/material.dm
index 0f2ffda6eac28..5058540c113ec 100644
--- a/code/obj/item/material.dm
+++ b/code/obj/item/material.dm
@@ -858,12 +858,14 @@
 			if (.)
 				user.visible_message("<b>[user.name]</b> loads [W] into [src].")
 				playsound(src, sound_load, 40, TRUE)
+				logTheThing(LOG_STATION, user, "loads [W] into \the [src] at [log_loc(src)].")
 		else if (W?.cant_drop)
 			boutput(user, SPAN_ALERT("You can't put that in [src] when it's attached to you!"))
 			return ..()
 		else if (load_reclaim(W, user))
 			boutput(user, "You load [W] into [src].")
 			playsound(src, sound_load, 40, TRUE)
+			logTheThing(LOG_STATION, user, "loads [W] into \the [src] at [log_loc(src)].")
 		else
 			. = ..()
 
diff --git a/code/obj/item/misc_weapons.dm b/code/obj/item/misc_weapons.dm
index 806a88eab2251..d78324c50995a 100644
--- a/code/obj/item/misc_weapons.dm
+++ b/code/obj/item/misc_weapons.dm
@@ -1763,8 +1763,8 @@ obj/item/whetstone
 	var/stab_color = "#FF0000"
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		src.AddComponent(/datum/component/bloodflick)
 		src.setItemSpecial(/datum/item_special/swipe)
 		src.update_special_color()
diff --git a/code/obj/item/mob_parts.dm b/code/obj/item/mob_parts.dm
index 01e7b8baea745..8a8ad1b1ce5ce 100644
--- a/code/obj/item/mob_parts.dm
+++ b/code/obj/item/mob_parts.dm
@@ -369,6 +369,10 @@ ABSTRACT_TYPE(/obj/item/parts)
 	proc/on_holder_examine()
 		return
 
+	///Called every life tick when attached to a mob
+	proc/on_life(datum/controller/process/mobs/parent)
+		return
+
 /obj/item/proc/streak_object(var/list/directions, var/streak_splatter) //stolen from gibs
 	var/destination
 	var/dist = rand(1,6)
diff --git a/code/obj/item/mob_parts/human_parts.dm b/code/obj/item/mob_parts/human_parts.dm
index ffea7d6ed6736..a120c9149eb5f 100644
--- a/code/obj/item/mob_parts/human_parts.dm
+++ b/code/obj/item/mob_parts/human_parts.dm
@@ -1588,6 +1588,50 @@
 	partlistPart = "foot_right"
 	step_image_state = "footprintsR"
 
+// bingus limbs hehehe
+
+/obj/item/parts/human_parts/arm/mutant/cat/bingus
+	icon = 'icons/mob/bingus.dmi'
+	partIcon = 'icons/mob/bingus.dmi'
+
+/obj/item/parts/human_parts/leg/mutant/cat/bingus
+	icon = 'icons/mob/bingus.dmi'
+	partIcon = 'icons/mob/bingus.dmi'
+
+////// ACTUAL CAT LIMBS //////
+/obj/item/parts/human_parts/arm/mutant/cat/bingus/left
+	name = "left cat arm"
+	desc = "A cat's left arm. Meow."
+	icon_state = "arm_left"
+	slot = "l_arm"
+	side = "left"
+	handlistPart = "hand_left"
+
+/obj/item/parts/human_parts/arm/mutant/cat/bingus/right
+	name = "right cat arm"
+	desc = "A cat's right arm. =3"
+	icon_state = "arm_right"
+	slot = "r_arm"
+	side = "right"
+	handlistPart = "hand_right"
+
+/obj/item/parts/human_parts/leg/mutant/cat/bingus/left
+	name = "left cat leg"
+	desc = "A cat's left leg. =0w0="
+	icon_state = "leg_left"
+	slot = "l_leg"
+	side = "left"
+	partlistPart = "foot_left"
+	step_image_state = "footprintsL"
+
+/obj/item/parts/human_parts/leg/mutant/cat/bingus/right
+	name = "right cat leg"
+	desc = "A cat's right leg. Mrow."
+	icon_state = "leg_right"
+	slot = "r_leg"
+	side = "right"
+	partlistPart = "foot_right"
+	step_image_state = "footprintsR"
 
 //// WEREWOLF LIMBS ////
 ////// PARENT	//////////
@@ -1674,13 +1718,12 @@
 /obj/item/parts/human_parts/arm/mutant/vampiric_thrall
 	icon = 'icons/mob/vampiric_thrall.dmi'
 	partIcon = 'icons/mob/vampiric_thrall.dmi'
-	kind_of_limb = (LIMB_MUTANT | LIMB_ZOMBIE)
-	limb_type = /datum/limb/zombie/thrall
+	kind_of_limb = LIMB_MUTANT
 
 /obj/item/parts/human_parts/leg/mutant/vampiric_thrall
 	icon = 'icons/mob/vampiric_thrall.dmi'
 	partIcon = 'icons/mob/vampiric_thrall.dmi'
-	kind_of_limb = (LIMB_MUTANT | LIMB_ZOMBIE)
+	kind_of_limb = LIMB_MUTANT
 
 //// LIMBS ////
 /obj/item/parts/human_parts/arm/mutant/vampiric_thrall/left
diff --git a/code/obj/item/mob_parts/robot_parts.dm b/code/obj/item/mob_parts/robot_parts.dm
index 8ba1f3054c75d..b398cb1a2f122 100644
--- a/code/obj/item/mob_parts/robot_parts.dm
+++ b/code/obj/item/mob_parts/robot_parts.dm
@@ -22,11 +22,14 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts)
 	var/max_health = 100
 	var/dmg_blunt = 0
 	var/dmg_burns = 0
-	/// for calculating speed modifiers
+	/// Currently vestigal variable previously used for speed, being left for potiental future application
 	var/weight = 0
 	/// does this part consume any extra power
 	var/powerdrain = 0
 
+	default_material = "steel"
+	mat_changeappearance = FALSE
+
 	force = 6
 	stamina_damage = 40
 	stamina_cost = 23
@@ -111,8 +114,8 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts)
 		if (!wrong_tool && src) //ZeWaka: Fix for null.name
 			switch(remove_stage)
 				if(0)
-					tool.the_mob.visible_message(SPAN_ALERT("[tool.the_mob] staples [holder.name]'s [src.name] securely to their stump with [tool]."), SPAN_ALERT("You staple [holder.name]'s [src.name] securely to their stump with [tool]."))
-					logTheThing(LOG_COMBAT, tool.the_mob, "staples [constructTarget(holder,"combat")]'s [src.name] back on.")
+					tool.the_mob.visible_message(SPAN_ALERT("[tool.the_mob] secures [holder.name]'s [src.name] to [his_or_her(holder)] stump with [tool]."), SPAN_ALERT("You secure [holder.name]'s [src.name] to [his_or_her(holder)] stump with [tool]."))
+					logTheThing(LOG_COMBAT, tool.the_mob, "secures [constructTarget(holder,"combat")]'s [src.name] back on.")
 				if(1)
 					tool.the_mob.visible_message(SPAN_ALERT("[tool.the_mob] slices through the attachment mesh of [holder.name]'s [src.name] with [tool]."), SPAN_ALERT("You slice through the attachment mesh of [holder.name]'s [src.name] with [tool]."))
 				if(2)
@@ -146,6 +149,10 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts)
 				return 0
 		return 0
 
+	/// For special explosion behaviour, explosive damage is handled in ropart_take_damage
+	proc/ropart_ex_act(severity, lasttouched, power)
+		return
+
 	proc/ropart_mend_damage(var/bluntdmg = 0,var/burnsdmg = 0)
 		src.dmg_blunt -= bluntdmg
 		src.dmg_burns -= burnsdmg
@@ -165,9 +172,31 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts)
 				if (src.dmg_blunt || src.dmg_burns) return ((src.dmg_blunt + src.dmg_burns) / src.max_health) * 100
 				else return 0
 
-	//Should maybe be on parent, but something something performance concerns
-	proc/on_life()
-		return
+	proc/reinforce(var/obj/item/sheet/M, var/mob/user, var/obj/item/parts/robot_parts/result, var/need_reinforced)
+		if (!src.can_reinforce(M, user, need_reinforced))
+			return
+
+		var/obj/item/parts/robot_parts/newitem = new result(get_turf(src))
+		newitem.setMaterial(src.material)
+		boutput(user, SPAN_NOTICE("You reinforce [src.name] with the metal."))
+		M.change_stack_amount(-2)
+		if (M.amount < 1)
+			user.drop_item()
+			qdel(M)
+
+		qdel(src)
+
+	proc/can_reinforce(var/obj/item/sheet/M, var/mob/user, var/need_reinforced)
+		if (need_reinforced && !M.reinforcement)
+			boutput(user, SPAN_ALERT("You'll need reinforced sheets to reinforce this component."))
+			return FALSE
+		if (M.amount < 2)
+			boutput(user, SPAN_ALERT("You need at least two metal sheets to reinforce this component."))
+			return FALSE
+		if (!src.material.isSameMaterial(M.material))
+			boutput(user, SPAN_ALERT("You need the same material as the component to reinforce."))
+			return FALSE
+		return TRUE
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 /obj/item/parts/robot_parts/head
@@ -176,6 +205,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 	icon_state_base = "head"
 	icon_state = "head-generic"
 	slot = "head"
+	material_amt = ROBOT_HEAD_COST
 
 	var/obj/item/organ/brain/brain = null
 	var/obj/item/ai_interface/ai_interface = null
@@ -258,30 +288,38 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 		else
 			..()
 
+	reinforce(var/obj/item/sheet/M, var/mob/user, var/obj/item/parts/robot_parts/result, var/need_reinforced)
+		if (!src.can_reinforce(M, need_reinforced))
+			return
+
+		var/obj/item/parts/robot_parts/newitem = new result(get_turf(src))
+		newitem.setMaterial(src.material)
+
+		var/obj/item/parts/robot_parts/head/newhead = newitem
+		var/obj/item/parts/robot_parts/head/oldhead = src
+		if (oldhead.brain)
+			newhead.brain = oldhead.brain
+			oldhead.brain.set_loc(newhead)
+		else if (oldhead.ai_interface)
+			newhead.ai_interface = oldhead.ai_interface
+			oldhead.ai_interface.set_loc(newhead)
+
+		boutput(user, SPAN_NOTICE("You reinforce [src.name] with the metal."))
+		M.change_stack_amount(-2)
+		if (M.amount < 1)
+			user.drop_item()
+			qdel(M)
+
+		qdel(src)
+
 /obj/item/parts/robot_parts/head/standard
 	name = "standard cyborg head"
 	max_health = 160
+	robot_movement_modifier = /datum/movement_modifier/robot_part/standard_head
 	attackby(obj/item/W, mob/user)
 		if (istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the metal."))
-				var/obj/item/parts/robot_parts/head/sturdy/newhead = new /obj/item/parts/robot_parts/head/sturdy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				if (src.brain)
-					newhead.brain = src.brain
-					src.brain.set_loc(newhead)
-				else if (src.ai_interface)
-					newhead.ai_interface = src.ai_interface
-					src.ai_interface.set_loc(newhead)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two metal sheets to reinforce this component."))
-				return
+			src.reinforce(M, user, /obj/item/parts/robot_parts/head/sturdy, FALSE)
 		else
 			..()
 
@@ -290,53 +328,16 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 	desc = "A reinforced head unit capable of taking more abuse than usual."
 	appearanceString = "sturdy"
 	icon_state = "head-sturdy"
+	material_amt = ROBOT_HEAD_COST + ROBOT_STURDY_COST
 	max_health = 225
 	weight = 0.2
+	robot_movement_modifier = /datum/movement_modifier/robot_part/sturdy_head
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVY) // shush
 
 	attackby(obj/item/W, mob/user)
 		if (istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (!M.reinforcement)
-				boutput(user, SPAN_ALERT("You'll need reinforced sheets to reinforce the head."))
-				return
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the reinforced metal."))
-				var/obj/item/parts/robot_parts/head/heavy/newhead = new /obj/item/parts/robot_parts/head/heavy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				if (src.brain)
-					newhead.brain = src.brain
-					src.brain.set_loc(newhead)
-				else if (src.ai_interface)
-					newhead.ai_interface = src.ai_interface
-					src.ai_interface.set_loc(newhead)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two reinforced metal sheets to reinforce this component."))
-				return
-		else if (isweldingtool(W))
-			if(!W:try_weld(user, 1))
-				return
-			boutput(user, SPAN_NOTICE("You remove the reinforcement metals from [src]."))
-			var/obj/item/parts/robot_parts/head/standard/newhead = new /obj/item/parts/robot_parts/head/standard(get_turf(src))
-			if (src.brain)
-				newhead.brain = src.brain
-				src.brain.set_loc(newhead)
-			else if (src.ai_interface)
-				newhead.ai_interface = src.ai_interface
-				src.ai_interface.set_loc(newhead)
-
-			//costs 2 sheets to make vov
-			new/obj/item/sheet/steel(get_turf(src))
-			new/obj/item/sheet/steel(get_turf(src))
-
-			qdel(src)
-			return
-
+			src.reinforce(M, user, /obj/item/parts/robot_parts/head/heavy, TRUE)
 		else
 			..()
 
@@ -345,38 +346,20 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 	desc = "A heavily reinforced head unit intended for use on cyborgs that perform tough and dangerous work."
 	appearanceString = "heavy"
 	icon_state = "head-heavy"
+	material_amt = ROBOT_HEAD_COST + ROBOT_HEAVY_COST
 	max_health = 350
 	weight = 0.4
+	robot_movement_modifier = /datum/movement_modifier/robot_part/heavy_head
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVIER)
 
-	attackby(obj/item/W, mob/user)
-		if (isweldingtool(W))
-			if(!W:try_weld(user, 1))
-				return
-			boutput(user, SPAN_NOTICE("You remove the reinforcement metals from [src]."))
-			var/obj/item/parts/robot_parts/head/sturdy/newhead = new /obj/item/parts/robot_parts/head/sturdy/(get_turf(src))
-			if (src.brain)
-				newhead.brain = src.brain
-				src.brain.set_loc(newhead)
-			else if (src.ai_interface)
-				newhead.ai_interface = src.ai_interface
-				src.ai_interface.set_loc(newhead)
-			//costs 2 sheets to make vov
-			new/obj/item/sheet/steel/reinforced(get_turf(src))
-			new/obj/item/sheet/steel/reinforced(get_turf(src))
-
-			qdel(src)
-			return
-		else
-			..()
-
 /obj/item/parts/robot_parts/head/light
 	name = "light cyborg head"
 	desc = "A cyborg head with little reinforcement, to be built in times of scarce resources."
 	appearanceString = "light"
 	icon_state = "head-light"
+	material_amt = ROBOT_HEAD_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 60
-	robot_movement_modifier = /datum/movement_modifier/robot_part/head
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_head
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT)
 
 /obj/item/parts/robot_parts/head/antique
@@ -386,15 +369,55 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/head)
 	icon_state = "head-android"
 	max_health = 150
 	visible_eyes = 0
-	robot_movement_modifier = /datum/movement_modifier/robot_part/head
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_head
 
 /obj/item/parts/robot_parts/head/screen
 	name = "cyborg screen head"
 	desc = "A somewhat fragile head unit with a screen addressable by the cyborg."
 	appearanceString = "screen"
 	icon_state = "head-screen"
+	material_amt = ROBOT_SCREEN_METAL_COST
 	max_health = 90
 	var/list/expressions = list("happy", "veryhappy", "neutral", "sad", "angry", "curious", "surprised", "unsure", "content", "tired", "cheeky","nervous","ditzy","annoyed","skull","eye","sly","elated","blush","battery","error","loading","pong","hypnotized")
+	var/smashed = FALSE
+
+	update_icon(...)
+		if (src.smashed)
+			src.UpdateOverlays(image('icons/obj/robot_parts.dmi', "head-screen-smashed"), "smashed")
+		else
+			src.UpdateOverlays(null, "smashed")
+
+	ropart_take_damage(var/bluntdmg = 0,var/burnsdmg = 0)
+		..() //parent calls del if we get destroyed so no need to handle not doing this
+		if (!src.smashed && (bluntdmg > 10 || bluntdmg > 3 && prob(20)))
+			src.smashed = TRUE
+			src.UpdateIcon()
+			var/mob/living/silicon/robot/robo_holder = src.holder
+			robo_holder.update_bodypart("head")
+
+	ropart_ex_act(severity, lasttouched, power)
+		if (!src.smashed && (severity == 1 || prob(60)))
+			src.smashed = TRUE
+			src.UpdateIcon()
+			//no need to update the holder here as robots do a full update on exploding
+
+	attackby(obj/item/W, mob/user)
+		if (src.smashed && istype(W, /obj/item/sheet) && W.material.getMaterialFlags() & MATERIAL_CRYSTAL)
+			src.start_repair(W, user)
+		else
+			..()
+
+	proc/start_repair(obj/item/W, mob/user)
+		SETUP_GENERIC_ACTIONBAR(user, src, 2 SECONDS, TYPE_PROC_REF(/obj/item/parts/robot_parts/head/screen, repair), list(W, user),\
+			W.icon, W.icon_state, SPAN_ALERT("[user] repairs [src]."), INTERRUPT_ACT | INTERRUPT_STUNNED | INTERRUPT_ACTION | INTERRUPT_MOVE)
+
+	proc/repair(obj/item/sheet/sheets, mob/user)
+		sheets.change_stack_amount(-1)
+		src.smashed = FALSE
+		var/mob/living/silicon/robot/robo_holder = src.holder
+		robo_holder?.update_bodypart("head")
+		src.UpdateIcon()
+		playsound(get_turf(src.holder || src), 'sound/items/Deconstruct.ogg', 40, 1)
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/chest)
 /obj/item/parts/robot_parts/chest
@@ -478,7 +501,9 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/chest)
 /obj/item/parts/robot_parts/chest/standard
 	name = "standard cyborg chest"
 	desc = "The centerpiece of any cyborg. It wouldn't get very far without it."
+	material_amt = ROBOT_CHEST_COST
 	max_health = 250
+	robot_movement_modifier = /datum/movement_modifier/robot_part/standard_chest
 
 	attackby(obj/item/W, mob/user)
 		if (isweldingtool(W))
@@ -498,16 +523,20 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/chest)
 	desc = "A bare-bones cyborg chest designed for the least consumption of resources."
 	appearanceString = "light"
 	icon_state = "body-light"
+	material_amt = ROBOT_CHEST_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 75
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_chest
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT) // hush
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm)
 /obj/item/parts/robot_parts/arm
 	name = "placeholder item (don't use this!)"
 	desc = "A metal arm for a cyborg. It won't be able to use as many tools without it!"
+	material_amt = ROBOT_LIMB_COST
 	max_health = 60
 	can_hold_items = 1
 	accepts_normal_human_overlays = TRUE
+	var/emagged = FALSE //contains: technical debt
 
 	attack(mob/target, mob/user, def_zone, is_special = FALSE, params = null)
 		if(!ismob(target))
@@ -535,39 +564,70 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm)
 
 		return
 
-	attackby(obj/item/W, mob/user)
-		//gonna hack this in with appearanceString
-		if ((appearanceString == "sturdy" || appearanceString == "heavy") && isweldingtool(W))
-			if(!W:try_weld(user, 1))
-				return
-			boutput(user, SPAN_NOTICE("You remove the reinforcement metals from [src]."))
-
-			if (appearanceString == "sturdy")
-				if (slot == "l_arm")
-					new /obj/item/parts/robot_parts/arm/left(get_turf(src))
-				else if (slot == "r_arm")
-					new /obj/item/parts/robot_parts/arm/right(get_turf(src))
+	on_holder_examine()
+		if (!isrobot(src.holder)) // probably a human, probably  :p
+			return "has [bicon(src)] \an [initial(src.name)] attached as a"
+		return
 
-				new/obj/item/sheet/steel(get_turf(src))
-				new/obj/item/sheet/steel(get_turf(src))
+	emag_act(mob/user, obj/item/card/emag/E)
+		boutput(user, SPAN_ALERT("You short out the control servos on [src]")) //sneaky emag act
+		src.emagged = TRUE
 
-			else if (appearanceString == "heavy")
-				if (slot == "l_arm")
-					new /obj/item/parts/robot_parts/arm/left/sturdy(get_turf(src))
-				else if (slot == "r_arm")
-					new /obj/item/parts/robot_parts/arm/right/sturdy(get_turf(src))
+	on_life()
+		if (!src.emagged || src.holder.restrained() || prob(60)) //chance to do nothing
+			return
 
-				new/obj/item/sheet/steel/reinforced(get_turf(src))
-				new/obj/item/sheet/steel/reinforced(get_turf(src))
+		if (prob(50))
+			boutput(src.holder, SPAN_ALERT(pick("You hear the servos in your arm make a distressing whining sound!", "Your arm twitches oddly!", "You lose control of your arm for a moment!")))
+
+		if (ishuman(src.holder))
+			src.human_emag_effect()
+		else if (isrobot(src.holder))
+			src.robot_emag_effect()
+
+	proc/human_emag_effect()
+		var/mob/living/carbon/human/H = src.holder
+		var/mob/living/target = H //default to hitting ourselves
+		if (prob(80)) //usually look for something else
+			var/list/mob/living/targets = list()
+			for (var/mob/living/M in view(1, H))
+				if (isintangible(M) || M == H)
+					continue
+				targets |= M
+			if (length(targets))
+				target = pick(targets)
+		//make sure we're using the correct hand
+		if ((H.hand == LEFT_HAND && src.slot != "l_arm") || (H.hand == RIGHT_HAND && src.slot != "r_arm"))
+			H.swap_hand()
+
+		if (target == H)
+			H.set_a_intent(pick(INTENT_HELP, INTENT_DISARM, INTENT_HARM)) //no blocking
+		else
+			H.set_a_intent(pick(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)) //only grabbing
 
-			qdel(src)
-			return
+		logTheThing(LOG_COMBAT, key_name(H), "emagged cyberarm attempts to attack [constructTarget(target)]")
+		var/obj/item/equipped = H.equipped()
+		if (isgrab(equipped) || equipped?.chokehold)
+			if (prob(50))
+				equipped.AttackSelf(H)
+			else
+				H.drop_item(equipped, TRUE)
+		else if (equipped)
+			H.weapon_attack(target, H.equipped(), can_reach(H, target), list())
 		else
-			..()
-	on_holder_examine()
-		if (!isrobot(src.holder)) // probably a human, probably  :p
-			return "has [bicon(src)] \an [initial(src.name)] attached as a"
-		return
+			H.hand_attack(target)
+
+	proc/robot_emag_effect()
+		var/mob/living/silicon/robot/robot = src.holder
+		var/robo_slot = src.slot == "l_arm" ? 1 : 3
+		var/last_active = robot.module_states.Find(robot.module_active)
+		robot.uneq_slot(robo_slot)
+		var/obj/item/chosen_tool = pick(robot.module?.tools)
+		if (!chosen_tool)
+			return
+		robot.equip_slot(robo_slot, chosen_tool)
+		if (last_active)
+			robot.swap_hand(last_active)
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm/left)
 /obj/item/parts/robot_parts/arm/left
@@ -579,66 +639,47 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm/left)
 
 /obj/item/parts/robot_parts/arm/left/standard
 	name = "standard cyborg left arm"
+
 	attackby(obj/item/W, mob/user)
 		if(istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the metal."))
-				new /obj/item/parts/robot_parts/arm/left/sturdy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two metal sheets to reinforce this component."))
-				return
+			src.reinforce(M, user, /obj/item/parts/robot_parts/arm/left/sturdy, FALSE)
 		else ..()
 
 /obj/item/parts/robot_parts/arm/left/sturdy
 	name = "sturdy cyborg left arm"
 	appearanceString = "sturdy"
 	icon_state = "l_arm-sturdy"
+	material_amt = ROBOT_LIMB_COST + ROBOT_STURDY_COST
 	max_health = 115
 	weight = 0.2
+	robot_movement_modifier = /datum/movement_modifier/robot_part/sturdy_arm_left
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVY)
 
 	attackby(obj/item/W, mob/user)
 		if(istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (!M.reinforcement)
-				boutput(user, SPAN_ALERT("You'll need reinforced sheets to reinforce the [src.name]."))
-				return
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the reinforced metal."))
-				new /obj/item/parts/robot_parts/arm/left/heavy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two reinforced metal sheets to reinforce this component."))
-				return
+			src.reinforce(M, user, /obj/item/parts/robot_parts/arm/left/heavy, TRUE)
 		else ..()
 
 /obj/item/parts/robot_parts/arm/left/heavy
 	name = "heavy cyborg left arm"
 	appearanceString = "heavy"
 	icon_state = "l_arm-heavy"
+	material_amt = ROBOT_LIMB_COST + ROBOT_HEAVY_COST
 	max_health = 175
 	weight = 0.4
+	robot_movement_modifier = /datum/movement_modifier/robot_part/heavy_arm_left
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVIER)
 
 /obj/item/parts/robot_parts/arm/left/light
 	name = "light cyborg left arm"
 	appearanceString = "light"
 	icon_state = "l_arm-light"
+	material_amt = ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 25
 	handlistPart = "armL-light"
-	robot_movement_modifier = /datum/movement_modifier/robot_part/arm_left
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_arm_left
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT)
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm/right)
@@ -656,63 +697,43 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/arm/right)
 	attackby(obj/item/W, mob/user)
 		if(istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the metal."))
-				new /obj/item/parts/robot_parts/arm/right/sturdy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two metal sheets to reinforce this component."))
-				return
+			src.reinforce(M, user, /obj/item/parts/robot_parts/arm/right/sturdy, FALSE)
 		else ..()
 
 /obj/item/parts/robot_parts/arm/right/sturdy
 	name = "sturdy cyborg right arm"
 	appearanceString = "sturdy"
 	icon_state = "r_arm-sturdy"
+	material_amt = ROBOT_LIMB_COST + ROBOT_STURDY_COST
 	max_health = 115
 	weight = 0.2
+	robot_movement_modifier = /datum/movement_modifier/robot_part/sturdy_arm_right
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVY)
 
 	attackby(obj/item/W, mob/user)
 		if(istype(W,/obj/item/sheet))
 			var/obj/item/sheet/M = W
-			if (!M.reinforcement)
-				boutput(user, SPAN_ALERT("You'll need reinforced sheets to reinforce the [src.name]."))
-				return
-			if (M.amount >= 2)
-				boutput(user, SPAN_NOTICE("You reinforce [src.name] with the reinforced metal."))
-				new /obj/item/parts/robot_parts/arm/right/heavy(get_turf(src))
-				M.change_stack_amount(-2)
-				if (M.amount < 1)
-					user.drop_item()
-					qdel(M)
-				qdel(src)
-				return
-			else
-				boutput(user, SPAN_ALERT("You need at least two reinforced metal sheets to reinforce this component."))
-				return
+			src.reinforce(M, user, /obj/item/parts/robot_parts/arm/right/heavy, TRUE)
 		else ..()
 
 /obj/item/parts/robot_parts/arm/right/heavy
 	name = "heavy cyborg right arm"
 	appearanceString = "heavy"
 	icon_state = "r_arm-heavy"
+	material_amt = ROBOT_LIMB_COST + ROBOT_HEAVY_COST
 	max_health = 175
 	weight = 0.4
+	robot_movement_modifier = /datum/movement_modifier/robot_part/heavy_arm_right
 	kind_of_limb = (LIMB_ROBOT | LIMB_HEAVIER)
 
 /obj/item/parts/robot_parts/arm/right/light
 	name = "light cyborg right arm"
 	appearanceString = "light"
 	icon_state = "r_arm-light"
+	material_amt = ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 25
 	handlistPart = "armR-light"
-	robot_movement_modifier = /datum/movement_modifier/robot_part/arm_right
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_arm_right
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT)
 
 ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg)
@@ -720,6 +741,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg)
 	name = "placeholder item (don't use this!)"
 	desc = "A metal leg for a cyborg. It won't be able to move very well without this!"
 	icon_state_base = "legs" // effectively the prefix for items that go on both legs at once.
+	material_amt = ROBOT_LIMB_COST
 	max_health = 60
 	var/step_sound = "step_robo"
 	var/step_priority = STEP_PRIORITY_LOW
@@ -818,8 +840,9 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/left)
 	appearanceString = "light"
 	icon_state = "l_leg-light"
 	partlistPart = "legL-light"
+	material_amt = ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 25
-	robot_movement_modifier = /datum/movement_modifier/robotleg_left
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_leg_left
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT)
 
 /obj/item/parts/robot_parts/leg/left/treads
@@ -828,6 +851,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/left)
 	appearanceString = "treads"
 	icon_state = "l_leg-treads"
 	handlistPart = "legL-treads" // THIS ONE gets to layer with the hands because it looks ugly if jumpsuits are over it. Will fix codewise later
+	material_amt = ROBOT_TREAD_METAL_COST
 	powerdrain = 2.5
 	step_image_state = "tracksL"
 	movement_modifier = /datum/movement_modifier/robottread_left
@@ -853,8 +877,9 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 	appearanceString = "light"
 	icon_state = "r_leg-light"
 	partlistPart = "legR-light"
+	material_amt = ROBOT_LIMB_COST * ROBOT_LIGHT_COST_MOD
 	max_health = 25
-	robot_movement_modifier = /datum/movement_modifier/robotleg_right
+	robot_movement_modifier = /datum/movement_modifier/robot_part/light_leg_right
 	kind_of_limb = (LIMB_ROBOT | LIMB_LIGHT)
 
 /obj/item/parts/robot_parts/leg/right/treads
@@ -863,6 +888,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 	appearanceString = "treads"
 	icon_state = "r_leg-treads"
 	handlistPart = "legR-treads"  // THIS ONE gets to layer with the hands because it looks ugly if jumpsuits are over it. Will fix codewise later
+	material_amt = ROBOT_TREAD_METAL_COST
 	powerdrain = 2.5
 	step_image_state = "tracksR"
 	movement_modifier = /datum/movement_modifier/robottread_right
@@ -874,6 +900,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 	desc = "Is it really a good idea to give thrusters to cyborgs..? Probably not."
 	appearanceString = "thruster"
 	icon_state = "l_leg-thruster"
+	material_amt = ROBOT_THRUSTER_COST
 	max_health = 100
 	powerdrain = 5
 	step_image_state = null //It's flying so no need for this.
@@ -889,6 +916,7 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 	desc = "Is it really a good idea to give thrusters to cyborgs..? Probably not."
 	appearanceString = "thruster"
 	icon_state = "r_leg-thruster"
+	material_amt = ROBOT_THRUSTER_COST
 	max_health = 100
 	powerdrain = 5
 	step_image_state = null //It's flying so no need for this.
@@ -897,11 +925,13 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 
 	on_life()
 		var/turf/T = get_turf(src.holder)
-		T?.hotspot_expose(700, 50)
+		if(src.holder.loc == T)
+			T?.hotspot_expose(700, 50)
 
 /obj/item/parts/robot_parts/robot_frame
 	name = "robot frame"
 	icon_state = "robo_suit"
+	material_amt = ROBOT_FRAME_COST
 	max_health = 5000
 	/// This will make the borg a syndie one
 	var/syndicate = FALSE
@@ -1094,8 +1124,15 @@ ABSTRACT_TYPE(/obj/item/parts/robot_parts/leg/right)
 
 		if(src.head)
 			src.UpdateOverlays(image('icons/mob/robots.dmi', "head-" + src.head.appearanceString, FLOAT_LAYER, 2),"head")
+			var/image/smashed_image = null
+			if (istype(src.head, /obj/item/parts/robot_parts/head/screen)) //ehhhh
+				var/obj/item/parts/robot_parts/head/screen/screenhead = src.head
+				if (screenhead.smashed)
+					smashed_image = image('icons/mob/robots.dmi', "screen-smashed", dir = SOUTH)
+			src.UpdateOverlays(smashed_image, "screen-smashed")
 		else
 			src.UpdateOverlays(null,"head")
+			src.UpdateOverlays(null, "screen-smashed")
 
 		if(src.l_leg)
 			if(src.l_leg.slot == "leg_both")
diff --git a/code/obj/item/mops_cleaners.dm b/code/obj/item/mops_cleaners.dm
index fe96c896223a0..72165028ce0d0 100644
--- a/code/obj/item/mops_cleaners.dm
+++ b/code/obj/item/mops_cleaners.dm
@@ -511,10 +511,19 @@ TRASH BAG
 	return ..()
 
 /obj/item/sponge/attack_self(mob/user as mob)
+	if(spam_flag)
+		return
 	. = ..()
 	var/turf/location = get_turf(user)
+	spam_flag = 1
 	if (location)
 		src.reagents.reaction(location, TOUCH, src.reagents.total_volume)
+	//somepotato note: wtf is the thing below this
+	//mbc note : yeah that's dumb! I moved spam_flag up top to prevent reagent duplication
+	SPAWN(1 DECI SECOND) // to make sure the reagents actually react before they're cleared
+	src.reagents.clear_reagents()
+	SPAWN(1 SECOND)
+	spam_flag = 0
 
 /obj/item/sponge/attackby(obj/item/W, mob/user)
 	if (istool(W, TOOL_CUTTING | TOOL_SNIPPING))
@@ -696,6 +705,7 @@ TRASH BAG
 		BLOCK_SETUP(BLOCK_SOFT)
 
 	dropped()
+		. = ..()
 		JOB_XP(usr, "Janitor", 2)
 		return
 
@@ -813,6 +823,7 @@ TRASH BAG
 
 
 	dropped()
+		. = ..()
 		JOB_XP(usr, "Janitor", 2)
 		return
 
diff --git a/code/obj/item/mousetrap.dm b/code/obj/item/mousetrap.dm
index e28cc4276d4e5..15b68260d8d4b 100644
--- a/code/obj/item/mousetrap.dm
+++ b/code/obj/item/mousetrap.dm
@@ -38,6 +38,10 @@
 				src.grenade = new /obj/item/chem_grenade/cleaner(src)
 				return
 
+	New()
+		..()
+		RegisterSignal(src, COMSIG_MOVABLE_FLOOR_REVEALED, PROC_REF(triggered))
+
 	examine()
 		. = ..()
 		if (src.armed)
@@ -76,6 +80,7 @@
 
 	disposing()
 		clear_armer()
+		UnregisterSignal(src, COMSIG_MOVABLE_FLOOR_REVEALED)
 		. = ..()
 
 	attack_hand(mob/user)
@@ -190,8 +195,8 @@
 			C.set_loc(src)
 			src.UpdateOverlays(image(C.icon, C.icon_state), "triggerable")
 			user.show_text("You add [C] to [src].", "blue")
-
-		else if (istype(C, /obj/item/reagent_containers/food/snacks/pie) && !HAS_TRIGGERABLE(src))
+		//this check needs to exclude the arm one
+		else if (istype(C, /obj/item/reagent_containers/food/snacks/pie) && !src.grenade && !src.grenade_old && !src.pipebomb  && !src.signaler && !src.butt && !src.gimmickbomb)
 			if (src.pie)
 				user.show_text("There's already a pie attached to [src]!", "red")
 				return
@@ -401,6 +406,11 @@
 			thr.thing = src.pie
 			src.pie.throw_impact(target, thr)
 			src.pie = null
+			src.arm.set_loc(get_turf(src))
+			src.arm = null
+		else if (src.arm)
+			src.arm.set_loc(get_turf(src))
+			src.arm = null
 
 		else if (src.butt)
 			if (src.butt.sound_fart)
diff --git a/code/obj/item/nuclear_operative/designator.dm b/code/obj/item/nuclear_operative/designator.dm
index fdc687996d12e..12bf8083e7ec1 100644
--- a/code/obj/item/nuclear_operative/designator.dm
+++ b/code/obj/item/nuclear_operative/designator.dm
@@ -171,8 +171,8 @@
 		firingfrom = "Cairngorm"
 
 		New()
-			..()
 			START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+			..()
 
 		disposing()
 			STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/organ_holder.dm b/code/obj/item/organ_holder.dm
index fdf2974c05d62..1ccd3af007005 100644
--- a/code/obj/item/organ_holder.dm
+++ b/code/obj/item/organ_holder.dm
@@ -623,6 +623,7 @@
 			var/list/organ_name_parts = splittext(O.name, "'s")
 			if(length(organ_name_parts) == 2)
 				O.name = "[user_name]'s [organ_name_parts[2]]"
+				O.donor_name = user_name
 
 	//input organ = string value of organ_list assoc list
 	proc/get_organ(var/organ)
diff --git a/code/obj/item/organs/organ_parent.dm b/code/obj/item/organs/organ_parent.dm
index 361b5d518fd71..f61a07bc7bd16 100644
--- a/code/obj/item/organs/organ_parent.dm
+++ b/code/obj/item/organs/organ_parent.dm
@@ -338,7 +338,7 @@
 				src.bones.take_damage(damage_type)
 
 		// if (src.get_damage() >= max_damage)
-		if (brute_dam + burn_dam + tox_dam >= max_damage)
+		if (src.brute_dam + src.burn_dam + src.tox_dam >= src.max_damage)
 			src.breakme()
 			donor?.contract_disease(failure_disease,null,null,1)
 		health_update_queue |= donor
diff --git a/code/obj/item/organs/tail.dm b/code/obj/item/organs/tail.dm
index 8ad5da0ecefdc..dd2da91a7629d 100644
--- a/code/obj/item/organs/tail.dm
+++ b/code/obj/item/organs/tail.dm
@@ -257,6 +257,13 @@
 	organ_image_under_suit_2 = null
 	organ_image_over_suit = "cat_over_suit"
 
+/obj/item/organ/tail/cat/bingus
+	desc = "A long, not-furry tail."
+	organ_image_icon = 'icons/mob/bingus.dmi'
+	organ_image_under_suit_1 = "bingus_under_suit"
+	organ_image_under_suit_2 = null
+	organ_image_over_suit = "bingus_over_suit"
+
 /obj/item/organ/tail/roach
 	name = "roach abdomen"
 	desc = "A large insect behind."
diff --git a/code/obj/item/pinpointer.dm b/code/obj/item/pinpointer.dm
index 0bb9f54c9360d..6fc553ee74c05 100644
--- a/code/obj/item/pinpointer.dm
+++ b/code/obj/item/pinpointer.dm
@@ -194,8 +194,8 @@ TYPEINFO(/obj/item/pinpointer)
 	target_criteria = /obj/item/disk/data/floppy/read_only/authentication
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
@@ -404,6 +404,28 @@ TYPEINFO(/obj/item/pinpointer/secweapons)
 			src.turn_off()
 			boutput(user, SPAN_NOTICE("You deactivate the pinpointer"))
 
+/obj/item/pinpointer/mail_recepient
+	name = "mail recipient pinpointer"
+
+	attackby(obj/item/W, mob/user, params)
+		. = ..()
+		if (istype(W, /obj/item/random_mail))
+			var/obj/item/random_mail/package = W
+			src.target = find_by_dna(package.target_dna)
+			user.show_message(SPAN_NOTICE("Target updated."))
+
+	afterattack(atom/target, mob/user, reach, params)
+		. = ..()
+		if (istype(target, /obj/item/random_mail))
+			var/obj/item/random_mail/package = target
+			src.target = find_by_dna(package.target_dna)
+			user.show_message(SPAN_NOTICE("Target updated."))
+
+	proc/find_by_dna(var/dna)
+		for_by_tcl(H, /mob/living/carbon/human)
+			if (H.bioHolder?.Uid == dna)
+				return H
+
 //lets you click on something to pick it as a target, good for gimmicks
 /obj/item/pinpointer/picker
 	attack_self(mob/user)
diff --git a/code/obj/item/plants.dm b/code/obj/item/plants.dm
index 1f38576adb978..c69cad1f12de1 100644
--- a/code/obj/item/plants.dm
+++ b/code/obj/item/plants.dm
@@ -531,7 +531,7 @@ ABSTRACT_TYPE(/obj/item/plant/flower)
 			return TRUE
 
 	proc/prick(mob/M)
-		boutput(M, SPAN_ALERT("You prick yourself on [src]'s thorns trying to pick it up!"))
+		boutput(M, SPAN_ALERT("YOWCH! You prick yourself on [src]'s thorns trying to pick it up! Maybe you should've used gloves..."))
 		random_brute_damage(M, 3)
 		take_bleeding_damage(M, null, 3, DAMAGE_STAB)
 
diff --git a/code/obj/item/rcd.dm b/code/obj/item/rcd.dm
index bf68960c3a375..d9b70837586af 100644
--- a/code/obj/item/rcd.dm
+++ b/code/obj/item/rcd.dm
@@ -964,35 +964,36 @@ TYPEINFO(/obj/item/rcd/material/cardboard)
 
 	modes = list(RCD_MODE_FLOORSWALLS, RCD_MODE_DECONSTRUCT, RCD_MODE_WINDOWS)
 
+	/// Load the RCD from a stack of items at an (optional) fill ratio
+	proc/reload_from_stack(obj/item/stack, mob/user, fill_ratio = 1)
+		var/amount_needed = ceil((src.max_matter - src.matter) / fill_ratio)
+		var/partial_eat = FALSE
+		if(amount_needed == 0)
+			boutput(user, "\The [src] is full.")
+			return
+		if(stack.amount > amount_needed)
+			stack.change_stack_amount(-amount_needed)
+			src.matter = src.max_matter
+			partial_eat = TRUE
+		else
+			src.matter += round(stack.amount * fill_ratio)
+			qdel(stack)
+		boutput(user, "\The [src] [partial_eat ? "partially " : null]absorbs \the [stack.name] into its internal buffer, and now holds [src.matter]/[src.max_matter] [material_name]-units.")
+		src.UpdateIcon()
+
 	attackby(obj/item/W, mob/user)
 		if (istype(W, /obj/item/rcd_ammo))
 			..()
 		else if (istype(W, /obj/item/sheet)) //allow selective direct recycle (prices have been adjusted)
 			var/sheet_mat_id = W.material.getID()
 			if(sheet_mat_id == "viscerite" || sheet_mat_id == "tensed_viscerite")
-				var/partial_eat = FALSE
-				if (src.matter + W.amount > src.max_matter)
-					W.amount -= (src.max_matter - src.matter)
-					src.matter = src.max_matter
-					partial_eat = TRUE
-					W.tooltip_rebuild = 1
-				else
-					src.matter += W.amount
-					qdel(W)
-				boutput(user, "\The [src] [partial_eat ? "partially " : null]absorbs [W] into its internal buffer, and now holds [src.matter]/[src.max_matter] [material_name]-units.")
-				src.UpdateIcon()
+				src.reload_from_stack(W, user)
 		else if (isExploitableObject(W))
 			boutput(user, "Recycling [W] just doesn't work.")
 		else if (istype(W, /obj/item/raw_material/martian))
-			matter += 10
-			boutput(user, "\The [src] absorbs [W] into its internal buffer, and now holds [src.matter]/[src.max_matter] [material_name]-units.")
-			qdel(W)
-			src.UpdateIcon()
+			src.reload_from_stack(W, user, 10)
 		else if (istype(W, /obj/item/material_piece/viscerite))
-			matter += 10
-			boutput(user, "\The [src] absorbs [W] into its internal buffer, and now holds [src.matter]/[src.max_matter] [material_name]-units.")
-			qdel(W)
-			src.UpdateIcon()
+			src.reload_from_stack(W, user, 10)
 		else if (istype(W, /obj/item/reagent_containers/food/snacks/yuck))
 			matter += 0.5
 			boutput(user, "\The [src] absorbs [W] into its internal buffer, and now holds [src.matter]/[src.max_matter] [material_name]-units.")
diff --git a/code/obj/item/seeds.dm b/code/obj/item/seeds.dm
index 9d14fed1e13b3..ef624e176f7ec 100644
--- a/code/obj/item/seeds.dm
+++ b/code/obj/item/seeds.dm
@@ -37,29 +37,28 @@
 	HYPsetup_DNA(var/datum/plantgenes/passed_genes, var/obj/machinery/plantpot/harvested_plantpot, var/datum/plant/origin_plant, var/quality_status)
 		// If the crop is just straight up seeds. Don't need reagents, but we do
 		// need to pass genes and whatnot along like we did for fruit.
-		var/obj/item/seed/new_seed = src
-		if(origin_plant.unique_seed)
-			new_seed = new origin_plant.unique_seed
-			new_seed.set_loc(harvested_plantpot)
+		var/datum/plant/child_planttype = HYPgenerateplanttypecopy(src, origin_plant)
+		var/datum/plantgenes/child_genes = src.plantgenes
+		var/datum/plantmutation/child_mutation = passed_genes.mutation
+		// If the plant is a standard plant, our work here is mostly done
+		if (!child_planttype.hybrid && !origin_plant.unique_seed)
+			src.generic_seed_setup(child_planttype)
 		else
-			new_seed = new /obj/item/seed
-			new_seed.set_loc(harvested_plantpot)
-			new_seed.removecolor()
-
-		var/datum/plantgenes/HDNA = harvested_plantpot.plantgenes
-		var/datum/plantgenes/SDNA = new_seed.plantgenes
-		if(!origin_plant.unique_seed && !origin_plant.hybrid)
-			new_seed.generic_seed_setup(origin_plant, TRUE)
-		HYPpassplantgenes(HDNA,SDNA)
-		new_seed.generation = harvested_plantpot.generation
-		if(origin_plant.hybrid)
-			var/datum/plant/hybrid = new /datum/plant(new_seed)
-			for(var/V in origin_plant.vars)
-				if(issaved(origin_plant.vars[V]) && V != "holder")
-					hybrid.vars[V] = origin_plant.vars[V]
-			new_seed.planttype = hybrid
-		qdel(src)
-		return new_seed
+			src.planttype = child_planttype
+			src.plant_seed_color(child_planttype.seedcolor)
+		//Now we generate the seeds name
+		var/seedname = "[child_planttype.name]"
+		if(istype(child_mutation,/datum/plantmutation/))
+			if(!child_mutation.name_prefix && !child_mutation.name_suffix && child_mutation.name)
+				seedname = "[child_mutation.name]"
+			else if(child_mutation.name_prefix || child_mutation.name_suffix)
+				seedname = "[child_mutation.name_prefix][child_planttype.name][child_mutation.name_suffix]"
+		src.name = "[seedname] seed"
+		//What's missing is transfering genes and the generation
+		HYPpassplantgenes(passed_genes, child_genes)
+		src.generation = harvested_plantpot.generation
+		//Now the seed it created and we can release it upon the world
+		return src
 
 
 	//kudzumen can analyze seeds via ezamine when close.
diff --git a/code/obj/item/stickers.dm b/code/obj/item/stickers.dm
index 948931f5d2979..55c1555b9b485 100644
--- a/code/obj/item/stickers.dm
+++ b/code/obj/item/stickers.dm
@@ -672,6 +672,7 @@ ABSTRACT_TYPE(/obj/item/sticker/glow)
 		src.pixel_x = initial(src.pixel_x)
 		src.pixel_y = initial(src.pixel_y)
 		src.attached = null
+		src.active = FALSE
 		light_c.update(0)
 
 	green
diff --git a/code/obj/item/storage/backpack_belt_etc.dm b/code/obj/item/storage/backpack_belt_etc.dm
index 07355ead2c501..273c8c0ceddf0 100644
--- a/code/obj/item/storage/backpack_belt_etc.dm
+++ b/code/obj/item/storage/backpack_belt_etc.dm
@@ -327,8 +327,8 @@
 	spawn_contents = list(/obj/item/storage/box/starter)
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
@@ -564,8 +564,8 @@
 	slots = 7
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/storage/bible.dm b/code/obj/item/storage/bible.dm
index eac50859c631b..28a6d555066e0 100644
--- a/code/obj/item/storage/bible.dm
+++ b/code/obj/item/storage/bible.dm
@@ -13,7 +13,7 @@
 	flags = FPRINT | TABLEPASS | NOSPLASH
 	event_handler_flags = USE_FLUID_ENTER | IS_FARTABLE
 	var/mob/affecting = null
-	var/heal_amt = 10
+	var/heal_amt = 5
 
 	New()
 		..()
@@ -29,13 +29,30 @@
 		..()
 		STOP_TRACKING
 
+	proc/do_heal_amt(mob/user) // also handles using faith
+		var/faith = get_chaplain_faith(user)
+		var/used_faith = min(faith * FAITH_HEAL_USE_FRACTION, FAITH_HEAL_CAP)
+		modify_chaplain_faith(user, -used_faith)
+		return heal_amt + used_faith * FAITH_HEAL_BONUS + rand(-3, 3)
+
+	proc/do_heal_message(var/mob/user, var/mob/target, amount)
+		switch(amount)
+			if (1 to 8)
+				target.visible_message(SPAN_ALERT("<B>[user] heals [target] mending [his_or_her(target)] wounds!</B>"))
+			if (9 to 15)
+				target.visible_message(SPAN_ALERT("<B>[user] heals [target] with the power of Christ!</B>"))
+			if (16 to 24)
+				target.visible_message(SPAN_ALERT("<B>[user] heals [target] by the will of the LORD!</B>"))
+			if (25 to INFINITY)
+				target.visible_message(SPAN_ALERT("<B>[user] heals [target] in service of heaven!</B>"))
+
 	proc/bless(mob/M as mob, var/mob/user)
 		if (isvampire(M) || isvampiricthrall(M) || iswraith(M) || M.bioHolder.HasEffect("revenant"))
 			M.visible_message(SPAN_ALERT("<B>[M] burns!"))
 			var/zone = "chest"
 			if (user.zone_sel)
 				zone = user.zone_sel.selecting
-			M.TakeDamage(zone, 0, heal_amt)
+			M.TakeDamage(zone, 0, do_heal_amt(user))
 			JOB_XP(user, "Chaplain", 2)
 		else
 			var/mob/living/H = M
@@ -62,8 +79,13 @@
 							if (S)
 								S.set_up(5, 0, T, null, "#000000")
 								S.start()
-			M.HealDamage("All", heal_amt, heal_amt)
-			if(prob(40))
+			var/heal = do_heal_amt(user)
+			M.HealDamage("All", heal, heal)
+			do_heal_message(user, M, heal)
+			if (!ON_COOLDOWN(src, "faith_sound", 1.5 SECONDS))
+				SPAWN(1 DECI SECOND)
+					playsound(src.loc, 'sound/effects/faithbiblewhack.ogg', 10, FALSE, -1, (rand(94,108)/100))
+			if(prob(30 + heal))
 				JOB_XP(user, "Chaplain", 1)
 
 	attackby(var/obj/item/W, var/mob/user)
@@ -80,6 +102,7 @@
 			boutput(user, SPAN_ALERT("The book sizzles in your hands."))
 			user.TakeDamage(user.hand == LEFT_HAND ? "l_arm" : "r_arm", 0, 10)
 			return
+		var/faith = get_chaplain_faith(user)
 		if (user.bioHolder && user.bioHolder.HasEffect("clumsy") && prob(50))
 			user.visible_message(SPAN_ALERT("<b>[user]</b> fumbles and drops [src] on [his_or_her(user)] foot."))
 			random_brute_damage(user, 10)
@@ -97,9 +120,8 @@
 			// ******* Check
 			var/is_undead = isvampire(target) || iswraith(target) || target.bioHolder.HasEffect("revenant")
 			var/is_atheist = target.traitHolder?.hasTrait("atheist")
-			if (ishuman(target) && prob(60) && !(is_atheist && !is_undead))
+			if (ishuman(target) && prob(FAITH_HEAL_CHANCE + faith * FAITH_HEAL_CHANCE_MOD) && !(is_atheist && !is_undead))
 				bless(target, user)
-				target.visible_message(SPAN_ALERT("<B>[user] heals [target] with the power of Christ!</B>"))
 				var/deity = is_atheist ? "a god you don't believe in" : "Christ"
 				boutput(target, SPAN_ALERT("May the power of [deity] compel you to be healed!"))
 				var/healed = is_undead ? "damaged undead" : "healed"
diff --git a/code/obj/item/storage/food.dm b/code/obj/item/storage/food.dm
index 184b010d181f7..e6de1a1b81337 100644
--- a/code/obj/item/storage/food.dm
+++ b/code/obj/item/storage/food.dm
@@ -137,3 +137,9 @@
 	desc = "A box of generic unbranded popsicles."
 	icon_state = "popsiclebox"
 	spawn_contents = list(/obj/item/popsicle = 7)
+
+/obj/item/storage/box/popsicle_sticks
+	name = "popsicle sticks"
+	desc = "A box of popsicle sticks, used for making various kinds of sweets."
+	icon_state = "sticks"
+	spawn_contents = list(/obj/item/stick = 7)
diff --git a/code/obj/item/storage/lunchboxes.dm b/code/obj/item/storage/lunchboxes.dm
index d15946476459f..c3e3c19e576f1 100644
--- a/code/obj/item/storage/lunchboxes.dm
+++ b/code/obj/item/storage/lunchboxes.dm
@@ -42,7 +42,7 @@
 	food4
 		spawn_contents = list(/obj/item/reagent_containers/food/snacks/omelette,\
 		/obj/item/reagent_containers/food/snacks/croissant,\
-		/obj/item/reagent_containers/food/snacks/candy/caramel,\
+		/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/caramel,\
 		/obj/item/reagent_containers/food/drinks/water,\
 		/obj/item/kitchen/utensil/fork,\
 		/obj/item/paper/lunchbox_note)
@@ -81,7 +81,7 @@
 	food9
 		spawn_contents = list(/obj/item/reagent_containers/food/snacks/soup/tomato,\
 		/obj/item/reagent_containers/food/snacks/sandwich/cheese,\
-		/obj/item/reagent_containers/food/snacks/candy/taffy/watermelon,\
+		/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/watermelon,\
 		/obj/item/reagent_containers/food/drinks/water,\
 		/obj/item/kitchen/utensil/spoon,\
 		/obj/item/paper/lunchbox_note)
diff --git a/code/obj/item/storage/toolbox.dm b/code/obj/item/storage/toolbox.dm
index f082d651853d4..d64dd10f0ec32 100644
--- a/code/obj/item/storage/toolbox.dm
+++ b/code/obj/item/storage/toolbox.dm
@@ -59,6 +59,7 @@ ABSTRACT_TYPE(/obj/item/storage/toolbox)
 
 			user.drop_item(src)
 			src.set_loc(B)
+			src.storage.hide_all_huds()
 			boutput(user, "You add the tiles into the empty toolbox. They stick oddly out the top.")
 			return
 
diff --git a/code/obj/item/table_rack_parts.dm b/code/obj/item/table_rack_parts.dm
index 3718580c8227a..63c31a6b66551 100644
--- a/code/obj/item/table_rack_parts.dm
+++ b/code/obj/item/table_rack_parts.dm
@@ -438,6 +438,10 @@ TYPEINFO(/obj/item/furniture_parts/woodenstool)
 	icon = 'icons/obj/furniture/bench_yellow.dmi'
 	furniture_type = /obj/stool/bench/yellow/auto
 
+/obj/item/furniture_parts/bench/purple
+	icon = 'icons/obj/furniture/bench_purple.dmi'
+	furniture_type = /obj/stool/bench/purple/auto
+
 /obj/item/furniture_parts/bench/wooden
 	name = "wooden bench parts"
 	desc = "A collection of parts that can be used to make a wooden bench."
diff --git a/code/obj/item/tank.dm b/code/obj/item/tank.dm
index 9abfb42bc613d..916e8a5d25aa5 100644
--- a/code/obj/item/tank.dm
+++ b/code/obj/item/tank.dm
@@ -40,6 +40,8 @@ Contains:
 	var/integrity = 3
 	/// Whether or not this tank can be used in a tank transfer valve.
 	var/compatible_with_TTV = TRUE
+	/// Tank's previous pressure. Used for tanks that are going to explode
+	var/previous_pressure = null
 
 	New()
 		..()
@@ -138,6 +140,7 @@ Contains:
 	process()
 		//Allow for reactions
 		if (air_contents)
+			src.previous_pressure = MIXTURE_PRESSURE(air_contents)
 			air_contents.react()
 			src.inventory_counter.update_text("[round(MIXTURE_PRESSURE(air_contents))]\nkPa")
 		check_status()
@@ -148,14 +151,21 @@ Contains:
 			return FALSE
 		var/pressure = MIXTURE_PRESSURE(air_contents)
 		if(pressure > TANK_FRAGMENT_PRESSURE) // 50 atmospheres, or: 5066.25 kpa under current _setup.dm conditions
+			// How much pressure we needed to hit the fragment limit. Makes it so there is almost always only 3 additional reacts.
+			// (Hard limit above meant that you could get effectively either ~3.99 reacts or ~2.99, creating inconsistency in explosions)
+			var/react_compensation = ((TANK_FRAGMENT_PRESSURE - src.previous_pressure) / (pressure - src.previous_pressure))
 			//Give the gas a chance to build up more pressure through reacting
 			playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE)
 			air_contents.react()
 			air_contents.react()
-			air_contents.react()
+			air_contents.react(mult=0.5)
+			air_contents.react(mult=react_compensation)
 			pressure = MIXTURE_PRESSURE(air_contents)
 
-			var/range = (pressure - TANK_FRAGMENT_PRESSURE) / TANK_FRAGMENT_SCALE
+			//wooo magic numbers! 70 is the default volume of an air tank and quad rooting it seems to produce pretty reasonable scaling
+			// scale for pocket oxy (3L): ~0.455 | extended pocket oxy (7L): ~0.562 | handheld (70L): 1
+			var/volume_scale = (air_contents.volume / 70) ** (1/4)
+			var/range = (pressure - TANK_FRAGMENT_PRESSURE) * volume_scale / TANK_FRAGMENT_SCALE
 			// (pressure - 5066.25 kpa) divided by 1013.25 kpa
 			range = min(range, 12)
 
@@ -166,13 +176,13 @@ Contains:
 					var/turf/T = get_turf(B.loc)
 					if(T)
 						logTheThing(LOG_BOMBING, src, "exploded at [log_loc(T)], range: [range], last touched by: [src.fingerprintslast]")
-						explosion(src, T, round(range * 0.25), round(range * 0.5), round(range), round(range * 1.5))
+						explosion(src, T, range * 0.25, range * 0.5, range, range * 1.5)
 				qdel(src)
 				return
 			var/turf/epicenter = get_turf(loc)
 			logTheThing(LOG_BOMBING, src, "exploded at [log_loc(epicenter)], , range: [range], last touched by: [src.fingerprintslast]")
 			src.visible_message(SPAN_ALERT("<b>[src] explosively ruptures!</b>"))
-			explosion(src, epicenter, round(range * 0.25), round(range * 0.5), round(range), round(range * 1.5))
+			explosion(src, epicenter, range * 0.25, range * 0.5, range, range * 1.5)
 			qdel(src)
 
 		else if(pressure > TANK_RUPTURE_PRESSURE)
@@ -415,8 +425,8 @@ TYPEINFO(/obj/item/tank/jetpack)
 	extra_desc = "It's painted in a sinister yet refined shade of red."
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/teleportation.dm b/code/obj/item/teleportation.dm
index 478925f71e1c5..5cb5de12055dc 100644
--- a/code/obj/item/teleportation.dm
+++ b/code/obj/item/teleportation.dm
@@ -144,7 +144,7 @@ TYPEINFO(/obj/item/hand_tele)
 			t1 = pick(L)
 		users -= user // We're done showing the UI
 
-		if (user.stat || user.restrained())
+		if (user.stat || user.restrained() || !(src in user.equipped_list())) //let's check if you actually still HAVE the hand tele
 			return
 
 		if (t1 == "Cancel")
diff --git a/code/obj/item/tool/omnitool.dm b/code/obj/item/tool/omnitool.dm
index 136324a8fc09d..c69de5ffb7424 100644
--- a/code/obj/item/tool/omnitool.dm
+++ b/code/obj/item/tool/omnitool.dm
@@ -252,8 +252,8 @@
 		..()
 
 	New()
-		. = ..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		. = ..()
 		src.create_reagents(20)
 		reagents.add_reagent("fuel", 20)
 
diff --git a/code/obj/item/tool/weldingtool.dm b/code/obj/item/tool/weldingtool.dm
index 7e5f10f2cc05f..3238fd6014a29 100644
--- a/code/obj/item/tool/weldingtool.dm
+++ b/code/obj/item/tool/weldingtool.dm
@@ -190,6 +190,10 @@
 			reagents.remove_reagent("fuel", amount)
 		src.inventory_counter.update_number(get_fuel())
 
+	on_reagent_change(add)
+		. = ..()
+		src.inventory_counter.update_number(get_fuel())
+
 #define EYE_DAMAGE_IMMUNE 2
 #define EYE_DAMAGE_MINOR 1
 #define EYE_DAMAGE_NORMAL 0
diff --git a/code/obj/item/tool/wrench.dm b/code/obj/item/tool/wrench.dm
index 2b9002fe720b0..a8922362398a3 100644
--- a/code/obj/item/tool/wrench.dm
+++ b/code/obj/item/tool/wrench.dm
@@ -53,8 +53,8 @@
 	stamina_damage = 55
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/item/uplinks.dm b/code/obj/item/uplinks.dm
index 99614b09461cf..912f285b85842 100644
--- a/code/obj/item/uplinks.dm
+++ b/code/obj/item/uplinks.dm
@@ -438,7 +438,8 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 				var/obj/item = new I.item(get_turf(src))
 				I.run_on_spawn(item, usr, FALSE, src)
 				if (src.is_VR_uplink == 0)
-					statlog_traitor_item(usr, I.name, I.cost)
+					var/datum/eventRecord/AntagItemPurchase/antagItemPurchaseEvent = new()
+					antagItemPurchaseEvent.buildAndSend(usr, I.name, I.cost)
 			if (I.item2)
 				new I.item2(get_turf(src))
 			if (I.item3)
@@ -712,7 +713,8 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 				var/obj/item = new I.item(get_turf(src.hostpda))
 				I.run_on_spawn(item, usr)
 				if (src.is_VR_uplink == 0)
-					statlog_traitor_item(usr, I.name, I.cost)
+					var/datum/eventRecord/AntagItemPurchase/antagItemPurchaseEvent = new()
+					antagItemPurchaseEvent.buildAndSend(usr, I.name, I.cost)
 			if (I.item2)
 				new I.item2(get_turf(src.hostpda))
 			if (I.item3)
@@ -1289,14 +1291,11 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	icon = 'icons/obj/wizard.dmi'
 	icon_state = "spellbook"
 	item_state = "spellbook"
+	var/datum/antagonist/wizard/antag_datum = null
 	var/wizard_key = ""
-	var/temp = null
 	var/uses = 6
-	var/selfdestruct = 0
-	var/traitor_frequency = 0
-	var/obj/item/device/radio/origradio = null
 	var/list/spells = list()
-	flags = FPRINT | TABLEPASS
+	flags = FPRINT | TABLEPASS | TGUI_INTERACTIVE
 	c_flags = ONBELT
 	throwforce = 5
 	health = 5
@@ -1309,16 +1308,69 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	uses = 9999
 #endif
 
-	New(var/in_vr = 0)
+	New(datum/antagonist/wizard/antag, in_vr = FALSE)
 		..()
+		src.antag_datum = antag
 		if (in_vr)
 			vr = 1
 			uses *= 2
 
-		//Kubius spellbook upgrade: autonomous compendium of SWF uplink datums
-		for(var/D in (childrentypesof(/datum/SWFuplinkspell)))
+		for(var/D in typesof(/datum/SWFuplinkspell))
 			src.spells += new D(src)
 
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if (!ui)
+			ui = new(user, src, "Wizard_Spellbook")
+			ui.open()
+
+	ui_data(mob/user)
+		. = list()
+		.["spell_slots"] = src.uses
+
+	ui_static_data(mob/user)
+		. = list()
+		.["owner_name"] = user.real_name
+		.["vr"] = src.vr
+
+		var/list/spellbook_contents = list()
+		for(var/datum/SWFuplinkspell/spell in src.spells)
+			var/cooldown_contents = null
+			if (spell.eqtype != "Spell") // Disallow spell framework
+				if (!spellbook_contents[spell.eqtype]) spellbook_contents[spell.eqtype] = list() // Create category if it doesnt exist
+				if (spell.assoc_spell && ispath(spell.assoc_spell, /datum/targetable/spell))
+					var/datum/targetable/spell/spell_datum = spell.assoc_spell
+					cooldown_contents = initial(spell_datum.cooldown)
+				spellbook_contents[spell.eqtype][spell.name] = list(
+					desc = spell.desc,
+					cost = spell.cost,
+					cooldown = cooldown_contents,
+					vr_allowed = spell.vr_allowed
+				)
+
+		.["spellbook_contents"] = spellbook_contents
+
+	attack_self(mob/user)
+		if(!user.mind || (user.mind && user.mind.key != src.wizard_key))
+			boutput(user, SPAN_ALERT("<b>The spellbook is magically attuned to someone else!</b>"))
+			return
+		ui_interact(user)
+
+	ui_act(action, list/params)
+		. = ..()
+		if (.)
+			return
+		switch (action)
+			if ("buyspell")
+				var/datum/SWFuplinkspell/chosen_spell = params["spell"]
+				for (var/datum/SWFuplinkspell/spell in src.spells)
+					if (spell.name == chosen_spell)
+						chosen_spell = spell
+						break
+				if (chosen_spell.SWFspell_CheckRequirements(usr,src))
+					chosen_spell.SWFspell_Purchased(usr,src)
+
+///////////////////////////////////////// Wizard's spells ///////////////////////////////////////////////////
 /datum/SWFuplinkspell
 	var/name = "Spell"
 	var/eqtype = "Spell"
@@ -1331,23 +1383,22 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 
 	proc/SWFspell_CheckRequirements(var/mob/living/carbon/human/user,var/obj/item/SWF_uplink/book)
 		if (!user || !book)
-			return 999 // unknown error
+			return FALSE // unknown error
 		if (book.vr && !src.vr_allowed)
-			return 3
+			return FALSE // Unavailable in VR
 		if (src.assoc_spell)
-			var/datum/antagonist/wizard/antag_role = user.mind.get_antagonist(ROLE_WIZARD)
-			if (antag_role.ability_holder.getAbility(assoc_spell))
-				return 2
+			if (book.antag_datum.ability_holder.getAbility(assoc_spell))
+				return FALSE // Already have this spell
 		if (book.uses < src.cost)
-			return 1 // ran out of points
+			return FALSE // ran out of points
+		return TRUE
 
 	proc/SWFspell_Purchased(var/mob/living/carbon/human/user,var/obj/item/SWF_uplink/book)
 		if (!user || !book)
 			return
 		logTheThing(LOG_DEBUG, null, "[constructTarget(user)] purchased the spell [src.name] using the [book] uplink.")
 		if (src.assoc_spell)
-			var/datum/antagonist/wizard/antag_role = user.mind.get_antagonist(ROLE_WIZARD)
-			antag_role.ability_holder.addAbility(src.assoc_spell)
+			book.antag_datum.ability_holder.addAbility(src.assoc_spell)
 		if (src.assoc_item)
 			var/obj/item/I = new src.assoc_item(user.loc)
 			if (istype(I, /obj/item/staff) && user.mind && !isvirtual(user))
@@ -1355,6 +1406,7 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 				S.wizard_key = user.mind.key
 		book.uses -= src.cost
 
+//------------ ENCHANTMENT SPELLS ------------//
 /datum/SWFuplinkspell/soulguard
 	name = "Soulguard"
 	eqtype = "Enchantment"
@@ -1369,6 +1421,7 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 		..()
 		user.spell_soulguard = SOULGUARD_SPELL
 
+//------------ EQUIPMENT SPELLS ------------//
 /datum/SWFuplinkspell/staffofcthulhu
 	name = "Staff of Cthulhu"
 	eqtype = "Equipment"
@@ -1385,6 +1438,7 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	assoc_item = /obj/item/staff/thunder
 	cost = 2
 
+//------------ OFFENSIVE SPELLS ------------//
 /datum/SWFuplinkspell/bull
 	name = "Bull's Charge"
 	eqtype = "Offensive"
@@ -1464,6 +1518,7 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	desc = "Fires a bolt of electricity in a cardinal direction. Causes decent damage, and can go through thin walls and solid objects. You need special HAZARDOUS robes to cast this!"
 	assoc_verb = */
 
+//------------ DEFENSIVE SPELLS ------------//
 /datum/SWFuplinkspell/forcewall
 	name = "Forcewall"
 	eqtype = "Defensive"
@@ -1505,6 +1560,7 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	assoc_spell = /datum/targetable/spell/doppelganger
 	cost = 2
 
+//------------ UTILITY SPELLS ------------//
 /datum/SWFuplinkspell/knock
 	name = "Knock"
 	eqtype = "Utility"
@@ -1536,187 +1592,10 @@ Note: Add new traitor items to syndicate_buylist.dm, not here.
 	desc = "This spell infuses an adjacent human corpse with necromantic energy, creating a durable skeleton minion that seeks to pummel your enemies into oblivion."
 	assoc_spell = /datum/targetable/spell/animatedead
 
+//------------ MISC SPELLS ------------//
 /datum/SWFuplinkspell/pandemonium
 	name = "Pandemonium"
 	eqtype = "Miscellaneous"
 	desc = "This spell causes random effects to happen. Best used only by skilled wizards."
 	vr_allowed = 0
 	assoc_spell = /datum/targetable/spell/pandemonium
-
-
-
-/obj/item/SWF_uplink/proc/explode()
-	var/turf/location = get_turf(src.loc)
-	location.hotspot_expose(700, 125)
-
-	explosion(src, location, 0, 0, 2, 4)
-
-	qdel(src.master)
-	qdel(src)
-	return
-
-/obj/item/SWF_uplink/attack_self(mob/user as mob)
-	if(!user.mind || (user.mind && user.mind.key != src.wizard_key))
-		boutput(user, SPAN_ALERT("<b>The spellbook is magically attuned to someone else!</b>"))
-		return
-	src.add_dialog(user)
-	var/html = {"
-[(user.client && !user.client.use_chui) ? "<!doctype html>\n<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"pragma\" content=\"no-cache\"><style type='text/css'>body { font-family: Tahoma, sans-serif; font-size: 10pt; }</style><title>Wizard Spellbook</title></head><body>" : ""]
-
-<style type="text/css">
-	.spell {
-		position: relative;
-	}
-
-	.spell:hover {
-		background: #ddd;
-	}
-	.spell div {
-		display: none;
-		position: absolute;
-		right: 0;
-		top: -1em;
-		background: #ddd;
-		color: black;
-		padding: 0.1em 0.3em;
-		width: 50%;
-		font-size: 80%;
-		z-index: 9999;
-	}
-	.spell:hover div {
-		display: block;
-	}
-	.cantbuy {
-		opacity: 0.7;
-	}
-
-	.buyme, .owned {
-		font-weight: bold;
-	}
-
-	.owned {
-		background: rgba(0, 255, 0, 0.3);
-	}
-	.spell em {
-		color: #888;
-		margin-left: 1em;
-		font-size: 90%;
-		}
-	.spelllink { font-weight: bold; }
-</style>
-	<h3>[user.real_name]'s Spellbook</h3>
-	Spell slots remaining: [src.uses]
-	"}
-	var/list/spell_group = list()
-	var/rowclass = ""
-	var/rowtext = ""
-	var/link = ""
-	var/unusable = 0
-	for (var/datum/SWFuplinkspell/SP in src.spells)
-		var/cooldown = null
-
-		if (SP.assoc_spell && ispath(SP.assoc_spell, /datum/targetable/spell))
-			var/datum/targetable/spell/SPdatum = SP.assoc_spell
-			cooldown = initial(SPdatum.cooldown)
-
-		unusable = SP.SWFspell_CheckRequirements(user, src)
-		switch (unusable)
-			if (1)
-				rowclass = "cantbuy"
-				rowtext = ""
-			if (2)
-				rowclass = "owned"
-				rowtext = "Acquired!"
-			if (3)
-				rowclass = "vr"
-				rowtext = "Unavailable in VR"
-			if (999)
-				rowclass = "cantbuy"
-				rowtext = "Error???"
-			else
-				rowclass = "buyme"
-				rowtext = ""
-
-		if (!spell_group[SP.eqtype])
-			spell_group[SP.eqtype] = list("<center><b>[SP.eqtype]</b></center>")
-
-		if (!unusable)
-			link = "<a href='byond://?src=\ref[src];buyspell=\ref[SP]'><span class='spelllink [rowclass]'>[SP.name] - cost: [SP.cost]</span></a>"
-		else
-			link = "<span class='spelllink [rowclass]'>[SP.name] - cost: [SP.cost]</span>"
-
-		spell_group[SP.eqtype] += "<div class='spell'>[link]<em>[rowtext]</em><div>[SP.desc][cooldown ? "<br><b>Cooldown: [cooldown / 10] sec.</b>" : ""]</div></div>"
-
-
-	for (var/L in spell_group)
-		html += jointext(spell_group[L], "")
-
-	user.Browse(jointext(html, ""), "window=radio")
-	onclose(user, "radio")
-	return
-
-/obj/item/SWF_uplink/Topic(href, href_list)
-	..()
-	if (usr.stat || usr.restrained())
-		return
-	var/mob/living/carbon/human/H = usr
-	if (!( ishuman(H)))
-		return 1
-	if ((usr.contents.Find(src) || (in_interact_range(src,usr) && istype(src.loc, /turf))))
-		src.add_dialog(usr)
-
-		if (href_list["buyspell"])
-			var/datum/SWFuplinkspell/SP = locate(href_list["buyspell"])
-			switch(SP.SWFspell_CheckRequirements(usr,src))
-				if(1) boutput(usr, SPAN_ALERT("You have no more magic points to spend."))
-				if(2) boutput(usr, SPAN_ALERT("You already have this spell."))
-				if(3) boutput(usr, SPAN_ALERT("This spell isn't availble in VR."))
-				if(999) boutput(usr, SPAN_ALERT("Unknown Error."))
-				else
-					SP.SWFspell_Purchased(usr,src)
-
-		else if (href_list["aboutspell"])
-			var/datum/SWFuplinkspell/SP = locate(href_list["aboutspell"])
-			src.temp = "[SP.desc]"
-			if (SP.cooldown)
-				src.temp += "<BR>It takes [SP.cooldown] seconds to recharge after use."
-
-		else if (href_list["lock"] && src.origradio)
-			// presto chango, a regular radio again! (reset the freq too...)
-			src.remove_dialog(usr)
-			usr.Browse(null, "window=radio")
-			var/obj/item/device/radio/T = src.origradio
-			var/obj/item/SWF_uplink/R = src
-			R.set_loc(T)
-			T.set_loc(usr)
-			// R.layer = initial(R.layer)
-			R.layer = 0
-			usr.u_equip(R)
-			usr.put_in_hand_or_drop(T)
-			R.set_loc(T)
-			T.set_frequency(initial(T.frequency))
-			T.attack_self(usr)
-			return
-
-		else if (href_list["selfdestruct"])
-			src.temp = "<A href='byond://?src=\ref[src];selfdestruct2=1'>Self-Destruct</A>"
-
-		else if (href_list["selfdestruct2"])
-			src.selfdestruct = 1
-			SPAWN(10 SECONDS)
-				explode()
-				return
-		else
-			if (href_list["temp"])
-				src.temp = null
-
-		if (ismob(src.loc))
-			attack_self(src.loc)
-		else
-			for(var/mob/M in viewers(1, src))
-				if (M.client)
-					src.attack_self(M)
-
-	//if (istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
-	//	H.wear_suit.check_abilities()
-	return
diff --git a/code/obj/landmark.dm b/code/obj/landmark.dm
index ff8f26dc93c1e..dd97d01ae4ea5 100644
--- a/code/obj/landmark.dm
+++ b/code/obj/landmark.dm
@@ -334,7 +334,7 @@ var/global/list/job_start_locations = list()
 
 /obj/landmark/escape_pod_succ
 	name = LANDMARK_ESCAPE_POD_SUCCESS
-	icon_state = "xp"
+	icon_state = "escape_pod_succ"
 
 	New()
 		src.data = src.dir
diff --git a/code/obj/machinery/computer.dm b/code/obj/machinery/computer.dm
index 98f75011caff8..0044eac0157b0 100644
--- a/code/obj/machinery/computer.dm
+++ b/code/obj/machinery/computer.dm
@@ -76,7 +76,7 @@
 		A.set_dir(src.dir)
 		A.circuit = M
 		A.anchored = ANCHORED
-		src.special_deconstruct(A)
+		src.special_deconstruct(A, user)
 		qdel(src)
 
 	///Put the code for finding the stuff your computer needs in this proc
@@ -84,7 +84,7 @@
 	//Placeholder so the multitool probing thing can go on this parent
 
 	///Special changes for deconstruction can be added by overriding this
-	proc/special_deconstruct(var/obj/computerframe/frame as obj)
+	proc/special_deconstruct(var/obj/computerframe/frame as obj, mob/user)
 
 
 /*
diff --git a/code/obj/machinery/computer/announcement.dm b/code/obj/machinery/computer/announcement.dm
index 15c12bb85b467..4111cbe20e905 100644
--- a/code/obj/machinery/computer/announcement.dm
+++ b/code/obj/machinery/computer/announcement.dm
@@ -5,14 +5,13 @@
 	icon_state = "announcement"
 	machine_registry_idx = MACHINES_ANNOUNCEMENTS
 	circuit_type = /obj/item/circuitboard/announcement
+	var/theme = "ntos"
 	var/announcement_delay = 1200
 	var/obj/item/card/id/ID = null
 	var/unlocked = 0
 	var/announce_status = "Insert Card"
-	var/message = ""
-	var/inhibit_updates = 0
+	var/max_length = 400
 	var/announces_arrivals = 0
-	var/arrival_announcements_enabled = 1
 	var/say_language = "english"
 	var/arrivalalert = "$NAME has signed up as $JOB."
 	var/departurealert = "$NAME the $JOB has entered cryogenic storage."
@@ -32,33 +31,6 @@
 		if (src.announces_arrivals)
 			src.announcement_radio = new(src)
 
-	process()
-		if (!inhibit_updates) src.updateUsrDialog()
-
-	attack_hand(mob/user)
-		if(..()) return
-		if(isghostdrone(user))
-			boutput(user, SPAN_ALERT("Your processors refuse to interact with this machine!"))
-			return 1
-		src.add_dialog(user)
-		var/dat = {"
-			<body>
-				<h1>Announcement Computer</h1>
-				<hr>
-				Status: [announce_status]<BR>
-				Card: <a href='?src=\ref[src];card=1'>[src.ID ? src.ID.name : "--------"]</a><br>
-				Broadcast delay: [nice_timer(user)]<br>
-				<br>
-				Message: "<a href='?src=\ref[src];edit_message=1'>[src.message ? src.message : "___________"]</a>" <a href='?src=\ref[src];clear_message=1'>(Clear)</a><br>
-				<br>
-				<b><a href='?src=\ref[src];send_message=1'>Transmit</a></b>
-			"}
-		if (src.announces_arrivals)
-			dat += "<hr>[src.arrival_announcements_enabled ? "Arrival Announcement Message: \"[src.arrivalalert]\"<br><br><b><a href='?src=\ref[src];set_arrival_message=1'>Change</a></b><br><b><a href='?src=\ref[src];toggle_arrival_message=1'>Disable</a></b>" : "Arrival Announcements Disabled<br><br><b><a href='?src=\ref[src];toggle_arrival_message=1'>Enable</a></b>"]"
-		dat += "</body>"
-		user.Browse(dat, "window=announcementcomputer")
-		onclose(user, "announcementcomputer")
-
 	attackby(obj/item/W, mob/user)
 		if (istype(W, /obj/item/card/id))
 			if (src.ID)
@@ -69,80 +41,82 @@
 			src.ID = W
 			src.unlocked = check_access(ID, 1)
 			boutput(user, SPAN_NOTICE("You insert [W]."))
+			update_status()
+
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if(!ui)
+			ui = new(user, src, "AnnouncementComputer", src.name)
+			ui.open()
+
+	ui_data(mob/user)
+		. = list(
+			"theme" = src.theme,
+			"card_name" = src.ID ? src.ID.name : null,
+			"status_message" = src.announce_status,
+			"time" = get_time(user) SECONDS,
+			"announces_arrivals" = 	src.announces_arrivals,
+			"arrivalalert" = src.arrivalalert,
+			"max_length" = src.max_length
+		)
+
+	ui_act(action, params)
+		. = ..()
+		if (.)
 			return
-		..()
-
-	Topic(href, href_list[])
-		if(..()) return 1
-		if(isghostdrone(usr))
-			return 1
-
-		if(href_list["card"])
-			if(src.ID)
-				src.ID.set_loc(src.loc)
-				usr.put_in_hand_or_eject(src.ID) // try to eject it into the users hand, if we can
-				src.ID = null
-				src.unlocked = 0
-			else
-				var/obj/item/I = usr.equipped()
-				if (istype(I, /obj/item/card/id))
-					usr.drop_item()
-					I.set_loc(src)
-					src.ID = I
-					src.unlocked = check_access(ID, 1)
-				else if (istype(I, /obj/item/magtractor))
-					var/obj/item/magtractor/mag = I
-					if (istype(mag.holding, /obj/item/card/id))
-						I = mag.holding
-						mag.dropItem(0)
+		switch(action)
+			if ("id")
+				if(src.ID)
+					src.ID.set_loc(src.loc)
+					usr.put_in_hand_or_eject(src.ID) // try to eject it into the users hand, if we can
+					src.ID = null
+					src.unlocked = 0
+				else
+					var/obj/item/I = usr.equipped()
+					if (istype(I, /obj/item/card/id))
+						usr.drop_item()
 						I.set_loc(src)
 						src.ID = I
 						src.unlocked = check_access(ID, 1)
-
-		else if(href_list["edit_message"])
-			inhibit_updates = 1
-			message = html_encode(trim(tgui_input_text(usr, "Select what you wish to announce.", "Announcement", message, max_length=400)))
-			if(url_regex?.Find(message)) message = ""
-			inhibit_updates = 0
-			playsound(src.loc, "keyboard", 50, 1, -15)
-
-		else if (href_list["clear_message"])
-			message = ""
-
-		else if (href_list["send_message"])
-			send_message(usr)
-
-		else if (href_list["set_arrival_message"])
-			inhibit_updates = 1
-			src.set_arrival_alert(usr)
-			inhibit_updates = 0
-
-		else if (href_list["toggle_arrival_message"])
-			src.arrival_announcements_enabled = !(src.arrival_announcements_enabled)
-			boutput(usr, "Arrival announcements [src.arrival_announcements_enabled ? "en" : "dis"]abled.")
-
-		update_status()
-		src.updateUsrDialog()
+					else if (istype(I, /obj/item/magtractor))
+						var/obj/item/magtractor/mag = I
+						if (istype(mag.holding, /obj/item/card/id))
+							I = mag.holding
+							mag.dropItem(0)
+							I.set_loc(src)
+							src.ID = I
+							src.unlocked = check_access(ID, 1)
+				. = TRUE
+				update_status()
+			if ("transmit")
+				src.send_message(usr, params["value"])
+				. = TRUE
+			if ("arrival_message")
+				src.set_arrival_alert(usr, params["value"])
+				. = TRUE
+			if ("log")
+				logTheThing(LOG_STATION, usr, "Sets an announcement message to \"[params["value"]]\" from \"[params["old"]]\".")
 
 	proc/update_status()
 		if(!src.ID)
 			announce_status = "Insert Card"
 		else if(!src.unlocked)
 			announce_status = "Insufficient Access"
-		else if(!message)
-			announce_status = "Input message."
-		else if(get_time(usr) > 0)
-			announce_status = "Broadcast delay in effect."
 		else
-			announce_status = "Ready to transmit!"
+			announce_status = ""
 
-	proc/send_message(var/mob/user)
-		if(!message || !unlocked || get_time(user) > 0) return
+	proc/send_message(var/mob/user, message)
+		if(!message || length_char(message) > max_length || !unlocked || get_time(user) > 0) return
 		var/area/A = get_area(src)
 
 		if(user.bioHolder.HasEffect("mute"))
 			boutput(user, "You try to speak into \the [src] but you can't since you are mute.")
 			return
+		if(url_regex?.Find(message))
+			boutput(src, SPAN_NOTICE("<b>Web/BYOND links are not allowed in ingame chat.</b>"))
+			boutput(src, SPAN_ALERT("&emsp;<b>\"[message]</b>\""))
+			return
+		message = sanitize(adminscrub(message, src.max_length))
 
 		logTheThing(LOG_SAY, user, "as [ID.registered] ([ID.assignment]) created a command report: [message]")
 		logTheThing(LOG_DIARY, user, "as [ID.registered] ([ID.assignment]) created a command report: [message]", "say")
@@ -157,32 +131,13 @@
 
 		command_announcement(message, "[A.name] Announcement by [ID.registered] ([ID.assignment])", msg_sound)
 		ON_COOLDOWN(user,"announcement_computer",announcement_delay)
-		message = ""
-
-	proc/nice_timer(mob/user)
-		var/time = get_time(user)
-		if(time < 0)
-			return "--:--"
-		else
-			var/seconds = text2num(time) % 60 //ZeWaka: Should fix type mismatches.
-			var/flick_seperator = (seconds % 2 == 0) // why was this being calculated after converting BACK into a string?!!! - cirr
-			// VARIABLES SHOULDN'T CHANGE TYPE FROM STRING TO NUMBER TO STRING LIKE THIS IN LIKE SIX LINES AAGGHHHHH FUCK YOU DYNAMIC TYPING
-			var/minutes = round(text2num((time - seconds) / 60))
-			minutes = minutes < 10 ? "0[minutes]" : "[minutes]"
-			seconds = seconds < 10 ? "0[seconds]" : "[seconds]"
-
-			return "[minutes][flick_seperator ? ":" : " "][seconds]"
 
 	proc/get_time(mob/user)
 		return round(GET_COOLDOWN(user,"announcement_computer") / 10)
 
-	proc/set_arrival_alert(var/mob/user)
-		if (!user)
-			return
-		var/newalert = tgui_input_text(user, "Please enter a new arrival alert message. Valid tokens: $NAME, $JOB, $STATION, $THEY, $THEM, $THEIR", "Custom Arrival Alert", src.arrivalalert)
-		if (!in_interact_range(src, user))
-			return
+	proc/set_arrival_alert(var/mob/user, newalert)
 		if (!newalert)
+			src.arrivalalert = ""
 			return
 		if (!findtext(newalert, "$NAME"))
 			user.show_text("The alert needs at least one $NAME token.", "red")
@@ -192,7 +147,6 @@
 			return
 		src.arrivalalert = sanitize(adminscrub(newalert, 200))
 		logTheThing(LOG_STATION, user, "sets the arrival announcement on [constructTarget(src,"station")] to \"[src.arrivalalert]\"")
-		user.show_text("Arrival alert set to '[newalert]'", "blue")
 		playsound(src.loc, "keyboard", 50, 1, -15)
 		return
 
@@ -208,6 +162,8 @@
 	proc/announce_arrival(var/mob/living/person)
 		if (!src.announces_arrivals)
 			return 1
+		if (!src.arrivalalert)
+			return 1
 		if ((person.traitHolder.hasTrait("stowaway")) || (person.traitHolder.hasTrait("pilot")) || (person.traitHolder.hasTrait("sleepy")))
 			return 1 //people who have been on the ship the whole time, or who aren't on the ship, won't be announced
 		if (!src.announcement_radio)
@@ -252,3 +208,4 @@
 		req_access = null
 		name = "Syndicate Announcement computer"
 		voice_name = "Syndicate Announcement Computer"
+		theme = "syndicate"
diff --git a/code/obj/machinery/computer/robotics.dm b/code/obj/machinery/computer/robotics.dm
index ce8c5d9b5a547..69a542b5756b3 100644
--- a/code/obj/machinery/computer/robotics.dm
+++ b/code/obj/machinery/computer/robotics.dm
@@ -30,7 +30,8 @@
 	..()
 	return
 
-/obj/machinery/computer/robotics/special_deconstruct(obj/computerframe/frame as obj)
+/obj/machinery/computer/robotics/special_deconstruct(obj/computerframe/frame as obj, mob/user)
+	logTheThing(LOG_STATION, src, "is deconstructed by [key_name(user)] at [log_loc(src)]")
 	frame.circuit.id = src.id
 
 /obj/machinery/computer/robotics/process()
diff --git a/code/obj/machinery/computer/shuttle.dm b/code/obj/machinery/computer/shuttle.dm
index 38469800c65ba..5146920dd0bfd 100644
--- a/code/obj/machinery/computer/shuttle.dm
+++ b/code/obj/machinery/computer/shuttle.dm
@@ -365,7 +365,8 @@ var/bombini_saved
 		if(!choice || emergency_shuttle.location != SHUTTLE_LOC_STATION || BOUNDS_DIST(user, src) > 0) return
 		switch(choice)
 			if("Authorize")
-				for (var/datum/flock/flock in flocks)
+				for (var/flockname in flocks)
+					var/datum/flock/flock = flocks[flockname]
 					if (flock.relay_in_progress)
 						boutput(user, "Unable to contact central command, authorization rejected.")
 						return
diff --git a/code/obj/machinery/deep_fryer.dm b/code/obj/machinery/deep_fryer.dm
index 1042e049acc7d..b4b5ffb34b1d9 100644
--- a/code/obj/machinery/deep_fryer.dm
+++ b/code/obj/machinery/deep_fryer.dm
@@ -212,7 +212,9 @@ TYPEINFO(/obj/machinery/deep_fryer)
 /obj/machinery/deep_fryer/proc/fryify(atom/movable/thing, burnt=FALSE)
 	var/obj/item/reagent_containers/food/snacks/shell/deepfry/fryholder = new(src)
 
-	if(burnt)
+	//photos cause exponential lag when deepfried, see #17848
+	//feel free to remove this if you can figure out why
+	if(burnt || istype(thing, /obj/item/photo))
 		if (ismob(thing))
 			var/mob/M = thing
 			M.ghostize()
diff --git a/code/obj/machinery/dialysis.dm b/code/obj/machinery/dialysis.dm
index e6e8948575616..7a7b93e67d245 100644
--- a/code/obj/machinery/dialysis.dm
+++ b/code/obj/machinery/dialysis.dm
@@ -29,6 +29,7 @@ TYPEINFO(/obj/machinery/dialysis)
 			CRASH("[src] tried to fetch the global chem whitelist but it has a length of 0!")
 		src.whitelist = chem_whitelist
 		src.UpdateIcon()
+		UnsubscribeProcess()
 
 	disposing()
 		if (src.patient)
@@ -87,8 +88,8 @@ TYPEINFO(/obj/machinery/dialysis)
 
 		if (!in_interact_range(src, src.patient))
 			var/fluff = pick("pulled", "yanked", "ripped")
-			src.patient.visible_message(SPAN_ALERT("<b>[src]'s cannulae gets [fluff] out of [src.patient]'s arm!</b>"),\
-			SPAN_ALERT("<b>[src]'s cannulae gets [fluff] out of your arm!</b>"))
+			src.patient.visible_message(SPAN_ALERT("<b>[src]'s cannulae get [fluff] out of [src.patient]'s arm!</b>"),\
+			SPAN_ALERT("<b>[src]'s cannulae get [fluff] out of your arm!</b>"))
 			src.audible_message(SPAN_SAY("[SPAN_NAME("[src]")] beeps, \"No blood pressure detected.\""))
 			src.stop_dialysis()
 			return
@@ -156,6 +157,7 @@ TYPEINFO(/obj/machinery/dialysis)
 			return boutput(user, SPAN_ALERT("[src] already has a patient attached!"))
 		src.patient = new_patient
 		src.patient.setStatus("dialysis", INFINITE_STATUS, src)
+		APPLY_ATOM_PROPERTY(patient, PROP_MOB_BLOOD_ABSORPTION_RATE, src, 3)
 		src.power_usage = 500
 		src.patient_blood_id = src.patient.blood_id
 		src.UpdateIcon()
@@ -166,6 +168,7 @@ TYPEINFO(/obj/machinery/dialysis)
 		var/list/datum/statusEffect/statuses = src.patient?.getStatusList("dialysis", src) //get our particular status effect
 		if (length(statuses))
 			src.patient.delStatus(statuses[1])
+		REMOVE_ATOM_PROPERTY(patient, PROP_MOB_BLOOD_ABSORPTION_RATE, src)
 		src.patient = null
 		src.patient_blood_id = null
 		src.output_blood_colour = null
diff --git a/code/obj/machinery/door/airlock.dm b/code/obj/machinery/door/airlock.dm
index 5972edf89dc98..ffc6ae0bf2b4c 100644
--- a/code/obj/machinery/door/airlock.dm
+++ b/code/obj/machinery/door/airlock.dm
@@ -8,151 +8,6 @@
 /// a global associative list of all airlocks linked together by cycling mechanisms. Indexed by ID
 var/global/list/cycling_airlocks = list()
 
-/*
-	New methods:
-	pulse - sends a pulse into a wire for hacking purposes
-	cut - cuts a wire and makes any necessary state changes
-	mend - mends a wire and makes any necessary state changes
-	isWireColorCut - returns 1 if that color wire is cut, or 0 if not
-	isWireCut - returns 1 if that wire (e.g. AIRLOCK_WIRE_DOOR_BOLTS) is cut, or 0 if not
-	canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in)
-	canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it.
-	arePowerSystemsOn - 1 if the main or backup power are functioning, 0 if not. Does not check whether the power grid is charged or an APC has equipment on or anything like that. (Check (src.status & NOPOWER) for that)
-	requiresIDs - 1 if the airlock is requiring IDs, 0 if not
-	isAllPowerCut - 1 if the main and backup power both have cut wires.
-	regainMainPower - handles the effects of main power coming back on.
-	loseMainPower - handles the effects of main power going offline. Usually (if one isn't already running) spawn a thread to count down how long it will be offline - counting down won't happen if main power was completely cut along with backup power, though, the thread will just sleep.
-	loseBackupPower - handles the effects of backup power going offline.
-	regainBackupPower - handles the effects of main power coming back on.
-	shock - has a chance of electrocuting its target.
-*/
-
-ADMIN_INTERACT_PROCS(/obj/machinery/door/airlock, proc/play_deny, proc/toggle_bolt, proc/shock_temp, proc/shock_perm, proc/shock_restore)
-
-/obj/machinery/door/airlock/proc/shock_temp(mob/user)
-	//electrify door for 30 seconds
-	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
-		boutput(user, "The door has no power - you can't electrify it.")
-		return
-	if(!src.can_shock)
-		boutput(user, "This door is unable to be electrified, you cannot shock it.")
-		return
-	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
-		boutput(user, SPAN_ALERT("The electrification wire has been cut.<br><br>"))
-	else if (src.secondsElectrified==-1)
-		boutput(user, SPAN_ALERT("The door is already indefinitely electrified. You'd have to un-electrify it before you can re-electrify it with a non-forever duration.<br><br>"))
-	else if (src.secondsElectrified!=0)
-		boutput(user, SPAN_ALERT("The door is already electrified. You can't re-electrify it while it's already electrified.<br><br>"))
-	else
-		src.secondsElectrified = 30
-		logTheThing(LOG_COMBAT, user || usr, "electrified airlock ([src]) at [log_loc(src)] for 30 seconds.")
-		message_admins("[key_name(user || usr)] electrified airlock ([src]) at [log_loc(src)] for 30 seconds.")
-		SPAWN(1 SECOND)
-			while (src.secondsElectrified>0)
-				src.secondsElectrified-=1
-				if (src.secondsElectrified<0)
-					src.secondsElectrified = 0
-				sleep(1 SECOND)
-
-/obj/machinery/door/airlock/proc/toggle_bolt(mob/user)
-	if (src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
-		boutput(user, SPAN_ALERT("You can't drop the door bolts - The door bolt dropping wire has been cut."))
-		return
-	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
-		boutput(user, SPAN_ALERT("The door has no power - you can't raise/lower the door bolts."))
-		return
-	if(src.locked)
-		src.set_unlocked()
-	else
-		logTheThing(LOG_STATION, user || usr, "[user || usr] has bolted a door at [log_loc(src)].")
-		src.set_locked()
-
-/obj/machinery/door/airlock/proc/shock_perm(mob/user)
-	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
-		boutput(user, SPAN_ALERT("The door has no power - you can't electrify it."))
-		return
-	//electrify door indefinitely
-	if(!src.can_shock)
-		boutput(user, SPAN_ALERT("This door is unable to be electrified.<br><br>"))
-	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
-		boutput(user, SPAN_ALERT("The electrification wire has been cut.<br><br>"))
-	else if (src.secondsElectrified==-1)
-		boutput(user, SPAN_ALERT("The door is already indefinitely electrified.<br><br>"))
-	else if (src.secondsElectrified!=0)
-		boutput(user, SPAN_ALERT("The door is already electrified. You can't re-electrify it while it's already electrified.<br><br>"))
-	else
-		logTheThing(LOG_COMBAT, user || usr, "electrified airlock ([src]) at [log_loc(src)] indefinitely.")
-		message_admins("[key_name(user || usr)] electrified airlock ([src]) at [log_loc(src)] indefinitely.")
-		src.secondsElectrified = -1
-
-/obj/machinery/door/airlock/proc/shock_restore(mob/user)
-	//un-electrify door
-	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
-		boutput(user, "The door has no power - you can't electrify it.")
-		return
-	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
-		boutput(user, SPAN_ALERT("Can't un-electrify the airlock - The electrification wire is cut.<br><br>"))
-	else if (src.secondsElectrified!=0)
-		src.secondsElectrified = 0
-		logTheThing(LOG_COMBAT, user || usr, "de-electrified airlock ([src]) at [log_loc(src)].")
-		message_admins("[key_name(user || usr)] de-electrified airlock ([src]) at [log_loc(src)].")
-
-
-/obj/machinery/door/airlock/proc/idscantoggle(mob/user)
-	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
-		boutput(user, SPAN_ALERT("The door has no power - you toggle the ID scanner."))
-		return
-	//enable/disable ID scanner
-	if (src.isWireCut(AIRLOCK_WIRE_IDSCAN))
-		boutput(user, "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways.")
-	else
-		src.aiDisabledIdScanner = !src.aiDisabledIdScanner
-
-
-/obj/machinery/door/airlock/proc/user_toggle_open(mob/user)
-	if (src.operating == 1)
-		return
-	if((!src.arePowerSystemsOn()) || (src.status & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_OPEN_DOOR))
-		boutput(user, SPAN_ALERT("The door has no power - you can't open/close it."))
-		return
-	if(src.welded)
-		boutput(user, SPAN_ALERT("The airlock has been welded shut!"))
-	else if(locked)
-		boutput(user, SPAN_ALERT("The door bolts are down!"))
-	else if(!density)
-		close()
-	else
-		open()
-
-
-//This generates the randomized airlock wire assignments for the game.
-/proc/RandomAirlockWires()
-	//to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else).
-	var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-	airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-	airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-	airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-	var/flagIndex = 1
-	for (var/flag=1, flag<1024, flag+=flag)
-		var/valid = 0
-		while (!valid)
-			var/colorIndex = rand(1, 10)
-			if (wires[colorIndex]==0)
-				valid = 1
-				wires[colorIndex] = flag
-				airlockIndexToFlag[flagIndex] = flag
-				airlockIndexToWireColor[flagIndex] = colorIndex
-				airlockWireColorToIndex[colorIndex] = flagIndex
-		flagIndex+=1
-	return wires
-
-/* Example:
-Airlock wires color -> flag are { 64, 128, 256, 2, 16, 4, 8, 32, 1 }.
-Airlock wires color -> index are { 7, 8, 9, 2, 5, 3, 4, 6, 1 }.
-Airlock index -> flag are { 1, 2, 4, 8, 16, 32, 64, 128, 256 }.
-Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
-*/
-
 /obj/machinery/door/airlock
 	name = "airlock"
 	icon = 'icons/obj/doors/SL_doors.dmi'
@@ -222,6 +77,10 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
 			if(0 to 24)
 				. += "It is barely intact!"
 
+// ==============================================================
+// ========================== procs =============================
+// ==============================================================
+
 /obj/machinery/door/airlock/New()
 	..()
 	if(!isrestrictedz(src.z) && src.name == initial(src.name)) //The second half prevents varedited names being overwritten
@@ -245,710 +104,18 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
 		return 0
 	.= ..()
 
-/obj/machinery/door/airlock/command
-	name = "command airlock"
-	icon = 'icons/obj/doors/Doorcom.dmi'
-	req_access = list(access_heads)
-
-/obj/machinery/door/airlock/security
-	name = "security airlock"
-	icon = 'icons/obj/doors/Doorsec.dmi'
-	req_access = list(access_security)
-
-/obj/machinery/door/airlock/engineering
-	name = "engineering airlock"
-	icon = 'icons/obj/doors/Dooreng.dmi'
-	req_access = list(access_engineering)
-
-/obj/machinery/door/airlock/medical
-	name = "medical airlock"
-	icon = 'icons/obj/doors/doormed.dmi'
-	req_access = list(access_medical)
-
-/obj/machinery/door/airlock/maintenance
-	name = "maintenance airlock"
-	icon = 'icons/obj/doors/Doormaint.dmi'
-	req_access = list(access_maint_tunnels)
-
-/obj/machinery/door/airlock/external
-	name = "external airlock"
-	icon = 'icons/obj/doors/Doorext.dmi'
-	sound_airlock = 'sound/machines/airlock.ogg'
-	opacity = 0
-	visible = 0
-	operation_time = 10
-
-TYPEINFO(/obj/machinery/door/airlock/syndicate)
-	mats = 0
-
-/obj/machinery/door/airlock/syndicate // fuck our players for making us (or at least me) need this
-	name = "reinforced external airlock"
-	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
-	icon = 'icons/obj/doors/Doorext.dmi'
-	req_access_txt = "52"
-	cant_emag = TRUE
-	cyborgBumpAccess = FALSE
-	hardened = TRUE
-	aiControlDisabled = TRUE
-	object_flags = BOTS_DIRBLOCK
-
-/obj/machinery/door/airlock/syndicate/meteorhit()
-	return
-
-/obj/machinery/door/airlock/syndicate/ex_act()
-	return
-
-TYPEINFO(/obj/machinery/door/airlock/centcom)
-	mats = 0
-
-/obj/machinery/door/airlock/centcom
-	icon = 'icons/obj/doors/Doorcom.dmi'
-	req_access_txt = "57"
-	cant_emag = TRUE
-	cyborgBumpAccess = FALSE
-	hardened = TRUE
-	aiControlDisabled = TRUE
-	object_flags = BOTS_DIRBLOCK
-
-/obj/machinery/door/airlock/centcom/meteorhit()
-	return
-
-/obj/machinery/door/airlock/centcom/ex_act()
-	return
-
-/obj/machinery/door/airlock/glass
-	name = "glass airlock"
-	icon = 'icons/obj/doors/Doorglass.dmi'
-	opacity = 0
-	visible = 0
-
-/obj/machinery/door/airlock/glass/command
-		name = "command airlock"
-		icon = 'icons/obj/doors/Doorcom-glass.dmi'
-		req_access = list(access_heads)
-
-/obj/machinery/door/airlock/glass/engineering
-		name = "engineering airlock"
-		icon = 'icons/obj/doors/Dooreng-glass.dmi'
-		req_access = list(access_engineering)
-
-/obj/machinery/door/airlock/glass/medical
-		name = "medical airlock"
-		icon = 'icons/obj/doors/Doormed-glass.dmi'
-		req_access = list(access_medical)
-
-/obj/machinery/door/airlock/classic
-	name = "large airlock"
-	icon = 'icons/obj/doors/Doorclassic.dmi'
-	sound_airlock = 'sound/machines/airlock.ogg'
-	operation_time = 10
-
-/obj/machinery/door/airlock/pyro
-	name = "airlock"
-	icon = 'icons/obj/doors/SL_doors.dmi'
-	flags = FPRINT | IS_PERSPECTIVE_FLUID | ALWAYS_SOLID_FLUID
-
-/obj/machinery/door/airlock/pyro/safe
-	can_shock = FALSE
-
-/obj/machinery/door/airlock/pyro/alt
-	icon_state = "generic2_closed"
-	icon_base = "generic2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-
-/obj/machinery/door/airlock/pyro/command
-	name = "command airlock"
-	icon_state = "com_closed"
-	icon_base = "com"
-	req_access = null
-	health = 800
-	health_max = 800
-
-TYPEINFO(/obj/machinery/door/airlock/pyro/command/centcom)
-	mats = 0
-
-/obj/machinery/door/airlock/pyro/command/centcom
-	req_access_txt = "57"
-	cant_emag = TRUE
-	cyborgBumpAccess = FALSE
-	hardened = TRUE
-	aiControlDisabled = TRUE
-	object_flags = BOTS_DIRBLOCK
-
-/obj/machinery/door/airlock/pyro/command/alt
-	icon_state = "com2_closed"
-	icon_base = "com2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-TYPEINFO(/obj/machinery/door/airlock/pyro/command/syndicate)
-	mats = 0
-
-/obj/machinery/door/airlock/pyro/command/syndicate
-	req_access = list(access_syndicate_commander)
-
-/obj/machinery/door/airlock/pyro/weapons
-	icon_state = "manta_closed"
-	icon_base = "manta"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-	hardened = TRUE
-	aiControlDisabled = TRUE
-	cyborgBumpAccess = FALSE
-
-/obj/machinery/door/airlock/pyro/weapons/noemag
-	req_access = null
-	cant_emag = TRUE
-	cyborgBumpAccess = FALSE
-
-
-
-
-/obj/machinery/door/airlock/pyro/security
-	name = "security airlock"
-	icon_state = "sec_closed"
-	icon_base = "sec"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/security/alt
-	icon_state = "sec2_closed"
-	icon_base = "sec2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/engineering
-	name = "engineering airlock"
-	icon_state = "eng_closed"
-	icon_base = "eng"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/engineering/alt
-	icon_state = "eng2_closed"
-	icon_base = "eng2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/medical
-	name = "medical airlock"
-	icon_state = "research_closed"
-	icon_base = "research"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/medical/alt
-	icon_state = "research2_closed"
-	icon_base = "research2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/medical/alt2
-	icon_state = "med_closed"
-	icon_base = "med"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/medical/morgue
-	icon_state = "morgue_closed"
-	icon_base = "morgue"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/mining
-	name = "mining airlock"
-	icon_state = "mining_closed"
-	icon_base = "mining"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/maintenance
-	name = "maintenance airlock"
-	icon_state = "maint_closed"
-	icon_base = "maint"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/maintenance/alt
-	icon_state = "maint2_closed"
-	icon_base = "maint2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-
-
-/obj/machinery/door/airlock/pyro/external
-	name = "external airlock"
-	icon_state = "airlock_closed"
-	icon_base = "airlock"
-	panel_icon_state = "airlock_panel_open"
-	welded_icon_state = "airlock_welded"
-	sound_airlock = 'sound/machines/airlock.ogg'
-	opacity = 0
-	visible = 0
-	operation_time = 10
-
-TYPEINFO(/obj/machinery/door/airlock/pyro/reinforced)
-	mats = 0
-
-/obj/machinery/door/airlock/pyro/reinforced
-	name = "reinforced external airlock"
-	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
-	icon_state = "airlock_closed"
-	icon_base = "airlock"
-	panel_icon_state = "airlock_panel_open"
-	welded_icon_state = "airlock_welded"
-	sound_airlock = 'sound/machines/airlock.ogg'
-	operation_time = 10
-	cant_emag = TRUE
-	hardened = TRUE
-	aiControlDisabled = TRUE
-
-/obj/machinery/door/airlock/pyro/reinforced/meteorhit()
-	return
-/obj/machinery/door/airlock/pyro/reinforced/ex_act()
-	return
-/obj/machinery/door/airlock/pyro/reinforced/blob_act(power)
-	return
-
-/obj/machinery/door/airlock/pyro/reinforced/syndicate
-	req_access_txt = "52"
-	cyborgBumpAccess = FALSE
-
-/obj/machinery/door/airlock/pyro/reinforced/arrivals
-	icon_state = "arrivals_closed"
-	icon_base = "arrivals"
-	opacity = 0
-	visible = 0
-
-/obj/machinery/door/airlock/pyro/glass
-	name = "glass airlock"
-	icon_state = "glass_closed"
-	icon_base = "glass"
-	panel_icon_state = "glass_panel_open"
-	welded_icon_state = "glass_welded"
-	opacity = 0
-	visible = 0
-
-TYPEINFO(/obj/machinery/door/airlock/pyro/glass/reinforced)
-	mats = 0
-
-/obj/machinery/door/airlock/pyro/glass/reinforced
-	name = "reinforced glass airlock"
-	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
-	operation_time = 10
-	cant_emag = TRUE
-	hardened = TRUE
-	aiControlDisabled = TRUE
-
-/obj/machinery/door/airlock/pyro/glass/reinforced/meteorhit()
-	return
-/obj/machinery/door/airlock/pyro/glass/reinforced/ex_act()
-	return
-/obj/machinery/door/airlock/pyro/glass/reinforced/blob_act(power)
-	return
-
-/obj/machinery/door/airlock/pyro/glass/brig
-	req_access_txt = "2"
-
-/obj/machinery/door/airlock/pyro/glass/command
-	name = "command airlock"
-	icon_state = "com_glass_closed"
-	icon_base = "com_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/engineering
-	name = "engineering airlock"
-	icon_state = "eng_glass_closed"
-	icon_base = "eng_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/security //Shitty Azungar recolor, no need to thank me.
-	name = "security airlock"
-	icon_state = "sec_glass_closed"
-	icon_base = "sec_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/security/alt
-	name = "security airlock"
-	icon_state = "sec_glassalt_closed"
-	icon_base = "sec_glassalt"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/med
-	name = "medical airlock"
-	icon_state = "med_glass_closed"
-	icon_base = "med_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/sci
-	name = "research airlock"
-	icon_state = "sci_glass_closed"
-	icon_base = "sci_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/toxins
-	name = "toxins airlock"
-	icon_state = "toxins_glass_closed"
-	icon_base = "toxins_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/mining
-	name = "mining airlock"
-	icon_state = "mining_glass_closed"
-	icon_base = "mining_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/glass/botany
-	name = "botany airlock"
-	icon_state = "botany_glass_closed"
-	icon_base = "botany_glass"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/classic
-	name = "old airlock"
-	icon_state = "old_closed"
-	icon_base = "old"
-	panel_icon_state = "old_panel_open"
-	welded_icon_state = "old_welded"
-	sound_airlock = 'sound/machines/airlock.ogg'
-	operation_time = 10
-
-/obj/machinery/door/airlock/pyro/glass/windoor
-	name = "thin glass airlock"
-	icon_state = "windoor_closed"
-	icon_base = "windoor"
-	panel_icon_state = "windoor_panel_open"
-	welded_icon_state = "glassdoor_welded"
-	sound_airlock = 'sound/machines/windowdoor.ogg'
-	has_crush = FALSE
-	health = 500
-	health_max = 500
-	layer = EFFECTS_LAYER_UNDER_4 // under lights and blinds, above pretty much everything else
-	object_flags = BOTS_DIRBLOCK | CAN_REPROGRAM_ACCESS | HAS_DIRECTIONAL_BLOCKING
-	flags = FPRINT | IS_PERSPECTIVE_FLUID | ALWAYS_SOLID_FLUID | ON_BORDER
-	event_handler_flags = USE_FLUID_ENTER
-
-/obj/machinery/door/airlock/pyro/glass/windoor/opened()
-	layer = COG2_WINDOW_LAYER //this is named weirdly, but seems right
-	. = ..()
-
-/obj/machinery/door/airlock/pyro/glass/windoor/close()
-	layer = EFFECTS_LAYER_UNDER_4
-	. = ..()
-
-/obj/machinery/door/airlock/pyro/glass/windoor/bumpopen(atom/movable/AM)
-	if (src.density)
-		src.autoclose = TRUE
-	..()
-
-/obj/machinery/door/airlock/pyro/glass/windoor/attack_hand(mob/user)
-	if (src.density)
-		src.autoclose = FALSE
-	..(user)
-
-/obj/machinery/door/airlock/pyro/glass/windoor/Cross(atom/movable/mover)
-	if (istype(mover, /obj/projectile))
-		var/obj/projectile/P = mover
-		if (P.proj_data.window_pass)
-			return 1
-
-	if (get_dir(loc, mover) & dir) // Check for appropriate border.
-		if(density && mover && mover.flags & DOORPASS && !src.cant_emag)
-			if (ismob(mover) && mover:pulling && src.bumpopen(mover))
-				// If they're pulling something and the door would open anyway,
-				// just let the door open instead.
-				return 0
-			animate_door_squeeze(mover)
-			return 1 // they can pass through a closed door
-		return !density
-	else
-		return 1
-
-/obj/machinery/door/airlock/pyro/glass/windoor/gas_cross(turf/target)
-	if(get_dir(loc, target) & dir)
-		return !density
-	else
-		return TRUE
-
-/obj/machinery/door/airlock/pyro/glass/windoor/Uncross(atom/movable/mover, do_bump = TRUE)
-	if (istype(mover, /obj/projectile))
-		var/obj/projectile/P = mover
-		if (P.proj_data.window_pass)
-			return TRUE
-	if (get_dir(loc, mover.movement_newloc) & dir)
-		if(density && mover && mover.flags & DOORPASS && !src.cant_emag)
-			if (ismob(mover) && mover:pulling && src.bumpopen(mover))
-				// If they're pulling something and the door would open anyway,
-				// just let the door open instead.
-				. = FALSE
-				UNCROSS_BUMP_CHECK(mover)
-				return
-			animate_door_squeeze(mover)
-			return TRUE // they can pass through a closed door
-		. = !density
-	else
-		. = TRUE
-	UNCROSS_BUMP_CHECK(mover)
-/obj/machinery/door/airlock/pyro/glass/windoor/update_nearby_tiles(need_rebuild)
-	if (!air_master) return 0
-
-	var/turf/simulated/source = loc
-	var/turf/simulated/target = get_step(source,dir)
-
-	if (need_rebuild)
-		if (istype(source)) // Rebuild resp. update nearby group geometry.
-			if (source.parent)
-				air_master.groups_to_rebuild |= source.parent
-			else
-				air_master.tiles_to_update |= source
-
-		if (istype(target))
-			if (target.parent)
-				air_master.groups_to_rebuild |= target.parent
-			else
-				air_master.tiles_to_update |= target
-	else
-		if (istype(source)) air_master.tiles_to_update |= source
-		if (istype(target)) air_master.tiles_to_update |= target
-
-	if (istype(source))
-		source.selftilenotify() //for fluids
-
-/obj/machinery/door/airlock/pyro/glass/windoor/xmasify()
-	return
-
-/obj/machinery/door/airlock/pyro/glass/windoor/alt
-	icon_state = "windoor2_closed"
-	icon_base = "windoor2"
-	panel_icon_state = null
-	welded_icon_state = "windoor2_weld"
-	sound_airlock = 'sound/machines/windowdoor.ogg'
-	has_crush = FALSE
-
-/obj/machinery/door/airlock/pyro/sci_alt
-	name = "research airlock"
-	icon_state = "sci_closed"
-	icon_base = "sci"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/pyro/toxins_alt
-	name = "toxins airlock"
-	icon_state = "toxins2_closed"
-	icon_base = "toxins2"
-	panel_icon_state = "2_panel_open"
-	welded_icon_state = "2_welded"
-	req_access = null
-
-/obj/machinery/door/airlock/gannets
-	name = "airlock"
-	icon = 'icons/obj/doors/destiny.dmi'
-	icon_state = "gen_closed"
-	icon_base = "gen"
-
-	alt
-		icon_state = "fgen_closed"
-		icon_base = "fgen"
-		welded_icon_state = "fgen_welded"
-
-	command
-		name = "command airlock"
-		icon_state = "com_closed"
-		icon_base = "com"
-		req_access = list(access_heads)
-
-	command/alt
-		icon_state = "fcom_closed"
-		icon_base = "fcom"
-		welded_icon_state = "fcom_welded"
-
-	security
-		name = "security airlock"
-		icon_state = "sec_closed"
-		icon_base = "sec"
-		req_access = list(access_security)
-
-	security/alt
-		icon_state = "fsec_closed"
-		icon_base = "fsec"
-		welded_icon_state = "fsec_welded"
-
-	engineering
-		name = "engineering airlock"
-		icon_state = "eng_closed"
-		icon_base = "eng"
-		req_access = list(access_engineering)
-
-	engineering/alt
-		icon_state = "feng_closed"
-		icon_base = "feng"
-		welded_icon_state = "feng_welded"
-
-	medical
-		name = "medical airlock"
-		icon_state = "med_closed"
-		icon_base = "med"
-		req_access = list(access_medical)
-
-	medical/alt
-		icon_state = "fmed_closed"
-		icon_base = "fmed"
-		welded_icon_state = "fmed_welded"
-
-	morgue
-		name = "morgue airlock"
-		icon_state = "morg_closed"
-		icon_base = "morg"
-		req_access = list(access_morgue)
-
-	morgue/alt
-		icon_state = "fmorg_closed"
-		icon_base = "fmorg"
-		welded_icon_state = "fmorg_welded"
-
-	chemistry
-		name = "chemistry airlock"
-		icon_state = "chem_closed"
-		icon_base = "chem"
-		req_access = list(access_research)
-
-	chemistry/alt
-		icon_state = "fchem_closed"
-		icon_base = "fchem"
-		welded_icon_state = "fchem_welded"
-
-	toxins
-		name = "toxins airlock"
-		icon_state = "tox_closed"
-		icon_base = "tox"
-		req_access = list(access_research)
-
-	toxins/alt
-		icon_state = "ftox_closed"
-		icon_base = "ftox"
-		welded_icon_state = "ftox_welded"
-
-	maintenance
-		name = "maintenance airlock"
-		icon_state = "maint_closed"
-		icon_base = "maint"
-		welded_icon_state = "maint_welded"
-		req_access = list(access_maint_tunnels)
-
-/obj/machinery/door/airlock/gannets/glass
-	name = "glass airlock"
-	icon = 'icons/obj/doors/destiny.dmi'
-	icon_state = "tgen_closed"
-	icon_base = "tgen"
-	opacity = 0
-	visible = 0
-
-	alt
-		icon_state = "tfgen_closed"
-		icon_base = "tfgen"
-		welded_icon_state = "fgen_welded"
-
-	command
-		name = "glass command airlock"
-		icon_state = "tcom_closed"
-		icon_base = "tcom"
-		req_access = list(access_heads)
-
-	command/alt
-		icon_state = "tfcom_closed"
-		icon_base = "tfcom"
-		welded_icon_state = "fcom_welded"
-
-	security
-		name = "glass security airlock"
-		icon_state = "tsec_closed"
-		icon_base = "tsec"
-		req_access = list(access_security)
-
-	security/alt
-		icon_state = "tfsec_closed"
-		icon_base = "tfsec"
-		welded_icon_state = "fsec_welded"
-
-	engineering
-		name = "glass engineering airlock"
-		icon_state = "teng_closed"
-		icon_base = "teng"
-		req_access = list(access_engineering)
-
-	engineering/alt
-		icon_state = "tfeng_closed"
-		icon_base = "tfeng"
-		welded_icon_state = "feng_welded"
-
-	medical
-		name = "glass medical airlock"
-		icon_state = "tmed_closed"
-		icon_base = "tmed"
-		req_access = list(access_medical)
-
-	medical/alt
-		icon_state = "tfmed_closed"
-		icon_base = "tfmed"
-		welded_icon_state = "fmed_welded"
-
-	morgue
-		name = "glass morgue airlock"
-		icon_state = "tmorg_closed"
-		icon_base = "tmorg"
-		req_access = list(access_morgue)
-
-	morgue/alt
-		icon_state = "tfmorg_closed"
-		icon_base = "tfmorg"
-		welded_icon_state = "fmorg_welded"
-
-	chemistry
-		name = "glass chemistry airlock"
-		icon_state = "tchem_closed"
-		icon_base = "tchem"
-		req_access = list(access_research)
-
-	chemistry/alt
-		icon_state = "tfchem_closed"
-		icon_base = "tfchem"
-		welded_icon_state = "fchem_welded"
-
-	toxins
-		name = "glass toxins airlock"
-		icon_state = "ttox_closed"
-		icon_base = "ttox"
-		req_access = list(access_research)
-
-	toxins/alt
-		icon_state = "tftox_closed"
-		icon_base = "tftox"
-		welded_icon_state = "ftox_welded"
-
-	maintenance
-		name = "glass maintenance airlock"
-		icon_state = "tmaint_closed"
-		icon_base = "tmaint"
-		welded_icon_state = "tmaint_welded"
-		req_access = list(access_maint_tunnels)
+// ================= airlock wire panel procs ==================
 
 /*
-About the new airlock wires panel:
-*	An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires.
-*		one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though)
-*		two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be red open, but bolts-raising will not work. Cutting these wires may electrocute the user.
-*		one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work.
-*		two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
-*		one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required.
-*		one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
-*		one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire)
-*/
+	About the new airlock wires panel:
+	*	An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires.
+	*		one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though)
+	*		two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be red open, but bolts-raising will not work. Cutting these wires may electrocute the user.
+	*		one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work.
+	*		two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
+	*		one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required.
+	*		one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
+	*		one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire).	*/
 /obj/machinery/door/airlock/proc/play_deny()
 	if(src.density && !src.operating) // only play the animation while fully closed
 		play_animation("deny")
@@ -1264,9 +431,12 @@ About the new airlock wires panel:
 
 	return 0
 
-// shock user with probability prb (if all connections & power are working)
-// returns 1 if shocked, 0 otherwise
-// The preceding comment was borrowed from the grille's shock script
+// ================= general procs ==================
+
+/*
+	shock user with probability prb (if all connections & power are working)
+	returns 1 if shocked, 0 otherwise
+	The preceding comment was borrowed from the grille's shock script.	*/
 /obj/machinery/door/airlock/proc/shock(mob/user, prb)
 
 	if(!prob(prb))
@@ -1586,9 +756,7 @@ About the new airlock wires panel:
 		if (!src.has_panel)
 			boutput(user, SPAN_ALERT("[src] does not have a panel for you to unscrew!"))
 			return
-		src.panel_open = !(src.panel_open)
-		tgui_process.update_uis(src)
-		src.UpdateIcon()
+		SETUP_GENERIC_PRIVATE_ACTIONBAR(user, src, 1 SECOND, /obj/machinery/door/airlock/proc/interact_panel, user, C.icon, C.icon_state, null, INTERRUPT_ACT | INTERRUPT_STUNNED | INTERRUPT_ACTION | INTERRUPT_MOVE)
 	else if (issnippingtool(C) && src.panel_open)
 		return src.Attackhand(user)
 	else if (ispulsingtool(C))
@@ -1601,6 +769,19 @@ About the new airlock wires panel:
 		..()
 	return
 
+/obj/machinery/door/airlock/proc/interact_panel(mob/user)
+	if (!src.panel_open)
+		user.visible_message(SPAN_ALERT("[user] opens the maintenance panel on \the [src.name]."))
+		logTheThing(LOG_STATION, user, "opens the maintenance panel on \the [src.name] airlock/door at [log_loc(src)]")
+	else
+		user.visible_message(SPAN_ALERT("[user] closes the maintenance panel on \the [src.name]."))
+		logTheThing(LOG_STATION, user, "closes the maintenance panel on \the [src.name] airlock/door at [log_loc(src)]")
+	src.panel_open = !(src.panel_open)
+	tgui_process.update_uis(src)
+	src.UpdateIcon()
+	playsound(src.loc, 'sound/items/screwdriver2.ogg', 25, TRUE)
+
+
 /obj/machinery/door/airlock/proc/weld_action(mob/user)
 	if(!src.density)
 		return
@@ -1666,6 +847,8 @@ About the new airlock wires panel:
 /// adds the airlock in question to the global list.
 /obj/machinery/door/airlock/proc/attempt_cycle_link()
 	if (src.cycle_id)
+		if(!cycling_airlocks[src.cycle_id])	// add a list to the list of lists
+			cycling_airlocks[src.cycle_id] = list()
 		if (!(src in cycling_airlocks[src.cycle_id]))
 			cycling_airlocks[src.cycle_id] += src
 
@@ -1724,6 +907,8 @@ About the new airlock wires panel:
 		..()
 	return
 
+// ========== mechcomp duplicate code ============
+
 TYPEINFO(/obj/machinery/door/airlock)
 	mats = 18
 
@@ -2177,6 +1362,151 @@ TYPEINFO(/obj/machinery/door/airlock)
 						src.attach_signaler(which_wire+1, usr)
 						. = TRUE
 
+// ================= admin procs ==================
+
+/*
+	New methods:
+	pulse - sends a pulse into a wire for hacking purposes
+	cut - cuts a wire and makes any necessary state changes
+	mend - mends a wire and makes any necessary state changes
+	isWireColorCut - returns 1 if that color wire is cut, or 0 if not
+	isWireCut - returns 1 if that wire (e.g. AIRLOCK_WIRE_DOOR_BOLTS) is cut, or 0 if not
+	canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in)
+	canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it.
+	arePowerSystemsOn - 1 if the main or backup power are functioning, 0 if not. Does not check whether the power grid is charged or an APC has equipment on or anything like that. (Check (src.status & NOPOWER) for that)
+	requiresIDs - 1 if the airlock is requiring IDs, 0 if not
+	isAllPowerCut - 1 if the main and backup power both have cut wires.
+	regainMainPower - handles the effects of main power coming back on.
+	loseMainPower - handles the effects of main power going offline. Usually (if one isn't already running) spawn a thread to count down how long it will be offline - counting down won't happen if main power was completely cut along with backup power, though, the thread will just sleep.
+	loseBackupPower - handles the effects of backup power going offline.
+	regainBackupPower - handles the effects of main power coming back on.
+	shock - has a chance of electrocuting its target.	*/
+ADMIN_INTERACT_PROCS(/obj/machinery/door/airlock, proc/play_deny, proc/toggle_bolt, proc/shock_temp, proc/shock_perm, proc/shock_restore)
+/obj/machinery/door/airlock/proc/shock_temp(mob/user)
+	//electrify door for 30 seconds
+	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
+		boutput(user, "The door has no power - you can't electrify it.")
+		return
+	if(!src.can_shock)
+		boutput(user, "This door is unable to be electrified, you cannot shock it.")
+		return
+	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
+		boutput(user, SPAN_ALERT("The electrification wire has been cut.<br><br>"))
+	else if (src.secondsElectrified==-1)
+		boutput(user, SPAN_ALERT("The door is already indefinitely electrified. You'd have to un-electrify it before you can re-electrify it with a non-forever duration.<br><br>"))
+	else if (src.secondsElectrified!=0)
+		boutput(user, SPAN_ALERT("The door is already electrified. You can't re-electrify it while it's already electrified.<br><br>"))
+	else
+		src.secondsElectrified = 30
+		logTheThing(LOG_COMBAT, user || usr, "electrified airlock ([src]) at [log_loc(src)] for 30 seconds.")
+		message_admins("[key_name(user || usr)] electrified airlock ([src]) at [log_loc(src)] for 30 seconds.")
+		SPAWN(1 SECOND)
+			while (src.secondsElectrified>0)
+				src.secondsElectrified-=1
+				if (src.secondsElectrified<0)
+					src.secondsElectrified = 0
+				sleep(1 SECOND)
+
+/obj/machinery/door/airlock/proc/toggle_bolt(mob/user)
+	if (src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
+		boutput(user, SPAN_ALERT("You can't drop the door bolts - The door bolt dropping wire has been cut."))
+		return
+	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
+		boutput(user, SPAN_ALERT("The door has no power - you can't raise/lower the door bolts."))
+		return
+	if(src.locked)
+		src.set_unlocked()
+	else
+		logTheThing(LOG_STATION, user || usr, "[user || usr] has bolted a door at [log_loc(src)].")
+		src.set_locked()
+
+/obj/machinery/door/airlock/proc/shock_perm(mob/user)
+	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
+		boutput(user, SPAN_ALERT("The door has no power - you can't electrify it."))
+		return
+	//electrify door indefinitely
+	if(!src.can_shock)
+		boutput(user, SPAN_ALERT("This door is unable to be electrified.<br><br>"))
+	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
+		boutput(user, SPAN_ALERT("The electrification wire has been cut.<br><br>"))
+	else if (src.secondsElectrified==-1)
+		boutput(user, SPAN_ALERT("The door is already indefinitely electrified.<br><br>"))
+	else if (src.secondsElectrified!=0)
+		boutput(user, SPAN_ALERT("The door is already electrified. You can't re-electrify it while it's already electrified.<br><br>"))
+	else
+		logTheThing(LOG_COMBAT, user || usr, "electrified airlock ([src]) at [log_loc(src)] indefinitely.")
+		message_admins("[key_name(user || usr)] electrified airlock ([src]) at [log_loc(src)] indefinitely.")
+		src.secondsElectrified = -1
+
+/obj/machinery/door/airlock/proc/shock_restore(mob/user)
+	//un-electrify door
+	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
+		boutput(user, "The door has no power - you can't electrify it.")
+		return
+	if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
+		boutput(user, SPAN_ALERT("Can't un-electrify the airlock - The electrification wire is cut.<br><br>"))
+	else if (src.secondsElectrified!=0)
+		src.secondsElectrified = 0
+		logTheThing(LOG_COMBAT, user || usr, "de-electrified airlock ([src]) at [log_loc(src)].")
+		message_admins("[key_name(user || usr)] de-electrified airlock ([src]) at [log_loc(src)].")
+
+
+/obj/machinery/door/airlock/proc/idscantoggle(mob/user)
+	if(!src.arePowerSystemsOn() || (src.status & NOPOWER))
+		boutput(user, SPAN_ALERT("The door has no power - you toggle the ID scanner."))
+		return
+	//enable/disable ID scanner
+	if (src.isWireCut(AIRLOCK_WIRE_IDSCAN))
+		boutput(user, "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways.")
+	else
+		src.aiDisabledIdScanner = !src.aiDisabledIdScanner
+
+
+/obj/machinery/door/airlock/proc/user_toggle_open(mob/user)
+	if (src.operating == 1)
+		return
+	if((!src.arePowerSystemsOn()) || (src.status & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_OPEN_DOOR))
+		boutput(user, SPAN_ALERT("The door has no power - you can't open/close it."))
+		return
+	if(src.welded)
+		boutput(user, SPAN_ALERT("The airlock has been welded shut!"))
+	else if(locked)
+		boutput(user, SPAN_ALERT("The door bolts are down!"))
+	else if(!density)
+		close()
+	else
+		open()
+
+// ================= global procs ==================
+
+//This generates the randomized airlock wire assignments for the game.
+/proc/RandomAirlockWires()
+	//to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else).
+	var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+	airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+	airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+	airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+	var/flagIndex = 1
+	for (var/flag=1, flag<1024, flag+=flag)
+		var/valid = 0
+		while (!valid)
+			var/colorIndex = rand(1, 10)
+			if (wires[colorIndex]==0)
+				valid = 1
+				wires[colorIndex] = flag
+				airlockIndexToFlag[flagIndex] = flag
+				airlockIndexToWireColor[flagIndex] = colorIndex
+				airlockWireColorToIndex[colorIndex] = flagIndex
+		flagIndex+=1
+	return wires
+
+/* Example:
+	Airlock wires color -> flag are { 64, 128, 256, 2, 16, 4, 8, 32, 1 }.
+	Airlock wires color -> index are { 7, 8, 9, 2, 5, 3, 4, 6, 1 }.
+	Airlock index -> flag are { 1, 2, 4, 8, 16, 32, 64, 128, 256 }.
+	Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.	*/
+
+// undefining stuff
 #undef NET_ACCESS_OPTIONS
 #undef LINKED_FORCEFIELD_POWER_USAGE
 #undef OPEN_CLOSE_POWER_USAGE
diff --git a/code/obj/machinery/door/airlock_gannets.dm b/code/obj/machinery/door/airlock_gannets.dm
new file mode 100644
index 0000000000000..1847031f514d9
--- /dev/null
+++ b/code/obj/machinery/door/airlock_gannets.dm
@@ -0,0 +1,193 @@
+// ------------ gannets airlocks ------------
+
+/obj/machinery/door/airlock/gannets
+	name = "airlock"
+	icon = 'icons/obj/doors/destiny.dmi'
+	icon_state = "gen_closed"
+	icon_base = "gen"
+
+	alt
+		icon_state = "fgen_closed"
+		icon_base = "fgen"
+		welded_icon_state = "fgen_welded"
+
+	command
+		name = "command airlock"
+		icon_state = "com_closed"
+		icon_base = "com"
+		req_access = list(access_heads)
+
+	command/alt
+		icon_state = "fcom_closed"
+		icon_base = "fcom"
+		welded_icon_state = "fcom_welded"
+
+	security
+		name = "security airlock"
+		icon_state = "sec_closed"
+		icon_base = "sec"
+		req_access = list(access_security)
+
+	security/alt
+		icon_state = "fsec_closed"
+		icon_base = "fsec"
+		welded_icon_state = "fsec_welded"
+
+	engineering
+		name = "engineering airlock"
+		icon_state = "eng_closed"
+		icon_base = "eng"
+		req_access = list(access_engineering)
+
+	engineering/alt
+		icon_state = "feng_closed"
+		icon_base = "feng"
+		welded_icon_state = "feng_welded"
+
+	medical
+		name = "medical airlock"
+		icon_state = "med_closed"
+		icon_base = "med"
+		req_access = list(access_medical)
+
+	medical/alt
+		icon_state = "fmed_closed"
+		icon_base = "fmed"
+		welded_icon_state = "fmed_welded"
+
+	morgue
+		name = "morgue airlock"
+		icon_state = "morg_closed"
+		icon_base = "morg"
+		req_access = list(access_morgue)
+
+	morgue/alt
+		icon_state = "fmorg_closed"
+		icon_base = "fmorg"
+		welded_icon_state = "fmorg_welded"
+
+	chemistry
+		name = "chemistry airlock"
+		icon_state = "chem_closed"
+		icon_base = "chem"
+		req_access = list(access_research)
+
+	chemistry/alt
+		icon_state = "fchem_closed"
+		icon_base = "fchem"
+		welded_icon_state = "fchem_welded"
+
+	toxins
+		name = "toxins airlock"
+		icon_state = "tox_closed"
+		icon_base = "tox"
+		req_access = list(access_research)
+
+	toxins/alt
+		icon_state = "ftox_closed"
+		icon_base = "ftox"
+		welded_icon_state = "ftox_welded"
+
+	maintenance
+		name = "maintenance airlock"
+		icon_state = "maint_closed"
+		icon_base = "maint"
+		welded_icon_state = "maint_welded"
+		req_access = list(access_maint_tunnels)
+
+/obj/machinery/door/airlock/gannets/glass
+	name = "glass airlock"
+	icon = 'icons/obj/doors/destiny.dmi'
+	icon_state = "tgen_closed"
+	icon_base = "tgen"
+	opacity = 0
+	visible = 0
+
+	alt
+		icon_state = "tfgen_closed"
+		icon_base = "tfgen"
+		welded_icon_state = "fgen_welded"
+
+	command
+		name = "glass command airlock"
+		icon_state = "tcom_closed"
+		icon_base = "tcom"
+		req_access = list(access_heads)
+
+	command/alt
+		icon_state = "tfcom_closed"
+		icon_base = "tfcom"
+		welded_icon_state = "fcom_welded"
+
+	security
+		name = "glass security airlock"
+		icon_state = "tsec_closed"
+		icon_base = "tsec"
+		req_access = list(access_security)
+
+	security/alt
+		icon_state = "tfsec_closed"
+		icon_base = "tfsec"
+		welded_icon_state = "fsec_welded"
+
+	engineering
+		name = "glass engineering airlock"
+		icon_state = "teng_closed"
+		icon_base = "teng"
+		req_access = list(access_engineering)
+
+	engineering/alt
+		icon_state = "tfeng_closed"
+		icon_base = "tfeng"
+		welded_icon_state = "feng_welded"
+
+	medical
+		name = "glass medical airlock"
+		icon_state = "tmed_closed"
+		icon_base = "tmed"
+		req_access = list(access_medical)
+
+	medical/alt
+		icon_state = "tfmed_closed"
+		icon_base = "tfmed"
+		welded_icon_state = "fmed_welded"
+
+	morgue
+		name = "glass morgue airlock"
+		icon_state = "tmorg_closed"
+		icon_base = "tmorg"
+		req_access = list(access_morgue)
+
+	morgue/alt
+		icon_state = "tfmorg_closed"
+		icon_base = "tfmorg"
+		welded_icon_state = "fmorg_welded"
+
+	chemistry
+		name = "glass chemistry airlock"
+		icon_state = "tchem_closed"
+		icon_base = "tchem"
+		req_access = list(access_research)
+
+	chemistry/alt
+		icon_state = "tfchem_closed"
+		icon_base = "tfchem"
+		welded_icon_state = "fchem_welded"
+
+	toxins
+		name = "glass toxins airlock"
+		icon_state = "ttox_closed"
+		icon_base = "ttox"
+		req_access = list(access_research)
+
+	toxins/alt
+		icon_state = "tftox_closed"
+		icon_base = "tftox"
+		welded_icon_state = "ftox_welded"
+
+	maintenance
+		name = "glass maintenance airlock"
+		icon_state = "tmaint_closed"
+		icon_base = "tmaint"
+		welded_icon_state = "tmaint_welded"
+		req_access = list(access_maint_tunnels)
diff --git a/code/obj/machinery/door/airlock_other.dm b/code/obj/machinery/door/airlock_other.dm
new file mode 100644
index 0000000000000..6e9127aac0030
--- /dev/null
+++ b/code/obj/machinery/door/airlock_other.dm
@@ -0,0 +1,103 @@
+/obj/machinery/door/airlock/command
+	name = "command airlock"
+	icon = 'icons/obj/doors/Doorcom.dmi'
+	req_access = list(access_heads)
+
+/obj/machinery/door/airlock/security
+	name = "security airlock"
+	icon = 'icons/obj/doors/Doorsec.dmi'
+	req_access = list(access_security)
+
+/obj/machinery/door/airlock/engineering
+	name = "engineering airlock"
+	icon = 'icons/obj/doors/Dooreng.dmi'
+	req_access = list(access_engineering)
+
+/obj/machinery/door/airlock/medical
+	name = "medical airlock"
+	icon = 'icons/obj/doors/doormed.dmi'
+	req_access = list(access_medical)
+
+/obj/machinery/door/airlock/maintenance
+	name = "maintenance airlock"
+	icon = 'icons/obj/doors/Doormaint.dmi'
+	req_access = list(access_maint_tunnels)
+
+/obj/machinery/door/airlock/external
+	name = "external airlock"
+	icon = 'icons/obj/doors/Doorext.dmi'
+	sound_airlock = 'sound/machines/airlock.ogg'
+	opacity = 0
+	visible = 0
+	operation_time = 10
+
+/obj/machinery/door/airlock/classic
+	name = "large airlock"
+	icon = 'icons/obj/doors/Doorclassic.dmi'
+	sound_airlock = 'sound/machines/airlock.ogg'
+	operation_time = 10
+
+// ------------ syndicate airlocks ------------
+
+TYPEINFO(/obj/machinery/door/airlock/syndicate)
+	mats = 0
+
+/obj/machinery/door/airlock/syndicate // fuck our players for making us (or at least me) need this
+	name = "reinforced external airlock"
+	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
+	icon = 'icons/obj/doors/Doorext.dmi'
+	req_access_txt = "52"
+	cant_emag = TRUE
+	cyborgBumpAccess = FALSE
+	hardened = TRUE
+	aiControlDisabled = TRUE
+	object_flags = BOTS_DIRBLOCK
+
+/obj/machinery/door/airlock/syndicate/meteorhit()
+	return
+
+/obj/machinery/door/airlock/syndicate/ex_act()
+	return
+
+// ------------ centcomm airlocks ------------
+
+TYPEINFO(/obj/machinery/door/airlock/centcom)
+	mats = 0
+
+/obj/machinery/door/airlock/centcom
+	icon = 'icons/obj/doors/Doorcom.dmi'
+	req_access_txt = "57"
+	cant_emag = TRUE
+	cyborgBumpAccess = FALSE
+	hardened = TRUE
+	aiControlDisabled = TRUE
+	object_flags = BOTS_DIRBLOCK
+
+/obj/machinery/door/airlock/centcom/meteorhit()
+	return
+
+/obj/machinery/door/airlock/centcom/ex_act()
+	return
+
+// // ------------ glass airlocks ------------
+
+/obj/machinery/door/airlock/glass
+	name = "glass airlock"
+	icon = 'icons/obj/doors/Doorglass.dmi'
+	opacity = 0
+	visible = 0
+
+/obj/machinery/door/airlock/glass/command
+		name = "command airlock"
+		icon = 'icons/obj/doors/Doorcom-glass.dmi'
+		req_access = list(access_heads)
+
+/obj/machinery/door/airlock/glass/engineering
+		name = "engineering airlock"
+		icon = 'icons/obj/doors/Dooreng-glass.dmi'
+		req_access = list(access_engineering)
+
+/obj/machinery/door/airlock/glass/medical
+		name = "medical airlock"
+		icon = 'icons/obj/doors/Doormed-glass.dmi'
+		req_access = list(access_medical)
diff --git a/code/obj/machinery/door/airlock_pyro.dm b/code/obj/machinery/door/airlock_pyro.dm
new file mode 100644
index 0000000000000..57970d4b99a25
--- /dev/null
+++ b/code/obj/machinery/door/airlock_pyro.dm
@@ -0,0 +1,419 @@
+// ------------ pyro airlocks ------------
+
+/obj/machinery/door/airlock/pyro
+	name = "airlock"
+	icon = 'icons/obj/doors/SL_doors.dmi'
+	flags = FPRINT | IS_PERSPECTIVE_FLUID | ALWAYS_SOLID_FLUID
+
+/obj/machinery/door/airlock/pyro/safe
+	can_shock = FALSE
+
+/obj/machinery/door/airlock/pyro/alt
+	icon_state = "generic2_closed"
+	icon_base = "generic2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+
+/obj/machinery/door/airlock/pyro/classic
+	name = "old airlock"
+	icon_state = "old_closed"
+	icon_base = "old"
+	panel_icon_state = "old_panel_open"
+	welded_icon_state = "old_welded"
+	sound_airlock = 'sound/machines/airlock.ogg'
+	operation_time = 10
+
+// -------- command
+
+/obj/machinery/door/airlock/pyro/command
+	name = "command airlock"
+	icon_state = "com_closed"
+	icon_base = "com"
+	req_access = null
+	health = 800
+	health_max = 800
+
+TYPEINFO(/obj/machinery/door/airlock/pyro/command/centcom)
+	mats = 0
+
+/obj/machinery/door/airlock/pyro/command/centcom
+	req_access_txt = "57"
+	cant_emag = TRUE
+	cyborgBumpAccess = FALSE
+	hardened = TRUE
+	aiControlDisabled = TRUE
+	object_flags = BOTS_DIRBLOCK
+
+/obj/machinery/door/airlock/pyro/command/alt
+	icon_state = "com2_closed"
+	icon_base = "com2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+TYPEINFO(/obj/machinery/door/airlock/pyro/command/syndicate)
+	mats = 0
+
+/obj/machinery/door/airlock/pyro/command/syndicate
+	req_access = list(access_syndicate_commander)
+
+// -------- security
+
+/obj/machinery/door/airlock/pyro/weapons
+	icon_state = "manta_closed"
+	icon_base = "manta"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+	hardened = TRUE
+	aiControlDisabled = TRUE
+	cyborgBumpAccess = FALSE
+
+/obj/machinery/door/airlock/pyro/weapons/noemag
+	req_access = null
+	cant_emag = TRUE
+	cyborgBumpAccess = FALSE
+
+
+
+
+/obj/machinery/door/airlock/pyro/security
+	name = "security airlock"
+	icon_state = "sec_closed"
+	icon_base = "sec"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/security/alt
+	icon_state = "sec2_closed"
+	icon_base = "sec2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+// -------- engineering
+
+/obj/machinery/door/airlock/pyro/engineering
+	name = "engineering airlock"
+	icon_state = "eng_closed"
+	icon_base = "eng"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/engineering/alt
+	icon_state = "eng2_closed"
+	icon_base = "eng2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/mining
+	name = "mining airlock"
+	icon_state = "mining_closed"
+	icon_base = "mining"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+// -------- medsci
+
+/obj/machinery/door/airlock/pyro/medical
+	name = "medical airlock"
+	icon_state = "research_closed"
+	icon_base = "research"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/medical/alt
+	icon_state = "research2_closed"
+	icon_base = "research2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/medical/alt2
+	icon_state = "med_closed"
+	icon_base = "med"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/medical/morgue
+	icon_state = "morgue_closed"
+	icon_base = "morgue"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/sci_alt
+	name = "research airlock"
+	icon_state = "sci_closed"
+	icon_base = "sci"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/toxins_alt
+	name = "toxins airlock"
+	icon_state = "toxins2_closed"
+	icon_base = "toxins2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+	req_access = null
+
+// -------- maintenance
+
+/obj/machinery/door/airlock/pyro/maintenance
+	name = "maintenance airlock"
+	icon_state = "maint_closed"
+	icon_base = "maint"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/maintenance/alt
+	icon_state = "maint2_closed"
+	icon_base = "maint2"
+	panel_icon_state = "2_panel_open"
+	welded_icon_state = "2_welded"
+
+// -------- external
+
+/obj/machinery/door/airlock/pyro/external
+	name = "external airlock"
+	icon_state = "airlock_closed"
+	icon_base = "airlock"
+	panel_icon_state = "airlock_panel_open"
+	welded_icon_state = "airlock_welded"
+	sound_airlock = 'sound/machines/airlock.ogg'
+	opacity = 0
+	visible = 0
+	operation_time = 10
+
+TYPEINFO(/obj/machinery/door/airlock/pyro/reinforced)
+	mats = 0
+
+/obj/machinery/door/airlock/pyro/reinforced
+	name = "reinforced external airlock"
+	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
+	icon_state = "airlock_closed"
+	icon_base = "airlock"
+	panel_icon_state = "airlock_panel_open"
+	welded_icon_state = "airlock_welded"
+	sound_airlock = 'sound/machines/airlock.ogg'
+	operation_time = 10
+	cant_emag = TRUE
+	hardened = TRUE
+	aiControlDisabled = TRUE
+
+/obj/machinery/door/airlock/pyro/reinforced/meteorhit()
+	return
+/obj/machinery/door/airlock/pyro/reinforced/ex_act()
+	return
+/obj/machinery/door/airlock/pyro/reinforced/blob_act(power)
+	return
+
+/obj/machinery/door/airlock/pyro/reinforced/syndicate
+	req_access_txt = "52"
+	cyborgBumpAccess = FALSE
+
+/obj/machinery/door/airlock/pyro/reinforced/arrivals
+	icon_state = "arrivals_closed"
+	icon_base = "arrivals"
+	opacity = 0
+	visible = 0
+
+// -------- glass
+
+/obj/machinery/door/airlock/pyro/glass
+	name = "glass airlock"
+	icon_state = "glass_closed"
+	icon_base = "glass"
+	panel_icon_state = "glass_panel_open"
+	welded_icon_state = "glass_welded"
+	opacity = 0
+	visible = 0
+
+TYPEINFO(/obj/machinery/door/airlock/pyro/glass/reinforced)
+	mats = 0
+
+/obj/machinery/door/airlock/pyro/glass/reinforced
+	name = "reinforced glass airlock"
+	desc = "Looks pretty tough. I wouldn't take this door on in a fight."
+	operation_time = 10
+	cant_emag = TRUE
+	hardened = TRUE
+	aiControlDisabled = TRUE
+
+/obj/machinery/door/airlock/pyro/glass/reinforced/meteorhit()
+	return
+/obj/machinery/door/airlock/pyro/glass/reinforced/ex_act()
+	return
+/obj/machinery/door/airlock/pyro/glass/reinforced/blob_act(power)
+	return
+
+/obj/machinery/door/airlock/pyro/glass/brig
+	req_access_txt = "2"
+
+/obj/machinery/door/airlock/pyro/glass/command
+	name = "command airlock"
+	icon_state = "com_glass_closed"
+	icon_base = "com_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/engineering
+	name = "engineering airlock"
+	icon_state = "eng_glass_closed"
+	icon_base = "eng_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/security //Shitty Azungar recolor, no need to thank me.
+	name = "security airlock"
+	icon_state = "sec_glass_closed"
+	icon_base = "sec_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/security/alt
+	name = "security airlock"
+	icon_state = "sec_glassalt_closed"
+	icon_base = "sec_glassalt"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/med
+	name = "medical airlock"
+	icon_state = "med_glass_closed"
+	icon_base = "med_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/sci
+	name = "research airlock"
+	icon_state = "sci_glass_closed"
+	icon_base = "sci_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/toxins
+	name = "toxins airlock"
+	icon_state = "toxins_glass_closed"
+	icon_base = "toxins_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/mining
+	name = "mining airlock"
+	icon_state = "mining_glass_closed"
+	icon_base = "mining_glass"
+	req_access = null
+
+/obj/machinery/door/airlock/pyro/glass/botany
+	name = "botany airlock"
+	icon_state = "botany_glass_closed"
+	icon_base = "botany_glass"
+	req_access = null
+
+// -------- windoors
+
+/obj/machinery/door/airlock/pyro/glass/windoor
+	name = "thin glass airlock"
+	icon_state = "windoor_closed"
+	icon_base = "windoor"
+	panel_icon_state = "windoor_panel_open"
+	welded_icon_state = "glassdoor_welded"
+	sound_airlock = 'sound/machines/windowdoor.ogg'
+	has_crush = FALSE
+	health = 500
+	health_max = 500
+	layer = EFFECTS_LAYER_UNDER_4 // under lights and blinds, above pretty much everything else
+	object_flags = BOTS_DIRBLOCK | CAN_REPROGRAM_ACCESS | HAS_DIRECTIONAL_BLOCKING
+	flags = FPRINT | IS_PERSPECTIVE_FLUID | ALWAYS_SOLID_FLUID | ON_BORDER
+	event_handler_flags = USE_FLUID_ENTER
+
+/obj/machinery/door/airlock/pyro/glass/windoor/opened()
+	layer = COG2_WINDOW_LAYER //this is named weirdly, but seems right
+	. = ..()
+
+/obj/machinery/door/airlock/pyro/glass/windoor/close()
+	layer = EFFECTS_LAYER_UNDER_4
+	. = ..()
+
+/obj/machinery/door/airlock/pyro/glass/windoor/bumpopen(atom/movable/AM)
+	if (src.density)
+		src.autoclose = TRUE
+	..()
+
+/obj/machinery/door/airlock/pyro/glass/windoor/attack_hand(mob/user)
+	if (src.density)
+		src.autoclose = FALSE
+	..(user)
+
+/obj/machinery/door/airlock/pyro/glass/windoor/Cross(atom/movable/mover)
+	if (istype(mover, /obj/projectile))
+		var/obj/projectile/P = mover
+		if (P.proj_data.window_pass)
+			return 1
+
+	if (get_dir(loc, mover) & dir) // Check for appropriate border.
+		if(density && mover && mover.flags & DOORPASS && !src.cant_emag)
+			if (ismob(mover) && mover:pulling && src.bumpopen(mover))
+				// If they're pulling something and the door would open anyway,
+				// just let the door open instead.
+				return 0
+			animate_door_squeeze(mover)
+			return 1 // they can pass through a closed door
+		return !density
+	else
+		return 1
+
+/obj/machinery/door/airlock/pyro/glass/windoor/gas_cross(turf/target)
+	if(get_dir(loc, target) & dir)
+		return !density
+	else
+		return TRUE
+
+/obj/machinery/door/airlock/pyro/glass/windoor/Uncross(atom/movable/mover, do_bump = TRUE)
+	if (istype(mover, /obj/projectile))
+		var/obj/projectile/P = mover
+		if (P.proj_data.window_pass)
+			return TRUE
+	if (get_dir(loc, mover.movement_newloc) & dir)
+		if(density && mover && mover.flags & DOORPASS && !src.cant_emag)
+			if (ismob(mover) && mover:pulling && src.bumpopen(mover))
+				// If they're pulling something and the door would open anyway,
+				// just let the door open instead.
+				. = FALSE
+				UNCROSS_BUMP_CHECK(mover)
+				return
+			animate_door_squeeze(mover)
+			return TRUE // they can pass through a closed door
+		. = !density
+	else
+		. = TRUE
+	UNCROSS_BUMP_CHECK(mover)
+/obj/machinery/door/airlock/pyro/glass/windoor/update_nearby_tiles(need_rebuild)
+	if (!air_master) return 0
+
+	var/turf/simulated/source = loc
+	var/turf/simulated/target = get_step(source,dir)
+
+	if (need_rebuild)
+		if (istype(source)) // Rebuild resp. update nearby group geometry.
+			if (source.parent)
+				air_master.groups_to_rebuild |= source.parent
+			else
+				air_master.tiles_to_update |= source
+
+		if (istype(target))
+			if (target.parent)
+				air_master.groups_to_rebuild |= target.parent
+			else
+				air_master.tiles_to_update |= target
+	else
+		if (istype(source)) air_master.tiles_to_update |= source
+		if (istype(target)) air_master.tiles_to_update |= target
+
+	if (istype(source))
+		source.selftilenotify() //for fluids
+
+/obj/machinery/door/airlock/pyro/glass/windoor/xmasify()
+	return
+
+/obj/machinery/door/airlock/pyro/glass/windoor/alt
+	icon_state = "windoor2_closed"
+	icon_base = "windoor2"
+	panel_icon_state = null
+	welded_icon_state = "windoor2_weld"
+	sound_airlock = 'sound/machines/windowdoor.ogg'
+	has_crush = FALSE
diff --git a/code/obj/machinery/door/door_parent.dm b/code/obj/machinery/door/door_parent.dm
index d9a26aeb23106..cd52e88015eeb 100644
--- a/code/obj/machinery/door/door_parent.dm
+++ b/code/obj/machinery/door/door_parent.dm
@@ -286,17 +286,17 @@ ADMIN_INTERACT_PROCS(/obj/machinery/door, proc/open, proc/close, proc/break_me_c
 		last_used = world.time
 		src.operating = -1
 		flick(text("[]_spark", src.icon_base), src)
-		sleep(0.6 SECONDS)
-		open()
-		return 1
-	return 0
+		SPAWN(0.6 SECONDS)
+			open()
+		return TRUE
+	return FALSE
 
 /obj/machinery/door/demag(var/mob/user)
 	if (src.operating != -1)
 		return 0
 	src.operating = 0
-	sleep(0.6 SECONDS)
-	close()
+	SPAWN(0.6 SECONDS)
+		close()
 	return 1
 
 /obj/machinery/door/attackby(obj/item/I, mob/user)
diff --git a/code/obj/machinery/food_and_drink/mixer.dm b/code/obj/machinery/food_and_drink/mixer.dm
new file mode 100644
index 0000000000000..3ffc2449ac4c7
--- /dev/null
+++ b/code/obj/machinery/food_and_drink/mixer.dm
@@ -0,0 +1,251 @@
+/// Max amount of items allowed in mixer bowl
+#define MIXER_MAX_CONTENTS 4
+/// Power used during mixing
+#define MIXER_MIXING_POWER_USAGE 1 KILO WATTS
+/// Mixing time in seconds
+#define MIX_TIME 2 SECONDS
+
+var/list/mixer_recipes = list()
+
+TYPEINFO(/obj/machinery/mixer)
+	mats = 15
+
+/obj/machinery/mixer
+	name = "KitchenHelper"
+	desc = "A food mixer."
+	icon = 'icons/obj/kitchen.dmi'
+	icon_state = "blender"
+	density = 1
+	anchored = ANCHORED
+	flags = TGUI_INTERACTIVE
+	deconstruct_flags = DECON_WRENCH | DECON_CROWBAR | DECON_WELDER
+	var/list/recipes = null
+	var/list/to_remove = list()
+	var/allowed = list(/obj/item/reagent_containers/food/, /obj/item/parts/robot_parts/head, /obj/item/clothing/head/butt, /obj/item/organ/brain)
+	var/working = 0
+	var/timeMixEnd = 0
+
+	New()
+		..()
+		src.recipes = mixer_recipes
+		if (!src.recipes)
+			src.recipes = list()
+
+		if (!src.recipes.len)
+			src.recipes += new /datum/cookingrecipe/mixer/mix_cake_custom(src)
+			src.recipes += new /datum/cookingrecipe/mixer/pancake_batter(src)
+			src.recipes += new /datum/cookingrecipe/mixer/brownie_batter(src)
+			src.recipes += new /datum/cookingrecipe/mixer/cake_batter(src)
+			src.recipes += new /datum/cookingrecipe/mixer/custard(src)
+			src.recipes += new /datum/cookingrecipe/mixer/mashedpotatoes(src)
+			src.recipes += new /datum/cookingrecipe/mixer/mashedbrains(src)
+			src.recipes += new /datum/cookingrecipe/mixer/gruel(src)
+			src.recipes += new /datum/cookingrecipe/mixer/fishpaste(src)
+			src.recipes += new /datum/cookingrecipe/mixer/meatpaste(src)
+			src.recipes += new /datum/cookingrecipe/mixer/wonton_wrapper(src)
+			src.recipes += new /datum/cookingrecipe/mixer/butters(src)
+
+		src.UpdateIcon()
+		UnsubscribeProcess()
+
+	attackby(obj/item/W, mob/user)
+		var/amount = length(src.contents)
+		if (amount >= MIXER_MAX_CONTENTS)
+			boutput(user, SPAN_ALERT("The mixer is full."))
+			return
+		var/proceed = 0
+		for(var/check_path in src.allowed)
+			if(istype(W, check_path))
+				proceed = 1
+				break
+		if (!proceed)
+			boutput(user, SPAN_ALERT("You can't put that in the mixer!"))
+			return
+		user.visible_message(SPAN_NOTICE("[user] puts [W] into the [src]."))
+		user.u_equip(W)
+		W.set_loc(src)
+		W.dropped(user)
+		tgui_process.update_uis(src)
+
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if(!ui)
+			ui = new(user, src, "MixerMachine")
+			ui.open()
+
+	ui_static_data(mob/user)
+		. = list("maxItems" = MIXER_MAX_CONTENTS)
+
+	ui_data(mob/user)
+		var/mixerContents = list()
+		var/index = 1
+		for(var/obj/item/I in src.contents)
+			var/itemData = list()
+			itemData["name"] = I.name
+			itemData["index"] = index
+			itemData["iconData"] = get_item_icon(I)
+			mixerContents += list(itemData)
+			index += 1
+		. = list("working" = src.working, "mixerContents" = mixerContents)
+
+	proc/get_item_icon(var/obj/item/target)
+		var/static/base64_preview_cache = list()
+		var/original_name = initial(target.name)
+		. = base64_preview_cache[original_name]
+
+		if(isnull(.))
+			var/icon/result = getFlatIcon(target, no_anim=TRUE)
+			if(result)
+				. = icon2base64(result)
+			else
+				. = ""
+			base64_preview_cache[original_name] = .
+
+	proc/ejectItemFromMixer(obj/item/target)
+		if (target)
+			if (BOUNDS_DIST(usr, src) == 0)
+				usr.put_in_hand_or_drop(target)
+			else
+				target.set_loc(src.loc)
+
+	ui_act(action, params)
+		. = ..()
+		if (.)
+			return
+
+		switch (action)
+			if ("eject")
+				var/index = params["index"]
+				var/obj/item/target = src.contents[index]
+				src.ejectItemFromMixer(target)
+
+				usr.show_text(SPAN_NOTICE("You eject the [target.name] from the [src]."))
+				. = TRUE
+
+			if ("mix")
+				src.mix()
+				. = TRUE
+
+			if ("ejectAll")
+				for (var/obj/item/target in src.contents)
+					src.ejectItemFromMixer(target)
+
+				usr.show_text(SPAN_NOTICE("You eject all contents from the [src]."))
+				. = TRUE
+
+	attack_ai(var/mob/user as mob)
+		return ui_interact(user)
+
+	MouseDrop_T(obj/item/W as obj, mob/user as mob)
+		if (istype(W) && in_interact_range(W, user) && in_interact_range(src, user) && isalive(user) && !isintangible(user))
+			return src.Attackby(W, user)
+		return ..()
+
+	proc/bowl_checkitem(var/recipeitem, var/recipecount)
+		if (!locate(recipeitem) in src.contents) return 0
+		var/count = 0
+		for(var/obj/item/I in src.contents)
+			if(istype(I, recipeitem))
+				count++
+				to_remove += I
+
+		if (count < recipecount)
+			return 0
+		return 1
+
+	proc/mix()
+
+		var/amount = length(src.contents)
+		if (!amount)
+			boutput(usr, SPAN_ALERT("There's nothing in the mixer."))
+			return
+		src.working = 1
+		src.timeMixEnd = TIME + MIX_TIME
+		src.power_usage = MIXER_MIXING_POWER_USAGE
+
+		tgui_process.update_uis(src)
+		src.UpdateIcon()
+		playsound(src.loc, 'sound/machines/mixer.ogg', 50, 1)
+		SubscribeToProcess()
+
+	process()
+		. = ..()
+		if (status & (NOPOWER|BROKEN))
+			UnsubscribeProcess()
+			return
+
+		var/amount = length(src.contents)
+		if (!amount)
+			UnsubscribeProcess()
+			return
+
+		if (TIME < src.timeMixEnd)
+			return
+
+		var/output = null // /obj/item/reagent_containers/food/snacks/yuck
+		var/derivename = 0
+		for (var/datum/cookingrecipe/R in src.recipes)
+			to_remove.len = 0
+			if (R.item1)
+				if (!bowl_checkitem(R.item1, R.amt1)) continue
+			if (R.item2)
+				if (!bowl_checkitem(R.item2, R.amt2)) continue
+			if (R.item3)
+				if (!bowl_checkitem(R.item3, R.amt3)) continue
+			if (R.item4)
+				if (!bowl_checkitem(R.item4, R.amt4)) continue
+			output = R.specialOutput(src)
+			if (!output)
+				output = R.output
+			if (R.useshumanmeat)
+				derivename = 1
+			break
+
+		if (!isnull(output))
+			var/obj/item/reagent_containers/food/snacks/F
+			if (ispath(output))
+				F = new output(get_turf(src))
+			else
+				F = output
+				F.set_loc(get_turf(src))
+
+			if (derivename)
+				var/foodname = F.name
+				for (var/obj/item/reagent_containers/food/snacks/ingredient/meat/humanmeat/M in src.contents)
+					F.name = "[M.subjectname] [foodname]"
+					F.desc += " It sort of smells like [M.subjectjob ? M.subjectjob : "pig"]s."
+					if(!isnull(F.unlock_medal_when_eaten))
+						continue
+					else if (M.subjectjob && M.subjectjob == "Clown")
+						F.unlock_medal_when_eaten = "That tasted funny"
+					else
+						F.unlock_medal_when_eaten = "Space Ham" //replace the old fat person method
+		for (var/obj/item/I in to_remove)
+			qdel(I)
+		to_remove.len = 0
+
+		for (var/obj/I in src.contents)
+			I.set_loc(src.loc)
+			src.visible_message(SPAN_ALERT("[I] is tossed out of [src]!"))
+			var/edge = get_edge_target_turf(src, pick(alldirs))
+			I.throw_at(edge, 25, 4)
+
+		src.working = 0
+		src.UpdateIcon()
+		playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
+		tgui_process.update_uis(src)
+
+		src.power_usage = 0
+		UnsubscribeProcess()
+		return
+
+	update_icon()
+		if (!src || !istype(src))
+			return
+
+		if (src.working != 0)
+			src.icon_state = "blender_on"
+		else
+			src.icon_state = "blender"
+
+		return
diff --git a/code/obj/machinery/law_racks.dm b/code/obj/machinery/law_racks.dm
index 143d374dcca58..0bd5dc807b109 100644
--- a/code/obj/machinery/law_racks.dm
+++ b/code/obj/machinery/law_racks.dm
@@ -583,19 +583,7 @@
 				if(isAI(R))
 					var/mob/living/silicon/ai/holoAI = R
 					holoAI.holoHolder.text_expansion = src.holo_expansions.Copy()
-
-					var/ability_type
-					var/datum/abilityHolder/silicon/ai/aiAH = R.abilityHolder
-					var/list/current_abilities = list()
-					for(var/datum/ability in aiAH.abilities)
-						current_abilities |= ability.type
-					var/list/abilities_to_remove = current_abilities - ai_abilities
-					for(ability_type in abilities_to_remove)
-						if (ispath(ability_type, /datum/targetable/ai/module))
-							aiAH.removeAbility(ability_type)
-					var/list/abilities_to_add = ai_abilities - current_abilities
-					for(ability_type in abilities_to_add)
-						aiAH.addAbility(ability_type)
+					src.reset_ai_abilities(R)
 		src.calculate_power_usage()
 		for (var/mob/living/intangible/aieye/E in mobs)
 			if(E.mainframe?.law_rack_connection == src)
@@ -799,6 +787,20 @@
 			if (src.law_circuits[i])
 				src.power_usage += 100
 
+	proc/reset_ai_abilities(mob/living/silicon/ai/target)
+		var/ability_type
+		var/datum/abilityHolder/silicon/ai/aiAH = target.abilityHolder
+		var/list/current_abilities = list()
+		for(var/datum/ability in aiAH.abilities)
+			current_abilities |= ability.type
+		var/list/abilities_to_remove = current_abilities - src.ai_abilities
+		for(ability_type in abilities_to_remove)
+			if (ispath(ability_type, /datum/targetable/ai/module))
+				aiAH.removeAbility(ability_type)
+		var/list/abilities_to_add = src.ai_abilities - current_abilities
+		for(ability_type in abilities_to_add)
+			aiAH.addAbility(ability_type)
+
 /particles/rack_smoke
 	icon = 'icons/effects/effects.dmi'
 	icon_state = list("smoke")
diff --git a/code/obj/machinery/lightswitch.dm b/code/obj/machinery/lightswitch.dm
index 571073023c754..3b56b91e047fd 100644
--- a/code/obj/machinery/lightswitch.dm
+++ b/code/obj/machinery/lightswitch.dm
@@ -2,6 +2,13 @@
 // can have multiple per area
 // can also operate on non-loc area through "otherarea" var
 
+/// Amount of time before a light switch resets its spam cooldown counter
+#define SWITCH_SPAM_TIMEOUT 15 SECONDS
+/// Number of manual toggles before the light switch begins shocking people
+#define SWITCH_SPAM_START_THRESHOLD 10
+/// Number of manual toggles before light switches start really hurting people
+#define SWITCH_SPAM_MAJOR_THRESHOLD 50
+
 TYPEINFO(/obj/machinery/light_switch)
 	mats = list("MET-1"=10,"CON-1"=15)
 
@@ -20,7 +27,8 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light_switch, proc/trigger)
 	var/id = null
 	//	luminosity = 1
 	var/datum/light/light
-
+	var/toggled_count = 0 //! How many times has this been toggled
+	HELP_MESSAGE_OVERRIDE("You can use a <b>screwing tool</b> to tighten the wiring contacts.")
 
 /obj/machinery/light_switch/New()
 	..()
@@ -113,12 +121,24 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light_switch, proc/trigger)
 
 /obj/machinery/light_switch/get_desc(dist, mob/user)
 	. = ..()
-	. += "A light switch. It is [on? "on" : "off"]."
+	. += " It is [on? "on" : "off"]."
+	switch(toggled_count)
+		if(SWITCH_SPAM_START_THRESHOLD to SWITCH_SPAM_MAJOR_THRESHOLD)
+			. += " It looks a bit loose."
+		if(SWITCH_SPAM_MAJOR_THRESHOLD to INFINITY)
+			. += " It's practically falling out of the wall."
 
 /obj/machinery/light_switch/attack_hand(mob/user)
 	. = ..()
 	if(!ON_COOLDOWN(src, "toggle", 1 SECOND))
 		toggle_group(user)
+		toggled_count += 1
+		if (toggled_count < SWITCH_SPAM_START_THRESHOLD)
+			return
+		if(ON_COOLDOWN(src, "spam", SWITCH_SPAM_TIMEOUT))
+			user.shock(src, toggled_count)
+			if (toggled_count >= SWITCH_SPAM_MAJOR_THRESHOLD)
+				elecflash(user.loc)
 
 /obj/machinery/light_switch/proc/toggle_group(mob/user=null) //flip *this* switch, update target area, then prompt the group to refresh accordingly
 	on = !on
@@ -147,6 +167,15 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light_switch, proc/trigger)
 	src.on = on_signal
 	src.UpdateIcon()
 
+/obj/machinery/light_switch/attackby(obj/item/I, mob/user)
+	if (isscrewingtool(I))
+		if (!(status & NOPOWER) && src.on)
+			user.shock(src, 100)
+		src.toggled_count = 0
+		src.visible_message(SPAN_NOTICE("[user] tightens the contacts on [src]."))
+		return
+	. = ..()
+
 /obj/machinery/light_switch/power_change()
 
 	if(!otherarea)
@@ -180,3 +209,7 @@ ADMIN_INTERACT_PROCS(/obj/machinery/light_switch, proc/trigger)
 		SPAWN(1 DECI SECOND)
 			src.autoposition()
 		..()
+
+#undef SWITCH_SPAM_TIMEOUT
+#undef SWITCH_SPAM_START_THRESHOLD
+#undef SWITCH_SPAM_MAJOR_THRESHOLD
diff --git a/code/obj/machinery/photocopier.dm b/code/obj/machinery/photocopier.dm
index 21fcf304584f9..a4cce64475aad 100644
--- a/code/obj/machinery/photocopier.dm
+++ b/code/obj/machinery/photocopier.dm
@@ -145,8 +145,8 @@ TYPEINFO(/obj/machinery/photocopier)
 					return
 				boutput(user, "You load the paper bin into \the [src].")
 				var/obj/item/paper_bin/P = w
-				src.paper_amount += w.amount
-				P.amount = 0
+				src.paper_amount += P.amount_left
+				P.amount_left = 0
 				P.update()
 				return
 
diff --git a/code/obj/machinery/plantpot.dm b/code/obj/machinery/plantpot.dm
index 14df4bffb408b..ef92a2bd9e897 100644
--- a/code/obj/machinery/plantpot.dm
+++ b/code/obj/machinery/plantpot.dm
@@ -1057,38 +1057,7 @@ TYPEINFO(/obj/machinery/plantpot)
 			if(((growing.isgrass || (growing.force_seed_on_harvest > 0 )) && prob(80)) && !istype(getitem,/obj/item/seed/) && !HYPCheckCommut(DNA,/datum/plant_gene_strain/seedless) && (growing.force_seed_on_harvest >= 0 ))
 				// Same shit again. This isn't so much the crop as it is giving you seeds
 				// incase you couldn't get them otherwise, though.
-				var/obj/item/seed/S
-				if(growing.unique_seed)
-					S = new growing.unique_seed
-					S.set_loc(src)
-				else
-					S = new /obj/item/seed
-					S.set_loc(src)
-					S.removecolor()
-				var/datum/plantgenes/HDNA = src.plantgenes
-				var/datum/plantgenes/SDNA = S.plantgenes
-				if(!growing.unique_seed && !growing.hybrid)
-					S.generic_seed_setup(growing, TRUE)
-
-				var/seedname = "[growing.name]"
-				if(istype(MUT,/datum/plantmutation/))
-					if(!MUT.name_prefix && !MUT.name_suffix && MUT.name)
-						seedname = "[MUT.name]"
-					else if(MUT.name_prefix || MUT.name_suffix)
-						seedname = "[MUT.name_prefix][growing.name][MUT.name_suffix]"
-
-				S.name = "[seedname] seed"
-				S.plant_seed_color(growing.seedcolor)
-				HYPpassplantgenes(HDNA,SDNA)
-				S.generation = src.generation
-				if(growing.hybrid)
-					var/plantType = growing.type
-					var/datum/plant/hybrid = new plantType(S)
-					for(var/V in growing.vars)
-						if(issaved(growing.vars[V]) && V != "holder")
-							hybrid.vars[V] = growing.vars[V]
-					S.planttype = hybrid
-
+				HYPgenerateseedcopy(src.plantgenes, growing, src.generation, src)
 				seedcount++
 
 		// Give XP based on base quality of crop harvest. Will make better later, like so more plants harvasted and stuff, this is just for testing.
diff --git a/code/obj/machinery/printing_press.dm b/code/obj/machinery/printing_press.dm
index 8ac4809582698..79514f703829b 100644
--- a/code/obj/machinery/printing_press.dm
+++ b/code/obj/machinery/printing_press.dm
@@ -199,17 +199,17 @@
 /obj/machinery/printing_press/attackby(var/obj/item/W, mob/user)
 	if (istype(W, /obj/item/paper_bin))
 		var/obj/item/paper_bin/P = W
-		if (P.amount > 0 && src.paper_amt <= src.paper_max) //if the paper bin has paper, and adding the paper bin doesnt add too much paper
+		if (P.amount_left > 0 && src.paper_amt <= src.paper_max) //if the paper bin has paper, and adding the paper bin doesnt add too much paper
 			boutput(user, "You load \the [P] into \the [src].")
 			var/amount_to_take = src.paper_max - src.paper_amt
-			var/amount_taken = min(amount_to_take, P.amount)
+			var/amount_taken = min(amount_to_take, P.amount_left)
 			src.paper_amt += amount_taken
 			UpdateIcon()
-			P.amount = P.amount - amount_taken
+			P.amount_left = P.amount_left - amount_taken
 			P.update()
 			return
 		else
-			if (P.amount <= 0)
+			if (P.amount_left <= 0)
 				if (length(P.contents) > 0)
 					boutput(user, "\The [P] has no unsoiled sheets left in it.") // someone put junk paper in the bin
 				else
diff --git a/code/obj/machinery/singularity.dm b/code/obj/machinery/singularity.dm
index 2b6b957062b81..aa045508eda8c 100644
--- a/code/obj/machinery/singularity.dm
+++ b/code/obj/machinery/singularity.dm
@@ -406,7 +406,7 @@ for some reason I brought it back and tried to clean it up a bit and I regret ev
 			gain += A.material.getProperty("n_radioactive") * 6 * A.material_amt
 			if(isitem(A))
 				var/obj/item/I = A
-				gain *= I.amount
+				gain *= min(I.amount, INFINITY)
 
 		if (A.reagents)
 			gain += min(A.reagents.total_volume/4, 50)
@@ -804,7 +804,7 @@ TYPEINFO(/obj/machinery/field_generator)
 				return
 			var/positions = src.get_welding_positions()
 			actions.start(new /datum/action/bar/private/welding(user, src, 2 SECONDS, /obj/machinery/field_generator/proc/weld_action, \
-						list(user), "[user] finishes using their [W.name] on the field generator.", positions[1], positions[2]),user)
+						list(user), "[user] finishes using [his_or_her(user)] [W.name] on the field generator.", positions[1], positions[2]),user)
 		if(state == WRENCHED)
 			boutput(user, "You start to weld the field generator to the floor.")
 			return
@@ -1257,7 +1257,7 @@ TYPEINFO(/obj/machinery/emitter)
 				return
 			var/positions = src.get_welding_positions()
 			actions.start(new /datum/action/bar/private/welding(user, src, 2 SECONDS, /obj/machinery/emitter/proc/weld_action, \
-						list(user), "[user] finishes using their [W.name] on the emitter.", positions[1], positions[2]),user)
+						list(user), "[user] finishes using [his_or_her(user)] [W.name] on the emitter.", positions[1], positions[2]),user)
 		if(state == WRENCHED)
 			boutput(user, "You start to weld the emitter to the floor.")
 			return
@@ -1739,6 +1739,7 @@ TYPEINFO(/obj/machinery/power/collector_control)
 TYPEINFO(/obj/machinery/the_singularitybomb)
 	mats = 14
 
+ADMIN_INTERACT_PROCS(/obj/machinery/the_singularitybomb, proc/prime, proc/abort)
 /obj/machinery/the_singularitybomb
 	name = "\improper Singularity Bomb"
 	desc = "A WMD that creates a singularity."
@@ -1836,27 +1837,12 @@ TYPEINFO(/obj/machinery/the_singularitybomb)
 				switch(href_list["spec"])
 					if("prime")
 						if(!timing)
-							src.timing = 1
-							processing_items |= src
-							src.icon_state = "portgen2"
-
-							// And here (Convair880).
-							logTheThing(LOG_BOMBING, usr, "activated [src.name] ([src.time] seconds) at [log_loc(src)].")
-							message_admins("[key_name(usr)] activated [src.name] ([src.time] seconds) at [log_loc(src)].")
-							if (ismob(usr))
-								src.activator = usr
-
+							src.prime()
 						else
 							boutput(usr, SPAN_ALERT("\The [src] is already primed!"))
 					if("abort")
 						if(timing)
-							src.timing = 0
-							src.icon_state = "portgen1"
-
-							// And here (Convair880).
-							logTheThing(LOG_BOMBING, usr, "deactivated [src.name][src.activator ? " (primed by [constructTarget(src.activator,"bombing")]" : ""] at [log_loc(src)].")
-							message_admins("[key_name(usr)] deactivated [src.name][src.activator ? " (primed by [key_name(src.activator)])" : ""] at [log_loc(src)].")
-
+							src.abort()
 						else
 							boutput(usr, SPAN_ALERT("\The [src] is already deactivated!"))
 			if("timer")
@@ -1895,6 +1881,23 @@ TYPEINFO(/obj/machinery/the_singularitybomb)
 		return
 	return
 
+/obj/machinery/the_singularitybomb/proc/prime()
+	src.timing = 1
+	processing_items |= src
+	src.icon_state = "portgen2"
+	logTheThing(LOG_BOMBING, usr, "activated [src.name] ([src.time] seconds) at [log_loc(src)].")
+	message_admins("[key_name(usr)] activated [src.name] ([src.time] seconds) at [log_loc(src)].")
+	if (ismob(usr))
+		src.activator = usr
+
+/obj/machinery/the_singularitybomb/proc/abort()
+	src.timing = 0
+	src.icon_state = "portgen1"
+
+	// And here (Convair880).
+	logTheThing(LOG_BOMBING, usr, "deactivated [src.name][src.activator ? " (primed by [constructTarget(src.activator,"bombing")]" : ""] at [log_loc(src)].")
+	message_admins("[key_name(usr)] deactivated [src.name][src.activator ? " (primed by [key_name(src.activator)])" : ""] at [log_loc(src)].")
+
 /obj/machinery/the_singularitybomb/attack_ai(mob/user as mob)
 	return
 
diff --git a/code/obj/machinery/spaceheater.dm b/code/obj/machinery/spaceheater.dm
index c4c60cfde181d..fc0e1d792d310 100644
--- a/code/obj/machinery/spaceheater.dm
+++ b/code/obj/machinery/spaceheater.dm
@@ -8,78 +8,100 @@ TYPEINFO(/obj/machinery/space_heater)
 	icon_state = "sheater0"
 	name = "space HVAC"
 	desc = "Made by Space Amish using traditional space techniques, this space heater is guaranteed not to set the station on fire."
-	var/emagged = 0
+	var/emagged = FALSE
 	var/obj/item/cell/cell
-	var/on = 0
-	var/heating = 0
-	var/open = 0
-	var/set_temperature = 50		// in celcius, add T0C for kelvin
-	var/heating_power = 40000
-	var/cooling_power = -30000
+	var/open = FALSE
+	var/on = FALSE
+	var/heating = FALSE // If its cooling down (false) or heating up (true) the current atmosphere
+	var/set_temperature = T0C+50
+	var/heating_power = 400 /// fake heat capacity
+	var/cooling_power = -300
 	deconstruct_flags = DECON_WRENCH | DECON_WELDER
-	flags = FPRINT
+	flags = FPRINT | TGUI_INTERACTIVE
 
+	#define max (src.emagged ? T0C+400 : T0C+90)
+	#define min (src.emagged ? T0C-120 : T0C-90)
 
 	New()
 		..()
-		cell = new(src)
-		cell.charge = 1000
-		cell.maxcharge = 1000
+		src.cell = new(src)
+		src.cell.charge = 1000
+		src.cell.maxcharge = 1000
 		UpdateIcon()
 		return
 
+	ui_interact(mob/user, datum/tgui/ui)
+		ui = tgui_process.try_update_ui(user, src, ui)
+		if(!ui)
+			ui = new(user, src, "space_heater", src.name)
+			ui.open()
+
+	ui_data(mob/user)
+		. = list()
+		.["on"] = src.on
+		.["max"] = max
+		.["min"] = min
+		.["heating"] = src.heating
+		.["emagged"] = src.emagged
+		.["set_temperature"] = src.set_temperature
+		.["cell"] = src.cell
+		if (src.cell != null) // Cant get the cell variables if it doesnt exist
+			.["cell_name"] = src.cell.name
+			.["cell_charge"] = src.cell.percent()
+
 	update_icon()
-		if (on)
-			if(heating)
+		if (src.on)
+			if(src.heating)
 				icon_state = "sheaterH"
 			else
 				icon_state = "sheaterC"
 		else
 			icon_state = "sheater0"
-		if(open)
+		if (src.open)
 			icon_state = "sheater-open"
 		return
 
 	emag_act(var/mob/user, var/obj/item/card/emag/E)
 		if (!src.emagged)
-			if (open)
+			if (src.open)
 				if (user)
 					user.show_text("You short out the temperature limiter circuit in the [src].", "blue")
-				src.emagged = 1
-				src.desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed to set the station on fire."
-				return 1
+				src.emagged = TRUE
+				return TRUE
 			else
 				if (user)
 					user.show_text("The internal circuitry must be exposed!", "red")
-				return 0
+				return FALSE
 		else
 			if (user)
 				user.show_text("The temperature limiter is already burned out.", "red")
-				return 0
+				return FALSE
 
 	demag(mob/user)
 		if (!src.emagged)
-			return 0
+			return FALSE
 		if (user)
 			user.show_text("You repair the temperature regulator in the [src].", "blue")
-		src.desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
-		src.emagged = 0
-		return 1
+		src.emagged = FALSE
+		return TRUE
 
-
-	examine()
+	get_desc()
 		. = ..()
-		. += "The HVAC is [on ? "on" : "off"], [heating ? "heating" : "cooling"] and the hatch is [open ? "open" : "closed"]."
-		if(open)
-			. += "The power cell is [cell ? "installed" : "missing"]."
+		if (src.emagged)
+			src.desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed to set the station on fire."
 		else
-			. += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
-
+			src.desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
+		. += "The HVAC is [src.on ? "on" : "off"], and [src.heating ? "heating" : "cooling"] the environment."
+		. += "The power cell is [src.cell ? "installed" : "missing"]."
+		if(src.open)
+			. += "The power cell is [cell ? "installed" : "missing"]."
+		if (src.cell != null)
+			. += "The charge meter reads [src.cell ? round(src.cell.percent(),1) : 0]%"
 
 	attackby(obj/item/I, mob/user)
 		if(istype(I, /obj/item/cell))
-			if(open)
-				if(cell)
+			if(src.open)
+				if(src.cell)
 					boutput(user, "There is already a power cell inside.")
 					return
 				else
@@ -87,7 +109,7 @@ TYPEINFO(/obj/machinery/space_heater)
 					var/obj/item/cell/C = user.equipped()
 					if(istype(C))
 						user.drop_item()
-						cell = C
+						src.cell = C
 						C.set_loc(src)
 						C.add_fingerprint(user)
 
@@ -96,15 +118,14 @@ TYPEINFO(/obj/machinery/space_heater)
 				boutput(user, "The hatch must be open to insert a power cell.")
 				return
 		else if (isscrewingtool(I))
-			open = !open
-			user.visible_message(SPAN_NOTICE("[user] [open ? "opens" : "closes"] the hatch on the [src]."), SPAN_NOTICE("You [open ? "open" : "close"] the hatch on the [src]."))
+			src.open = !src.open
+			user.visible_message(SPAN_NOTICE("[user] [open ? "opens" : "closes"] the hatch on the [src]."), SPAN_NOTICE("You [src.open ? "open" : "close"] the hatch on the [src]."))
+			if (!src.open)
+				tgui_process.close_uis(src)
 			UpdateIcon()
-			if(!open && user.using_dialog_of(src))
-				user.Browse(null, "window=spaceheater")
-				src.remove_dialog(user)
 		else if (iswrenchingtool(I))
 			if (user)
-				user.show_text("You [anchored ? "release" : "anchor"] the [src]", "blue")
+				user.show_text("You [src.anchored ? "release" : "anchor"] the [src]", "blue")
 			src.anchored = !src.anchored
 			playsound(src.loc, 'sound/items/Ratchet.ogg', 40, 0, 0)
 		else
@@ -113,111 +134,71 @@ TYPEINFO(/obj/machinery/space_heater)
 
 	attack_hand(mob/user)
 		src.add_fingerprint(user)
-		if(open)
-
-			var/dat
-			dat = "Power cell: "
-			if(cell)
-				dat += "<A href='byond://?src=\ref[src];op=cellremove'>Installed</A><BR>"
-			else
-				dat += "<A href='byond://?src=\ref[src];op=cellinstall'>Removed</A><BR>"
-
-			dat += "Power Level: [cell ? round(cell.percent(),1) : 0]%<BR><BR>"
-
-			dat += "Set Temperature: "
-
-			dat += "<A href='?src=\ref[src];op=temp;val=-10'>--</A> <A href='?src=\ref[src];op=temp;val=-5'>-</A>"
-
-			dat += " <A href='?src=\ref[src];op=set_temp'>[set_temperature]&deg;C</A> "
-
-			dat += "<A href='?src=\ref[src];op=temp;val=5'>+</A> <A href='?src=\ref[src];op=temp;val=10'>++</A><BR>"
-
-			src.add_dialog(user)
-			user.Browse("<HEAD><TITLE>Space Heater Control Panel</TITLE></HEAD><TT>[dat]</TT>", "window=spaceheater")
-			onclose(user, "spaceheater")
-
-
-
-
+		if(src.open)
+			ui_interact(user)
 		else
-			if (on && src.emagged)
+			if (src.on && src.emagged)
 				user.show_text("The button seems to be stuck!", "red")
 			else
-				on = !on
-				user.visible_message(SPAN_NOTICE("[user] switches [on ? "on" : "off"] the [src]."),SPAN_NOTICE("You switch [on ? "on" : "off"] the [src]."))
+				src.on = !src.on
+				user.visible_message(SPAN_NOTICE("[user] switches [src.on ? "on" : "off"] the [src]."),SPAN_NOTICE("You switch [src.on ? "on" : "off"] the [src]."))
 				UpdateIcon()
-
-
-
-			if (on)
+			if (src.on)
 				playsound(src.loc, 'sound/machines/heater_on.ogg', 50, 1)
 			else
 				playsound(src.loc, 'sound/machines/heater_off.ogg', 50, 1)
 		return
 
-
-	Topic(href, href_list)
-		if (usr.stat)
+	ui_act(action, list/params)
+		. = ..()
+		if (.)
 			return
-		if ((in_interact_range(src, usr) && istype(src.loc, /turf)) || (issilicon(usr)))
-			src.add_dialog(usr)
-
-			switch(href_list["op"])
-				if("set_temp")
-					var/value = input(usr, "Target temperature (20C-[src.emagged ? 400 : 90]C):", "Enter Target Temperature", src.set_temperature)
-					if (!isnum(value)) return
-					var/max = src.emagged ? 400 : 90
-					var/min = src.emagged ? -120 : 90
-
-					set_temperature = clamp(value, -min, max)
-
-				if("temp")
-					var/value = text2num_safe(href_list["val"])
-					var/max = src.emagged ? 400 : 90
-					var/min = src.emagged ? -120 : 90
-
-					// limit to 20-90 degC
-					set_temperature = clamp(set_temperature + value, -min, max)
-
-				if("cellremove")
-					if(open && cell && !usr.equipped())
-						cell.UpdateIcon()
-						usr.put_in_hand_or_drop(cell)
-						cell = null
-
-						usr.visible_message(SPAN_NOTICE("[usr] removes the power cell from \the [src]."), SPAN_NOTICE("You remove the power cell from \the [src]."))
-
-
-				if("cellinstall")
-					if(open && !cell)
-						var/obj/item/cell/C = usr.equipped()
-						if(istype(C))
-							usr.drop_item()
-							cell = C
-							C.set_loc(src)
-							C.add_fingerprint(usr)
-
-							usr.visible_message(SPAN_NOTICE("[usr] inserts a power cell into \the [src]."), SPAN_NOTICE("You insert the power cell into \the [src]."))
-
-			updateDialog()
-		else
-			usr.Browse(null, "window=spaceheater")
-			src.remove_dialog(usr)
-		return
-
-
+		switch(action)
+			if("set_temp")
+				var/adjust_temperature = params["temperature_adjust"]
+				var/inputted_temperature = params["inputted_temperature"] // For dragging
+				if (adjust_temperature)
+					src.set_temperature = clamp((src.set_temperature + adjust_temperature), min , max)
+				else if (text2num_safe(inputted_temperature) != null)
+					src.set_temperature = clamp(text2num_safe(inputted_temperature), min , max)
+				. = TRUE
+
+			if("cellremove")
+				var/obj/item/I = src.cell
+				if (!I)
+					boutput(usr, SPAN_ALERT("No cell found to eject."))
+					return
+				I.set_loc(src.loc)
+				src.on = FALSE
+				usr.put_in_hand_or_eject(I)
+				usr.visible_message(SPAN_NOTICE("[usr] removes the power cell from \the [src]."),
+				SPAN_NOTICE("You remove the power cell from \the [src]."))
+				UpdateIcon()
+				. = TRUE
+
+			if("cellinstall")
+				var/obj/item/cell = usr.equipped()
+				if(istype(cell, /obj/item/cell))
+					if(src.cell)
+						boutput(usr, SPAN_ALERT("A cell is already loaded into the machine."))
+						return
+					src.cell =  cell
+					usr.drop_item()
+					cell.set_loc(src)
+					usr.visible_message(SPAN_NOTICE("[usr] inserts a power cell into \the [src]."), SPAN_NOTICE("You insert the power cell into \the [src]."))
+				. = TRUE
 
 	process()
-		if(on)
-			if(cell?.charge > 0)
+		if(src.on)
+			if(src.cell?.charge > 0)
 
 				var/turf/simulated/L = loc
 				if(istype(L))
 					var/datum/gas_mixture/env = L.return_air()
-					if(env.temperature < (set_temperature+T0C))
-						heating = 1
+					if(env.temperature < (set_temperature))
+						heating = TRUE
 					else
-						heating = 0
+						heating = FALSE
 
 					var/transfer_moles = src.emagged ? 0.5 * TOTAL_MOLES(env) : 0.25 * TOTAL_MOLES(env)
 
@@ -230,14 +211,14 @@ TYPEINFO(/obj/machinery/space_heater)
 						var/heat_capacity = HEAT_CAPACITY(removed)
 						//boutput(world, "heating ([heat_capacity])")
 						var/current_power = 0
-						if(heating)
+						if(src.heating)
 							current_power = src.emagged ? src.heating_power * 3: src.heating_power
-							removed.temperature = (removed.temperature*heat_capacity + current_power)/heat_capacity
+							removed.temperature = (removed.temperature*heat_capacity + current_power * src.set_temperature)/heat_capacity
 						else
 							current_power = src.emagged ? src.cooling_power * 3: src.cooling_power
-							removed.temperature = (removed.temperature*heat_capacity + current_power)/heat_capacity
+							removed.temperature = (removed.temperature*heat_capacity + current_power * src.set_temperature)/heat_capacity
 
-						cell.use(abs(current_power)/20000)
+						src.cell.use(abs(current_power)/20000)
 
 						//boutput(world, "now at [removed.temperature]")
 
@@ -247,7 +228,7 @@ TYPEINFO(/obj/machinery/space_heater)
 
 
 			else
-				on = 0
+				src.on = 0
 				UpdateIcon()
 
 
@@ -258,6 +239,9 @@ TYPEINFO(/obj/machinery/space_heater)
 		if(Obj == src.cell)
 			src.cell = null
 
+	#undef max
+	#undef min
+
 TYPEINFO(/obj/machinery/sauna_stove)
 	mats = 8
 
diff --git a/code/obj/machinery/traymachines.dm b/code/obj/machinery/traymachines.dm
index c836836584c1a..3adaba9275763 100644
--- a/code/obj/machinery/traymachines.dm
+++ b/code/obj/machinery/traymachines.dm
@@ -319,11 +319,15 @@ ABSTRACT_TYPE(/obj/machine_tray)
 	var/id = 1 //crema switch uses this when finding crematoria
 	var/obj/machinery/crema_switch/igniter = null
 	tray_type = /obj/machine_tray/crematorium
+	var/active = FALSE
 
 	icon_trayopen = "crema0"
 	icon_unoccupied = "crema1"
 	icon_occupied = "crema2"
 
+	medical
+		id = "medicalcremator"
+
 	New()
 		. = ..()
 		START_TRACKING
@@ -341,12 +345,14 @@ ABSTRACT_TYPE(/obj/machine_tray)
 		return
 	if (src.locked)
 		return //don't let you cremate something twice or w/e
+	if (src.active)
+		return
 	if (!src.contents || !length(src.contents))
 		src.visible_message(SPAN_ALERT("You hear a hollow crackle, but nothing else happens."))
 		return
 
+	src.active = TRUE
 	src.visible_message(SPAN_ALERT("You hear a roar as \the [src.name] activates."))
-	src.locked = TRUE
 	var/ashes = 0
 	power_usage = powerdraw_use //gotta chug them watts
 	icon_state = "crema_active"
@@ -362,23 +368,31 @@ ABSTRACT_TYPE(/obj/machine_tray)
 	for (var/mob/living/L in contents)
 		if (L in non_tray_contents)
 			continue
-		L.changeStatus("stunned", 10 SECONDS)
+		L.changeStatus("burning", 15 SECONDS)
+		if (L in non_tray_contents)
+			continue
+		if (!L.is_heat_resistant())
+			L.TakeDamage("chest", 0, 30)
+			if (!isdead(L))
+				L.emote("scream")
+
+	sleep(3 SECONDS)
 
-	sleep(1 SECOND)
 	for (var/i in 1 to 10)
 		if(isnull(src))
 			return
 		for (var/mob/living/L in contents)
 			if (L in non_tray_contents)
 				continue
-			if (!L.is_heat_resistant())
-				L.TakeDamage("chest", 0, 30)
-				if (!isdead(L) && prob(25))
-					L.emote("scream")
-		sleep(1 SECOND)
+			L.changeStatus("burning", 30 SECONDS)
+
+	sleep(6 SECONDS)
 
 	if(isnull(src))
 		return
+	src.locked = TRUE // only lock when it's too late to escape
+	src.visible_message(SPAN_ALERT("\The [src.name] clunks locked!"))
+	sleep(1 SECOND)
 	for (var/I in contents)
 		if (I in non_tray_contents)
 			continue
@@ -404,6 +418,7 @@ ABSTRACT_TYPE(/obj/machine_tray)
 		return
 	src.visible_message(SPAN_ALERT("\The [src.name] finishes and shuts down."))
 	src.locked = FALSE
+	src.active = FALSE
 	power_usage = initial(power_usage)
 	playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
 
@@ -431,6 +446,10 @@ ABSTRACT_TYPE(/obj/machine_tray)
 	var/id = 1
 	var/list/obj/machinery/traymachine/locking/crematorium/crematoriums = null
 
+	medical
+		id = "medicalcremator"
+		req_access = list(access_medical_lockers)
+
 	disposing()
 		for (var/obj/machinery/traymachine/locking/crematorium/O in src.crematoriums)
 			O.igniter = null
diff --git a/code/obj/mining.dm b/code/obj/mining.dm
index 467276adff9ca..43839cc1e7ba6 100644
--- a/code/obj/mining.dm
+++ b/code/obj/mining.dm
@@ -704,7 +704,7 @@
 				if (magnetNotReady)
 					return
 				if (!target || !src.get_magnetic_center())
-					boutput(usr, "Uh oh, something's gotten really fucked up with the magnet system. Please report this to a coder!")
+					src.visible_message("<b>[src.name]</b> armeds, \"Magnetic field strength error. Please ensure mining area is properly magnetized\"")
 					return
 
 				if (target.check_for_unacceptable_content())
@@ -717,7 +717,7 @@
 				if (magnetNotReady)
 					return
 				if (!target || !src.get_magnetic_center())
-					boutput(usr, "Uh oh, something's gotten really fucked up with the magnet system. Please report this to a coder!")
+					src.visible_message("<b>[src.name]</b> armeds, \"Magnetic field strength error. Please ensure mining area is properly magnetized\"")
 					return
 
 				if (target.check_for_unacceptable_content())
diff --git a/code/obj/rack.dm b/code/obj/rack.dm
index a0c2524881132..7a850c7e19a3f 100644
--- a/code/obj/rack.dm
+++ b/code/obj/rack.dm
@@ -154,3 +154,98 @@
 		playsound(the_rack, 'sound/items/Deconstruct.ogg', 50, TRUE)
 		owner.visible_message(SPAN_NOTICE("[owner] disassembles [the_rack]."))
 		the_rack.deconstruct()
+
+#define RACK_SPAWN_DIAGONAL_PROBABILITY 10
+
+/// Map-spawn helper for regularly stacked rack items
+/obj/rack/organized
+	var/initialized = FALSE //! Have we spawned our items yet
+	var/list/obj/item/items_to_spawn = list() //! What items are we going to spawn
+	var/order_override = "" //! Force a specific organization layout
+	var/shuffle_chance = 1 //! Probability of the card order being shuffled
+#ifdef IN_MAP_EDITOR
+	icon_state = "rack_filled"
+#endif
+
+/obj/rack/organized/New()
+	if (!src.initialized)
+		if (prob(shuffle_chance))
+			shuffle_list(src.items_to_spawn)
+		switch(src.order_override)
+			if("zigzag")
+				src.zigzag()
+			if("diagonal")
+				src.diagonal()
+			else
+				if (prob(RACK_SPAWN_DIAGONAL_PROBABILITY))
+					src.diagonal()
+				else
+					src.zigzag()
+		src.initialized = TRUE
+	. = ..() // spawn items before calculating sims_score
+
+#undef RACK_SPAWN_DIAGONAL_PROBABILITY
+
+#define RACK_ZIGZAG_TOP 7
+#define RACK_ZIGZAG_CENTER_OFFSET 5
+#define RACK_ZIGZAG_VERTICAL_OFFSET 2
+
+/// Lay out items in a zig-zag pattern
+/obj/rack/organized/proc/zigzag()
+	var/move_y = RACK_ZIGZAG_TOP
+	var/left_side = FALSE // start on upper right
+	for(var/item in src.items_to_spawn)
+		var/obj/item/I = new item(get_turf(src))
+		I.pixel_y = move_y
+		I.pixel_x = left_side ? -RACK_ZIGZAG_CENTER_OFFSET : RACK_ZIGZAG_CENTER_OFFSET
+		move_y = move_y - RACK_ZIGZAG_VERTICAL_OFFSET // zig
+		left_side = !left_side // zag
+
+#undef RACK_ZIGZAG_TOP
+#undef RACK_ZIGZAG_CENTER_OFFSET
+#undef RACK_ZIGZAG_VERTICAL_OFFSET
+
+#define RACK_DIAGONAL_TOP 9
+#define RACK_DIAGONAL_OFFSET 3
+
+/// Lay out items from top left to bottom right
+/obj/rack/organized/proc/diagonal()
+	var/move_xy = RACK_DIAGONAL_TOP
+	for(var/item in src.items_to_spawn)
+		var/obj/item/I = new item(get_turf(src))
+		I.pixel_y = move_xy
+		I.pixel_x = -move_xy
+		move_xy = move_xy - RACK_DIAGONAL_OFFSET
+
+#undef RACK_DIAGONAL_TOP
+#undef RACK_DIAGONAL_OFFSET
+
+/// Technical Storage circuit board rack for engineering/supply
+/obj/rack/organized/techstorage_eng
+	items_to_spawn = list(
+		/obj/item/circuitboard/qmorder,
+		/obj/item/circuitboard/qmsupply,
+		/obj/item/circuitboard/barcode,
+		/obj/item/circuitboard/barcode_qm,
+		/obj/item/circuitboard/telescope,
+		/obj/item/circuitboard/powermonitor,
+		/obj/item/circuitboard/powermonitor_smes,
+	)
+
+/// Includes the transception array board, for maps with transception cargo fulfillment
+/obj/rack/organized/techstorage_eng/transception
+	New()
+		src.items_to_spawn += /obj/item/circuitboard/transception
+		. = ..()
+
+/// Technical Storage circuit board rack for medical/science/misc
+/obj/rack/organized/techstorage_med
+	items_to_spawn = list(
+		/obj/item/circuitboard/arcade,
+		/obj/item/circuitboard/card,
+		/obj/item/circuitboard/teleporter,
+		/obj/item/circuitboard/operating,
+		/obj/item/circuitboard/cloning,
+		/obj/item/circuitboard/genetics,
+		/obj/item/circuitboard/robot_module_rewriter,
+	)
diff --git a/code/obj/random_spawners.dm b/code/obj/random_spawners.dm
index f8e0c15baf0b1..3be8d27169549 100644
--- a/code/obj/random_spawners.dm
+++ b/code/obj/random_spawners.dm
@@ -82,7 +82,7 @@
 	max_amt2spawn = 1
 	items2spawn = list(/obj/item/reagent_containers/food/snacks/candy/chocolate,
 	/obj/item/reagent_containers/food/snacks/candy/nougat,
-	/obj/item/reagent_containers/food/snacks/candy/butterscotch,
+	/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch,
 	/obj/item/reagent_containers/food/snacks/sandwich/meat_h,
 	/obj/item/reagent_containers/food/snacks/sandwich/meat_m,
 	/obj/item/reagent_containers/food/snacks/sandwich/meat_s,
@@ -1769,12 +1769,14 @@
 		min_amt2spawn = 5
 		max_amt2spawn = 7
 
-/obj/random_item_spawner/kineticgun // used in the 4th of july admin button.
+/obj/random_item_spawner/kineticgun //base type. split old behavior to fullrandom
 	name = "firearm spawner"
 	icon_state = "rand_gun"
 	min_amt2spawn = 1 // doing it this way to preserve current use of spawner while allowing random amounts
 	max_amt2spawn = 1
 	items2spawn = null
+
+/obj/random_item_spawner/kineticgun/fullrandom // used in the 4th of july admin button.
 	New()
 		items2spawn = concrete_typesof(/obj/item/gun/kinetic) - /obj/item/gun/kinetic/meowitzer //No, just no
 		. = ..()
@@ -1805,7 +1807,11 @@
 	/obj/item/gun/kinetic/sawnoff,
 	/obj/item/gun/kinetic/single_action/colt_saa,
 	/obj/item/gun/kinetic/single_action/flintlock,
-	/obj/item/gun/kinetic/zipgun)
+	/obj/item/gun/kinetic/zipgun,
+	/obj/item/gun/kinetic/makarov,
+	/obj/item/gun/kinetic/single_action/mts_255,
+	/obj/item/gun/kinetic/survival_rifle,
+	/obj/item/gun/kinetic/survival_rifle)
 
 	one
 		amt2spawn = 1
diff --git a/code/obj/stool.dm b/code/obj/stool.dm
index f67b41332e0eb..fbee36af0ed74 100644
--- a/code/obj/stool.dm
+++ b/code/obj/stool.dm
@@ -293,6 +293,16 @@ TYPEINFO(/obj/stool/wooden)
 	auto = 1
 	auto_path = /obj/stool/bench/yellow/auto
 
+/* ---------- Purple ---------- */
+
+/obj/stool/bench/purple
+	icon = 'icons/obj/furniture/bench_purple.dmi'
+	parts_type = /obj/item/furniture_parts/bench/purple
+
+/obj/stool/bench/purple/auto
+	auto = 1
+	auto_path = /obj/stool/bench/purple/auto
+
 /* ---------- Wooden ---------- */
 
 /obj/stool/bench/wooden
@@ -655,9 +665,10 @@ TYPEINFO(/obj/stool/chair)
 		for (var/mob/living/M in src.loc)
 
 			if (ishuman(M))
-				chair_chump = M
-			if (!chair_chump || !chair_chump.on_chair)
-				chair_chump = null
+				var/mob/living/carbon/human/H = M
+				if (H.on_chair)
+					chair_chump = H
+
 			if (chair_chump)// == 1)
 				if (chair_chump == L)
 					user.visible_message(SPAN_NOTICE("<b>[chair_chump]</b> steps off [chair_chump.on_chair]."), SPAN_NOTICE("You step off [src]."))
diff --git a/code/obj/storage/closets.dm b/code/obj/storage/closets.dm
index 757d394f9c117..157e3012ca27a 100644
--- a/code/obj/storage/closets.dm
+++ b/code/obj/storage/closets.dm
@@ -134,7 +134,7 @@ TYPEINFO(/obj/storage/closet)
 			if (prob(50))
 				new /obj/item/clothing/head/helmet/firefighter(src)
 			if (prob(30))
-				new /obj/item/clothing/suit/fire(src)
+				new /obj/item/clothing/suit/hazard/fire(src)
 				new /obj/item/clothing/mask/gas/emergency(src)
 			if (prob(10))
 				new /obj/item/storage/firstaid/fire(src)
@@ -207,8 +207,8 @@ TYPEINFO(/obj/storage/closet/coffin)
 	icon_opened = "syndicate-open"
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
@@ -608,7 +608,7 @@ TYPEINFO(/obj/storage/closet/coffin)
 	icon_state = "radiation"
 	icon_opened = "radiation-open"
 	desc = "A handy closet full of everything you need to protect yourself from impending doom of radioactive death."
-	spawn_contents = list(/obj/item/clothing/suit/rad = 1,
+	spawn_contents = list(/obj/item/clothing/suit/hazard/rad = 1,
 					/obj/item/clothing/head/rad_hood = 1,
 					/obj/item/storage/pill_bottle/antirad = 1,
 					/obj/item/clothing/glasses/toggleable/meson = 1,
diff --git a/code/obj/storage/crates.dm b/code/obj/storage/crates.dm
index ac35b061ba8f4..cc772d538667e 100644
--- a/code/obj/storage/crates.dm
+++ b/code/obj/storage/crates.dm
@@ -740,7 +740,7 @@ TYPEINFO(/obj/storage/crate/chest)
 		/obj/item/mining_tool)
 
 	rad
-		spawn_contents = list(/obj/item/clothing/suit/rad,
+		spawn_contents = list(/obj/item/clothing/suit/hazard/rad,
 		/obj/item/mine/radiation = 5,
 		/obj/item/clothing/head/rad_hood,
 		/obj/item/storage/pill_bottle/antirad,
diff --git a/code/obj/storage/loot_crates.dm b/code/obj/storage/loot_crates.dm
index 78b611c296a2b..379874254480c 100644
--- a/code/obj/storage/loot_crates.dm
+++ b/code/obj/storage/loot_crates.dm
@@ -60,7 +60,9 @@
 		/obj/item/gun/energy/phaser_huge = 10,\
 		/obj/item/clothing/ears/earmuffs/yeti = 20,\
 		/obj/item/clothing/lanyard = 20,\
-		/obj/item/kitchen/utensil/knife/tracker = 10,
+		/obj/item/kitchen/utensil/knife/tracker = 10,\
+		/obj/item/disk/data/floppy/manudrive/pocketoxyex/singleuse = 25,\
+		/obj/item/disk/data/floppy/manudrive/pocketoxyex/threeuse = 5,
 	// fun
 		/obj/item/gun/bling_blaster = 20,\
 		/obj/item/clothing/under/gimmick/frog = 20,\
diff --git a/code/obj/storage/secure_closets.dm b/code/obj/storage/secure_closets.dm
index 288d6bef97876..c28887ccb69ba 100644
--- a/code/obj/storage/secure_closets.dm
+++ b/code/obj/storage/secure_closets.dm
@@ -328,7 +328,6 @@ ADMIN_INTERACT_PROCS(/obj/storage/secure/closet, proc/break_open)
 	name = "\improper Chief Engineer's locker"
 	req_access = list(access_engineering_chief)
 	spawn_contents = list(
-		/obj/item/storage/belt/utility/prepared/ceshielded,
 		/obj/item/disk/data/floppy/manudrive/law_rack,
 		/obj/item/storage/box/clothing/chief_engineer,
 		/obj/item/device/radio/headset/command/ce,
@@ -336,9 +335,9 @@ ADMIN_INTERACT_PROCS(/obj/storage/secure/closet, proc/break_open)
 		/obj/item/device/flash,
 		/obj/item/clothing/shoes/magnetic,
 		/obj/item/clothing/gloves/yellow,
-		/obj/item/clothing/suit/fire/heavy, //now theres at least one on every map
+		/obj/item/clothing/suit/hazard/fire/heavy, //now theres at least one on every map
 		/obj/item/clothing/head/helmet/firefighter,
-		/obj/item/clothing/suit/rad, //mostly relevant for singulo and nuke maps
+		/obj/item/clothing/suit/hazard/rad, //mostly relevant for singulo and nuke maps
 		/obj/item/clothing/head/rad_hood,
 		/obj/item/storage/toolbox/mechanical/yellow_tools,
 		/obj/item/storage/box/misctools,
@@ -354,7 +353,27 @@ ADMIN_INTERACT_PROCS(/obj/storage/secure/closet, proc/break_open)
 		/obj/item/clothing/suit/space/light/engineer,
 		/obj/item/clothing/head/helmet/space/light/engineer,
 	#endif
+	)
 
+/obj/storage/secure/closet/command/chief_engineer/puzzle
+	locked = FALSE
+	spawn_contents = list(
+		/obj/item/storage/belt/utility/prepared/ceshielded, //instead of the law rack disk
+		/obj/item/storage/box/clothing/chief_engineer,
+		/obj/item/device/radio/headset/command/ce,
+		/obj/item/stamp/ce,
+		/obj/item/device/flash,
+		/obj/item/clothing/shoes/magnetic,
+		/obj/item/clothing/gloves/yellow,
+		/obj/item/clothing/suit/hazard/fire/heavy,
+		/obj/item/clothing/head/helmet/firefighter,
+		/obj/item/clothing/suit/hazard/rad,
+		/obj/item/clothing/head/rad_hood,
+		/obj/item/storage/toolbox/mechanical/yellow_tools,
+		/obj/item/storage/box/misctools,
+		/obj/item/extinguisher,
+		/obj/item/clothing/suit/space/light/engineer,
+		/obj/item/clothing/head/helmet/space/light/engineer,
 	)
 
 /* ==================== */
@@ -766,7 +785,7 @@ ADMIN_INTERACT_PROCS(/obj/storage/secure/closet, proc/break_open)
 /obj/storage/secure/closet/engineering/atmos
 	name = "\improper Atmospheric Technician's locker"
 	req_access = list(access_engineering_atmos)
-	spawn_contents = list(/obj/item/clothing/suit/fire,
+	spawn_contents = list(/obj/item/clothing/suit/hazard/fire,
 	/obj/item/clothing/head/helmet/firefighter,
 	/obj/item/device/analyzer/atmospheric/upgraded,
 	/obj/item/clothing/glasses/toggleable/atmos,
@@ -864,7 +883,8 @@ ADMIN_INTERACT_PROCS(/obj/storage/secure/closet, proc/break_open)
 	/obj/item/satchel/hydro,\
 	/obj/item/reagent_containers/glass/wateringcan,\
 	/obj/item/sponge,\
-	/obj/item/kitchen/food_box/egg_box/rancher)
+	/obj/item/kitchen/food_box/egg_box/rancher,
+	/obj/item/storage/box/knitting)
 
 /obj/storage/secure/closet/civilian/kitchen
 	name = "\improper Catering supplies locker"
diff --git a/code/obj/storage/wall_cabinet.dm b/code/obj/storage/wall_cabinet.dm
index 661b9e2cbe79d..aa1e04c2ed41d 100644
--- a/code/obj/storage/wall_cabinet.dm
+++ b/code/obj/storage/wall_cabinet.dm
@@ -63,7 +63,7 @@ TYPEINFO(/obj/item/storage/wall)
 		if (prob(50))
 			src.storage.add_contents(new /obj/item/clothing/head/helmet/firefighter(src))
 		if (prob(30))
-			src.storage.add_contents(new /obj/item/clothing/suit/fire(src))
+			src.storage.add_contents(new /obj/item/clothing/suit/hazard/fire(src))
 			src.storage.add_contents(new /obj/item/clothing/mask/gas/emergency(src))
 		if (prob(10))
 			src.storage.add_contents(new /obj/item/storage/firstaid/fire(src))
diff --git a/code/obj/submachine/chem_extractor.dm b/code/obj/submachine/chem_extractor.dm
index 9b80cf477f975..decdba0f7aaa1 100644
--- a/code/obj/submachine/chem_extractor.dm
+++ b/code/obj/submachine/chem_extractor.dm
@@ -154,16 +154,21 @@ TYPEINFO(/obj/submachine/chem_extractor)
 					. = TRUE
 		src.UpdateIcon()
 
+	ui_close(mob/user)
+		. = ..()
+		if(inserted?.loc != src)
+			remove_distant_beaker(force = TRUE)
+
 	attackby(var/obj/item/W, var/mob/user)
 		if(istype(W, /obj/item/reagent_containers/glass/) || istype(W, /obj/item/reagent_containers/food/drinks/))
 			tryInsert(W, user)
 
 		..()
 
-	proc/remove_distant_beaker()
+	proc/remove_distant_beaker(force = FALSE)
 		// borgs and people with item arms don't insert the beaker into the machine itself
 		// but whenever something would happen to the dispenser and the beaker is far it should disappear
-		if(src.inserted && BOUNDS_DIST(src.inserted, src) > 0)
+		if(src.inserted && (BOUNDS_DIST(src.inserted, src) > 0 || force))
 			if (src.inserted == src.extract_to) src.extract_to = null
 			src.inserted = null
 			src.UpdateIcon()
diff --git a/code/obj/submachine/cooking.dm b/code/obj/submachine/cooking.dm
index 359ad8034a8fe..3b0a09334542e 100644
--- a/code/obj/submachine/cooking.dm
+++ b/code/obj/submachine/cooking.dm
@@ -1,3 +1,4 @@
+
 TYPEINFO(/obj/submachine/chef_sink)
 	mats = 12
 
@@ -792,6 +793,8 @@ table#cooktime a#start {
 			src.recipes += new /datum/cookingrecipe/oven/hotdog(src)
 			src.recipes += new /datum/cookingrecipe/oven/cheesewheel(src)
 			src.recipes += new /datum/cookingrecipe/oven/turkey(src)
+			src.recipes += new /datum/cookingrecipe/oven/melted_sugar(src)
+			src.recipes += new /datum/cookingrecipe/oven/brownie_batch(src)
 
 			// store the list for later
 			oven_recipes = src.recipes
@@ -1515,193 +1518,3 @@ TYPEINFO(/obj/submachine/foodprocessor)
 			boutput(user, SPAN_NOTICE("You finish stuffing food into [src]!"))
 		else ..()
 		src.updateUsrDialog()
-
-var/list/mixer_recipes = list()
-
-TYPEINFO(/obj/submachine/mixer)
-	mats = 15
-
-/obj/submachine/mixer
-	name = "KitchenHelper"
-	desc = "A food Mixer."
-	icon = 'icons/obj/kitchen.dmi'
-	icon_state = "blender"
-	density = 1
-	anchored = ANCHORED
-	deconstruct_flags = DECON_WRENCH | DECON_CROWBAR | DECON_WELDER
-	var/list/recipes = null
-	var/list/to_remove = list()
-	var/allowed = list(/obj/item/reagent_containers/food/, /obj/item/parts/robot_parts/head, /obj/item/clothing/head/butt, /obj/item/organ/brain)
-	var/working = 0
-
-	New()
-		..()
-		src.recipes = mixer_recipes
-		if (!src.recipes)
-			src.recipes = list()
-
-		if (!src.recipes.len)
-			src.recipes += new /datum/cookingrecipe/mixer/mix_cake_custom(src)
-			src.recipes += new /datum/cookingrecipe/mixer/pancake_batter(src)
-			src.recipes += new /datum/cookingrecipe/mixer/cake_batter(src)
-			src.recipes += new /datum/cookingrecipe/mixer/custard(src)
-			src.recipes += new /datum/cookingrecipe/mixer/mashedpotatoes(src)
-			src.recipes += new /datum/cookingrecipe/mixer/mashedbrains(src)
-			src.recipes += new /datum/cookingrecipe/mixer/gruel(src)
-			src.recipes += new /datum/cookingrecipe/mixer/fishpaste(src)
-			src.recipes += new /datum/cookingrecipe/mixer/meatpaste(src)
-			src.recipes += new /datum/cookingrecipe/mixer/wonton_wrapper(src)
-			src.recipes += new /datum/cookingrecipe/mixer/butters(src)
-
-		src.UpdateIcon()
-		return
-
-	attackby(obj/item/W, mob/user)
-		var/amount = length(src.contents)
-		if (amount >= 4)
-			boutput(user, SPAN_ALERT("The mixer is full."))
-			return
-		var/proceed = 0
-		for(var/check_path in src.allowed)
-			if(istype(W, check_path))
-				proceed = 1
-				break
-		if (!proceed)
-			boutput(user, SPAN_ALERT("You can't put that in the mixer!"))
-			return
-		user.visible_message(SPAN_NOTICE("[user] puts [W] into the [src]."))
-		user.u_equip(W)
-		W.set_loc(src)
-		W.dropped(user)
-
-	attack_hand(var/mob/user)
-		if (!src.working)
-			src.add_dialog(user)
-			var/dat = {"<B>KitchenHelper Mixer</B><BR>
-			<HR>
-			<B>Contents:</B><BR>"}
-			for (var/obj/item/I in src.contents)
-				dat += "[I]<BR>"
-			dat += {"<HR>
-			<A href='?src=\ref[src];mix=1'>Mix!</A><BR>
-			<A href='?src=\ref[src];eject=1'>Eject Contents</A>"}
-			user.Browse(dat, "window=mixer;size=400x500")
-			onclose(user, "mixer")
-		else
-			src.add_dialog(user)
-			var/dat = {"<B>KitchenHelper Mixer</B><BR>
-			<HR><BR>
-			Mixing! Please wait!"}
-			user.Browse(dat, "window=mixer;size=400x500")
-			onclose(user, "mixer")
-
-	attack_ai(var/mob/user as mob)
-		return attack_hand(user)
-
-	MouseDrop_T(obj/item/W as obj, mob/user as mob)
-		if (istype(W) && in_interact_range(W, user) && in_interact_range(src, user) && isalive(user) && !isintangible(user))
-			return src.Attackby(W, user)
-		return ..()
-
-	Topic(href, href_list)
-		if ((BOUNDS_DIST(src, usr) > 0 && (!issilicon(usr) && !isAI(usr))) || !isliving(usr) || iswraith(usr) || isintangible(usr))
-			return
-		if (is_incapacitated(usr) || usr.restrained())
-			return
-
-		if (href_list["mix"])
-			if (src.working)
-				boutput(usr, SPAN_ALERT("It's already working."))
-				return
-			mix()
-		if(href_list["eject"])
-			for (var/obj/item/I in src.contents)
-				I.set_loc(src.loc)
-			src.updateUsrDialog()
-			return
-
-	proc/bowl_checkitem(var/recipeitem, var/recipecount)
-		if (!locate(recipeitem) in src.contents) return 0
-		var/count = 0
-		for(var/obj/item/I in src.contents)
-			if(istype(I, recipeitem))
-				count++
-				to_remove += I
-
-		if (count < recipecount)
-			return 0
-		return 1
-
-	proc/mix()
-		var/amount = length(src.contents)
-		if (!amount)
-			boutput(usr, SPAN_ALERT("There's nothing in the mixer."))
-			return
-		working = 1
-		src.UpdateIcon()
-		src.updateUsrDialog()
-		playsound(src.loc, 'sound/machines/mixer.ogg', 50, 1)
-		var/output = null // /obj/item/reagent_containers/food/snacks/yuck
-		var/derivename = 0
-		for (var/datum/cookingrecipe/R in src.recipes)
-			to_remove.len = 0
-			if (R.item1)
-				if (!bowl_checkitem(R.item1, R.amt1)) continue
-			if (R.item2)
-				if (!bowl_checkitem(R.item2, R.amt2)) continue
-			if (R.item3)
-				if (!bowl_checkitem(R.item3, R.amt3)) continue
-			if (R.item4)
-				if (!bowl_checkitem(R.item4, R.amt4)) continue
-			output = R.specialOutput(src)
-			if (!output)
-				output = R.output
-			if (R.useshumanmeat)
-				derivename = 1
-			break
-		SPAWN(2 SECONDS)
-
-			if (!isnull(output))
-				var/obj/item/reagent_containers/food/snacks/F
-				if (ispath(output))
-					F = new output(get_turf(src))
-				else
-					F = output
-					F.set_loc(get_turf(src))
-
-				if (derivename)
-					var/foodname = F.name
-					for (var/obj/item/reagent_containers/food/snacks/ingredient/meat/humanmeat/M in src.contents)
-						F.name = "[M.subjectname] [foodname]"
-						F.desc += " It sort of smells like [M.subjectjob ? M.subjectjob : "pig"]s."
-						if(!isnull(F.unlock_medal_when_eaten))
-							continue
-						else if (M.subjectjob && M.subjectjob == "Clown")
-							F.unlock_medal_when_eaten = "That tasted funny"
-						else
-							F.unlock_medal_when_eaten = "Space Ham" //replace the old fat person method
-				for (var/obj/item/I in to_remove)
-					qdel(I)
-				to_remove.len = 0
-
-			for (var/obj/I in src.contents)
-				I.set_loc(src.loc)
-				src.visible_message(SPAN_ALERT("[I] is tossed out of [src]!"))
-				var/edge = get_edge_target_turf(src, pick(alldirs))
-				I.throw_at(edge, 25, 4)
-
-			working = 0
-			src.UpdateIcon()
-			src.updateUsrDialog()
-			return
-
-	update_icon()
-		if (!src || !istype(src))
-			return
-
-		if (src.working != 0)
-			src.icon_state = "blender_on"
-		else
-			src.icon_state = "blender"
-
-		return
diff --git a/code/obj/submachine/robotics.dm b/code/obj/submachine/robotics.dm
index 56de284080300..cd49bf63ad38b 100644
--- a/code/obj/submachine/robotics.dm
+++ b/code/obj/submachine/robotics.dm
@@ -701,7 +701,7 @@ ported and crapped up by: haine
 			var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
 			user.show_text("You transfer [trans] unit\s of the solution to [target].")
 
-		if (reagents.total_volume == reagents.maximum_volume) // See if the juicer is full.
+		if (src.reagents.total_volume >= src.reagents.maximum_volume) // See if the juicer is full.
 			user.show_text("[src] is full!", "red")
 			return
 
diff --git a/code/obj/submachine/seed.dm b/code/obj/submachine/seed.dm
index 91d259ad07af6..3b480c1dc0b54 100644
--- a/code/obj/submachine/seed.dm
+++ b/code/obj/submachine/seed.dm
@@ -257,38 +257,11 @@ TYPEINFO(/obj/submachine/seed_manipulator)
 					else
 						boutput(ui.user, SPAN_NOTICE("Extracted [give] seeds from [I]."))
 						while (give > 0)
-							var/obj/item/seed/S
-							if (stored.unique_seed) S = new stored.unique_seed(src)
-							else S = new /obj/item/seed(src,0)
-							var/datum/plantgenes/SDNA = S.plantgenes
-							if (!stored.unique_seed && !stored.hybrid)
-								S.generic_seed_setup(stored, TRUE)
-							HYPpassplantgenes(DNA,SDNA)
-
-							S.name = stored.name
-							S.plant_seed_color(stored.seedcolor)
-							if (stored.hybrid)
-								var/hybrid_type = stored.type
-								var/datum/plant/hybrid = new hybrid_type(S)
-								for(var/V in stored.vars)
-									if (issaved(stored.vars[V]) && V != "holder")
-										hybrid.vars[V] = stored.vars[V]
-								S.planttype = hybrid
-								S.name = hybrid.name
-
-							var/seedname = S.name
-							if (DNA.mutation && istype(DNA.mutation,/datum/plantmutation/))
-								var/datum/plantmutation/MUT = DNA.mutation
-								if (!MUT.name_prefix && !MUT.name_prefix && MUT.name)
-									seedname = "[MUT.name]"
-								else if (MUT.name_prefix || MUT.name_suffix)
-									seedname = "[MUT.name_prefix][seedname][MUT.name_suffix]"
-
-							S.name = "[seedname] seed"
-
-							S.generation = P.generation
-							if (!src.seedoutput) src.seeds.Add(S)
-							else S.set_loc(src.loc)
+							var/obj/item/seed/S = HYPgenerateseedcopy(DNA, stored, P.generation, src)
+							if (!src.seedoutput)
+								src.seeds.Add(S)
+							else
+								S.set_loc(src.loc)
 							give -= 1
 					src.extractables.Remove(I)
 					qdel(I)
diff --git a/code/obj/submachine/weapon_vendor.dm b/code/obj/submachine/weapon_vendor.dm
index 1b8f872fadf74..62524d0517084 100644
--- a/code/obj/submachine/weapon_vendor.dm
+++ b/code/obj/submachine/weapon_vendor.dm
@@ -167,8 +167,8 @@
 		return
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 		// List of avaliable objects for purchase
 		materiel_stock += new/datum/materiel/sidearm/smartgun
 		materiel_stock += new/datum/materiel/sidearm/pistol
diff --git a/code/obj/table.dm b/code/obj/table.dm
index 6addab253a37d..93aa1ff03cc87 100644
--- a/code/obj/table.dm
+++ b/code/obj/table.dm
@@ -376,6 +376,18 @@ TYPEINFO_NEW(/obj/table)
 			return
 		actions.start(new /datum/action/bar/icon/railing_jump/table_jump(M, src), M)
 
+	hitby(atom/movable/AM, datum/thrown_thing/thr)
+		. = ..()
+		if (ismob(AM))
+			if (AM != thr.user && (BOUNDS_DIST(thr.user, src) <= 0))
+				var/remove_tablepass = HAS_FLAG(AM.flags, TABLEPASS) ? FALSE : TRUE //this sucks and should be a mob property x2 augh
+				AM.flags |= TABLEPASS
+				step(AM, get_dir(AM, src))
+				if (remove_tablepass)
+					REMOVE_FLAG(AM.flags, TABLEPASS)
+				src.harm_slam(thr.user, AM)
+
+
 //Replacement for monkies walking through tables: They now parkour over them.
 //Note: Max count of tables traversable is 2 more than the iteration limit
 /datum/action/bar/icon/railing_jump/table_jump
@@ -589,8 +601,8 @@ TYPEINFO_NEW(/obj/table/syndicate)
 	parts_type = /obj/item/furniture_parts/table/syndicate
 
 	New()
-		..()
 		START_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
+		..()
 
 	disposing()
 		STOP_TRACKING_CAT(TR_CAT_NUKE_OP_STYLE)
diff --git a/code/obj/window.dm b/code/obj/window.dm
index 77ff127555187..54f09d9c43f4f 100644
--- a/code/obj/window.dm
+++ b/code/obj/window.dm
@@ -692,19 +692,7 @@ ADMIN_INTERACT_PROCS(/obj/window, proc/smash)
 
 /obj/window/bulletproof/pyro
 	icon_state = "rpyro"
-/*
-/obj/window/supernorn
-	icon = 'icons/Testing/newicons/obj/NEWstructures.dmi'
-	dir = 5
 
-	attackby() // TODO: need to be able to smash them, this is a hack
-	rotate()
-		set hidden = 1
-
-	New()
-		for (var/turf/simulated/wall/auto/T in orange(1))
-			T.UpdateIcon()
-*/
 /obj/window/north
 	dir = NORTH
 
diff --git a/code/obj/zoldorf.dm b/code/obj/zoldorf.dm
index a71f4eca9597e..dad238230d6dd 100644
--- a/code/obj/zoldorf.dm
+++ b/code/obj/zoldorf.dm
@@ -62,8 +62,8 @@ var/global/list/datum/zoldorfitem/zoldorf_items = list()
 	var/list/omencolors = list("none","custom","red","green")
 	var/list/notes = list()
 	var/omencolor
-	var/obj/o1 = new
-	var/obj/o2 = new
+	var/obj/effect/o1 = new
+	var/obj/effect/o2 = new
 	var/inuse = 0
 	var/colorinputbuffer
 	var/smokecolor
@@ -84,8 +84,6 @@ var/global/list/datum/zoldorfitem/zoldorf_items = list()
 
 	New()
 		. = ..()
-		o1.mouse_opacity = 0
-		o2.mouse_opacity = 0
 		START_TRACKING
 
 	proc/updatejar() //updates soul jar display based on partial souls and adds any spillover to the current zoldorf's soul pool
diff --git a/code/player.dm b/code/player.dm
index c25f5c78eccd0..bdc61e5c90232 100644
--- a/code/player.dm
+++ b/code/player.dm
@@ -1,5 +1,7 @@
 /// for client variables and stuff that has to persist between connections
 /datum/player
+	/// the ID of the player as provided by the Goonhub API
+	var/id = 0
 	/// the key of the client object that this datum is attached to
 	var/key
 	/// the ckey of the client object that this datum is attached to
@@ -34,10 +36,8 @@
 	var/current_playtime = null
 	/// Cache jobbans here to speed things up massively
 	var/list/cached_jobbans = null
-	/// saved profiles from the cloud
-	var/list/cloudsaves = null
-	/// saved data from the cloud (spacebux, volume settings, ...)
-	var/list/clouddata = null
+	/// Manager for cloud data and saves
+	var/datum/cloudSaves/cloudSaves = null
 	/// buildmode holder of our client so it doesn't need to get rebuilt every time we reconnect
 	var/datum/buildmode_holder/buildmode = null
 	/// whether this person is a temporary admin (this round only)
@@ -62,6 +62,7 @@
 		src.key = key
 		src.ckey = ckey(key)
 		src.tag = "player-[src.ckey]"
+		src.cloudSaves = new /datum/cloudSaves(src)
 
 		if (ckey(src.key) in mentors)
 			src.mentor = 1
@@ -78,6 +79,30 @@
 			src.client = null
 		..()
 
+	/// Record a player login via the API. Sets player ID field for future API use
+	proc/record_login()
+		if (!roundId || !src.client || src.id) return
+		var/datum/apiModel/Tracked/PlayerResource/playerResponse
+		try
+			var/datum/apiRoute/players/login/playerLogin = new
+			playerLogin.buildBody(
+				src.client.ckey,
+				src.client.key,
+				src.client.address ? src.client.address : "127.0.0.1", // fallback for local dev
+				src.client.computer_id,
+				src.client.byond_version,
+				src.client.byond_build,
+				roundId
+			)
+			playerResponse = apiHandler.queryAPI(playerLogin)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "Failed to record a player login for [src.client.ckey] because: [error.message]")
+			logTheThing(LOG_DIARY, null, "Failed to record a player login for [src.client.ckey] because: [error.message]", "admin")
+			return
+
+		src.id = playerResponse.id
+
 	/// queries api to cache stats so its only done once per player per round
 	proc/cache_round_stats()
 		set waitfor = FALSE
@@ -85,44 +110,41 @@
 
 	/// blocking version of cache_round_stats, queries api to cache stats so its only done once per player per round (please update this proc when adding more player stat vars)
 	proc/cache_round_stats_blocking()
-		var/list/response = null
+		var/datum/apiModel/Tracked/PlayerStatsResource/playerStats
 		try
-			response = apiHandler?.queryAPI("playerInfo/get", list("ckey" = src.ckey), forceResponse = 1)
+			var/datum/apiRoute/players/stats/get/getPlayerStats = new
+			getPlayerStats.queryParams = list("ckey" = src.ckey)
+			playerStats = apiHandler.queryAPI(getPlayerStats)
 		catch
-			return 0
-		if (!response)
-			return 0
-		src.rounds_participated = text2num(response["participated"])
-		src.rounds_participated_rp= text2num(response["participated_rp"])
-		src.rounds_seen = text2num(response["seen"])
-		src.rounds_seen_rp = text2num(response["seen_rp"])
-		src.last_seen = response["last_seen"]
-		return 1
+			return FALSE
+
+		src.rounds_participated_rp = text2num(playerStats.played_rp)
+		src.rounds_participated = text2num(playerStats.played) + src.rounds_participated_rp //the API counts these separately, but we want a combined number
+		src.rounds_seen = text2num(playerStats.connected)
+		src.rounds_seen_rp = text2num(playerStats.connected_rp)
+		src.last_seen = playerStats.latest_connection.created_at
+		return TRUE
 
 	proc/load_antag_tokens()
 		PRIVATE_PROC(TRUE) //call get_antag_tokens
 		. = TRUE
 		var/savefile/AT = LoadSavefile("data/AntagTokens.sav")
 		if (!AT)
-			if( cloud_available() )
-				antag_tokens = cloud_get( "antag_tokens" ) ? text2num(cloud_get( "antag_tokens" )) : 0
+			antag_tokens = src.cloudSaves.getData( "antag_tokens" )
+			antag_tokens = antag_tokens ? text2num(antag_tokens) : 0
 			return
 
 		var/ATtoken
 		AT[ckey] >> ATtoken
 		if (!ATtoken)
-			antag_tokens = cloud_get( "antag_tokens" ) ? text2num(cloud_get( "antag_tokens" )) : 0
+			antag_tokens = src.cloudSaves.getData( "antag_tokens" )
+			antag_tokens = antag_tokens ? text2num(antag_tokens) : 0
 			return
 		else
 			antag_tokens = ATtoken
-		if( cloud_available() )
-			antag_tokens += text2num( cloud_get( "antag_tokens" ) || "0" )
-			var/failed = cloud_put( "antag_tokens", antag_tokens )
-			if( failed )
-				logTheThing(LOG_DEBUG, src, "Failed to store antag tokens in the ~cloud~: [failed]")
-				return FALSE
-			else
-				AT[ckey] << null
+		antag_tokens += text2num( src.cloudSaves.getData( "antag_tokens" ) || "0" )
+		if (src.cloudSaves.putData( "antag_tokens", antag_tokens ))
+			AT[ckey] << null
 
 	/// returns an assoc list of cached player stats (please update this proc when adding more player stat vars)
 	proc/get_round_stats(allow_blocking = FALSE)
@@ -163,9 +185,8 @@
 
 	proc/set_antag_tokens(amt as num)
 		src.antag_tokens = amt
-		if( cloud_available() )
-			cloud_put( "antag_tokens", amt )
-			return TRUE
+		src.cloudSaves.putData( "antag_tokens", amt )
+		. = TRUE
 
 	/// sets the join time to the current server time, in 1/10ths of a second
 	proc/log_join_time()
@@ -184,80 +205,36 @@
 		src.round_leave_time = null //reset this - null value is important
 		src.round_join_time = null //reset this - null value is important
 
-	/// Sets a cloud key value pair and sends it to goonhub
-	proc/cloud_put(key, value)
-		if(!clouddata)
-			return FALSE
-		clouddata[key] = "[value]"
-
-#ifdef LIVE_SERVER
-		// Via rust-g HTTP
-		var/datum/http_request/request = new() //If it fails, oh well...
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?dataput&api_key=[config.spacebee_api_key]&ckey=[ckey]&key=[url_encode(key)]&value=[url_encode(clouddata[key])]", "", "")
-		request.begin_async()
-#else
-		var/json = null
-		var/list/decoded_json
-		if (fexists("data/simulated_cloud.json"))
-			json = file2text("data/simulated_cloud.json")
-			decoded_json = json_decode(json)
+	proc/get_buildmode()
+		RETURN_TYPE(/datum/buildmode_holder)
+		if(src.buildmode)
+			return src.buildmode
+		var/saved_buildmode = src.cloudSaves.getData("buildmode")
+		if(!saved_buildmode)
+			src.buildmode = new /datum/buildmode_holder(src.client)
 		else
-			decoded_json = list()
-
-		decoded_json["[ckey(ckey)]"] = clouddata
-		rustg_file_write(json_encode(decoded_json),"data/simulated_cloud.json")
-#endif
-		return TRUE // I guess
+			var/savefile/save = new
+			save.ImportText("/", saved_buildmode)
+			save.eof = 0
+			try
+				save["buildmode"] >> src.buildmode
+			catch(var/exception/e)
+				stack_trace("loading buildmode error\n[e.name]\n[e.desc]")
+				boutput(src.client, SPAN_INTERNAL("Loading your buildmode failed. Check runtime log for details."))
+				qdel(src.buildmode)
+				src.buildmode = new /datum/buildmode_holder(src.client)
+			if(isnull(src.buildmode))
+				boutput(src.client, SPAN_INTERNAL("Loading your buildmode failed. No clue why."))
+				src.buildmode = new /datum/buildmode_holder(src.client)
+			if(isnull(src.buildmode.owner))
+				src.buildmode.set_client(src.client)
+		return src.buildmode
 
-	/// Sets a cloud key value pair and sends it to goonhub for a target ckey
-	proc/cloud_put_target(target, key, value)
-		var/list/data = cloud_fetch_target_ckey(target)
-		if(!data)
-			return FALSE
-		data[key] = "[value]"
-
-#ifdef LIVE_SERVER
-		// Via rust-g HTTP
-		var/datum/http_request/request = new() //If it fails, oh well...
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?dataput&api_key=[config.spacebee_api_key]&ckey=[ckey(target)]&key=[url_encode(key)]&value=[url_encode(data[key])]", "", "")
-		request.begin_async()
-#else
-		var/json = null
-		var/list/decoded_json
-		if (fexists("data/simulated_cloud.json"))
-			json = file2text("data/simulated_cloud.json")
-			decoded_json = json_decode(json)
-		else
-			decoded_json = list()
-		decoded_json["[ckey(target)]"] = data
-		rustg_file_write(json_encode(decoded_json),"data/simulated_cloud.json")
-#endif
-		return TRUE // I guess
-
-	/// Returns some cloud data on the client
-	proc/cloud_get( var/key )
-		return clouddata ? clouddata[key] : null
-
-	/// Returns some cloud data on the provided target ckey
-	proc/cloud_get_target(target, key)
-		var/list/data = cloud_fetch_target_data_only(target)
-		return data ? data[key] : null
-
-	/// Returns 1 if you can set or retrieve cloud data on the client
-	proc/cloud_available()
-		return !!clouddata
-
-	/// Downloads cloud data from goonhub
-	proc/cloud_fetch()
-		var/list/data = cloud_fetch_target_ckey(src.ckey)
-		if (data)
-#ifdef LIVE_SERVER
-			cloudsaves = data["saves"]
-			clouddata = data["cdata"]
-#else
-			clouddata = data
-#endif
-			return TRUE
+	proc/on_round_end()
+		if(src.buildmode)
+			var/savefile/S = new
+			S["buildmode"] << buildmode
+			src.cloudSaves.putData("buildmode", S.ExportText())
 
 	/// Gives this player a medal. Will not sleep, but does not have a return value. Use unlock_medal_sync if you need to know if it worked
 	proc/unlock_medal(medal_name, announce=FALSE)
@@ -276,6 +253,17 @@
 			return FALSE
 		. = TRUE
 
+		// Record this medal to the Goonhub API for further tracking
+		// This will (eventually) replace the byond medals entirely
+		try
+			var/datum/apiRoute/players/medals/add/addMedal = new
+			addMedal.buildBody(src.id || null, src.ckey, medal_name, roundId)
+			apiHandler.queryAPI(addMedal)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "<b>Medals Error</b>: Error returned in <b>unlock_medal</b> for <b>[medal_name]</b>: [error.message]")
+			logTheThing(LOG_DIARY, null, "Medals Error: Error returned in unlock_medal for [medal_name]: [error.message]", "debug")
+
 		var/list/unlocks = list()
 		for(var/A in rewardDB)
 			var/datum/achievementReward/D = rewardDB[A]
@@ -295,7 +283,19 @@
 	proc/clear_medal(medal_name)
 		if (IsGuestKey(src.ckey) || !config || !config.medal_hub || !config.medal_password)
 			return null
-		return world.ClearMedal(medal_name, src.key, config.medal_hub, config.medal_password)
+		var/success = world.ClearMedal(medal_name, src.key, config.medal_hub, config.medal_password)
+
+		if (success)
+			try
+				var/datum/apiRoute/players/medals/delete/deleteMedal = new
+				deleteMedal.buildBody(src.id || null, src.ckey, medal_name)
+				apiHandler.queryAPI(deleteMedal)
+			catch (var/exception/e)
+				var/datum/apiModel/Error/error = e.name
+				logTheThing(LOG_DEBUG, null, "<b>Medals Error</b>: Error returned in <b>clear_medal</b> for <b>[medal_name]</b>: [error.message]")
+				logTheThing(LOG_DIARY, null, "Medals Error: Error returned in clear_medal for [medal_name]: [error.message]", "debug")
+
+		return success
 
 	/// Checks if this player has a medal. Will sleep, make sure the proc calling this is in a spawn etc
 	proc/has_medal(medal_name)
@@ -313,101 +313,6 @@
 			return
 		. = params2list(.)
 
-	/// Refreshes clouddata
-	proc/cloud_fetch_data_only()
-		var/list/data = cloud_fetch_target_data_only(src.ckey)
-		if (data)
-			clouddata = data
-			return TRUE
-
-	/// returns the clouddata of a target ckey in list form
-	proc/cloud_fetch_target_data_only(target)
-		var/list/data = cloud_fetch_target_ckey(target)
-		if (data)
-			return data["cdata"]
-
-	/// returns the cloudsaves of a target ckey in list form
-	proc/cloud_fetch_target_saves_only(target)
-		var/list/data = cloud_fetch_target_ckey(target)
-		if (data)
-			return data["saves"]
-
-	/// Returns cloud data and saves from goonhub for the target ckey in list form
-	proc/cloud_fetch_target_ckey(target)
-#ifdef LIVE_SERVER
-		if(!cdn) return
-		target = ckey(target)
-		if (!target) return
-
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/cloudsave?list&ckey=[target]&api_key=[config.spacebee_api_key]", "", "")
-		request.begin_async()
-		UNTIL(request.is_complete())
-		var/datum/http_response/response = request.into_response()
-
-		if (response.errored || !response.body)
-			logTheThing(LOG_DEBUG, target, "failed to have their cloud data loaded: Couldn't reach Goonhub")
-			return
-
-		var/list/ret = json_decode(response.body)
-		if(ret["status"] == "error")
-			logTheThing(LOG_DEBUG, target, "failed to have their cloud data loaded: [ret["error"]["error"]]")
-			return
-		else
-			return ret
-#else
-		if (!target) return
-		/// holds our json string
-		var/json
-		/// holds our list made from decoding json
-		var/list/decoded_json
-		// make sure the files actually exists before we try to read it, if it doesn't then just return a blank list to work with
-		if (fexists("data/simulated_cloud.json"))
-			// file was found, lets decode it
-			json = file2text("data/simulated_cloud.json")
-			decoded_json = json_decode(json)
-		else
-			decoded_json = list()
-
-		// do we have an entry for the target ckey?
-		if (decoded_json[target])
-			return decoded_json[target]
-		else
-			// we need to return a list with a list in the cdata index or it causes a deadlock where we can't save
-			return list(cdata = list())
-#endif
-
-	proc/get_buildmode()
-		RETURN_TYPE(/datum/buildmode_holder)
-		if(src.buildmode)
-			return src.buildmode
-		var/saved_buildmode = src.cloud_get("buildmode")
-		if(!saved_buildmode)
-			src.buildmode = new /datum/buildmode_holder(src.client)
-		else
-			var/savefile/save = new
-			save.ImportText("/", saved_buildmode)
-			save.eof = 0
-			try
-				save["buildmode"] >> src.buildmode
-			catch(var/exception/e)
-				stack_trace("loading buildmode error\n[e.name]\n[e.desc]")
-				boutput(src.client, SPAN_INTERNAL("Loading your buildmode failed. Check runtime log for details."))
-				qdel(src.buildmode)
-				src.buildmode = new /datum/buildmode_holder(src.client)
-			if(isnull(src.buildmode))
-				boutput(src.client, SPAN_INTERNAL("Loading your buildmode failed. No clue why."))
-				src.buildmode = new /datum/buildmode_holder(src.client)
-			if(isnull(src.buildmode.owner))
-				src.buildmode.set_client(src.client)
-		return src.buildmode
-
-	proc/on_round_end()
-		if(src.buildmode)
-			var/savefile/S = new
-			S["buildmode"] << buildmode
-			src.cloud_put("buildmode", S.ExportText())
-
 /// returns a reference to a player datum based on the ckey you put into it
 /proc/find_player(key)
 	RETURN_TYPE(/datum/player)
@@ -421,86 +326,3 @@
 	if (!player)
 		player = new(key)
 	return player
-
-/** Bulk cloud save for saving many key value pairs and/or many ckeys in a single api call
- * example input (formatted for readability)
- *  command add adds a number onto the current value (record must exist in the cloud to update or it won't do anything)
- *  command replace overwrites the existing record
- * 	{
- * 		"some_ckey":{
- * 			"persistent_bank":{
- * 				"command":"add",
- * 				"value":42069
- * 			},
- * 			"persistent_bank_item":{
- * 				"command":"replace",
- * 				"value":"none"
- * 			}
- * 		},
- * 		"some_other_ckey":{
- * 			"persistent_bank":{
- * 				"command":"add",
- * 				"value":1337
- * 			},
- * 			"persistent_bank_item":{
- * 				"command":"replace",
- * 				"value":"rubber_ducky"
- * 			}
- * 		}
- * 	}
-**/
-proc/cloud_put_bulk(json)
-	if (!rustg_json_is_valid(json))
-		stack_trace("cloud_put_bulk received an invalid json object.")
-		return FALSE
-	var/list/decoded_json = json_decode(json)
-	var/list/sanitized = list()
-	for (var/json_ckey in decoded_json)
-		var/clean_ckey = ckey(json_ckey)
-		if (!length(decoded_json[json_ckey]))
-			stack_trace("cloud_put_bulk received ckey \"[clean_ckey]\" without any key pairs to save.")
-			continue
-		sanitized[clean_ckey] = list()
-		for (var/json_key in decoded_json[json_ckey])
-			var/value = decoded_json[json_ckey][json_key]["value"]
-			if (isnull(value))
-				value = "" //api wants empty strings, not nulls
-			sanitized[clean_ckey][json_key] = list ("command" = decoded_json[json_ckey][json_key]["command"], "value" = value)
-#ifdef LIVE_SERVER
-	var/sanitized_json = json_encode(sanitized)
-	// Via rust-g HTTP
-	var/datum/http_request/request = new()
-	var/list/headers = list(
-		"Authorization" = "[config.spacebee_api_key]",
-		"Content-Type" = "application/json",
-		"Command" = "dataput_bulk"
-	)
-	request.prepare(RUSTG_HTTP_METHOD_POST, "[config.spacebee_api_url]/api/cloudsave", sanitized_json, headers)
-	request.begin_async()
-#else
-	var/save_json
-	var/list/decoded_save
-	if (fexists("data/simulated_cloud.json"))
-		save_json = file2text("data/simulated_cloud.json")
-		decoded_save = json_decode(save_json)
-	else
-		decoded_save = list()
-
-	for (var/sani_ckey in sanitized)
-		if (!decoded_save[sani_ckey])
-			decoded_save[sani_ckey] = list(cdata = list())
-		for (var/data_key in sanitized[sani_ckey])
-			var/value = sanitized[sani_ckey][data_key]["value"]
-			var/command = sanitized[sani_ckey][data_key]["command"]
-			switch(command)
-				if("add")
-					if (data_key in decoded_save[sani_ckey])
-						decoded_save[sani_ckey][data_key] = "[text2num(decoded_save[sani_ckey][data_key]) + value]"
-					else
-						decoded_save[sani_ckey][data_key] = "[value]"
-				if("replace")
-					decoded_save[sani_ckey][data_key] = "[value]"
-
-	rustg_file_write(json_encode(decoded_save),"data/simulated_cloud.json")
-#endif
-	return TRUE
diff --git a/code/procs/accents.dm b/code/procs/accents.dm
index 0254384561097..d443fce90eef3 100644
--- a/code/procs/accents.dm
+++ b/code/procs/accents.dm
@@ -2602,3 +2602,14 @@ proc/leetspeakify(string, chance=100)
 			letter = leetspeak_translation[lowertext(letter)]
 		letters += letter
 	return jointext(letters, "")
+
+/proc/bingus_parse(var/string)
+	var/bingus_list = list(
+		@{"\bbingus\b"} = "bingus my beloved",
+		@{"\bantag\b"} = "floppa",
+		@{"\bantagonist\b"} = "big floppa",
+		@{"\bI love [a-zA-Z]+"} = "I love bingus"
+	)
+	for (var/pattern in bingus_list)
+		string = replacetext(string, regex(pattern, "i"), bingus_list[pattern])
+	return string
diff --git a/code/procs/authorize.dm b/code/procs/authorize.dm
deleted file mode 100644
index 3534624b2cdcf..0000000000000
--- a/code/procs/authorize.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/client/proc/set_mentorhelp_visibility(var/set_as = null)
-	if (!isnull(set_as))
-		player.see_mentor_pms = set_as
-	else
-		player.see_mentor_pms = !player.see_mentor_pms
-	boutput(src, "<span class='ooc mentorooc'>You will [player.see_mentor_pms ? "now" : "no longer"] see Mentorhelps [player.see_mentor_pms ? "and" : "or"] show up as a Mentor.</span>")
-
-/client/proc/toggle_mentorhelps()
-	set name = "Toggle Mentorhelps"
-	set category = "Commands"
-	set desc = "Show or hide mentorhelp messages. You will also no longer show up as a mentor in OOC and via the Who command if you disable mentorhelps."
-
-	if (!src.is_mentor() && !src.holder)
-		boutput(src, SPAN_ALERT("Only mentors may use this command."))
-		src.verbs -= /client/proc/toggle_mentorhelps // maybe?
-		return
-
-	src.set_mentorhelp_visibility()
diff --git a/code/procs/computer_id.dm b/code/procs/computer_id.dm
index a6ca61681eadb..243474a7b6138 100644
--- a/code/procs/computer_id.dm
+++ b/code/procs/computer_id.dm
@@ -134,14 +134,15 @@ proc/do_computerid_test(var/client/C)
 	logTheThing(LOG_DIARY, C, msg, "admin")
 	if(is_fucker)
 		//message_admins("[key_name(C)] was automatically banned for using the CID DLL.")
-		var/banData[] = new()
-		banData["ckey"] = C.ckey
-		banData["compID"] = C.computer_id
-		banData["akey"] = "Auto Banner"
-		banData["ip"] = C.address
-		banData["reason"] = "Using a modified dreamseeker client."
-		banData["mins"] = 0
-		addBan(banData)
+		bansHandler.add(
+			"bot",
+			null,
+			C.ckey,
+			C.computer_id,
+			C.address,
+			"Using a modified dreamseeker client.",
+			FALSE
+		)
 
 
 proc/view_client_compid_list(mob/user, var/C)
diff --git a/code/procs/datetime.dm b/code/procs/datetime.dm
index 8704fca41e7f9..e256a16ec7185 100644
--- a/code/procs/datetime.dm
+++ b/code/procs/datetime.dm
@@ -50,3 +50,42 @@ proc/addTime(timeInByondFormat, years=0, months=0, days=0, hours=0, minutes=0, s
 /// Subtract time from a given BYOND time format
 proc/subtractTime(timeInByondFormat, years=0, months=0, days=0, hours=0, minutes=0, seconds=0)
 	return addTime(timeInByondFormat, -years, -months, -days, -hours, -minutes, -seconds)
+
+/// Validate ISO 8601 format
+proc/validateIso8601(iso8601)
+	var/regex/iso8601Pattern = new(@/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/)
+
+	if(!iso8601Pattern.Find(iso8601))
+		return FALSE // Does not match the pattern
+
+	// Extract components
+	var/list/datetimeParts = splittext(iso8601, "T")
+	var/date = datetimeParts[1]
+	var/time = splittext(datetimeParts[2], "Z")[1]
+
+	var/list/dateParts = splittext(date, "-")
+	var/year = text2num(dateParts[1])
+	var/month = text2num(dateParts[2])
+	var/day = text2num(dateParts[3])
+
+	// Validate year, month, and day
+	if(year < 1 || month < 1 || month > 12 || day < 1 || day > 31)
+		return FALSE
+
+	var/list/timeParts = splittext(time, ":")
+	var/hour = text2num(timeParts[1])
+	var/minute = text2num(timeParts[2])
+	var/second = text2num(timeParts[3])
+
+	// Validate hour, minute, and second
+	if(hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59)
+		return FALSE
+
+	// Additional validation for day of month
+	var/list/monthDays = list(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
+	if(isLeapYear(year))
+		monthDays[2] = 29
+	if(day > monthDays[month])
+		return FALSE
+
+	return TRUE
diff --git a/code/procs/export_data.dm b/code/procs/export_data.dm
deleted file mode 100644
index f91ebb7d85fa7..0000000000000
--- a/code/procs/export_data.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-///// FOR EXPORTING DATA TO A SERVER /////
-
-// Called in world.dm at new()
-/proc/round_start_data()
-
-	var/message[] = new()
-	message["token"] = md5(config.goonhub_parser_key)
-	message["round_name"] = url_encode(station_name())
-	message["round_server"]  = config.server_id
-	message["round_server_number"] = "[serverKey]"
-	message["round_status"] = "start"
-
-	// Send data
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "[config.goonhub_parser_url][list2params(message)]", "", "")
-	request.begin_async()
-
-// Called in gameticker.dm at the end of the round.
-/proc/round_end_data(var/reason)
-
-	var/message[] = new()
-	message["token"] = md5(config.goonhub_parser_key)
-	message["round_name"] = url_encode(station_name())
-	message["round_server"]  = config.server_id
-	message["round_server_number"] = "[serverKey]"
-	message["round_status"] = "end"
-	message["end_reason"] = reason
-	message["game_type"] = ticker?.mode ? ticker.mode.name : "pre"
-
-	// Send data
-	var/datum/http_request/request = new()
-	request.prepare(RUSTG_HTTP_METHOD_GET, "[config.goonhub_parser_url][list2params(message)]", "", "")
-	request.begin_async()
diff --git a/code/procs/helpers.dm b/code/procs/helpers.dm
index cddb67926ab8a..66e0659d7d104 100644
--- a/code/procs/helpers.dm
+++ b/code/procs/helpers.dm
@@ -24,12 +24,6 @@
 		test = copytext(test, 1, 2)
 	return test == uppertext(test)
 
-/**
-  * Shows the calling client admins.txt
-  */
-/proc/showadminlist()
-	usr.client.Export("##action=browse_file","config/admins.txt")
-
 /**
   * Returns the line matrix from a start atom to an end atom, used in creating line objects
   */
@@ -184,10 +178,8 @@ proc/castRay(var/atom/A, var/Angle, var/Distance) //Adapted from some forum stuf
 			if(!(T in crossed)) crossed.Add(T)
 	return crossed
 
-/**
-	* Returns the angle between two given atoms
-	*/
-proc/get_angle(atom/a, atom/b)
+/// Returns the angle between two given atoms
+/proc/get_angle(atom/a, atom/b)
 	var/turf/a_turf = get_turf(a)
 	var/turf/b_turf = get_turf(b)
 	if (isnull(a_turf) || isnull(b_turf))
@@ -997,24 +989,15 @@ proc/get_adjacent_floor(atom/W, mob/user, px, py)
 // <3 Fire
 // I'm preserving the above comment block, let it be known this proc used to use the variables "n", "pr", "te", "t", "p." I have fixed them. You're welcome.
 // <3 FlamingLily
-/proc/stars(input_text, probability)
-	if(probability == null)
-		probability = 25
-	if(probability <= 0)
-		return null
-	else
-		if (probability >= 100)
-			return input_text
-	var/output_text = ""
-	var/input_length = length(input_text)
-	var/cycle = 1
-	while(cycle <= input_length)
-		if ((copytext(input_text, cycle, cycle + 1) == " " || prob(probability)))
-			output_text = text("[][]", output_text, copytext(input_text, cycle, cycle + 1))
-		else
-			output_text = text("[]*", output_text)
-		cycle++
-	return output_text
+/proc/stars(phrase, probability = 25)
+	if(length(phrase) == 0)
+		return
+	var/list/chars = splittext_char(html_decode(phrase), "")
+	for(var/i in 1 to length(chars))
+		if(chars[i] == " " || !prob(probability))
+			continue
+		chars[i] = "*"
+	return sanitize(jointext(chars, ""))
 
 /proc/stutter(n)
 	var/te = html_decode(n)
@@ -1059,12 +1042,6 @@ proc/get_adjacent_floor(atom/W, mob/user, px, py)
 			client.pixel_y = 0
 			M.shakecamera = 0
 
-/proc/findname(msg)
-	for(var/mob/M in mobs)
-		if (M.real_name == text("[msg]"))
-			return 1
-	return 0
-
 /proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
 	//returns only NORTH, SOUTH, EAST, or WEST
 	var/dx = finish.x - start.x
@@ -1354,34 +1331,34 @@ proc/outermost_movable(atom/movable/target)
 	. = text2path(stringtarget)
 
 /proc/GetRedPart(hex)
-    hex = uppertext(hex)
-    var/hi = text2ascii(hex, 2)
-    var/lo = text2ascii(hex, 3)
-    return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
+	hex = uppertext(hex)
+	var/hi = text2ascii(hex, 2)
+	var/lo = text2ascii(hex, 3)
+	return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
 
 /proc/GetGreenPart(hex)
-    hex = uppertext(hex)
-    var/hi = text2ascii(hex, 4)
-    var/lo = text2ascii(hex, 5)
-    return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
+	hex = uppertext(hex)
+	var/hi = text2ascii(hex, 4)
+	var/lo = text2ascii(hex, 5)
+	return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
 
 /proc/GetBluePart(hex)
-    hex = uppertext(hex)
-    var/hi = text2ascii(hex, 6)
-    var/lo = text2ascii(hex, 7)
-    return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
+	hex = uppertext(hex)
+	var/hi = text2ascii(hex, 6)
+	var/lo = text2ascii(hex, 7)
+	return ( ((hi >= 65 ? hi-55 : hi-48)<<4) | (lo >= 65 ? lo-55 : lo-48) )
 
 /proc/GetColors(hex)
-    hex = uppertext(hex)
-    var/hi1 = text2ascii(hex, 2)
-    var/lo1 = text2ascii(hex, 3)
-    var/hi2 = text2ascii(hex, 4)
-    var/lo2 = text2ascii(hex, 5)
-    var/hi3 = text2ascii(hex, 6)
-    var/lo3 = text2ascii(hex, 7)
-    return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48),
-        ((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48),
-        ((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48))
+	hex = uppertext(hex)
+	var/hi1 = text2ascii(hex, 2)
+	var/lo1 = text2ascii(hex, 3)
+	var/hi2 = text2ascii(hex, 4)
+	var/lo2 = text2ascii(hex, 5)
+	var/hi3 = text2ascii(hex, 6)
+	var/lo3 = text2ascii(hex, 7)
+	return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48),
+		((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48),
+		((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48))
 
 //Shoves a jump to link or whatever in the thing :effort:
 /proc/showCoords(x, y, z, plaintext, holder, ghostjump)
@@ -2046,23 +2023,22 @@ proc/countJob(rank)
 var/global/nextDectalkDelay = 1 //seconds
 var/global/lastDectalkUse = 0
 /proc/dectalk(msg)
-	if (!msg || !config.spacebee_api_key) return 0
+	if (!msg) return 0
 	if (TIME > (lastDectalkUse + (nextDectalkDelay * 10)))
 		lastDectalkUse = TIME
 		msg = copytext(msg, 1, 2000)
 
-		// Fetch via HTTP from goonhub
-		var/datum/http_request/request = new()
-		request.prepare(RUSTG_HTTP_METHOD_GET, "[config.spacebee_api_url]/api/tts?dectalk=[url_encode(msg)]&api_key=[config.spacebee_api_key]", "", "")
-		request.begin_async()
-		UNTIL(request.is_complete())
-		var/datum/http_response/response = request.into_response()
-
-		if (response.errored || !response.body)
-			logTheThing(LOG_DEBUG, null, "<b>dectalk:</b> Failed to contact goonhub. msg : [msg]")
+		var/datum/apiModel/DectalkPlayResource/playDectalkResource
+		try
+			var/datum/apiRoute/dectalk/play/playDectalk = new
+			playDectalk.buildBody(msg, roundId)
+			playDectalkResource = apiHandler.queryAPI(playDectalk)
+		catch (var/exception/e)
+			var/datum/apiModel/Error/error = e.name
+			logTheThing(LOG_DEBUG, null, "<b>dectalk:</b> Failed to play dectalk for msg: '[msg]' because: [error.message]")
 			return
 
-		return list("audio" = response.body, "message" = msg)
+		return list("audio" = playDectalkResource.audio, "message" = msg)
 	else
 		return list("cooldown" = 1)
 
@@ -2263,39 +2239,37 @@ proc/copy_datum_vars(var/atom/from, var/atom/target, list/blacklist)
 
 	return FALSE
 
-/**
-  * Returns span with a color gradient between two given colors of given message
-  */
+/// Returns span with a color gradient between two given colors of given message
 proc/gradientText(var/color1, var/color2, message)
-  var/color1hex = hex2num(copytext(color1, 2))
-  var/color2hex = hex2num(copytext(color2, 2))
-  var/r1 = (color1hex >> 16) & 0xFF
-  var/g1 = (color1hex >> 8) & 0xFF
-  var/b1 = color1hex & 0xFF
-  var/dr = ((color2hex >> 16) & 0xFF)- r1
-  var/dg = ((color2hex >> 8) & 0xFF) - g1
-  var/db = (color2hex & 0xFF) - b1
-  var/list/result = new/list()
-  var/n = rand(0,10)/10.0 // what a shitty name for a variable
-  var/dir = prob(50) ? -1 : 1
-  for(var/i=1, i<=length(message), i += 3)
-    n += dir * 0.2
-    if(prob(20))
-      dir = dir/abs(dir) * -1
-    if(n < 0)
-      n = 0
-      dir = 1
-    if(n > 1)
-      n = 1
-      dir = -1
-    var/col = rgb(r1 + dr*n, g1 + dg*n, b1 + db*n)
-    var/chars = copytext(message, i, i+3)
-    result += "<span style='color:[col]'>[chars]</span>"
-  . = result.Join()
+	var/color1hex = hex2num(copytext(color1, 2))
+	var/color2hex = hex2num(copytext(color2, 2))
+	var/r1 = (color1hex >> 16) & 0xFF
+	var/g1 = (color1hex >> 8) & 0xFF
+	var/b1 = color1hex & 0xFF
+	var/dr = ((color2hex >> 16) & 0xFF)- r1
+	var/dg = ((color2hex >> 8) & 0xFF) - g1
+	var/db = (color2hex & 0xFF) - b1
+	var/list/result = new/list()
+	var/n = rand(0,10)/10.0 // what a shitty name for a variable
+	var/dir = prob(50) ? -1 : 1
+	for(var/i=1, i<=length(message), i += 3)
+		n += dir * 0.2
+		if(prob(20))
+			dir = dir/abs(dir) * -1
+		if(n < 0)
+			n = 0
+			dir = 1
+		if(n > 1)
+			n = 1
+			dir = -1
+		var/col = rgb(r1 + dr*n, g1 + dg*n, b1 + db*n)
+		var/chars = copytext(message, i, i+3)
+		result += "<span style='color:[col]'>[chars]</span>"
+	. = result.Join()
 
 /**
-  * Returns given text replaced by nonsense chars, excepting HTML tags, on a 40% or given % basis
-  */
+ * Returns given text replaced by nonsense chars, excepting HTML tags, on a 40% or given % basis
+ */
 proc/radioGarbleText(var/message, var/per_letter_corruption_chance=40)
 	var/split_html_text = splittext(message,  regex("<\[^>\]*>"), 1, length(message), TRUE) //I'd love to just use include_delimiters=TRUE, but byond
 	var/list/corruptedChars = list("@","#","!",",",".","-","=","/","\\","'","\"","`","*","(",")","[","]","_","&")
@@ -2314,23 +2288,18 @@ proc/radioGarbleText(var/message, var/per_letter_corruption_chance=40)
 	return jointext(.,"")
 
 
-/**
-  * Returns given text replaced entirely by nonsense chars
-  */
+/// Returns given text replaced entirely by nonsense chars
 proc/illiterateGarbleText(var/message)
 	. = radioGarbleText(message, 100)
 
-/**
-  * Returns the time in seconds since a given timestamp
-  */
+
+/// Returns the time in seconds since a given timestamp
 proc/getTimeInSecondsSinceTime(var/timestamp)
 	var/time_of_day = world.timeofday + ((world.timeofday < timestamp) ? 864000 : 0) // Offset the time of day in case of midnight rollover
 	var/time_elapsed = (time_of_day - timestamp)/10
 	return time_elapsed
 
-/**
-  * Handles the two states icon_size can be in: basic number, or string in WxH format
-  */
+/// Handles the two states icon_size can be in: basic number, or string in WxH format
 proc/getIconSize()
 	if (istext(world.icon_size))
 		var/list/iconSizes = splittext(world.icon_size, "x")
@@ -2338,18 +2307,14 @@ proc/getIconSize()
 
 	return world.icon_size
 
-/**
-  * Finds a client by ckey, throws exception if not found
-  */
+/// Finds a client by ckey, throws exception if not found
 proc/getClientFromCkey(ckey)
 	var/datum/player/player = find_player(ckey)
 	if(!player?.client)
 		throw EXCEPTION("Client not found")
 	return player.client
 
-/**
-	* Returns true if the given atom is within src's contents (deeply/recursively)
-	*/
+/// Returns true if the given atom is within src's contents (deeply/recursively)
 /atom/proc/contains(var/atom/A)
 	. = FALSE
 	if(!A)
@@ -2424,9 +2389,7 @@ proc/check_whitelist(var/atom/TA, var/list/whitelist, var/mob/user as mob, var/c
 
 	return (seer.dir == dir)
 
-/**
-	* Returns the passed decisecond-format time in the form of a text string
-	*/
+/// Returns the passed decisecond-format time in the form of a text string
 proc/time_to_text(var/time)
 	. = list()
 
@@ -2632,3 +2595,9 @@ proc/message_ghosts(var/message, show_wraith = FALSE)
 		// Otherwise, output to ghosts
 		if (isdead(M) || iswraith(M) || isghostdrone(M) || isVRghost(M) || inafterlifebar(M) || istype(M, /mob/living/intangible/seanceghost))
 			boutput(M, rendered)
+
+/// Find a client based on ckey
+/proc/find_client(ckey)
+	for (var/client/C in clients)
+		if (C == ckey)
+			return C
diff --git a/code/procs/jobprocs.dm b/code/procs/jobprocs.dm
index f38dde289dd1b..ac1ddac331d1b 100644
--- a/code/procs/jobprocs.dm
+++ b/code/procs/jobprocs.dm
@@ -423,7 +423,6 @@ var/global/totally_random_jobs = FALSE
 
 //hey i changed this from a /human/proc to a /living/proc so that critters (from the job creator) would latejoin properly	-- MBC
 /mob/living/proc/Equip_Rank(rank, joined_late, no_special_spawn)
-	SHOULD_NOT_SLEEP(TRUE)
 	var/datum/job/JOB = find_job_in_controller_by_string(rank)
 	if (!JOB)
 		boutput(src, SPAN_ALERT("<b>Something went wrong setting up your rank and equipment! Report this to a coder.</b>"))
diff --git a/code/procs/mobprocs/chatprocs.dm b/code/procs/mobprocs/chatprocs.dm
index 3b01fe6f8987d..7044c157961eb 100644
--- a/code/procs/mobprocs/chatprocs.dm
+++ b/code/procs/mobprocs/chatprocs.dm
@@ -666,7 +666,7 @@
 			ooc_class = "newbeeooc"
 			ooc_icon = "Newbee"
 
-		if( src.client.cloud_available() && src.client.cloud_get("donor") )
+		if (src.client.player.cloudSaves.getData("donor") )
 			msg = replacetext(msg, ":shelterfrog:", "<img src='http://stuff.goonhub.com/shelterfrog.png' width=32>")
 
 		if (src.client.has_contestwinner_medal)
diff --git a/code/procs/stat_logging.dm b/code/procs/stat_logging.dm
deleted file mode 100644
index 4e96a913b5fe3..0000000000000
--- a/code/procs/stat_logging.dm
+++ /dev/null
@@ -1,287 +0,0 @@
-/////////FOR LOGGING TO STATS FILE/////////
-
-//Called in tickets New() in datacore.dm
-/proc/statlog_ticket(var/datum/ticket/T, var/mob/living/M)
-	var/message[] = new()
-	message["data_type"] = "tickets"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-	message["target"] = T.target
-	message["reason"] = T.reason
-	message["issuer"] = M.real_name
-	message["issuer_job"] = M.job
-	message["target_byond_key"] = T.target_byond_key
-	message["issuer_byond_key"] = M.key
-
-	hublog << list2params(message)
-
-//Called in fines New() in datacore.dm
-/proc/statlog_fine(var/datum/fine/F, var/mob/living/M)
-	var/message[] = new()
-	message["data_type"] = "fines"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-	message["byond_uid"] = F.ID
-
-	message["target"] = F.target
-	message["reason"] = F.reason
-	message["issuer"] = M.real_name
-	message["issuer_job"] = M.job
-	message["amount"] = F.amount
-	message["target_byond_key"] = F.target_byond_key
-	message["issuer_byond_key"] = M.key
-
-	hublog << list2params(message)
-
-//Called in crittergauntlet.dm
-/proc/statlog_gauntlet(var/mobs, var/final_score, var/last_completed_wave)
-	if (final_score == 0 && last_completed_wave < 2)
-		return
-	var/message[] = new()
-	message["data_type"] = "gauntlet_high_scores"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-	message["names"] = mobs
-	message["score"] = final_score
-	message["highest_wave"] = last_completed_wave
-
-	hublog << list2params(message)
-
-//Called in living death() in living.dm
-/proc/statlog_death(var/mob/living/M,var/gibbed)
-	var/message[] = new()
-	message["data_type"] = "deaths"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-	message["mob_name"] = M.real_name
-	message["mob_job"] = M.job
-	message["mob_byond_key"] = M.key
-	var/atom/T = get_turf(M)
-	if (!T) T = M
-	message["x"] = T.x
-	message["y"] = T.y
-	message["z"] = T.z
-	message["bruteloss"] = M.get_brute_damage()
-	message["fireloss"] = M.get_burn_damage()
-	message["toxloss"] = M.get_toxin_damage()
-	message["oxyloss"] = M.get_oxygen_deprivation()
-	message["gibbed"] = gibbed ? 1 : 0
-	message["last_words"] = M.last_words
-
-	hublog << list2params(message)
-
-//Called in syndicate and integrated Topic() in uplinks.dm
-/proc/statlog_traitor_item(var/mob/living/M, var/itemIdentifier, var/cost)
-	if (!istype(M))
-		return 1
-
-	var/message[] = new()
-	message["data_type"] = "traitor_items"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-	message["mob_name"] = M.real_name
-	message["mob_job"] = M.job
-	message["mob_byond_key"] = M.key
-	var/atom/T = get_turf(M)
-	if (!T) T = M
-	message["x"] = T.x
-	message["y"] = T.y
-	message["z"] = T.z
-	message["item"] = itemIdentifier ? itemIdentifier : "???"
-	message["cost"] = isnum(cost) ? "[cost]" : "0"
-
-	hublog << list2params(message)
-
-//Called in gameticker.dm in proc/declare_completion
-/proc/statlog_traitors()
-	for (var/datum/antagonist/antagonist_role as anything in get_all_antagonists())
-		var/datum/mind/M = antagonist_role.owner
-		var/message[] = new()
-		message["data_type"] = "traitors"
-		message["data_status"] = "insert"
-		message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-		message["mob_name"] = M.current.real_name
-		message["mob_job"] = M.current.job
-		message["mob_byond_key"] = M.key
-
-		if (M.objectives)
-			var/overallSuccess = 1
-			var/count = 1
-			for(var/datum/objective/objective in M.objectives)
-#ifdef CREW_OBJECTIVES
-				if (istype(objective, /datum/objective/crew)) continue
-#endif
-				message["objective[count]"] = objective.explanation_text
-				if(objective.check_completion())
-					message["success[count]"] = 1
-				else
-					message["success[count]"] = 0
-					overallSuccess = 0
-				count++
-
-			message["success"] = overallSuccess
-			message["objective_count"] = count - 1
-
-		var/traitor_type = M.special_role
-		message["traitor_type"] = traitor_type
-		var/special
-		switch(traitor_type)
-			if (ROLE_CHANGELING)
-				if (M.current)
-					var/datum/abilityHolder/changeling/C = M.current.get_ability_holder(/datum/abilityHolder/changeling)
-					if (C && istype(C))
-						special = C.absorbtions
-			if (ROLE_VAMPIRE)
-				if (M.current)
-					special = M.current.get_vampire_blood(1)
-			if (ROLE_WIZARD)
-				if (M.current)
-					var/datum/abilityHolder/wizard/W = M.current.get_ability_holder(/datum/abilityHolder/wizard)
-					if (W && istype(W))
-						var/spells = ""
-						for (var/datum/targetable/spell/S in W.abilities)
-							if (spells != "")
-								spells += ", "
-							spells += S.name
-			if (ROLE_WEREWOLF)
-				for (var/datum/objective/specialist/werewolf/feed/O in M.objectives)
-					if (O && istype(O, /datum/objective/specialist/werewolf/feed/))
-						special = length(O.mobs_fed_on)
-			if (ROLE_VAMPTHRALL, ROLE_MINDHACK)
-				var/datum/mind/master = M.get_master(traitor_type)
-				if (master?.current)
-					special = master.current.real_name
-			if (ROLE_FLOCKMIND)
-				var/relay_successful = FALSE
-				if (isflockmob(M.current))
-					if (!istype(M.current, /mob/living/critter/flock/drone))
-						var/mob/living/intangible/flock/flockmind/flockmind = M.current
-						relay_successful = flockmind.flock.relay_finished
-					else
-						var/mob/living/critter/flock/drone/flockdrone = M.current
-						relay_successful = flockdrone.flock.relay_finished
-				special = "Relay transmission [relay_successful ? "successful" : "unsuccessful"]"
-			if (ROLE_FLOCKTRACE)
-				if (isflockmob(M.current))
-					var/datum/flock/flock_joined = null
-					if (!istype(M.current, /mob/living/critter/flock/drone))
-						var/mob/living/intangible/flock/trace/flocktrace = M.current
-						flock_joined = flocktrace.flock
-					else
-						var/mob/living/critter/flock/drone/flockdrone = M.current
-						flock_joined = flockdrone.flock
-					special = "Part of Flock [flock_joined.name]"
-			if (ROLE_NUKEOP, ROLE_NUKEOP_COMMANDER)
-				if (istype(ticker.mode, /datum/game_mode/nuclear))
-					special = syndicate_name()
-					if (ticker.mode:nuke_detonated)
-						message["success"] = 1
-			if (ROLE_SPY_THIEF)
-				special = "Bounties claimed: "
-				var/datum/antagonist/spy_thief/antag_role = M.get_antagonist(ROLE_SPY_THIEF)
-				for(var/stolen_item in antag_role.stolen_items)
-					if (stolen_item)
-						special += stolen_item
-
-		message["special"] = special
-
-		if (M.late_special_role)
-			message["late_joiner"] = 1
-		/*else if (M.random_event_special_role)
-			message["random_event"] = 1*/
-		else
-			message["late_joiner"] = 0
-			//message["random_event"] = 0
-
-		hublog << list2params(message)
-
-//BEES
-/proc/statlog_bees(var/obj/critter/domestic_bee/B)
-	var/message[] = new()
-	message["data_type"] = "bees"
-	message["data_status"] = "insert"
-	message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-	message["name"] = B.name
-
-	if(B.beeMom)
-		message["mom"] = B.beeMom.real_name
-
-	hublog << list2params(message)
-
-//Called in gameticker.dm at proc/declare_completion, ai_laws.dm at set_zeroth_law and add_supplied_law
-/proc/statlog_ailaws(var/during, var/law, adder)
-
-
-	//For individual laws
-	if (during)
-		var/message[] = new()
-		message["data_type"] = "ai_laws"
-		message["data_status"] = "insert"
-		message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-		if (ismob(adder))
-			var/mob/M = adder
-			message["uploader_name"] = M.real_name
-			message["uploader_key"] = M.key
-			message["uploader_job"] = M.job
-		else
-			message["uploader_name"] = "Ion Storm"
-			message["uploader_key"] = "Random Event"
-			message["uploader_job"] = ""
-
-		message["type"] = "during"
-		message["law_text"] = html_decode(law)
-
-		hublog << list2params(message)
-		return 1
-	//For end of round laws
-	else
-		for_by_tcl(aiPlayer, /mob/living/silicon/ai)
-			var/laws[] = new()
-			if(aiPlayer.law_rack_connection)
-				laws = aiPlayer.law_rack_connection.format_for_irc()
-
-			for (var/key in laws)
-				var/message[] = new()
-				message["data_type"] = "ai_laws"
-				message["data_status"] = "insert"
-				message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-				message["ai_name"] = aiPlayer.real_name
-				message["ai_key"] = aiPlayer.key
-				message["type"] = "end"
-				message["law_number"] = key
-				message["law_text"] = html_decode(laws[key])
-
-				hublog << list2params(message)
-
-		return 1
-
-#ifdef HALLOWEEN
-/proc/statlog_spookpoints()//(/datum/spooktober_ghost_handler/SGH)
-	var/groupedPoints[] = new()
-
-	for (var/i in spooktober_GH.earned_points)
-		if (!groupedPoints[i]) groupedPoints[i] = list("earned" = 0, "spent" = 0)
-		groupedPoints[i]["earned"] = spooktober_GH.earned_points[i]
-	for (var/i in spooktober_GH.spent_points)
-		if (!groupedPoints[i]) groupedPoints[i] = list("earned" = 0, "spent" = 0)
-		groupedPoints[i]["spent"] = spooktober_GH.spent_points[i]
-
-	for (var/ckey in groupedPoints)
-		var/message[] = new()
-		message["data_type"] = "ghostpoints"
-		message["data_status"] = "insert"
-		message["data_timestamp"] = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
-
-		message["ckey"] = ckey
-		message["earned"] = groupedPoints[ckey]["earned"]
-		message["spent"] = groupedPoints[ckey]["spent"]
-
-		hublog << list2params(message)
-#endif
diff --git a/code/procs/station_name.dm b/code/procs/station_name.dm
index b3e89ff7294e6..68cc73fb11931 100644
--- a/code/procs/station_name.dm
+++ b/code/procs/station_name.dm
@@ -20,8 +20,8 @@ var/global/station_name_changing = 1 //Are people allowed to change the station
 var/global/station_or_ship = null
 var/global/station_name = null
 var/global/the_station_name = null
-var/global/list/station_name_whitelist = new()
-var/global/list/station_name_whitelist_sectioned = new()
+var/global/list/station_name_whitelist = list()
+var/global/list/station_name_whitelist_sectioned = list()
 
 var/global/stationNameChangeDelay = 1 MINUTE //deciseconds. 600 = 60 seconds
 var/global/lastStationNameChange = 0 //timestamp
@@ -224,6 +224,9 @@ var/global/lastStationNameChange = 0 //timestamp
 			else
 				the_station_name = name
 
+	var/datum/eventRecord/StationName/stationNameEvent = new()
+	stationNameEvent.send(name)
+
 	station_name = name
 
 	var/extra = null
diff --git a/code/turf/floors.dm b/code/turf/floors.dm
index 9565f58be94f1..05bc87896bbab 100644
--- a/code/turf/floors.dm
+++ b/code/turf/floors.dm
@@ -25,6 +25,9 @@
 	var/tmp/roundstart_dir
 	/// if this turf is immune to explosion (explosion immune turfs immediately return on ex_act())
 	var/explosion_immune = FALSE
+	///Things that are hidden "in" this turf that are revealed when it is pried up.
+	///Kept in a hidden object on the turf so that `get_turf` works as normal. Yes this is crime, fight me I have a possum.
+	var/obj/effects/hidden_contents_holder/hidden_contents = null
 
 	New()
 		..()
@@ -1897,6 +1900,16 @@ DEFINE_FLOORS(solidcolor/black/fullbright,
 	to_plating()
 	playsound(src, 'sound/items/Crowbar.ogg', 80, TRUE)
 
+/turf/simulated/floor/levelupdate()
+	..()
+	if (!src.intact && src.hidden_contents)
+		for(var/atom/movable/AM as anything in src.hidden_contents)
+			AM.set_loc(src)
+			SEND_SIGNAL(AM, COMSIG_MOVABLE_FLOOR_REVEALED, src)
+		qdel(src.hidden_contents) //it's an obj, see the definition for crime justification
+		src.hidden_contents = null
+
+
 /turf/simulated/floor/attackby(obj/item/C, mob/user, params)
 
 	if (!C || !user)
@@ -2108,6 +2121,11 @@ DEFINE_FLOORS(solidcolor/black/fullbright,
 	ReplaceWithFloor()
 	src.to_plating()
 
+/turf/simulated/floor/proc/hide_inside(atom/movable/AM)
+	if (!src.hidden_contents)
+		src.hidden_contents = new(src)
+	AM.set_loc(src.hidden_contents)
+
 /turf/simulated/floor/MouseDrop_T(atom/A, mob/user as mob)
 	..(A,user)
 	if(istype(A,/turf/simulated/floor))
@@ -2119,6 +2137,36 @@ DEFINE_FLOORS(solidcolor/black/fullbright,
 				if(BOUNDS_DIST(user,F) == 0 && BOUNDS_DIST(user,src) == 0)
 					C.move_callback(user, F, 0, src)
 
+/turf/simulated/floor/ReplaceWith(what, keep_old_material, handle_air, handle_dir, force)
+	var/obj/effects/hidden_contents_holder/old_hidden_contents = src.hidden_contents //we have to do this because src will be the new turf after the replace due to byond
+	var/turf/simulated/floor/newfloor = ..()
+	if (istype(newfloor))
+		newfloor.hidden_contents = old_hidden_contents
+	else
+		qdel(old_hidden_contents)
+	return newfloor
+
+/turf/simulated/floor/restore_tile()
+	..()
+	for (var/obj/item/item in src.contents)
+		if (item.w_class <= W_CLASS_TINY && !item.anchored) //I wonder if this will cause problems
+			src.hide_inside(item)
+
+///CRIME
+/obj/effects/hidden_contents_holder
+	name = ""
+	desc = ""
+	icon = null
+	anchored = ANCHORED_ALWAYS
+	invisibility = INVIS_ALWAYS
+	alpha = 0
+
+	set_loc(newloc)
+		if (!isnull(newloc))
+			return
+		. = ..()
+
+
 ////////////////////////////////////////////ADVENTURE SIMULATED FLOORS////////////////////////
 DEFINE_FLOORS_SIMMED_UNSIMMED(racing,
 	icon = 'icons/misc/racing.dmi';\
@@ -2337,9 +2385,27 @@ DEFINE_FLOORS_SIMMED_UNSIMMED(racing/rainbow_road,
 		icon = 'icons/misc/worlds.dmi'
 		icon_state = "swampgrass_edge"
 
+TYPEINFO(/turf/simulated/floor/auto)
+	/// List of types this autowall connects to
+	var/list/connects_to = null
+	/// Because connections now work by parent type searches, this is for when you don't want certain subtypes to connect.
+	/// This must be a typecache ([/proc/typecachesof]) list
+	var/list/connects_to_exceptions = null
+	/// do we have wall connection overlays, ex nornwalls?
+	var/connect_overlay = 0
+	var/list/connects_with_overlay = null
+	var/list/connects_with_overlay_exceptions = null // same as above comment
+	var/connect_across_areas = TRUE
+	/// 0 = no diagonal sprites, 1 = diagonal only if both adjacent cardinals are present, 2 = always allow diagonals
+	var/connect_diagonal = 0
+
 /turf/simulated/floor/auto
 	name = "auto edging turf"
 
+	var/mod = null
+	var/light_mod = null
+	/// The image we're using to connect to stuff with
+	var/image/connect_image = null
 	///turf won't draw edges on turfs with higher or equal priority
 	var/edge_priority_level = 0
 	var/icon_state_edge = null
@@ -2347,21 +2413,59 @@ DEFINE_FLOORS_SIMMED_UNSIMMED(racing/rainbow_road,
 	New()
 		. = ..()
 		src.layer += src.edge_priority_level / 1000
-		SPAWN(0.5 SECONDS) //give neighbors a chance to spawn in
-			edge_overlays()
+		if (current_state > GAME_STATE_WORLD_NEW)
+			SPAWN(0) //worldgen overrides ideally
+				UpdateIcon()
+				if(istype(src))
+					update_neighbors()
+		else
+			worldgenCandidates += src
+
+	generate_worldgen()
+		src.UpdateIcon()
+		if(istype(src))
+			update_neighbors()
+
+	update_icon()
+		. = ..()
+		src.edge_overlays()
+		if(src.mod)
+			var/typeinfo/turf/simulated/floor/auto/typinfo = get_typeinfo()
+			var/connectdir = get_connected_directions_bitflag(typinfo.connects_to, typinfo.connects_to_exceptions, typinfo.connect_across_areas, typinfo.connect_diagonal)
+			var/the_state = "[mod][connectdir]"
+			icon_state = the_state
+
+			// if (light_mod)
+			// 	src.RL_SetSprite("[light_mod][connectdir]")
+
+			if (typinfo.connect_overlay)
+				var/overlaydir = get_connected_directions_bitflag(typinfo.connects_with_overlay, typinfo.connects_with_overlay_exceptions, typinfo.connect_across_areas)
+				if (overlaydir)
+					if (!src.connect_image)
+						src.connect_image = image(src.icon, "connect[overlaydir]")
+					else
+						src.connect_image.icon_state = "connect[overlaydir]"
+					src.UpdateOverlays(src.connect_image, "connect")
+				else
+					src.UpdateOverlays(null, "connect")
+
+	proc/update_neighbors()
+		for (var/turf/simulated/floor/auto/T in orange(1,src))
+			T.UpdateIcon()
 
 	proc/edge_overlays()
-		for (var/turf/T in orange(src,1))
-			if (istype(T, /turf/simulated/floor/auto))
-				var/turf/simulated/floor/auto/TA = T
-				if (TA.edge_priority_level >= src.edge_priority_level)
-					continue
-			var/direction = get_dir(T,src)
-			var/image/edge_overlay = image(src.icon, "[icon_state_edge][direction]")
-			edge_overlay.appearance_flags = PIXEL_SCALE | TILE_BOUND | RESET_COLOR | RESET_ALPHA
-			edge_overlay.layer = src.layer + (src.edge_priority_level / 1000)
-			edge_overlay.plane = PLANE_FLOOR
-			T.UpdateOverlays(edge_overlay, "edge_[direction]")
+		if(src.icon_state_edge)
+			for (var/turf/T in orange(src,1))
+				if (istype(T, /turf/simulated/floor/auto))
+					var/turf/simulated/floor/auto/TA = T
+					if (TA.edge_priority_level >= src.edge_priority_level)
+						continue
+				var/direction = get_dir(T,src)
+				var/image/edge_overlay = image(src.icon, "[icon_state_edge][direction]")
+				edge_overlay.appearance_flags = PIXEL_SCALE | TILE_BOUND | RESET_COLOR | RESET_ALPHA
+				edge_overlay.layer = src.layer + (src.edge_priority_level / 1000)
+				edge_overlay.plane = PLANE_FLOOR
+				T.UpdateOverlays(edge_overlay, "edge_[direction]")
 
 /turf/simulated/floor/auto/grass/swamp_grass
 	name = "swamp grass"
diff --git a/code/turf/floors_unsimulated.dm b/code/turf/floors_unsimulated.dm
index 36a0e734762b8..e4622ac9ae262 100644
--- a/code/turf/floors_unsimulated.dm
+++ b/code/turf/floors_unsimulated.dm
@@ -1033,12 +1033,28 @@ TYPEINFO(/turf/unsimulated/floor/grass)
 	can_burn = FALSE
 	can_break = FALSE
 
+TYPEINFO(/turf/unsimulated/floor/auto)
+	var/list/connects_to = null
+	/// must be typecache list
+	var/list/connects_to_exceptions = null
+	/// do we have wall connection overlays, ex nornwalls?
+	var/connect_overlay = 0
+	var/list/connects_with_overlay = null
+	var/list/connects_with_overlay_exceptions = null
+	var/connect_across_areas = TRUE
+	/// 0 = no diagonal sprites, 1 = diagonal only if both adjacent cardinals are present, 2 = always allow diagonals
+	var/connect_diagonal = 0
+
 /////////////////////////////////////////
 /turf/unsimulated/floor/auto
 	name = "auto edging turf"
 	can_burn = FALSE
 	can_break = FALSE
 
+	var/mod = null
+	var/light_mod = null
+	/// The image we're using to connect to stuff with
+	var/image/connect_image = null
 	///turf won't draw edges on turfs with higher or equal priority
 	var/edge_priority_level = 0
 	var/icon_state_edge = null
@@ -1046,22 +1062,59 @@ TYPEINFO(/turf/unsimulated/floor/grass)
 	New()
 		. = ..()
 		src.layer += src.edge_priority_level / 1000
-		SPAWN(0.5 SECONDS) //give neighbors a chance to spawn in
-			if(istype(src))
-				edge_overlays()
+		if (current_state > GAME_STATE_WORLD_NEW)
+			SPAWN(0) //worldgen overrides ideally
+				UpdateIcon()
+				if(istype(src))
+					update_neighbors()
+		else
+			worldgenCandidates += src
+
+	generate_worldgen()
+		src.UpdateIcon()
+		if(istype(src))
+			update_neighbors()
+
+	update_icon()
+		. = ..()
+		src.edge_overlays()
+		if(src.mod)
+			var/typeinfo/turf/unsimulated/floor/auto/typinfo = get_typeinfo()
+			var/connectdir = get_connected_directions_bitflag(typinfo.connects_to, typinfo.connects_to_exceptions, typinfo.connect_across_areas, typinfo.connect_diagonal)
+			var/the_state = "[mod][connectdir]"
+			icon_state = the_state
+
+			// if (light_mod)
+			// 	src.RL_SetSprite("[light_mod][connectdir]")
+
+			if (typinfo.connect_overlay)
+				var/overlaydir = get_connected_directions_bitflag(typinfo.connects_with_overlay, typinfo.connects_with_overlay_exceptions, typinfo.connect_across_areas)
+				if (overlaydir)
+					if (!src.connect_image)
+						src.connect_image = image(src.icon, "connect[overlaydir]")
+					else
+						src.connect_image.icon_state = "connect[overlaydir]"
+					src.UpdateOverlays(src.connect_image, "connect")
+				else
+					src.UpdateOverlays(null, "connect")
+
+	proc/update_neighbors()
+		for (var/turf/unsimulated/floor/auto/T in orange(1,src))
+			T.UpdateIcon()
 
 	proc/edge_overlays()
-		for (var/turf/T in orange(src,1))
-			if (istype(T, /turf/unsimulated/floor/auto))
-				var/turf/unsimulated/floor/auto/TA = T
-				if (TA.edge_priority_level >= src.edge_priority_level)
-					continue
-			var/direction = get_dir(T,src)
-			var/image/edge_overlay = image(src.icon, "[icon_state_edge][direction]")
-			edge_overlay.appearance_flags = PIXEL_SCALE | TILE_BOUND | RESET_COLOR | RESET_ALPHA
-			edge_overlay.layer = src.layer + (src.edge_priority_level / 1000)
-			edge_overlay.plane = PLANE_FLOOR
-			T.UpdateOverlays(edge_overlay, "edge_[direction]")
+		if(src.icon_state_edge)
+			for (var/turf/T in orange(src,1))
+				if (istype(T, /turf/unsimulated/floor/auto))
+					var/turf/unsimulated/floor/auto/TA = T
+					if (TA.edge_priority_level >= src.edge_priority_level)
+						continue
+				var/direction = get_dir(T,src)
+				var/image/edge_overlay = image(src.icon, "[icon_state_edge][direction]")
+				edge_overlay.appearance_flags = PIXEL_SCALE | TILE_BOUND | RESET_COLOR | RESET_ALPHA
+				edge_overlay.layer = src.layer + (src.edge_priority_level / 1000)
+				edge_overlay.plane = PLANE_FLOOR
+				T.UpdateOverlays(edge_overlay, "edge_[direction]")
 
 /turf/unsimulated/floor/auto/grass/swamp_grass
 	name = "swamp grass"
diff --git a/code/turf/turf.dm b/code/turf/turf.dm
index 0dc3ac727ca1d..6ba6b04207411 100644
--- a/code/turf/turf.dm
+++ b/code/turf/turf.dm
@@ -856,7 +856,8 @@ var/global/in_replace_with = 0
 
 				#undef _OLD_GAS_VAR_RESTORE
 			#undef _OLD_GAS_VAR_NOT_NULL
-
+			if(N.air)
+				N.update_visuals(N.air)
 			// tell atmos to update this tile's air settings
 			if (air_master)
 				air_master.tiles_to_update |= N
@@ -864,6 +865,7 @@ var/global/in_replace_with = 0
 		if (air_master && oldparent) //Handling air parent changes for oldparent for Simulated -> Anything
 			air_master.groups_to_rebuild |= oldparent //Puts the oldparent into a queue to update the members.
 
+
 	if (istype(new_turf, /turf/simulated))
 		// tells the atmos system "hey this tile changed, maybe rebuild the group / borders"
 		new_turf.update_nearby_tiles(1)
diff --git a/code/world/initialization/1_New.dm b/code/world/initialization/1_New.dm
index 9172076868196..eb1bb93d33fc9 100644
--- a/code/world/initialization/1_New.dm
+++ b/code/world/initialization/1_New.dm
@@ -17,15 +17,13 @@
 	diary_name = "data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log"
 	logDiary("\n----------------------\nStarting up. [time2text(world.timeofday, "hh:mm.ss")]\n----------------------\n")
 
-	//This is used by bans for checking, so we want it very available
+	// Global handlers that should be highly available
 	apiHandler = new()
-
+	eventRecorder = new()
+	roundManagement = new()
 	participationRecorder = new()
-	//participationRecorder = new(1) //Enable debug
-
 	antagWeighter = new()
-
-	if(!chui) chui = new()
+	if (!chui) chui = new()
 
 	//This is also used pretty early
 	Z_LOG_DEBUG("World/New", "Setting up powernets...")
diff --git a/code/world/initialization/2_init.dm b/code/world/initialization/2_init.dm
index fb2b4a28bf7e6..573c02e44c591 100644
--- a/code/world/initialization/2_init.dm
+++ b/code/world/initialization/2_init.dm
@@ -8,6 +8,9 @@
 	game_start_countdown = new()
 	UPDATE_TITLE_STATUS("Initializing world")
 
+	Z_LOG_DEBUG("World/Init", "Notifying hub of new round")
+	roundManagement.recordStart()
+
 	Z_LOG_DEBUG("World/Init", "Loading MOTD...")
 	src.load_motd()//GUH
 	Z_LOG_DEBUG("World/Init", "Loading admins...")
@@ -102,8 +105,6 @@
 	logTheThing(LOG_STATION, null, "Map: [getMapNameFromID(map_setting)]")
 #endif
 
-	Z_LOG_DEBUG("World/Init", "Notifying hub of new round")
-	round_start_data() //Tell the hub site a round is starting
 	if (time2text(world.realtime,"DDD") == "Fri")
 		NT |= mentors
 
diff --git a/code/world/reboot.dm b/code/world/reboot.dm
index 77e0be89b688b..58d0df969229a 100644
--- a/code/world/reboot.dm
+++ b/code/world/reboot.dm
@@ -36,6 +36,7 @@
 	save_tetris_highscores()
 	if (current_state < GAME_STATE_FINISHED)
 		current_state = GAME_STATE_FINISHED
+	eventRecorder.process() // Ensure any remaining events are processed
 #if defined(CI_RUNTIME_CHECKING) || defined(UNIT_TESTS)
 	for (var/client/C in clients)
 		ehjax.send(C, "browseroutput", "hardrestart")
diff --git a/code/world/topic.dm b/code/world/topic.dm
index d301e62e95aa2..1ccc4e08ea45e 100644
--- a/code/world/topic.dm
+++ b/code/world/topic.dm
@@ -342,7 +342,7 @@
 
 		if (findtext(addr, ":")) // remove port if present
 			addr = splittext(addr, ":")[1]
-		if (addr != config.ircbot_ip && addr != config.goonhub_api_ip && addr != config.goonhub2_hostname)
+		if (addr != config.ircbot_ip && addr != config.goonhub_api_ip)
 			return 0 //ip filtering
 
 		var/list/plist = params2list(T)
@@ -633,44 +633,6 @@
 				else
 					return 0
 
-			if ("hubCallback")
-				//Wire note: Temp debug logging as this should always get data and proc
-				if (!plist["data"])
-					logTheThing(LOG_DEBUG, null, "<b>API Error (Temp):</b> Didnt get data.")
-					return 0
-				if (!plist["proc"])
-					logTheThing(LOG_DEBUG, null, "<b>API Error (Temp):</b> Didnt get proc.")
-					return 0
-
-				if (addr != config.goonhub_api_ip) return 0 //ip filtering
-				var/auth = plist["auth"]
-				if (auth != md5(config.goonhub_api_token)) return 0 //really bad md5 token security
-				var/theDatum = plist["datum"] ? plist["datum"] : null
-				var/theProc = "/proc/[plist["proc"]]"
-
-				var/list/ldata
-				try
-					ldata = json_decode(plist["data"])
-				catch
-					logTheThing(LOG_DEBUG, null, "<b>API Error:</b> Invalid JSON detected: [plist["data"]]")
-					return 0
-
-				ldata["data_hub_callback"] = 1
-
-				//calls the second stage of whatever proc specified
-				var/rVal
-				if (theDatum)
-					rVal = call(theDatum, theProc)(ldata)
-				else
-					rVal = call(theProc)(ldata)
-
-				if (rVal)
-					logTheThing(LOG_DEBUG, null, "<b>Callback Error</b> - Hub callback failed in [theDatum ? "<b>[theDatum]</b> " : ""]<b>[theProc]</b> with message: <b>[rVal]</b>")
-					logTheThing(LOG_DIARY, null, "<b>Callback Error</b> - Hub callback failed in [theDatum ? "[theDatum] " : ""][theProc] with message: [rVal]", "debug")
-					return 0
-				else
-					return 1
-
 			if ("roundEnd")
 				if (!plist["server"] || !plist["address"]) return 0
 
@@ -701,6 +663,13 @@
 
 				return 1
 
+			if ("numbersStation")
+				if (!plist["numbers"]) return 0
+
+				lincolnshire_numbers(plist["numbers"])
+
+				return 1
+
 			//Tells shitbee what the current AI laws are (if there are any custom ones)
 			if ("ailaws")
 				if (current_state > GAME_STATE_PREGAME)
@@ -760,15 +729,16 @@
 				var/ircmsg[] = new()
 				ircmsg["major"] = world.byond_version
 				ircmsg["minor"] = world.byond_build
-				ircmsg["goonhub_api"] = config.goonhub_api_version ? config.goonhub_api_version : 0
 				return ircbot.response(ircmsg)
 
 			if ("youtube")
 				if (!plist["data"]) return 0
 
 				play_music_remote(json_decode(plist["data"]))
+
 				// trigger cooldown so radio station doesn't interrupt our cool music
-				EXTEND_COOLDOWN(global, "music", 2 MINUTES) // TODO use plist duration data if available
+				var/duration = text2num(plist["duration"])
+				EXTEND_COOLDOWN(global, "music", duration SECONDS)
 				return 1
 
 			if ("delay")
@@ -864,67 +834,48 @@
 				if (!plist["ckey"])
 					return 0
 
-				var/list/data = list(
-					"auth" = config.player_notes_auth,
-					"action" = "get",
-					"ckey" = plist["ckey"],
-					"format" = "json"
-				)
-
-				// Fetch notes via HTTP
-				var/datum/http_request/request = new()
-				request.prepare(RUSTG_HTTP_METHOD_GET, "[config.player_notes_baseurl]/?[list2params(data)]", "", "")
-				request.begin_async()
-				UNTIL(request.is_complete())
-				var/datum/http_response/response = request.into_response()
-
-				if (response.errored || !response.body)
-					return 0
-
-				return response.body
+				try
+					var/datum/apiRoute/players/notes/get/getPlayerNotes = new
+					getPlayerNotes.queryParams = list(
+						"filters" = list(
+							"ckey" = plist["ckey"]
+						)
+					)
+					return apiHandler.queryAPI(getPlayerNotes)
+				catch
+					return FALSE
 
 			if ("getPlayerStats")
 				if (!plist["ckey"])
 					return 0
 
-				// playtime stats
-				var/list/data = list(
-					"auth" = config.player_notes_auth,
-					"action" = "user_stats",
-					"ckey" = plist["ckey"],
-					"format" = "json"
-				)
-				var/datum/http_request/playtime_request = new()
-				playtime_request.prepare(RUSTG_HTTP_METHOD_GET, "[config.player_notes_baseurl]/?[list2params(data)]", "", "")
-				playtime_request.begin_async()
-
-				// round stats
-				// cleverly making this request inbetween the start and the wait of the playtime request
-				var/list/response = null
+				var/datum/apiModel/Tracked/PlayerStatsResource/playerStats
 				try
-					response = apiHandler.queryAPI("playerInfo/get", list("ckey" = plist["ckey"]), forceResponse = 1)
+					var/datum/apiRoute/players/stats/get/getPlayerStats = new
+					getPlayerStats.queryParams = list("ckey" = plist["ckey"])
+					playerStats = apiHandler.queryAPI(getPlayerStats)
 				catch
-					return 0
-				if (!response)
-					return 0
-
-				// finish playtime stats
-				UNTIL(playtime_request.is_complete())
-				var/datum/http_response/playtime_response = playtime_request.into_response()
-				if (!playtime_response.errored && playtime_response.body)
-					response["playtime"] = playtime_response.body
+					return FALSE
+
+				var/list/response = list(
+					"seen" = playerStats.connected,
+					"seen_rp" = playerStats.connected_rp,
+					"participated" = playerStats.played,
+					"participated_rp" = playerStats.played_rp,
+					"playtime" = playerStats.time_played
+				)
 
 				var/datum/player/player = make_player(plist["ckey"])
 				if(isnull(player.last_seen))
 					player.cache_round_stats_blocking()
 				if(player)
 					response["last_seen"] = player.last_seen
-				if(player.cloud_fetch())
-					for(var/kkey in player.clouddata)
-						if(kkey in list("admin_preferences", "buildmode"))
-							continue
-						response[kkey] = player.clouddata[kkey]
-					response["cloudsaves"] = player.cloudsaves
+				player.cloudSaves.fetch()
+				for(var/kkey in player.cloudSaves.data)
+					if(kkey in list("admin_preferences", "buildmode"))
+						continue
+					response[kkey] = player.cloudSaves.data[kkey]
+				response["cloudsaves"] = player.cloudSaves.saves
 
 				return json_encode(response)
 
diff --git a/code/z_adventurezones/biodome.dm b/code/z_adventurezones/biodome.dm
index 57e5355b084fa..f4d33af91c16e 100644
--- a/code/z_adventurezones/biodome.dm
+++ b/code/z_adventurezones/biodome.dm
@@ -581,6 +581,17 @@ SYNDICATE DRONE FACTORY AREAS
 
 	var/active = 0
 
+	New()
+		. = ..()
+		if (current_state > GAME_STATE_WORLD_NEW)
+			SPAWN(0) //worldgen overrides ideally
+				UpdateIcon()
+		else
+			worldgenCandidates += src
+
+	proc/generate_worldgen()
+		src.UpdateIcon()
+
 	proc/do_move(var/direction)
 		if(active) return
 		var/turf/tile = get_step(src,direction)
@@ -599,6 +610,8 @@ SYNDICATE DRONE FACTORY AREAS
 			tile.invisibility = INVIS_ALWAYS_ISH
 			tile.set_opacity(1)
 			active = 0
+			src.UpdateIcon()
+			update_neighbors()
 
 	find_suitable_tiles()
 		var/list/possible = new/list()
@@ -640,9 +653,24 @@ SYNDICATE DRONE FACTORY AREAS
 			picked.invisibility = INVIS_ALWAYS_ISH
 			picked.set_opacity(1)
 			active = 0
+			src.UpdateIcon()
+			update_neighbors()
 
 		//SPAWN(rand(100,200)) update() // raised delay
 
+	proc/update_neighbors()
+		for (var/turf/unsimulated/wall/auto/T in orange(1,src))
+			T.UpdateIcon()
+		for (var/obj/shifting_wall/sneaky/cave/W in orange(1,src))
+			W.UpdateIcon()
+
+	update_icon()
+		var/typeinfo/turf/unsimulated/wall/auto/typinfo = get_type_typeinfo(/turf/unsimulated/wall/auto/adventure)
+		var/connectdir = get_connected_directions_bitflag(typinfo.connects_to, typinfo.connects_to_exceptions, TRUE, typinfo.connect_diagonal)
+		var/mod = "cave-"
+		var/the_state = "[mod][connectdir]"
+		icon_state = the_state
+
 /obj/line_obj/whip
 	name = "Whip"
 	desc = ""
diff --git a/code/z_adventurezones/gannets_dojozone.dm b/code/z_adventurezones/gannets_dojozone.dm
index f6f52a67ad397..9655188e13785 100644
--- a/code/z_adventurezones/gannets_dojozone.dm
+++ b/code/z_adventurezones/gannets_dojozone.dm
@@ -535,7 +535,7 @@ Contents:
 		else
 			playsound(src, 'sound/impact_sounds/Stone_Scrape_1.ogg', 40)
 			for(var/obj/machinery/dojo_tatara/T in orange(2))
-				src.visible_message("\The [src] breathe life into \the [T] causing it errupt in flames.", blind_message="A loud roar of air causes a fire to errupt.")
+				src.visible_message("\The [src] breathe life into \the [T] causing it erupt in flames.", blind_message="A loud roar of air causes a fire to erupt.")
 				T.temperature = clamp(T.temperature + 150, initial(T.temperature)-150, T0C+2500)
 
 /obj/decal/fakeobjects/swordrack
diff --git a/code/z_adventurezones/lavamoon.dm b/code/z_adventurezones/lavamoon.dm
index e693fdfb28d1e..c69449e0a4f56 100644
--- a/code/z_adventurezones/lavamoon.dm
+++ b/code/z_adventurezones/lavamoon.dm
@@ -574,7 +574,7 @@ var/sound/iomoon_alarm_sound = null
 			. = ..()
 
 //Clothing & Associated Equipment
-/obj/item/clothing/suit/rad/iomoon
+/obj/item/clothing/suit/hazard/rad/iomoon
 	name = "FB-8 Environment Suit"
 	desc = "A rather old-looking suit designed to guard against extreme heat and radiation."
 	icon_state = "rad_io"
@@ -598,7 +598,7 @@ var/sound/iomoon_alarm_sound = null
 	icon_state = "syndicate"
 	icon_opened = "syndicate-open"
 	icon_closed = "syndicate"
-	spawn_contents = list(/obj/item/clothing/suit/rad/iomoon,\
+	spawn_contents = list(/obj/item/clothing/suit/hazard/rad/iomoon,\
 	/obj/item/clothing/head/rad_hood/iomoon)
 
 /obj/machinery/light/small/iomoon
diff --git a/code/z_adventurezones/numbersstation.dm b/code/z_adventurezones/numbersstation.dm
index 6c665c488be1d..74af3bc270dd5 100644
--- a/code/z_adventurezones/numbersstation.dm
+++ b/code/z_adventurezones/numbersstation.dm
@@ -255,7 +255,12 @@ Nanotrasen, Inc.<br>
 			next_play = play_interval
 		next_warning = next_play - 300
 		SPAWN(20 SECONDS)
-			apiHandler.queryAPI("numbers/get")
+			try
+				var/datum/apiRoute/numbersstation/get/getNumbers = new
+				var/datum/apiModel/NumbersStationPasswordResource/numbersStationPassword = apiHandler.queryAPI(getNumbers)
+				lincolnshire_numbers(numbersStationPassword.numbers)
+			catch
+				// pass
 
 	proc/gather_listeners()
 		listeners = list()
@@ -410,21 +415,18 @@ var/global/datum/numbers_station/lincolnshire = new
 	lincolnshire.next_play = 0
 	lincolnshire.process()
 
-/proc/lincolnshire_numbers(data)
-	if (islist(data))
-		logTheThing(LOG_DEBUG, null, "<b>Numbers station</b>: numbers: [data["numbers"]]")
-		var/TP = data["numbers"]
-		if (TP == null)
-			return 1
-		var/list/nums = splittext(TP, " ")
-		if (length(nums) < 21)
-			logTheThing(LOG_DEBUG, null, "<b>Numbers station</b> got too few numbers.")
-			return 2
-		for (var/i = 1, i <= 21, i++)
-			lincolnshire.numbers[i] = text2num(nums[i])
-		logTheThing(LOG_DEBUG, null, "<b>Numbers station</b> woo success")
-		return 0
-	return 3
+/proc/lincolnshire_numbers(numbers)
+	logTheThing(LOG_DEBUG, null, "<b>Numbers station</b>: numbers: [numbers]")
+	if (numbers == null)
+		return FALSE
+	var/list/nums = splittext(numbers, " ")
+	if (length(nums) < 21)
+		logTheThing(LOG_DEBUG, null, "<b>Numbers station</b> got too few numbers.")
+		return FALSE
+	for (var/i = 1, i <= 21, i++)
+		lincolnshire.numbers[i] = text2num(nums[i])
+	logTheThing(LOG_DEBUG, null, "<b>Numbers station</b> woo success")
+	return TRUE
 
 
 // This particular edition of the handbook is used as the cipher for the numbers station.
diff --git a/goonstation.dme b/goonstation.dme
index 96346ce181d2f..0a4f725bad526 100644
--- a/goonstation.dme
+++ b/goonstation.dme
@@ -16,7 +16,7 @@ var/datum/preMapLoad/preMapLoad = new
 // END_PREFERENCES
 
 // Compiler Settings
-#include "_std\__odlint.dm"
+#include "_std\__odlint.dme"
 
 // Compatibility Check
 #include "_std\compatibility.dme"
@@ -64,7 +64,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\admin_powers.dm"
 #include "code\datums\ai_laws.dm"
 #include "code\datums\antag_weighting.dm"
-#include "code\datums\api_handler.dm"
 #include "code\datums\banking.dm"
 #include "code\datums\browserOutput.dm"
 #include "code\datums\buildmode.dm"
@@ -72,6 +71,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\changelog.dm"
 #include "code\datums\character_preview.dm"
 #include "code\datums\client_image_group.dm"
+#include "code\datums\cloud_saves.dm"
 #include "code\datums\computerfiles.dm"
 #include "code\datums\configuration.dm"
 #include "code\datums\cookingrecipes.dm"
@@ -115,6 +115,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\pronouns.dm"
 #include "code\datums\rand.dm"
 #include "code\datums\recipes.dm"
+#include "code\datums\round_management.dm"
 #include "code\datums\savefile.dm"
 #include "code\datums\sims.dm"
 #include "code\datums\spawn_rules.dm"
@@ -135,6 +136,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\abilities\brassgauntlet.dm"
 #include "code\datums\abilities\critter.dm"
 #include "code\datums\abilities\cruiser.dm"
+#include "code\datums\abilities\dancing.dm"
 #include "code\datums\abilities\diabolical.dm"
 #include "code\datums\abilities\flockdrone.dm"
 #include "code\datums\abilities\generic.dm"
@@ -301,6 +303,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\controllers\process\chemistry.dm"
 #include "code\datums\controllers\process\critters.dm"
 #include "code\datums\controllers\process\delete_queue.dm"
+#include "code\datums\controllers\process\events.dm"
 #include "code\datums\controllers\process\explosions.dm"
 #include "code\datums\controllers\process\flock.dm"
 #include "code\datums\controllers\process\fluid.dm"
@@ -316,6 +319,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\controllers\process\mob_ui.dm"
 #include "code\datums\controllers\process\mobs.dm"
 #include "code\datums\controllers\process\particles.dm"
+#include "code\datums\controllers\process\poll_sync.dm"
 #include "code\datums\controllers\process\precipitation.dm"
 #include "code\datums\controllers\process\railway.dm"
 #include "code\datums\controllers\process\random_events.dm"
@@ -370,6 +374,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\gamemodes\mixed.dm"
 #include "code\datums\gamemodes\mixed_rp.dm"
 #include "code\datums\gamemodes\nuclear.dm"
+#include "code\datums\gamemodes\pirate.dm"
 #include "code\datums\gamemodes\pod_wars.dm"
 #include "code\datums\gamemodes\revolution.dm"
 #include "code\datums\gamemodes\salvager.dm"
@@ -397,6 +402,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\hud\flockdrone.dm"
 #include "code\datums\hud\flockmind.dm"
 #include "code\datums\hud\funimage.dm"
+#include "code\datums\hud\gang_victory.dm"
 #include "code\datums\hud\ghost_observer.dm"
 #include "code\datums\hud\ghostdrone.dm"
 #include "code\datums\hud\human.dm"
@@ -444,7 +450,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\datums\webelements\tag.dm"
 #include "code\datums\webelements\textarea.dm"
 #include "code\datums\webelements\title.dm"
-#include "code\lists\ckey_configs.dm"
 #include "code\lists\jobs.dm"
 #include "code\mob\dead.dm"
 #include "code\mob\input.dm"
@@ -570,6 +575,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\mob\living\life\critical.dm"
 #include "code\mob\living\life\decomposition.dm"
 #include "code\mob\living\life\disability.dm"
+#include "code\mob\living\life\faith.dm"
 #include "code\mob\living\life\fire.dm"
 #include "code\mob\living\life\health_mon.dm"
 #include "code\mob\living\life\hud.dm"
@@ -588,7 +594,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\mob\living\silicon\hivebot.dm"
 #include "code\mob\living\silicon\robot.dm"
 #include "code\mob\living\silicon\robot_locks.dm"
-#include "code\mob\living\silicon\robot_oil.dm"
 #include "code\mob\living\silicon\robot_statusupdate.dm"
 #include "code\mob\living\silicon\ai\ai_abilities.dm"
 #include "code\mob\living\silicon\ai\camera_handling.dm"
@@ -607,6 +612,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\admin\adminsay.dm"
 #include "code\modules\admin\antagifiers.dm"
 #include "code\modules\admin\atom_verbs.dm"
+#include "code\modules\admin\ban_panel.dm"
 #include "code\modules\admin\bans.dm"
 #include "code\modules\admin\banshark.dm"
 #include "code\modules\admin\bioeffectmanager.dm"
@@ -1056,6 +1062,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\chemistry\tools\stimpack.dm"
 #include "code\modules\chemistry\tools\syringes.dm"
 #include "code\modules\chemistry\tools\vendor_items.dm"
+#include "code\modules\config\ckey_configs.dm"
 #include "code\modules\cross_server\cross_server_message.dm"
 #include "code\modules\cross_server\game_servers.dm"
 #include "code\modules\cross_server\server_list.dm"
@@ -1168,6 +1175,193 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\food_and_drink\sandwiches.dm"
 #include "code\modules\food_and_drink\snacks.dm"
 #include "code\modules\forensics\atom_forensic.dm"
+#include "code\modules\goonhub\api\api.dm"
+#include "code\modules\goonhub\api\models\_Paginated.dm"
+#include "code\modules\goonhub\api\models\_PlayerResParent.dm"
+#include "code\modules\goonhub\api\models\_Tracked.dm"
+#include "code\modules\goonhub\api\models\apiModel.dm"
+#include "code\modules\goonhub\api\models\Error.dm"
+#include "code\modules\goonhub\api\models\Message.dm"
+#include "code\modules\goonhub\api\models\bans\BanDetail.dm"
+#include "code\modules\goonhub\api\models\bans\BanResource.dm"
+#include "code\modules\goonhub\api\models\bans\BanResourceList.dm"
+#include "code\modules\goonhub\api\models\bans\JobBanResource.dm"
+#include "code\modules\goonhub\api\models\bans\JobBanResourceList.dm"
+#include "code\modules\goonhub\api\models\bans\JobBansForPlayer.dm"
+#include "code\modules\goonhub\api\models\dectalk\DectalkPlayResource.dm"
+#include "code\modules\goonhub\api\models\events\EventAiLawResource.dm"
+#include "code\modules\goonhub\api\models\events\EventFineResource.dm"
+#include "code\modules\goonhub\api\models\events\EventStationNameResource.dm"
+#include "code\modules\goonhub\api\models\events\EventTicketResource.dm"
+#include "code\modules\goonhub\api\models\gameadmins\GameAdmin.dm"
+#include "code\modules\goonhub\api\models\gameadmins\GameAdminRank.dm"
+#include "code\modules\goonhub\api\models\gameadmins\GameAdminResource.dm"
+#include "code\modules\goonhub\api\models\gauntlet\PreviousGauntlets.dm"
+#include "code\modules\goonhub\api\models\maps\MapSwitch.dm"
+#include "code\modules\goonhub\api\models\medals\MedalResource.dm"
+#include "code\modules\goonhub\api\models\numbersstation\NumbersStationPasswordResource.dm"
+#include "code\modules\goonhub\api\models\players\GetPlayerSaves.dm"
+#include "code\modules\goonhub\api\models\players\PlayerAntagResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerCompIdsResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerConnection.dm"
+#include "code\modules\goonhub\api\models\players\PlayerDataResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerIpsResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerMedalResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerMedalResourceList.dm"
+#include "code\modules\goonhub\api\models\players\PlayerMetadataArray.dm"
+#include "code\modules\goonhub\api\models\players\PlayerMetadataList.dm"
+#include "code\modules\goonhub\api\models\players\PlayerMetadataResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerNoteResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerNoteResourceList.dm"
+#include "code\modules\goonhub\api\models\players\PlayerParticipationResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerSaveResource.dm"
+#include "code\modules\goonhub\api\models\players\PlayerStatsResource.dm"
+#include "code\modules\goonhub\api\models\players\weird\PlayerSearchResource.dm"
+#include "code\modules\goonhub\api\models\polls\PollAnswerResource.dm"
+#include "code\modules\goonhub\api\models\polls\PollOptionResource.dm"
+#include "code\modules\goonhub\api\models\polls\PollResource.dm"
+#include "code\modules\goonhub\api\models\polls\PollResourceList.dm"
+#include "code\modules\goonhub\api\models\randomentries\RandomEntries.dm"
+#include "code\modules\goonhub\api\models\rounds\GameRound.dm"
+#include "code\modules\goonhub\api\models\vpn\VpnCheckResource.dm"
+#include "code\modules\goonhub\api\models\vpn\VpnWhitelistResource.dm"
+#include "code\modules\goonhub\api\models\vpn\VpnWhitelistSearch.dm"
+#include "code\modules\goonhub\api\requests\apiBody.dm"
+#include "code\modules\goonhub\api\requests\RemoteMusicBody.dm"
+#include "code\modules\goonhub\api\requests\bans\AddBansBody.dm"
+#include "code\modules\goonhub\api\requests\bans\AddBansDetailBody.dm"
+#include "code\modules\goonhub\api\requests\bans\AddJobBansBody.dm"
+#include "code\modules\goonhub\api\requests\bans\DeleteBansBody.dm"
+#include "code\modules\goonhub\api\requests\bans\DeleteJobBanBody.dm"
+#include "code\modules\goonhub\api\requests\bans\UpdateJobBansBody.dm"
+#include "code\modules\goonhub\api\requests\dectalk\DectalkPlayBody.dm"
+#include "code\modules\goonhub\api\requests\gameadmins\AddGameAdminsBody.dm"
+#include "code\modules\goonhub\api\requests\gameadmins\UpdateGameAdminsBody.dm"
+#include "code\modules\goonhub\api\requests\maps\MapSwitchBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerAntagsBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerLoginBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerMetadataBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerParticipationsBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerParticipationsBulkBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerPlaytimeBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesAddDataBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesAddSaveBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesBulkBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesDeleteDataBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesDeleteSaveBody.dm"
+#include "code\modules\goonhub\api\requests\players\PlayerSavesTransferFilesBody.dm"
+#include "code\modules\goonhub\api\requests\players\medals\AddPlayerMedalBody.dm"
+#include "code\modules\goonhub\api\requests\players\medals\DeletePlayerMedalBody.dm"
+#include "code\modules\goonhub\api\requests\players\notes\AddPlayerNotesBody.dm"
+#include "code\modules\goonhub\api\requests\players\notes\UpdatePlayerNotesBody.dm"
+#include "code\modules\goonhub\api\requests\polls\AddPollBody.dm"
+#include "code\modules\goonhub\api\requests\polls\AddPollOptionBody.dm"
+#include "code\modules\goonhub\api\requests\polls\EditPollBody.dm"
+#include "code\modules\goonhub\api\requests\polls\EditPollOptionBody.dm"
+#include "code\modules\goonhub\api\requests\polls\PickUnpickPollOptionBody.dm"
+#include "code\modules\goonhub\api\requests\rounds\AddGameRoundBody.dm"
+#include "code\modules\goonhub\api\requests\rounds\EndGameRoundBody.dm"
+#include "code\modules\goonhub\api\requests\rounds\UpdateGameRoundBody.dm"
+#include "code\modules\goonhub\api\requests\vpn\AddVpnWhitelistBody.dm"
+#include "code\modules\goonhub\api\routes\apiRoute.dm"
+#include "code\modules\goonhub\api\routes\RandomEntries.dm"
+#include "code\modules\goonhub\api\routes\RemoteMusic.dm"
+#include "code\modules\goonhub\api\routes\bans\AddBanDetails.dm"
+#include "code\modules\goonhub\api\routes\bans\AddBans.dm"
+#include "code\modules\goonhub\api\routes\bans\CheckBans.dm"
+#include "code\modules\goonhub\api\routes\bans\DeleteBans.dm"
+#include "code\modules\goonhub\api\routes\bans\GetBans.dm"
+#include "code\modules\goonhub\api\routes\bans\RemoveBanDetails.dm"
+#include "code\modules\goonhub\api\routes\bans\UpdateBans.dm"
+#include "code\modules\goonhub\api\routes\dectalk\PlayDectalk.dm"
+#include "code\modules\goonhub\api\routes\gameadminranks\AddGameAdminRanks.dm"
+#include "code\modules\goonhub\api\routes\gameadminranks\DeleteGameAdminRanks.dm"
+#include "code\modules\goonhub\api\routes\gameadminranks\GetGameAdminRanks.dm"
+#include "code\modules\goonhub\api\routes\gameadminranks\UpdateGameAdminRanks.dm"
+#include "code\modules\goonhub\api\routes\gameadmins\AddGameAdmins.dm"
+#include "code\modules\goonhub\api\routes\gameadmins\DeleteGameAdmins.dm"
+#include "code\modules\goonhub\api\routes\gameadmins\GetGameAdmins.dm"
+#include "code\modules\goonhub\api\routes\gameadmins\UpdateGameAdmins.dm"
+#include "code\modules\goonhub\api\routes\gauntlet\GetPreviousGauntlets.dm"
+#include "code\modules\goonhub\api\routes\jobbans\AddJobBans.dm"
+#include "code\modules\goonhub\api\routes\jobbans\CheckJobBans.dm"
+#include "code\modules\goonhub\api\routes\jobbans\DeleteJobBans.dm"
+#include "code\modules\goonhub\api\routes\jobbans\GetJobBans.dm"
+#include "code\modules\goonhub\api\routes\jobbans\GetPlayerJobBans.dm"
+#include "code\modules\goonhub\api\routes\jobbans\UpdateJobBans.dm"
+#include "code\modules\goonhub\api\routes\maps\MapSwitches.dm"
+#include "code\modules\goonhub\api\routes\numbersstation\GetNumbersStationNumbers.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerAntags.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerCompIds.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerIps.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerLogin.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerParticipations.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerParticipationsBulk.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerPlaytime.dm"
+#include "code\modules\goonhub\api\routes\players\PlayerStats.dm"
+#include "code\modules\goonhub\api\routes\players\medals\AddPlayerMedal.dm"
+#include "code\modules\goonhub\api\routes\players\medals\DeletePlayerMedal.dm"
+#include "code\modules\goonhub\api\routes\players\medals\GetPlayerMedals.dm"
+#include "code\modules\goonhub\api\routes\players\medals\ShowPlayerMedal.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\AddPlayerMetadata.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\DeleteFromPlayerMetadata.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\DeletePlayerMetadata.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\GetMetadataByPlayer.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\GetPlayerMetadata.dm"
+#include "code\modules\goonhub\api\routes\players\metadata\GetPlayersByMetadata.dm"
+#include "code\modules\goonhub\api\routes\players\notes\AddPlayerNotes.dm"
+#include "code\modules\goonhub\api\routes\players\notes\DeletePlayerNotes.dm"
+#include "code\modules\goonhub\api\routes\players\notes\GetPlayerNotes.dm"
+#include "code\modules\goonhub\api\routes\players\notes\UpdatePlayerNotes.dm"
+#include "code\modules\goonhub\api\routes\players\saves\AddBulkDataPlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\AddDataPlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\AddFilePlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\DeleteDataPlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\DeleteSavePlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\GetPlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\players\saves\TransferDataPlayerSaves.dm"
+#include "code\modules\goonhub\api\routes\polls\AddPoll.dm"
+#include "code\modules\goonhub\api\routes\polls\AddPollOption.dm"
+#include "code\modules\goonhub\api\routes\polls\DeletePoll.dm"
+#include "code\modules\goonhub\api\routes\polls\DeletePollOption.dm"
+#include "code\modules\goonhub\api\routes\polls\EditPoll.dm"
+#include "code\modules\goonhub\api\routes\polls\EditPollOption.dm"
+#include "code\modules\goonhub\api\routes\polls\GetPoll.dm"
+#include "code\modules\goonhub\api\routes\polls\GetPolls.dm"
+#include "code\modules\goonhub\api\routes\polls\PickOption.dm"
+#include "code\modules\goonhub\api\routes\polls\UnpickOption.dm"
+#include "code\modules\goonhub\api\routes\rounds\AddGameRound.dm"
+#include "code\modules\goonhub\api\routes\rounds\EndGameRound.dm"
+#include "code\modules\goonhub\api\routes\rounds\UpdateGameRound.dm"
+#include "code\modules\goonhub\api\routes\vpn\AddVpnWhitelist.dm"
+#include "code\modules\goonhub\api\routes\vpn\CheckVpn.dm"
+#include "code\modules\goonhub\api\routes\vpn\DeleteVpnWhitelist.dm"
+#include "code\modules\goonhub\api\routes\vpn\SearchVpnWhitelist.dm"
+#include "code\modules\goonhub\event_recording\event_recorder.dm"
+#include "code\modules\goonhub\event_recording\events\AILaw.dm"
+#include "code\modules\goonhub\event_recording\events\Antag.dm"
+#include "code\modules\goonhub\event_recording\events\AntagItemPurchase.dm"
+#include "code\modules\goonhub\event_recording\events\AntagObjective.dm"
+#include "code\modules\goonhub\event_recording\events\BeeSpawn.dm"
+#include "code\modules\goonhub\event_recording\events\Death.dm"
+#include "code\modules\goonhub\event_recording\events\eventRecord.dm"
+#include "code\modules\goonhub\event_recording\events\Fine.dm"
+#include "code\modules\goonhub\event_recording\events\GauntletHighScore.dm"
+#include "code\modules\goonhub\event_recording\events\StationName.dm"
+#include "code\modules\goonhub\event_recording\events\Ticket.dm"
+#include "code\modules\goonhub\event_recording\types\_TracksPlayer.dm"
+#include "code\modules\goonhub\event_recording\types\AILaw.dm"
+#include "code\modules\goonhub\event_recording\types\Antag.dm"
+#include "code\modules\goonhub\event_recording\types\AntagItemPurchase.dm"
+#include "code\modules\goonhub\event_recording\types\AntagObjective.dm"
+#include "code\modules\goonhub\event_recording\types\BeeSpawn.dm"
+#include "code\modules\goonhub\event_recording\types\Death.dm"
+#include "code\modules\goonhub\event_recording\types\eventBody.dm"
+#include "code\modules\goonhub\event_recording\types\Fine.dm"
+#include "code\modules\goonhub\event_recording\types\GauntletHighScore.dm"
+#include "code\modules\goonhub\event_recording\types\StationName.dm"
+#include "code\modules\goonhub\event_recording\types\Ticket.dm"
 #include "code\modules\gps\gps.dm"
 #include "code\modules\holiday\halloween.dm"
 #include "code\modules\holiday\spacemas.dm"
@@ -1196,6 +1390,8 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\interface\multiContext\multiContext.dm"
 #include "code\modules\items\gimmick\figurine.dm"
 #include "code\modules\items\gimmick\plushies.dm"
+#include "code\modules\items\instruments\instruments.dm"
+#include "code\modules\items\instruments\playable_piano.dm"
 #include "code\modules\items\specials\ItemSpecials.dm"
 #include "code\modules\jobxp\JobXP.dm"
 #include "code\modules\jobxp\JobXPRewards.dm"
@@ -1305,6 +1501,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\medical\pathology\pathogen_suppressants.dm"
 #include "code\modules\medical\pathology\pathogen_symptoms.dm"
 #include "code\modules\medical\pathology\pathogen_tools.dm"
+#include "code\modules\mentor\mentorhelp.dm"
 #include "code\modules\minimap\minimap.dm"
 #include "code\modules\minimap\minimap_marker.dm"
 #include "code\modules\minimap\minimap_object.dm"
@@ -1360,6 +1557,8 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\parallax\parallax_render_sources\parallax_render_source_groups.dm"
 #include "code\modules\parallax\parallax_render_sources\parallax_render_source_parent.dm"
 #include "code\modules\parallax\parallax_render_sources\parallax_render_sources.dm"
+#include "code\modules\polling\poll_ballot.dm"
+#include "code\modules\polling\poll_manager.dm"
 #include "code\modules\power\apc.dm"
 #include "code\modules\power\cable.dm"
 #include "code\modules\power\cablecolors.dm"
@@ -1462,6 +1661,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\sound\sound.dm"
 #include "code\modules\sound\soundCache.dm"
 #include "code\modules\speech\floating_chat.dm"
+#include "code\modules\speech\logged_phrases.dm"
 #include "code\modules\status_system\statusEffects.dm"
 #include "code\modules\status_system\statusFoodBad.dm"
 #include "code\modules\status_system\statusFoodBuffs.dm"
@@ -1546,6 +1746,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\modules\worldgen\mapgen\ForestGenerator.dm"
 #include "code\modules\worldgen\mapgen\IceMoonGenerator.dm"
 #include "code\modules\worldgen\mapgen\JungleGenerator.dm"
+#include "code\modules\worldgen\mapgen\LavaMoonGenerator.dm"
 #include "code\modules\worldgen\mapgen\MarsGenerator.dm"
 #include "code\modules\worldgen\mapgen\RoomMaze.dm"
 #include "code\modules\worldgen\mapgen\SnowGenerator.dm"
@@ -1598,7 +1799,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\obj\noticeboard.dm"
 #include "code\obj\npc.dm"
 #include "code\obj\objDialog.dm"
-#include "code\obj\playable_piano.dm"
 #include "code\obj\pool.dm"
 #include "code\obj\portal.dm"
 #include "code\obj\posters.dm"
@@ -1751,7 +1951,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\obj\item\handcuffs.dm"
 #include "code\obj\item\hydroponics.dm"
 #include "code\obj\item\implant.dm"
-#include "code\obj\item\instruments.dm"
 #include "code\obj\item\kendo.dm"
 #include "code\obj\item\keys.dm"
 #include "code\obj\item\kitchen.dm"
@@ -2031,6 +2230,9 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\obj\machinery\computer\syndicate\podbay.dm"
 #include "code\obj\machinery\computer\tetris\tetris.dm"
 #include "code\obj\machinery\door\airlock.dm"
+#include "code\obj\machinery\door\airlock_gannets.dm"
+#include "code\obj\machinery\door\airlock_other.dm"
+#include "code\obj\machinery\door\airlock_pyro.dm"
 #include "code\obj\machinery\door\door_control.dm"
 #include "code\obj\machinery\door\door_parent.dm"
 #include "code\obj\machinery\door\door_timer.dm"
@@ -2039,6 +2241,7 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\obj\machinery\door\poddoor.dm"
 #include "code\obj\machinery\door\supernorn.dm"
 #include "code\obj\machinery\door\window.dm"
+#include "code\obj\machinery\food_and_drink\mixer.dm"
 #include "code\obj\machinery\phone\phone.dm"
 #include "code\obj\machinery\pipe\pipe_dispenser.dm"
 #include "code\obj\machinery\shield_generators\energy_shield.dm"
@@ -2080,7 +2283,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\procs\accents.dm"
 #include "code\procs\access.dm"
 #include "code\procs\antagonist_procs.dm"
-#include "code\procs\authorize.dm"
 #include "code\procs\basketball.dm"
 #include "code\procs\bug_report.dm"
 #include "code\procs\command_alert.dm"
@@ -2089,7 +2291,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\procs\datetime.dm"
 #include "code\procs\elecflash.dm"
 #include "code\procs\explosion_new.dm"
-#include "code\procs\export_data.dm"
 #include "code\procs\fireflash.dm"
 #include "code\procs\gamehelpers.dm"
 #include "code\procs\Get_Flat_Icon.dm"
@@ -2097,14 +2298,12 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\procs\helpers.dm"
 #include "code\procs\jobprocs.dm"
 #include "code\procs\lightning_bolt.dm"
-#include "code\procs\logged_phrases.dm"
 #include "code\procs\logging.dm"
 #include "code\procs\loop_debug.dm"
 #include "code\procs\mob_procs.dm"
 #include "code\procs\resourceManagement.dm"
 #include "code\procs\scanprocs.dm"
 #include "code\procs\scorestats.dm"
-#include "code\procs\stat_logging.dm"
 #include "code\procs\station_name.dm"
 #include "code\procs\string_cache.dm"
 #include "code\procs\string_picker.dm"
@@ -2126,7 +2325,6 @@ var/datum/preMapLoad/preMapLoad = new
 #include "code\WorkInProgress\actuallyKeelinsStuff.dm"
 #include "code\WorkInProgress\aloe_stuff_public.dm"
 #include "code\WorkInProgress\AphsStuff.dm"
-#include "code\WorkInProgress\apiFallbackRoutes.dm"
 #include "code\WorkInProgress\AzrunStuff.dm"
 #include "code\WorkInProgress\Azungarstuff.dm"
 #include "code\WorkInProgress\batman.dm"
diff --git a/icons/Testing/newicons/obj/ALTstructures.dmi b/icons/Testing/newicons/obj/ALTstructures.dmi
deleted file mode 100644
index 2a9cd896badea..0000000000000
Binary files a/icons/Testing/newicons/obj/ALTstructures.dmi and /dev/null differ
diff --git a/icons/Testing/newicons/obj/NEWcomputer.dmi b/icons/Testing/newicons/obj/NEWcomputer.dmi
deleted file mode 100644
index 4412f5acce3c1..0000000000000
Binary files a/icons/Testing/newicons/obj/NEWcomputer.dmi and /dev/null differ
diff --git a/icons/Testing/newicons/obj/NEWdoors/NEWDoor1.dmi b/icons/Testing/newicons/obj/NEWdoors/NEWDoor1.dmi
index 21d1d93b1b2ea..a9db6ddf8504a 100644
Binary files a/icons/Testing/newicons/obj/NEWdoors/NEWDoor1.dmi and b/icons/Testing/newicons/obj/NEWdoors/NEWDoor1.dmi differ
diff --git a/icons/Testing/newicons/obj/NEWdoors/stupid_shitty_fucking_vertical_crap_doors.dmi b/icons/Testing/newicons/obj/NEWdoors/stupid_shitty_fucking_vertical_crap_doors.dmi
index 24ed3d34a0082..ff10ce7f775f2 100644
Binary files a/icons/Testing/newicons/obj/NEWdoors/stupid_shitty_fucking_vertical_crap_doors.dmi and b/icons/Testing/newicons/obj/NEWdoors/stupid_shitty_fucking_vertical_crap_doors.dmi differ
diff --git a/icons/effects/1x1.dmi b/icons/effects/1x1.dmi
index 4e272a65b3d19..da9e830686e09 100644
Binary files a/icons/effects/1x1.dmi and b/icons/effects/1x1.dmi differ
diff --git a/icons/effects/overlays/Ltrans.dmi b/icons/effects/overlays/Ltrans.dmi
index 1aac5f471096b..ceee8e8ad2da8 100644
Binary files a/icons/effects/overlays/Ltrans.dmi and b/icons/effects/overlays/Ltrans.dmi differ
diff --git a/icons/effects/overlays/beamout.dmi b/icons/effects/overlays/beamout.dmi
index c0f6a62073d6a..8cc416685de04 100644
Binary files a/icons/effects/overlays/beamout.dmi and b/icons/effects/overlays/beamout.dmi differ
diff --git a/icons/effects/overlays/cloudy.dmi b/icons/effects/overlays/cloudy.dmi
index fb74bae729910..82e9ad0bf4ae2 100644
Binary files a/icons/effects/overlays/cloudy.dmi and b/icons/effects/overlays/cloudy.dmi differ
diff --git a/icons/effects/overlays/knockout.dmi b/icons/effects/overlays/knockout.dmi
index 7907a29df4f67..a8d05f5a7b3e1 100644
Binary files a/icons/effects/overlays/knockout.dmi and b/icons/effects/overlays/knockout.dmi differ
diff --git a/icons/effects/overlays/knockout2.dmi b/icons/effects/overlays/knockout2.dmi
index 4f0e01181e0df..1f1bfe96d5681 100644
Binary files a/icons/effects/overlays/knockout2.dmi and b/icons/effects/overlays/knockout2.dmi differ
diff --git a/icons/effects/overlays/knockout2t.dmi b/icons/effects/overlays/knockout2t.dmi
index e13be517ca4ee..32c02298047a3 100644
Binary files a/icons/effects/overlays/knockout2t.dmi and b/icons/effects/overlays/knockout2t.dmi differ
diff --git a/icons/effects/overlays/knockoutinverted.dmi b/icons/effects/overlays/knockoutinverted.dmi
deleted file mode 100644
index 02edf0e985d8e..0000000000000
Binary files a/icons/effects/overlays/knockoutinverted.dmi and /dev/null differ
diff --git a/icons/effects/overlays/meaty.dmi b/icons/effects/overlays/meaty.dmi
deleted file mode 100644
index 1ced2af4e0039..0000000000000
Binary files a/icons/effects/overlays/meaty.dmi and /dev/null differ
diff --git a/icons/effects/overlays/meatyC.dmi b/icons/effects/overlays/meatyC.dmi
index 98bd65f4ef35c..4d962896cce45 100644
Binary files a/icons/effects/overlays/meatyC.dmi and b/icons/effects/overlays/meatyC.dmi differ
diff --git a/icons/effects/overlays/meatyL.dmi b/icons/effects/overlays/meatyL.dmi
index 04f9fbc7d62ee..bf3a1a83e2632 100644
Binary files a/icons/effects/overlays/meatyL.dmi and b/icons/effects/overlays/meatyL.dmi differ
diff --git a/icons/effects/overlays/meatyR.dmi b/icons/effects/overlays/meatyR.dmi
index b311bf7dc6c72..ec76543fc6d46 100644
Binary files a/icons/effects/overlays/meatyR.dmi and b/icons/effects/overlays/meatyR.dmi differ
diff --git a/icons/effects/overlays/meatysmall.dmi b/icons/effects/overlays/meatysmall.dmi
index e36cdd3135018..bbda8c2d7c0cf 100644
Binary files a/icons/effects/overlays/meatysmall.dmi and b/icons/effects/overlays/meatysmall.dmi differ
diff --git a/icons/effects/overlays/solid.dmi b/icons/effects/overlays/solid.dmi
index db57b2e9e3f3b..8eea4deb584c8 100644
Binary files a/icons/effects/overlays/solid.dmi and b/icons/effects/overlays/solid.dmi differ
diff --git a/icons/map-editing/mapping_helpers.dmi b/icons/map-editing/mapping_helpers.dmi
index 3789847378071..dd17cbe672f54 100644
Binary files a/icons/map-editing/mapping_helpers.dmi and b/icons/map-editing/mapping_helpers.dmi differ
diff --git a/icons/misc/HaineSpriteDump.dmi b/icons/misc/HaineSpriteDump.dmi
index 2b2649386aba8..904f1d28455d4 100644
Binary files a/icons/misc/HaineSpriteDump.dmi and b/icons/misc/HaineSpriteDump.dmi differ
diff --git a/icons/misc/bigcritter.dmi b/icons/misc/bigcritter.dmi
index 27d61f3933849..524db75d47492 100644
Binary files a/icons/misc/bigcritter.dmi and b/icons/misc/bigcritter.dmi differ
diff --git a/icons/misc/exploration.dmi b/icons/misc/exploration.dmi
index e18b7416c015b..c7d5626c8a51a 100644
Binary files a/icons/misc/exploration.dmi and b/icons/misc/exploration.dmi differ
diff --git a/icons/mob/bingus.dmi b/icons/mob/bingus.dmi
new file mode 100644
index 0000000000000..71163881304bb
Binary files /dev/null and b/icons/mob/bingus.dmi differ
diff --git a/icons/mob/cruiser_ui.dmi b/icons/mob/cruiser_ui.dmi
index 140f42b79eaeb..bf1a76ebcb0a3 100644
Binary files a/icons/mob/cruiser_ui.dmi and b/icons/mob/cruiser_ui.dmi differ
diff --git a/icons/mob/dance_ui.dmi b/icons/mob/dance_ui.dmi
index ac3a1486b3c68..3dc90abc4994f 100644
Binary files a/icons/mob/dance_ui.dmi and b/icons/mob/dance_ui.dmi differ
diff --git a/icons/mob/ghost_drone.dmi b/icons/mob/ghost_drone.dmi
index 043b18e5e0737..13a238c711ec0 100644
Binary files a/icons/mob/ghost_drone.dmi and b/icons/mob/ghost_drone.dmi differ
diff --git a/icons/mob/ghost_observer_abilities.dmi b/icons/mob/ghost_observer_abilities.dmi
index 20173aaf37491..3f477f68fe014 100644
Binary files a/icons/mob/ghost_observer_abilities.dmi and b/icons/mob/ghost_observer_abilities.dmi differ
diff --git a/icons/mob/hud_human.dmi b/icons/mob/hud_human.dmi
index 773edb45b5641..a8326d8ded0aa 100644
Binary files a/icons/mob/hud_human.dmi and b/icons/mob/hud_human.dmi differ
diff --git a/icons/mob/hud_human_new.dmi b/icons/mob/hud_human_new.dmi
index 30c97331272f2..3ef938838b355 100644
Binary files a/icons/mob/hud_human_new.dmi and b/icons/mob/hud_human_new.dmi differ
diff --git a/icons/mob/hud_human_vapor.dmi b/icons/mob/hud_human_vapor.dmi
index 3ff13e3552b41..2926eccf89d04 100644
Binary files a/icons/mob/hud_human_vapor.dmi and b/icons/mob/hud_human_vapor.dmi differ
diff --git a/icons/mob/hud_pod.dmi b/icons/mob/hud_pod.dmi
index ec90021f75360..25a87064dd5c6 100644
Binary files a/icons/mob/hud_pod.dmi and b/icons/mob/hud_pod.dmi differ
diff --git a/icons/mob/inhand/hand_food.dmi b/icons/mob/inhand/hand_food.dmi
index ba604dd543e6e..64ca8dc33814d 100644
Binary files a/icons/mob/inhand/hand_food.dmi and b/icons/mob/inhand/hand_food.dmi differ
diff --git a/icons/mob/inhand/hand_guns.dmi b/icons/mob/inhand/hand_guns.dmi
index 66aab9b7a7438..e52258f51d73b 100644
Binary files a/icons/mob/inhand/hand_guns.dmi and b/icons/mob/inhand/hand_guns.dmi differ
diff --git a/icons/mob/inhand/hand_weapons.dmi b/icons/mob/inhand/hand_weapons.dmi
index ead29f0935e04..8afc6ae16a0b1 100644
Binary files a/icons/mob/inhand/hand_weapons.dmi and b/icons/mob/inhand/hand_weapons.dmi differ
diff --git a/icons/mob/notes.dmi b/icons/mob/notes.dmi
index bc11327119da4..224892acc95a2 100644
Binary files a/icons/mob/notes.dmi and b/icons/mob/notes.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 2178f8204a33e..ff0cedb20ef88 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi
index 9dad36bffbd3b..9e8d273179ef4 100644
Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
deleted file mode 100644
index 45a7682bfde6b..0000000000000
Binary files a/icons/mob/screen1_robot.dmi and /dev/null differ
diff --git a/icons/mob/whiteview.dmi b/icons/mob/whiteview.dmi
deleted file mode 100644
index b16a1fdadb232..0000000000000
Binary files a/icons/mob/whiteview.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/dp_vent_pump.dmi b/icons/obj/atmospherics/dp_vent_pump.dmi
index d1e6798977868..b2aa71aa9f338 100644
Binary files a/icons/obj/atmospherics/dp_vent_pump.dmi and b/icons/obj/atmospherics/dp_vent_pump.dmi differ
diff --git a/icons/obj/atmospherics/outlet_injector.dmi b/icons/obj/atmospherics/outlet_injector.dmi
index ec13244f69b9b..2546650f75874 100644
Binary files a/icons/obj/atmospherics/outlet_injector.dmi and b/icons/obj/atmospherics/outlet_injector.dmi differ
diff --git a/icons/obj/atmospherics/pump.dmi b/icons/obj/atmospherics/pump.dmi
index 677db9d35fa39..3ec0dfb81922e 100644
Binary files a/icons/obj/atmospherics/pump.dmi and b/icons/obj/atmospherics/pump.dmi differ
diff --git a/icons/obj/atmospherics/vent_pump.dmi b/icons/obj/atmospherics/vent_pump.dmi
index f4e93581e7a4b..2259a55938783 100644
Binary files a/icons/obj/atmospherics/vent_pump.dmi and b/icons/obj/atmospherics/vent_pump.dmi differ
diff --git a/icons/obj/atmospherics/vent_scrubber.dmi b/icons/obj/atmospherics/vent_scrubber.dmi
index 5f6cafaaa72df..2f5efa8c32208 100644
Binary files a/icons/obj/atmospherics/vent_scrubber.dmi and b/icons/obj/atmospherics/vent_scrubber.dmi differ
diff --git a/icons/obj/atmospherics/volume_pump.dmi b/icons/obj/atmospherics/volume_pump.dmi
index 88a7d18aec3d5..013f1e4f07fd8 100644
Binary files a/icons/obj/atmospherics/volume_pump.dmi and b/icons/obj/atmospherics/volume_pump.dmi differ
diff --git a/icons/obj/bots/medbots.dmi b/icons/obj/bots/medbots.dmi
index 454e80b9db7ec..af27b30303f55 100644
Binary files a/icons/obj/bots/medbots.dmi and b/icons/obj/bots/medbots.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 19f3a58773fe6..eb9ec4b0b0f19 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/item_masks.dmi b/icons/obj/clothing/item_masks.dmi
index 4fd5fd4b9fe50..a3503dcbb317b 100644
Binary files a/icons/obj/clothing/item_masks.dmi and b/icons/obj/clothing/item_masks.dmi differ
diff --git a/icons/obj/clothing/overcoats/item_suit.dmi b/icons/obj/clothing/overcoats/item_suit.dmi
index 50415c117de98..2df840758c37d 100644
Binary files a/icons/obj/clothing/overcoats/item_suit.dmi and b/icons/obj/clothing/overcoats/item_suit.dmi differ
diff --git a/icons/obj/clothing/overcoats/item_suit_hazard.dmi b/icons/obj/clothing/overcoats/item_suit_hazard.dmi
index d2c8f589f5c52..a289b9b79a8b2 100644
Binary files a/icons/obj/clothing/overcoats/item_suit_hazard.dmi and b/icons/obj/clothing/overcoats/item_suit_hazard.dmi differ
diff --git a/icons/obj/decoration.dmi b/icons/obj/decoration.dmi
index 30aa09d3ce3f7..5a8cb0d2ce705 100644
Binary files a/icons/obj/decoration.dmi and b/icons/obj/decoration.dmi differ
diff --git a/icons/obj/doors/Door1.dmi b/icons/obj/doors/Door1.dmi
index 704769812fbde..7869bf2d2df0b 100644
Binary files a/icons/obj/doors/Door1.dmi and b/icons/obj/doors/Door1.dmi differ
diff --git a/icons/obj/doors/Doorcom.dmi b/icons/obj/doors/Doorcom.dmi
index f16e1365fdb01..de264bb9efaf8 100644
Binary files a/icons/obj/doors/Doorcom.dmi and b/icons/obj/doors/Doorcom.dmi differ
diff --git a/icons/obj/fluid.dmi b/icons/obj/fluid.dmi
index 5d97b442c94e8..77f71c6248bc8 100644
Binary files a/icons/obj/fluid.dmi and b/icons/obj/fluid.dmi differ
diff --git a/icons/obj/foodNdrink/bottle.dmi b/icons/obj/foodNdrink/bottle.dmi
index 267f56e2feb62..c20804dcc88f1 100644
Binary files a/icons/obj/foodNdrink/bottle.dmi and b/icons/obj/foodNdrink/bottle.dmi differ
diff --git a/icons/obj/foodNdrink/bread_inhand.dmi b/icons/obj/foodNdrink/bread_inhand.dmi
index 9f59b348e9619..734adba5bd471 100644
Binary files a/icons/obj/foodNdrink/bread_inhand.dmi and b/icons/obj/foodNdrink/bread_inhand.dmi differ
diff --git a/icons/obj/foodNdrink/food_candy.dmi b/icons/obj/foodNdrink/food_candy.dmi
index afa90f3dc7186..b752e12f9bab3 100644
Binary files a/icons/obj/foodNdrink/food_candy.dmi and b/icons/obj/foodNdrink/food_candy.dmi differ
diff --git a/icons/obj/foodNdrink/food_dessert.dmi b/icons/obj/foodNdrink/food_dessert.dmi
index 245d2735bd07c..0f8a7f7205377 100644
Binary files a/icons/obj/foodNdrink/food_dessert.dmi and b/icons/obj/foodNdrink/food_dessert.dmi differ
diff --git a/icons/obj/foodNdrink/food_ingredient.dmi b/icons/obj/foodNdrink/food_ingredient.dmi
index 0aea2daab11e5..3275400c7b4ce 100644
Binary files a/icons/obj/foodNdrink/food_ingredient.dmi and b/icons/obj/foodNdrink/food_ingredient.dmi differ
diff --git a/icons/obj/foodNdrink/food_meals.dmi b/icons/obj/foodNdrink/food_meals.dmi
index f61a73f569b7e..edc6dc3f8f33b 100644
Binary files a/icons/obj/foodNdrink/food_meals.dmi and b/icons/obj/foodNdrink/food_meals.dmi differ
diff --git a/icons/obj/furniture/bench_purple.dmi b/icons/obj/furniture/bench_purple.dmi
new file mode 100644
index 0000000000000..ef5fff82fb2c6
Binary files /dev/null and b/icons/obj/furniture/bench_purple.dmi differ
diff --git a/icons/obj/furniture/cabinet.dmi b/icons/obj/furniture/cabinet.dmi
index 367e718a1cae0..f531e54eceb63 100644
Binary files a/icons/obj/furniture/cabinet.dmi and b/icons/obj/furniture/cabinet.dmi differ
diff --git a/icons/obj/furniture/chairs.dmi b/icons/obj/furniture/chairs.dmi
index b735d35fdfbf3..d446283390b82 100644
Binary files a/icons/obj/furniture/chairs.dmi and b/icons/obj/furniture/chairs.dmi differ
diff --git a/icons/obj/hydroponics/hydroponics.dmi b/icons/obj/hydroponics/hydroponics.dmi
index e1bc33fd51000..af8a568d0668a 100644
Binary files a/icons/obj/hydroponics/hydroponics.dmi and b/icons/obj/hydroponics/hydroponics.dmi differ
diff --git a/icons/obj/items/chemistry_glassware.dmi b/icons/obj/items/chemistry_glassware.dmi
new file mode 100644
index 0000000000000..d3b8aad43cdde
Binary files /dev/null and b/icons/obj/items/chemistry_glassware.dmi differ
diff --git a/icons/obj/items/disks.dmi b/icons/obj/items/disks.dmi
index fe9c1ee0e2996..6c17eccb6d688 100644
Binary files a/icons/obj/items/disks.dmi and b/icons/obj/items/disks.dmi differ
diff --git a/icons/obj/items/guns/energy.dmi b/icons/obj/items/guns/energy.dmi
index cf9c80f58b23e..431f6585e33fa 100644
Binary files a/icons/obj/items/guns/energy.dmi and b/icons/obj/items/guns/energy.dmi differ
diff --git a/icons/obj/items/pills.dmi b/icons/obj/items/pills.dmi
index a1b567298670e..f51b6dc71a676 100644
Binary files a/icons/obj/items/pills.dmi and b/icons/obj/items/pills.dmi differ
diff --git a/icons/obj/items/randomkeys.dmi b/icons/obj/items/randomkeys.dmi
index bca952b50c479..9d5678440e6c8 100644
Binary files a/icons/obj/items/randomkeys.dmi and b/icons/obj/items/randomkeys.dmi differ
diff --git a/icons/obj/items/storage.dmi b/icons/obj/items/storage.dmi
index 7b9358c5e8805..9e856a497b6af 100644
Binary files a/icons/obj/items/storage.dmi and b/icons/obj/items/storage.dmi differ
diff --git a/icons/obj/items/weapons.dmi b/icons/obj/items/weapons.dmi
index 882e5aff791fa..df3f92d39232d 100644
Binary files a/icons/obj/items/weapons.dmi and b/icons/obj/items/weapons.dmi differ
diff --git a/icons/obj/large/32x96.dmi b/icons/obj/large/32x96.dmi
index 8c9bb66494dd0..f5deb3c11521a 100644
Binary files a/icons/obj/large/32x96.dmi and b/icons/obj/large/32x96.dmi differ
diff --git a/icons/obj/line.dmi b/icons/obj/line.dmi
index 8c7adc7d53437..580898cb73062 100644
Binary files a/icons/obj/line.dmi and b/icons/obj/line.dmi differ
diff --git a/icons/obj/machines/heavy_fiber.dmi b/icons/obj/machines/heavy_fiber.dmi
index 8f8635b3c062b..f13d9d3dd8b3e 100644
Binary files a/icons/obj/machines/heavy_fiber.dmi and b/icons/obj/machines/heavy_fiber.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index e25b17f178a06..f6c6bd6c332a9 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 12b90433a567c..a2ec0eb50d5fb 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/robot_parts.dmi b/icons/obj/robot_parts.dmi
index e40d78840c08a..6fb9a9d0f2bad 100644
Binary files a/icons/obj/robot_parts.dmi and b/icons/obj/robot_parts.dmi differ
diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi
index fb7b921c7eaf9..b47802cbe360f 100644
Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 0e31a3add02cb..9386c14f98fdc 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 16bd9bdb33156..c361ab80214cf 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/construction_floors.dmi b/icons/turf/construction_floors.dmi
index 856fea0a39f5e..7fe5b7e41f908 100644
Binary files a/icons/turf/construction_floors.dmi and b/icons/turf/construction_floors.dmi differ
diff --git a/icons/turf/construction_walls.dmi b/icons/turf/construction_walls.dmi
index f836bde5e1785..5cf8766d65256 100644
Binary files a/icons/turf/construction_walls.dmi and b/icons/turf/construction_walls.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 5193ead6546fa..b79389204e963 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/ui/statussystem.dmi b/icons/ui/statussystem.dmi
index a0e0309a773ea..b7c8d9518d063 100644
Binary files a/icons/ui/statussystem.dmi and b/icons/ui/statussystem.dmi differ
diff --git a/maps/artemis/arjuna.dmm b/maps/artemis/arjuna.dmm
index 8742a657724ed..bfc24b5ee4a75 100644
--- a/maps/artemis/arjuna.dmm
+++ b/maps/artemis/arjuna.dmm
@@ -227,7 +227,7 @@
 /area/ship/arjuna)
 "qD" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/blue/checker,
 /area/ship/arjuna)
 "rc" = (
@@ -358,7 +358,7 @@
 "Ak" = (
 /obj/storage/closet/biohazard,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /turf/simulated/floor/engine,
 /area/ship/arjuna)
 "AA" = (
diff --git a/maps/artemis/artemis.dmm b/maps/artemis/artemis.dmm
index c10346008f53f..4354794638571 100644
--- a/maps/artemis/artemis.dmm
+++ b/maps/artemis/artemis.dmm
@@ -130,7 +130,7 @@
 /area/ship/artemis)
 "lI" = (
 /obj/rack,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/black,
 /area/ship/artemis)
@@ -350,7 +350,7 @@
 /area/ship/artemis)
 "wN" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/blue/checker,
 /area/ship/artemis)
 "wY" = (
diff --git a/maps/artemis/manta.dmm b/maps/artemis/manta.dmm
index d74c755147595..ecb9e3f6e5cfb 100644
--- a/maps/artemis/manta.dmm
+++ b/maps/artemis/manta.dmm
@@ -472,7 +472,7 @@
 /area/ship/manta)
 "JO" = (
 /obj/rack,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/black,
 /area/ship/manta)
@@ -512,7 +512,7 @@
 /area/ship/manta)
 "MW" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/blue/checker,
 /area/ship/manta)
 "Oi" = (
diff --git a/maps/artemis/planets.dmm b/maps/artemis/planets.dmm
index a792c2b1b6530..c2e20c5338e36 100644
--- a/maps/artemis/planets.dmm
+++ b/maps/artemis/planets.dmm
@@ -361,7 +361,7 @@
 /area/ship/artemis)
 "iV" = (
 /obj/rack,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/black,
 /area/ship/artemis)
@@ -801,7 +801,7 @@
 /area/ship/artemis)
 "uZ" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/blue/checker,
 /area/ship/artemis)
 "vc" = (
@@ -941,7 +941,7 @@
 /area/space)
 "Ae" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/blue/checker,
 /area/ship/arjuna)
 "Ai" = (
@@ -1914,7 +1914,7 @@
 "YO" = (
 /obj/storage/closet/biohazard,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /turf/simulated/floor/engine,
 /area/ship/arjuna)
 "YR" = (
diff --git a/maps/atlas.dmm b/maps/atlas.dmm
index 6e6f2883039b4..3d045015f8605 100644
--- a/maps/atlas.dmm
+++ b/maps/atlas.dmm
@@ -479,6 +479,10 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar2";
+	name = "North Solars"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/engine/substation/west)
 "abY" = (
@@ -897,6 +901,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar";
+	name = "North Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "adb" = (
@@ -915,6 +923,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar";
+	name = "North Solars"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/west)
 "add" = (
@@ -1843,6 +1855,10 @@
 /area/station/medical/morgue)
 "afX" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmerch";
+	name = "North Merchant Dock"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/hallway/primary/south)
 "afZ" = (
@@ -2339,7 +2355,12 @@
 /area/station/hallway/primary/west)
 "ahF" = (
 /obj/table/auto,
-/obj/item/storage/box/cutlery,
+/obj/item/storage/box/cutlery{
+	pixel_x = 8
+	},
+/obj/item/storage/box/popsicle_sticks{
+	pixel_x = -7
+	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
 "ahG" = (
@@ -3135,7 +3156,7 @@
 /area/station/hallway/primary/south)
 "akj" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/white/side{
 	dir = 4
 	},
@@ -5591,6 +5612,11 @@
 	icon_state = "1-2"
 	},
 /obj/mapping_helper/access/teleporter,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "teleporter"
+	},
 /turf/simulated/floor/black,
 /area/station/teleporter)
 "atz" = (
@@ -5656,6 +5682,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/ai_upload,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "core"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai)
 "atG" = (
@@ -5913,6 +5944,11 @@
 	dir = 4;
 	level = -1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/blue,
 /area/station/bridge)
 "auo" = (
@@ -6720,6 +6756,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "south"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/engineering)
 "awE" = (
@@ -7191,6 +7232,11 @@
 /obj/decal/tile_edge/stripe/extra_big{
 	icon_state = "delivery2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai)
 "axU" = (
@@ -7334,6 +7380,11 @@
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
 /obj/disposalpipe/segment,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "meetingroom"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge/united_command)
 "ayt" = (
@@ -8196,6 +8247,11 @@
 	},
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solars";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/engine/substation/east)
 "aBu" = (
@@ -8680,6 +8736,10 @@
 "aCX" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/mining,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/mining/staff_room)
 "aCY" = (
@@ -9118,6 +9178,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solars";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/engine/substation/east)
 "aEc" = (
@@ -9671,7 +9736,7 @@
 /area/station/medical/robotics)
 "aFH" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -10313,6 +10378,10 @@
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/mining,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/mining/staff_room)
 "aHJ" = (
@@ -10339,6 +10408,10 @@
 /area/station/janitor/office)
 "aHN" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southmerch";
+	name = "South Merchant Dock"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/hangar/main)
 "aHO" = (
@@ -10473,6 +10546,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solars";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/southeast)
 "aIx" = (
@@ -10494,6 +10572,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solars";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "aIz" = (
@@ -10848,6 +10931,11 @@
 "aKb" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/hangar/arrivals)
 "aKc" = (
@@ -11065,6 +11153,11 @@
 /area/station/hangar/arrivals)
 "aKJ" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/hangar/arrivals)
 "aKK" = (
@@ -12046,6 +12139,7 @@
 	layer = 9.1;
 	pixel_x = -10
 	},
+/obj/item/pinpointer/disk,
 /turf/simulated/floor/airless/circuit/red,
 /area/listeningpost)
 "aOi" = (
@@ -13848,6 +13942,11 @@
 	dir = 4;
 	name = "Engine Room"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "sw"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
 "aUa" = (
@@ -15792,6 +15891,11 @@
 /obj/cable/orange{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "se"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
 "bie" = (
@@ -15884,6 +15988,11 @@
 	},
 /obj/machinery/door/airlock/pyro/security/alt,
 /obj/mapping_helper/access/security,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/security/secwing)
 "bAx" = (
@@ -16606,6 +16715,11 @@
 	dir = 4;
 	level = -1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/blue,
 /area/station/bridge/customs)
 "fiL" = (
@@ -16630,6 +16744,11 @@
 	dir = 4;
 	name = "Engine Room"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "nw"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
 "fvg" = (
@@ -16947,6 +17066,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "north"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/engineering)
 "hpN" = (
@@ -16971,6 +17095,11 @@
 	dir = 4;
 	pixel_x = -20
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/blue,
 /area/station/bridge/customs)
 "hto" = (
@@ -17085,6 +17214,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/red/side{
 	dir = 8
 	},
@@ -17835,6 +17969,11 @@
 /obj/cable/orange{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "ne"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
 "mlP" = (
@@ -18064,6 +18203,10 @@
 /obj/cable/yellow{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar2";
+	name = "North Solars"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/engine/substation/west)
 "nrH" = (
@@ -18335,6 +18478,30 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/west)
+"oOs" = (
+/obj/machinery/door/airlock/pyro/command/alt{
+	dir = 4;
+	name = "AI Upload Chamber"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/access/ai_upload,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/secscanner{
+	dir = 4;
+	pixel_x = -20
+	},
+/obj/decal/tile_edge/stripe/extra_big{
+	icon_state = "delivery2"
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/black,
+/area/station/turret_protected/ai)
 "oPh" = (
 /obj/machinery/power/apc/autoname_west,
 /obj/cable{
@@ -19345,6 +19512,11 @@
 /obj/disposalpipe/segment/ejection{
 	dir = 8
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "tNm" = (
@@ -61691,7 +61863,7 @@ aGw
 aqD
 aqD
 aqD
-axT
+oOs
 aqD
 aqD
 aqD
diff --git a/maps/clarion.dmm b/maps/clarion.dmm
index f638237b13b7e..97b6891bd65fe 100644
--- a/maps/clarion.dmm
+++ b/maps/clarion.dmm
@@ -360,16 +360,6 @@
 "abJ" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/maintenance/northwest)
-"abK" = (
-/obj/stool/chair/office/blue{
-	dir = 1
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/black,
-/area/station/hallway/secondary/exit)
 "abL" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -886,17 +876,6 @@
 	icon_state = "fblue2"
 	},
 /area/station/hallway/secondary/exit)
-"aek" = (
-/obj/table,
-/obj/item/storage/toolbox/emergency,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fblue2"
-	},
-/area/station/hallway/secondary/exit)
 "ael" = (
 /obj/machinery/vending/snack,
 /obj/machinery/light{
@@ -1257,6 +1236,16 @@
 /area/station/crew_quarters/quartersA{
 	name = "Crew Quarters M03"
 	})
+"agA" = (
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/obj/storage/secure/closet/research/chemical,
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/science/chemistry)
 "agG" = (
 /obj/disposalpipe/segment,
 /obj/machinery/light/emergency{
@@ -2004,19 +1993,6 @@
 /obj/machinery/portable_reclaimer,
 /turf/simulated/floor/grey/whitegrime/other,
 /area/station/storage/primary)
-"ajN" = (
-/obj/table/reinforced/auto,
-/obj/item/sheet/glass/fullstack,
-/obj/item/sheet/glass/fullstack,
-/obj/item/storage/box/cablesbox,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/storage/toolbox/electrical,
-/obj/item/device/light/flashlight,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/grey/whitegrime/other,
-/area/station/storage/primary)
 "ajO" = (
 /obj/landmark/shuttle_subwoofer,
 /turf/space,
@@ -2024,19 +2000,6 @@
 "ajR" = (
 /turf/simulated/floor/black,
 /area/station/hangar/sec)
-"ajS" = (
-/obj/disposalpipe/segment/mail,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/redblack{
-	dir = 4
-	},
-/area/station/hangar/sec)
 "ajT" = (
 /obj/machinery/vending/pda,
 /turf/simulated/floor/black,
@@ -2961,15 +2924,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
-"anE" = (
-/obj/machinery/light,
-/obj/machinery/vehicle/miniputt,
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/engine,
-/area/station/hangar/main)
 "anL" = (
 /obj/disposalpipe/segment/mail{
 	dir = 1;
@@ -5065,19 +5019,6 @@
 	icon_state = "fgreen2"
 	},
 /area/station/chapel/funeral_parlor)
-"avF" = (
-/obj/machinery/door/window/northright{
-	req_access_txt = "22"
-	},
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/carpet{
-	dir = 5;
-	icon_state = "fgreen2"
-	},
-/area/station/chapel/funeral_parlor)
 "avH" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -5180,17 +5121,6 @@
 /obj/window/reinforced/south,
 /turf/simulated/floor/grass/random,
 /area/station/hydroponics/bay)
-"avZ" = (
-/obj/disposalpipe/segment,
-/obj/machinery/hydro_growlamp,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/green/side{
-	dir = 8
-	},
-/area/station/hydroponics/bay)
 "awb" = (
 /obj/machinery/light/emergency{
 	dir = 4;
@@ -5497,13 +5427,6 @@
 	},
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/crematorium)
-"axi" = (
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/crematorium)
 "axj" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -5584,16 +5507,6 @@
 "axE" = (
 /turf/simulated/floor/grass/leafy,
 /area/station/ranch)
-"axF" = (
-/obj/storage/closet/office,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/redblack{
-	dir = 9
-	},
-/area/station/security/detectives_office)
 "axH" = (
 /obj/machinery/light_switch/north{
 	pixel_y = 28
@@ -5691,17 +5604,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/central)
-"ayi" = (
-/obj/decal/tile_edge/line/green{
-	dir = 6;
-	icon_state = "line2"
-	},
-/obj/machinery/alarm{
-	dir = 1;
-	pixel_y = -15
-	},
-/turf/simulated/floor/grass/random,
-/area/station/hydroponics/bay)
 "ayj" = (
 /turf/simulated/floor/green/side{
 	dir = 10
@@ -5929,23 +5831,6 @@
 	icon_state = "purple2"
 	},
 /area/station/janitor/office)
-"azi" = (
-/obj/machinery/light{
-	dir = 4;
-	pixel_x = 10
-	},
-/obj/rack,
-/obj/item/mop,
-/obj/item/mop,
-/obj/item/storage/box/mousetraps,
-/obj/item/spraybottle/cleaner,
-/obj/item/spraybottle/cleaner,
-/obj/item/reagent_containers/glass/bucket,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/specialroom/arcade,
-/area/station/janitor/office)
 "azj" = (
 /obj/storage/closet/coffin,
 /obj/machinery/light{
@@ -6100,7 +5985,7 @@
 /area/station/crew_quarters/kitchen)
 "azI" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/disposal/small{
 	dir = 1;
 	name = "food delivery unit-'Brig'";
@@ -6551,6 +6436,25 @@
 	},
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
+"aBw" = (
+/obj/disposalpipe/segment/mail{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/decal/tile_edge/line/purple{
+	dir = 8;
+	icon_state = "line1"
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor,
+/area/station/hangar/science)
 "aBz" = (
 /obj/machinery/atmospherics/pipe/simple/junction{
 	dir = 1
@@ -7269,19 +7173,6 @@
 /area/station/chapel/sanctuary{
 	name = "Community Center"
 	})
-"aEr" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname  - SS13";
-	pixel_x = 10
-	},
-/obj/reagent_dispensers/still,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/bar)
 "aEs" = (
 /obj/fireworksbox,
 /turf/simulated/floor/black,
@@ -8229,16 +8120,6 @@
 	icon_state = "fred2"
 	},
 /area/station/science/lobby)
-"aIS" = (
-/obj/machinery/vending/snack,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fred2"
-	},
-/area/station/science/lobby)
 "aIT" = (
 /obj/disposalpipe/trunk,
 /obj/machinery/disposal/small{
@@ -9746,7 +9627,7 @@
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/pharmacy)
 "aQP" = (
-/obj/stool/bench/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple,
 /area/station/hallway/secondary/central)
 "aQQ" = (
@@ -9754,7 +9635,7 @@
 	dir = 1;
 	pixel_y = 21
 	},
-/obj/stool/bench/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple,
 /area/station/hallway/secondary/central)
 "aQR" = (
@@ -9780,14 +9661,6 @@
 	dir = 1
 	},
 /area/station/hallway/secondary/central)
-"aRt" = (
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/hallway/primary/east)
 "aRu" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -10268,19 +10141,6 @@
 /obj/machinery/portable_atmospherics/scrubber,
 /turf/simulated/floor/caution/south,
 /area/station/science/lab)
-"aTk" = (
-/obj/rack,
-/obj/item/storage/toolbox/emergency,
-/obj/item/reagent_containers/glass/bucket,
-/obj/item/wrench,
-/obj/item/device/light/glowstick,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/mask/gas/emergency,
-/obj/item/extinguisher,
-/obj/item/chem_grenade/firefighting,
-/obj/item/chem_grenade/firefighting,
-/turf/simulated/floor/caution/south,
-/area/station/science/lab)
 "aTG" = (
 /obj/disposalpipe/segment,
 /obj/table/round,
@@ -10830,18 +10690,6 @@
 	},
 /turf/simulated/floor/blue/checker,
 /area/station/medical/research)
-"aWz" = (
-/obj/disposalpipe/segment/mail,
-/obj/table/auto,
-/obj/item/decoration/flower_vase,
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/redblack{
-	dir = 4
-	},
-/area/station/hallway/secondary/central)
 "aWE" = (
 /obj/machinery/disposal/brig,
 /obj/disposalpipe/trunk/brig,
@@ -10933,22 +10781,6 @@
 	dir = 8
 	},
 /area/station/hallway/primary/east)
-"aWZ" = (
-/obj/decal/fakeobjects{
-	density = 1;
-	desc = "What was this thing even supposed to do?";
-	icon = 'icons/obj/machines/nuclear.dmi';
-	icon_state = "engineoff";
-	name = "Active Particle Phase Matrix"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/orangeblack/side/white{
-	dir = 8
-	},
-/area/station/science/teleporter)
 "aXa" = (
 /obj/machinery/lrteleporter{
 	layer = 3
@@ -11963,14 +11795,6 @@
 	},
 /turf/simulated/floor,
 /area/station/science/bot_storage)
-"bch" = (
-/obj/reagent_dispensers/fueltank,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor,
-/area/station/science/lab)
 "bci" = (
 /obj/machinery/dispenser{
 	o2tanks = 5;
@@ -12741,47 +12565,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/east)
-"bhK" = (
-/obj/machinery/light/emergency{
-	dir = 1;
-	pixel_y = 21
-	},
-/obj/machinery/chemicompiler_stationary,
-/obj/item/storage/wall/fire{
-	dir = 1;
-	pixel_y = 30
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 1
-	},
-/area/station/science/chemistry)
-"bhM" = (
-/obj/machinery/light{
-	dir = 1;
-	pixel_y = 21
-	},
-/obj/machinery/chem_dispenser/chemical,
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/storage/wall/emergency{
-	pixel_y = 30
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 1
-	},
-/area/station/science/chemistry)
-"bhN" = (
-/obj/machinery/light_switch/north,
-/obj/machinery/chem_master,
-/obj/decal/poster/wallsign/poster_ptoe{
-	pixel_y = 32
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 5
-	},
-/area/station/science/chemistry)
 "bhW" = (
 /obj/disposalpipe/segment,
 /obj/storage/closet/fire,
@@ -12928,15 +12711,6 @@
 "bjg" = (
 /turf/simulated/floor/black,
 /area/station/science/chemistry)
-"bjh" = (
-/obj/stool/chair/office/purple{
-	dir = 1
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
 "bji" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -13104,29 +12878,6 @@
 	},
 /turf/simulated/floor/specialroom/gym,
 /area/station/crew_quarters/fitness)
-"bks" = (
-/obj/machinery/phone,
-/obj/table/reinforced/chemistry/auto/basicsup,
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
-"bkt" = (
-/obj/disposalpipe/segment{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/obj/storage/crate{
-	desc = "Wow! Crate may or may not still contain bottles.";
-	name = "Bottles in a Crate"
-	},
-/obj/item/reagent_containers/food/drinks/fueltank,
-/obj/item/reagent_containers/food/drinks/fueltank,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/science/chemistry)
 "bkv" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -13286,45 +13037,6 @@
 	},
 /turf/space,
 /area/space)
-"blB" = (
-/obj/disposalpipe/trunk/mail{
-	dir = 8
-	},
-/obj/machinery/disposal/mail/small{
-	dir = 4;
-	mail_tag = "chemistry";
-	mailgroup = "science";
-	message = "1";
-	name = "mail chute-'Chemistry'"
-	},
-/obj/machinery/chem_heater/chemistry,
-/obj/table/reinforced/chemistry/auto/clericalsup,
-/turf/simulated/floor/purpleblack{
-	dir = 8
-	},
-/area/station/science/chemistry)
-"blD" = (
-/obj/item/paper/labdrawertips,
-/obj/table/reinforced/chemistry/auto/auxsup,
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
-"blE" = (
-/obj/disposalpipe/segment,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname  - SS13";
-	pixel_x = 10
-	},
-/obj/table/reinforced/chemistry/auto,
-/obj/blind_switch/area/east{
-	dir = 4
-	},
-/obj/machinery/chem_heater/chemistry,
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/science/chemistry)
 "blG" = (
 /obj/machinery/disposal/mail{
 	mail_tag = "artlab";
@@ -13460,48 +13172,12 @@
 	},
 /turf/simulated/floor/black,
 /area/station/teleporter)
-"bmO" = (
-/obj/machinery/light{
-	dir = 8;
-	pixel_x = -10
-	},
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/chem_dispenser/chemical,
-/obj/item/reagent_containers/glass/beaker/large,
-/turf/simulated/floor/purpleblack{
-	dir = 8
-	},
-/area/station/science/chemistry)
-"bmP" = (
-/obj/stool/chair/office/purple{
-	dir = 8
-	},
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
-"bmQ" = (
-/obj/machinery/glass_recycler/chemistry,
-/obj/table/reinforced/chemistry/auto/firstaid,
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
 "bmR" = (
 /obj/stool/chair/office/purple{
 	dir = 4
 	},
 /turf/simulated/floor/black,
 /area/station/science/chemistry)
-"bmS" = (
-/obj/disposalpipe/segment,
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/chem_dispenser/chemical,
-/obj/machinery/door_control{
-	id = "chemblast";
-	name = "Chemistry Blast Shield Control";
-	pixel_x = 24
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/science/chemistry)
 "bmX" = (
 /turf/simulated/floor/grime,
 /area/station/science/artifact)
@@ -13577,50 +13253,6 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/hangar/main)
-"bnJ" = (
-/obj/table/round,
-/obj/item/storage/toolbox/emergency,
-/turf/simulated/floor/purpleblack/corner{
-	dir = 8
-	},
-/area/station/hallway/primary/east)
-"bnK" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/chem_master{
-	dir = 4;
-	pixel_x = -4
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 8
-	},
-/area/station/science/chemistry)
-"bnL" = (
-/obj/disposalpipe/segment{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/purpleblack/corner{
-	dir = 5
-	},
-/area/station/science/chemistry)
-"bnM" = (
-/obj/disposalpipe/segment{
-	dir = 8;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/light{
-	dir = 4;
-	pixel_x = 10
-	},
-/obj/table/reinforced/chemistry/auto,
-/obj/window/reinforced/south,
-/obj/submachine/chem_extractor{
-	dir = 8
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 6
-	},
-/area/station/science/chemistry)
 "bnO" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -13849,6 +13481,10 @@
 	pixel_y = 21
 	},
 /obj/storage/cart/trash,
+/obj/machinery/power/apc/autoname_north,
+/obj/cable{
+	icon_state = "0-2"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "boU" = (
@@ -13921,21 +13557,6 @@
 	icon_state = "yellowblack"
 	},
 /area/station/hallway/primary/east)
-"bpj" = (
-/obj/table/reinforced/chemistry/auto/drugs,
-/obj/machinery/chem_shaker/large/chemistry,
-/turf/simulated/floor/purpleblack{
-	dir = 10
-	},
-/area/station/science/chemistry)
-"bpk" = (
-/obj/table/reinforced/chemistry/auto,
-/turf/simulated/floor/purpleblack,
-/area/station/science/chemistry)
-"bpl" = (
-/obj/storage/secure/closet/research/chemical,
-/turf/simulated/floor/purpleblack,
-/area/station/science/chemistry)
 "bpm" = (
 /obj/machinery/disposal/small,
 /obj/disposalpipe/trunk{
@@ -14140,14 +13761,7 @@
 /area/station/storage/tech)
 "bqF" = (
 /obj/machinery/light/small,
-/obj/rack,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/powermonitor_smes,
-/obj/item/circuitboard/genetics,
-/obj/item/circuitboard/qmorder,
-/obj/item/circuitboard/telescope,
+/obj/rack/organized/techstorage_eng,
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "bqG" = (
@@ -14951,25 +14565,6 @@
 	dir = 5
 	},
 /area/station/quartermaster/office)
-"buU" = (
-/obj/disposalpipe/segment/mail{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/decal/tile_edge/line/purple{
-	dir = 8;
-	icon_state = "line1"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor,
-/area/station/hangar/science)
 "buV" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -15150,6 +14745,20 @@
 	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
+"bvZ" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/machinery/portable_reclaimer,
+/obj/decal/stripe_caution,
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 4
+	},
+/area/station/mining/staff_room)
 "bwb" = (
 /obj/storage/crate,
 /obj/decal/tile_edge/line/yellow{
@@ -15780,13 +15389,6 @@
 "bzU" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/gas)
-"bzX" = (
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/plating,
-/area/station/engine/gas)
 "bzY" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/engine/gas)
@@ -16001,17 +15603,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/quartermaster/storage)
-"bDd" = (
-/obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/mask/gas/emergency,
-/obj/item/clothing/head/helmet/firefighter,
-/obj/item/tank/air,
-/obj/item/extinguisher,
-/obj/item/crowbar,
-/obj/item/device/light/flashlight,
-/turf/simulated/floor,
-/area/station/engine/substation/east)
 "bDe" = (
 /obj/machinery/power/smes{
 	chargelevel = 15000;
@@ -16277,19 +15868,6 @@
 "bGF" = (
 /turf/simulated/floor,
 /area/station/mining/staff_room)
-"bGH" = (
-/obj/table/reinforced/auto,
-/obj/item/clothing/under/rank/mechanic,
-/obj/item/crowbar,
-/obj/item/clothing/gloves/yellow/unsulated,
-/obj/item/reagent_containers/food/drinks/fueltank,
-/obj/item/clothing/shoes/magnetic,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/plating,
-/area/station/hangar/qm)
 "bGS" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -16331,6 +15909,19 @@
 /obj/item/hand_labeler,
 /turf/simulated/floor/plating,
 /area/station/hangar/qm)
+"bHp" = (
+/obj/table/reinforced/auto,
+/obj/item/sheet/glass/fullstack,
+/obj/item/sheet/glass/fullstack,
+/obj/item/storage/box/cablesbox,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/storage/toolbox/electrical,
+/obj/item/device/light/flashlight,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/grey/whitegrime/other,
+/area/station/storage/primary)
 "bHD" = (
 /obj/table/reinforced/auto,
 /obj/item/sheet/steel{
@@ -17416,10 +17007,6 @@
 /obj/item/light/tube,
 /turf/simulated/floor/plating/random,
 /area/ghostdrone_factory)
-"bMS" = (
-/obj/machinery/drainage/big,
-/turf/simulated/floor/black,
-/area/station/science/chemistry)
 "bNd" = (
 /obj/disposalpipe/segment/mail,
 /obj/storage/crate/freezer,
@@ -17541,6 +17128,12 @@
 	icon_state = "catwalk_cross"
 	},
 /area/mining/magnet)
+"bOS" = (
+/obj/item/storage/wall/emergency{
+	dir = 8
+	},
+/turf/simulated/wall/auto/supernorn,
+/area/station/science/chemistry)
 "bPm" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -17641,6 +17234,10 @@
 /area/station/chapel/sanctuary{
 	name = "Community Center"
 	})
+"bSl" = (
+/obj/table/reinforced/chemistry/auto/auxsup,
+/turf/simulated/floor/black,
+/area/station/science/chemistry)
 "bSw" = (
 /obj/decal/stripe_delivery,
 /turf/simulated/floor/bluewhite{
@@ -17976,16 +17573,17 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
-"cdG" = (
-/obj/stool/bench/yellow/auto,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
+"cdu" = (
+/obj/machinery/light{
+	dir = 8;
+	pixel_x = -10
 	},
-/turf/unsimulated/floor/orangeblack/side{
+/obj/table/reinforced/chemistry/auto/firstaid,
+/obj/machinery/chem_shaker/large/chemistry,
+/turf/simulated/floor/purpleblack{
 	dir = 8
 	},
-/area/station/crewquarters/cryotron)
+/area/station/science/chemistry)
 "cdV" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -18021,6 +17619,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsubstation";
+	name = "West Substation"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
 "ceB" = (
@@ -18188,6 +17790,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engine Room";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
 "clS" = (
@@ -18447,6 +18054,16 @@
 	dir = 1
 	},
 /area/station/hydroponics/bay)
+"cwK" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-4"
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/hallway/primary/east)
 "cwP" = (
 /obj/cable/yellow,
 /obj/machinery/power/terminal{
@@ -18531,6 +18148,24 @@
 	dir = 1
 	},
 /area/station/hallway/secondary/central)
+"cAD" = (
+/obj/storage/crate{
+	desc = "A crate of confiscated items.";
+	name = "Contraband"
+	},
+/obj/item/storage/pill_bottle/cyberpunk,
+/obj/item/instrument/vuvuzela,
+/obj/item/bananapeel,
+/obj/item/item_box/no{
+	pixel_x = 8;
+	pixel_y = -5
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/caution/corner/sw,
+/area/station/security/main)
 "cBh" = (
 /obj/machinery/firealarm/east,
 /obj/table/reinforced/auto,
@@ -18885,6 +18520,23 @@
 	icon_state = "fblue2"
 	},
 /area/station/hallway/secondary/central)
+"cRS" = (
+/obj/machinery/light{
+	dir = 4;
+	pixel_x = 10
+	},
+/obj/rack,
+/obj/item/mop,
+/obj/item/mop,
+/obj/item/storage/box/mousetraps,
+/obj/item/spraybottle/cleaner,
+/obj/item/spraybottle/cleaner,
+/obj/item/reagent_containers/glass/bucket,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/specialroom/arcade,
+/area/station/janitor/office)
 "cSn" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -19416,6 +19068,22 @@
 	},
 /turf/simulated/floor/black/side,
 /area/station/engine/inner)
+"dpC" = (
+/obj/machinery/light/emergency,
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/obj/table/wood/auto,
+/obj/item/storage/photo_album{
+	pixel_y = -10
+	},
+/obj/item/pinpointer/disk,
+/obj/item/camera{
+	pixel_y = 6
+	},
+/obj/item/hand_tele,
+/turf/simulated/floor/carpet/arcade,
+/area/station/crew_quarters/captain)
 "dpZ" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -19731,6 +19399,15 @@
 	dir = 4
 	},
 /area/station/science/lobby)
+"dDF" = (
+/obj/disposalpipe/segment,
+/obj/decal/stripe_delivery,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/north)
 "dEi" = (
 /obj/machinery/door/airlock/pyro/glass/sci{
 	dir = 4;
@@ -19807,6 +19484,29 @@
 /obj/machinery/crusher,
 /turf/simulated/floor/caution/corner/sw,
 /area/station/maintenance/disposal)
+"dHR" = (
+/obj/machinery/light{
+	dir = 4;
+	pixel_x = 10
+	},
+/obj/cable{
+	icon_state = "0-8"
+	},
+/obj/cable{
+	icon_state = "0-8"
+	},
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/disposaloutlet{
+	name = "brig delivery chute"
+	},
+/obj/disposalpipe/trunk/brig,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/grime,
+/area/station/security/brig)
 "dII" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -19851,17 +19551,6 @@
 	dir = 8
 	},
 /area/station/science/artifact)
-"dLs" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/black,
-/area/station/bridge)
 "dLM" = (
 /obj/machinery/traymachine/morgue{
 	dir = 8
@@ -19890,7 +19579,12 @@
 /obj/item/kitchen/utensil/spoon,
 /obj/item/kitchen/utensil/fork,
 /obj/item/storage/box/plates,
-/obj/item/storage/box/cutlery,
+/obj/item/storage/box/cutlery{
+	pixel_x = 8
+	},
+/obj/item/storage/box/popsicle_sticks{
+	pixel_x = -7
+	},
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "dMz" = (
@@ -19909,12 +19603,15 @@
 	dir = 4
 	},
 /obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access,
 /obj/forcefield/energyshield/perma/doorlink{
 	desc = "A door-linked force field that prevents gasses from passing through it.";
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "dMT" = (
@@ -20014,6 +19711,13 @@
 	},
 /turf/simulated/floor/circuit,
 /area/listeningpost/power)
+"dTW" = (
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/plating,
+/area/station/engine/gas)
 "dUf" = (
 /obj/rack,
 /obj/machinery/firealarm/south,
@@ -20304,13 +20008,16 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
-/obj/mapping_helper/access,
 /obj/mapping_helper/firedoor_spawn,
 /obj/forcefield/energyshield/perma/doorlink{
 	desc = "A door-linked force field that prevents gasses from passing through it.";
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Public Podbay"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "eeV" = (
@@ -21048,22 +20755,15 @@
 /turf/simulated/floor/white,
 /area/station/medical/medbay/lobby)
 "eJJ" = (
-/obj/machinery/power/apc{
-	dir = 8;
-	name = "Armory APC";
-	noalerts = 1;
-	pixel_x = -24
-	},
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/cable,
 /obj/machinery/camera{
 	c_tag = "autotag";
 	dir = 8;
 	name = "autoname  - SS13";
 	pixel_x = 10
 	},
+/obj/cable{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/black,
 /area/station/maintenance/central)
 "eKZ" = (
@@ -21143,6 +20843,10 @@
 	},
 /obj/mapping_helper/access/engineering,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsubstation";
+	name = "East Substation"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/east)
 "eNu" = (
@@ -21253,20 +20957,6 @@
 	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
-"eQZ" = (
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/machinery/portable_reclaimer,
-/obj/decal/stripe_caution,
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 4
-	},
-/area/station/mining/staff_room)
 "eRB" = (
 /obj/table/wood/auto,
 /obj/machinery/light/lamp/black{
@@ -21380,6 +21070,25 @@
 	},
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/bar)
+"eXS" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals2";
+	name = "Arrivals";
+	enter_id = "main"
+	},
+/turf/unsimulated/floor{
+	icon_state = "floor"
+	},
+/area/station/crewquarters/cryotron)
 "eXT" = (
 /obj/machinery/atmospherics/pipe/simple/insulated{
 	dir = 5
@@ -21578,6 +21287,18 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/garden/aviary)
+"ffI" = (
+/obj/storage/secure/closet/command/medical_director,
+/obj/machinery/camera,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/carpet{
+	dir = 9;
+	icon_state = "fblue2"
+	},
+/area/station/medical/head)
 "fhb" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -21857,6 +21578,17 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southwest)
+"ftL" = (
+/obj/disposalpipe/segment,
+/obj/machinery/hydro_growlamp,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/green/side{
+	dir = 8
+	},
+/area/station/hydroponics/bay)
 "fvL" = (
 /obj/disposalpipe/segment/mail,
 /turf/simulated/floor/plating,
@@ -22100,6 +21832,19 @@
 	},
 /turf/simulated/floor,
 /area/station/science/artifact)
+"fGX" = (
+/obj/machinery/door/window/northright{
+	req_access_txt = "22"
+	},
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/carpet{
+	dir = 5;
+	icon_state = "fgreen2"
+	},
+/area/station/chapel/funeral_parlor)
 "fGZ" = (
 /obj/cable/yellow{
 	icon_state = "0-8"
@@ -22253,6 +21998,11 @@
 	},
 /obj/mapping_helper/access/cargo,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargo";
+	name = "Cargo";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/quartermaster/office)
 "fMM" = (
@@ -22487,6 +22237,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargo";
+	name = "Cargo";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/quartermaster/office)
 "fWz" = (
@@ -22534,18 +22289,6 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/blue,
 /area/station/medical/staff)
-"fYK" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/portable_atmospherics/canister/sleeping_agent,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/redblack{
-	dir = 1
-	},
-/area/station/ai_monitored/armory)
 "fZd" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -22599,6 +22342,27 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
+"gaB" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/cable,
+/obj/cable{
+	icon_state = "0-2"
+	},
+/obj/window_blinds/cog2/right{
+	dir = 4
+	},
+/obj/machinery/door/poddoor/blast{
+	density = 0;
+	dir = 1;
+	icon_state = "bdoormid0";
+	id = "chemblast";
+	layer = 5;
+	name = "Chemistry Blast Shield";
+	opacity = 0;
+	tag = "icon-bdoormidc1"
+	},
+/turf/simulated/floor/plating,
+/area/station/science/chemistry)
 "gaK" = (
 /obj/machinery/atmospherics/pipe/manifold{
 	dir = 1;
@@ -22783,6 +22547,38 @@
 	},
 /turf/simulated/floor/yellow,
 /area/station/engine/engineering)
+"gip" = (
+/obj/table/reinforced/chemistry/auto/basicsup,
+/obj/item/paper/labdrawertips,
+/turf/simulated/floor/black,
+/area/station/science/chemistry)
+"gjs" = (
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meatpaste{
+	desc = "Gross.";
+	name = "old kidney"
+	},
+/obj/item/organ/heart{
+	desc = "A human heart, grody. How long has it been in that freezer?";
+	name = "funky ol' heart"
+	},
+/obj/storage/crate/freezer{
+	name = "Freezer - Spare Parts"
+	},
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
+/obj/machinery/light,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/sanitary/white,
+/area/station/medical/morgue)
 "gju" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -23152,18 +22948,6 @@
 	dir = 1
 	},
 /area/station/medical/medbay)
-"gws" = (
-/obj/storage/secure/closet/command/medical_director,
-/obj/machinery/camera,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/carpet{
-	dir = 9;
-	icon_state = "fblue2"
-	},
-/area/station/medical/head)
 "gww" = (
 /obj/machinery/firealarm/east,
 /obj/cable{
@@ -23259,6 +23043,16 @@
 /obj/landmark/start/job/cyborg,
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"gzn" = (
+/obj/stool/bench/yellow/auto,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/unsimulated/floor/orangeblack/side{
+	dir = 8
+	},
+/area/station/crewquarters/cryotron)
 "gAf" = (
 /obj/table/auto,
 /obj/item/rods/steel/fullstack,
@@ -23481,6 +23275,19 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/plating,
 /area/station/engine/engineering)
+"gQR" = (
+/obj/rack,
+/obj/item/storage/toolbox/emergency,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/wrench,
+/obj/item/device/light/glowstick,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/mask/gas/emergency,
+/obj/item/extinguisher,
+/obj/item/chem_grenade/firefighting,
+/obj/item/chem_grenade/firefighting,
+/turf/simulated/floor/caution/south,
+/area/station/science/lab)
 "gRe" = (
 /obj/landmark/start/job/roboticist,
 /obj/cable{
@@ -23545,6 +23352,16 @@
 	dir = 4
 	},
 /area/station/science/lobby)
+"gTd" = (
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/engine{
+	allows_vehicles = 0;
+	icon_state = "engine_caution_east"
+	},
+/area/station/engine/core/nuclear)
 "gUh" = (
 /obj/landmark/pest,
 /turf/simulated/floor/redblack{
@@ -23631,16 +23448,6 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/mining/staff_room)
-"gZw" = (
-/obj/item/device/radio/intercom/science,
-/obj/machinery/computer/chem_request_receiver,
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 9
-	},
-/area/station/science/chemistry)
 "gZJ" = (
 /obj/stool/bench/yellow/auto,
 /turf/unsimulated/floor{
@@ -23657,6 +23464,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals";
+	name = "Arrivals";
+	enter_id = "main"
+	},
 /turf/unsimulated/floor{
 	icon_state = "floor"
 	},
@@ -23763,15 +23575,6 @@
 	icon_state = "fblue2"
 	},
 /area/station/crew_quarters/ce)
-"hfL" = (
-/obj/landmark/start/job/engineer,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/black/side{
-	dir = 1
-	},
-/area/station/engine/inner)
 "hfQ" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -24047,6 +23850,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/exit)
 "hoj" = (
@@ -24130,6 +23938,16 @@
 	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
+"huq" = (
+/obj/table/round,
+/obj/item/storage/toolbox/emergency,
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor/purpleblack/corner{
+	dir = 8
+	},
+/area/station/hallway/primary/east)
 "huw" = (
 /mob/living/carbon/human/npc/monkey/tanhony,
 /turf/simulated/floor/white,
@@ -24232,6 +24050,15 @@
 	icon_state = "purple2"
 	},
 /area/station/bridge/captain)
+"hxt" = (
+/obj/disposalpipe/segment,
+/obj/table/reinforced/chemistry/auto,
+/obj/machinery/chem_dispenser/chemical,
+/obj/item/reagent_containers/glass/beaker/large,
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/science/chemistry)
 "hxU" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -24645,6 +24472,22 @@
 	dir = 4
 	},
 /area/station/hallway/primary/east)
+"hIK" = (
+/obj/decal/fakeobjects{
+	density = 1;
+	desc = "What was this thing even supposed to do?";
+	icon = 'icons/obj/machines/nuclear.dmi';
+	icon_state = "engineoff";
+	name = "Active Particle Phase Matrix"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/orangeblack/side/white{
+	dir = 8
+	},
+/area/station/science/teleporter)
 "hJn" = (
 /obj/machinery/disposal/small,
 /obj/disposalpipe/trunk{
@@ -24658,6 +24501,18 @@
 	},
 /turf/simulated/floor,
 /area/station/science/bot_storage)
+"hJr" = (
+/obj/cable/orange{
+	icon_state = "1-8"
+	},
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 5
+	},
+/area/station/engine/substation/west)
 "hJC" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/disposalpipe/segment/mail{
@@ -24746,6 +24601,11 @@
 /obj/decal/cleanable/dirt,
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
+"hNt" = (
+/obj/machinery/chem_dispenser/chemical,
+/obj/item/reagent_containers/glass/beaker/large,
+/turf/simulated/floor/purpleblack,
+/area/station/science/chemistry)
 "hNO" = (
 /obj/machinery/conveyor/EW{
 	id = "chapel_belt";
@@ -25029,17 +24889,6 @@
 	icon_state = "fgreen2"
 	},
 /area/station/engine/engineering/ce/private)
-"hVE" = (
-/obj/pool/perspective{
-	dir = 9;
-	tag = "icon-pool (NORTHWEST)"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/blue/checker,
-/area/station/crew_quarters/pool)
 "hXj" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -25604,22 +25453,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/quartermaster/office)
-"iqI" = (
-/obj/machinery/light/emergency,
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/table/wood/auto,
-/obj/item/storage/photo_album{
-	pixel_y = -10
-	},
-/obj/item/pinpointer,
-/obj/item/camera{
-	pixel_y = 6
-	},
-/obj/item/hand_tele,
-/turf/simulated/floor/carpet/arcade,
-/area/station/crew_quarters/captain)
 "iqX" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -26193,6 +26026,23 @@
 	dir = 4
 	},
 /area/station/hallway/primary/east)
+"iIr" = (
+/obj/machinery/light/emergency{
+	dir = 1;
+	pixel_y = 21
+	},
+/obj/item/storage/wall/fire{
+	dir = 1;
+	pixel_y = 30
+	},
+/obj/machinery/disposal/chemlink,
+/obj/disposalpipe/trunk/mail{
+	dir = 8
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 1
+	},
+/area/station/science/chemistry)
 "iJs" = (
 /obj/item/device/radio/intercom/security{
 	layer = 6.02
@@ -26307,11 +26157,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
-/obj/stool/bench/auto,
 /obj/item/device/radio/intercom/science{
 	pixel_x = 10;
 	pixel_y = 24
 	},
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple,
 /area/station/hallway/secondary/central)
 "iOK" = (
@@ -26664,6 +26514,15 @@
 /area/station/crew_quarters/quartersA{
 	name = "Crew Quarters P01"
 	})
+"jaD" = (
+/obj/machinery/clonepod,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/white/checker2{
+	dir = 5
+	},
+/area/station/medical/medbay/cloner)
 "jaI" = (
 /obj/machinery/shower{
 	dir = 4;
@@ -26764,6 +26623,16 @@
 	dir = 9
 	},
 /area/station/crewquarters/cryotron)
+"jgf" = (
+/obj/machinery/vending/snack,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fred2"
+	},
+/area/station/science/lobby)
 "jgj" = (
 /obj/table/auto,
 /obj/item/kitchen/food_box/donut_box{
@@ -26825,6 +26694,17 @@
 	dir = 6
 	},
 /area/station/quartermaster/office)
+"jiC" = (
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	dir = null
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/circuit,
+/area/station/turret_protected/ai)
 "jiM" = (
 /obj/machinery/atmospherics/pipe/manifold/overfloor{
 	dir = 1
@@ -27076,6 +26956,21 @@
 /obj/machinery/cashreg,
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/bar)
+"jrF" = (
+/obj/disposalpipe/trunk/mail{
+	dir = 8
+	},
+/obj/machinery/disposal/mail/small{
+	dir = 4;
+	mail_tag = "chemistry";
+	mailgroup = "science";
+	message = "1";
+	name = "mail chute-'Chemistry'"
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 8
+	},
+/area/station/science/chemistry)
 "jsd" = (
 /obj/machinery/mass_driver{
 	dir = 4;
@@ -27203,6 +27098,28 @@
 	icon_state = "fpurple1"
 	},
 /area/station/crew_quarters/bar)
+"jyO" = (
+/obj/machinery/light/emergency{
+	dir = 4;
+	pixel_x = 10
+	},
+/obj/item/device/radio/intercom/catering,
+/obj/storage/cart/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/shaker/ketchup{
+	pixel_x = 6
+	},
+/obj/item/shaker/mustard{
+	pixel_x = -6
+	},
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jzn" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/disposalpipe/segment/mail{
@@ -27425,17 +27342,6 @@
 	dir = 4
 	},
 /area/space)
-"jHT" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/stool/chair,
-/obj/landmark/start/job/assistant,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/black,
-/area/station/hallway/primary/central)
 "jHU" = (
 /obj/landmark/start/job/assistant,
 /obj/item/clothing/glasses/sunglasses/tanning,
@@ -27463,6 +27369,13 @@
 	dir = 1
 	},
 /area/station/hallway/secondary/central)
+"jIC" = (
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/purpleblack/corner,
+/area/station/science/chemistry)
 "jJG" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -27710,16 +27623,6 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
-"jTu" = (
-/obj/machinery/firealarm/north,
-/obj/machinery/disposal/chemlink,
-/obj/disposalpipe/trunk/mail{
-	dir = 8
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 1
-	},
-/area/station/science/chemistry)
 "jUG" = (
 /obj/cable/blue{
 	icon_state = "2-8"
@@ -27728,24 +27631,6 @@
 	dir = 4
 	},
 /area/station/engine/ptl)
-"jVC" = (
-/obj/storage/crate{
-	desc = "A crate of confiscated items.";
-	name = "Contraband"
-	},
-/obj/item/storage/pill_bottle/cyberpunk,
-/obj/item/instrument/vuvuzela,
-/obj/item/bananapeel,
-/obj/item/item_box/no{
-	pixel_x = 8;
-	pixel_y = -5
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/caution/corner/sw,
-/area/station/security/main)
 "jVE" = (
 /obj/machinery/networked/storage/tape_drive{
 	bank_id = "Artlab";
@@ -27932,7 +27817,7 @@
 /area/station/garden/aviary)
 "kdK" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "kea" = (
@@ -27949,18 +27834,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
-"keU" = (
-/obj/machinery/conveyor_switch{
-	id = "mining2qm"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 8
-	},
-/area/station/quartermaster/office)
 "kfS" = (
 /obj/machinery/vending/cigarette,
 /turf/unsimulated/floor/orangeblack/side,
@@ -28137,6 +28010,25 @@
 	icon_state = "fgreen3"
 	},
 /area/station/garden/aviary)
+"kpX" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals";
+	name = "Arrivals";
+	enter_id = "main"
+	},
+/turf/simulated/floor/caution/misc{
+	dir = 4
+	},
+/area/station/crewquarters/cryotron)
 "kqt" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -28345,6 +28237,19 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/central)
+"kxe" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname  - SS13";
+	pixel_x = 10
+	},
+/obj/reagent_dispensers/still,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/bar)
 "kxh" = (
 /turf/simulated/floor/carpet/grime,
 /area/ghostdrone_factory)
@@ -28754,33 +28659,6 @@
 /obj/machinery/recharger,
 /turf/simulated/floor/escape,
 /area/station/security/hos)
-"kMc" = (
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meatpaste{
-	desc = "Gross.";
-	name = "old kidney"
-	},
-/obj/item/organ/heart{
-	desc = "A human heart, grody. How long has it been in that freezer?";
-	name = "funky ol' heart"
-	},
-/obj/storage/crate/freezer{
-	name = "Freezer - Spare Parts"
-	},
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
-/obj/machinery/light,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
 "kMd" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable{
@@ -28987,7 +28865,7 @@
 /obj/cable{
 	icon_state = "1-8"
 	},
-/obj/stool/bench/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple,
 /area/station/hallway/secondary/central)
 "kVJ" = (
@@ -29095,6 +28973,19 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/space)
+"kZZ" = (
+/obj/table/reinforced/auto,
+/obj/item/clothing/under/rank/mechanic,
+/obj/item/crowbar,
+/obj/item/clothing/gloves/yellow/unsulated,
+/obj/item/reagent_containers/food/drinks/fueltank,
+/obj/item/clothing/shoes/magnetic,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/plating,
+/area/station/hangar/qm)
 "lam" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -29180,6 +29071,11 @@
 	},
 /obj/mapping_helper/access/engineering,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargo";
+	name = "Cargo";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/orangeblack,
 /area/station/engine/substation/east)
 "lcY" = (
@@ -29598,6 +29494,21 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/science/lab)
+"lru" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals2";
+	name = "Arrivals";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/plating,
+/area/station/crewquarters/cryotron)
 "lrX" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/machinery/door/poddoor/blast{
@@ -29774,28 +29685,11 @@
 /turf/simulated/floor/caution/westeast,
 /area/station/maintenance/disposal)
 "lyC" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/operating,
-/obj/item/circuitboard/qmsupply,
 /obj/cable,
 /obj/machinery/power/apc/autoname_south,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
-"lyY" = (
-/obj/machinery/computer/barcode/qm/no_belthell{
-	dir = 8
-	},
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor,
-/area/station/quartermaster/storage)
 "lzl" = (
 /obj/machinery/atmospherics/unary/vent{
 	dir = 8
@@ -29862,38 +29756,16 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
+"lCp" = (
+/obj/machinery/chem_heater/chemistry,
+/turf/simulated/floor/purpleblack{
+	dir = 10
+	},
+/area/station/science/chemistry)
 "lDr" = (
 /obj/machinery/centrifuge_nuclear,
 /turf/simulated/floor/black,
 /area/station/engine/inner)
-"lDG" = (
-/obj/table/reinforced/auto,
-/obj/item/clipboard,
-/obj/item/paper_bin,
-/obj/item/stamp,
-/obj/item/pen,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/door/poddoor/blast{
-	density = 0;
-	dir = 1;
-	icon_state = "bdoormid0";
-	id = "chemblast";
-	layer = 5;
-	name = "Chemistry Blast Shield";
-	opacity = 0;
-	tag = "icon-bdoormidc1"
-	},
-/obj/machinery/door/airlock/pyro/glass/windoor{
-	dir = 8
-	},
-/obj/mapping_helper/access/chemistry,
-/turf/simulated/floor/purplewhite{
-	dir = 10
-	},
-/area/station/science/chemistry)
 "lEe" = (
 /obj/machinery/conveyor/EW{
 	id = "ghostdrone"
@@ -30739,6 +30611,10 @@
 	},
 /turf/space,
 /area/space)
+"miq" = (
+/obj/stool/chair/office/purple,
+/turf/simulated/floor/black,
+/area/station/science/chemistry)
 "miw" = (
 /obj/machinery/door/window/westright{
 	dir = 1;
@@ -30884,6 +30760,18 @@
 	dir = 4
 	},
 /area/station/hallway/secondary/central)
+"mqP" = (
+/obj/machinery/conveyor_switch{
+	id = "mining2qm"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 8
+	},
+/area/station/quartermaster/office)
 "mre" = (
 /obj/machinery/light/small,
 /obj/cable{
@@ -31011,24 +30899,21 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/gas)
+"mvV" = (
+/obj/pool/perspective{
+	dir = 9;
+	tag = "icon-pool (NORTHWEST)"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/blue/checker,
+/area/station/crew_quarters/pool)
 "mws" = (
 /obj/disposalpipe/segment,
 /turf/simulated/wall/auto/supernorn,
 /area/station/crew_quarters/kitchen)
-"mwF" = (
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/stool/bench/blue/auto,
-/obj/landmark/start/job/assistant,
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/hallway/secondary/central)
 "mxl" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -31489,6 +31374,15 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/black,
 /area/station/hallway/primary/central)
+"mNj" = (
+/obj/landmark/start/job/engineer,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/black/side{
+	dir = 1
+	},
+/area/station/engine/inner)
 "mNS" = (
 /obj/disposalpipe/segment,
 /obj/cable{
@@ -31511,6 +31405,19 @@
 /obj/mapping_helper/access/heads,
 /turf/simulated/floor/black,
 /area/station/security/main)
+"mOf" = (
+/obj/disposalpipe/segment/mail,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/redblack{
+	dir = 4
+	},
+/area/station/hangar/sec)
 "mOq" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -31642,6 +31549,18 @@
 	dir = 8
 	},
 /area/station/engine/inner)
+"mSB" = (
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 1
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 9
+	},
+/area/station/medical/medbay/lobby)
 "mTq" = (
 /obj/disposalpipe/segment,
 /obj/cable{
@@ -31924,6 +31843,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "main"
+	},
 /turf/simulated/floor/caution/misc{
 	dir = 8
 	},
@@ -31947,6 +31871,30 @@
 "ngt" = (
 /turf/simulated/floor,
 /area/station/medical/robotics)
+"nid" = (
+/obj/table/reinforced/auto,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/poddoor/blast{
+	density = 0;
+	dir = 1;
+	icon_state = "bdoormid0";
+	id = "chemblast";
+	layer = 5;
+	name = "Chemistry Blast Shield";
+	opacity = 0;
+	tag = "icon-bdoormidc1"
+	},
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 8
+	},
+/obj/mapping_helper/access/chemistry,
+/turf/simulated/floor/purplewhite{
+	dir = 10
+	},
+/area/station/science/chemistry)
 "nix" = (
 /mob/living/critter/small_animal/bird/owl,
 /turf/simulated/floor/grass/random/alt,
@@ -32312,17 +32260,6 @@
 /area/station/crew_quarters/quartersA{
 	name = "Crew Quarters M01"
 	})
-"nwG" = (
-/obj/machinery/computer3/generic/med_data,
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/black,
-/area/station/medical/robotics)
 "nwK" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -32496,6 +32433,14 @@
 	icon_state = "fred2"
 	},
 /area/station/science/lobby)
+"nGj" = (
+/obj/storage/closet/fire,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/yellow,
+/area/station/engine/engineering)
 "nGC" = (
 /obj/disposalpipe/junction{
 	dir = 4;
@@ -32521,14 +32466,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hangar/main)
-"nHt" = (
-/obj/machinery/vending/coffee,
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/wood/two,
-/area/station/medical/staff)
 "nHB" = (
 /obj/machinery/computer/security{
 	dir = 4
@@ -32752,15 +32689,16 @@
 	dir = 1
 	},
 /area/station/medical/medbay/surgery)
-"nQz" = (
-/obj/machinery/clonepod,
-/obj/machinery/alarm{
-	pixel_y = 23
+"nQh" = (
+/obj/item/device/radio/intercom/science,
+/obj/disposalpipe/segment/mail{
+	dir = 4
 	},
-/turf/simulated/floor/white/checker2{
-	dir = 5
+/obj/machinery/computer/chem_request_receiver,
+/turf/simulated/floor/purpleblack{
+	dir = 9
 	},
-/area/station/medical/medbay/cloner)
+/area/station/science/chemistry)
 "nQF" = (
 /obj/cryotron{
 	layer = 3.9
@@ -32798,6 +32736,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "secpod";
+	name = "Security Podbay"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/sec)
 "nSN" = (
@@ -32891,18 +32833,6 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/west)
-"nVE" = (
-/obj/cable/orange{
-	icon_state = "1-8"
-	},
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 5
-	},
-/area/station/engine/substation/west)
 "nVI" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -32931,6 +32861,21 @@
 /obj/machinery/drainage,
 /turf/simulated/floor/sanitary/blue,
 /area/station/medical/head/private)
+"nXx" = (
+/obj/machinery/light{
+	dir = 1;
+	pixel_y = 21
+	},
+/obj/machinery/phone/wall{
+	pixel_y = 32
+	},
+/obj/machinery/chem_master{
+	dir = 1
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 1
+	},
+/area/station/science/chemistry)
 "nXC" = (
 /obj/machinery/recharger/wall{
 	dir = 8;
@@ -33500,6 +33445,34 @@
 /area/station/crew_quarters/quartersA{
 	name = "Crew Quarters P06"
 	})
+"ouq" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/obj/stool/chair,
+/obj/landmark/start/job/assistant,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/black,
+/area/station/hallway/primary/central)
+"ovm" = (
+/obj/disposalpipe/segment{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/obj/machinery/light{
+	dir = 4;
+	pixel_x = 10
+	},
+/obj/window/reinforced/south,
+/obj/submachine/chem_extractor{
+	dir = 8
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 6
+	},
+/area/station/science/chemistry)
 "owe" = (
 /obj/stool/chair/comfy/red{
 	dir = 8
@@ -33536,6 +33509,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsubstation";
+	name = "East Substation"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/east)
 "owP" = (
@@ -33964,6 +33941,15 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/plating,
 /area/station/medical/research)
+"oNH" = (
+/obj/machinery/light,
+/obj/machinery/vehicle/miniputt,
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/engine,
+/area/station/hangar/main)
 "oOb" = (
 /obj/disposalpipe/segment/mail,
 /obj/mapping_helper/wingrille_spawn/auto,
@@ -34467,6 +34453,11 @@
 /obj/cable/blue{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engine Room";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
 "pox" = (
@@ -34933,6 +34924,20 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"pJW" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/stool/bench/blue/auto,
+/obj/landmark/start/job/assistant,
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/hallway/secondary/central)
 "pKq" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 4
@@ -35518,6 +35523,9 @@
 /obj/cable{
 	icon_state = "2-8"
 	},
+/obj/cable{
+	icon_state = "1-4"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "qda" = (
@@ -35617,6 +35625,20 @@
 	dir = 9
 	},
 /area/station/medical/medbay)
+"qfa" = (
+/obj/cable/orange{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 9
+	},
+/area/station/engine/substation/east)
 "qfk" = (
 /obj/machinery/power/apc/autoname_west,
 /obj/cable,
@@ -35627,6 +35649,16 @@
 /obj/machinery/light_switch/south,
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/pharmacy)
+"qfM" = (
+/obj/stool/chair/office/blue{
+	dir = 1
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/black,
+/area/station/hallway/secondary/exit)
 "qfO" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -35880,6 +35912,10 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ptl";
+	name = "Power Transmission Laser Room"
+	},
 /turf/simulated/floor/orangeblack,
 /area/station/engine/ptl)
 "qor" = (
@@ -35998,6 +36034,13 @@
 "qum" = (
 /turf/simulated/floor/orangeblack,
 /area/station/engine/substation/east)
+"quy" = (
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/sanitary/white,
+/area/station/medical/crematorium)
 "qvo" = (
 /obj/disposalpipe/segment/mail,
 /obj/cable{
@@ -36302,6 +36345,16 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/arcade)
+"qIq" = (
+/obj/machinery/computer/barcode/qm/no_belthell{
+	dir = 8
+	},
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/storage)
 "qIA" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -36485,6 +36538,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "main"
+	},
 /turf/simulated/floor/caution/misc{
 	dir = 4
 	},
@@ -36501,28 +36559,6 @@
 	dir = 8
 	},
 /area/station/medical/medbay)
-"qRT" = (
-/obj/machinery/light/emergency{
-	dir = 4;
-	pixel_x = 10
-	},
-/obj/item/device/radio/intercom/catering,
-/obj/storage/cart/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/shaker/ketchup{
-	pixel_x = 6
-	},
-/obj/item/shaker/mustard{
-	pixel_x = -6
-	},
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "qSm" = (
 /obj/disposalpipe/segment/mail{
 	dir = 1;
@@ -36557,6 +36593,25 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
+"qTl" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "main"
+	},
+/turf/simulated/floor/caution/misc{
+	dir = 8
+	},
+/area/station/hallway/secondary/exit)
 "qTA" = (
 /obj/stool/bed,
 /obj/landmark/start/job/assistant,
@@ -36646,6 +36701,25 @@
 	},
 /turf/simulated/floor/green,
 /area/station/hydroponics/bay)
+"qXo" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "main"
+	},
+/turf/simulated/floor/caution/misc{
+	dir = 4
+	},
+/area/station/hallway/secondary/exit)
 "qXE" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	name = "Mixing Port"
@@ -37276,6 +37350,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "rrn" = (
@@ -37317,16 +37395,6 @@
 	icon_state = "engine_caution_east"
 	},
 /area/station/engine/core/nuclear)
-"rva" = (
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor/engine{
-	allows_vehicles = 0;
-	icon_state = "engine_caution_east"
-	},
-/area/station/engine/core/nuclear)
 "rvc" = (
 /obj/stool/chair{
 	dir = 4
@@ -37553,6 +37621,21 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/mining/staff_room)
+"rFT" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/exit)
 "rGO" = (
 /obj/landmark/start/job/quartermaster,
 /obj/stool/chair/office/yellow{
@@ -38257,8 +38340,36 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"siE" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/cable,
+/obj/cable{
+	icon_state = "0-2"
+	},
+/obj/window_blinds/cog2/middle{
+	dir = 4
+	},
+/obj/machinery/door/poddoor/blast{
+	density = 0;
+	dir = 1;
+	icon_state = "bdoormid0";
+	id = "chemblast";
+	layer = 5;
+	name = "Chemistry Blast Shield";
+	opacity = 0;
+	tag = "icon-bdoormidc1"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor/plating,
+/area/station/science/chemistry)
 "siQ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -38337,6 +38448,17 @@
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/fitness)
+"sko" = (
+/obj/rack,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/mask/gas/emergency,
+/obj/item/clothing/head/helmet/firefighter,
+/obj/item/tank/air,
+/obj/item/extinguisher,
+/obj/item/crowbar,
+/obj/item/device/light/flashlight,
+/turf/simulated/floor,
+/area/station/engine/substation/east)
 "sky" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -38369,6 +38491,20 @@
 /obj/window_blinds/cog2/left,
 /turf/simulated/floor/plating,
 /area/station/medical/morgue)
+"slX" = (
+/obj/rack,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/mask/gas/emergency,
+/obj/item/clothing/head/helmet/firefighter,
+/obj/item/tank/air,
+/obj/item/extinguisher,
+/obj/item/crowbar,
+/obj/item/device/light/flashlight,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor,
+/area/station/engine/substation/west)
 "smd" = (
 /turf/unsimulated/floor/black,
 /area/station/crewquarters/cryotron)
@@ -38501,6 +38637,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engine Room";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
 "srC" = (
@@ -38522,6 +38663,11 @@
 	},
 /obj/mapping_helper/access/cargo,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargo";
+	name = "Cargo";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/quartermaster/office)
 "ssD" = (
@@ -38833,6 +38979,16 @@
 /obj/item/device/gps,
 /turf/simulated/floor/orangeblack/side/white,
 /area/station/science/teleporter)
+"sKD" = (
+/obj/storage/closet/office,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/redblack{
+	dir = 9
+	},
+/area/station/security/detectives_office)
 "sLd" = (
 /obj/machinery/light/small{
 	dir = 8;
@@ -38883,6 +39039,14 @@
 	},
 /turf/simulated/floor/damaged2,
 /area/station/quartermaster/storage)
+"sLR" = (
+/obj/reagent_dispensers/fueltank,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor,
+/area/station/science/lab)
 "sMg" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -39234,20 +39398,6 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
-"sZE" = (
-/obj/cable/orange{
-	icon_state = "2-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 9
-	},
-/area/station/engine/substation/east)
 "sZH" = (
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/grass/random/alt,
@@ -39573,30 +39723,6 @@
 /obj/machinery/chem_dispenser/chemical,
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/pharmacy)
-"tnp" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/cable,
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/window_blinds/cog2/right{
-	dir = 4
-	},
-/obj/machinery/door/poddoor/blast{
-	density = 0;
-	dir = 1;
-	icon_state = "bdoormid0";
-	id = "chemblast";
-	layer = 5;
-	name = "Chemistry Blast Shield";
-	opacity = 0;
-	tag = "icon-bdoormidc1"
-	},
-/turf/simulated/floor/plating,
-/area/station/science/chemistry)
 "tnw" = (
 /obj/machinery/light/small{
 	dir = 8;
@@ -39894,6 +40020,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargo";
+	name = "Cargo";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/quartermaster/office)
 "tAE" = (
@@ -39949,6 +40080,17 @@
 /obj/decal/tile_edge/stripe/extra_big,
 /turf/simulated/floor/blue/checker,
 /area/station/crew_quarters/pool)
+"tCy" = (
+/obj/machinery/computer3/generic/med_data,
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-2"
+	},
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/black,
+/area/station/medical/robotics)
 "tDh" = (
 /obj/fluid_spawner{
 	amount = 2100
@@ -40346,6 +40488,28 @@
 	icon_state = "fblue2"
 	},
 /area/station/bridge)
+"tQl" = (
+/obj/disposalpipe/segment,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname  - SS13";
+	pixel_x = 10
+	},
+/obj/blind_switch/area/east{
+	dir = 4
+	},
+/obj/machinery/chem_heater/chemistry,
+/obj/machinery/door_control{
+	id = "chemblast";
+	name = "Chemistry Blast Shield Control";
+	pixel_x = 24;
+	pixel_y = -8
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/science/chemistry)
 "tQO" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -40435,6 +40599,17 @@
 	},
 /turf/simulated/floor/black,
 /area/station/engine/inner)
+"tWb" = (
+/obj/table,
+/obj/item/storage/toolbox/emergency,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fblue2"
+	},
+/area/station/hallway/secondary/exit)
 "tWN" = (
 /obj/table/reinforced/auto,
 /obj/drink_rack/mug{
@@ -40491,6 +40666,22 @@
 	dir = 6
 	},
 /area/station/science/artifact)
+"tYN" = (
+/obj/table/reinforced/auto,
+/obj/machinery/networked/printer{
+	print_id = "Artlab"
+	},
+/obj/item/pen,
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor,
+/area/station/science/artifact)
 "tZa" = (
 /obj/machinery/conveyor/NS{
 	id = "cargo_out"
@@ -40625,6 +40816,10 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/research,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsubstation";
+	name = "East Substation"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/science)
 "uea" = (
@@ -40736,6 +40931,18 @@
 /obj/machinery/power/data_terminal,
 /turf/simulated/floor,
 /area/station/science/lab)
+"uiq" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/portable_atmospherics/canister/sleeping_agent,
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor/redblack{
+	dir = 1
+	},
+/area/station/ai_monitored/armory)
 "uja" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/engineering/ce/private)
@@ -40957,6 +41164,10 @@
 	},
 /obj/mapping_helper/access/engineering,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsubstation";
+	name = "West Substation"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
 "urZ" = (
@@ -41506,6 +41717,15 @@
 /area/station/crew_quarters/quartersA{
 	name = "Crew Quarters P06"
 	})
+"uJO" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/stool/chair/office/purple{
+	dir = 1
+	},
+/turf/simulated/floor/black,
+/area/station/science/chemistry)
 "uKc" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -41710,15 +41930,17 @@
 /obj/machinery/vending/cola/blue,
 /turf/unsimulated/floor/orangeblack/side,
 /area/station/crewquarters/cryotron)
-"uRy" = (
-/obj/disposalpipe/segment,
-/obj/decal/stripe_delivery,
+"uQu" = (
+/obj/decal/tile_edge/line/green{
+	dir = 6;
+	icon_state = "line2"
+	},
 /obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
+	dir = 1;
+	pixel_y = -15
 	},
-/turf/simulated/floor,
-/area/station/hallway/primary/north)
+/turf/simulated/floor/grass/random,
+/area/station/hydroponics/bay)
 "uRF" = (
 /obj/table/auto,
 /obj/item/cigpacket/propuffs{
@@ -41849,6 +42071,16 @@
 	},
 /turf/simulated/floor/black,
 /area/station/ai_monitored/storage/eva)
+"uUw" = (
+/obj/machinery/light_switch/north,
+/obj/decal/poster/wallsign/poster_ptoe{
+	pixel_y = 32
+	},
+/obj/machinery/chemicompiler_stationary,
+/turf/simulated/floor/purpleblack{
+	dir = 5
+	},
+/area/station/science/chemistry)
 "uUA" = (
 /obj/landmark/start/job/botanist,
 /turf/simulated/floor/grass/random,
@@ -42565,6 +42797,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals2";
+	name = "Arrivals";
+	enter_id = "main"
+	},
 /turf/simulated/floor/caution/misc{
 	dir = 4
 	},
@@ -42618,17 +42855,6 @@
 	icon_state = "fblue2"
 	},
 /area/station/medical/head/private)
-"vJl" = (
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	dir = null
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/circuit,
-/area/station/turret_protected/ai)
 "vJE" = (
 /obj/disposalpipe/switch_junction{
 	dir = 1;
@@ -42681,22 +42907,6 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/quartermaster/office)
-"vMz" = (
-/obj/table/reinforced/auto,
-/obj/machinery/networked/printer{
-	print_id = "Artlab"
-	},
-/obj/item/pen,
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/alarm{
-	dir = 8;
-	pixel_x = 15
-	},
-/turf/simulated/floor,
-/area/station/science/artifact)
 "vMK" = (
 /obj/machinery/disposal/mail/small{
 	dir = 8
@@ -42826,6 +43036,17 @@
 /mob/living/carbon/human/npc/monkey/albert,
 /turf/simulated/floor/white,
 /area/station/science/teleporter)
+"vSO" = (
+/obj/disposalpipe/segment,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/black,
+/area/station/bridge)
 "vSX" = (
 /obj/table/wood/auto,
 /obj/item/clipboard,
@@ -42871,6 +43092,18 @@
 	},
 /turf/simulated/floor/grass/random,
 /area/station/hydroponics/bay)
+"vTP" = (
+/obj/disposalpipe/segment/mail,
+/obj/table/auto,
+/obj/item/decoration/flower_vase,
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/redblack{
+	dir = 4
+	},
+/area/station/hallway/secondary/central)
 "vVC" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -42909,18 +43142,6 @@
 	dir = 6
 	},
 /area/station/medical/medbay/surgery)
-"vWg" = (
-/obj/decal/tile_edge/stripe/extra_big{
-	dir = 1
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 9
-	},
-/area/station/medical/medbay/lobby)
 "vWi" = (
 /obj/item/storage/firstaid/oxygen{
 	pixel_y = -4
@@ -43198,6 +43419,12 @@
 /obj/decal/cleanable/dirt,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
+"whq" = (
+/obj/machinery/chem_master{
+	dir = 1
+	},
+/turf/simulated/floor/purpleblack,
+/area/station/science/chemistry)
 "wie" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -43210,19 +43437,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/secondary/central)
-"wjO" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname - SS13";
-	pixel_x = 10;
-	tag = ""
-	},
-/obj/rack,
-/obj/item/clothing/suit/rad,
-/obj/item/clothing/head/rad_hood,
-/turf/simulated/floor/plating,
-/area/station/engine/gas)
 "wkM" = (
 /obj/cable/orange{
 	icon_state = "2-4"
@@ -43257,6 +43471,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "arrivals";
+	name = "Arrivals";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/crewquarters/cryotron)
 "wmt" = (
@@ -43480,6 +43699,16 @@
 /obj/landmark/start/job/medical_director,
 /turf/simulated/floor/black,
 /area/station/bridge)
+"wvG" = (
+/obj/table/reinforced/chemistry/auto/clericalsup,
+/obj/machinery/glass_recycler/chemistry{
+	pixel_y = 9;
+	pixel_x = -2
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 8
+	},
+/area/station/science/chemistry)
 "wwE" = (
 /obj/shrub,
 /obj/machinery/camera{
@@ -43648,6 +43877,14 @@
 	},
 /turf/simulated/floor/wood/two,
 /area/station/medical/medbay/lobby)
+"wFS" = (
+/obj/machinery/vending/coffee,
+/obj/machinery/alarm{
+	dir = 8;
+	pixel_x = 15
+	},
+/turf/simulated/floor/wood/two,
+/area/station/medical/staff)
 "wFW" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -43939,6 +44176,19 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"wON" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname - SS13";
+	pixel_x = 10;
+	tag = ""
+	},
+/obj/rack,
+/obj/item/clothing/suit/hazard/rad,
+/obj/item/clothing/head/rad_hood,
+/turf/simulated/floor/plating,
+/area/station/engine/gas)
 "wRw" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -44020,6 +44270,10 @@
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ptl";
+	name = "Power Transmission Laser Room"
+	},
 /turf/simulated/floor/orangeblack,
 /area/station/engine/ptl)
 "wVp" = (
@@ -44203,6 +44457,14 @@
 /obj/machinery/portable_reclaimer,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"xcE" = (
+/obj/machinery/firealarm/north,
+/obj/machinery/chem_dispenser/chemical,
+/obj/item/reagent_containers/glass/beaker/large,
+/turf/simulated/floor/purpleblack{
+	dir = 1
+	},
+/area/station/science/chemistry)
 "xcO" = (
 /obj/machinery/power/terminal{
 	dir = 8
@@ -44418,20 +44680,6 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/bar)
-"xnG" = (
-/obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/mask/gas/emergency,
-/obj/item/clothing/head/helmet/firefighter,
-/obj/item/tank/air,
-/obj/item/extinguisher,
-/obj/item/crowbar,
-/obj/item/device/light/flashlight,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor,
-/area/station/engine/substation/west)
 "xnY" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -45104,14 +45352,6 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
-"xNn" = (
-/obj/storage/closet/fire,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/yellow,
-/area/station/engine/engineering)
 "xNT" = (
 /obj/table/auto,
 /obj/disposalpipe/segment{
@@ -45142,6 +45382,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engine Room";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core/nuclear)
 "xOX" = (
@@ -45408,29 +45653,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/kitchen)
-"ybG" = (
-/obj/machinery/light{
-	dir = 4;
-	pixel_x = 10
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/disposaloutlet{
-	name = "brig delivery chute"
-	},
-/obj/disposalpipe/trunk/brig,
-/obj/machinery/alarm{
-	pixel_y = 23
-	},
-/turf/simulated/floor/grime,
-/area/station/security/brig)
 "ycj" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -66687,7 +66909,7 @@ slN
 uaD
 cUr
 bsL
-kMc
+gjs
 brX
 udJ
 sYc
@@ -68241,7 +68463,7 @@ oTM
 aRw
 bXA
 ezo
-gws
+ffI
 gsH
 mcU
 hVe
@@ -68513,7 +68735,7 @@ aIk
 byG
 pLp
 wlE
-xnG
+slX
 oZJ
 imY
 eUx
@@ -68997,7 +69219,7 @@ hnd
 yaj
 cSR
 bkJ
-nQz
+jaD
 uoF
 kXh
 sQD
@@ -69245,7 +69467,7 @@ pTk
 aCR
 imz
 bkJ
-nwG
+tCy
 hkm
 txE
 gzk
@@ -70044,7 +70266,7 @@ iRg
 jEQ
 vWi
 xaL
-nHt
+wFS
 aNy
 afe
 bIr
@@ -70310,7 +70532,7 @@ xrK
 bIu
 ggd
 uOq
-nVE
+hJr
 nre
 qQw
 ssP
@@ -70532,7 +70754,7 @@ cQg
 aXC
 lMF
 moV
-vWg
+mSB
 baa
 uzN
 baa
@@ -70779,7 +71001,7 @@ awp
 axd
 axT
 axS
-azi
+cRS
 aAe
 aAX
 aBT
@@ -71288,7 +71510,7 @@ asS
 atv
 auf
 auR
-avF
+fGX
 awr
 axf
 axS
@@ -71514,7 +71736,7 @@ aaa
 aaa
 aaa
 aaV
-nfy
+qTl
 aaV
 aaV
 nfy
@@ -71770,7 +71992,7 @@ aaa
 qVR
 wJX
 wJX
-hnI
+rFT
 aeL
 qPU
 qPU
@@ -72028,7 +72250,7 @@ pEZ
 abt
 uEh
 aaV
-qQQ
+qXo
 aaV
 aaV
 qQQ
@@ -72575,7 +72797,7 @@ auk
 auU
 avJ
 vpM
-axi
+quy
 axW
 uGs
 azl
@@ -72853,7 +73075,7 @@ aPp
 aPw
 bdQ
 waq
-aWz
+vTP
 wdx
 bIn
 bsI
@@ -73140,8 +73362,8 @@ rWe
 bzY
 hSZ
 jzX
-bzX
-wjO
+dTW
+wON
 dGC
 gGu
 jxr
@@ -73323,7 +73545,7 @@ thY
 aix
 nyh
 hDG
-ajS
+mOf
 lNZ
 wpI
 qvo
@@ -73374,7 +73596,7 @@ vfm
 tAi
 fVW
 kNM
-jVC
+cAD
 bhl
 taa
 dYj
@@ -73402,7 +73624,7 @@ uVN
 uVN
 uVN
 jxr
-hfL
+mNj
 tJp
 dtW
 uAO
@@ -73568,7 +73790,7 @@ ach
 anD
 uwQ
 abJ
-aek
+tWb
 aeQ
 aft
 afT
@@ -74077,7 +74299,7 @@ ozL
 aaV
 aaV
 abu
-abK
+qfM
 aci
 wyg
 pJA
@@ -74884,7 +75106,7 @@ nqa
 asy
 nTZ
 ilz
-hVE
+mvV
 kQo
 pcg
 dxC
@@ -75692,7 +75914,7 @@ egp
 qYU
 fko
 aQR
-ybG
+dHR
 rcS
 bld
 tvE
@@ -76218,7 +76440,7 @@ bso
 btj
 rbS
 hAI
-xNn
+nGj
 gLL
 qhR
 rEE
@@ -76935,7 +77157,7 @@ aoW
 kvv
 kBA
 ajZ
-jHT
+ouq
 nqa
 asy
 uMI
@@ -76972,7 +77194,7 @@ aXX
 uUV
 bas
 bbG
-dLs
+vSO
 mNS
 dfk
 wuf
@@ -77173,7 +77395,7 @@ acO
 aes
 axm
 cbO
-uRy
+dDF
 vxy
 acO
 cbO
@@ -78004,7 +78226,7 @@ tKE
 aQR
 tFW
 bgz
-fYK
+uiq
 glL
 glL
 glL
@@ -78538,7 +78760,7 @@ fZO
 itr
 kZv
 rtM
-rva
+gTd
 kZv
 iEV
 ofs
@@ -79258,7 +79480,7 @@ vYv
 tdg
 awF
 vTE
-ayi
+uQu
 aym
 xsX
 azw
@@ -79292,7 +79514,7 @@ mPk
 kFN
 qPa
 sMg
-vJl
+jiC
 bmF
 bem
 boU
@@ -80602,7 +80824,7 @@ qWe
 nns
 vYz
 teM
-eQZ
+bvZ
 say
 aGI
 ozL
@@ -80797,7 +81019,7 @@ avV
 ngr
 oCj
 hIm
-avZ
+ftL
 tNY
 iAk
 ayn
@@ -81111,7 +81333,7 @@ hLW
 hHO
 brK
 bGb
-bGH
+kZZ
 bHe
 bHD
 nUB
@@ -81362,7 +81584,7 @@ kAx
 cvh
 rXf
 bBC
-lyY
+qIq
 mVN
 aoh
 pOy
@@ -81577,7 +81799,7 @@ azH
 aAz
 dYJ
 aCz
-aEr
+kxe
 bjZ
 aFL
 ayW
@@ -81798,7 +82020,7 @@ nNp
 iUu
 iUu
 hhh
-cdG
+gzn
 nkZ
 vjW
 dgM
@@ -81855,7 +82077,7 @@ bcL
 aWW
 baI
 bbS
-iqI
+dpC
 bep
 kzc
 bgK
@@ -81876,7 +82098,7 @@ bxf
 dCG
 kKA
 sen
-keU
+mqP
 rGO
 aOA
 pOy
@@ -82855,7 +83077,7 @@ auH
 avq
 awf
 asN
-axF
+sKD
 ays
 ayX
 gxe
@@ -83088,7 +83310,7 @@ rUk
 jCw
 xgr
 ajs
-ajN
+bHp
 dyu
 akO
 alb
@@ -83147,10 +83369,10 @@ gqG
 bhH
 oAT
 bko
-blz
 aUq
 aUq
-fUL
+blz
+cwK
 kbI
 rKB
 bJI
@@ -83342,7 +83564,7 @@ uoU
 uoU
 uoU
 uTK
-gZL
+eXS
 aMr
 uTK
 fAK
@@ -83391,7 +83613,7 @@ pPr
 aSQ
 aTI
 bsG
-mwF
+pJW
 bIp
 kxQ
 hIA
@@ -83404,9 +83626,9 @@ iIp
 shC
 ubX
 bbU
-aRt
+bbU
 gGY
-bnJ
+huq
 juT
 oEr
 upP
@@ -83600,7 +83822,7 @@ aaa
 aaa
 lVS
 aip
-wmc
+lru
 wJX
 wJX
 wJX
@@ -83610,7 +83832,7 @@ alK
 alH
 alH
 alH
-anE
+oNH
 fwW
 mre
 ale
@@ -83632,7 +83854,7 @@ ayX
 ayX
 aum
 ayX
-qRT
+jyO
 jGv
 ayX
 uea
@@ -83660,10 +83882,10 @@ iNX
 eqV
 uBf
 xkZ
-lDG
-tnp
-fBh
+nid
+gaB
 fBh
+siE
 kSe
 bgR
 iAU
@@ -83906,7 +84128,7 @@ aST
 itf
 fRA
 aVR
-aWZ
+hIK
 nvq
 aZD
 baL
@@ -83915,13 +84137,13 @@ bdq
 vOq
 bfG
 bgQ
-gZw
+nQh
 bjf
 bkq
-blB
-bmO
-bnK
-bpj
+wvG
+cdu
+jrF
+lCp
 bgR
 oUs
 aqu
@@ -84106,7 +84328,7 @@ aaa
 aaa
 aaa
 uTK
-vFS
+kpX
 uTK
 aaa
 aaa
@@ -84172,13 +84394,13 @@ eNx
 gyl
 fmT
 bgQ
-bhK
+iIr
 czP
 bjg
-bMS
-bmP
-bjg
-bpk
+gip
+bSl
+miq
+hNt
 bgR
 wXJ
 aqu
@@ -84429,13 +84651,13 @@ bds
 beu
 iTE
 bgQ
-jTu
-czP
-bks
-blD
-bmQ
+xcE
+uJO
+bjg
 bjg
-bpl
+bjg
+bjg
+whq
 bgR
 kwx
 bsz
@@ -84686,12 +84908,12 @@ gNn
 rvt
 ihB
 bgQ
-bhM
-bjh
+nXx
+czP
 bjg
 mEH
 bmR
-bnL
+jIC
 bpm
 bgR
 vAH
@@ -84943,12 +85165,12 @@ bdu
 bew
 bfK
 bgR
-bhN
+uUw
 bji
-bkt
-blE
-bmS
-bnM
+agA
+tQl
+hxt
+ovm
 bxG
 bgR
 lAA
@@ -85204,7 +85426,7 @@ und
 eTY
 jEw
 bgR
-bgR
+bOS
 bgR
 bgR
 bgR
@@ -85216,7 +85438,7 @@ asm
 asm
 auM
 bzA
-sZE
+qfa
 gNw
 byZ
 mYs
@@ -85982,7 +86204,7 @@ bgS
 wXJ
 bsB
 btN
-buU
+aBw
 aQA
 bxq
 bys
@@ -86503,7 +86725,7 @@ byu
 bzA
 wXU
 nQU
-bDd
+sko
 bEi
 agl
 iZn
@@ -86979,7 +87201,7 @@ aES
 asm
 nuT
 aHM
-aIS
+jgf
 omE
 aLo
 mgQ
@@ -87259,7 +87481,7 @@ bgS
 lGX
 tAZ
 cBh
-vMz
+tYN
 fGK
 fIm
 bpu
@@ -88536,7 +88758,7 @@ aXk
 aYy
 aYz
 baY
-bch
+sLR
 gmd
 huK
 bfS
@@ -89043,7 +89265,7 @@ aET
 aET
 aQr
 qyE
-aTk
+gQR
 aUG
 aWe
 aXm
diff --git a/maps/cogmap.dmm b/maps/cogmap.dmm
index 65ca7185b2096..f9136809ec068 100644
--- a/maps/cogmap.dmm
+++ b/maps/cogmap.dmm
@@ -85,10 +85,6 @@
 /obj/machinery/launcher_loader/west,
 /turf/simulated/floor/plating/airless,
 /area/space)
-"aav" = (
-/obj/machinery/cargo_router/Router13,
-/turf/simulated/floor/plating/airless,
-/area/space)
 "aaw" = (
 /obj/lattice{
 	dir = 6;
@@ -205,10 +201,6 @@
 	name = "window"
 	},
 /area/shuttle/arrival/station)
-"aaZ" = (
-/obj/lattice,
-/turf/space,
-/area/station/solar/north)
 "abi" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -2043,6 +2035,15 @@
 /obj/machinery/power/apc/autoname_north,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
+"ahM" = (
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "ahN" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 4
@@ -2224,7 +2225,7 @@
 	pixel_x = -8;
 	pixel_y = 5
 	},
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -3030,28 +3031,9 @@
 	dir = 5
 	},
 /area/station/security/checkpoint/arrivals)
-"alf" = (
-/obj/table/auto,
-/obj/disposalpipe/segment/food,
-/obj/machinery/light{
-	dir = 8;
-	tag = ""
-	},
-/obj/item/plate{
-	pixel_y = 4
-	},
-/obj/item/reagent_containers/food/snacks/breadloaf{
-	pixel_y = 8
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "alg" = (
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
-"ali" = (
-/obj/machinery/vending/monkey/kitchen,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "alk" = (
 /obj/shrub{
 	dir = 1
@@ -3265,10 +3247,6 @@
 /obj/disposalpipe/segment/food,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
-"amh" = (
-/obj/machinery/vending/kitchen,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "ami" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	dir = 4;
@@ -3499,58 +3477,6 @@
 /obj/disposalpipe/segment/food,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
-"ana" = (
-/obj/item/plate{
-	pixel_x = -5;
-	pixel_y = 3
-	},
-/obj/item/plate{
-	pixel_x = -5;
-	pixel_y = 7
-	},
-/obj/item/plate{
-	pixel_x = -5;
-	pixel_y = 11
-	},
-/obj/item/plate{
-	pixel_x = 6;
-	pixel_y = 2
-	},
-/obj/item/plate{
-	pixel_x = 6;
-	pixel_y = 6
-	},
-/obj/item/plate{
-	pixel_x = 6;
-	pixel_y = 10
-	},
-/obj/item/reagent_containers/food/drinks/bowl{
-	pixel_x = 9;
-	pixel_y = 16
-	},
-/obj/item/reagent_containers/food/drinks/bowl{
-	pixel_y = 14
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt{
-	pixel_x = 10;
-	pixel_y = 11
-	},
-/obj/table/auto,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"anb" = (
-/obj/stool,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"anc" = (
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/table/auto,
-/obj/machinery/computer3/generic/personal,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "and" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -3572,23 +3498,6 @@
 /obj/submachine/chem_extractor,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
-"anj" = (
-/obj/table/auto,
-/obj/item/storage/toolbox/emergency{
-	pixel_y = 10
-	},
-/obj/item/storage/box/beakerbox{
-	pixel_x = -6
-	},
-/obj/item/storage/box/glassbox,
-/obj/item/storage/box/syringes{
-	pixel_x = 3
-	},
-/obj/item/storage/box/donkpocket_kit{
-	pixel_x = 8
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "ank" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -3904,66 +3813,6 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/kitchen)
-"aot" = (
-/obj/machinery/disposal/mail{
-	mail_tag = "kitchen";
-	name = "mail chute-'Kitchen'"
-	},
-/obj/disposalpipe/trunk/mail{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "1-4"
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"aou" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/kitchen)
-"aov" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/light{
-	dir = 8;
-	tag = ""
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"aow" = (
-/obj/disposalpipe/segment/produce{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"aox" = (
-/obj/disposalpipe/segment/produce{
-	dir = 4
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"aoy" = (
-/obj/disposalpipe/segment/produce{
-	dir = 4
-	},
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
 "aoA" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -4233,37 +4082,12 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/kitchen)
-"apF" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 1;
-	name = "autoname - SS13";
-	tag = ""
-	},
-/obj/machinery/light,
-/obj/machinery/light_switch{
-	name = "S light switch";
-	pixel_y = -24
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"apG" = (
-/obj/storage/secure/closet/fridge/kitchen,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"apI" = (
-/obj/disposalpipe/segment/mail{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "apK" = (
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
 "apN" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -4518,14 +4342,6 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
-"aqT" = (
-/obj/machinery/door_control{
-	id = "kitchen";
-	name = "Kitchen Shutter Control";
-	pixel_x = -24
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "aqW" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 6;
@@ -4551,11 +4367,6 @@
 "ara" = (
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
-"arb" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/storage/auxillary{
 	name = "Tool Storage"
 	})
@@ -4565,16 +4376,6 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/hallway/primary/east)
-"are" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/produce{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/grime,
-/area/station/hallway/primary/east)
 "arf" = (
 /obj/stool/chair/comfy{
 	dir = 1
@@ -4619,26 +4420,6 @@
 "arq" = (
 /turf/simulated/floor/grime,
 /area/station/hallway/primary/east)
-"arr" = (
-/obj/machinery/light_switch{
-	name = "S light switch";
-	pixel_y = -24
-	},
-/turf/simulated/floor/grime,
-/area/station/hallway/primary/east)
-"ars" = (
-/obj/machinery/light,
-/turf/simulated/floor/grime,
-/area/station/hallway/primary/east)
-"art" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/produce,
-/turf/simulated/floor/yellow/corner{
-	dir = 8
-	},
-/area/station/hallway/primary/east)
 "aru" = (
 /obj/lattice{
 	dir = 4;
@@ -4820,25 +4601,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"ash" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_x = 1;
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine{
-	pixel_x = 1;
-	pixel_y = 11
-	},
-/obj/item/matchbook{
-	pixel_x = 3;
-	pixel_y = -3
-	},
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
 "asi" = (
 /obj/stool/chair/dining/wood{
 	dir = 8
@@ -4869,38 +4631,6 @@
 	},
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
-"asp" = (
-/obj/storage/secure/closet/civilian/kitchen,
-/obj/machinery/light,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"asq" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 4
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
-"asr" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/crew_quarters/kitchen)
-"ass" = (
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"ast" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "asu" = (
 /obj/machinery/atmospherics/binary/volume_pump/active{
 	dir = 1;
@@ -5292,45 +5022,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"aty" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_x = 1;
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/snacks/salad{
-	pixel_y = 8
-	},
-/obj/item/device/light/candle/small{
-	pixel_x = 9;
-	pixel_y = -2
-	},
-/obj/item/kitchen/utensil/fork{
-	dir = 4;
-	pixel_x = 3;
-	pixel_y = 11
-	},
-/turf/simulated/floor/carpet,
-/area/station/crew_quarters/cafeteria)
-"atz" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_y = 7
-	},
-/obj/item/device/light/candle/small{
-	pixel_x = -9;
-	pixel_y = -2
-	},
-/obj/item/shaker/mustard{
-	pixel_x = 3;
-	pixel_y = 5
-	},
-/obj/item/shaker/ketchup{
-	pixel_x = 8;
-	pixel_y = 3
-	},
-/turf/simulated/floor/carpet,
-/area/station/crew_quarters/cafeteria)
 "atA" = (
 /obj/stool/chair/dining/wood{
 	dir = 8
@@ -5346,17 +5037,6 @@
 "atE" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/crew_quarters/baroffice)
-"atF" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/light{
-	dir = 8;
-	tag = ""
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "atH" = (
 /obj/machinery/atmospherics/pipe/simple/heat_exchanging{
 	dir = 5
@@ -5526,16 +5206,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hangar/sec)
-"auf" = (
-/obj/stove,
-/obj/item/soup_pot,
-/obj/item/ladle,
-/obj/noticeboard/persistent{
-	name = "Kitchen persistent notice board";
-	persistent_id = "kitchen"
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "aum" = (
 /obj/disposalpipe/segment/food{
 	dir = 4;
@@ -5698,32 +5368,6 @@
 /obj/machinery/power/apc/autoname_west,
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/cafeteria)
-"auL" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_x = 1;
-	pixel_y = 7
-	},
-/obj/item/shaker/salt{
-	pixel_x = -1;
-	pixel_y = 9
-	},
-/obj/item/shaker/pepper{
-	pixel_x = 3;
-	pixel_y = 7
-	},
-/turf/simulated/floor/carpet,
-/area/station/crew_quarters/cafeteria)
-"auM" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/tea{
-	pixel_y = 15
-	},
-/turf/simulated/floor/carpet,
-/area/station/crew_quarters/cafeteria)
 "auO" = (
 /obj/disposalpipe/segment/food,
 /obj/machinery/light{
@@ -5769,24 +5413,6 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/crew_quarters/catering)
-"auW" = (
-/obj/table/auto,
-/obj/machinery/phone{
-	pixel_x = -7;
-	pixel_y = 6
-	},
-/obj/item/satchel/hydro{
-	pixel_x = 9;
-	pixel_y = 10
-	},
-/obj/item/satchel/hydro{
-	pixel_x = 7;
-	pixel_y = 2
-	},
-/turf/simulated/floor/green/side{
-	dir = 1
-	},
-/area/station/hydroponics/bay)
 "auX" = (
 /obj/machinery/light/small{
 	dir = 1
@@ -6146,20 +5772,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"avY" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_x = 1;
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine{
-	pixel_x = 1;
-	pixel_y = 11
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
 "avZ" = (
 /obj/stool/chair/dining/wood{
 	dir = 8
@@ -6188,34 +5800,6 @@
 	},
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/baroffice)
-"awg" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"awh" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/machinery/navbeacon{
-	codes_txt = "delivery;dir=1";
-	location = "Catering"
-	},
-/obj/disposalpipe/segment/mail,
-/obj/machinery/light_switch{
-	name = "E light switch";
-	pixel_x = 24
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "awi" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 5;
@@ -6340,13 +5924,13 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
 /obj/disposalpipe/segment/produce,
 /obj/cable{
 	icon_state = "2-4"
 	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
 /turf/simulated/floor/green/side{
 	dir = 1
 	},
@@ -6625,20 +6209,6 @@
 	dir = 8
 	},
 /area/station/crew_quarters/locker)
-"axw" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
-"axx" = (
-/obj/cable{
-	icon_state = "1-4"
-	},
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "axy" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -6653,16 +6223,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/catering)
-"axA" = (
-/obj/machinery/atmospherics/pipe/simple{
-	level = 2
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/power/apc/autoname_north,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
 "axB" = (
 /obj/machinery/atmospherics/unary/cold_sink/freezer/kitchen{
 	dir = 1
@@ -6993,14 +6553,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"ayN" = (
-/obj/table/reinforced/bar/auto,
-/obj/item/clothing/head/cakehat,
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
 "ayO" = (
 /obj/table/reinforced/bar/auto,
 /obj/window/reinforced{
@@ -7063,50 +6615,6 @@
 "ayU" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/storage/emergency)
-"ayW" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/wall/auto/supernorn,
-/area/station/storage/emergency)
-"ayY" = (
-/obj/machinery/atmospherics/pipe/simple{
-	level = 2
-	},
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
-"ayZ" = (
-/obj/storage/crate{
-	name = "Cone Crate"
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = -10;
-	pixel_y = 11
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = -2;
-	pixel_y = 11
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = 6;
-	pixel_y = 11
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = -9;
-	pixel_y = 4
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = -1;
-	pixel_y = 4
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone{
-	pixel_x = 7;
-	pixel_y = 4
-	},
-/obj/item/reagent_containers/food/snacks/condiment/chocchips{
-	pixel_x = 1;
-	pixel_y = 3
-	},
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
 "azb" = (
 /turf/simulated/floor/yellow/side{
 	dir = 4
@@ -7270,11 +6778,6 @@
 	},
 /turf/space,
 /area/space)
-"azu" = (
-/obj/storage/closet/emergency,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "azv" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -7671,8 +7174,8 @@
 /area/station/storage/emergency)
 "aAA" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = 4;
 	pixel_y = -2
 	},
@@ -7714,21 +7217,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/storage/emergency)
-"aAB" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/storage/emergency)
-"aAC" = (
-/obj/machinery/space_heater,
-/obj/disposalpipe/segment/mail,
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/storage/emergency)
 "aAG" = (
 /obj/machinery/drone_recharger,
 /turf/simulated/floor/plating,
@@ -7739,17 +7227,6 @@
 	},
 /obj/machinery/light,
 /turf/simulated/floor/yellow/side,
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
-"aAI" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/turf/simulated/floor/yellow/side,
 /area/station/storage/auxillary{
 	name = "Tool Storage"
 	})
@@ -7818,8 +7295,8 @@
 /obj/disposalpipe/segment/produce{
 	dir = 4
 	},
-/obj/disposalpipe/segment/mail,
 /obj/decal/stripe_delivery,
+/obj/disposalpipe/segment/mail,
 /turf/simulated/floor,
 /area/station/hydroponics/lobby)
 "aAQ" = (
@@ -8083,30 +7560,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"aBT" = (
-/obj/machinery/atmospherics/unary/outlet_injector/active{
-	dir = 8
-	},
-/obj/table/reinforced/bar/auto,
-/obj/item/plate{
-	pixel_y = 2
-	},
-/obj/item/decoration/ashtray{
-	pixel_x = 8;
-	pixel_y = 11
-	},
-/obj/item/kitchen/utensil/fork{
-	dir = 4;
-	pixel_x = -1;
-	pixel_y = 3
-	},
-/obj/item/kitchen/utensil/spoon{
-	dir = 4;
-	pixel_x = -1;
-	pixel_y = -7
-	},
-/turf/simulated/floor/specialroom/bar/edge,
-/area/station/crew_quarters/cafeteria)
 "aBU" = (
 /obj/machinery/drainage,
 /turf/simulated/floor/black,
@@ -8142,57 +7595,6 @@
 	},
 /turf/simulated/floor,
 /area/station/storage/emergency)
-"aBZ" = (
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor,
-/area/station/storage/emergency)
-"aCa" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor,
-/area/station/storage/emergency)
-"aCb" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-8"
-	},
-/turf/simulated/floor,
-/area/station/storage/emergency)
-"aCc" = (
-/obj/disposalpipe/segment/mail,
-/obj/rack,
-/obj/item/device/analyzer/atmospheric{
-	pixel_x = 2
-	},
-/obj/item/extinguisher{
-	pixel_x = -5;
-	pixel_y = 1
-	},
-/obj/item/storage/toolbox/emergency{
-	pixel_x = 5;
-	pixel_y = -4
-	},
-/obj/item/storage/toolbox/emergency{
-	pixel_x = 5;
-	pixel_y = -8
-	},
-/obj/item/device/light/flashlight{
-	pixel_x = -6;
-	pixel_y = -4
-	},
-/obj/item/device/light/flashlight{
-	pixel_x = -1;
-	pixel_y = -5
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/storage/emergency)
 "aCd" = (
 /obj/storage/crate/freezer{
 	name = "Freezer"
@@ -8223,48 +7625,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/catering)
-"aCe" = (
-/obj/storage/crate/freezer,
-/obj/item/storage/box/donkpocket_kit{
-	pixel_x = -6;
-	pixel_y = 7
-	},
-/obj/item/storage/box/donkpocket_kit{
-	pixel_x = 1;
-	pixel_y = 5
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream/goodrandom{
-	pixel_x = 8;
-	pixel_y = 5
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
-	pixel_x = -7;
-	pixel_y = -1
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
-	pixel_x = -3;
-	pixel_y = -2
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
-	pixel_x = 1;
-	pixel_y = -3
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
-	pixel_x = 5;
-	pixel_y = -4
-	},
-/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
-	pixel_x = 9;
-	pixel_y = -5
-	},
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
-"aCf" = (
-/obj/disposalpipe/segment,
-/turf/simulated/wall/auto/supernorn,
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
 "aCg" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -8328,6 +7688,10 @@
 /obj/item/paper_bin,
 /obj/item/clipboard,
 /obj/item/pen,
+/obj/disposalpipe/segment/mail{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
 /turf/simulated/floor/green,
 /area/station/hydroponics/lobby)
 "aCk" = (
@@ -8338,6 +7702,9 @@
 	req_access_txt = "35"
 	},
 /obj/item/hand_labeler,
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
 /turf/simulated/floor/green,
 /area/station/hydroponics/lobby)
 "aCm" = (
@@ -8607,18 +7974,6 @@
 /obj/machinery/vending/coffee,
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/cafeteria)
-"aDc" = (
-/obj/table/reinforced/bar/auto,
-/obj/item/plate{
-	pixel_x = -2;
-	pixel_y = 3
-	},
-/obj/item/card_box/plain{
-	pixel_x = 7;
-	pixel_y = 13
-	},
-/turf/simulated/floor/specialroom/bar/edge,
-/area/station/crew_quarters/cafeteria)
 "aDd" = (
 /obj/stool,
 /turf/simulated/floor/black,
@@ -8632,17 +7987,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/cafeteria)
-"aDf" = (
-/obj/disposalpipe/segment{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/partyalarm{
-	dir = 8;
-	pixel_y = -26
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/cafeteria)
 "aDh" = (
 /obj/table/auto,
 /obj/item/clothing/glasses/spectro,
@@ -8810,42 +8154,11 @@
 	},
 /turf/simulated/floor/yellow/side,
 /area/station/storage/emergency)
-"aDk" = (
-/turf/simulated/floor/yellow/side,
-/area/station/storage/emergency)
 "aDl" = (
 /obj/machinery/portable_atmospherics/canister/air,
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/storage/emergency)
-"aDm" = (
-/obj/disposalpipe/segment,
-/obj/machinery/vending/air_vendor,
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/storage/emergency)
-"aDn" = (
-/obj/disposalpipe/segment/mail,
-/obj/rack,
-/obj/item/extinguisher{
-	pixel_x = -5;
-	pixel_y = 1
-	},
-/obj/item/wrench{
-	pixel_x = -4;
-	pixel_y = -3
-	},
-/obj/item/wrench{
-	pixel_x = -1;
-	pixel_y = -5
-	},
-/obj/item/device/light/glowstick{
-	pixel_x = 9;
-	pixel_y = -7
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/storage/emergency)
 "aDo" = (
 /obj/grille/steel,
 /turf/simulated/floor/plating,
@@ -8908,14 +8221,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"aDx" = (
-/obj/disposalpipe/junction{
-	icon_state = "pipe-j2"
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
 "aDz" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -8984,6 +8289,7 @@
 /obj/disposalpipe/segment{
 	dir = 4
 	},
+/obj/disposalpipe/segment/mail,
 /turf/simulated/floor/green/side{
 	dir = 1
 	},
@@ -8998,7 +8304,6 @@
 	},
 /area/station/hallway/primary/east)
 "aDL" = (
-/obj/disposalpipe/segment/mail,
 /turf/simulated/floor/green/side{
 	dir = 1
 	},
@@ -9026,14 +8331,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/east)
-"aDP" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/green/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
 "aDQ" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -9263,57 +8560,6 @@
 	icon_state = "fred2"
 	},
 /area/station/crew_quarters/cafeteria)
-"aEA" = (
-/obj/table/reinforced/bar/auto,
-/obj/machinery/phone,
-/turf/simulated/floor/specialroom/bar/edge{
-	dir = 4
-	},
-/area/station/crew_quarters/cafeteria)
-"aEB" = (
-/obj/table/reinforced/bar/auto,
-/obj/item/shaker/pepper{
-	pixel_x = -9;
-	pixel_y = 10
-	},
-/obj/item/shaker/salt{
-	pixel_x = -5;
-	pixel_y = 8
-	},
-/obj/item/shaker/mustard{
-	pixel_x = 3;
-	pixel_y = 8
-	},
-/obj/item/shaker/ketchup{
-	pixel_x = 8;
-	pixel_y = 6
-	},
-/turf/simulated/floor/specialroom/bar/edge{
-	dir = 8
-	},
-/area/station/crew_quarters/cafeteria)
-"aEC" = (
-/obj/machinery/light{
-	dir = 4
-	},
-/obj/table/reinforced/bar/auto,
-/obj/item_dispenser/icedispenser{
-	dir = 8;
-	pixel_x = 19;
-	pixel_y = 8
-	},
-/turf/simulated/floor/specialroom/bar/edge{
-	dir = 8
-	},
-/area/station/crew_quarters/cafeteria)
-"aEE" = (
-/obj/disposalpipe/segment,
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/crew_quarters/cafeteria)
-"aEJ" = (
-/obj/submachine/ATM,
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/storage/emergency)
 "aEK" = (
 /obj/machinery/atmospherics/pipe/simple{
 	level = 2
@@ -9338,7 +8584,7 @@
 /area/station/maintenance/solar/west)
 "aEP" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -9388,40 +8634,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"aES" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
-"aET" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
-"aEU" = (
-/obj/landmark/halloween,
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
-"aEV" = (
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/machinery/navbeacon/tour/cog1/tour3,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aEW" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -9440,13 +8652,6 @@
 	name = "astroturf"
 	},
 /area/station/hydroponics/bay)
-"aEY" = (
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/machinery/light,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aEZ" = (
 /obj/lattice{
 	dir = 6;
@@ -9458,19 +8663,6 @@
 	},
 /turf/space,
 /area/space)
-"aFb" = (
-/obj/table/wood/auto,
-/obj/item/paper_bin,
-/obj/item/pen,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname  - SS13";
-	tag = ""
-	},
-/obj/machinery/light/small/floor,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aFd" = (
 /obj/machinery/atmospherics/pipe/manifold{
 	dir = 8;
@@ -9683,21 +8875,6 @@
 	},
 /turf/simulated/floor/neutral/side,
 /area/station/hallway/primary/central)
-"aFG" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/machinery/atmospherics/pipe/simple{
-	dir = 9
-	},
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/central)
-"aFH" = (
-/obj/disposalpipe/junction{
-	dir = 4
-	},
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/central)
 "aFI" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -9722,94 +8899,12 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/central)
-"aFL" = (
-/obj/disposalpipe/segment/mail,
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/machinery/light/emergency{
-	dir = 4
-	},
-/turf/simulated/floor/neutral/side{
-	dir = 4
-	},
-/area/station/hallway/primary/central)
-"aFM" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/cafeteria)
-"aFN" = (
-/obj/disposalpipe/junction{
-	dir = 4;
-	icon_state = "pipe-j2"
-	},
-/obj/machinery/light/emergency{
-	dir = 8
-	},
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
 "aFO" = (
 /obj/disposalpipe/segment{
 	dir = 4
 	},
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/cafeteria)
-"aFP" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
-"aFQ" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/floor/carpet{
-	dir = 10;
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
-"aFR" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
-"aFS" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/stool/bar,
-/turf/simulated/floor/carpet{
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
-"aFT" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/floor/carpet{
-	dir = 6;
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
-"aFU" = (
-/obj/disposalpipe/junction{
-	dir = 4;
-	icon_state = "pipe-j2"
-	},
-/obj/machinery/light/emergency{
-	dir = 4
-	},
-/obj/machinery/vending/fortune,
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
 "aFX" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -9821,33 +8916,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
-"aFZ" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	tag = ""
-	},
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
-"aGa" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
-"aGb" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
 "aGc" = (
 /obj/machinery/light{
 	dir = 1;
@@ -9877,49 +8945,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/east)
-"aGg" = (
-/obj/disposalpipe/segment/mail,
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/neutral/corner,
-/area/station/hallway/primary/east)
-"aGh" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/stool/chair/comfy/blue{
-	dir = 1
-	},
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
-"aGi" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/vending/cards,
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
-"aGk" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/vending/snack,
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
-"aGl" = (
-/obj/machinery/light,
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/stool/chair/comfy/blue{
-	dir = 1
-	},
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
 "aGo" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/chapel/sanctuary)
@@ -10138,11 +9163,6 @@
 /obj/decal/poster/wallsign/pool,
 /turf/simulated/wall/auto/supernorn,
 /area/station/crew_quarters/pool)
-"aHc" = (
-/obj/disposalpipe/segment,
-/obj/decal/poster/wallsign/pool,
-/turf/simulated/wall/auto/supernorn,
-/area/station/crew_quarters/pool)
 "aHd" = (
 /turf/simulated/floor/neutral/side{
 	dir = 8
@@ -10154,46 +9174,12 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/central)
-"aHf" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/neutral/side{
-	dir = 4
-	},
-/area/station/hallway/primary/central)
-"aHh" = (
-/obj/disposalpipe/segment/mail,
-/obj/machinery/navbeacon/guardbot_buddytime,
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
-"aHi" = (
-/obj/machinery/navbeacon{
-	codes_txt = "patrol;next_patrol=pool";
-	location = "bar";
-	name = "bot navigation beacon"
-	},
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
 "aHj" = (
 /obj/disposalpipe/junction{
 	dir = 8
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"aHk" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail,
-/obj/machinery/light{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/neutral/side{
-	dir = 4
-	},
-/area/station/hallway/primary/east)
 "aHl" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 5;
@@ -10245,12 +9231,6 @@
 	dir = 8
 	},
 /area/station/chapel/sanctuary)
-"aHt" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/specialroom/chapel{
-	dir = 8
-	},
-/area/station/chapel/sanctuary)
 "aHu" = (
 /obj/machinery/light{
 	dir = 1;
@@ -10282,16 +9262,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"aHz" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/disposalpipe/segment,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aHA" = (
 /obj/storage/secure/closet/security/equipment,
 /obj/decal/stripe_caution,
@@ -10578,15 +9548,6 @@
 	dir = 1
 	},
 /area/station/crew_quarters/pool)
-"aIn" = (
-/obj/disposalpipe/trunk{
-	dir = 1
-	},
-/obj/machinery/disposal,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 1
-	},
-/area/station/crew_quarters/pool)
 "aIo" = (
 /obj/disposalpipe/segment/mail{
 	dir = 1;
@@ -10662,30 +9623,6 @@
 /obj/machinery/light,
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/cafeteria)
-"aIw" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
-"aIx" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/switch_junction{
-	dir = 4;
-	icon_state = "pipe-sj2";
-	mail_tag = "kitchen";
-	name = "kitchen mail router"
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aIy" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -10705,18 +9642,6 @@
 /obj/machinery/light/emergency,
 /turf/simulated/floor/neutral/side,
 /area/station/hallway/primary/east)
-"aIA" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
 "aIB" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -10768,22 +9693,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
-"aII" = (
-/obj/disposalpipe/segment{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/chapel/sanctuary)
-"aIJ" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 8
-	},
-/turf/simulated/floor/specialroom/chapel{
-	dir = 4
-	},
-/area/station/chapel/sanctuary)
 "aIK" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -10830,34 +9739,12 @@
 	icon_state = "fred2"
 	},
 /area/station/chapel/sanctuary)
-"aIQ" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fred2"
-	},
-/area/station/chapel/sanctuary)
 "aIR" = (
 /turf/simulated/floor/carpet{
 	dir = 5;
 	icon_state = "fred2"
 	},
 /area/station/chapel/sanctuary)
-"aIS" = (
-/obj/window/reinforced{
-	dir = 2
-	},
-/obj/machinery/light/emergency{
-	dir = 4
-	},
-/turf/simulated/floor/specialroom/chapel{
-	dir = 8
-	},
-/area/station/chapel/sanctuary)
-"aIT" = (
-/obj/disposalpipe/junction,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aIU" = (
 /obj/machinery/navbeacon{
 	codes_txt = "delivery;dir=4";
@@ -10884,28 +9771,10 @@
 /obj/decal/cleanable/dirt,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
-"aIX" = (
-/obj/disposalpipe/segment{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/obj/shrub,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aIY" = (
 /obj/submachine/weapon_vendor/security,
 /turf/simulated/floor,
 /area/station/security/main)
-"aJa" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aJb" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -11185,12 +10054,6 @@
 	},
 /turf/simulated/floor/blue/side,
 /area/station/medical/medbooth)
-"aJN" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/medbooth)
 "aJO" = (
 /obj/machinery/atmospherics/pipe/simple,
 /obj/cable{
@@ -11612,27 +10475,6 @@
 	dir = 1
 	},
 /area/station/medical/medbooth)
-"aKV" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "1-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 5
-	},
-/area/station/medical/medbooth)
-"aKW" = (
-/obj/storage/closet/emergency,
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/power/apc/autoname_west,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "aKX" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -11643,19 +10485,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"aKY" = (
-/obj/cable{
-	icon_state = "1-4"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/light_switch{
-	name = "W light switch";
-	pixel_x = -24
-	},
-/turf/simulated/floor/specialroom/chapel,
-/area/station/chapel/sanctuary)
 "aKZ" = (
 /obj/machinery/light,
 /obj/machinery/atmospherics/pipe/simple{
@@ -11675,14 +10504,6 @@
 	dir = 4
 	},
 /area/station/chapel/sanctuary)
-"aLb" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/specialroom/chapel{
-	dir = 8
-	},
-/area/station/chapel/sanctuary)
 "aLc" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -12047,24 +10868,9 @@
 "aMm" = (
 /turf/simulated/floor/specialroom/chapel,
 /area/station/chapel/sanctuary)
-"aMn" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/specialroom/chapel{
-	dir = 4
-	},
-/area/station/chapel/sanctuary)
 "aMo" = (
 /turf/simulated/floor/carpet,
 /area/station/chapel/sanctuary)
-"aMp" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "fred1"
-	},
-/area/station/chapel/sanctuary)
 "aMq" = (
 /obj/table/wood/auto,
 /obj/item/bible{
@@ -12161,15 +10967,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/bridge)
-"aMz" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor,
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
 "aMA" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -12343,33 +11140,6 @@
 /obj/machinery/drainage,
 /turf/simulated/floor/white,
 /area/station/medical/medbooth)
-"aNj" = (
-/obj/machinery/light_switch{
-	name = "E light switch";
-	pixel_x = 24
-	},
-/obj/disposalpipe/segment,
-/obj/machinery/optable,
-/obj/item/suture{
-	pixel_x = 6;
-	pixel_y = 2
-	},
-/obj/item/circular_saw{
-	pixel_x = 1;
-	pixel_y = -7
-	},
-/obj/item/scalpel{
-	pixel_x = 4;
-	pixel_y = -11
-	},
-/obj/item/reagent_containers/iv_drip/blood{
-	pixel_x = 2;
-	pixel_y = 1
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbooth)
 "aNk" = (
 /turf/simulated/floor/red/corner{
 	dir = 4
@@ -12412,17 +11182,6 @@
 	dir = 8
 	},
 /area/station/chapel/sanctuary)
-"aNo" = (
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/machinery/atmospherics/unary/outlet_injector/active{
-	dir = 4
-	},
-/turf/simulated/floor/specialroom/chapel{
-	dir = 8
-	},
-/area/station/chapel/sanctuary)
 "aNp" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 4
@@ -12513,25 +11272,6 @@
 	icon_state = "fred1"
 	},
 /area/station/chapel/sanctuary)
-"aNz" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 5;
-	name = "autoname - Mining";
-	network = "Mining";
-	tag = ""
-	},
-/obj/machinery/power/apc/autoname_south,
-/turf/simulated/floor/yellow/side{
-	dir = 10
-	},
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
 "aNB" = (
 /obj/table/wood/auto,
 /obj/item/device/light/candle{
@@ -12936,11 +11676,6 @@
 	dir = 1
 	},
 /area/station/chapel/sanctuary)
-"aOG" = (
-/obj/stool,
-/obj/machinery/atmospherics/pipe/simple,
-/turf/simulated/floor/carpet,
-/area/station/chapel/sanctuary)
 "aOH" = (
 /obj/table/wood/round/auto,
 /obj/item/reagent_containers/glass/bottle/antitoxin{
@@ -14156,7 +12891,7 @@
 /area/station/crew_quarters/juryroom)
 "aSg" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -14324,16 +13059,6 @@
 /obj/item/device/light/candle,
 /turf/simulated/floor/specialroom/chapel,
 /area/station/chapel/sanctuary)
-"aSI" = (
-/obj/machinery/light,
-/turf/simulated/floor/specialroom/chapel{
-	dir = 1
-	},
-/area/station/chapel/sanctuary)
-"aSJ" = (
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor/specialroom/chapel,
-/area/station/chapel/sanctuary)
 "aSL" = (
 /obj/machinery/power/data_terminal,
 /obj/cable{
@@ -14671,13 +13396,6 @@
 /obj/machinery/atmospherics/pipe/simple,
 /turf/simulated/wall/auto/supernorn,
 /area/station/chapel/sanctuary)
-"aTN" = (
-/obj/machinery/door/unpowered/wood/pyro{
-	autoclose = 0;
-	name = "Confession Booth"
-	},
-/turf/simulated/floor/black,
-/area/station/chapel/sanctuary)
 "aTO" = (
 /obj/window/reinforced{
 	dir = 1
@@ -15017,24 +13735,6 @@
 	},
 /turf/simulated/wall/auto/supernorn/wood,
 /area/station/crew_quarters/pool)
-"aUD" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine{
-	pixel_x = -1;
-	pixel_y = 11
-	},
-/obj/item/matchbook{
-	pixel_x = -3;
-	pixel_y = -3
-	},
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
 "aUE" = (
 /turf/simulated/floor/black,
 /area/station/crew_quarters/jazz)
@@ -15191,35 +13891,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/chapel/sanctuary)
-"aVb" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor/black,
-/area/station/chapel/sanctuary)
-"aVc" = (
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/chapel/sanctuary)
-"aVd" = (
-/obj/stool/chair{
-	dir = 4
-	},
-/obj/disposalpipe/switch_junction{
-	desc = "An underfloor mail pipe.";
-	mail_tag = "chapel";
-	name = "chapel mail router"
-	},
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fred2"
-	},
-/area/station/chapel/sanctuary)
 "aVg" = (
 /obj/stool/chair{
 	dir = 8
@@ -15229,16 +13900,6 @@
 	icon_state = "fred2"
 	},
 /area/station/chapel/sanctuary)
-"aVh" = (
-/obj/machinery/firealarm/east,
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-10"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbooth)
 "aVi" = (
 /obj/stool/chair{
 	dir = 8
@@ -15434,12 +14095,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/central)
-"aVG" = (
-/obj/player_piano,
-/turf/simulated/floor/specialroom/chapel{
-	dir = 4
-	},
-/area/station/chapel/sanctuary)
 "aVI" = (
 /obj/machinery/light{
 	dir = 4
@@ -18139,25 +16794,6 @@
 /obj/grille/steel,
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
-"bdt" = (
-/obj/disposalpipe/segment/mail,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 9;
-	invisibility = 101;
-	name = "autoname - Entertainment";
-	network = "Zeta";
-	tag = ""
-	},
-/obj/machinery/atmospherics/pipe/simple{
-	dir = 4
-	},
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fred1"
-	},
-/area/station/chapel/sanctuary)
 "bdu" = (
 /obj/securearea{
 	desc = "";
@@ -18418,22 +17054,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
-"beh" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/machinery/light{
-	dir = 1;
-	pixel_y = 21
-	},
-/obj/machinery/light_switch{
-	name = "N light switch";
-	pixel_y = 24
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
 "bem" = (
 /obj/machinery/navbeacon/tour/cog1/tour4,
 /obj/landmark/gps_waypoint,
@@ -18481,20 +17101,6 @@
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor,
 /area/station/crew_quarters/courtroom)
-"bet" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/vending/capsule,
-/turf/simulated/floor/neutral/side,
-/area/station/hallway/primary/east)
-"beu" = (
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/chapel/sanctuary)
 "bev" = (
 /obj/decal/poster/wallsign/stencil/right/c{
 	pixel_x = 13
@@ -18961,7 +17567,7 @@
 /area/station/maintenance/central)
 "bgb" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -19484,7 +18090,7 @@
 /area/station/maintenance/central)
 "bhF" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -20790,14 +19396,6 @@
 	dir = 1
 	},
 /area/station/crew_quarters/market)
-"bmt" = (
-/obj/noticeboard/persistent{
-	name = "Bar persistent notice board";
-	persistent_id = "bar";
-	pixel_x = 32
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/cafeteria)
 "bmu" = (
 /turf/simulated/floor/neutral/corner{
 	dir = 1
@@ -22564,6 +21162,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint2";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor,
 /area/station/maintenance/east)
 "bty" = (
@@ -22821,6 +21423,14 @@
 	dir = 4
 	},
 /area/station/turret_protected/ai_upload)
+"buW" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/turf/simulated/floor/carpet{
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "buX" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -24912,8 +23522,49 @@
 /turf/simulated/floor/grime,
 /area/station/storage/warehouse)
 "bEG" = (
+/obj/storage/crate{
+	desc = "Whoa! What will they think of next?";
+	name = "Boxes in a Box"
+	},
+/obj/item/storage/box{
+	pixel_x = -7;
+	pixel_y = 8
+	},
+/obj/item/storage/box{
+	pixel_x = 1;
+	pixel_y = 8
+	},
+/obj/item/storage/box{
+	pixel_x = 9;
+	pixel_y = 8
+	},
+/obj/item/storage/box{
+	pixel_x = -8;
+	pixel_y = 5
+	},
+/obj/item/storage/box{
+	pixel_y = 5
+	},
+/obj/item/storage/box{
+	pixel_x = 8;
+	pixel_y = 5
+	},
+/obj/item/storage/box{
+	pixel_x = -9;
+	pixel_y = 2
+	},
+/obj/item/storage/box{
+	pixel_x = -2;
+	pixel_y = 2
+	},
+/obj/item/storage/box{
+	pixel_x = 7;
+	pixel_y = 2
+	},
+/obj/item/storage/box{
+	pixel_y = -1
+	},
 /obj/disposalpipe/segment/mail,
-/obj/storage/secure/closet/engineering/cargo,
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
 "bEH" = (
@@ -25241,6 +23892,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
 "bGK" = (
@@ -26359,9 +25014,6 @@
 /turf/simulated/floor/black,
 /area/station/crew_quarters/hor)
 "bLk" = (
-/obj/stool/chair{
-	dir = 8
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
@@ -26371,6 +25023,9 @@
 	name = "autoname - SS13"
 	},
 /obj/blind_switch/area/north,
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/hor)
 "bLl" = (
@@ -27459,6 +26114,12 @@
 /obj/machinery/power/data_terminal,
 /turf/simulated/floor,
 /area/station/routing/airbridge)
+"bOP" = (
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/specialroom/bar/edge{
+	dir = 8
+	},
+/area/station/crew_quarters/cafeteria)
 "bOR" = (
 /obj/submachine/cargopad{
 	name = "Mechanical Workshop Pad"
@@ -27598,6 +26259,14 @@
 	pixel_x = -4;
 	pixel_y = 8
 	},
+/obj/item/hand_labeler{
+	pixel_x = 4;
+	pixel_y = -3
+	},
+/obj/item/hand_labeler{
+	pixel_x = -6;
+	pixel_y = 4
+	},
 /turf/simulated/floor/neutral/side,
 /area/station/quartermaster/office)
 "bPp" = (
@@ -27799,12 +26468,6 @@
 	dir = 8
 	},
 /area/station/hallway/primary/south)
-"bPQ" = (
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "bPR" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -27927,7 +26590,7 @@
 /area/station/engine/engineering/ce)
 "bQp" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -27965,16 +26628,6 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/storage/warehouse)
-"bQv" = (
-/obj/item/paper{
-	info = "Holy crap were you born in a barn? What the hell is wrong with you? Tidy this crap up. - W";
-	name = "a furious note"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/grime,
-/area/station/storage/warehouse)
 "bQw" = (
 /obj/item/weldingtool,
 /obj/cable{
@@ -28483,12 +27136,12 @@
 /turf/simulated/floor/grime,
 /area/station/science/lab)
 "bSp" = (
-/obj/stool/chair{
-	dir = 8
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/grime,
 /area/station/science/lab)
 "bSq" = (
@@ -29521,16 +28174,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/south)
-"bVL" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "bVM" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -29876,13 +28519,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/primary/south)
-"bWO" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail,
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "bWP" = (
 /obj/disposalpipe/junction{
 	dir = 1
@@ -30184,11 +28820,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/primary/south)
-"bXT" = (
-/obj/table/auto,
-/obj/item/hand_labeler,
-/turf/simulated/floor/plating,
-/area/space)
 "bXU" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -30250,7 +28881,7 @@
 /area/station/hallway/primary/south)
 "bYd" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = 9
@@ -33581,7 +32212,7 @@
 	pixel_x = 5;
 	pixel_y = 7
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/storage/toolbox/emergency{
@@ -35051,34 +33682,8 @@
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "cnN" = (
-/obj/rack,
-/obj/item/circuitboard/qmorder{
-	pixel_x = -5;
-	pixel_y = 5
-	},
-/obj/item/circuitboard/robot_module_rewriter{
-	pixel_x = -5;
-	pixel_y = -3
-	},
-/obj/item/circuitboard/barcode_qm{
-	pixel_x = -5;
-	pixel_y = 1
-	},
-/obj/item/circuitboard/barcode{
-	pixel_x = 5;
-	pixel_y = 7
-	},
-/obj/item/circuitboard/card{
-	pixel_x = 5;
-	pixel_y = 3
-	},
-/obj/item/circuitboard/cloning{
-	pixel_x = 5;
-	pixel_y = -1
-	},
-/obj/item/circuitboard/teleporter{
-	pixel_x = 5;
-	pixel_y = -5
+/obj/rack/organized/techstorage_eng{
+	order_override = "zigzag"
 	},
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
@@ -35162,7 +33767,7 @@
 	pixel_x = 10;
 	pixel_y = 6
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -3;
 	pixel_y = 2
 	},
@@ -37497,6 +36102,12 @@
 /obj/machinery/light,
 /turf/simulated/floor/plating,
 /area/station/routing/medsci)
+"cvA" = (
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/turf/space,
+/area/station/maintenance/northeast)
 "cvD" = (
 /obj/machinery/dialysis,
 /turf/simulated/floor/redwhite{
@@ -38071,6 +36682,19 @@
 	dir = 6
 	},
 /area/station/janitor/supply)
+"cxl" = (
+/obj/table/wood/auto,
+/obj/item/pen,
+/obj/item/paper_bin,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname  - SS13";
+	tag = ""
+	},
+/obj/machinery/light/small/floor,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "cxo" = (
 /obj/window_blinds/cog2/left,
 /obj/mapping_helper/wingrille_spawn/auto,
@@ -38744,7 +37368,7 @@
 /area/abandonedship)
 "cAG" = (
 /obj/storage/crate,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/airless/scorched,
 /area/abandonedship)
@@ -38976,7 +37600,7 @@
 "cBq" = (
 /obj/table/wood/auto,
 /obj/item/reagent_containers/food/drinks/drinkingglass,
-/obj/item/pinpointer,
+/obj/item/pinpointer/disk,
 /turf/simulated/floor/carpet{
 	dir = 6;
 	icon_state = "fred2"
@@ -39182,34 +37806,8 @@
 /turf/simulated/floor/bluewhite,
 /area/station/medical/medbay/lobby)
 "cCc" = (
-/obj/rack,
-/obj/item/circuitboard/qmsupply{
-	pixel_x = -5;
-	pixel_y = 5
-	},
-/obj/item/circuitboard/telescope{
-	pixel_x = -5;
-	pixel_y = 1
-	},
-/obj/item/circuitboard/powermonitor{
-	pixel_x = -5;
-	pixel_y = -3
-	},
-/obj/item/circuitboard/genetics{
-	pixel_x = 5;
-	pixel_y = 7
-	},
-/obj/item/circuitboard/powermonitor_smes{
-	pixel_x = 5;
-	pixel_y = 3
-	},
-/obj/item/circuitboard/arcade{
-	pixel_x = 5;
-	pixel_y = -5
-	},
-/obj/item/circuitboard/operating{
-	pixel_x = 5;
-	pixel_y = -1
+/obj/rack/organized/techstorage_med{
+	order_override = "zigzag"
 	},
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
@@ -39602,19 +38200,6 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/quartermaster/refinery)
-"cKD" = (
-/obj/table/wood/auto,
-/obj/item/plate{
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine{
-	pixel_x = -1;
-	pixel_y = 11
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fred2"
-	},
-/area/station/crew_quarters/cafeteria)
 "cKR" = (
 /obj/landmark/start/job/engineer,
 /obj/decal/tile_edge/stripe/extra_big,
@@ -39635,6 +38220,20 @@
 /obj/machinery/portable_atmospherics/canister/air,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
+"cLi" = (
+/obj/machinery/door/airlock/pyro/glass,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/specialroom/chapel{
+	dir = 1
+	},
+/area/station/chapel/sanctuary)
+"cMe" = (
+/obj/decal/cleanable/rust/jen,
+/turf/simulated/floor/grey/whitegrime/other,
+/area/station/maintenance/northeast)
 "cMA" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 4;
@@ -39687,6 +38286,16 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
+"cOx" = (
+/obj/machinery/door/airlock/pyro{
+	name = "Kitchen";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/cafeteria)
 "cOy" = (
 /obj/machinery/atmospherics/pipe/simple/insulated,
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
@@ -39732,27 +38341,6 @@
 	},
 /turf/simulated/floor/yellow/side,
 /area/station/engine/ptl)
-"cRc" = (
-/obj/table/auto,
-/obj/item/kitchen/utensil/knife{
-	pixel_x = -9;
-	pixel_y = 6
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/icing{
-	pixel_x = -3;
-	pixel_y = 7
-	},
-/obj/item/reagent_containers/food/drinks/drinkingglass/icing{
-	pixel_x = 1;
-	pixel_y = 8
-	},
-/obj/disposalpipe/segment/food,
-/obj/item/kitchen/rollingpin{
-	pixel_x = 4;
-	pixel_y = 2
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "cRg" = (
 /obj/landmark/pest,
 /turf/simulated/floor/specialroom/bar,
@@ -39848,12 +38436,6 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
-"cUw" = (
-/obj/item/device/radio/intercom/botany{
-	dir = 1
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "cUP" = (
 /obj/machinery/launcher_loader/south{
 	door_delay = 5
@@ -39950,6 +38532,15 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/yellow,
 /area/station/storage/primary)
+"cXe" = (
+/obj/table/auto,
+/obj/disposalpipe/segment/food,
+/obj/machinery/light{
+	dir = 8;
+	tag = ""
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "cYa" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -40009,14 +38600,6 @@
 /area/station/storage/auxillary{
 	name = "Tool Storage"
 	})
-"dae" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Emergency Storage"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/storage/emergency)
 "daU" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	dir = 4
@@ -40041,27 +38624,6 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/main)
-"dcu" = (
-/obj/table/reinforced/auto,
-/obj/item/storage/toolbox/emergency{
-	pixel_y = 8
-	},
-/obj/item/hand_labeler{
-	pixel_x = -6;
-	pixel_y = 4
-	},
-/obj/item/hand_labeler{
-	pixel_x = 4;
-	pixel_y = -3
-	},
-/obj/decal/stripe_caution,
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
-/turf/simulated/floor,
-/area/station/quartermaster/office)
 "dcw" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -40094,6 +38656,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "centmaint1";
+	name = "Central Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "ddy" = (
@@ -40120,6 +38686,16 @@
 	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay/treatment)
+"deH" = (
+/obj/machinery/atmospherics/pipe/simple{
+	level = 2
+	},
+/obj/machinery/power/apc/autoname_north,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "dfe" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -40274,6 +38850,48 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/baroffice)
+"dlj" = (
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/black,
+/area/station/chapel/sanctuary)
+"dmH" = (
+/obj/storage/crate/freezer,
+/obj/item/storage/box/donkpocket_kit{
+	pixel_x = -6;
+	pixel_y = 7
+	},
+/obj/item/storage/box/donkpocket_kit{
+	pixel_x = 1;
+	pixel_y = 5
+	},
+/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
+	pixel_x = -7;
+	pixel_y = -1
+	},
+/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
+	pixel_x = -3;
+	pixel_y = -2
+	},
+/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
+	pixel_x = 1;
+	pixel_y = -3
+	},
+/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
+	pixel_x = 5;
+	pixel_y = -4
+	},
+/obj/item/reagent_containers/food/snacks/yoghurt/frozen{
+	pixel_x = 9;
+	pixel_y = -5
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "dnA" = (
 /obj/cable/orange{
 	icon_state = "1-2"
@@ -40319,6 +38937,20 @@
 	},
 /turf/simulated/floor/green,
 /area/station/turret_protected/Zeta)
+"dpk" = (
+/obj/stove,
+/obj/item/soup_pot,
+/obj/item/ladle,
+/obj/noticeboard/persistent{
+	name = "Kitchen persistent notice board";
+	persistent_id = "kitchen"
+	},
+/obj/item/matchbook{
+	pixel_x = 10;
+	pixel_y = 9
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "dpE" = (
 /obj/machinery/power/terminal{
 	dir = 4
@@ -40351,6 +38983,28 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/grime,
 /area/station/maintenance/disposal)
+"dqC" = (
+/obj/table/auto,
+/obj/item/cigpacket/propuffs{
+	pixel_x = -9;
+	pixel_y = -2
+	},
+/obj/item/clothing/mask/cigarette/propuffs{
+	pixel_x = -2;
+	pixel_y = -5
+	},
+/obj/item/decoration/ashtray,
+/obj/machinery/light,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
+	pixel_x = 4;
+	pixel_y = 8
+	},
+/obj/item/reagent_containers/food/drinks/tea{
+	pixel_x = -7;
+	pixel_y = 18
+	},
+/turf/simulated/floor/wood/two,
+/area/station/medical/staff)
 "dqE" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/disposalpipe/segment,
@@ -40372,12 +39026,44 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/plating,
 /area/station/engine/coldloop)
+"dsc" = (
+/obj/machinery/door/airlock/pyro/glass{
+	dir = 4;
+	name = "Cafeteria"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/crew_quarters/cafeteria)
+"dsf" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 9
+	},
+/obj/disposalpipe/junction{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/central)
 "dsA" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
 /turf/simulated/wall/auto/supernorn,
 /area/station/turret_protected/Zeta)
+"dsB" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbooth)
 "dsG" = (
 /obj/table/auto,
 /obj/item/plate{
@@ -40613,10 +39299,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/science/chemistry)
-"dxI" = (
-/obj/item/swingsignfolded,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "dxS" = (
 /obj/table/reinforced/auto,
 /obj/mapping_helper/firedoor_spawn,
@@ -40652,6 +39334,17 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/supplylobby)
+"dyx" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/junction{
+	dir = 8
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "dze" = (
 /obj/effects/background_objects/x0{
 	pixel_x = -468;
@@ -40781,6 +39474,11 @@
 	},
 /obj/disposalpipe/segment,
 /obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engairlock";
+	name = "Engineering Airlock";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/engine)
 "dFg" = (
@@ -40821,10 +39519,6 @@
 	dir = 8
 	},
 /area/station/security/main)
-"dGs" = (
-/obj/landmark/pest,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/cafeteria)
 "dHa" = (
 /obj/lattice{
 	dir = 6;
@@ -40995,6 +39689,11 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/medsci)
+"dOI" = (
+/obj/stool,
+/obj/machinery/atmospherics/pipe/simple,
+/turf/simulated/floor/carpet,
+/area/station/chapel/sanctuary)
 "dON" = (
 /obj/machinery/door/airlock/pyro/glass/security{
 	dir = 4
@@ -41028,6 +39727,12 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/atmos/hookups/east)
+"dPW" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/storage/hydroponics)
 "dQf" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -41149,18 +39854,29 @@
 	icon_state = "Stairs_wide"
 	},
 /area/station/security/main)
+"dSo" = (
+/obj/table/auto,
+/obj/machinery/phone{
+	pixel_x = -7;
+	pixel_y = 6
+	},
+/obj/item/satchel/hydro{
+	pixel_x = 9;
+	pixel_y = 10
+	},
+/obj/item/satchel/hydro{
+	pixel_x = -7;
+	pixel_y = 2
+	},
+/turf/simulated/floor/green/side{
+	dir = 1
+	},
+/area/station/hydroponics/bay)
 "dSW" = (
 /obj/landmark/pest,
 /obj/disposalpipe/segment/mail,
 /turf/simulated/floor,
 /area/station/science/lobby)
-"dTk" = (
-/obj/machinery/atmospherics/pipe/manifold{
-	level = 2
-	},
-/obj/landmark/pest,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/catering)
 "dTQ" = (
 /obj/table/reinforced/auto,
 /obj/machinery/door/airlock/pyro/glass/windoor{
@@ -41235,12 +39951,18 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
-/obj/machinery/door/airlock/pyro/glass/mining,
 /obj/mapping_helper/access/cargo,
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
+/obj/machinery/door/airlock/pyro/glass/mining,
 /turf/simulated/floor,
 /area/station/crew_quarters/supplylobby)
+"dWk" = (
+/obj/disposalpipe/segment{
+	dir = 8
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "dWp" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	dir = 4;
@@ -41382,6 +40104,15 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/solar/north)
+"eaB" = (
+/obj/machinery/computer/stockexchange{
+	dir = 8
+	},
+/obj/machinery/alarm{
+	pixel_y = 23
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "ebD" = (
 /obj/disposalpipe/segment,
 /obj/cable{
@@ -41389,17 +40120,6 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
-"edb" = (
-/obj/decal/tile_edge/stripe/extra_big{
-	dir = 4
-	},
-/obj/machinery/firealarm/north,
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/storage/cart,
-/turf/simulated/floor/grime,
-/area/station/storage/hydroponics)
 "edo" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	dir = 8;
@@ -41468,6 +40188,11 @@
 	dir = 1
 	},
 /area/station/mining/staff_room)
+"ehD" = (
+/obj/table/auto,
+/obj/disposalpipe/segment/food,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "ehU" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -41690,6 +40415,18 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"erT" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/produce{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/yellow/corner{
+	dir = 8
+	},
+/area/station/hallway/primary/east)
 "erY" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -41742,6 +40479,18 @@
 	dir = 5
 	},
 /area/station/engine/ptl)
+"etO" = (
+/obj/storage/closet/emergency,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/power/apc/autoname_west,
+/obj/decal/stripe_delivery,
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "etV" = (
 /obj/machinery/door/airlock/pyro{
 	dir = 4;
@@ -41752,6 +40501,18 @@
 /obj/mapping_helper/access/kitchen,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/cafeteria)
+"etY" = (
+/obj/table/auto,
+/obj/item/gun/russianrevolver{
+	pixel_x = -1;
+	pixel_y = 15
+	},
+/obj/item/storage/firstaid/toxin{
+	pixel_x = 12;
+	pixel_y = 10
+	},
+/turf/simulated/floor/grime,
+/area/station/crew_quarters/baroffice)
 "eup" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/item/device/radio/intercom/medical{
@@ -41824,6 +40585,14 @@
 /obj/machinery/power/solar/west,
 /turf/simulated/floor/airless/solar,
 /area/station/solar/west)
+"ewn" = (
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "ewr" = (
 /obj/machinery/atmospherics/pipe/simple/insulated,
 /obj/grille/catwalk{
@@ -41853,6 +40622,16 @@
 	icon_state = "catwalk_cross"
 	},
 /area/space)
+"exA" = (
+/obj/machinery/light_switch{
+	name = "S light switch";
+	pixel_y = -24
+	},
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/turf/simulated/floor/grime,
+/area/station/hallway/primary/east)
 "exI" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -41906,6 +40685,14 @@
 	},
 /turf/simulated/floor,
 /area/station/bridge)
+"eyE" = (
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/central)
 "ezA" = (
 /obj/machinery/door/airlock/pyro{
 	dir = 4;
@@ -42015,6 +40802,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/security,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "side"
+	},
 /turf/simulated/floor,
 /area/station/security/secwing)
 "eCa" = (
@@ -42047,6 +40839,14 @@
 	},
 /turf/simulated/floor,
 /area/station/science/bot_storage)
+"eCT" = (
+/obj/machinery/disposal/mail{
+	mail_tag = "kitchen";
+	name = "mail chute-'Kitchen'"
+	},
+/obj/disposalpipe/trunk/mail,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "eDu" = (
 /obj/landmark/spawner/artifact,
 /turf/simulated/floor/shuttlebay,
@@ -42069,6 +40869,22 @@
 /obj/disposalpipe/segment/morgue,
 /turf/space,
 /area/space)
+"eDM" = (
+/obj/machinery/phone/wall,
+/turf/simulated/wall/auto/supernorn,
+/area/station/crew_quarters/kitchen)
+"eEx" = (
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/turf/space,
+/area/space)
 "eEI" = (
 /obj/machinery/disposal{
 	name = "Test Chamber Chute"
@@ -42139,13 +40955,13 @@
 	dir = 0;
 	name = "autoname - SS13"
 	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
 /obj/landmark/start/job/botanist,
 /obj/machinery/alarm{
 	pixel_y = 23
 	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
 /turf/simulated/floor/green/side{
 	dir = 1
 	},
@@ -42261,20 +41077,6 @@
 /obj/machinery/computer/robotics,
 /turf/simulated/floor/circuit/green,
 /area/station/turret_protected/Zeta)
-"eJM" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/door/airlock/pyro{
-	name = "Catering Storage";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/bar,
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/black,
-/area/station/storage/emergency)
 "eJV" = (
 /obj/machinery/atmospherics/pipe/manifold{
 	level = 2
@@ -42282,6 +41084,24 @@
 /obj/machinery/meter,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/hotloop)
+"eKd" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	dir = 4;
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "main"
+	},
+/turf/simulated/floor,
+/area/station/hallway/secondary/exit)
 "eKk" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -42340,6 +41160,21 @@
 /obj/disposalpipe/segment/mail,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"eNa" = (
+/obj/table/reinforced/auto,
+/obj/item/cigpacket{
+	pixel_x = 11
+	},
+/obj/item/device/light/zippo{
+	pixel_x = 7;
+	pixel_y = 11
+	},
+/obj/item/paper/book/from_file/pocketguide/quartermaster{
+	pixel_x = -6;
+	pixel_y = 3
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "eOb" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/light/small{
@@ -42381,6 +41216,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining1";
+	name = "Mining";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "ePw" = (
@@ -42422,6 +41262,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engairlock";
+	name = "Engineering Airlock";
+	enter_id = "hangar"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/engine)
 "eRW" = (
@@ -42521,6 +41366,10 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/hangar/qm)
+"eVe" = (
+/obj/machinery/vending/snack,
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "eVn" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -42785,12 +41634,27 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
 "fhq" = (
 /obj/effects/background_objects/fortuna,
 /turf/space,
 /area/space)
+"fhw" = (
+/obj/stool/chair{
+	dir = 4
+	},
+/obj/machinery/light{
+	dir = 1;
+	pixel_y = 21
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "fhM" = (
 /obj/submachine/seed_manipulator{
 	dir = 8
@@ -42888,12 +41752,20 @@
 	icon_state = "red2"
 	},
 /area/station/security/main)
-"flp" = (
-/obj/machinery/light/small{
-	dir = 8
+"fkW" = (
+/obj/item/device/radio/intercom/botany{
+	dir = 1
 	},
-/turf/simulated/floor/grime,
-/area/station/storage/hydroponics)
+/obj/storage/cart/hotdog{
+	req_access_txt = "28"
+	},
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "fmu" = (
 /obj/landmark/pest,
 /obj/machinery/atmospherics/unary/outlet_injector/active{
@@ -42904,6 +41776,15 @@
 	icon_state = "fred1"
 	},
 /area/station/chapel/sanctuary)
+"fmP" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "fna" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 1
@@ -43023,6 +41904,10 @@
 	},
 /turf/simulated/floor,
 /area/station/ai_monitored/armory)
+"fpm" = (
+/obj/storage/secure/closet/civilian/kitchen,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "fpq" = (
 /obj/machinery/atmospherics/pipe/simple/insulated/cold{
 	dir = 10
@@ -43191,6 +42076,14 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"fts" = (
+/obj/landmark/pest,
+/obj/disposalpipe/segment/mail{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "ftU" = (
 /obj/disposalpipe/segment,
 /turf/simulated/wall/auto/supernorn,
@@ -43462,6 +42355,16 @@
 /obj/machinery/light/small,
 /turf/simulated/floor/black,
 /area/station/ai_monitored/armory)
+"fFV" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/disposalpipe/junction,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "fFX" = (
 /obj/machinery/space_heater,
 /obj/machinery/alarm{
@@ -43491,14 +42394,9 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/storage/hydroponics)
-"fIl" = (
-/obj/machinery/light/small{
-	dir = 8
-	},
-/obj/machinery/atmospherics/unary/portables_connector{
-	dir = 4
-	},
-/turf/simulated/floor/plating,
+"fHo" = (
+/obj/table/auto,
+/turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
 "fIx" = (
 /obj/rack,
@@ -43667,6 +42565,11 @@
 	icon_state = "1-2"
 	},
 /obj/mapping_helper/access/security,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/secwing)
 "fOw" = (
@@ -43836,6 +42739,16 @@
 	},
 /turf/simulated/floor/wood/seven,
 /area/station/ranch)
+"fUp" = (
+/obj/machinery/door/airlock/pyro/glass,
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "fUO" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/cable{
@@ -43848,6 +42761,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint2";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor,
 /area/station/maintenance/east)
 "fVm" = (
@@ -43888,6 +42805,11 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
 "fWA" = (
@@ -44149,6 +43071,11 @@
 	},
 /turf/simulated/floor,
 /area/station/ai_monitored/armory)
+"ghZ" = (
+/turf/simulated/floor/carpet{
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "gio" = (
 /obj/disposalpipe/segment{
 	dir = 8;
@@ -44183,6 +43110,13 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/medical/crematorium)
+"giH" = (
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "giI" = (
 /obj/machinery/conveyor/EW{
 	id = "ghostdrone"
@@ -44209,18 +43143,6 @@
 	},
 /turf/simulated/floor/white,
 /area/station/medical/staff)
-"gkw" = (
-/obj/machinery/door/airlock/pyro{
-	dir = 4;
-	name = "Catering Storage";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/bar,
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/crew_quarters/catering)
 "glb" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
@@ -44235,6 +43157,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "gli" = (
@@ -44343,6 +43270,20 @@
 	dir = 4
 	},
 /area/station/solar/south)
+"goO" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/obj/item/shaker/mustard{
+	pixel_x = 3;
+	pixel_y = 8
+	},
+/obj/item/shaker/ketchup{
+	pixel_x = 8;
+	pixel_y = 6
+	},
+/turf/simulated/floor/carpet,
+/area/station/crew_quarters/cafeteria)
 "gpc" = (
 /obj/machinery/door/window/northright{
 	name = "Chaplain's Office";
@@ -44395,6 +43336,16 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/captain)
+"gqP" = (
+/obj/stool/chair/comfy/blue{
+	dir = 1
+	},
+/obj/disposalpipe/segment{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "gra" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 9
@@ -44413,11 +43364,35 @@
 /obj/decal/poster/wallsign/hazard_caution,
 /turf/simulated/floor/plating,
 /area/station/hallway/primary/south)
+"gro" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "grs" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "main"
+	},
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
+"gse" = (
+/obj/cable{
+	icon_state = "1-4"
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/light_switch{
+	name = "W light switch";
+	pixel_x = -24
+	},
+/turf/simulated/floor/specialroom/chapel,
+/area/station/chapel/sanctuary)
 "gsj" = (
 /obj/grille/catwalk{
 	dir = 6
@@ -44444,6 +43419,19 @@
 /obj/landmark/pest,
 /turf/simulated/floor/carpet/grime,
 /area/station/security/hos)
+"guJ" = (
+/obj/machinery/door_control{
+	id = "kitchen";
+	name = "Kitchen Shutter Control";
+	pixel_x = -24
+	},
+/obj/disposalpipe/segment{
+	dir = 1;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "guT" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
@@ -44455,11 +43443,6 @@
 	},
 /turf/unsimulated/wall/auto/adventure/shuttle/dark,
 /area/listeningpost)
-"gvB" = (
-/obj/disposalpipe/segment/mail,
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/chapel/sanctuary)
 "gwd" = (
 /obj/cable/yellow{
 	icon_state = "2-8"
@@ -44506,6 +43489,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engairlock";
+	name = "Engineering Airlock";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/hangar/engine)
 "gzr" = (
@@ -44583,6 +43571,16 @@
 	dir = 4
 	},
 /area/station/medical/medbay)
+"gEZ" = (
+/obj/lattice{
+	dir = 10;
+	icon_state = "lattice-dir-b"
+	},
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/turf/space,
+/area/space)
 "gFk" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -44670,6 +43668,27 @@
 /obj/mapping_helper/access/chemistry,
 /turf/simulated/floor/plating,
 /area/station/science/lobby)
+"gIt" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/door/airlock/pyro/glass{
+	name = "Medical Booth";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbooth)
+"gIU" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/storage/emergency)
 "gJi" = (
 /obj/grille/catwalk,
 /obj/cable/orange{
@@ -44776,7 +43795,7 @@
 /area/station/crew_quarters/captain)
 "gKQ" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -44806,37 +43825,6 @@
 	},
 /turf/simulated/floor,
 /area/station/storage/primary)
-"gLv" = (
-/obj/table/reinforced/bar/auto,
-/obj/item/plate{
-	pixel_y = 2
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = 7;
-	pixel_y = 5
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = -4;
-	pixel_y = 6
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = -9;
-	pixel_y = 5
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = 2;
-	pixel_y = 6
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = -6
-	},
-/obj/item/implant/projectile/body_visible/dart/bardart{
-	pixel_x = 4
-	},
-/turf/simulated/floor/specialroom/bar/edge{
-	dir = 1
-	},
-/area/station/crew_quarters/cafeteria)
 "gLK" = (
 /obj/decal/tile_edge/stripe/big{
 	dir = 5;
@@ -44846,6 +43834,13 @@
 	dir = 4
 	},
 /area/station/medical/medbay)
+"gMA" = (
+/obj/table/auto,
+/obj/item/hand_labeler,
+/turf/simulated/floor/plating,
+/area/station/hangar/catering{
+	name = "Catering Hangar"
+	})
 "gMP" = (
 /obj/table/wood/auto/desk{
 	pixel_y = -2
@@ -44970,6 +43965,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "medical";
+	name = "Medical Storage"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/storage{
 	name = "Medical Storage"
@@ -45065,15 +44064,6 @@
 	},
 /turf/space,
 /area/space)
-"gZd" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/item/device/radio/intercom/engineering,
-/turf/simulated/floor/yellow/side{
-	dir = 1
-	},
-/area/station/hallway/primary/east)
 "gZl" = (
 /obj/machinery/conveyor/NS{
 	name = "cargo belt - south";
@@ -45323,16 +44313,6 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/space)
-"hka" = (
-/obj/machinery/door/airlock/pyro{
-	dir = 4;
-	name = "Kitchen";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/kitchen)
 "hlm" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4;
@@ -45344,6 +44324,16 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor,
 /area/station/routing/sortingRoom)
+"hmq" = (
+/obj/disposalpipe/segment{
+	dir = 1;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 1
+	},
+/area/station/crew_quarters/pool)
 "hmN" = (
 /obj/grille/catwalk,
 /obj/landmark/magnet_shield,
@@ -45358,6 +44348,24 @@
 	icon_state = "catwalk_cross"
 	},
 /area/mining/magnet)
+"hni" = (
+/obj/decal/cleanable/rust/jen,
+/obj/decal/fakeobjects/skeleton/decomposed_corpse{
+	icon_state = "body5";
+	name = "unfortunate guy"
+	},
+/obj/item/kitchen/utensil/knife,
+/obj/decal/cleanable/blood{
+	icon_state = "armorblood_c"
+	},
+/obj/item/skull{
+	pixel_x = 10
+	},
+/obj/decal/cleanable/blood{
+	icon_state = "drip1a"
+	},
+/turf/simulated/floor/grey/whitegrime/other,
+/area/station/maintenance/northeast)
 "hnu" = (
 /obj/grille/steel,
 /obj/lattice{
@@ -45370,6 +44378,13 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/entry)
+"hnG" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "hoB" = (
 /obj/reagent_dispensers/watertank/fountain,
 /obj/machinery/camera{
@@ -45461,6 +44476,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining1";
+	name = "Mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "hqQ" = (
@@ -45506,19 +44526,6 @@
 /obj/landmark/start/job/cyborg,
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
-"htT" = (
-/obj/disposalpipe/segment/produce{
-	dir = 4
-	},
-/obj/machinery/door/airlock/pyro/glass{
-	dir = 4;
-	name = "Biodome";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/hydro,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/green,
-/area/station/hydroponics/bay)
 "huk" = (
 /obj/machinery/alarm{
 	pixel_y = 23
@@ -45608,6 +44615,16 @@
 	},
 /turf/simulated/floor/plating/scorched,
 /area/station/crew_quarters/clown)
+"hxp" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/cable,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "hxx" = (
 /obj/item/device/radio/intercom/security{
 	dir = 1
@@ -45656,6 +44673,9 @@
 	dir = 2;
 	icon_state = "pipe-c"
 	},
+/obj/cable{
+	icon_state = "2-4"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "hzu" = (
@@ -46085,6 +45105,14 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"hRG" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "hRQ" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/engine/power)
@@ -46132,6 +45160,16 @@
 /obj/mapping_helper/access/medical,
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/morgue)
+"hUH" = (
+/obj/machinery/door/airlock/pyro/glass{
+	name = "Pool"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment,
+/turf/simulated/floor/blue/side{
+	dir = 0
+	},
+/area/station/crew_quarters/pool)
 "hVg" = (
 /obj/window/cubicle{
 	dir = 1
@@ -46315,6 +45353,39 @@
 	},
 /turf/space,
 /area/space)
+"iaH" = (
+/obj/table/reinforced/bar/auto,
+/obj/item/plate{
+	pixel_y = 2
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = 7;
+	pixel_y = 5
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = -4;
+	pixel_y = 6
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = -9;
+	pixel_y = 5
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = 2;
+	pixel_y = 6
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = -6
+	},
+/obj/item/implant/projectile/body_visible/dart/bardart{
+	pixel_x = 4
+	},
+/obj/item/clothing/head/cakehat,
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "iaP" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -46356,6 +45427,15 @@
 /obj/xmastree/ephemeral,
 /turf/simulated/floor/orangeblack/side,
 /area/station/hallway/secondary/entry)
+"idF" = (
+/obj/machinery/atmospherics/pipe/simple{
+	level = 2
+	},
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 5
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "iel" = (
 /obj/grille/catwalk{
 	dir = 9
@@ -46437,18 +45517,15 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/security/main)
-"ihb" = (
-/obj/table/auto,
-/obj/item/reagent_containers/food/drinks/milk{
-	pixel_x = 8;
-	pixel_y = 10
+"ihy" = (
+/obj/disposalpipe/segment/produce{
+	dir = 4
 	},
-/obj/item/instrument/bikehorn/dramatic{
-	pixel_x = -6;
-	pixel_y = 10
+/obj/cable{
+	icon_state = "4-8"
 	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "ihz" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -46473,6 +45550,17 @@
 	dir = 4
 	},
 /area/station/crew_quarters/supplylobby)
+"ihL" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/machinery/light,
+/obj/stool/chair/comfy/blue{
+	dir = 4
+	},
+/obj/landmark/pest,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "ihP" = (
 /obj/disposalpipe/segment/morgue,
 /obj/lattice{
@@ -46540,6 +45628,11 @@
 	name = "Bridge"
 	},
 /obj/mapping_helper/access/heads,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
 "ijw" = (
@@ -46602,6 +45695,18 @@
 	},
 /turf/space,
 /area/space)
+"inc" = (
+/obj/disposalpipe/segment/mail,
+/obj/machinery/light{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/neutral/side{
+	dir = 4
+	},
+/area/station/hallway/primary/east)
 "inz" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -46613,6 +45718,17 @@
 	dir = 8
 	},
 /area/station/engine/coldloop)
+"inZ" = (
+/obj/table/wood/auto,
+/obj/item/boardgame/chess{
+	pixel_y = 4
+	},
+/obj/item/card_box/plain{
+	pixel_x = 7;
+	pixel_y = 13
+	},
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "ioj" = (
 /obj/item/storage/toilet{
 	dir = 4
@@ -46628,6 +45744,10 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"iqk" = (
+/obj/machinery/cargo_router/Router13,
+/turf/space,
+/area/space)
 "iqt" = (
 /obj/machinery/firealarm/east,
 /obj/decal/tile_edge/stripe/extra_big{
@@ -46643,6 +45763,10 @@
 	},
 /turf/simulated/floor/carpet,
 /area/station/chapel/sanctuary)
+"iqM" = (
+/obj/landmark/start/job/quartermaster,
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "ire" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -46651,6 +45775,11 @@
 	icon_state = "L3"
 	},
 /area/station/crew_quarters/market)
+"isN" = (
+/obj/mapping_helper/wingrille_spawn/auto,
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/plating,
+/area/station/chapel/sanctuary)
 "isQ" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -46696,6 +45825,10 @@
 /obj/landmark/kudzu,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"iuu" = (
+/obj/submachine/ATM,
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/crew_quarters/catering)
 "ivy" = (
 /obj/grille/steel,
 /obj/lattice{
@@ -46712,6 +45845,10 @@
 	dir = 8
 	},
 /area/listeningpost)
+"iwE" = (
+/obj/storage/secure/closet/engineering/cargo,
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "iwL" = (
 /obj/machinery/conveyor/WE{
 	id = "enginesupply"
@@ -46837,6 +45974,22 @@
 /obj/landmark/engine_room,
 /turf/space,
 /area/space)
+"iCH" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/light,
+/obj/item/device/radio/intercom/medical{
+	dir = 1
+	},
+/obj/disposalpipe/switch_junction{
+	dir = 4;
+	icon_state = "pipe-sj2";
+	mail_tag = "kitchen";
+	name = "kitchen mail router"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "iDj" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk{
@@ -46904,6 +46057,15 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/ptl)
+"iEN" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "iER" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -46969,6 +46131,10 @@
 /obj/machinery/status_display,
 /turf/simulated/wall/auto/supernorn,
 /area/station/crew_quarters/market)
+"iJx" = (
+/obj/machinery/firealarm/south,
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "iJQ" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -47012,6 +46178,10 @@
 	},
 /turf/simulated/floor/red/side,
 /area/station/security/main)
+"iNm" = (
+/obj/disposalpipe/segment,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "iPj" = (
 /obj/machinery/atmospherics/pipe/simple{
 	dir = 6
@@ -47223,6 +46393,10 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"iWf" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/turf/simulated/floor/plating,
+/area/station/quartermaster/cargooffice)
 "iWk" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -47290,6 +46464,19 @@
 	dir = 1
 	},
 /area/station/science/chemistry)
+"iYS" = (
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/obj/machinery/door/airlock/pyro/glass{
+	dir = 4;
+	name = "Biodome";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/hydro,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/green,
+/area/station/hydroponics/lobby)
 "iZA" = (
 /obj/machinery/computer/stockexchange{
 	dir = 4
@@ -47311,22 +46498,6 @@
 	dir = 9
 	},
 /area/space)
-"jao" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/door/airlock/pyro/glass{
-	dir = 4;
-	name = "Biodome";
-	req_access_txt = null
-	},
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/mapping_helper/access/hydro,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/green,
-/area/station/hydroponics/bay)
 "jaV" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -47341,6 +46512,14 @@
 "jbK" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/hangar/medical)
+"jbZ" = (
+/obj/machinery/door/airlock/pyro/maintenance,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/access/bar,
+/obj/mapping_helper/access/maint,
+/turf/simulated/floor/plating,
+/area/station/maintenance/northeast)
 "jcv" = (
 /obj/cable/yellow{
 	icon_state = "0-2"
@@ -47434,6 +46613,10 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
+"jiB" = (
+/obj/table/auto,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jiQ" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -47494,20 +46677,6 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/medical/dome)
-"jli" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "jlv" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -47621,6 +46790,11 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/airbridge)
+"jrc" = (
+/obj/machinery/vending/kitchen,
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jrH" = (
 /obj/machinery/atmospherics/pipe/simple/insulated{
 	dir = 9
@@ -47768,6 +46942,13 @@
 "jvO" = (
 /turf/simulated/floor/green/side,
 /area/station/hydroponics/bay)
+"jwh" = (
+/obj/landmark/start/job/chef,
+/obj/disposalpipe/segment{
+	dir = 8
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jwL" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -47818,6 +46999,36 @@
 	},
 /turf/simulated/floor/plating,
 /area/listeningpost)
+"jAI" = (
+/obj/machinery/light_switch{
+	name = "E light switch";
+	pixel_x = 24
+	},
+/obj/machinery/optable,
+/obj/item/suture{
+	pixel_x = 6;
+	pixel_y = 2
+	},
+/obj/item/circular_saw{
+	pixel_x = 1;
+	pixel_y = -7
+	},
+/obj/item/scalpel{
+	pixel_x = 4;
+	pixel_y = -11
+	},
+/obj/item/reagent_containers/iv_drip/blood{
+	pixel_x = 2;
+	pixel_y = 1
+	},
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbooth)
 "jBq" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -47874,6 +47085,9 @@
 	dir = 8;
 	pixel_x = -10
 	},
+/obj/item/storage/toolbox/emergency{
+	pixel_y = 8
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "jDN" = (
@@ -47940,10 +47154,10 @@
 /turf/simulated/floor/plating,
 /area/station/janitor/supply)
 "jHW" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 4
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/purple/side,
 /area/station/science/lobby)
 "jIu" = (
@@ -47975,6 +47189,14 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/garden/owlery)
+"jJj" = (
+/obj/machinery/light,
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk{
+	dir = 1
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jJq" = (
 /obj/machinery/firealarm/south,
 /turf/simulated/floor/grey/side,
@@ -47997,6 +47219,27 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/depot)
+"jKa" = (
+/obj/rack,
+/obj/item/extinguisher{
+	pixel_x = -5;
+	pixel_y = 1
+	},
+/obj/item/wrench{
+	pixel_x = -4;
+	pixel_y = -3
+	},
+/obj/item/wrench{
+	pixel_x = -1;
+	pixel_y = -5
+	},
+/obj/item/device/light/glowstick{
+	pixel_x = 9;
+	pixel_y = -7
+	},
+/obj/decal/stripe_caution,
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "jKe" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -48008,6 +47251,35 @@
 /area/station/hangar/catering{
 	name = "Catering Hangar"
 	})
+"jKC" = (
+/obj/storage/crate{
+	desc = "Wow! Crate may or may not still contain bottles.";
+	name = "Bottles in a Crate"
+	},
+/obj/item/reagent_containers/glass/bottle,
+/obj/item/reagent_containers/glass/bottle,
+/obj/item/reagent_containers/glass/bottle,
+/obj/item/reagent_containers/glass/bottle,
+/obj/item/reagent_containers/glass/bottle,
+/obj/machinery/light{
+	dir = 1;
+	pixel_y = 21
+	},
+/obj/item/reagent_containers/food/drinks/bottle/soda,
+/obj/item/reagent_containers/food/drinks/bottle/soda,
+/obj/item/reagent_containers/food/drinks/bottle/soda,
+/obj/item/reagent_containers/food/drinks/bottle/soda,
+/obj/item/reagent_containers/food/drinks/bottle/soda,
+/obj/item/reagent_containers/food/drinks/milk{
+	pixel_x = 8;
+	pixel_y = 3
+	},
+/obj/item/satchel/hydro{
+	pixel_x = -7;
+	pixel_y = 2
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "jKQ" = (
 /obj/machinery/firealarm/south,
 /obj/cable{
@@ -48062,6 +47334,13 @@
 	},
 /turf/simulated/floor/red,
 /area/station/engine/hotloop)
+"jNg" = (
+/obj/machinery/vending/monkey/kitchen,
+/obj/machinery/light{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "jNJ" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -48102,17 +47381,6 @@
 	dir = 8
 	},
 /area/station/crew_quarters/market)
-"jOu" = (
-/obj/storage/cart/hotdog{
-	req_access_txt = "28"
-	},
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/obj/landmark/pest,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "jOD" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable/yellow{
@@ -48141,6 +47409,20 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/captain)
+"jPp" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/door/airlock/pyro/maintenance{
+	name = "Tool Storage";
+	req_access_txt = null
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment,
+/turf/simulated/floor/yellow,
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "jPI" = (
 /obj/machinery/door/airlock/pyro/security{
 	name = "Arrivals Desk";
@@ -48200,7 +47482,6 @@
 /area/station/turret_protected/Zeta)
 "jRc" = (
 /obj/shrub,
-/obj/shrub,
 /turf/simulated/floor/green/side{
 	dir = 4
 	},
@@ -48276,6 +47557,15 @@
 /obj/machinery/power/data_terminal,
 /turf/simulated/floor/plating/jen,
 /area/station/engine/elect)
+"jTk" = (
+/obj/noticeboard/persistent{
+	name = "Bar persistent notice board";
+	persistent_id = "bar";
+	pixel_x = 32
+	},
+/obj/disposalpipe/segment,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "jTA" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -48329,6 +47619,20 @@
 /obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"jVA" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/obj/item/shaker/salt{
+	pixel_x = -12;
+	pixel_y = 9
+	},
+/obj/item/shaker/pepper{
+	pixel_x = -7;
+	pixel_y = 12
+	},
+/turf/simulated/floor/carpet,
+/area/station/crew_quarters/cafeteria)
 "jVU" = (
 /obj/machinery/conveyor/WE{
 	name = "cargo belt - east";
@@ -48357,9 +47661,6 @@
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/construction2)
 "jXp" = (
-/obj/stool/chair{
-	dir = 8
-	},
 /obj/cable{
 	icon_state = "1-2"
 	},
@@ -48367,6 +47668,9 @@
 	pixel_x = 6;
 	pixel_y = -11
 	},
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/carpet{
 	dir = 9;
 	icon_state = "fred5"
@@ -48464,6 +47768,24 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/central)
+"jZQ" = (
+/obj/machinery/partyalarm{
+	dir = 8;
+	pixel_y = -26
+	},
+/obj/disposalpipe/junction{
+	dir = 8
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
+"kap" = (
+/obj/disposalpipe/segment{
+	dir = 1;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/central)
 "kaq" = (
 /obj/grille/catwalk,
 /obj/landmark/magnet_shield,
@@ -48673,6 +47995,17 @@
 /area/station/hangar/catering{
 	name = "Catering Hangar"
 	})
+"kiL" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "kiV" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -48739,6 +48072,10 @@
 	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay)
+"knf" = (
+/obj/mapping_helper/wingrille_spawn/auto,
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "knL" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -48756,6 +48093,10 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/science/lab)
+"koE" = (
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "koL" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4;
@@ -48767,6 +48108,10 @@
 /obj/cable/yellow{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolar";
+	name = "South Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
 "koS" = (
@@ -48853,6 +48198,15 @@
 	},
 /turf/simulated/floor/blue,
 /area/station/medical/staff)
+"kqC" = (
+/obj/machinery/firealarm/east,
+/obj/cable{
+	icon_state = "1-10"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbooth)
 "kra" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -49036,6 +48390,19 @@
 	dir = 4
 	},
 /area/station/medical/medbay)
+"kxF" = (
+/obj/item/swingsignfolded,
+/obj/disposalpipe/segment/produce{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
+"kxP" = (
+/obj/table/auto,
+/obj/item/instrument/bikehorn/dramatic,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "kxW" = (
 /obj/machinery/door/airlock/pyro/classic{
 	dir = 4;
@@ -49133,6 +48500,24 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"kCu" = (
+/obj/table/reinforced/auto,
+/obj/machinery/door/poddoor/pyro/shutters{
+	density = 0;
+	dir = 4;
+	icon_state = "pdoor0";
+	id = "kitchen";
+	layer = 4;
+	name = "Kitchen Shutter";
+	opacity = 0;
+	panel_open = 1
+	},
+/obj/machinery/door/firedoor/pyro{
+	dir = 4
+	},
+/obj/item/plate,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "kCR" = (
 /obj/machinery/light{
 	dir = 8
@@ -49143,6 +48528,17 @@
 /mob/living/critter/small_animal/walrus,
 /turf/simulated/floor/pool/no_animate,
 /area/station/crew_quarters/pool)
+"kFi" = (
+/obj/machinery/conveyor/EW{
+	name = "cargo belt - west";
+	operating = 1
+	},
+/obj/machinery/conveyor/EW{
+	name = "cargo belt - west";
+	operating = 1
+	},
+/turf/simulated/floor/plating/airless,
+/area/space)
 "kFm" = (
 /obj/machinery/door/airlock/pyro/glass{
 	name = "Robotics";
@@ -49193,10 +48589,10 @@
 /turf/simulated/floor/circuit,
 /area/station/bridge)
 "kHj" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 8
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/purple/side,
 /area/station/science/lobby)
 "kIr" = (
@@ -49272,6 +48668,12 @@
 	dir = 6
 	},
 /area/mining/magnet)
+"kLp" = (
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
 "kLE" = (
 /obj/machinery/conveyor/NS{
 	name = "cargo belt - south";
@@ -49392,6 +48794,15 @@
 	},
 /turf/simulated/floor/white,
 /area/station/medical/staff)
+"kRz" = (
+/obj/disposalpipe/segment/mail,
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/side{
+	dir = 4
+	},
+/area/station/hallway/primary/central)
 "kSE" = (
 /obj/machinery/arc_electroplater{
 	dir = 4
@@ -49402,6 +48813,18 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/quartermaster/refinery)
+"kTD" = (
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 4
+	},
+/obj/decal/tile_edge/stripe/corner/extra_big{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/office)
 "kTI" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -49418,6 +48841,19 @@
 	dir = 10
 	},
 /area/space)
+"kUg" = (
+/obj/decal/cleanable/rust/jen,
+/obj/item/paper{
+	pixel_y = 8;
+	info = "Recip for person guy soup.. 1x guy, some wator, uh.. fuckin... bucket of chiken beaks";
+	name = "cool recip by:   me"
+	},
+/obj/item/pen/pencil{
+	pixel_y = 4;
+	pixel_x = -8
+	},
+/turf/simulated/floor/grey/whitegrime/other,
+/area/station/maintenance/northeast)
 "kUs" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -49431,6 +48867,9 @@
 	},
 /turf/simulated/wall/false_wall,
 /area/station/maintenance/central)
+"kVG" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/maintenance/northeast)
 "kVJ" = (
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
@@ -49606,6 +49045,14 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/bridge)
+"lcI" = (
+/obj/machinery/door/unpowered/wood/pyro{
+	autoclose = 0;
+	name = "Confession Booth"
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/chapel/sanctuary)
 "ldd" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -49709,6 +49156,12 @@
 "lkr" = (
 /turf/simulated/floor/darkblue,
 /area/station/medical/medbay/psychiatrist)
+"lkC" = (
+/obj/stool/bar,
+/turf/simulated/floor/carpet{
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "lkL" = (
 /obj/machinery/door/window/northleft{
 	name = "Chaplain's Office";
@@ -49823,6 +49276,13 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
+"lqU" = (
+/obj/landmark/pest,
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 5
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "lrG" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -49853,15 +49313,6 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/quartersB)
-"ltq" = (
-/obj/machinery/door/airlock/pyro/glass{
-	dir = 4;
-	name = "Cafeteria"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/crew_quarters/cafeteria)
 "ltz" = (
 /obj/machinery/conveyor/WE{
 	id = "enginesupply"
@@ -49896,18 +49347,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/east)
-"lvC" = (
-/obj/table/auto,
-/obj/item/gun/russianrevolver{
-	pixel_x = -1;
-	pixel_y = 15
-	},
-/obj/item/storage/firstaid/toxin{
-	pixel_x = 12;
-	pixel_y = 10
-	},
-/turf/simulated/floor/carpet/grime,
-/area/station/crew_quarters/baroffice)
 "lvX" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/cable{
@@ -49973,6 +49412,12 @@
 	},
 /turf/space,
 /area/space)
+"lAh" = (
+/obj/machinery/light/small{
+	dir = 8
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "lAF" = (
 /obj/table/auto,
 /obj/item/dye_bottle,
@@ -50018,6 +49463,44 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southwest)
+"lBV" = (
+/obj/storage/crate{
+	name = "Cone Crate"
+	},
+/obj/item/reagent_containers/food/snacks/condiment/chocchips{
+	pixel_x = 1;
+	pixel_y = 3
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = -9;
+	pixel_y = 4
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = -1;
+	pixel_y = 4
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = 7;
+	pixel_y = 4
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = -10;
+	pixel_y = 11
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = -2;
+	pixel_y = 11
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone{
+	pixel_x = 6;
+	pixel_y = 11
+	},
+/obj/item/reagent_containers/food/snacks/condiment/chocchips{
+	pixel_x = 1;
+	pixel_y = 3
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "lDj" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/machinery/light/small{
@@ -50250,6 +49733,11 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/catering)
+"lQi" = (
+/obj/landmark/pest,
+/obj/disposalpipe/segment,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "lQq" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -50293,23 +49781,6 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/fitness)
-"lSg" = (
-/obj/decal/cleanable/rust/jen,
-/obj/decal/fakeobjects/skeleton/decomposed_corpse{
-	icon_state = "body5"
-	},
-/obj/item/kitchen/utensil/knife,
-/obj/decal/cleanable/blood{
-	icon_state = "armorblood_c"
-	},
-/obj/item/skull{
-	pixel_x = 10
-	},
-/obj/decal/cleanable/blood{
-	icon_state = "drip1a"
-	},
-/turf/simulated/floor/grey/whitegrime/other,
-/area/station/maintenance/northeast)
 "lSC" = (
 /obj/machinery/alarm{
 	dir = 8;
@@ -50458,10 +49929,6 @@
 /obj/cable{
 	icon_state = "0-2"
 	},
-/obj/machinery/light{
-	dir = 1;
-	pixel_y = 21
-	},
 /obj/machinery/power/apc/autoname_north,
 /obj/item/implantcase/counterrev{
 	pixel_x = 8;
@@ -50535,6 +50002,13 @@
 	dir = 1
 	},
 /area/station/turret_protected/ai_upload_foyer)
+"maI" = (
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fred2"
+	},
+/area/station/chapel/sanctuary)
 "maK" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 4
@@ -50542,6 +50016,12 @@
 /obj/reagent_dispensers/fueltank,
 /turf/simulated/floor,
 /area/station/hangar/engine)
+"maL" = (
+/turf/simulated/floor/carpet{
+	dir = 6;
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "mbq" = (
 /obj/machinery/conveyor/SN{
 	name = "cargo belt - north";
@@ -50574,16 +50054,6 @@
 /obj/item/bat,
 /turf/simulated/floor/grime,
 /area/station/hallway/secondary/construction2)
-"mdp" = (
-/obj/machinery/door/airlock/pyro/glass,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/specialroom/chapel{
-	dir = 1
-	},
-/area/station/chapel/sanctuary)
 "mdv" = (
 /obj/machinery/atmospherics/binary/valve{
 	desc = "hot radiator inlet valve";
@@ -50616,13 +50086,6 @@
 	name = "astroturf"
 	},
 /area/station/hydroponics/bay)
-"meU" = (
-/obj/disposalpipe/segment/mail,
-/obj/item/device/radio/intercom/catering{
-	dir = 8
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "meW" = (
 /obj/landmark/pest,
 /turf/simulated/floor/sanitary,
@@ -50635,6 +50098,34 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/engine/gas)
+"mgC" = (
+/obj/rack,
+/obj/item/device/analyzer/atmospheric{
+	pixel_x = 2
+	},
+/obj/item/extinguisher{
+	pixel_x = -5;
+	pixel_y = 1
+	},
+/obj/item/storage/toolbox/emergency{
+	pixel_x = 5;
+	pixel_y = -4
+	},
+/obj/item/storage/toolbox/emergency{
+	pixel_x = 5;
+	pixel_y = -8
+	},
+/obj/item/device/light/flashlight{
+	pixel_x = -6;
+	pixel_y = -4
+	},
+/obj/item/device/light/flashlight{
+	pixel_x = -1;
+	pixel_y = -5
+	},
+/obj/decal/stripe_caution,
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "mhk" = (
 /obj/stool,
 /obj/decal/cleanable/dirt/dirt2,
@@ -50807,6 +50298,19 @@
 	dir = 4
 	},
 /area/station/science/chemistry)
+"mpm" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/disposalpipe/segment,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "mpv" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
@@ -50818,6 +50322,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "main"
+	},
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
 "mpC" = (
@@ -50890,6 +50399,11 @@
 "msZ" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "mtb" = (
@@ -50913,6 +50427,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiairbridge";
+	name = "AI Airbridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/turret_protected/ai_upload_foyer)
 "mts" = (
@@ -50955,6 +50474,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "warehouse";
+	name = "Central Warehouse"
+	},
 /turf/simulated/floor,
 /area/station/storage/warehouse)
 "muh" = (
@@ -51036,6 +50559,18 @@
 /mob/living/critter/small_animal/mouse,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
+"mwn" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 10;
+	name = "autoname - SS13";
+	tag = ""
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "mwJ" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -51198,8 +50733,17 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolar";
+	name = "West Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
+"mBW" = (
+/obj/table/auto,
+/obj/machinery/mixer,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "mCe" = (
 /obj/cable,
 /obj/storage/crate,
@@ -51274,6 +50818,9 @@
 	},
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/barber_shop)
+"mEL" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/storage/hydroponics)
 "mFI" = (
 /obj/item/device/radio/beacon,
 /obj/landmark/pest,
@@ -51331,6 +50878,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolar";
+	name = "West Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "mIC" = (
@@ -51344,6 +50895,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "warehouse";
+	name = "Central Warehouse"
+	},
 /turf/simulated/floor,
 /area/station/storage/warehouse)
 "mID" = (
@@ -51443,6 +50998,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "centmaint1";
+	name = "Central Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "mNT" = (
@@ -51511,6 +51070,13 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/captain)
+"mQx" = (
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "mRk" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk{
@@ -51554,14 +51120,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor/white,
 /area/station/maintenance/central)
-"mSt" = (
-/obj/machinery/door/airlock/pyro/maintenance,
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/access/bar,
-/obj/mapping_helper/access/maint,
-/turf/simulated/floor/plating,
-/area/station/hallway/primary/east)
 "mSv" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 6
@@ -51583,6 +51141,17 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/solar/west)
+"mSG" = (
+/obj/cable{
+	icon_state = "0-2"
+	},
+/obj/machinery/power/apc/autoname_west,
+/obj/machinery/light{
+	dir = 1;
+	pixel_y = 21
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "mSO" = (
 /obj/machinery/atmospherics/pipe/simple/insulated{
 	dir = 10
@@ -51651,6 +51220,11 @@
 	},
 /turf/simulated/floor/grime,
 /area/space)
+"mWd" = (
+/obj/machinery/space_heater,
+/obj/decal/stripe_caution,
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "mWl" = (
 /turf/simulated/floor/black,
 /area/station/engine/coldloop)
@@ -52186,20 +51760,6 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/power)
-"nse" = (
-/obj/machinery/door/airlock/pyro{
-	dir = 4;
-	name = "Hydroponics";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/hydro,
-/obj/mapping_helper/firedoor_spawn,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/storage/hydroponics)
 "nsn" = (
 /obj/machinery/light{
 	dir = 4
@@ -52282,6 +51842,13 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/medical)
+"nwG" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/chapel,
+/area/station/chapel/sanctuary)
 "nxc" = (
 /turf/space,
 /area/station/turret_protected/armory_outside)
@@ -52538,6 +52105,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar";
+	name = "North Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/north)
 "nGY" = (
@@ -52633,6 +52204,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "centmaint2";
+	name = "Central Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "nKl" = (
@@ -52666,6 +52241,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/public,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "nLw" = (
@@ -52679,6 +52259,10 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"nLX" = (
+/obj/disposalpipe/segment,
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "nLY" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 10
@@ -52690,6 +52274,16 @@
 /obj/machinery/light,
 /turf/simulated/floor/yellow/side,
 /area/station/storage/primary)
+"nNK" = (
+/obj/disposalpipe/segment/produce{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "nNT" = (
 /obj/cable{
 	icon_state = "2-4"
@@ -52740,13 +52334,11 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/engine/gas)
-"nPW" = (
-/obj/machinery/door/airlock/pyro/glass,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/specialroom/chapel{
-	dir = 4
-	},
-/area/station/chapel/sanctuary)
+"nQn" = (
+/obj/storage/secure/closet/fridge/kitchen,
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "nQR" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -52842,6 +52434,17 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/elect)
+"nTf" = (
+/obj/window/reinforced{
+	dir = 2
+	},
+/obj/machinery/light/emergency{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "nUq" = (
 /obj/storage/crate/freezer{
 	anchored = 1
@@ -52857,6 +52460,13 @@
 	dir = 1
 	},
 /area/station/crew_quarters/quarters)
+"nVD" = (
+/obj/disposalpipe/junction{
+	dir = 4;
+	icon_state = "pipe-j2"
+	},
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "nVE" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -53015,6 +52625,13 @@
 	},
 /turf/simulated/floor/wood/seven,
 /area/station/ranch)
+"ocr" = (
+/obj/machinery/navbeacon{
+	codes_txt = "delivery;dir=1";
+	location = "Catering"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "oct" = (
 /turf/unsimulated/wall/auto/adventure/shuttle/dark,
 /area/abandonedship)
@@ -53059,6 +52676,18 @@
 /obj/disposalpipe/segment/mail,
 /turf/simulated/floor/plating,
 /area/station/science/testchamber)
+"ofw" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "ofy" = (
 /obj/table/auto,
 /obj/item/storage/box/evidence{
@@ -53087,6 +52716,16 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/space)
+"ofY" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/obj/item/reagent_containers/food/drinks/bowl,
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "ogb" = (
 /obj/machinery/door/window/northleft{
 	req_access_txt = null
@@ -53104,6 +52743,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/public,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "ogJ" = (
@@ -53301,6 +52945,21 @@
 	},
 /turf/simulated/floor/circuit,
 /area/station/turret_protected/ai)
+"onv" = (
+/obj/disposalpipe/segment,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/door/airlock/pyro{
+	name = "Catering Storage";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/bar,
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/storage/emergency)
 "onF" = (
 /obj/machinery/conveyor/EW{
 	operating = 1
@@ -53434,6 +53093,14 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/solar/north)
+"otx" = (
+/obj/disposalpipe/switch_junction{
+	desc = "An underfloor mail pipe.";
+	mail_tag = "chapel";
+	name = "chapel mail router"
+	},
+/turf/simulated/floor/specialroom/chapel,
+/area/station/chapel/sanctuary)
 "ouQ" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -53532,15 +53199,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hydroponics/bay)
-"oyV" = (
-/obj/machinery/door/airlock/pyro{
-	name = "Kitchen";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/cafeteria)
 "ozn" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -53712,6 +53370,16 @@
 	dir = 9
 	},
 /area/station/medical/staff)
+"oIq" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail,
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "oIC" = (
 /obj/disposalpipe/segment,
 /obj/cable{
@@ -53910,23 +53578,31 @@
 	name = "astroturf"
 	},
 /area/station/hydroponics/bay)
-"oQU" = (
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/crew_quarters/arcade)
-"oSf" = (
+"oQT" = (
 /obj/disposalpipe/segment{
 	dir = 4
 	},
-/obj/machinery/firealarm/north,
-/obj/machinery/vending/medical_public,
-/obj/machinery/light/emergency{
+/turf/simulated/floor/specialroom/chapel{
 	dir = 8
 	},
-/turf/simulated/floor/yellow/side{
-	dir = 1
+/area/station/chapel/sanctuary)
+"oQU" = (
+/obj/mapping_helper/wingrille_spawn/auto,
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/arcade)
+"oRT" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/hallway/primary/east)
+/obj/landmark/gps_waypoint,
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "oSg" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -53947,6 +53623,17 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/science/chemistry)
+"oSp" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/light{
+	dir = 8;
+	tag = ""
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "oSX" = (
 /obj/cable/orange,
 /obj/cable/orange{
@@ -53999,6 +53686,16 @@
 	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay/treatment)
+"oUX" = (
+/obj/storage/cart,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	tag = ""
+	},
+/turf/simulated/floor/grime,
+/area/station/storage/hydroponics)
 "oUZ" = (
 /obj/disposalpipe/segment{
 	dir = 2;
@@ -54234,6 +53931,22 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/station/science/lab)
+"paF" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/door/airlock/pyro/glass{
+	dir = 4;
+	name = "Biodome";
+	req_access_txt = null
+	},
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/obj/mapping_helper/access/hydro,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/green,
+/area/station/hydroponics/lobby)
 "pbj" = (
 /obj/machinery/firealarm/east,
 /obj/machinery/fluid_canister,
@@ -54316,6 +54029,15 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/market)
+"pgo" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "pgN" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -54485,6 +54207,14 @@
 "pjG" = (
 /turf/simulated/floor/grime,
 /area/station/storage/hydroponics)
+"pky" = (
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "pkH" = (
 /obj/machinery/disposal/mail/small/autoname/mechanics/south,
 /obj/disposalpipe/trunk/mail{
@@ -54620,6 +54350,23 @@
 	},
 /turf/space,
 /area/space)
+"pqX" = (
+/obj/machinery/door/airlock/pyro/glass/mining,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/cargo,
+/turf/simulated/floor/plating,
+/area/station/quartermaster/cargooffice)
+"prm" = (
+/turf/space,
+/area/station/maintenance/northeast)
+"prD" = (
+/obj/landmark/pest,
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "prW" = (
 /obj/stool/chair{
 	dir = 8
@@ -54669,6 +54416,18 @@
 	icon_state = "fred6"
 	},
 /area/station/crew_quarters/captain)
+"pwI" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "pwM" = (
 /obj/machinery/atmospherics/pipe/simple/insulated,
 /obj/cable{
@@ -54693,52 +54452,13 @@
 /turf/simulated/floor/plating,
 /area/station/science/chemistry)
 "pxF" = (
-/obj/storage/crate{
-	desc = "Whoa! What will they think of next?";
-	name = "Boxes in a Box"
-	},
-/obj/item/storage/box{
-	pixel_x = -7;
-	pixel_y = 8
-	},
-/obj/item/storage/box{
-	pixel_x = 1;
-	pixel_y = 8
-	},
-/obj/item/storage/box{
-	pixel_x = 9;
-	pixel_y = 8
-	},
-/obj/item/storage/box{
-	pixel_x = -8;
-	pixel_y = 5
-	},
-/obj/item/storage/box{
-	pixel_y = 5
-	},
-/obj/item/storage/box{
-	pixel_x = 8;
-	pixel_y = 5
-	},
-/obj/item/storage/box{
-	pixel_x = -9;
-	pixel_y = 2
-	},
-/obj/item/storage/box{
-	pixel_x = -2;
-	pixel_y = 2
-	},
-/obj/item/storage/box{
-	pixel_x = 7;
-	pixel_y = 2
-	},
-/obj/item/storage/box{
-	pixel_y = -1
-	},
 /obj/item/device/radio/intercom/cargo{
 	dir = 8
 	},
 /obj/decal/stripe_caution,
+/obj/cable{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "pxW" = (
@@ -54782,6 +54502,10 @@
 	},
 /turf/simulated/floor/grass/leafy,
 /area/station/ranch)
+"pze" = (
+/obj/shrub,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "pzD" = (
 /obj/disposalpipe/junction{
 	dir = 4;
@@ -55090,6 +54814,14 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor,
 /area/station/hallway/primary/south)
+"pOR" = (
+/obj/machinery/drainage,
+/obj/disposalpipe/chicken_disposal_pipe/horizontal,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "pPk" = (
 /obj/machinery/light/small,
 /obj/cable{
@@ -55129,17 +54861,20 @@
 	icon_state = "red2"
 	},
 /area/station/security/main)
-"pRa" = (
-/obj/table/wood/auto,
-/obj/item/boardgame/chess{
-	pixel_y = 4
-	},
-/turf/simulated/floor/specialroom/bar,
-/area/station/crew_quarters/cafeteria)
 "pSF" = (
 /obj/machinery/atmospherics/pipe/simple,
 /turf/simulated/floor,
 /area/station/security/main)
+"pSG" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "pTb" = (
 /turf/simulated/floor,
 /area/station/storage/primary)
@@ -55235,6 +54970,13 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/plating,
 /area/station/medical/research)
+"pVn" = (
+/obj/landmark/pest,
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "pVp" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -55252,6 +54994,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint1";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
 "pVw" = (
@@ -55765,6 +55511,16 @@
 	},
 /turf/simulated/floor/yellow,
 /area/station/engine/gas)
+"quR" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "qva" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -55795,6 +55551,10 @@
 /obj/cable/yellow,
 /turf/simulated/floor/airless/solar,
 /area/station/solar/south)
+"qvD" = (
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/yellow/side,
+/area/station/storage/emergency)
 "qvN" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -55839,26 +55599,27 @@
 	},
 /turf/simulated/floor/wood/two,
 /area/station/medical/staff)
-"qwG" = (
-/obj/table/reinforced/auto,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "kitchen";
-	layer = 4;
-	name = "Kitchen Shutter";
-	opacity = 0;
-	panel_open = 1
+"qwS" = (
+/obj/machinery/light{
+	dir = 4
 	},
-/obj/item/plate,
-/obj/item/reagent_containers/food/snacks/cake/chocolate/gateau{
+/obj/table/reinforced/bar/auto,
+/obj/item_dispenser/icedispenser{
+	dir = 8;
+	pixel_x = 19;
 	pixel_y = 8
 	},
-/obj/machinery/door/firedoor/pyro{
-	dir = 4
+/obj/item/shaker/pepper{
+	pixel_x = -9;
+	pixel_y = 10
+	},
+/obj/item/shaker/salt{
+	pixel_x = -5;
+	pixel_y = 8
+	},
+/turf/simulated/floor/specialroom/bar/edge{
+	dir = 8
 	},
-/turf/simulated/floor/black,
 /area/station/crew_quarters/cafeteria)
 "qxk" = (
 /obj/cable{
@@ -56048,6 +55809,20 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/station/solar/north)
+"qAO" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "outer"
+	},
+/turf/simulated/floor,
+/area/station/hallway/secondary/exit)
 "qBh" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable/yellow{
@@ -56102,6 +55877,20 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/morgue)
+"qDc" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 6;
+	name = "autoname - SS13";
+	tag = ""
+	},
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "qDf" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -56116,6 +55905,17 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/heads)
+"qDq" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
 "qDB" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 4
@@ -56330,10 +56130,6 @@
 /obj/machinery/firealarm/east,
 /turf/simulated/floor/grime,
 /area/station/hallway/primary/east)
-"qKa" = (
-/obj/landmark/pest,
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "qKl" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -56342,6 +56138,17 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/security/brig)
+"qKo" = (
+/obj/table/reinforced/bar/auto,
+/obj/machinery/phone,
+/obj/item/decoration/ashtray{
+	pixel_x = 9;
+	pixel_y = -3
+	},
+/turf/simulated/floor/specialroom/bar/edge{
+	dir = 4
+	},
+/area/station/crew_quarters/cafeteria)
 "qKH" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -56489,6 +56296,16 @@
 /obj/item/reagent_containers/hypospray,
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/head)
+"qPC" = (
+/obj/item/device/radio/intercom/engineering,
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "qQi" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -56580,6 +56397,19 @@
 	dir = 4
 	},
 /area/station/medical/staff)
+"qSz" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/light{
+	dir = 8;
+	tag = ""
+	},
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "qTy" = (
 /obj/machinery/mass_driver{
 	dir = 4;
@@ -56650,31 +56480,6 @@
 /obj/item/storage/toolbox/mechanical,
 /turf/simulated/floor,
 /area/station/hangar/engine)
-"qVo" = (
-/obj/storage/crate{
-	desc = "Wow! Crate may or may not still contain bottles.";
-	name = "Bottles in a Crate"
-	},
-/obj/item/reagent_containers/glass/bottle,
-/obj/item/reagent_containers/glass/bottle,
-/obj/item/reagent_containers/glass/bottle,
-/obj/item/reagent_containers/glass/bottle,
-/obj/item/reagent_containers/glass/bottle,
-/obj/machinery/light{
-	dir = 1;
-	pixel_y = 21
-	},
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/milk{
-	pixel_x = 8;
-	pixel_y = 3
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "qWh" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -56758,6 +56563,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiairbridge";
+	name = "AI Airbridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/crew_quarters/market)
 "qZf" = (
@@ -56799,6 +56609,11 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"rdX" = (
+/obj/storage/closet/fire,
+/obj/decal/stripe_delivery,
+/turf/simulated/floor,
+/area/station/ranch)
 "rea" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/window_blinds/cog2/middle,
@@ -56993,13 +56808,6 @@
 	dir = 8
 	},
 /area/station/ranch)
-"rrB" = (
-/obj/landmark/pest,
-/obj/stool/chair/comfy/blue{
-	dir = 4
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "rrI" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -57023,6 +56831,16 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
+"rsy" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "main"
+	},
+/turf/simulated/floor,
+/area/station/hallway/secondary/exit)
 "rsK" = (
 /obj/disposalpipe/segment,
 /obj/cable{
@@ -57090,6 +56908,18 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/security/main)
+"rxL" = (
+/obj/table/auto,
+/obj/item/storage/box/cutlery{
+	pixel_x = 10;
+	pixel_y = 12
+	},
+/obj/item/storage/box/popsicle_sticks{
+	pixel_y = 12;
+	pixel_x = -1
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "ryf" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 4
@@ -57316,6 +57146,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "centmaint2";
+	name = "Central Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
 "rGl" = (
@@ -57397,18 +57231,6 @@
 	},
 /turf/simulated/floor/carpet/arcade,
 /area/station/crew_quarters/captain)
-"rJe" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/switch_junction{
-	dir = 4;
-	icon_state = "pipe-sj2";
-	mail_tag = "hydroponics";
-	name = "hydroponics mail router"
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "rJL" = (
 /obj/machinery/atmospherics/unary/cold_sink/freezer/cryo{
 	dir = 1
@@ -57478,6 +57300,19 @@
 "rMr" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/crew_quarters/pool)
+"rMG" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/door/airlock/pyro{
+	dir = 4;
+	name = "Hydroponics";
+	req_access_txt = null
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/hydro,
+/turf/simulated/floor,
+/area/station/storage/hydroponics)
 "rNh" = (
 /obj/monkeyplant,
 /turf/simulated/floor/blue/checker,
@@ -57612,6 +57447,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape2";
+	name = "Escape";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
 "rRu" = (
@@ -57742,6 +57582,17 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/black,
 /area/station/turret_protected/Zeta)
+"rYi" = (
+/obj/decal/stripe_caution,
+/obj/cable{
+	icon_state = "2-4"
+	},
+/obj/machinery/light{
+	dir = 1;
+	pixel_y = 21
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/office)
 "rYo" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/disposalpipe/segment,
@@ -57813,6 +57664,14 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/science/chemistry)
+"rZI" = (
+/obj/disposalpipe/segment/mail,
+/obj/machinery/navbeacon/guardbot_buddytime,
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "sao" = (
 /obj/table/wood/auto,
 /obj/machinery/atmospherics/pipe/simple/insulated/cold{
@@ -58049,11 +57908,6 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/routing/depot)
-"shc" = (
-/obj/machinery/drainage,
-/obj/disposalpipe/chicken_disposal_pipe/horizontal,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/catering)
 "shp" = (
 /obj/table/auto,
 /obj/cable{
@@ -58083,6 +57937,10 @@
 	dir = 8
 	},
 /area/station/security/main)
+"shL" = (
+/obj/machinery/vending/cards,
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "siu" = (
 /obj/landmark/start/job/miner,
 /turf/simulated/floor,
@@ -58098,6 +57956,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining1";
+	name = "Mining";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "sjH" = (
@@ -58111,19 +57974,6 @@
 	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
-"sjN" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk,
-/obj/machinery/alarm{
-	dir = 4;
-	pixel_x = -15
-	},
-/turf/simulated/floor/yellow/side{
-	dir = 8
-	},
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
 "skm" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4;
@@ -58135,6 +57985,10 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/medical/medbay/surgery)
+"skn" = (
+/obj/machinery/vending/capsule,
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "skM" = (
 /obj/decal/cleanable/oil/streak,
 /obj/decal/cleanable/generic,
@@ -58154,6 +58008,9 @@
 	},
 /turf/simulated/floor/carpet/grime,
 /area/station/security/hos)
+"smf" = (
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/quartermaster/cargooffice)
 "smq" = (
 /obj/machinery/vehicle/escape_pod,
 /turf/simulated/floor/shuttlebay,
@@ -58229,19 +58086,15 @@
 /obj/landmark/start/job/chef,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
-"spW" = (
-/obj/table/auto,
-/obj/landmark/pest,
-/obj/machinery/phone{
-	pixel_x = 7;
-	pixel_y = 6
-	},
-/obj/item/satchel/hydro{
-	pixel_x = -4;
-	pixel_y = 2
+"srb" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fred2"
 	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
+/area/station/crew_quarters/cafeteria)
 "srd" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -58302,6 +58155,18 @@
 /obj/machinery/turret,
 /turf/simulated/floor/blue,
 /area/station/turret_protected/ai_upload)
+"ssn" = (
+/obj/table/auto,
+/obj/item/plate,
+/obj/item/reagent_containers/food/snacks/breadloaf{
+	pixel_y = 5
+	},
+/obj/item/kitchen/utensil/knife{
+	pixel_x = 9;
+	pixel_y = 2
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "ssr" = (
 /obj/machinery/door/airlock/pyro/medical{
 	name = "Science Hangar";
@@ -58421,6 +58286,12 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/security/hos)
+"svQ" = (
+/obj/machinery/computer3/generic/personal,
+/obj/table/auto,
+/obj/machinery/power/data_terminal,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "svZ" = (
 /turf/simulated/floor/stairs{
 	icon_state = "Stairs_wide"
@@ -58451,6 +58322,19 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/security/checkpoint/cargo)
+"szn" = (
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/obj/item/satchel/hydro{
+	pixel_x = -7;
+	pixel_y = 2
+	},
+/turf/simulated/floor/grime,
+/area/station/hallway/primary/east)
 "szx" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -58464,6 +58348,7 @@
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/medical,
+/obj/disposalpipe/segment,
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
 "sAI" = (
@@ -58720,6 +58605,14 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
+"sKs" = (
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
 "sKw" = (
 /obj/machinery/light/small/floor/warm,
 /obj/decal/tile_edge/stripe/extra_big{
@@ -58727,6 +58620,13 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/elect)
+"sKP" = (
+/obj/machinery/light,
+/obj/stool/chair/comfy/blue{
+	dir = 1
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "sLL" = (
 /obj/decal/fakeobjects{
 	density = 1;
@@ -58910,6 +58810,12 @@
 /obj/machinery/power/apc/autoname_north,
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/baroffice)
+"sQl" = (
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/specialroom/bar/edge{
+	dir = 1
+	},
+/area/station/crew_quarters/cafeteria)
 "sQn" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -58953,6 +58859,16 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/supplylobby)
+"sQL" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "sRd" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -58968,6 +58884,12 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/quartermaster/refinery)
+"sRY" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "sSa" = (
 /obj/stool/chair/office/red,
 /obj/landmark/start/job/geneticist,
@@ -59007,16 +58929,12 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/north)
-"sTC" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	tag = ""
+"sUv" = (
+/obj/player_piano,
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
 	},
-/obj/storage/secure/closet/civilian/hydro,
-/turf/simulated/floor/grime,
-/area/station/storage/hydroponics)
+/area/station/chapel/sanctuary)
 "sUE" = (
 /obj/machinery/door/airlock/pyro/engineering{
 	dir = 4;
@@ -59119,6 +59037,12 @@
 	},
 /turf/simulated/floor/white,
 /area/station/science/lab)
+"taD" = (
+/obj/machinery/atmospherics/unary/portables_connector{
+	dir = 8
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "tbc" = (
 /obj/machinery/vending/port_a_nanomed,
 /obj/machinery/alarm{
@@ -59129,10 +59053,22 @@
 	dir = 8
 	},
 /area/station/medical/medbay)
+"tbE" = (
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "tco" = (
 /obj/item/device/radio/intercom/engineering,
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"tcE" = (
+/obj/disposalpipe/segment/mail,
+/obj/machinery/light/emergency{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/side{
+	dir = 4
+	},
+/area/station/hallway/primary/central)
 "tcT" = (
 /obj/machinery/conveyor/NS{
 	name = "cargo belt - south";
@@ -59302,6 +59238,21 @@
 	dir = 8
 	},
 /area/station/security/main)
+"tkk" = (
+/obj/window/reinforced{
+	dir = 2
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
+"tks" = (
+/obj/machinery/atmospherics/unary/outlet_injector/active{
+	dir = 8
+	},
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/specialroom/bar/edge,
+/area/station/crew_quarters/cafeteria)
 "tlq" = (
 /obj/machinery/atmospherics/pipe/simple/insulated/cold,
 /obj/cable/blue{
@@ -59376,6 +59327,10 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/medical,
 /obj/mapping_helper/access/medical,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "medical";
+	name = "Medical Storage"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/storage{
 	name = "Medical Storage"
@@ -59386,6 +59341,13 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/medical)
+"tpp" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/stool,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "tpT" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -59431,11 +59393,6 @@
 	dir = 1
 	},
 /area/station/engine/ptl)
-"tqm" = (
-/obj/disposalpipe/segment,
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/storage/emergency)
 "tqo" = (
 /mob/living/critter/small_animal/mouse,
 /turf/simulated/floor/plating,
@@ -59461,6 +59418,11 @@
 	icon_state = "1-2"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "tqQ" = (
@@ -59522,6 +59484,15 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/security)
+"ttG" = (
+/obj/disposalpipe/segment{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "ttZ" = (
 /obj/disposalpipe/segment/morgue{
 	name = "crematorium pipe"
@@ -59714,6 +59685,13 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
+"tCk" = (
+/obj/machinery/light/emergency{
+	dir = 8
+	},
+/obj/disposalpipe/segment,
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "tCq" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -59757,6 +59735,13 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
+"tDf" = (
+/obj/machinery/light/emergency{
+	dir = 4
+	},
+/obj/machinery/vending/fortune,
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "tEf" = (
 /obj/disposalpipe/segment,
 /obj/mapping_helper/wingrille_spawn/auto,
@@ -59820,6 +59805,13 @@
 /obj/storage/closet/welding_supply,
 /turf/simulated/floor/white,
 /area/station/hangar/medical)
+"tHo" = (
+/obj/disposalpipe/segment/produce{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/grass/leafy,
+/area/station/ranch)
 "tHM" = (
 /obj/table/wood/auto,
 /obj/item/currency/spacecash{
@@ -59921,6 +59913,16 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
+"tLR" = (
+/obj/machinery/firealarm/north,
+/obj/machinery/vending/medical_public,
+/obj/machinery/light/emergency{
+	dir = 8
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 1
+	},
+/area/station/hallway/primary/east)
 "tMA" = (
 /obj/securearea{
 	desc = "A warning sign which reads 'COLLISION HAZARD'";
@@ -59977,7 +59979,7 @@
 	pixel_x = -6;
 	pixel_y = 7
 	},
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /turf/simulated/floor/black,
 /area/station/engine/hotloop)
 "tQq" = (
@@ -60022,6 +60024,23 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"tSy" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 1;
+	name = "autoname - SS13";
+	tag = ""
+	},
+/obj/machinery/light,
+/obj/machinery/light_switch{
+	name = "S light switch";
+	pixel_y = -24
+	},
+/obj/disposalpipe/segment{
+	dir = 8
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "tSK" = (
 /turf/simulated/wall/false_wall/reinforced,
 /area/station/maintenance/northeast)
@@ -60162,6 +60181,21 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/station/science/lab)
+"tVl" = (
+/obj/machinery/disposal,
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/obj/disposalpipe/trunk{
+	dir = 4
+	},
+/turf/simulated/floor/yellow/side{
+	dir = 8
+	},
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "tVK" = (
 /obj/submachine/ATM{
 	pixel_x = 32
@@ -60341,6 +60375,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining1";
+	name = "Mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "uaJ" = (
@@ -60689,8 +60728,11 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/southwest)
 "ulq" = (
-/obj/disposalpipe/segment/mail,
 /obj/mapping_helper/wingrille_spawn/auto,
+/obj/disposalpipe/segment/mail{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
 /turf/simulated/floor/plating,
 /area/station/hydroponics/lobby)
 "ulC" = (
@@ -60781,6 +60823,11 @@
 /obj/mapping_helper/access/engineering_control,
 /obj/machinery/power/data_terminal,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "uoI" = (
@@ -60905,6 +60952,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northsolar";
+	name = "North Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/north)
 "utG" = (
@@ -61191,6 +61242,20 @@
 /obj/cable,
 /turf/simulated/floor/white,
 /area/station/medical/medbay/treatment)
+"uCR" = (
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
+"uDl" = (
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/machinery/navbeacon/tour/cog1/tour3,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/cable,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "uDr" = (
 /obj/decal/tile_edge/stripe/big{
 	dir = 4;
@@ -61381,6 +61446,12 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/mining/staff_room)
+"uLk" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/central)
 "uLu" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -61413,15 +61484,13 @@
 	name = "Bridge"
 	},
 /obj/mapping_helper/access/heads,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
-"uMF" = (
-/obj/table/auto,
-/obj/submachine/mixer{
-	pixel_x = 6
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "uNi" = (
 /obj/machinery/atmospherics/pipe/simple{
 	level = 2
@@ -61434,6 +61503,12 @@
 /obj/mapping_helper/access/kitchen,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/catering)
+"uNE" = (
+/obj/item/device/radio/intercom/catering{
+	dir = 8
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "uNH" = (
 /obj/decal/tile_edge/stripe/corner/extra_big2{
 	dir = 10
@@ -61462,6 +61537,12 @@
 	dir = 9
 	},
 /area/station/hydroponics/lobby)
+"uOt" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/turf/simulated/floor/carpet,
+/area/station/crew_quarters/cafeteria)
 "uOC" = (
 /obj/storage/secure/closet/medical/anesthetic,
 /obj/machinery/firealarm/west,
@@ -61516,6 +61597,12 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/yellow/side,
 /area/station/storage/primary)
+"uRR" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/medbooth)
 "uSJ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -61675,6 +61762,16 @@
 	dir = 1
 	},
 /area/station/science/lobby)
+"uZB" = (
+/obj/disposalpipe/segment{
+	dir = 1;
+	icon_state = "pipe-c";
+	name = "factory pipe"
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "uZE" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -61707,6 +61804,10 @@
 	dir = 4
 	},
 /area/station/security/main)
+"vaq" = (
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/specialroom/bar/edge,
+/area/station/crew_quarters/cafeteria)
 "vbu" = (
 /obj/machinery/r_door_control/podbay/security,
 /turf/simulated/wall/auto/reinforced/supernorn,
@@ -61793,6 +61894,15 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/elect)
+"vdP" = (
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk{
+	dir = 8
+	},
+/turf/simulated/floor/bluewhite/corner{
+	dir = 1
+	},
+/area/station/crew_quarters/pool)
 "vei" = (
 /obj/machinery/alarm{
 	dir = 4;
@@ -61892,6 +62002,16 @@
 	},
 /turf/simulated/floor/black,
 /area/station/engine/hotloop)
+"vif" = (
+/obj/machinery/door/airlock/pyro{
+	name = "Bar";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/bar,
+/obj/mapping_helper/access/kitchen,
+/obj/disposalpipe/segment,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "viK" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -61944,6 +62064,13 @@
 	},
 /turf/simulated/floor/black,
 /area/station/engine/coldloop)
+"vlI" = (
+/obj/disposalpipe/segment{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "vma" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4;
@@ -61962,6 +62089,19 @@
 	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
+"vmK" = (
+/obj/machinery/door/airlock/pyro{
+	dir = 4;
+	name = "Kitchen";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/kitchen)
 "vmP" = (
 /obj/table/auto,
 /obj/item/clipboard{
@@ -62071,6 +62211,12 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/hallway/primary/south)
+"vrK" = (
+/turf/simulated/floor/carpet{
+	dir = 10;
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "vrP" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -62121,6 +62267,11 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/science/gen_storage)
+"vuZ" = (
+/obj/table/auto,
+/obj/landmark/pest,
+/turf/simulated/floor/specialroom/cafeteria,
+/area/station/crew_quarters/kitchen)
 "vvC" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -62149,6 +62300,16 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
+"vxJ" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "vxT" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -62163,6 +62324,13 @@
 	dir = 4
 	},
 /area/station/crew_quarters/market)
+"vyW" = (
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/carpet{
+	dir = 4;
+	icon_state = "fred1"
+	},
+/area/station/chapel/sanctuary)
 "vzj" = (
 /obj/machinery/conveyor/WE{
 	id = "qmin"
@@ -62292,6 +62460,17 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"vHp" = (
+/obj/machinery/door/airlock/pyro/glass/mining{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/cargo,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "vHP" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -62307,15 +62486,6 @@
 	dir = 8
 	},
 /area/station/medical/medbay)
-"vHW" = (
-/obj/machinery/door/airlock/pyro{
-	name = "Bar";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/bar,
-/obj/mapping_helper/access/kitchen,
-/turf/simulated/floor/black,
-/area/station/crew_quarters/cafeteria)
 "vIt" = (
 /obj/landmark/pest,
 /obj/disposalpipe/segment/morgue,
@@ -62374,41 +62544,6 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/engine/inner)
-"vMs" = (
-/obj/table/auto,
-/obj/item/cigpacket/propuffs{
-	pixel_x = -9;
-	pixel_y = -2
-	},
-/obj/item/clothing/mask/cigarette/propuffs{
-	pixel_x = -2;
-	pixel_y = -5
-	},
-/obj/item/decoration/ashtray,
-/obj/machinery/light,
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
-	pixel_x = 4;
-	pixel_y = 8
-	},
-/obj/item/reagent_containers/food/drinks/tea{
-	pixel_x = -7;
-	pixel_y = 18
-	},
-/turf/simulated/floor/wood/two,
-/area/station/medical/staff)
-"vMT" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/door/airlock/pyro/maintenance{
-	name = "Tool Storage";
-	req_access_txt = null
-	},
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/yellow,
-/area/station/storage/auxillary{
-	name = "Tool Storage"
-	})
 "vNU" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -62521,6 +62656,12 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/medical/medbay)
+"vPc" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/cargooffice)
 "vPu" = (
 /obj/machinery/camera/ranch,
 /obj/decal/tile_edge/stripe/extra_big{
@@ -62564,6 +62705,25 @@
 	icon_state = "fblue3"
 	},
 /area/station/bridge)
+"vRq" = (
+/obj/machinery/light,
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 1
+	},
+/area/station/chapel/sanctuary)
+"vRG" = (
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk{
+	dir = 2;
+	name = "factory pipe"
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "vRO" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/cable{
@@ -62579,6 +62739,11 @@
 	req_access_txt = null
 	},
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "vTv" = (
@@ -62643,6 +62808,15 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"vXP" = (
+/obj/machinery/door/airlock/pyro/glass{
+	name = "Emergency Storage"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "vXY" = (
 /obj/machinery/atmospherics/pipe/simple/insulated{
 	dir = 4
@@ -62970,19 +63144,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/sortingRoom)
-"wkE" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/mail{
-	dir = 4
-	},
-/obj/machinery/light,
-/obj/item/device/radio/intercom/medical{
-	dir = 1
-	},
-/turf/simulated/floor,
-/area/station/hallway/primary/east)
 "wlm" = (
 /obj/decal/poster/wallsign/poster_eyetest,
 /turf/simulated/wall/auto/supernorn,
@@ -63017,6 +63178,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/security,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "side"
+	},
 /turf/simulated/floor/plating,
 /area/station/security/secwing)
 "wng" = (
@@ -63070,6 +63236,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint1";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating/airless,
 /area/station/maintenance/east)
 "woV" = (
@@ -63125,6 +63295,16 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/security/brig)
+"wqg" = (
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 4
+	},
+/obj/machinery/firealarm/north,
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/grime,
+/area/station/storage/hydroponics)
 "wqo" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -63170,6 +63350,11 @@
 /obj/disposalpipe/segment{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aipower";
+	name = "AI Power";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/turret_protected/ai_upload_foyer)
 "wqy" = (
@@ -63354,6 +63539,11 @@
 /obj/machinery/turret,
 /turf/space,
 /area/station/turret_protected/armory_outside)
+"wwr" = (
+/obj/machinery/vending/air_vendor,
+/obj/decal/stripe_caution,
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "wwy" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	name = "Medbay Repressurization West"
@@ -63368,6 +63558,32 @@
 	icon_state = "wooden"
 	},
 /area/station/crew_quarters/barber_shop)
+"wwE" = (
+/obj/landmark/halloween,
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
+"wwF" = (
+/obj/table/auto,
+/obj/item/plate,
+/obj/item/reagent_containers/food/snacks/cake/chocolate/gateau{
+	pixel_y = 8
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icing{
+	pixel_x = 5;
+	pixel_y = -2
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icing{
+	pixel_x = 5;
+	pixel_y = -2
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "wxk" = (
 /obj/lattice{
 	dir = 4;
@@ -63775,6 +63991,16 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/turret_protected/ai_upload_foyer)
+"wNc" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/alarm{
+	dir = 4;
+	pixel_x = -15
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "wNC" = (
 /obj/machinery/door/unpowered/wood/pyro{
 	name = "The Snip"
@@ -63819,6 +64045,30 @@
 	},
 /turf/simulated/floor/blue,
 /area/station/turret_protected/ai_upload)
+"wPN" = (
+/obj/machinery/light,
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/turf/simulated/floor/grime,
+/area/station/hallway/primary/east)
+"wPV" = (
+/obj/table/auto,
+/obj/item/storage/toolbox/emergency{
+	pixel_y = 10
+	},
+/obj/item/storage/box/beakerbox{
+	pixel_x = -6
+	},
+/obj/item/storage/box/glassbox,
+/obj/item/storage/box/syringes{
+	pixel_x = 3
+	},
+/obj/item/storage/box/donkpocket_kit{
+	pixel_x = 8
+	},
+/turf/simulated/floor/plating,
+/area/station/crew_quarters/catering)
 "wQa" = (
 /obj/machinery/conveyor/WE{
 	id = "enginesupply"
@@ -63893,6 +64143,14 @@
 /obj/machinery/power/solar/east,
 /turf/simulated/floor/airless/solar,
 /area/station/solar/south)
+"wRX" = (
+/obj/disposalpipe/segment{
+	dir = 1
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 4
+	},
+/area/station/chapel/sanctuary)
 "wSg" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
@@ -63900,6 +64158,18 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
+"wSZ" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/switch_junction{
+	dir = 4;
+	icon_state = "pipe-sj2";
+	mail_tag = "hydroponics";
+	name = "hydroponics mail router"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "wTs" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -63911,6 +64181,17 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"wTx" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/machinery/atmospherics/unary/outlet_injector/active{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
 "wTF" = (
 /obj/machinery/atmospherics/unary/tank/air_repressurization{
 	name = "Air Hookup Reserve Tank (Air)"
@@ -63931,24 +64212,24 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/medical)
+"wVp" = (
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/side,
+/area/station/hallway/primary/east)
 "wWK" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
 /turf/simulated/floor/grime,
 /area/station/hallway/primary/east)
-"wWS" = (
-/obj/table/auto,
-/obj/item/storage/box/cutlery{
-	pixel_x = 10;
-	pixel_y = 12
-	},
-/obj/item/clothing/head/helmet/space/santahat{
-	pixel_x = -4;
-	pixel_y = 10
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "wXJ" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -64148,6 +64429,16 @@
 /obj/landmark/start/job/engineer,
 /turf/simulated/floor/yellow,
 /area/station/engine/ptl)
+"xgn" = (
+/obj/disposalpipe/segment/produce{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "xgT" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -64156,6 +64447,13 @@
 	dir = 8
 	},
 /area/station/engine/engineering)
+"xhn" = (
+/obj/disposalpipe/segment{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "xhr" = (
 /obj/decal/cleanable/dirt,
 /obj/landmark/start/job/clown,
@@ -64185,6 +64483,17 @@
 	dir = 6
 	},
 /area/station/hydroponics/bay)
+"xiO" = (
+/obj/machinery/navbeacon{
+	codes_txt = "patrol;next_patrol=pool";
+	location = "bar";
+	name = "bot navigation beacon"
+	},
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/bar,
+/area/station/crew_quarters/cafeteria)
 "xiQ" = (
 /obj/machinery/vending/snack,
 /obj/decal/stage_edge,
@@ -64198,6 +64507,24 @@
 /obj/machinery/portable_atmospherics/canister/air,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
+"xjn" = (
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 5;
+	name = "autoname - Mining";
+	network = "Mining";
+	tag = ""
+	},
+/obj/machinery/power/apc/autoname_south,
+/turf/simulated/floor/yellow/side{
+	dir = 10
+	},
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "xjC" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -64239,22 +64566,6 @@
 	},
 /turf/simulated/floor,
 /area/station/crew_quarters/supplylobby)
-"xmf" = (
-/obj/disposalpipe/segment{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Medical Booth";
-	req_access_txt = null
-	},
-/obj/mapping_helper/access/medical,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/blue/side,
-/area/station/medical/medbooth)
 "xmy" = (
 /obj/machinery/conveyor/WE{
 	id = "mining"
@@ -64367,6 +64678,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/red,
 /area/station/security/secwing)
 "xrW" = (
@@ -64435,6 +64751,43 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor/yellow,
 /area/station/engine/gas)
+"xtf" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 9;
+	invisibility = 101;
+	name = "autoname - Entertainment";
+	network = "Zeta";
+	tag = ""
+	},
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4
+	},
+/obj/landmark/gps_waypoint,
+/obj/disposalpipe/segment/mail,
+/turf/simulated/floor/carpet{
+	dir = 8;
+	icon_state = "fred1"
+	},
+/area/station/chapel/sanctuary)
+"xtF" = (
+/obj/machinery/door/airlock/pyro{
+	dir = 4;
+	name = "Catering Storage";
+	req_access_txt = null
+	},
+/obj/mapping_helper/access/bar,
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/obj/disposalpipe/segment/produce{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/crew_quarters/catering)
 "xtI" = (
 /obj/window/reinforced{
 	dir = 4
@@ -64469,6 +64822,9 @@
 "xuC" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/turret_protected/armory_outside)
+"xuM" = (
+/turf/simulated/floor/grey/whitegrime/other,
+/area/station/maintenance/northeast)
 "xuR" = (
 /obj/machinery/conveyor/WE{
 	id = "qmin"
@@ -64515,6 +64871,19 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/northeast)
+"xwN" = (
+/obj/machinery/phone/wall,
+/turf/simulated/wall/auto/supernorn,
+/area/station/crew_quarters/catering)
+"xwT" = (
+/obj/disposalpipe/segment{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/chapel{
+	dir = 8
+	},
+/area/station/chapel/sanctuary)
 "xwZ" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -64522,6 +64891,15 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/medical/medbay)
+"xxe" = (
+/obj/table/wood/auto,
+/obj/item/plate,
+/obj/random_item_spawner/tableware/few,
+/obj/item/reagent_containers/food/drinks/bowl,
+/turf/simulated/floor/carpet{
+	icon_state = "fred2"
+	},
+/area/station/crew_quarters/cafeteria)
 "xxA" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
@@ -64561,6 +64939,11 @@
 	dir = 4
 	},
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "xzu" = (
@@ -64596,6 +64979,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aipower";
+	name = "AI Power";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/turret_protected/ai_upload_foyer)
 "xBi" = (
@@ -64701,6 +65089,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor,
 /area/station/engine/power)
+"xGj" = (
+/obj/storage/closet/emergency,
+/obj/decal/stripe_delivery,
+/turf/simulated/floor,
+/area/station/ranch)
 "xGt" = (
 /obj/grille/catwalk,
 /turf/simulated/floor/airless/plating/catwalk{
@@ -64753,14 +65146,6 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/grime,
 /area/station/storage/primary)
-"xJO" = (
-/obj/machinery/firealarm/north,
-/obj/machinery/light{
-	dir = 1;
-	pixel_y = 21
-	},
-/turf/simulated/floor/specialroom/cafeteria,
-/area/station/crew_quarters/kitchen)
 "xKj" = (
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/shuttlebay,
@@ -64885,6 +65270,16 @@
 /obj/machinery/photocopier,
 /turf/simulated/floor/darkblue,
 /area/station/medical/medbay/psychiatrist)
+"xQB" = (
+/obj/disposalpipe/segment/mail,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/turf/simulated/floor/neutral/corner,
+/area/station/hallway/primary/east)
 "xQI" = (
 /obj/machinery/light_switch{
 	layer = 9;
@@ -65186,6 +65581,16 @@
 /obj/machinery/firealarm/east,
 /turf/simulated/floor,
 /area/station/science/artifact)
+"yez" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "yeH" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -65315,8 +65720,26 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering_control,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"yhS" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/storage/emergency)
 "yhU" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -65364,6 +65787,18 @@
 /obj/decal/poster/wallsign/escape_left,
 /turf/simulated/floor/plating,
 /area/station/hallway/primary/south)
+"yiR" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment,
+/turf/simulated/floor/yellow/side,
+/area/station/storage/auxillary{
+	name = "Tool Storage"
+	})
 "yje" = (
 /obj/machinery/conveyor/SN{
 	id = "garbage";
@@ -99763,7 +100198,7 @@ mwV
 kfp
 mRI
 sfM
-vMs
+dqC
 ucm
 xuy
 dvn
@@ -109327,9 +109762,9 @@ akT
 ajS
 aCR
 aEs
-aFG
-pFV
-aIm
+dsf
+hUH
+hmq
 aIf
 aKE
 aLT
@@ -109629,9 +110064,9 @@ akT
 wqw
 aCR
 aEm
-aFH
-aHc
-aIn
+uLk
+aHa
+vdP
 aJv
 lSC
 aLU
@@ -110628,7 +111063,7 @@ cdw
 cpY
 crb
 jje
-grs
+rsy
 kFN
 uzt
 uzt
@@ -110930,7 +111365,7 @@ cqe
 cqe
 hpX
 vIN
-grs
+rsy
 ctI
 yht
 yht
@@ -111139,8 +111574,8 @@ aAm
 ajS
 aCR
 aEv
-aFu
-aEh
+eyE
+kap
 aWT
 aJz
 aKF
@@ -111233,10 +111668,10 @@ uLB
 uLB
 uLB
 uLB
-mpv
+eKd
 uLB
 uLB
-mpv
+eKd
 uLB
 adC
 adC
@@ -111441,8 +111876,8 @@ aAo
 ajQ
 aCO
 aEw
-aFL
-aHf
+tcE
+kRz
 aIo
 aJA
 aKI
@@ -111743,8 +112178,8 @@ apw
 ntv
 apw
 apw
-aFM
-ltq
+rbE
+dsc
 hhw
 aJB
 apC
@@ -112039,14 +112474,14 @@ ase
 atv
 auK
 avW
-pRa
+inZ
 ayK
 aAp
 aBP
 aDb
 aEx
-aFN
-aqP
+tCk
+nVD
 aIq
 aJC
 aKJ
@@ -112347,8 +112782,8 @@ atw
 aBQ
 aqP
 cRg
-aFO
 aqP
+aFO
 aIr
 aJD
 aKK
@@ -112649,8 +113084,8 @@ aqO
 vED
 aqO
 aqO
-aFP
-aHh
+aqO
+rZI
 aIs
 aJE
 aKL
@@ -112941,18 +113376,18 @@ amU
 aom
 aJB
 aqP
-ash
-aty
-auL
-avY
+ofY
+goO
+uOt
+buW
 aqP
 ayM
 aAq
 aBS
 aAq
 aEz
-aFQ
-aqP
+vrK
+aFO
 aIq
 aJF
 iLY
@@ -113243,18 +113678,18 @@ nRD
 aon
 apw
 aqP
-aUD
-atz
-auM
-cKD
-aqP
-ayN
-gLv
-aBT
-aDc
-aEA
-aFR
+srb
+jVA
+uOt
+xxe
 aqP
+iaH
+sQl
+tks
+vaq
+qKo
+ghZ
+aFO
 aIt
 aJG
 aKN
@@ -113554,9 +113989,9 @@ ayO
 iRa
 asl
 aDd
-aEB
-aFS
-aqP
+bOP
+lkC
+aFO
 aIq
 aJH
 aKO
@@ -113856,9 +114291,9 @@ ayP
 aAt
 asl
 asl
-aEC
-aFS
-aHi
+qwS
+lkC
+xiO
 aIu
 aJD
 aKK
@@ -114159,8 +114594,8 @@ bHj
 asl
 aDe
 rbE
-aFT
-aqP
+maL
+aFO
 aIr
 aJE
 aKL
@@ -114444,8 +114879,8 @@ agr
 aie
 ank
 toe
-cRc
-alf
+ehD
+cXe
 ame
 amY
 aoq
@@ -114459,10 +114894,10 @@ ask
 ayR
 asl
 aBU
-asl
-vHW
-aFO
-aqP
+mQx
+vif
+nLX
+nVD
 xDr
 aJC
 aKP
@@ -114746,25 +115181,25 @@ hCx
 aiU
 anl
 aiY
-uMF
+ssn
 alg
 alg
 alg
 alg
-qKa
-oyV
-asl
-asl
-bmt
-dGs
-asl
-asl
-asl
-asl
-aDf
-aEE
-aFU
-aqP
+prD
+cOx
+iNm
+iNm
+jTk
+lQi
+iNm
+iNm
+iNm
+iNm
+jZQ
+apC
+tDf
+aFO
 aIq
 apw
 aKQ
@@ -115053,9 +115488,9 @@ alg
 alg
 ryN
 alg
-apF
+tSy
 apw
-qwG
+kCu
 apC
 vGu
 asl
@@ -115065,8 +115500,8 @@ aAv
 aBV
 oaN
 apC
-aFM
-ltq
+rbE
+dsc
 hhw
 aJI
 aKR
@@ -115350,13 +115785,13 @@ acT
 aiV
 aie
 aiZ
-auf
-alg
-alg
-alg
+dpk
 alg
-alg
-aqT
+kxP
+jiB
+jiB
+pky
+guJ
 lel
 apw
 apw
@@ -115367,8 +115802,8 @@ apw
 apw
 apw
 apw
-oSf
-bNf
+tLR
+bVV
 aHo
 aJJ
 aKS
@@ -115655,10 +116090,10 @@ aiZ
 lwM
 alg
 spb
-ihb
-wWS
 alg
 alg
+alg
+dWk
 aso
 atC
 ucB
@@ -115669,8 +116104,8 @@ aAw
 aBW
 aDh
 bjh
-aDC
-bNf
+ttG
+xhn
 aHp
 aJK
 aKT
@@ -115956,16 +116391,16 @@ aie
 aja
 akc
 alg
+jiB
+jiB
+vuZ
 alg
-ana
-spW
-alg
-spb
+jwh
 alg
 rqj
 auR
 qQK
-lvC
+etY
 bjh
 aAx
 aBX
@@ -116256,14 +116691,14 @@ aeG
 aie
 aie
 aiZ
-aiZ
-xJO
+eDM
 alg
-anb
 alg
 alg
 alg
-asp
+alg
+vlI
+jJj
 atC
 sPX
 awe
@@ -116276,10 +116711,10 @@ koS
 aDz
 bNg
 aHx
-xmf
-aKV
-aVh
-aNj
+gIt
+dsB
+kqC
+jAI
 wIz
 aPy
 aQC
@@ -116371,7 +116806,7 @@ cIO
 yht
 yht
 lpQ
-rRo
+qAO
 adC
 adC
 adC
@@ -116559,29 +116994,29 @@ aie
 aie
 qzb
 aiZ
-ali
-amh
-anc
-aot
-apG
-qKa
-asq
+jNg
+jrc
+mBW
+eCT
+nQn
+fts
+fpm
 atC
 auT
 ogJ
 qRK
 ayT
 aAz
-aBZ
-aDk
-dae
-aDC
-bNf
-wkE
-aJN
+yhS
+qvD
+vXP
+fmP
+koE
+iCH
 aKR
 aKR
-aMg
+aKR
+uRR
 aMg
 aMg
 aQD
@@ -116864,26 +117299,26 @@ aiZ
 aiZ
 aiZ
 aiY
-aou
+aiY
+aiZ
+vmK
 aiZ
-hka
-asr
 atE
 atC
 dlh
 atC
 ayU
 aAA
-aCa
+iEN
 aDl
 bjh
-aFZ
-aGu
-aHz
-aIT
-aIX
+qDc
+bNf
+bVG
+bNf
+pze
 bHZ
-aKW
+etO
 aOB
 aye
 aQD
@@ -117166,26 +117601,26 @@ aiU
 aiU
 bYA
 and
-aov
-jli
-and
-ass
-atF
-axw
-awg
-axw
-eJM
-aAB
-aCb
-aDm
-tqm
-aGa
-aHj
-aIw
-bNg
-aJa
+qSz
+wNc
+pSG
+hnG
+oSp
+hnG
+quR
+oIq
+onv
+gIU
+yez
+wwr
+bjh
+ahM
+aGu
+mpm
+aMR
+aMR
 aJP
-aKX
+fFV
 aKX
 aMR
 aNl
@@ -117451,9 +117886,9 @@ adC
 adC
 adC
 adC
-iyk
-iDm
-nzi
+aag
+etw
+aaG
 adC
 aag
 sTt
@@ -117466,24 +117901,24 @@ aie
 aie
 rvr
 aie
-amj
+xwN
 ane
-aow
-apI
-meU
-ast
-ast
-ast
-awh
-axx
-ayW
-aAC
-aCc
-aDn
-ayW
-aGb
-bWO
-aIx
+xgn
+apK
+apK
+apK
+apK
+apK
+ocr
+sRY
+ayT
+mWd
+mgC
+jKa
+ayT
+bUx
+bVV
+bVG
 bNf
 bNf
 aJQ
@@ -117753,9 +118188,9 @@ adC
 adC
 adC
 adC
-iyk
-iDm
-nzi
+aag
+etw
+aaG
 adC
 aag
 kek
@@ -117769,20 +118204,20 @@ apN
 aie
 aie
 amj
-qVo
-aox
-jOu
-aqW
-asu
-uNi
-auV
-awi
-axy
-ayU
-ayU
-ayU
+jKC
+ihy
+apK
+apK
+apK
+apK
+wwF
+fHo
+sRY
+ayT
+ayT
+ayT
+ayT
 ayU
-aEJ
 bUx
 bVV
 bVG
@@ -118072,18 +118507,18 @@ aie
 aie
 amj
 ang
-shc
-dxI
-aqX
-apA
-atH
-atP
-awj
-axz
-tqo
-fIl
-aCd
+pOR
+qYP
+uNE
+apK
+apK
+rxL
+fHo
+sRY
+aqY
 aDo
+aDo
+aCd
 aqY
 aGc
 bVV
@@ -118366,27 +118801,27 @@ aaG
 adC
 adC
 adC
-ajc
-jsu
-lSg
+tSK
+kUg
+cMe
 tSK
 aie
 aie
 amj
 anh
-aox
-cUw
-aqY
-asv
-atI
-bgo
-awk
-axA
-ayY
-dTk
-aCe
-aDo
+ihy
+fkW
+aqW
+asu
+uNi
+auV
+awi
+axy
 aqY
+dmH
+lBV
+tbE
+iuu
 aGd
 bVV
 aIz
@@ -118667,35 +119102,35 @@ adC
 wxk
 adC
 adC
-ajc
-ajc
-ajc
-ajc
-ajc
+prm
+tSK
+cMe
+xuM
+tSK
 aie
 aie
 amj
 cuU
-aox
-apK
-aqY
-asv
-atI
+nNK
+kxF
+aqX
+apA
+atH
 atP
-awk
-axB
-ayZ
-qxz
-aqY
-aqY
+awj
+axz
+tqo
+lAh
+tbE
+tbE
 aqY
 bUx
 bVV
-aIA
-mdp
-aKY
+wVp
+cLi
+gse
 aMl
-aNo
+wTx
 aHr
 mEg
 bjg
@@ -118961,36 +119396,36 @@ adC
 adC
 adC
 adC
-aag
-etw
-aap
-aar
-aar
-aaq
+iyk
+iDm
+nzi
+adC
+adC
+aam
 azt
 aaf
+cvA
 ajc
-aie
-aie
-lTS
-ajc
+jsu
+hni
+tSK
 aie
 aie
 amj
-anj
-aox
-qYP
-aqW
-asw
-jfV
-auD
-awl
-arb
-arb
-arb
-arb
-aDw
-aER
+svQ
+tpp
+pVn
+aqY
+asv
+atI
+bgo
+awk
+deH
+idF
+lqU
+tbE
+wPV
+aqY
 aGf
 bVV
 aIB
@@ -119259,7 +119694,7 @@ adC
 adC
 adC
 adC
-aal
+adC
 adC
 adC
 adC
@@ -119271,29 +119706,29 @@ adC
 adC
 aam
 aap
-vxT
-aie
-aie
-aie
+ajc
+ajc
+ajc
+ajc
 ajc
 aie
 aie
 amj
 amj
-aoy
-gkw
-aqX
-asy
-asy
-asy
-awm
-axC
-sjN
-aNz
-aCf
-aDx
-aES
-aES
+knf
+xtF
+aqY
+asv
+atI
+atP
+awk
+axB
+qxz
+taD
+aqY
+aqY
+aqY
+giH
 aHj
 aIB
 aXQ
@@ -119359,7 +119794,7 @@ bKP
 bvP
 bNP
 oej
-bQv
+bGc
 bDP
 psl
 bIF
@@ -119560,47 +119995,47 @@ aah
 adC
 adC
 adC
-iyk
-tZO
-nzi
-adC
 adC
-iyk
-iDm
-nzi
 adC
 adC
 adC
 adC
-aam
-vxT
-aie
+aag
+etw
+aap
+aar
+aar
+aar
+eEx
+gEZ
+ajc
 aie
 aie
-onU
+lTS
+ajc
 aie
 aie
 aie
-bLI
-arc
+kVG
 arq
-aqZ
-asz
-atK
-auY
-awn
-axD
-atM
-aAH
-aqZ
-gZd
-bNf
-bNf
+szn
+aqW
+asw
+jfV
+auD
+awl
+aqY
+aqY
+aqY
+aqY
+aDw
+aER
 bVV
-aIB
-nPW
-aLb
-aHr
+ewn
+ofw
+fUp
+qDq
+uZB
 aNr
 aOF
 aPB
@@ -119862,9 +120297,9 @@ aah
 adC
 adC
 adC
-iyk
-ukJ
-nzi
+adC
+aal
+adC
 adC
 adC
 iyk
@@ -119883,26 +120318,26 @@ ajc
 aie
 aie
 apR
-mSt
-arc
+jbZ
 arq
+arc
+aqX
+asy
+asy
+asy
+awm
+axC
+tVl
+xjn
 aqZ
-asA
-dad
-auZ
-awo
-axE
-aMz
-aAI
-vMT
-aDz
-aET
-aGg
-aHk
+bUx
+sQL
+xQB
+inc
 aIC
 aGo
 aLc
-aHs
+oQT
 aNq
 aMm
 aOF
@@ -120165,7 +120600,7 @@ adC
 adC
 adC
 iyk
-ukJ
+tZO
 nzi
 adC
 adC
@@ -120177,34 +120612,34 @@ adC
 adC
 adC
 adC
-ajc
+vxT
 aie
 aie
 aie
-oPG
-emU
-apP
-apS
-bLI
-arc
+onU
+aie
+aie
+aie
+kVG
 arq
-ara
-nqq
-atM
-ava
-atM
-atM
-atM
-aAJ
+arc
 aqZ
-beh
-bPQ
-aGh
-beu
-aII
+asz
+atK
+auY
+awn
+axD
+hRG
+aAH
+aqZ
+qPC
+pwI
+gqP
+aGo
+aGo
 aGo
 aUr
-aMn
+kiL
 aNs
 aMl
 aPC
@@ -120458,11 +120893,11 @@ adC
 adC
 adC
 adC
-aag
+aah
 aat
-aay
+czV
 hPO
-aaG
+aah
 adC
 adC
 adC
@@ -120477,36 +120912,36 @@ nzi
 adC
 adC
 adC
-aaf
-agz
-agz
-agz
-agz
-agz
-agz
-agz
-bLI
-bLI
-bLI
-arc
+adC
+adC
+vxT
+aie
+aie
+aie
+ajc
+aie
+aie
+aie
+kVG
 arq
-ara
-asC
-atM
-avb
-atM
-axF
-atM
-aAK
+arc
 aqZ
-ktu
-bPQ
-aGi
+asA
+dad
+auZ
+awo
+axE
+oRT
+yiR
+jPp
+dyx
+hxp
+shL
 bev
-aIJ
-aHs
-aHr
-aHs
+vRG
+sKs
+wRX
+xwT
 aNt
 aMm
 aOF
@@ -120760,11 +121195,11 @@ adC
 adC
 adC
 adC
-aag
+aah
 xBi
-aax
+czV
 hPO
-aaG
+aah
 adC
 adC
 adC
@@ -120773,37 +121208,37 @@ ukJ
 nzi
 adC
 adC
-aag
-etw
-aaG
+iyk
+iDm
+nzi
 adC
 adC
-aaf
-aap
-agz
-anp
-bXT
-eOj
-sfR
-kiI
-akf
-alk
-ubQ
-kCR
+adC
+adC
+adC
+ajc
+aie
+aie
+aie
+oPG
+emU
+apP
+apS
+kVG
+arq
 arc
-arr
+ara
+nqq
+atM
+ava
+atM
+atM
+atM
+aAJ
 aqZ
-asD
-atN
-avc
-awp
-axG
-azb
-aAL
-aCh
 aDC
-aEU
-bet
+pgo
+skn
 bew
 aIK
 aHr
@@ -121064,48 +121499,48 @@ adC
 adC
 aag
 aau
-aai
+aay
 hPO
-aap
-aaw
-aaw
-aaw
+aaG
+adC
+adC
+adC
 iyk
 ukJ
 nzi
 adC
 adC
-aag
-etw
-aaG
+iyk
+iDm
+nzi
 adC
 adC
-aag
-agz
+adC
+aaf
 agz
-kMW
-duM
-ehU
-opl
-opl
-akf
-arq
-arq
+ajc
+ajc
+ajc
+ajc
+ajc
+ajc
+kVG
+kVG
+kVG
 arq
 arc
-ars
-aqZ
-aqZ
-aqZ
-aqZ
-aqZ
 ara
-azc
-aAM
-aCi
-aDC
-bPQ
-aGk
+asC
+atM
+avb
+atM
+axF
+atM
+aAK
+aqZ
+ktu
+pgo
+eVe
 bex
 bfo
 aHs
@@ -121365,49 +121800,49 @@ adC
 adC
 adC
 aag
-aav
-avp
-aaE
-dgj
-aaN
-aaN
-aap
-aap
-etw
-aap
-aaw
-aaw
-aap
-etw
+kFi
+aax
+hPO
 aaG
 adC
 adC
+adC
+iyk
+ukJ
+nzi
+adC
+adC
 aag
-epb
-uKK
-uKK
-agC
-ahk
-wRT
-ajg
-jrT
-alm
-wWK
-wWK
-are
-art
-asM
-ejG
-aDI
-ayf
-azv
-aDI
-aDI
-whg
-ayd
-aDD
-aEV
-aGl
+etw
+aaG
+adC
+adC
+aaf
+aap
+agz
+anp
+gMA
+eOj
+sfR
+kiI
+akf
+alk
+ubQ
+kCR
+arq
+exA
+aqZ
+asD
+atN
+avc
+awp
+axG
+azb
+aAL
+aCh
+aDC
+wwE
+sKP
 aGo
 nyI
 aHr
@@ -121464,7 +121899,7 @@ duS
 jQr
 bEH
 bFo
-bFo
+bMz
 bGU
 bHL
 eQO
@@ -121670,45 +122105,45 @@ aag
 xaG
 aai
 hPO
-aai
-aax
-aay
 aap
-aaZ
-cVP
-qAl
-qAl
-qAl
-qAl
-dRb
+aaw
+aaw
+aaw
+iyk
+ukJ
+nzi
+adC
+adC
+aag
+etw
 aaG
 adC
 adC
 aag
-tMA
 agz
-anV
-agC
-ahl
-aih
-git
-hgm
-aln
+agz
+kMW
+duM
+ehU
+opl
+opl
+akf
 arq
 arq
 arq
 arq
-asN
-azx
-azx
-azx
-azw
-azx
-azx
-rcX
-azx
-aDE
-aEW
+wPN
+aqZ
+aqZ
+aqZ
+aqZ
+aqZ
+ara
+azc
+aAM
+aCi
+aDC
+pgo
 aXQ
 aXQ
 aIN
@@ -121766,7 +122201,7 @@ emF
 kLE
 vIv
 bFp
-bFo
+bMz
 bGV
 bGV
 bFo
@@ -121969,48 +122404,48 @@ adC
 adC
 adC
 aag
-xaG
-aai
-hPO
-fxp
-fxp
-fxp
+iqk
+avp
+aaE
+dgj
+aaN
+aaN
 aap
 aap
 etw
 aap
-aaq
-aaq
+aaw
+aaw
 aap
 etw
 aaG
 adC
 adC
 aag
-all
-amo
-aqx
+epb
+uKK
+uKK
 agC
-ahl
-aih
-ahl
-aki
-jRc
-hwT
-xrq
-arf
-asx
-asO
-bLI
-aye
-azu
-aoE
-axI
-azd
-aAN
-aCj
-aDJ
-bVG
+ahk
+wRT
+ajg
+jrT
+alm
+wWK
+wWK
+wWK
+erT
+asM
+ejG
+aDI
+ayf
+azv
+aDI
+aDI
+whg
+ayd
+aDD
+uDl
 aXQ
 aHr
 aHs
@@ -122018,7 +122453,7 @@ aHr
 aIP
 aJU
 aNx
-aOG
+dOI
 aPF
 aQH
 aRL
@@ -122066,9 +122501,9 @@ bzY
 bzY
 bzY
 bzY
-dcu
+rYi
 pxF
-bHM
+kTD
 bFo
 bHM
 bFo
@@ -122273,46 +122708,46 @@ adC
 aag
 xaG
 aai
-aaC
+hPO
+aai
+aax
+aay
 aap
-aaq
-aaq
-aaq
-iyk
-iDm
-nzi
-adC
-adC
-iyk
-iDm
-nzi
+aap
+cVP
+qAl
+qAl
+qAl
+qAl
+dRb
+aaG
 adC
 adC
-aam
-agz
-agz
+aag
+tMA
 agz
-uVV
-jPL
-jKe
-ajh
-aki
-amD
-apY
-apY
-apY
-ths
-atO
-amD
-amD
-amD
-aoE
-uOo
-aze
-aAO
-aCk
-aDK
-bVG
+anV
+agC
+ahl
+aih
+git
+hgm
+aln
+arq
+arq
+arq
+arq
+asN
+azx
+azx
+azx
+azw
+azx
+azx
+rcX
+azx
+aDE
+aEW
 aXQ
 aHs
 aIO
@@ -122324,9 +122759,9 @@ aMo
 aLf
 aJT
 aPD
-aMm
-aTN
-aVb
+nwG
+lcI
+dlj
 bcg
 aXN
 bbH
@@ -122366,9 +122801,9 @@ adC
 aak
 aaq
 aaq
-aaq
-bzY
+aap
 bzY
+vHp
 bzY
 usr
 bGW
@@ -122574,47 +123009,47 @@ adC
 adC
 aag
 xaG
-aax
-gGO
+aai
+hPO
+fxp
+fxp
+fxp
+aap
+aap
+etw
+aap
+aaq
+aaq
+aap
+etw
 aaG
 adC
 adC
-adC
-iyk
-iDm
-nzi
-adC
-adC
-iyk
-iDm
-nzi
-adC
-adC
-adC
-aaj
-adC
-agz
-qQH
-eIp
-ajl
-ajl
-akj
-amD
-pyR
-awI
-awI
-atX
-arg
-asG
-avy
+aag
+all
+amo
+aqx
+agC
+ahl
+aih
+ahl
+aki
+jRc
+hwT
+xrq
+arf
+asx
+asO
 amD
-awt
-axK
-omw
-aAP
-ulq
-aDL
-rJe
+rdX
+xGj
+aoE
+axI
+azd
+aAN
+aCj
+aDJ
+wSZ
 aXQ
 aHr
 aIP
@@ -122626,9 +123061,9 @@ aJU
 aJU
 aJU
 aRM
-aSI
+vRq
+aGo
 aGo
-aVc
 aGo
 aGo
 aYS
@@ -122668,10 +123103,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-bFr
+smf
+smf
+vPc
+smf
 uul
 bFr
 duo
@@ -122876,12 +123311,12 @@ adC
 adC
 aag
 xaG
-aay
-hwF
-aaG
-adC
-adC
-adC
+aai
+aaC
+aap
+aaq
+aaq
+aaq
 iyk
 iDm
 nzi
@@ -122892,45 +123327,45 @@ iDm
 nzi
 adC
 adC
-adC
-adC
-adC
-aqz
-ajl
-ajl
-ajl
-ajl
-qHj
+aam
+agz
+agz
+agz
+uVV
+jPL
+jKe
+ajh
+aki
+amD
 apY
-fKh
-awI
-awI
-atX
-awI
-awI
-atR
+apY
+apY
+ths
+atO
+amD
+amD
 amD
-eGt
-axL
-azf
-aAQ
 aoE
-lvm
-bVL
-gvB
-aHt
-aIQ
+uOo
+aze
+aAO
+aCk
+aDK
+vxJ
+isN
+kLp
+maI
 aJV
 aJV
-aMp
-bdt
-aMp
+vyW
+xtf
+vyW
 aJV
 aJV
 aRN
-aSJ
+otx
 aTO
-aVd
+aWw
 aWw
 aWw
 oCM
@@ -122970,10 +123405,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-bFr
+iWf
+mSG
+mwn
+smf
 fRt
 bGX
 pNt
@@ -123176,11 +123611,11 @@ adC
 adC
 adC
 adC
-aah
-adC
-aah
-adC
-aah
+aag
+xaG
+aax
+gGO
+aaG
 adC
 adC
 adC
@@ -123195,30 +123630,30 @@ nzi
 adC
 adC
 adC
+aaj
 adC
-adC
-avH
-ajl
-ajl
+agz
+qQH
+eIp
 ajl
 ajl
-gPb
-apY
-qvz
+akj
+amD
+pyR
 awI
 awI
 atX
-mDJ
-awI
-atS
-apY
-awv
-axM
-azg
-aRq
-uvT
-aDN
-aEY
+arg
+asG
+avy
+amD
+awt
+axK
+omw
+aAP
+ulq
+aDL
+gro
 aGo
 aHu
 aIP
@@ -123272,10 +123707,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-bFr
+iWf
+iwE
+iJx
+smf
 uxX
 bFr
 mhN
@@ -123478,11 +123913,11 @@ adC
 adC
 adC
 adC
-aah
-adC
-aah
-adC
-aah
+aag
+xaG
+aay
+hwF
+aaG
 adC
 adC
 adC
@@ -123499,28 +123934,28 @@ adC
 adC
 adC
 adC
-avI
+aqz
 ajl
 ajl
 ajl
 ajl
-wxJ
+qHj
 apY
-eVo
-pVw
-rYw
-apW
-hqn
-obY
-atT
-oCP
-aww
-axN
-azh
-aAS
+fKh
+awI
+awI
+atX
+awI
+awI
+atR
+amD
+eGt
+axL
+azf
+aAQ
 aoE
-aDO
-rrB
+lvm
+gro
 aGo
 uAb
 aIR
@@ -123574,10 +124009,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-ceH
+iWf
+iwE
+iqM
+pqX
 fRt
 bGY
 pNt
@@ -123789,7 +124224,7 @@ adC
 adC
 adC
 iyk
-oPz
+iDm
 nzi
 adC
 adC
@@ -123801,31 +124236,31 @@ adC
 adC
 adC
 adC
-agz
-ajm
-ajm
-ajm
-ajm
-uUA
-atW
-vPu
-arS
-apX
-apX
-ark
-asJ
-atU
-amD
-awx
-axO
-azi
-snW
-aoE
-aDP
-aFb
+avH
+ajl
+ajl
+ajl
+ajl
+gPb
+apY
+qvz
+awI
+tHo
+atX
+mDJ
+awI
+atS
+apY
+awv
+axM
+azg
+aRq
+uvT
+aDN
+ihL
 aGo
-aVG
-aIS
+aHr
+tkk
 sLV
 aLg
 aMq
@@ -123876,10 +124311,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-ceH
+iWf
+iwE
+uCR
+iWf
 fRt
 bGY
 pNt
@@ -124090,44 +124525,44 @@ aah
 adC
 adC
 adC
-adC
-aaj
-adC
-adC
-adC
-aag
-etw
-aaG
-adC
-adC
+iyk
+iDm
+nzi
 adC
 adC
+iyk
+iDm
+nzi
 adC
-aii
 adC
 adC
 adC
 adC
-aii
-atW
-xdL
-vBo
-vBo
-arh
-hKY
-fTr
-dnB
-atW
-awy
-axO
-azi
-aAU
-auq
-nse
-auq
-baL
-baL
-baL
+avI
+ajl
+ajl
+ajl
+ajl
+wxJ
+apY
+eVo
+pVw
+rYw
+apW
+hqn
+obY
+atT
+oCP
+aww
+axN
+azh
+aAS
+aoE
+aDO
+cxl
+aGo
+sUv
+nTf
 aJY
 baL
 aMr
@@ -124178,10 +124613,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-ceH
+smf
+fhw
+uCR
+iWf
 bGl
 bGZ
 pNt
@@ -124392,43 +124827,43 @@ aah
 adC
 adC
 adC
+iyk
+oPz
+nzi
 adC
 adC
+iyk
+iDm
+nzi
 adC
 adC
 adC
-aag
-etw
-aaG
-adC
-adC
-adC
-adC
-adC
-lTZ
-adC
-adC
 adC
 adC
-bSY
-atW
-tSN
-awI
-awI
-atX
-mDJ
-awI
-fSd
+agz
+ajm
+ajm
+ajm
+ajm
+uUA
 atW
-avj
-htT
-jao
-avj
+vPu
+arS
+apX
+apX
+ark
+asJ
+atU
+amD
+awx
+axO
+azi
+snW
+mEL
+rMG
+auq
+auq
 auq
-swx
-pjG
-flp
-sTC
 baL
 aJZ
 baL
@@ -124480,10 +124915,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aag
-ceH
+smf
+eaB
+eNa
+iWf
 bGm
 whr
 xuR
@@ -124695,7 +125130,7 @@ adC
 adC
 adC
 adC
-adC
+aaj
 adC
 adC
 adC
@@ -124707,30 +125142,30 @@ adC
 adC
 adC
 adC
-aah
-adC
+aii
 adC
 adC
 adC
 adC
+aii
 atW
-mDJ
-awI
-awI
-atX
-awI
-awI
-eJd
+xdL
+vBo
+vBo
+arh
+hKY
+fTr
+dnB
 atW
-auW
-axQ
-azk
-kXj
+awy
+axO
+azi
+aAU
 auq
-edb
-dnJ
-puY
-ybI
+dPW
+pjG
+pjG
+oUX
 baL
 aKa
 baL
@@ -124782,10 +125217,10 @@ adC
 adC
 adC
 adC
-adC
-adC
-aaj
-bFr
+smf
+smf
+iWf
+smf
 bGn
 bFr
 eVd
@@ -125009,31 +125444,31 @@ adC
 adC
 adC
 adC
-aah
-adC
+lTZ
 adC
 adC
 adC
 adC
-tqZ
-mwY
+bSY
+atW
+tSN
 awI
 awI
 atX
+mDJ
 awI
-azp
-eJd
-apY
-suj
-axQ
-azn
-aAW
-kVJ
-mlq
-fHm
-eiP
-jYd
-fqB
+fSd
+atW
+axI
+iYS
+paF
+axI
+auq
+swx
+pjG
+pjG
+ybI
+auq
 adC
 aah
 adC
@@ -125304,38 +125739,38 @@ adC
 adC
 adC
 aag
-eYx
+etw
 aaG
 adC
 adC
 adC
 adC
 adC
-ppz
+aah
 adC
 adC
 adC
 adC
 adC
-tqZ
-hLn
+atW
+mDJ
 awI
 awI
 atX
-dZb
-sem
-jiQ
+awI
+awI
+eJd
 atW
-awC
+dSo
 axQ
-azn
-aAX
+azk
+kXj
+auq
+wqg
+dnJ
+puY
+ybI
 auq
-fxZ
-oFJ
-eiP
-xla
-fqB
 adC
 aaj
 adC
@@ -125605,38 +126040,38 @@ adC
 adC
 adC
 adC
-aah
-aaj
-aah
-adC
+aag
+etw
+aaG
 adC
 adC
 adC
 adC
 adC
+aah
 adC
 adC
 adC
 adC
 adC
 tqZ
-tqZ
-tqZ
-tqZ
-tqZ
-rrd
-asK
-azs
-atW
-dsG
+mwY
+awI
+awI
+atX
+awI
+azp
+eJd
+apY
+suj
 axQ
-azk
-aAY
-auq
-wfn
-pjG
-jst
-emu
+azn
+aAW
+kVJ
+mlq
+fHm
+eiP
+jYd
 fqB
 adC
 adC
@@ -125907,39 +126342,39 @@ adC
 adC
 adC
 adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
+aag
+eYx
+aaG
 adC
 adC
 adC
 adC
 adC
+ppz
 adC
 adC
 adC
 adC
 adC
-aag
 tqZ
+hLn
+awI
+awI
+atX
+dZb
+sem
+jiQ
 atW
-lrG
-apY
-atW
-awE
-axS
-gQe
-mCe
-auq
-auq
-qcF
+awC
+axQ
+azn
+aAX
 auq
+fxZ
+oFJ
+eiP
+xla
 fqB
-lRw
 adC
 adC
 adC
@@ -126083,165 +126518,165 @@ adC
 adC
 adC
 adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-"}
-(202,1,1) = {"
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aag
-mPp
-axT
-aBb
-vdC
-nhn
-awF
-azz
-qhP
-tyN
-nhn
-vdC
-arn
-pJc
-mPp
-aaG
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+"}
+(202,1,1) = {"
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+adC
+aah
+adC
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+aaj
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+tqZ
+tqZ
+tqZ
+tqZ
+tqZ
+rrd
+asK
+azs
+atW
+dsG
+axQ
+azk
+aAY
+auq
+wfn
+pjG
+jst
+emu
+fqB
 adC
 adC
 adC
@@ -126528,22 +126963,22 @@ adC
 adC
 adC
 adC
-mPp
-mPp
-eCD
-aBb
-atZ
-avj
-juE
-oyc
-mPc
-qUI
-avj
-xdC
-arn
-ydh
-mPp
-mPp
+aag
+tqZ
+atW
+lrG
+apY
+atW
+awE
+axS
+gQe
+mCe
+auq
+auq
+qcF
+auq
+fqB
+lRw
 adC
 adC
 adC
@@ -126778,74 +127213,74 @@ adC
 adC
 adC
 adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-mPp
-aud
-arn
-aBb
-awJ
-gpQ
-qkY
-cHQ
-dJW
-awG
-svZ
-jvO
-arn
-eCD
-xia
-mPp
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+adC
+aah
+adC
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+adC
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aag
+mPp
+axT
+aBb
+vdC
+nhn
+awF
+azz
+qhP
+tyN
+nhn
+vdC
+arn
+pJc
+mPp
+aaG
 adC
 adC
 adC
@@ -127133,20 +127568,20 @@ adC
 adC
 adC
 mPp
-apZ
-arn
-azq
-jVY
-aDF
-rNW
-rNW
-hpR
-awG
-uqe
-lVE
-arn
+mPp
+eCD
+aBb
+atZ
+avj
+juE
+oyc
+mPc
+qUI
+avj
+xdC
 arn
-aHw
+ydh
+mPp
 mPp
 adC
 adC
@@ -127435,20 +127870,20 @@ adC
 adC
 adC
 mPp
-apZ
-arn
+aud
 arn
-auc
-avj
-fhM
-awG
+aBb
+awJ
+gpQ
+qkY
+cHQ
+dJW
 awG
-rFl
-avj
-xiw
-arn
+svZ
+jvO
 arn
-aHw
+eCD
+xia
 mPp
 adC
 adC
@@ -127737,20 +128172,20 @@ adC
 adC
 adC
 mPp
-apZ
-arn
+srq
 arn
-fnq
-nhn
-nhn
-oLV
-pbM
-nhn
-nhn
-iTs
+azq
+jVY
+aDF
+rNW
+rNW
+hpR
+awG
+uqe
+lVE
 arn
 arn
-aHw
+srq
 mPp
 adC
 adC
@@ -128008,138 +128443,11 @@ adC
 adC
 adC
 adC
-aah
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-mPp
-apZ
-arn
-arn
-aCm
-aDH
-nhn
-dJQ
-hXZ
-nhn
-aDH
-arn
-arn
-arn
-aHw
-mPp
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-aah
-adC
-aah
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-bza
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-adC
-aag
-gDG
-hqQ
-aap
-suF
-aaG
-adC
-adC
-adC
-adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128153,17 +128461,11 @@ adC
 aah
 adC
 adC
-hAi
-dKw
-gJZ
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128171,6 +128473,22 @@ adC
 adC
 adC
 adC
+mPp
+apZ
+arn
+arn
+auc
+avj
+fhM
+awG
+awG
+rFl
+avj
+xiw
+arn
+arn
+aHw
+mPp
 adC
 adC
 adC
@@ -128198,8 +128516,11 @@ adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128215,7 +128536,6 @@ adC
 adC
 adC
 adC
-aae
 adC
 adC
 adC
@@ -128227,6 +128547,7 @@ adC
 adC
 adC
 adC
+bza
 adC
 adC
 adC
@@ -128238,12 +128559,16 @@ adC
 adC
 adC
 adC
-"}
-(209,1,1) = {"
 adC
 adC
 adC
 adC
+aag
+gDG
+hqQ
+aap
+suF
+aaG
 adC
 adC
 adC
@@ -128258,14 +128583,22 @@ adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
 adC
+hAi
+dKw
+gJZ
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128310,22 +128643,18 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
 adC
 adC
+aae
 adC
 adC
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128340,26 +128669,12 @@ adC
 adC
 adC
 adC
-mPp
-avh
-arn
-arn
-arn
-arn
-gJj
-awG
-awG
-rUg
-arn
-arn
-eBl
-arn
-avh
-mPp
 adC
 adC
 adC
 adC
+"}
+(209,1,1) = {"
 adC
 adC
 adC
@@ -128383,11 +128698,8 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128414,7 +128726,6 @@ adC
 adC
 adC
 adC
-byW
 adC
 adC
 adC
@@ -128430,18 +128741,15 @@ adC
 adC
 adC
 adC
-aag
-gDG
-hqQ
-aap
-suF
-aaG
 adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128452,20 +128760,12 @@ adC
 adC
 aah
 adC
-aag
-aar
-aar
-hAi
-dKw
-gJZ
+aah
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128475,6 +128775,22 @@ adC
 adC
 adC
 adC
+mPp
+apZ
+arn
+arn
+fnq
+nhn
+nhn
+oLV
+pbM
+nhn
+nhn
+iTs
+arn
+arn
+aHw
+mPp
 adC
 adC
 adC
@@ -128502,8 +128818,11 @@ adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128530,6 +128849,7 @@ adC
 adC
 adC
 adC
+byW
 adC
 adC
 adC
@@ -128540,13 +128860,17 @@ adC
 adC
 adC
 adC
-"}
-(210,1,1) = {"
 adC
 adC
 adC
 adC
 adC
+aag
+gDG
+hqQ
+aap
+suF
+aaG
 adC
 adC
 adC
@@ -128561,12 +128885,22 @@ adC
 adC
 adC
 adC
+aah
 adC
+aag
+aar
+aar
+hAi
+dKw
+gJZ
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128612,11 +128946,8 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128625,9 +128956,7 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128642,26 +128971,12 @@ adC
 adC
 adC
 adC
-mPp
-mPp
-srq
-arn
-arn
-aEX
-awJ
-awG
-awG
-jvO
-aEX
-arn
-arn
-srq
-mPp
-mPp
 adC
 adC
 adC
 adC
+"}
+(210,1,1) = {"
 adC
 adC
 adC
@@ -128685,11 +129000,8 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128715,9 +129027,6 @@ adC
 adC
 adC
 adC
-aak
-bJW
-acm
 adC
 adC
 adC
@@ -128732,18 +129041,17 @@ adC
 adC
 adC
 adC
-aag
-gDG
-hqQ
-aap
-suF
-aaG
 adC
 adC
 adC
 adC
 adC
 adC
+aah
+adC
+aah
+adC
+aah
 adC
 adC
 adC
@@ -128757,17 +129065,11 @@ adC
 aah
 adC
 adC
-hAi
-uUo
-gJZ
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128775,6 +129077,26 @@ adC
 adC
 adC
 adC
+mPp
+apZ
+arn
+arn
+aCm
+aDH
+nhn
+dJQ
+hXZ
+nhn
+aDH
+arn
+arn
+arn
+aHw
+mPp
+adC
+adC
+adC
+adC
 adC
 adC
 adC
@@ -128798,8 +129120,11 @@ adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128825,10 +129150,11 @@ adC
 adC
 adC
 adC
+aak
+bJW
+acm
 adC
 adC
-cBQ
-cBQ
 adC
 adC
 adC
@@ -128841,9 +129167,13 @@ adC
 adC
 adC
 adC
+aag
+gDG
+hqQ
+aap
+suF
+aaG
 adC
-"}
-(211,1,1) = {"
 adC
 adC
 adC
@@ -128857,14 +129187,22 @@ adC
 adC
 adC
 adC
+aah
 adC
+aah
 adC
 adC
+hAi
+uUo
+gJZ
 adC
 adC
 adC
+aah
 adC
+aah
 adC
+aah
 adC
 adC
 adC
@@ -128914,11 +129252,8 @@ adC
 adC
 adC
 adC
-aah
 adC
-aah
 adC
-aah
 adC
 adC
 adC
@@ -128927,9 +129262,52 @@ adC
 adC
 adC
 adC
-aah
+cBQ
+cBQ
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+"}
+(211,1,1) = {"
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
 adC
-aah
 adC
 adC
 adC
@@ -128944,22 +129322,79 @@ adC
 adC
 adC
 adC
-aag
-mPp
-azm
-azr
-arn
-arn
-nBp
-awG
-iEc
-jvO
-arn
-arn
-azr
-mtb
-mPp
-aaG
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+adC
+aah
+adC
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+aah
+adC
+aah
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+adC
+mPp
+avh
+arn
+arn
+arn
+arn
+gJj
+awG
+awG
+rUg
+arn
+arn
+eBl
+arn
+avh
+mPp
 adC
 adC
 adC
@@ -129246,22 +129681,22 @@ adC
 adC
 adC
 adC
-aag
 mPp
 mPp
-mPp
-oQP
+srq
+arn
+arn
 aEX
-aGq
-hHR
-suD
-ssI
+awJ
+awG
+awG
+jvO
 aEX
-meq
-mPp
+arn
+arn
+srq
 mPp
 mPp
-aaG
 adC
 adC
 adC
@@ -129548,22 +129983,22 @@ adC
 adC
 adC
 adC
-aam
-aaq
-aap
-mPp
-mPp
-atV
-mPp
-mPp
-mPp
-mPp
-atV
+aag
 mPp
+azm
+azr
+arn
+arn
+nBp
+awG
+iEc
+jvO
+arn
+arn
+azr
+mtb
 mPp
-aap
-aaq
-acW
+aaG
 adC
 adC
 adC
@@ -129850,22 +130285,22 @@ adC
 adC
 adC
 adC
-adC
-adC
-aam
-aaq
-aaq
-aap
-aaq
-aaq
-aaq
-aaq
-aap
-aaq
-aaq
-acW
-adC
-adC
+aag
+mPp
+mPp
+mPp
+oQP
+aEX
+aGq
+hHR
+suD
+ssI
+aEX
+meq
+mPp
+mPp
+mPp
+aaG
 adC
 adC
 adC
@@ -130152,22 +130587,22 @@ adC
 adC
 adC
 adC
-adC
-adC
-adC
-adC
-adC
-aah
-adC
-adC
-adC
-adC
-aah
-adC
-adC
-adC
-adC
-adC
+aam
+aaq
+aap
+mPp
+mPp
+atV
+mPp
+mPp
+mPp
+mPp
+atV
+mPp
+mPp
+aap
+aaq
+acW
 adC
 adC
 adC
@@ -130456,18 +130891,18 @@ adC
 adC
 adC
 adC
-adC
-adC
-adC
-aah
-adC
-adC
-adC
-adC
-aah
-adC
-adC
-adC
+aam
+aaq
+aaq
+aap
+aaq
+aaq
+aaq
+aaq
+aap
+aaq
+aaq
+acW
 adC
 adC
 adC
@@ -131365,12 +131800,12 @@ adC
 adC
 adC
 adC
-aaj
+aah
 adC
 adC
 adC
 adC
-aaj
+aah
 adC
 adC
 adC
@@ -131667,12 +132102,12 @@ adC
 adC
 adC
 adC
+aah
 adC
 adC
 adC
 adC
-adC
-adC
+aah
 adC
 adC
 adC
@@ -131969,12 +132404,12 @@ adC
 adC
 adC
 adC
+aaj
 adC
 adC
 adC
 adC
-adC
-adC
+aaj
 adC
 adC
 adC
diff --git a/maps/cogmap2.dmm b/maps/cogmap2.dmm
index b4094c065e659..103d05a6e6578 100644
--- a/maps/cogmap2.dmm
+++ b/maps/cogmap2.dmm
@@ -750,18 +750,6 @@
 	},
 /turf/space,
 /area/space)
-"acs" = (
-/obj/machinery/computer/genetics{
-	dir = 4
-	},
-/obj/disposalpipe/segment/transport,
-/obj/item/cloneModule/genepowermodule,
-/turf/simulated/floor/greenwhite{
-	dir = 8
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "act" = (
 /mob/living/silicon/hivebot/eyebot,
 /obj/decal/stripe_delivery,
@@ -2089,17 +2077,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/hangar/catering)
-"agK" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth{
-	dir = 1
-	},
-/area/station/maintenance/solar/north)
 "agL" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -3572,7 +3549,7 @@
 	id = "crematorium";
 	pixel_y = 28
 	},
-/obj/stool/chair,
+/obj/stool/chair/black,
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/crematorium)
 "alx" = (
@@ -3860,6 +3837,7 @@
 "amj" = (
 /obj/table/auto,
 /obj/item/device/radio/intercom/catering,
+/obj/item/storage/box/popsicle_sticks,
 /turf/simulated/floor/specialroom/freezer,
 /area/station/crew_quarters/catering)
 "amk" = (
@@ -5242,18 +5220,6 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/hangar/arrivals)
-"aqE" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/hangar/arrivals)
 "aqF" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/hangar/arrivals)
@@ -6225,7 +6191,7 @@
 /area/station/crew_quarters/catering)
 "ats" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/item/device/radio/intercom/catering,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
@@ -10124,7 +10090,7 @@
 /area/station/crew_quarters/cafeteria)
 "aDx" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/disposalpipe/segment/food{
 	dir = 4
 	},
@@ -11679,14 +11645,8 @@
 	},
 /area/station/crew_quarters/garden)
 "aIm" = (
-/obj/noticeboard/persistent{
-	name = "Medbay persistent notice board";
-	persistent_id = "medbay"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "aIn" = (
 /turf/simulated/floor/green/corner{
 	dir = 1
@@ -15482,12 +15442,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/crew_quarters/quartersA)
-"aTi" = (
-/obj/machinery/computer/operating{
-	id = "OR2"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
 "aTj" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/security/checkpoint/arrivals)
@@ -18296,18 +18250,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/northeast)
-"bbj" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/machinery/atmospherics/pipe/simple/color_pipe/green_pipe{
-	dir = 1
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/north)
 "bbk" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/janitor/supply)
@@ -18341,18 +18283,6 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/plating/scorched,
 /area/station/maintenance/northeast)
-"bbs" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/northeast)
 "bbt" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk{
@@ -19061,7 +18991,7 @@
 /area/station/engine/substation/west)
 "bdz" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -19829,21 +19759,6 @@
 /obj/disposalpipe/segment,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/substation/west)
-"bgv" = (
-/obj/machinery/atmospherics/pipe/simple{
-	level = 2
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/obj/machinery/door/airlock/pyro/external{
-	req_access_txt = "40"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/engine/substation/west)
 "bgw" = (
 /obj/securearea{
 	desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
@@ -23366,14 +23281,23 @@
 	},
 /area/station/hallway/primary/west)
 "brz" = (
-/obj/rack,
-/obj/item/clothing/suit/hazard/paramedic,
-/obj/item/clothing/glasses/healthgoggles,
-/obj/item/storage/belt/medical,
-/turf/simulated/floor/bluewhite{
-	dir = 9
+/obj/table/auto,
+/obj/item/paper_bin,
+/obj/item/stamp{
+	pixel_x = 5;
+	pixel_y = 12
 	},
-/area/station/medical/medbay)
+/obj/item/hand_labeler{
+	pixel_x = 7;
+	pixel_y = -7
+	},
+/obj/item/storage/box/health_upgrade_kit{
+	pixel_x = -8;
+	pixel_y = 11
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "brB" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -26009,12 +25933,10 @@
 /turf/simulated/floor/carpet/green/fancy/edge/se,
 /area/station/crew_quarters/heads)
 "byE" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/item/reagent_containers/glass/petridish,
-/turf/simulated/floor/greenwhite{
-	dir = 4
-	},
-/area/station/medical/cdc)
+/obj/disposalpipe/segment/horizontal,
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/blue/corner,
+/area/station/medical/medbay/surgery/storage)
 "byF" = (
 /obj/machinery/portable_reclaimer,
 /turf/simulated/floor/shuttlebay,
@@ -30396,7 +30318,7 @@
 /area/station/engine/core)
 "bKa" = (
 /obj/table/reinforced/auto,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/mask/gas,
 /obj/item/clothing/head/helmet/welding,
 /turf/simulated/floor/engine,
@@ -35570,7 +35492,7 @@
 /area/station/storage/emergency)
 "bXW" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -36030,7 +35952,7 @@
 /area/station/storage/emergency)
 "bZl" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -37626,20 +37548,6 @@
 /obj/disposalpipe/segment,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/substation/east)
-"cfd" = (
-/obj/machinery/atmospherics/pipe/simple{
-	level = 2
-	},
-/obj/machinery/door/airlock/pyro/external{
-	req_access_txt = "40"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/engine/substation/east)
 "cfe" = (
 /obj/securearea{
 	desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
@@ -38120,6 +38028,19 @@
 /obj/machinery/atmospherics/pipe/manifold/overfloor,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/east)
+"cgL" = (
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/light/incandescent,
+/obj/machinery/light_switch/north,
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "cgM" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -38202,15 +38123,6 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/southeast)
-"cgZ" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/northeast)
 "cha" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/northeast)
@@ -38355,7 +38267,7 @@
 /area/station/engine/substation/east)
 "chE" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -38366,7 +38278,7 @@
 /area/station/engine/substation/east)
 "chF" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -40728,8 +40640,8 @@
 /turf/simulated/floor/circuit/green,
 /area/station/science/teleporter)
 "cot" = (
-/obj/stool/bench/auto,
 /obj/disposalpipe/segment/mail/vertical,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/caution/west,
 /area/station/science/teleporter)
 "cou" = (
@@ -40858,14 +40770,7 @@
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
 "coR" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/qmorder,
+/obj/rack/organized/techstorage_eng,
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
 "coS" = (
@@ -41383,11 +41288,11 @@
 /turf/simulated/floor/black,
 /area/station/science/teleporter)
 "cqh" = (
-/obj/stool/bench/auto,
 /obj/item/device/radio/intercom/science{
 	dir = 4
 	},
 /obj/disposalpipe/segment/mail/vertical,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/caution/corner/sw,
 /area/station/science/teleporter)
 "cqi" = (
@@ -42024,6 +41929,10 @@
 	icon_state = "1-2"
 	},
 /obj/machinery/firealarm/east,
+/obj/disposalpipe/segment/morgue,
+/obj/cable{
+	icon_state = "1-8"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "csh" = (
@@ -42751,15 +42660,6 @@
 /area/station/janitor/office)
 "cul" = (
 /obj/decal/cleanable/cobweb,
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/machinery/power/apc{
-	areastring = "Cloning";
-	dir = 8;
-	name = "Cloning APC";
-	pixel_x = -24
-	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "cun" = (
@@ -42967,15 +42867,6 @@
 	},
 /turf/simulated/floor/caution/north,
 /area/station/science/bot_storage)
-"cuU" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor/plating,
-/area/station/maintenance/south)
 "cuV" = (
 /obj/machinery/power/apc/autoname_north,
 /obj/cable{
@@ -44060,7 +43951,8 @@
 	icon_state = "1-2"
 	},
 /obj/disposalpipe/segment/morgue{
-	dir = 4
+	dir = 4;
+	icon_state = "pipe-c"
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
@@ -45141,14 +45033,7 @@
 /turf/simulated/floor/plating,
 /area/station/bridge)
 "cBk" = (
-/obj/rack,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/powermonitor_smes,
-/obj/item/circuitboard/operating,
-/obj/item/circuitboard/genetics,
-/obj/item/circuitboard/qmsupply,
-/obj/item/circuitboard/telescope,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
 "cBl" = (
@@ -45458,6 +45343,22 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"cCn" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/access/mining,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "inner"
+	},
+/turf/simulated/floor,
+/area/station/mining/staff_room)
 "cCo" = (
 /obj/decal/poster/wallsign/medbay_left,
 /obj/disposalpipe/segment/mail/vertical,
@@ -45877,12 +45778,6 @@
 /obj/disposalpipe/segment/mail/bent/west,
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
-"cDz" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 6
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
 "cDA" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
@@ -45917,12 +45812,18 @@
 /turf/simulated/floor/plating,
 /area/research_outpost)
 "cDG" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
 /area/station/medical/medbay/lobby)
 "cDH" = (
 /obj/item/device/radio/intercom/medical,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
@@ -45932,30 +45833,45 @@
 	dir = 6;
 	icon_state = "bot2"
 	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
-	dir = 1
+	dir = 9
 	},
 /area/station/medical/medbay/lobby)
 "cDK" = (
 /obj/landmark/halloween,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
 /area/station/medical/medbay/lobby)
 "cDL" = (
 /obj/disposalpipe/segment/mail/vertical,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
 /area/station/medical/medbay/lobby)
 "cDM" = (
 /obj/disposalpipe/segment,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
 /area/station/medical/medbay/lobby)
 "cDN" = (
 /obj/machinery/navbeacon/guardbotsecbot_circularpatrol/beacon14,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 5
 	},
@@ -45967,6 +45883,9 @@
 	pixel_y = 21
 	},
 /obj/machinery/light_switch/north,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/stairs{
 	dir = 4;
 	icon_state = "Stairs_wide"
@@ -45974,6 +45893,9 @@
 /area/station/medical/medbay/lobby)
 "cDQ" = (
 /obj/landmark/halloween,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/crew_quarters/market)
 "cDR" = (
@@ -45985,12 +45907,18 @@
 	layer = 9.1;
 	pixel_y = 21
 	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/stairs{
 	dir = 4;
 	icon_state = "Stairs_wide"
 	},
 /area/station/crew_quarters/market)
 "cDU" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/yellow/side{
 	dir = 8
 	},
@@ -46000,10 +45928,13 @@
 	icon_state = "1-2"
 	},
 /obj/disposalpipe/segment,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor,
 /area/station/crew_quarters/market)
 "cDW" = (
-/obj/disposalpipe/segment/morgue,
+/obj/disposalpipe/junction/left/south,
 /turf/simulated/floor,
 /area/station/crew_quarters/market)
 "cDX" = (
@@ -46464,122 +46395,26 @@
 	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
-"cFn" = (
-/obj/disposalpipe/junction{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
-"cFo" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
 "cFp" = (
 /obj/disposalpipe/segment{
 	dir = 8;
 	icon_state = "pipe-c"
 	},
-/obj/machinery/light,
-/obj/cable{
-	icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
-"cFq" = (
-/obj/health_scanner/floor{
-	find_in_range = 0;
-	id = "lobby_left"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/lobby)
 "cFr" = (
 /obj/machinery/navbeacon/guardbotsecbot_circularpatrol/beacon13,
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/landmark/gps_waypoint,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/lobby)
-"cFs" = (
-/obj/health_scanner/floor{
-	find_in_range = 0;
-	id = "lobby_right"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/lobby)
-"cFt" = (
-/obj/disposalpipe/segment{
-	dir = 1;
-	icon_state = "pipe-c"
-	},
-/obj/machinery/light,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/status_display{
-	pixel_y = -30
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
-"cFu" = (
-/obj/disposalpipe/junction{
-	dir = 8;
-	icon_state = "pipe-j2"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
-"cFv" = (
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
-"cFw" = (
-/obj/disposalpipe/segment/transport,
-/obj/cable{
-	icon_state = "4-8"
-	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
 "cFx" = (
-/obj/cable{
-	icon_state = "4-8"
+/obj/disposalpipe/segment/transport{
+	dir = 4
 	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
-"cFy" = (
-/obj/cable{
-	icon_state = "2-8"
+/obj/disposalpipe/segment/morgue{
+	dir = 1
 	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
@@ -46587,16 +46422,21 @@
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 5
 	},
-/turf/simulated/floor/stairs{
-	dir = 4;
-	icon_state = "Stairs2_wide"
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/turf/simulated/floor/stairs/wide/middle{
+	dir = 4
 	},
 /area/station/medical/medbay/lobby)
 "cFA" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
-/turf/simulated/floor/blue/corner{
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/turf/simulated/floor/blue/side{
 	dir = 8
 	},
 /area/station/medical/medbay/lobby)
@@ -46604,10 +46444,13 @@
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
 /turf/simulated/floor,
 /area/station/medical/medbay/lobby)
 "cFC" = (
-/obj/disposalpipe/segment/mail/bent/north,
+/obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
@@ -46615,14 +46458,12 @@
 /area/station/medical/medbay/lobby)
 "cFD" = (
 /obj/disposalpipe/segment,
-/obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
 /turf/simulated/floor,
 /area/station/medical/medbay/lobby)
 "cFE" = (
-/obj/disposalpipe/segment/mail/bent/south,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
@@ -46866,14 +46707,14 @@
 /obj/item/storage/toolbox/emergency,
 /obj/item/reagent_containers/glass/bucket,
 /obj/item/device/light/glowstick,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/extinguisher,
 /obj/item/extinguisher,
 /obj/item/chem_grenade/firefighting,
 /obj/item/chem_grenade/firefighting,
 /obj/machinery/light,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /turf/simulated/floor/caution/south,
 /area/station/science/lab)
 "cGq" = (
@@ -46950,7 +46791,7 @@
 /turf/simulated/floor/purple/side,
 /area/station/medical/medbay/lobby)
 "cGz" = (
-/obj/stool/chair{
+/obj/stool/chair/purple{
 	dir = 4
 	},
 /turf/simulated/floor/purple/side,
@@ -46968,7 +46809,7 @@
 /turf/simulated/floor/purple/side,
 /area/station/medical/medbay/lobby)
 "cGB" = (
-/obj/stool/chair{
+/obj/stool/chair/purple{
 	dir = 8
 	},
 /turf/simulated/floor/purple/side,
@@ -47013,10 +46854,11 @@
 /turf/simulated/wall/auto/supernorn,
 /area/station/medical/medbay/pharmacy)
 "cGN" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay/pharmacy)
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "cGO" = (
 /obj/disposalpipe/segment/transport{
 	dir = 1;
@@ -47030,67 +46872,36 @@
 	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
-"cGQ" = (
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/obj/cable,
-/obj/machinery/power/data_terminal,
-/obj/machinery/sleeper/compact{
-	dir = 4
-	},
-/turf/simulated/floor/specialroom/medbay,
-/area/station/medical/medbay/lobby)
 "cGR" = (
-/obj/disposalpipe/segment/transport{
+/turf/simulated/floor/stairs/wide/other{
 	dir = 4
 	},
-/turf/simulated/wall/auto/supernorn,
 /area/station/medical/medbay/lobby)
 "cGV" = (
 /obj/structure/girder,
 /turf/simulated/floor/plating/damaged2,
 /area/station/maintenance/disposal)
 "cGW" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
+/turf/simulated/floor/blue/corner{
+	dir = 8
 	},
-/turf/simulated/floor/blue/side,
 /area/station/medical/medbay/lobby)
 "cGX" = (
-/obj/machinery/light,
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/turf/simulated/floor/blue/side,
+/obj/disposalpipe/segment/mail/bent/east,
+/turf/simulated/floor,
 /area/station/medical/medbay/lobby)
 "cGY" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/turf/simulated/floor/blue/corner{
-	dir = 8
-	},
-/area/station/medical/medbay/lobby)
-"cGZ" = (
-/obj/disposalpipe/segment/transport{
-	icon_state = "pipe-c"
-	},
+/obj/disposalpipe/segment/transport,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor,
 /area/station/medical/medbay/lobby)
 "cHa" = (
 /obj/disposalpipe/segment,
-/turf/simulated/floor,
+/turf/simulated/floor/blue/corner,
 /area/station/medical/medbay/lobby)
 "cHb" = (
-/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/blue/side{
-	dir = 4
+	dir = 6
 	},
 /area/station/medical/medbay/lobby)
 "cHc" = (
@@ -47368,111 +47179,10 @@
 "cHZ" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/medical/medbay)
-"cIa" = (
-/obj/machinery/light/emergency{
-	dir = 8;
-	pixel_x = -16
-	},
-/obj/disposalpipe/segment,
+"cId" = (
+/obj/machinery/light/incandescent,
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
-"cIb" = (
-/obj/machinery/computer3/generic/med_data{
-	dir = 4
-	},
-/obj/item/storage/wall/medical{
-	dir = 1;
-	pixel_y = 32
-	},
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-4"
-	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cIc" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/landmark/start/job/medical_doctor,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cId" = (
-/obj/machinery/door_control{
-	id = "medbay_entrance";
-	name = "Medbay Door Control";
-	pixel_y = 20
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/machinery/chem_master{
-	dir = 4
-	},
-/obj/item/device/reagentscanner{
-	pixel_x = -8;
-	pixel_y = -2
-	},
-/obj/item/clothing/glasses/spectro{
-	pixel_x = -7;
-	pixel_y = 10
-	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cIe" = (
-/obj/landmark/start/job/medical_doctor,
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cIf" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	pixel_y = 20;
-	tag = ""
-	},
-/obj/machinery/phone{
-	pixel_y = 5
-	},
-/obj/machinery/power/data_terminal,
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/table/reinforced/chemistry/auto,
-/obj/item/storage/box/patchbox{
-	pixel_x = 8;
-	pixel_y = -6
-	},
-/obj/item/storage/box/patchbox{
-	pixel_x = 8;
-	pixel_y = -8
-	},
-/obj/item/storage/box/patchbox{
-	pixel_x = 8;
-	pixel_y = -10
-	},
-/obj/item/paper/book/from_file/pharmacopia{
-	pixel_x = -8;
-	pixel_y = -9
-	},
-/obj/item/device/radio/intercom/medical,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
 "cIg" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk{
@@ -47486,29 +47196,33 @@
 	pixel_x = 16
 	},
 /obj/machinery/disposal/morgue,
-/obj/disposalpipe/trunk/morgue,
+/obj/disposalpipe/trunk/morgue{
+	dir = 1
+	},
 /turf/simulated/floor/specialroom/medbay,
 /area/station/medical/medbay/lobby)
 "cIi" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/medical/morgue)
 "cIj" = (
-/obj/securearea{
-	desc = "A warning sign which reads 'Biohazard'";
-	icon_state = "bio";
-	layer = 2.5;
-	name = "BIOHAZARD"
+/obj/stool/chair/office{
+	dir = 4
 	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/morgue)
-"cIl" = (
-/obj/machinery/vending/medical_public,
-/turf/simulated/floor/blue/side{
-	dir = 10
+/obj/landmark/start/job/geneticist,
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/carpet{
+	dir = 4;
+	icon_state = "blue2"
 	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cIl" = (
+/obj/disposalpipe/segment/transport,
+/obj/machinery/genetics_booth,
+/turf/simulated/floor/blue/side,
 /area/station/medical/medbay/lobby)
 "cIm" = (
-/obj/disposalpipe/segment/transport,
 /obj/machinery/camera{
 	c_tag = "autotag";
 	dir = 10;
@@ -47519,7 +47233,9 @@
 /area/station/medical/medbay/lobby)
 "cIn" = (
 /obj/disposalpipe/segment,
-/turf/simulated/floor/blue/side,
+/turf/simulated/floor/blue/side{
+	dir = 6
+	},
 /area/station/medical/medbay/lobby)
 "cIp" = (
 /obj/table/auto,
@@ -47731,58 +47447,53 @@
 /turf/simulated/floor/purple,
 /area/station/science/chemistry)
 "cJg" = (
-/obj/item/storage/firstaid/oxygen{
-	pixel_y = -4
+/obj/machinery/computer3/generic/med_data{
+	dir = 4
 	},
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/firstaid/fire{
-	pixel_y = -4
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-4"
 	},
-/obj/item/storage/firstaid/regular,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/robodefibrillator,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/item/device/radio/intercom/science,
-/obj/storage/cart/medcart,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/blind_switch/area/north,
+/turf/simulated/floor/carpet/blue/fancy/edge/nw,
+/area/station/medical/head)
 "cJh" = (
-/obj/item/storage/firstaid/oxygen{
-	pixel_y = -4
-	},
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/firstaid/fire{
-	pixel_y = -4
+/obj/cable{
+	icon_state = "4-8"
 	},
-/obj/item/storage/firstaid/regular,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/robodefibrillator,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/item/device/radio/intercom/medical,
-/obj/storage/cart/medcart,
-/obj/machinery/light{
+/obj/disposalpipe/trunk/mail/south,
+/obj/machinery/disposal/mail/small{
 	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
+	mail_tag = "medical director";
+	mailgroup = "command";
+	mailgroup2 = "medbay";
+	pixel_y = 32;
+	name = "mail chute-'Medical Director'"
 	},
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue/fancy/innercorner/north,
+/area/station/medical/head)
 "cJi" = (
-/obj/storage/secure/closet/medical/medkit,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/stool/bed,
+/obj/item/cigpacket/propuffs,
+/obj/item/clothing/suit/bedsheet{
+	bcolor = "black";
+	icon_state = "bedsheet-black"
+	},
+/obj/critter/bat/doctor,
+/obj/landmark/start/job/medical_director,
+/obj/decal/poster/wallsign/poster_nt{
+	pixel_y = 28
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/north,
+/area/station/medical/head)
 "cJj" = (
-/obj/machinery/vending/medical,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/storage/secure/closet/command/medical_director,
+/obj/machinery/light_switch/north,
+/turf/simulated/floor/carpet/blue/fancy/innercorner/north,
+/area/station/medical/head)
 "cJk" = (
 /obj/machinery/mass_driver{
 	drive_range = 8;
@@ -47792,120 +47503,96 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "cJm" = (
-/obj/machinery/power/apc{
-	dir = 8;
-	name = "W APC";
-	pixel_x = -24
-	},
-/obj/cable{
-	icon_state = "0-4"
+/obj/machinery/door/airlock/pyro/glass{
+	id = "medbay_entrance";
+	name = "Medbay Entrance"
 	},
-/obj/machinery/light_switch/west{
-	pixel_y = 11
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/machinery/vending/player/chemicals,
-/obj/disposalpipe/trunk/mail/west,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cJn" = (
-/obj/cable{
-	icon_state = "4-8"
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
+"cJp" = (
+/obj/table/reinforced/auto,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 1;
+	autoclose = 0
 	},
+/obj/mapping_helper/access/medical,
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cJo" = (
-/obj/cable{
-	icon_state = "2-8"
+/area/station/medical/medbay/reception)
+"cJr" = (
+/obj/table/reinforced/auto,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 1;
+	autoclose = 0
 	},
-/obj/cable{
-	icon_state = "1-2"
+/obj/mapping_helper/access/medical,
+/obj/machinery/phone{
+	pixel_y = -4
 	},
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cJp" = (
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cJr" = (
-/obj/disposalpipe/segment,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay/pharmacy)
-"cJs" = (
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay)
+/area/station/medical/medbay/reception)
 "cJt" = (
-/obj/submachine/chef_sink{
-	desc = "A common utility sink.";
-	name = "rusty sink"
+/obj/machinery/clonepod,
+/obj/machinery/firealarm/west,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
 	},
-/obj/item/storage/wall/medical{
-	dir = 1;
-	pixel_y = 32
+/turf/simulated/floor/bluewhite{
+	dir = 9
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/medbay)
+/area/station/medical/medbay/cloner)
 "cJu" = (
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/gloves/latex,
-/obj/item/spraybottle/cleaner,
-/obj/item/spraybottle/cleaner,
-/obj/item/reagent_containers/glass/bottle/cleaner,
-/obj/storage/crate,
-/obj/item/sponge,
-/obj/item/sponge,
-/obj/item/sponge,
-/obj/item/storage/box/stma_kit,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay)
-"cJv" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/turf/simulated/floor/plating,
-/area/station/medical/morgue)
-"cJw" = (
-/obj/machinery/traymachine/morgue{
-	dir = 2
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite{
+	dir = 1
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cJx" = (
-/obj/machinery/traymachine/morgue{
-	dir = 2
+/area/station/medical/medbay/cloner)
+"cJv" = (
+/turf/simulated/floor/bluewhite{
+	dir = 1
 	},
+/area/station/medical/medbay/cloner)
+"cJw" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
-	dir = 6;
+	dir = 4;
 	name = "autoname - SS13";
-	pixel_y = 20;
+	pixel_x = -10;
 	tag = ""
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/obj/table/auto,
+/obj/machinery/networked/printer{
+	name = "Printer - Genetics";
+	pixel_y = 5;
+	print_id = "Genetics"
+	},
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/power/data_terminal,
+/turf/simulated/floor/greenwhite{
+	dir = 8
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cJy" = (
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cJz" = (
-/obj/disposaloutlet{
-	mailgroup = "medresearch";
-	mailgroup2 = "security";
-	message = "Delivery alert in Morgue.";
-	name = "Morgue Outlet"
+/obj/cable{
+	icon_state = "4-8"
 	},
-/obj/disposalpipe/trunk/morgue,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cJA" = (
-/obj/disposalpipe/segment/transport,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay/cloner)
-"cJC" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay/cloner)
-"cJD" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/medbay/cloner)
+/turf/simulated/floor/white,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cJE" = (
 /obj/landmark/start/job/assistant,
 /obj/item/storage/toilet/random{
@@ -48320,117 +48007,120 @@
 	},
 /area/station/science/chemistry)
 "cKP" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 4;
-	pixel_x = -8
-	},
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
-"cKQ" = (
-/turf/simulated/floor/bluewhite{
-	dir = 9
-	},
-/area/station/medical/medbay)
-"cKR" = (
-/turf/simulated/floor/bluewhite{
-	dir = 5
+/obj/machinery/computer/card/department/medical{
+	dir = 4
 	},
-/area/station/medical/medbay)
-"cKS" = (
-/obj/machinery/light_switch/east,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
-"cKT" = (
 /obj/machinery/door_control{
 	id = "medbay_entrance";
 	name = "Medbay Door Control";
 	pixel_x = -24
 	},
-/obj/disposalpipe/segment,
-/turf/simulated/floor/bluewhite{
-	dir = 9
+/turf/simulated/floor/carpet/blue/fancy/innercorner/west,
+/area/station/medical/head)
+"cKQ" = (
+/obj/stool/chair/comfy/blue,
+/obj/landmark/start/job/medical_director,
+/obj/disposalpipe/segment/mail/bent/north,
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
+"cKR" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/medical/medbay)
+/obj/disposalpipe/segment/mail/bent/south,
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
+"cKT" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/right{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "0-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/head)
 "cKU" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
+/obj/machinery/sleeper/compact{
+	dir = 4
 	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite{
-	dir = 5
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-4"
 	},
-/area/station/medical/medbay)
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "cKV" = (
-/obj/table/auto,
-/obj/item/clipboard,
-/obj/item/reagent_containers/dropper/mechanical{
-	pixel_x = 11
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/item/storage/box/stma_kit{
-	pixel_x = -8
+/turf/simulated/floor/bluewhite/corner{
+	dir = 4
 	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/lobby)
 "cKW" = (
-/obj/decal/mule/beacon,
-/obj/machinery/navbeacon/mule/medbay_north/south,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/obj/health_scanner/floor{
+	find_in_range = 0;
+	id = "lobby_north";
+	dir = 8;
+	pixel_y = 8;
+	pixel_x = 8
+	},
+/obj/item/bell/hop{
+	anchored = 1;
+	name = "wall mounted service bell";
+	pixel_y = 24;
+	pixel_x = 24
+	},
+/obj/machinery/light/incandescent{
+	dir = 1
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "cKX" = (
-/obj/cable{
-	icon_state = "1-2"
+/obj/table/reinforced/auto,
+/obj/health_scanner/wall{
+	find_in_range = 0;
+	id = "lobby_north";
+	dir = 4;
+	pixel_x = 5
 	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 8;
+	autoclose = 0
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/plating,
+/area/station/medical/medbay/reception)
 "cKY" = (
-/obj/stool/chair/office{
-	dir = 4
+/obj/machinery/computer3/generic/med_data,
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-4"
 	},
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/reception)
 "cKZ" = (
-/obj/machinery/chem_dispenser/chemical,
-/obj/item/reagent_containers/glass/beaker/large{
-	pixel_x = -7
+/obj/stool/chair/office{
+	dir = 1
+	},
+/obj/landmark/start/job/medical_doctor,
+/obj/cable{
+	icon_state = "4-8"
 	},
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cLd" = (
-/turf/simulated/floor/plating,
-/area/station/medical/medbay)
-"cLe" = (
-/obj/disposalpipe/segment/morgue,
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/area/station/medical/medbay/reception)
 "cLg" = (
-/obj/stool/chair{
-	dir = 4
-	},
-/obj/item/device/radio/intercom/medical,
-/obj/disposalpipe/segment/transport,
-/obj/machinery/door_control{
-	id = "cloning";
-	name = "Cloning Door Control";
-	pixel_x = -24
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 9
-	},
-/area/station/medical/medbay/cloner)
-"cLh" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay/cloner)
-"cLi" = (
-/obj/monkeyplant,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite{
+/obj/table/auto,
+/obj/item/clipboard,
+/obj/item/storage/pill_bottle/mutadone,
+/turf/simulated/floor/greenwhite{
 	dir = 5
 	},
-/area/station/medical/medbay/cloner)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cLj" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -48765,222 +48455,162 @@
 	},
 /turf/simulated/floor/purple,
 /area/station/science/chemistry)
-"cMq" = (
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "chemistry";
-	name = "Chemistry Privacy Shutters";
-	opacity = 0
-	},
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/turf/simulated/floor/engine,
-/area/station/science/chemistry)
 "cMr" = (
-/obj/machinery/chem_master{
+/obj/table/wood/auto,
+/obj/machinery/computer3/generic/personal{
+	pixel_y = 5
+	},
+/obj/item/reagent_containers/food/drinks/tea{
+	pixel_y = 8
+	},
+/obj/machinery/power/data_terminal,
+/obj/machinery/camera{
+	c_tag = "autotag";
 	dir = 4;
-	pixel_x = -4
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
 	},
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/machinery/firealarm/west,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/west,
+/area/station/medical/head)
 "cMs" = (
-/obj/stool/chair/office{
-	dir = 8
+/obj/table/wood/auto,
+/obj/item/item_box/gold_star{
+	item_amount = 20
 	},
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/bluewhite{
-	dir = 8
+/obj/item/stamp/md,
+/obj/item/kitchen/food_box/lollipop{
+	pixel_x = -12
 	},
-/area/station/medical/medbay)
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
 "cMt" = (
-/turf/simulated/floor/bluewhite{
-	dir = 4
+/obj/machinery/door/airlock/pyro/maintenance,
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/medical/medbay)
-"cMu" = (
-/obj/machinery/manufacturer/medical,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "cMv" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor/bluewhite{
-	dir = 8
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/middle{
+	dir = 4
 	},
-/area/station/medical/medbay)
-"cMw" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
+/obj/cable,
+/obj/cable{
+	icon_state = "0-2"
 	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite{
+/turf/simulated/floor/plating,
+/area/station/medical/head)
+"cMw" = (
+/obj/machinery/sleeper/compact{
 	dir = 4
 	},
-/area/station/medical/medbay)
-"cMx" = (
-/obj/table/auto,
-/obj/item/paper_bin,
-/obj/item/stamp{
-	pixel_x = 5;
-	pixel_y = 12
+/obj/machinery/power/data_terminal,
+/obj/cable{
+	icon_state = "0-4"
 	},
-/obj/item/hand_labeler{
-	pixel_x = 7;
-	pixel_y = -7
+/turf/simulated/floor/bluewhite/corner{
+	dir = 8
 	},
-/obj/item/storage/box/health_upgrade_kit{
-	pixel_x = -8;
-	pixel_y = 11
+/area/station/medical/medbay/lobby)
+"cMx" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/machinery/light/emergency{
-	pixel_x = 16
+/turf/simulated/floor/bluewhite{
+	dir = 10
 	},
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/lobby)
 "cMy" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 10;
-	name = "autoname - SS13";
-	tag = ""
+/turf/simulated/floor/bluewhite/corner{
+	dir = 4
 	},
-/obj/machinery/light,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/lobby)
 "cMz" = (
+/obj/table/reinforced/auto,
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 8;
+	autoclose = 0
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/plating,
+/area/station/medical/medbay/reception)
+"cMB" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/mail/bent/east,
-/turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cMA" = (
-/obj/machinery/light/emergency{
-	pixel_x = -16
-	},
-/obj/disposalpipe/trunk{
-	dir = 4
-	},
-/obj/machinery/disposal/small,
-/obj/machinery/chem_heater/chemistry{
-	pixel_y = 5
-	},
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
-"cMB" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment{
-	dir = 8;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/plating,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/reception)
 "cMC" = (
 /turf/simulated/floor/bluewhite{
 	dir = 8
 	},
 /area/station/medical/medbay)
-"cMD" = (
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbay)
 "cMF" = (
-/obj/machinery/traymachine/morgue{
-	dir = 2
+/obj/machinery/computer/cloning{
+	dir = 8
 	},
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
+/obj/item/paper/Cloning,
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cMG" = (
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/area/station/medical/medbay/cloner)
 "cMH" = (
-/obj/stool/chair/office{
-	dir = 1
-	},
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
 /obj/cable{
-	icon_state = "1-2"
+	icon_state = "2-8"
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/white,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cMI" = (
 /obj/stool/chair{
-	dir = 4
-	},
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/bluewhite{
 	dir = 8
 	},
-/area/station/medical/medbay/cloner)
-"cMJ" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/cloner)
-"cMK" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite{
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/greenwhite{
 	dir = 4
 	},
-/area/station/medical/medbay/cloner)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cMJ" = (
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cMK" = (
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/medical/staff)
 "cML" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/machinery/light_switch/north,
-/obj/table/auto,
-/obj/machinery/cashreg,
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/left,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "cMM" = (
-/obj/machinery/clone_scanner,
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/middle,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "cMN" = (
-/obj/machinery/computer/cloning,
-/obj/item/paper/Cloning,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	pixel_y = 20;
-	tag = ""
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/right,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "cMP" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/medical/medbay/cloner)
@@ -49034,6 +48664,7 @@
 /obj/cable{
 	icon_state = "1-8"
 	},
+/obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "cMW" = (
@@ -49253,188 +48884,122 @@
 	},
 /area/station/science/chemistry)
 "cNJ" = (
-/obj/submachine/chem_extractor{
+/obj/submachine/chef_sink/chem_sink{
 	dir = 4;
 	pixel_x = -4
 	},
-/obj/item/device/reagentscanner,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue/fancy/innercorner/west,
+/area/station/medical/head)
 "cNK" = (
 /turf/simulated/floor/bluewhite/corner{
 	dir = 8
 	},
 /area/station/medical/medbay)
 "cNL" = (
-/obj/table/auto,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/remote/porter/port_a_nanomed,
-/obj/item/gun/implanter,
-/obj/item/reagent_containers/dropper/mechanical,
-/obj/item/reagent_containers/dropper/mechanical,
-/turf/simulated/floor/bluewhite{
-	dir = 1
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
 "cNM" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/machinery/vending/port_a_nanomed,
-/turf/simulated/floor/bluewhite{
-	dir = 1
+/obj/machinery/light/incandescent,
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue/fancy/innercorner/east,
+/area/station/medical/head)
 "cNN" = (
-/obj/disposalpipe/segment,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 1
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/left{
+	dir = 4
 	},
-/area/station/medical/medbay)
-"cNO" = (
-/obj/decal/poster/wallsign/medbay,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay/pharmacy)
-"cNQ" = (
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 8
+/obj/cable{
+	icon_state = "0-8"
 	},
-/area/station/medical/medbay)
-"cNR" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
+/obj/cable,
+/turf/simulated/floor/plating,
+/area/station/medical/head)
+"cNO" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
 /turf/simulated/floor/bluewhite{
-	dir = 1
+	dir = 9
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/lobby)
+"cNQ" = (
+/obj/machinery/chem_master,
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "cNS" = (
 /turf/simulated/floor/bluewhite{
 	dir = 1
 	},
 /area/station/medical/medbay)
 "cNU" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/morgue)
-"cNV" = (
-/obj/machinery/light_switch/west,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cNW" = (
-/obj/disposalpipe/junction{
-	dir = 1
-	},
-/obj/machinery/optable{
-	name = "Autopsy Table"
+/obj/stool/bed/moveable,
+/obj/item/clothing/suit/bedsheet,
+/turf/simulated/floor/bluewhite{
+	dir = 5
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cNX" = (
-/obj/disposalpipe/junction{
+/area/station/medical/medbay)
+"cNV" = (
+/obj/machinery/clonegrinder,
+/turf/simulated/floor/bluewhite{
 	dir = 4
 	},
-/obj/table/auto,
-/obj/item/circular_saw{
-	pixel_x = 3;
-	pixel_y = 12
-	},
-/obj/item/scalpel,
-/obj/item/reagent_containers/glass/bottle/formaldehyde,
-/obj/item/reagent_containers/syringe,
-/obj/item/hand_labeler,
-/obj/machinery/power/apc{
-	dir = 4;
-	name = "E APC";
-	pixel_x = 24
+/area/station/medical/medbay/cloner)
+"cNW" = (
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "blue2"
 	},
-/obj/cable,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cNX" = (
 /obj/cable{
-	icon_state = "0-2"
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cNY" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/morgue)
-"cNZ" = (
-/obj/stool/chair{
-	dir = 4
+	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/morgue{
-	dir = 4
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "blue2"
 	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cNY" = (
 /obj/disposalpipe/segment/transport,
-/turf/simulated/floor/bluewhite{
-	dir = 8
+/turf/simulated/floor/carpet{
+	dir = 5;
+	icon_state = "blue2"
 	},
-/area/station/medical/medbay/cloner)
-"cOa" = (
-/obj/disposalpipe/segment,
-/obj/disposalpipe/segment/morgue{
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cNZ" = (
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/greenwhite{
 	dir = 4
 	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/cloner)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cOb" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 8
-	},
-/area/station/medical/medbay/cloner)
-"cOc" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay/cloner)
+/obj/storage/closet/office,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cOd" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay/cloner)
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk/south,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cOe" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 5
-	},
-/area/station/medical/medbay/cloner)
-"cOf" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay/cloner)
+/obj/machinery/vending/snack,
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cOg" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -49443,18 +49008,15 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "cOh" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
+/turf/simulated/floor/bluewhite{
+	dir = 6
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/area/station/medical/medbay/cloner)
 "cOi" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "cOj" = (
@@ -49768,7 +49330,7 @@
 /turf/simulated/floor/purplewhite,
 /area/station/science/chemistry)
 "cPb" = (
-/obj/disposalpipe/segment/mail/bent/north,
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/white,
 /area/station/science/chemistry)
 "cPc" = (
@@ -49795,211 +49357,87 @@
 "cPg" = (
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
-"cPh" = (
-/obj/disposalpipe/junction{
-	dir = 1
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
 "cPi" = (
-/obj/disposalpipe/segment{
+/obj/stool/chair/blue{
 	dir = 4
 	},
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 8
-	},
-/area/station/medical/medbay)
+/obj/machinery/firealarm/west,
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "cPk" = (
-/obj/cable{
-	icon_state = "1-4"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"cPl" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/light_switch/north,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"cPm" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/morgue{
-	dir = 4;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"cPn" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/item/storage/wall/medical_wear,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"cPo" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite/corner{
-	dir = 1
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 8
 	},
-/area/station/medical/medbay)
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "cPp" = (
-/obj/disposalpipe/junction{
-	dir = 4;
-	icon_state = "pipe-j2"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"cPq" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
+/obj/machinery/chem_dispenser/chemical,
+/obj/item/device/radio/intercom/medical{
+	broadcasting = 1;
+	dir = 8
 	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "cPr" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"cPs" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbay)
-"cPu" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/disposalpipe/segment/morgue{
-	dir = 8;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cPv" = (
-/obj/disposalpipe/segment/morgue,
-/obj/cable{
-	icon_state = "4-8"
-	},
+/obj/storage/secure/closet/medical/cloning,
+/obj/machinery/power/apc/autoname_west,
 /obj/cable{
-	icon_state = "1-4"
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cPw" = (
-/obj/stool/chair/comfy/wheelchair{
-	dir = 4
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 8
+	icon_state = "0-4"
 	},
-/area/station/medical/medbay)
-"cPy" = (
-/obj/disposalpipe/segment/transport,
-/obj/cable{
-	icon_state = "4-8"
+/obj/machinery/light_switch/west{
+	pixel_y = -10
 	},
 /turf/simulated/floor/bluewhite{
-	dir = 8
-	},
-/area/station/medical/medbay/cloner)
-"cPz" = (
-/obj/disposalpipe/segment,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/cloner)
-"cPA" = (
-/obj/cable{
-	icon_state = "4-8"
+	dir = 10
 	},
-/obj/disposalpipe/segment/mail/bent/north,
-/turf/simulated/floor/white,
 /area/station/medical/medbay/cloner)
-"cPB" = (
+"cPs" = (
 /obj/cable{
-	icon_state = "4-8"
+	icon_state = "2-8"
 	},
-/obj/disposalpipe/segment/mail/bent/south,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/cloner)
-"cPC" = (
-/obj/cable{
-	icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/turf/simulated/floor/white,
+/turf/simulated/floor/bluewhite,
 /area/station/medical/medbay/cloner)
-"cPD" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/cable{
-	icon_state = "2-4"
+"cPu" = (
+/obj/table/glass/reinforced/auto,
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/regular,
+/obj/item/device/analyzer/healthanalyzer,
+/obj/item/device/analyzer/healthanalyzer,
+/obj/item/storage/pill_bottle/mutadone,
+/obj/item/hand_labeler,
+/obj/item/storage/firstaid/brain,
+/turf/simulated/floor/carpet{
+	icon_state = "blue1"
 	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cPv" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/cloner)
-"cPE" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/carpet{
+	icon_state = "blue1"
 	},
-/area/station/medical/medbay/cloner)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"cPA" = (
+/obj/stool/chair/comfy,
+/obj/item/clothing/suit/cardboard_box/head_surgeon,
+/obj/blind_switch/area/west,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
+"cPE" = (
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cPG" = (
 /obj/disposalpipe/segment/mineral{
 	dir = 4
@@ -50124,6 +49562,7 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating/scorched,
 /area/station/maintenance/south)
 "cPY" = (
@@ -50251,7 +49690,6 @@
 /area/station/science/chemistry)
 "cQx" = (
 /obj/stool/chair/office,
-/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/purplewhite{
 	dir = 4
 	},
@@ -50261,208 +49699,134 @@
 /turf/simulated/floor/purple,
 /area/station/science/chemistry)
 "cQA" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/middle,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/head)
 "cQB" = (
-/obj/landmark/start/job/medical_doctor,
-/obj/stool/chair/office,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite{
-	dir = 10
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/middle,
+/obj/cable{
+	icon_state = "0-4"
 	},
-/area/station/medical/medbay)
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/head)
 "cQC" = (
 /turf/simulated/floor/bluewhite,
 /area/station/medical/medbay)
 "cQD" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 4
-	},
-/area/station/medical/medbay)
-"cQE" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 6
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"cQF" = (
-/obj/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 4
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2/middle,
+/obj/cable{
+	icon_state = "0-8"
 	},
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite/corner,
-/area/station/medical/medbay)
+/turf/simulated/floor/plating,
+/area/station/medical/head)
 "cQG" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 9
-	},
-/obj/disposalpipe/segment/mail/bent/west,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"cQH" = (
-/obj/disposalpipe/junction{
-	dir = 1
-	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"cQI" = (
-/obj/disposalpipe/segment{
+/obj/stool/chair/blue{
 	dir = 4
 	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"cQJ" = (
-/obj/disposalpipe/segment{
-	dir = 4
+/obj/machinery/light/incandescent,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
 	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
+"cQH" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"cQK" = (
-/obj/disposalpipe/segment{
-	dir = 4
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
+"cQI" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"cQL" = (
-/obj/disposalpipe/segment{
-	dir = 4
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
+"cQK" = (
+/obj/table/reinforced/chemistry/auto,
+/obj/machinery/glass_recycler,
+/obj/item/storage/box/beakerbox{
+	pixel_y = 4
 	},
+/obj/item/reagent_containers/glass/beaker/large,
 /obj/cable{
-	icon_state = "1-2"
+	icon_state = "4-8"
 	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "cQM" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/vehicle/segway,
-/turf/simulated/floor/bluewhite{
-	dir = 6
-	},
-/area/station/medical/medbay)
-"cQN" = (
-/obj/securearea{
-	desc = "A warning sign which reads 'Biohazard'";
-	icon_state = "bio";
-	layer = 2.5;
-	name = "BIOHAZARD"
-	},
-/obj/disposalpipe/junction{
-	dir = 8;
-	icon_state = "pipe-j2"
+/obj/machinery/door/airlock/pyro/glass/med,
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/morgue)
-"cQO" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 8
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cQP" = (
-/obj/table/auto,
-/obj/item/clothing/under/suit/mortician,
-/obj/item/clothing/mask/surgical,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/detective_scanner,
-/obj/item/stamp,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical_shield,
-/obj/item/staple_gun,
-/obj/item/clothing/suit/apron,
-/obj/item/surgical_spoon,
-/obj/item/spraybottle/cleaner,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/cloner)
 "cQQ" = (
-/obj/disposalpipe/trunk/mail/south,
-/obj/machinery/disposal/mail/autoname/medbay/morgue,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
-"cQR" = (
-/obj/machinery/disposal/morgue{
-	desc = "A pneumatic delivery chute for sending things directly to the crematorium.";
-	name = "crematorium chute"
-	},
-/obj/machinery/light,
-/obj/disposalpipe/trunk/morgue{
+/obj/stool/chair{
 	dir = 4
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/obj/landmark/start/job/geneticist,
+/turf/simulated/floor/greenwhite{
+	dir = 8
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cQT" = (
-/obj/submachine/chef_sink{
-	desc = "A common utility sink.";
-	dir = 8;
-	name = "utility sink"
+/obj/landmark/gps_waypoint,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/morgue{
-	dir = 8;
-	icon_state = "pipe-c"
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/carpet{
+	icon_state = "blue1"
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cQU" = (
-/obj/shrub{
-	dir = 1;
-	icon = 'icons/obj/stationobjs.dmi';
-	icon_state = "plant"
-	},
-/obj/disposalpipe/segment/transport,
-/obj/landmark/kudzu,
-/turf/simulated/floor/bluewhite{
-	dir = 10
+/obj/machinery/computer/genetics{
+	dir = 8
 	},
-/area/station/medical/medbay/cloner)
-"cQV" = (
-/obj/disposalpipe/junction{
-	dir = 1
+/obj/item/cloneModule/genepowermodule,
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/greenwhite{
+	dir = 4
 	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay/cloner)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "cQW" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 8
-	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay/cloner)
+/obj/table/wood/auto,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cQX" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/storage/secure/closet/medical/cloning,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay/cloner)
-"cQY" = (
-/obj/storage/secure/closet/medical/cloning,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay/cloner)
-"cQZ" = (
-/obj/machinery/clonepod,
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/cable,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay/cloner)
-"cRa" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/brain,
-/obj/item/hand_labeler,
-/turf/simulated/floor/bluewhite{
-	dir = 6
+/obj/stool/chair/comfy{
+	dir = 8
 	},
-/area/station/medical/medbay/cloner)
+/obj/landmark/start/job/medical_doctor,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cRb" = (
 /obj/disposalpipe/segment/mineral{
 	dir = 4
@@ -50898,53 +50262,25 @@
 /turf/simulated/floor/purplewhite,
 /area/station/science/chemistry)
 "cSn" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/brute{
-	pixel_y = -4
-	},
-/obj/item/storage/firstaid/brute{
-	pixel_y = -4
-	},
-/obj/item/storage/firstaid/brute{
-	pixel_y = -4
-	},
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/obj/item/reagent_containers/glass/beaker/large/brute,
-/obj/item/reagent_containers/dropper,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cSo" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/fire{
-	pixel_y = -4
-	},
-/obj/item/storage/firstaid/fire{
-	pixel_y = -4
-	},
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/obj/item/reagent_containers/glass/beaker/large/burn,
-/obj/item/reagent_containers/dropper,
+/obj/disposalpipe/segment/mail/bent/south,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cSp" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/firstaid/toxin,
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/obj/item/reagent_containers/glass/beaker/large/antitox,
-/obj/item/reagent_containers/dropper,
-/obj/machinery/light,
-/obj/item/reagent_containers/hypospray,
-/obj/item/reagent_containers/hypospray,
-/obj/random_item_spawner/medicine,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cSq" = (
-/obj/reagent_dispensers/watertank/fountain,
-/turf/simulated/floor/bluewhite{
-	dir = 8
-	},
-/area/station/medical/medbay)
+/obj/machinery/vending/medical,
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "cSr" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
@@ -50956,31 +50292,35 @@
 /turf/simulated/floor/plating,
 /area/station/medical/medbay/surgery)
 "cSu" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay/surgery)
+/obj/machinery/door/airlock/pyro/glass/med{
+	id = "medbay_entrance"
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay)
 "cSv" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/medbay/surgery)
-"cSx" = (
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/wall/auto/reinforced/supernorn,
+/obj/machinery/door/airlock/pyro/glass/med,
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/red,
 /area/station/medical/medbay/surgery)
 "cSy" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/medical/head)
-"cSA" = (
-/obj/disposalpipe/segment,
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/morgue)
 "cSB" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/morgue)
-"cSC" = (
-/obj/disposalpipe/segment/transport,
-/turf/simulated/wall/auto/supernorn,
+/obj/stool/chair{
+	dir = 4
+	},
+/obj/landmark/start/job/geneticist,
+/obj/machinery/firealarm/west,
+/turf/simulated/floor/greenwhite{
+	dir = 8
+	},
 /area/station/medical/research{
 	name = "Genetic Research"
 	})
@@ -50990,11 +50330,8 @@
 	name = "Genetic Research"
 	})
 "cSF" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cSG" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -51002,14 +50339,9 @@
 	name = "Genetic Research"
 	})
 "cSH" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/plating,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "cSI" = (
 /obj/table/auto,
 /obj/item/decoration/ashtray{
@@ -51352,124 +50684,106 @@
 /turf/simulated/floor/plating,
 /area/station/medical/medbay)
 "cTI" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay)
-"cTJ" = (
-/obj/machinery/power/data_terminal,
-/obj/machinery/computer3/generic/med_data,
-/obj/disposalpipe/segment,
-/obj/machinery/light_switch/west,
-/obj/machinery/power/data_terminal,
-/turf/simulated/floor/redwhite{
+/obj/shrub/random,
+/turf/simulated/floor/bluewhite{
 	dir = 9
 	},
-/area/station/medical/medbay/surgery)
-"cTL" = (
-/obj/machinery/vending/medical,
-/obj/machinery/light/emergency{
-	dir = 1;
-	pixel_y = 16
-	},
-/turf/simulated/floor/redwhite{
-	dir = 1
+/area/station/medical/medbay)
+"cTJ" = (
+/obj/machinery/door_control{
+	id = "medbay_entrance";
+	name = "Medbay Door Control";
+	pixel_x = -24;
+	pixel_y = 24
 	},
-/area/station/medical/medbay/surgery)
-"cTM" = (
 /obj/cable{
-	icon_state = "1-4"
+	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/redwhite{
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite{
 	dir = 1
 	},
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
+"cTL" = (
+/obj/shrub/random,
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbay)
 "cTN" = (
-/obj/table/auto,
-/obj/item/storage/toolbox/emergency,
-/obj/item/clothing/glasses/healthgoggles,
-/obj/item/clothing/glasses/healthgoggles,
-/obj/machinery/light/emergency{
-	dir = 1;
-	pixel_y = 16
+/obj/machinery/atmospherics/unary/cryo_cell,
+/turf/simulated/floor/bluewhite{
+	dir = 9
 	},
-/obj/item/storage/box/syringes,
-/obj/machinery/power/apc{
-	dir = 1;
-	name = "N APC";
-	pixel_y = 24
+/area/station/medical/medbay)
+"cTO" = (
+/obj/table/reinforced,
+/obj/item/reagent_containers/glass/beaker/cryoxadone{
+	pixel_x = -5;
+	pixel_y = 2
 	},
-/obj/cable{
-	icon_state = "0-8"
+/obj/item/reagent_containers/glass/beaker/cryoxadone{
+	pixel_x = 7;
+	pixel_y = 7
 	},
-/obj/item/reagent_containers/dropper/mechanical,
-/turf/simulated/floor/redwhite{
-	dir = 1
+/obj/item/reagent_containers/glass/beaker/cryoxadone{
+	pixel_x = 3;
+	pixel_y = 1
 	},
-/area/station/medical/medbay/surgery)
-"cTO" = (
-/obj/disposalpipe/segment/morgue,
-/obj/storage/secure/closet/fridge/blood,
-/turf/simulated/floor/redwhite{
+/turf/simulated/floor/bluewhite{
 	dir = 1
 	},
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cTP" = (
-/obj/item/device/radio/intercom/medical,
-/obj/storage/secure/closet/medical/medicine,
-/turf/simulated/floor/redwhite{
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
 	},
-/area/station/medical/medbay/surgery)
-"cTQ" = (
-/obj/storage/secure/closet/medical/anesthetic,
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/turf/simulated/floor/bluewhite{
+	dir = 1
 	},
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 0;
-	name = "autoname - SS13";
-	pixel_y = 20
+/area/station/medical/medbay)
+"cTQ" = (
+/obj/random_item_spawner/medicine/two,
+/obj/item/bandage{
+	pixel_x = -5;
+	pixel_y = 6
 	},
-/turf/simulated/floor/redwhite{
-	dir = 5
+/obj/table/reinforced/auto,
+/turf/simulated/floor/bluewhite{
+	dir = 1
 	},
-/area/station/medical/medbay/surgery)
-"cTS" = (
+/area/station/medical/medbay)
+"cTT" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "fblue3"
-	},
-/area/station/medical/head)
-"cTT" = (
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/decal/poster/wallsign/poster_nt{
-	pixel_y = 28
+/turf/simulated/floor/bluewhite/corner,
+/area/station/medical/medbay)
+"cTU" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 4
 	},
-/obj/storage/secure/closet/command/medical_director,
-/turf/simulated/floor/carpet{
-	dir = 5;
-	icon_state = "fblue2"
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/head)
-"cTU" = (
-/obj/disposalpipe/segment,
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/head)
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay)
 "cUb" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/cdc)
+/obj/machinery/traymachine/morgue{
+	dir = 2
+	},
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "cUj" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -51781,27 +51095,11 @@
 /turf/simulated/floor/purple,
 /area/station/science/artifact)
 "cVk" = (
-/obj/table/auto,
-/obj/item/reagent_containers/food/drinks/creamer{
-	pixel_x = -8;
-	pixel_y = 12
-	},
-/obj/item/kitchen/food_box/sugar_box{
-	pixel_y = 6
-	},
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/bluewhite{
-	dir = 9
-	},
-/area/station/medical/medbay)
-"cVl" = (
-/obj/stool/chair/couch{
 	dir = 8
 	},
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cVm" = (
 /obj/stool/chair/couch{
 	dir = 8;
@@ -51816,119 +51114,71 @@
 	},
 /area/station/science/lobby)
 "cVn" = (
-/obj/storage/secure/closet/medical/medkit,
-/obj/disposalpipe/segment,
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbay)
-"cVo" = (
-/obj/stool/chair/office{
+/obj/stool/chair/blue{
 	dir = 4
 	},
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/disposalpipe/segment,
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/redwhite{
+/turf/simulated/floor/bluewhite{
 	dir = 8
 	},
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cVp" = (
 /turf/simulated/floor/white,
 /area/station/medical/medbay/surgery)
 "cVq" = (
-/obj/disposalpipe/segment/mail/vertical,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cVr" = (
-/obj/disposalpipe/segment/morgue,
+/obj/stool/chair/office,
+/obj/landmark/start/job/medical_doctor,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cVs" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 8;
-	pixel_x = 8
-	},
-/turf/simulated/floor/redwhite{
-	dir = 4
-	},
-/area/station/medical/medbay/surgery)
-"cVt" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 4;
-	pixel_x = -8
-	},
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fblue3"
-	},
-/area/station/medical/head)
-"cVu" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fblue1"
-	},
-/area/station/medical/head)
-"cVv" = (
-/obj/item/device/radio/intercom/medical{
-	broadcasting = 1;
-	dir = 8
-	},
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "fblue3"
+/obj/machinery/atmospherics/pipe/manifold{
+	dir = 1;
+	level = 2
 	},
-/area/station/medical/head)
-"cVx" = (
 /turf/simulated/floor/white,
-/area/station/medical/cdc)
+/area/station/medical/medbay)
+"cVx" = (
+/obj/disposalpipe/segment/transport,
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cVy" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cVz" = (
-/obj/stool/chair/office{
-	dir = 4
+/obj/item/storage/firstaid/brain{
+	pixel_x = -6;
+	pixel_y = 5
 	},
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cVC" = (
-/obj/disposalpipe/segment{
-	dir = 1;
-	icon_state = "pipe-c"
+/obj/item/paper/cryo,
+/obj/item/wrench,
+/obj/table/reinforced/auto,
+/obj/item/device/radio/intercom/medical,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/blue/side{
+	dir = 1
 	},
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/medbay/surgery/storage)
+"cVz" = (
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cVD" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/mapping_helper/wingrille_spawn/auto,
+/obj/window_blinds/cog2/left,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "cVE" = (
-/obj/disposalpipe/segment{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/mapping_helper/wingrille_spawn/auto,
+/obj/window_blinds/cog2/right,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "cVG" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/storage/auxillary)
@@ -52056,18 +51306,6 @@
 	},
 /turf/simulated/floor/white,
 /area/station/science/artifact)
-"cWj" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor/white,
-/area/station/science/artifact)
 "cWk" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -52086,138 +51324,54 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/science/artifact)
-"cWm" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 1
-	},
-/obj/machinery/light/emergency{
-	dir = 4;
-	pixel_x = 16
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbay)
 "cWn" = (
-/obj/machinery/light/emergency{
-	dir = 8;
-	pixel_x = -16
-	},
-/obj/disposalpipe/segment,
-/turf/simulated/floor/redwhite{
-	dir = 8
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/medical/medbay/surgery)
-"cWo" = (
-/obj/iv_stand,
-/obj/item/reagent_containers/iv_drip/saline,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
-"cWp" = (
-/obj/disposalpipe/segment/morgue,
-/obj/iv_stand,
-/obj/item/reagent_containers/iv_drip/saline,
-/obj/decal/stripe_caution,
+/obj/disposalpipe/segment/vertical,
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cWq" = (
-/obj/table/auto,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/mask/surgical_shield,
-/obj/item/hemostat,
-/obj/item/staple_gun,
-/turf/simulated/floor/redwhite{
-	dir = 4
-	},
-/area/station/medical/medbay/surgery)
-"cWr" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/right{
-	dir = 4
+/obj/machinery/atmospherics/pipe/simple{
+	level = 2
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/head)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "cWs" = (
-/obj/table/wood/auto,
-/obj/machinery/computer3/generic/personal{
-	pixel_y = 5
-	},
-/obj/machinery/power/data_terminal,
-/obj/item/reagent_containers/food/drinks/tea{
-	pixel_y = 8
-	},
-/obj/cable{
-	icon_state = "0-4"
-	},
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fblue3"
+/obj/machinery/light/incandescent,
+/obj/machinery/disposal/mail/autoname/medbay,
+/obj/disposalpipe/trunk/mail/south,
+/turf/simulated/floor/bluewhite{
+	dir = 1
 	},
-/area/station/medical/head)
-"cWt" = (
+/area/station/medical/medbay)
+"cWu" = (
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/cable{
-	icon_state = "1-8"
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fblue1"
-	},
-/area/station/medical/head)
-"cWu" = (
-/obj/machinery/door_control{
-	id = "pathology_lockdown";
-	name = "Pathology Lockdown Control";
-	pixel_x = 24;
-	pixel_y = 24
-	},
-/obj/machinery/computer/announcement{
-	dir = 8;
-	name = "Medical Announcement Computer";
-	req_access_txt = "19"
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "fblue3"
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/area/station/medical/head)
-"cWv" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
+/area/station/medical/medbay)
+"cWy" = (
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
+"cWA" = (
+/obj/machinery/disposal{
+	name = "Test Chamber Chute"
 	},
-/obj/window_blinds/cog2/left{
+/obj/item/storage/wall/random,
+/obj/disposalpipe/trunk/transport{
 	dir = 8
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/head)
-"cWy" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
+/turf/simulated/floor/grass{
+	name = "astroturf"
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/cdc)
-"cWA" = (
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/dome)
 "cWB" = (
 /turf/simulated/floor/carpet{
 	dir = 9;
@@ -52226,24 +51380,20 @@
 /area/station/medical/research{
 	name = "Genetic Research"
 	})
-"cWC" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor/carpet{
-	dir = 1;
-	icon_state = "blue2"
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "cWD" = (
-/turf/simulated/floor/carpet{
-	dir = 5;
-	icon_state = "blue2"
+/obj/disposalpipe/segment/transport{
+	icon_state = "pipe-c"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/segment/transport{
+	icon_state = "pipe-c"
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "cWF" = (
 /obj/stool/chair/couch{
 	dir = 4;
@@ -52356,16 +51506,6 @@
 /obj/landmark/start/job/security_officer,
 /turf/simulated/floor/specialroom/bar,
 /area/station/security/checkpoint/cargo)
-"cWX" = (
-/obj/stool/chair{
-	dir = 8
-	},
-/obj/disposalpipe/segment,
-/obj/machinery/bot/secbot,
-/turf/simulated/floor/bluewhite{
-	dir = 4
-	},
-/area/station/medical/medbay)
 "cWY" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -52373,6 +51513,7 @@
 /obj/cable{
 	icon_state = "2-4"
 	},
+/obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "cXa" = (
@@ -52650,68 +51791,58 @@
 /turf/simulated/floor/purple,
 /area/station/science/artifact)
 "cXG" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
+/obj/submachine/chem_extractor{
+	dir = 4;
+	pixel_x = -4
 	},
+/obj/item/device/reagentscanner,
+/obj/machinery/light/incandescent,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cXH" = (
-/turf/simulated/floor/bluewhite/corner,
-/area/station/medical/medbay)
-"cXI" = (
-/obj/machinery/atmospherics/pipe/manifold{
-	dir = 8
-	},
-/turf/simulated/floor/bluewhite/corner{
-	dir = 4
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/medical/medbay)
-"cXJ" = (
+/obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
 /turf/simulated/floor/bluewhite{
 	dir = 4
 	},
-/area/station/medical/medbay)
-"cXL" = (
-/obj/disposalpipe/segment,
+/area/station/medical/medbay/pharmacy)
+"cXJ" = (
+/obj/machinery/light/incandescent,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
-/turf/simulated/floor/redwhite{
+/turf/simulated/floor/bluewhite{
 	dir = 8
 	},
-/area/station/medical/medbay/surgery)
-"cXM" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 4
+/area/station/medical/medbay)
+"cXL" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
-"cXN" = (
-/obj/item/paper/book/from_file/pharmacopia,
+/obj/disposalpipe/segment/bent/north,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
-/obj/decal/stripe_caution,
-/obj/machinery/optable{
-	id = "OR1"
-	},
+/obj/machinery/navbeacon/guardbotsecbot_circularpatrol/beacon12,
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
-"cXO" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/machinery/atmospherics/unary/vent_pump{
-	dir = 8
-	},
-/obj/machinery/computer/operating{
-	id = "OR1"
+/area/station/medical/medbay)
+"cXM" = (
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/manifold,
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
+"cXN" = (
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/manifold{
+	dir = 1
 	},
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cXP" = (
 /obj/stool/chair/couch{
 	dir = 4
@@ -52732,90 +51863,78 @@
 	},
 /area/station/hallway/secondary/exit)
 "cXR" = (
-/obj/machinery/camera/television{
-	c_tag = "medbay";
-	dir = 8;
-	name = "camera - medbay"
-	},
-/turf/simulated/floor/redwhite{
-	dir = 4
+/obj/disposalpipe/junction/right/west,
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 5;
+	level = 2
 	},
-/area/station/medical/medbay/surgery)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "cXS" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/middle{
-	dir = 4
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/head)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "cXT" = (
-/obj/table/wood/auto,
-/obj/machinery/light/lamp/green,
-/obj/item/device/analyzer/healthanalyzer_upgrade,
-/obj/item/item_box/gold_star{
-	item_amount = 20
-	},
-/obj/item/kitchen/food_box/lollipop,
-/obj/item/stamp/md,
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fblue3"
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
 	},
-/area/station/medical/head)
+/obj/disposalpipe/segment/horizontal,
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "cXU" = (
-/obj/cable{
-	icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
 	},
-/obj/landmark/start/job/medical_director,
-/obj/stool/chair/office/blue{
-	dir = 8
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
+"cXV" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
 	},
-/turf/simulated/floor/carpet{
-	icon_state = "fblue1"
+/obj/cable{
+	icon_state = "1-2"
 	},
-/area/station/medical/head)
-"cXV" = (
-/obj/machinery/computer3/generic/med_data{
-	dir = 8
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/obj/machinery/power/data_terminal,
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "fblue3"
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/area/station/medical/head)
+/area/station/medical/medbay)
 "cXW" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 4
 	},
-/obj/window_blinds/cog2/middle{
-	dir = 8
+/obj/mapping_helper/access/medical,
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/head)
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay)
 "cXY" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/mask/surgical,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cXZ" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/item/storage/box/syringes,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/analyzer/healthanalyzer,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/junction/right/west,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cYc" = (
 /turf/simulated/floor/carpet{
 	dir = 8;
@@ -52824,30 +51943,14 @@
 /area/station/medical/research{
 	name = "Genetic Research"
 	})
-"cYd" = (
-/obj/table/glass/reinforced/auto,
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/regular,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/storage/pill_bottle/mutadone,
-/obj/item/hand_labeler,
-/obj/item/storage/firstaid/brain,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/carpet{
-	icon_state = "blue1"
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "cYe" = (
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "blue2"
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/machinery/door/airlock/pyro/glass/med,
+/obj/disposalpipe/segment/transport,
+/obj/disposalpipe/segment/transport,
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor,
+/area/station/medical/dome)
 "cYg" = (
 /obj/machinery/portable_atmospherics/canister/nitrogen,
 /turf/simulated/floor/sanitary/blue,
@@ -53022,141 +52125,100 @@
 /turf/simulated/floor,
 /area/station/science/artifact)
 "cYQ" = (
-/obj/machinery/atmospherics/unary/cryo_cell,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/obj/machinery/computer/chem_requester/medical{
+	dir = 4
+	},
+/obj/item/device/radio/intercom/medical{
+	dir = 4
+	},
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cYR" = (
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 4
 	},
-/turf/simulated/floor/bluewhite{
-	dir = 8
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/medbay)
+/obj/mapping_helper/access/medlocker,
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "cYS" = (
-/obj/machinery/light/emergency{
-	dir = 4;
-	pixel_x = 16
+/obj/cable{
+	icon_state = "2-4"
 	},
-/obj/submachine/chef_sink/chem_sink{
-	dir = 8;
-	pixel_x = 8
+/obj/cable{
+	icon_state = "2-8"
 	},
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/bluewhite{
-	dir = 4
+	dir = 8
 	},
 /area/station/medical/medbay)
 "cYT" = (
-/obj/machinery/light/emergency{
-	dir = 8;
-	pixel_x = -16
+/obj/cable{
+	icon_state = "4-8"
 	},
-/obj/disposalpipe/segment,
-/obj/submachine/chef_sink/chem_sink{
-	dir = 4;
-	pixel_x = -8
+/obj/cable{
+	icon_state = "1-8"
 	},
-/turf/simulated/floor/redwhite{
-	dir = 8
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
+"cYX" = (
+/obj/table/auto,
+/obj/item/device/analyzer/healthanalyzer{
+	pixel_y = 6
 	},
-/area/station/medical/medbay/surgery)
-"cYU" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/left{
-	dir = 4
+/obj/item/spraybottle/cleaner{
+	pixel_x = 5;
+	pixel_y = 2
 	},
-/turf/simulated/floor/plating,
-/area/station/medical/head)
-"cYW" = (
 /obj/cable{
 	icon_state = "1-8"
 	},
 /obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/carpet{
-	icon_state = "fblue1"
-	},
-/area/station/medical/head)
-"cYX" = (
-/obj/machinery/computer/card/department/medical{
-	dir = 8
+	icon_state = "2-8"
 	},
-/turf/simulated/floor/carpet{
-	dir = 4;
-	icon_state = "fblue3"
+/obj/machinery/atmospherics/pipe/manifold,
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/area/station/medical/head)
+/area/station/medical/medbay)
 "cYY" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/disposalpipe/segment,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
-	},
-/obj/window_blinds/cog2/right{
-	dir = 8
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
 	},
 /turf/simulated/floor/plating,
-/area/station/medical/head)
+/area/station/medical/medbay)
 "cZa" = (
-/obj/stool/chair/office{
-	dir = 8
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
 	},
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cZb" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/light/lamp/black,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cZc" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/item/reagent_containers/emergency_injector/spaceacillin,
-/obj/item/reagent_containers/emergency_injector/spaceacillin,
-/obj/item/reagent_containers/emergency_injector/spaceacillin,
-/obj/item/reagent_containers/dropper/mechanical,
-/obj/item/reagent_containers/dropper/mechanical,
-/obj/item/device/light/flashlight/penlight,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cZf" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/landmark/start/job/geneticist,
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
-"cZg" = (
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/toolbox/emergency,
-/obj/item/hand_labeler,
-/obj/table/glass/reinforced/auto,
-/obj/machinery/light/lamp/black,
-/obj/item/clothing/glasses/spectro,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/carpet{
-	icon_state = "blue1"
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 10
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
-"cZh" = (
-/obj/stool/chair/office{
-	dir = 4
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
+"cZc" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/obj/landmark/start/job/geneticist,
-/turf/simulated/floor/white,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cZj" = (
 /obj/item/reagent_containers/food/snacks/chips,
 /turf/simulated/floor/plating,
@@ -53296,187 +52358,117 @@
 /turf/simulated/floor/purple,
 /area/station/science/artifact)
 "cZH" = (
-/obj/machinery/atmospherics/pipe/simple/insulated/cold{
-	can_rupture = 0;
-	dir = 5
-	},
-/obj/table/reinforced/auto,
-/obj/item/reagent_containers/glass/beaker/cryoxadone{
-	pixel_x = 4;
-	pixel_y = 5
-	},
-/obj/item/reagent_containers/glass/beaker/cryoxadone{
-	pixel_x = 4;
-	pixel_y = 5
-	},
-/obj/item/reagent_containers/glass/beaker/cryoxadone{
-	pixel_x = 4;
-	pixel_y = 5
-	},
-/obj/machinery/camera{
-	c_tag = "autotag";
+/obj/submachine/chef_sink/chem_sink{
 	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
+	pixel_x = -4
 	},
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cZI" = (
-/obj/machinery/atmospherics/pipe/simple/insulated/cold{
-	can_rupture = 0;
-	dir = 4
-	},
+/obj/landmark/start/job/medical_doctor,
+/obj/stool/chair/office,
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/bluewhite{
 	dir = 10
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cZJ" = (
-/obj/machinery/atmospherics/pipe/manifold{
-	dir = 1;
-	level = 2
-	},
 /turf/simulated/floor/bluewhite{
 	dir = 6
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cZK" = (
-/obj/machinery/atmospherics/pipe/simple/insulated/cold{
-	can_rupture = 0;
-	dir = 9
-	},
-/obj/table/reinforced/auto,
-/obj/item/wrench,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/remote/porter/port_a_medbay,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "cZL" = (
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/obj/cable{
+	icon_state = "1-2"
 	},
+/obj/disposalpipe/segment/mail/bent/east,
 /turf/simulated/floor/bluewhite{
-	dir = 4
+	dir = 8
 	},
 /area/station/medical/medbay)
 "cZM" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/disposalpipe/segment,
-/obj/machinery/dialysis,
-/turf/simulated/floor/redwhite{
-	dir = 8
-	},
-/area/station/medical/medbay/surgery)
-"cZN" = (
-/obj/landmark/start/job/medical_doctor,
-/obj/stool/chair/office,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "cZP" = (
-/obj/stool/bed,
-/obj/item/clothing/suit/bedsheet{
-	bcolor = "black";
-	icon_state = "bedsheet-black"
-	},
-/obj/blind_switch/area{
-	pixel_x = -24;
-	pixel_y = -2
-	},
-/obj/item/cigpacket/propuffs,
-/obj/machinery/light_switch/west{
-	pixel_y = 6
-	},
-/turf/simulated/floor/carpet{
-	dir = 10;
-	icon_state = "fblue2"
-	},
-/area/station/medical/head)
-"cZQ" = (
-/obj/critter/bat/doctor,
 /obj/cable{
-	icon_state = "1-4"
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/carpet{
-	icon_state = "fblue3"
+/obj/disposalpipe/switch_junction/right/east{
+	mail_tag = "medbay";
+	name = "mail junction (medbay)"
 	},
-/area/station/medical/head)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "cZR" = (
-/obj/item/storage/firstaid/oxygen{
-	pixel_y = -4
+/obj/cable{
+	icon_state = "1-4"
 	},
-/obj/item/storage/firstaid/toxin,
-/obj/item/storage/firstaid/fire{
-	pixel_y = -4
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/obj/item/storage/firstaid/regular,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/robodefibrillator,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/item/body_bag,
-/obj/storage/cart/medcart,
+/area/station/medical/medbay)
+"cZT" = (
 /obj/cable{
-	icon_state = "0-8"
+	icon_state = "4-8"
 	},
-/obj/machinery/power/apc{
-	dir = 4;
-	name = "E APC";
-	pixel_x = 24
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
+"cZU" = (
+/obj/cable{
+	icon_state = "4-8"
 	},
-/turf/simulated/floor/carpet{
-	dir = 6;
-	icon_state = "fblue2"
+/obj/machinery/atmospherics/unary/vent_pump{
+	dir = 1
 	},
-/area/station/medical/head)
-"cZT" = (
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
+"cZV" = (
 /obj/cable{
 	icon_state = "2-8"
 	},
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cZU" = (
-/obj/machinery/optable,
-/obj/disposalpipe/segment/mail/vertical,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
-"cZV" = (
-/obj/iv_stand,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/disposalpipe/segment/vertical,
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "cZY" = (
-/turf/simulated/floor/carpet{
-	dir = 10;
-	icon_state = "blue2"
+/obj/shrub,
+/obj/landmark/kudzu,
+/turf/simulated/floor/grass{
+	name = "astroturf"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/dome)
 "cZZ" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/carpet{
-	icon_state = "blue2"
+/obj/item/device/radio/intercom/medical,
+/obj/stool/chair,
+/obj/item/clothing/suit/monkey,
+/obj/machinery/light{
+	dir = 1;
+	layer = 9.1;
+	pixel_y = 21
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/turf/simulated/floor/grass{
+	name = "astroturf"
+	},
+/area/station/medical/dome)
 "daa" = (
-/turf/simulated/floor/carpet{
-	dir = 6;
-	icon_state = "blue2"
+/obj/disposalpipe/segment/transport{
+	dir = 1;
+	icon_state = "pipe-c"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/turf/simulated/floor/grass{
+	name = "astroturf"
+	},
+/area/station/medical/dome)
 "dac" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -53557,21 +52549,15 @@
 /obj/cable{
 	icon_state = "0-2"
 	},
+/obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/power/apc{
-	areastring = "Medbay";
+	areastring = "Medical Director's Office";
 	dir = 1;
-	name = "Medbay APC";
+	name = "Med Director's APC";
 	pixel_y = 24
 	},
-/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
-"dar" = (
-/obj/stool/chair{
-	dir = 4
-	},
-/turf/simulated/floor/plating/scorched,
-/area/station/maintenance/south)
 "das" = (
 /obj/machinery/launcher_loader/north,
 /obj/machinery/door/poddoor/pyro{
@@ -53681,144 +52667,129 @@
 /turf/simulated/floor,
 /area/station/science/artifact)
 "daH" = (
-/obj/machinery/atmospherics/pipe/simple/insulated/cold{
-	can_rupture = 0;
-	dir = 4
+/obj/table/auto,
+/obj/item/storage/firstaid/fire{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/fire{
+	pixel_y = -4
+	},
+/obj/item/reagent_containers/glass/bottle/epinephrine,
+/obj/item/reagent_containers/glass/beaker/large/burn,
+/obj/item/reagent_containers/dropper,
+/obj/item/remote/porter/port_a_nanomed{
+	pixel_x = 16
 	},
+/obj/disposalpipe/segment/mail/bent/north,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "daI" = (
-/obj/machinery/atmospherics/pipe/manifold{
-	level = 2
-	},
+/obj/table/auto,
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/toxin,
+/obj/item/reagent_containers/glass/bottle/epinephrine,
+/obj/item/reagent_containers/glass/beaker/large/antitox,
+/obj/item/reagent_containers/dropper,
 /obj/machinery/light,
+/obj/item/reagent_containers/hypospray,
+/obj/item/reagent_containers/hypospray,
+/obj/random_item_spawner/medicine,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "daJ" = (
-/obj/machinery/atmospherics/unary/cold_sink/freezer/cryo{
-	dir = 8
-	},
+/obj/machinery/vending/player/chemicals,
+/obj/disposalpipe/trunk/mail/west,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "daK" = (
-/obj/machinery/light_switch/east,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/bluewhite{
-	dir = 4
+	dir = 10
 	},
 /area/station/medical/medbay)
 "daL" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk{
-	dir = 1
+/obj/rack,
+/obj/item/remote/porter/port_a_medbay{
+	pixel_x = -6;
+	pixel_y = 6
 	},
-/obj/machinery/light_switch/west,
-/turf/simulated/floor/redwhite{
-	dir = 10
+/obj/item/item_box/medical_patches/mini_styptic{
+	pixel_x = 6;
+	pixel_y = 4
 	},
-/area/station/medical/medbay/surgery)
+/obj/item/item_box/medical_patches/mini_silver_sulf,
+/obj/item/reagent_containers/syringe/epinephrine,
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daM" = (
-/obj/table/auto,
-/obj/item/storage/box/stma_kit,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/bandage,
-/obj/item/staple_gun,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 10;
-	name = "autoname - SS13";
-	tag = ""
-	},
-/obj/item/device/light/flashlight/penlight,
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
-"daN" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/regular,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/mask/surgical,
-/obj/item/weldingtool,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/reagent_containers/glass/bottle/epinephrine,
-/obj/item/reagent_containers/dropper,
-/obj/item/device/audio_log/wall_mounted{
-	anchored = 1;
-	max_lines = 350;
-	mode = 1;
-	name = "Medical Recorder";
-	pixel_y = -28
-	},
-/obj/machinery/light/emergency,
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
+/obj/reagent_dispensers/watertank/fountain,
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daO" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daP" = (
-/obj/table/auto,
-/obj/item/storage/firstaid/oxygen,
-/obj/item/reagent_containers/glass/beaker/large/brute,
-/obj/item/reagent_containers/glass/beaker/large/burn,
-/obj/item/reagent_containers/glass/beaker/large/epinephrine,
-/obj/item/reagent_containers/glass/beaker/large/antitox,
-/obj/item/reagent_containers/hypospray,
-/obj/item/reagent_containers/dropper,
-/obj/machinery/light/emergency,
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
+/obj/stool/chair/office{
+	dir = 4
+	},
+/obj/landmark/start/job/medical_doctor,
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daQ" = (
-/obj/machinery/disposal/morgue,
-/obj/disposalpipe/trunk/morgue{
-	dir = 1
+/obj/table/reinforced/auto,
+/obj/machinery/coffeemaker/medbay,
+/obj/item/kitchen/food_box/sugar_box{
+	pixel_x = 16
 	},
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
+/obj/item/reagent_containers/food/drinks/creamer{
+	pixel_x = 16;
+	pixel_y = 12
+	},
+/obj/drink_rack/mug{
+	pixel_y = -20
+	},
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daR" = (
-/obj/table/auto,
-/obj/item/storage/box/health_upgrade_kit,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/spraybottle/cleaner,
-/turf/simulated/floor/redwhite,
-/area/station/medical/medbay/surgery)
+/obj/item/device/radio/intercom/medical{
+	dir = 1
+	},
+/obj/table/reinforced/auto,
+/obj/machinery/phone{
+	pixel_x = 4
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "daS" = (
-/obj/table/auto,
-/obj/item/robodefibrillator,
-/obj/item/robodefibrillator,
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/obj/stool/chair/office{
+	dir = 8
 	},
-/obj/item/reagent_containers/iv_drip/saline,
-/turf/simulated/floor/redwhite{
-	dir = 6
+/obj/landmark/start/job/medical_doctor,
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite/corner{
+	dir = 4
 	},
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "daT" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/left,
-/turf/simulated/floor/plating,
-/area/station/medical/head)
-"daU" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/middle,
-/turf/simulated/floor/plating,
-/area/station/medical/head)
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "daV" = (
-/obj/mapping_helper/wingrille_spawn/auto/reinforced,
-/obj/window_blinds/cog2/right,
-/turf/simulated/floor/plating,
-/area/station/medical/head)
-"daW" = (
-/obj/disposalpipe/segment{
-	dir = 1;
-	icon_state = "pipe-c"
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/head)
+/area/station/medical/medbay)
 "daZ" = (
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/robotics)
@@ -53970,71 +52941,40 @@
 /turf/simulated/floor,
 /area/station/hangar/science)
 "dbI" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite,
 /area/station/medical/medbay)
 "dbJ" = (
-/obj/storage/secure/closet/fridge/blood,
-/turf/simulated/floor/blue,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/bluewhite,
 /area/station/medical/medbay)
 "dbK" = (
-/obj/storage/closet/biohazard,
-/obj/item/reagent_containers/emergency_injector/spaceacillin,
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/turf/simulated/floor/blue,
+/obj/rack,
+/obj/item/clothing/suit/hazard/paramedic,
+/obj/item/storage/belt/medical,
+/turf/simulated/floor/bluewhite,
 /area/station/medical/medbay)
 "dbL" = (
-/obj/storage/closet/biohazard,
-/obj/item/reagent_containers/emergency_injector/spaceacillin,
-/turf/simulated/floor/blue,
+/obj/machinery/firealarm/east,
+/obj/rack,
+/obj/item/clothing/suit/hazard/paramedic,
+/obj/item/storage/belt/medical,
+/turf/simulated/floor/bluewhite{
+	dir = 6
+	},
 /area/station/medical/medbay)
-"dbM" = (
+"dbO" = (
+/obj/machinery/door/airlock/pyro/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/morgue,
 /obj/cable{
 	icon_state = "1-2"
 	},
-/turf/simulated/floor/stairs{
-	dir = 1;
-	icon_state = "medstairs_wide"
-	},
-/area/station/medical/cdc)
-"dbN" = (
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/stairs{
-	dir = 1;
-	icon_state = "medstairs2_wide"
-	},
-/area/station/medical/cdc)
-"dbO" = (
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/medical/cdc)
-"dbP" = (
-/turf/simulated/floor/stairs{
-	dir = 1;
-	icon_state = "medstairs_wide"
-	},
-/area/station/medical/cdc)
-"dbQ" = (
-/obj/machinery/light_switch/east,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/stairs{
-	dir = 1;
-	icon_state = "medstairs2_wide"
-	},
-/area/station/medical/cdc)
-"dbS" = (
-/obj/item/sheet/wood,
-/obj/item/sheet/wood,
-/obj/item/sheet/wood,
-/obj/item/sheet/wood,
-/obj/item/sheet/wood,
-/obj/storage/crate,
-/obj/machinery/light/small,
-/turf/simulated/floor/grime,
-/area/station/storage/auxillary)
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "dbT" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -54110,14 +53050,23 @@
 	},
 /area/station/medical/robotics)
 "dcf" = (
-/obj/stool/chair/couch{
-	dir = 4
+/obj/item/storage/firstaid/oxygen{
+	pixel_y = -4
 	},
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 1
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/fire{
+	pixel_y = -4
 	},
-/area/station/medical/medbay)
+/obj/item/storage/firstaid/regular,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/robodefibrillator,
+/obj/item/body_bag,
+/obj/item/body_bag,
+/obj/storage/cart/medcart,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "dcg" = (
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
@@ -54240,243 +53189,101 @@
 /turf/simulated/floor/arrival,
 /area/station/hallway/secondary/exit)
 "dcE" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/obj/reagent_dispensers/watertank/fountain,
 /turf/simulated/floor/blue/side{
 	dir = 10
 	},
 /area/station/medical/medbay/lobby)
 "dcG" = (
-/obj/machinery/navbeacon/guardbotsecbot_circularpatrol/beacon12,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite{
-	dir = 8
-	},
-/area/station/medical/medbay)
-"dcH" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite/corner{
-	dir = 8
+/obj/machinery/power/apc{
+	areastring = "Medbay";
+	dir = 1;
+	name = "Medbay APC";
+	pixel_y = 24
 	},
-/area/station/medical/medbay)
-"dcI" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/machinery/power/data_terminal,
 /obj/cable{
 	icon_state = "0-2"
 	},
-/obj/machinery/sleeper/compact{
-	dir = 8
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"dcJ" = (
 /obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
+"dcH" = (
 /obj/cable{
-	icon_state = "2-4"
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
+/obj/disposalpipe/segment/mail/bent/west,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
+"dcJ" = (
+/obj/machinery/vending/port_a_nanomed,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/redwhite{
+	dir = 9
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/surgery)
 "dcK" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"dcL" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
+/obj/machinery/dialysis,
+/turf/simulated/floor/redwhite{
 	dir = 1
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/surgery)
 "dcM" = (
-/obj/disposalpipe/switch_junction/right/east{
-	mail_tag = "medbay";
-	name = "mail junction (medbay)"
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"dcN" = (
-/obj/submachine/chef_sink/chem_sink{
-	pixel_y = 15
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
-	},
-/area/station/medical/medbay)
-"dcO" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	pixel_y = 20;
-	tag = ""
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/item/storage/wall/medical{
-	dir = 1;
-	pixel_y = 32
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
 	},
-/area/station/medical/medbay)
-"dcP" = (
-/obj/item/device/radio/intercom/medical,
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
+/turf/simulated/floor/redwhite{
 	dir = 1
 	},
-/area/station/medical/medbay)
-"dcQ" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
+/area/station/medical/medbay/surgery)
+"dcN" = (
+/obj/storage/secure/closet/fridge/blood,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/redwhite{
 	dir = 5
 	},
-/area/station/medical/medbay)
-"dcS" = (
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/machinery/door_control{
-	id = "pathology_lockdown";
-	name = "Pathology Lockdown Control";
-	pixel_y = 24
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery)
+"dcP" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/window_blinds/cog2,
+/turf/simulated/floor/plating,
+/area/station/medical/medbay/psychiatrist)
 "dcT" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "1-8"
-	},
-/turf/simulated/floor/caution/corner/nw{
-	dir = 1
+/obj/machinery/traymachine/morgue{
+	dir = 2
 	},
-/area/station/medical/cdc)
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "dcU" = (
-/obj/disposalpipe/switch_junction/right/east{
-	mail_tag = "morgue";
-	name = "mail junction (morgue)"
+/obj/machinery/traymachine/morgue{
+	dir = 2
 	},
-/turf/simulated/floor/caution/north,
-/area/station/medical/cdc)
-"dcV" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	pixel_y = 20;
-	tag = ""
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 4
 	},
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/caution/north,
-/area/station/medical/cdc)
-"dcW" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/caution/north,
-/area/station/medical/cdc)
-"dcX" = (
-/obj/disposalpipe/switch_junction/right/east{
-	mail_tag = "pathology";
-	name = "mail junction (pathology)"
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 5;
+	icon_state = "xtra_bigstripe-corner2"
 	},
-/turf/simulated/floor/caution/corner/ne{
-	dir = 1
+/obj/item/device/radio/intercom/medical,
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
+"dcX" = (
+/obj/machinery/computer3/generic/med_data,
+/obj/cable{
+	icon_state = "0-8"
 	},
-/area/station/medical/cdc)
+/obj/machinery/power/data_terminal,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "ddb" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/obj/machinery/genetics_booth,
+/obj/machinery/light/incandescent,
 /turf/simulated/floor/blue/side,
 /area/station/medical/medbay/lobby)
-"ddc" = (
-/obj/item/device/radio/intercom/medical,
-/obj/stool/chair,
-/obj/item/clothing/suit/monkey,
-/obj/machinery/light{
-	dir = 1;
-	layer = 9.1;
-	pixel_y = 21
-	},
-/obj/disposalpipe/segment/mail/bent/west,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
 "ddd" = (
 /turf/simulated/floor/grass{
 	name = "astroturf"
 	},
 /area/station/medical/dome)
-"dde" = (
-/obj/disposalpipe/trunk{
-	dir = 1
-	},
-/obj/machinery/disposal{
-	name = "Test Chamber Chute"
-	},
-/obj/item/storage/wall/random,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
-"ddf" = (
-/obj/machinery/vending/monkey/genetics,
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
 "ddg" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/medical/dome)
@@ -54532,20 +53339,6 @@
 	},
 /turf/simulated/floor/engine/vacuum,
 /area/station/hangar/qm)
-"ddp" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/light_switch/east,
-/turf/simulated/floor/plating,
-/area/station/maintenance/solar/south)
-"ddq" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/obj/machinery/light,
-/turf/simulated/floor/blue/side,
-/area/station/medical/medbay/lobby)
 "dds" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -54592,6 +53385,16 @@
 	icon_state = "Stairs2_wide"
 	},
 /area/station/hangar/science)
+"ddI" = (
+/obj/stool/chair/office{
+	dir = 1
+	},
+/obj/landmark/start/job/geneticist,
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/white,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "ddJ" = (
 /obj/stool/chair/couch{
 	dir = 4
@@ -54601,9 +53404,11 @@
 	},
 /area/station/medical/medbay/lobby)
 "ddK" = (
-/obj/stool/chair/comfy/wheelchair,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/obj/stool/chair/couch/blue{
+	dir = 8
+	},
+/turf/simulated/floor/carpet/blue/fancy/narrow/nw,
+/area/station/medical/medbay/psychiatrist)
 "ddL" = (
 /obj/table/glass/reinforced/auto,
 /obj/disposalpipe/segment/vertical,
@@ -54614,81 +53419,67 @@
 /turf/simulated/floor/carpet,
 /area/station/medical/medbay/lobby)
 "ddO" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 8
-	},
-/area/station/medical/medbay)
-"ddP" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"ddQ" = (
 /obj/cable{
 	icon_state = "1-8"
 	},
 /obj/cable{
-	icon_state = "2-8"
+	icon_state = "4-8"
 	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
+"ddP" = (
 /obj/cable{
 	icon_state = "4-8"
 	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
 "ddR" = (
-/obj/cable{
-	icon_state = "2-8"
+/obj/item_dispenser/medical_mask{
+	pixel_y = 0;
+	pixel_x = -24
 	},
-/obj/cable{
-	icon_state = "1-8"
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
 	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"ddS" = (
-/obj/shrub{
-	dir = 1;
-	icon = 'icons/obj/stationobjs.dmi';
-	icon_state = "plant"
+/obj/table/auto,
+/obj/item/storage/box/stma_kit,
+/obj/item/staple_gun,
+/obj/item/reagent_containers/iv_drip/saline,
+/obj/item/reagent_containers/iv_drip/saline,
+/turf/simulated/floor/redwhite{
+	dir = 8
 	},
-/obj/landmark/kudzu,
-/turf/simulated/floor/bluewhite{
-	dir = 6
+/area/station/medical/medbay/surgery)
+"ddS" = (
+/obj/bookshelf,
+/obj/item/paper/book/from_file/the_trial{
+	pixel_x = -4
 	},
-/area/station/medical/medbay)
-"ddT" = (
-/obj/securearea{
-	desc = "A warning sign which reads 'Biohazard'";
-	icon_state = "bio";
-	layer = 2.5;
-	name = "BIOHAZARD"
+/obj/item/paper/book/from_file/matsci_guide{
+	pixel_x = 4
 	},
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/medical/cdc)
+/turf/simulated/floor/carpet/blue/fancy/narrow/ne,
+/area/station/medical/medbay/psychiatrist)
 "ddU" = (
-/obj/machinery/shower,
-/obj/machinery/drainage,
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/cdc)
-"ddV" = (
-/turf/simulated/floor/caution/corner/sw,
-/area/station/medical/cdc)
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "ddW" = (
-/turf/simulated/floor/caution/south,
-/area/station/medical/cdc)
-"ddX" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 8;
-	pixel_x = 8
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 4
 	},
-/turf/simulated/floor{
-	icon_state = "corner_east"
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
+"ddX" = (
+/obj/stool/chair/office{
+	dir = 1
 	},
-/area/station/medical/cdc)
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "ddY" = (
 /obj/submachine/chef_sink/chem_sink{
 	dir = 4;
@@ -54707,22 +53498,6 @@
 	name = "astroturf"
 	},
 /area/station/medical/dome)
-"dea" = (
-/obj/machinery/light_switch/east,
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
-"deb" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/solar/south)
 "dec" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor,
@@ -54741,16 +53516,6 @@
 	},
 /turf/space,
 /area/mining/magnet)
-"deg" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
-	},
-/turf/simulated/floor/plating,
-/area/station/maintenance/solar/south)
 "deh" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -54805,88 +53570,47 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
-"deu" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/turf/simulated/floor/bluewhite{
-	dir = 8
-	},
-/area/station/medical/medbay)
 "dev" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"dew" = (
-/obj/table/auto,
-/obj/item/reagent_containers/syringe/haloperidol,
-/obj/item/reagent_containers/syringe/haloperidol,
-/obj/item/reagent_containers/syringe/haloperidol,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"dex" = (
-/obj/table/auto,
-/obj/random_item_spawner/medicine,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/item/device/analyzer/healthanalyzer,
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"dey" = (
-/obj/table/auto,
-/obj/machinery/computer/security/wooden_tv/small{
-	pixel_y = 8
-	},
-/obj/decal/stripe_caution,
-/turf/simulated/floor/white,
-/area/station/medical/medbay)
-"dez" = (
-/obj/stool/bed/moveable,
-/obj/item/clothing/suit/bedsheet,
-/turf/simulated/floor/bluewhite{
-	dir = 4
+/obj/surgery_tray,
+/obj/item/circular_saw{
+	pixel_y = 11
 	},
-/area/station/medical/medbay)
-"deD" = (
-/obj/disposaloutlet{
-	dir = 4
+/obj/item/scalpel{
+	pixel_x = 3;
+	pixel_y = 2
 	},
-/obj/disposalpipe/trunk/transport{
-	dir = 4
+/obj/item/hemostat{
+	pixel_x = 3;
+	pixel_y = -5
 	},
-/turf/simulated/floor/grass{
-	name = "astroturf"
+/obj/item/scissors/surgical_scissors{
+	pixel_x = 5;
+	pixel_y = 5
 	},
-/area/station/medical/dome)
-"deE" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
+/obj/item/staple_gun{
+	pixel_x = 4;
+	pixel_y = 9
 	},
-/turf/simulated/floor/grass{
-	name = "astroturf"
+/obj/item/suture{
+	pixel_y = 5
 	},
-/area/station/medical/dome)
-"deG" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname - SS13";
-	pixel_x = 10;
-	tag = ""
+/obj/item/surgical_spoon,
+/turf/simulated/floor/redwhite{
+	dir = 8
 	},
-/obj/disposalpipe/segment/transport{
-	dir = 8;
-	icon_state = "pipe-c"
+/area/station/medical/medbay/surgery)
+"dew" = (
+/obj/machinery/atmospherics/unary/vent_pump{
+	dir = 4
 	},
-/turf/simulated/floor/grass{
-	name = "astroturf"
+/turf/simulated/floor/red,
+/area/station/medical/medbay/surgery)
+"dex" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 9
 	},
-/area/station/medical/dome)
+/turf/simulated/floor/red,
+/area/station/medical/medbay/surgery)
 "deH" = (
 /obj/securearea{
 	desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
@@ -54895,18 +53619,6 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/storage/auxillary)
-"deI" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/storage/auxillary)
 "deJ" = (
 /obj/stool/chair,
 /obj/decal/poster/wallsign/teaparty{
@@ -54965,6 +53677,13 @@
 /obj/item/cell/supercell/charged,
 /obj/item/cell/supercell/charged,
 /obj/item/cell/supercell/charged,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 9;
+	name = "autoname - SS13";
+	pixel_x = 10;
+	tag = ""
+	},
 /turf/simulated/floor/plating/damaged3,
 /area/station/maintenance/solar/south)
 "deV" = (
@@ -54978,65 +53697,75 @@
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
 "deX" = (
-/obj/table/auto,
-/obj/bedsheetbin,
-/obj/item/sponge,
-/turf/simulated/floor/bluewhite{
-	dir = 10
+/obj/submachine/chef_sink/chem_sink{
+	pixel_y = 15
 	},
-/area/station/medical/medbay)
+/obj/machinery/drainage,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "deY" = (
-/obj/table/auto,
-/obj/item/storage/box/stma_kit,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/gloves/latex,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"deZ" = (
-/obj/machinery/power/data_terminal,
-/obj/cable,
-/obj/machinery/sleeper/compact{
-	dir = 8
+/obj/item/storage/toilet{
+	dir = 8;
+	interesting = "This toilet is immaculately clean. Like, suspiciously clean."
 	},
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/obj/decoration/toiletholder{
+	pixel_y = -6;
+	interesting = "An extremely expensive brand of toilet paper made from....real paper? Not even Command can afford to buy this pristine toilet paper."
+	},
+/obj/landmark/start/job/medical_director,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "dfa" = (
-/obj/cable{
-	icon_state = "1-2"
+/obj/machinery/optable{
+	id = "OR2"
 	},
-/turf/simulated/floor/bluewhite/corner{
-	dir = 4
+/obj/item/paper/book/from_file/medical_surgery_guide,
+/obj/machinery/drainage,
+/obj/machinery/defib_mount{
+	pixel_x = -28
 	},
-/area/station/medical/medbay)
-"dfb" = (
-/obj/iv_stand,
-/obj/item/reagent_containers/iv_drip/saline,
-/turf/simulated/floor/bluewhite{
-	dir = 4
+/turf/simulated/floor/redwhite{
+	dir = 8
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/surgery)
 "dfc" = (
-/obj/storage/closet/office,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
+/obj/table/wood/auto,
+/obj/item/paper_bin{
+	pixel_x = 7;
+	pixel_y = 10
+	},
+/obj/item/reagent_containers/food/drinks/tea{
+	pixel_x = -12;
+	pixel_y = 16
+	},
+/obj/item/toy/plush/small{
+	pixel_x = 6;
+	pixel_y = 4
+	},
+/obj/item/toy/plush/small/stress_ball{
+	pixel_x = 6;
+	pixel_y = -5
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/west,
+/area/station/medical/medbay/psychiatrist)
 "dfe" = (
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
+/obj/stool/chair/office/blue{
+	dir = 1;
+	pixel_y = 8;
+	tag = "icon-office_chair_blue (NORTH)"
+	},
+/obj/landmark/start/job/medical_doctor,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/sw_triple,
+/area/station/medical/medbay/psychiatrist)
 "dff" = (
-/obj/machinery/vending/cola/blue,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
-"dfg" = (
-/obj/machinery/vending/snack,
-/obj/machinery/light_switch/north,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
-"dfk" = (
-/obj/storage/secure/closet/animal,
-/turf/simulated/floor/grass{
-	name = "astroturf"
+/obj/stool/chair/comfy/blue{
+	dir = 8
 	},
-/area/station/medical/dome)
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_east,
+/area/station/medical/medbay/psychiatrist)
 "dfl" = (
 /obj/overlay{
 	icon = 'icons/misc/beach2.dmi';
@@ -55076,10 +53805,12 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
 "dfr" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/machinery/drainage,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "dfs" = (
 /obj/machinery/light/small{
 	dir = 4;
@@ -55095,26 +53826,11 @@
 /obj/item/storage/box/cablesbox,
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
-"dft" = (
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/lattice{
-	dir = 1;
-	icon_state = "lattice-dir"
-	},
-/turf/space,
-/area/space)
 "dfu" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/sleeper/port_a_medbay,
-/turf/simulated/floor/bluewhite{
+/turf/simulated/floor/redwhite{
 	dir = 1
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/surgery)
 "dfw" = (
 /obj/machinery/light/small,
 /turf/simulated/floor/shuttlebay,
@@ -55144,42 +53860,27 @@
 /turf/simulated/floor,
 /area/station/maintenance/solar/south)
 "dfC" = (
-/obj/machinery/computer3/generic/med_data{
+/obj/machinery/computer/operating{
 	dir = 4
 	},
-/obj/machinery/power/data_terminal,
-/obj/cable,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"dfD" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 1;
-	name = "autoname - SS13";
-	tag = ""
+/turf/simulated/floor/redwhite{
+	dir = 10
 	},
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/area/station/medical/medbay/surgery)
+"dfD" = (
+/obj/iv_stand,
+/obj/item/reagent_containers/iv_drip/blood,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/redwhite,
+/area/station/medical/medbay/surgery)
 "dfE" = (
-/obj/stool/bed/moveable,
-/obj/item/clothing/suit/bedsheet,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/turf/simulated/floor/redwhite,
+/area/station/medical/medbay/surgery)
 "dfF" = (
-/obj/machinery/light,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
-"dfG" = (
-/obj/stool/bed/moveable,
-/obj/item/clothing/suit/bedsheet,
-/turf/simulated/floor/bluewhite{
-	dir = 6
-	},
-/area/station/medical/medbay)
+/obj/iv_stand,
+/obj/item/reagent_containers/iv_drip/blood,
+/turf/simulated/floor/redwhite,
+/area/station/medical/medbay/surgery)
 "dfK" = (
 /obj/overlay{
 	icon = 'icons/misc/beach2.dmi';
@@ -55192,24 +53893,10 @@
 	},
 /area/station/medical/dome)
 "dfM" = (
-/obj/surgery_tray,
-/obj/item/scalpel,
-/obj/item/scalpel,
-/obj/item/circular_saw{
-	pixel_x = 3;
-	pixel_y = 12
-	},
-/obj/item/circular_saw{
-	pixel_x = 3;
-	pixel_y = 12
+/turf/simulated/floor/bluewhite/corner{
+	dir = 1
 	},
-/obj/item/suture,
-/obj/item/suture,
-/obj/item/scissors/surgical_scissors,
-/obj/item/scissors/surgical_scissors,
-/obj/machinery/light/small/floor,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "dfO" = (
 /obj/machinery/r_door_control/podbay/medsci,
 /turf/simulated/wall/auto/reinforced/supernorn,
@@ -55280,63 +53967,18 @@
 /obj/landmark/halloween,
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
-"dfX" = (
-/obj/shrub,
-/obj/landmark/kudzu,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
-"dfY" = (
-/obj/disposalpipe/segment/morgue,
-/obj/item/paper/book/from_file/medical_surgery_guide,
-/obj/decal/stripe_caution,
-/obj/machinery/optable{
-	id = "OR2"
-	},
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
 "dfZ" = (
 /obj/storage/closet/fire,
 /obj/decal/cleanable/cobweb,
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "dga" = (
-/obj/rack,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/gloves/latex,
-/obj/item/storage/box/gl_kit,
-/obj/item/spraybottle/cleaner,
-/obj/item/reagent_containers/hypospray,
-/obj/item/reagent_containers/hypospray,
-/obj/item/staple_gun,
-/obj/item/gun/implanter,
-/obj/item/storage/box/health_upgrade_kit,
-/obj/item/device/radio/headset/medical,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
-"dgb" = (
-/obj/reagent_dispensers/watertank/fountain,
-/obj/machinery/light,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
-"dgc" = (
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_south,
+/area/station/medical/medbay/psychiatrist)
 "dgd" = (
-/obj/stool/chair/comfy{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
+/obj/cabinet/psychiatry,
+/turf/simulated/floor/carpet/blue/fancy/narrow/se,
+/area/station/medical/medbay/psychiatrist)
 "dgf" = (
 /obj/landmark/random_room/size5x3,
 /turf/simulated/floor/plating,
@@ -55442,9 +54084,9 @@
 /area/station/maintenance/southeast)
 "dgB" = (
 /obj/machinery/power/apc{
-	areastring = "Pathology Research";
+	areastring = "Morgue";
 	dir = 1;
-	name = "Pathology APC";
+	name = "Morgue APC";
 	pixel_y = 24
 	},
 /obj/cable{
@@ -55506,17 +54148,15 @@
 /turf/simulated/floor/sand,
 /area/station/crew_quarters/market)
 "dgO" = (
-/obj/table/auto,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/mask/surgical_shield,
-/obj/item/hemostat,
-/obj/item/staple_gun,
-/obj/item/scissors/surgical_scissors,
-/turf/simulated/floor/redwhite{
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/vertical,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
 	},
-/area/station/medical/medbay/surgery)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "dgP" = (
 /obj/machinery/light/small/floor/blueish,
 /turf/simulated/floor/sand,
@@ -55701,15 +54341,19 @@
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/robotics)
 "dhs" = (
-/obj/table/auto,
-/obj/machinery/cashreg,
-/obj/item/hand_labeler{
-	pixel_y = 8
+/obj/machinery/door_control{
+	id = "medbay_entrance";
+	name = "Medbay Door Control";
+	pixel_x = 24;
+	pixel_y = 24
 	},
-/turf/simulated/floor/redwhite{
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
 	},
-/area/station/medical/medbay/surgery)
+/turf/simulated/floor/bluewhite{
+	dir = 1
+	},
+/area/station/medical/medbay)
 "dhu" = (
 /obj/lattice{
 	icon_state = "lattice-dir"
@@ -55734,15 +54378,14 @@
 /turf/simulated/floor/plating/airless,
 /area/space)
 "dhA" = (
-/obj/machinery/drainage,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
-"dhB" = (
-/obj/disposalpipe/segment/morgue,
-/obj/machinery/drainage,
-/obj/item/clothing/suit/cardboard_box/head_surgeon,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/atmospherics/unary/vent_pump{
+	dir = 1
+	},
 /turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/area/station/medical/medbay)
 "dhC" = (
 /obj/machinery/mass_driver{
 	dir = 8;
@@ -57837,14 +56480,20 @@
 "doO" = (
 /turf/space,
 /area/supply/spawn_point)
-"drV" = (
-/obj/machinery/light,
-/obj/table/reinforced/chemistry/auto/basicsup,
-/obj/item/paper/book/from_file/pharmacopia{
-	pixel_y = 6
+"dpX" = (
+/obj/machinery/door/airlock/pyro/medical,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/purplewhite,
-/area/station/science/chemistry)
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/blue,
+/area/station/medical/staff)
+"dqo" = (
+/obj/disposalpipe/segment/transport,
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "dsQ" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -58015,6 +56664,21 @@
 	icon_state = "corner_east"
 	},
 /area/station/engine/coldloop)
+"dyy" = (
+/obj/machinery/light/incandescent,
+/obj/shrub/random,
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
+"dyE" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "dyM" = (
 /obj/machinery/interdictor/unlocked,
 /turf/simulated/floor/grass/leafy,
@@ -58110,6 +56774,16 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/catwalk/north)
+"dGI" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite/corner,
+/area/station/medical/medbay/lobby)
 "dGS" = (
 /obj/cable/yellow{
 	icon_state = "1-4"
@@ -58149,12 +56823,22 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/market)
+"dKy" = (
+/obj/decal/tile_edge/stripe/extra_big,
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "dML" = (
 /obj/machinery/atmospherics/unary/tank{
 	dir = 1
 	},
 /turf/simulated/floor/blue,
 /area/station/engine/coldloop)
+"dNz" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/north,
+/area/station/medical/medbay/psychiatrist)
 "dNM" = (
 /obj/table/auto,
 /obj/item/disk/data/cartridge/captain,
@@ -58387,6 +57071,15 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"dYY" = (
+/obj/storage/crate,
+/obj/item/sheet/wood,
+/obj/item/sheet/wood,
+/obj/item/sheet/wood,
+/obj/item/sheet/wood,
+/obj/item/sheet/wood,
+/turf/simulated/floor/grime,
+/area/station/storage/auxillary)
 "dZJ" = (
 /obj/machinery/door/airlock/pyro/glass{
 	name = "Cargo Bay"
@@ -58427,18 +57120,6 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/security/checkpoint/podbay)
-"ebd" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/door/airlock/pyro/maintenance{
-	dir = 4
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
 "ebk" = (
 /obj/item/storage/wall/fire{
 	dir = 1;
@@ -58451,11 +57132,14 @@
 /area/station/maintenance/inner/central)
 "ebY" = (
 /obj/machinery/firealarm/east,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/blue/side{
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/medical/medbay/lobby)
+"ecI" = (
+/obj/decal/tile_edge/stripe/extra_big{
 	dir = 6
 	},
-/area/station/medical/medbay/lobby)
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "ecZ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -58485,6 +57169,15 @@
 /obj/decal/poster/wallsign/danger_highvolt,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/research_outpost)
+"efm" = (
+/obj/disposalpipe/segment/mail/vertical,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 8
+	},
+/area/station/medical/medbay/pharmacy)
 "efv" = (
 /obj/disposalpipe/segment/mail/bent/east,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
@@ -58502,6 +57195,9 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/security/checkpoint/podbay)
+"efL" = (
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
 "egh" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -58582,6 +57278,11 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/maintenance/inner/central)
+"ejF" = (
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk/west,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "ejP" = (
 /obj/strip_door{
 	layer = 3
@@ -58609,23 +57310,18 @@
 /turf/simulated/floor/orangeblack,
 /area/station/engine/hotloop)
 "enQ" = (
-/obj/table/wood/auto,
-/obj/machinery/networked/printer{
-	name = "Printer - MD";
-	pixel_y = 5;
-	print_id = "MD"
+/obj/cable{
+	icon_state = "4-8"
 	},
-/obj/machinery/power/data_terminal,
 /obj/cable{
-	icon_state = "0-4"
+	icon_state = "2-8"
 	},
-/obj/item/device/analyzer/healthanalyzer/upgraded,
-/obj/item/clothing/glasses/healthgoggles/upgraded,
-/turf/simulated/floor/carpet{
-	dir = 8;
-	icon_state = "fblue3"
+/obj/disposalpipe/segment/mail/vertical,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
 	},
-/area/station/medical/head)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "eoc" = (
 /obj/table/reinforced/auto,
 /obj/machinery/cashreg,
@@ -58692,13 +57388,14 @@
 	},
 /area/space)
 "evi" = (
-/obj/machinery/pathogen_manipulator,
-/obj/item/device/radio/intercom/medical,
-/obj/disposalpipe/segment/mail/vertical,
+/obj/monkeyplant,
+/obj/machinery/light/incandescent,
 /turf/simulated/floor/greenwhite{
-	dir = 1
+	dir = 10
 	},
-/area/station/medical/cdc)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "evw" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/light,
@@ -58707,6 +57404,27 @@
 	},
 /turf/simulated/floor/arrival,
 /area/station/hallway/secondary/exit)
+"ewx" = (
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/mail/vertical,
+/obj/machinery/door/poddoor/pyro/shutters{
+	density = 0;
+	icon_state = "pdoor0";
+	id = "lockdown";
+	name = "Bridge Lockdown Doors";
+	opacity = 0
+	},
+/obj/machinery/door/airlock/pyro/command{
+	name = "Bridge Access"
+	},
+/obj/mapping_helper/access/heads,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "north"
+	},
+/turf/simulated/floor/plating,
+/area/station/security/checkpoint/customs)
 "ewI" = (
 /obj/machinery/printing_press,
 /turf/simulated/floor/carpet/grime,
@@ -58789,6 +57507,12 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/entry)
+"eDJ" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/crew_quarters/market)
 "eDZ" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -58857,6 +57581,13 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/mining/magnet)
+"eGJ" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/plating,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "eGS" = (
 /obj/machinery/atmospherics/unary/vent{
 	dir = 1
@@ -58864,8 +57595,12 @@
 /turf/simulated/floor/engine/vacuum,
 /area/station/engine/hotloop)
 "eIU" = (
-/turf/simulated/floor/greenwhite,
-/area/station/medical/cdc)
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "eJt" = (
 /obj/cable{
 	icon_state = "2-4"
@@ -58890,22 +57625,6 @@
 /obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
-"eLb" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/mapping_helper/access/mining,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/mining/magnet)
 "eLu" = (
 /obj/machinery/power/solar/small_backup4,
 /obj/cable/yellow{
@@ -58929,6 +57648,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/sec_foyer)
 "eLN" = (
@@ -58952,6 +57676,13 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/quartersB)
+"eMz" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "eMD" = (
 /obj/storage/closet/emergency,
 /obj/machinery/light{
@@ -59035,6 +57766,25 @@
 	},
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/catering)
+"eOR" = (
+/obj/machinery/door_control{
+	id = "chemistry";
+	name = "Privacy Shutters";
+	pixel_x = 28
+	},
+/obj/table/reinforced/chemistry/auto,
+/obj/item/storage/box/beakerbox{
+	pixel_y = 4
+	},
+/turf/simulated/floor/purple,
+/area/station/science/chemistry)
+"ePl" = (
+/obj/disposalpipe/segment{
+	dir = 4
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "ePA" = (
 /obj/disposalpipe/junction{
 	icon_state = "pipe-j2"
@@ -59046,6 +57796,10 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
+"ePC" = (
+/obj/disposalpipe/segment/morgue,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "ePK" = (
 /obj/machinery/door/airlock/pyro/security{
 	dir = 4;
@@ -59068,6 +57822,14 @@
 	},
 /turf/simulated/floor/dirt,
 /area/station/ranch)
+"eQT" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 8
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/cloner)
 "eRF" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -59152,6 +57914,15 @@
 	name = "solar paneling"
 	},
 /area/space)
+"eXp" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/obj/disposalpipe/segment/transport{
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor,
+/area/station/medical/medbay/lobby)
 "eXL" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	dir = 8;
@@ -59191,8 +57962,7 @@
 	},
 /area/research_outpost)
 "fas" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/chem_shaker/large/chemistry,
+/obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/purplewhite{
 	dir = 6
 	},
@@ -59206,6 +57976,16 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/maintenance/disposal)
+"fcs" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_west,
+/area/station/medical/medbay/psychiatrist)
 "fcx" = (
 /obj/machinery/navbeacon/guardbotsecbot_circularpatrol/beacon4,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
@@ -59224,6 +58004,12 @@
 	dir = 6
 	},
 /area/research_outpost)
+"fcY" = (
+/obj/machinery/vending/monkey/genetics,
+/turf/simulated/floor/grass{
+	name = "astroturf"
+	},
+/area/station/medical/dome)
 "ffj" = (
 /obj/table/wood/auto,
 /obj/item/wrench,
@@ -59250,17 +58036,14 @@
 	},
 /area/station/catwalk/south)
 "ffP" = (
-/obj/machinery/computer3/generic/med_data{
-	dir = 4
-	},
-/obj/machinery/power/data_terminal,
 /obj/cable{
-	icon_state = "0-4"
+	icon_state = "4-8"
 	},
-/turf/simulated/floor/greenwhite{
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/blue/side{
 	dir = 8
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "ffT" = (
 /obj/disposalpipe/switch_junction/right/north{
 	mail_tag = list("janitor","escape                checkpoint","mining","escape                hallway","mechanics","cargo                checkpoint","QM","refinery");
@@ -59292,7 +58075,9 @@
 /area/station/crew_quarters/catering)
 "fiJ" = (
 /obj/machinery/door/airlock/pyro/maintenance,
+/obj/mapping_helper/access/morgue,
 /obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "fjg" = (
@@ -59333,6 +58118,38 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/fitness)
+"flz" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Emergency Solar Array 2";
+	cycle_id = "solar2"
+	},
+/turf/simulated/floor,
+/area/station/hangar/arrivals)
+"flC" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/switch_junction/right/north{
+	mail_tag = "genetics";
+	name = "mail junction (genetics)"
+	},
+/turf/simulated/floor/carpet{
+	icon_state = "blue2"
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "flI" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 1
@@ -59392,16 +58209,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/catering)
-"fsq" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/central)
 "fss" = (
 /obj/machinery/atmospherics/unary/portables_connector,
 /obj/item/storage/wall/random,
@@ -59442,6 +58249,28 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/science/lab)
+"fvr" = (
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
+/obj/item/reagent_containers/food/snacks/ingredient/meatpaste{
+	desc = "Gross.";
+	name = "old kidney"
+	},
+/obj/item/organ/heart{
+	desc = "A human heart, grody. How long has it been in that freezer?";
+	name = "funky ol' heart"
+	},
+/obj/storage/crate/freezer{
+	name = "Freezer - Spare Parts"
+	},
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
+/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "fwi" = (
 /obj/cable/yellow{
 	icon_state = "1-2"
@@ -59450,7 +58279,6 @@
 /turf/simulated/floor,
 /area/research_outpost/chamber)
 "fwx" = (
-/obj/stool/bench/green/auto,
 /obj/machinery/camera{
 	c_tag = "autotag";
 	dir = 6;
@@ -59458,6 +58286,7 @@
 	pixel_y = 20;
 	tag = ""
 	},
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple/side{
 	dir = 1
 	},
@@ -59498,25 +58327,6 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
-"fDU" = (
-/obj/machinery/door/airlock/pyro/medical{
-	dir = 4;
-	name = "Pathology Research"
-	},
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/mapping_helper/access/pathology,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/cdc)
 "fDX" = (
 /obj/machinery/atmospherics/binary/valve,
 /obj/machinery/camera{
@@ -59579,17 +58389,14 @@
 /turf/simulated/floor/dirt,
 /area/station/ranch)
 "fHk" = (
-/obj/stool/chair{
-	dir = 8
+/obj/submachine/laundry_machine,
+/obj/item/sponge{
+	pixel_y = 9
 	},
-/obj/landmark/start/job/geneticist,
-/obj/machinery/light_switch/east,
-/turf/simulated/floor/greenwhite{
-	dir = 4
+/turf/simulated/floor/blue/side{
+	dir = 5
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/medbay/surgery/storage)
 "fHl" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/external,
@@ -59680,20 +58487,13 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/customs)
-"fLu" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable/yellow{
-	icon_state = "1-2"
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/plating,
-/area/research_outpost)
 "fLz" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -59750,6 +58550,22 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/catering)
+"fPk" = (
+/obj/table/wood/auto,
+/obj/decoration/decorativeplant/plant3{
+	pixel_x = 4;
+	pixel_y = 10
+	},
+/obj/item/reagent_containers/food/snacks/candy/peach_ring{
+	pixel_x = -4;
+	pixel_y = 3
+	},
+/obj/item/reagent_containers/food/snacks/candy/peach_ring{
+	pixel_x = -2
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_east,
+/area/station/medical/medbay/psychiatrist)
 "fSZ" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -59785,6 +58601,9 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
+"fUs" = (
+/turf/simulated/floor,
+/area/station/medical/medbay/lobby)
 "fUC" = (
 /obj/storage/closet/dresser/random,
 /obj/item/clothing/under/gimmick/trashsinglet,
@@ -59887,6 +58706,16 @@
 	dir = 1
 	},
 /area/station/hallway/secondary/entry)
+"gcw" = (
+/obj/machinery/door/airlock/pyro/glass/botany,
+/obj/disposalpipe/segment,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/medlab,
+/obj/decal/stripe_delivery,
+/turf/simulated/floor,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "gcD" = (
 /obj/cable/blue{
 	icon_state = "4-8"
@@ -59937,22 +58766,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
-"gdw" = (
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
-	},
-/obj/disposalpipe/segment{
-	dir = 8;
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/greenwhite{
-	dir = 4
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "gfu" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -59975,8 +58788,19 @@
 /obj/landmark/gps_waypoint,
 /obj/mapping_helper/access/hydro,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hydro";
+	name = "Hydroponics";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/hydroponics/bay)
+"ggg" = (
+/obj/machinery/clone_scanner,
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbay/cloner)
 "ggS" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk{
@@ -60001,6 +58825,26 @@
 /obj/storage/secure/closet/brig,
 /turf/simulated/floor/red/side,
 /area/station/security/main)
+"gkd" = (
+/obj/item/storage/firstaid/oxygen{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/fire{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/regular,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/robodefibrillator,
+/obj/item/body_bag,
+/obj/item/body_bag,
+/obj/item/body_bag,
+/obj/storage/cart/medcart,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "gke" = (
 /obj/stool/chair{
 	dir = 8
@@ -60009,16 +58853,18 @@
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
 "gkr" = (
-/obj/machinery/disposal{
-	name = "monkeydome chute"
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname - SS13";
+	pixel_x = 10;
+	tag = ""
 	},
-/obj/disposalpipe/trunk/transport,
-/turf/simulated/floor/greenwhite{
-	dir = 6
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/grass{
+	name = "astroturf"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/dome)
 "gky" = (
 /obj/cable{
 	icon_state = "0-2"
@@ -60033,6 +58879,12 @@
 /obj/machinery/light_switch/west,
 /turf/simulated/floor/sanitary,
 /area/station/hallway/secondary/entry)
+"gkT" = (
+/obj/reagent_dispensers/watertank/fountain,
+/turf/simulated/floor/blue/side{
+	dir = 10
+	},
+/area/station/medical/medbay/lobby)
 "glU" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -60090,6 +58942,9 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/specialroom/arcade,
 /area/station/chapel/sanctuary)
+"gpc" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/maintenance)
 "gpf" = (
 /obj/machinery/door/airlock/pyro/security{
 	dir = 4
@@ -60114,6 +58969,44 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hangar/qm)
+"gqf" = (
+/obj/table/auto,
+/obj/item/circular_saw{
+	pixel_x = 3;
+	pixel_y = 12
+	},
+/obj/item/scalpel,
+/obj/item/reagent_containers/glass/bottle/formaldehyde,
+/obj/item/reagent_containers/syringe,
+/obj/item/hand_labeler,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
+"gqN" = (
+/obj/item/storage/firstaid/oxygen{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/fire{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/regular,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/bandage,
+/obj/item/robodefibrillator,
+/obj/item/body_bag,
+/obj/item/body_bag,
+/obj/item/body_bag,
+/obj/storage/cart/medcart,
+/obj/item/device/radio/intercom/medical{
+	broadcasting = 1;
+	dir = 8
+	},
+/turf/simulated/floor/carpet{
+	dir = 1;
+	icon_state = "fblue3"
+	},
+/area/station/medical/head)
 "grd" = (
 /obj/table/reinforced/auto,
 /obj/mapping_helper/firedoor_spawn,
@@ -60137,6 +59030,21 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/security/checkpoint/cargo)
+"gsJ" = (
+/obj/table/wood/auto,
+/obj/machinery/networked/printer{
+	name = "Printer - MD";
+	pixel_y = 5;
+	print_id = "MD"
+	},
+/obj/machinery/power/data_terminal,
+/obj/item/device/analyzer/healthanalyzer/upgraded,
+/obj/item/clothing/glasses/healthgoggles/upgraded,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/east,
+/area/station/medical/head)
 "gtl" = (
 /obj/machinery/conveyor/NS{
 	name = "cargo belt - south";
@@ -60178,6 +59086,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/hydro,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hydro";
+	name = "Hydroponics";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/green,
 /area/station/hydroponics/lobby)
 "gvO" = (
@@ -60310,6 +59223,25 @@
 /obj/mapping_helper/access/maint,
 /turf/simulated/floor/plating,
 /area/station/chapel/sanctuary)
+"gDO" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/access/mining,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "inner"
+	},
+/turf/simulated/floor,
+/area/station/mining/staff_room)
 "gEd" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -60346,6 +59278,21 @@
 /obj/decal/poster/wallsign/stencil/right/i,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/space)
+"gFI" = (
+/obj/table/auto,
+/obj/item/clothing/under/suit/mortician,
+/obj/item/clothing/mask/surgical,
+/obj/item/device/analyzer/healthanalyzer,
+/obj/item/device/detective_scanner,
+/obj/item/stamp,
+/obj/item/clothing/gloves/latex,
+/obj/item/clothing/mask/surgical_shield,
+/obj/item/staple_gun,
+/obj/item/clothing/suit/apron,
+/obj/item/surgical_spoon,
+/obj/item/spraybottle/cleaner,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "gGV" = (
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor,
@@ -60431,13 +59378,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/hydroponics/bay)
-"gKz" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/firealarm/east,
-/turf/simulated/floor/plating,
-/area/station/maintenance/solar/south)
 "gKD" = (
 /obj/machinery/firealarm/east,
 /turf/simulated/floor/black,
@@ -60446,22 +59386,33 @@
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/purple,
 /area/station/teleporter)
+"gLn" = (
+/obj/rack,
+/obj/item/clothing/gloves/latex,
+/obj/item/clothing/gloves/latex,
+/obj/item/storage/box/gl_kit,
+/obj/item/spraybottle/cleaner,
+/obj/item/reagent_containers/hypospray,
+/obj/item/reagent_containers/hypospray,
+/obj/item/staple_gun,
+/obj/item/gun/implanter,
+/obj/item/storage/box/health_upgrade_kit,
+/obj/item/device/radio/headset/medical,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
+"gLK" = (
+/obj/disposalpipe/segment/bent/west,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "gLL" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/item/bloodslide,
-/obj/item/bloodslide,
-/obj/item/bloodslide,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
+/obj/machinery/atmospherics/pipe/manifold{
+	level = 2
 	},
-/turf/simulated/floor/greenwhite{
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/blue/side{
 	dir = 8
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "gLT" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/glass{
@@ -60472,12 +59423,39 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/engine/engineering)
+"gOd" = (
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "gOl" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 10
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/disposal)
+"gOz" = (
+/obj/storage/crate,
+/obj/random_item_spawner/junk/some,
+/obj/random_item_spawner/snacks/maybe_few,
+/turf/simulated/floor/grime,
+/area/station/storage/auxillary)
+"gPP" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/disposalpipe/segment/mail/bent/north,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/green_pipe{
+	dir = 1
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Maintenance";
+	cycle_id = "n_maint"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/north)
 "gQp" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -60587,6 +59565,13 @@
 	},
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/baroffice)
+"gXa" = (
+/obj/machinery/manufacturer/medical,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "gXp" = (
 /obj/cable/blue{
 	icon_state = "4-8"
@@ -60633,7 +59618,7 @@
 /area/station/hallway/secondary/exit)
 "gZy" = (
 /obj/disposalpipe/switch_junction/right/north{
-	mail_tag = list("medbay                lobby","telescience","testchamber","research","chemistry","medbay","morgue","pathology","genetics","robotics");
+	mail_tag = list("medbay                lobby","telescience","testchamber","research","chemistry","medbay","morgue","pathology","genetics","robotics","medical director");
 	name = "mail junction (medsci sector)"
 	},
 /turf/simulated/wall/auto/supernorn,
@@ -60675,6 +59660,19 @@
 	},
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
+"hdq" = (
+/obj/disposalpipe/segment/mail/vertical,
+/obj/stool/chair/office{
+	dir = 8
+	},
+/obj/landmark/start/job/medical_doctor,
+/obj/machinery/atmospherics/unary/vent_pump{
+	dir = 4
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 8
+	},
+/area/station/medical/medbay/pharmacy)
 "hdr" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
@@ -60728,6 +59726,21 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/storage/primary)
+"hfb" = (
+/obj/decal/tile_edge/stripe/extra_big,
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 10;
+	icon_state = "xtra_bigstripe-corner2"
+	},
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "hfj" = (
 /obj/lattice{
 	icon_state = "lattice-dir"
@@ -60853,6 +59866,17 @@
 	dir = 10
 	},
 /area/station/solar/north)
+"hnv" = (
+/obj/disposalpipe/trunk/morgue{
+	dir = 4
+	},
+/obj/machinery/light/incandescent,
+/obj/disposaloutlet{
+	dir = 4;
+	throw_range = 2
+	},
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "hnS" = (
 /obj/noticeboard/persistent{
 	name = "Security Foyer persistent notice board";
@@ -60972,12 +59996,32 @@
 	icon_state = "catwalk_cross"
 	},
 /area/space)
+"hyB" = (
+/obj/disposalpipe/segment/morgue,
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "hyI" = (
 /obj/machinery/launcher_loader/south{
 	door_delay = 5
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
+"hyM" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Emergency Solar Array 2";
+	cycle_id = "solar2"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/hangar/arrivals)
 "hyQ" = (
 /obj/tree{
 	desc = "It's a tree. You see the phrase 'Haine <3 SpyGuy' carved into it."
@@ -60993,16 +60037,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/secondary/entry)
-"hzT" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/plating,
-/area/station/maintenance/northeast)
 "hzY" = (
 /obj/table/reinforced/auto,
 /obj/item/reagent_containers/food/drinks/creamer{
@@ -61024,6 +60058,16 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/space)
+"hAO" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 10
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "hAY" = (
 /obj/machinery/atmospherics/unary/portables_connector{
 	dir = 8;
@@ -61032,14 +60076,13 @@
 /turf/simulated/floor/blue,
 /area/station/science/lab)
 "hBJ" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Operating Theater"
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/glass/med,
 /obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
+/turf/simulated/floor/red,
 /area/station/medical/medbay/surgery)
 "hBR" = (
 /obj/grille/catwalk{
@@ -61050,6 +60093,9 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/catwalk/south)
+"hBU" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/medbay/surgery/storage)
 "hCn" = (
 /obj/securearea{
 	desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
@@ -61145,6 +60191,36 @@
 /obj/machinery/atmospherics/unary/vent,
 /turf/simulated/floor/plating/airless,
 /area/space)
+"hIe" = (
+/obj/surgery_tray,
+/obj/item/circular_saw{
+	pixel_y = 11
+	},
+/obj/item/scalpel{
+	pixel_x = 3;
+	pixel_y = 2
+	},
+/obj/item/hemostat{
+	pixel_x = 3;
+	pixel_y = -5
+	},
+/obj/item/scissors/surgical_scissors{
+	pixel_x = 5;
+	pixel_y = 5
+	},
+/obj/item/staple_gun{
+	pixel_x = 4;
+	pixel_y = 9
+	},
+/obj/item/suture{
+	pixel_y = 5
+	},
+/obj/item/surgical_spoon,
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/redwhite{
+	dir = 4
+	},
+/area/station/medical/medbay/surgery)
 "hIO" = (
 /obj/machinery/door/airlock/pyro/glass{
 	name = "Research Sector"
@@ -61216,6 +60292,13 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/engine/hotloop)
+"hKe" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/carpet/blue/fancy/innercorner/south,
+/area/station/medical/head)
 "hKn" = (
 /obj/machinery/light/small{
 	dir = 1
@@ -61242,6 +60325,22 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/primary/west)
+"hLF" = (
+/obj/table/reinforced/auto,
+/obj/machinery/door/poddoor/pyro/shutters{
+	density = 0;
+	icon_state = "pdoor0";
+	id = "chemistry";
+	name = "Chemistry Privacy Shutters";
+	opacity = 0
+	},
+/obj/item/storage/box/beakerbox{
+	pixel_y = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/purple,
+/area/station/science/chemistry)
 "hMb" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/external{
@@ -61253,6 +60352,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiairbridge";
+	name = "AI Airbridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/info{
 	name = "Net Cafe"
@@ -61331,6 +60435,20 @@
 	dir = 4
 	},
 /area/station/ranch)
+"hOD" = (
+/obj/table/auto,
+/obj/machinery/light{
+	dir = 8;
+	layer = 9.1;
+	pixel_x = -10
+	},
+/obj/machinery/cashreg,
+/turf/simulated/floor/greenwhite{
+	dir = 9
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "hOR" = (
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/shuttlebay,
@@ -61358,6 +60476,10 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/station/solar/small_backup2)
+"hQN" = (
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "hQX" = (
 /obj/machinery/vehicle/miniputt/nanoputt/security{
 	dir = 8
@@ -61377,10 +60499,31 @@
 "hRi" = (
 /turf/space,
 /area/shuttle/arrival/station)
+"hRz" = (
+/obj/cable{
+	icon_state = "2-4"
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "hRE" = (
 /obj/disposalpipe/segment,
 /turf/simulated/floor/green/side,
 /area/station/crew_quarters/arcade)
+"hTn" = (
+/obj/disposalpipe/segment/transport{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "hUj" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -61416,21 +60559,27 @@
 /obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
+"hXl" = (
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "hXM" = (
 /obj/stool/chair/comfy/shuttle/green,
 /obj/machinery/computer/transit_shuttle/research/embedded,
 /turf/unsimulated/floor/shuttle,
 /area/shuttle/research/outpost)
 "hYe" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/machinery/firealarm/east,
-/obj/landmark/start/job/medical_doctor,
-/turf/simulated/floor/redwhite{
-	dir = 4
-	},
-/area/station/medical/medbay/surgery)
+/obj/disposalpipe/segment/vertical,
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "hYU" = (
 /obj/securearea{
 	desc = "This hazard stripe marks a high-intensity beamline.";
@@ -61464,21 +60613,32 @@
 /turf/simulated/floor/black,
 /area/station/crew_quarters/quartersA)
 "hZV" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/microscope,
-/turf/simulated/floor/greenwhite{
+/obj/table/reinforced/auto,
+/obj/item/robodefibrillator{
+	pixel_x = 4;
+	pixel_y = 2
+	},
+/obj/item/bandage{
+	pixel_x = -5;
+	pixel_y = 6
+	},
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/blue/side{
 	dir = 8
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "hZW" = (
-/obj/machinery/genetics_scanner,
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 1;
+	name = "autoname - SS13";
+	tag = ""
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/junction/left/west,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "iae" = (
 /obj/machinery/launcher_loader/north{
 	door_delay = 5
@@ -61533,6 +60693,22 @@
 /area/station/engine/power{
 	name = "Engineering Control Room"
 	})
+"iaT" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	dir = 4;
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint"
+	},
+/turf/simulated/floor/caution/westeast,
+/area/station/maintenance/central)
 "ibt" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	dir = 4;
@@ -61577,6 +60753,9 @@
 	},
 /turf/space,
 /area/shuttle/research/outpost)
+"ica" = (
+/turf/simulated/floor/carpet/blue/fancy/innercorner/east,
+/area/station/medical/head)
 "icp" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -61707,6 +60886,24 @@
 /obj/tree,
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
+"ilP" = (
+/obj/machinery/door/airlock/pyro/external{
+	req_access_txt = "40"
+	},
+/obj/disposalpipe/segment/mail/bent/south,
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "West Substation";
+	cycle_id = "westsubstation"
+	},
+/turf/simulated/floor,
+/area/station/engine/substation/west)
 "imD" = (
 /obj/machinery/conveyor/NS{
 	name = "cargo belt - south";
@@ -61748,6 +60945,21 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/plating,
 /area/station/security/brig)
+"inJ" = (
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint3";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/caution/westeast,
+/area/station/maintenance/central)
 "inO" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/firealarm/north,
@@ -61835,6 +61047,10 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
+"isw" = (
+/obj/disposalpipe/segment/bent/north,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "isV" = (
 /obj/cable/orange{
 	icon_state = "1-2"
@@ -61848,24 +61064,16 @@
 /obj/machinery/firealarm/east,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/market)
-"itE" = (
-/obj/disposalpipe/segment,
+"itH" = (
+/obj/item/device/radio/intercom/medical,
+/obj/machinery/genetics_scanner,
+/obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/greenwhite{
 	dir = 1
 	},
 /area/station/medical/research{
 	name = "Genetic Research"
 	})
-"itH" = (
-/obj/machinery/computer3/generic/med_data,
-/obj/item/device/radio/intercom/medical,
-/obj/cable{
-	icon_state = "0-2"
-	},
-/obj/machinery/power/data_terminal,
-/obj/machinery/firealarm/east,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
 "iuC" = (
 /obj/rack,
 /obj/item/clothing/suit/space,
@@ -61881,12 +61089,20 @@
 /turf/simulated/floor,
 /area/station/ai_monitored/storage/eva)
 "iuF" = (
-/obj/machinery/door/airlock/pyro/maintenance,
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
+/turf/simulated/floor/bluewhite{
+	dir = 8
+	},
+/area/station/medical/medbay/cloner)
+"ivi" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "ivq" = (
 /obj/machinery/light{
 	dir = 1;
@@ -61910,17 +61126,14 @@
 /turf/simulated/floor,
 /area/station/turret_protected/ai)
 "iwc" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/machinery/chem_dispenser/chemical,
-/obj/item/reagent_containers/glass/beaker/large,
-/turf/simulated/floor/greenwhite{
-	dir = 9
+/obj/stool/bed/moveable,
+/obj/machinery/light/incandescent,
+/obj/item/clothing/suit/bedsheet,
+/obj/machinery/light_switch/east,
+/turf/simulated/floor/bluewhite{
+	dir = 6
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay)
 "iwD" = (
 /obj/lattice{
 	dir = 4;
@@ -61996,6 +61209,11 @@
 	name = "Bridge Access"
 	},
 /obj/mapping_helper/access/heads,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "south"
+	},
 /turf/simulated/floor/plating,
 /area/station/security/checkpoint/customs)
 "iBl" = (
@@ -62056,17 +61274,6 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/caution/west,
 /area/station/science/teleporter)
-"iFE" = (
-/obj/machinery/door/airlock/pyro/glass{
-	id = "cloning";
-	name = "Cloning Room"
-	},
-/obj/disposalpipe/segment,
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
 "iGY" = (
 /obj/machinery/computer/magnet{
 	dir = 8;
@@ -62079,6 +61286,16 @@
 	icon_state = "engine_caution_south"
 	},
 /area/station/mining/staff_room)
+"iHY" = (
+/obj/machinery/drainage,
+/obj/machinery/optable{
+	id = "OR1"
+	},
+/obj/machinery/defib_mount{
+	pixel_y = -28
+	},
+/turf/simulated/floor/redwhite,
+/area/station/medical/medbay/surgery)
 "iJy" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -62086,6 +61303,9 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/disposal)
+"iJN" = (
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_east,
+/area/station/medical/medbay/psychiatrist)
 "iKC" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -62140,6 +61360,13 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/quartersA)
+"iMH" = (
+/turf/simulated/floor/greenwhite{
+	dir = 1
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "iMJ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -62163,15 +61390,18 @@
 	},
 /area/station/catwalk/north)
 "iOp" = (
-/obj/machinery/door/airlock/pyro/maintenance{
-	dir = 4
-	},
-/obj/mapping_helper/firedoor_spawn,
 /obj/disposalpipe/segment/mail/horizontal,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
+/obj/machinery/power/apc{
+	areastring = "Pharmacy";
+	dir = 1;
+	name = "Pharmacy APC";
+	pixel_y = 24
+	},
+/obj/cable{
+	icon_state = "0-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "iOr" = (
 /obj/disposalpipe/switch_junction/right/north{
 	mail_tag = list("chapel","chapel                checkpoint","crewA","arrivals                checkpoint");
@@ -62362,6 +61592,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/heads,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/customs)
 "iXJ" = (
@@ -62483,6 +61718,9 @@
 	},
 /turf/simulated/floor/dirt,
 /area/station/ranch)
+"jci" = (
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "jcy" = (
 /obj/item/storage/wall/emergency{
 	dir = 1;
@@ -62554,6 +61792,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/sec_foyer)
 "jfB" = (
@@ -62618,23 +61861,19 @@
 /turf/simulated/floor/plating,
 /area/station/routing/depot)
 "jhE" = (
-/obj/machinery/centrifuge,
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/obj/machinery/atmospherics/unary/cold_sink/freezer/cryo,
+/turf/simulated/floor/blue/side{
+	dir = 9
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "jhT" = (
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/obj/disposalpipe/segment/transport{
+	dir = 4
 	},
-/obj/disposalpipe/trunk/mail/south,
-/obj/machinery/disposal/mail/small/autoname/medbay/pathology/west,
-/turf/simulated/floor/greenwhite{
+/turf/simulated/floor/blue/side{
 	dir = 6
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "jhV" = (
 /obj/tree{
 	pixel_x = -4
@@ -62667,6 +61906,20 @@
 /area/station/engine/power{
 	name = "Engineering Control Room"
 	})
+"jjb" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South East Maintenance";
+	cycle_id = "se_maint"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "jjf" = (
 /obj/grille/catwalk{
 	dir = 5
@@ -62688,6 +61941,17 @@
 /obj/submachine/weapon_vendor/security,
 /turf/simulated/floor,
 /area/station/security/checkpoint/podbay)
+"jkg" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 4
+	},
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor,
+/area/station/medical/dome)
 "jkr" = (
 /obj/disposalpipe/segment,
 /obj/machinery/door/airlock/pyro/engineering{
@@ -62759,6 +62023,14 @@
 	dir = 6
 	},
 /area/station/catwalk/north)
+"jnX" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 1
+	},
+/area/station/medical/medbay)
 "jof" = (
 /obj/reagent_dispensers/watertank/fountain,
 /turf/simulated/floor/purple/side{
@@ -62787,6 +62059,13 @@
 	},
 /turf/simulated/floor/red,
 /area/station/engine/hotloop)
+"jpw" = (
+/obj/disposalpipe/segment/horizontal,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "jqT" = (
 /obj/machinery/light/small,
 /obj/grille/catwalk,
@@ -62795,9 +62074,21 @@
 	},
 /area/space)
 "jrl" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/bluewhite,
-/area/station/medical/medbay)
+/obj/machinery/door/airlock/pyro/command,
+/obj/mapping_helper/access/medical_director,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor/black,
+/area/station/medical/head)
 "jsm" = (
 /obj/machinery/light{
 	dir = 1;
@@ -62814,6 +62105,27 @@
 	},
 /turf/simulated/floor/dirt,
 /area/station/ranch)
+"jtg" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/secscanner{
+	pixel_y = 10
+	},
+/obj/mapping_helper/access/mining,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/mining/magnet)
 "jtY" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -62879,6 +62191,15 @@
 	dir = 4
 	},
 /area/station/solar/small_backup1)
+"jvY" = (
+/obj/disposalpipe/segment/mail/bent/east,
+/turf/simulated/floor/carpet{
+	dir = 10;
+	icon_state = "blue2"
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "jwl" = (
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/caution/south,
@@ -63070,19 +62391,32 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/research_outpost)
-"jGF" = (
-/obj/mapping_helper/firedoor_spawn,
+"jGE" = (
+/obj/cable{
+	icon_state = "1-4"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
+"jGO" = (
+/obj/machinery/atmospherics/pipe/simple{
+	level = 2
+	},
+/obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/door/airlock/pyro/external{
-	dir = 4
+	req_access_txt = "40"
 	},
 /obj/forcefield/energyshield/perma/doorlink{
 	desc = "A door-linked force field that prevents gasses from passing through it.";
-	dir = 4;
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
-/turf/simulated/floor/plating,
-/area/station/maintenance/central)
+/obj/mapping_helper/airlock/cycler{
+	name = "West Substation";
+	cycle_id = "westsubstation"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/engine/substation/west)
 "jHr" = (
 /obj/machinery/atmospherics/pipe/simple/heat_exchanging{
 	dir = 5
@@ -63104,20 +62438,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/medical/robotics)
-"jHW" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/access/mining,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/mining/staff_room)
 "jIa" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -63197,6 +62517,9 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
+"jMb" = (
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "jMm" = (
 /obj/machinery/conveyor/WE{
 	name = "cargo belt - east";
@@ -63205,6 +62528,12 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/plating,
 /area/station/routing/depot)
+"jMq" = (
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/greenwhite,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "jNc" = (
 /obj/decal/poster/wallsign/hazard_caution,
 /turf/simulated/wall/auto/supernorn,
@@ -63228,18 +62557,6 @@
 /obj/item/paper/book/from_file/monster_manual_revised,
 /turf/space,
 /area/space)
-"jNE" = (
-/obj/machinery/door/airlock/pyro/external{
-	dir = 4
-	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	dir = 4;
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/westeast,
-/area/station/maintenance/central)
 "jOa" = (
 /obj/securearea{
 	desc = "";
@@ -63306,21 +62623,6 @@
 /obj/decal/cleanable/oil,
 /turf/simulated/floor/shuttlebay,
 /area/station/crew_quarters/captain)
-"jQa" = (
-/obj/table/reinforced/auto,
-/obj/machinery/cashreg{
-	pixel_y = 2
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/item/kitchen/food_box/lollipop{
-	pixel_x = 9
-	},
-/obj/machinery/door/window/northright,
-/turf/simulated/floor/caution/northsouth,
-/area/station/medical/medbay/pharmacy)
 "jQo" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -63370,6 +62672,13 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
+"jRM" = (
+/obj/machinery/sleeper/port_a_medbay{
+	dir = 4
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay)
 "jSm" = (
 /obj/grille/catwalk{
 	dir = 10
@@ -63434,19 +62743,22 @@
 	dir = 4
 	},
 /area/space)
-"jUl" = (
-/obj/storage/secure/closet/animal,
-/obj/disposalpipe/segment/transport,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
+"jTZ" = (
+/obj/health_scanner/floor{
+	find_in_range = 0;
+	id = "lobby_south";
+	dir = 8;
+	pixel_y = 8;
+	pixel_x = 8
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/turf/simulated/floor/bluewhite/corner{
+	dir = 1
 	},
+/area/station/medical/medbay/lobby)
+"jUl" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/plating,
 /area/station/medical/research{
 	name = "Genetic Research"
 	})
@@ -63473,28 +62785,15 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/security/checkpoint/sec_foyer)
-"jVp" = (
-/obj/machinery/computer/genetics{
-	dir = 8
-	},
-/turf/simulated/floor/greenwhite{
-	dir = 4
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "jVt" = (
-/obj/machinery/door/airlock/pyro/maintenance{
-	dir = 4
-	},
-/obj/mapping_helper/firedoor_spawn,
 /obj/cable{
 	icon_state = "4-8"
 	},
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "jVv" = (
 /obj/machinery/firealarm/north,
 /obj/stool/chair/couch{
@@ -63545,6 +62844,20 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
+"jYG" = (
+/obj/machinery/atmospherics/unary/portables_connector,
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 6;
+	name = "autoname - SS13";
+	pixel_y = 20;
+	tag = ""
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "jZM" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/grille/catwalk,
@@ -63591,6 +62904,14 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/routing/security)
+"kbB" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 9;
+	level = 2
+	},
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "kbW" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -63641,27 +62962,53 @@
 	icon_state = "red2"
 	},
 /area/station/quartermaster/office)
-"khR" = (
-/obj/machinery/disposal,
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
+"kff" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/obj/disposalpipe/trunk{
-	dir = 8
+/obj/disposalpipe/segment/morgue,
+/obj/cable{
+	icon_state = "1-8"
 	},
-/turf/simulated/floor/greenwhite{
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
+"kfq" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/machinery/secscanner{
+	pixel_y = 10
+	},
+/obj/mapping_helper/access/mining,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/mining/magnet)
+"kfF" = (
+/obj/machinery/vending/medical_public,
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
+"khR" = (
+/obj/machinery/vending/jobclothing/medical,
+/turf/simulated/floor/blue/side{
 	dir = 10
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "kid" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 10
 	},
-/turf/simulated/floor/stairs{
-	dir = 4;
-	icon_state = "Stairs_wide"
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/stairs/wide{
+	dir = 4
 	},
 /area/station/medical/medbay/lobby)
 "kix" = (
@@ -63720,6 +63067,19 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/solar/north)
+"kjV" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South Solar Maintenance";
+	cycle_id = "southsolar"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/solar/south)
 "kjZ" = (
 /obj/grille/catwalk,
 /turf/simulated/floor/airless/plating/catwalk{
@@ -63732,12 +63092,12 @@
 	name = "very reinforced wall"
 	},
 /area/station/maintenance/southeast)
-"klL" = (
-/obj/machinery/vending/pathology,
-/turf/simulated/floor/greenwhite{
+"klH" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 1
 	},
-/area/station/medical/cdc)
+/turf/simulated/floor/white,
+/area/station/medical/medbay/surgery)
 "klY" = (
 /obj/machinery/atmospherics/binary/valve/notify_admins{
 	dir = 4;
@@ -63786,6 +63146,26 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/security/checkpoint/podbay)
+"kpd" = (
+/obj/machinery/light,
+/obj/disposalpipe/segment/mail/bent/north,
+/turf/simulated/floor/purplewhite,
+/area/station/science/chemistry)
+"kpY" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint3";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/central)
 "kqp" = (
 /mob/living/carbon/human/npc/monkey,
 /turf/simulated/floor/pool/no_animate,
@@ -63834,6 +63214,10 @@
 	},
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
+"ktx" = (
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_south,
+/area/station/medical/medbay/psychiatrist)
 "ktE" = (
 /obj/cable/yellow{
 	icon_state = "1-2"
@@ -63848,28 +63232,6 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/engine/substation/east)
-"kuZ" = (
-/obj/machinery/door/airlock/pyro/medical{
-	dir = 4;
-	name = "Pathology Research"
-	},
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "pathology_lockdown";
-	name = "Pathology Quarantine Shutters";
-	opacity = 0
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/mapping_helper/access/pathology,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/cdc)
 "kwv" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/maintenance,
@@ -63958,19 +63320,6 @@
 	dir = 8
 	},
 /area/listeningpost)
-"kAe" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/grime,
-/area/station/storage/auxillary)
 "kAx" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4;
@@ -63994,6 +63343,17 @@
 /obj/machinery/light_switch/north,
 /turf/simulated/floor/plating,
 /area/research_outpost)
+"kAS" = (
+/obj/disposaloutlet{
+	dir = 4
+	},
+/obj/disposalpipe/trunk/transport{
+	dir = 1
+	},
+/turf/simulated/floor/grass{
+	name = "astroturf"
+	},
+/area/station/medical/dome)
 "kAW" = (
 /obj/machinery/atmospherics/trinary/mixer{
 	dir = 4;
@@ -64088,6 +63448,12 @@
 	dir = 9
 	},
 /area/space)
+"kIL" = (
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 9
+	},
+/area/station/medical/medbay/pharmacy)
 "kIP" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -64106,20 +63472,6 @@
 	dir = 6
 	},
 /area/station/catwalk/south)
-"kKe" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/disposalpipe/segment/mail/bent/north,
-/obj/machinery/atmospherics/pipe/simple/color_pipe/green_pipe{
-	dir = 1
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/plating,
-/area/station/maintenance/north)
 "kKC" = (
 /obj/table/reinforced/auto,
 /obj/disposalpipe/segment/mineral,
@@ -64201,15 +63553,16 @@
 	icon_state = "engine_caution_south"
 	},
 /area/station/mining/staff_room)
-"kNp" = (
-/obj/machinery/clonegrinder,
+"kNe" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
+	},
 /obj/cable{
-	icon_state = "0-8"
+	icon_state = "1-2"
 	},
-/obj/machinery/firealarm/east,
-/obj/decal/stripe_caution,
-/turf/simulated/floor,
-/area/station/medical/medbay/cloner)
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "kNC" = (
 /obj/machinery/door/airlock/pyro/engineering{
 	dir = 4
@@ -64222,6 +63575,15 @@
 	},
 /turf/simulated/floor,
 /area/station/engine/coldloop)
+"kOi" = (
+/obj/machinery/traymachine/morgue{
+	dir = 2
+	},
+/obj/decal/tile_edge/stripe/extra_big{
+	dir = 4
+	},
+/turf/simulated/floor/sanitary,
+/area/station/medical/morgue)
 "kOo" = (
 /obj/machinery/shuttle/engine/heater/seaheater_left{
 	pixel_y = -14;
@@ -64249,6 +63611,9 @@
 	dir = 6
 	},
 /area/space)
+"kPs" = (
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/medical/maintenance)
 "kPA" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 10
@@ -64365,6 +63730,14 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/space)
+"kUz" = (
+/obj/machinery/door/airlock/pyro/maintenance{
+	dir = 4
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "kUW" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -64380,6 +63753,10 @@
 	dir = 4
 	},
 /area/space)
+"kVf" = (
+/obj/disposalpipe/segment/bent/south,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "kVj" = (
 /obj/machinery/conveyor/SN{
 	name = "cargo belt - north";
@@ -64444,13 +63821,24 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
+"kXl" = (
+/obj/disposalpipe/junction{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "kXx" = (
-/obj/machinery/synthomatic,
-/obj/machinery/light_switch/north,
-/turf/simulated/floor/greenwhite{
-	dir = 1
+/obj/machinery/disposal{
+	name = "monkeydome chute"
 	},
-/area/station/medical/cdc)
+/obj/disposalpipe/trunk/transport,
+/turf/simulated/floor/greenwhite,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "kYb" = (
 /obj/machinery/light/lamp/black,
 /obj/table/reinforced/chemistry/auto/basicsup,
@@ -64552,6 +63940,18 @@
 /obj/mapping_helper/access/security,
 /turf/simulated/floor/red,
 /area/station/security/checkpoint/escape)
+"ldY" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 5
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "leg" = (
 /obj/machinery/computer/solar_control/east{
 	dir = 8
@@ -64578,11 +63978,12 @@
 /turf/simulated/floor,
 /area/station/engine/coldloop)
 "leN" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/table/auto,
-/obj/machinery/defib_mount,
-/turf/simulated/floor/white,
-/area/station/medical/medbay/surgery)
+/obj/machinery/vending/medical,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite{
+	dir = 1
+	},
+/area/station/medical/medbay)
 "lfh" = (
 /obj/grille/catwalk,
 /turf/simulated/floor/airless/plating/catwalk{
@@ -64615,15 +64016,21 @@
 	name = "Engineering Control Room"
 	})
 "lhG" = (
-/obj/machinery/firealarm/east,
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/glass_recycler,
-/obj/item/storage/box/beakerbox{
-	pixel_y = 4
+/obj/table/reinforced/auto,
+/obj/machinery/cashreg{
+	pixel_y = 2
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 1;
+	autoclose = 0
+	},
+/obj/mapping_helper/access/medical,
+/obj/item/kitchen/food_box/lollipop{
+	pixel_x = 9
 	},
-/obj/item/reagent_containers/glass/beaker/large,
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/reception)
 "lhJ" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/disposalpipe/segment{
@@ -64631,6 +64038,15 @@
 	},
 /turf/simulated/floor/blueblack,
 /area/station/hangar/main)
+"lhP" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "lit" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 1
@@ -64656,18 +64072,9 @@
 /turf/simulated/floor/plating/airless,
 /area/station/engine/core)
 "liV" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
-	},
-/obj/machinery/computer/chem_requester/medical{
-	dir = 4
-	},
-/turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/obj/storage/secure/closet/medical/chemical,
+/turf/simulated/floor/carpet/blue/fancy/edge/sw,
+/area/station/medical/head)
 "lje" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -64720,18 +64127,21 @@
 /turf/simulated/floor/plating/airless,
 /area/station/engine/inner)
 "lmh" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Pharmacy"
+/obj/table/reinforced/auto,
+/obj/health_scanner/wall{
+	find_in_range = 0;
+	id = "lobby_south";
+	dir = 4;
+	pixel_x = 5
 	},
-/obj/cable{
-	icon_state = "1-2"
+/obj/machinery/door/airlock/pyro/glass/windoor{
+	dir = 8;
+	autoclose = 0
 	},
-/obj/disposalpipe/segment/mail/vertical,
-/obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/pharmacy)
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "lmD" = (
 /obj/cable/yellow{
 	icon_state = "2-4"
@@ -64741,6 +64151,14 @@
 	dir = 9
 	},
 /area/space)
+"lmZ" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	dir = 4
+	},
+/obj/mapping_helper/access/medlocker,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "lnj" = (
 /turf/unsimulated/floor/shuttle/green{
 	dir = 4
@@ -64752,6 +64170,10 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/hangar/main)
+"los" = (
+/obj/machinery/atmospherics/unary/vent_pump,
+/turf/simulated/floor/white,
+/area/station/medical/medbay/cloner)
 "lpR" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -64788,16 +64210,21 @@
 	},
 /area/station/quartermaster/office)
 "lrL" = (
-/obj/machinery/autoclave,
-/obj/machinery/light{
-	dir = 4;
-	layer = 9.1;
-	pixel_x = 10
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 5
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/greenwhite,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"lst" = (
+/obj/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 6
 	},
-/area/station/medical/cdc)
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "ltv" = (
 /obj/disposalpipe/segment/mineral{
 	dir = 4
@@ -64885,20 +64312,6 @@
 /mob/living/critter/small_animal/walrus,
 /turf/simulated/floor/pool/no_animate,
 /area/station/crew_quarters/pool)
-"lwF" = (
-/obj/disposalpipe/segment,
-/obj/machinery/door/airlock/pyro/glass{
-	id = "medbay_entrance";
-	name = "Medbay Entrance"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
 "lwP" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -64994,24 +64407,26 @@
 /turf/simulated/floor,
 /area/station/engine/hotloop)
 "lDc" = (
-/obj/machinery/power/data_terminal,
-/obj/table/auto,
-/obj/cable,
-/obj/machinery/networked/printer{
-	name = "Printer - Genetics";
-	pixel_y = 5;
-	print_id = "Genetics"
+/obj/stool/chair/comfy{
+	dir = 4
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 1
+/obj/landmark/start/job/medical_doctor,
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "lDu" = (
 /obj/effects/background_objects/mundus,
 /turf/space,
 /area/space)
+"lEO" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "lFg" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -65039,6 +64454,28 @@
 	dir = 10
 	},
 /area/station/medical/medbooth)
+"lFI" = (
+/obj/table/reinforced/chemistry/auto,
+/obj/item/storage/box/patchbox{
+	pixel_x = 8
+	},
+/obj/item/storage/box/patchbox{
+	pixel_x = 8;
+	pixel_y = -4
+	},
+/obj/item/storage/box/patchbox{
+	pixel_x = 8;
+	pixel_y = -10
+	},
+/obj/item/paper/book/from_file/pharmacopia{
+	pixel_x = -8
+	},
+/obj/machinery/power/apc/autoname_west,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "lGp" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/glass{
@@ -65059,6 +64496,13 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
+"lGZ" = (
+/obj/disposalpipe/switch_junction/right/east{
+	mail_tag = "medical director";
+	name = "mail junction (medical director)"
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "lHq" = (
 /obj/table/reinforced/bar/auto,
 /obj/item/reagent_containers/food/drinks/bowl,
@@ -65087,16 +64531,6 @@
 	icon_state = "fpurple3"
 	},
 /area/station/crew_quarters/cafeteria)
-"lIa" = (
-/obj/cable/orange{
-	icon_state = "4-8"
-	},
-/obj/machinery/door/airlock/pyro/external{
-	dir = 4
-	},
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/caution/westeast,
-/area/station/maintenance/central)
 "lKv" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4;
@@ -65163,12 +64597,28 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/plating,
 /area/station/turret_protected/ai)
-"lNu" = (
-/obj/machinery/centrifuge,
-/turf/simulated/floor/greenwhite{
+"lME" = (
+/obj/machinery/door/airlock/pyro/medical{
 	dir = 4
 	},
-/area/station/medical/cdc)
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/access/medical,
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
+"lNu" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "lNJ" = (
 /obj/machinery/conveyor/EW{
 	move_lag = 30;
@@ -65249,6 +64699,19 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/secondary/entry)
+"lQf" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North East Maintenance";
+	cycle_id = "ne_maint"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/northeast)
 "lQM" = (
 /obj/decal/tile_edge/line/blue{
 	dir = 1;
@@ -65261,6 +64724,29 @@
 /obj/table/reinforced/auto,
 /turf/simulated/floor/engine,
 /area/station/hallway/primary/west)
+"lRi" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 6
+	},
+/area/station/medical/medbay/lobby)
+"lSO" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North East Maintenance";
+	cycle_id = "ne_maint2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/northeast)
 "lTm" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -65293,6 +64779,12 @@
 /mob/living/critter/small_animal/mouse/remy,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/kitchen)
+"lUL" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "lUQ" = (
 /obj/grille/catwalk{
 	dir = 9
@@ -65320,6 +64812,31 @@
 	name = "very reinforced wall"
 	},
 /area/station/mining/staff_room)
+"lWs" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South East Maintenance";
+	cycle_id = "se_maint2"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/southeast)
+"lXu" = (
+/obj/machinery/power/apc{
+	areastring = "Medbay Staff Area";
+	dir = 8;
+	name = "Medbay Staff Room APC";
+	pixel_x = -24
+	},
+/obj/cable{
+	icon_state = "0-4"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "lYA" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/glass{
@@ -65349,16 +64866,6 @@
 	dir = 1
 	},
 /area/station/engine/inner)
-"lZd" = (
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/door/airlock/pyro/external,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/maintenance/northeast)
 "lZC" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/grille/catwalk,
@@ -65403,6 +64910,9 @@
 /obj/machinery/light/small,
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/science)
+"mbH" = (
+/turf/simulated/floor/white,
+/area/station/medical/medbay/cloner)
 "mbI" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
@@ -65423,6 +64933,22 @@
 	},
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/science)
+"mcQ" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Auxillary Storage";
+	cycle_id = "auxstorage"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/storage/auxillary)
 "mdu" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4;
@@ -65453,17 +64979,15 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/solar/small_backup2)
-"mdD" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
+"mdC" = (
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/carpet{
+	dir = 6;
+	icon_state = "blue2"
 	},
-/turf/simulated/floor,
-/area/station/maintenance/solar/north)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "mdZ" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 4
@@ -65483,6 +65007,23 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
+"mgK" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Auxillary Storage";
+	cycle_id = "auxstorage"
+	},
+/turf/simulated/floor/grime,
+/area/station/storage/auxillary)
 "mgV" = (
 /obj/submachine/seed_manipulator{
 	dir = 4
@@ -65518,25 +65059,24 @@
 /obj/machinery/light,
 /turf/simulated/floor/grass/leafy,
 /area/station/ranch)
+"mhP" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/mail/bent/south,
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "mil" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/lobby)
-"mji" = (
-/obj/machinery/door/airlock/pyro/medical{
-	name = "Genetic Research"
+/obj/disposalpipe/segment/morgue{
+	dir = 4
 	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medlab,
-/obj/decal/stripe_delivery,
 /turf/simulated/floor,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/medbay/lobby)
 "mjk" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
@@ -65544,6 +65084,13 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/security/checkpoint/podbay)
+"mlC" = (
+/turf/simulated/floor/greenwhite{
+	dir = 8
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "mmn" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor,
@@ -65627,6 +65174,20 @@
 	icon_state = "fgreen2"
 	},
 /area/station/hydroponics/bay)
+"mqH" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South East Maintenance";
+	cycle_id = "se_maint2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "mrr" = (
 /obj/cable/orange{
 	icon_state = "1-8"
@@ -65747,6 +65308,21 @@
 	},
 /turf/simulated/wall/auto/supernorn,
 /area/station/science/bot_storage)
+"mzr" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South Solar Maintenance";
+	cycle_id = "southsolar"
+	},
+/turf/simulated/floor,
+/area/station/maintenance/solar/south)
 "mzz" = (
 /obj/securearea{
 	desc = "This hazard stripe marks a high-intensity beamline.";
@@ -65830,13 +65406,13 @@
 	},
 /area/station/security/main)
 "mCf" = (
-/obj/table/auto,
-/obj/machinery/coffeemaker/medbay,
-/obj/drink_rack/mug{
-	pixel_x = -26
+/obj/submachine/chef_sink/chem_sink{
+	dir = 4;
+	pixel_x = -8
 	},
+/obj/storage/secure/closet/medical/medkit,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "mDn" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -65862,6 +65438,13 @@
 	},
 /turf/simulated/floor/blue,
 /area/station/science/lab)
+"mDB" = (
+/obj/stool/chair/couch/blue{
+	dir = 4
+	},
+/obj/landmark/start/job/medical_doctor,
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_north,
+/area/station/medical/medbay/psychiatrist)
 "mFx" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/glass{
@@ -65919,6 +65502,13 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"mHt" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "mHY" = (
 /obj/disposalpipe/segment/mail/bent/south,
 /obj/machinery/atmospherics/pipe/simple/overfloor{
@@ -66032,6 +65622,14 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/maintenance/northeast)
+"mMO" = (
+/obj/storage/closet/emergency,
+/obj/item/crowbar/red,
+/obj/item/crowbar/red,
+/turf/unsimulated/floor/shuttle/green{
+	dir = 4
+	},
+/area/shuttle/arrival/station)
 "mNd" = (
 /obj/machinery/firealarm/west,
 /obj/submachine/ATM{
@@ -66041,6 +65639,11 @@
 	dir = 9
 	},
 /area/station/crew_quarters/market)
+"mNS" = (
+/obj/disposalpipe/segment/transport,
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor,
+/area/station/medical/medbay/surgery/storage)
 "mNY" = (
 /obj/decal/stripe_delivery,
 /obj/machinery/door/airlock/pyro/reinforced/syndicate{
@@ -66156,16 +65759,6 @@
 	},
 /turf/simulated/floor,
 /area/station/science/lab)
-"mSY" = (
-/obj/machinery/door/airlock/pyro/maintenance,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
 "mTJ" = (
 /obj/stool/chair{
 	dir = 8
@@ -66175,6 +65768,12 @@
 	icon_state = "carpetSE"
 	},
 /area/station/crew_quarters/cafeteria)
+"mUH" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "mVc" = (
 /obj/machinery/navbeacon/tour/cog2/tour2,
 /turf/simulated/floor,
@@ -66233,14 +65832,6 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/maintenance/east)
-"mZL" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe/overfloor{
-	dir = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/central)
 "nau" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -66255,17 +65846,12 @@
 /turf/simulated/floor/plating,
 /area/station/ranch)
 "nct" = (
-/obj/table/auto,
-/obj/item/clipboard,
-/obj/item/storage/pill_bottle/mutadone,
-/obj/machinery/firealarm/west,
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/obj/machinery/firealarm/north,
+/obj/storage/secure/closet/animal,
+/turf/simulated/floor/grass{
+	name = "astroturf"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/dome)
 "ndb" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /turf/simulated/floor/arrival/corner{
@@ -66305,16 +65891,17 @@
 /turf/simulated/floor/engine,
 /area/station/ai_monitored/armory)
 "nkn" = (
-/obj/machinery/firealarm/east,
-/obj/storage/secure/closet/fridge/pathology{
-	req_access_txt = "5"
-	},
-/obj/item/reagent_containers/food/snacks/agar_block,
-/obj/item/reagent_containers/food/snacks/yuck,
-/turf/simulated/floor/greenwhite{
+/obj/table/auto,
+/obj/item/device/analyzer/healthanalyzer,
+/obj/item/device/analyzer/healthanalyzer,
+/obj/item/gun/implanter,
+/obj/item/reagent_containers/dropper/mechanical,
+/obj/item/reagent_containers/dropper/mechanical,
+/obj/disposalpipe/segment/mail/bent/west,
+/turf/simulated/floor/blue/side{
 	dir = 4
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "nkH" = (
 /obj/machinery/conveyor/SN{
 	id = "chapel"
@@ -66326,9 +65913,17 @@
 /turf/simulated/floor,
 /area/station/chapel/sanctuary)
 "nlY" = (
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay/pharmacy)
+/obj/machinery/door/airlock/pyro/glass{
+	id = "medbay_entrance";
+	name = "Medbay Entrance"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "nmD" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -66339,6 +65934,13 @@
 	},
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/catering)
+"nmJ" = (
+/obj/disposalpipe/segment/morgue{
+	dir = 4;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "nmZ" = (
 /obj/grille/catwalk{
 	dir = 5
@@ -66394,6 +65996,11 @@
 	dir = 5
 	},
 /area/research_outpost/hangar)
+"nom" = (
+/turf/simulated/floor/redwhite/corner{
+	dir = 4
+	},
+/area/station/medical/medbay/surgery)
 "noQ" = (
 /obj/cable/orange{
 	icon_state = "1-8"
@@ -66430,20 +66037,10 @@
 	name = "Engineering Control Room"
 	})
 "nqc" = (
-/obj/item/device/radio/intercom/medical,
-/obj/storage/secure/closet/medical{
-	name = "locker"
-	},
-/obj/disposalpipe/switch_junction/left/north{
-	mail_tag = "genetics";
-	name = "mail junction (genetics)"
-	},
-/turf/simulated/floor/greenwhite{
-	dir = 1
-	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/reagent_dispensers/watertank/fountain,
+/obj/machinery/light,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "nqk" = (
 /obj/machinery/photocopier,
 /turf/simulated/floor/wood{
@@ -66595,6 +66192,17 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/science/lab)
+"nBB" = (
+/obj/machinery/computer3/generic/med_data{
+	dir = 4
+	},
+/obj/blind_switch/area/west,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/power/data_terminal,
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_west,
+/area/station/medical/medbay/psychiatrist)
 "nCl" = (
 /obj/cable/yellow{
 	icon_state = "1-2"
@@ -66637,19 +66245,6 @@
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/west)
-"nFC" = (
-/obj/machinery/door/airlock/pyro/external{
-	req_access_txt = "40"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/engine/substation/east)
 "nFV" = (
 /obj/grille/catwalk,
 /obj/cable{
@@ -66665,30 +66260,25 @@
 /obj/decal/cleanable/oil,
 /turf/simulated/floor/shuttlebay,
 /area/station/security/checkpoint/podbay)
-"nHY" = (
-/obj/table/reinforced/auto,
-/obj/machinery/door/poddoor/pyro/shutters{
-	density = 0;
-	dir = 4;
-	icon_state = "pdoor0";
-	id = "chemistry";
-	name = "Chemistry Privacy Shutters";
-	opacity = 0
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/item/storage/box/beakerbox{
-	pixel_y = 4
-	},
-/obj/decal/stripe_caution,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor,
-/area/station/science/chemistry)
 "nIx" = (
 /obj/table/auto,
 /obj/random_item_spawner/medicine,
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/grime,
 /area/station/crew_quarters/quarters_east)
+"nIZ" = (
+/obj/disposalpipe/segment/mail/horizontal,
+/turf/simulated/floor/carpet{
+	icon_state = "blue2"
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"nJi" = (
+/turf/simulated/floor/redwhite/corner{
+	dir = 8
+	},
+/area/station/medical/medbay/surgery)
 "nJk" = (
 /obj/grille/catwalk{
 	dir = 6
@@ -66712,9 +66302,14 @@
 /turf/simulated/floor/grime,
 /area/station/science/lab)
 "nKf" = (
-/obj/machinery/incubator,
-/turf/simulated/floor/white,
-/area/station/medical/cdc)
+/obj/stool/chair/comfy/wheelchair,
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "nLi" = (
 /obj/landmark/magnet_shield,
 /obj/securearea{
@@ -66747,6 +66342,22 @@
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/plating,
 /area/station/engine/inner)
+"nMM" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/green_pipe{
+	dir = 1
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Maintenance";
+	cycle_id = "n_maint"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/north)
 "nNE" = (
 /obj/grille/catwalk{
 	dir = 9
@@ -66824,6 +66435,22 @@
 	icon_state = "engine_caution_misc"
 	},
 /area/research_outpost/chamber)
+"nQK" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	dir = 4;
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint2"
+	},
+/turf/simulated/floor/caution/westeast,
+/area/station/maintenance/central)
 "nRm" = (
 /obj/stool/chair{
 	dir = 4
@@ -66919,6 +66546,19 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
+"nYf" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe/overfloor{
+	dir = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint4";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/central)
 "nYN" = (
 /obj/machinery/vehicle/miniputt/armed{
 	dir = 8
@@ -67080,6 +66720,16 @@
 /area/station/crew_quarters/info{
 	name = "Net Cafe"
 	})
+"ofi" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/morgue,
+/obj/cable{
+	icon_state = "1-4"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "ofP" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -67120,6 +66770,15 @@
 /obj/machinery/computer/chem_request_receiver,
 /turf/simulated/floor/purple,
 /area/station/science/chemistry)
+"oiN" = (
+/obj/machinery/light/incandescent,
+/obj/machinery/computer/operating{
+	dir = 8
+	},
+/turf/simulated/floor/redwhite{
+	dir = 6
+	},
+/area/station/medical/medbay/surgery)
 "oje" = (
 /obj/landmark/random_room/size3x3,
 /turf/simulated/floor/plating,
@@ -67262,6 +66921,15 @@
 	dir = 5
 	},
 /area/mining/magnet)
+"opr" = (
+/obj/submachine/chef_sink/chem_sink{
+	dir = 8;
+	pixel_x = 4
+	},
+/turf/simulated/floor/redwhite{
+	dir = 4
+	},
+/area/station/medical/medbay/surgery)
 "opE" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -67308,6 +66976,13 @@
 /obj/machinery/drainage,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/catering)
+"osd" = (
+/obj/storage/secure/closet/medical/cloning,
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/bluewhite{
+	dir = 8
+	},
+/area/station/medical/medbay/cloner)
 "osq" = (
 /obj/structure/girder,
 /obj/item/storage/pill_bottle/cyberpunk{
@@ -67329,6 +67004,19 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/maintenance/central)
+"otO" = (
+/obj/bookshelf,
+/obj/item/paper/book/from_file/cookbook{
+	pixel_x = -4
+	},
+/obj/item/paper/book/from_file/pharmacopia{
+	pixel_x = 4
+	},
+/obj/item/paper/book/from_file/medical_surgery_guide{
+	pixel_y = -4
+	},
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_north,
+/area/station/medical/medbay/psychiatrist)
 "otU" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 10
@@ -67356,6 +67044,9 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/ai_monitored/armory)
+"owx" = (
+/turf/simulated/floor/carpet/blue/fancy/innercorner/east,
+/area/station/medical/medbay/psychiatrist)
 "owB" = (
 /obj/machinery/door/airlock/pyro/medical{
 	dir = 4;
@@ -67377,11 +67068,25 @@
 	},
 /turf/simulated/floor/grass/leafy,
 /area/station/ranch)
+"oyo" = (
+/obj/stool/chair/blue{
+	dir = 8
+	},
+/obj/item/device/radio/intercom/medical{
+	broadcasting = 1;
+	dir = 8
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay/lobby)
 "oyM" = (
 /obj/table/reinforced/auto,
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
+"ozR" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/turf/simulated/floor/plating,
+/area/station/medical/medbay/reception)
 "oAf" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -67391,18 +67096,21 @@
 	},
 /area/station/catwalk/north)
 "oAv" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Staff Room"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue/fancy/innercorner/ne_triple,
+/area/station/medical/medbay/psychiatrist)
+"oAF" = (
+/obj/machinery/light/incandescent,
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/lobby)
 "oCV" = (
 /obj/machinery/status_display,
 /turf/simulated/wall/auto/supernorn,
 /area/station/science/chemistry)
+"oDb" = (
+/obj/machinery/door/airlock/pyro/maintenance,
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "oDg" = (
 /obj/lattice,
 /obj/cable/orange{
@@ -67410,6 +67118,10 @@
 	},
 /turf/space,
 /area/space)
+"oDm" = (
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/plating,
+/area/station/maintenance/solar/south)
 "oEg" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/firealarm/west,
@@ -67463,10 +67175,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/security/main)
-"oHZ" = (
-/obj/landmark/gps_waypoint,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
 "oIB" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -67492,6 +67200,12 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/plating,
 /area/station/storage/warehouse)
+"oJc" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/carpet/blue/fancy/innercorner/south,
+/area/station/medical/medbay/psychiatrist)
 "oJx" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -67500,17 +67214,15 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
+"oKd" = (
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "oKm" = (
-/obj/table/auto,
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/machinery/cashreg,
-/obj/disposalpipe/segment/transport,
+/obj/machinery/disposal,
+/obj/disposalpipe/trunk/south,
 /turf/simulated/floor/greenwhite{
-	dir = 9
+	dir = 6
 	},
 /area/station/medical/research{
 	name = "Genetic Research"
@@ -67686,27 +67398,45 @@
 	},
 /turf/simulated/floor/plating/random,
 /area/ghostdrone_factory)
+"oSG" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	id = "medbay_entrance"
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
+/turf/simulated/floor/blue,
+/area/station/medical/medbay)
 "oTP" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
 "oUh" = (
-/obj/disposalpipe/segment/morgue{
-	dir = 4
+/obj/item/device/radio/intercom/medical{
+	dir = 1
 	},
-/obj/machinery/door/airlock/pyro/medical{
-	dir = 4;
-	name = "Morgue"
+/turf/simulated/floor/bluewhite,
+/area/station/medical/medbay/cloner)
+"oUl" = (
+/obj/table/wood/auto,
+/obj/machinery/light/lamp/green{
+	pixel_y = 12
 	},
 /obj/cable{
-	icon_state = "4-8"
+	icon_state = "1-2"
 	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/morgue,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/morgue)
+/obj/cable{
+	icon_state = "2-4"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
 "oUv" = (
 /obj/cable/yellow{
 	icon_state = "2-4"
@@ -67762,17 +67492,12 @@
 /turf/simulated/floor/caution/corner/sw,
 /area/station/engine/hotloop)
 "oXu" = (
-/obj/machinery/door/airlock/pyro/command{
-	name = "Medical Director's Office"
-	},
-/obj/cable{
-	icon_state = "1-2"
+/obj/shrub/random,
+/obj/machinery/firealarm/west,
+/turf/simulated/floor/bluewhite{
+	dir = 9
 	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical_director,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/head)
+/area/station/medical/medbay)
 "oYW" = (
 /obj/stool/chair/dining/wood{
 	dir = 1
@@ -67838,14 +67563,27 @@
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
 "pcF" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 8;
-	pixel_x = 8
+/obj/machinery/door/airlock/pyro/glass/botany,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/medlab,
+/obj/decal/stripe_delivery,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 4
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/green,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
+"pcG" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 5;
+	level = 2
 	},
-/area/station/medical/cdc)
+/turf/simulated/floor/bluewhite{
+	dir = 8
+	},
+/area/station/medical/medbay)
 "pdD" = (
 /obj/grille/catwalk,
 /obj/cable{
@@ -67861,10 +67599,9 @@
 /turf/simulated/floor,
 /area/station/hydroponics/bay)
 "pdJ" = (
-/obj/disposalpipe/segment/mail/vertical,
-/obj/machinery/drainage,
-/turf/simulated/floor/greenwhite,
-/area/station/medical/cdc)
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "peq" = (
 /obj/landmark/magnet_shield,
 /obj/securearea{
@@ -67913,15 +67650,16 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
-"pgI" = (
-/obj/machinery/firealarm/west,
-/obj/machinery/atmospherics/unary/vent_pump{
-	dir = 1
+"pgN" = (
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/bluewhite{
-	dir = 8
+/obj/disposalpipe/segment/mail/vertical,
+/obj/cable{
+	icon_state = "2-4"
 	},
-/area/station/medical/medbay)
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/head)
 "phh" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -67933,6 +67671,9 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/plating,
 /area/station/routing/depot)
+"pim" = (
+/turf/simulated/floor/carpet/blue/fancy/innercorner/nw_triple,
+/area/station/medical/medbay/psychiatrist)
 "piU" = (
 /obj/machinery/door/airlock/pyro{
 	dir = 4;
@@ -67974,6 +67715,21 @@
 	dir = 8
 	},
 /area/station/hallway/primary/east)
+"pmo" = (
+/obj/machinery/power/apc{
+	areastring = "Medbay Operating Theater";
+	dir = 1;
+	name = "Surgery APC";
+	pixel_y = 24
+	},
+/obj/cable{
+	icon_state = "0-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
+"pmW" = (
+/turf/simulated/floor/carpet/blue/fancy/innercorner/se_triple,
+/area/station/medical/medbay/psychiatrist)
 "pnO" = (
 /obj/shrub{
 	dir = 1;
@@ -68068,6 +67824,17 @@
 	},
 /turf/simulated/floor/airless/engine/caution/misc,
 /area/station/hangar/science)
+"psd" = (
+/obj/machinery/door/airlock/pyro/glass{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor,
+/area/station/crew_quarters/market)
 "psJ" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -68089,6 +67856,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "securityrelease";
+	name = "Security Release Room";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/main)
 "psM" = (
@@ -68123,13 +67895,6 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/catering)
-"put" = (
-/mob/living/carbon/human/npc/monkey,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
 "puN" = (
 /obj/machinery/light/small{
 	dir = 4;
@@ -68226,10 +67991,6 @@
 	},
 /turf/simulated/floor/plating/random,
 /area/ghostdrone_factory)
-"pzu" = (
-/obj/machinery/firealarm/west,
-/turf/simulated/floor/plating,
-/area/station/medical/medbay)
 "pAo" = (
 /obj/machinery/light,
 /turf/simulated/floor/shuttlebay,
@@ -68269,19 +68030,6 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/sanitary,
 /area/station/hallway/primary/east)
-"pCJ" = (
-/obj/machinery/door/airlock/pyro/glass{
-	dir = 4;
-	name = "Operating Theater";
-	req_access_txt = "5"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 4
-	},
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/surgery)
 "pCN" = (
 /obj/stool/chair{
 	dir = 8
@@ -68339,14 +68087,6 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/arcade/dungeon)
-"pHS" = (
-/obj/disposalpipe/segment/transport{
-	icon_state = "pipe-c"
-	},
-/turf/simulated/floor/greenwhite,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "pHX" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	dir = 4;
@@ -68402,6 +68142,12 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/airless/plating/catwalk,
 /area/station/catwalk/north)
+"pJX" = (
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "pJZ" = (
 /obj/machinery/camera/television{
 	c_tag = "game room";
@@ -68614,11 +68360,9 @@
 /turf/simulated/floor,
 /area/station/security/checkpoint/podbay)
 "pXX" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/greenwhite,
-/area/station/medical/cdc)
+/obj/machinery/firealarm/south,
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "pYd" = (
 /obj/machinery/atmospherics/unary/vent{
 	dir = 4
@@ -68655,6 +68399,14 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/showers)
+"pYP" = (
+/obj/machinery/door/airlock/pyro/glass/med{
+	id = "cloning"
+	},
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/white,
+/area/station/medical/medbay/cloner)
 "qak" = (
 /obj/table/wood/auto,
 /obj/machinery/firealarm/east,
@@ -68754,9 +68506,14 @@
 /turf/simulated/floor/plating,
 /area/station/hangar/qm)
 "qiA" = (
-/obj/machinery/status_display,
-/turf/simulated/wall/auto/supernorn,
-/area/station/medical/medbay)
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbay/pharmacy)
 "qiD" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -68773,6 +68530,9 @@
 	pixel_y = 21
 	},
 /obj/machinery/light_switch/north,
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
 /turf/simulated/floor/blue/side{
 	dir = 1
 	},
@@ -68840,18 +68600,24 @@
 /turf/space,
 /area/space)
 "qlS" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk,
-/obj/item/storage/wall/medical{
-	dir = 1;
-	pixel_y = 32
+/obj/table/wood/auto,
+/obj/machinery/power/data_terminal,
+/obj/machinery/computer3/generic/personal{
+	pixel_y = 5
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 5
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 8;
+	name = "autoname - SS13";
+	pixel_x = 10;
+	tag = ""
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/machinery/firealarm/east,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "qmg" = (
 /obj/stool/chair/dining/wood{
 	dir = 1
@@ -68865,6 +68631,14 @@
 "qmv" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/crew_quarters/arcade/dungeon)
+"qmO" = (
+/obj/machinery/computer/announcement{
+	name = "Medical Announcement Computer";
+	req_access_txt = "19"
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/blue/fancy/edge/ne,
+/area/station/medical/head)
 "qnl" = (
 /obj/disposalpipe/segment/produce,
 /turf/simulated/floor,
@@ -68878,6 +68652,21 @@
 	icon_state = "catwalk_cross"
 	},
 /area/space)
+"qoF" = (
+/obj/machinery/chem_heater/chemistry,
+/obj/machinery/firealarm/east,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 9;
+	name = "autoname - SS13";
+	pixel_x = 10;
+	tag = ""
+	},
+/obj/machinery/light_switch/east{
+	pixel_y = 12
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "qpr" = (
 /obj/machinery/portable_atmospherics/canister/toxins,
 /obj/machinery/firealarm/west,
@@ -68939,6 +68728,21 @@
 /obj/mapping_helper/access/bar,
 /turf/simulated/floor/plating/damaged3,
 /area/station/hallway/secondary/construction)
+"qrL" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Solar Maintenance";
+	cycle_id = "northsolar"
+	},
+/turf/simulated/floor/caution/northsouth{
+	dir = 1
+	},
+/area/station/maintenance/solar/north)
 "quF" = (
 /obj/machinery/atmospherics/unary/tank/air_repressurization{
 	dir = 8
@@ -68961,6 +68765,11 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "securityrelease";
+	name = "Security Release Room";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/security/main)
 "qwc" = (
@@ -69044,6 +68853,23 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/plating,
 /area/station/security/brig)
+"qzh" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable/yellow{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Research Outpost";
+	cycle_id = "sci_outpost"
+	},
+/turf/simulated/floor/plating,
+/area/research_outpost)
 "qzn" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -69256,6 +69082,15 @@
 	dir = 4
 	},
 /area/station/catwalk/north)
+"qIv" = (
+/obj/mapping_helper/access/medical,
+/obj/machinery/door/airlock/pyro/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/psychiatrist)
 "qJH" = (
 /obj/decal/poster/wallsign/stencil/right/s{
 	pixel_x = 21
@@ -69313,11 +69148,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/engine/inner)
-"qNC" = (
-/obj/mapping_helper/wingrille_spawn/auto,
-/obj/storage/cart,
-/turf/simulated/floor,
-/area/station/hydroponics/bay)
 "qNE" = (
 /obj/table/reinforced/auto,
 /obj/decal/stripe_delivery,
@@ -69331,18 +69161,14 @@
 /turf/simulated/floor,
 /area/station/security/checkpoint/podbay)
 "qOh" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/machinery/door/airlock/pyro/medical{
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/carpet{
 	dir = 4;
-	name = "Morgue"
+	icon_state = "blue2"
 	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/morgue,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/morgue)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "qOn" = (
 /obj/machinery/shuttle/engine/heater/seaheater_right{
 	pixel_y = -14;
@@ -69419,18 +69245,6 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/mining/magnet)
-"qSU" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Medbay"
-	},
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay)
 "qTr" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -69447,6 +69261,12 @@
 	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/medical/medbay/lobby)
+"qUF" = (
+/obj/machinery/optable{
+	name = "Autopsy Table"
+	},
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "qVa" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -69509,19 +69329,6 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/mining/magnet)
-"qWG" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable/yellow{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/plating,
-/area/research_outpost)
 "qXg" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 1
@@ -69545,6 +69352,22 @@
 	icon_state = "blue1"
 	},
 /area/station/crew_quarters/arcade/dungeon)
+"qXR" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable/yellow{
+	icon_state = "1-2"
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Research Outpost";
+	cycle_id = "sci_outpost"
+	},
+/turf/simulated/floor/plating,
+/area/research_outpost)
 "qYq" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/command{
@@ -69606,6 +69429,18 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/crew_quarters/catering)
+"rab" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbay/pharmacy)
 "ram" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4;
@@ -69658,26 +69493,23 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/security/checkpoint/podbay)
-"rby" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
+"rbC" = (
+/obj/table/auto,
+/obj/item/storage/box/syringes{
+	pixel_x = -6;
+	pixel_y = 3
 	},
-/obj/machinery/firealarm/north,
-/obj/storage/secure/closet/medical/chemical,
-/turf/simulated/floor/carpet{
-	dir = 9;
-	icon_state = "fblue2"
+/obj/item/storage/box/iv_box{
+	pixel_x = 6;
+	pixel_y = 4
 	},
-/area/station/medical/head)
-"rbC" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/microscope,
-/turf/simulated/floor/greenwhite{
+/obj/item/storage/box/gl_kit,
+/obj/machinery/light/incandescent,
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/blue/side{
 	dir = 4
 	},
-/area/station/medical/cdc)
+/area/station/medical/medbay/surgery/storage)
 "rcy" = (
 /obj/machinery/power/terminal{
 	dir = 1
@@ -69748,15 +69580,12 @@
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/carpet/arcade,
 /area/station/crew_quarters/arcade)
-"rfG" = (
-/obj/table/reinforced/chemistry/auto,
-/obj/machinery/door_control{
-	id = "chemistry";
-	name = "Privacy Shutters";
-	pixel_x = 28
-	},
-/turf/simulated/floor/purple,
-/area/station/science/chemistry)
+"rfK" = (
+/obj/machinery/door/airlock/pyro/maintenance,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/medical,
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "rfM" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk,
@@ -69837,6 +69666,25 @@
 /obj/mapping_helper/access/chapel_office,
 /turf/simulated/floor/carpet/grime,
 /area/station/chapel/office)
+"rhQ" = (
+/obj/decal/tile_edge/stripe{
+	dir = 6;
+	icon_state = "bot2"
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/lobby)
+"rhR" = (
+/obj/disposalpipe/segment/transport{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/surgery/storage)
 "rhS" = (
 /obj/machinery/firealarm/east,
 /obj/decal/stripe_delivery,
@@ -69857,6 +69705,23 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
+"riZ" = (
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	dir = 4;
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/central)
 "rjO" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -69882,6 +69747,16 @@
 	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/hallway/secondary/exit)
+"rln" = (
+/obj/item_dispenser/latex_gloves{
+	pixel_y = 0;
+	pixel_x = 24
+	},
+/obj/storage/secure/closet/medical/anesthetic,
+/turf/simulated/floor/redwhite{
+	dir = 4
+	},
+/area/station/medical/medbay/surgery)
 "rlM" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -69900,6 +69775,15 @@
 /obj/mapping_helper/access/heads,
 /turf/simulated/floor/circuit,
 /area/station/bridge)
+"rml" = (
+/obj/machinery/door/airlock/pyro/glass/med,
+/obj/mapping_helper/access/medical,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "rnf" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -69958,6 +69842,11 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "rpd" = (
@@ -70000,6 +69889,7 @@
 "rrx" = (
 /obj/machinery/firealarm/west,
 /obj/table/reinforced/chemistry/auto,
+/obj/machinery/chem_shaker/large/chemistry,
 /turf/simulated/floor/purplewhite{
 	dir = 10
 	},
@@ -70044,6 +69934,13 @@
 	},
 /turf/space,
 /area/space)
+"rsw" = (
+/obj/stool/chair/comfy{
+	dir = 1
+	},
+/obj/landmark/start/job/medical_doctor,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "rsO" = (
 /obj/table/auto,
 /obj/item/kitchen/rollingpin,
@@ -70051,13 +69948,6 @@
 /obj/item/reagent_containers/food/drinks/drinkingglass/icing,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/kitchen)
-"rtg" = (
-/obj/machinery/firealarm/north,
-/obj/disposalpipe/segment/mail/horizontal,
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
 "rvg" = (
 /obj/table/reinforced/auto,
 /obj/mapping_helper/firedoor_spawn,
@@ -70131,6 +70021,16 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/inner/central)
+"ryB" = (
+/obj/machinery/door/unpowered/wood{
+	dir = 8;
+	icon = 'icons/obj/doors/door_office.dmi';
+	lock_dir = 4
+	},
+/turf/simulated/floor/stairs{
+	dir = 8
+	},
+/area/station/maintenance/solar/south)
 "ryU" = (
 /obj/machinery/power/tracker/east,
 /obj/cable/yellow,
@@ -70280,8 +70180,21 @@
 	dir = 8
 	},
 /area/station/hallway/secondary/exit)
+"rJo" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe/overfloor{
+	dir = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint3";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/central)
 "rJs" = (
-/obj/stool/bench/green/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple/side{
 	dir = 9
 	},
@@ -70335,15 +70248,6 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/ai_monitored/storage/eva)
-"rNV" = (
-/mob/living/carbon/human/npc/monkey,
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/turf/simulated/floor/grass{
-	name = "astroturf"
-	},
-/area/station/medical/dome)
 "rOk" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -70387,15 +70291,14 @@
 /obj/cable,
 /turf/simulated/floor/plating,
 /area/station/security/checkpoint/podbay)
-"rQI" = (
-/obj/table/reinforced/auto,
-/obj/health_scanner/wall{
-	find_in_range = 0;
-	id = "lobby_right"
+"rQO" = (
+/obj/cable{
+	icon_state = "1-4"
+	},
+/obj/disposalpipe/segment/mail/bent/north,
+/turf/simulated/floor/bluewhite{
+	dir = 4
 	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/door/window/northright,
-/turf/simulated/floor/caution/northsouth,
 /area/station/medical/medbay/pharmacy)
 "rRi" = (
 /obj/machinery/door/airlock/pyro/glass/security/alt{
@@ -70416,8 +70319,28 @@
 	},
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/sec_foyer)
+"rRw" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Solar Maintenance";
+	cycle_id = "northsolar"
+	},
+/turf/simulated/floor,
+/area/station/maintenance/solar/north)
 "rSI" = (
 /obj/machinery/atmospherics/pipe/simple/overfloor{
 	dir = 10
@@ -70440,14 +70363,12 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/quartermaster/office)
-"rUk" = (
-/obj/disposalpipe/segment/transport{
+"rUu" = (
+/obj/disposalpipe/segment/morgue{
 	dir = 4
 	},
-/turf/simulated/floor/greenwhite,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "rUK" = (
 /obj/machinery/firealarm/east,
 /obj/machinery/bot/firebot,
@@ -70524,6 +70445,10 @@
 	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/customs)
+"rXL" = (
+/obj/storage/secure/closet/medical/medkit,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "rXW" = (
 /obj/strip_door,
 /obj/disposalpipe/segment{
@@ -70610,6 +70535,30 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/engine,
 /area/station/ai_monitored/armory)
+"rZK" = (
+/obj/machinery/door/airlock/pyro/glass/botany{
+	dir = 8
+	},
+/obj/mapping_helper/access/medlab,
+/obj/mapping_helper/firedoor_spawn,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/cloner)
+"rZM" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
+"sau" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "saH" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	dir = 4;
@@ -70619,31 +70568,19 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/circuit/off,
 /area/station/hangar/main)
+"sbA" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 4;
+	level = 2
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay)
 "scB" = (
 /obj/machinery/atmospherics/pipe/simple/overfloor{
 	dir = 10
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/central)
-"scU" = (
-/obj/table/wood/auto,
-/obj/machinery/power/data_terminal,
-/obj/machinery/computer3/generic/personal{
-	pixel_y = 5
-	},
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 8;
-	name = "autoname - SS13";
-	pixel_x = 10;
-	tag = ""
-	},
-/obj/machinery/firealarm/east,
-/turf/simulated/floor/carpet/arcade,
-/area/station/medical/medbay)
 "seo" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -70656,6 +70593,13 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/medical/medbay/lobby)
+"sft" = (
+/obj/machinery/traymachine/locking/crematorium/medical,
+/obj/machinery/crema_switch/medical{
+	pixel_y = 24
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "sfG" = (
 /obj/storage/cart/mechcart{
 	desc = "A big rolling supply cart equipped for handling hull breaches.";
@@ -70714,10 +70658,29 @@
 	icon_state = "catwalk_cross"
 	},
 /area/station/solar/small_backup1)
-"siL" = (
-/obj/landmark/pest,
-/turf/simulated/floor/plating,
-/area/station/maintenance/south)
+"siW" = (
+/obj/lattice{
+	icon_state = "lattice-dir"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/space,
+/area/space)
+"siZ" = (
+/obj/machinery/disposal,
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/obj/disposalpipe/trunk/north,
+/turf/simulated/floor/bluewhite{
+	dir = 10
+	},
+/area/station/medical/medbay)
 "sju" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/machinery/door/poddoor/pyro/shutters{
@@ -70781,14 +70744,11 @@
 /turf/simulated/floor/airless/plating/catwalk,
 /area/station/catwalk/north)
 "smk" = (
-/obj/disposalpipe/trunk/mail/west,
-/obj/machinery/disposal/mail/autoname/medbay/genetics,
-/turf/simulated/floor/greenwhite{
-	dir = 1
+/obj/cable{
+	icon_state = "2-4"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "smN" = (
 /obj/grille/catwalk,
 /turf/simulated/floor/airless/plating/catwalk{
@@ -70843,13 +70803,22 @@
 	},
 /area/station/catwalk/north)
 "spv" = (
-/obj/machinery/door/airlock/pyro/medical{
-	name = "Morgue"
-	},
+/turf/simulated/floor/blue/side,
+/area/station/medical/medbay/lobby)
+"spM" = (
 /obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/morgue,
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North East Maintenance";
+	cycle_id = "ne_maint"
+	},
+/turf/simulated/floor,
+/area/station/maintenance/northeast)
 "spT" = (
 /obj/decal/poster/wallsign/hazard_coldloop,
 /obj/cable/orange{
@@ -70978,6 +70947,12 @@
 /obj/mapping_helper/access/research,
 /turf/unsimulated/floor/shuttle,
 /area/shuttle/research/outpost)
+"sBM" = (
+/obj/disposalpipe/segment/morgue{
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "sCs" = (
 /obj/cable/orange{
 	icon_state = "1-8"
@@ -71017,23 +70992,10 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/engine/vacuum,
 /area/station/science/lab)
-"sDJ" = (
-/obj/machinery/door/airlock/pyro/glass{
-	id = "medbay_entrance";
-	name = "Medbay Entrance"
-	},
-/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
-	dir = 1
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/obj/disposalpipe/segment/mail/bent/east,
-/turf/simulated/floor,
-/area/station/medical/medbay)
+"sEq" = (
+/obj/machinery/firealarm/east,
+/turf/simulated/floor/blue,
+/area/station/medical/medbay/pharmacy)
 "sEs" = (
 /obj/machinery/door/airlock/pyro/engineering{
 	dir = 4;
@@ -71085,20 +71047,6 @@
 	icon_state = "fred1"
 	},
 /area/station/quartermaster/office)
-"sEP" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/hangar/arrivals)
 "sEZ" = (
 /obj/machinery/door_control{
 	id = "combustion";
@@ -71110,6 +71058,13 @@
 	},
 /turf/simulated/floor/red,
 /area/station/engine/hotloop)
+"sFr" = (
+/obj/landmark/start/job/medical_doctor,
+/obj/stool/chair/office{
+	dir = 4
+	},
+/turf/simulated/floor/white,
+/area/station/medical/medbay/cloner)
 "sFs" = (
 /obj/grille/catwalk,
 /obj/disposalpipe/segment/mail/bent/east,
@@ -71181,30 +71136,18 @@
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/research_outpost)
 "sIT" = (
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/grody,
-/obj/item/reagent_containers/food/snacks/ingredient/meatpaste{
-	desc = "Gross.";
-	name = "old kidney"
-	},
-/obj/item/organ/heart{
-	desc = "A human heart, grody. How long has it been in that freezer?";
-	name = "funky ol' heart"
-	},
-/obj/storage/crate/freezer{
-	name = "Freezer - Spare Parts"
-	},
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/monkeymeat,
-/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat,
-/obj/disposalpipe/segment/morgue{
-	dir = 4
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/toolbox/emergency,
+/obj/item/hand_labeler,
+/obj/table/glass/reinforced/auto,
+/obj/machinery/light/lamp/black,
+/obj/item/clothing/glasses/spectro,
+/turf/simulated/floor/carpet{
+	icon_state = "blue1"
 	},
-/turf/simulated/floor/sanitary/white,
-/area/station/medical/morgue)
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "sJz" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -71244,20 +71187,12 @@
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
 "sLI" = (
-/obj/machinery/computer/pathology{
-	dir = 1
-	},
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 6;
-	name = "autoname - SS13";
-	pixel_y = 20;
-	tag = ""
-	},
-/turf/simulated/floor/greenwhite{
-	dir = 1
-	},
-/area/station/medical/cdc)
+/obj/machinery/disposal/mail/autoname/medbay/genetics,
+/obj/disposalpipe/trunk/mail/north,
+/turf/simulated/floor/greenwhite,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "sLX" = (
 /obj/stool/chair{
 	dir = 1
@@ -71484,12 +71419,21 @@
 /turf/simulated/floor/shuttlebay,
 /area/station/security/checkpoint/podbay)
 "sVP" = (
-/obj/machinery/atmospherics/unary/portables_connector{
-	dir = 4
+/obj/table/auto,
+/obj/item/storage/firstaid/brute{
+	pixel_y = -4
 	},
-/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/item/storage/firstaid/brute{
+	pixel_y = -4
+	},
+/obj/item/storage/firstaid/brute{
+	pixel_y = -4
+	},
+/obj/item/reagent_containers/glass/bottle/epinephrine,
+/obj/item/reagent_containers/glass/beaker/large/brute,
+/obj/item/reagent_containers/dropper,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "sVT" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -71540,6 +71484,12 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/garden)
+"sZT" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "taF" = (
 /obj/machinery/vending/air_vendor/plasma,
 /turf/simulated/floor/shuttlebay,
@@ -71561,6 +71511,9 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
+"tcw" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/staff)
 "tcI" = (
 /obj/disposalpipe/segment/mail/horizontal,
 /obj/table/reinforced/auto,
@@ -71610,6 +71563,24 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
+"tfU" = (
+/obj/machinery/atmospherics/pipe/simple{
+	level = 2
+	},
+/obj/machinery/door/airlock/pyro/external{
+	req_access_txt = "40"
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "East Substation";
+	cycle_id = "eastsubstation"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/engine/substation/east)
 "tgp" = (
 /obj/machinery/atmospherics/pipe/simple/insulated/cold{
 	can_rupture = 0;
@@ -71674,16 +71645,6 @@
 /obj/landmark/pest,
 /turf/simulated/floor/grime,
 /area/station/maintenance/southeast)
-"tjw" = (
-/obj/disposalpipe/segment/transport{
-	dir = 4
-	},
-/obj/machinery/light,
-/obj/disposalpipe/segment/mail/vertical,
-/turf/simulated/floor/greenwhite,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "tkA" = (
 /obj/storage/secure/closet/civilian/hydro,
 /turf/simulated/floor/grass{
@@ -71753,6 +71714,12 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
+"tnJ" = (
+/obj/mapping_helper/wingrille_spawn/auto,
+/obj/window_blinds/cog2/left,
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/plating,
+/area/station/medical/staff)
 "tnY" = (
 /obj/machinery/door/poddoor/pyro/shutters{
 	density = 0;
@@ -72060,6 +72027,18 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
+"tFj" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/cable{
+	icon_state = "2-4"
+	},
+/turf/simulated/floor/white,
+/area/station/science/artifact)
 "tFo" = (
 /obj/machinery/door/airlock/pyro/glass{
 	name = "Research Outpost";
@@ -72067,16 +72046,6 @@
 	},
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/science)
-"tFC" = (
-/obj/table/reinforced/auto,
-/obj/health_scanner/wall{
-	find_in_range = 0;
-	id = "lobby_left"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/door/window/northleft,
-/turf/simulated/floor/caution/northsouth,
-/area/station/medical/medbay/pharmacy)
 "tFI" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/machinery/door/poddoor/pyro/shutters{
@@ -72095,6 +72064,12 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/station/engine/core)
+"tFV" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_north,
+/area/station/medical/medbay/psychiatrist)
 "tGo" = (
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/purple,
@@ -72202,6 +72177,23 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/research_outpost/hangar)
+"tOV" = (
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/blue/fancy/innercorner/south,
+/area/station/medical/head)
+"tPJ" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "South East Maintenance";
+	cycle_id = "se_maint"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/southeast)
 "tQb" = (
 /obj/machinery/conveyor/EW{
 	name = "cargo belt - west";
@@ -72224,6 +72216,19 @@
 	},
 /turf/simulated/floor/shuttlebay,
 /area/station/crew_quarters/captain)
+"tQH" = (
+/obj/table/auto,
+/obj/machinery/door_control{
+	id = "cloning";
+	name = "Cloning Door Control";
+	pixel_x = 24
+	},
+/obj/item/storage/firstaid/brain,
+/obj/item/hand_labeler,
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbay/cloner)
 "tRs" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro{
@@ -72264,15 +72269,26 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "tSS" = (
-/obj/vehicle/segway,
-/obj/machinery/firealarm/east,
-/turf/simulated/floor/bluewhite{
-	dir = 5
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
 	},
-/area/station/medical/medbay)
+/turf/simulated/floor/white,
+/area/station/medical/medbay/cloner)
+"tSW" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "tTd" = (
 /turf/simulated/floor/dirt,
 /area/station/ranch)
@@ -72444,19 +72460,6 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor,
 /area/station/hangar/arrivals)
-"ucg" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Genetic Research";
-	req_access_txt = "9"
-	},
-/obj/disposalpipe/segment,
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medlab,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
 "ucI" = (
 /obj/table/wood/auto,
 /obj/item/paper/book/from_file/monster_manual_revised{
@@ -72472,20 +72475,6 @@
 	icon_state = "blue1"
 	},
 /area/station/crew_quarters/arcade/dungeon)
-"ucP" = (
-/obj/machinery/door/airlock/pyro/external{
-	req_access_txt = "40"
-	},
-/obj/disposalpipe/segment/mail/bent/south,
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/engine/substation/west)
 "ucX" = (
 /obj/machinery/light/emergency,
 /obj/cable{
@@ -72524,8 +72513,30 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/security/checkpoint/customs)
+"uih" = (
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	dir = 4;
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/central)
 "uiJ" = (
 /obj/grille/catwalk{
 	dir = 9
@@ -72557,19 +72568,6 @@
 /area/station/engine/power{
 	name = "Engineering Control Room"
 	})
-"umQ" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/mapping_helper/access/mining,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/mining/magnet)
 "unT" = (
 /obj/decal/poster/wallsign/stencil/right/p{
 	pixel_x = 16
@@ -72582,6 +72580,13 @@
 	},
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/maintenance/northeast)
+"uoU" = (
+/obj/storage/crate/freezer{
+	name = "Freezer - Spare Parts"
+	},
+/obj/random_item_spawner/organs/one_to_three,
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "upY" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -72655,6 +72660,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiairbridge";
+	name = "AI Airbridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/turret_protected/ai_upload_foyer)
 "uuL" = (
@@ -72736,15 +72746,14 @@
 /turf/simulated/floor/grime,
 /area/station/storage/warehouse)
 "uzG" = (
-/obj/machinery/firealarm/north,
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/bluewhite{
-	dir = 1
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite/corner{
+	dir = 8
 	},
-/area/station/medical/medbay)
+/area/station/medical/medbay/lobby)
 "uAn" = (
 /obj/machinery/atmospherics/unary/tank/air_repressurization{
 	dir = 1
@@ -72772,6 +72781,9 @@
 	},
 /turf/simulated/floor/plating/airless,
 /area/station/engine/inner)
+"uBy" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/medbay/surgery)
 "uBS" = (
 /obj/cable/orange{
 	icon_state = "4-8"
@@ -72798,6 +72810,16 @@
 	},
 /turf/simulated/floor/circuit,
 /area/station/turret_protected/ai_upload)
+"uCK" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "uDi" = (
 /obj/machinery/light{
 	dir = 1;
@@ -72821,6 +72843,35 @@
 /obj/lattice,
 /turf/space,
 /area/space)
+"uEZ" = (
+/obj/machinery/atmospherics/unary/cryo_cell,
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbay)
+"uFy" = (
+/obj/table/wood/auto,
+/obj/item/clipboard{
+	pixel_x = 3;
+	pixel_y = 1
+	},
+/obj/item/kitchen/food_box/lollipop{
+	pixel_x = -8;
+	pixel_y = 11
+	},
+/obj/item/pen{
+	rand_pos = 0
+	},
+/obj/machinery/light/incandescent,
+/turf/simulated/floor/carpet/blue/fancy/narrow/T_west,
+/area/station/medical/medbay/psychiatrist)
+"uFR" = (
+/obj/machinery/light/small,
+/obj/storage/crate,
+/obj/random_item_spawner/junk/some,
+/obj/random_item_spawner/tools/some,
+/turf/simulated/floor/grime,
+/area/station/storage/auxillary)
 "uGM" = (
 /obj/cable/yellow{
 	icon_state = "2-4"
@@ -72831,17 +72882,6 @@
 	icon_state = "catwalk_cross"
 	},
 /area/listeningpost/solars)
-"uGN" = (
-/obj/machinery/door/airlock/pyro/external{
-	dir = 4
-	},
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/mapping_helper/firedoor_spawn,
-/obj/cable/orange{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/caution/westeast,
-/area/station/maintenance/central)
 "uGQ" = (
 /obj/mapping_helper/firedoor_spawn,
 /obj/machinery/door/airlock/pyro/external{
@@ -72932,6 +72972,28 @@
 	dir = 10
 	},
 /area/station/catwalk/north)
+"uLA" = (
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
+"uMd" = (
+/obj/landmark/gps_waypoint,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 5
+	},
+/area/station/medical/medbay/lobby)
 "uMg" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -73087,18 +73149,8 @@
 /turf/simulated/floor,
 /area/station/crew_quarters/garden)
 "uTS" = (
-/obj/machinery/door/airlock/pyro/glass{
-	name = "Operating Theater"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access/medical,
-/obj/decal/stripe_delivery,
-/turf/simulated/floor,
-/area/station/medical/medbay/surgery)
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/medbay/reception)
 "uUh" = (
 /obj/railing/orange/reinforced{
 	dir = 8
@@ -73383,6 +73435,13 @@
 /obj/mapping_helper/access/tox_storage,
 /turf/simulated/floor/plating,
 /area/station/science/storage)
+"vtW" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/plating,
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "vun" = (
 /obj/grille/catwalk{
 	dir = 6
@@ -73417,9 +73476,16 @@
 /turf/simulated/floor,
 /area/station/routing/security)
 "vxs" = (
-/obj/machinery/vending/jobclothing/medical,
+/obj/machinery/computer3/generic/med_data{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/light_switch/west,
+/obj/machinery/power/data_terminal,
 /turf/simulated/floor/blue,
-/area/station/medical/medbay)
+/area/station/medical/medbay/pharmacy)
 "vyj" = (
 /obj/table/auto,
 /obj/item/plate,
@@ -73598,6 +73664,15 @@
 /obj/machinery/portable_atmospherics/canister/air/large,
 /turf/simulated/floor/plating,
 /area/station/maintenance/central)
+"vHo" = (
+/obj/machinery/atmospherics/pipe/simple{
+	dir = 9;
+	level = 2
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbay)
 "vHu" = (
 /obj/grille/catwalk{
 	dir = 9
@@ -73638,6 +73713,10 @@
 /obj/machinery/firealarm/east,
 /turf/simulated/floor/caution/corner/ne,
 /area/station/engine/hotloop)
+"vIi" = (
+/obj/machinery/light_switch/west,
+/turf/simulated/floor/carpet/blue/fancy/narrow/sw,
+/area/station/medical/medbay/psychiatrist)
 "vIv" = (
 /obj/cable/yellow,
 /obj/cable/yellow{
@@ -73678,6 +73757,14 @@
 	},
 /turf/simulated/floor,
 /area/station/maintenance/central)
+"vNL" = (
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 1
+	},
+/turf/simulated/floor/bluewhite/corner{
+	dir = 1
+	},
+/area/station/medical/medbay/lobby)
 "vNO" = (
 /obj/chicken_nesting_box,
 /obj/machinery/light{
@@ -73772,7 +73859,7 @@
 /turf/space,
 /area/space)
 "vWT" = (
-/obj/stool/bench/green/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/science)
 "vXc" = (
@@ -73803,6 +73890,18 @@
 	dir = 9
 	},
 /area/station/medical/medbay/lobby)
+"wab" = (
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/machinery/power/apc{
+	areastring = "Medical Storage";
+	dir = 8;
+	name = "Medical Storage APC";
+	pixel_x = -24
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "wat" = (
 /obj/machinery/door/airlock/pyro/engineering{
 	dir = 4
@@ -73894,8 +73993,16 @@
 	},
 /obj/mapping_helper/access/hydro,
 /obj/decal/stripe_caution,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hydro";
+	name = "Hydroponics";
+	enter_id = "side"
+	},
 /turf/simulated/floor,
 /area/station/crew_quarters/catering)
+"wge" = (
+/turf/simulated/floor/redwhite/corner,
+/area/station/medical/medbay/surgery)
 "wgf" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -73910,17 +74017,17 @@
 /turf/simulated/floor,
 /area/research_outpost)
 "wgO" = (
-/obj/stool/chair{
+/obj/disposalpipe/segment/transport{
 	dir = 4
 	},
-/obj/disposalpipe/segment/transport,
-/obj/landmark/start/job/geneticist,
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/obj/cable{
+	icon_state = "4-8"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/obj/disposalpipe/segment/vertical,
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
 "wiF" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4
@@ -73962,22 +74069,13 @@
 /turf/simulated/floor/black,
 /area/station/science/lab)
 "wmJ" = (
-/obj/shrub,
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
 /obj/disposalpipe/segment/transport{
-	dir = 1;
 	icon_state = "pipe-c"
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 10
+/turf/simulated/floor/grass{
+	name = "astroturf"
 	},
-/area/station/medical/research{
-	name = "Genetic Research"
-	})
+/area/station/medical/dome)
 "wmO" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -73990,15 +74088,22 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
-"wnU" = (
-/obj/submachine/chef_sink/chem_sink{
-	dir = 4;
-	pixel_x = -8
+"wnQ" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
 	},
-/turf/simulated/floor/greenwhite{
-	dir = 8
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North East Maintenance";
+	cycle_id = "ne_maint2"
 	},
-/area/station/medical/cdc)
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/northeast)
 "wor" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/atmospherics/binary/valve/purge{
@@ -74075,7 +74180,12 @@
 /area/station/engine/hotloop)
 "wsk" = (
 /obj/table/reinforced/chemistry/auto/auxsup,
-/obj/item/paper/labdrawertips,
+/obj/item/paper/book/from_file/pharmacopia{
+	pixel_y = 6
+	},
+/obj/item/paper/labdrawertips{
+	pixel_x = 8
+	},
 /turf/simulated/floor/purplewhite/corner{
 	dir = 4
 	},
@@ -74148,17 +74258,6 @@
 	dir = 1
 	},
 /area/station/hallway/secondary/exit)
-"wyz" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/firedoor_spawn,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/maintenance/solar/south)
 "wBK" = (
 /obj/disposalpipe/segment/mineral{
 	dir = 4
@@ -74171,6 +74270,13 @@
 	icon_state = "engine_caution_north"
 	},
 /area/station/mining/staff_room)
+"wBV" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "wBY" = (
 /obj/overlay{
 	icon = 'icons/misc/beach2.dmi';
@@ -74198,6 +74304,28 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
 /area/station/mining/magnet)
+"wEd" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/machinery/power/apc/autoname_east,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
+"wEk" = (
+/obj/stool/chair/blue{
+	dir = 8
+	},
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbay)
+"wFc" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/carpet/blue,
+/area/station/medical/medbay/psychiatrist)
 "wGP" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/black,
@@ -74223,17 +74351,6 @@
 /obj/item/wrench,
 /turf/simulated/floor/plating,
 /area/station/engine/substation/east)
-"wHJ" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/mapping_helper/access/mining,
-/obj/decal/stripe_delivery,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor,
-/area/station/mining/staff_room)
 "wIl" = (
 /obj/machinery/firealarm/north,
 /obj/disposalpipe/segment/mail/horizontal,
@@ -74302,6 +74419,15 @@
 	},
 /turf/simulated/floor/airless/plating/catwalk,
 /area/station/com_dish/auxdish)
+"wOq" = (
+/obj/stool/chair{
+	dir = 8
+	},
+/obj/cable{
+	icon_state = "1-4"
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "wPk" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -74442,15 +74568,20 @@
 /turf/space,
 /area/space)
 "wXE" = (
-/obj/rack,
-/obj/item/clothing/suit/hazard/paramedic,
-/obj/item/clothing/glasses/healthgoggles,
-/obj/item/storage/belt/medical,
-/obj/disposalpipe/segment/morgue,
-/turf/simulated/floor/bluewhite{
-	dir = 5
+/obj/table/auto,
+/obj/item/clipboard,
+/obj/item/reagent_containers/dropper/mechanical{
+	pixel_x = 11
 	},
-/area/station/medical/medbay)
+/obj/item/storage/box/stma_kit{
+	pixel_x = -8
+	},
+/obj/item/storage/wall/medical{
+	dir = 1;
+	pixel_y = 32
+	},
+/turf/simulated/floor/black,
+/area/station/medical/medbay/reception)
 "wXK" = (
 /obj/machinery/conveyor/SN{
 	name = "cargo belt - north";
@@ -74588,12 +74719,29 @@
 /obj/mapping_helper/access/engineering_storage,
 /turf/simulated/floor/plating,
 /area/station/engine/inner)
+"xgh" = (
+/obj/submachine/chef_sink/chem_sink{
+	dir = 8;
+	pixel_x = 4
+	},
+/obj/stool/bed/moveable,
+/obj/item/clothing/suit/bedsheet,
+/turf/simulated/floor/sanitary/blue,
+/area/station/medical/morgue)
 "xha" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 1
 	},
 /turf/simulated/floor/grey/blackgrime,
 /area/station/hangar/catering)
+"xia" = (
+/obj/machinery/light/incandescent,
+/obj/disposalpipe/segment/morgue{
+	dir = 8;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/medbay,
+/area/station/medical/medbay/lobby)
 "xij" = (
 /obj/machinery/door/airlock/pyro/classic{
 	name = "Bathroom"
@@ -74687,6 +74835,9 @@
 	dir = 1
 	},
 /area/station/hangar/qm)
+"xoD" = (
+/turf/simulated/floor/bluewhite/corner,
+/area/station/medical/medbay/lobby)
 "xoE" = (
 /obj/machinery/door/airlock/pyro/classic{
 	dir = 4;
@@ -74739,6 +74890,16 @@
 /area/station/engine/power{
 	name = "Engineering Control Room"
 	})
+"xte" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/disposalpipe/segment/morgue{
+	dir = 1;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "xuf" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -74753,6 +74914,15 @@
 /obj/item/swingsignfolded,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
+"xuy" = (
+/obj/machinery/computer/genetics,
+/obj/disposalpipe/segment/transport,
+/turf/simulated/floor/greenwhite{
+	dir = 1
+	},
+/area/station/medical/research{
+	name = "Genetic Research"
+	})
 "xvB" = (
 /obj/table/reinforced/auto,
 /obj/machinery/light/lamp/black,
@@ -74794,6 +74964,9 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
+"xwY" = (
+/turf/simulated/floor/carpet/blue/fancy/innercorner/south,
+/area/station/medical/head)
 "xxx" = (
 /obj/machinery/conveyor/WE{
 	name = "cargo belt - east";
@@ -74814,6 +74987,10 @@
 	},
 /turf/simulated/floor/orangeblack,
 /area/station/maintenance/central)
+"xyo" = (
+/obj/machinery/vending/cards,
+/turf/simulated/floor/carpet/arcade,
+/area/station/medical/staff)
 "xyL" = (
 /obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
 	dir = 4
@@ -74872,6 +75049,18 @@
 	},
 /turf/simulated/floor/caution/westeast,
 /area/station/routing/depot)
+"xDG" = (
+/obj/storage/crate,
+/obj/random_item_spawner/med_tool/some,
+/obj/random_item_spawner/medicine,
+/obj/random_item_spawner/med_kit/two,
+/obj/random_item_spawner/desk_stuff/some,
+/obj/machinery/light/small{
+	dir = 1;
+	pixel_y = 21
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "xDX" = (
 /obj/machinery/door/airlock/pyro/glass{
 	dir = 4;
@@ -74923,6 +75112,12 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/science/lab)
+"xFT" = (
+/obj/machinery/firealarm/south,
+/turf/simulated/floor/blue/side{
+	dir = 6
+	},
+/area/station/medical/medbay/surgery/storage)
 "xGk" = (
 /obj/table/wood/auto,
 /obj/decal/cleanable/desk_clutter,
@@ -75014,6 +75209,21 @@
 	},
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/showers)
+"xJS" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint4";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/central)
 "xJW" = (
 /obj/machinery/portable_atmospherics/scrubber,
 /turf/simulated/floor/plating,
@@ -75055,6 +75265,22 @@
 /obj/decal/stripe_caution,
 /turf/simulated/floor,
 /area/station/crew_quarters/cafeteria)
+"xPe" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/disposalpipe/segment/mail/horizontal,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint4";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/caution/westeast,
+/area/station/maintenance/central)
 "xPA" = (
 /obj/machinery/door/airlock/pyro/maintenance{
 	dir = 4
@@ -75075,6 +75301,14 @@
 /obj/decal/stripe_delivery,
 /turf/simulated/floor,
 /area/station/engine/coldloop)
+"xRn" = (
+/obj/table/auto,
+/obj/item/cigpacket,
+/obj/item/matchbook{
+	pixel_x = 4
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/maintenance)
 "xRs" = (
 /obj/disposalpipe/segment,
 /obj/grille/catwalk,
@@ -75125,6 +75359,33 @@
 /obj/machinery/firealarm/west,
 /turf/simulated/floor/grime,
 /area/station/crew_quarters/quarters_west)
+"xVw" = (
+/obj/stool/chair/comfy/wheelchair,
+/obj/disposalpipe/segment/transport,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/blue/side{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery/storage)
+"xVH" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/disposalpipe/segment/mail/vertical,
+/obj/disposalpipe/segment/mail/horizontal,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Central Maintenance";
+	cycle_id = "c_maint3";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/caution/northsouth,
+/area/station/maintenance/central)
 "xWy" = (
 /obj/machinery/computer/operating{
 	id = "robotics"
@@ -75171,18 +75432,6 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/plating,
 /area/station/maintenance/north)
-"xYY" = (
-/obj/machinery/door/airlock/pyro/external,
-/obj/disposalpipe/segment/mail/vertical,
-/obj/disposalpipe/segment/mail/horizontal,
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
-/turf/simulated/floor/caution/northsouth,
-/area/station/maintenance/central)
 "xZN" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -75222,6 +75471,24 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/ranch)
+"yby" = (
+/turf/simulated/wall/auto/supernorn,
+/area/station/medical/medbay/psychiatrist)
+"ybT" = (
+/obj/machinery/power/apc{
+	areastring = "Psychiatrist's Office";
+	dir = 1;
+	name = "Psychiatrist's APC";
+	pixel_y = 24
+	},
+/obj/cable{
+	icon_state = "0-4"
+	},
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/south)
 "ycs" = (
 /obj/machinery/atmospherics/binary/valve/notify_admins{
 	dir = 1;
@@ -75238,6 +75505,23 @@
 /obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
 /turf/simulated/floor/engine/vacuum,
 /area/station/science/lab)
+"ydA" = (
+/obj/machinery/door/airlock/pyro/external{
+	req_access_txt = "40"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	name = "East Substation";
+	cycle_id = "eastsubstation"
+	},
+/turf/simulated/floor,
+/area/station/engine/substation/east)
 "ydC" = (
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4;
@@ -75247,6 +75531,13 @@
 /obj/mapping_helper/access/security,
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
+"ydT" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/machinery/atmospherics/pipe/simple/color_pipe/cyan_pipe{
+	dir = 4
+	},
+/turf/simulated/floor/plating,
+/area/station/medical/medbay/pharmacy)
 "ydX" = (
 /obj/grille/catwalk{
 	dir = 4
@@ -75312,15 +75603,17 @@
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "yfA" = (
-/obj/machinery/disposal/mail/small{
-	mail_tag = "medbay";
-	mailgroup = "medbay";
-	mailgroup2 = "medresearch";
-	name = "Medbay"
+/obj/stool/chair/office{
+	dir = 8
+	},
+/obj/landmark/start/job/medical_doctor,
+/obj/machinery/door_control{
+	id = "medbay_entrance";
+	name = "Medbay Door Control";
+	pixel_x = -24
 	},
-/obj/disposalpipe/trunk/mail/west,
 /turf/simulated/floor/black,
-/area/station/medical/medbay/pharmacy)
+/area/station/medical/medbay/reception)
 "yfB" = (
 /obj/disposalpipe/segment/produce,
 /turf/simulated/floor/grass{
@@ -75358,6 +75651,15 @@
 	dir = 8
 	},
 /area/listeningpost)
+"yhb" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/turf/simulated/floor/bluewhite{
+	dir = 4
+	},
+/area/station/medical/medbay/pharmacy)
 "yhA" = (
 /obj/machinery/door/airlock/pyro/external{
 	name = "Outpost Shuttle Dock"
@@ -75375,6 +75677,11 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor,
 /area/station/medical/medbay/lobby)
+"yiu" = (
+/turf/simulated/floor/redwhite/corner{
+	dir = 1
+	},
+/area/station/medical/medbay/surgery)
 "yiC" = (
 /obj/machinery/conveyor/SN{
 	name = "cargo belt - north";
@@ -89298,9 +89605,9 @@ eiS
 eiS
 eiS
 eiS
-qWG
+qzh
 jKt
-fLu
+qXR
 euV
 aaF
 ani
@@ -101229,7 +101536,7 @@ azn
 aCd
 aDl
 qlm
-qNC
+awf
 awf
 awf
 qlm
@@ -104337,7 +104644,7 @@ cJa
 cKL
 cMk
 cNE
-drV
+cSk
 cQu
 cQu
 cQu
@@ -105245,10 +105552,10 @@ uWH
 qVW
 cPc
 cPb
-cSk
+kpd
 cTD
 cVg
-cWj
+tFj
 cXD
 cYO
 cZE
@@ -105848,8 +106155,8 @@ nvi
 cMp
 fhv
 cPe
+eOR
 cQy
-rfG
 cTF
 cVi
 cWl
@@ -106040,9 +106347,9 @@ iKL
 acD
 wrf
 ezz
-agK
+qrL
 ahl
-mdD
+rRw
 aeT
 ajR
 alc
@@ -106144,14 +106451,14 @@ cuH
 cDt
 clg
 cGA
-cHW
-cHW
-cHW
-cMq
-cMq
-cHW
-nHY
-cHW
+cSy
+cSy
+cSy
+cSy
+cSy
+cSy
+cSy
+hLF
 cTD
 cTD
 cTD
@@ -106162,9 +106469,9 @@ cTD
 cTD
 cZt
 dcg
-wyz
+mzr
 ddt
-deb
+kjV
 rhv
 yeg
 dgV
@@ -106446,7 +106753,7 @@ cBZ
 cDu
 clg
 cGB
-cHZ
+cSy
 cJg
 cKP
 cMr
@@ -106454,14 +106761,14 @@ cNJ
 liV
 cQA
 cSn
-cTG
+rXL
 mCf
 vxs
 cXG
 cYQ
 cZH
 sVP
-cHZ
+cGJ
 dac
 dch
 ddh
@@ -106690,7 +106997,7 @@ eNc
 aaF
 aaB
 bgA
-jNE
+nQK
 bgA
 bgA
 jOP
@@ -106722,7 +107029,7 @@ byI
 cbC
 bgA
 bgA
-jNE
+iaT
 bgA
 aaB
 aaF
@@ -106748,27 +107055,27 @@ cuH
 cDv
 cFj
 cGC
-cHZ
+cSy
 cJh
 cKQ
 cMs
-cMC
-cMC
+efL
+tOV
 cQB
 cSo
-cTG
+kIL
+cVk
+efm
+hdq
 cVk
-cMC
-cMC
-cMC
 cZI
 daH
-cHZ
+cGJ
 dad
 dcA
 dcg
 dcg
-deg
+dcg
 det
 dfq
 dfT
@@ -107050,26 +107357,26 @@ cuH
 cDw
 cFk
 cGD
-cHZ
+cSy
 cJi
 cKR
-cMt
-cNK
-cPg
+oUl
+pgN
+hKe
 jrl
 cSp
 qiA
-cVl
-cPg
+yhb
+rab
 cXH
-cMt
+rQO
 cZJ
 daI
-cHZ
+cGJ
 daq
 dcB
-ddp
-gKz
+deh
+deh
 deh
 deL
 deh
@@ -107294,7 +107601,7 @@ eNc
 aaI
 aaa
 sOs
-jGF
+riZ
 bgA
 bjx
 lkY
@@ -107326,7 +107633,7 @@ toG
 kSc
 xJW
 bgA
-jGF
+uih
 sOs
 aaa
 aam
@@ -107352,26 +107659,26 @@ cYH
 cDx
 cFl
 cGE
-cHZ
+cSy
 cJj
-cKS
-cMu
+efL
 cNL
-cPg
+cNL
+xwY
 cQD
 cSq
-cTG
+gkd
 dcf
-cPg
-cQC
-cYQ
 cZK
+gXa
+eMz
+sEq
 daJ
-cHZ
+cGJ
 iOp
 jVt
-cHZ
 ddv
+ryB
 ddv
 deM
 dcg
@@ -107654,27 +107961,27 @@ cCb
 cDy
 cFm
 cAL
-cHZ
-cHZ
-cHZ
-cHZ
+cSy
+qmO
+ica
+gsJ
 cNM
-cPg
-cQE
-cSr
-qSU
-cSr
-cSr
-cXI
-cYR
-cYR
+gqN
+cSy
+cGJ
+cGJ
+cGI
+lmZ
+ydT
 cYR
-pgI
+cGI
+cGI
+cGJ
 dcG
 ddO
-deu
+ddv
 deX
-dds
+ddv
 deT
 dcg
 dcA
@@ -107954,31 +108261,31 @@ czf
 cAA
 cCc
 cAL
-cFn
-cGG
-cIa
-lwF
+cFm
+cId
+cSy
+cSy
 cKT
 cMv
 cNN
-cPh
-cQF
-cWX
+cSy
+cSy
+cTG
 cTI
 cVn
-cWm
+cMC
 cXJ
 cYS
 cZL
 daK
 cMt
 dcH
-ddP
-cPg
+lEO
+ddv
 deY
-dds
+ddv
 deU
-dcg
+oDm
 dcA
 dgq
 dds
@@ -108255,31 +108562,31 @@ cxJ
 ddJ
 cAB
 cCd
-cDz
-cFo
-cGH
-cGH
-sDJ
+cAL
+cFm
+cAL
+kfF
+cxN
 cKU
-cMw
+xoD
 cMw
 cPi
 cQG
-cSt
-cSv
-cSv
-cSv
-pCJ
-cSv
-cSv
-cSv
-cSt
-dcI
-ddQ
-dev
-deZ
-ddv
-ddv
+cTG
+cNS
+cPg
+cPg
+mUH
+mhP
+lGZ
+jRM
+uBy
+uBy
+uBy
+uBy
+uBy
+uBy
+uBy
 ddv
 vCd
 ddh
@@ -108557,19 +108864,19 @@ cxJ
 czh
 cAC
 cCe
-cDA
-cFm
-cGI
-cGI
+cAL
+kXl
+tSW
+tSW
 nlY
-cGI
-cGI
-cGJ
+dGI
+lRi
+uMd
 uzG
 cQH
 cSu
 cTJ
-cVo
+cWn
 cWn
 cXL
 cYT
@@ -108581,11 +108888,11 @@ ddR
 dev
 dfa
 dfC
-cHZ
+uBy
 dfZ
 cLH
-cqE
-aaI
+dgs
+aFb
 aaa
 aam
 uUX
@@ -108859,35 +109166,35 @@ cxK
 czi
 cAD
 cCf
-cDB
+lst
 cFp
-cGJ
-cIb
+cGH
+cGH
 cJm
 cKV
 cMx
 cNO
-cNS
+vNL
 cQI
-cSt
+oSG
 dhs
-cVp
-cVp
+cSr
+cSr
 cXM
-cVp
-cZN
+ddP
+cZM
 daM
 cSt
 dfu
-cPg
-cPg
-cPg
+wge
+cVp
+nJi
 dfD
-cHZ
+uBy
 dgr
 cLH
-cqE
-aaI
+dgs
+aFb
 aaa
 aam
 oMX
@@ -109162,34 +109469,34 @@ kYs
 cAE
 cCg
 cDA
-cFq
-tFC
-cIc
-cJn
+cAL
+cAL
+cAL
+cxN
 cKW
 cMy
-cGJ
+jTZ
 aIm
-cQI
-cSv
+oyo
+cTG
 cTL
-cVp
-cWo
-cXN
-dhA
-cVp
-daN
+wEk
+cNK
+jpw
+ddP
+cZM
+cQC
 cSv
-dcL
-cPg
+dfu
+cVp
 dew
-cPg
+cVp
 dfE
-cHZ
-dgs
+rfK
+cuW
 cLH
-cqE
-aaI
+cuW
+aFb
 aaa
 dgD
 kiZ
@@ -109461,37 +109768,37 @@ coz
 cwl
 cxM
 yhO
-cAF
+ePl
 cCh
 cDC
 cFr
-jQa
-cId
-cJo
+cAL
+dyy
+uTS
 cKX
 cMz
 lmh
 cPk
-cQJ
 uTS
-cTM
-dfr
+uTS
+cTG
+cTG
 leN
-cXO
+cXN
 cVq
 dfr
 daO
 hBJ
 dcM
-cPg
+klH
 dex
-cPg
+cVp
 dfF
-cHZ
-dgs
-cLH
-cqE
-aaI
+uBy
+pmo
+dgv
+cuW
+aFb
 aaa
 dgD
 kiZ
@@ -109766,33 +110073,33 @@ sfr
 cAG
 cCi
 cDA
-cFs
-rQI
-cIe
+cAL
+cAL
+cAL
 cJp
 cKY
 yfA
-cGJ
-cPl
-cQI
-cSv
+jMb
+jMb
+lFI
+ozR
 cTN
-cVp
+pcG
 dfM
-aTi
-cVp
-cVp
+jpw
+ddP
+cZM
 daP
-cSv
+cSt
 dcK
-cPg
-dey
-cPg
-dfE
-cHZ
-siL
+nom
+cVp
+yiu
+iHY
+uBy
+deo
 cLH
-cqE
+cuW
 cqE
 aaa
 dgD
@@ -110068,31 +110375,31 @@ czi
 cAD
 cAG
 cDB
-cFt
-cGJ
-cIf
+cCi
+cAL
+cAL
 lhG
 cKZ
-cMA
-cNO
-cPm
+jMb
+jMb
+jMb
 cQK
-cSx
+ozR
 cTO
-cVr
-cWp
-dfY
-dhB
+sbA
+cPg
+cXN
+dhA
 cVr
 daQ
-cSv
+uBy
 dcN
-cPg
-cPg
-cPg
-cQC
-cHZ
-dar
+rln
+opr
+hIe
+oiN
+uBy
+dgt
 cLH
 cuW
 cqE
@@ -110370,31 +110677,31 @@ czl
 cAH
 cCj
 cDA
-cFu
-cGN
-cGN
+cAF
+cAL
+cAL
 cJr
 cGN
 cMB
-cGJ
-cPn
-cQI
-cSv
-cTP
-cVp
-cVp
-cVp
-cVp
-cVp
+cMB
+cMB
+uLA
+rml
+jnX
+kNe
+daT
+hAO
+ldY
+cVr
 daR
-cSv
-dcO
-cXH
-dez
-dfb
-dfG
-cHZ
-dgt
+uBy
+uBy
+uBy
+uBy
+uBy
+uBy
+uBy
+cMW
 cLH
 cuW
 dgL
@@ -110672,16 +110979,16 @@ czm
 cAI
 cCd
 cDA
-cFv
+cAG
 cGG
 cIg
-cHZ
+ozR
 brz
-cPw
-cPw
-cPo
-cQI
-cSv
+jMb
+jMb
+jMb
+jMb
+ozR
 cTQ
 cVs
 cWq
@@ -110689,14 +110996,14 @@ cXR
 dgO
 hYe
 daS
-cSv
+siZ
 dcP
 ddK
-cTG
-cTG
-cTG
-cHZ
-cHZ
+fcs
+uFy
+nBB
+vIi
+yby
 cLH
 cuW
 dgL
@@ -110974,31 +111281,31 @@ czn
 ddL
 cCk
 cDD
-cFw
 cGO
+nmJ
 cIh
-cJs
+uTS
 wXE
-cMD
+jMb
 cNQ
 cPp
-cQI
-cSy
-cSy
-cSy
-cWr
+qoF
+ozR
+uEZ
+vHo
+cNK
 cXS
-cYU
-cSy
-cSy
+lhP
+cZM
+cPg
 dbI
-dcK
-ddK
-cTG
+dcP
+mDB
+pim
 dfc
 dfe
 dga
-cHZ
+yby
 cLH
 cuW
 cqE
@@ -111275,32 +111582,32 @@ coE
 czo
 cAC
 cCe
-cDA
+ivi
 cFx
-cGP
-cHZ
-cHZ
-cHZ
+xia
+cMP
+cMP
+cLj
+eQT
+cLj
+cMP
+cMP
 cHZ
-cNR
-cPq
-cQI
-cSy
-rby
-cVt
+cTG
+cTG
 cWs
 cXT
 enQ
 cZP
 daT
 dbJ
-dcK
-cQC
-cTG
-dfe
-dfe
-dgb
-cHZ
+qIv
+tFV
+dNz
+wFc
+oJc
+dga
+rfK
 cLH
 cuW
 cqE
@@ -111577,33 +111884,33 @@ coE
 oRM
 olE
 cAL
-cDA
-cFy
-cGQ
-cHZ
+sau
+cGP
+cAL
+cLj
 cJt
-pzu
 iuF
-cNS
+iuF
+osd
 cPr
-cQL
+cLj
 oXu
-cTS
-cVu
-cWt
+cMC
+cMC
+dfM
 cXU
-cYW
-cZQ
-daU
+lhP
+cZM
+cPg
 dbK
-dcK
-cQC
+dcP
+otO
 oAv
-dfe
-dfe
-dgc
-mSY
-dgv
+owx
+pmW
+ktx
+yby
+ybT
 cuW
 cqE
 aaa
@@ -111882,29 +112189,29 @@ wGP
 kid
 cFz
 cGR
-cHZ
+cLj
 cJu
-cLd
-cHZ
+mbH
+los
 tSS
 cPs
 cQM
-cSy
+cTP
 cTT
-cVv
+cWu
 cWu
 cXV
 cYX
 cZR
 daV
 dbL
-dcQ
+dcP
 ddS
-cTG
+fPk
 dff
-dfe
+iJN
 dgd
-cHZ
+yby
 cLH
 cuW
 cqE
@@ -112184,29 +112491,29 @@ lGA
 cDJ
 cFA
 dcE
-cIi
+pYP
 cJv
-cJv
-cIi
-cNU
+mbH
+sFr
+mbH
 oUh
-cQN
-cSA
-cTU
-cTU
-cWv
+cLj
+cNS
+cQC
+cTG
+cTG
 cXW
 cYY
 cTU
-daW
-cUb
-kuZ
-ddT
-cUb
-dfg
-dfe
-scU
-cHZ
+cTG
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
 cLH
 cuW
 cqE
@@ -112483,32 +112790,32 @@ cxP
 csd
 cAN
 haq
-cDJ
+rhQ
 cFB
-ddq
-cIi
-cJw
-cJy
+spv
+cLj
+tQH
+ggg
 cMF
 cNV
 cOh
-cQO
+cLj
 cNU
 iwc
-wnU
+cHZ
 jhE
 gLL
 hZV
 ffP
 khR
+cIi
 cUb
-dcS
 ddU
 cUb
-cqE
-cqE
-cqE
-cqE
+hfb
+hnv
+cIi
+cIi
 cLH
 cuW
 cqE
@@ -112788,29 +113095,29 @@ wGP
 cDG
 cFB
 ddb
-cIi
-cJx
-cJy
-cJw
-cJy
-cOh
-cQP
-cNU
-klL
-cVx
-cVx
-cVx
+cLj
+cMP
+cMP
+cLj
+cLj
+rZK
+cLj
+cHZ
+cHZ
+cHZ
+jYG
+kbB
 cZa
 cZT
 pXX
-dbM
+cIi
 dcT
-ddV
+ddU
 cUb
-cuW
-cuW
-dgf
-cqE
+dKy
+rUu
+gqf
+cIi
 dgB
 cuW
 cqE
@@ -113090,29 +113397,29 @@ coE
 cDH
 cFB
 cGW
-cIj
-cJw
-cJy
+gkT
+cSG
+hOD
 cJw
-cJy
-cOh
+cQQ
+mlC
 cQQ
 cSB
 evi
-cVy
+cSE
 cVy
 cXY
 cZb
 cZU
 pdJ
-dbN
+cIi
 dcU
 ddW
-cUb
-cuW
-cuW
-cuW
-cqE
+kOi
+ecI
+rUu
+qUF
+cIi
 cLH
 cuW
 dgL
@@ -113391,31 +113698,31 @@ cAN
 jHR
 cDG
 cFB
-cGW
+fUs
 spv
+gcw
+iMH
 cJy
-cJy
-cJy
-oHZ
-cOh
-cQR
-cNU
+cWB
+cYc
+cYc
+jvY
 sLI
-cVz
+cSG
 nKf
 cXZ
 cZc
 cZV
 eIU
 dbO
-dcV
-ddW
-cUb
-cuW
-cuW
-cuW
+jGE
+oKd
+oKd
+isw
+sBM
+ePC
 fiJ
-cLH
+xte
 cuW
 dgL
 aaa
@@ -113693,31 +114000,31 @@ cAN
 coE
 qja
 cFB
-cGW
-cIj
-cJz
-cLe
-cMG
+fUs
+spv
+cSG
+dOA
+cJy
 cNW
 cPu
 sIT
-cNU
+nIZ
 kXx
-cVx
-cVx
-cVx
+vtW
+xVw
+mNS
 cVz
 cVx
-eIU
-dbP
-dcW
-ddW
-cUb
-cuW
-cuW
-cuW
-cqE
-cLH
+rhR
+cIi
+sZT
+gOd
+gOd
+kVf
+isw
+fvr
+cIi
+cyy
 cuW
 dgL
 aah
@@ -113993,17 +114300,17 @@ cxR
 czu
 cAS
 dZO
-cDJ
+rhQ
 cFB
 cGX
-cIi
-cIi
+oAF
+eGJ
 itH
 cMH
 cNX
 cPv
 cQT
-cNU
+flC
 lrL
 pcF
 lNu
@@ -114011,15 +114318,15 @@ byE
 rbC
 nkn
 jhT
-dbQ
+cIi
 dcX
 ddX
-cUb
-cuW
-cuW
-cuW
-cqE
-cLH
+xgh
+hQN
+ejF
+gFI
+cIi
+cyy
 cuW
 cqE
 aaa
@@ -114296,32 +114603,32 @@ czv
 dce
 wGP
 cDK
-cFB
+eXp
 cGY
 cIl
-cIi
-cIi
-cIi
+vtW
+xuy
+ddI
 cNY
 qOh
 cIj
-cNU
-cUb
-cUb
-cWy
-cWy
+mdC
+jMq
+vtW
+hTn
 cWy
-cUb
-cUb
-cUb
-fDU
-cUb
-cUb
-cqE
-cqE
-cqE
-cqE
-cLH
+ddg
+dgy
+jkg
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
+cIi
+cyy
 cuW
 cqE
 aaa
@@ -114599,31 +114906,31 @@ cAU
 cCo
 cDL
 cFC
-cGZ
+cxM
 cIm
-cJA
+cSG
 cLg
 cMI
 cNZ
-cPy
+amR
 cQU
-cSC
+tZU
 oKm
 jUl
 wgO
 hZW
-acs
+ddg
 nct
 wmJ
-cSE
-rtg
+kAS
 ddY
-deD
-dfk
-ddd
 pVq
 ddg
-cLH
+cuW
+cuW
+dgf
+cMW
+cyy
 cuW
 cqE
 aaa
@@ -114903,29 +115210,29 @@ cDM
 cFD
 cHa
 cIn
-iFE
-cLh
 cMJ
-cOa
-cPz
-cQV
-ucg
-itE
-cVC
-cWA
-cWA
-cZf
-cWA
-rUk
-cSG
-put
+cMJ
+cMJ
+cSE
+cSE
+cSE
+cSE
+cSE
+cSE
+cgL
+cWy
+dgy
+uKJ
 ddd
-deE
 ddd
 ddd
 dgi
-dgy
-cLH
+ddg
+cuW
+cuW
+cuW
+cMW
+cyy
 dgF
 dgL
 aaa
@@ -115205,29 +115512,29 @@ cDN
 cFE
 cHb
 ebY
-cJC
-cLi
+chj
+aaa
 cMK
 cOb
 cPA
 cQW
-cSE
-dOA
+rsw
+gLn
 cVD
-cWB
-cYc
-cYc
+hXl
+cWy
+dgy
 cZY
-rUk
-cSG
-dfX
-ddd
-rNV
+uKJ
 dfl
 uKJ
 dgj
-dgy
-cLH
+ddg
+cuW
+cuW
+cuW
+oDb
+cyy
 cuW
 dgL
 aaa
@@ -115506,30 +115813,30 @@ cxW
 mil
 jCv
 chj
-aFb
-cJD
-cJD
+chj
+aaa
+aaa
 cML
-cOc
-cPB
+cSF
+cSF
 cQX
 cSF
 nqc
 cVE
-cWC
-cYd
-cZg
+hXl
+cWy
+ddg
 cZZ
-tjw
-cSF
-ddc
 ddZ
-deE
 dfm
 ddd
 dgk
 ddg
-cLH
+cuW
+cuW
+cuW
+cMW
+cyy
 cuW
 cqE
 aaa
@@ -115810,28 +116117,28 @@ cFG
 chj
 aaI
 aaa
-cJD
+aaa
 cMM
-cOc
-cPC
-cQY
-cSG
+cSF
+cSF
+cSF
+cSF
 smk
-cVD
+dpX
 cWD
-cYe
+dqo
 cYe
 daa
-rUk
-mji
-ddd
-ddd
-rNV
+uKJ
 ddd
 ddd
 dgl
-dgy
-cLH
+ddg
+cuW
+cuW
+cuW
+cMW
+cyy
 cuW
 dgL
 aaa
@@ -116043,9 +116350,9 @@ aRB
 aVk
 icp
 aZF
-kKe
+gPP
 baS
-bbj
+nMM
 tLF
 rwr
 hsX
@@ -116091,9 +116398,9 @@ aaa
 hBR
 tlx
 uSY
-cdY
+lWs
 cew
-kBM
+mqH
 cew
 cji
 clj
@@ -116107,33 +116414,33 @@ coC
 aaa
 aam
 cxN
-cAL
+lUL
 cDA
 cxN
 aaI
 aaa
-cLj
+aaa
 cMN
 cOd
-cPD
-cQZ
+cSH
+cSH
 cSH
 lDc
-cVD
-cWA
-cWA
-cZh
+tnJ
+pJX
+gLK
+ddg
 cWA
-pHS
-cSC
-dde
-ddd
-rNV
+uKJ
 ddd
 dfK
 dfo
-dfo
-cLH
+ddg
+cMW
+cMW
+cMW
+cMW
+cyy
 cuW
 dgL
 aaa
@@ -116409,33 +116716,33 @@ coD
 aaa
 aFc
 cxN
-cAL
+lUL
 cDA
 cxN
 aMr
 aaa
-cLj
-kNp
+aaa
+cMK
 cOe
 cPE
-cRa
-cSE
+cSF
+xyo
 qlS
-gdw
+cVE
 fHk
-amR
-jVp
-tZU
+xFT
+ddg
+fcY
 gkr
-cSC
-ddf
-dea
-deG
 wBY
 dfo
 dfo
 cuW
-cLH
+cuW
+cuW
+mHt
+hyB
+uCK
 cuW
 dgL
 aaa
@@ -116711,31 +117018,31 @@ cea
 aaa
 aFc
 cxN
-cAL
+lUL
 cDA
 cxN
 aMr
 aaa
-cJD
-cMP
-cOf
-ebd
-cMP
-cSE
-cSE
-cSE
-cSE
-cSE
-cSE
-cSE
-cSE
-cSE
+aFb
+cMK
+tcw
+tcw
+kUz
+tcw
+tcw
+tcw
+hBU
+kUz
 ddg
 ddg
 ddg
 dfo
 dfo
 cuW
+cuW
+cuW
+cuW
+cxY
 dfz
 dfA
 der
@@ -117020,24 +117327,24 @@ aMr
 aaa
 cqE
 cul
-cxY
-cLH
 cuW
+lXu
 cuW
-cRx
 cuW
+cRx
 cuW
+wab
 cuW
 cuW
+dcC
 cuW
 cuW
 cuW
-dcC
 ddw
 cuW
 cuW
 cuW
-dfz
+hRz
 dfA
 der
 der
@@ -117315,31 +117622,31 @@ aaI
 aaa
 aFc
 dgY
-cDR
+eDJ
 cFH
 dgY
 aMr
 aaa
 cqE
-cuU
+dfz
 cxZ
 cMV
 cOi
 cPX
 cMV
 cOi
-cOi
+kff
 cOi
 cWY
 csf
 cOi
 cOi
-cMV
 cOi
+ofi
 cOi
 cOi
 cOi
-dfA
+dyE
 der
 der
 aaa
@@ -117617,7 +117924,7 @@ aaI
 aaa
 aFc
 dgY
-cDR
+eDJ
 cFH
 dgY
 aMr
@@ -117635,11 +117942,11 @@ cMW
 eDZ
 cMW
 cMW
-cqE
-cqE
-cqE
-cqE
-der
+gpc
+gpc
+lME
+gpc
+kPs
 der
 der
 der
@@ -117919,7 +118226,7 @@ aaI
 aaa
 aam
 dgY
-cDR
+eDJ
 cFH
 dgY
 aaI
@@ -117937,11 +118244,11 @@ cuW
 cLH
 cuW
 deo
-cqE
-aaI
-aaa
-aaa
-aaa
+gpc
+uoU
+wBV
+xRn
+kPs
 aaa
 aaa
 aaa
@@ -118239,11 +118546,11 @@ cWG
 cXh
 cZk
 dcc
-cqE
-aaF
-afk
-aaa
-aaa
+gpc
+xDG
+rZM
+wOq
+kPs
 aaa
 aaa
 aaa
@@ -118523,7 +118830,7 @@ cjM
 cjM
 cjM
 cwV
-kQX
+psd
 jDP
 cwV
 cwV
@@ -118531,21 +118838,21 @@ cwV
 cwV
 cuX
 cID
-cqE
-cqE
-cqE
-cqE
-cVG
-cVG
-cVG
-cVG
-cVG
-cVG
-cVG
-cVG
-aaI
-aaa
-aaa
+cMW
+cMW
+cMW
+cMW
+cVH
+cVH
+cVH
+cVH
+cVH
+cVH
+cVH
+sft
+jci
+wEd
+kPs
 aaa
 aaa
 aaa
@@ -118841,18 +119148,18 @@ cVH
 xKR
 cYh
 cZm
-dae
-dae
-dbS
+gOz
+uFR
+cVH
+cVH
+cVH
+cVG
 cVG
-dec
 deH
 hKn
 aaa
 aaa
 aaa
-aaa
-aaa
 aao
 aaa
 aao
@@ -119145,16 +119452,16 @@ cYi
 cYi
 daf
 dbj
+dbj
+dbj
 dbT
-kAe
+mgK
 ded
-deI
+mcQ
 gSo
 aaa
 aaa
 aaa
-aaa
-aaa
 aao
 aaa
 aao
@@ -119447,6 +119754,8 @@ cYj
 cYj
 dag
 dae
+dae
+dYY
 dbU
 cVG
 dec
@@ -119455,8 +119764,6 @@ sWb
 aaa
 aaa
 aaa
-aaa
-aaa
 aao
 aaa
 aao
@@ -119751,11 +120058,11 @@ cVJ
 gpz
 cVJ
 cVJ
+cVG
+cVG
 aaB
-ahd
-dft
-dhu
-dlA
+dhv
+siW
 dhG
 dlA
 dhP
@@ -120888,7 +121195,7 @@ jnB
 aaa
 bjP
 bgA
-lIa
+inJ
 box
 box
 box
@@ -120912,7 +121219,7 @@ bVz
 bPm
 bPm
 bPm
-uGN
+xPe
 bgA
 bjP
 aaa
@@ -121796,7 +122103,7 @@ bgF
 sGP
 ghP
 boB
-fsq
+kpY
 lfh
 dWf
 nFV
@@ -121816,7 +122123,7 @@ dWf
 qZf
 dWf
 lfh
-fsq
+xJS
 bZE
 kIP
 sGP
@@ -122993,15 +123300,15 @@ msr
 bdx
 ePA
 beM
-ucP
+ilP
 bfX
-bgv
+jGO
 rJQ
 bhv
 lje
 pJE
 dEL
-xYY
+xVH
 xGl
 nau
 jSv
@@ -123027,15 +123334,15 @@ bvK
 oEr
 nBc
 jOn
-fsq
+xJS
 uSY
 tlx
 hDu
 ceG
 uKi
-cfd
+tfU
 cfr
-nFC
+ydA
 cgk
 xIm
 chH
@@ -123910,7 +124217,7 @@ bjV
 blC
 eFF
 boH
-mZL
+rJo
 bsg
 btT
 bvD
@@ -123930,7 +124237,7 @@ jXS
 bTV
 gfu
 bXc
-mZL
+nYf
 boH
 caN
 cbY
@@ -129002,9 +129309,9 @@ aaa
 aaa
 aaa
 aaa
-cgZ
+lQf
 cVQ
-lZd
+spM
 ckp
 chV
 avS
@@ -129935,9 +130242,9 @@ aSZ
 cnG
 cma
 ckp
-hzT
+lSO
 bbi
-bbs
+wnQ
 iNZ
 pdD
 gvO
@@ -129983,9 +130290,9 @@ aaa
 hBR
 tlx
 uSY
-cdY
+tPJ
 cew
-kBM
+jjb
 chu
 cjJ
 clp
@@ -135748,9 +136055,9 @@ cOG
 cQd
 cRP
 cTk
-jHW
+gDO
 cVV
-eLb
+jtg
 cYz
 cYz
 dav
@@ -135947,9 +136254,9 @@ ooQ
 ooQ
 hQD
 hQD
-aqE
+hyM
 arI
-sEP
+flz
 aus
 aus
 axj
@@ -136050,9 +136357,9 @@ cOH
 cQe
 cRQ
 iMs
-wHJ
+cCn
 cVW
-umQ
+kfq
 cYA
 cYA
 cYA
@@ -139582,7 +139889,7 @@ arJ
 aaa
 aaa
 aKm
-lnj
+mMO
 lnj
 aFx
 aIP
@@ -139884,7 +140191,7 @@ aAD
 aaS
 arR
 aEA
-lnj
+mMO
 lnj
 aFx
 aFx
@@ -139921,7 +140228,7 @@ bip
 bjr
 bjI
 bjr
-iBh
+ewx
 bBF
 bDB
 bFz
diff --git a/maps/density2.dmm b/maps/density2.dmm
index 1bf99d6370b9a..0a6e3455276ac 100644
--- a/maps/density2.dmm
+++ b/maps/density2.dmm
@@ -5348,6 +5348,9 @@
 	},
 /obj/item/disk/data/cartridge/captain,
 /obj/item/peripheral/network/radio/locked,
+/obj/item/pinpointer/disk{
+	pixel_y = 9
+	},
 /turf/simulated/floor/black,
 /area/listeningpost)
 "IV" = (
@@ -6587,7 +6590,7 @@
 /turf/simulated/floor/marble,
 /area/station/ranch)
 "Rj" = (
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/table/auto,
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/cafeteria)
diff --git a/maps/donut2.dmm b/maps/donut2.dmm
index 01274faf893f8..923f825e7e2cb 100644
--- a/maps/donut2.dmm
+++ b/maps/donut2.dmm
@@ -463,7 +463,7 @@
 /area/listeningpost)
 "abV" = (
 /obj/item/reagent_containers/food/drinks/drinkingglass,
-/obj/item/pinpointer,
+/obj/item/pinpointer/disk,
 /obj/table/wood/auto{
 	dir = 5
 	},
@@ -1940,12 +1940,12 @@
 /turf/simulated/floor,
 /area/station/security/main)
 "akY" = (
-/obj/stool/chair,
+/obj/stool/chair/purple,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "akZ" = (
-/obj/stool/chair,
 /obj/landmark/start/job/scientist,
+/obj/stool/chair/purple,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "alb" = (
@@ -2120,16 +2120,16 @@
 	location = "bar";
 	name = "buddytime beacon"
 	},
-/obj/stool/chair{
+/obj/stool/chair/purple{
 	dir = 1
 	},
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "alK" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 1
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "alL" = (
@@ -2942,17 +2942,17 @@
 /turf/simulated/floor,
 /area/station/hallway/secondary/researchshuttle)
 "aqZ" = (
-/obj/stool/bench/yellow,
 /obj/machinery/camera{
 	c_tag = "Escape Hallway";
 	dir = 10
 	},
+/obj/stool/bench/red,
 /turf/simulated/floor/escape,
 /area/station/hallway/secondary/exit)
 "ara" = (
 /obj/machinery/light/emergency,
-/obj/stool/bench/green,
 /obj/machinery/light/incandescent,
+/obj/stool/bench/green,
 /turf/simulated/floor/escape,
 /area/station/hallway/secondary/exit)
 "arc" = (
@@ -5909,6 +5909,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "aEF" = (
@@ -6045,7 +6049,7 @@
 /area/station/engine/elect)
 "aFe" = (
 /obj/table/glass/auto,
-/obj/item/reagent_containers/food/snacks/candy/taffy/watermelon,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/watermelon,
 /obj/item/reagent_containers/food/drinks/water,
 /obj/machinery/light_switch/east,
 /turf/simulated/floor/blue/checker,
@@ -6789,13 +6793,7 @@
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "aJc" = (
-/obj/rack,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/operating,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/genetics,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "aJd" = (
@@ -6962,7 +6960,7 @@
 /obj/rack,
 /obj/item/clothing/under/color/grey,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northeast)
@@ -7846,6 +7844,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint";
+	name = "Central Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/central)
 "aOO" = (
@@ -8740,6 +8742,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint4";
+	name = "Central Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/central)
 "aTL" = (
@@ -10942,6 +10948,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
 "bfr" = (
@@ -11396,7 +11406,7 @@
 /area/space)
 "bhY" = (
 /turf/simulated/wall/auto/supernorn,
-/area/station/turret_protected/ai_upload)
+/area/station/hallway/secondary/construction)
 "bhZ" = (
 /obj/machinery/navbeacon{
 	codes_txt = "patrol;next_patrol=Engineering Hallway";
@@ -11682,6 +11692,17 @@
 	dir = 8
 	},
 /area/station/medical/research)
+"bka" = (
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/engineering_atmos,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "atmos";
+	name = "Atmos";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/grime,
+/area/station/atmos/highcap_storage)
 "bkf" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/crew_quarters/market)
@@ -12866,6 +12887,11 @@
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black/side{
 	dir = 8
 	},
@@ -13236,13 +13262,13 @@
 /area/station/engine/storage)
 "bsJ" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
 /obj/item/chem_grenade/firefighting,
 /obj/item/chem_grenade/firefighting,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/tank/air,
 /obj/item/clothing/head/helmet/hardhat,
@@ -13877,13 +13903,11 @@
 	},
 /area/station/engine/engineering)
 "bxe" = (
-/obj/machinery/vending/snack,
 /turf/simulated/floor/yellow/side{
 	dir = 9
 	},
 /area/station/hallway/primary/south)
 "bxf" = (
-/obj/disposalpipe/segment,
 /turf/simulated/floor/yellow/side{
 	dir = 1
 	},
@@ -14955,7 +14979,7 @@
 "bDF" = (
 /obj/decal/cleanable/cobweb2,
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/random_item_spawner/mask/one,
 /turf/simulated/floor/plating,
@@ -15422,9 +15446,7 @@
 /turf/simulated/floor/plating,
 /area/station/atmos/highcap_storage)
 "bFV" = (
-/obj/table/auto,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/crowbar,
+/obj/machinery/abcu,
 /turf/simulated/floor,
 /area/station/storage/tools)
 "bFW" = (
@@ -15659,11 +15681,6 @@
 /obj/machinery/secscanner{
 	pixel_y = 10
 	},
-/obj/forcefield/energyshield/perma/doorlink{
-	desc = "A door-linked force field that prevents gasses from passing through it.";
-	name = "Door-linked Atmospheric Forcefield";
-	powerlevel = 1
-	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
 "bGU" = (
@@ -16492,6 +16509,11 @@
 /obj/machinery/door/airlock/pyro/command/alt,
 /obj/mapping_helper/access/ai_upload,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/engine,
 /area/station/turret_protected/AIsat)
 "bQH" = (
@@ -16660,9 +16682,6 @@
 /obj/landmark/start/job/rancher,
 /turf/simulated/floor/dirt,
 /area/station/ranch)
-"bYD" = (
-/turf/simulated/wall/auto/supernorn,
-/area/station/storage/auxillary)
 "bYJ" = (
 /obj/cable{
 	icon_state = "0-8"
@@ -17269,6 +17288,10 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ranchship";
+	name = "Ranch Ship"
+	},
 /turf/simulated/floor/green,
 /area/station/wreckage)
 "cuI" = (
@@ -17689,7 +17712,7 @@
 "cHd" = (
 /obj/table/auto,
 /obj/item/card/id/captains_spare,
-/obj/item/pinpointer,
+/obj/item/pinpointer/disk,
 /obj/item/device/radio/intercom/bridge,
 /turf/simulated/floor/carpet/arcade,
 /area/station/crew_quarters/captain)
@@ -17721,6 +17744,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint2";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor,
 /area/station/maintenance/west)
 "cIU" = (
@@ -17860,10 +17887,12 @@
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
 "cNm" = (
-/obj/machinery/disposal,
-/obj/disposalpipe/trunk/east,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/obj/machinery/power/apc/autoname_west,
+/obj/cable{
+	icon_state = "0-4"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "cNv" = (
 /obj/item/clothing/under/suit/pinstripe,
 /obj/item/clothing/mask/smile,
@@ -18500,6 +18529,11 @@
 	},
 /obj/decal/stripe_delivery,
 /obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng";
+	name = "Inner Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/inner)
 "djq" = (
@@ -18776,13 +18810,6 @@
 /obj/decal/cleanable/blood/splatter,
 /turf/simulated/floor/plating/airless/asteroid/lighted,
 /area/space)
-"dsg" = (
-/obj/machinery/vending/book,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
-"dsh" = (
-/turf/simulated/wall/auto/reinforced/supernorn,
-/area/station/storage/auxillary)
 "dsL" = (
 /obj/submachine/seed_manipulator{
 	dir = 4
@@ -20947,6 +20974,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
 "eKR" = (
@@ -21837,9 +21868,8 @@
 /obj/machinery/light/small{
 	dir = 8
 	},
-/obj/storage/crate/abcumarker,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "fna" = (
 /obj/machinery/turret{
 	dir = 4
@@ -21986,8 +22016,8 @@
 /turf/simulated/floor/wood/six,
 /area/station/maintenance/west)
 "fsH" = (
-/obj/stool/chair,
 /obj/disposalpipe/segment/vertical,
+/obj/stool/chair/purple,
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "ftz" = (
@@ -22540,9 +22570,9 @@
 /turf/simulated/floor/orangeblack,
 /area/station/science/artifact)
 "fRa" = (
-/obj/storage/closet/emergency,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/obj/item/clothing/head/constructioncone,
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "fRe" = (
 /obj/grille/catwalk,
 /obj/cable{
@@ -23030,6 +23060,10 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/tox,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "toxins";
+	name = "Toxins"
+	},
 /turf/simulated/floor/black,
 /area/station/science/lab)
 "gkl" = (
@@ -23356,6 +23390,8 @@
 	layer = 9.1;
 	pixel_x = -10
 	},
+/obj/item/crowbar,
+/obj/item/storage/toolbox/mechanical,
 /turf/simulated/floor,
 /area/station/storage/tools)
 "gvO" = (
@@ -23414,15 +23450,9 @@
 /turf/simulated/floor/grime,
 /area/station/security/brig)
 "gxy" = (
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/machinery/power/apc/autoname_east,
-/obj/table/auto,
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
+/obj/machinery/vending/book,
 /turf/simulated/floor,
-/area/station/storage/auxillary)
+/area/station/hallway/primary/north)
 "gxD" = (
 /obj/machinery/atmospherics/binary/valve{
 	dir = 4
@@ -23543,6 +23573,11 @@
 	icon_state = "2-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/red,
 /area/station/security/main)
 "gBm" = (
@@ -23763,15 +23798,10 @@
 /turf/simulated/floor/plating,
 /area/station/medical/dome)
 "gJU" = (
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/cable{
-	icon_state = "0-4"
-	},
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/storage/auxillary)
+/obj/machinery/light/incandescent,
+/obj/machinery/vending/floppy,
+/turf/simulated/floor,
+/area/station/hallway/primary/east)
 "gKu" = (
 /obj/grille/steel,
 /obj/cable/orange{
@@ -23912,7 +23942,7 @@
 /turf/simulated/floor/orangeblack/side/white,
 /area/station/science/teleporter)
 "gOE" = (
-/obj/stool/bench/red,
+/obj/stool/bench/purple,
 /turf/simulated/floor/escape,
 /area/station/hallway/secondary/exit)
 "gOO" = (
@@ -24121,6 +24151,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint3";
+	name = "Central Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/central)
 "gUq" = (
@@ -24179,6 +24213,11 @@
 /obj/mapping_helper/access/engineering_power,
 /obj/decal/stripe_delivery,
 /obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng";
+	name = "Inner Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/inner)
 "gVX" = (
@@ -24364,13 +24403,6 @@
 	},
 /turf/simulated/floor/red/corner,
 /area/station/hallway/primary/east)
-"hel" = (
-/obj/item/extinguisher{
-	pixel_y = 8
-	},
-/obj/storage/closet/fire,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
 "hem" = (
 /obj/machinery/atmospherics/unary/tank/nitrogen,
 /obj/machinery/light/small{
@@ -26377,6 +26409,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng2";
+	name = "Inner Engineering"
+	},
 /turf/simulated/floor,
 /area/station/engine/inner)
 "ixk" = (
@@ -26457,6 +26493,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
 "iAn" = (
@@ -26604,12 +26645,6 @@
 	dir = 4
 	},
 /area/station/crew_quarters/stockex)
-"iEN" = (
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor,
-/area/station/storage/auxillary)
 "iEY" = (
 /obj/table/glass/auto,
 /obj/item/paper_bin,
@@ -26629,6 +26664,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolars";
+	name = "South Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
 "iFJ" = (
@@ -26746,6 +26785,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
 "iHo" = (
@@ -27035,6 +27079,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolars";
+	name = "West Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "iSb" = (
@@ -27514,6 +27562,11 @@
 	},
 /obj/mapping_helper/access/teleporter,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "teleporter";
+	name = "Teleporter";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/teleporter)
 "jkz" = (
@@ -27877,6 +27930,11 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
 "jwV" = (
@@ -28198,6 +28256,10 @@
 /area/station/solar/south)
 "jEr" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "toxins";
+	name = "Toxins"
+	},
 /turf/simulated/floor/black,
 /area/station/science/lab)
 "jEE" = (
@@ -28444,8 +28506,8 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/southwest)
 "jLT" = (
-/obj/stool/bench/green,
 /obj/machinery/light/incandescent,
+/obj/stool/bench/yellow,
 /turf/simulated/floor/escape,
 /area/station/hallway/secondary/exit)
 "jMr" = (
@@ -29199,6 +29261,10 @@
 	dir = 4
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint2";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor,
 /area/station/maintenance/west)
 "kpi" = (
@@ -29291,6 +29357,11 @@
 /obj/machinery/door/airlock/pyro/glass/command,
 /obj/mapping_helper/access/ai_upload,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai_upload)
 "ktd" = (
@@ -30101,6 +30172,11 @@
 /obj/cable{
 	icon_state = "2-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "brig"
+	},
 /turf/simulated/floor/red/side{
 	dir = 8
 	},
@@ -30373,6 +30449,10 @@
 	},
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolars";
+	name = "West Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "laR" = (
@@ -30994,13 +31074,12 @@
 /turf/simulated/floor,
 /area/station/hallway/primary/east)
 "lwu" = (
-/obj/machinery/bot/firebot,
-/obj/disposalpipe/segment{
-	dir = 2;
-	icon_state = "pipe-c"
+/obj/cable{
+	icon_state = "4-8"
 	},
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/obj/item/clothing/head/constructioncone,
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "lwy" = (
 /obj/cable/yellow{
 	icon_state = "2-8"
@@ -31600,7 +31679,7 @@
 /turf/simulated/floor/white,
 /area/station/crew_quarters/observatory)
 "lMB" = (
-/obj/stool/chair{
+/obj/stool/chair/purple{
 	dir = 1
 	},
 /turf/simulated/floor/carpet/red/fancy/edge/sw,
@@ -31645,13 +31724,9 @@
 	},
 /area/station/medical/research)
 "lNA" = (
-/obj/cable{
-	icon_state = "0-4"
-	},
 /obj/mapping_helper/wingrille_spawn/auto,
-/obj/disposalpipe/segment,
 /turf/simulated/floor/plating,
-/area/station/storage/auxillary)
+/area/station/hallway/secondary/construction)
 "lNK" = (
 /obj/disposalpipe/segment{
 	dir = 4
@@ -31992,7 +32067,7 @@
 	pixel_x = 10;
 	pixel_y = 6
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -3;
 	pixel_y = 2
 	},
@@ -32161,8 +32236,8 @@
 /area/station/hallway/primary/north)
 "mgJ" = (
 /obj/machinery/light/emergency,
-/obj/stool/bench/blue,
 /obj/machinery/firealarm/south,
+/obj/stool/bench/purple,
 /turf/simulated/floor/escape,
 /area/station/hallway/secondary/exit)
 "mgZ" = (
@@ -32578,6 +32653,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aisat";
+	name = "AI Satellite";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/engine,
 /area/station/turret_protected/AIsat)
 "mrv" = (
@@ -32604,11 +32684,11 @@
 /turf/simulated/floor,
 /area/station/hydroponics/bay)
 "msE" = (
-/obj/stool/chair{
-	dir = 1
-	},
 /obj/landmark/start/job/medical_doctor,
 /obj/machinery/light/incandescent/cool/very,
+/obj/stool/chair/black{
+	dir = 1
+	},
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/morgue)
 "msI" = (
@@ -32683,13 +32763,6 @@
 	},
 /turf/simulated/floor/grime,
 /area/station/storage/tools)
-"mvx" = (
-/obj/cable{
-	icon_state = "0-8"
-	},
-/obj/mapping_helper/wingrille_spawn/auto,
-/turf/simulated/floor/plating,
-/area/station/storage/auxillary)
 "mvM" = (
 /obj/machinery/door/airlock/pyro/maintenance/alt{
 	req_access = null
@@ -32998,6 +33071,11 @@
 /obj/machinery/door/airlock/pyro/command/alt,
 /obj/mapping_helper/access/ai_upload,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aisat";
+	name = "AI Satellite";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/engine,
 /area/station/turret_protected/AIsat)
 "mIq" = (
@@ -33525,7 +33603,7 @@
 	},
 /area/station/ai_monitored/armory)
 "mVH" = (
-/obj/stool/chair,
+/obj/stool/chair/purple,
 /turf/simulated/floor/carpet/red/fancy/edge/nw,
 /area/station/science/lobby)
 "mWp" = (
@@ -33763,9 +33841,6 @@
 	},
 /turf/unsimulated/floor/plating,
 /area/shuttle/arrival/station)
-"ncx" = (
-/turf/simulated/floor,
-/area/station/storage/auxillary)
 "ncO" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -34791,10 +34866,6 @@
 	dir = 1
 	},
 /area/station/engine/inner)
-"nMh" = (
-/obj/machinery/abcu,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
 "nMB" = (
 /obj/table/wood/auto,
 /obj/machinery/firealarm/west,
@@ -35243,6 +35314,11 @@
 	dir = 4
 	},
 /obj/mapping_helper/access/mining,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "nZZ" = (
@@ -35361,6 +35437,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsolars";
+	name = "East Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/east)
 "odr" = (
@@ -35927,7 +36007,7 @@
 	desc = "A black countertop table for storing kitchen-y objects.";
 	name = "kitchen counter"
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "ouw" = (
@@ -36527,6 +36607,11 @@
 /obj/mapping_helper/access/engineering_power,
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng";
+	name = "Inner Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/yellow,
 /area/station/engine/inner)
 "oIK" = (
@@ -36897,6 +36982,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "oSW" = (
@@ -37158,7 +37247,7 @@
 "pct" = (
 /obj/table/auto,
 /obj/item/paper_bin{
-	amount = 100;
+	amount_left = 100;
 	desc = "not at all a paper bin. no sir.";
 	name = "do-it-yourself joint construction kit"
 	},
@@ -37184,6 +37273,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
 "pdp" = (
@@ -38106,13 +38200,21 @@
 /obj/machinery/light/incandescent,
 /turf/simulated/floor,
 /area/station/science/artifact)
-"pEG" = (
-/obj/cable{
-	icon_state = "0-2"
+"pEE" = (
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/mapping_helper/access/security,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aisat";
+	name = "AI Satellite";
+	enter_id = "inner"
 	},
-/obj/machinery/vending/pda,
+/turf/simulated/floor/engine,
+/area/station/turret_protected/AIsat)
+"pEG" = (
+/obj/machinery/bot/firebot,
 /turf/simulated/floor,
-/area/station/storage/auxillary)
+/area/station/storage/tools)
 "pEI" = (
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 1
@@ -38366,6 +38468,23 @@
 /obj/random_item_spawner/snacks/two,
 /turf/simulated/floor,
 /area/station/mining/staff_room)
+"pMQ" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/access/engineering_power,
+/obj/decal/stripe_delivery,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng3";
+	name = "Inner Engineering"
+	},
+/turf/simulated/floor,
+/area/station/engine/inner)
 "pMZ" = (
 /obj/machinery/light/incandescent,
 /obj/cable{
@@ -38715,11 +38834,14 @@
 	},
 /area/station/crew_quarters/quarters)
 "qbJ" = (
-/obj/table/auto,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/hand_labeler,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 9;
+	name = "autoname - SS13";
+	tag = ""
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "qcy" = (
 /obj/machinery/networked/test_apparatus/impact_pad,
 /obj/machinery/power/data_terminal,
@@ -39674,6 +39796,10 @@
 	},
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southsolars";
+	name = "South Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/south)
 "qEf" = (
@@ -39892,6 +40018,11 @@
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/bridge)
 "qLS" = (
@@ -40496,6 +40627,19 @@
 	},
 /turf/simulated/floor,
 /area/station/science/testchamber)
+"rhN" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint2";
+	name = "Central Inner Maintenance"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/inner/central)
 "rie" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -40765,6 +40909,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating/airless,
 /area/station/maintenance/west)
 "rsD" = (
@@ -41386,6 +41534,10 @@
 	},
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsolars";
+	name = "East Solar Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/east)
 "rQz" = (
@@ -41507,19 +41659,13 @@
 /turf/simulated/floor,
 /area/station/storage/tools)
 "rUr" = (
-/obj/cable{
-	icon_state = "2-4"
-	},
-/obj/cable{
-	icon_state = "2-8"
-	},
 /obj/cable{
 	icon_state = "1-2"
 	},
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "rUv" = (
 /obj/strip_door,
 /obj/disposalpipe/segment/mail,
@@ -41718,14 +41864,8 @@
 	},
 /area/station/hallway/secondary/exit)
 "rZc" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-4"
-	},
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "rZI" = (
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/firedoor_spawn,
@@ -41733,6 +41873,11 @@
 	icon_state = "1-2"
 	},
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aisat";
+	name = "AI Satellite";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/engine,
 /area/station/turret_protected/AIsat)
 "rZP" = (
@@ -42388,7 +42533,7 @@
 "svk" = (
 /obj/storage/closet/fire,
 /obj/item/clothing/head/helmet/firefighter,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/decal/cleanable/dirt/dirt5,
 /obj/decal/cleanable/cobweb,
 /turf/simulated/floor/wood/six,
@@ -42975,6 +43120,7 @@
 	name = "kitchen counter"
 	},
 /obj/machinery/light/incandescent,
+/obj/item/storage/box/popsicle_sticks,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "sNC" = (
@@ -43621,6 +43767,7 @@
 "tgY" = (
 /obj/machinery/light,
 /obj/disposalpipe/junction/left/east,
+/obj/machinery/vending/snack,
 /turf/simulated/floor/grime,
 /area/station/hallway/primary/south)
 "thn" = (
@@ -43729,15 +43876,10 @@
 /turf/simulated/floor/wood/seven,
 /area/station/chapel/sanctuary)
 "tlf" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/powermonitor_smes,
 /obj/machinery/light/small{
 	dir = 1
 	},
+/obj/rack/organized/techstorage_eng,
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "tlV" = (
@@ -44075,6 +44217,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint2";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor,
 /area/station/maintenance/west)
 "tzm" = (
@@ -44109,6 +44255,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "outpost";
+	name = "Research Outpost Lobby"
+	},
 /turf/simulated/floor,
 /area/station/science/lobby)
 "tzU" = (
@@ -44150,6 +44300,20 @@
 	},
 /turf/simulated/floor/white/checker,
 /area/station/medical/medbay/pharmacy)
+"tAl" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/engineering_atmos,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "atmos";
+	name = "Atmos";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/grime,
+/area/station/atmos/highcap_storage)
 "tAo" = (
 /obj/decal/tile_edge/stripe/extra_big,
 /obj/decal/tile_edge/stripe/corner/extra_big2{
@@ -44326,7 +44490,7 @@
 "tFn" = (
 /obj/decal/cleanable/dirt/dirt5,
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas,
 /obj/item/extinguisher,
 /obj/item/clothing/shoes/black,
@@ -44815,6 +44979,11 @@
 /obj/disposalpipe/segment/brig{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "sec"
+	},
 /turf/simulated/floor/red,
 /area/station/security/main)
 "tXH" = (
@@ -45849,6 +46018,11 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black/side{
 	dir = 8
 	},
@@ -45876,6 +46050,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "outpostsolars";
+	name = "Research Outpost Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/science/gen_storage)
 "uNs" = (
@@ -46086,6 +46264,11 @@
 /obj/cable/orange{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innereng";
+	name = "Inner Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/yellow,
 /area/station/engine/inner)
 "uTl" = (
@@ -46191,6 +46374,10 @@
 	name = "Permanent Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ranchship";
+	name = "Ranch Ship"
+	},
 /turf/simulated/floor/plating,
 /area/station/wreckage)
 "uWC" = (
@@ -47193,6 +47380,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/mining,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/mining/staff_room)
 "vBa" = (
@@ -47758,10 +47950,10 @@
 /area/station/science/lobby)
 "vTe" = (
 /obj/cable{
-	icon_state = "1-2"
+	icon_state = "2-8"
 	},
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "vTq" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/window_blinds/cog2/middle,
@@ -47954,6 +48146,11 @@
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering_atmos,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "atmos";
+	name = "Atmos";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grime,
 /area/station/atmos/highcap_storage)
 "waD" = (
@@ -48268,6 +48465,21 @@
 /obj/window_blinds/cog2/left,
 /turf/simulated/floor/plating,
 /area/station/security/detectives_office)
+"wlC" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint3";
+	name = "Central Inner Maintenance"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/inner/central)
 "wlI" = (
 /obj/cable/blue{
 	icon_state = "1-2"
@@ -48275,6 +48487,11 @@
 /obj/machinery/door/airlock/pyro/command/alt,
 /obj/mapping_helper/access/ai_upload,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/turret_protected/ai)
 "wlU" = (
@@ -48552,6 +48769,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "teleporter";
+	name = "Teleporter";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/teleporter)
 "wsO" = (
@@ -49608,6 +49830,11 @@
 /obj/machinery/door/airlock/pyro/command/alt,
 /obj/mapping_helper/access/ai_upload,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai_upload)
 "xgM" = (
@@ -49939,6 +50166,11 @@
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/engineering_atmos,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "atmos";
+	name = "Atmos";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grime,
 /area/station/atmos/highcap_storage)
 "xse" = (
@@ -51184,9 +51416,8 @@
 /area/station/wreckage)
 "yhW" = (
 /obj/machinery/camera,
-/obj/machinery/vending/floppy,
-/turf/simulated/floor,
-/area/station/storage/auxillary)
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction)
 "yif" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -73765,7 +73996,7 @@ dRI
 kYR
 hMd
 tbx
-uiX
+cJF
 cyq
 arN
 ayH
@@ -74671,7 +74902,7 @@ dRI
 wIP
 hMd
 fqV
-cJF
+uiX
 cyq
 arN
 yjM
@@ -74698,7 +74929,7 @@ aDU
 aIL
 tJE
 awm
-awm
+gxy
 ayR
 kog
 aNn
@@ -76846,7 +77077,7 @@ aaa
 aaa
 aaa
 aCy
-aTJ
+wlC
 aCy
 aaa
 aaa
@@ -80497,7 +80728,7 @@ bzi
 sTg
 bhm
 wpm
-wal
+bka
 bDf
 bDf
 wal
@@ -80799,7 +81030,7 @@ bzi
 kBH
 buN
 knh
-xra
+tAl
 bDI
 gPo
 xra
@@ -81678,7 +81909,7 @@ nLA
 bdf
 beI
 bck
-iwR
+pMQ
 bck
 bck
 bck
@@ -82282,7 +82513,7 @@ nLA
 bdf
 dEo
 bck
-iwR
+pMQ
 bck
 bCq
 aaa
@@ -82596,14 +82827,14 @@ aaa
 aaa
 adQ
 aaa
-adQ
-aaa
-aaa
-bYD
-nMh
+bhY
+rZc
+rZc
+rZc
+rZc
 fmu
 cNm
-dsh
+lNA
 bxe
 bxO
 eWy
@@ -82898,19 +83129,19 @@ aaa
 aaa
 acK
 ajz
-acK
-aaa
-aaa
-bYD
-dsg
-ncx
+bhY
+yhW
+rZc
+rZc
+rZc
+rZc
 lwu
 lNA
 bxf
-bxJ
-bxJ
-bxJ
-bzW
+bhm
+bhm
+bhm
+mGp
 bxH
 nwC
 bCr
@@ -83200,11 +83431,11 @@ aaa
 aaa
 adQ
 aaa
-adQ
-aaa
-aaa
-bYD
-pEG
+bhY
+rZc
+rZc
+rZc
+rZc
 rZc
 vTe
 rUr
@@ -83502,14 +83733,14 @@ xOf
 fpB
 adQ
 aaa
-adQ
-aaa
-aaa
-bYD
-yhW
-iEN
+bhY
+rZc
+rZc
+rZc
+rZc
+rZc
 fRa
-gJU
+lNA
 mPe
 bhm
 bhm
@@ -83804,14 +84035,14 @@ ohG
 ohG
 ohG
 aaa
-adQ
-aaa
-aaa
-bYD
+bhY
+rZc
+rZc
+rZc
 qbJ
-gxy
-hel
-mvx
+rZc
+rZc
+lNA
 noB
 bhn
 bhn
@@ -84109,11 +84340,11 @@ ohG
 ohG
 ohG
 bhY
-bYD
-bYD
-bYD
-bYD
-bYD
+bhY
+bhY
+bhY
+bhY
+bhY
 sSh
 bhm
 bhm
@@ -84730,7 +84961,7 @@ bCv
 bDS
 eKV
 bEZ
-bCv
+pEG
 bFW
 bAW
 bAP
@@ -88916,9 +89147,9 @@ vzk
 aaa
 aaa
 acK
-aOL
+rhN
 azU
-aOL
+rhN
 mmb
 aEQ
 elW
@@ -91308,7 +91539,7 @@ aHG
 avU
 aJK
 aGO
-bhx
+gJU
 jKv
 lwp
 bST
@@ -125207,7 +125438,7 @@ ecY
 flg
 kyI
 oQj
-aMS
+pEE
 nEX
 nEX
 ecY
diff --git a/maps/donut3.dmm b/maps/donut3.dmm
index 6ad75be8f37f1..31252c89bf0fa 100644
--- a/maps/donut3.dmm
+++ b/maps/donut3.dmm
@@ -973,6 +973,11 @@
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "akT" = (
@@ -1061,6 +1066,12 @@
 	},
 /turf/simulated/floor/purple/side,
 /area/station/hallway/primary/south)
+"amz" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black/grime,
+/area/station/engine/engineering/ce)
 "amF" = (
 /obj/disposalpipe/segment{
 	dir = 4;
@@ -1414,7 +1425,7 @@
 /area/station/medical/robotics)
 "arP" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -2;
 	pixel_y = -3
 	},
@@ -1740,6 +1751,10 @@
 /obj/disposalpipe/segment{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Maintenance";
+	cycle_id = "northmaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/outer/ne)
 "axg" = (
@@ -2384,6 +2399,11 @@
 	dir = 4
 	},
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/security/main)
 "aFN" = (
@@ -3833,7 +3853,7 @@
 /obj/machinery/light/incandescent{
 	dir = 8
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/white/checker2{
 	dir = 1
 	},
@@ -4887,6 +4907,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/circuit/off,
 /area/station/turret_protected/ai_upload)
 "bsi" = (
@@ -5718,7 +5743,8 @@
 /area/station/bridge)
 "bCQ" = (
 /obj/disposalpipe/segment/transport,
-/obj/machinery/vending/jobclothing/catering,
+/obj/table/auto,
+/obj/item/storage/box/popsicle_sticks,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
 "bCX" = (
@@ -6537,16 +6563,12 @@
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "bPE" = (
-/obj/machinery/door/airlock/pyro/glass/command{
-	dir = 8;
-	req_access = null
-	},
-/obj/decal/stripe_delivery,
-/obj/mapping_helper/firedoor_spawn,
 /obj/cable{
 	icon_state = "4-8"
 	},
-/obj/mapping_helper/access/engineering_chief,
+/obj/machinery/light/incandescent/blueish{
+	dir = 1
+	},
 /turf/simulated/floor/black/grime,
 /area/station/engine/engineering/ce)
 "bPW" = (
@@ -7020,9 +7042,6 @@
 /turf/simulated/floor/dojo/sand/circle,
 /area/station/crew_quarters/captain)
 "bYs" = (
-/obj/stool/chair/office{
-	dir = 4
-	},
 /obj/cable{
 	icon_state = "0-4"
 	},
@@ -7031,6 +7050,9 @@
 	},
 /obj/cable,
 /obj/landmark/start/job/scientist,
+/obj/stool/chair/office/purple{
+	dir = 4
+	},
 /turf/simulated/floor/specialroom/arcade,
 /area/station/science/artifact)
 "bYw" = (
@@ -7542,6 +7564,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/AIsat)
 "cfX" = (
@@ -7692,9 +7719,6 @@
 /turf/simulated/floor/specialroom/chapel,
 /area/station/chapel/sanctuary)
 "chx" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
 /obj/decal/tile_edge/line/purple{
 	dir = 6;
 	icon_state = "tile1"
@@ -7711,6 +7735,9 @@
 	},
 /obj/cable,
 /obj/landmark/start/job/scientist,
+/obj/stool/chair/office/purple{
+	dir = 8
+	},
 /turf/simulated/floor/white,
 /area/station/science/teleporter)
 "chz" = (
@@ -8237,6 +8264,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Toxin Storage";
+	cycle_id = "toxins"
+	},
 /turf/simulated/floor/black,
 /area/station/science/storage)
 "coS" = (
@@ -8244,7 +8275,6 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
-/obj/mapping_helper/access,
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/tile_edge/line/white{
 	dir = 8;
@@ -9357,9 +9387,6 @@
 /turf/simulated/floor/wood/seven,
 /area/station/security/detectives_office)
 "cEz" = (
-/obj/stool/chair/office{
-	dir = 4
-	},
 /obj/cable,
 /obj/cable{
 	icon_state = "0-2"
@@ -9367,6 +9394,9 @@
 /obj/cable{
 	icon_state = "0-8"
 	},
+/obj/stool/chair/office/purple{
+	dir = 4
+	},
 /turf/simulated/floor/white,
 /area/station/science/lab)
 "cEG" = (
@@ -9721,7 +9751,6 @@
 /obj/decal/stripe_delivery,
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access,
 /turf/simulated/floor,
 /area/station/hallway/secondary/exit)
 "cMR" = (
@@ -10168,6 +10197,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "North Maintenance";
+	cycle_id = "northmaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/outer/ne)
 "cUi" = (
@@ -11199,7 +11232,7 @@
 /turf/simulated/floor/sanitary/white,
 /area/station/maintenance/inner/sw)
 "dli" = (
-/obj/stool/chair/couch/green{
+/obj/stool/chair/couch/purple{
 	dir = 8
 	},
 /turf/simulated/floor/wood,
@@ -11264,6 +11297,11 @@
 /obj/machinery/door/airlock/pyro/engineering{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "qmrefinery";
+	name = "QM/Refinery";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "dlX" = (
@@ -14300,6 +14338,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "East Solar Maintenance";
+	cycle_id = "eastsolar"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/east)
 "ejc" = (
@@ -14372,6 +14414,11 @@
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/specialroom/arcade,
 /area/station/science/lobby)
 "ekB" = (
@@ -14887,6 +14934,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/medical,
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	name = "Med Bay";
+	cycle_id = "medbay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
 "esP" = (
@@ -16824,7 +16876,7 @@
 	pixel_x = 2;
 	pixel_y = -2
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -4;
 	pixel_y = -4
 	},
@@ -24922,6 +24974,10 @@
 /area/station/ai_monitored/armory)
 "hvZ" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	name = "North Inner Maintenance";
+	cycle_id = "n_innermaint"
+	},
 /turf/simulated/floor/black/grime,
 /area/station/maintenance/inner/north)
 "hwl" = (
@@ -25918,6 +25974,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Med Bay";
+	cycle_id = "medbay";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
 "hNd" = (
@@ -26104,33 +26165,8 @@
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/inner/se)
 "hPQ" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter{
-	pixel_x = -5;
-	pixel_y = 6
-	},
-/obj/item/circuitboard/card{
-	pixel_x = -3;
-	pixel_y = 3
-	},
-/obj/item/circuitboard/robot_module_rewriter{
-	pixel_x = -1
-	},
-/obj/item/circuitboard/cloning{
-	pixel_x = 1;
-	pixel_y = -3
-	},
-/obj/item/circuitboard/barcode_qm{
-	pixel_x = 3;
-	pixel_y = -6
-	},
-/obj/item/circuitboard/barcode{
-	pixel_x = 7;
-	pixel_y = -6
-	},
-/obj/item/circuitboard/qmsupply{
-	pixel_x = 5;
-	pixel_y = -9
+/obj/rack/organized/techstorage_eng{
+	order_override = "diagonal"
 	},
 /turf/simulated/floor/plating/jen,
 /area/station/storage/tech)
@@ -26163,6 +26199,11 @@
 	},
 /obj/mapping_helper/access/cargo,
 /obj/machinery/door/airlock/pyro/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "qmrefinery";
+	name = "QM/Refinery";
+	enter_id = "refinery"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/refinery)
 "hRi" = (
@@ -28504,6 +28545,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "iFO" = (
@@ -29480,6 +29526,11 @@
 /obj/decal/stripe_delivery,
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/mining,
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black/grime,
 /area/station/mining/staff_room)
 "iWm" = (
@@ -29888,6 +29939,11 @@
 /obj/decal/stripe_delivery,
 /obj/mapping_helper/access/research_foyer,
 /obj/disposalpipe/segment,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/specialroom/arcade,
 /area/station/science/lobby)
 "jbQ" = (
@@ -30082,10 +30138,10 @@
 /turf/simulated/floor/black,
 /area/station/security/visitation)
 "jfd" = (
-/obj/stool/chair/office/blue{
+/obj/machinery/light/incandescent/netural,
+/obj/stool/chair/office/purple{
 	dir = 1
 	},
-/obj/machinery/light/incandescent/netural,
 /turf/simulated/floor/carpet/purple/fancy/narrow,
 /area/station/crew_quarters/hor)
 "jft" = (
@@ -30433,6 +30489,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Bomb Testing Chamber";
+	cycle_id = "bombtest"
+	},
 /turf/simulated/floor/plating,
 /area/station/science/testchamber/bombchamber)
 "jkD" = (
@@ -31372,6 +31432,11 @@
 	dir = 4
 	},
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/security/main)
 "jyl" = (
@@ -31793,7 +31858,7 @@
 	pixel_x = 2;
 	pixel_y = -2
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -4;
 	pixel_y = -4
 	},
@@ -32076,7 +32141,7 @@
 /area/listeningpost)
 "jJQ" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -8;
 	pixel_y = -1
 	},
@@ -32084,7 +32149,7 @@
 	pixel_x = -4;
 	pixel_y = 12
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -3;
 	pixel_y = -3
 	},
@@ -32363,6 +32428,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
 /obj/disposalpipe/segment/mail,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "jNn" = (
@@ -33507,6 +33577,10 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Bomb Testing Chamber";
+	cycle_id = "bombtest"
+	},
 /turf/simulated/floor/plating,
 /area/station/science/testchamber/bombchamber)
 "khw" = (
@@ -34956,7 +35030,6 @@
 /obj/decal/stripe_delivery,
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access,
 /obj/disposalpipe/segment,
 /turf/simulated/floor,
 /area/station/hangar/main)
@@ -35368,11 +35441,6 @@
 	},
 /turf/simulated/floor,
 /area/station/hallway/primary/south)
-"kMX" = (
-/obj/machinery/light/incandescent/harsh,
-/obj/stool/bench/blue/auto,
-/turf/simulated/floor/specialroom/arcade,
-/area/station/hallway/primary/south)
 "kNO" = (
 /turf/simulated/floor/stairs/wide/middle,
 /area/listeningpost)
@@ -35725,6 +35793,10 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Toxin Storage";
+	cycle_id = "toxins"
+	},
 /turf/simulated/floor/black,
 /area/station/science/storage)
 "kSQ" = (
@@ -35773,6 +35845,11 @@
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "kTv" = (
@@ -36950,12 +37027,21 @@
 /turf/simulated/floor/black/grime,
 /area/station/hangar/qm)
 "lng" = (
-/obj/machinery/light/incandescent/blueish{
-	dir = 1
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/decal/stripe_delivery,
+/obj/machinery/door/airlock/pyro/glass/command{
+	dir = 8;
+	req_access = null
+	},
+/obj/mapping_helper/access/engineering_chief,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ce";
+	name = "Chief Engineer";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering/ce)
 "lnm" = (
@@ -38251,6 +38337,11 @@
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "lFn" = (
@@ -38661,11 +38752,11 @@
 /turf/simulated/floor/black,
 /area/station/security/main)
 "lKC" = (
-/obj/stool/bench/blue/auto,
 /obj/disposalpipe/segment/mail{
 	dir = 4;
 	icon_state = "pipe-c"
 	},
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/specialroom/arcade,
 /area/station/hallway/primary/south)
 "lKD" = (
@@ -38950,6 +39041,11 @@
 	icon_state = "1-2"
 	},
 /obj/machinery/door/airlock/pyro/engineering,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "qmrefinery";
+	name = "QM/Refinery";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/quartermaster/office)
 "lPo" = (
@@ -39966,7 +40062,7 @@
 	desc = "A black countertop table for storing kitchen-y objects.";
 	name = "kitchen counter"
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/white/checker2{
 	dir = 1
 	},
@@ -40841,38 +40937,12 @@
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/outer/se)
 "msQ" = (
-/obj/rack,
-/obj/item/circuitboard/arcade{
-	pixel_x = -8;
-	pixel_y = 6
-	},
-/obj/item/circuitboard/powermonitor{
-	pixel_x = -6;
-	pixel_y = 5
-	},
-/obj/item/circuitboard/powermonitor_smes{
-	pixel_x = -4;
-	pixel_y = 2
-	},
-/obj/item/circuitboard/operating{
-	pixel_x = -2;
-	pixel_y = -1
-	},
-/obj/item/circuitboard/genetics{
-	pixel_x = 2;
-	pixel_y = -4
-	},
-/obj/item/circuitboard/qmorder{
-	pixel_x = 6;
-	pixel_y = -8
-	},
-/obj/item/circuitboard/telescope{
-	pixel_x = 6;
-	pixel_y = -6
-	},
 /obj/machinery/light/incandescent/netural{
 	dir = 1
 	},
+/obj/rack/organized/techstorage_med{
+	order_override = "diagonal"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/storage/tech)
 "msR" = (
@@ -41302,6 +41372,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Mining";
+	cycle_id = "mining";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black/grime,
 /area/station/mining/staff_room)
 "mzM" = (
@@ -42016,6 +42091,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/engineering_chief,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ce";
+	name = "Chief Engineer";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black/grime,
 /area/station/engine/engineering/ce)
 "mKe" = (
@@ -46273,6 +46353,7 @@
 /obj/disposalpipe/segment/morgue{
 	name = "kitchen freezer pipe"
 	},
+/obj/machinery/vending/jobclothing/catering,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/catering)
 "obE" = (
@@ -46802,9 +46883,6 @@
 	},
 /area/station/crew_quarters/hor)
 "olH" = (
-/obj/stool/chair/office{
-	dir = 1
-	},
 /obj/decal/tile_edge/line/purple{
 	dir = 1;
 	icon_state = "line1"
@@ -46815,6 +46893,9 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/stool/chair/office/purple{
+	dir = 1
+	},
 /turf/simulated/floor/black,
 /area/station/science/lobby)
 "olM" = (
@@ -47884,6 +47965,10 @@
 /obj/mapping_helper/access/research,
 /obj/mapping_helper/firedoor_spawn,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Science Lobby";
+	cycle_id = "scilobby"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/science/lobby)
 "oAy" = (
@@ -47923,6 +48008,10 @@
 "oBp" = (
 /obj/decal/cleanable/dirt/jen,
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	name = "North Inner Maintenance";
+	cycle_id = "n_innermaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/inner/north)
 "oBq" = (
@@ -48004,6 +48093,11 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/circuit/off,
 /area/station/turret_protected/ai_upload)
 "oCX" = (
@@ -48367,7 +48461,7 @@
 	pixel_x = 2;
 	pixel_y = -2
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -4;
 	pixel_y = -4
 	},
@@ -48840,6 +48934,10 @@
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/research,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Science Lobby";
+	cycle_id = "scilobby"
+	},
 /turf/simulated/floor/plating,
 /area/station/science/lobby)
 "oQI" = (
@@ -49155,6 +49253,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/AIsat)
 "oUB" = (
@@ -49310,7 +49413,7 @@
 	},
 /area/station/hallway/primary/west)
 "oXq" = (
-/obj/stool/chair{
+/obj/stool/chair/purple{
 	dir = 1
 	},
 /turf/simulated/floor/specialroom/arcade,
@@ -50805,6 +50908,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "West Solar Maintenance";
+	cycle_id = "westsolar"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/solar/west)
 "pwa" = (
@@ -54325,6 +54432,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Northeast Maintenance";
+	cycle_id = "northeastmaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/outer/ne)
 "qwZ" = (
@@ -55424,6 +55535,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "Southwest Inner Maintenance";
+	cycle_id = "sw_innermaint"
+	},
 /turf/simulated/floor/grime{
 	dir = 8
 	},
@@ -59508,10 +59623,10 @@
 	},
 /area/listeningpost)
 "sda" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 1
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/carpet/purple/standard,
 /area/station/science/lobby)
 "sdo" = (
@@ -60004,7 +60119,7 @@
 	dir = 4;
 	icon_state = "line1"
 	},
-/obj/stool/chair/couch/green{
+/obj/stool/chair/couch/purple{
 	dir = 4
 	},
 /turf/simulated/floor/wood,
@@ -61587,6 +61702,10 @@
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/maint,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Southwest Inner Maintenance";
+	cycle_id = "sw_innermaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/inner/sw)
 "sMH" = (
@@ -62004,10 +62123,10 @@
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/cafeteria)
 "sTY" = (
-/obj/stool/chair{
+/obj/machinery/firealarm/north,
+/obj/stool/chair/purple{
 	dir = 4
 	},
-/obj/machinery/firealarm/north,
 /turf/simulated/floor/plating/jen,
 /area/station/science/gen_storage)
 "sTZ" = (
@@ -62481,7 +62600,6 @@
 /obj/decal/stripe_delivery,
 /obj/machinery/door/airlock/pyro/glass,
 /obj/mapping_helper/firedoor_spawn,
-/obj/mapping_helper/access,
 /turf/simulated/floor,
 /area/station/hangar/main)
 "tbs" = (
@@ -65957,11 +66075,11 @@
 	},
 /area/station/medical/medbay)
 "ubC" = (
-/obj/stool/bench/blue/auto,
 /obj/disposalpipe/segment/mail{
 	dir = 8;
 	icon_state = "pipe-c"
 	},
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/specialroom/arcade,
 /area/station/hallway/primary/south)
 "ubD" = (
@@ -66020,6 +66138,23 @@
 /obj/disposalpipe/segment,
 /turf/simulated/floor/white,
 /area/station/crewquarters/fuq3)
+"udd" = (
+/obj/decal/stripe_delivery,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/access/cargo,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/machinery/door/airlock/pyro/engineering{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "qmrefinery";
+	name = "QM/Refinery";
+	enter_id = "outer"
+	},
+/turf/simulated/floor,
+/area/station/quartermaster/office)
 "udu" = (
 /obj/shrub{
 	dir = 6
@@ -67911,7 +68046,7 @@
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/hor)
 "uHV" = (
-/obj/stool/chair/couch/green,
+/obj/stool/chair/couch/purple,
 /turf/simulated/floor/wood,
 /area/station/science/lobby)
 "uHW" = (
@@ -69253,9 +69388,6 @@
 /turf/simulated/floor/black/grime,
 /area/station/hangar/qm)
 "veI" = (
-/obj/stool/chair/yellow{
-	dir = 8
-	},
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 4
 	},
@@ -69268,6 +69400,9 @@
 /obj/cable{
 	icon_state = "0-2"
 	},
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/grime{
 	dir = 8
 	},
@@ -69414,7 +69549,7 @@
 /area/station/chapel/sanctuary)
 "vgl" = (
 /obj/table/auto,
-/obj/item/pinpointer{
+/obj/item/pinpointer/disk{
 	pixel_x = -4;
 	pixel_y = -9
 	},
@@ -69578,6 +69713,11 @@
 	name = "Bridge Lockdown Doors";
 	opacity = 0
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "viW" = (
@@ -69798,6 +69938,10 @@
 	},
 /obj/mapping_helper/access/maint,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Northeast Maintenance";
+	cycle_id = "northeastmaint"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/outer/ne)
 "vmB" = (
@@ -70675,6 +70819,11 @@
 	icon_state = "1-2"
 	},
 /obj/disposalpipe/segment,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "vAl" = (
@@ -72143,6 +72292,10 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/engineering,
+/obj/mapping_helper/airlock/cycler{
+	name = "West Solar Maintenance";
+	cycle_id = "westsolar"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "vVY" = (
@@ -73165,6 +73318,11 @@
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/security,
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "security";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/security/main)
 "wma" = (
@@ -75044,6 +75202,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	name = "East Solar Maintenance";
+	cycle_id = "eastsolar"
+	},
 /turf/simulated/floor/plating/jen,
 /area/station/maintenance/solar/east)
 "wNd" = (
@@ -75267,6 +75429,11 @@
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering";
+	enter_id = "sing"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "wPX" = (
@@ -76884,6 +77051,10 @@
 	powerlevel = 1
 	},
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Pool and Owlrey";
+	cycle_id = "pool"
+	},
 /turf/simulated/floor,
 /area/spacehabitat/pool)
 "xms" = (
@@ -77424,6 +77595,10 @@
 	name = "Pool Access"
 	},
 /obj/decal/stripe_delivery,
+/obj/mapping_helper/airlock/cycler{
+	name = "Pool and Owlrey";
+	cycle_id = "pool"
+	},
 /turf/simulated/floor/grey,
 /area/spacehabitat/pool)
 "xuj" = (
@@ -79090,6 +79265,18 @@
 /obj/machinery/light/incandescent/netural,
 /turf/simulated/floor/plating/jen,
 /area/station/hallway/secondary/exit)
+"xTv" = (
+/obj/decal/stripe_delivery,
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/decal/tile_edge/line/white{
+	dir = 8;
+	icon_state = "line1"
+	},
+/turf/simulated/floor/plating/jen,
+/area/station/hallway/secondary/exit)
 "xTw" = (
 /obj/disposalpipe/segment/mail{
 	dir = 4
@@ -79562,10 +79749,10 @@
 /turf/simulated/floor/white,
 /area/spacehabitat/pool)
 "yaE" = (
-/obj/stool/chair/office{
+/obj/decal/tile_edge/stripe/extra_big{
 	dir = 8
 	},
-/obj/decal/tile_edge/stripe/extra_big{
+/obj/stool/chair/office/purple{
 	dir = 8
 	},
 /turf/simulated/floor/grey,
@@ -123742,7 +123929,7 @@ sUp
 mZl
 jFY
 jFY
-kMX
+fWD
 oPf
 mvu
 vnU
@@ -135168,7 +135355,7 @@ xUo
 xUo
 xUo
 nGn
-dlQ
+udd
 pSY
 duN
 tCV
@@ -143580,7 +143767,7 @@ etV
 etV
 sdZ
 sdZ
-fdX
+xTv
 sdZ
 sdZ
 etV
@@ -143590,7 +143777,7 @@ sdZ
 etV
 sdZ
 sdZ
-fdX
+xTv
 sdZ
 sdZ
 etV
@@ -149366,7 +149553,7 @@ mfw
 kTR
 kTR
 kTR
-bPE
+amz
 kTR
 kTR
 kTR
diff --git a/maps/kondaru.dmm b/maps/kondaru.dmm
index 210fb5ef12fe0..00dd332faaecc 100644
--- a/maps/kondaru.dmm
+++ b/maps/kondaru.dmm
@@ -172,7 +172,7 @@
 /area/space)
 "aaB" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/decal/stripe_caution,
 /turf/simulated/floor/airless,
@@ -365,6 +365,10 @@
 	dir = 4;
 	name = "Owl Zone Access"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "owlrey";
+	name = "Owlrey"
+	},
 /turf/simulated/floor/grey,
 /area/station/garden/owlery)
 "abt" = (
@@ -387,6 +391,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	name = "Owl Zone Access"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "owlrey";
+	name = "Owlrey"
+	},
 /turf/simulated/floor/caution/north,
 /area/station/garden/owlery)
 "abx" = (
@@ -1002,6 +1010,10 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "routing2";
+	name = "Routing Cabinet"
+	},
 /turf/simulated/floor/plating,
 /area/station/routing/eva{
 	name = "Router Cabinet"
@@ -1087,6 +1099,10 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "routing2";
+	name = "Routing Cabinet"
+	},
 /turf/simulated/floor/plating,
 /area/station/routing/eva{
 	name = "Router Cabinet"
@@ -1131,6 +1147,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "aec" = (
@@ -1308,6 +1329,11 @@
 /area/station/maintenance/northwest)
 "aeN" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
 "aeO" = (
@@ -1355,6 +1381,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmaint2";
+	name = "North Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/north)
 "aeV" = (
@@ -1810,6 +1840,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmaint2";
+	name = "North Maintenance"
+	},
 /turf/simulated/floor/grey,
 /area/station/maintenance/north)
 "agN" = (
@@ -5609,6 +5643,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grey/side{
 	dir = 1
 	},
@@ -5809,6 +5848,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grey/side,
 /area/station/maintenance/northwest)
 "avw" = (
@@ -6768,7 +6812,7 @@
 /area/station/maintenance/disposal)
 "azG" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/glasses/macho,
 /obj/item/device/light/glowstick,
@@ -8328,6 +8372,10 @@
 /area/station/maintenance/east)
 "aFO" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/grey,
 /area/station/maintenance/east)
 "aFQ" = (
@@ -12666,12 +12714,8 @@
 /area/station/crewquarters/cryotron)
 "aYd" = (
 /obj/table/auto,
-/obj/item/clothing/gloves/yellow,
-/obj/item/clothing/gloves/yellow,
 /obj/item/device/t_scanner,
 /obj/item/device/t_scanner,
-/obj/item/device/multitool,
-/obj/item/device/multitool,
 /obj/item/device/radio/intercom/engineering{
 	dir = 4
 	},
@@ -13476,6 +13520,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "routing";
+	name = "Routing Depot";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/east)
 "bcf" = (
@@ -13978,6 +14027,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "routing";
+	name = "Routing Depot";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/routing/depot)
 "ben" = (
@@ -14820,7 +14874,7 @@
 	},
 /area/station/hallway/secondary/exit)
 "bil" = (
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 /obj/disposalpipe/segment/vertical,
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
@@ -15015,7 +15069,7 @@
 /area/station/mining/refinery)
 "biN" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/item/reagent_containers/food/drinks/drinkingglass/icing{
 	pixel_x = -14
 	},
@@ -15148,6 +15202,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastmaint";
+	name = "East Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/east)
 "bjC" = (
@@ -17714,6 +17772,10 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "bus" = (
@@ -21661,6 +21723,11 @@
 	icon_state = "1-2"
 	},
 /obj/machinery/atmospherics/pipe/simple,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escapebay";
+	name = "Escape Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/hangar/escape)
 "bJH" = (
@@ -21921,7 +21988,7 @@
 	},
 /area/station/science/lobby)
 "bKw" = (
-/obj/stool/bench/auto,
+/obj/stool/bench/purple/auto,
 /turf/simulated/floor/purple/side,
 /area/station/hallway/secondary/south)
 "bKx" = (
@@ -25232,6 +25299,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westinnermaint";
+	name = "West Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/west)
 "bXG" = (
@@ -26628,6 +26699,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escapebay";
+	name = "Escape Pod Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/hangar/escape)
 "cdD" = (
@@ -27206,6 +27282,10 @@
 /area/station/crew_quarters/market)
 "cfS" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "merchanta";
+	name = "Merchant Shuttle Dock"
+	},
 /turf/simulated/floor/neutral,
 /area/station/crew_quarters/market)
 "cfT" = (
@@ -28910,10 +28990,10 @@
 /turf/simulated/floor/carpet/purple/standard/edge/south,
 /area/research_outpost/indigo_rye)
 "clD" = (
-/obj/stool/chair,
 /obj/cable{
 	icon_state = "1-4"
 	},
+/obj/stool/chair/purple,
 /turf/simulated/floor/carpet/purple/standard/edge/south,
 /area/research_outpost/indigo_rye)
 "clE" = (
@@ -29211,7 +29291,7 @@
 "cmC" = (
 /obj/table/wood/auto,
 /obj/machinery/light/small,
-/obj/item/pinpointer,
+/obj/item/pinpointer/disk,
 /obj/item/disk/data/cartridge/captain,
 /obj/item/disk/data/cartridge/captain,
 /turf/simulated/floor/black,
@@ -30694,6 +30774,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineairbridge2";
+	name = "Engineering Airbridge 2";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/redblack,
 /area/station/engine/hotloop)
 "cFJ" = (
@@ -30851,6 +30936,11 @@
 /obj/disposalpipe/segment/vertical,
 /obj/machinery/atmospherics/pipe/simple,
 /obj/mapping_helper/access/security,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/red/side,
 /area/station/security/main)
 "cKV" = (
@@ -30886,6 +30976,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southwestinnermaint";
+	name = "Southwest Inner Maintenance";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/orangeblack,
 /area/station/mining/refinery)
 "cLB" = (
@@ -30932,6 +31027,20 @@
 	dir = 1
 	},
 /area/station/hallway/primary/west)
+"cNE" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/disposalpipe/segment/horizontal,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmaint";
+	name = "North Maintenance"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/north)
 "cNM" = (
 /obj/stool/chair,
 /turf/simulated/floor/neutral/side{
@@ -31007,6 +31116,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hopdesk";
+	name = "HOP Desk";
+	enter_id = "hop"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge/hos)
 "cPy" = (
@@ -31217,7 +31331,7 @@
 /area/station/crew_quarters/kitchen)
 "cXC" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -32459,6 +32573,11 @@
 	name = "AI Upload"
 	},
 /obj/mapping_helper/access/ai_upload,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai_upload)
 "dPf" = (
@@ -32848,6 +32967,11 @@
 /obj/cable{
 	icon_state = "1-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/turret_protected/ai_upload)
 "dZr" = (
@@ -33162,6 +33286,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grey,
 /area/station/hangar/engine)
 "emI" = (
@@ -33362,8 +33491,8 @@
 /area/station/crew_quarters/quarters_east)
 "eul" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
@@ -33727,6 +33856,11 @@
 	dir = 4
 	},
 /obj/mapping_helper/access/engineering_storage,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering Bay";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/grey,
 /area/station/hangar/engine)
 "eEn" = (
@@ -33846,6 +33980,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineering";
+	name = "Engineering Bay";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/grey,
 /area/station/engine/storage)
 "eGX" = (
@@ -34068,6 +34207,10 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolars";
+	name = "West Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "ePl" = (
@@ -34303,7 +34446,7 @@
 /area/station/maintenance/inner/east)
 "eYE" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -3
 	},
 /obj/item/clothing/mask/gas/emergency,
@@ -34972,6 +35115,11 @@
 	dir = 4
 	},
 /obj/disposalpipe/segment/horizontal,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "routing";
+	name = "Routing Depot";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/routing/depot)
 "fzb" = (
@@ -35723,6 +35871,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/grey/side{
 	dir = 1
 	},
@@ -35792,6 +35945,14 @@
 	},
 /turf/simulated/floor/grey,
 /area/station/bridge)
+"gfC" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "merchantb";
+	name = "Merchant Shuttle Dock"
+	},
+/turf/simulated/floor/neutral,
+/area/station/crew_quarters/market)
 "gfE" = (
 /obj/machinery/atmospherics/pipe/simple/insulated{
 	dir = 4
@@ -36757,7 +36918,7 @@
 /area/station/security/secwing)
 "gOK" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -37313,6 +37474,10 @@
 "hed" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/cargo,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "cargobay";
+	name = "Cargo Bay"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/quartermaster/cargobay)
 "heQ" = (
@@ -37855,14 +38020,14 @@
 /area/station/security/main)
 "hBS" = (
 /obj/table/reinforced/auto,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/head/helmet/welding,
 /obj/machinery/light{
 	dir = 1;
 	layer = 9.1;
 	pixel_y = 21
 	},
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/head/helmet/welding,
 /turf/simulated/floor/yellow/side{
 	dir = 5
@@ -38948,10 +39113,18 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/access/engineering_power,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsolars";
+	name = "East Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/east)
 "iEB" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southmaint";
+	name = "South Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "iEQ" = (
@@ -39937,6 +40110,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "miningshuttle";
+	name = "Mining Shuttle";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/grey/side,
 /area/station/maintenance/northwest)
 "jmu" = (
@@ -39950,7 +40128,7 @@
 /area/station/crew_quarters/kitchen)
 "jmE" = (
 /obj/storage/secure/closet/engineering/electrical,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/yellow/side,
 /area/station/engine/monitoring)
@@ -40130,6 +40308,11 @@
 	name = "Courtroom"
 	},
 /obj/mapping_helper/access/brig,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hopdesk";
+	name = "HOP Desk";
+	enter_id = "sec"
+	},
 /turf/simulated/floor,
 /area/station/security/secwing)
 "jrg" = (
@@ -41296,6 +41479,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westinnermaint";
+	name = "West Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/west)
 "koE" = (
@@ -41784,6 +41971,10 @@
 /obj/cable/yellow{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westsolars";
+	name = "West Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/west)
 "kHZ" = (
@@ -42182,6 +42373,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineairbridge1";
+	name = "Engineering Airbridge 1";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/caution/westeast,
 /area/station/engine/gas)
 "kUu" = (
@@ -42427,6 +42623,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "merchanta";
+	name = "Merchant Shuttle Dock"
+	},
 /turf/simulated/floor/neutral,
 /area/station/crew_quarters/market)
 "lhD" = (
@@ -42634,6 +42834,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineairbridge1";
+	name = "Engineering Airbridge 1";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/caution/westeast,
 /area/station/engine/hotloop)
 "lpY" = (
@@ -43523,6 +43728,19 @@
 	},
 /turf/simulated/floor,
 /area/station/security/secwing)
+"lPV" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink{
+	desc = "A door-linked force field that prevents gasses from passing through it.";
+	name = "Door-linked Atmospheric Forcefield";
+	powerlevel = 1
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "merchantb";
+	name = "Merchant Shuttle Dock"
+	},
+/turf/simulated/floor/neutral,
+/area/station/crew_quarters/market)
 "lQz" = (
 /obj/machinery/light{
 	dir = 1;
@@ -43775,6 +43993,11 @@
 	dir = 1
 	},
 /obj/mapping_helper/access/brig,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "hopdesk";
+	name = "HOP Desk";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/crew_quarters/courtroom)
 "mep" = (
@@ -44160,7 +44383,7 @@
 /area/space)
 "mwo" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -3
 	},
 /obj/item/clothing/mask/gas/emergency,
@@ -44228,18 +44451,11 @@
 /turf/simulated/floor/grey,
 /area/station/mining/magnet)
 "myd" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/qmsupply,
 /obj/machinery/light/small{
 	dir = 4;
 	pixel_x = 12
 	},
+/obj/rack/organized/techstorage_eng,
 /turf/simulated/floor/grey/blackgrime/other,
 /area/station/storage/tech)
 "mzu" = (
@@ -44268,6 +44484,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastinnermaint";
+	name = "East Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/east)
 "mAy" = (
@@ -45195,6 +45415,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining"
+	},
 /turf/simulated/floor/grey,
 /area/station/mining/magnet)
 "nkD" = (
@@ -46308,6 +46532,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	name = "Auxiliary Docking Point"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/hallway/secondary/exit)
 "oeU" = (
@@ -46691,9 +46920,6 @@
 	},
 /area/station/solar/west)
 "osJ" = (
-/obj/rack,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/powermonitor_smes,
 /obj/machinery/camera{
 	c_tag = "autotag";
 	dir = 8;
@@ -46702,11 +46928,7 @@
 	tag = ""
 	},
 /obj/machinery/light_switch/east,
-/obj/item/circuitboard/genetics,
-/obj/item/circuitboard/bank_data,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/qmorder,
-/obj/item/circuitboard/telescope,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/grey/blackgrime/other,
 /area/station/storage/tech)
 "osY" = (
@@ -47454,6 +47676,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eva";
+	name = "EVA Storage";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/storage/eva)
 "oYA" = (
@@ -48008,6 +48235,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southwestinnermaint";
+	name = "Southwest Inner Maintenance";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/sw)
 "pst" = (
@@ -48091,6 +48323,10 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "westmaint";
+	name = "West Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "pvc" = (
@@ -48922,6 +49158,10 @@
 	},
 /obj/mapping_helper/firedoor_spawn,
 /obj/mapping_helper/access/mining,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "mining";
+	name = "Mining"
+	},
 /turf/simulated/floor/orangeblack,
 /area/station/mining/magnet)
 "qcA" = (
@@ -49023,6 +49263,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "qfh" = (
@@ -49243,7 +49488,7 @@
 /area/station/maintenance/southeast)
 "qpa" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -49378,7 +49623,7 @@
 /area/station/science/artifact)
 "qsS" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -49422,6 +49667,11 @@
 	dir = 4
 	},
 /area/station/hallway/secondary/exit)
+"qtY" = (
+/obj/surgery_tray,
+/obj/item/storage/box/popsicle_sticks,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/catering)
 "qub" = (
 /obj/table/reinforced/auto,
 /obj/item/sheet/glass/reinforced{
@@ -49572,6 +49822,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/caution/northsouth,
 /area/station/hallway/secondary/exit)
 "qym" = (
@@ -49938,6 +50193,10 @@
 /obj/cable/yellow{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastsolars";
+	name = "East Solars"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/solar/east)
 "qRw" = (
@@ -50402,6 +50661,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engineairbridge2";
+	name = "Engineering Airbridge 2";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/yellow/side{
 	dir = 1
 	},
@@ -51513,6 +51777,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eva";
+	name = "EVA Storage";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/west)
 "sbP" = (
@@ -52224,6 +52493,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eastinnermaint";
+	name = "East Inner Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/east)
 "sFU" = (
@@ -52235,6 +52508,10 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Inner Engineering"
+	},
 /turf/simulated/floor/engine/caution/north,
 /area/station/engine/core)
 "sFY" = (
@@ -54861,6 +55138,10 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southmaint";
+	name = "South Maintenance"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "uDK" = (
@@ -54939,6 +55220,10 @@
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/access/engineering_engine,
 /obj/machinery/atmospherics/pipe/simple/insulated,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Inner Engineering"
+	},
 /turf/simulated/floor/engine,
 /area/station/engine/core)
 "uGb" = (
@@ -56673,6 +56958,11 @@
 	req_access = null
 	},
 /obj/mapping_helper/access/research_foyer,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "research";
+	name = "Research";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/purple,
 /area/station/science/lobby)
 "vZg" = (
@@ -56928,6 +57218,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "podbay";
+	name = "Pod Bay";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/hangar/main)
 "wmg" = (
@@ -56981,6 +57276,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "eva";
+	name = "EVA Storage";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/west)
 "woi" = (
@@ -57284,6 +57584,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escapebay";
+	name = "Escape Pod Bay";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/caution/westeast,
 /area/station/hangar/escape)
 "wzw" = (
@@ -58409,8 +58714,8 @@
 /area/station/engine/gas)
 "xop" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/machinery/light_switch/east,
@@ -58522,6 +58827,11 @@
 	name = "Door-linked Atmospheric Forcefield";
 	powerlevel = 1
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "southwestinnermaint";
+	name = "Southwest Inner Maintenance";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/inner/sw)
 "xrD" = (
@@ -58870,6 +59180,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/red,
 /area/station/security/main)
 "xEf" = (
@@ -101456,9 +101771,9 @@ ccw
 cdo
 ceh
 cfc
-cfS
+gfC
 cgF
-lgW
+lPV
 cqM
 cqM
 cqM
@@ -107095,7 +107410,7 @@ acX
 fKp
 aca
 ael
-aeU
+cNE
 ael
 agG
 tOx
@@ -107699,7 +108014,7 @@ aaa
 aaO
 adp
 adp
-aeU
+cNE
 adp
 agG
 ahI
@@ -114398,7 +114713,7 @@ nbR
 sxr
 mLt
 pfT
-rck
+qtY
 rck
 ezJ
 wCK
diff --git a/maps/nadir.dmm b/maps/nadir.dmm
index 0161f732e6979..80625a1e765a1 100644
--- a/maps/nadir.dmm
+++ b/maps/nadir.dmm
@@ -4,6 +4,18 @@
 /obj/item/storage/box/nerd_kit,
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/arcade/dungeon)
+"aat" = (
+/obj/machinery/power/terminal{
+	dir = 4
+	},
+/obj/cable/orange,
+/obj/cable/orange{
+	icon_state = "1-10"
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 4
+	},
+/area/station/engine/ptl)
 "aaC" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -65,6 +77,19 @@
 /area/station/security/checkpoint/sec_foyer{
 	name = "Secure Release Foyer"
 	})
+"aby" = (
+/obj/machinery/light{
+	dir = 8;
+	layer = 9.1;
+	pixel_x = -10
+	},
+/obj/stool/chair/office/purple{
+	dir = 1
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 8
+	},
+/area/station/science/chemistry)
 "abz" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/maintenance/south)
@@ -160,10 +185,13 @@
 /obj/stool/chair/office/yellow{
 	dir = 8
 	},
+/mob/living/carbon/human/npc/monkey/mr_rathen,
 /obj/cable{
-	icon_state = "4-8"
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "1-8"
 	},
-/mob/living/carbon/human/npc/monkey/mr_rathen,
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "adR" = (
@@ -340,6 +368,18 @@
 	dir = 6
 	},
 /area/station/hallway/secondary/exit)
+"ahJ" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "se_breach";
+	name = "South East Breach Hull"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "ahN" = (
 /obj/machinery/door/poddoor/blast/pyro{
 	icon_state = "bdoormid1";
@@ -530,6 +570,18 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
+"all" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/stool/chair/office/purple{
+	dir = 8
+	},
+/turf/simulated/floor/black,
+/area/station/science/artifact)
 "alm" = (
 /obj/table/reinforced/bar/auto{
 	name = "wooden table"
@@ -541,7 +593,11 @@
 /obj/item/item_box/gold_star{
 	item_amount = 20;
 	pixel_x = -6;
-	pixel_y = 3
+	pixel_y = 8
+	},
+/obj/item/pinpointer/disk{
+	pixel_y = -3;
+	pixel_x = -6
 	},
 /turf/simulated/floor/carpet/blue/fancy/innercorner/nw_se,
 /area/station/bridge/captain)
@@ -804,13 +860,13 @@
 	name = "Book Nook"
 	})
 "arG" = (
-/obj/cable{
-	icon_state = "4-9"
-	},
 /obj/disposalpipe/segment/transport{
 	dir = 4;
 	icon_state = "pipe-c"
 	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/caution/east,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -1010,6 +1066,13 @@
 	},
 /turf/simulated/floor/industrial,
 /area/station/mining/staff_room)
+"axj" = (
+/obj/disposalpipe/segment/mail/horizontal,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/black,
+/area/station/hallway/primary/southeast)
 "axs" = (
 /obj/submachine/weapon_vendor/security,
 /turf/simulated/floor/redblack/corner{
@@ -1021,9 +1084,6 @@
 	dir = 1;
 	pixel_y = 21
 	},
-/obj/cable{
-	icon_state = "4-8"
-	},
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
@@ -1066,13 +1126,13 @@
 	name = "The Warrens"
 	})
 "ayN" = (
+/obj/item/device/radio/beacon,
 /obj/cable{
-	icon_state = "2-8"
+	icon_state = "4-8"
 	},
-/obj/cable{
-	icon_state = "2-4"
+/obj/cable/orange{
+	icon_state = "1-2"
 	},
-/obj/item/device/radio/beacon,
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "azi" = (
@@ -1338,6 +1398,9 @@
 "aEI" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/landmark/gps_waypoint,
+/obj/cable/orange{
+	icon_state = "1-6"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "aEN" = (
@@ -1366,24 +1429,6 @@
 	},
 /turf/simulated/floor/black/side,
 /area/station/hallway/primary/northeast)
-"aES" = (
-/obj/table/reinforced/auto,
-/obj/machinery/glass_recycler/bar,
-/obj/mapping_helper/access/kitchen,
-/obj/mapping_helper/access/bar,
-/obj/forcefield/energyshield/perma/doorlink,
-/obj/mapping_helper/firedoor_spawn,
-/obj/machinery/door/airlock/pyro/glass/windoor,
-/obj/machinery/door/poddoor/pyro{
-	density = 0;
-	icon_state = "pdoor0";
-	id = "kitchen";
-	layer = 4;
-	name = "Kitchen Shutter";
-	opacity = 0
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/kitchen)
 "aEY" = (
 /obj/machinery/manufacturer/general{
 	free_resource_amt = 1
@@ -1716,6 +1761,17 @@
 /area/station/engine/inner{
 	name = "Transception Array Control"
 	})
+"aPP" = (
+/obj/machinery/light/small{
+	dir = 8;
+	pixel_x = -12
+	},
+/obj/disposaloutlet/east,
+/obj/disposalpipe/trunk/produce{
+	dir = 4
+	},
+/turf/simulated/floor/specialroom/freezer,
+/area/station/crew_quarters/catering)
 "aPY" = (
 /obj/mapping_helper/wingrille_spawn/auto/crystal,
 /obj/cable,
@@ -1723,6 +1779,22 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
+"aQh" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "disposals";
+	name = "Disposals";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/black,
+/area/station/maintenance/outer/ne{
+	name = "Northeast Breach Hull"
+	})
 "aQs" = (
 /obj/machinery/door_control{
 	id = "cargogaming";
@@ -1756,6 +1828,12 @@
 /obj/machinery/chem_dispenser/chemical,
 /turf/simulated/floor/engine/caution/east,
 /area/station/medical/medbay/pharmacy)
+"aRr" = (
+/obj/stool/chair/office/yellow,
+/turf/simulated/floor/yellowblack{
+	dir = 6
+	},
+/area/station/engine/ptl)
 "aRF" = (
 /obj/disposalpipe/segment/bent/west,
 /turf/simulated/floor/black,
@@ -1793,6 +1871,12 @@
 /area/station/maintenance/outer/nw{
 	name = "Northwest Breach Hull"
 	})
+"aTf" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/engine/ptl)
 "aTq" = (
 /obj/machinery/conveyor/EW{
 	id = "ghostdrone"
@@ -2081,12 +2165,44 @@
 /obj/machinery/drone_recharger,
 /turf/simulated/floor/plating,
 /area/station/maintenance/north)
+"aYG" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/cable/orange{
+	icon_state = "0-9"
+	},
+/obj/cable/orange{
+	icon_state = "0-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "aYP" = (
 /obj/decal/tile_edge/floorguide/botany{
 	dir = 1
 	},
 /turf/simulated/floor/grey,
 /area/station/hallway/primary/southwest)
+"aYR" = (
+/obj/machinery/door_control{
+	id = "scienceteleporter2";
+	name = "Pad Access Door";
+	pixel_x = -8;
+	pixel_y = 26
+	},
+/obj/machinery/door_control{
+	id = "scienceteleporter";
+	name = "Pad Shutters";
+	pixel_x = 6;
+	pixel_y = 26
+	},
+/obj/stool/chair/office/purple{
+	dir = 4
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 1
+	},
+/area/station/science/teleporter)
 "aZc" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -2290,10 +2406,10 @@
 /turf/simulated/floor/grey/blackgrime/other,
 /area/station/storage/tech)
 "bdB" = (
-/obj/cable{
+/obj/disposalpipe/segment/transport,
+/obj/cable/orange{
 	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/transport,
 /turf/simulated/floor/yellowblack,
 /area/station/engine/engineering)
 "bdO" = (
@@ -2378,10 +2494,13 @@
 /area/station/science/bot_storage)
 "bfl" = (
 /obj/cable{
-	icon_state = "4-8"
+	icon_state = "1-2"
 	},
 /obj/cable{
-	icon_state = "2-4"
+	icon_state = "1-4"
+	},
+/obj/cable{
+	icon_state = "1-8"
 	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
@@ -2422,6 +2541,18 @@
 	dir = 8
 	},
 /area/station/hallway/primary/northeast)
+"bgU" = (
+/obj/table/auto,
+/obj/item/storage/box/glassbox{
+	pixel_y = 10;
+	pixel_x = 6
+	},
+/obj/item/gun/russianrevolver,
+/obj/machinery/phone/wall{
+	pixel_y = 32
+	},
+/turf/simulated/floor/carpet/grime,
+/area/station/crew_quarters/baroffice)
 "bgX" = (
 /obj/item/storage/toilet,
 /obj/landmark/pest,
@@ -2618,6 +2749,28 @@
 /obj/shrub,
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
+"bkC" = (
+/obj/table/auto,
+/obj/item/shaker/mustard{
+	pixel_x = -6
+	},
+/obj/item/shaker/salt,
+/obj/item/shaker/pepper{
+	pixel_x = 3
+	},
+/obj/item/shaker/ketchup{
+	pixel_x = 6
+	},
+/obj/item/paper_bin{
+	pixel_y = 15;
+	pixel_x = 7
+	},
+/obj/item/pen{
+	pixel_y = 13;
+	pixel_x = 3
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "bkJ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -2937,6 +3090,18 @@
 /obj/disposalpipe/junction/middle/east,
 /turf/simulated/floor/black/grime,
 /area/station/security/brig/genpop)
+"bru" = (
+/obj/grille/catwalk,
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/black/grime,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "brA" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -3231,6 +3396,18 @@
 	},
 /turf/simulated/floor/carpet/red/fancy/narrow/T_east,
 /area/station/crew_quarters/arcade/dungeon)
+"bva" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/engine/caution/northsouth,
+/area/station/hallway/secondary/exit)
 "bvo" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -3537,9 +3714,6 @@
 /obj/machinery/door/airlock/pyro/engineering/alt{
 	dir = 4
 	},
-/obj/cable{
-	icon_state = "4-8"
-	},
 /obj/mapping_helper/access/engineering_engine,
 /obj/disposalpipe/segment/transport{
 	dir = 4
@@ -3547,6 +3721,9 @@
 /obj/forcefield/energyshield/perma/doorlink{
 	dir = 8
 	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/industrial,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -3636,6 +3813,15 @@
 	dir = 10
 	},
 /area/station/hallway/secondary/west)
+"bFd" = (
+/obj/grille/catwalk,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black/grime,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "bFf" = (
 /obj/machinery/door/unpowered/wood/pyro{
 	dir = 4
@@ -3804,15 +3990,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/northwest)
-"bJp" = (
-/obj/machinery/door/airlock/pyro/engineering/alt,
-/obj/mapping_helper/access/engineering_engine,
-/obj/forcefield/energyshield/perma/doorlink,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/engine,
-/area/station/engine/monitoring{
-	name = "Nuclear Control Room"
-	})
 "bJE" = (
 /obj/machinery/chem_dispenser/chemical,
 /turf/simulated/floor/engine/caution/north,
@@ -3856,6 +4033,14 @@
 /obj/machinery/drone_recharger,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northeast)
+"bKJ" = (
+/obj/cable/yellow{
+	icon_state = "4-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "bKL" = (
 /obj/landmark/halloween,
 /obj/machinery/drainage,
@@ -3912,16 +4097,6 @@
 	},
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/quarters_east)
-"bMa" = (
-/obj/table/auto,
-/obj/item/storage/box/glassbox,
-/obj/item/storage/box/glassbox,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/machinery/light_switch/west,
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "bMf" = (
 /turf/simulated/floor/purpleblack/corner,
 /area/station/teleporter)
@@ -4019,19 +4194,6 @@
 /obj/disposalpipe/segment/vertical,
 /turf/simulated/floor/carpet/grime,
 /area/station/crew_quarters/arcade/dungeon)
-"bOo" = (
-/obj/machinery/door/airlock/pyro/command/alt{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/mapping_helper/access/ai_upload,
-/obj/forcefield/energyshield/perma/doorlink{
-	dir = 8
-	},
-/turf/simulated/floor/darkblue,
-/area/station/turret_protected/ai)
 "bOK" = (
 /obj/machinery/conveyor{
 	dir = 8;
@@ -4433,12 +4595,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/storage/emergencyinternals)
-"bYc" = (
-/obj/table/reinforced/auto,
-/obj/item/reagent_containers/food/drinks/bowl,
-/obj/item/kitchen/utensil/spoon,
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "bZd" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -4491,6 +4647,9 @@
 /area/pasiphae/sys)
 "caB" = (
 /obj/landmark/gps_waypoint,
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -4611,13 +4770,10 @@
 	},
 /area/station/medical/medbay/cloner)
 "cec" = (
-/obj/cable{
+/obj/disposalpipe/segment/transport,
+/obj/cable/orange{
 	icon_state = "1-2"
 	},
-/obj/cable{
-	icon_state = "2-8"
-	},
-/obj/disposalpipe/segment/transport,
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "ceL" = (
@@ -4671,13 +4827,6 @@
 /obj/machinery/power/data_terminal,
 /turf/simulated/floor/engine,
 /area/station/communications/centre)
-"cfT" = (
-/obj/stool/chair,
-/obj/decal/tile_edge/line/black{
-	icon_state = "line1"
-	},
-/turf/simulated/floor/black,
-/area/station/crew_quarters/cafeteria)
 "cfX" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -4770,10 +4919,6 @@
 /obj/window_blinds/cog2/left,
 /turf/simulated/floor/plating,
 /area/station/medical/medbay/treatment2)
-"chV" = (
-/obj/stool/chair,
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "cib" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/camera{
@@ -4952,6 +5097,25 @@
 	dir = 4
 	},
 /area/listeningpost)
+"cla" = (
+/obj/machinery/light{
+	dir = 8;
+	layer = 9.1;
+	pixel_x = -10
+	},
+/obj/table/reinforced/chemistry/auto{
+	name = "prep counter"
+	},
+/obj/machinery/espresso_machine{
+	pixel_y = 5
+	},
+/obj/noticeboard/persistent{
+	name = "Bar persistent notice board";
+	persistent_id = "bar"
+	},
+/obj/item/reagent_containers/food/drinks/espressocup,
+/turf/simulated/floor/engine,
+/area/station/crew_quarters/cafeteria)
 "clb" = (
 /obj/storage/secure/closet/brig,
 /turf/simulated/floor/redblack,
@@ -5243,21 +5407,6 @@
 /obj/stool/bench/red/auto,
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/sauna)
-"crU" = (
-/obj/machinery/door/airlock/pyro/security/alt,
-/obj/mapping_helper/access/brig,
-/obj/disposalpipe/segment/brig{
-	dir = 1
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/redblack{
-	dir = 1
-	},
-/area/station/security/interrogation)
 "crV" = (
 /obj/machinery/portable_atmospherics/scrubber,
 /turf/simulated/floor/plating,
@@ -5669,16 +5818,6 @@
 /area/station/maintenance/outer/nw{
 	name = "Northwest Breach Hull"
 	})
-"cDt" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/machinery/chem_dispenser/soda,
-/obj/machinery/light/emergency,
-/turf/simulated/floor/engine/caution/east,
-/area/station/crew_quarters/cafeteria)
 "cEo" = (
 /obj/storage/closet/wardrobe/grey,
 /obj/disposalpipe/segment/mail/vertical,
@@ -6062,14 +6201,6 @@
 /obj/disposalpipe/trunk/east,
 /turf/simulated/floor/black/grime,
 /area/station/maintenance/southwest)
-"cNv" = (
-/obj/machinery/door/airlock/pyro/command/alt,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/access/ai_upload,
-/turf/simulated/floor/engine,
-/area/station/turret_protected/ai_upload)
 "cNE" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -6339,25 +6470,32 @@
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
 	})
-"cSI" = (
-/obj/table/reinforced/bar/auto,
-/obj/item/shaker/mustard{
-	pixel_x = -1;
-	pixel_y = 8
+"cTx" = (
+/obj/machinery/door/poddoor/blast/pyro{
+	density = 0;
+	dir = 4;
+	icon_state = "bdoormid0";
+	id = "nadir_nukecore";
+	name = "Reactor Core Shielding";
+	opacity = 0
 	},
-/obj/item/shaker/ketchup{
-	pixel_x = 8;
-	pixel_y = 3
+/obj/machinery/door/airlock/pyro/glass/engineering{
+	dir = 4;
+	name = "Secondary Core Access"
 	},
-/obj/item/shaker/pepper{
-	pixel_x = -5;
-	pixel_y = 3
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "4-8"
 	},
-/obj/item/shaker/salt{
-	pixel_x = 3
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactorside";
+	name = "Reactor Side";
+	enter_id = "inner"
 	},
-/turf/simulated/floor/carpet/green/standard/narrow/northsouth,
-/area/station/crew_quarters/cafeteria)
+/turf/simulated/floor/engine,
+/area/station/engine/core/nuclear)
 "cTz" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -6415,6 +6553,15 @@
 	dir = 8
 	},
 /area/station/hallway/primary/northwest)
+"cUo" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "cUu" = (
 /obj/machinery/power/data_terminal,
 /obj/landmark/start/job/AI,
@@ -6763,6 +6910,15 @@
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
+"dbo" = (
+/obj/disposalpipe/segment/transport,
+/obj/cable/yellow{
+	icon_state = "4-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "dbE" = (
 /obj/table/reinforced/auto,
 /obj/item/kitchen/food_box/donut_box{
@@ -6841,6 +6997,25 @@
 /obj/forcefield/energyshield/perma/doorlink,
 /turf/simulated/floor/black/side,
 /area/station/crew_quarters/arcade)
+"ddF" = (
+/obj/machinery/door/airlock/pyro/security/alt{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/access/security,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "brig"
+	},
+/turf/simulated/floor/black,
+/area/station/security/brig)
 "ddM" = (
 /obj/grille/catwalk,
 /obj/random_item_spawner/junk/one_or_zero,
@@ -6944,26 +7119,6 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
-"dhp" = (
-/obj/stool/chair/office{
-	dir = 4
-	},
-/obj/machinery/door_control{
-	id = "scienceteleporter2";
-	name = "Pad Access Door";
-	pixel_x = -8;
-	pixel_y = 26
-	},
-/obj/machinery/door_control{
-	id = "scienceteleporter";
-	name = "Pad Shutters";
-	pixel_x = 6;
-	pixel_y = 26
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 1
-	},
-/area/station/science/teleporter)
 "dhu" = (
 /obj/reagent_dispensers/foamtank,
 /obj/machinery/light{
@@ -6971,6 +7126,9 @@
 	layer = 9.1;
 	pixel_y = 21
 	},
+/obj/cable{
+	icon_state = "2-6"
+	},
 /turf/simulated/floor/engine/caution/corner{
 	dir = 4
 	},
@@ -7251,14 +7409,6 @@
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
 	})
-"dqo" = (
-/obj/machinery/light/small{
-	dir = 8;
-	pixel_x = -12
-	},
-/obj/reagent_dispensers/beerkeg,
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "dqs" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -7469,6 +7619,17 @@
 	},
 /turf/simulated/floor/black/grime,
 /area/station/security/brig/genpop)
+"dvF" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "dvO" = (
 /obj/table/reinforced/auto,
 /obj/item/reagent_containers/food/snacks/cereal_box{
@@ -7685,6 +7846,9 @@
 "dyF" = (
 /obj/machinery/portable_reclaimer,
 /obj/decal/cleanable/dirt,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
@@ -7825,6 +7989,24 @@
 /obj/disposalpipe/segment/produce,
 /turf/simulated/floor/greenblack,
 /area/station/ranch)
+"dBq" = (
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/disposalpipe/segment/ejection{
+	dir = 2
+	},
+/obj/mapping_helper/access/security,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "secinterro1";
+	name = "Security Interrogation 1";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/redblack,
+/area/station/security/interrogation)
 "dBr" = (
 /obj/landmark/gps_waypoint,
 /obj/disposalpipe/segment/vertical,
@@ -7916,6 +8098,9 @@
 /obj/cable/yellow{
 	icon_state = "1-10"
 	},
+/obj/cable/yellow{
+	icon_state = "4-10"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -8082,6 +8267,11 @@
 "dFR" = (
 /turf/simulated/floor/plating,
 /area/station/maintenance/south)
+"dFX" = (
+/obj/machinery/light_switch/west,
+/obj/reagent_dispensers/beerkeg,
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "dGx" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -8303,7 +8493,7 @@
 	})
 "dMn" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -8366,6 +8556,9 @@
 	})
 "dOr" = (
 /obj/disposalpipe/segment/mail/vertical,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/yellowblack,
 /area/station/hallway/primary/southeast)
 "dOz" = (
@@ -8419,6 +8612,14 @@
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
 	})
+"dQV" = (
+/obj/cable/yellow{
+	icon_state = "5-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "dRl" = (
 /obj/fitness/speedbag/wizard,
 /obj/machinery/light{
@@ -8943,6 +9144,16 @@
 /obj/machinery/vending/cigarette,
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southwest)
+"ecJ" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/engine/caution/northsouth,
+/area/station/hallway/secondary/exit)
 "ecQ" = (
 /obj/reagent_dispensers/watertank/fountain,
 /turf/simulated/floor/wood/two,
@@ -9110,6 +9321,18 @@
 	dir = 6
 	},
 /area/station/hallway/secondary/exit)
+"ehU" = (
+/obj/machinery/light{
+	dir = 8;
+	layer = 9.1;
+	pixel_x = -10
+	},
+/obj/machinery/light/emergency,
+/obj/machinery/chem_master{
+	dir = 4
+	},
+/turf/simulated/floor/engine/caution/east,
+/area/station/crew_quarters/cafeteria)
 "eio" = (
 /obj/decal/cleanable/dirt,
 /turf/space/fluid/acid/clear,
@@ -9272,6 +9495,37 @@
 /obj/machinery/light/runway_light/delay3,
 /turf/space/fluid/acid/clear,
 /area/space)
+"emf" = (
+/obj/table/reinforced/auto,
+/obj/item/kitchen/utensil/fork{
+	dir = 4;
+	pixel_y = 10;
+	pixel_x = -2
+	},
+/obj/item/kitchen/utensil/spoon{
+	dir = 4;
+	pixel_y = -6;
+	pixel_x = -2
+	},
+/obj/item/plate{
+	pixel_y = 5;
+	pixel_x = -2;
+	grabs_food_on_spawn = 0
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icewater{
+	pixel_x = 11;
+	pixel_y = 4
+	},
+/obj/item/shaker/ketchup{
+	pixel_y = -7;
+	pixel_x = 3
+	},
+/obj/item/shaker/mustard{
+	pixel_y = -7;
+	pixel_x = -2
+	},
+/turf/simulated/floor/wood,
+/area/station/crew_quarters/cafeteria)
 "eml" = (
 /obj/machinery/power/catalytic_generator,
 /obj/cable/yellow{
@@ -9498,7 +9752,7 @@
 	})
 "ers" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_y = 4
 	},
 /turf/simulated/floor/black,
@@ -9551,6 +9805,16 @@
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
+"esW" = (
+/obj/machinery/shower{
+	dir = 1;
+	pixel_y = 20
+	},
+/obj/stool/bench/purple/auto,
+/turf/simulated/floor/sanitary/white,
+/area/station/science/lobby{
+	name = "Science Lounge"
+	})
 "etS" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -9630,6 +9894,14 @@
 	},
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/showers)
+"euK" = (
+/obj/cable/orange{
+	icon_state = "1-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "euV" = (
 /obj/cable{
 	icon_state = "0-4"
@@ -9650,16 +9922,6 @@
 /obj/submachine/slot_machine,
 /turf/simulated/floor/black/grime,
 /area/station/security/brig/genpop)
-"evN" = (
-/obj/table/reinforced/auto,
-/obj/item/shaker/ketchup{
-	pixel_x = 6
-	},
-/obj/item/shaker/mustard{
-	pixel_x = -6
-	},
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "evR" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -9789,6 +10051,18 @@
 /obj/blind_switch/area/west,
 /turf/simulated/floor/black,
 /area/station/security/hos)
+"eze" = (
+/obj/machinery/light/small{
+	dir = 4;
+	pixel_x = 12
+	},
+/obj/table/auto,
+/obj/item/storage/box/glassbox{
+	pixel_y = 9;
+	pixel_x = 2
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "ezi" = (
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/black,
@@ -10013,6 +10287,9 @@
 /obj/cable{
 	icon_state = "5-10"
 	},
+/obj/cable{
+	icon_state = "9-10"
+	},
 /turf/simulated/floor/engine/caution/corner2{
 	dir = 9
 	},
@@ -10028,6 +10305,18 @@
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/carpet/purple/fancy/innercorner/omni,
 /area/station/science/research_director)
+"eFo" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sw_breach";
+	name = "South West Breach Hull"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/sw{
+	name = "Southwest Breach Hull"
+	})
 "eFA" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -10625,11 +10914,17 @@
 /turf/simulated/floor/grey,
 /area/station/hallway/primary/northeast)
 "eRb" = (
-/obj/landmark/random_room/size5x3,
-/turf/simulated/floor/plating,
-/area/station/maintenance/outer/se{
-	name = "Southeast Breach Hull"
-	})
+/obj/machinery/computer/power_monitor/smes{
+	dir = 4;
+	name = "Engine Output Monitoring"
+	},
+/obj/cable/orange{
+	icon_state = "0-5"
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 10
+	},
+/area/station/engine/ptl)
 "eRl" = (
 /obj/disposalpipe/segment/mail/vertical,
 /obj/machinery/light/incandescent/netural{
@@ -10790,6 +11085,20 @@
 /area/station/hallway/secondary/entry{
 	name = "Arrival Shuttle Hallway"
 	})
+"eTX" = (
+/obj/machinery/door/poddoor/blast/pyro{
+	density = 0;
+	dir = 4;
+	icon_state = "bdoormid0";
+	id = "nadir_nukecore";
+	name = "Reactor Core Shielding";
+	opacity = 0
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/engine,
+/area/station/engine/core/nuclear)
 "eUd" = (
 /obj/table/reinforced/auto,
 /obj/item/device/analyzer/healthanalyzer{
@@ -10864,6 +11173,22 @@
 "eVi" = (
 /turf/simulated/floor/black,
 /area/station/crew_quarters/quarters_east)
+"eVm" = (
+/obj/machinery/secscanner{
+	pixel_y = 10
+	},
+/obj/disposalpipe/segment/mail/vertical,
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/mapping_helper/access/security,
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/black,
+/area/station/security/main)
 "eVr" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -11076,6 +11401,16 @@
 	},
 /turf/simulated/floor/purpleblack,
 /area/pasiphae/survey)
+"fac" = (
+/obj/disposalpipe/segment/transport,
+/obj/cable{
+	icon_state = "2-4"
+	},
+/obj/cable{
+	icon_state = "1-4"
+	},
+/turf/simulated/floor/black,
+/area/station/hallway/secondary/east)
 "fag" = (
 /obj/machinery/navbeacon/mule/toolstorage_north,
 /obj/decal/stripe_caution,
@@ -11127,6 +11462,9 @@
 	dir = 8
 	},
 /area/station/medical/medbay/lobby)
+"fbQ" = (
+/turf/simulated/floor/engine,
+/area/station/engine/ptl)
 "fbR" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -11249,6 +11587,18 @@
 /obj/landmark/halloween,
 /turf/simulated/floor/black,
 /area/station/hallway/primary/northeast)
+"fgI" = (
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/access/engineering_mechanic,
+/obj/mapping_helper/access/engineering,
+/obj/disposalpipe/segment/mail/vertical,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/yellow,
+/area/station/engine/ptl)
 "fhi" = (
 /obj/grille/catwalk,
 /obj/cable{
@@ -11267,14 +11617,6 @@
 	},
 /area/listeningpost)
 "fhp" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/qmsupply,
 /obj/machinery/light/small{
 	dir = 4;
 	pixel_x = 12
@@ -11283,30 +11625,27 @@
 	icon_state = "0-8"
 	},
 /obj/machinery/power/apc/autoname_north,
-/obj/item/circuitboard/transception,
+/obj/rack/organized/techstorage_eng/transception,
 /turf/simulated/floor/grey/blackgrime/other,
 /area/station/storage/tech)
+"fhD" = (
+/obj/machinery/power/apc/autoname_west,
+/obj/cable,
+/obj/machinery/light{
+	dir = 1;
+	layer = 9.1;
+	pixel_y = 21
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 9
+	},
+/area/station/engine/ptl)
 "fip" = (
 /obj/machinery/light/small/floor/netural,
 /turf/simulated/floor/black,
 /area/station/science/lobby{
 	name = "Science Lounge"
 	})
-"fir" = (
-/obj/table/auto,
-/obj/item/paper_bin{
-	pixel_y = 7
-	},
-/obj/item/pen,
-/obj/item/storage/box/fruit_wedges,
-/obj/item/storage/box/cocktail_umbrellas,
-/obj/item/storage/box/cocktail_doodads,
-/obj/machinery/power/apc/autoname_east,
-/obj/cable{
-	icon_state = "0-8"
-	},
-/turf/simulated/floor/carpet/grime,
-/area/station/crew_quarters/baroffice)
 "fix" = (
 /obj/stool/chair/office/green{
 	dir = 8
@@ -11396,6 +11735,17 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/medical/medbay/surgery)
+"fkY" = (
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/obj/cable/yellow{
+	icon_state = "2-9"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "fkZ" = (
 /obj/disposalpipe/segment/vertical,
 /obj/cable{
@@ -11567,6 +11917,23 @@
 /area/station/bridge/customs{
 	name = "Bridge Reception"
 	})
+"fpe" = (
+/obj/machinery/light/small{
+	dir = 8;
+	pixel_x = -12
+	},
+/obj/rack,
+/obj/item/reagent_containers/food/drinks/juicer{
+	pixel_y = 5
+	},
+/obj/item/storage/box/fruit_wedges{
+	pixel_x = 6
+	},
+/obj/item/storage/box/beer{
+	pixel_x = -6
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "fpk" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable{
@@ -11802,6 +12169,14 @@
 	dir = 6
 	},
 /area/station/hallway/secondary/exit)
+"ftE" = (
+/obj/cable{
+	icon_state = "1-4"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "ftF" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -12498,6 +12873,19 @@
 	},
 /turf/simulated/floor/redblack,
 /area/station/security/main)
+"fFH" = (
+/obj/machinery/door/airlock/pyro/command/alt,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/access/ai_upload,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/engine,
+/area/station/turret_protected/ai_upload)
 "fFJ" = (
 /obj/cable{
 	icon_state = "1-8"
@@ -12741,6 +13129,20 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/baroffice)
+"fMr" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 5;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/obj/machinery/light_switch/west,
+/obj/table/reinforced/chemistry/auto{
+	name = "prep counter"
+	},
+/turf/simulated/floor/engine,
+/area/station/crew_quarters/cafeteria)
 "fMs" = (
 /obj/table/reinforced/auto,
 /obj/item/storage/firstaid/brain,
@@ -12788,18 +13190,6 @@
 "fNc" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/shuttle/sea_elevator_room)
-"fNd" = (
-/obj/stool/chair{
-	dir = 4
-	},
-/obj/landmark/start/job/scientist,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/yellowblack{
-	dir = 1
-	},
-/area/station/science/hall)
 "fNn" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -12886,11 +13276,13 @@
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southwest)
 "fNZ" = (
-/obj/cable{
-	icon_state = "2-8"
+/obj/cable/yellow{
+	icon_state = "5-8"
 	},
-/turf/simulated/floor/black,
-/area/station/engine/elect)
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "fPl" = (
 /obj/machinery/light/small{
 	dir = 1;
@@ -13021,18 +13413,6 @@
 	},
 /turf/unsimulated/floor/sanitary,
 /area/station/crewquarters/cryotron)
-"fRH" = (
-/obj/stool/chair/office{
-	dir = 8
-	},
-/obj/cable{
-	icon_state = "1-8"
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/turf/simulated/floor/black,
-/area/station/science/artifact)
 "fRN" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -13091,6 +13471,29 @@
 /obj/pool_springboard,
 /turf/simulated/floor/white/checker,
 /area/station/crew_quarters/pool)
+"fSV" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
+"fTc" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/cable/orange{
+	icon_state = "6-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "fTk" = (
 /obj/cable{
 	icon_state = "2-5"
@@ -13155,16 +13558,10 @@
 	name = "Science Lounge"
 	})
 "fTY" = (
-/obj/disposalpipe/segment/transport{
+/turf/simulated/floor/engine/caution/corner{
 	dir = 4
 	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/industrial,
-/area/station/maintenance/outer/se{
-	name = "Southeast Breach Hull"
-	})
+/area/station/engine/ptl)
 "fTZ" = (
 /obj/disposalpipe/segment/bent/north,
 /obj/table/auto,
@@ -13252,6 +13649,9 @@
 /area/station/engine/substation/north{
 	name = "North Catalytic Substation"
 	})
+"fXq" = (
+/turf/simulated/floor/engine/caution/west,
+/area/station/engine/ptl)
 "fXu" = (
 /obj/machinery/guardbot_dock,
 /obj/machinery/power/data_terminal,
@@ -13353,27 +13753,6 @@
 	dir = 1
 	},
 /area/station/security/equipment)
-"fZM" = (
-/obj/table/auto,
-/obj/item/storage/box/glassbox,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shot,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shot,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shot,
-/obj/item/reagent_containers/food/drinks/drinkingglass/shot,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/wine,
-/obj/item/reagent_containers/food/drinks/drinkingglass/cocktail,
-/obj/item/reagent_containers/food/drinks/drinkingglass/cocktail,
-/obj/item/reagent_containers/food/drinks/drinkingglass/cocktail,
-/obj/item/reagent_containers/food/drinks/drinkingglass/cocktail,
-/obj/item/gun/russianrevolver,
-/obj/machinery/phone/wall{
-	pixel_y = 32
-	},
-/turf/simulated/floor/carpet/grime,
-/area/station/crew_quarters/baroffice)
 "fZP" = (
 /obj/reagent_dispensers/still,
 /turf/simulated/floor/black/grime,
@@ -13772,6 +14151,9 @@
 /obj/cable/yellow{
 	icon_state = "1-6"
 	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -14191,6 +14573,13 @@
 	dir = 4
 	},
 /area/station/security/equipment)
+"grf" = (
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
+	dir = 4
+	},
+/turf/simulated/floor/black,
+/area/station/science/hall)
 "grh" = (
 /obj/table/reinforced/bar/auto{
 	name = "wooden table"
@@ -15176,6 +15565,24 @@
 /obj/stool/bench/blue/auto,
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/showers)
+"gKi" = (
+/obj/decal/tile_edge/line/black{
+	dir = 1;
+	icon_state = "line1"
+	},
+/obj/storage/crate{
+	name = "chair crate"
+	},
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/obj/item/chair/folded,
+/turf/simulated/floor/black,
+/area/station/crew_quarters/cafeteria)
 "gKn" = (
 /obj/stool/chair/couch{
 	dir = 8
@@ -15968,6 +16375,9 @@
 /area/station/hallway/secondary/entry{
 	name = "Arrival Shuttle Hallway"
 	})
+"ham" = (
+/turf/simulated/floor/engine/caution/east,
+/area/station/engine/ptl)
 "has" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -16031,6 +16441,15 @@
 	},
 /turf/simulated/floor/engine,
 /area/station/communications/centre)
+"hbd" = (
+/obj/disposalpipe/segment/vertical,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 4
+	},
+/area/station/hallway/secondary/east)
 "hbK" = (
 /obj/machinery/light,
 /obj/cable{
@@ -16327,6 +16746,9 @@
 /obj/cable/orange{
 	icon_state = "1-4"
 	},
+/obj/cable/orange{
+	icon_state = "4-10"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/monitoring{
 	name = "Nuclear Control Room"
@@ -16345,13 +16767,15 @@
 "hix" = (
 /obj/machinery/door/airlock/pyro/engineering/alt,
 /obj/mapping_helper/access/engineering_mechanic,
-/obj/mapping_helper/access/engineering,
 /obj/cable{
 	icon_state = "1-2"
 	},
 /obj/forcefield/energyshield/perma/doorlink,
 /obj/disposalpipe/segment/transport,
 /obj/mapping_helper/firedoor_spawn,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/yellowblack{
 	dir = 1
 	},
@@ -17700,10 +18124,16 @@
 	},
 /obj/table/auto,
 /obj/item/storage/toolbox/mechanical{
-	pixel_y = 7
+	pixel_y = 7;
+	pixel_x = 6
 	},
 /obj/item/aiModule/hologram_expansion/syndicate{
-	pixel_y = -4
+	pixel_y = -4;
+	pixel_x = 5
+	},
+/obj/item/pinpointer/disk{
+	pixel_y = 2;
+	pixel_x = -6
 	},
 /turf/simulated/floor/engine/caution/north,
 /area/listeningpost/power)
@@ -17791,16 +18221,6 @@
 	dir = 1
 	},
 /area/station/engine/elect)
-"hJQ" = (
-/obj/stool/bench/blue/auto,
-/obj/machinery/shower{
-	dir = 1;
-	pixel_y = 20
-	},
-/turf/simulated/floor/sanitary/white,
-/area/station/science/lobby{
-	name = "Science Lounge"
-	})
 "hJR" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -17842,6 +18262,20 @@
 /area/iss{
 	name = "Drop Capsule"
 	})
+"hLA" = (
+/obj/storage/crate{
+	name = "Cone Crate"
+	},
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/ice_cream_cone,
+/obj/item/reagent_containers/food/snacks/condiment/chocchips,
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "hLN" = (
 /turf/unsimulated/wall/setpieces/leadwall/white_2{
 	dir = 10
@@ -17913,6 +18347,15 @@
 /obj/machinery/firealarm/east,
 /turf/simulated/floor/black/grime,
 /area/station/security/brig/genpop)
+"hMY" = (
+/obj/disposalpipe/segment/transport{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "hNh" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /turf/simulated/floor/plating,
@@ -18144,17 +18587,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/medical/robotics)
-"hRU" = (
-/obj/stool/chair/office{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/science/chemistry)
 "hRZ" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -18223,15 +18655,6 @@
 	dir = 6
 	},
 /area/station/engine/core/nuclear)
-"hTd" = (
-/obj/machinery/door/airlock/pyro/command/alt,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/access/ai_upload,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/engine/caution/south,
-/area/station/turret_protected/ai_upload)
 "hTu" = (
 /obj/machinery/disposal/brig,
 /obj/disposalpipe/trunk/brig{
@@ -18824,18 +19247,6 @@
 /area/station/science/construction{
 	name = "Extraction Nexus"
 	})
-"ieu" = (
-/obj/machinery/door/airlock/pyro/engineering/alt,
-/obj/mapping_helper/access/engineering_engine,
-/obj/forcefield/energyshield/perma/doorlink,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/engine,
-/area/station/engine/monitoring{
-	name = "Nuclear Control Room"
-	})
 "ieD" = (
 /obj/storage/closet/medicalclothes,
 /obj/machinery/firealarm{
@@ -19120,6 +19531,23 @@
 	},
 /turf/simulated/floor/purpleblack,
 /area/station/teleporter)
+"ikw" = (
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactormain";
+	name = "Reactor Main";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/yellow,
+/area/station/engine/monitoring{
+	name = "Nuclear Control Room"
+	})
 "iky" = (
 /obj/machinery/recharge_station,
 /turf/simulated/floor/plating,
@@ -19131,6 +19559,26 @@
 /obj/machinery/meter,
 /turf/simulated/floor/engine/caution/east,
 /area/station/engine/core/nuclear)
+"ikQ" = (
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/mapping_helper/access/brig,
+/obj/disposalpipe/segment/brig{
+	dir = 1
+	},
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "secinterro2";
+	name = "Security Interrogation 2";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/redblack{
+	dir = 1
+	},
+/area/station/security/interrogation)
 "ili" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk/south,
@@ -19523,6 +19971,32 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
+"itD" = (
+/obj/item/storage/firstaid/toxin,
+/obj/item/device/reagentscanner{
+	pixel_y = -2;
+	pixel_x = 8
+	},
+/obj/item/reagent_containers/dropper/mechanical{
+	pixel_y = 7;
+	pixel_x = -10
+	},
+/obj/item/clothing/glasses/spectro{
+	pixel_y = 11;
+	pixel_x = 1
+	},
+/obj/machinery/door_control{
+	id = "nadir_barchem";
+	name = "Bar Chem-Safety Shutters";
+	pixel_x = -24
+	},
+/obj/table/reinforced/chemistry/auto{
+	name = "prep counter"
+	},
+/turf/simulated/floor/engine/caution/corner{
+	dir = 1
+	},
+/area/station/crew_quarters/baroffice)
 "itK" = (
 /turf/simulated/floor/grey/side{
 	dir = 8
@@ -20016,6 +20490,14 @@
 /area/station/maintenance/outer/nw{
 	name = "Northwest Breach Hull"
 	})
+"iDK" = (
+/obj/cable/orange{
+	icon_state = "6-9"
+	},
+/turf/simulated/floor/industrial,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "iDO" = (
 /obj/disposalpipe/segment/brig{
 	dir = 8
@@ -20185,6 +20667,10 @@
 	dir = 8
 	},
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ne_breach";
+	name = "North East Breach Hull"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/ne{
 	name = "Northeast Breach Hull"
@@ -20595,22 +21081,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/security/brig)
-"iUn" = (
-/obj/machinery/chem_master{
-	dir = 4
-	},
-/obj/machinery/light_switch/west,
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 5;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
-	},
-/turf/simulated/floor/engine/caution/corner{
-	dir = 4
-	},
-/area/station/crew_quarters/cafeteria)
 "iUo" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -20689,6 +21159,23 @@
 	dir = 4
 	},
 /area/station/hallway/secondary/east)
+"iVM" = (
+/obj/machinery/shower{
+	dir = 4;
+	pixel_x = 8;
+	pixel_y = 8
+	},
+/obj/machinery/drainage,
+/obj/machinery/firealarm{
+	dir = 4;
+	pixel_x = 24;
+	pixel_y = -3
+	},
+/obj/stool/bench/purple/auto,
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/science/chemistry)
 "iWu" = (
 /obj/stool/chair/yellow{
 	dir = 4
@@ -20781,15 +21268,8 @@
 /turf/simulated/wall/auto/supernorn,
 /area/station/crew_quarters/sauna)
 "iXQ" = (
-/obj/machinery/door/airlock/pyro/maintenance/alt{
-	name = "Auxiliary Compartment"
-	},
-/obj/mapping_helper/access/maint,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/industrial,
-/area/station/maintenance/outer/se{
-	name = "Southeast Breach Hull"
-	})
+/turf/simulated/wall/auto/reinforced/supernorn,
+/area/station/engine/ptl)
 "iXS" = (
 /obj/disposalpipe/junction/left/north{
 	name = "factory pipe"
@@ -20804,7 +21284,7 @@
 /area/station/crew_quarters/quarters_east)
 "iYa" = (
 /obj/storage/closet/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /turf/simulated/floor/industrial,
 /area/iss{
 	name = "Drop Capsule"
@@ -21232,14 +21712,7 @@
 	},
 /area/station/security/main)
 "jfZ" = (
-/obj/rack,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/powermonitor_smes,
-/obj/item/circuitboard/genetics,
-/obj/item/circuitboard/bank_data,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/qmorder,
-/obj/item/circuitboard/telescope,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/grey/blackgrime/other,
 /area/station/storage/tech)
 "jge" = (
@@ -21546,6 +22019,16 @@
 	dir = 4
 	},
 /area/station/hallway/secondary/west)
+"jpM" = (
+/obj/machinery/light/small,
+/obj/stool/bed,
+/obj/item/clothing/suit/bedsheet{
+	bcolor = "black";
+	icon_state = "bedsheet-black"
+	},
+/obj/landmark/start/job/bartender,
+/turf/simulated/floor/carpet/grime,
+/area/station/crew_quarters/baroffice)
 "jpQ" = (
 /obj/table/reinforced/auto,
 /obj/machinery/computer/security/wooden_tv/small,
@@ -21575,6 +22058,14 @@
 /obj/forcefield/energyshield/perma/doorlink,
 /turf/simulated/floor/grey,
 /area/station/crewquarters/cryotron)
+"jqr" = (
+/obj/cable/orange{
+	icon_state = "4-9"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "jqC" = (
 /obj/machinery/power/smes,
 /obj/cable{
@@ -21921,12 +22412,6 @@
 /area/station/security/checkpoint/sec_foyer{
 	name = "Secure Release Foyer"
 	})
-"jwF" = (
-/obj/stool/chair{
-	dir = 1
-	},
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "jwP" = (
 /obj/machinery/light/small{
 	dir = 1;
@@ -22015,18 +22500,6 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southwest)
-"jyj" = (
-/obj/machinery/door/airlock/pyro/engineering/alt,
-/obj/mapping_helper/access/engineering_engine,
-/obj/forcefield/energyshield/perma/doorlink,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/yellow,
-/area/station/engine/monitoring{
-	name = "Nuclear Control Room"
-	})
 "jyz" = (
 /turf/simulated/floor/stairs/dark{
 	dir = 8
@@ -22445,6 +22918,15 @@
 	dir = 8
 	},
 /area/station/storage/emergency2)
+"jIK" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "jJa" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/window_blinds/cog2/middle,
@@ -22549,6 +23031,14 @@
 /obj/window_blinds/cog2/left,
 /turf/simulated/floor/plating,
 /area/station/medical/medbay/surgery)
+"jMd" = (
+/obj/machinery/firealarm/west,
+/obj/machinery/chem_dispenser/alcohol/bar,
+/obj/item/reagent_containers/food/drinks/drinkingglass/pitcher,
+/turf/simulated/floor/engine/caution/corner{
+	dir = 4
+	},
+/area/station/crew_quarters/cafeteria)
 "jMi" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -22686,16 +23176,6 @@
 	dir = 1
 	},
 /area/station/hallway/primary/northwest)
-"jOS" = (
-/obj/rack,
-/obj/item/reagent_containers/food/drinks/juicer,
-/obj/machinery/light/small{
-	dir = 4;
-	pixel_x = 12
-	},
-/obj/item/swingsignfolded,
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "jOT" = (
 /obj/machinery/light_switch/west,
 /obj/decal/tile_edge/line/red{
@@ -23172,6 +23652,12 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
+"jWX" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/black,
+/area/station/engine/engineering)
 "jXe" = (
 /obj/machinery/portable_reclaimer,
 /obj/machinery/power/apc/autoname_north,
@@ -23530,6 +24016,17 @@
 /obj/random_item_spawner/tools/one_or_zero,
 /turf/simulated/floor/plating,
 /area/station/maintenance/disposal)
+"keJ" = (
+/obj/machinery/camera{
+	c_tag = "autotag";
+	dir = 4;
+	name = "autoname - SS13";
+	pixel_x = -10;
+	tag = ""
+	},
+/obj/machinery/drainage,
+/turf/simulated/floor/specialroom/freezer,
+/area/station/crew_quarters/catering)
 "keZ" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -23624,20 +24121,17 @@
 	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering/ce)
-"kgy" = (
-/obj/storage/crate,
-/obj/item/reagent_containers/food/snacks/ingredient/oatmeal,
-/obj/item/reagent_containers/food/snacks/ingredient/pancake_batter,
-/obj/item/reagent_containers/food/snacks/ingredient/sugar,
-/obj/item/reagent_containers/food/snacks/ingredient/flour,
-/obj/item/reagent_containers/food/snacks/ingredient/flour,
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "kgH" = (
 /obj/machinery/light/small/floor/netural,
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/morgue)
+"kgO" = (
+/obj/submachine/chem_extractor{
+	dir = 4
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "khh" = (
 /obj/machinery/atmospherics/pipe/manifold{
 	dir = 4;
@@ -23917,11 +24411,11 @@
 /turf/simulated/floor/grass/leafy,
 /area/station/garden/owlery)
 "kmb" = (
-/obj/cable{
-	icon_state = "1-8"
-	},
 /obj/disposalpipe/segment/transport,
 /obj/disposalpipe/segment/horizontal,
+/obj/cable/orange{
+	icon_state = "1-6"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "kmj" = (
@@ -24079,11 +24573,18 @@
 	dir = 8
 	},
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sw_breach";
+	name = "South West Breach Hull"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
 "kpw" = (
+/obj/cable/orange{
+	icon_state = "2-9"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "kpS" = (
@@ -24315,11 +24816,6 @@
 /obj/disposalpipe/segment/bent/north,
 /turf/simulated/floor/sanitary,
 /area/station/medical/crematorium)
-"ksj" = (
-/obj/storage/closet/wardrobe/black/formalwear,
-/obj/machinery/light/small,
-/turf/simulated/floor/carpet/grime,
-/area/station/crew_quarters/baroffice)
 "ksw" = (
 /obj/table/reinforced/auto,
 /obj/drink_rack/mug{
@@ -24396,6 +24892,9 @@
 /area/station/hallway/primary/southwest)
 "ktz" = (
 /obj/disposalpipe/segment/mail/horizontal,
+/obj/cable{
+	icon_state = "2-4"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/elect)
 "ktB" = (
@@ -24451,6 +24950,20 @@
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
+"ktR" = (
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactormain";
+	name = "Reactor Main";
+	enter_id = "inner2"
+	},
+/turf/simulated/floor/engine,
+/area/station/engine/monitoring{
+	name = "Nuclear Control Room"
+	})
 "ktZ" = (
 /turf/simulated/wall/auto/supernorn,
 /area/station/chapel/sanctuary)
@@ -24719,24 +25232,6 @@
 	dir = 8
 	},
 /area/station/hydroponics/bay)
-"kAM" = (
-/obj/machinery/door/poddoor/blast/pyro{
-	density = 0;
-	dir = 4;
-	icon_state = "bdoormid0";
-	id = "nadir_nukecore";
-	name = "Reactor Core Shielding";
-	opacity = 0
-	},
-/obj/machinery/door/airlock/pyro/glass/engineering{
-	dir = 4;
-	name = "Secondary Core Access"
-	},
-/obj/mapping_helper/access/engineering_engine,
-/obj/forcefield/energyshield/perma/doorlink,
-/obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/engine,
-/area/station/engine/core/nuclear)
 "kAS" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -25041,6 +25536,20 @@
 	},
 /turf/simulated/floor/redblack,
 /area/station/security/brig)
+"kGx" = (
+/obj/machinery/door/airlock/pyro/command/alt,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/access/ai_upload,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aiupload";
+	name = "AI Upload";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/engine/caution/south,
+/area/station/turret_protected/ai_upload)
 "kGA" = (
 /obj/stool/chair{
 	dir = 8
@@ -25395,6 +25904,17 @@
 	icon_state = "crewquarters";
 	name = "Warrens Hall"
 	})
+"kPo" = (
+/obj/cable{
+	icon_state = "2-8"
+	},
+/obj/cable/yellow{
+	icon_state = "6-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "kPR" = (
 /obj/table/wood/round/auto,
 /obj/item/device/light/candle{
@@ -25524,6 +26044,14 @@
 	},
 /turf/simulated/floor/yellowblack,
 /area/station/engine/engineering)
+"kRD" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "kRG" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable{
@@ -25551,6 +26079,37 @@
 /area/station/crew_quarters/clown{
 	name = "Honkington's Abode"
 	})
+"kSy" = (
+/obj/table/reinforced/auto,
+/obj/item/kitchen/utensil/spoon{
+	dir = 8;
+	pixel_y = 11;
+	pixel_x = 2
+	},
+/obj/item/plate{
+	pixel_y = 5;
+	pixel_x = 3;
+	grabs_food_on_spawn = 0
+	},
+/obj/item/kitchen/utensil/fork{
+	dir = 8;
+	pixel_y = -4;
+	pixel_x = 2
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icewater{
+	pixel_x = -11;
+	pixel_y = 11
+	},
+/obj/item/shaker/salt{
+	pixel_x = -3;
+	pixel_y = -10
+	},
+/obj/item/shaker/pepper{
+	pixel_x = 2;
+	pixel_y = -10
+	},
+/turf/simulated/floor/wood,
+/area/station/crew_quarters/cafeteria)
 "kSK" = (
 /obj/item/storage/toilet{
 	dir = 8
@@ -25649,16 +26208,6 @@
 /obj/mapping_helper/wingrille_spawn/auto,
 /turf/simulated/floor/plating,
 /area/station/medical/medbay/lobby)
-"kVe" = (
-/obj/table/reinforced/bar/auto,
-/obj/item_dispenser/icedispenser{
-	pixel_y = 11
-	},
-/obj/drink_rack/cup{
-	pixel_y = 32
-	},
-/turf/simulated/floor/carpet/green/standard/narrow/northsouth,
-/area/station/crew_quarters/cafeteria)
 "kVj" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -26112,12 +26661,12 @@
 /turf/unsimulated/wall/auto/reinforced/supernorn,
 /area/station/crewquarters/cryotron)
 "ldK" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
 /obj/decal/tile_edge/stripe/extra_big{
 	dir = 1
 	},
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
 "lej" = (
@@ -26450,26 +26999,20 @@
 	icon_state = "2-8"
 	},
 /turf/simulated/floor/black/grime,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
+"llJ" = (
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
 "llS" = (
 /turf/simulated/floor/engine/glow,
 /area/station/ai_monitored/armory)
-"llT" = (
-/obj/table/auto,
-/obj/item/shaker/salt,
-/obj/item/shaker/pepper{
-	pixel_x = 3
-	},
-/obj/item/shaker/mustard{
-	pixel_x = -6
-	},
-/obj/item/shaker/ketchup{
-	pixel_x = 6
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "llV" = (
 /obj/table/reinforced/auto,
 /obj/item/storage/firstaid/toxin{
@@ -26783,6 +27326,10 @@
 /obj/forcefield/energyshield/perma/doorlink,
 /obj/mapping_helper/access/research,
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sw_breach2";
+	name = "South West Breach Hull"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
@@ -27100,6 +27647,16 @@
 /obj/disposalpipe/segment/bent/east,
 /turf/simulated/floor/sanitary,
 /area/station/medical/crematorium)
+"lAj" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/obj/disposalpipe/segment/horizontal,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "lAp" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -27120,6 +27677,12 @@
 	},
 /turf/simulated/floor/black,
 /area/station/security/brig/solitary)
+"lAF" = (
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/engine/caution/east,
+/area/station/engine/core/nuclear)
 "lAH" = (
 /obj/lattice{
 	dir = 8;
@@ -27226,6 +27789,17 @@
 "lDT" = (
 /turf/simulated/floor/white,
 /area/station/medical/medbay/treatment)
+"lDW" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/cable/yellow{
+	icon_state = "5-10"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "lDX" = (
 /obj/shrub{
 	dir = 1
@@ -27541,10 +28115,10 @@
 /area/station/bridge)
 "lIu" = (
 /obj/machinery/door/airlock/pyro/classic,
+/obj/forcefield/energyshield/perma/doorlink,
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/forcefield/energyshield/perma/doorlink,
 /turf/simulated/floor/black/grime,
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
@@ -27716,13 +28290,6 @@
 /area/station/quartermaster/cargobay{
 	name = "Cargo Primary Endpoint"
 	})
-"lLZ" = (
-/obj/stool/chair{
-	dir = 4
-	},
-/obj/landmark/start/job/scientist,
-/turf/simulated/floor/black,
-/area/station/science/hall)
 "lMn" = (
 /obj/decal/tile_edge/floorguide/engineering{
 	dir = 1
@@ -28016,6 +28583,17 @@
 	},
 /turf/simulated/floor/black/grime,
 /area/station/maintenance/disposal)
+"lRy" = (
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/stool/chair/office/purple{
+	dir = 4
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 4
+	},
+/area/station/science/chemistry)
 "lRz" = (
 /obj/disposalpipe/segment/bent/south,
 /turf/simulated/floor/redblack,
@@ -28379,6 +28957,24 @@
 	},
 /turf/simulated/floor/black,
 /area/station/security/brig)
+"lZt" = (
+/obj/machinery/door/airlock/pyro/command/alt{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/access/ai_upload,
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/darkblue,
+/area/station/turret_protected/ai)
 "lZv" = (
 /obj/cable{
 	icon_state = "1-4"
@@ -28884,6 +29480,9 @@
 	})
 "mhP" = (
 /obj/disposalpipe/segment/mail/vertical,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/yellowblack{
 	dir = 1
 	},
@@ -29062,6 +29661,10 @@
 /obj/submachine/tape_deck,
 /turf/simulated/floor/darkblue/checker/other,
 /area/station/crew_quarters/radio/lab)
+"mmf" = (
+/obj/disposalpipe/segment/horizontal,
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "mmv" = (
 /obj/disposalpipe/segment/mail/bent/east,
 /turf/simulated/floor/blue,
@@ -29319,6 +29922,20 @@
 /area/station/bridge/hos{
 	name = "Head of Personnel's Quarters"
 	})
+"mrH" = (
+/obj/machinery/light_switch/west,
+/obj/disposalpipe/segment/food{
+	dir = 4
+	},
+/obj/storage/crate,
+/obj/item/reagent_containers/food/snacks/ingredient/flour,
+/obj/item/reagent_containers/food/snacks/ingredient/flour,
+/obj/item/reagent_containers/food/snacks/ingredient/sugar,
+/obj/item/reagent_containers/food/snacks/ingredient/pancake_batter,
+/obj/item/reagent_containers/food/snacks/ingredient/oatmeal,
+/obj/item/storage/box/popsicle_sticks,
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "mrO" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -29665,6 +30282,12 @@
 	},
 /turf/simulated/floor/grass/leafy,
 /area/station/ranch)
+"mzV" = (
+/obj/machinery/chem_dispenser/chemical,
+/obj/machinery/firealarm/west,
+/obj/item/reagent_containers/glass/beaker/large,
+/turf/simulated/floor/engine/caution/west,
+/area/station/crew_quarters/baroffice)
 "mAa" = (
 /obj/stool/chair/pew/fancy/right{
 	dir = 1
@@ -29691,6 +30314,26 @@
 /area/station/engine/inner{
 	name = "Transception Array Control"
 	})
+"mAw" = (
+/obj/table/reinforced/auto,
+/obj/machinery/glass_recycler/bar{
+	glass_amt = 40
+	},
+/obj/mapping_helper/access/kitchen,
+/obj/mapping_helper/access/bar,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/machinery/door/airlock/pyro/glass/windoor,
+/obj/machinery/door/poddoor/pyro{
+	density = 0;
+	icon_state = "pdoor0";
+	id = "kitchen";
+	layer = 4;
+	name = "Kitchen Shutter";
+	opacity = 0
+	},
+/turf/simulated/floor/black,
+/area/station/crew_quarters/kitchen)
 "mAy" = (
 /obj/table/reinforced/bar/auto{
 	name = "wooden table"
@@ -30821,23 +31464,6 @@
 /area/station/hallway/secondary/entry{
 	name = "Arrival Shuttle Hallway"
 	})
-"ncI" = (
-/obj/storage/crate{
-	name = "Cone Crate"
-	},
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/ice_cream_cone,
-/obj/item/reagent_containers/food/snacks/condiment/chocchips,
-/obj/machinery/light_switch/west,
-/obj/disposalpipe/segment/food{
-	dir = 4
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "ndi" = (
 /obj/rack,
 /obj/item/clothing/suit/wizrobe/purple,
@@ -30907,11 +31533,16 @@
 	},
 /turf/simulated/floor/black/grime,
 /area/station/security/brig/genpop)
-"nea" = (
-/obj/table/reinforced/auto,
-/obj/random_item_spawner/tableware,
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
+"ndW" = (
+/obj/item/device/radio/intercom/catering{
+	dir = 4
+	},
+/obj/item/swingsignfolded{
+	pixel_x = -4;
+	pixel_y = 15
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "neh" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/pasiphae/crew)
@@ -31096,6 +31727,9 @@
 /area/station/maintenance/northwest)
 "njf" = (
 /obj/disposalpipe/segment/mail/bent/west,
+/obj/cable{
+	icon_state = "2-8"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "njE" = (
@@ -31190,9 +31824,6 @@
 /obj/cable{
 	icon_state = "0-8"
 	},
-/obj/cable{
-	icon_state = "0-4"
-	},
 /obj/cable{
 	icon_state = "0-2"
 	},
@@ -31267,6 +31898,32 @@
 	dir = 1
 	},
 /area/station/engine/elect)
+"nmn" = (
+/obj/machinery/door/poddoor/blast/pyro{
+	density = 0;
+	dir = 4;
+	icon_state = "bdoormid0";
+	id = "nadir_nukecore";
+	name = "Reactor Core Shielding";
+	opacity = 0
+	},
+/obj/machinery/door/airlock/pyro/glass/engineering{
+	dir = 4;
+	name = "Secondary Core Access"
+	},
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactorside";
+	name = "Reactor Side";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/engine,
+/area/station/engine/core/nuclear)
 "nmv" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -31307,27 +31964,34 @@
 /turf/simulated/floor/grass,
 /area/station/hydroponics/bay)
 "nna" = (
-/obj/cable{
-	icon_state = "5-8"
-	},
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
 	})
+"nny" = (
+/obj/machinery/light/small{
+	dir = 4;
+	pixel_x = 12
+	},
+/obj/table/auto,
+/obj/item/reagent_containers/food/drinks/eggnog{
+	pixel_x = 5;
+	pixel_y = 13
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "nnN" = (
 /obj/cable{
 	icon_state = "4-6"
 	},
 /turf/space/fluid/acid/clear,
 /area/space)
-"nnS" = (
-/obj/machinery/chem_dispenser/chemical,
-/obj/machinery/firealarm/west,
-/turf/simulated/floor/engine/caution/west,
-/area/station/crew_quarters/baroffice)
 "nnZ" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -31557,6 +32221,18 @@
 /obj/fitness/speedbag/clown,
 /turf/simulated/floor/grey,
 /area/station/crew_quarters/fitness)
+"nun" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "nw_breach";
+	name = "North West Breach Hull"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/nw{
+	name = "Northwest Breach Hull"
+	})
 "nuo" = (
 /obj/storage/closet/emergency,
 /obj/machinery/light/small{
@@ -32123,10 +32799,10 @@
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/arcade)
 "nFG" = (
+/obj/disposalpipe/segment/transport,
 /obj/cable{
-	icon_state = "1-2"
+	icon_state = "1-4"
 	},
-/obj/disposalpipe/segment/transport,
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
@@ -32165,7 +32841,7 @@
 	})
 "nGd" = (
 /obj/cable{
-	icon_state = "4-10"
+	icon_state = "4-8"
 	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/se{
@@ -32268,6 +32944,20 @@
 /obj/disposalpipe/segment/bent/east,
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
+"nHW" = (
+/obj/item/reagent_containers/glass/bottle/ammonia/large,
+/obj/item/reagent_containers/glass/bottle/ammonia/large,
+/obj/decal/cleanable/dirt,
+/obj/machinery/light/small{
+	dir = 8;
+	pixel_x = -12
+	},
+/obj/storage/crate/bloody,
+/turf/simulated/floor/plating,
+/area/station/hydroponics{
+	do_not_irradiate = 1;
+	name = "Hydroponics Storage"
+	})
 "nIb" = (
 /obj/machinery/atmospherics/binary/valve{
 	name = "purge valve"
@@ -32277,17 +32967,29 @@
 	},
 /area/station/engine/core/nuclear)
 "nIj" = (
-/obj/cable{
-	icon_state = "1-10"
+/obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
+/turf/simulated/floor/plating,
+/area/station/engine/ptl)
+"nIk" = (
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/disposalpipe/segment/ejection{
+	dir = 2
 	},
-/obj/cable{
-	icon_state = "5-10"
+/obj/mapping_helper/access/security,
+/obj/machinery/secscanner{
+	pixel_y = 10
 	},
-/obj/disposalpipe/segment/transport,
-/turf/simulated/floor/industrial,
-/area/station/maintenance/outer/se{
-	name = "Southeast Breach Hull"
-	})
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "secinterro1";
+	name = "Security Interrogation 1";
+	enter_id = "outer"
+	},
+/turf/simulated/floor/redblack{
+	dir = 1
+	},
+/area/station/security/interrogation)
 "nIm" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/machinery/door/poddoor/pyro{
@@ -32562,13 +33264,8 @@
 /turf/simulated/floor/sanitary,
 /area/station/crew_quarters/showers)
 "nPr" = (
-/obj/cable{
-	icon_state = "5-10"
-	},
-/turf/simulated/floor/industrial,
-/area/station/maintenance/outer/se{
-	name = "Southeast Breach Hull"
-	})
+/turf/simulated/floor/engine/caution/south,
+/area/station/engine/ptl)
 "nPt" = (
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/carpet/arcade,
@@ -33613,15 +34310,15 @@
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/west)
 "orx" = (
-/obj/cable{
-	icon_state = "1-2"
-	},
 /obj/disposalpipe/segment/transport{
 	dir = 4;
 	icon_state = "pipe-c"
 	},
 /obj/machinery/navbeacon/mule/engineering_north/east,
 /obj/decal/stripe_caution,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "orC" = (
@@ -33643,16 +34340,6 @@
 	},
 /turf/simulated/floor/engine/caution/east,
 /area/station/ai_monitored/armory)
-"orS" = (
-/obj/table/reinforced/auto,
-/obj/item/shaker/salt{
-	pixel_x = -3
-	},
-/obj/item/shaker/pepper{
-	pixel_x = 3
-	},
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "osg" = (
 /obj/storage/cart,
 /obj/item/device/multitool{
@@ -34009,18 +34696,6 @@
 /obj/forcefield/energyshield/perma/doorlink,
 /turf/simulated/floor/black,
 /area/station/hallway/secondary/west)
-"ozy" = (
-/obj/machinery/camera{
-	c_tag = "autotag";
-	dir = 4;
-	name = "autoname - SS13";
-	pixel_x = -10;
-	tag = ""
-	},
-/obj/disposaloutlet/east,
-/obj/disposalpipe/trunk/produce,
-/turf/simulated/floor/specialroom/freezer,
-/area/station/crew_quarters/catering)
 "ozD" = (
 /obj/stool/chair/office/blue{
 	dir = 4
@@ -34233,32 +34908,6 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
-"oDZ" = (
-/obj/storage/crate{
-	desc = "Various supplies for the bar.";
-	name = "bartending crate"
-	},
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/reagent_containers/food/drinks/bottle/soda,
-/obj/item/storage/firstaid/toxin,
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/device/reagentscanner,
-/obj/item/reagent_containers/food/drinks/drinkingglass/pitcher,
-/obj/item/reagent_containers/dropper/mechanical,
-/obj/item/clothing/glasses/spectro,
-/obj/machinery/door_control{
-	id = "nadir_barchem";
-	name = "Bar Chem-Safety Shutters";
-	pixel_x = -24
-	},
-/turf/simulated/floor/engine/caution/corner{
-	dir = 1
-	},
-/area/station/crew_quarters/baroffice)
 "oEe" = (
 /obj/disposalpipe/segment/ejection,
 /turf/simulated/wall/auto/supernorn,
@@ -34341,6 +34990,9 @@
 	dir = 8
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/cable{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/yellow,
 /area/station/engine/elect)
 "oGv" = (
@@ -34871,6 +35523,31 @@
 /area/station/quartermaster/storage{
 	name = "Cargo Auxiliary Endpoint"
 	})
+"oSR" = (
+/obj/table/reinforced/bar/auto,
+/obj/item_dispenser/icedispenser{
+	pixel_y = 11
+	},
+/obj/drink_rack/cup{
+	pixel_y = 32
+	},
+/obj/item/kitchen/utensil/knife{
+	pixel_x = 9;
+	pixel_y = 4;
+	dir = 2
+	},
+/obj/item/kitchen/utensil/knife{
+	pixel_x = 9;
+	pixel_y = 4;
+	dir = 2
+	},
+/obj/item/kitchen/utensil/knife{
+	pixel_x = 9;
+	pixel_y = 4;
+	dir = 2
+	},
+/turf/simulated/floor/carpet/green/standard/narrow/northsouth,
+/area/station/crew_quarters/cafeteria)
 "oSS" = (
 /obj/disposalpipe/segment{
 	dir = 4;
@@ -35262,12 +35939,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
-"paQ" = (
-/obj/table/reinforced/auto,
-/obj/item/plate,
-/obj/item/kitchen/utensil/fork,
-/turf/simulated/floor/wood,
-/area/station/crew_quarters/cafeteria)
 "pbh" = (
 /turf/simulated/floor/blueblack{
 	dir = 9
@@ -35284,6 +35955,14 @@
 /obj/decal/cleanable/dirt/jen,
 /turf/simulated/floor/blue,
 /area/pasiphae/bridge)
+"pbM" = (
+/obj/cable/orange{
+	icon_state = "2-5"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "pci" = (
 /turf/simulated/floor/wood,
 /area/station/crew_quarters/sauna)
@@ -35361,6 +36040,10 @@
 	dir = 8
 	},
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "se_breach";
+	name = "South East Breach Hull"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
@@ -35443,6 +36126,9 @@
 	name = "ratty blue couch"
 	},
 /obj/landmark/start/job/assistant,
+/obj/cable/orange{
+	icon_state = "6-8"
+	},
 /turf/simulated/floor/industrial,
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
@@ -35748,6 +36434,15 @@
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/disposal)
+"pol" = (
+/obj/machinery/light_switch/west{
+	pixel_y = 24;
+	pixel_x = -8
+	},
+/turf/simulated/floor/engine/caution/corner{
+	dir = 8
+	},
+/area/station/engine/ptl)
 "pon" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -35807,6 +36502,23 @@
 	},
 /turf/simulated/floor/redblack/corner,
 /area/station/security/equipment)
+"ppa" = (
+/obj/machinery/door/airlock/pyro/engineering/alt,
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactormain";
+	name = "Reactor Main";
+	enter_id = "inner1"
+	},
+/turf/simulated/floor/engine,
+/area/station/engine/monitoring{
+	name = "Nuclear Control Room"
+	})
 "ppf" = (
 /obj/submachine/syndicate_teleporter,
 /turf/simulated/floor/engine,
@@ -35865,6 +36577,18 @@
 	},
 /obj/decal/cleanable/dirt,
 /turf/simulated/floor/grime,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
+"ppR" = (
+/obj/grille/catwalk,
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/black/grime,
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
@@ -36850,15 +37574,6 @@
 /obj/decal/cleanable/dirt/jen,
 /turf/simulated/floor/grey,
 /area/pasiphae/sys)
-"pMV" = (
-/obj/machinery/light/small{
-	dir = 8;
-	pixel_x = -12
-	},
-/obj/disposalpipe/chicken_disposal_pipe/vertical,
-/obj/machinery/drainage,
-/turf/simulated/floor/specialroom/freezer,
-/area/station/crew_quarters/catering)
 "pNa" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -36871,6 +37586,15 @@
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/science/chemistry)
+"pNF" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "escape";
+	name = "Escape";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/engine/caution/northsouth,
+/area/station/hallway/secondary/exit)
 "pNP" = (
 /obj/machinery/door/airlock/pyro/medical/morgue{
 	dir = 4
@@ -36987,6 +37711,13 @@
 /obj/disposalpipe/segment/vertical,
 /turf/simulated/floor/specialroom/gym,
 /area/station/crew_quarters/fitness)
+"pRB" = (
+/obj/disposalpipe/segment/produce{
+	dir = 2;
+	icon_state = "pipe-c"
+	},
+/turf/simulated/floor/specialroom/freezer,
+/area/station/crew_quarters/catering)
 "pRG" = (
 /obj/machinery/disposal,
 /obj/disposalpipe/trunk/south,
@@ -37056,6 +37787,14 @@
 /obj/machinery/light/incandescent/netural,
 /turf/simulated/floor/yellowblack,
 /area/station/hallway/primary/southeast)
+"pSG" = (
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 5
+	},
+/area/station/engine/ptl)
 "pSL" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -37624,6 +38363,9 @@
 /obj/disposalpipe/segment/mail/vertical,
 /obj/forcefield/energyshield/perma/doorlink,
 /obj/mapping_helper/firedoor_spawn,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/yellow,
 /area/station/engine/engineering)
 "qfE" = (
@@ -37730,7 +38472,7 @@
 	name = "Southwest Breach Hull"
 	})
 "qif" = (
-/obj/cable{
+/obj/cable/orange{
 	icon_state = "1-2"
 	},
 /turf/simulated/floor/yellowblack,
@@ -37787,6 +38529,9 @@
 /obj/cable/yellow{
 	icon_state = "2-9"
 	},
+/obj/cable/yellow{
+	icon_state = "2-5"
+	},
 /turf/simulated/floor/plating,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -38128,16 +38873,6 @@
 /obj/random_item_spawner/junk/one_or_zero,
 /turf/simulated/floor/plating,
 /area/station/maintenance/north)
-"qrD" = (
-/obj/submachine/chem_extractor{
-	dir = 8
-	},
-/obj/machinery/light/small{
-	dir = 4;
-	pixel_x = 12
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "qrL" = (
 /obj/machinery/floorflusher/solitary,
 /obj/disposalpipe/trunk/brig{
@@ -38840,10 +39575,10 @@
 /turf/simulated/floor/sanitary,
 /area/station/medical/head)
 "qIU" = (
+/obj/machinery/light_switch/east,
 /obj/cable{
 	icon_state = "1-2"
 	},
-/obj/machinery/light_switch/east,
 /turf/simulated/floor/stairs/dark/wide{
 	dir = 6
 	},
@@ -38948,14 +39683,6 @@
 "qLh" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/ai_monitored/armory)
-"qLk" = (
-/obj/table/auto,
-/obj/item/reagent_containers/food/drinks/eggnog{
-	pixel_x = 5;
-	pixel_y = 10
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "qLL" = (
 /obj/machinery/light/incandescent/netural{
 	dir = 4
@@ -39136,6 +39863,15 @@
 	},
 /turf/simulated/floor/white/checker,
 /area/station/crew_quarters/pool)
+"qRe" = (
+/obj/random_item_spawner/junk/some,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "qRg" = (
 /obj/machinery/camera{
 	c_tag = "autotag";
@@ -39277,6 +40013,9 @@
 /area/space)
 "qUb" = (
 /obj/disposalpipe/segment/mail/horizontal,
+/obj/cable{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/yellowblack{
 	dir = 8
 	},
@@ -39327,23 +40066,6 @@
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/white,
 /area/station/medical/medbay)
-"qVs" = (
-/obj/stool/bench/blue/auto,
-/obj/machinery/shower{
-	dir = 4;
-	pixel_x = 8;
-	pixel_y = 8
-	},
-/obj/machinery/drainage,
-/obj/machinery/firealarm{
-	dir = 4;
-	pixel_x = 24;
-	pixel_y = -3
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 4
-	},
-/area/station/science/chemistry)
 "qVJ" = (
 /turf/simulated/floor/engine/caution/east,
 /area/station/medical/head)
@@ -39449,16 +40171,6 @@
 /obj/storage/crate/robotparts,
 /turf/simulated/floor/industrial,
 /area/station/storage/warehouse)
-"qZy" = (
-/obj/stool/bed,
-/obj/item/clothing/suit/bedsheet{
-	bcolor = "black";
-	icon_state = "bedsheet-black"
-	},
-/obj/landmark/start/job/bartender,
-/obj/disposalpipe/segment/food,
-/turf/simulated/floor/carpet/grime,
-/area/station/crew_quarters/baroffice)
 "qZF" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/window_blinds/cog2/right{
@@ -39839,6 +40551,9 @@
 /area/listeningpost)
 "rjb" = (
 /obj/disposalpipe/segment/mail/horizontal,
+/obj/cable{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/yellowblack{
 	dir = 4
 	},
@@ -40095,15 +40810,6 @@
 /obj/mapping_helper/firedoor_spawn,
 /turf/simulated/floor/black,
 /area/station/crew_quarters/courtroom)
-"rpK" = (
-/obj/stool/chair{
-	dir = 8
-	},
-/obj/landmark/start/job/scientist,
-/turf/simulated/floor/purpleblack{
-	dir = 1
-	},
-/area/station/science/hall)
 "rqi" = (
 /obj/item/storage/toilet{
 	desc = "You think you see something in there... you should take another look.";
@@ -40162,21 +40868,6 @@
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
-"rrs" = (
-/obj/machinery/door/airlock/pyro/security/alt,
-/obj/disposalpipe/segment/ejection{
-	dir = 2
-	},
-/obj/mapping_helper/access/security,
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/redblack{
-	dir = 1
-	},
-/area/station/security/interrogation)
 "rrM" = (
 /obj/storage/secure/crate/weapon/armory/tranquilizer,
 /obj/machinery/ai_status_display{
@@ -40260,6 +40951,11 @@
 /obj/cable,
 /turf/simulated/floor/black,
 /area/station/hallway/secondary/west)
+"rtA" = (
+/obj/disposalpipe/segment/food,
+/obj/storage/closet/wardrobe/black/formalwear,
+/turf/simulated/floor/carpet/grime,
+/area/station/crew_quarters/baroffice)
 "ruj" = (
 /obj/shrub{
 	dir = 8
@@ -40388,6 +41084,10 @@
 /obj/decal/fakeobjects/flock/antenna,
 /turf/space/fluid/acid/clear,
 /area/space)
+"rzm" = (
+/obj/table/reinforced/bar/auto,
+/turf/simulated/floor/carpet/green/standard/narrow/northsouth,
+/area/station/crew_quarters/cafeteria)
 "rzn" = (
 /obj/disposalpipe/segment{
 	name = "factory pipe"
@@ -40665,6 +41365,12 @@
 /obj/landmark/random_room/nadir_rocks_7x5,
 /turf/space/fluid/acid,
 /area/space)
+"rFq" = (
+/obj/disposalpipe/chicken_disposal_pipe/vertical{
+	dir = 8
+	},
+/turf/simulated/floor/specialroom/freezer,
+/area/station/crew_quarters/catering)
 "rFT" = (
 /obj/machinery/computer/security,
 /obj/cable{
@@ -40727,6 +41433,14 @@
 	dir = 8
 	},
 /area/station/security/main)
+"rGv" = (
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/wall/false_wall,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "rGH" = (
 /turf/simulated/floor/yellowblack{
 	dir = 1
@@ -40848,6 +41562,15 @@
 	},
 /turf/simulated/floor/carpet/purple/fancy/edge/south,
 /area/station/science/research_director)
+"rKG" = (
+/obj/cable{
+	icon_state = "1-2"
+	},
+/obj/cable{
+	icon_state = "1-8"
+	},
+/turf/simulated/floor/black,
+/area/station/engine/engineering)
 "rKH" = (
 /turf/simulated/floor/sanitary/white,
 /area/station/medical/robotics)
@@ -41118,16 +41841,13 @@
 /turf/simulated/floor/red,
 /area/station/security/checkpoint/escape)
 "rRQ" = (
+/obj/disposalpipe/segment/transport,
 /obj/cable{
-	icon_state = "1-2"
-	},
-/obj/cable{
-	icon_state = "2-8"
+	icon_state = "4-8"
 	},
-/obj/cable{
-	icon_state = "2-4"
+/obj/cable/orange{
+	icon_state = "1-2"
 	},
-/obj/disposalpipe/segment/transport,
 /turf/simulated/floor/black,
 /area/station/engine/engineering)
 "rRY" = (
@@ -41563,9 +42283,6 @@
 /turf/simulated/floor/plating,
 /area/station/crew_quarters/cafeteria)
 "saX" = (
-/obj/cable{
-	icon_state = "6-9"
-	},
 /turf/simulated/floor,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -41687,6 +42404,9 @@
 /obj/machinery/light/incandescent/netural{
 	dir = 1
 	},
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
 "sdM" = (
@@ -42137,6 +42857,14 @@
 	},
 /turf/space/fluid/acid/clear,
 /area/space)
+"soo" = (
+/obj/table/auto,
+/obj/item/storage/box/donkpocket_kit{
+	pixel_x = 2;
+	pixel_y = 9
+	},
+/turf/simulated/floor/grey/blackgrime,
+/area/station/crew_quarters/catering)
 "soE" = (
 /obj/table/flock/auto,
 /obj/machinery/light/flock,
@@ -42353,24 +43081,6 @@
 	},
 /turf/space/fluid/acid/clear,
 /area/space)
-"sso" = (
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/obj/table/reinforced/chemistry/auto{
-	name = "prep counter"
-	},
-/obj/machinery/espresso_machine{
-	pixel_y = 5
-	},
-/obj/noticeboard/persistent{
-	name = "Bar persistent notice board";
-	persistent_id = "bar"
-	},
-/turf/simulated/floor/engine,
-/area/station/crew_quarters/cafeteria)
 "ssp" = (
 /obj/machinery/floorflusher/solitary2,
 /obj/disposalpipe/trunk/brig{
@@ -42632,6 +43342,32 @@
 	},
 /turf/simulated/floor/black,
 /area/station/science/research_director)
+"sAj" = (
+/obj/machinery/door_control{
+	id = "PTLDOOR";
+	name = "Transmission Laser Confinement";
+	pixel_x = -24;
+	pixel_y = -8
+	},
+/obj/machinery/firealarm{
+	dir = 8;
+	pixel_x = -24;
+	pixel_y = 8
+	},
+/obj/table/auto,
+/obj/item/device/radio{
+	pixel_x = -5;
+	pixel_y = 5;
+	rand_pos = 0
+	},
+/obj/item/dice{
+	pixel_x = 8;
+	pixel_y = 8
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 8
+	},
+/area/station/engine/ptl)
 "sBk" = (
 /obj/machinery/computer/operating{
 	dir = 8;
@@ -42647,19 +43383,6 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
-"sBs" = (
-/obj/stool/chair/office{
-	dir = 1
-	},
-/obj/machinery/light{
-	dir = 8;
-	layer = 9.1;
-	pixel_x = -10
-	},
-/turf/simulated/floor/purpleblack{
-	dir = 8
-	},
-/area/station/science/chemistry)
 "sBv" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -42900,6 +43623,18 @@
 /obj/item/paper/book/from_file/monster_manual,
 /turf/simulated/floor/carpet/red/fancy/edge/ne,
 /area/station/crew_quarters/arcade/dungeon)
+"sFj" = (
+/obj/machinery/light/small{
+	dir = 4;
+	pixel_x = 12
+	},
+/obj/cable/yellow{
+	icon_state = "5-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "sFr" = (
 /obj/decal/cleanable/dirt,
 /obj/table/reinforced/auto,
@@ -43496,6 +44231,10 @@
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
+"sRe" = (
+/obj/machinery/power/pt_laser,
+/turf/simulated/floor/engine/caution/corner,
+/area/station/engine/ptl)
 "sRh" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -43541,8 +44280,8 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
-/obj/cable{
-	icon_state = "1-4"
+/obj/cable/orange{
+	icon_state = "1-2"
 	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
@@ -43612,19 +44351,6 @@
 /area/station/hallway/secondary/construction{
 	name = "The Warrens"
 	})
-"sUg" = (
-/obj/machinery/door/airlock/pyro/security/alt,
-/obj/disposalpipe/segment/ejection{
-	dir = 2
-	},
-/obj/mapping_helper/access/security,
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/redblack,
-/area/station/security/interrogation)
 "sUo" = (
 /obj/machinery/door/airlock/pyro/glass,
 /obj/disposalpipe/segment/mail/vertical,
@@ -44439,6 +45165,15 @@
 	},
 /turf/simulated/floor/industrial,
 /area/station/storage/warehouse)
+"tlH" = (
+/obj/decal/cleanable/dirt,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "tlQ" = (
 /obj/stool/chair/office/blue{
 	dir = 4
@@ -44681,24 +45416,6 @@
 	dir = 1
 	},
 /area/station/medical/morgue)
-"trK" = (
-/obj/storage/crate{
-	desc = "A small, cuboid object with a hinged top and empty interior. It smells kinda bad and seems to have an odd stain on it.";
-	icon = 'icons/misc/halloween.dmi';
-	name = "dented crate"
-	},
-/obj/item/reagent_containers/glass/bottle/ammonia/large,
-/obj/item/reagent_containers/glass/bottle/ammonia/large,
-/obj/decal/cleanable/dirt,
-/obj/machinery/light/small{
-	dir = 8;
-	pixel_x = -12
-	},
-/turf/simulated/floor/plating,
-/area/station/hydroponics{
-	do_not_irradiate = 1;
-	name = "Hydroponics Storage"
-	})
 "trM" = (
 /obj/table/reinforced/auto,
 /obj/disposaloutlet/south,
@@ -44757,12 +45474,6 @@
 	},
 /turf/simulated/floor/industrial,
 /area/station/storage/warehouse)
-"ttA" = (
-/obj/machinery/chem_dispenser/alcohol,
-/obj/item/reagent_containers/food/drinks/drinkingglass/pitcher,
-/obj/machinery/firealarm/west,
-/turf/simulated/floor/engine/caution/east,
-/area/station/crew_quarters/cafeteria)
 "ttD" = (
 /obj/decal/tile_edge/line/orange,
 /obj/decal/tile_edge{
@@ -45392,20 +46103,6 @@
 /area/station/engine/monitoring{
 	name = "Nuclear Control Room"
 	})
-"tGK" = (
-/obj/machinery/door/airlock/pyro/security/alt{
-	dir = 4
-	},
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/mapping_helper/access/security,
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	dir = 8
-	},
-/turf/simulated/floor/black,
-/area/station/security/brig)
 "tGN" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -45557,6 +46254,9 @@
 	})
 "tJc" = (
 /obj/storage/closet/wardrobe/yellow,
+/obj/cable/orange{
+	icon_state = "4-9"
+	},
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
 "tJk" = (
@@ -45880,6 +46580,18 @@
 /obj/disposalpipe/segment/vertical,
 /turf/simulated/floor/black,
 /area/station/hallway/secondary/exit)
+"tQV" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "ne_breach";
+	name = "North East Breach Hull"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/ne{
+	name = "Northeast Breach Hull"
+	})
 "tQW" = (
 /obj/grille/catwalk,
 /obj/random_item_spawner/junk/one_or_zero,
@@ -46371,9 +47083,6 @@
 /obj/machinery/light/incandescent/cool{
 	dir = 1
 	},
-/obj/cable{
-	icon_state = "6-8"
-	},
 /turf/simulated/floor/caution/corner/misc{
 	dir = 10
 	},
@@ -46407,6 +47116,15 @@
 /area/station/maintenance/outer/sw{
 	name = "Southwest Breach Hull"
 	})
+"ubT" = (
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
+	dir = 8
+	},
+/turf/simulated/floor/purpleblack{
+	dir = 1
+	},
+/area/station/science/hall)
 "ucO" = (
 /obj/cable{
 	icon_state = "2-8"
@@ -46683,10 +47401,10 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
-/obj/cable{
-	icon_state = "2-4"
-	},
 /obj/landmark/gps_waypoint,
+/obj/cable/orange{
+	icon_state = "2-5"
+	},
 /turf/simulated/floor/black,
 /area/station/engine/monitoring{
 	name = "Nuclear Control Room"
@@ -47391,19 +48109,6 @@
 	dir = 4
 	},
 /area/station/security/interrogation)
-"uvU" = (
-/obj/machinery/door/airlock/pyro/security/alt,
-/obj/mapping_helper/access/brig,
-/obj/disposalpipe/segment/brig{
-	dir = 1
-	},
-/obj/cable{
-	icon_state = "1-2"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/redblack,
-/area/station/security/interrogation)
 "uwl" = (
 /obj/table/flock/auto,
 /obj/machinery/light/flock,
@@ -47491,6 +48196,9 @@
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
 "uya" = (
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
 /turf/simulated/floor/caution/corner/misc{
 	dir = 10
 	},
@@ -47690,22 +48398,6 @@
 /obj/landmark/gps_waypoint,
 /turf/simulated/floor/white,
 /area/station/medical/medbay/treatment)
-"uEk" = (
-/obj/machinery/door/airlock/pyro/glass/security{
-	dir = 4;
-	req_access = null
-	},
-/obj/mapping_helper/access/security,
-/obj/cable{
-	icon_state = "4-8"
-	},
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink{
-	dir = 8
-	},
-/obj/disposalpipe/segment/horizontal,
-/turf/simulated/floor/black,
-/area/station/security/equipment)
 "uEt" = (
 /obj/mapping_helper/wingrille_spawn/auto/reinforced,
 /obj/cable{
@@ -47721,6 +48413,9 @@
 /area/station/hallway/secondary/exit)
 "uEI" = (
 /obj/disposalpipe/segment/mail/bent/south,
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
 /turf/simulated/floor/black,
 /area/station/hallway/primary/southeast)
 "uFd" = (
@@ -47835,6 +48530,29 @@
 /obj/disposalpipe/segment/mail/bent/west,
 /turf/simulated/floor/blueblack,
 /area/station/bridge)
+"uIZ" = (
+/obj/item/kitchen/utensil/fork{
+	dir = 4;
+	pixel_y = 12;
+	pixel_x = -2
+	},
+/obj/table/reinforced/auto,
+/obj/item/kitchen/utensil/spoon{
+	dir = 4;
+	pixel_y = -4;
+	pixel_x = -2
+	},
+/obj/item/plate{
+	pixel_y = 7;
+	pixel_x = -2;
+	grabs_food_on_spawn = 0
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icewater{
+	pixel_x = 10;
+	pixel_y = 6
+	},
+/turf/simulated/floor/wood,
+/area/station/crew_quarters/cafeteria)
 "uJB" = (
 /obj/machinery/door/unpowered/wood/pyro{
 	dir = 4
@@ -47844,6 +48562,15 @@
 	icon_state = "crewquarters";
 	name = "Warrens Hall"
 	})
+"uJE" = (
+/obj/random_item_spawner/junk/one_or_zero,
+/obj/cable/orange{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
 "uJG" = (
 /obj/machinery/light/incandescent/cool,
 /obj/table/reinforced/auto,
@@ -48274,6 +49001,14 @@
 	dir = 4
 	},
 /area/station/engine/engineering)
+"uTK" = (
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "uTO" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -48389,6 +49124,15 @@
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/turret_protected/ai)
+"uXC" = (
+/obj/mapping_helper/wingrille_spawn/auto/reinforced/crystal,
+/obj/machinery/door/poddoor/pyro/shutters{
+	dir = 4;
+	id = "PTLDOOR";
+	name = "Laser Confinement Door"
+	},
+/turf/simulated/floor/plating,
+/area/station/engine/ptl)
 "uXL" = (
 /obj/cable{
 	icon_state = "1-2"
@@ -48737,6 +49481,17 @@
 /obj/machinery/firealarm/north,
 /turf/simulated/floor/grey,
 /area/station/crew_quarters/fitness)
+"vil" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "viB" = (
 /obj/machinery/light/small/warm/very{
 	dir = 4;
@@ -48915,6 +49670,26 @@
 	dir = 8
 	},
 /area/station/hydroponics/bay)
+"vos" = (
+/obj/table/auto,
+/obj/item/storage/box/cocktail_doodads{
+	pixel_y = 17;
+	pixel_x = 6
+	},
+/obj/item/storage/box/fruit_wedges{
+	pixel_x = -4;
+	pixel_y = 10
+	},
+/obj/item/storage/box/cocktail_umbrellas{
+	pixel_x = 6;
+	pixel_y = 3
+	},
+/obj/machinery/power/apc/autoname_east,
+/obj/cable{
+	icon_state = "0-8"
+	},
+/turf/simulated/floor/carpet/grime,
+/area/station/crew_quarters/baroffice)
 "vpe" = (
 /obj/surgery_tray,
 /obj/item/circular_saw{
@@ -50012,22 +50787,24 @@
 /area/station/science/lobby{
 	name = "Science Lounge"
 	})
-"vMJ" = (
-/obj/machinery/door/airlock/pyro/glass/engineering{
-	dir = 4
-	},
-/obj/mapping_helper/access/engineering_engine,
-/obj/forcefield/energyshield/perma/doorlink{
-	dir = 8
+"vLX" = (
+/obj/machinery/door/airlock/pyro/security/alt,
+/obj/mapping_helper/access/brig,
+/obj/disposalpipe/segment/brig{
+	dir = 1
 	},
 /obj/cable{
-	icon_state = "4-8"
+	icon_state = "1-2"
 	},
 /obj/mapping_helper/firedoor_spawn,
-/turf/simulated/floor/black,
-/area/station/engine/monitoring{
-	name = "Nuclear Control Room"
-	})
+/obj/forcefield/energyshield/perma/doorlink,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "secinterro2";
+	name = "Security Interrogation 2";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/redblack,
+/area/station/security/interrogation)
 "vML" = (
 /obj/stool/chair{
 	dir = 4
@@ -50177,11 +50954,16 @@
 /obj/disposalpipe/trunk/east,
 /turf/simulated/floor/engine,
 /area/station/crew_quarters/cafeteria)
-"vPL" = (
-/obj/machinery/drone_recharger,
-/obj/cable{
+"vPx" = (
+/obj/cable/orange{
 	icon_state = "4-8"
 	},
+/turf/simulated/floor/black/grime,
+/area/station/hallway/secondary/construction{
+	name = "The Warrens"
+	})
+"vPL" = (
+/obj/machinery/drone_recharger,
 /obj/disposalpipe/segment/horizontal,
 /turf/simulated/floor/plating,
 /area/station/maintenance/southeast)
@@ -50300,6 +51082,9 @@
 /obj/disposalpipe/segment/transport{
 	dir = 4
 	},
+/obj/cable/yellow{
+	icon_state = "5-8"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/se{
 	name = "Southeast Breach Hull"
@@ -50437,6 +51222,27 @@
 	dir = 4
 	},
 /area/pasiphae/bridge)
+"vVw" = (
+/obj/machinery/door/airlock/pyro/glass/security{
+	dir = 4;
+	req_access = null
+	},
+/obj/mapping_helper/access/security,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/disposalpipe/segment/horizontal,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/black,
+/area/station/security/equipment)
 "vVy" = (
 /turf/simulated/floor/circuit/red,
 /area/listeningpost)
@@ -51195,6 +52001,10 @@
 	dir = 8
 	},
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "nw_breach";
+	name = "North West Breach Hull"
+	},
 /turf/simulated/floor/industrial,
 /area/station/maintenance/outer/nw{
 	name = "Northwest Breach Hull"
@@ -51287,6 +52097,27 @@
 	dir = 1
 	},
 /area/station/medical/medbay/lobby)
+"woe" = (
+/obj/machinery/door/airlock/pyro/glass/engineering{
+	dir = 4
+	},
+/obj/mapping_helper/access/engineering_engine,
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "reactormain";
+	name = "Reactor Main";
+	enter_id = "centrifuge"
+	},
+/turf/simulated/floor/black,
+/area/station/engine/monitoring{
+	name = "Nuclear Control Room"
+	})
 "woE" = (
 /obj/reagent_dispensers/watertank/big,
 /turf/simulated/floor/greenblack{
@@ -51587,16 +52418,6 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/hallway/secondary/exit)
-"wwp" = (
-/obj/rack,
-/obj/item/storage/box/fruit_wedges{
-	pixel_x = 6
-	},
-/obj/item/storage/box/beer{
-	pixel_x = -6
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "wwq" = (
 /obj/stool/chair/comfy{
 	dir = 8
@@ -51713,17 +52534,6 @@
 /obj/machinery/vending/cards,
 /turf/simulated/floor/black,
 /area/station/hallway/secondary/exit)
-"wyz" = (
-/obj/machinery/secscanner{
-	pixel_y = 10
-	},
-/obj/disposalpipe/segment/mail/vertical,
-/obj/machinery/door/airlock/pyro/security/alt,
-/obj/mapping_helper/access/security,
-/obj/mapping_helper/firedoor_spawn,
-/obj/forcefield/energyshield/perma/doorlink,
-/turf/simulated/floor/black,
-/area/station/security/main)
 "wzv" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -51845,6 +52655,16 @@
 /obj/decal/poster/wallsign/engineering,
 /turf/simulated/wall/auto/supernorn,
 /area/station/science/hall)
+"wDb" = (
+/obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sw_breach2";
+	name = "South West Breach Hull"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/sw{
+	name = "Southwest Breach Hull"
+	})
 "wDw" = (
 /obj/machinery/drainage,
 /obj/machinery/light/small,
@@ -51896,6 +52716,9 @@
 	},
 /turf/space/fluid/acid/clear,
 /area/space)
+"wEA" = (
+/turf/simulated/floor/engine/caution/north,
+/area/station/engine/ptl)
 "wEH" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -52601,6 +53424,29 @@
 	},
 /turf/simulated/floor/plating,
 /area/station/engine/storage)
+"wVh" = (
+/obj/table/reinforced/auto,
+/obj/item/kitchen/utensil/fork{
+	dir = 8;
+	pixel_y = -3;
+	pixel_x = 2
+	},
+/obj/item/kitchen/utensil/spoon{
+	dir = 8;
+	pixel_y = 13;
+	pixel_x = 2
+	},
+/obj/item/plate{
+	pixel_y = 7;
+	pixel_x = 3;
+	grabs_food_on_spawn = 0
+	},
+/obj/item/reagent_containers/food/drinks/drinkingglass/icewater{
+	pixel_x = -11;
+	pixel_y = 13
+	},
+/turf/simulated/floor/wood,
+/area/station/crew_quarters/cafeteria)
 "wVB" = (
 /obj/cable{
 	icon_state = "4-8"
@@ -52704,6 +53550,24 @@
 	},
 /turf/simulated/floor/darkblue/checker,
 /area/station/turret_protected/ai)
+"wXQ" = (
+/obj/machinery/door/airlock/pyro/command/alt{
+	dir = 4
+	},
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/mapping_helper/access/ai_upload,
+/obj/forcefield/energyshield/perma/doorlink{
+	dir = 8
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "aicore";
+	name = "AI Core";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/darkblue,
+/area/station/turret_protected/ai)
 "wYn" = (
 /obj/machinery/clothingbooth,
 /turf/simulated/floor/black/side{
@@ -53226,6 +54090,14 @@
 /obj/disposalpipe/trunk/west,
 /turf/simulated/floor/redblack,
 /area/station/hallway/primary/northeast)
+"xkP" = (
+/obj/cable/orange{
+	icon_state = "1-2"
+	},
+/turf/simulated/floor/industrial,
+/area/station/maintenance/outer/se{
+	name = "Southeast Breach Hull"
+	})
 "xkU" = (
 /obj/stool/chair{
 	dir = 8
@@ -53432,6 +54304,18 @@
 	},
 /turf/simulated/floor/black,
 /area/station/security/hos)
+"xpC" = (
+/obj/landmark/start/job/scientist,
+/obj/cable{
+	icon_state = "4-8"
+	},
+/obj/stool/chair/purple{
+	dir = 4
+	},
+/turf/simulated/floor/yellowblack{
+	dir = 1
+	},
+/area/station/science/hall)
 "xpP" = (
 /obj/disposalpipe/segment/mail/vertical,
 /turf/simulated/floor/yellowblack{
@@ -53452,16 +54336,6 @@
 /area/station/science/lobby{
 	name = "Science Lounge"
 	})
-"xqt" = (
-/obj/item/storage/box/donkpocket_kit{
-	pixel_x = -9;
-	pixel_y = -7
-	},
-/obj/item/device/radio/intercom/catering{
-	dir = 4
-	},
-/turf/simulated/floor/grey/blackgrime,
-/area/station/crew_quarters/catering)
 "xqM" = (
 /obj/machinery/door/airlock/pyro/maintenance/alt{
 	dir = 4
@@ -54307,6 +55181,11 @@
 	},
 /obj/forcefield/energyshield/perma/doorlink,
 /obj/mapping_helper/access/maint,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "disposals";
+	name = "Disposals";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/maintenance/outer/ne{
 	name = "Northeast Breach Hull"
@@ -54366,6 +55245,14 @@
 "xKn" = (
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/hallway/secondary/east)
+"xKL" = (
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/engine/substation/pylon{
+	name = "South Catalytic Substation"
+	})
 "xLu" = (
 /turf/simulated/floor/carpet/red/fancy/junction/sw_e,
 /area/pasiphae/crew)
@@ -54535,7 +55422,7 @@
 /area/station/crew_quarters/kitchen)
 "xPA" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -54762,6 +55649,11 @@
 /mob/living/critter/small_animal/cat/jones,
 /turf/simulated/floor/carpet/blue/fancy/edge/nw,
 /area/station/bridge/captain)
+"xUg" = (
+/turf/simulated/floor/engine/caution/corner{
+	dir = 1
+	},
+/area/station/engine/ptl)
 "xUk" = (
 /obj/machinery/disposal_pipedispenser/mobile{
 	dir = 8
@@ -55127,6 +56019,12 @@
 /turf/simulated/floor/black,
 /area/station/security/beepsky)
 "yel" = (
+/obj/cable/yellow{
+	icon_state = "4-8"
+	},
+/obj/cable/yellow{
+	icon_state = "4-10"
+	},
 /turf/simulated/floor/caution/corner/sw,
 /area/station/engine/substation/pylon{
 	name = "South Catalytic Substation"
@@ -55345,6 +56243,13 @@
 /obj/item/furniture_parts/bed/roller,
 /turf/simulated/floor/plating,
 /area/station/maintenance/north)
+"ykC" = (
+/obj/disposalpipe/segment/horizontal,
+/obj/cable{
+	icon_state = "2-8"
+	},
+/turf/simulated/floor/plating,
+/area/station/maintenance/southeast)
 "ykY" = (
 /obj/cable/yellow{
 	icon_state = "2-9"
@@ -85148,7 +86053,7 @@ xQv
 xQv
 iXj
 xQv
-kAj
+nun
 xQv
 kAj
 yls
@@ -85220,7 +86125,7 @@ vaV
 vaV
 eqq
 jjE
-eqq
+eFo
 jjE
 iXj
 jjE
@@ -87303,9 +88208,9 @@ sRi
 rvl
 gvL
 xsX
-ozy
-pMV
-lfG
+keJ
+aPP
+rFq
 rvl
 dqY
 dqY
@@ -87591,7 +88496,7 @@ mbt
 jNo
 uHm
 lLM
-trK
+nHW
 mbt
 oEZ
 iMW
@@ -87606,8 +88511,8 @@ rvl
 dYJ
 obA
 obA
-obA
-obA
+pRB
+lfG
 bMl
 gVW
 gVW
@@ -87907,12 +88812,12 @@ ssd
 rvl
 oaQ
 obA
-obA
 onm
+obA
 kWT
 hHa
 gVW
-nnS
+mzV
 ulO
 gVW
 gVW
@@ -88209,14 +89114,14 @@ cIp
 rvl
 rvl
 rvl
-dwe
 rvl
+dwe
 rvl
 rvl
 gVW
 gqO
 dGR
-oDZ
+itD
 bwA
 stc
 nha
@@ -88507,18 +89412,18 @@ oVg
 rvl
 agr
 iaW
-ncI
-llT
+mrH
+kgO
 rsN
 rNq
+ndW
 hEa
-xqt
-dqo
-bMa
+fpe
+dFX
 gVW
 nis
 pXu
-ksj
+jpM
 gVW
 idy
 rVs
@@ -88820,7 +89725,7 @@ skp
 fMh
 pSS
 tUe
-qZy
+rtA
 hVt
 qCW
 ktw
@@ -89112,16 +90017,16 @@ ycC
 iwQ
 aVQ
 xHl
-kgy
-qrD
 bGA
+nny
+bkC
+soo
 hEa
-qLk
-jOS
-wwp
+eze
+hLA
 gVW
-fZM
-fir
+bgU
+vos
 tNr
 gVW
 stY
@@ -89417,8 +90322,8 @@ lnA
 iHN
 iHN
 rsJ
-ghe
 rsJ
+ghe
 rsJ
 rsJ
 gVW
@@ -89718,11 +90623,11 @@ kyY
 bIm
 jVz
 iHN
-sso
+cla
+fMr
 ptO
-iUn
-ttA
-cDt
+jMd
+ehU
 rsJ
 pjE
 pJh
@@ -89744,7 +90649,7 @@ dWV
 lZN
 mKo
 laM
-uEk
+vVw
 laM
 mKo
 laM
@@ -90019,7 +90924,7 @@ oJc
 kyY
 iPX
 mJW
-aES
+mAw
 ptO
 ptO
 ptO
@@ -90342,7 +91247,7 @@ xVw
 xVw
 xVw
 xVw
-wyz
+eVm
 xVw
 iqd
 kBW
@@ -90624,8 +91529,8 @@ rCD
 maE
 hkx
 iHN
-kVe
-cSI
+oSR
+rzm
 kuP
 jGI
 scm
@@ -91573,7 +92478,7 @@ rvx
 dwC
 cHt
 uqC
-fbn
+wDb
 uax
 ltE
 gsX
@@ -91832,14 +92737,14 @@ umB
 abu
 diQ
 uel
-cfT
-paQ
-nea
-jwF
-chV
-nea
-evN
-jwF
+vNp
+emf
+uIZ
+qli
+qli
+emf
+uIZ
+qli
 jBz
 rmU
 wio
@@ -92134,14 +93039,14 @@ vnp
 vvS
 pYx
 uel
-cfT
-nea
-orS
-jwF
-chV
-bYc
-nea
-jwF
+vNp
+kSy
+wVh
+qli
+qli
+kSy
+wVh
+qli
 jBz
 rsJ
 xFO
@@ -92160,7 +93065,7 @@ bUk
 bUk
 bUk
 mXi
-tGK
+ddF
 mXi
 qLh
 qLh
@@ -92444,7 +93349,7 @@ qli
 qtl
 qtl
 qli
-jBz
+gKi
 saL
 hlm
 hcm
@@ -94570,11 +95475,11 @@ jwf
 hdz
 uiQ
 dwt
-crU
+ikQ
 imD
 eGM
 iub
-uvU
+vLX
 xSS
 uCa
 qmZ
@@ -96080,11 +96985,11 @@ hYj
 vAj
 irE
 mHk
-rrs
+nIk
 raO
 mEo
 uus
-sUg
+dBq
 pSd
 akA
 lRz
@@ -96961,7 +97866,7 @@ mjv
 xjY
 baP
 tLt
-fRH
+all
 qNE
 fFJ
 cNY
@@ -97856,7 +98761,7 @@ oWG
 oWG
 oWG
 oWG
-dhp
+aYR
 fyB
 oRv
 hhc
@@ -99077,8 +99982,8 @@ fCJ
 jxB
 fCJ
 agE
-fNd
-lLZ
+xpC
+grf
 czo
 cfj
 iYL
@@ -99984,7 +100889,7 @@ czb
 gXP
 agE
 gXP
-rpK
+ubT
 czo
 mXd
 iYL
@@ -101851,7 +102756,7 @@ nsy
 dQM
 nlc
 psV
-vtr
+xKL
 qjE
 sQr
 laQ
@@ -102105,7 +103010,7 @@ iYL
 lZB
 xSt
 jrr
-hJQ
+esW
 jrr
 jrr
 iaS
@@ -103361,7 +104266,7 @@ mgm
 abz
 mif
 neB
-fTY
+nna
 elm
 dAB
 bzS
@@ -103590,7 +104495,7 @@ eMB
 ccp
 wRi
 jAB
-sBs
+aby
 sMn
 lPE
 wRi
@@ -103964,7 +104869,7 @@ iJJ
 abz
 abz
 neB
-nPr
+neB
 vTb
 neB
 dAB
@@ -104202,7 +105107,7 @@ gpP
 uRX
 uXm
 nzD
-qVs
+iVM
 ioB
 viK
 eLX
@@ -104265,8 +105170,8 @@ eRD
 ihh
 cXD
 nFG
-nIj
 cSH
+dbo
 bWz
 rEP
 rEP
@@ -104568,7 +105473,7 @@ nve
 eRD
 nGd
 neB
-neB
+fNZ
 dAB
 dAB
 bzS
@@ -104869,7 +105774,7 @@ ouB
 tKo
 eRD
 nGi
-neB
+bKJ
 neB
 dAB
 hIJ
@@ -105171,7 +106076,7 @@ eRD
 eRD
 eRD
 nGm
-neB
+fNZ
 neB
 dAB
 bzS
@@ -105403,7 +106308,7 @@ oOu
 wRi
 edb
 swt
-hRU
+lRy
 vmT
 wRi
 wRi
@@ -105472,7 +106377,7 @@ lli
 glH
 gxN
 nCM
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -105774,7 +106679,7 @@ uJB
 eRD
 eRD
 fxH
-fxH
+fSV
 dAB
 dAB
 bzS
@@ -106076,7 +106981,7 @@ pCj
 eRD
 lCi
 neB
-neB
+fNZ
 dAB
 hIJ
 bzS
@@ -106377,7 +107282,7 @@ eRD
 eRD
 eRD
 neB
-neB
+dQV
 neB
 dAB
 bzS
@@ -106628,7 +107533,7 @@ wTZ
 aXE
 ahx
 ahx
-ahx
+fac
 ahx
 fYG
 fYG
@@ -106678,7 +107583,7 @@ gTI
 wYR
 eRD
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -106890,7 +107795,7 @@ mIG
 mIG
 mIG
 mIG
-bOo
+lZt
 mIG
 mIG
 mIG
@@ -106930,7 +107835,7 @@ kse
 hsY
 unW
 unW
-unW
+hbd
 unW
 cxr
 unW
@@ -106980,7 +107885,7 @@ bFf
 eRD
 eRD
 neB
-neB
+fNZ
 dAB
 dAB
 bzS
@@ -107232,7 +108137,7 @@ njX
 nDS
 ibV
 uNd
-kAM
+nmn
 uNd
 ibV
 uNd
@@ -107281,7 +108186,7 @@ eRD
 usT
 eRD
 lCi
-neB
+bKJ
 neB
 dAB
 hIJ
@@ -107534,7 +108439,7 @@ rkh
 lWL
 ibV
 aZV
-aZV
+eTX
 aZV
 uNd
 aZV
@@ -107583,7 +108488,7 @@ eRD
 eRD
 eRD
 neB
-neB
+fNZ
 neB
 dAB
 bzS
@@ -107836,7 +108741,7 @@ uiV
 sce
 ibV
 fLQ
-kAM
+cTx
 fLQ
 ibV
 fLQ
@@ -107884,7 +108789,7 @@ eIV
 jDV
 lka
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -108097,7 +109002,7 @@ mIG
 mIG
 mIG
 mIG
-bOo
+wXQ
 mIG
 mIG
 mIG
@@ -108138,7 +109043,7 @@ rkh
 ibV
 ibV
 dhu
-hkU
+lAF
 gcG
 oDS
 hkU
@@ -108186,7 +109091,7 @@ kcY
 kRh
 kRh
 fxH
-fxH
+vil
 dAB
 dAB
 bzS
@@ -108446,7 +109351,7 @@ sKX
 tSU
 jOW
 jOW
-ieu
+ppa
 eSP
 vJR
 xos
@@ -108461,14 +109366,14 @@ hWH
 gzZ
 dun
 ktz
-fNZ
+dhK
 hQq
 sRr
 dhK
 leP
 hJI
 cwN
-xFU
+lAj
 hZq
 rrm
 tYX
@@ -108488,7 +109393,7 @@ iLs
 kRh
 lCi
 neB
-neB
+fNZ
 dAB
 hIJ
 bzS
@@ -108770,8 +109675,8 @@ dKT
 moJ
 hWH
 ghK
-ggN
-jlq
+ykC
+hMY
 lIu
 qIU
 kXF
@@ -108789,7 +109694,7 @@ uod
 kRh
 kRh
 neB
-neB
+dQV
 neB
 dAB
 bzS
@@ -109053,7 +109958,7 @@ kQl
 ocD
 ocD
 bub
-vMJ
+woe
 ocD
 ocD
 cZK
@@ -109090,7 +109995,7 @@ goK
 tnw
 lka
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -109374,7 +110279,7 @@ pUW
 ijx
 qhg
 qbA
-wYt
+mmf
 hZq
 kRh
 god
@@ -109392,7 +110297,7 @@ uWj
 kRh
 kRh
 neB
-neB
+fNZ
 dAB
 dAB
 bzS
@@ -109659,9 +110564,9 @@ vMP
 uNg
 uiD
 qif
-jyj
+ikw
 ldK
-iZl
+axj
 sRM
 uEI
 dOr
@@ -109669,9 +110574,9 @@ qfz
 mhP
 aEI
 njf
-xSn
-kpw
-xSn
+bfl
+jWX
+rKG
 adD
 bfl
 dwx
@@ -109693,7 +110598,7 @@ tQW
 ejL
 kRh
 lCi
-neB
+bKJ
 neB
 dAB
 hIJ
@@ -109995,7 +110900,7 @@ kRh
 kRh
 kRh
 neB
-neB
+fNZ
 neB
 dAB
 bzS
@@ -110296,7 +111201,7 @@ lqD
 mip
 kRh
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -110583,7 +111488,7 @@ hwv
 eok
 kdG
 kdG
-ayE
+rGv
 kRh
 kRh
 kRh
@@ -110598,7 +111503,7 @@ xPH
 kRh
 kRh
 fxH
-fxH
+vil
 dAB
 dAB
 bzS
@@ -110885,7 +111790,7 @@ fZQ
 vNv
 boA
 kdG
-ntb
+tlH
 sZX
 ntb
 xhh
@@ -110900,7 +111805,7 @@ aXj
 kRh
 lCi
 neB
-neB
+fNZ
 dAB
 hIJ
 bzS
@@ -111187,7 +112092,7 @@ aKN
 mxV
 eUm
 kdG
-xhh
+llJ
 kRh
 kRh
 kRh
@@ -111201,7 +112106,7 @@ kRh
 kRh
 kRh
 neB
-neB
+dQV
 neB
 dAB
 bzS
@@ -111489,7 +112394,7 @@ vwb
 mxV
 xOk
 kdG
-ntb
+tlH
 kRh
 ycs
 lna
@@ -111502,7 +112407,7 @@ cnT
 jvJ
 lka
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -111791,7 +112696,7 @@ aKN
 jyA
 hFV
 kdG
-sZX
+uJE
 kRh
 cHV
 vKH
@@ -111804,7 +112709,7 @@ kCh
 kRh
 kRh
 neB
-neB
+fNZ
 dAB
 dAB
 bzS
@@ -112070,7 +112975,7 @@ ygt
 ygt
 ygt
 ijc
-bJp
+ktR
 oPG
 rqB
 sSm
@@ -112093,7 +112998,7 @@ fAy
 kgc
 uNT
 kdG
-xhh
+llJ
 kRh
 qvZ
 vCk
@@ -112105,7 +113010,7 @@ kXC
 aQD
 kRh
 lCi
-neB
+bKJ
 neB
 dAB
 hIJ
@@ -112395,7 +113300,7 @@ seK
 kdG
 kdG
 kdG
-ntb
+tlH
 kRh
 dsv
 qmH
@@ -112407,7 +113312,7 @@ ntr
 kRh
 kRh
 neB
-neB
+fNZ
 neB
 dAB
 bzS
@@ -112697,7 +113602,7 @@ sIb
 fse
 kdG
 cQh
-sZX
+fTc
 kRh
 kRh
 kRh
@@ -112708,7 +113613,7 @@ oZL
 cKo
 lka
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -113000,7 +113905,7 @@ ddR
 kdG
 ntb
 ntb
-xhh
+jqr
 kRh
 ddM
 nQG
@@ -113010,7 +113915,7 @@ oZL
 kRh
 kRh
 fxH
-fxH
+vil
 dAB
 dAB
 bzS
@@ -113302,7 +114207,7 @@ kdG
 kdG
 kRh
 kRh
-ayE
+rGv
 kRh
 nJe
 dZR
@@ -113312,7 +114217,7 @@ uWj
 kRh
 lCi
 neB
-neB
+fNZ
 dAB
 hIJ
 bzS
@@ -113531,7 +114436,7 @@ rJg
 vNl
 rne
 rne
-eVf
+aQh
 kti
 kti
 kti
@@ -113613,7 +114518,7 @@ itp
 kRh
 kRh
 neB
-neB
+dQV
 neB
 dAB
 bzS
@@ -113906,7 +114811,7 @@ xhh
 xhh
 xhh
 lru
-ntr
+cUo
 ntr
 nQG
 oZL
@@ -113914,7 +114819,7 @@ xhh
 fpW
 lka
 neB
-neB
+bKJ
 hOA
 rEP
 rEP
@@ -114136,7 +115041,7 @@ rJg
 rJg
 rne
 cXH
-eVf
+aQh
 tVq
 pYH
 pYH
@@ -114151,9 +115056,9 @@ vvE
 lHJ
 ylk
 mQy
-cNv
+fFH
 dHy
-hTd
+kGx
 vKz
 jaN
 jjs
@@ -114208,7 +115113,7 @@ xhh
 xhh
 xhh
 kRh
-itp
+qRe
 mTx
 nQG
 oZL
@@ -114216,7 +115121,7 @@ sju
 kRh
 kRh
 neB
-neB
+fNZ
 dAB
 dAB
 bzS
@@ -114510,14 +115415,14 @@ faZ
 kRh
 kRh
 kRh
-ntr
+cUo
 kRh
 nJe
 oZL
 gvr
 kRh
 lCi
-neB
+bKJ
 neB
 dAB
 pFh
@@ -114812,14 +115717,14 @@ faZ
 nJe
 nQG
 nQG
-nQG
+bFd
 nQG
 nQG
 nLI
 kRh
 kRh
 neB
-neB
+uTK
 neB
 dAB
 vnv
@@ -115114,14 +116019,14 @@ faZ
 nQG
 dZR
 apM
+ppR
 apM
 apM
-apM
-uWj
-lka
+bru
+jIK
+ftE
 neB
-neB
-hOA
+sFj
 neB
 rEP
 hnw
@@ -115416,18 +116321,18 @@ faZ
 nQG
 oZL
 txY
-bBV
+vPx
 bBV
 txY
 kRh
 kRh
-fxH
-fxH
-dAB
-dAB
-dAB
-dAB
-dAB
+dvF
+lDW
+iXQ
+iXQ
+iXQ
+nIj
+nIj
 bzS
 bzS
 bzS
@@ -115723,13 +116628,13 @@ mTx
 gYB
 kRh
 lCi
-neB
-neB
-dAB
-dqn
-dqn
+kPo
+kRD
+aTf
+fhD
+sAj
 eRb
-dAB
+nIj
 bzS
 bzS
 bzS
@@ -116021,17 +116926,17 @@ nHj
 dbf
 kRh
 jxs
-mTx
+iDK
 kRh
 kRh
 neB
-neB
-neB
-dAB
-dqn
-dqn
-dqn
-dAB
+pbM
+fkY
+fgI
+pSG
+aat
+aRr
+nIj
 bzS
 bzS
 bzS
@@ -116324,16 +117229,16 @@ tVF
 kRh
 sFr
 wqN
-lka
-neB
-neB
+aYG
+xkP
+euK
 neB
 neB
 iXQ
-dqn
-dqn
-dqn
-rEP
+pol
+fXq
+sRe
+nIj
 bzS
 bzS
 bzS
@@ -116631,11 +117536,11 @@ neB
 neB
 neB
 qVa
-dAB
-dqn
-dqn
-dqn
-dAB
+iXQ
+wEA
+fbQ
+nPr
+iXQ
 bzS
 bzS
 bzS
@@ -116933,11 +117838,11 @@ neB
 neB
 dAB
 rEP
-dAB
-dqn
-dqn
-dqn
-dAB
+iXQ
+fTY
+ham
+xUg
+iXQ
 bzS
 bzS
 bzS
@@ -117160,7 +118065,7 @@ rne
 rne
 iXj
 rne
-wjl
+tQV
 rne
 wjl
 tVq
@@ -117232,14 +118137,14 @@ pzI
 pzI
 fxH
 dAB
-fxH
+ahJ
 dAB
 iXj
-dAB
-dAB
-rEP
-dAB
-dAB
+iXQ
+iXQ
+uXC
+iXQ
+iXQ
 bzS
 bzS
 bzS
@@ -117539,7 +118444,7 @@ dAB
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 iUo
 bzS
@@ -117841,7 +118746,7 @@ dAB
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -118143,7 +119048,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -118445,7 +119350,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -118747,7 +119652,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -119049,7 +119954,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -119351,7 +120256,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -119653,7 +120558,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -119894,9 +120799,9 @@ rJg
 rJg
 rJg
 rJg
-fUM
+ecJ
 gYJ
-uWc
+bva
 ahz
 pnk
 gza
@@ -119955,7 +120860,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -120257,7 +121162,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -120498,9 +121403,9 @@ rJg
 rJg
 rJg
 rJg
-fUM
+ecJ
 fbB
-aSj
+pNF
 kDr
 pnk
 ruH
@@ -120559,7 +121464,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -120861,7 +121766,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -121163,7 +122068,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -121465,7 +122370,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -121767,7 +122672,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -122069,7 +122974,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -122371,7 +123276,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -122673,7 +123578,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -122975,7 +123880,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -123277,7 +124182,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -123579,7 +124484,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -123881,7 +124786,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -124183,7 +125088,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -124485,7 +125390,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -124787,7 +125692,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -125089,7 +125994,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -125391,7 +126296,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -125693,7 +126598,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -125995,7 +126900,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -126297,7 +127202,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -126599,7 +127504,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -126901,7 +127806,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -127203,7 +128108,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -127505,7 +128410,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -127807,7 +128712,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -128109,7 +129014,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -128411,7 +129316,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -128713,7 +129618,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -129015,7 +129920,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -129317,7 +130222,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -129619,7 +130524,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -129921,7 +130826,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -130223,7 +131128,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -130525,7 +131430,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -130827,7 +131732,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -131129,7 +132034,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -131431,7 +132336,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -131733,7 +132638,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
@@ -132035,7 +132940,7 @@ bzS
 bzS
 bzS
 bzS
-bzS
+rJg
 bzS
 bzS
 bzS
diff --git a/maps/oshan.dmm b/maps/oshan.dmm
index 639466ea748f3..5306862f97cc9 100644
--- a/maps/oshan.dmm
+++ b/maps/oshan.dmm
@@ -279,6 +279,11 @@
 	dir = 5
 	},
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/engine)
 "aba" = (
@@ -326,6 +331,11 @@
 	dir = 6
 	},
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/engine)
 "abh" = (
@@ -2324,6 +2334,10 @@
 "ahO" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmaint";
+	name = "North Maintenance"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/northeast)
 "ahQ" = (
@@ -2399,6 +2413,10 @@
 "aie" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "northmaint2";
+	name = "North Maintenance"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/northwest)
 "aif" = (
@@ -10695,12 +10713,12 @@
 /area/station/science/lobby)
 "aJg" = (
 /obj/machinery/light/incandescent/warm,
-/obj/stool/chair{
-	dir = 8
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/wood,
 /area/station/science/lobby)
 "aJi" = (
@@ -11007,14 +11025,7 @@
 /turf/simulated/floor/plating/random,
 /area/station/storage/tech)
 "aJX" = (
-/obj/rack,
-/obj/item/circuitboard/teleporter,
-/obj/item/circuitboard/card,
-/obj/item/circuitboard/robot_module_rewriter,
-/obj/item/circuitboard/cloning,
-/obj/item/circuitboard/barcode_qm,
-/obj/item/circuitboard/barcode,
-/obj/item/circuitboard/qmsupply,
+/obj/rack/organized/techstorage_eng,
 /turf/simulated/floor/plating/random,
 /area/station/storage/tech)
 "aJY" = (
@@ -11073,14 +11084,7 @@
 /turf/simulated/floor/plating/random,
 /area/station/storage/tech)
 "aKp" = (
-/obj/rack,
-/obj/item/circuitboard/arcade,
-/obj/item/circuitboard/powermonitor,
-/obj/item/circuitboard/powermonitor_smes,
-/obj/item/circuitboard/operating,
-/obj/item/circuitboard/genetics,
-/obj/item/circuitboard/qmorder,
-/obj/item/circuitboard/telescope,
+/obj/rack/organized/techstorage_med,
 /turf/simulated/floor/plating/random,
 /area/station/storage/tech)
 "aKr" = (
@@ -11768,6 +11772,10 @@
 	dir = 4
 	},
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint2";
+	name = "Central Inner Maintenance"
+	},
 /turf/simulated/floor/engine/glow/blue{
 	dir = 10
 	},
@@ -12053,11 +12061,15 @@
 	dir = 4
 	},
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint2";
+	name = "Central Inner Maintenance"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/inner/central)
 "aOs" = (
 /obj/storage/closet/coffin,
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 /turf/simulated/floor/plating/random,
 /area/station/maintenance/northwest)
 "aOt" = (
@@ -12322,7 +12334,7 @@
 /obj/item/storage/toolbox/mechanical{
 	pixel_y = -4
 	},
-/obj/item/pinpointer{
+/obj/item/pinpointer/disk{
 	pixel_x = 3;
 	pixel_y = 7
 	},
@@ -13955,7 +13967,7 @@
 /area/space)
 "aVp" = (
 /obj/storage/crate,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /obj/item/clothing/mask/gas/emergency,
 /turf/simulated/floor/grime,
@@ -14104,7 +14116,7 @@
 /area/iss)
 "aVR" = (
 /obj/storage/closet/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /turf/simulated/floor/grime,
 /area/iss)
 "aVS" = (
@@ -14965,6 +14977,11 @@
 	icon_state = "1-2-thick"
 	},
 /obj/mapping_helper/access/engineering_engine,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/engine)
 "bbe" = (
@@ -16639,7 +16656,7 @@
 /area/station/maintenance/inner/central)
 "biE" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -16712,6 +16729,7 @@
 /area/station/crew_quarters/catering)
 "biQ" = (
 /obj/machinery/light/incandescent/cool/very,
+/obj/item/storage/box/popsicle_sticks,
 /turf/simulated/floor/specialroom/freezer,
 /area/station/crew_quarters/catering)
 "biR" = (
@@ -17208,7 +17226,7 @@
 	icon_state = "4-8"
 	},
 /obj/table/auto,
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_y = 10
 	},
 /turf/simulated/floor/white,
@@ -17593,7 +17611,7 @@
 /area/evilreaver/security)
 "bmb" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -20301,6 +20319,11 @@
 /area/station/security/checkpoint/escape)
 "bvq" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating/random,
 /area/station/hangar/engine)
 "bvs" = (
@@ -29084,10 +29107,10 @@
 	dir = 8;
 	icon_state = "line1"
 	},
-/obj/stool/chair,
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/stool/chair/purple,
 /turf/simulated/floor/purpleblack{
 	dir = 8
 	},
@@ -29748,7 +29771,7 @@
 /area/diner/kitchen)
 "ccn" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/grime,
 /area/diner/kitchen)
 "cco" = (
@@ -29857,6 +29880,11 @@
 /area/diner/kitchen)
 "ccH" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "diner";
+	name = "Space Diner";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating,
 /area/diner/hallway)
 "ccI" = (
@@ -30930,6 +30958,11 @@
 /area/shuttle/sea_elevator/upper)
 "cgj" = (
 /obj/machinery/door/airlock/pyro/external,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sealift";
+	name = "Sea Elevator Room";
+	enter_id = "elevator"
+	},
 /turf/simulated/floor,
 /area/shuttle/sea_elevator_room)
 "cgk" = (
@@ -31143,6 +31176,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sealift";
+	name = "Sea Elevator Room";
+	enter_id = "seaside"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/shuttle/sea_elevator_room)
 "cha" = (
@@ -31185,6 +31223,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 8
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "diner";
+	name = "Space Diner";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/plating,
 /area/diner/hallway)
 "chi" = (
@@ -31610,6 +31653,11 @@
 	dir = 4
 	},
 /obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint";
+	name = "Central Inner Maintenance";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/station/maintenance/inner/central)
 "cjV" = (
@@ -32403,6 +32451,11 @@
 	},
 /obj/mapping_helper/access/engineering,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "cAR" = (
@@ -32816,6 +32869,11 @@
 	},
 /obj/mapping_helper/access/heads,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "dcJ" = (
@@ -33240,6 +33298,11 @@
 	icon_state = "0-2-thick"
 	},
 /obj/cable,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sealift";
+	name = "Sea Elevator Room";
+	enter_id = "elevator"
+	},
 /turf/simulated/floor,
 /area/shuttle/sea_elevator_room)
 "dHj" = (
@@ -33627,6 +33690,11 @@
 	icon_state = "1-2-thick"
 	},
 /obj/mapping_helper/access/engineering_engine,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/station/hangar/engine)
 "egx" = (
@@ -35495,7 +35563,7 @@
 /area/station/turret_protected/ai_upload)
 "gEE" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/extinguisher,
 /obj/item/screwdriver,
@@ -36631,6 +36699,11 @@
 "iEz" = (
 /obj/machinery/door/airlock/pyro/external,
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "outpost";
+	name = "Research Outpost";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/research_outpost)
 "iEE" = (
@@ -37180,6 +37253,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "outer"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "juK" = (
@@ -37605,6 +37683,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "sec"
+	},
 /turf/simulated/floor/red,
 /area/station/security/main)
 "keq" = (
@@ -38383,6 +38466,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "brig"
+	},
 /turf/simulated/floor/red,
 /area/station/security/processing)
 "ltZ" = (
@@ -39924,6 +40012,17 @@
 	},
 /turf/simulated/floor/green,
 /area/station/hydroponics/bay)
+"nnK" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sealift";
+	name = "Sea Elevator Room";
+	enter_id = "stationside"
+	},
+/turf/simulated/floor/shuttlebay,
+/area/shuttle/sea_elevator_room)
 "nnT" = (
 /obj/stool/chair/green{
 	dir = 8
@@ -40255,6 +40354,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "engine";
+	name = "Engineering";
+	enter_id = "inner"
+	},
 /turf/simulated/floor,
 /area/station/engine/engineering)
 "nLp" = (
@@ -40387,12 +40491,12 @@
 	dir = 8;
 	icon_state = "line1"
 	},
-/obj/stool/chair{
-	dir = 1
-	},
 /obj/disposalpipe/segment/mail{
 	dir = 4
 	},
+/obj/stool/chair/purple{
+	dir = 1
+	},
 /turf/simulated/floor/purpleblack{
 	dir = 8
 	},
@@ -40640,6 +40744,11 @@
 /obj/machinery/secscanner{
 	pixel_y = 10
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "oAu" = (
@@ -41919,6 +42028,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "quk" = (
@@ -42181,6 +42295,18 @@
 "qPg" = (
 /turf/simulated/floor,
 /area/station/hangar/sec)
+"qPk" = (
+/obj/machinery/door/airlock/pyro/external{
+	dir = 4
+	},
+/obj/machinery/light/small/floor/cool,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "innermaint";
+	name = "Central Inner Maintenance";
+	enter_id = "inner"
+	},
+/turf/simulated/floor/shuttlebay,
+/area/station/maintenance/inner/central)
 "qRg" = (
 /obj/table/wood/auto,
 /obj/item/camera{
@@ -42579,7 +42705,7 @@
 /area/research_outpost)
 "rxi" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -42635,6 +42761,11 @@
 /obj/machinery/door/airlock/pyro/external{
 	dir = 4
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sealift";
+	name = "Sea Elevator Room";
+	enter_id = "stationside"
+	},
 /turf/simulated/floor/shuttlebay,
 /area/shuttle/sea_elevator_room)
 "rBX" = (
@@ -43099,6 +43230,11 @@
 /obj/machinery/secscanner{
 	pixel_y = 10
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "bridge";
+	name = "Bridge";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/black,
 /area/station/bridge)
 "sxC" = (
@@ -43270,6 +43406,11 @@
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "outpost";
+	name = "Research Outpost";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating/random,
 /area/research_outpost/maint)
 "sJy" = (
@@ -44138,10 +44279,10 @@
 /turf/simulated/floor/plating/damaged3,
 /area/martian_trader)
 "uij" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 4
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/wood,
 /area/station/science/lobby)
 "ujL" = (
@@ -44666,6 +44807,11 @@
 /obj/cable{
 	icon_state = "1-2"
 	},
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "sec";
+	name = "Security";
+	enter_id = "outer"
+	},
 /turf/simulated/floor/red,
 /area/station/security/main)
 "vnf" = (
@@ -45136,6 +45282,11 @@
 	icon_state = "4-8"
 	},
 /obj/mapping_helper/firedoor_spawn,
+/obj/mapping_helper/airlock/cycler{
+	cycle_id = "outpost";
+	name = "Research Outpost";
+	enter_id = "inner"
+	},
 /turf/simulated/floor/plating/random,
 /area/research_outpost/hangar)
 "wbu" = (
@@ -85888,8 +86039,8 @@ aqn
 cjw
 cjD
 aCD
-cjS
-cjS
+qPk
+qPk
 aCD
 aqn
 aqn
@@ -87086,7 +87237,7 @@ aqn
 aqn
 aLV
 rBz
-cgY
+nnK
 aLV
 aqn
 aqn
@@ -87690,7 +87841,7 @@ aLV
 aLV
 aLV
 rBz
-cgY
+nnK
 aLV
 aqn
 aqn
diff --git a/maps/pamgoc.dmm b/maps/pamgoc.dmm
index 2dca26076021a..fdb29f1cb41fe 100644
--- a/maps/pamgoc.dmm
+++ b/maps/pamgoc.dmm
@@ -6255,7 +6255,7 @@
 /area/station/crew_quarters/catering)
 "anI" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -26833,7 +26833,7 @@
 /area/station/medical/morgue)
 "bmS" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -34041,7 +34041,7 @@
 /area/station/hallway/secondary/exit)
 "bHD" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -35318,8 +35318,8 @@
 /area/station/medical/medbay/lobby)
 "bKi" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -4;
 	pixel_y = -2
 	},
@@ -40260,66 +40260,14 @@
 /turf/simulated/floor/grime,
 /area/station/storage/warehouse)
 "bVf" = (
-/obj/rack,
-/obj/item/circuitboard/qmsupply{
-	pixel_x = 5;
-	pixel_y = 5
-	},
-/obj/item/circuitboard/telescope{
-	pixel_x = 5;
-	pixel_y = 1
-	},
-/obj/item/circuitboard/powermonitor{
-	pixel_x = 5;
-	pixel_y = -3
-	},
-/obj/item/circuitboard/genetics{
-	pixel_x = -5;
-	pixel_y = 7
-	},
-/obj/item/circuitboard/powermonitor_smes{
-	pixel_x = -5;
-	pixel_y = 3
-	},
-/obj/item/circuitboard/arcade{
-	pixel_x = -5;
-	pixel_y = -5
-	},
-/obj/item/circuitboard/operating{
-	pixel_x = -5;
-	pixel_y = -1
+/obj/rack/organized/techstorage_med{
+	order_override = "zigzag"
 	},
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
 "bVg" = (
-/obj/rack,
-/obj/item/circuitboard/qmorder{
-	pixel_x = 5;
-	pixel_y = 5
-	},
-/obj/item/circuitboard/robot_module_rewriter{
-	pixel_x = 5;
-	pixel_y = -3
-	},
-/obj/item/circuitboard/barcode_qm{
-	pixel_x = 5;
-	pixel_y = 1
-	},
-/obj/item/circuitboard/barcode{
-	pixel_x = -5;
-	pixel_y = 7
-	},
-/obj/item/circuitboard/card{
-	pixel_x = -5;
-	pixel_y = 3
-	},
-/obj/item/circuitboard/cloning{
-	pixel_x = -5;
-	pixel_y = -1
-	},
-/obj/item/circuitboard/teleporter{
-	pixel_x = -5;
-	pixel_y = -5
+/obj/rack/organized/techstorage_eng{
+	order_override = "zigzag"
 	},
 /turf/simulated/floor/plating,
 /area/station/storage/tech)
@@ -40456,7 +40404,7 @@
 /area/station/maintenance/east)
 "bVo" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = 7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -40492,7 +40440,7 @@
 	pixel_x = 8;
 	pixel_y = 5
 	},
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -40513,7 +40461,7 @@
 /area/station/maintenance/northeast)
 "bVr" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -40534,7 +40482,7 @@
 /area/station/maintenance/southeast)
 "bVs" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -40555,7 +40503,7 @@
 /area/station/maintenance/east)
 "bVt" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/air,
 /obj/item/extinguisher{
 	pixel_x = -9
@@ -40572,7 +40520,7 @@
 /area/station/maintenance/northwest)
 "bVu" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = 7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -41268,7 +41216,7 @@
 	pixel_x = -5;
 	pixel_y = 7
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = 7
 	},
 /obj/item/storage/toolbox/emergency{
@@ -43441,9 +43389,6 @@
 /turf/simulated/floor,
 /area/station/security/main)
 "cbG" = (
-/obj/stool/chair{
-	dir = 4
-	},
 /obj/cable{
 	icon_state = "1-2"
 	},
@@ -43451,15 +43396,15 @@
 	pixel_x = -6;
 	pixel_y = -11
 	},
+/obj/stool/chair/purple{
+	dir = 4
+	},
 /turf/simulated/floor/carpet{
 	dir = 5;
 	icon_state = "fred5"
 	},
 /area/station/crew_quarters/hor)
 "cbH" = (
-/obj/stool/chair{
-	dir = 4
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
@@ -43469,15 +43414,18 @@
 	name = "autoname - SS13"
 	},
 /obj/blind_switch/area/north,
+/obj/stool/chair/purple{
+	dir = 4
+	},
 /turf/simulated/floor/black,
 /area/station/crew_quarters/hor)
 "cbI" = (
-/obj/stool/chair{
-	dir = 4
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/stool/chair/purple{
+	dir = 4
+	},
 /turf/simulated/floor/grime,
 /area/station/science/lab)
 "cbJ" = (
@@ -43534,10 +43482,10 @@
 /turf/simulated/floor/purple/side,
 /area/station/janitor/office)
 "cbO" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 4
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/purple/side,
 /area/station/science/lobby)
 "cbP" = (
@@ -43754,12 +43702,12 @@
 	},
 /area/station/crew_quarters/captain)
 "cco" = (
-/obj/stool/chair{
-	dir = 8
-	},
 /obj/cable{
 	icon_state = "4-8"
 	},
+/obj/stool/chair/purple{
+	dir = 8
+	},
 /turf/simulated/floor/carpet{
 	dir = 8;
 	icon_state = "fred2"
@@ -43807,10 +43755,10 @@
 	},
 /area/station/chapel/sanctuary)
 "ccs" = (
-/obj/stool/chair{
+/obj/landmark/start/job/scientist,
+/obj/stool/chair/purple{
 	dir = 8
 	},
-/obj/landmark/start/job/scientist,
 /turf/simulated/floor/purple/side,
 /area/station/science/lobby)
 "cct" = (
@@ -44659,7 +44607,7 @@
 /area/station/crew_quarters/quartersB)
 "cew" = (
 /obj/storage/crate,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/airless/scorched,
 /area/abandonedship)
@@ -48563,7 +48511,7 @@
 	pixel_x = -10;
 	pixel_y = 6
 	},
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = 3;
 	pixel_y = 2
 	},
@@ -49066,7 +49014,7 @@
 /area/station/mining/staff_room)
 "ckQ" = (
 /obj/table/auto,
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_x = -6
 	},
 /turf/simulated/floor/specialroom/cafeteria,
@@ -50720,7 +50668,7 @@
 "cnM" = (
 /obj/table/wood/auto,
 /obj/item/reagent_containers/food/drinks/drinkingglass,
-/obj/item/pinpointer,
+/obj/item/pinpointer/disk,
 /turf/simulated/floor/carpet{
 	dir = 10;
 	icon_state = "fred2"
@@ -55025,7 +54973,7 @@
 	pixel_x = 6;
 	pixel_y = 7
 	},
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /turf/simulated/floor/black,
 /area/station/engine/hotloop)
 "dgR" = (
@@ -58317,7 +58265,7 @@
 	},
 /obj/item/decoration/ashtray,
 /obj/machinery/light,
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_x = -4;
 	pixel_y = 8
 	},
diff --git a/maps/pod_wars.dmm b/maps/pod_wars.dmm
index 353283526d65d..e951106dce417 100644
--- a/maps/pod_wars.dmm
+++ b/maps/pod_wars.dmm
@@ -4611,7 +4611,7 @@
 /area/pod_wars/team2/power)
 "rR" = (
 /obj/table/reinforced/bar/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/unsimulated/floor/specialroom/bar,
 /area/pod_wars/team1/bar)
 "rS" = (
@@ -6118,7 +6118,7 @@
 /turf/unsimulated/floor/white,
 /area/pod_wars/team1/medbay)
 "xy" = (
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/table/auto,
 /turf/simulated/floor/green/side{
 	dir = 10
@@ -9870,7 +9870,7 @@
 /area/pod_wars/spacejunk/miningoutpost)
 "MT" = (
 /obj/table/reinforced/bar/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/unsimulated/floor/specialroom/bar,
 /area/pod_wars/team2/bar)
 "MU" = (
@@ -10398,7 +10398,7 @@
 "Pk" = (
 /obj/machinery/light/incandescent/netural,
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/yellow,
 /area/pod_wars/spacejunk/restaurant)
 "Pm" = (
diff --git a/maps/setpieces/xg6_fermidzone.dmm b/maps/setpieces/xg6_fermidzone.dmm
index 5daa99c4633b3..96fcb9d794a8c 100644
--- a/maps/setpieces/xg6_fermidzone.dmm
+++ b/maps/setpieces/xg6_fermidzone.dmm
@@ -6486,8 +6486,8 @@
 	anchored = 1;
 	pixel_y = 16
 	},
-/obj/item/clothing/suit/rad/iomoon,
-/obj/item/clothing/suit/rad/iomoon,
+/obj/item/clothing/suit/hazard/rad/iomoon,
+/obj/item/clothing/suit/hazard/rad/iomoon,
 /turf/unsimulated/floor/yellow/checker,
 /area/solarium{
 	name = "XG6 Shen Kuo Observatory"
@@ -8195,8 +8195,8 @@
 	anchored = 1;
 	pixel_y = 16
 	},
-/obj/item/clothing/suit/rad/iomoon,
-/obj/item/clothing/suit/rad/iomoon,
+/obj/item/clothing/suit/hazard/rad/iomoon,
+/obj/item/clothing/suit/hazard/rad/iomoon,
 /turf/unsimulated/floor/yellow/checker,
 /area/solarium{
 	name = "XG6 Shen Kuo Observatory"
diff --git a/maps/unused/concept_fixed.dmm b/maps/unused/concept_fixed.dmm
index fc6c36c1156d1..f427e1767b733 100644
--- a/maps/unused/concept_fixed.dmm
+++ b/maps/unused/concept_fixed.dmm
@@ -7268,7 +7268,7 @@
 /obj/rack,
 /obj/item/clothing/under/color,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
@@ -10277,7 +10277,7 @@
 "avn" = (
 /obj/rack,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/glasses/sunglasses,
 /obj/machinery/light/small,
@@ -26853,7 +26853,7 @@
 /area/station/crew_quarters/kitchen)
 "bbQ" = (
 /obj/table,
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_y = 6
 	},
 /turf/simulated/floor/specialroom/cafeteria{
@@ -26863,7 +26863,7 @@
 "bbR" = (
 /obj/machinery/light,
 /obj/table,
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_y = 6
 	},
 /obj/machinery/camera{
diff --git a/maps/unused/construction_shuttle.dmm b/maps/unused/construction_shuttle.dmm
index 06bd2012d07d4..ab105be7a360b 100644
--- a/maps/unused/construction_shuttle.dmm
+++ b/maps/unused/construction_shuttle.dmm
@@ -76,7 +76,7 @@
 /area/shuttle/arrival/station)
 "am" = (
 /obj/rack,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/shuttlebay,
 /area/shuttle/arrival/station)
diff --git a/maps/unused/crash_gimmick.dmm b/maps/unused/crash_gimmick.dmm
index 2d37dfac628c7..4ce2a187c2bbc 100644
--- a/maps/unused/crash_gimmick.dmm
+++ b/maps/unused/crash_gimmick.dmm
@@ -35572,7 +35572,7 @@
 	icon_state = "bedsheet-hop"
 	},
 /obj/decal/cleanable/dirt,
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 /turf/space,
 /area/space)
 "dEP" = (
@@ -41918,8 +41918,8 @@
 /area/russian/radiation)
 "gQS" = (
 /obj/storage/closet/radiation,
-/obj/item/clothing/suit/rad,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /obj/item/clothing/head/rad_hood,
 /turf/simulated/floor/plating/random{
@@ -44286,7 +44286,7 @@
 /area/russian/radiation)
 "idR" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/disposalpipe/segment/brig{
 	dir = 8
 	},
@@ -55070,7 +55070,7 @@
 /area/russian/radiation)
 "ngI" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/disposalpipe/segment/morgue,
 /turf/space,
 /area/russian/radiation)
@@ -59794,7 +59794,7 @@
 	name = "dried vomit"
 	},
 /obj/table/wood/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/decal/cleanable/blood/splatter{
 	icon_state = "floor3"
 	},
diff --git a/maps/unused/crash_gimmick_2.dmm b/maps/unused/crash_gimmick_2.dmm
index 2f89471947402..1ca39937193c8 100644
--- a/maps/unused/crash_gimmick_2.dmm
+++ b/maps/unused/crash_gimmick_2.dmm
@@ -579,7 +579,7 @@
 /obj/item/fuel_pellet/cerenkite,
 /obj/item/fuel_pellet/cerenkite,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/machinery/light/small/floor/harsh/very,
 /turf/simulated/floor/shuttlebay,
 /area/shuttle/arrival/station)
diff --git a/maps/unused/density.dmm b/maps/unused/density.dmm
index cf6b0c07ac320..9839c67c7f847 100644
--- a/maps/unused/density.dmm
+++ b/maps/unused/density.dmm
@@ -1441,7 +1441,7 @@
 /area/station/crew_quarters/kitchen)
 "dI" = (
 /obj/table/wood/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/bar,
 /area/station/crew_quarters/kitchen)
 "dJ" = (
@@ -3216,7 +3216,7 @@
 /turf/simulated/wall/auto/reinforced/supernorn,
 /area/station/science/lab)
 "hR" = (
-/obj/machinery/ignition_switch{
+/obj/machinery/activation_button/ignition_switch{
 	id = "tox_ignition1";
 	pixel_x = -24;
 	pixel_y = -8
diff --git a/maps/unused/destiny.dmm b/maps/unused/destiny.dmm
index fecb918ecdfc7..77f5a46a22feb 100644
--- a/maps/unused/destiny.dmm
+++ b/maps/unused/destiny.dmm
@@ -2804,7 +2804,7 @@
 /area/station/maintenance/solar/west)
 "alX" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -4487,7 +4487,7 @@
 	icon_state = "2-8"
 	},
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -10384,7 +10384,7 @@
 /area/space)
 "aXr" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -12380,7 +12380,7 @@
 /area/station/crew_quarters/pool)
 "bng" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/cable{
 	icon_state = "1-2"
 	},
@@ -14199,8 +14199,8 @@
 /obj/item/extinguisher,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/clothing/head/helmet/welding,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/tank/air,
@@ -15525,7 +15525,7 @@
 /area/station/crew_quarters/catering)
 "bTv" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -15953,7 +15953,7 @@
 	pixel_y = 32
 	},
 /obj/storage/closet/fire,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/tank/air,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/welding,
@@ -17460,7 +17460,7 @@
 /area/station/crew_quarters/fitness)
 "cKx" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -21456,7 +21456,7 @@
 /area/station/ranch)
 "exV" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -28003,7 +28003,7 @@
 /area/station/science/lab)
 "hvs" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -36804,7 +36804,7 @@
 /area/station/crew_quarters/pool)
 "mdr" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -49276,7 +49276,7 @@
 /area/station/science/artifact)
 "sGr" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -56487,7 +56487,7 @@
 	icon_state = "0-2"
 	},
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/extinguisher,
@@ -59739,8 +59739,8 @@
 /area/station/quartermaster/cargobay)
 "xKr" = (
 /obj/storage/secure/closet/engineering/electrical,
-/obj/item/clothing/suit/rad,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /obj/item/clothing/head/rad_hood,
 /obj/item/clothing/glasses/toggleable/meson,
diff --git a/maps/unused/fleet.dmm b/maps/unused/fleet.dmm
index 3ad9ecc87037b..75b7e5ae8ddf2 100644
--- a/maps/unused/fleet.dmm
+++ b/maps/unused/fleet.dmm
@@ -179,7 +179,7 @@
 /area/space)
 "aB" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/decal/stripe_caution,
 /turf/simulated/floor/airless,
@@ -17837,8 +17837,8 @@
 	})
 "ND" = (
 /obj/table/reinforced/auto,
-/obj/item/clothing/suit/fire/heavy,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/head/helmet/welding,
 /obj/item/clothing/head/helmet/welding,
 /obj/machinery/power/apc/autoname_north,
@@ -18220,7 +18220,7 @@
 	})
 "Ol" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/phone/wall{
 	pixel_y = 32
 	},
@@ -23073,8 +23073,8 @@
 	})
 "YZ" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/cable{
diff --git a/maps/unused/horizon.dmm b/maps/unused/horizon.dmm
index f31bf4de6d4dd..7f831349619db 100644
--- a/maps/unused/horizon.dmm
+++ b/maps/unused/horizon.dmm
@@ -476,7 +476,7 @@
 	icon_state = "bedsheet-hop"
 	},
 /obj/decal/cleanable/dirt,
-/obj/item/reagent_containers/food/snacks/candy/wrapped_pbcup,
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/pb_cup,
 /turf/simulated/floor/carpet/green/fancy/edge/east,
 /area/station/crew_quarters/quarters_east)
 "abs" = (
@@ -4634,7 +4634,7 @@
 	name = "dried vomit"
 	},
 /obj/table/wood/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/decal/cleanable/blood/splatter{
 	icon_state = "floor3"
 	},
@@ -28707,7 +28707,7 @@
 /area/station/crew_quarters/kitchen)
 "bEu" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/disposalpipe/segment/brig{
 	dir = 8
 	},
@@ -35271,7 +35271,7 @@
 /area/station/crew_quarters/kitchen)
 "bXN" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/light,
 /obj/disposalpipe/segment/morgue,
 /turf/simulated/floor/white/checker{
diff --git a/maps/unused/manta.dmm b/maps/unused/manta.dmm
index 5b7479ce836de..5ded001dcf164 100644
--- a/maps/unused/manta.dmm
+++ b/maps/unused/manta.dmm
@@ -1333,7 +1333,7 @@
 /area/abandonedmedicalship/robot_trader)
 "aeB" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/decal/cleanable/cobweb,
 /turf/simulated/floor/grime,
 /area/diner/kitchen)
@@ -7595,7 +7595,7 @@
 /area/station/engine/storage)
 "awJ" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/tank/air,
 /obj/item/chem_grenade/firefighting,
@@ -7606,7 +7606,7 @@
 /area/station/engine/storage)
 "awK" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/tank/air,
 /obj/item/chem_grenade/firefighting,
@@ -7719,7 +7719,7 @@
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/tank/air,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /turf/simulated/floor,
 /area/station/engine/storage)
 "awW" = (
@@ -11020,7 +11020,7 @@
 /area/station/crew_quarters/cafeteria/the_rising_tide_bar)
 "aFY" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -16249,7 +16249,7 @@
 /area/station/security/beepsky)
 "aVe" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -18940,7 +18940,7 @@
 /area/station/crew_quarters/kitchen/therustykrab)
 "bcK" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen/therustykrab)
 "bcL" = (
@@ -29607,7 +29607,7 @@
 /area/station/maintenance/upperport)
 "bFK" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -29677,7 +29677,7 @@
 /area/station/maintenance/lowerport)
 "bFU" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -31699,7 +31699,7 @@
 	icon_state = "pipe-c"
 	},
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/machinery/firealarm{
 	dir = 8;
 	pixel_x = -24
@@ -37904,7 +37904,7 @@
 /area/station/chapel/office)
 "nRd" = (
 /obj/storage/closet/fire,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/tank/air,
 /obj/item/tank/air,
 /obj/item/clothing/mask/gas/emergency,
@@ -37913,7 +37913,7 @@
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/extinguisher,
 /obj/item/extinguisher,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/machinery/light/incandescent/netural{
 	dir = 8;
 	pixel_x = -10
diff --git a/maps/unused/mushroom_new_walls.dmm b/maps/unused/mushroom_new_walls.dmm
index 98674daba0a74..5b4f276d7ada7 100644
--- a/maps/unused/mushroom_new_walls.dmm
+++ b/maps/unused/mushroom_new_walls.dmm
@@ -2174,7 +2174,7 @@
 /area/station/engine/storage)
 "amm" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -2430,7 +2430,7 @@
 /area/station/engine/storage)
 "ang" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -8114,7 +8114,7 @@
 /obj/rack,
 /obj/item/clothing/under/color,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas,
 /turf/simulated/floor/plating,
 /area/station/maintenance/northwest)
@@ -10250,7 +10250,7 @@
 "bbS" = (
 /obj/rack,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/glasses/sunglasses,
 /turf/simulated/floor,
@@ -12760,7 +12760,7 @@
 /area/station/engine/storage)
 "bod" = (
 /obj/rack,
-/obj/item/clothing/suit/fire{
+/obj/item/clothing/suit/hazard/fire{
 	pixel_x = -7
 	},
 /obj/item/clothing/mask/gas/emergency{
@@ -30598,7 +30598,7 @@
 	desc = "A black countertop table for storing kitchen-y objects.";
 	name = "kitchen counter"
 	},
-/obj/submachine/mixer{
+/obj/machinery/mixer{
 	pixel_x = 8;
 	pixel_y = 4
 	},
diff --git a/maps/unused/oldmap.dmm b/maps/unused/oldmap.dmm
index d525fa2f1d312..2818b9092c3a9 100644
--- a/maps/unused/oldmap.dmm
+++ b/maps/unused/oldmap.dmm
@@ -1708,7 +1708,7 @@
 "eh" = (
 /obj/rack,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /turf/simulated/floor,
 /area/engine/engineering)
@@ -1892,7 +1892,7 @@
 "eE" = (
 /obj/rack,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/machinery/light/small{
 	tag = "icon-bulb1 (WEST)";
@@ -2030,7 +2030,7 @@
 "eV" = (
 /obj/rack,
 /obj/item/clothing/shoes/black,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /turf/simulated/floor,
 /area/engine/engineering)
 "eW" = (
diff --git a/maps/unused/ozymandias.dmm b/maps/unused/ozymandias.dmm
index f19b33a6b7e82..f7f50d4be0c24 100644
--- a/maps/unused/ozymandias.dmm
+++ b/maps/unused/ozymandias.dmm
@@ -9795,7 +9795,7 @@
 /area/station/crew_quarters/quartersA)
 "cIL" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -16981,7 +16981,7 @@
 /area/station/engine/hotloop)
 "ezC" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -21326,7 +21326,7 @@
 /area/shuttle/arrival/station)
 "fGK" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/machinery/firealarm{
 	pixel_y = 24
 	},
@@ -26757,7 +26757,7 @@
 /area/station/hallway/secondary/north)
 "han" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "haw" = (
@@ -34038,8 +34038,8 @@
 /area/station/crewquarters/garbagegarbs)
 "iXy" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
@@ -36351,7 +36351,7 @@
 /area/station/medical/medbay)
 "jCz" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -50985,7 +50985,7 @@
 /area/station/hangar/main)
 "nvI" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/extinguisher,
 /obj/item/chem_grenade/firefighting,
@@ -51727,7 +51727,7 @@
 /area/station/medical/medbay/lobby)
 "nFB" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -52062,7 +52062,7 @@
 /area/station/crew_quarters/courtroom)
 "nIH" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/decal/stripe_caution,
 /turf/simulated/floor/airless,
@@ -58276,8 +58276,8 @@
 /area/station/engine/elect)
 "pnj" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/machinery/light{
@@ -66975,7 +66975,7 @@
 /area/station/crew_quarters/market)
 "rAe" = (
 /obj/rack,
-/obj/item/clothing/suit/fire/heavy,
+/obj/item/clothing/suit/hazard/fire/heavy,
 /obj/item/clothing/head/helmet/welding,
 /turf/simulated/floor/yellow/side,
 /area/station/engine/power)
@@ -71491,8 +71491,8 @@
 /area/station/maintenance/solar/west)
 "sDX" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
@@ -76185,7 +76185,7 @@
 /area/station/engine/power)
 "tKE" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/storage/box/lightbox/tubes,
 /obj/item/storage/toolbox/emergency,
 /obj/item/clothing/mask/gas/emergency,
@@ -76193,7 +76193,7 @@
 /area/station/science/gen_storage)
 "tKG" = (
 /obj/storage/secure/closet/engineering/electrical,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /obj/cable{
 	icon_state = "4-8"
@@ -78916,7 +78916,7 @@
 /area/station/communications/centre)
 "uuC" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -84666,7 +84666,7 @@
 "vJl" = (
 /obj/machinery/manufacturer/general/grody{
 	free_resource_amt = 2;
-	
+
 	},
 /turf/simulated/floor/industrial,
 /area/station/hallway/secondary/construction{
@@ -87467,7 +87467,7 @@
 /area/station/crew_quarters/fitness)
 "wtw" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/firefighter,
 /obj/item/tank/air,
@@ -91014,7 +91014,7 @@
 /area/station/engine/engineering/ce)
 "xkx" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/item/device/radio/intercom/catering,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/quarters{
diff --git a/maps/unused/setpieces/AIBM_lunar.dmm b/maps/unused/setpieces/AIBM_lunar.dmm
index 03ed234ffe462..1ff58551aae58 100644
--- a/maps/unused/setpieces/AIBM_lunar.dmm
+++ b/maps/unused/setpieces/AIBM_lunar.dmm
@@ -7453,7 +7453,7 @@
 	tag = ""
 	},
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/sim/area1)
 "rl" = (
diff --git a/maps/unused/setpieces/SHARED_biodomeExpanded.dmm b/maps/unused/setpieces/SHARED_biodomeExpanded.dmm
index bfd0f0fcb20e0..cb21c704faf55 100644
--- a/maps/unused/setpieces/SHARED_biodomeExpanded.dmm
+++ b/maps/unused/setpieces/SHARED_biodomeExpanded.dmm
@@ -2118,7 +2118,7 @@
 /turf/unsimulated/floor/carpet/grime,
 /area/swampzone/interiors/outbuildings)
 "cBV" = (
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/table/auto,
 /turf/unsimulated/floor/green/side{
 	dir = 1
diff --git a/maps/unused/trunkmap.dmm b/maps/unused/trunkmap.dmm
index a67ebe730bb1d..fd46ecbb37e28 100644
--- a/maps/unused/trunkmap.dmm
+++ b/maps/unused/trunkmap.dmm
@@ -12599,7 +12599,7 @@
 /obj/rack{
 	dir = 1
 	},
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/emergency_oxygen,
 /obj/item/clothing/mask/gas,
 /obj/item/clothing/glasses/sunglasses,
@@ -22504,7 +22504,7 @@
 	icon_state = "0-8"
 	},
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/specialroom/cafeteria,
 /area/station/crew_quarters/kitchen)
 "bxd" = (
@@ -30315,7 +30315,7 @@
 /obj/rack{
 	dir = 1
 	},
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/tank/emergency_oxygen,
 /obj/item/clothing/mask/gas,
 /obj/item/clothing/glasses/toggleable/meson,
diff --git a/maps/utilities/devtest.dmm b/maps/utilities/devtest.dmm
index ff2803b6ddd01..059c01638194b 100644
--- a/maps/utilities/devtest.dmm
+++ b/maps/utilities/devtest.dmm
@@ -3816,6 +3816,7 @@
 /obj/railing/red{
 	dir = 8
 	},
+/obj/item/storage/box/popsicle_sticks,
 /turf/simulated/floor/orangeblack,
 /area/station/devzone)
 "Xk" = (
@@ -3978,7 +3979,7 @@
 /area/station/devzone)
 "Yr" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/white,
 /area/station/devzone)
 "Yt" = (
diff --git a/maps/wrestlemap.dmm b/maps/wrestlemap.dmm
index fbb136e230330..b7256c4f1112f 100644
--- a/maps/wrestlemap.dmm
+++ b/maps/wrestlemap.dmm
@@ -2284,7 +2284,7 @@
 /area/shuttle/arrival/station)
 "aYH" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -2621,7 +2621,7 @@
 /area/station/science/teleporter)
 "biY" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -3305,7 +3305,7 @@
 /obj/item/clothing/head/helmet/welding,
 /obj/item/clothing/shoes/magnetic,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/machinery/light/small{
 	dir = 4
 	},
@@ -7231,7 +7231,7 @@
 /area/station/hallway/primary/west)
 "dmw" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -8019,7 +8019,7 @@
 /area/station/medical/robotics)
 "dBX" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -13330,7 +13330,7 @@
 /area/station/hallway/secondary/entry)
 "fQB" = (
 /obj/table/wood/auto,
-/obj/item/pinpointer{
+/obj/item/pinpointer/disk{
 	pixel_y = 4
 	},
 /obj/item/paper/telecrystal_update,
@@ -14400,7 +14400,7 @@
 /area/station/janitor/supply)
 "gnw" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -14468,7 +14468,7 @@
 /area/station/maintenance/solar/north)
 "goF" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -15173,7 +15173,7 @@
 /obj/item/clothing/head/helmet/welding,
 /obj/item/clothing/shoes/magnetic,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/machinery/camera{
 	c_tag = "autotag";
 	name = "autoname - SS13";
@@ -16245,7 +16245,7 @@
 	})
 "hhh" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -21865,7 +21865,7 @@
 	pixel_x = 6;
 	pixel_y = 10
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/simulated/floor/white/checker2,
 /area/station/crew_quarters/kitchen)
 "jAR" = (
@@ -23897,7 +23897,7 @@
 /area/research_outpost/protest)
 "kwW" = (
 /obj/rack,
-/obj/item/clothing/suit/fire,
+/obj/item/clothing/suit/hazard/fire,
 /obj/item/clothing/mask/gas/emergency,
 /obj/item/clothing/head/helmet/hardhat,
 /obj/item/tank/air,
@@ -26280,7 +26280,7 @@
 /obj/item/clothing/head/helmet/welding,
 /obj/item/clothing/shoes/magnetic,
 /obj/item/clothing/head/rad_hood,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/machinery/light/small{
 	dir = 8
 	},
@@ -54580,7 +54580,7 @@
 /area/station/engine/monitoring)
 "xUM" = (
 /obj/table/auto,
-/obj/item/blueprint,
+/obj/item/paper/blueprint,
 /obj/item/pen/pencil,
 /turf/simulated/floor/plating,
 /area/station/maintenance/west)
diff --git a/maps/z2.dmm b/maps/z2.dmm
index 475424848557c..a6ec846c31780 100644
--- a/maps/z2.dmm
+++ b/maps/z2.dmm
@@ -4553,7 +4553,7 @@
 	brightness = 2;
 	dir = 4
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/unsimulated/floor/specialroom/freezer,
 /area/hospital)
 "ata" = (
@@ -24627,7 +24627,7 @@
 "bQg" = (
 /obj/table/auto,
 /obj/item/paper_bin{
-	amount = 100;
+	amount_left = 100;
 	desc = "not at all a paper bin. no sir.";
 	name = "do-it-yourself joint construction kit"
 	},
@@ -26505,7 +26505,7 @@
 	layer = 9.1;
 	pixel_y = 21
 	},
-/obj/machinery/phone,
+/obj/machinery/phone/unlisted,
 /turf/unsimulated/floor/carpet/red/fancy/edge/north,
 /area/syndicate_station/battlecruiser)
 "bXv" = (
@@ -28661,7 +28661,7 @@
 /area/crunch)
 "cgf" = (
 /obj/rack,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /turf/unsimulated/floor/caution/north{
 	dir = 8
@@ -28696,7 +28696,8 @@
 	dir = 4;
 	icon_state = "datasec";
 	name = "Commander's Announcement Computer";
-	req_access_txt = "76"
+	req_access_txt = "76";
+	theme = "syndicate"
 	},
 /turf/unsimulated/floor/carpet/red/fancy/edge/sw,
 /area/syndicate_station/battlecruiser)
@@ -34797,7 +34798,7 @@
 /obj/table/reinforced/auto{
 	layer = 2
 	},
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/unsimulated/floor/sanitary/white,
 /area/owlery/staffhall)
 "czR" = (
@@ -36596,7 +36597,7 @@
 /area/owlery/Owlmait)
 "cEX" = (
 /obj/item/gun/flamethrower/assembled/loaded,
-/obj/item/clothing/suit/fire/armored,
+/obj/item/clothing/suit/hazard/fire/armored,
 /obj/item/clothing/head/helmet/welding,
 /obj/storage/secure/crate/weapon/confiscated_items{
 	req_access_txt = "71"
@@ -43253,15 +43254,15 @@
 	name = "antique plate";
 	pixel_y = 10
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_x = 2;
 	pixel_y = 6
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_x = -2;
 	pixel_y = 5
 	},
-/obj/item/reagent_containers/food/snacks/candy/butterscotch{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/butterscotch{
 	pixel_y = 9
 	},
 /turf/unsimulated/floor/wood/two,
@@ -44867,7 +44868,7 @@
 /area/afterlife/bar/sanctuary)
 "daO" = (
 /obj/table/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/decal/cleanable/dirt,
 /turf/unsimulated/floor/grey,
 /area/afterlife/bar)
@@ -49453,18 +49454,18 @@
 /turf/unsimulated/floor/wood/two,
 /area/afterlife/bar)
 "dvZ" = (
-/obj/item/reagent_containers/food/snacks/candy/taffy/cherry{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/cherry{
 	pixel_x = 3
 	},
-/obj/item/reagent_containers/food/snacks/candy/taffy/blueraspberry{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/blueraspberry{
 	pixel_x = -12;
 	pixel_y = 10
 	},
-/obj/item/reagent_containers/food/snacks/candy/taffy/cherry{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/cherry{
 	pixel_x = 7;
 	pixel_y = -10
 	},
-/obj/item/reagent_containers/food/snacks/candy/taffy/blueraspberry{
+/obj/item/reagent_containers/food/snacks/candy/wrapped_candy/taffy/blueraspberry{
 	pixel_x = -7
 	},
 /obj/storage/crate/wooden,
@@ -52381,7 +52382,7 @@
 /area/centcom/lounge)
 "dHk" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /turf/unsimulated/floor/specialroom/medbay,
 /area/centcom/lounge)
 "dHl" = (
diff --git a/maps/z3.dmm b/maps/z3.dmm
index 154b9f03f8302..c6a2dc3b01d8b 100644
--- a/maps/z3.dmm
+++ b/maps/z3.dmm
@@ -10438,7 +10438,7 @@
 /area/space)
 "aVj" = (
 /obj/storage/crate,
-/obj/item/clothing/suit/rad,
+/obj/item/clothing/suit/hazard/rad,
 /obj/item/clothing/head/rad_hood,
 /obj/item/clothing/mask/gas/emergency,
 /turf/simulated/floor/grime,
@@ -18485,7 +18485,7 @@
 /area/timewarp/ship)
 "kKo" = (
 /obj/table/reinforced/auto,
-/obj/submachine/mixer,
+/obj/machinery/mixer,
 /obj/decal/cleanable/cobweb2,
 /obj/decal/cleanable/dirt,
 /turf/simulated/floor/grime,
diff --git a/rust_g.dll b/rust_g.dll
index 15af63738300e..015e3dc8ff92d 100644
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/sound/effects/faithbiblewhack.ogg b/sound/effects/faithbiblewhack.ogg
new file mode 100644
index 0000000000000..cecd763e73de8
Binary files /dev/null and b/sound/effects/faithbiblewhack.ogg differ
diff --git a/strings/admin_changelog.txt b/strings/admin_changelog.txt
index d56f703537e5a..81290df4e7630 100644
--- a/strings/admin_changelog.txt
+++ b/strings/admin_changelog.txt
@@ -1,3 +1,9 @@
+(t)tue feb 20 24
+(u)Azrun
+(*)IO/Lava Moon added to Find Planets and Terrainify
+(t)wed jan 24 24
+(u)LeahTheTech
+(*)The law rack corruption random event can now be configured with custom laws.
 (t)mon jan 08 24
 (u)LeahTheTech
 (*)Added a pixel offsets editor to the admin interact menu to make pixel shifting easier.
diff --git a/strings/changelog.txt b/strings/changelog.txt
index dc126962fda43..60ead7296c012 100644
--- a/strings/changelog.txt
+++ b/strings/changelog.txt
@@ -1,4 +1,296 @@
 
+(t)sun feb 25 24
+(u)tanker4390
+(*)Resprited THE MONSTER and MacGuffin burgers.
+(u)LeahTheTech
+(+)The appendicitis random event now only affects crew that have medical records. No more NT records indicating salvager organ health.
+(p)18022
+(e)⚖🧛|C-Balance, A-Gamemodes
+(*)Vampiric thralls no longer have zombie arms.
+(*)Vampiric thralls now rapidly lose blood and die if they stray too far from their vampire master.
+(+)Vampiric thrall passive blood drain halved.
+(u)GuvGuvington
+(p)17932
+(e)🎨📦|C-Sprites, A-Game-Objects
+(+)Updated the rubber hammer sprite.
+(u)Lord_Earthfire
+(p)17928
+(e)🆕📦|C-Feature, A-Game-Objects
+(+)Fishes within aquatic research pools have begun to fear explosions and actively jump out of their pool when exposed to them.
+(u)MeggalBozale
+(p)17922
+(e)💅📄🔬|C-QoL, A-UI, A-Science
+(*)Pump Control Computers now use TGUI, and can set the specific pressure of pumps they control. Give it a try!
+(t)sat feb 24 24
+(u)LeahTheTech
+(+)Space HVACs have had some internal mathy parts hit with a wrench and should have a bit more oomph now.
+(u)Cherman0
+(p)17872
+(e)🆕⚖🌠|C-Feature, C-Balance, A-Events
+(+)Using the singularity buster to destroy a singularity now causes a white hole to spawn.
+(t)fri feb 23 24
+(u)IPingu
+(p)17963
+(e)🔄📄🧛|C-Rework, A-UI, A-Gamemodes
+(+)Converts wizard spellbook interface to TGUI
+(t)thu feb 22 24
+(u)Tyrant
+(p)17977
+(e)🔎📦⚙💡|C-Code-Quality, A-Game-Objects, A-Internal, A-Station-Systems
+(+)Massive backend reshuffling of the airlock code has taken place. report any bugs with door bolting/opening/closing.
+(t)mon feb 19 24
+(u)LeahTheTech
+(+)Shrapnel created by reactor meltdowns is now a bit more destructive.
+(t)fri feb 16 24
+(u)LeahTheTech
+(+)Arcfiends can now *monsterscream too.
+(u)Cherman0
+(p)17853
+(e)🗺💅📦🎩|A-Mapping, C-QoL, A-Game-Objects, A-Clothing
+(+)The CE now spawns wearing their Aurora Belt MkII
+(u)Mr. Moriarty
+(p)17949
+(e)🎨📦⚗|C-Sprites, A-Game-Objects, A-Chemistry
+(+)Resprited phials, beakers, round flasks, conical flasks, large beakers, large flasks, the four types of bottles, bongs, and all of their respective fluid overlays.
+(t)thu feb 15 24
+(u)Sord
+(+)Most in rotation maps now have airlock cyclers on some interior airlocks (Security, engineering, research, etc) where applicable.
+(t)wed feb 14 24
+(u)Ikea
+(p)17577
+(e)⚖🤖|C-Balance, A-Silicons
+(*)Borg speed values have been changed all across the board. Treadless light borgs are the same speed. Light and heavy borgs with treads are now slower compared to before. Every other borg body type is faster, see pr for specific values.
+(u)Cheekybrdy
+(p)17902
+(e)🗺🎨|A-Mapping, C-Sprites
+(+)Benches in science now appear in a purple variant.
+(t)tue feb 13 24
+(u)Keiiro
+(p)17924
+(e)🆕📦|C-Feature, A-Game-Objects
+(+)Nanotrasen and Syndicate card colors are now available for selection with an Agent Card.
+(u)Wire
+(p)17816
+(e)🆕🚨|C-Feature, A-Admin
+(*)New backend system for external API communications. This impacts systems such as bans and cloud saves, as well as many other non-gameplay related things. This is a fairly significant change so please report any weird bugs you think may be related to the GitHub issue tracker.
+(t)mon feb 12 24
+(u)TDHooligan
+(p)17761
+(e)⚖💅🌱|C-Balance, C-QoL, A-Hydroponics
+(+)The RNG gods see botanys' plight. The top 3 genomes have, on average, dropped in value.
+(t)sun feb 11 24
+(u)LeahTheTech
+(+)The actionbar for opening and closing airlock wiring panels is now private (cannot be seen by other players).
+(u)Sord
+(+)You can now order a communications dish manudrive (and commaster disk) from cargo.
+(t)fri feb 09 24
+(u)LeahTheTech
+(+)The chemical request console now shows the request in the PDA notification.
+(p)17915
+(e)🆕⚖|C-Feature, C-Balance
+(*)Tiny items can now be hidden under floor tiles, mousetraps hidden like this will trigger when the tile is pried up again.
+(u)IPingu
+(p)17826
+(e)📄|A-UI
+(+)Converts HVAC interface to TGUI
+(u)MeggalBozale
+(p)17897
+(e)💅📄|C-QoL, A-UI
+(*)Tank Transfer Valves now use TGUI menus.
+(t)thu feb 08 24
+(u)Tyrant
+(p)17894
+(e)🗺⚖|A-Mapping, C-Balance
+(*)Oshan now needs at least 14 players online to be voted for
+(t)wed feb 07 24
+(u)SirNooben
+(p)17845
+(e)|
+(+)Makes it possible for the arithmetic comp's mode to be changed using an input coming from another comp.
+(u)Sord
+(+)Opening/closing the panel on an airlock now has a short action bar
+(u)LeahTheTech
+(+)Random characters will no longer receive broken looking partial hairstyles.
+(u)Saccha
+(p)17895
+(e)⚖📦|C-Balance, A-Game-Objects
+(+)The floor and wall designer has a range of three tiles.
+(t)tue feb 06 24
+(u)glowbold
+(p)17440
+(e)🆕⚖💡|C-Feature, C-Balance, A-Station-Systems
+(*)NanoTrasen has secured further discounts on station electrical equipment - details in minor notes.
+(+)Lights may burn out when turned on. Burned out lights may burst if left unfixed.
+(+)Over-use of light switches may cause a shock to users and/or their property. Re-secure the electrical contacts on light switches with a screwdriver.
+(t)mon feb 05 24
+(u)tarmunora
+(+)Increase blood absorption rate during IV-drip transfusions and dialysis
+(u)GuvGuvington
+(p)17867
+(e)🆕🎨📦🍝|C-Feature, C-Sprites, A-Game-Objects, A-Catering
+(+)New sprites and description for white wine bottles, aswell as a change to white wine reagent colours and a reagent description.
+(u)GuvGuvington
+(p)17865
+(e)🆕🎨📦|C-Feature, C-Sprites, A-Game-Objects
+(+)The Antique laser gun received some proper inhand sprites, both the model and functioning weapon.
+(u)Tyrant
+(p)17745
+(e)💅📦|C-QoL, A-Game-Objects
+(+)The Paint Cans crate is now called the Artistic Supplies crate, and comes with an artist's toolbox.
+(t)sun feb 04 24
+(u)LeahTheTech
+(+)Transparium now hides sechud and pro-doc icons.
+(+)Tumbling creepers can now be occasionally obtained from requisitions and botany white holes.
+(+)The floor and wall designer no longer has infinite range.
+(t)sat feb 03 24
+(u)mloccy
+(p)17765
+(e)📄🍝|A-UI, A-Catering
+(+)Kitchen Mixer now uses a TGUI interface
+(t)fri feb 02 24
+(u)LeahTheTech
+(p)17354
+(e)⚖|C-Balance
+(*)Captains can no longer spawn as antagonist roles.
+(u)LeahTheTech
+(p)17839
+(e)🆕🧛|C-Feature, A-Gamemodes
+(+)Members of the winning gang will now be displayed at round end.
+(u)Sord
+(p)17830
+(e)🗺|A-Mapping
+(*)Cogmap2's Medbay has been completely revamped
+(u)Sord
+(+)The Crematorium now takes longer operate and can be escaped up to a certain point.
+(u)Tyrant
+(p)17841
+(e)🪲🗺|C-Bug, A-Mapping
+(+)Clarion's central maintenance APC has been moved to actually be in central maintenance (and is no longer confusingly called armoury APC)
+(u)Tyrant
+(p)17828
+(e)🆕🗺💅|C-Feature, A-Mapping, C-QoL
+(+)Some airlocks are now linked in a way that opening one door tries to close the other doors. "Keep the Air Inside!" ~John Nanotrasen probably.
+(u)Chatauscours
+(p)17682
+(e)🗺💅|A-Mapping, C-QoL
+(+)The Donut 2 Auxilary storage has been repurposed for a construction area.
+(t)wed jan 31 24
+(u)NibChocolateeny
+(p)17817
+(e)🆕🌱|C-Feature, A-Hydroponics
+(*)Glowing Slurry has been added as a seed infusion. Greatly randomizes stats, has a high chance of mutating a plant, and a moderate chance of adding the Unstable gene.
+(u)MeggalBozale
+(p)17809
+(e)💅🔄💨🔬|C-QoL, C-Rework, A-Atmospherics, A-Science
+(*)Tanks will now explode in a more predictable manner. For an in-depth explanation, see the PR.
+(u)NibChocolateeny
+(p)17812
+(e)💅💊|C-QoL, A-Medical
+(+)You no longer have to do surgery to determine - by visual observation - if someone lacks a butt.
+(u)MeggalBozale
+(p)17821
+(e)🪲🗺📦🍝|C-Bug, A-Mapping, A-Game-Objects, A-Catering
+(+)An absurd amount of pickle jars no longer spawn on Cog1,
+(u)LeahTheTech
+(+)Breaching charges now break firedoors.
+(+)Water coolers can now be broken by shooting them with bullets.
+(t)tue jan 30 24
+(u)MarkNstein
+(p)16899
+(e)🆕🗺|C-Feature, A-Mapping
+(*)Nadir: Added a PTL located at the South East hull connected to the turbine and southern catalytic engines.
+(u)Valtsu0
+(p)17764
+(e)🗺📄|A-Mapping, A-UI
+(+)Announcement computers now use tgui
+(t)mon jan 29 24
+(u)Flappybat
+(p)17563
+(e)🎨⚖🔄⏰|C-Sprites, C-Balance, C-Rework, A-Status-Effects
+(*)Wizard polymorph now changes you into an animal for eight minutes. When the spell expires your original human form and status will be restored. Status icon by CalliopeSoups.
+(u)CalliopeSoups
+(p)17658
+(e)🗺💅|A-Mapping, C-QoL
+(+)Cogmap1 catering has been neatened up and widened a little.
+(u)Lyy, Beshemoth
+(p)17553
+(e)🆕🗺🎨🔎🍝|C-Feature, A-Mapping, C-Sprites, C-Code-Quality, A-Catering
+(*)Added melted sugar cooking recipes, including rock candy, hard candy, craftable lollipops, swirly lollipops, and dragon's beard candy!
+(u)LeahTheTech
+(*)Popsicle sticks can now be made by whittling a wooden plank with a knife.
+(t)sun jan 28 24
+(u)Tyrant
+(p)17800
+(e)💅📦🌱|C-QoL, A-Game-Objects, A-Hydroponics
+(+)Knitting supply boxes can now be found within ranching secure lockers and inside a wool production kit, in case you lose yours.
+(t)sat jan 27 24
+(u)NibChocolateeny
+(p)17772
+(e)⚖💅🌱|C-Balance, C-QoL, A-Hydroponics
+(+)The radiation immunity plant gene now reduces seed damage taken from certain radioactive infusions.
+(u)LeahTheTech
+(*)Heads of staff can no longer be gang members (again)
+(t)wed jan 24 24
+(u)Valtsu0
+(p)17338
+(e)🆕🧱|C-Feature, A-Materials
+(+)Robot parts can now be reclaimed.
+(t)mon jan 22 24
+(u)LeahTheTech
+(p)17746
+(e)🆕🎨🤖|C-Feature, C-Sprites, A-Silicons
+(*)Cyborg screen heads can now be smashed by explosions and blunt instruments, repaired with glass sheets.
+(u)cringe
+(p)17475
+(e)🆕🎨💨|C-Feature, C-Sprites, A-Atmospherics
+(*)Vents, pumps, and injectors can now be controlled through packets! Send them a command with the help value with a packet sniffer to see what they can do. Have fun!
+(u)Chasu
+(p)17747
+(e)🆕💅🍝|C-Feature, C-QoL, A-Catering
+(+)Pizzas can now be cut with snipping tools. Knifeless rejoice!
+(t)sun jan 21 24
+(u)aloe
+(*)Being thrown as a human no longer stuns you for 1 second. Subject to reversion if it messes anything up too bad.
+(+)Throwing someone at a table while adjacent to the table tableslams them (like if you'd clicked the table, basically).
+(u)tarmunora
+(+)EMPs now wipe floppydisks
+(t)sat jan 20 24
+(u)Löpz
+(p)17697
+(e)🎨|C-Sprites
+(+)Gave the ThinkTape and master ThinkTape new looks
+(t)fri jan 19 24
+(u)Ikea
+(p)17618
+(e)🎨⚖🔄🤖|C-Sprites, C-Balance, C-Rework, A-Silicons
+(*)The previous behavior for oil in regards to borgs has been split into two status effects, freshly oiled and oiled. These apply speed increase and power consumption decrease in varying amounts, alongside stun resistance.
+(t)thu jan 18 24
+(u)NibChocolateeny
+(p)17694
+(e)⚖💅⚗🌱|C-Balance, C-QoL, A-Chemistry, A-Hydroponics
+(+)LSD is now synthesized at 70 °C (343.15 K). Botanists rejoice!
+(t)wed jan 17 24
+(u)LeahTheTech
+(p)17691
+(e)🆕⚖🤖|C-Feature, C-Balance, A-Silicons
+(+)Robotic arms can now be emagged.
+(u)Lyy
+(p)17686
+(e)🆕📦|C-Feature, A-Game-Objects
+(+)Pizza boxes can now be rigged with mousetraps or landmines.
+(u)Valtsu0
+(p)17597
+(e)🆕🔊📦|C-Feature, C-Sound, A-Game-Objects
+(*)Chaplains will now gather faith from people in the chapel. Atheist chaplains may have a harder time with this... Faith will increase the healing done by the bible
+(u)LeahTheTech
+(p)17692
+(e)⚖💨|C-Balance, A-Atmospherics
+(*)Tank explosions now scale with the volume of the tank, smaller tank = less boom :(
+(t)tue jan 16 24
+(u)Cheekybrdy
+(p)17674
+(e)🗺|A-Mapping
+(+)Moved the QM locker to a new room inside cargo from refinery on Cogmap1.
 (t)mon jan 15 24
 (u)Mordent
 (p)17606
diff --git a/strings/chemistry_tools.txt b/strings/chemistry_tools.txt
index d7f698374f2db..cb66a51a9ca9f 100644
--- a/strings/chemistry_tools.txt
+++ b/strings/chemistry_tools.txt
@@ -11,5 +11,5 @@ BOOZE_flavors@=aranesp@,vanilla@,rum@,vodka@,anti_fart@,atropine@,ephedrine@,sug
 COLA_prefixes@=Dr@,Mountain@,Pete's Potable@,Mister@,Bebop@,Mingus@,Syndie@,Wizard@,Changeling@,Vampire@,NanoTrasen@,Iron@,Red@,Orange@,Yellow@,Green@,Blue@,Purple@,Pink@,Special@,Sour@,Toxic@,Fizzy@,Smooth@,Robust@,Diet@,Pubbie@,Clown@,Strange@,Hyper@,Cream@,Ginger@,Dandelion@,Orange@,Grape@,Citrus@,Fruit Punch@,Berry@,Mango@,Melon@,Hemlock@,Licorice@,Strawberry@,Raspberry@,Blueberry@,Pumkpin Spice@,Marshmallow@,Mint@,Taurine@,Ginsing@,Lemon-Lime@,Green Apple@,Blue Raspberry@,Carrot@,Royal Jelly@,Passion Fruit@,Prickly Pear@,Durian@,Star Fruit@,Kiwi@,Beetroot@,Egg@,Eggplant@,Green Tea@,Birthday Cake@,Brine@,Root@,Protein@,Gamma@,Mystery@,Gamer@,Gaming@,Party@,Werewolf@,Hot@,
 COLA_suffixes@=Poo@,Water@,Sweat@,Ale@,Iced Tea@,Potion@,Poison@,Brew@,Soda@,Cola@,Pop@,Drink@,Tears@,Neo@,Zero@,and Burdock@,Punch@,Bomb@,Beverage@,Refreshment@,Tears@,Blast@,Essence@,Shake@,Twist@,Tonic@,Slush@,Explosion@,Singularity@,Quasar@,Supernova@,Draft@,Juice@,Smoothie@,Lemon@,Gold@,Cream@,Xtra@,Energy@,Good@,Shandy@,Milk@,Werewolf
 COLA_flavors@=sweet_tea@,tonic@,pubbie tears@,bee@,bacon_grease@,chocolate_milk@,strawberry_milk@,espresso@,energydrink@,tea@,honey_tea@,mint_tea@,ginger_ale@,chocolate@,honey@,vanilla@,cornsyrup@,mugwort@,mint@,juice_lime@,juice_cran@,juice_orange@,juice_lemon@,juice_tomato@,juice_strawberry@,juice_cherry@,juice_pineapple@,juice_apple@,juice_peach@,juice_pickle@,cocktail_citrus@,limeade@,lemonade@,coconut_milk@,cold_medicine@,menthol
-WEED_prefixes@=gorilla@,phat@,panda@,island@,afghani@,nepalese@,jamaican@,ambrosia@,amnesia@,apple@,lifted@,ice cream@,chocolate@,cake@,gelato@,banana@,cookie@,biscotti@,pancake@,magic@,truffle@,black@,white@,blue@,purple@,yellow@,orange@,green@,dream@,guava@,mango@,spice@,waffle@,blueberry@,strawberry@,donut@,piss@,fuego@,clout@,spankin@,dank@,dank@,divine@,spiritual@,metamorphic@,symbiotic@,biological@,metaphysical@,legendary@,sour@,sweet@,micro@,mini@,mega@,maximum@,mind-altering@,lung-slaughtering@,jealous@,golden@,silver@,grape@,greasy@,slimy@,icky@,sticky@,goopy@,skittles@,honey@,savage@,demonic@,angelic@,heavenly@,hellish@,evil@,good-good@,unstoppable@,illegal@,insane@,deranged@,mentally ill@,finest@,ass@,wine@,booze@,liquor@,champagne@,moonshine@,federal@,under active investigation by the galactic commission@,legacy@,organic@,popcorn@,brain damage@,organ failure@,blunt force trauma@,trainwreck@,car crash@,automobile accident@,criminal activity@,luxury@,miracle@,indecisive@,hungry@,stoner@,oreo@,papaya@,plaid@,permanent@,untouchable@,inescapable@,platinum@,dirt@,spiked@,star@,moon@,sun@,solar@,celestial@,royal@,ultrafast@,ultralight@,disco@,pure@,bomb@,explosive@,glue@,throat-gripping@,cranking@,venom@,poisonous@,deadly@,wet@,bubbly@,XXX@,banger@,baller@,top-notch@,freaky@,wack@,wacky@,clown-ass@,clown@,captain's private reserve@,sexy@,top-notch@,vibrant@,highly-saturated@,greyscale@,hallucinogenic@,grampa's@,compressed@,pixellated@,flaming@,+2@,illuminating@,visionary@,wholesome@,huggable@,violent@,ultraviolent@,butt@,adorable@,meta@,imbalanced@,atomized@,nefarious@,questionable@,aesthetic@,bisexual@,dragon
+WEED_prefixes@=gorilla@,phat@,panda@,island@,afghani@,nepalese@,jamaican@,ambrosia@,amnesia@,apple@,lifted@,ice cream@,chocolate@,cake@,gelato@,banana@,cookie@,biscotti@,pancake@,magic@,truffle@,black@,white@,blue@,purple@,yellow@,orange@,green@,dream@,guava@,mango@,spice@,waffle@,blueberry@,strawberry@,donut@,piss@,fuego@,clout@,spankin@,dank@,dank@,divine@,spiritual@,metamorphic@,symbiotic@,biological@,metaphysical@,legendary@,sour@,sweet@,micro@,mini@,mega@,maximum@,mind-altering@,lung-slaughtering@,jealous@,golden@,silver@,grape@,greasy@,slimy@,icky@,sticky@,goopy@,skittles@,honey@,savage@,demonic@,angelic@,heavenly@,hellish@,evil@,good-good@,unstoppable@,illegal@,insane@,deranged@,mentally ill@,finest@,ass@,wine@,booze@,liquor@,champagne@,moonshine@,federal@,under active investigation by the galactic commission@,legacy@,organic@,popcorn@,brain damage@,organ failure@,blunt force trauma@,trainwreck@,car crash@,automobile accident@,criminal activity@,luxury@,miracle@,indecisive@,hungry@,stoner@,oreo@,papaya@,plaid@,permanent@,untouchable@,inescapable@,platinum@,dirt@,spiked@,star@,moon@,sun@,solar@,celestial@,royal@,ultrafast@,ultralight@,disco@,pure@,bomb@,explosive@,glue@,throat-gripping@,cranking@,venom@,poisonous@,deadly@,wet@,bubbly@,XXX@,banger@,baller@,top-notch@,freaky@,wack@,wacky@,clown-ass@,clown@,captain's private reserve@,top-notch@,vibrant@,highly-saturated@,greyscale@,hallucinogenic@,grampa's@,compressed@,pixellated@,flaming@,+2@,illuminating@,visionary@,wholesome@,huggable@,violent@,ultraviolent@,butt@,adorable@,meta@,imbalanced@,atomized@,nefarious@,questionable@,aesthetic@,bisexual@,dragon
 WEED_suffixes@=loud@,mid@,kush@,pack@,dank@,weed@,marijuana@,mary jane@,green@,pot@,bud@,ganja@,herb@,chronic@,hash@,reefer@,grass@,dope
\ No newline at end of file
diff --git a/strings/roundstart_hints.txt b/strings/roundstart_hints.txt
index ce44b189c8754..08f36bd0849b1 100644
--- a/strings/roundstart_hints.txt
+++ b/strings/roundstart_hints.txt
@@ -159,4 +159,5 @@ The Head of Security's boots have a distinctive footstep noise. Keep your ears s
 Most weapons will cause blood spatter on the victim and the assailant. A blood-covered person sprinting down the hall will attract interest. Showering will remove all the blood from you and your clothes.
 Click yourself with help intent if you're cold; you'll shake yourself to warm up and partially undo the slowdowns from it. Clothing and some chemicals can also help keep you warm.
 Different items do different types of damage in different amounts, both to your health and your stamina. A weapon that does low physical damage may do high stamina damage, which can keep a person locked in "stam crit", preventing them from fighting back.
-The cloning console displays a red flashing icon when someone can be cloned.
\ No newline at end of file
+The cloning console displays a red flashing icon when someone can be cloned.
+Shuttle votes aren't in the rules, if you have access and the station's in bad shape you can call the shuttle!
\ No newline at end of file
diff --git a/tgui/packages/tgui/components/goonstation/ListGrid/Cell.tsx b/tgui/packages/tgui/components/goonstation/ListGrid/Cell.tsx
new file mode 100644
index 0000000000000..3057e3ba059f5
--- /dev/null
+++ b/tgui/packages/tgui/components/goonstation/ListGrid/Cell.tsx
@@ -0,0 +1,31 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import { Box, Stack, Tooltip } from '../../';
+import { ColumnConfig, isValuedColumnConfig, RowId } from './type';
+
+interface CellProps<T extends object, V> {
+  columnConfig: ColumnConfig<T, V>;
+  data: T;
+  rowId: RowId;
+}
+
+export const Cell = <T extends object, V>(props: CellProps<T, V>) => {
+  const { columnConfig: config, data, rowId } = props;
+  const { basis, getValueTooltip, grow, renderContents } = config;
+  const hasValue = isValuedColumnConfig(config);
+  const value = hasValue ? config.getValue(data) : undefined;
+  const tooltipText = getValueTooltip?.(data);
+  const contents = renderContents ? renderContents({ data, rowId, value }) : <Box>{value}</Box>;
+  const cellContents = tooltipText ? <Tooltip content={tooltipText}>{contents}</Tooltip> : contents;
+  return (
+    <Stack.Item basis={basis} grow={grow}>
+      {cellContents}
+    </Stack.Item>
+  );
+};
diff --git a/tgui/packages/tgui/components/goonstation/ListGrid/HeaderCell.tsx b/tgui/packages/tgui/components/goonstation/ListGrid/HeaderCell.tsx
new file mode 100644
index 0000000000000..f20544038ae56
--- /dev/null
+++ b/tgui/packages/tgui/components/goonstation/ListGrid/HeaderCell.tsx
@@ -0,0 +1,16 @@
+import { Stack } from '../../Stack';
+import type { ColumnConfig } from './type';
+
+export interface HeaderCellProps<T extends object, V> {
+  config: ColumnConfig<T, V>;
+}
+
+export const HeaderCell = <T extends object, V>(props: HeaderCellProps<T, V>) => {
+  const { config } = props;
+  const { basis, grow, header } = config;
+  return (
+    <Stack.Item basis={basis} grow={grow} bold>
+      {header}
+    </Stack.Item>
+  );
+};
diff --git a/tgui/packages/tgui/components/goonstation/ListGrid/index.ts b/tgui/packages/tgui/components/goonstation/ListGrid/index.ts
new file mode 100644
index 0000000000000..2c67cf4c1bf9f
--- /dev/null
+++ b/tgui/packages/tgui/components/goonstation/ListGrid/index.ts
@@ -0,0 +1,3 @@
+export { Cell } from './Cell';
+export { HeaderCell } from './HeaderCell';
+export type { ColumnConfig } from './type';
diff --git a/tgui/packages/tgui/components/goonstation/ListGrid/type.ts b/tgui/packages/tgui/components/goonstation/ListGrid/type.ts
new file mode 100644
index 0000000000000..a772a3ab71af1
--- /dev/null
+++ b/tgui/packages/tgui/components/goonstation/ListGrid/type.ts
@@ -0,0 +1,31 @@
+import type { InfernoNode } from 'inferno';
+
+export type RowId = string;
+
+interface ValuedColumnConfig<T extends object, V> {
+  getValue: (data: T) => V;
+  renderContents?: (options: { data: T; rowId: RowId; value: V }) => InfernoNode;
+}
+type ValuelessColumnConfig<T extends object> = {
+  renderContents: (options: { data: T; rowId: RowId }) => InfernoNode;
+};
+type ValueColumnConfig<T extends object, V> = ValuedColumnConfig<T, V> | ValuelessColumnConfig<T>;
+
+export const isValuedColumnConfig = <T extends object, V>(
+  config: ValueColumnConfig<T, V>
+): config is ValuedColumnConfig<T, V> => 'getValue' in config;
+
+interface CoreColumnConfig<T extends object> {
+  id: string;
+  getValueTooltip?: (data: T) => InfernoNode;
+  header: string;
+}
+
+interface LayoutColumnConfig {
+  basis?: number;
+  grow?: number | boolean;
+}
+
+export type ColumnConfig<T extends object, V = unknown> = CoreColumnConfig<T> &
+  ValueColumnConfig<T, V> &
+  LayoutColumnConfig;
diff --git a/tgui/packages/tgui/interfaces/AnnouncementComputer/automatic.tsx b/tgui/packages/tgui/interfaces/AnnouncementComputer/automatic.tsx
new file mode 100644
index 0000000000000..68b6e6743df04
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AnnouncementComputer/automatic.tsx
@@ -0,0 +1,37 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Valtsu0 (https://github.com/Valtsu0)
+ * @license ISC
+ */
+
+import { useBackend } from '../../backend';
+import { Input, Section, Stack } from '../../components';
+import { AnnouncementCompData } from './type';
+
+export interface AutomaticAnnouncementData {
+  arrivalalert: string;
+}
+
+export const AutomaticAnnouncement = (_props, context) => {
+  const { act, data } = useBackend<AnnouncementCompData>(context);
+  const { arrivalalert } = data;
+
+  return (
+    <Section title="Arrival Announcement Message">
+      <Stack vertical>
+        <Stack.Item>
+          Valid tokens: $NAME, $JOB, $STATION, $THEY, $THEM, $THEIR. Leave the field empty for no message.
+        </Stack.Item>
+        <Stack.Item>
+          <Input
+            fluid
+            onChange={(e, value) => act('arrival_message', { value })}
+            placeholder="Type something..."
+            value={arrivalalert}
+          />
+        </Stack.Item>
+      </Stack>
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/AnnouncementComputer/index.tsx b/tgui/packages/tgui/interfaces/AnnouncementComputer/index.tsx
new file mode 100644
index 0000000000000..3df0c60a8b5b6
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AnnouncementComputer/index.tsx
@@ -0,0 +1,28 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Valtsu0 (https://github.com/Valtsu0)
+ * @license ISC
+ */
+
+import { useBackend } from '../../backend';
+import { Window } from '../../layouts';
+import { AutomaticAnnouncement } from './automatic';
+import { ManualAnnouncement } from './manual';
+import { AnnouncementCompData } from './type';
+
+export const AnnouncementComputer = (_props, context) => {
+  const { act, data } = useBackend<AnnouncementCompData>(context);
+  const { announces_arrivals, theme } = data;
+
+  return (
+    <Window theme={theme} width={400} height={announces_arrivals ? 326 : 215}>
+      <Window.Content textAlign="center">
+        <ManualAnnouncement />
+        {!!announces_arrivals && (
+          <AutomaticAnnouncement />
+        )}
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/AnnouncementComputer/manual.tsx b/tgui/packages/tgui/interfaces/AnnouncementComputer/manual.tsx
new file mode 100644
index 0000000000000..072a3ba61c3d7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AnnouncementComputer/manual.tsx
@@ -0,0 +1,102 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Valtsu0 (https://github.com/Valtsu0)
+ * @license ISC
+ */
+
+import { useBackend, useSharedState } from '../../backend';
+import { AnimatedNumber, Button, Input, Section, Stack } from '../../components';
+import { formatTime } from '../../format';
+import { AnnouncementCompData } from './type';
+
+type Status = {
+  canTransmit: boolean;
+  text: string;
+  color: string;
+};
+
+export const ManualAnnouncement = (_props, context) => {
+  const { act, data } = useBackend<AnnouncementCompData>(context);
+  const { card_name, status_message, time, max_length } = data;
+
+  const [input, setInput] = useSharedState(context, "input", "");
+  const [oldInput, setOldInput] = useSharedState(context, "oldInput", "");
+
+  let status : Status = getStatus(input, max_length, status_message, time);
+
+  const onChange = () => {
+    if (input === oldInput) {
+      return;
+    }
+    act('log', { value: input, old: oldInput });
+    setOldInput(input);
+  };
+
+  const onTransmit = () => {
+    act('transmit', { value: input });
+    setInput("");
+    setOldInput("");
+  };
+
+  const onType = (event) => {
+    event.preventDefault();
+    const target = event.target;
+    setInput(target.value);
+    status = getStatus(input, max_length, status_message, time);
+  };
+
+  return (
+    <Section title="Make an Announcement">
+      <Stack vertical>
+        <Stack.Item color={status["color"]}>
+          Status: {status["text"]}
+        </Stack.Item>
+        <Stack.Item>
+          <Button
+            onClick={() => act("id")}
+            icon="eject"
+            preserveWhitespace>
+            {card_name || "Insert card"}
+          </Button>
+        </Stack.Item>
+        <Stack.Item>
+          <AnimatedNumber value={time} format={formatTime} />
+        </Stack.Item>
+        <Stack.Item>
+          <Input
+            autoFocus
+            fluid
+            onInput={(e) => onType(e)}
+            onChange={() => onChange()}
+            placeholder="Type something..."
+            value={input}
+          />
+        </Stack.Item>
+        <Stack.Item label="Button" fontSize="16px">
+          <Button
+            icon="bullhorn"
+            content="Transmit"
+            fluid
+            disabled={!status["canTransmit"]}
+            onClick={() => onTransmit()} />
+        </Stack.Item>
+      </Stack>
+    </Section>
+  );
+};
+
+const getStatus = (input, max_length, status, time) => {
+  if (time > 0) {
+    return { canTransmit: false, text: "Broadcast delay in effect.", color: "bad" };
+  } else if (status === "Insert Card") {
+    return { canTransmit: false, text: "Insert Card", color: "average" };
+  } else if (status) {
+    return { canTransmit: false, text: status, color: "bad" };
+  } else if (!!max_length && input.length > max_length) {
+    return { canTransmit: false, text: `Message too long, maximium is ${max_length} characters.`, color: "average" };
+  } else if (!input) {
+    return { canTransmit: false, text: "Input message.", color: "average" };
+  }
+  return { canTransmit: true, text: "Ready to transmit!", color: "good" };
+};
diff --git a/tgui/packages/tgui/interfaces/AnnouncementComputer/type.tsx b/tgui/packages/tgui/interfaces/AnnouncementComputer/type.tsx
new file mode 100644
index 0000000000000..a64f5b208a0b9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AnnouncementComputer/type.tsx
@@ -0,0 +1,16 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Valtsu0 (https://github.com/Valtsu0)
+ * @license ISC
+ */
+
+export interface AnnouncementCompData {
+  announces_arrivals: boolean;
+  arrivalalert: string;
+  theme: string;
+  card_name: string;
+  status_message: string;
+  time: number;
+  max_length: number;
+}
diff --git a/tgui/packages/tgui/interfaces/BanPanel/BanList/BanList.tsx b/tgui/packages/tgui/interfaces/BanPanel/BanList/BanList.tsx
new file mode 100644
index 0000000000000..58c83817a6458
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/BanList/BanList.tsx
@@ -0,0 +1,104 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import { useLocalState } from '../../../backend';
+import { Button, Dropdown, Flex, Input, NumberInput, Section, Stack } from '../../../components';
+import { HeaderCell } from '../../../components/goonstation/ListGrid';
+import { useBanPanelBackend } from '../useBanPanelBackend';
+import type { BanListTabData } from '../type';
+import { BanPanelSearchFilter } from '../type';
+import { BanListItem } from './BanListItem';
+import { buildColumnConfigs } from './columnConfig';
+import type { BanResource } from '../apiType';
+
+interface BanListProps {
+  data: BanListTabData;
+}
+
+const DEFAULT_PAGE_SIZE = 30;
+const filterOptions = Object.keys(BanPanelSearchFilter);
+const getRowId = (data: BanResource) => `${data.id}`;
+
+export const BanList = (props: BanListProps, context) => {
+  const { data } = props;
+  const { ban_list, per_page } = data;
+  const { action } = useBanPanelBackend(context);
+  const { search_response } = ban_list ?? {};
+  const { data: banResources } = search_response ?? {};
+  const [searchText, setSearchText] = useLocalState(context, 'searchText', '');
+  const [searchFilter, setSearchFilter] = useLocalState(context, 'searchFilter', BanPanelSearchFilter.ckey);
+  const handleSearch = () => action.searchBans(searchText, BanPanelSearchFilter[searchFilter]);
+  const handleSearchTextChange = (_e, value: string) => setSearchText(value);
+  const handlePreviousPage = action.navigatePreviousPage;
+  const handleNextPage = action.navigateNextPage;
+  const handlePerPageChange = (_e, value: number) => action.setPerPage(value);
+  const handleEditBan = (id: number) => action.editBan(id);
+  const handleDeleteBan = (id: number) => action.deleteBan(id);
+  const columnConfigs = buildColumnConfigs({
+    editBan: handleEditBan,
+    deleteBan: handleDeleteBan,
+  });
+  return (
+    <>
+      <Stack.Item>
+        <Flex pt={1}>
+          <Flex.Item direction="column" mx={1} wrap="wrap">
+            <Input value={searchText} onInput={handleSearchTextChange} mr={1} />
+            <Button icon="magnifying-glass" onClick={handleSearch}>
+              Search
+            </Button>
+          </Flex.Item>
+          <Flex.Item grow>
+            <Dropdown
+              width={11}
+              icon="filter"
+              nochevron
+              selected={searchFilter}
+              options={filterOptions}
+              onSelected={(value: BanPanelSearchFilter) => {
+                setSearchFilter(value);
+              }}
+            />
+          </Flex.Item>
+        </Flex>
+      </Stack.Item>
+      <Stack.Item>
+        <Section>
+          <Stack>
+            {columnConfigs.map((columnConfig) => (
+              <HeaderCell key={columnConfig.id} config={columnConfig} />
+            ))}
+          </Stack>
+        </Section>
+      </Stack.Item>
+      <Stack.Item grow>
+        <Section fill scrollable>
+          <Stack vertical zebra mb={1}>
+            {(banResources ?? []).map((banData) => (
+              <BanListItem key={banData.id} columnConfigs={columnConfigs} data={banData} rowId={getRowId(banData)} />
+            ))}
+          </Stack>
+        </Section>
+      </Stack.Item>
+      <Stack.Item>
+        <Section>
+          <Button onClick={handlePreviousPage}>Prev</Button>
+          <Button onClick={handleNextPage}>Next</Button>
+          {/* TODO: Page selector should float right */}
+          <NumberInput
+            minValue={5}
+            maxValue={100}
+            value={per_page ?? DEFAULT_PAGE_SIZE}
+            placeholder={DEFAULT_PAGE_SIZE}
+            onChange={handlePerPageChange}
+          />
+        </Section>
+      </Stack.Item>
+    </>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/BanPanel/BanList/BanListItem.tsx b/tgui/packages/tgui/interfaces/BanPanel/BanList/BanListItem.tsx
new file mode 100644
index 0000000000000..bb567cc1faf94
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/BanList/BanListItem.tsx
@@ -0,0 +1,29 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Stack } from '../../../components';
+import { BanResource } from '../apiType';
+import { Cell, ColumnConfig } from '../../../components/goonstation/ListGrid';
+
+interface BanListItemProps {
+  columnConfigs: ColumnConfig<BanResource>[];
+  data: BanResource;
+  rowId: string;
+}
+
+export const BanListItem = (props: BanListItemProps) => {
+  const { columnConfigs, data, rowId } = props;
+  return (
+    <Stack.Item>
+      <Stack>
+        {columnConfigs.map((columnConfig) => (
+          <Cell key={columnConfig.id} columnConfig={columnConfig} data={data} rowId={rowId} />
+        ))}
+      </Stack>
+    </Stack.Item>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/BanPanel/BanList/columnConfig.tsx b/tgui/packages/tgui/interfaces/BanPanel/BanList/columnConfig.tsx
new file mode 100644
index 0000000000000..fafa05673f672
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/BanList/columnConfig.tsx
@@ -0,0 +1,136 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import { Button } from '../../../components';
+import type { ColumnConfig } from '../../../components/goonstation/ListGrid';
+import type { BanResource } from '../apiType';
+import dayjs from 'dayjs';
+import duration from 'dayjs/plugin/duration';
+import relativeTime from 'dayjs/plugin/relativeTime';
+
+dayjs.extend(duration);
+dayjs.extend(relativeTime);
+
+interface ColumnConfigsCallbacks {
+  deleteBan: (id: number) => void;
+  editBan: (id: number) => void;
+}
+
+export const buildColumnConfigs = (callbacks: ColumnConfigsCallbacks): ColumnConfig<BanResource>[] => [
+  {
+    header: '',
+    id: 'actions',
+    renderContents: ({ rowId }) => (
+      <>
+        <Button key="edit" icon="pencil" onClick={() => callbacks.editBan(rowId)} />
+        <Button key="delete" icon="trash" onClick={() => callbacks.deleteBan(rowId)} color="red" />
+      </>
+    ),
+    basis: 4.5,
+  },
+  {
+    header: 'ID',
+    id: 'id',
+    getValue: (data) => data.id,
+    renderContents: ({ value }) => <a href={`https://staging.goonhub.com/admin/bans/${value}`}>{value}</a>,
+    basis: 4,
+  },
+  {
+    header: 'ckey',
+    id: 'ckey',
+    getValue: (data) => data.original_ban_detail.ckey ?? 'N/A',
+    renderContents: ({ value }) => <a href={`https://staging.goonhub.com/admin/players/${value}`}>{value}</a>,
+    basis: 10, // I think 32 chars is the max, this is slightly below but whatever
+    grow: 1,
+  },
+  {
+    header: 'Duration',
+    id: 'duration',
+    getValue: (data) => {
+      if (data.expires_at === null) {
+        if (data.requires_appeal) {
+          return 'Until Appeal';
+        }
+        return 'Permanent';
+      }
+      const created_at = dayjs(data.created_at);
+      const expires_at = dayjs(data.expires_at);
+      const duration = dayjs.duration(created_at.diff(expires_at));
+      return duration.humanize();
+    },
+    getValueTooltip: (data) => {
+      // Banned Date
+      const createdAtDate = dayjs(data.created_at);
+      let tooltipText = [<>{createdAtDate.format('[Banned ] YYYY-MM-DD HH:mm [UTC]\n')}</>];
+
+      // Expiration Date
+      if (data.expires_at === null) {
+        // Permanent
+        tooltipText.push(<strong>Permanent</strong>);
+      } else {
+        const expiresAtDate = dayjs(data.expires_at);
+        tooltipText.push(<>{expiresAtDate.format('[Expires] YYYY-MM-DD HH:mm [UTC]')}</>);
+      }
+
+      // Deletion Date
+      if (data.deleted_at !== null) {
+        tooltipText.push(<>{dayjs(data.deleted_at).format('\n[Deleted] YYYY-MM-DD HH:mm [UTC]')}</>);
+      }
+      return <pre>{tooltipText}</pre>;
+    },
+    renderContents: (options: { data: BanResource; value: unknown }) => {
+      if (options.data.deleted_at !== null) {
+        return <div className="ExpiredBan BanText">{options.value}</div>;
+      }
+      return <div className="CurrentBan BanText">{options.value}</div>;
+    },
+    basis: 7.5,
+  },
+  {
+    header: 'Server',
+    id: 'server',
+    getValue: (data) => data.server_id ?? 'All',
+    basis: 4,
+  },
+  {
+    header: 'Admin',
+    id: 'admin',
+    getValue: (data) => data.game_admin ?? 'N/A',
+    renderContents: ({ value }) => (
+      <a href={`https://staging.goonhub.com/admin/game-admins/${value.id}`} class="NoColor">
+        {value.name}
+      </a>
+    ),
+    getValueTooltip: (data) => {
+      if (data.game_admin === null) {
+        return 'N/A';
+      }
+      return `${data.game_admin.ckey} (${data.game_admin_id})`;
+    },
+    basis: 6.5,
+  },
+  {
+    header: 'Reason',
+    id: 'reason',
+    getValue: (data) => data.reason,
+    basis: 10,
+    grow: 10,
+  },
+  {
+    header: 'CID',
+    id: 'cid',
+    getValue: (data) => data.original_ban_detail.comp_id ?? 'N/A',
+    basis: 7,
+  },
+  {
+    header: 'IP',
+    id: 'ip',
+    getValue: (data) => data.original_ban_detail.ip ?? 'N/A',
+    basis: 9,
+  },
+];
diff --git a/tgui/packages/tgui/interfaces/BanPanel/JobBanList.tsx b/tgui/packages/tgui/interfaces/BanPanel/JobBanList.tsx
new file mode 100644
index 0000000000000..1183ad573b4b5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/JobBanList.tsx
@@ -0,0 +1,12 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Section } from '../../components';
+
+export const JobBanList = (_props, _context) => {
+  return <Section>Not yet implemented</Section>;
+};
diff --git a/tgui/packages/tgui/interfaces/BanPanel/apiType.ts b/tgui/packages/tgui/interfaces/BanPanel/apiType.ts
new file mode 100644
index 0000000000000..1a566a1bbf695
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/apiType.ts
@@ -0,0 +1,87 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { BooleanLike } from 'common/react';
+
+export interface BanResource {
+  id: number;
+  round_id: number | null;
+  game_admin_id: number | null;
+  server_id: string | null;
+  reason: string;
+  duration: string;
+  expires_at: string | null;
+  created_at: string;
+  updated_at: string | null;
+  deleted_at: string | null;
+  game_admin?: GameAdmin;
+  game_round?: GameRoundResource;
+  original_ban_detail?: {
+    id: number;
+    ban_id: number;
+    ckey: string;
+    comp_id: string;
+    ip: string;
+  };
+  details: BanDetailResource[];
+  requires_appeal: BooleanLike;
+}
+
+interface BanDetailResource {
+  id: number;
+  ban_id: number;
+  ckey: string | null;
+  comp_id: string | null;
+  ip: string | null;
+  created_at: string | null;
+  updated_at: string | null;
+  deleted_at: string | null;
+}
+
+interface GameRoundResource {
+  id: number;
+  server_id: string | null;
+  map: string | null;
+  game_type: string | null;
+  rp_mode: boolean;
+  crashed: boolean;
+  ended_at: string | null;
+  created_at: string | null;
+  updated_at: string | null;
+}
+
+export interface JobBanResource {
+  id: number;
+  round_id: number | null;
+  game_admin_id: number | null;
+  server_id: string | null;
+  ckey: string;
+  banned_from_job: string;
+  reason: string;
+  expires_at: string | null;
+  created_at: string;
+  updated_at: string | null;
+  deleted_at: string | null;
+  game_admin?: GameAdmin;
+}
+
+export interface GameAdmin {
+  id: number;
+  ckey: string;
+  name: string;
+}
+
+export interface PaginationMetaData {
+  current_page: number;
+  from: number;
+  last_page: number;
+  links: unknown;
+  path: string;
+  per_page: number;
+  to: number;
+  total: number;
+}
diff --git a/tgui/packages/tgui/interfaces/BanPanel/index.tsx b/tgui/packages/tgui/interfaces/BanPanel/index.tsx
new file mode 100644
index 0000000000000..f9fdd7bd096be
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/index.tsx
@@ -0,0 +1,43 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import { Stack, Tabs } from '../../components';
+import { Window } from '../../layouts';
+import { BanList } from './BanList/BanList';
+import { JobBanList } from './JobBanList';
+import { BanPanelTab } from './type';
+import { useBanPanelBackend } from './useBanPanelBackend';
+
+export const BanPanel = (_props, context) => {
+  const { action, data } = useBanPanelBackend(context);
+  const { current_tab } = data;
+  return (
+    <Window width={1100} height={640} title="Ban Panel" className="BanPanel">
+      <Window.Content>
+        <Stack fill vertical>
+          <Stack.Item>
+            <Tabs>
+              <Tabs.Tab
+                onClick={() => action.setTab(BanPanelTab.BanList)}
+                selected={current_tab === BanPanelTab.BanList}>
+                Ban List
+              </Tabs.Tab>
+              <Tabs.Tab
+                onClick={() => action.setTab(BanPanelTab.JobBanList)}
+                selected={current_tab === BanPanelTab.JobBanList}>
+                Job Ban List
+              </Tabs.Tab>
+            </Tabs>
+          </Stack.Item>
+          {current_tab === BanPanelTab.BanList && <BanList data={data} />}
+          {current_tab === BanPanelTab.JobBanList && <JobBanList />}
+        </Stack>
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/BanPanel/type.ts b/tgui/packages/tgui/interfaces/BanPanel/type.ts
new file mode 100644
index 0000000000000..83998c5b41a03
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/type.ts
@@ -0,0 +1,64 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import type { BanResource, PaginationMetaData } from './apiType';
+
+interface BanPanelBaseData {
+  current_tab: BanPanelTab;
+}
+
+interface PaginatedSearchResponse<T> {
+  data: T[];
+  links: unknown;
+  meta: PaginationMetaData;
+}
+
+interface BanListData {
+  search_response: PaginatedSearchResponse<BanResource> | null;
+}
+
+export interface BanListTabData extends BanPanelBaseData {
+  current_tab: BanPanelTab.BanList;
+  ban_list: BanListData;
+  per_page: number;
+}
+
+interface JobBanListTabData extends BanPanelBaseData {
+  current_tab: BanPanelTab.JobBanList;
+}
+
+export type BanPanelData = BanListTabData | JobBanListTabData;
+
+// sync with code/modules/admin/ban_panel.dm BAN_PANEL_TAB defines
+export enum BanPanelTab {
+  BanList = 'ban_list',
+  JobBanList = 'job_ban_list',
+}
+
+// sync with code/modules/admin/ban_panel.dm BAN_PANEL_ACTION defines
+export enum BanPanelAction {
+  SearchBans = 'ban_search',
+  NavigatePreviousPage = 'page_prev',
+  NavigateNextPage = 'page_next',
+  SetPerPage = 'set_perpage',
+  SetTab = 'set_tab',
+  EditBan = 'edit_ban',
+  DeleteBan = 'delete_ban',
+}
+
+// Options to filter by
+export enum BanPanelSearchFilter {
+  ID = 'id',
+  ckey = 'ckey',
+  og_ckey = 'original_ban_ckey',
+  Server = 'server',
+  Admin = 'admin_ckey',
+  Reason = 'reason',
+  CID = 'comp_id',
+  IP_Address = 'ip'
+}
diff --git a/tgui/packages/tgui/interfaces/BanPanel/useBanPanelBackend.ts b/tgui/packages/tgui/interfaces/BanPanel/useBanPanelBackend.ts
new file mode 100644
index 0000000000000..4d4a71c2ea252
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BanPanel/useBanPanelBackend.ts
@@ -0,0 +1,30 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+import { useBackend } from '../../backend';
+import { BanPanelAction, BanPanelSearchFilter, BanPanelTab } from './type';
+import type { BanPanelData } from './type';
+
+export const useBanPanelBackend = (context) => {
+  const { act, data } = useBackend<BanPanelData>(context);
+  const action = {
+    searchBans: (
+      searchText: string, searchFilter: BanPanelSearchFilter
+    ) => act(BanPanelAction.SearchBans, { searchText, searchFilter }),
+    navigatePreviousPage: () => act(BanPanelAction.NavigatePreviousPage),
+    navigateNextPage: () => act(BanPanelAction.NavigateNextPage),
+    setPerPage: (amount: number) => act(BanPanelAction.SetPerPage, { amount }),
+    setTab: (value: BanPanelTab) => act(BanPanelAction.SetTab, { value }),
+    editBan: (id: number) => act(BanPanelAction.EditBan, { id }),
+    deleteBan: (id: number) => act(BanPanelAction.DeleteBan, { id }),
+  };
+  return {
+    action,
+    data,
+  };
+};
diff --git a/tgui/packages/tgui/interfaces/Bombsim/index.tsx b/tgui/packages/tgui/interfaces/Bombsim/index.tsx
new file mode 100644
index 0000000000000..50d398538709b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Bombsim/index.tsx
@@ -0,0 +1,95 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC
+ */
+
+import { useBackend, useLocalState } from '../../backend';
+import { Button, LabeledList, Section, Stack } from '../../components';
+import { Window } from '../../layouts';
+import { TankInfo } from "../TTV";
+
+// Returns whether the nth bit starting with 0 for the rightmost is set
+const is_set = (bits, bit) => { return bits & (1 << bit); };
+
+const MaintenencePanel = (props, context) => {
+  const { act, data } = useBackend<SimulatorData>(context);
+  let resetButton = <Button icon="wifi" onClick={() => reset()}>Reset Connection</Button>;
+  const reset = () => {
+    act("reset");
+    setConnection("NO CONNECTION");
+  };
+  const [bits, setBits] = useLocalState(context, "bits", data.net_number);
+  const [connection, setConnection] = useLocalState(context, "connection", "OK CONNECTION");
+  if (connection === "NO CONNECTION" && data.host_id !== null) {
+    setConnection("OK CONNECTION");
+  }
+  let configSwitches = [];
+  for (let i = 0; i < 4; i++) {
+    configSwitches.push(<Stack.Item><ConfigSwitch local_bits={bits} setter={setBits} bit_pos={i} /></Stack.Item>);
+  }
+  return (
+    <Section title="Maintenence Panel" buttons={resetButton}>
+      <LabeledList.Item label="Host Connection">
+        {connection}
+      </LabeledList.Item>
+      <LabeledList.Item label="Configuration Switches" verticalAlign="middle">
+        <Stack>
+          {configSwitches}
+        </Stack>
+      </LabeledList.Item>
+    </Section>
+  );
+
+};
+
+const ConfigSwitch = (props, context) => {
+  const { act, data } = useBackend<SimulatorData>(context);
+  const { local_bits, setter, bit_pos } = props;
+  let bit_is_set = is_set(local_bits, bit_pos);
+  const handle_click = () => {
+    act("config_switch", { "switch_flicked": bit_pos });
+    setter(local_bits ^ (1 << bit_pos));
+  };
+  return (
+    <Button width={2} height={2} color={(bit_is_set) ? "green" : "red"} onClick={handle_click} />
+  );
+};
+
+export const Bombsim = (_props, context) => {
+  const { act, data } = useBackend<SimulatorData>(context);
+  let simulationButton = <Button icon="burst" disabled={!data.is_ready} onClick={() => act("simulate")}>Begin Simulation</Button>;
+  return (
+    <Window width={400} height={(data.panel_open) ? 400 : 300}>
+      <Window.Content>
+        <Stack>
+          <Stack.Item>
+            <TankInfo tank={data.tank_one} tankNum={1} />
+          </Stack.Item>
+          <Stack.Item>
+            <TankInfo tank={data.tank_two} tankNum={2} />
+          </Stack.Item>
+        </Stack>
+        <Section
+          mt={1}
+          title="Simulator"
+          buttons={simulationButton}
+        >
+          <LabeledList>
+            <LabeledList.Item label="Simulation">
+              {(data.vr_bomb !== null) ? "ACTIVE" : "INACTIVE"}
+            </LabeledList.Item>
+            <LabeledList.Item label="Status">
+              {data.readiness_dialogue}
+            </LabeledList.Item>
+            <LabeledList.Item label="Cooldown">
+              {(data.is_ready) ? "None" : data.cooldown}
+            </LabeledList.Item>
+          </LabeledList>
+        </Section>
+        {(data.panel_open) ? <MaintenencePanel /> : ""}
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/Bombsim/type.ts b/tgui/packages/tgui/interfaces/Bombsim/type.ts
new file mode 100644
index 0000000000000..8a09576231122
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Bombsim/type.ts
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC
+ */
+
+interface SimulatorData {
+  tank_one:TankData;
+  tank_two:TankData;
+  host_id:string;
+  vr_bomb:string;
+  is_ready:boolean;
+  readiness_dialogue:string;
+  cooldown:number;
+  panel_open:boolean;
+  net_number:number;
+}
+
+interface TankData {
+  name:string;
+  pressure:number;
+  maxPressure:number;
+}
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/CellChargeBar.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/CellChargeBar.tsx
new file mode 100644
index 0000000000000..87ab071e2e962
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/CellChargeBar.tsx
@@ -0,0 +1,29 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { ProgressBar, Tooltip } from '../../components';
+import type { PowerCellData } from './type';
+
+interface CellChargeBarProps {
+  cell: PowerCellData;
+}
+
+export const CellChargeBar = (props: CellChargeBarProps) => {
+  const { cell } = props;
+  const charge = cell.current / cell.max;
+  return (
+    <Tooltip position="bottom" content={Math.floor(cell.current) + '/' + cell.max}>
+      <ProgressBar
+        position="relative"
+        value={charge}
+        ranges={{ good: [0.5, Infinity], average: [0.25, 0.5], bad: [-Infinity, 0.25] }}>
+        {Math.floor(charge * 100)}%
+      </ProgressBar>
+    </Tooltip>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/DockingAllowedButton.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/DockingAllowedButton.tsx
new file mode 100644
index 0000000000000..65e52debdac7d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/DockingAllowedButton.tsx
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { useBackend } from '../../backend';
+import { Button } from '../../components';
+import type { CyborgDockingStationData } from './type';
+
+// type to handle pass-through of non-TS Button props
+type MockButtonProps = Record<string, any> & {
+  disabled?: boolean;
+};
+
+interface DockingAllowedButtonProps extends MockButtonProps {}
+
+export const DockingAllowedButton = (props: DockingAllowedButtonProps, context) => {
+  const { disabled, ...rest } = props;
+  const { data } = useBackend<CyborgDockingStationData>(context);
+  return <Button disabled={disabled || data.disabled} {...rest} />;
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/EyebotStatusView.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/EyebotStatusView.tsx
new file mode 100644
index 0000000000000..68d8428972517
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/EyebotStatusView.tsx
@@ -0,0 +1,26 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { LabeledList } from '../../../components';
+import { CellChargeBar } from '../CellChargeBar';
+import { OccupantDataEyebot } from '../type';
+
+interface EyebotStatusViewProps {
+  occupant: OccupantDataEyebot;
+}
+
+export const EyebotStatusView = (props: EyebotStatusViewProps) => {
+  const { occupant } = props;
+  return (
+    <LabeledList>
+      <LabeledList.Item label={occupant.cell.name}>
+        <CellChargeBar cell={occupant.cell} />
+      </LabeledList.Item>
+    </LabeledList>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/HumanStatusView.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/HumanStatusView.tsx
new file mode 100644
index 0000000000000..56ef362d33549
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/HumanStatusView.tsx
@@ -0,0 +1,34 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { LabeledList, ProgressBar } from '../../../components';
+import { OccupantDataHuman } from '../type';
+
+interface HumanStatusViewProps {
+  occupant: OccupantDataHuman;
+}
+
+export const HumanStatusView = (props: HumanStatusViewProps) => {
+  const { occupant } = props;
+  const { health, max_health } = occupant;
+  return (
+    <LabeledList>
+      <LabeledList.Item label="Converting">
+        <ProgressBar
+          value={(max_health - health) / max_health}
+          ranges={{
+            good: [0.5, Infinity],
+            average: [0.25, 0.5],
+            bad: [-Infinity, 0.25],
+          }}>
+          {Math.floor(((max_health - health) / max_health) * 100)}%
+        </ProgressBar>
+      </LabeledList.Item>
+    </LabeledList>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/OccupantCellDisplay.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/OccupantCellDisplay.tsx
new file mode 100644
index 0000000000000..4fb29b3e8e5e4
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/OccupantCellDisplay.tsx
@@ -0,0 +1,36 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, LabeledList } from '../../../components';
+import { CellChargeBar } from '../CellChargeBar';
+import { DockingAllowedButton } from '../DockingAllowedButton';
+import type { PowerCellData } from '../type';
+
+interface OccupantCellDisplayProps {
+  cell: PowerCellData | undefined;
+  onRemoveCell: () => void;
+}
+
+export const OccupantCellDisplay = (props: OccupantCellDisplayProps) => {
+  const { cell, onRemoveCell } = props;
+  return (
+    <LabeledList.Item
+      label="Power Cell"
+      color={cell ? 'white' : 'red'}
+      buttons={
+        <DockingAllowedButton
+          onClick={onRemoveCell}
+          icon="minus"
+          tooltip="Remove the occupant's power cell"
+          disabled={!cell}
+        />
+      }>
+      {cell ? <CellChargeBar cell={cell} /> : <Box bold>No Power Cell Installed</Box>}
+    </LabeledList.Item>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/ClothingReportSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/ClothingReportSection.tsx
new file mode 100644
index 0000000000000..69db077db3b09
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/ClothingReportSection.tsx
@@ -0,0 +1,41 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, Section } from '../../../../components';
+import { DockingAllowedButton } from '../../DockingAllowedButton';
+import type { ClothingData } from '../../type';
+
+interface ClothingReportSectionProps {
+  onRemoveClothing: (ref: string) => void;
+  clothes: ClothingData[];
+}
+
+export const ClothingReportSection = (props: ClothingReportSectionProps) => {
+  const { clothes, onRemoveClothing } = props;
+  return (
+    <Section title="Clothing">
+      {clothes.length > 0 ? (
+        clothes.map((cloth) => {
+          return (
+            <Box key={cloth.ref}>
+              {cloth.name}
+              <DockingAllowedButton
+                onClick={() => onRemoveClothing(cloth.ref)}
+                icon="minus-circle"
+                color="transparent"
+                tooltip="Remove from occupant"
+              />
+            </Box>
+          );
+        })
+      ) : (
+        <Box>No Clothing</Box>
+      )}
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DamageReportSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DamageReportSection.tsx
new file mode 100644
index 0000000000000..a0e6d76cd98d0
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DamageReportSection.tsx
@@ -0,0 +1,101 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, Flex, LabeledList, Section } from '../../../../components';
+import { COLORS } from '../../../../constants';
+import { DockingAllowedButton } from '../../DockingAllowedButton';
+import { isPresentPartsData, PartData, PartListData } from '../../type';
+
+interface DamageReportSectionProps {
+  cabling: number;
+  fuel: number;
+  onRepairStructure: () => void;
+  onRepairWiring: () => void;
+  parts: PartListData;
+}
+
+export const DamageReportSection = (props: DamageReportSectionProps) => {
+  const { cabling, fuel, parts, onRepairStructure, onRepairWiring } = props;
+  return (
+    <Section
+      title="Damage Report"
+      buttons={
+        <>
+          <DockingAllowedButton
+            disabled={fuel < 1}
+            icon="wrench"
+            backgroundColor={COLORS.damageType.brute}
+            tooltip="Fix structural damage"
+            onClick={onRepairStructure}
+          />
+          <DockingAllowedButton
+            disabled={cabling < 1}
+            icon="fire"
+            backgroundColor={COLORS.damageType.burn}
+            tooltip="Fix wiring damage"
+            onClick={onRepairWiring}
+          />
+        </>
+      }>
+      <LabeledList>
+        <PartDisplay label="Head" partData={parts.head} />
+        <PartDisplay label="Chest" partData={parts.chest} />
+        <PartDisplay label="Left Arm" partData={parts.arm_l} />
+        <PartDisplay label="Right Arm" partData={parts.arm_r} />
+        <PartDisplay label="Left Leg" partData={parts.leg_l} />
+        <PartDisplay label="Right Leg" partData={parts.leg_r} />
+      </LabeledList>
+    </Section>
+  );
+};
+
+interface PartDisplayProps {
+  label: string;
+  partData: PartData;
+}
+
+const PartDisplay = (props: PartDisplayProps) => {
+  const { label, partData } = props;
+  if (!isPresentPartsData(partData)) {
+    return (
+      <LabeledList.Item color="red" label={label}>
+        <Box bold>MISSING!</Box>
+      </LabeledList.Item>
+    );
+  } else {
+    const partBluntPercent = Math.floor((partData.dmg_blunt / partData.max_health) * 100);
+    const partBurnsPercent = Math.floor((partData.dmg_burns / partData.max_health) * 100);
+    if (partBluntPercent || partBurnsPercent) {
+      return (
+        <LabeledList.Item label={label}>
+          <Flex>
+            <Flex.Item grow={1}>
+              <Flex>
+                <Flex.Item backgroundColor={COLORS.damageType.brute} width={partBluntPercent + '%'} />
+                <Flex.Item backgroundColor={COLORS.damageType.burn} width={partBurnsPercent + '%'} />
+                <Flex.Item grow={1} backgroundColor="#000000" stretch>
+                  &nbsp;
+                </Flex.Item>
+              </Flex>
+            </Flex.Item>
+            <Flex.Item shrink>
+              <Flex>
+                <Flex.Item shrink width="25px" backgroundColor="#330000" color={COLORS.damageType.brute} bold>
+                  <Box textAlign="center">{partBluntPercent > 0 ? partBluntPercent : '--'}</Box>
+                </Flex.Item>
+                <Flex.Item shrink width="25px" backgroundColor={'#331100'} color={COLORS.damageType.burn} bold>
+                  <Box textAlign="center">{partBurnsPercent > 0 ? partBurnsPercent : '--'}</Box>
+                </Flex.Item>
+              </Flex>
+            </Flex.Item>
+          </Flex>
+        </LabeledList.Item>
+      );
+    }
+  }
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DecorationReportSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DecorationReportSection.tsx
new file mode 100644
index 0000000000000..58a81bb694f8e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/DecorationReportSection.tsx
@@ -0,0 +1,71 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { ColorBox, LabeledList, Section } from '../../../../components';
+import { DockingAllowedButton } from '../../DockingAllowedButton';
+import type { RobotCosmeticsData } from '../../type';
+
+interface DecorationReportSectionProps {
+  cosmetics: RobotCosmeticsData;
+  onChangeCosmetic: Record<'head' | 'chest' | 'arms' | 'legs' | 'eyeGlow', () => void>;
+  onChangePaintCosmetic: Record<'add' | 'change' | 'remove', () => void>;
+}
+
+export const DecorationReportSection = (props: DecorationReportSectionProps) => {
+  const { cosmetics, onChangeCosmetic, onChangePaintCosmetic } = props;
+  const {
+    head: onChangeHead,
+    chest: onChangeChest,
+    arms: onChangeArms,
+    legs: onChangeLegs,
+    eyeGlow: onChangeEyeGlow,
+  } = onChangeCosmetic;
+  const { add: onAddPaint, change: onChangePaint, remove: onRemovePaint } = onChangePaintCosmetic;
+  return (
+    <Section title="Decoration">
+      <LabeledList>
+        <LabeledList.Item
+          label="Head"
+          buttons={<DockingAllowedButton icon="sync-alt" tooltip="Change head decoration" onClick={onChangeHead} />}>
+          {cosmetics.head || 'None'}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Chest"
+          buttons={<DockingAllowedButton icon="sync-alt" tooltip="Change chest decoration" onClick={onChangeChest} />}>
+          {cosmetics.chest || 'None'}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Arms"
+          buttons={<DockingAllowedButton icon="sync-alt" tooltip="Change arms decoration" onClick={onChangeArms} />}>
+          {cosmetics.arms || 'None'}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Legs"
+          buttons={<DockingAllowedButton icon="sync-alt" tooltip="Change legs decoration" onClick={onChangeLegs} />}>
+          {cosmetics.legs || 'None'}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Paint"
+          buttons={
+            <>
+              {!cosmetics.paint && <DockingAllowedButton icon="plus" tooltip="Add paint" onClick={onAddPaint} />}
+              {cosmetics.paint && <DockingAllowedButton icon="tint" tooltip="Change colour" onClick={onChangePaint} />}
+              {cosmetics.paint && <DockingAllowedButton icon="minus" tooltip="Remove paint" onClick={onRemovePaint} />}
+            </>
+          }>
+          {cosmetics.paint ? <ColorBox color={cosmetics.paint} /> : 'No paint applied'}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Eyes"
+          buttons={<DockingAllowedButton icon="tint" tooltip="Change eye glow" onClick={onChangeEyeGlow} />}>
+          <ColorBox color={'rgb(' + cosmetics.fx[0] + ',' + cosmetics.fx[1] + ',' + cosmetics.fx[2] + ')'} />
+        </LabeledList.Item>
+      </LabeledList>
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/UpgradeReportSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/UpgradeReportSection.tsx
new file mode 100644
index 0000000000000..b798e45d93155
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/UpgradeReportSection.tsx
@@ -0,0 +1,44 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Section, Stack } from '../../../../components';
+import { DockingAllowedButton } from '../../DockingAllowedButton';
+import type { UpgradeData } from '../../type';
+
+interface UpgradeReportSectionProps {
+  onRemoveUpgrade: (upgradeRef: string) => void;
+  upgrades: UpgradeData[];
+  upgrades_max: number;
+}
+
+export const UpgradeReportSection = (props: UpgradeReportSectionProps) => {
+  const { onRemoveUpgrade, upgrades, upgrades_max } = props;
+  const upgradeCount = 'Upgrades (' + upgrades.length + ' / ' + upgrades_max + ' installed)';
+  return (
+    <Section title={upgradeCount}>
+      <div>
+        {upgrades.map((upgrade) => {
+          return (
+            <Stack key={upgrade.ref}>
+              <Stack.Item>{upgrade.name}</Stack.Item>
+              <Stack.Item>
+                <DockingAllowedButton
+                  compact
+                  icon="minus-circle"
+                  color="transparent"
+                  tooltip={`Remove ${upgrade.name}`}
+                  onClick={() => onRemoveUpgrade(upgrade.ref)}
+                />
+              </Stack.Item>
+            </Stack>
+          );
+        })}
+      </div>
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/index.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/index.tsx
new file mode 100644
index 0000000000000..166c710c92875
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/RobotStatusView/index.tsx
@@ -0,0 +1,84 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, LabeledList } from '../../../../components';
+import { DockingAllowedButton } from '../../DockingAllowedButton';
+import { OccupantCellDisplay } from '../OccupantCellDisplay';
+import { DamageReportSection } from './DamageReportSection';
+import { UpgradeReportSection } from './UpgradeReportSection';
+import { DecorationReportSection } from './DecorationReportSection';
+import { ClothingReportSection } from './ClothingReportSection';
+import type { OccupantDataRobot } from '../../type';
+
+interface RobotStatusViewProps {
+  act: (action: string, payload?: object) => void;
+  cabling: number;
+  fuel: number;
+  occupant: OccupantDataRobot;
+}
+
+export const RobotStatusView = (props: RobotStatusViewProps) => {
+  const { cabling, fuel, occupant, act } = props;
+  const { cell, moduleName, upgrades, upgrades_max, parts } = occupant;
+  const handleRemoveCell = () => act('cell-remove');
+  const handleRemoveModule = () => act('module-remove');
+  const handleRemoveUpgrade = (upgradeRef: string) => act('upgrade-remove', { upgradeRef });
+  const handleRepairStructure = () => act('repair-fuel');
+  const handleRepairWiring = () => act('repair-wiring');
+  const handleRemoveClothing = (clothingRef: string) => act('clothing-remove', { clothingRef });
+  const handleChangeCosmetic = {
+    'head': () => act('cosmetic-change-head'),
+    'chest': () => act('cosmetic-change-chest'),
+    'arms': () => act('cosmetic-change-arms'),
+    'legs': () => act('cosmetic-change-legs'),
+    'eyeGlow': () => act('occupant-fx'),
+  };
+  const handleChangePaintCosmetic = {
+    'add': () => act('occupant-paint-add'),
+    'change': () => act('occupant-paint-change'),
+    'remove': () => act('occupant-paint-remove'),
+  };
+  const hasModule = !!moduleName;
+  return (
+    <>
+      <LabeledList>
+        <OccupantCellDisplay cell={cell} onRemoveCell={handleRemoveCell} />
+        <LabeledList.Item
+          label="Module"
+          buttons={
+            <DockingAllowedButton
+              onClick={handleRemoveModule}
+              icon="minus"
+              tooltip="Remove the occupant's module"
+              disabled={!hasModule}
+            />
+          }>
+          {moduleName || (
+            <Box as="span" color="red">
+              No Module Installed
+            </Box>
+          )}
+        </LabeledList.Item>
+      </LabeledList>
+      <DamageReportSection
+        parts={parts}
+        fuel={fuel}
+        cabling={cabling}
+        onRepairStructure={handleRepairStructure}
+        onRepairWiring={handleRepairWiring}
+      />
+      <UpgradeReportSection onRemoveUpgrade={handleRemoveUpgrade} upgrades={upgrades} upgrades_max={upgrades_max} />
+      <DecorationReportSection
+        cosmetics={occupant.cosmetics}
+        onChangeCosmetic={handleChangeCosmetic}
+        onChangePaintCosmetic={handleChangePaintCosmetic}
+      />
+      <ClothingReportSection clothes={occupant.clothing} onRemoveClothing={handleRemoveClothing} />
+    </>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/index.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/index.tsx
new file mode 100644
index 0000000000000..7ce2ea3faa6df
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/OccupantSection/index.tsx
@@ -0,0 +1,104 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { useBackend } from '../../../backend';
+import { LabeledList, Section, Stack } from '../../../components';
+import { DockingAllowedButton } from '../DockingAllowedButton';
+import type { CyborgDockingStationData, OccupantData } from '../type';
+import { EyebotStatusView } from './EyebotStatusView';
+import { HumanStatusView } from './HumanStatusView';
+import { RobotStatusView } from './RobotStatusView';
+
+export const OccupantSection = (_props: unknown, context) => {
+  const { act, data } = useBackend<CyborgDockingStationData>(context);
+  const { cabling, fuel, occupant } = data;
+  const hasOccupant = !!occupant?.name;
+  const handleEjectOccupant = () => act('occupant-eject');
+  const handleRenameOccupant = () => act('occupant-rename');
+  return (
+    <Section title="Occupant">
+      <Stack>
+        <Stack.Item grow={1}>
+          {hasOccupant ? (
+            <OccupantSectionContents
+              act={act}
+              cabling={cabling}
+              fuel={fuel}
+              occupant={occupant}
+              onEjectOccupant={handleEjectOccupant}
+              onRenameOccupant={handleRenameOccupant}
+            />
+          ) : (
+            <div>No occupant</div>
+          )}
+        </Stack.Item>
+      </Stack>
+    </Section>
+  );
+};
+
+interface OccupantSectionContentsProps {
+  act: (action: string, payload?: object) => void;
+  cabling: number;
+  fuel: number;
+  occupant: OccupantData;
+  onEjectOccupant: () => void;
+  onRenameOccupant: () => void;
+}
+
+const OccupantSectionContents = (props: OccupantSectionContentsProps) => {
+  const { act, cabling, fuel, occupant, onEjectOccupant, onRenameOccupant } = props;
+  const occupantTypeDescription = occupantTypeDescriptionLens(occupant);
+  return (
+    <>
+      <LabeledList>
+        <LabeledList.Item
+          label="Name"
+          buttons={
+            <>
+              {occupant.kind === 'robot' && (
+                <DockingAllowedButton
+                  onClick={onRenameOccupant}
+                  icon="edit"
+                  tooltip="Change the occupant's designation"
+                />
+              )}
+              {<DockingAllowedButton onClick={onEjectOccupant} icon="eject" tooltip="Eject the occupant" />}
+            </>
+          }>
+          {occupant.name}
+        </LabeledList.Item>
+        <LabeledList.Item label="Type">{occupantTypeDescription}</LabeledList.Item>
+      </LabeledList>
+      <Section title="Status">
+        {occupant.kind === 'robot' && <RobotStatusView occupant={occupant} fuel={fuel} cabling={cabling} act={act} />}
+        {occupant.kind === 'human' && <HumanStatusView occupant={occupant} />}
+        {occupant.kind === 'eyebot' && <EyebotStatusView occupant={occupant} />}
+      </Section>
+    </>
+  );
+};
+
+const occupantTypeDescriptionLens = (occupant: OccupantData) => {
+  switch (occupant.kind) {
+    case 'robot':
+      if (occupant.user === 'brain') {
+        return 'Mk.2-Type Cyborg';
+      }
+      if (occupant.user === 'ai') {
+        return 'Mk.2-Type AI Shell';
+      }
+      break;
+    case 'human':
+      return 'Mk.2-Type Carbon';
+    case 'eyebot':
+      return 'Mk.1-Type Eyebot';
+    default:
+      return 'Unknown';
+  }
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/AvailableCellsSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/AvailableCellsSection.tsx
new file mode 100644
index 0000000000000..eabe111646e10
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/AvailableCellsSection.tsx
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, LabeledList, Section } from '../../../components';
+import { CellChargeBar } from '../CellChargeBar';
+import { DockingAllowedButton } from '../DockingAllowedButton';
+import type { PowerCellData } from '../type';
+
+interface AvailableCellsSectionProps {
+  items: PowerCellData[];
+  onEject: (ref: string) => void;
+  onInstall: (ref: string) => void;
+}
+
+export const AvailableCellsSection = (props: AvailableCellsSectionProps) => {
+  const { items, onEject, onInstall } = props;
+  return (
+    <Section title="Power Cells">
+      {items.length > 0 ? (
+        <LabeledList>
+          {items.map((item) => {
+            return (
+              <div key={item.ref}>
+                <LabeledList.Item
+                  label={item.name}
+                  buttons={
+                    <>
+                      <DockingAllowedButton onClick={() => onInstall(item.ref)} icon="plus" tooltip="Add to occupant" />
+                      <DockingAllowedButton
+                        onClick={() => onEject(item.ref)}
+                        icon="eject"
+                        tooltip="Eject from station"
+                      />
+                    </>
+                  }>
+                  <CellChargeBar cell={item} />
+                </LabeledList.Item>
+              </div>
+            );
+          })}
+        </LabeledList>
+      ) : (
+        <Box as="div">None Stored</Box>
+      )}
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/StandardAvailableSection.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/StandardAvailableSection.tsx
new file mode 100644
index 0000000000000..db2cbbd3e74f5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/StandardAvailableSection.tsx
@@ -0,0 +1,47 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { Box, Section } from '../../../components';
+import { DockingAllowedButton } from '../DockingAllowedButton';
+import type { ItemData } from '../type';
+
+interface StandardAvailableSectionProps<T extends ItemData> {
+  items: T[];
+  onEject: (ref: string) => void;
+  onInstall: (ref: string) => void;
+  title: string;
+}
+
+export const StandardAvailableSection = <T extends ItemData>(props: StandardAvailableSectionProps<T>) => {
+  const { items, onEject, onInstall, title } = props;
+  return (
+    <Section title={title}>
+      {items.length > 0 ? (
+        items.map((item) => (
+          <div key={item.ref}>
+            {item.name}
+            <DockingAllowedButton
+              onClick={() => onInstall(item.ref)}
+              icon="plus-circle"
+              color="transparent"
+              tooltip="Add to occupant"
+            />
+            <DockingAllowedButton
+              onClick={() => onEject(item.ref)}
+              icon="eject"
+              color="transparent"
+              tooltip="Eject from station"
+            />
+          </div>
+        ))
+      ) : (
+        <Box as="div">None Stored</Box>
+      )}
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/index.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/index.tsx
new file mode 100644
index 0000000000000..389b638146856
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/SuppliesSection/index.tsx
@@ -0,0 +1,63 @@
+/**
+ * @file
+ * @copyright 2022
+ * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
+ * @license ISC
+ */
+
+import { useBackend } from '../../../backend';
+import { Button, LabeledList, Section } from '../../../components';
+import { AvailableCellsSection } from './AvailableCellsSection';
+import type { CyborgDockingStationData } from '../type';
+import { StandardAvailableSection } from './StandardAvailableSection';
+
+export const SuppliesSection = (_props: unknown, context) => {
+  const { act, data } = useBackend<CyborgDockingStationData>(context);
+  const { allow_self_service, cabling, cells, clothes, fuel, modules, upgrades, viewer_is_robot } = data;
+  const handleToggleSelfService = () => act('self-service');
+  const handleInstallModule = (moduleRef: string) => act('module-install', { moduleRef });
+  const handleEjectModule = (moduleRef: string) => act('module-eject', { moduleRef });
+  const handleInstallClothing = (clothingRef: string) => act('clothing-install', { clothingRef });
+  const handleEjectClothing = (clothingRef: string) => act('clothing-eject', { clothingRef });
+  const handleInstallUpgrade = (upgradeRef: string) => act('upgrade-install', { upgradeRef });
+  const handleEjectUpgrade = (upgradeRef: string) => act('upgrade-eject', { upgradeRef });
+  const handleInstallCell = (cellRef: string) => act('cell-install', { cellRef });
+  const handleEjectCell = (cellRef: string) => act('cell-eject', { cellRef });
+  return (
+    <Section title="Supplies">
+      <LabeledList>
+        <LabeledList.Item label="Welding Fuel">{fuel}</LabeledList.Item>
+        <LabeledList.Item label="Wire Cabling">{cabling}</LabeledList.Item>
+        <LabeledList.Item label="Self Service">
+          <Button.Checkbox
+            tooltip="Toggle self-service."
+            checked={allow_self_service}
+            disabled={viewer_is_robot}
+            onClick={handleToggleSelfService}>
+            {allow_self_service ? 'Enabled' : 'Disabled'}
+          </Button.Checkbox>
+        </LabeledList.Item>
+      </LabeledList>
+      <StandardAvailableSection
+        items={modules}
+        onInstall={handleInstallModule}
+        onEject={handleEjectModule}
+        title="Modules"
+      />
+      <StandardAvailableSection
+        items={upgrades}
+        onInstall={handleInstallUpgrade}
+        onEject={handleEjectUpgrade}
+        title="Upgrades"
+      />
+      <AvailableCellsSection items={cells} onInstall={handleInstallCell} onEject={handleEjectCell} />
+      <StandardAvailableSection
+        items={clothes}
+        onInstall={handleInstallClothing}
+        onEject={handleEjectClothing}
+        title="Upgrades"
+      />
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/index.tsx b/tgui/packages/tgui/interfaces/CyborgDockingStation/index.tsx
index 3ffda8a436e3d..cfb23a6407643 100644
--- a/tgui/packages/tgui/interfaces/CyborgDockingStation/index.tsx
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/index.tsx
@@ -2,483 +2,72 @@
  * @file
  * @copyright 2022
  * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
  * @license ISC
  */
 
 import { useBackend, useLocalState } from '../../backend';
-import { COLORS } from '../../constants';
-import { Box, Button, ColorBox, Divider, Flex, LabeledList, ProgressBar, Section, Stack, Tabs, Tooltip } from '../../components';
+import { Box, Divider, Stack, Tabs } from '../../components';
 import { Window } from '../../layouts';
-import { CyborgDockingStationData } from './type';
+import { OccupantSection } from './OccupantSection';
+import { SuppliesSection } from './SuppliesSection';
+import type { CyborgDockingStationData } from './type';
 
-export const CyborgDockingStation = (props, context) => {
-  const { act, data } = useBackend<CyborgDockingStationData>(context);
+export const CyborgDockingStation = (_props: unknown, context) => {
+  const { data } = useBackend<CyborgDockingStationData>(context);
+  const { allow_self_service, conversion_chamber, disabled, occupant, viewer_is_occupant, viewer_is_robot } = data;
   const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 1);
-
   return (
     <Window
       width={500}
       height={640}
       title="Cyborg Docking Station"
-      theme={(data.conversion_chamber && data.occupant.kind === "human") ?"syndicate" : "neutral"}>
+      theme={conversion_chamber && occupant?.kind === 'human' ? 'syndicate' : 'neutral'}>
       <Window.Content scrollable>
-        <DisabledDisplayReason />
+        {!!disabled && (
+          <DisabledDisplayReason
+            allowSelfService={!!allow_self_service}
+            viewerIsOccupant={!!viewer_is_occupant}
+            viewerIsRobot={!!viewer_is_robot}
+          />
+        )}
         <Stack>
           <Stack.Item>
             <Tabs vertical width="100px">
-              <Tabs.Tab
-                selected={tabIndex===1}
-                onClick={() => setTabIndex(1)}>
+              <Tabs.Tab selected={tabIndex === 1} onClick={() => setTabIndex(1)}>
                 Occupant
               </Tabs.Tab>
-              <Tabs.Tab
-                selected={tabIndex===2}
-                onClick={() => setTabIndex(2)}>
+              <Tabs.Tab selected={tabIndex === 2} onClick={() => setTabIndex(2)}>
                 Supplies
               </Tabs.Tab>
             </Tabs>
           </Stack.Item>
           <Stack.Item grow={1} basis={0}>
-            <DockingTabView data={data} act={act} tabIndex={tabIndex} />
+            {tabIndex === 1 && <OccupantSection />}
+            {tabIndex === 2 && <SuppliesSection />}
           </Stack.Item>
         </Stack>
       </Window.Content>
     </Window>
   );
 };
-const DisabledDisplayReason = (props, context) => {
-  const { act, data } = useBackend<CyborgDockingStationData>(context);
-  if (data.disabled) {
-    return (
-      <>
-        <Box backgroundColor="#773333" p="5px" mb="5px" bold textAlign="center">
-          {(data.viewer_is_robot && !data.viewer_is_occupant) && "You must be inside the docking station to use the functions." || ""}
-          {(data.viewer_is_occupant && !data.viewer_is_robot) && "Non-cyborgs cannot use the docking station functions." || ""}
-          {(data.viewer_is_occupant && !data.allow_self_service) && "Self-service has been disabled at this station." || ""}
-        </Box>
-        <Divider />
-      </>
-    );
-  }
-};
-const DockingAllowedButton = (props, context) => {
-  const {
-    disabled,
-    ...rest
-  } = props;
-  const { act, data } = useBackend<CyborgDockingStationData>(context);
-  return <Button disabled={disabled || data.disabled} {...rest} />;
-};
-const OccupantTab = (props) => {
-  const { occupant, fuel, cabling, act } = props;
-  return (
-    <Section title="Occupant">
-      <Stack>
-        <Stack.Item grow={1}>
-          <OccupantTabContents occupant={occupant} act={act} fuel={fuel} cabling={cabling} />
-        </Stack.Item>
-      </Stack>
-    </Section>
-  );
-};
-const OccupantTabContents = (props) => {
-  const { occupant, fuel, cabling, act } = props;
-  if (occupant.name) {
-    return (
-      <>
-        <LabeledList>
-          <LabeledList.Item label="Name" buttons={(
-            <>
-              {occupant.kind ==="robot" && <DockingAllowedButton onClick={() => act("occupant-rename")} icon="edit" tooltip="Change the occupant's designation" />}
-              {<DockingAllowedButton onClick={() => act("occupant-eject")} icon="eject" tooltip="Eject the occupant" /> }
-            </>
-          )}>
-            {occupant.name}
-          </LabeledList.Item>
-          <LabeledList.Item label="Type"><OccupantType kind={occupant.kind} user={occupant.user} /></LabeledList.Item>
-        </LabeledList>
-        <Section title="Status">
-          {occupant.kind === "robot" && <OccupantStatusRobot occupant={occupant} fuel={fuel} cabling={cabling} act={act} />}
-          {occupant.kind === "human" && <OccupantStatusHuman occupant={occupant} />}
-          {occupant.kind === "eyebot" && <OccupantStatusEyebot occupant={occupant} />}
-        </Section>
-      </>
-    );
-  } else {
-    return (<div>No occupant</div>);
-  }
-};
-const OccupantStatusRobot = (props) => {
-  const { occupant, fuel, cabling, act } = props;
-  return (
-    <>
-      <LabeledList>
-        <OccupantCellDisplay cellData={occupant.cell} act={act} />
-        <LabeledList.Item label="Module" buttons={
-          <DockingAllowedButton
-            onClick={() => act("module-remove")}
-            icon="minus"
-            tooltip="Remove the occupant's module"
-            disabled={!occupant.module} />
-        }>
-          {occupant.module || <Box as="span" color="red">No Module Installed</Box>}
-        </LabeledList.Item>
-      </LabeledList>
-      <DamageReport parts={occupant.parts} fuel={fuel} cabling={cabling} act={act} />
-      <OccupantUpgradeDisplay
-        upgrades={occupant.upgrades}
-        upgrades_max={occupant.upgrades_max}
-        act={act} />
-      <DecorationReport cosmetics={occupant.cosmetics} act={act} />
-      <ClothingReport clothes={occupant.clothing} act={act} />
-    </>);
-};
-const OccupantStatusHuman = (props) => {
-  const { occupant } = props;
-  return (
-    <LabeledList>
-      <LabeledList.Item label="Converting">
-        <ProgressBar
-          value={(occupant.max_health - occupant.health) / occupant.max_health}
-          ranges={{
-            good: [0.5, Infinity],
-            average: [0.25, 0.5],
-            bad: [-Infinity, 0.25],
-          }}
-        >
-          {Math.floor((occupant.max_health - occupant.health) / occupant.max_health*100)}%
-        </ProgressBar>
-      </LabeledList.Item>
-    </LabeledList>
-  );
 
-};
-const OccupantStatusEyebot = (props) => {
-  const { occupant } = props;
-  return (
-    <LabeledList>
-      <LabeledList.Item label={occupant.cell.name}><CellChargeBar cellData={occupant.cell} /></LabeledList.Item>
-    </LabeledList>
-  );
-};
-const OccupantType = (props) => {
-  const { kind, user } = props;
-  switch (kind) {
-    case "robot":
-      if (user === "brain") return <>Mk.2-Type Cyborg</>;
-      if (user === "ai") return <>Mk.2-Type AI Shell</>;
-      break;
-    case "human":
-      return <>Mk.2-Type Carbon</>;
-    case "eyebot":
-      return <>Mk.1-Type Eyebot</>;
-    default:
-      return <>Unknown type</>;
-  }
-};
-const ClothingReport = (props) => {
-  const { clothes, act } = props;
-  return (
-    <Section title="Clothing">
-      {
-        clothes.length > 0
-          ?(
-            clothes.map(cloth => {
-              return (
-                <Box key={cloth.ref}>
-                  {cloth.name} <DockingAllowedButton onClick={() => act("clothing-remove", { clothingRef: cloth.ref })} icon="minus-circle" color="transparent" tooltip="Remove from occupant" />
-                </Box>
-              );
-            })
-          )
-          :(
-            <Box>No Clothing</Box>
-          )
-      }
-    </Section>
-  );
-};
-const DecorationReport = (props) => {
-  const { cosmetics, act } = props;
-  return (
-    <Section title="Decoration">
-      <LabeledList>
-        <LabeledList.Item label="Head" buttons={
-          <DockingAllowedButton icon="sync-alt" tooltip="Change head decoration" onClick={() => act("cosmetic-change-head")} />
-        }>
-          {cosmetics.head || "None"}
-        </LabeledList.Item>
-        <LabeledList.Item label="Chest" buttons={
-          <DockingAllowedButton icon="sync-alt" tooltip="Change chest decoration" onClick={() => act("cosmetic-change-chest")} />
-        }>
-          {cosmetics.chest || "None"}
-        </LabeledList.Item>
-        <LabeledList.Item label="Arms" buttons={
-          <DockingAllowedButton icon="sync-alt" tooltip="Change arms decoration" onClick={() => act("cosmetic-change-arms")} />
-        }>{cosmetics.arms || "None"}
-        </LabeledList.Item>
-        <LabeledList.Item label="Legs" buttons={
-          <DockingAllowedButton icon="sync-alt" tooltip="Change legs decoration" onClick={() => act("cosmetic-change-legs")} />
-        }>{cosmetics.legs || "None"}
-        </LabeledList.Item>
-        <LabeledList.Item label="Paint" buttons={
-          <>
-            {!cosmetics.paint && <DockingAllowedButton icon="plus" tooltip="Add paint" onClick={() => act("occupant-paint-add")} />}
-            {cosmetics.paint && <DockingAllowedButton icon="tint" tooltip="Change colour" onClick={() => act("occupant-paint-change")} />}
-            {cosmetics.paint && <DockingAllowedButton icon="minus" tooltip="Remove paint" onClick={() => act("occupant-paint-remove")} />}
-          </>
-        }>
-          {cosmetics.paint ? <ColorBox color={cosmetics.paint} /> : "No paint applied"}
-        </LabeledList.Item>
-        <LabeledList.Item label="Eyes" buttons={
-          <DockingAllowedButton icon="tint" tooltip="Change eye glow" onClick={() => act("occupant-fx")} />
-        }>
-          <ColorBox color={"rgb(" + cosmetics.fx[0] + "," + cosmetics.fx[1] + "," + cosmetics.fx[2] + ")"} />
-        </LabeledList.Item>
-      </LabeledList>
-    </Section>
-  );
-};
-const DamageReport = (props) => {
-  const { parts, fuel, cabling, act } = props;
-  return (
-    <Section title="Damage Report" buttons={
-      <>
-        <DockingAllowedButton disabled={fuel < 1} icon="wrench" backgroundColor={COLORS.damageType.brute} tooltip="Fix structural damage" onClick={() => act("repair-fuel")} />
-        <DockingAllowedButton disabled={cabling < 1} icon="fire" backgroundColor={COLORS.damageType.burn} tooltip="Fix wiring damage" onClick={() => act("repair-wiring")} />
-      </>
-    }>
-      <LabeledList>
-        <PartDisplay label="Head" partData={parts.head} />
-        <PartDisplay label="Chest" partData={parts.chest} />
-        <PartDisplay label="Left Arm" partData={parts.arm_l} />
-        <PartDisplay label="Right Arm" partData={parts.arm_r} />
-        <PartDisplay label="Left Leg" partData={parts.leg_l} />
-        <PartDisplay label="Right Leg" partData={parts.leg_r} />
-      </LabeledList>
-    </Section>
-  );
-};
-const PartDisplay = (props) => {
-  const {
-    label, partData,
-  } = props;
-  if (partData.exists === 0) {
-    return <LabeledList.Item color="red" label={label}><Box bold>MISSING!</Box></LabeledList.Item>;
-  } else {
-    const partBluntPercent = Math.floor(partData.dmg_blunt/partData.max_health*100);
-    const partBurnsPercent = Math.floor(partData.dmg_burns/partData.max_health*100);
-    if (partBluntPercent || partBurnsPercent) {
-      return (
-        <LabeledList.Item label={label}>
-          <Flex>
-            <Flex.Item grow={1}>
-              <Flex>
-                <Flex.Item backgroundColor={COLORS.damageType.brute} width={partBluntPercent + "%"} />
-                <Flex.Item backgroundColor={COLORS.damageType.burn} width={partBurnsPercent + "%"} />
-                <Flex.Item grow={1} backgroundColor={"#000000"} stretch >&nbsp;</Flex.Item>
-              </Flex>
-            </Flex.Item>
-            <Flex.Item shrink>
-              <Flex>
-                <Flex.Item shrink width="25px" backgroundColor={"#330000"} color={COLORS.damageType.brute} bold><Box textAlign={"center"}>{partBluntPercent > 0 ? partBluntPercent : "--"}</Box></Flex.Item>
-                <Flex.Item shrink width="25px" backgroundColor={"#331100"} color={COLORS.damageType.burn} bold><Box textAlign={"center"}>{partBurnsPercent > 0 ? partBurnsPercent : "--" }</Box></Flex.Item>
-              </Flex>
-            </Flex.Item>
-          </Flex>
-        </LabeledList.Item>
-      );
-    }
-  }
-};
-const AvailableCellsDisplay = (props) => {
-  const { cells, act } = props;
-  return (
-    <Section title="Power Cells">
-      {
-        cells.length > 0
-          ?(
-            <LabeledList> {
-              cells.map(cell => {
-                return (
-                  <div key={cell.ref}>
-                    <LabeledList.Item label={cell.name}
-                      buttons={
-                        <>
-                          <DockingAllowedButton onClick={() => act("cell-install", { cellRef: cell.ref })} icon="plus" tooltip="Add to occupant" />
-                          <DockingAllowedButton onClick={() => act("cell-eject", { cellRef: cell.ref })} icon="eject" tooltip="Eject from station" />
-                        </>
-                      }
-                    >
-                      <CellChargeBar cellData={cell} />
-                    </LabeledList.Item>
-                  </div>);
-              })
-            }
-            </LabeledList>
-          )
-          :(
-            <Box as="div">None Stored</Box>
-          )
+interface DisabledDisplayReasonProps {
+  allowSelfService: boolean;
+  viewerIsOccupant: boolean;
+  viewerIsRobot: boolean;
+}
 
-      }
-    </Section>);
-};
-const AvailableModulesDisplay = (props) => {
-  const { modules, act } = props;
-  return (
-    <Section title="Modules"> {
-      modules.length > 0
-        ?(
-          modules.map(modu => {
-            return (
-              <div key={modu.ref}>{modu.name}
-                <DockingAllowedButton onClick={() => act("module-install", { moduleRef: modu.ref })} icon="plus-circle" color="transparent" tooltip="Add to occupant" />
-                <DockingAllowedButton onClick={() => act("module-eject", { moduleRef: modu.ref })} icon="eject" color="transparent" tooltip="Eject from station" />
-              </div>
-            );
-          })
-        )
-        :(
-          <Box as="div">None Stored</Box>
-        )
-    }
-    </Section>
-  );
-};
-const AvailableUpgradesDisplay = (props) => {
-  const { upgrades, act } = props;
-  return (
-    <Section title="Upgrades"> {
-      upgrades.length > 0
-        ?(
-          upgrades.map(upgrade => {
-            return (
-              <div key={upgrade.ref}>{upgrade.name}
-                <DockingAllowedButton onClick={() => act("upgrade-install", { upgradeRef: upgrade.ref })} icon="plus-circle" color="transparent" tooltip="Add to occupant" />
-                <DockingAllowedButton onClick={() => act("upgrade-eject", { upgradeRef: upgrade.ref })} icon="eject" color="transparent" tooltip="Eject from station" />
-              </div>
-            );
-          })
-        ) :(
-          <Box as="div">None Stored</Box>
-        )
-    }
-    </Section>
-  );
-};
-const AvailableClothingDisplay = (props) => {
-  const { clothes, act } = props;
-  return (
-    <Section title="Clothing"> {
-      clothes.length > 0
-        ?(
-          clothes.map(cloth => {
-            return (
-              <Box key={cloth.ref}>{cloth.name}
-                <DockingAllowedButton onClick={() => act("clothing-install", { clothingRef: cloth.ref })} icon="plus-circle" color="transparent" tooltip="Add to occupant" />
-                <DockingAllowedButton onClick={() => act("clothing-eject", { clothingRef: cloth.ref })} icon="eject" color="transparent" tooltip="Eject from station" />
-              </Box>
-            );
-          })
-        )
-        :(
-          <Box as="div">None Stored</Box>
-        )
-    }
-    </Section>
-  );
-};
-const OccupantCellDisplay = (props) => {
-  const { cellData, act } = props;
+const DisabledDisplayReason = (props: DisabledDisplayReasonProps) => {
+  const { allowSelfService, viewerIsOccupant, viewerIsRobot } = props;
   return (
-    <LabeledList.Item
-      label="Power Cell"
-      color={cellData ? "white" : "red"}
-      buttons={
-        <DockingAllowedButton
-          onClick={() => act("cell-remove")}
-          icon="minus"
-          tooltip="Remove the occupant's power cell"
-          disabled={cellData ? false : true} />
-      }>
-      { cellData && <CellChargeBar cellData={cellData} />}
-      { !cellData && <Box bold>No Power Cell Installed</Box>}
-    </LabeledList.Item>
-  );
-};
-const CellChargeBar = (props) => {
-  const { cellData } = props;
-  const charge = cellData.current / cellData.max;
-  return (
-    <Tooltip
-      position="bottom"
-      content={Math.floor(cellData.current) + "/" + cellData.max}
-    >
-      <ProgressBar
-        position="relative"
-        value={charge}
-        ranges={{ good: [0.5, Infinity], average: [0.25, 0.5],
-          bad: [-Infinity, 0.25] }}>
-        {
-          Math.floor(charge*100)
-        }%
-      </ProgressBar>
-    </Tooltip>
+    <>
+      <Box backgroundColor="#773333" p="5px" mb="5px" bold textAlign="center">
+        {(viewerIsRobot && !viewerIsOccupant && 'You must be inside the docking station to use the functions.') || ''}
+        {(viewerIsOccupant && !viewerIsRobot && 'Non-cyborgs cannot use the docking station functions.') || ''}
+        {(viewerIsOccupant && !allowSelfService && 'Self-service has been disabled at this station.') || ''}
+      </Box>
+      <Divider />
+    </>
   );
 };
-const OccupantUpgradeDisplay = (props) => {
-  const { upgrades, upgrades_max, act } = props;
-  const upgrade_count = "Upgrades (" + upgrades.length + " / " + upgrades_max + " installed)";
-  return (
-    <Section title={upgrade_count}>
-      <div>
-        {
-          upgrades.map(upgrade => {
-            return (
-              <Stack key={upgrade.ref}>
-                <Stack.Item>{upgrade.name}</Stack.Item>
-                <Stack.Item>
-                  <DockingAllowedButton
-                    compact
-                    icon="minus-circle"
-                    color="transparent"
-                    tooltip={`Remove ${upgrade.name}`}
-                    onClick={() => act("upgrade-remove", { upgradeRef: upgrade.ref })}
-                  />
-                </Stack.Item>
-              </Stack>
-            );
-          })
-        }
-      </div>
-    </Section>);
-};
-const DockingTabView = (props) => {
-  const { tabIndex, data, act } = props;
-  switch (tabIndex) {
-    case 1:
-      return (
-        <OccupantTab occupant={data.occupant} cabling={data.cabling} fuel={data.fuel} act={act} />
-      );
-    case 2:
-      return (
-        <Section title="Supplies">
-          <LabeledList>
-            <LabeledList.Item label="Welding Fuel">
-              {data.fuel}
-            </LabeledList.Item>
-            <LabeledList.Item label="Wire Cabling">
-              {data.cabling}
-            </LabeledList.Item>
-            <LabeledList.Item label="Self Service">
-              <Button.Checkbox tooltip="Toggle self-service." checked={data.allow_self_service} disabled={data.viewer_is_robot} onClick={() => act("self-service")} /> { data.allow_self_service ? "Enabled" : "Disabled"}
-            </LabeledList.Item>
-          </LabeledList>
-          <AvailableModulesDisplay modules={data.modules} act={act} />
-          <AvailableUpgradesDisplay upgrades={data.upgrades} act={act} />
-          <AvailableCellsDisplay cells={data.cells} act={act} />
-          <AvailableClothingDisplay clothes={data.clothes} act={act} />
-        </Section>);
-  }
-};
diff --git a/tgui/packages/tgui/interfaces/CyborgDockingStation/type.ts b/tgui/packages/tgui/interfaces/CyborgDockingStation/type.ts
index eb39570e63ad6..068e0ff325655 100644
--- a/tgui/packages/tgui/interfaces/CyborgDockingStation/type.ts
+++ b/tgui/packages/tgui/interfaces/CyborgDockingStation/type.ts
@@ -2,96 +2,110 @@
  * @file
  * @copyright 2022
  * @author glowbold (https://github.com/pgmzeta)
+ * @author Mordent (https://github.com/mordent-goonstation)
  * @license ISC
  */
 
+import { BooleanLike } from 'common/react';
+
+type FalsyBooleanLike = false | 0 | null | undefined;
+type TruthyBooleanLike = true | 1;
+
 export interface CyborgDockingStationData {
-  occupant?: OccupantData,
+  occupant?: OccupantData;
 
-  disabled: boolean;
-  viewer_is_occupant: boolean;
-  viewer_is_robot: boolean;
-  allow_self_service: boolean,
-  conversion_chamber: boolean,
+  disabled: BooleanLike;
+  viewer_is_occupant: BooleanLike;
+  viewer_is_robot: BooleanLike;
+  allow_self_service: BooleanLike;
+  conversion_chamber: BooleanLike;
 
-  cabling: number,
-  fuel: number,
+  cabling: number;
+  fuel: number;
 
-  cells?: Array<PowerCellData>,
-  modules?: Array<ModuleData>,
-  upgrades?: Array<UpgradeData>,
-  clothes?: Array<ClothingData>,
+  cells: PowerCellData[];
+  modules: ModuleData[];
+  upgrades: UpgradeData[];
+  clothes: ClothingData[];
 }
 
-interface OccupantData {
-  name: string,
-  kind: string,
+interface OccupantDataBase {
+  name: string;
+  kind: 'eyebot' | 'human' | 'robot';
 }
 
-interface OccupantDataRobot extends OccupantData {
-  parts?: PartListData,
-  cell?: PowerCellData,
-  module?: string,
-  upgrades?: Array<string>,
-  upgrades_max?: number,
-  clothing?: Array<string>,
-  cosmetics?: CyborgCosmeticsData,
+export interface OccupantDataRobot extends OccupantDataBase {
+  kind: 'robot';
+  parts: PartListData;
+  cell?: PowerCellData;
+  moduleName?: string;
+  upgrades: UpgradeData[];
+  upgrades_max: number;
+  clothing: ClothingData[];
+  cosmetics: RobotCosmeticsData;
+  user: 'brain' | 'ai' | 'unknown';
 }
 
-interface OccupantDataHuman extends OccupantData {
-  health: number,
-  max_health: number,
+export interface OccupantDataHuman extends OccupantDataBase {
+  kind: 'human';
+  health: number;
+  max_health: number;
 }
 
-interface OccupantDataEyebot extends OccupantData {
-  health: number,
-  max_health: number,
-  cell?: PowerCellData,
+export interface OccupantDataEyebot extends OccupantDataBase {
+  kind: 'eyebot';
+  cell: PowerCellData;
 }
 
-interface PartListData {
-  head: PartData,
-  chest: PartData,
-  arm_l: PartData,
-  arm_r: PartData,
-  leg_l: PartData,
-  leg_r: PartData,
+export type OccupantData = OccupantDataEyebot | OccupantDataHuman | OccupantDataRobot;
+
+export interface PartListData {
+  head: PartData;
+  chest: PartData;
+  arm_l: PartData;
+  arm_r: PartData;
+  leg_l: PartData;
+  leg_r: PartData;
 }
 
-interface PartData {
-  exists: boolean,
-  max_health: number
-  dmg_blunt: number,
-  dmg_burn: number,
+interface BasePartData {
+  exists: BooleanLike;
 }
 
-interface PowerCellData {
-  name: string,
-  ref: string,
-  current: number,
-  max: number,
+interface MissingPartData extends BasePartData {
+  exists: FalsyBooleanLike;
 }
 
-interface ModuleData {
-  name: string,
-  ref: string,
+interface PresentPartData extends BasePartData {
+  exists: TruthyBooleanLike;
+  max_health: number;
+  dmg_blunt: number;
+  dmg_burns: number;
 }
 
-interface UpgradeData {
-  name: string,
-  ref: string,
+export type PartData = MissingPartData | PresentPartData;
+
+export const isPresentPartsData = (partData: PartData): partData is PresentPartData => !!partData.exists;
+
+export interface ItemData {
+  name: string;
+  ref: string;
 }
 
-interface ClothingData {
-  name: string,
-  ref: string,
+export interface PowerCellData extends ItemData {
+  current: number;
+  max: number;
 }
 
-interface CyborgCosmeticsData {
-  chest: string,
-  head: string,
-  arms: string,
-  legs: string,
-  paint: string, // hex colour rep
-  fx: Array<number>, // R,G,B rep
+export interface ModuleData extends ItemData {}
+export interface UpgradeData extends ItemData {}
+export interface ClothingData extends ItemData {}
+
+export interface RobotCosmeticsData {
+  chest?: string;
+  head?: string;
+  arms?: string;
+  legs?: string;
+  paint?: string; // hex colour rep
+  fx: [number, number, number]; // R,G,B rep
 }
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/ModuleDetail.tsx b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/ModuleDetail.tsx
index 36c26608d928d..0c06c8720259d 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/ModuleDetail.tsx
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/ModuleDetail.tsx
@@ -14,47 +14,50 @@ const resetOptions = [
   {
     id: 'brobocop',
     name: 'Brobocop',
-  }, {
+  },
+  {
     id: 'science',
     name: 'Science',
-  }, {
+  },
+  {
     id: 'civilian',
     name: 'Civilian',
-  }, {
+  },
+  {
     id: 'engineering',
     name: 'Engineering',
-  }, {
+  },
+  {
     id: 'medical',
     name: 'Medical',
-  }, {
+  },
+  {
     id: 'mining',
     name: 'Mining',
   },
 ];
 
 interface ModuleProps {
-  onMoveToolDown: (toolRef: string) => void,
-  onMoveToolUp: (toolRef: string) => void,
-  onRemoveTool: (toolRef: string) => void,
-  onResetModule: (moduleId: string) => void,
-  tools: ToolData[],
+  onMoveToolDown: (itemRef: string) => void;
+  onMoveToolUp: (itemRef: string) => void;
+  onRemoveTool: (itemRef: string) => void;
+  onResetModule: (moduleId: string) => void;
+  tools: ToolData[];
 }
 
 export const ModuleDetail = (props: ModuleProps, context) => {
-  const {
-    onMoveToolDown,
-    onMoveToolUp,
-    onRemoveTool,
-    onResetModule,
-    tools,
-  } = props;
-  const [selectedToolRef, setSelectedToolRef] = useLocalState<string | undefined>(context, 'selectedToolRef', undefined);
-  const handleRemoveTool = (toolRef: string) => {
-    const toolIndex = tools.findIndex(tool => tool.ref === toolRef);
-    setSelectedToolRef(tools[toolIndex + 1]?.ref);
-    onRemoveTool(toolRef);
+  const { onMoveToolDown, onMoveToolUp, onRemoveTool, onResetModule, tools } = props;
+  const [selectedToolRef, setSelectedToolRef] = useLocalState<string | undefined>(
+    context,
+    'selectedToolRef',
+    undefined
+  );
+  const handleRemoveTool = (itemRef: string) => {
+    const toolIndex = tools.findIndex((tool) => tool.item_ref === itemRef);
+    setSelectedToolRef(tools[toolIndex + 1]?.item_ref);
+    onRemoveTool(itemRef);
   };
-  const resolvedSelectedToolRef = selectedToolRef && tools.find(tool => tool.ref === selectedToolRef)?.ref;
+  const resolvedSelectedToolRef = selectedToolRef && tools.find((tool) => tool.item_ref === selectedToolRef)?.item_ref;
   if (selectedToolRef && !resolvedSelectedToolRef) {
     setSelectedToolRef(undefined);
   }
@@ -70,23 +73,14 @@ export const ModuleDetail = (props: ModuleProps, context) => {
     <Stack vertical fill>
       <Stack.Item>
         <Section title="Reset">
-          {
-            resetOptions.map(resetOption => {
-              const {
-                id,
-                name,
-              } = resetOption;
-              return (
-                <Button
-                  key={id}
-                  onClick={() => onResetModule(id)}
-                  title={name}
-                >
-                  {name}
-                </Button>
-              );
-            })
-          }
+          {resetOptions.map((resetOption) => {
+            const { id, name } = resetOption;
+            return (
+              <Button key={id} onClick={() => onResetModule(id)} title={name}>
+                {name}
+              </Button>
+            );
+          })}
         </Section>
       </Stack.Item>
       <Stack.Item grow>
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/Tools.tsx b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/Tools.tsx
index ab9d82ecaa776..cdb001fcbd0bf 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/Tools.tsx
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/Tools.tsx
@@ -16,46 +16,31 @@ interface ToolProps {
 }
 
 const Tool: SFC<ToolProps> = (props) => {
-  const {
-    children,
-    onClick,
-    selected,
-  } = props;
+  const { children, onClick, selected } = props;
   return (
-    <Tabs.Tab onClick={onClick} selected={selected} >
+    <Tabs.Tab onClick={onClick} selected={selected}>
       {children}
     </Tabs.Tab>
   );
 };
 
 interface ToolsProps {
-  onSelectTool: (toolRef: string) => void;
+  onSelectTool: (itemRef: string) => void;
   selectedToolRef: string | undefined;
   tools: ToolData[] | undefined;
 }
 
 export const Tools = (props: ToolsProps) => {
-  const {
-    onSelectTool,
-    selectedToolRef,
-    tools = [],
-  } = props;
+  const { onSelectTool, selectedToolRef, tools = [] } = props;
   if (tools.length === 0) {
     return <EmptyPlaceholder>Module has no tools</EmptyPlaceholder>;
   }
   return (
     <Tabs vertical>
-      {tools.map(tool => {
-        const {
-          name,
-          ref: toolRef,
-        } = tool;
+      {tools.map((tool) => {
+        const { name, item_ref: itemRef } = tool;
         return (
-          <Tool
-            key={toolRef}
-            onClick={() => onSelectTool(toolRef)}
-            selected={toolRef === selectedToolRef}
-          >
+          <Tool key={itemRef} onClick={() => onSelectTool(itemRef)} selected={itemRef === selectedToolRef}>
             {name}
           </Tool>
         );
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/index.tsx b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/index.tsx
index bbed0268999ba..dce9a7d03e1bd 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/index.tsx
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/ModuleView/index.tsx
@@ -15,21 +15,18 @@ import { ModulesData } from '../type';
 const ModuleListWidth = 20;
 
 interface ModuleViewProps {
-  modules: ModulesData,
-  onEjectModule: (moduleRef: string) => void,
-  onMoveToolDown: (moduleRef: string, toolRef: string) => void,
-  onMoveToolUp: (moduleRef: string, toolRef: string) => void,
-  onRemoveTool: (moduleRef: string, toolRef: string) => void,
-  onResetModule: (moduleRef: string, moduleId: string) => void,
-  onSelectModule: (moduleRef: string) => void,
+  modules: ModulesData;
+  onEjectModule: (itemRef: string) => void;
+  onMoveToolDown: (itemRef: string) => void;
+  onMoveToolUp: (itemRef: string) => void;
+  onRemoveTool: (itemRef: string) => void;
+  onResetModule: (moduleId: string) => void;
+  onSelectModule: (itemRef: string) => void;
 }
 
 export const ModuleView = (props: ModuleViewProps) => {
   const {
-    modules: {
-      available = [],
-      selected,
-    } = {},
+    modules: { available = [], selected } = {},
     onEjectModule,
     onMoveToolDown,
     onMoveToolUp,
@@ -37,15 +34,7 @@ export const ModuleView = (props: ModuleViewProps) => {
     onResetModule,
     onSelectModule,
   } = props;
-  const {
-    ref: selectedModuleRef,
-    tools = [],
-  } = selected || {};
-
-  const handleMoveToolDown = (toolRef: string) => onMoveToolDown(selectedModuleRef, toolRef);
-  const handleMoveToolUp = (toolRef: string) => onMoveToolUp(selectedModuleRef, toolRef);
-  const handleRemoveTool = (toolRef: string) => onRemoveTool(selectedModuleRef, toolRef);
-  const handleResetModule = (moduleId: string) => onResetModule(selectedModuleRef, moduleId);
+  const { item_ref: selectedModuleRef, tools = [] } = selected || {};
 
   if (available.length === 0) {
     return (
@@ -59,53 +48,43 @@ export const ModuleView = (props: ModuleViewProps) => {
       <Stack.Item width={ModuleListWidth}>
         <Section title="Modules" scrollable fill>
           <Tabs vertical>
-            {
-              available.map(module => {
-                const {
-                  ref: moduleRef,
-                  name,
-                } = module;
-                const ejectButton = (
-                  <Button
-                    icon="eject"
-                    color="transparent"
-                    onClick={() => onEjectModule(moduleRef)}
-                    title={`Eject ${name}`}
-                  />
-                );
-                return (
-                  <Tabs.Tab
-                    key={moduleRef}
-                    onClick={() => onSelectModule(moduleRef)}
-                    rightSlot={ejectButton}
-                    selected={moduleRef === selectedModuleRef}
-                  >
-                    {name}
-                  </Tabs.Tab>
-                );
-              })
-            }
+            {available.map((module) => {
+              const { item_ref: itemRef, name } = module;
+              const ejectButton = (
+                <Button
+                  icon="eject"
+                  color="transparent"
+                  onClick={() => onEjectModule(itemRef)}
+                  title={`Eject ${name}`}
+                />
+              );
+              return (
+                <Tabs.Tab
+                  key={itemRef}
+                  onClick={() => onSelectModule(itemRef)}
+                  rightSlot={ejectButton}
+                  selected={itemRef === selectedModuleRef}>
+                  {name}
+                </Tabs.Tab>
+              );
+            })}
           </Tabs>
         </Section>
       </Stack.Item>
       <Stack.Item grow>
-        {
-          selectedModuleRef
-            ? (
-              <ModuleDetail
-                onMoveToolDown={handleMoveToolDown}
-                onMoveToolUp={handleMoveToolUp}
-                onRemoveTool={handleRemoveTool}
-                onResetModule={handleResetModule}
-                tools={tools}
-              />
-            )
-            : (
-              <Section fill>
-                <EmptyPlaceholder>No module selected</EmptyPlaceholder>
-              </Section>
-            )
-        }
+        {selectedModuleRef ? (
+          <ModuleDetail
+            onMoveToolDown={onMoveToolDown}
+            onMoveToolUp={onMoveToolUp}
+            onRemoveTool={onRemoveTool}
+            onResetModule={onResetModule}
+            tools={tools}
+          />
+        ) : (
+          <Section fill>
+            <EmptyPlaceholder>No module selected</EmptyPlaceholder>
+          </Section>
+        )}
       </Stack.Item>
     </Stack>
   );
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/action.ts b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/action.ts
index 5af25f064676a..9006662394087 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/action.ts
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/action.ts
@@ -5,9 +5,9 @@
  * @license ISC
  */
 
-import {
+import { Action } from './type';
+import type {
   Act,
-  Action,
   ModuleActionPayload,
   MoveToolActionPayload,
   ResetModuleActionPayload,
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/index.tsx b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/index.tsx
index 6d18294822f80..c179cee3626b0 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/index.tsx
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/index.tsx
@@ -10,38 +10,30 @@ import { Window } from '../../layouts';
 import { ModuleView } from './ModuleView';
 import { ejectModule, moveTool, removeTool, resetModule, selectModule } from './action';
 import * as styles from './style';
-import { CyborgModuleRewriterData, Direction } from './type';
+import { Direction } from './type';
+import type { CyborgModuleRewriterData } from './type';
 
-export const CyborgModuleRewriter = (_props, context) => {
+export const CyborgModuleRewriter = (_props: unknown, context) => {
   const { act, data } = useBackend<CyborgModuleRewriterData>(context);
   const { modules } = data;
 
-  const handleEjectModule = (moduleRef: string) => ejectModule(act, { moduleRef });
-  const handleMoveToolDown = (moduleRef: string, toolRef: string) => moveTool(act, {
-    dir: Direction.Down,
-    moduleRef,
-    toolRef,
-  });
-  const handleMoveToolUp = (moduleRef: string, toolRef: string) => moveTool(act, {
-    dir: Direction.Up,
-    moduleRef,
-    toolRef,
-  });
-  const handleRemoveTool = (moduleRef: string, toolRef: string) => removeTool(act, {
-    moduleRef,
-    toolRef,
-  });
-  const handleResetModule = (moduleRef: string, moduleId: string) => resetModule(act, {
-    moduleId,
-    moduleRef,
-  });
-  const handleSelectModule = (moduleRef: string) => selectModule(act, { moduleRef });
+  const handleEjectModule = (itemRef: string) => ejectModule(act, { itemRef });
+  const handleMoveToolDown = (itemRef: string) =>
+    moveTool(act, {
+      dir: Direction.Down,
+      itemRef,
+    });
+  const handleMoveToolUp = (itemRef: string) =>
+    moveTool(act, {
+      dir: Direction.Up,
+      itemRef,
+    });
+  const handleRemoveTool = (itemRef: string) => removeTool(act, { itemRef });
+  const handleResetModule = (moduleId: string) => resetModule(act, { moduleId });
+  const handleSelectModule = (itemRef: string) => selectModule(act, { itemRef });
 
   return (
-    <Window
-      width={670}
-      height={640}
-    >
+    <Window width={670} height={640}>
       <Window.Content className={styles.Block}>
         <ModuleView
           modules={modules}
diff --git a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/type.ts b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/type.ts
index 5b7fded2f6994..b35aa157d2155 100644
--- a/tgui/packages/tgui/interfaces/CyborgModuleRewriter/type.ts
+++ b/tgui/packages/tgui/interfaces/CyborgModuleRewriter/type.ts
@@ -6,27 +6,27 @@
  */
 
 export interface CyborgModuleRewriterData {
-  modules: ModulesData,
+  modules: ModulesData;
 }
 
 interface AvailableModule {
-  name: string,
-  ref: string,
+  name: string;
+  item_ref: string;
 }
 
 interface SelectedModule {
-  ref: string,
-  tools: Array<ToolData>,
+  item_ref: string;
+  tools: Array<ToolData>;
 }
 
 export interface ModulesData {
-  available: Array<AvailableModule>,
-  selected: SelectedModule,
+  available: Array<AvailableModule>;
+  selected: SelectedModule;
 }
 
 export interface ToolData {
-  name: string,
-  ref: string,
+  name: string;
+  item_ref: string;
 }
 
 export enum Action {
@@ -42,20 +42,20 @@ export enum Direction {
   Down = 'down',
 }
 
-export type Act = (action: string, payload?: object) => void
+export type Act = (action: string, payload?: object) => void;
 
-export interface ModuleActionPayload {
-  moduleRef: string,
+interface ItemActionPayload {
+  itemRef: string;
 }
 
-export interface ToolActionPayload extends ModuleActionPayload {
-  toolRef: string,
-}
+export interface ModuleActionPayload extends ItemActionPayload {}
+
+export interface ToolActionPayload extends ItemActionPayload {}
 
 export interface MoveToolActionPayload extends ToolActionPayload {
-  dir: Direction,
+  dir: Direction;
 }
 
-export interface ResetModuleActionPayload extends ModuleActionPayload {
-  moduleId: string,
+export interface ResetModuleActionPayload {
+  moduleId: string;
 }
diff --git a/tgui/packages/tgui/interfaces/MixerMachine.js b/tgui/packages/tgui/interfaces/MixerMachine.js
new file mode 100644
index 0000000000000..595816b9c2b56
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MixerMachine.js
@@ -0,0 +1,92 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author mloccy (https://github.com/mloccy)
+ * @license ISC
+ */
+
+import { useBackend } from '../backend';
+import { Box, Button, Flex, Image, Section, Stack } from '../components';
+import { Window } from '../layouts';
+
+export const MixerItem = (props, context) => {
+  const { act } = useBackend(context);
+
+  const { mixerItem, working } = props;
+
+  return (
+    <Flex>
+      <Image
+        verticalAlign="middle"
+        height="24px"
+        width="24px"
+        src={`data:image/png;base64,${mixerItem.iconData}`} />
+      <Button
+        nowrap
+        icon="eject"
+        color="blue"
+        title={"Eject " + mixerItem.name}
+        textAlign="center"
+        disabled={working}
+        onClick={() => act("eject", { index: mixerItem.index })} />
+
+      <Box nowrap
+        as="span"
+        key={mixerItem.index}
+        m="0.25rem"
+        textAlign="center">
+        {mixerItem.name}
+      </Box>
+    </Flex>
+  );
+};
+
+export const MixerMachine = (props, context) => {
+  const { data, act } = useBackend(context);
+  const items = data.mixerContents;
+  return (
+    <Window
+      title="Kitchen Helper"
+      width={500}
+      height={220}>
+      <Window.Content >
+        <Stack m="0.25rem" vertical fill>
+
+          <Stack.Item grow={1}>
+            {
+              <Section fill title={"Contents: (" + items.length + "/" + data.maxItems + ")"}>
+                {
+                  (items.length > 0)
+                    ? items.map(item => (<MixerItem key={item.index} mixerItem={item} working={data.working} />))
+                    :"No contents in mixer"
+                }
+              </Section>
+            }
+          </Stack.Item>
+
+          <Stack.Item m=".25rem">
+            <Button
+              mt="0.5rem"
+              backgroundColor="green"
+              icon="check"
+              title={"Start Mixing"}
+              textAlign="center"
+              disabled={data.working || items.length === 0}
+              onClick={() => act("mix", {})}>Mix
+            </Button>
+
+            <Button
+              backgroundColor="blue"
+              icon="eject"
+              title={"Eject All"}
+              textAlign="center"
+              disabled={data.working || items.length === 0}
+              onClick={() => act("ejectAll", {})}>Eject All
+            </Button>
+          </Stack.Item>
+        </Stack>
+
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/PollBallot.js b/tgui/packages/tgui/interfaces/PollBallot.js
new file mode 100644
index 0000000000000..9212454a1617e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PollBallot.js
@@ -0,0 +1,183 @@
+import { useBackend } from '../backend';
+import { Button, ProgressBar, Section, Stack } from '../components';
+import { Window } from '../layouts';
+
+const getServerButtonType = (servers) => {
+  if (servers.includes("global")) {
+    return { tooltip: "Global Poll", icon: "globe" };
+  } else if (servers.includes("rp_only")) {
+    return { tooltip: "RP Only Poll", icon: "masks-theater" };
+  }
+  return { tooltip: "Local Poll", icon: "location-dot" };
+};
+
+const PollControls = ({ isAdmin, act, pollId, isExpired, multipleChoice, expiryDate, servers }) => {
+  const serverButtonProps = getServerButtonType(servers);
+  return (
+    <Stack>
+      <Stack.Item>
+        {multipleChoice ? (
+          <Button
+            tooltip="Multiple Choice"
+            tooltipPosition="top"
+            icon="list-check"
+          />
+        ) : null}
+        <Button
+          tooltip={serverButtonProps.tooltip}
+          tooltipPosition="top"
+          icon={serverButtonProps.icon}
+          onClick={() => act('editServers', { pollId })}
+        />
+        <Button
+          tooltip={expiryDate ? expiryDate : "No Expiration Date"}
+          tooltipPosition="top"
+          color={isExpired ? 'bad' : 'good'}
+          icon={isExpired ? 'lock' : 'lock-open'}
+          onClick={() => act('editExpiration', { pollId })}
+        />
+        {isAdmin ? (
+          <>
+            <Button tooltip="Add Option" tooltipPosition="top" icon="plus" onClick={() => act('addOption', { pollId })} />
+            <Button
+              tooltip="Edit Poll"
+              tooltipPosition="top"
+              icon="pen"
+              onClick={() => act('editPoll', { pollId })}
+            />
+            <Button.Confirm tooltip="Delete Poll" tooltipPosition="top" icon="trash" color="bad" onClick={() => act('deletePoll', { pollId })} />
+          </>
+        ) : null}
+      </Stack.Item>
+    </Stack>
+  );
+};
+
+const OptionControls = ({ isAdmin, act, pollId, optionId }) => {
+  if (!isAdmin) return null;
+  return (
+    <Stack>
+      <Stack.Item>
+        <Button icon="pen" onClick={() => act('editOption', { pollId, optionId })} />
+        <Button.Confirm icon="trash" color="bad" onClick={() => act('deleteOption', { pollId, optionId })} />
+      </Stack.Item>
+    </Stack>
+  );
+};
+
+const Poll = ({ options, total_answers, act, pollId, isAdmin, isExpired, playerId, showVotes }) => {
+  if (!options || options.length === 0) return null;
+  return (
+    <Stack vertical>
+      {options.map((option, index) => (
+        <Stack.Item key={index}>
+          <Stack vertical>
+            <Stack>
+              <Stack.Item grow>
+                <Stack>
+                  <Stack.Item grow>
+                    <Button.Checkbox
+                      disabled={isExpired}
+                      checked={option.answers_player_ids.includes(playerId)}
+                      onClick={() => act('vote', { pollId, optionId: option.id })}
+                    >
+                      {option.option}
+                    </Button.Checkbox>
+                  </Stack.Item>
+                  {showVotes ? (
+                    <Stack.Item align="right">
+                      {`(${option.answers_count} votes)`}
+                    </Stack.Item>
+                  ) : null}
+                </Stack>
+              </Stack.Item>
+              <Stack.Item>
+                <OptionControls
+                  isAdmin={isAdmin}
+                  act={act}
+                  pollId={pollId}
+                  optionId={option.id}
+                />
+              </Stack.Item>
+            </Stack>
+            <Stack.Item>
+              <ProgressBar value={total_answers ? option.answers_count / total_answers : 0} />
+            </Stack.Item>
+          </Stack>
+        </Stack.Item>
+      ))}
+    </Stack>
+  );
+};
+
+export const PollBallot = (props, context) => {
+  const { act, data } = useBackend(context);
+  const { isAdmin, filterInactive, polls, playerId, showVotes } = data;
+
+  return (
+    <Window title="Poll Ballot" width="750" height="800">
+      <Window.Content>
+        <Stack vertical>
+          <Stack.Item>
+            <Stack>
+              <Stack.Item>
+                <Button.Checkbox
+                  checked={filterInactive}
+                  onClick={() => act('toggle-filterInactive')}>Filter Closed Polls
+                </Button.Checkbox>
+              </Stack.Item>
+              <Stack.Item>
+                <Button.Checkbox
+                  checked={showVotes}
+                  onClick={() => act('toggle-showVotes')}>Show Votes
+                </Button.Checkbox>
+              </Stack.Item>
+              {isAdmin ? (
+                <Stack.Item>
+                  <Button onClick={() => act('addPoll')}>Add Poll</Button>
+                </Stack.Item>
+              ) : null}
+            </Stack>
+          </Stack.Item>
+          {
+            polls && polls.filter(poll => {
+              // Check if the poll is expired by comparing the current date to expires_at.
+              const isExpired = poll.expires_at ? new Date() >= new Date(poll.expires_at) : false;
+              // If filterInactive is true, exclude expired polls. Otherwise, include all.
+              return !filterInactive || !isExpired;
+            }).map((poll, index) => (
+              <Stack.Item key={index}>
+                <Section
+                  title={poll.question}
+                  buttons={
+                    <PollControls
+                      isAdmin={isAdmin}
+                      act={act}
+                      pollId={poll.id}
+                      isExpired={poll.expires_at && (new Date() > new Date(poll.expires_at))}
+                      multipleChoice={poll.multiple_choice}
+                      expiryDate={poll.expires_at}
+                      servers={poll.servers}
+                    />
+                  }>
+                  <Stack vertical>
+                    <Poll
+                      options={poll.options}
+                      total_answers={poll.total_answers}
+                      act={act}
+                      pollId={poll.id}
+                      isAdmin={isAdmin}
+                      isExpired={poll.expires_at && (new Date() > new Date(poll.expires_at))}
+                      playerId={playerId}
+                      showVotes={showVotes}
+                    />
+                  </Stack>
+                </Section>
+              </Stack.Item>
+            ))
+          }
+        </Stack>
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/PumpControl/index.tsx b/tgui/packages/tgui/interfaces/PumpControl/index.tsx
new file mode 100644
index 0000000000000..e4569fb90641c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PumpControl/index.tsx
@@ -0,0 +1,128 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC (https://choosealicense.com/licenses/isc/)
+ */
+
+import { useBackend, useLocalState } from '../../backend';
+import { Box, Button, Section, Slider, Stack } from '../../components';
+import { Window } from '../../layouts';
+
+// Responsible for providing information and settings for a pump.
+const PumpSettings = (props:any, context:any) => {
+  const { act } = useBackend<PumpData>(context);
+  const { pump } = props;
+  // Local states allow to keep the appearance of seamless response, but do not cope well with button spamming
+  const [target_output, setOutput] = useLocalState(context, pump.netid+"pressure", pump.target_output);
+  const [power, setPower] = useLocalState(context, pump.netid+"power", "on");
+
+  const setPressure = (newPressure: number) => {
+    setOutput(newPressure);
+    act('setPressure', { netid: pump.netid, pressure: newPressure });
+  };
+  const togglePump = () => {
+    setPower((power === "on") ? "off" : "on");
+    act('togglePump', { netid: pump.netid });
+  };
+
+  return (
+    <Box>
+      <Stack py={1}>
+        <Stack.Item>
+          {pump.tag}
+        </Stack.Item>
+        {
+          <Stack.Item textAlign={"right"} grow={1}>
+            {pump.alive === -1 ? "Establishing Connection..." : "Connected"}
+          </Stack.Item>
+        }
+      </Stack>
+      <Stack>
+        <Stack.Item>
+          <Button
+            width={4}
+            icon="power-off"
+            color={(power === 'on') ? "green" : "red"}
+            onClick={() => togglePump()}>
+            {(power === 'on') ? 'On' : 'Off'}
+          </Button>
+        </Stack.Item>
+        <Stack.Item grow>
+          <Slider
+            disabled={pump.alive !== 1}
+            value={target_output}
+            minValue={pump.min_output}
+            maxValue={pump.max_output}
+            unit={"kPa"}
+            stepPixelSize={0.05}
+            onChange={(_e: any, value: number) => setPressure(value)}
+          />
+        </Stack.Item>
+      </Stack>
+    </Box>
+  );
+};
+
+// Responsible for creating a section for the pumps in an area.
+const PumpArea = (props:any, context:any) => {
+  const { data } = useBackend<AreaList>(context);
+  const { area } = props;
+
+  // Need the keys as a list >:(
+  let pump_controls = [];
+  for (let pump_key in data.area_list[area]) {
+    if (data.area_list[area][pump_key].alive === 0) continue;
+    pump_controls.push(<PumpSettings pump={data.area_list[area][pump_key]} />);
+  }
+  // All pumps were dead
+  if (pump_controls.length === 0) {
+    pump_controls.push(
+      <p>No pumps found for {area}, please refresh and check connection.</p>
+    );
+  }
+
+  return (
+    <Section
+      title={area}
+      textAlign="left"
+      mb={1}
+      style={{
+        "padding": "5px",
+        "padding-top": "1px",
+      }}
+    >
+      {pump_controls}
+    </Section>
+  );
+};
+
+// Main element, responsible for building the window.
+export const PumpControl = (props, context) => {
+  const { act, data } = useBackend<AreaList>(context);
+  const refresh = () => act('refresh');
+
+  // Need this as list >:(
+  let areas = [];
+  for (let area in data.area_list) areas.push(area);
+
+  return (
+    <Window
+      title="Pump Control Computer"
+      width={400}
+      height={500}>
+      <Window.Content scrollable>
+        <Button
+          style={{
+            "margin-bottom": "10px",
+          }}
+          icon="wifi"
+          onClick={() => refresh()}
+        >
+          Requery Pumps
+        </Button>
+        {areas.map((area) => (<PumpArea area={area} key={area} />))}
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/PumpControl/type.ts b/tgui/packages/tgui/interfaces/PumpControl/type.ts
new file mode 100644
index 0000000000000..58f3153f3568d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PumpControl/type.ts
@@ -0,0 +1,25 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC (https://choosealicense.com/licenses/isc/)
+ */
+
+// List of information about a pump
+type PumpData = {
+  tag: string; // Pump name
+  netid: string; // Pump id
+  power: string; // On or off
+  target_output: number; // Current output target of the pump
+  min_output: number;
+  max_output: number;
+  area_name: string; // Name of the area this pump is in
+  processing: boolean; // Whether we are waiting for packet response or not
+  alive: number; // A value of -1, 0, or 1 where -1 is checking if the pump is alive, 0 is dead, and 1 is alive
+}
+
+// List of areas which have pumps
+type AreaList = {
+  area_list: { [key: string] : { [key: string] : PumpData } };
+  frequency: number;
+};
diff --git a/tgui/packages/tgui/interfaces/Radio/index.tsx b/tgui/packages/tgui/interfaces/Radio/index.tsx
index fb8652e75e584..0e8c48fa9f4b2 100644
--- a/tgui/packages/tgui/interfaces/Radio/index.tsx
+++ b/tgui/packages/tgui/interfaces/Radio/index.tsx
@@ -96,7 +96,7 @@ export const Radio = (_props, context) => {
                 )}
                 {!!data.sendButton && (
                   <LabeledList.Item>
-                    <Button align="center" onClick={() => { act("send"); }}>Send signal</Button>
+                    <Button align="center" onClick={() => { act("send"); }} icon="wifi">Send signal</Button>
                   </LabeledList.Item>
                 )}
               </LabeledList>
diff --git a/tgui/packages/tgui/interfaces/SpawnEvent.js b/tgui/packages/tgui/interfaces/SpawnEvent.js
index 843e5b66f680e..7ff8e391ae7d3 100644
--- a/tgui/packages/tgui/interfaces/SpawnEvent.js
+++ b/tgui/packages/tgui/interfaces/SpawnEvent.js
@@ -52,6 +52,13 @@ export const SpawnEvent = (props, context) => {
               >
                 {(spawn_type === "job") ? thing_name : "Job"}
               </Button>
+              <Button
+                selected={spawn_type === "random_human"}
+                onClick={() => act("set_random_human")}
+                tooltip={"Just a basic random human."}
+              >
+                Random Human
+              </Button>
             </LabeledList.Item>
             <LabeledList.Item label="Accept delay">
               {!!ask_permission && (
diff --git a/tgui/packages/tgui/interfaces/TTV/index.tsx b/tgui/packages/tgui/interfaces/TTV/index.tsx
new file mode 100644
index 0000000000000..76f9e4b379092
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/TTV/index.tsx
@@ -0,0 +1,94 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC
+ */
+
+import { useBackend } from '../../backend';
+import { Button, LabeledList, RoundGauge, Section, Stack } from '../../components';
+import { Window } from '../../layouts';
+import { toTitleCase } from 'common/string';
+import { formatPressure } from '../../format';
+
+export const TankInfo = (_props, context) => {
+  const { act } = useBackend(context);
+  const { tank, tankNum } = _props;
+  let button_eject = <Button width={5} textAlign={"center"} disabled={tank.name===null} icon="eject" onClick={() => act(tankNum === 1 ? "remove_tank_one" : "remove_tank_two")}>Eject</Button>;
+  let button_add = <Button width={5} textAlign={"center"} icon="add" onClick={() => act("add_item", { "tank": tankNum })}>Add</Button>;
+  let maxPressure = (tank.maxPressure !== null) ? tank.maxPressure : 999;
+  return (
+    <Section
+      title={tankNum === 1 ? "Tank One" : "Tank Two"}
+      buttons={tank.name !== null ? button_eject : button_add}
+      style={{
+        "height": "100%",
+      }}
+    >
+      <LabeledList>
+        <LabeledList.Item label={"Holding"}>
+          {tank.name !== null ? toTitleCase(tank.name) : "None"}
+        </LabeledList.Item>
+        <LabeledList.Item
+          label="Pressure">
+          <RoundGauge
+            size={1.75}
+            value={tank.pressure !== null ? tank.pressure : 0}
+            minValue={0}
+            maxValue={maxPressure}
+            alertAfter={maxPressure * 0.70}
+            ranges={{
+              "good": [0, maxPressure * 0.70],
+              "average": [maxPressure * 0.70, maxPressure * 0.85],
+              "bad": [maxPressure * 0.85, maxPressure],
+            }}
+            format={formatPressure}
+          />
+        </LabeledList.Item>
+      </LabeledList>
+    </Section>
+  );
+};
+
+export const TTV = (_props, context) => {
+  const { act, data } = useBackend<TransferValveParams>(context);
+  const {
+    opened,
+    tank_one,
+    tank_two,
+  } = data;
+  return (
+    <Window width={650} height={170}>
+      <Window.Content>
+        <Stack>
+          <Stack.Item>
+            <TankInfo tank={tank_one} tankNum={1} />
+          </Stack.Item>
+
+          <Stack.Item>
+            <Section title="Valve" px={1}>
+              <Stack vertical textAlign="center">
+                <Stack.Item color={opened ? "red" : "green"}>
+                  Valve is {opened ? "open" : "closed"}
+                </Stack.Item>
+                <Stack.Item>
+                  <Button icon="repeat" onClick={() => act("toggle_valve")}>
+                    Toggle Valve
+                  </Button>
+                </Stack.Item>
+                <Stack.Item>
+                  {(data.device === '') ? "No Device " : ''}
+                  {(data.device === '') ? <Button icon="add" onClick={() => act("add_item")}>Add</Button>
+                    : <><Button onClick={() => act("interact_device")}>{data.device}</Button><Button icon="eject" onClick={() => act("remove_device")}>Eject</Button></>}
+                </Stack.Item>
+              </Stack>
+            </Section>
+          </Stack.Item>
+          <Stack.Item>
+            <TankInfo tank={tank_two} tankNum={2} />
+          </Stack.Item>
+        </Stack>
+      </Window.Content>
+    </Window>
+  );
+};
diff --git a/tgui/packages/tgui/interfaces/TTV/type.ts b/tgui/packages/tgui/interfaces/TTV/type.ts
new file mode 100644
index 0000000000000..acf24712795e8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/TTV/type.ts
@@ -0,0 +1,20 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author Romayne (https://github.com/MeggalBozale)
+ * @license ISC
+ */
+
+interface TransferValveParams {
+  opened: boolean;
+  tank_one: TankData;
+  tank_two: TankData;
+  device: string;
+}
+
+interface TankData {
+  name: string;
+  num: number;
+  pressure: number;
+  maxPressure: number;
+}
diff --git a/tgui/packages/tgui/interfaces/Wizard_Spellbook.js b/tgui/packages/tgui/interfaces/Wizard_Spellbook.js
new file mode 100644
index 0000000000000..7ed300eafd0fd
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Wizard_Spellbook.js
@@ -0,0 +1,153 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author IPingu (https://github.com/IPling)
+ * @license ISC
+ */
+
+import { useBackend, useLocalState, useSharedState } from '../backend';
+import { Box, Button, Collapsible, Dimmer, Divider, Flex, Input, LabeledList, Section, Stack } from '../components';
+import { Window } from '../layouts';
+
+export const Wizard_Spellbook = (props, context) => {
+  const { data } = useBackend(context);
+  const [searchQuery, setSearchQuery] = useLocalState(context, 'searchQuery', '');
+  const {
+    spellbook_contents,
+    spell_slots,
+    owner_name,
+  } = data;
+
+  let spell_categories = [];
+  for (let spell_category in spellbook_contents) {
+    spell_categories.push(spell_category);
+  }
+
+  return (
+    <Window
+      title={"Wizard Spellbook"}
+      fontSize={2}
+      height={600}
+      width={500}
+    >
+      <Window.Content>
+        <Section title={owner_name+"'s Spellbook "}>
+          <Flex justify={"space-between"}>
+            <Flex.Item>
+              {"Spell slots remaining: "+spell_slots}
+            </Flex.Item>
+            <Flex.Item>
+              <Input
+                value={searchQuery}
+                placeholder={"Search by spell name"}
+                width={15}
+                autoSelect
+                onInput={(_, value) => setSearchQuery(value)}
+              />
+            </Flex.Item>
+          </Flex>
+        </Section>
+      </Window.Content>
+      <Window.Content mt={12} scrollable>
+        <Section>
+          {spell_categories.map((category) => (
+            <SpellCategory category={category} searchQuery={searchQuery} key={category} />
+          ))}
+        </Section>
+      </Window.Content>
+    </Window>
+  );
+};
+
+const SpellCategory = (props, context) => {
+  const { data } = useBackend(context);
+  const { spellbook_contents } = data;
+  const { category, searchQuery } = props;
+
+  let spells = [];
+  for (let spell_name in spellbook_contents[category]) {
+    spells.push(spell_name);
+  }
+
+  return (
+    <Collapsible
+      title={category}
+    >
+      <Stack vertical>
+        <Divider />
+        {spells.filter((spell) => spell.toLowerCase().includes(searchQuery.toLowerCase())).map((spell) => (
+          <Spell spell={spell} category={category} key={spell} />
+        ))}
+      </Stack>
+    </Collapsible>
+  );
+};
+
+const If_Purchased_Text = (purchased, cost, spell_slots) => {
+  if (purchased) {
+    return "Spell purchased";
+  } else if (cost > spell_slots) {
+    return "Not enough spell slots";
+  } else if (cost === 1) {
+    return "Purchase for "+cost+" spell slot";
+  } else {
+    return "Purchase for "+cost+" spell slots";
+  }
+};
+
+const Spell = (props, context) => {
+  const { data, act } = useBackend(context);
+  const {
+    spellbook_contents,
+    spell_slots,
+    vr,
+  } = data;
+  const { spell, category } = props;
+
+  const [purchased, setPurchased] = useSharedState(context, spell+"p", false);
+  let spell_contents = []; // Non-associated list of: desc, cost, cooldown, vr_allowed
+  for (let spell_data in spellbook_contents[category][spell]) {
+    spell_contents.push(spellbook_contents[category][spell][spell_data]);
+  }
+
+  return (
+    <Stack.Item>
+      <Section>
+        {(vr === 1) && (spell_contents[3] === 0) && (
+          <Dimmer>
+            <Box fontSize={1.5} backgroundColor={"#384e68"} p={2}>
+              Spell unavailable in VR
+            </Box>
+          </Dimmer>
+        )}
+        <Section
+          title={spell}
+          buttons={
+            <Flex>
+              <Button
+                backgroundColor={"green"}
+                disabled={spell_slots < spell_contents[1] || purchased}
+                onClick={() => { setPurchased(true); act("buyspell", { spell: spell }); }}
+              >
+                {If_Purchased_Text(purchased, spell_contents[1], spell_slots)}
+              </Button>
+            </Flex>
+          }
+        >
+          <LabeledList>
+            {spell_contents[2] !== null && (
+              <LabeledList.Item label={"Cooldown"}>
+                {spell_contents[2]/10+" seconds"}
+              </LabeledList.Item>
+            )}
+            <LabeledList.Item label={"Description"}>
+              {spell_contents[0]}
+            </LabeledList.Item>
+          </LabeledList>
+        </Section>
+        <Divider />
+      </Section>
+    </Stack.Item>
+  );
+};
+
diff --git a/tgui/packages/tgui/interfaces/space_heater.js b/tgui/packages/tgui/interfaces/space_heater.js
new file mode 100644
index 0000000000000..859db7f4a2ea8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/space_heater.js
@@ -0,0 +1,172 @@
+/**
+ * @file
+ * @copyright 2024
+ * @author IPingu (https://github.com/IPling)
+ * @license ISC
+ */
+
+import { useBackend } from '../backend';
+import { Button, Divider, LabeledList, ProgressBar, Section, Slider, Stack } from '../components';
+import { Window } from '../layouts';
+import { neutralTemperature } from './common/temperatureUtils';
+import { glitch } from './common/stringUtils';
+
+const Glitch_Text = (emagged, string, number) => {
+  if (emagged) {
+    return glitch(string, number);
+  } else {
+    return string;
+  }
+};
+
+const Set_Color = (temperature, generic_color="") => {
+  if (temperature > 400) {
+    return "red";
+  } else if (temperature < 180) {
+    return "blue";
+  } else {
+    return generic_color;
+  }
+};
+
+const Set_Icon = (emagged, temperature, on) => {
+  if (!emagged) { return "eject"; }
+  else if (temperature < 180 && on) { return "snowflake"; } // Under 100 kelvin is supercooling
+  else if (temperature > 400 && on) { return "fire"; } // Over 400 kelvin is overheating
+  else { return "eject"; }
+};
+
+export const space_heater = (props, context) => {
+  const { data } = useBackend(context);
+  const {
+    emagged,
+    on,
+    set_temperature,
+  } = data;
+  return (
+    <Window
+      title={Glitch_Text(emagged, "Space HVAC", 1)}
+      width={350}
+      height={250}>
+      <Window.Content>
+        <BatteryStatus />
+        <TemperatureRegulator />
+      </Window.Content>
+    </Window>
+  );
+};
+
+const BatteryStatus = (props, context) => {
+  const { data, act } = useBackend(context);
+  const {
+    emagged,
+    on,
+    cell,
+    cell_name,
+    cell_charge,
+    set_temperature,
+  } = data;
+  return (
+    <Section title={Glitch_Text(emagged, "Battery status", 2)} grow={0}>
+      <LabeledList>
+        <LabeledList.Item
+          label={Glitch_Text(emagged, "Cell", 1)}
+          verticalAlign={"middle"}
+        >
+          <Button
+            icon={Set_Icon(emagged, set_temperature, on)}
+            color={cell !== null ? Set_Color(set_temperature, "green") : "blue"}
+            onClick={() => cell !== null ? act('cellremove'): act('cellinstall')}
+            bold
+          >
+            {cell !== null ? Glitch_Text(emagged, cell_name, 2): Glitch_Text(emagged, "Insert power cell", 3)}
+          </Button>
+        </LabeledList.Item>
+        <LabeledList.Item
+          label={Glitch_Text(emagged, "Cell Power", 1)}
+          verticalAlign={"middle"}>
+          <ProgressBar
+            grow
+            color={cell !== null ? Set_Color(set_temperature, "green"): "red"}
+            ranges={{
+              "green": [0.5, Infinity],
+              "yellow": [0.1, 0.5],
+              "red": [-Infinity, 0.1],
+            }}
+            value={Math.max(0, [cell !== null ? cell_charge/100 : 0])}
+          />
+        </LabeledList.Item>
+      </LabeledList>
+    </Section>
+  );
+};
+
+const TemperatureRegulator = (props, context) => {
+  const { data, act } = useBackend(context);
+  const {
+    emagged,
+    on,
+    min,
+    max,
+    set_temperature,
+  } = data;
+  return (
+    <Section title={Glitch_Text(emagged, "Temperature regulator", 3)}>
+      <Stack justify="center" align="center">
+        <Stack.Item>
+          <Button
+            icon={"fast-backward"}
+            color={Set_Color(set_temperature)}
+            tooltip={"Set minimum"}
+            disabled={set_temperature === min}
+            onClick={() => act("set_temp", { inputted_temperature: min })} />
+        </Stack.Item>
+        <Stack.Item>
+          <Button
+            icon={"backward"}
+            color={Set_Color(set_temperature)}
+            tooltip={emagged ? "Decrease by 50": "Decrease by 5"}
+            disabled={set_temperature === min}
+            onClick={() => act("set_temp", { temperature_adjust: emagged ? -50: -5 })} />
+        </Stack.Item>
+        <Stack.Item>
+          <Button
+            icon={"equals"}
+            color={Set_Color(set_temperature)}
+            tooltip={"Room temperature"}
+            onClick={() => act("set_temp", { inputted_temperature: neutralTemperature })} />
+        </Stack.Item>
+        <Stack.Item>
+          <Button
+            icon={"forward"}
+            color={Set_Color(set_temperature)}
+            tooltip={emagged ? "Increase by 50": "Increase by 5"}
+            disabled={set_temperature === max}
+            onClick={() => act("set_temp", { temperature_adjust: emagged ? 50: 5 })} />
+        </Stack.Item>
+        <Stack.Item>
+          <Button
+            icon={"fast-forward"}
+            color={Set_Color(set_temperature)}
+            tooltip={"Set maximum"}
+            disabled={set_temperature === max}
+            onClick={() => act("set_temp", { inputted_temperature: max })} />
+        </Stack.Item>
+      </Stack>
+      <Divider />
+      <Slider
+        value={set_temperature}
+        format={value => value+" K"}
+        minValue={min}
+        maxValue={max}
+        step={emagged ? 5: 1}
+        stepPixelSize={emagged ? 3: 1.8}
+        ranges={{
+          "blue": [-Infinity, neutralTemperature-1], // Specifically want neutralTemperature (293.15) to be considered 'warm'
+          "red": [neutralTemperature, Infinity],
+        }}
+        onDrag={(e, value) => act("set_temp", { inputted_temperature: value })}
+      />
+    </Section>
+  );
+};
diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json
index dce92d12485e4..39080b0dbc6ed 100644
--- a/tgui/packages/tgui/package.json
+++ b/tgui/packages/tgui/package.json
@@ -6,6 +6,7 @@
     "@popperjs/core": "^2.9.3",
     "common": "workspace:*",
     "dateformat": "^4.5.1",
+    "dayjs": "^1.11.10",
     "dompurify": "^2.3.1",
     "inferno": "^7.4.8",
     "inferno-vnode-flags": "^7.4.8",
diff --git a/tgui/packages/tgui/styles/interfaces/BanPanel.scss b/tgui/packages/tgui/styles/interfaces/BanPanel.scss
new file mode 100644
index 0000000000000..3035270613c23
--- /dev/null
+++ b/tgui/packages/tgui/styles/interfaces/BanPanel.scss
@@ -0,0 +1,34 @@
+/**
+ * @file
+ * @copyright 2023
+ * @author ZeWaka (https://github.com/ZeWaka)
+ * @license ISC
+ */
+
+@use 'sass:color';
+
+@use '~tgui/styles/base.scss';
+
+.Layout__content {
+  background-image: none !important; // TODO: Make an 'admin' theme with goon logo bg
+}
+
+
+.CurrentBan {
+  background-color: rgba(0, 255, 0, 0.2);
+  font-weight: bold;
+}
+
+.ExpiredBan {
+  background-color: rgba(255, 0, 0, 0.2);
+  font-style: italic;
+}
+
+.BanText {
+  padding: 0.25rem;
+}
+
+// For an <a> tag with the 'noColor' class, remove the color
+a.NoColor {
+  color: inherit;
+}
\ No newline at end of file
diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss
index 230be5fbc0167..faa2749a536fd 100644
--- a/tgui/packages/tgui/styles/main.scss
+++ b/tgui/packages/tgui/styles/main.scss
@@ -51,6 +51,7 @@
 @include meta.load-css('./interfaces/common/ListSearch.scss');
 @include meta.load-css('./interfaces/Airlock.scss');
 @include meta.load-css('./interfaces/AlertModal.scss');
+@include meta.load-css('./interfaces/BanPanel.scss');
 @include meta.load-css('./interfaces/Cashreg.scss');
 @include meta.load-css('./interfaces/ColorPicker.scss');
 @include meta.load-css('./interfaces/ComUplink.scss');
@@ -84,4 +85,4 @@
   background-size: 70%;
   background-position: center;
   background-repeat: no-repeat;
-}
+}
\ No newline at end of file
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index e6d3a27b2d2cd..1b77ec3d26dd2 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -3145,6 +3145,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"dayjs@npm:^1.11.10":
+  version: 1.11.10
+  resolution: "dayjs@npm:1.11.10"
+  checksum: a6b5a3813b8884f5cd557e2e6b7fa569f4c5d0c97aca9558e38534af4f2d60daafd3ff8c2000fed3435cfcec9e805bcebd99f90130c6d1c5ef524084ced588c4
+  languageName: node
+  linkType: hard
+
 "debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4":
   version: 4.3.4
   resolution: "debug@npm:4.3.4"
@@ -7137,6 +7144,7 @@ resolve@^2.0.0-next.3:
     "@popperjs/core": ^2.9.3
     common: "workspace:*"
     dateformat: ^4.5.1
+    dayjs: ^1.11.10
     dompurify: ^2.3.1
     inferno: ^7.4.8
     inferno-vnode-flags: ^7.4.8
diff --git a/tools/UpdatePaths/Scripts/directcommit_hazard_suit_repath.txt b/tools/UpdatePaths/Scripts/directcommit_hazard_suit_repath.txt
new file mode 100644
index 0000000000000..aae6a93ab6843
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/directcommit_hazard_suit_repath.txt
@@ -0,0 +1,2 @@
+/obj/item/clothing/suit/rad : /obj/item/clothing/suit/hazard/rad
+/obj/item/clothing/suit/fire : /obj/item/clothing/suit/hazard/fire
diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh
index 811b6454bd730..c7e7c7f1738ee 100755
--- a/tools/ci/check_grep.sh
+++ b/tools/ci/check_grep.sh
@@ -48,4 +48,9 @@ if grep -P 'rand\([^)]*[0-9]\.' */**/*.dm;	then
     st=1
 fi;
 
+if grep -P '^ABSTRACT_TYPE\([^/]' */**/*.dm;	then
+    echo "ERROR: You need to include the slash before the area type name in ABSTRACT_TYPE."
+    st=1
+fi;
+
 exit $st
diff --git a/tools/ci/check_grep_secret.sh b/tools/ci/check_grep_secret.sh
index 2ec5235554bf8..a005296cffaf0 100755
--- a/tools/ci/check_grep_secret.sh
+++ b/tools/ci/check_grep_secret.sh
@@ -38,4 +38,20 @@ if grep -P 'playsound\(([^,]*), "(sound\/[^\[]+)"' code/**/*.dm;	then
     st=1
 fi;
 
+if grep -P 'plane\s*=\s*[0-9]+|plane\s*=\s*[A-Z_]+\s*[+\-*]\s*' */**/*.dm;	then
+    echo "ERROR: don't directly set plane to a number, please use a define."
+    st=1
+fi;
+
+if grep -P 'rand\([^)]*[0-9]\.' */**/*.dm;	then
+    echo "ERROR: rand() does not support floating point numbers, use randfloat() instead."
+    st=1
+fi;
+
+
+if grep -P '^ABSTRACT_TYPE\([^/]' */**/*.dm;	then
+    echo "ERROR: You need to include the slash before the area type name in ABSTRACT_TYPE."
+    st=1
+fi;
+
 exit $st
diff --git a/tools/ci/validate_dme.py b/tools/ci/validate_dme.py
index 60e07e3495292..48560e766dfda 100644
--- a/tools/ci/validate_dme.py
+++ b/tools/ci/validate_dme.py
@@ -35,7 +35,7 @@
      # The one file in maps we always include
      r'maps/config/map.dm',
      # OD lint stuff that we want to live in `goonstation.dme`
-     r'_std\__odlint.dm'
+     r'_std\__odlint.dme'
 ]
 
 lines = []