Compare commits

..

2 Commits

Author SHA1 Message Date
eggy
afed4abf46 fix: add extra svgs 2023-01-23 19:57:35 -05:00
eggy
25f9e25b3e feat: add portfolio button and dominant button controls 2023-01-23 19:57:22 -05:00
103 changed files with 4892 additions and 8886 deletions

View File

@ -1,25 +1,27 @@
# Oeufs? # Eggworld v3: Nuxt 3
Après le HTML manuscrit et le générateur de site statique — c'est Nuxt! After hand-written HTML and a static site generator comes Nuxt!
Instructions post-compilation (pendant Nuxt n'a pas le prérendu) **WARN: Volar 0.40.0 breaks all type-checking and I don't know why — stick with Volar 0.39.5.**
- Compilez `/script.ts` à `/script.js` (`tsc script.ts -m esnext -t esnext --moduleResolution node`) Post-build instructions (while prerendering is bork)
Lisez la [documentation de Nuxt](https://v3.nuxtjs.org) pour en savoir plus. - Compile `/script.ts` to `/script.js` (`tsc script.ts -m esnext -t esnext --moduleReslution node`)
## Installation Look at the [nuxt 3 documentation](https://v3.nuxtjs.org) to learn more.
Assurez-vous d'installer les dépendances: ## Setup
Make sure to install the dependencies:
```bash ```bash
# yarn # yarn
yarn install yarn install
``` ```
## Serveur de développement ## Development Server
Démarrez le serveur de développement sur http://localhost:3000 Start the development server on http://localhost:3000
```bash ```bash
yarn dev yarn dev
@ -27,10 +29,10 @@ yarn dev
## Production ## Production
Prévisualisez la production sur votre système local: Locally preview production build:
```bash ```bash
yarn preview yarn preview
``` ```
Lisez la [documentation de déploiement](https://v3.nuxtjs.org/guide/deploy/presets) pour en savoir plus. Checkout the [deployment documentation](https://v3.nuxtjs.org/guide/deploy/presets) for more information.

51
app.vue
View File

@ -3,3 +3,54 @@
<NuxtPage /> <NuxtPage />
</NuxtLayout> </NuxtLayout>
</template> </template>
<style>
* {
box-sizing: border-box;
/* for that cool wave dark mode effect */
z-index: 1;
position: relative;
}
html,
body,
div#__nuxt {
height: 100%;
width: 100%;
}
:root {
--text-color: #243746;
--bg: #f1e7d0;
}
.dark {
--text-color: #ebf4f1;
--bg: #091a28;
}
.prose h2 > a,
.prose h3 > a,
.prose h4 > a,
.prose h5 > a,
.prose h6 > a {
/*
override default tailwind styles
these have a default specificity of 0, 4, 0 so !important is basically the only way
*/
@apply font-bold no-underline !important;
}
article .prose h2 > a:hover::before,
article .prose h3 > a:hover::before,
article .prose h4 > a:hover::before,
article .prose h5 > a:hover::before,
article .prose h6 > a:hover::before {
content: "#";
position: absolute;
left: -2rem;
opacity: 0.5;
font-style: italic;
}
</style>

View File

@ -1,52 +0,0 @@
@import url("https://fonts.googleapis.com/css2?family=Bitter:wght@300;400;600;700;800;900&display=swap");
@mixin headings {
h1,
h2,
h3,
h4,
h5,
h6 {
@content;
}
}
* {
box-sizing: border-box;
// for that cool wave dark mode effect
z-index: 1;
position: relative;
}
html,
body,
div#__nuxt {
height: 100%;
}
main {
flex-grow: 1;
}
:root {
--text-color: #243746;
--bg: #f1e7d0;
}
.dark {
--text-color: #ebf4f1;
--bg: #091a28;
}
.text-bitter {
font-family: Bitter, ui-sans-serif, system-ui, -apple-system,
BlinkMacSystemFont, "Segoe UI", Roboto, "Open Sans", "Helvetica Neue",
sans-serif;
}
.text-article {
font-family: "Source Serif Pro", serif;
line-height: 1.8;
color: #111;
font-size: 1.25rem;
}

View File

@ -1,22 +0,0 @@
@import "base.scss";
.prose article {
@include headings {
& > a:hover,
& > a:active {
text-decoration: underline;
text-decoration-skip-ink: all;
@apply text-blue-700 dark:text-blue-400;
&::before {
content: "#";
position: absolute;
opacity: 0.5;
left: -2rem;
}
}
}
a:hover {
@apply hover:text-blue-700 dark:hover:text-blue-400;
}
}

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg>

Before

Width:  |  Height:  |  Size: 339 B

View File

@ -11,7 +11,7 @@ const latest = docs.at(-1) as BlogParsedContent;
</script> </script>
<template> <template>
<div class="prose dark:prose-invert flex onhover"> <div class="prose dark:prose-invert flex">
<HomeStatBox <HomeStatBox
:href="latest._path" :href="latest._path"
color="lightblue" color="lightblue"
@ -27,8 +27,9 @@ const latest = docs.at(-1) as BlogParsedContent;
v-for="(tag, index) in latest.tags" v-for="(tag, index) in latest.tags"
:key="index" :key="index"
:dest="`/tags/blog/${tag}`" :dest="`/tags/blog/${tag}`"
:name="tag" >
/> {{ tag }}
</Tag>
</div> </div>
<ContentRenderer <ContentRenderer
tag="article" tag="article"
@ -45,12 +46,8 @@ const latest = docs.at(-1) as BlogParsedContent;
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped>
h2 { h2 {
overflow-wrap: break-word; overflow-wrap: break-word;
} }
div.onhover:hover h2 {
@apply text-blue-700 dark:text-blue-400;
}
</style> </style>

View File

@ -10,11 +10,7 @@ const toggle = () => {
</script> </script>
<template> <template>
<label <label for="dark-toggle" class="toggle-wrapper">
for="dark-toggle"
class="toggle-wrapper"
aria-label="Dark mode indicator label"
>
<div class="toggle"> <div class="toggle">
<div class="icons"> <div class="icons">
<IconMoon /> <IconMoon />
@ -25,7 +21,6 @@ const toggle = () => {
name="dark-toggle" name="dark-toggle"
type="checkbox" type="checkbox"
ref="darkToggleEl" ref="darkToggleEl"
aria-label="Toggle dark mode"
@click="toggle" @click="toggle"
/> />
</div> </div>

View File

@ -20,19 +20,14 @@ onMounted(async () => {
<template> <template>
<div class="prose dark:prose-invert"> <div class="prose dark:prose-invert">
<HomeStatBox <HomeStatBox
:href :href="href"
id="github-commit-a" id="github-commit-a"
color="lightgray" color="lightgray"
darkcolor="slategray" darkcolor="slategray"
title="Latest commit" title="Latest commit"
:clearstyles="true" :clearstyles="true"
> >
<img <img class="m-0 w-full h-full" :src="imgUrl" id="github-commit-img" />
class="m-0 w-full h-full"
:src="imgUrl"
id="github-commit-img"
alt="Latest GitHub commit"
/>
<!-- <!--
<div> <div>
<h2>{{ title }}</h2> <h2>{{ title }}</h2>

View File

@ -1,11 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { getPrettyDate, getUtcDate } from "~~/shared/metadata"; import { getPrettyDate, getUtcDate } from "~~/shared/metadata";
import type { AnyParsedContent } from "~~/shared/types"; import { BlogParsedContent, StoryParsedContent } from "~~/shared/types";
const { doc } = defineProps<{ doc: AnyParsedContent }>(); const props = defineProps<{ doc: StoryParsedContent | BlogParsedContent }>();
const prettyDate = getPrettyDate(doc); const prettyDate = getPrettyDate(props.doc);
const utcDate = getUtcDate(doc); const utcDate = getUtcDate(props.doc);
</script> </script>
<template> <template>

View File

@ -11,17 +11,8 @@ const getSvgIcon = async (name: string) => {
<template> <template>
<div class="hamburger"> <div class="hamburger">
<input <input class="checkbox" type="checkbox" id="checkbox" />
class="checkbox" <label class="checkbox-label" for="checkbox">
type="checkbox"
id="checkbox"
aria-label="Hamburger menu toggle"
/>
<label
class="checkbox-label"
for="checkbox"
aria-label="Hamburger menu indicator label"
>
<svg class="ham ham-rotate" viewBox="0 0 100 100" width="60"> <svg class="ham ham-rotate" viewBox="0 0 100 100" width="60">
<path <path
class="line top" class="line top"
@ -34,8 +25,13 @@ const getSvgIcon = async (name: string) => {
/> />
</svg> </svg>
</label> </label>
<ul class="drawer prose dark:prose-invert"> <div class="drawer prose dark:prose-invert">
<li class="m-0" v-for="(item, index) in navItems" :key="index"> <li
class="m-0"
v-for="(item, index) in navItems"
:key="index"
:class="{ dominant: item.dominant }"
>
<!-- stupid vite doesn't let require work <!-- stupid vite doesn't let require work
i should have just hardcoded the navbar items --> i should have just hardcoded the navbar items -->
<a :href="item.href" class="p-2 flex gap-2"> <a :href="item.href" class="p-2 flex gap-2">
@ -43,13 +39,17 @@ const getSvgIcon = async (name: string) => {
:src="`/nav/${item.title.toLowerCase()}.svg`" :src="`/nav/${item.title.toLowerCase()}.svg`"
class="m-0" class="m-0"
preload="auto" preload="auto"
:alt="`${item.title} logo`"
/> />
{{ item.title }} {{ item.title }}
<img
v-if="item.dominant"
src="/icons/arrow-right-line.svg"
class="m-0"
/>
</a> </a>
<hr class="m-2" v-if="index !== navItems.length - 1" /> <hr class="m-0 m-2" v-if="index !== navItems.length - 1" />
</li> </li>
</ul> </div>
</div> </div>
</template> </template>
@ -143,6 +143,20 @@ html.dark .drawer {
width: 100%; width: 100%;
} }
.drawer li.dominant a {
background: royalblue;
color: white;
font-weight: bold;
}
.drawer li.dominant img {
filter: invert(1);
}
.drawer li.dominant a:hover {
background: skyblue;
}
.drawer li a { .drawer li a {
/* overwrite tailwind */ /* overwrite tailwind */
text-decoration: none; text-decoration: none;

View File

@ -1,101 +0,0 @@
<script setup lang="ts">
const props = defineProps<{ strings: string[]; class?: string }>();
</script>
<template>
<h1 :class="[props.class, 'text-loop relative text-center w-full h-16']">
<span class="text absolute w-full" v-for="s in props.strings" :key="s">
{{ s }}
</span>
</h1>
</template>
<style scoped lang="scss">
@use "sass:math";
@mixin text-loop($els) {
.text-loop {
overflow: hidden;
$duration: 3s;
@if $els > 1 {
& > span {
display: block;
opacity: 0;
@for $i from 1 through $els {
&:nth-child(#{$i}) {
animation: move-test-#{$i} $duration * $els infinite;
}
}
}
}
}
@for $i from 1 through $els {
@keyframes move-test-#{$i} {
$interval: calc(100% / $els);
$upper_bound: $interval * $i;
$lower_bound: $interval * ($i - 1);
// we try to make the previous exit and the next enter
// at the same time, also taking care of negatives
// for i = 1, this is negative, so start the animation at the end of the cycle
@if $i > 1 {
0% {
opacity: 0;
transform: translateY(100%);
}
#{$lower_bound - $interval * 0.05} {
opacity: 0;
transform: translateY(100%);
}
}
#{$lower_bound} {
opacity: 1;
transform: translateY(0%);
}
#{$lower_bound + $interval * 0.95} {
opacity: 1;
transform: translateY(0%);
}
#{$upper_bound} {
opacity: 0;
transform: translateY(-100%);
}
@if $i == 1 {
// reset el 1
#{100% - $interval * 0.05} {
opacity: 0;
transform: translateY(100%);
}
100% {
opacity: 1;
transform: translateY(0%);
}
} @else {
100% {
opacity: 0;
transform: translateY(-100%);
}
}
}
}
}
/**
* For one element, we have the following pattern. To expand it to 2+
* els, we divide 100% by the number of els and turn on the animation
* only at the correct time.
* -5%: invis
* 0%: vis
* 95%: vis
* 100%: invis
*/
@include text-loop(3);
</style>

View File

@ -1,11 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import type { Color, ViewportLength } from "csstype"; import type { Color, ViewportLength } from "csstype";
// fix ReferenceError: _unref is not defined
// https://github.com/nuxt/framework/issues/5546
import { unref as _unref } from "vue";
const { const {
href,
id,
color = "pink", color = "pink",
darkcolor = "#c88994", darkcolor = "#c88994",
title,
clearstyles = false, clearstyles = false,
...props forceheight,
} = defineProps<{ } = defineProps<{
href?: string; href?: string;
id?: string; id?: string;
@ -17,7 +24,7 @@ const {
}>(); }>();
const padding = clearstyles ? "0" : "1rem"; const padding = clearstyles ? "0" : "1rem";
const height = props.forceheight ?? "100%"; const height = forceheight ?? "100%";
// v-bind DOES NOT WORK on initial render // v-bind DOES NOT WORK on initial render
// so unfortunately we have to use the old way // so unfortunately we have to use the old way
@ -31,7 +38,11 @@ const cssVars = {
</script> </script>
<template> <template>
<a class="no-underline inline-block flex flex-col items-stretch" :href :id> <a
class="no-underline inline-block flex flex-col items-stretch"
:href="href"
:id="id"
>
<div class="container box" :style="cssVars"> <div class="container box" :style="cssVars">
<p class="m-0 w-full title">{{ title }}</p> <p class="m-0 w-full title">{{ title }}</p>
<div class="main-content"> <div class="main-content">

View File

@ -1,20 +1,24 @@
<script setup lang="ts"> <script setup lang="ts">
import ColourPicker from "./ColourPicker.vue"; import ColourPicker from "./ColourPicker.vue";
import { navItems } from "@/data/navItems"; import { navItems } from "@/data/navItems";
const props = defineProps<{ activeItem?: string }>();
</script> </script>
<template> <template>
<nav class="flex items-center justify-between"> <nav class="flex items-center justify-between">
<ul> <ul>
<li class="home-text"><a href="/">Oeufs?</a></li> <li class="home-text"><a href="/">Eggworld</a></li>
<li v-for="(item, index) in navItems" :key="index"> <li
v-for="(item, index) in navItems"
:key="index"
:class="{ dominant: item.dominant }"
>
<a :href="item.href" class="flex gap-2"> <a :href="item.href" class="flex gap-2">
<img <img :src="`/nav/${item.title.toLowerCase()}.svg`" />
:src="`/nav/${item.title.toLowerCase()}.svg`" {{ item.title }}
:alt="`${item.title} logo`" <img v-if="item.dominant" src="/icons/arrow-right-line.svg" />
/> </a>
{{ item.title }}</a
>
</li> </li>
</ul> </ul>
<div class="flex items-center"> <div class="flex items-center">
@ -75,6 +79,20 @@ li.home-text {
font-weight: bold; font-weight: bold;
} }
li.dominant {
background: royalblue;
color: white;
font-weight: bold;
}
li.dominant:hover {
background: skyblue;
}
li.dominant img {
filter: invert(1);
}
.hamburger { .hamburger {
width: 0rem; width: 0rem;
opacity: 0; opacity: 0;
@ -83,15 +101,17 @@ li.home-text {
* { * {
--trans: 0.2s ease; --trans: 0.2s ease;
--box-trans-time: 0.4s; --box-trans-time: 0.4s;
transition: transition: opacity var(--trans), transform var(--trans), gap var(--trans),
opacity var(--trans), width var(--trans), box-shadow var(--box-trans-time) ease,
transform var(--trans), filter var(--trans), padding-left var(--trans), padding-right var(--trans);
gap var(--trans), }
width var(--trans),
box-shadow var(--box-trans-time) ease, @media screen and (max-width: 750px) and (min-width: 601px) {
filter var(--trans), li.home-text {
padding-left var(--trans), width: 0;
padding-right var(--trans); opacity: 0;
padding: 0;
}
} }
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {

View File

@ -1,11 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import type { AnyParsedContent } from "@/shared/types"; import type { StoryParsedContent, BlogParsedContent } from "@/shared/types";
import { calcReadingTime } from "@/shared/metadata"; import { calcReadingTime } from "@/shared/metadata";
import { SpecialTags } from "@/data/specialTags";
import IconStar from "@/assets/images/star.svg?component";
const { post, type } = defineProps<{ const { post, type, highlighttags } = defineProps<{
post: AnyParsedContent; post: StoryParsedContent | BlogParsedContent;
type: "stories" | "blog"; type: "stories" | "blog";
highlighttags?: string[]; highlighttags?: string[];
}>(); }>();
@ -18,13 +16,8 @@ const descText =
</script> </script>
<template> <template>
<div <div class="story-card p-4">
class="break-words max-w-full rounded-lg p-4 shadow-md border border-2 border-gray-300 dark:border-gray-600" <h3 class="m-0">
>
<h3 class="m-0 flex items-center gap-1.5">
<a :href="`/tags/${type}/featured`" v-if="post.tags.includes('featured')">
<IconStar class="fill-yellow-500 outline-none" />
</a>
<a <a
:href="post._path" :href="post._path"
class="no-underline text-left text-2xl sm:text-2xl font-bold hover:text-blue-700 dark:hover:text-blue-400 leading-tight transition" class="no-underline text-left text-2xl sm:text-2xl font-bold hover:text-blue-700 dark:hover:text-blue-400 leading-tight transition"
@ -34,18 +27,19 @@ const descText =
</h3> </h3>
<p class="my-1 text-sm"><Date :doc="post" /> · {{ descText }}</p> <p class="my-1 text-sm"><Date :doc="post" /> · {{ descText }}</p>
<div class="flex flex-wrap"> <div class="flex flex-wrap">
<template v-for="(tag, index) in post.tags" :key="index"> <Tag
<Tag :dest="`/tags/${type}/${tag}`"
:dest="`/tags/${type}/${tag}`" v-for="(tag, index) in post.tags"
:name="tag" :key="index"
:highlight="highlighttags?.includes(tag)" :highlight="highlighttags?.includes(tag)"
v-if="!SpecialTags.includes(tag)" >
/> {{ tag }}
</template> </Tag>
</div> </div>
<ContentRenderer :value="post" :excerpt="true" tag="section"> <ContentRenderer :value="post" :excerpt="true" tag="section">
<template #empty>No excerpt available.</template> <template #empty>No excerpt available.</template>
</ContentRenderer> </ContentRenderer>
<!--<p v-if="!post.nopreview" class="m-0"></p>-->
<div class="text-right" v-if="!post.nopreview"> <div class="text-right" v-if="!post.nopreview">
<a <a
:href="post._path" :href="post._path"
@ -56,3 +50,12 @@ const descText =
</div> </div>
</div> </div>
</template> </template>
<style scoped>
.story-card {
border: 0.1rem solid gray;
max-width: 100%;
border-radius: 0.5rem;
overflow-wrap: break-word;
}
</style>

View File

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { Project } from "@/data/projects"; import type { Project } from "@/data/projects";
import { unref as _unref } from "vue"; import { unref as _unref } from "vue";
const { project } = defineProps<{ const { project, reverse = false } = defineProps<{
project: Project; project: Project;
reverse?: boolean; reverse?: boolean;
}>(); }>();
@ -15,14 +15,13 @@ const imgUrl = project.img ? `url(/images/projects/${project.img})` : "none";
<div class="card-text h-full px-4 py-2"> <div class="card-text h-full px-4 py-2">
<div class="h-full flex flex-col justify-between"> <div class="h-full flex flex-col justify-between">
<div> <div>
<h3 class="m-0 font-bold font-sans">{{ project.name }}</h3> <h3 class="m-0">{{ project.name }}</h3>
<div class="flex gap-1 items-center flex-nowrap"> <div class="flex gap-1 items-center flex-nowrap">
<img <img
class="h-5 w-5 m-0" class="h-5 w-5 m-0"
:src="`/images/langs/${lang}.svg`" :src="`/images/langs/${lang}.svg`"
v-for="(lang, index) in project.langs" v-for="(lang, index) in project.langs"
:key="index" :key="index"
:alt="`${lang} logo`"
/> />
<span <span
class="text-xs text-gray-500 dark:text-gray-300 whitespace-nowrap" class="text-xs text-gray-500 dark:text-gray-300 whitespace-nowrap"
@ -55,10 +54,6 @@ const imgUrl = project.img ? `url(/images/projects/${project.img})` : "none";
width: 100%; width: 100%;
} }
.project-anchor:hover h3 {
@apply text-blue-700 dark:text-blue-400;
}
.card { .card {
border: 0.2rem solid pink; border: 0.2rem solid pink;
background: white; background: white;
@ -107,7 +102,7 @@ html.dark .card-img {
} }
.desc-text { .desc-text {
width: 140%; width: 139%;
/* 140% is too close */ /* 140% is too close */
transition: width 0.2s ease; transition: width 0.2s ease;
} }
@ -126,7 +121,7 @@ a.unclickable {
} }
.desc-text { .desc-text {
width: 136%; width: 135%;
} }
} }

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
const { img } = defineProps<{ const props = defineProps<{
name: string; name: string;
href: string; href: string;
img: string; img: string;
@ -7,7 +7,7 @@ const { img } = defineProps<{
broken?: boolean; broken?: boolean;
}>(); }>();
const imgUrl = `/images/services/${img}`; const imgUrl = `/images/services/${props.img}`;
</script> </script>
<template> <template>
@ -16,8 +16,8 @@ const imgUrl = `/images/services/${img}`;
:class="['no-underline', { unclickable: unclickable || broken, broken }]" :class="['no-underline', { unclickable: unclickable || broken, broken }]"
> >
<div class="card flex flex-col items-center justify-around"> <div class="card flex flex-col items-center justify-around">
<img class="m-0" :src="imgUrl" :alt="`${name} logo`" /> <img class="m-0" :src="imgUrl" />
<h3 class="m-0">{{ name }}</h3> <h3 class="m-0">{{ props.name }}</h3>
<p class="desc-text text-gray-600 dark:text-gray-200"><slot /></p> <p class="desc-text text-gray-600 dark:text-gray-200"><slot /></p>
</div> </div>
</a> </a>
@ -44,12 +44,12 @@ a.broken::before {
content: "PANQUIA IS ON FIRE"; content: "PANQUIA IS ON FIRE";
position: absolute; position: absolute;
color: red; color: red;
transform: rotate(-40deg); transform: rotate(-45deg);
font-size: 1.5rem; font-size: 1.5rem;
text-align: center; text-align: center;
z-index: 2; z-index: 2;
top: 32.5%; top: 40%;
left: -8%; left: -12.5%;
width: 125%; width: 125%;
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-weight: bold; font-weight: bold;

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { StoryParsedContent } from "@/shared/types"; import { type StoryParsedContent } from "@/shared/types";
import { calcReadingTime } from "@/shared/metadata"; import { calcReadingTime } from "@/shared/metadata";
const docs = await queryContent<StoryParsedContent>("/stories") const docs = await queryContent<StoryParsedContent>("/stories")
@ -11,7 +11,7 @@ const latest = docs.at(-1) as StoryParsedContent;
</script> </script>
<template> <template>
<div class="prose dark:prose-invert flex onhover"> <div class="prose dark:prose-invert flex">
<HomeStatBox <HomeStatBox
:href="latest._path" :href="latest._path"
color="lightgreen" color="lightgreen"
@ -27,8 +27,9 @@ const latest = docs.at(-1) as StoryParsedContent;
v-for="(tag, index) in latest.tags" v-for="(tag, index) in latest.tags"
:key="index" :key="index"
:dest="`/tags/stories/${tag}`" :dest="`/tags/stories/${tag}`"
:name="tag" >
/> {{ tag }}
</Tag>
</div> </div>
<ContentRenderer <ContentRenderer
tag="article" tag="article"
@ -49,8 +50,4 @@ const latest = docs.at(-1) as StoryParsedContent;
h2 { h2 {
overflow-wrap: break-word; overflow-wrap: break-word;
} }
div.onhover:hover h2 {
@apply text-blue-700 dark:text-blue-400;
}
</style> </style>

View File

@ -1,26 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
const { highlight } = defineProps<{ const { dest, highlight = false } = defineProps<{
name: string;
dest: string; dest: string;
highlight?: boolean; highlight?: boolean;
}>(); }>();
// const isLinkableTag = !props.name.includes(" ");
const isLinkableTag = true;
const tagClass = [
"inline-block text-xs rounded-lg py-1 px-2 mt-1 mr-1 transition border border-pink-200 dark:border-pink-900 border-2 font-medium no-underline",
{ "bg-pink-200 dark:bg-pink-900": highlight },
{ "shadow-md": isLinkableTag },
];
</script> </script>
<template> <template>
<div :class="tagClass"> <a :href="dest">
<a :href="dest" v-if="isLinkableTag"> <div
{{ name }} :class="[
</a> 'inline-block text-xs rounded-full py-1 px-2 mt-1 mr-1 bg-gray-300 dark:bg-gray-500 transition',
<div v-else> { 'bg-yellow-200 dark:bg-yellow-700 shadow-lg': highlight },
{{ name }} ]"
>
<slot />
</div> </div>
</div> </a>
</template> </template>

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
const { src, alt = "" } = defineProps<{ src: string; alt?: string }>(); const { src } = defineProps<{ src: string }>();
const imgSrc = const imgSrc =
src.startsWith("http://") || src.startsWith("https://") src.startsWith("http://") || src.startsWith("https://")
@ -9,7 +9,7 @@ const imgSrc =
<template> <template>
<figure class="flex flex-col items-center"> <figure class="flex flex-col items-center">
<img :src="imgSrc" class="drop-shadow-lg" :alt="alt" /> <img :src="imgSrc" />
<figcaption class="text-center" v-if="alt">{{ alt }}</figcaption> <figcaption class="text-center"><slot /></figcaption>
</figure> </figure>
</template> </template>

View File

@ -18,7 +18,8 @@ import { projects } from "@/data/projects";
<!-- this could be in markdown but eh --> <!-- this could be in markdown but eh -->
<p> <p>
Hello! It's very nice to meet you — I'm a student who is quite passionate Hello! It's very nice to meet you — my name's Daniel, a student studying
Computer Engineering at the University of Waterloo who is quite passionate
about some subjects but is quite lazy in every other. about some subjects but is quite lazy in every other.
</p> </p>
<p> <p>

View File

@ -7,13 +7,12 @@
This site is statically generated using This site is statically generated using
<a href="https://v3.nuxtjs.org">Nuxt.js</a> with the help of templates and <a href="https://v3.nuxtjs.org">Nuxt.js</a> with the help of templates and
Markdown because really, writing HTML by hand is tedious and I don't Markdown because really, writing HTML by hand is tedious and I don't
know why I ever tried and its know why I ever tried and its source is available
<a href="https://github.com/potatoeggy/public">source is available here</a <a href="https://github.com/potatoeggy/public">here</a>.
>.
</p> </p>
<!-- i could make this a list but god i'm so tired with nuxt --> <!-- i could make this a list but god i'm so tired with nuxt -->
<div class="flex justify-around flex-wrap gap-8 items-center"> <div class="flex justify-around flex-wrap gap-8 items-center">
<ServiceCard name="Gitea" href="https://git.eggworld.me" img="gitea.svg"> <ServiceCard name="Gitea" href="https://git.eggworld.me" img="gitea.webp">
Self-hosted GitHub Self-hosted GitHub
</ServiceCard> </ServiceCard>
<ServiceCard <ServiceCard
@ -37,17 +36,28 @@
> >
Kobo Cloud Kobo Cloud
</ServiceCard> </ServiceCard>
<ServiceCard
name="Plex"
href="https://plex.eggworld.me"
img="plex.webp"
broken
>
Ad-filled media server
</ServiceCard>
<ServiceCard <ServiceCard
name="Jellyfin" name="Jellyfin"
href="https://jellyfin.eggworld.me" href="https://jellyfin.eggworld.me"
img="jellyfin.svg" img="jellyfin.webp"
broken
> >
FOSS media server FOSS media server
</ServiceCard> </ServiceCard>
<ServiceCard <ServiceCard
name="Minecraft" name="Minecraft"
href="minecraft.eggworld.me" href="minecraft.eggworld.me"
img="minecraft.svg" img="minecraft.webp"
unclickable unclickable
broken broken
> >

View File

@ -1,13 +1,29 @@
/** /**
* Set the page title in the format [title] | [site name]. * Set the page title in the format [title] | Eggworld.
* @param title The title string. * @param title The title string.
*/ */
export function useTitle(title: string, description?: string) { export function useTitle(title: string, description?: string) {
useHead({ useHead({
title: `${title} | Oeufs?`, title: `${title} | Eggworld`,
meta: [ meta: [
{ name: "viewport", content: " width=device-width,initial-scale=1" }, { name: "viewport", content: " width=device-width,initial-scale=1" },
{ name: "description", content: description ?? "" }, { name: "description", content: description || "" },
{ name: "theme-color", content: "#ffffff" },
],
link: [
{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
{
rel: "stylesheet",
href: "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css",
},
],
script: [
{
defer: true,
src: "/script.js",
hid: "stupidEmergencyScript",
type: "module",
},
], ],
}); });
} }

View File

@ -13,11 +13,13 @@ First, what is Linux? At its heart, it is a [kernel](https://en.wikipedia.org/wi
However, this article will largely focus on **desktop Linux**, which competes with other operating systems such as Windows and macOS. However, this article will largely focus on **desktop Linux**, which competes with other operating systems such as Windows and macOS.
## Complete freedom # Complete freedom
Perhaps the biggest feature of Linux is its ability to do whatever you want, however you want. After a *tiny* bit of tinkering, you'll be able to set up your computer exactly how you'd like it! Perhaps the biggest feature of Linux is its ability to do whatever you want, however you want. After a *tiny* bit of tinkering, you'll be able to set up your computer exactly how you'd like it!
![A terminal, an emulated Switch game, a game launcher, and a browser all automagically arranged by a tiling window manager. The currently playing song is in the top bar.](sway-desktop.webp) ::image{src=sway-desktop.webp}
A terminal, an emulated Switch game, a game launcher, and a browser all automagically arranged by a tiling window manager. The currently playing song is in the top bar.
::
Or, if you aren't the type to spend hours fiddling every little thing, you can choose from a variety of existing default desktop interfaces. Or, if you aren't the type to spend hours fiddling every little thing, you can choose from a variety of existing default desktop interfaces.
@ -31,7 +33,8 @@ Or Plasma's endless customisation:
![](https://upload.wikimedia.org/wikipedia/commons/9/94/KDE_Plasma_5.21_Breeze_Twilight_screenshot.png) ![](https://upload.wikimedia.org/wikipedia/commons/9/94/KDE_Plasma_5.21_Breeze_Twilight_screenshot.png)
![](https://www.omgubuntu.co.uk/wp-content/uploads/2019/07/kde-plasma-desktop.jpg) ::image{src=https://www.omgubuntu.co.uk/wp-content/uploads/2019/07/kde-plasma-desktop.jpg}
::
And this is only the beginning — it's not just appearance you have control over, although both GNOME and Plasma also come with their assortment of applications that have designs that perfectly mesh with the desktop, with global theming letting you click a single button in your settings menu to change colours or styles across all your apps. And this is only the beginning — it's not just appearance you have control over, although both GNOME and Plasma also come with their assortment of applications that have designs that perfectly mesh with the desktop, with global theming letting you click a single button in your settings menu to change colours or styles across all your apps.
@ -39,7 +42,7 @@ Don't like your file manager? Swap it out for one of the dozens out there. Don't
**You can do anything.** **You can do anything.**
## The package manager # The package manager
Speaking of the update manager… Speaking of the update manager…
@ -53,20 +56,22 @@ Here are just a couple of the graphical stores available:
GNOME Software for GNOME: GNOME Software for GNOME:
![](https://www.omgubuntu.co.uk/wp-content/uploads/2021/02/gnome-software-refresh.jpg) ::image{src=https://www.omgubuntu.co.uk/wp-content/uploads/2021/02/gnome-software-refresh.jpg}
::
Discover for Plasma: Discover for Plasma:
![](https://userbase.kde.org/images.userbase/thumb/2/2d/Discoverappfocus.png/500px-Discoverappfocus.png) ::image{src=https://userbase.kde.org/images.userbase/thumb/2/2d/Discoverappfocus.png/500px-Discoverappfocus.png}
::
By contrast, the Microsoft Store was (is) a complete and utter mess that is nowhere near the integration and experience Linux has had for decades. By contrast, the Microsoft Store was (is) a complete and utter mess that is nowhere near the integration and experience Linux has had for decades.
## Open source # Open source
Not only that, desktop Linux was built by thousands of volunteers, each contributing their own code to make the best product they can. Because it's completely open source (anyone can see or edit the source code), it's inherently more secure as simply more people are looking at it to fix issues and squash bugs. Not only that, desktop Linux was built by thousands of volunteers, each contributing their own code to make the best product they can. Because it's completely open source (anyone can see or edit the source code), it's inherently more secure as simply more people are looking at it to fix issues and squash bugs.
Learning Linux is a great opportunity to jump into learning more about computers because of the knowledge you gain over time of how your computer works on a fundamental level as you inevitably start troubleshooting *when* something breaks. And perhaps you'll be the one to contribute back upstream to the project too, if you fix a bug or add a new feature, and have your own code distributed around to millions of other users. Learning Linux is a great opportunity to jump into learning more about computers because of the knowledge you gain over time of how your computer works on a fundamental level as you inevitably start troubleshooting *when* something breaks. And perhaps you'll be the one to contribute back upstream to the project too, if you fix a bug or add a new feature, and have your own code distributed around to millions of other users.
## Try it now! # Try it now!
With dozens of well-maintained versions of Linux operating systems out there, you'll be sure to find one that suits your needs. To try GNOME, [Pop!_OS](https://pop.system76.com/) or [Fedora](https://getfedora.org/en/workstation/download/) provide a seamless out-of-the-box experience. To try Plasma, [Kubuntu](https://kubuntu.org/) is a fantastic starting point. To get a macOS-like feel, [Elementary OS](https://elementary.io/) gives you that Apple vibe while, like every other Linux OS, is completely free of charge, and lets you try it out before you decide to install it. With dozens of well-maintained versions of Linux operating systems out there, you'll be sure to find one that suits your needs. To try GNOME, [Pop!_OS](https://pop.system76.com/) or [Fedora](https://getfedora.org/en/workstation/download/) provide a seamless out-of-the-box experience. To try Plasma, [Kubuntu](https://kubuntu.org/) is a fantastic starting point. To get a macOS-like feel, [Elementary OS](https://elementary.io/) gives you that Apple vibe while, like every other Linux OS, is completely free of charge, and lets you try it out before you decide to install it.

View File

@ -9,4 +9,6 @@ On the desktop, dark mode is an abomination that should be eradicated from appli
Browsers, IDEs, and other applications must be freed from their shadowy chains and returned to light — where they truly belong. Browsers, IDEs, and other applications must be freed from their shadowy chains and returned to light — where they truly belong.
![Perfect.](light-discord.webp) ::image{src=light-discord.webp}
Perfect.
::

View File

@ -2,9 +2,8 @@
title: Primoprod Progress Report title: Primoprod Progress Report
date: 2021-08-21 date: 2021-08-21
tags: tags:
- primoprod - primoprod
- tech - tech
- featured
--- ---
Welcome to the very first [Primoprod](https://primoprod.eggworld.me) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes. Welcome to the very first [Primoprod](https://primoprod.eggworld.me) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes.
@ -17,9 +16,9 @@ This report will cover the beginnings of the project to the present day: 16 July
## Introduction ## Introduction
What is Primoprod? Short for "Productivity Primogems", it was born when I noticed that the gacha system employed by games such as _Genshin Impact_ could be incredibly addictive, so I decided to see if I could take advantage of it to boost my productivity and at the same time try to learn web development. What is Primoprod? Short for "Productivity Primogems", it was born when I noticed that the gacha system employed by games such as *Genshin Impact* could be incredibly addictive, so I decided to see if I could take advantage of it to boost my productivity and at the same time try to learn web development.
The basic premise was to assign a given point value for each productive task and be able to spend those points on something or have them progress toward a milestone, so that productive tasks would be incentivised. The aforementioned gacha games and Uber use this to great effect, so I decided to emulate the Wish UI of [_Genshin Impact_](https://genshin.mihoyo.com/en). The basic premise was to assign a given point value for each productive task and be able to spend those points on something or have them progress toward a milestone, so that productive tasks would be incentivised. The aforementioned gacha games and Uber use this to great effect, so I decided to emulate the Wish UI of [*Genshin Impact*](https://genshin.mihoyo.com/en).
And so the project began! I decided to work with Vue.js because of its gentler learning curve compared to Angular and more traditional HTML/CSS/JS separation compared to React. You can tell when I became more comfortable in using Vue's declarative system in the later components compared to, say, [`App.vue`](https://github.com/potatoeggy/primoprod/blob/master/src/App.vue). And so the project began! I decided to work with Vue.js because of its gentler learning curve compared to Angular and more traditional HTML/CSS/JS separation compared to React. You can tell when I became more comfortable in using Vue's declarative system in the later components compared to, say, [`App.vue`](https://github.com/potatoeggy/primoprod/blob/master/src/App.vue).
@ -31,15 +30,17 @@ As my first foray into web development, there were many tools and practices I co
Luckily, I didn't have to make any of these decisions because Vue's [CLI](https://cli.vuejs.org/) gives you a list of sane defaults that you can pick from, and since I was learning for the future, I went with the first option of Vue 3 + Typescript. `vue-cli` even nicely [initialised a git repo for me](https://github.com/potatoeggy/primoprod/commit/9b7d7841806c905e8f580f98d1c95d4732178810)! Luckily, I didn't have to make any of these decisions because Vue's [CLI](https://cli.vuejs.org/) gives you a list of sane defaults that you can pick from, and since I was learning for the future, I went with the first option of Vue 3 + Typescript. `vue-cli` even nicely [initialised a git repo for me](https://github.com/potatoeggy/primoprod/commit/9b7d7841806c905e8f580f98d1c95d4732178810)!
At the time, coming from Python/Java, I opted in to the class components plugin hoping it made it easier to develop for, but later removed it due to a lack of documentation with it for Vue 3. Occasional downsides of newer technologies ¯\\\_(ツ)\_/¯. At the time, coming from Python/Java, I opted in to the class components plugin hoping it made it easier to develop for, but later removed it due to a lack of documentation with it for Vue 3. Occasional downsides of newer technologies ¯\\\_(ツ)_/¯.
The [first few commits](https://github.com/potatoeggy/primoprod/commit/ed9d94b61bf91ea9b82ac4d832dfb2b9ff2efc59) had me playing around until I was comfortable enough to introduce my very [first component](https://github.com/potatoeggy/primoprod/commit/fcbb4068dd3b018db2809ccfcc5381d4ea3ae727): the WishButton. The [first few commits](https://github.com/potatoeggy/primoprod/commit/ed9d94b61bf91ea9b82ac4d832dfb2b9ff2efc59) had me playing around until I was comfortable enough to introduce my very [first component](https://github.com/potatoeggy/primoprod/commit/fcbb4068dd3b018db2809ccfcc5381d4ea3ae727): the WishButton.
![](src=wish-button-emulated.webp) ::image{src=wish-button-emulated.webp}
::
I'd say it turned out pretty well! Since I wanted to emulate Genshin's UI, I wanted to match it as closely as I could. These two buttons are made of an image inside of a div relatively positioned with text absolutely positioned inside. Original image for comparison: I'd say it turned out pretty well! Since I wanted to emulate Genshin's UI, I wanted to match it as closely as I could. These two buttons are made of an image inside of a div relatively positioned with text absolutely positioned inside. Original image for comparison:
![](wish-button-original.webp) ::image{src=wish-button-original.webp}
::
There are still some differences between the texts since Genshin uses antialiasing, and the alignment and shadow of the icon beside the wish quantity is slightly off too, but I would consider this result to be acceptable. There are still some differences between the texts since Genshin uses antialiasing, and the alignment and shadow of the icon beside the wish quantity is slightly off too, but I would consider this result to be acceptable.
@ -57,7 +58,10 @@ See [GemCounter](https://github.com/potatoeggy/primoprod/blob/master/src/compone
Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantastic tutorials/documentation a fair bit and used flexboxes and `rem` everywhere, I apparently did not catch `box-sizing: border-box` and the margins and padding just did not arrange themselves how they should have. Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantastic tutorials/documentation a fair bit and used flexboxes and `rem` everywhere, I apparently did not catch `box-sizing: border-box` and the margins and padding just did not arrange themselves how they should have.
![:/ thanks MDN for letting me know](mdn-box-sizing-tip.webp) ::image{src=mdn-box-sizing-tip.webp}
::
:/ thanks MDN for letting me know
[Some foreshadowing](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemRevealScreen.vue#L224) [Some foreshadowing](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemRevealScreen.vue#L224)
@ -65,11 +69,13 @@ Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantasti
Designing the basic screen was pretty straightforward. For all its woes, pure CSS still works and is intuitive enough that my git history was only slightly too messy and I got my results. Designing the basic screen was pretty straightforward. For all its woes, pure CSS still works and is intuitive enough that my git history was only slightly too messy and I got my results.
![](primoprod-wishbanners.webp) ::image{src=primoprod-wishbanners.webp}
::
Pretty good, right? Now, the design still isn't adaptive enough _since things get cut off for who knows why I thought flexboxes were supposed to solve all this_ but for the most part it looks good enough. It appears I'll have to make a lot of exceptions for mobile devices… Pretty good, right? Now, the design still isn't adaptive enough *since things get cut off for who knows why I thought flexboxes were supposed to solve all this* but for the most part it looks good enough. It appears I'll have to make a lot of exceptions for mobile devices…
![](primoprod-wishbanners-scaled.webp) ::image{src=primoprod-wishbanners-scaled.webp}
::
With some help taken by examining the assets of https://genshin.thekima.com and https://gi-wish-simulator.uzairashraf.dev, I grabbed a static background image as well as the videos! With some help taken by examining the assets of https://genshin.thekima.com and https://gi-wish-simulator.uzairashraf.dev, I grabbed a static background image as well as the videos!
@ -130,17 +136,19 @@ No it doesn't it's not even close but I'm not coming back to that
## Sweet release ## Sweet release
Now that `ItemRevealScreen` is _done and over with and will not need any changes_, before making myself work on the equally fun part of the project that is `ItemRevealAllOverlay`, I opted for a break in `ItemObtainScreen` and `ItemDescriptionOverlay` and a one-week hiatus. Now that `ItemRevealScreen` is *done and over with and will not need any changes*, before making myself work on the equally fun part of the project that is `ItemRevealAllOverlay`, I opted for a break in `ItemObtainScreen` and `ItemDescriptionOverlay` and a one-week hiatus.
And they were easy! Easy and fun. It was blissful to be working with structured HTML and CSS again, and the animation pains there were _nothing_ compared to the trauma of `ItemRevealScreen`. And they were easy! Easy and fun. It was blissful to be working with structured HTML and CSS again, and the animation pains there were *nothing* compared to the trauma of `ItemRevealScreen`.
In fact, I consider those two to be 100% done unless I can find a way to apply a border that looks exactly like the original game's that isn't an image. In fact, I consider those two to be 100% done unless I can find a way to apply a border that looks exactly like the original game's that isn't an image.
But it looks great! But it looks great!
![](itemdescriptionoverlay.webp) ::image{src=itemdescriptionoverlay.webp}
::
![](itemobtainoverlay.webp) ::image{src=itemobtainoverlay.webp}
::
## Wrapping up ## Wrapping up

View File

@ -1,7 +1,6 @@
--- ---
title: "Stay Anonymous Online With These 4 Browser Extensions" title: "Stay Anonymous Online With These 4 Browser Extensions"
date: "2022-08-06" date: "2022-08-06"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "AV1 — The FOSS Video Codec" title: "AV1 — The FOSS Video Codec"
date: 2022-11-13 date: 2022-11-13
_draft: true
tags: tags:
- tech - tech
- albatross - albatross
@ -45,4 +44,4 @@ Why doesnt H.264 have this problem, you ask? [Cisco generously open sourced](
In light of these problems, Google led the development of AV1 as a royalty-free, high quality alternative to H.265. All modern browsers today have already implemented AV1 playback, and hardware released within the last two years all support hardware decoding of AV1, meaning that the performance and power cost of supporting the codec has decreased drastically. In light of these problems, Google led the development of AV1 as a royalty-free, high quality alternative to H.265. All modern browsers today have already implemented AV1 playback, and hardware released within the last two years all support hardware decoding of AV1, meaning that the performance and power cost of supporting the codec has decreased drastically.
By supporting open standards, you can support a world where outdated royalty models no longer exist, and we can all benefit off of each others work. By supporting open standards, you can support a world where outdated royalty models no longer exist, and we can all benefit off of each others work.

View File

@ -1,7 +1,6 @@
--- ---
title: "Choosing a License — Politics in FOSS" title: "Choosing a License — Politics in FOSS"
date: "2022-09-02" date: "2022-09-02"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "Git is a Blockchain" title: "Git is a Blockchain"
date: "2022-10-02" date: "2022-10-02"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "GitHub for Dummies" title: "GitHub for Dummies"
date: "2022-06-17" date: "2022-06-17"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross
@ -13,7 +12,10 @@ Ever been linked to a GitHub page to download something and couldn't figure out
<!-- more --> <!-- more -->
![What do all these words mean? Issues? Pull requests? Actions? Projects? Releases?](https://lh4.googleusercontent.com/u03FMDrVGVaU7x0ojxnNTAnM6_sPaSsnP1R6pZDJaTH95xqiH8LQKBN4OTZoU0Bigf6seLcCcDtSkuxcMwuLqLrCQH2fs6QsUZFyw58DN26sdbJcmMjXrhWjRQg6aoSzu-gBzib3gz20s0uFi_9h5k7QpgbohXqNkXw2pXPfPu4j3VibM_MNlHBK) ::image{src="https://lh4.googleusercontent.com/u03FMDrVGVaU7x0ojxnNTAnM6_sPaSsnP1R6pZDJaTH95xqiH8LQKBN4OTZoU0Bigf6seLcCcDtSkuxcMwuLqLrCQH2fs6QsUZFyw58DN26sdbJcmMjXrhWjRQg6aoSzu-gBzib3gz20s0uFi_9h5k7QpgbohXqNkXw2pXPfPu4j3VibM_MNlHBK"}
What do all these words mean? Issues? Pull requests? Actions? Projects? Releases?
::
### The README and wiki ### The README and wiki
@ -25,7 +27,9 @@ If that doesn't work, check out the project's wiki if they have one, located in
Now, if neither the README nor wiki have any hints to finding the link you want, you can go to the *Releases* section of the project, which on a desktop browser is in the right sidebar, while on mobile is located at the very bottom of the page. Now, if neither the README nor wiki have any hints to finding the link you want, you can go to the *Releases* section of the project, which on a desktop browser is in the right sidebar, while on mobile is located at the very bottom of the page.
![In this case, clicking one of the "primoprod" assets with the file extension for your device will get you a runnable program.](https://lh4.googleusercontent.com/v6G-c31NECe6ZJZhe2YSQXocQ4eCBJhYuXjNWSmECm5QQcSKaMWLpxe_roIkIonkMfUcDK4UtuqQEegVXCD1sAwHQnkssxOEk3uUrnQaMbhXL8zyeXdi0nUNv_QTKFsD5ZAUDJijHv_dc5wdTOEjggZipsIStM3vwaiabiNQ8XUY5bolApOupOwd) ::image{src="https://lh4.googleusercontent.com/v6G-c31NECe6ZJZhe2YSQXocQ4eCBJhYuXjNWSmECm5QQcSKaMWLpxe_roIkIonkMfUcDK4UtuqQEegVXCD1sAwHQnkssxOEk3uUrnQaMbhXL8zyeXdi0nUNv_QTKFsD5ZAUDJijHv_dc5wdTOEjggZipsIStM3vwaiabiNQ8XUY5bolApOupOwd"}
In this case, clicking one of the "primoprod" assets with the file extension for your device will get you a runnable program.
::
Releases are the "official" way for projects to upload stable versions of their program to send to others. In the "Assets" section of a release, clicking the link that is not labeled "Source code" will get you a runnable version of the program. Releases are the "official" way for projects to upload stable versions of their program to send to others. In the "Assets" section of a release, clicking the link that is not labeled "Source code" will get you a runnable version of the program.
@ -41,7 +45,7 @@ If that doesn't work, right-click the page that clicking "Raw" or "View Raw" ope
Trouble in paradise? If none of the above options worked, you can always file a new issue in the "Issues" tab of the project, where you can report bugs and ask questions directly to the project owner. Trouble in paradise? If none of the above options worked, you can always file a new issue in the "Issues" tab of the project, where you can report bugs and ask questions directly to the project owner.
![](https://lh6.googleusercontent.com/l7mlo6OTPsAi17WcYgLeZ39aVp65D_24Kz4PMYOgKArwxJcz4jRcTCtud9UtChEUiUdnVR8sR7_6TvQJAAL2mFcKecLK-hhPvr7De_tPqrvh_mbaNCfVisD2yBn2icaXSl0eFDD4cIHKOzPKOM--2hruiM6qHkC6foW-6Pu63pU9c6FZOid10WXN) ![img](https://lh6.googleusercontent.com/l7mlo6OTPsAi17WcYgLeZ39aVp65D_24Kz4PMYOgKArwxJcz4jRcTCtud9UtChEUiUdnVR8sR7_6TvQJAAL2mFcKecLK-hhPvr7De_tPqrvh_mbaNCfVisD2yBn2icaXSl0eFDD4cIHKOzPKOM--2hruiM6qHkC6foW-6Pu63pU9c6FZOid10WXN)
Remember to read the project's issue guidelines, as some of them have a dedicated support forum or Discord to send help requests to. Remember to read the project's issue guidelines, as some of them have a dedicated support forum or Discord to send help requests to.

View File

@ -1,7 +1,6 @@
--- ---
title: "Google's Guide to Taking Over the Web" title: "Google's Guide to Taking Over the Web"
date: "2022-07-16" date: "2022-07-16"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "13 Tricks to Write Nicer Python" title: "13 Tricks to Write Nicer Python"
date: "2022-08-21" date: "2022-08-21"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "Reviving Older Games Through Emulation" title: "Reviving Older Games Through Emulation"
date: "2022-05-22" date: "2022-05-22"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross
@ -19,7 +18,9 @@ Introducing…emulation!
### TIL converting games to Australian birds will preserve them. ### TIL converting games to Australian birds will preserve them.
![(Wikipedia Commons, public domain)](https://upload.wikimedia.org/wikipedia/commons/9/9d/Emu_1_-_Tidbinbilla.jpg) ::image{src="https://upload.wikimedia.org/wikipedia/commons/9/9d/Emu_1_-_Tidbinbilla.jpg"}
(Wikipedia Commons, public domain)
::
Though *emu* and *emulation* share three letters, the only other similarity they have is that large entities have tried and failed miserably to stamp them out in the past. Emulation is the process of one system (such as a phone or computer) imitating another one (such as a video game console) to run programs designed for that system. Emus will now forever ravage the Australian wilderness, and emulation has been ruled to be legal in at least the United States. Though *emu* and *emulation* share three letters, the only other similarity they have is that large entities have tried and failed miserably to stamp them out in the past. Emulation is the process of one system (such as a phone or computer) imitating another one (such as a video game console) to run programs designed for that system. Emus will now forever ravage the Australian wilderness, and emulation has been ruled to be legal in at least the United States.

View File

@ -1,7 +1,6 @@
--- ---
title: "Appreciate Your Browser!" title: "Appreciate Your Browser!"
date: "2022-09-18" date: "2022-09-18"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -4,7 +4,6 @@ date: "2022-01-15"
tags: tags:
- tech - tech
- primoprod - primoprod
- featured
--- ---
Six months have passed since the [first progress report](/blog/2021/primoprod-progress-report/). Since then, a flood of changes have made it in, including hundredth-class Android support! Six months have passed since the [first progress report](/blog/2021/primoprod-progress-report/). Since then, a flood of changes have made it in, including hundredth-class Android support!
@ -15,7 +14,8 @@ This report will cover from where the previous left off to the present day: 21 A
## No more ## No more
![](primoprod-itemrevealscreen.webp) ::image{src="primoprod-itemrevealscreen.webp"}
::
It's done. The pull screen is done. The element/weapon icon was added to the pull. Audio syncs up (well enough). The only thing missing is all of the fancy effects like glow and particles. It's done. The pull screen is done. The element/weapon icon was added to the pull. Audio syncs up (well enough). The only thing missing is all of the fancy effects like glow and particles.
@ -23,7 +23,8 @@ Nah, this is good enough.
## Take this! ## Take this!
![](primoprod-questscreen.webp) ::image{src="primoprod-questscreen.webp"}
::
Until now, you had to manually edit the browser's `localStorage` to gain any currency. The quest screen makes primoprod finally usable as now you can make your own long-term "quests" that give 900 Primogems each as well as set four daily "tasks" that give 30 Primogems each plus 60 when all are done — if only the base game was this generous. These are editable and can have whatever title or description you want. The logic here went through several rewrites as the structure was finalised and an interface developed to the rest of primoprod. Dailies will automatically refresh themselves on the next day. Until now, you had to manually edit the browser's `localStorage` to gain any currency. The quest screen makes primoprod finally usable as now you can make your own long-term "quests" that give 900 Primogems each as well as set four daily "tasks" that give 30 Primogems each plus 60 when all are done — if only the base game was this generous. These are editable and can have whatever title or description you want. The logic here went through several rewrites as the structure was finalised and an interface developed to the rest of primoprod. Dailies will automatically refresh themselves on the next day.
@ -55,7 +56,8 @@ Sounds incredible, right? As it turns out, as you gain more experience with tech
This is why [the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ShopScreen.vue) and the [dialog to buy things from the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemPurchaseOverlay.vue) are so nicely done! It reused most of my types and was admittedly much simpler than some of the other screens, but I only ran into one insurmountable problem: range styling. This is why [the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ShopScreen.vue) and the [dialog to buy things from the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemPurchaseOverlay.vue) are so nicely done! It reused most of my types and was admittedly much simpler than some of the other screens, but I only ran into one insurmountable problem: range styling.
![](primoprod-itempurchaseoverlay.webp) ::image{src="primoprod-itempurchaseoverlay.webp"}
::
*I wish I was actually this rich in the base game.* *I wish I was actually this rich in the base game.*
@ -65,7 +67,8 @@ As you can see, the slider looks very out of place. Why? That's because [only Fi
Up until now, only one banner was supported. This was finally fixed in November with the addition of [banner headers](https://github.com/potatoeggy/primoprod/pull/25) to match the base game. Now, you can simultaneously roll for Qiqi on *both* banners! Up until now, only one banner was supported. This was finally fixed in November with the addition of [banner headers](https://github.com/potatoeggy/primoprod/pull/25) to match the base game. Now, you can simultaneously roll for Qiqi on *both* banners!
![](selected-wanderlust-invocation.webp) ::image{src="selected-wanderlust-invocation.webp"}
::
On a side note, did you know that Vue puts all of their reactive things into Proxies? This means you can't simply `console.log(obj)` without going through five more clicks to find what you actually want. No, no. To properly print out the actual object, you have to *copy its contents to a clean, non-reactive Object* for this to work. Why?? On a side note, did you know that Vue puts all of their reactive things into Proxies? This means you can't simply `console.log(obj)` without going through five more clicks to find what you actually want. No, no. To properly print out the actual object, you have to *copy its contents to a clean, non-reactive Object* for this to work. Why??
@ -124,7 +127,8 @@ Back to laptop compilation we go!
Obviously, you aren't a *real* free and open source project if you don't have [pretty badges](https://github.com/potatoeggy/primoprod/blob/master/README.md) on your README. This was a major concern, so I copied Vue's style and now made primoprod a proper FOSS repo — build checkmark and badges and all! Obviously, you aren't a *real* free and open source project if you don't have [pretty badges](https://github.com/potatoeggy/primoprod/blob/master/README.md) on your README. This was a major concern, so I copied Vue's style and now made primoprod a proper FOSS repo — build checkmark and badges and all!
![](primoprod-badges.webp) ::image{src="primoprod-badges.webp"}
::
## Kids and their phones ## Kids and their phones
@ -136,7 +140,8 @@ ItemRevealScreen? What's that? Now [WishBanners](https://github.com/potatoeggy/p
At last, though, we have a [proper mobile UI](https://github.com/potatoeggy/primoprod/pull/33). At last, though, we have a [proper mobile UI](https://github.com/potatoeggy/primoprod/pull/33).
![](mobile-primoprod.webp) ::image{src="mobile-primoprod.webp"}
::
Still some niggles to work out, but it looks "good enough"! With the completion of proper mobile orientation came the merging of the [Android branch](https://github.com/potatoeggy/primoprod/pull/32) made with [Capacitor.js](https://capacitorjs.com/), basically the mobile equivalent of Electron. It has even more niggles than the web version does. Still some niggles to work out, but it looks "good enough"! With the completion of proper mobile orientation came the merging of the [Android branch](https://github.com/potatoeggy/primoprod/pull/32) made with [Capacitor.js](https://capacitorjs.com/), basically the mobile equivalent of Electron. It has even more niggles than the web version does.

View File

@ -1,7 +1,6 @@
--- ---
title: "Rust Changes How You Think And Code" title: "Rust Changes How You Think And Code"
date: 2022-11-27 date: 2022-11-27
_draft: true
tags: tags:
- tech - tech
- rust - rust

View File

@ -1,7 +1,6 @@
--- ---
title: "What's Wayland? Linux's \"New\" Display Server" title: "What's Wayland? Linux's \"New\" Display Server"
date: 2022-12-11 date: 2022-12-11
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,7 +1,6 @@
--- ---
title: "Why Use Web Frameworks?" title: "Why Use Web Frameworks?"
date: 2022-10-30 date: 2022-10-30
_draft: true
tags: tags:
- tech - tech
- albatross - albatross
@ -117,4 +116,4 @@ This splitting of logic makes it easier for your brain to focus on specific subc
Web frameworks offer a lot of advantages over writing in a more imperative style. However, their abstractions do come at a cost — an extra minimum [16 KB](https://vuejs.org/about/faq.html#is-vue-lightweight) in JavaScript has to be fetched from your server, which can increase bandwidth costs and make your site slower. Web frameworks offer a lot of advantages over writing in a more imperative style. However, their abstractions do come at a cost — an extra minimum [16 KB](https://vuejs.org/about/faq.html#is-vue-lightweight) in JavaScript has to be fetched from your server, which can increase bandwidth costs and make your site slower.
Ultimately, in creating your website, much like when you do anything else, you should weigh the pros and cons of web frameworks before deciding to go with one or the other. Ultimately, in creating your website, much like when you do anything else, you should weigh the pros and cons of web frameworks before deciding to go with one or the other.

View File

@ -1,7 +1,6 @@
--- ---
title: "Running Windows Apps on Mac and Linux" title: "Running Windows Apps on Mac and Linux"
date: "2022-10-16" date: "2022-10-16"
_draft: true
tags: tags:
- tech - tech
- albatross - albatross

View File

@ -1,134 +0,0 @@
---
title: "Primoprod Progress Report 3"
date: 2023-12-29
tags:
- tech
- primoprod
- featured
---
Welcome back to another one of these development posts! It's been almost two years since [the last one](/blog/2022/primoprod-progress-report-2), so there are plenty of changes to talk about. Primoprod is more polished than ever, but a couple of questionable initial design decisions made it harder to work on than before.
<!-- more -->
## Pretty pretty pulls
There's a summary screen for 10-pulls now! It has that nice slide-in animation from the base game too, along with (largely) proper item alignment and a sorting algorithm that is not exactly like the base game's but works well enough to generalise outside of Genshin too.
The last step for this screen is to have the rush of particles in the base game for 4- and 5-star items, but that's incredibly difficult for someone not frontend-oriented like myself.
![(SPOILERS FOR FONTAINE'S ARCHON QUEST) Hydro Dragon acquired!](primoprod-10pull.webp)
Not only that, there are lots of small improvements to better mimick the base game! For example, weapons now have their weapon background behind them:
![What a beautiful sword.](primoprod-weapon-bgs.webp)
Banner headers are now dynamically generated instead of taken from screenshots, so now they can be nicely animated!
![No more screenshots >:(](primoprod-banner-headers.webp)
Version 3.0 of the base game brought a new book UI for the details and wish screens. I'm proud to announce that Primoprod was the very first simulator to incorporate it into its design!
![](primoprod-book.webp)
## Performance and prefetching
These are only a few of the design changes that make Primoprod a prettier and happier simulator. However, beauty means nothing if no one can see it. Luckily, update 1.2.2 of Primoprod brought some much-needed optimisations that make its web version much more palatable.
As of writing, Primoprod has around 75 MB of assets that it may need to show to users, the bulk of which is wish splash art. Previously, all of this was delivered as PNGs on demand, which resulted in noticeable lag waiting for the image when going through 10-pulls. By converting media to more modern formats, Primoprod gains nearly a *5x decrease in load times!*
Specifically, all PNGs were converted to WEBPs, MP4s to WEBMs (except for Safari, which doesn't support it), and MP3s to OGGs (except for Safari, which doesn't support it).
But that's not all! A 5x decrease in load time is still noticeable load time. The user doesn't want t to wait a few hundred milliseconds when they click the wish button, so we need as little latency as possible.
As it turns out, fetching the wish animation videos while the user is chilling on the main banner screen is both incredibly easy and incredibly rewarding — as long as the user doesn't wish right away, they can download the videos in the background so that when they start gambling, they don't have to wait at all!
Primoprod uses this same tactic to prefetch pull splash screens. Because rolls are determined the instant the user presses "Wish", it can prefetch the splash images required while the meteor animation plays, which means that splash screen animations are also instant! With a sufficiently fast internet connection (~1-2 MB/s), there ends up being *zero load time* for the user.
Of course, the downloadable versions of Primoprod (desktop/Android) will still always be faster, but this is such a noticeable decrease for users that it was a no-brainer.
## Quash the larvae before they hatch
### Oh, you sweet summer child
Things have changed a lot in the web development landscape since I began this project back in July 2021, and those changes have highlighted both the bad and the good in my initial designs.
I chose to use TypeScript and Vue 3, both decisions that hold up today. However, I opted for Vue's Options API over the new Composition API, which resulted in [a headache](https://github.com/potatoeggy/primoprod/pull/54) when I tried to read my old code — not helped at all by the fact that Primoprod was my first foray into web development, and there is some truly atrocious code:
```vue
<template>
<img
v-for="weapon in ['Bow', 'Catalyst', 'Claymore', 'Polearm', 'Sword']"
:key="weapon"
:src="getWeaponBgImage(weapon)"
:class="[
{
'active-bg-img': true,
nofilter: true,
'display-none': currentItem.element !== weapon || animationIndex < 0,
transparent: animationIndex <= 0,
'animate-weapon-bg': animationIndex === 1,
},
]"
/>
<img
:src="currentItemImage"
:class="{
'animate-image': animationIndex === 1,
'zoom-image': animationIndex === 0,
'active-img': true,
'active-img-weapon': currentItem.type === 'Weapon',
transparent: animationIndex < 0,
}"
:alt="currentItemImage"
@animationstart="playSfx"
@animationend="if (animationIndex < 2) nextAnimation();"
@load="nextAnimation"
/>
<!-- the reason why the double check is needed is
that the two animations for the drop shadow count
as two animations and trigger animationend twice -->
</template>
```
Another issue I didn't foresee but still ended up to be a real pain was Webpack. [Vite](https://vitejs.dev/) is the new kid on the block, built specifically for Vue, with the major advantage of being extremely fast. At Primoprod's scale — and Primoprod isn't even that big of a project — Webpack takes more than ten seconds to start the local dev server. Which is slow!
```
Done in 12.38s.
yarn build 57.47s user 9.66s system 535% cpu 12.528 total
```
### You will never take prop drilling away from me
Behind the scenes, a lot of systems have been tweaked and changed over the years as Primoprod grew in scope. [Pinia](https://pinia.vuejs.org/) is a global store for Vue (similar to Redux in React) that Primoprod now uses to hold information such as the current banner, inventory, and settings.
Previously, all of these were drilled deep into nested components, which is really not great.
What *you*, the user, gets out of this are a bunch of bug fixes and some really nice quality-of-life features:
![Why earn gems when you can just cheat?](primoprod-settings.webp)
Now you can choose to have infinite fates! And roll only Qiqi! And even go back to older banners, a long-overdue feature.
### Quests
Quests have been rather neglected since their release pre-1.0 a couple years ago, largely because I no longer use it to stay productive. Recently, they've received some love and a *lot* of patches to fix some really strange behaviour.
![](primoprod-quests-overhaul.webp)
First, there is a character limit in the title, and the box height has been slightly increased to allow multiline titles to properly overflow. Daily commissions now have icons to make it more obvious and also to copy the base game. Lastly, a bunch of bugs related to lists and quest ordering were squashed to avoid the janky horror that was pre-1.4 quests.
### For the mobile gamers in chat
Primoprod's mobile version has received the most love of all! Strangely, in WebKit-based engines (Chrome, Safari, Android WebView), using `background: fixed` with `transform: rotate(...)` causes the browser to ignore the `background-image` property. This broke mobile backgrounds on everything but Firefox Android, so that needed to be worked around.
On Android, things have tidied themselves up a bit as Primoprod comes ever closer to being able to fool the untrained eye. The notification bar used to annoy people by being ever present in the corner — now it's gone. There used to be a strange black flash right before playing videos — now that's gone. And video playback used to be very squashed on mobile — that's fixed too!
All in all, the squeaky platform got the grease.
## The future
As Primoprod approaches its two-and-a-half-year anniversary, it is slowly time to say goodbye. Updates have become more sporadic, and even I don't use it to be productive anymore. There is only so much one can polish something before it starts to blind them. This progress report may be its last.
But it was fun while it lasted!

View File

@ -1,53 +0,0 @@
---
title: "Sunsetting the Eifueo Project"
date: 2023-05-23
tags:
- eifueo
- retrospective
---
For three and a half years, the [Eifueo project](https://eifueo.eggworld.me) has dutifully carried out its task of collecting and organising notes in a way that would be quick and easy to review. Although this worked out wonderfully in high school, the method is both inefficient and insufficient for the pace of higher education.
So how can we make it better?
<!-- more -->
We can't.
At their core, engineering courses in university are about problem-solving. Instead of blindly memorising rules to be applied once to get you the answer, you blindly memorise rules to be applied *two or more times* to get you the answer.
If we have to do that, it's much easier to write plenty of practice problems instead of rewriting plenty of notes.
## It takes too loooooong
Reformatting notes is not an easy endeavour. We have to re-examine our old notes, research any ambiguities, and then write all of them up in a way that is clear, concise, and professional. On average, I'd say that it took a good hour or so per day to finish Eifueo for six courses. Imagine the number of practice problems I could finish if I allocated Eifueo's time slot to those instead!
## It's booooring
Me? A writer? Imagine.
This one isn't actually too bad, and doing practice problems instead isn't going to help much, but think of all the other fun things I could be doing instead. I already *have* the notes. If I need them, I'll just look back at them.
Anyway, by the end of Eifueo's lifespan, most of the content was regurgitated onto the site.
## It doesn't help nearly as much for exams
This is perhaps the biggest reason, and I have to say that I'm quite disappointed in the education system for this one.
High school had many courses that were "expression"-focused, and those were the courses that Eifueo excelled in. English, chemistry, and history all were less about getting the answer or precise process correct, and more about how well you can bullshit your way out of it. Even math was pretty easy to apply a shallow formula and get the right answer.
![We love nice TAs!](thanks-192-ta.webp)
Unfortunately, the physics courses are antithetical to everything Eifueo stands for. They have a rigid structure that you can't bullshit your way out of but are also flexible enough that you can't simply apply a formula. The best way to get good is simply to do more problems.
You'll have to understand that this greatly saddened me as a person who tries his hardest to do *less* problems. The cost-benefit ratio isn't worth it anymore.
## Retrospective
With a heavy heart, I must bid farewell to one of the first services I ever deployed to my server. Eifueo has tried its hardest to help me keep up, but I can only avoid doing practice for so much before it actually bites me in the butt.
o7 It has served me well.
![At this rate, I'm going to be an expert in perspective art!](assessment-art.webp)

View File

@ -1,67 +0,0 @@
---
title: "Selected Excerpts from NaNoWriMo 2021"
date: 2024-09-23
tags:
- nanowrimo
- featured
---
You're lucky he hasn't spotted you, otherwise you might've had to talk to the man in the moustache. It's not that you're intimidated by his moustache, but adults — probably Mesa's father — are just hard to talk to. Especially if they have a glorious moustache like that. You rub the skin above your upper lip longingly. Only the tiniest of hairs there.
<!-- more -->
---
You nod politely in return, standing up straight to make use of your 162 (nearly 163) centimetres of height as best as possible.
---
How educated this man must be, to have such an open mind that he would even read the truth! And what courage to hide the forbidden book in such a copy!
Your respect for his moustache increases tenfold.
---
Chopsticks? Your eyes search for but fail to find a spoon, let alone a fork or knife. The two Baccaloreans in front of you are nomming away contentedly. Savan glances up first but returns to eating, your acting skills easily passing off your ignorance of the useless and convoluted sticks as genuine admiration of the dish.
---
Of course something is wrong, you're going to make a fool of yourself by not knowing how to use two sticks to pick up food! What's the point of sticks over straight-up using your own hands? At least refined utensils like the spoon provide extra functionality that you weren't naturally born with. How is he picking up that rice with those things!
---
Both of their eyes are on you now as you reach for the chopsticks. You can't lose face now. The handbook on Baccalorean included a section on using chopsticks, but you've never had any practical experience with them. You check that you're picking up the right side — why are they also unidirectional — and clutch them with your left hand, then deftly moving them so that they become clamped between your right thumb and index finger.
Success!
---
Ah. You'd forgotten he was asking for your opinion for the salmon. As your eyes flick to the block, your mind runs through calculations in the fraction of a second it takes for them to get there. _The salmon block is too big to fit in your mouth. Your chopsticks wouldn't be able to grip a block of that size, anyway. There is no way you can orient the block or your chopsticks to change the above two facts._
It's impossible. You have only one option.
You subtly stare at Mesa's chopsticks as they squeeze around her salmon block, forcing it into two, then elegantly twist to surround the smaller chunk and raise it to her mouth. It may be a technique you will never master.
But it will be enough for the current situation. Your chopsticks descend once more to your plate, squeezing the salmon pip until it nearly bursts, several tiny pieces that you are certain you will not be able to recover falling to your plate. A small sacrifice for the greater good. The chopsticks raise once more, this time precariously balancing a mutilated piece of salmon between their tips.
And they slide perfectly into your mouth, securing your prize once and for all, thereby ending the chopstick saga forever.
---
You keep your praise minimal so as not to inflate Savan's ego and to keep him humble.
---
"A _benevolent_ dictatorship," Savan corrects you. "Our goddess has a moderating effect on society so that no one gets into really heated debates because she's the ultimate mediator. She prevents problems before they get worse. That's compared to Constu, where you guys break things halfway through and revert to normalcy."
"Nonsense. We call that 'agile' development. It's the fastest way of finding out which things stick and which don't. My teachers always said that taking risks is an important life skill to have. Your goddess never takes risks and so you guys are all stuck in your small little bubble of stagnation."
---
"Hey, kid!"
You keep walking. They must be talking about someone else. Not only are you _not_ a child, you're doing very well collecting strawberries and nothing anyone can say is going to change your mind.
"Kid standing up with the funky hair!"
You whirl around to face the perpetrator of the grave insult, sending your sharpest glare his way. _"Excuse me?"_ Your hair is immaculately styled, not _funky_.

View File

@ -1,227 +0,0 @@
---
title: "Selected Excerpts from NaNoWriMo 2022"
date: 2024-09-24
tags:
- nanowrimo
- featured
---
Ganyu frowns as she pulls out a black leather straitjacket out of one of Yanfei's boxes. "Hey, Yanfei?" She holds it out in front of her. "What's this for?"
Yanfei looks up from organising her hats on the shelf. "What do you mean? Obviously, you wear it…?" Her expression is puzzled.
There's a small pause before the reply. "Never mind…"
<!-- more -->
Xiao stifles a snort. "That's right, Ganyu. Use your imagination. What else could you possibly use it for?" The straitjacket flies toward his face. Chuckling, he catches it and tosses it back at Ganyu.
---
"Uh oh, Xiao. You might want to reconsider biting into Jolly Ranchers around Yanfei," she teases. "She'll roast you on a spit."
Yanfei laughs while pinning pictures to the board on her closet. "The gummies get stuck on your teeth\! But imagine chewing a hard — wait." Her eyes narrow as her expression suddenly stills. "You meant the soft ones, right?"
Xiao looks away and proceeds to hang up a Drake poster.
_"You meant the soft ones, right?"_
"It's like a nutcracker going off every few seconds," Ganyu supplies.
Yanfei stares at Xiao, who is decidedly not looking at her. "How have your teeth not fallen out?"
---
"Nope. University math is not real math. There are no numbers."
---
_"Pink team\!"_ The sudden shout startles them, and they turn to see a man in a pink rabbit suit holding a megaphone. Yanfei's jaw drops. She's amazed she missed him in the first place. The chatter in their team stops. "Give me your attention\! Excellent. Now," he says authoritatively, pacing back and forth, "during this orientation, I am responsible for you. You will not like me. But you will _learn_. And you will understand, freshmen, that I speak for the university. From now on, you will only speak when spoken to. _Is that clear?"_
---
The rabbit man's mouth twitches but makes no comment. "Now, we head to the opening presentation. Do not lose me, or you will be severely beaten."
---
Miko leans in, smirking. "Don't go around underestimating UTI, now," she winks. "You'll be in for quite a bit of pain if you do."
---
"With free food as motivation, who could lose?"
---
Yanfei blanches. "Uh…" She scooches back. "You do make…food."
"Does she?" Xingqiu mutters. Hu Tao chops him again. "Ow\!"
---
"Where. Are. The. Vegetables?" He shudders. "I only saw _boiled carrots_."
They all look down at their plates. "There's napa in my _gyoza_," Shinobu says.
"Tofu has beans." Yanfei offers. "Those are vegetables, right?"
"What's a vegetable?" Hu Tao asks innocently.
---
Yanfei empties her own bowl. It soon fills up again to accommodate the recent group of refugees from her body. "It's not the tofu," she insists weakly, squeezing her eyes shut. "It's _never_ the tofu." Tofu wouldn't cause her physical pain to stand up. Tofu would embrace her and tell her everything's okay, that her stomach isn't the one cramping out and vomiting in the wrong direction, that the mouth on her other end isn't retching gravy and spitting all over the bowl of chocolate soup.
---
It doesn't stop. A river is flowing through her body. She imagines all of the microbes going whitewater rafting to exit her system. Only the water is neither white nor water. And the raft has spikes on the outside, as if designed to cause her the most suffering possible.
---
She's ascended to a higher plane, she feels. It's freeing — until her stomach brings her back to reality with a cheerful _mrrgle_ as if taunting her.
---
"Why is there so much work\! I have. Three. Tests. Next. Monday."
"Yeah," Keqing nods. "It's always easiest the first two weeks." Ganyu elbows her. "Oh? I mean — it's really rough the first two weeks."
---
Ganyu chuckles, eyes unfocused. For some reason, Yanfei feels a sense of dread looming behind her — oh, that's just Xiao.
---
"That's too much, Keqing."
"Ganyu, I need it\!" Keqing wails. "Are you really going to deny your girlfriend the only thing she truly loves?"
---
"Sorry, Yanfei. Kazuha's high again."
---
Sliding on her glasses, Ganyu reads the question aloud. "As _n_ approaches infinity, evaluate the limit of the *n*th root of the sine of pi over two _n_ times the sine of two pi over two _n_, all the way up to _n_ minus one pi over two _n_…" she murmurs. "Okay. What don't you get?"
---
"No, you messed up again here, I'm not sure how you got that. Five plus two isn't seven, it's… Oh. Wait, it is seven."
---
Xiao continues to watch television. "Yes. Yanfei helped. Your recipe is quite based — there's more left in the fridge for you."
Ganyu pauses. "Huh. Thanks. Nothing burned down, I hope?" She peeks around as if searching for scorch marks.
"No. Yanfei almost tried to grind the almonds with an egg beater though. That was cringe and unbased."
A few seconds pass in silence. Xiao looks up. "Ganyu?"
Ganyu stares at him with an expression of unbridled horror. "W-what happened to you?"
"Is there something that is sus? Yanfei taught me some common slang used by university students. That was very poggers of her."
A quiet _thump_ resounds as Ganyu sits down heavily on the nearest chair she can drag over. Eyes unfocused, she gazes into empty space. "No — just —" She abruptly gets up. "I'm going to talk to Yanfei."
"Kek-double-U," Xiao states.
---
"Good decision," Yanfei nodded. "If you don't overflow on CRIT Rate, it's your best-in-slot in freeze teams. Second BiS in melt, too."
---
Evidently, the fish did not want to be a new member of Yanfei's family and splashed out of the chest right onto her face.
---
Yanfei nodded agreeably. "Yeah, Magikarp kinda sucks. The only thing it does is splash around. Magikarp," she declared, "you have disappointed me for the last time. By the power invested in me by myself, I sentence you…to exile\!"
---
She shudders, imagining the explosion in her gut if she had to live off of dorm food. Then the state of the communal bathrooms for everyone who has to live off of dorm food.
Nope. She's _very_ glad to be living off-campus, actually.
---
She can only imagine the level of flex Hu Tao has by having the ability to hand out _bubble tea_ to people who come over.
---
Yanfei's fake moustache falls off from how long her jaw has been stuck to the table. She pushes up her sunglasses, rubbing her eyes as if she can't believe what she's seeing.
---
"I mean, I totally get why," Hu Tao says dreamily. "Yun Jin's a real piece of eye candy. I just want to _bite_ into her pompoms\! It's too bad she doesn't lean that way."
---
"Here in my apartment, we've just got this new blender, so don't mind Ganyu being vegetarian over there. But you know what I like a lot more than materialistic things?"
Yanfei points at the television. "Knowledge. And where else can you find more knowledge than in appreciating art?" She claps her hands. "So that's why we're gonna play Mario Kart\! I read in a book somewhere that competition nurtures the mind."
Hu Tao nods along like it all makes perfect sense. "So if I win, I get smarter?"
"Damn," Shinobu says. "We're all gonna be geniuses by the end of this. Except for Hu Tao."
---
He knows her much better — she wouldn't get him something mortifying like a _Link body pillow_. Ganyu's box is smaller than Yanfei's, which is a strong sign that it doesn't contain a Link body pillow.
---
"I noticed that your Pikachu pyjamas were starting to wear out. You must have had them for _years_ now. So I got you another pair\!"
---
"By the way," Yanfei says as Xiao takes his very first bite, "we knew you didn't want something too unhealthy for breakfast, so we tried out spinach as the main ingredient this time. What do you think?"
---
A girl and a boy sit in a Meet Fresh booth, its logo prominently displayed on the wall behind them. "Have a shaved ice," the girl whispers to the boy in the movie. "It's delicious. Made out of 100% fresh fruit. Just like me."
---
Yanfei averts her eyes until the subtitles stop saying \*\*SLURP SLURP SLURP\*\*.
---
"Then don't you want to eat me out?" the girl says huskily, caressing his cheek. "Like you eat out Meet Fresh's watermelon shaved ice, only available here for $9.99?"
"But isn't that expensive?" The girl gives him a look of utmost concern like he's just said that he's about to die.
"Our love is worth it," he reassures her. "Just like how the taro red bean soup is worth the $5.99 at Meet Fresh." He pulls out the dish from behind him. It looks overly bright and shiny, almost exactly like the picture in the menu. "Wouldn't you like to try one?" The boy takes a sip, then holds it up to the girl, who lovingly meets his gaze as she eats the rest of the spoonful. Both of them sigh with joy in unison.
---
Instead of the usual beach boy masquerade, today Xiao's hairdo looks like Morax decided to play cat's cradle with it but got bored before he finished.
---
"Welcome to the fourth meeting of the Debate Club. May we recognise that we are nothing but pawns to the great…Debate Club." She holds out a spiked metal bat to the skies.
---
"Objection\!" Yanfei buzzes. "Chewbacca override."
"Sustained. Sumeru, please be aware that the club formally forbade use of the Chewbacca Defense effective the 21st of November."
---
Yanfei spreads her arms. "Respectfully, Fontaine requests that the opposing counsel consider the implications of curves on pancakes. In reality, the inherent lack of structure _inside_ the pancake must lead to highly undesirable flopping, just like Mondstadt's tiny pp when he sees one\!"
Chongyun slaps the table, standing up and pointing at Yanfei. "Objection\! Inadmissible evidence\! The counsel from Fontaine…has highly exaggerated the size…of my colleague's…" Xingqiu practically drags him back down beside him, mildly red.
---
"It's okay. It's not actually losing if you lose against Numeron."
---
"They are. For this question, you're supposed to apply IBP twice. See how you can rearrange it with _u_\-substitution to make negative _x_ squared with _e_ to the negative _x_? That leaves you with another integral of negative _e_ to the negative _x_ by two _x · dx_. Then by doing IBP again, you end up with this negative _e_ and a quadratic."
---
"Is this really life, though? Dogs chasing their tails in circles over and over again?"
Yanfei nods firmly. "It is the very pinnacle of life. The epitome of all we strive for."

View File

@ -1,367 +0,0 @@
---
title: "Selected Excerpts from NaNoWriMo 2023"
date: 2024-09-25
tags:
- nanowrimo
- featured
---
My, little Peony must have such pain in his heart to so coldly shrug off an earnest request. Perhaps he suffered from childhood trauma in which his family was brutally murdered and thus he was forced to be independent, grew up much too fast, and now his heart is locked away, waiting for someone with a kind heart to bring him back to the world. But I digress.
<!-- more -->
---
A rather melancholic tune, if I do say so myself. If I were forced to speculate, I might say that he suffered through a traumatic in his adolescent years that closed him from the outside world. A troubled soul, lost and alone, dreaming of the golden years of his past\! But I digress.
---
"Sialia, humans are fascinating characters. Oftentimes quite dim, but fascinating nonetheless. Simply because _you_ have the brain the size of an earthworm — don't chortle on me now — does not mean that my _dear, cherished_ grandson isn't intelligent enough to desire a broader perspective."
---
Don't give me that, young sir\! If your wings are sore already, you'll be stuck in Los Angeles for the winter\! And what sort of self-respecting bluebird would let themselves stay in _LA_? The place is for lazy, sheltered, never-had-to-work-a-single-day-in-their-life cocks, that's what it's for. I shan't let you do it, not while these old bones can still slap you out of the sky\!
---
Are you still sore? Yes? Stick a worm in it. Here. Some nutrition. _Properly_ prepared earthworm, not like that bland, processed feed I came back to last night. I had thought your mother would have properly taught you how to feed yourself.
---
Keep an eye on the blue car beast. Humans feed them stinky earth juice, and in return, they regurgitate the humans when the human feels like it's traveled far enough.
---
Observe. This is one of the many human education institutions. Humans are incredibly stupid, so unlike us bluebirds, in order to do anything, they have to attend years of classes simply to learn what they can and cannot eat. See? They can't even eat nuts. Truly, I pity the poor species.
---
If there is one appendage to admire from the humans, I must say it has to be their nose. Not only can they smell far better than we can, it's so expressive when they wrinkle it so.
---
What a wonderful girl. When she wants something, she takes it. Be like her when you grow up. She also understands what power she has, and makes full use of it. If you never show off your skills and abilities, you'll never attract a good mate. It's important that every single bird around you knows just how competent, how amazing, how fearsome you are. _Oh, David…_
---
What's a little bloodshed between friends?
---
My, the poor girl must be suffering from whiplash more than the time I slammed into a car's windshield\!
---
"No, I can't\! Every time I even _think_ about being nice to that girl, I want to sock her so hard that her head springs back to knock both of us out so we don't have to interact. Please, Brooke. Be my Pamela shield."
---
They call it The Spanking. When a student and a teacher hate each other very much,
---
Lady, if your eyebrow lifts any higher, it might grow wings and migrate to Vancouver with us.
---
When you grow up, dearest Archie, desire nothing but to survive, thrive, and bear children. You'll be happier that way.
---
What is this nonsense? If you can back up anything you say by beating other birds up, you're right. Who's going to tell you otherwise? This isn't the first time I've heard this argument from humans. No wonder they bicker so uselessly among themselves so often and never get anything done.
---
Mind your wings — best not to get lost in the scent of Subway, lest you become addicted. Your great-grandfather was once a renowned human-watcher, but he strayed too close, too many times, and was Subway-ridden for the rest of his life. Couldn't fly a quarter mile away before his wings would lock up and he fell out of the sky.
---
Hm. Perhaps there is a flaw in this human. I do not believe that I have ever seen so many crosses.
---
We do not poke fun at those unable to fly — we can only look down upon them, sympathise, and offer our condolences.
---
Get up, or I'll make you live in Los Angeles for a week\!
---
I was once an engineer, you know. I was present at the founding gathering of the International Engineering Society. _Delicious_ seeds. Truly some of the best food I've ever had.
---
So what if you've heard it three times? This is an important cultural milestone of our species' history\! You should listen to it at least ten times\!
---
Perhaps I chose a flawed human. I do not believe that they are supposed to sprint across the middle of the road quite like that. Or be struck by their car companions like that.
---
Personally, I must interject to say that carrots are an abomination. Along with potatoes. No fruit, and you have to pull them out of the ground to eat them. And what do you get for all that effort? A bloody chore of a food, that's what you get\! Disgusting, starchy, barely juicy things, those are. Humans are a truly a different breed, they are. I'll forgive the child just this once for this transgression.
Bah. Mind your tongue. Simply because you hold objectively incorrect opinions close to your heart does not mean that you can spout off such nonsense in front of civilised birds such as myself. Didn't your father tell you to respect your elders? Be grateful that I refrain from using strong language in front of underage birds.
---
One of the any churches in the world. Legend has it that some idiot human strapped himself to the cross and got killed.
---
No, Elizabeth, snap yourself out of it\! Remember the vomiting. Remember the vomiting. Yes. Ahh…
---
What kind of stupid, arrogant, _deranged_ bird would voluntarily come to _Los Angeles_?
Oh, my. Ahem. What I mean to ask was — what kind of strong, dashing, chiselled, courageous, alluring, scarred-backstory bird would voluntarily come to _Los Angeles?_
---
"Liz, I swear, the next chance I get, I am going to take the gleeful, probably cancerous prick growing out of your head and ram it up your —"
---
"I still cannot believe that you're here because you wanted to check out a hot bird."
I very explicitly _did not_ say that, Sialia. Stop putting words into my beak.
"Right. How did you put it? 'The most incredible bird you've seen in years. His physique, his manner, his scars'? I can't possibly imagine how that could be construed as something even remotely romantic. No, not at all."
Your harsh words wound me. Still so sarcastic.
"She calls me harsh\! Archie, who do you think is harsher? Me or your grandmother? It's okay if you say me. Liz is completely harmless."
What did you say? Are you calling me _old?_
"Aren't I?"
Why, Sialia, if I weren't so generous, I would have your head pinned to the ground under my claw until you begged for mercy.
"Aw, thanks\! I have to say — you have better lines this time. If you want to get this William Swainson —"
That's William _John_ Swainson to you.
"— this William _John_ Swainson — between your legs, you have to try a little harder than _that_."
I have _years_ of experience, Sialia. I'm not a fledgling anymore.
---
Don't be so picky, child. Eat it. You heard Sialia. She'll be very much heartbroken if you don't try it, you know? She'll fall over, bawling her eyes out to the world, body wracked with sobs at the sheer offense brought to her by one small bluebird named Archie. But I digress.
---
Ah, young love. The boy and the girl look so happy together. You know, child, that in my youth, I was _hounded_ by men for who they thought I was? It is wonderful to see that today's human youth have moved on past such frivolities. To my knowledge, it is still an ongoing issue with us. If the boy and the girl were bluebirds, they would treat every interaction like a transaction, until they realise that it isn't worth being so on guard to every single person around them and decide to love each other unconditionally.
---
I have seen humans gleefully _stab_ each other simply because of infatuation, just like bluebirds. Literally _every single_ couple in human society has major issues that prevent them from being a perfectly functional unit. Every single one.
---
Ice cream is another food that will kill you. No matter how much sugar you detect, it's poison\! All poison. Humans should be ashamed, leaving out bait for good, honest birds to consume. And it's not like they eat them either\! We simply die for nothing. How incredibly rude.
---
"It exists. Therefore it's wrong. And because you're defending it, it must be wrong. See how everything logically ties in together so neatly?"
"I'm gonna throw you off the hill."
"With your noodle arms? Fat chance."
"These noodle arms picked up your skinny ass once before, Jeremy."
What did I tell you, Sialia? They're already threatening violence. We just skip the discussion bit and go straight to the violencing. Another way how birds are significantly more efficient than humans.
---
Every human relationship ends up like this eventually. They argue back and forth with each other until one of them breaks.
"Archie, don't listen to your grandmother. She doesn't understand a bit of friendly ribbing. Banter, if you will."
_Banter?_ You call this _banter?_ No wonder you don't have a partner, Sialia. If you consider this "friendly ribbing", I shudder to imagine what you must consider verbal abuse.
"Have you listened to yourself recently?"
---
"Just one question. Did it hurt?"
"What do you mean, sir?"
"When you fell…"
"I didn't fall?" An important lesson to you, child. Although the girl has a blissfully unaware expression on her face, you must hone your instinct to realise that we are moments before disaster. Sialia, if you don't let me leave, I will hide ants in your nest.
"…from heaven."
I'm going to vomit. Let me vomit, Sialia. You can't tell me what to do. I don't care how much seed will pour out of my beak. I cannot spend one more minute listening to this sappy nonsense.
"Uh, it's a metaphor. It means you're beautiful. Are you an angel?"
"…No. Thank you. Will that be all?"
---
"Yeah, you'd like that, wouldn't you? You dirty, dirty freak."
"Yes, I'm your dirty, _dirty_ freak\! I want it so, so much."
"Now get on your knees. The handcuffs stay on. That's an _order_."
"Ha… Yes, yes, of course\!"
"Did I say you could talk back to me?"
See? Now _this_ is proper flirting. Mind the whip. At this range, it could clip your wing off. If I were a human, I'd marry this human right now and here\!
What are you two looking at me like that for?
---
"Sorry about that. You must be tired."
"Yeah."
"After running around my head all day."
No, _do not smile, girl,_ what is wrong with you. I have had it with this couple\!
"That was terrible and you should feel terrible."
"Aw… But you love me anyway. You smiled\!"
"I did and I hate it. But I love you anyway."
---
"Liz, sometimes I get the feeling that you're not listening to me."
Of course I do. When have I ever not acknowledged anything you've said?
"I mean, I feel like you never really consider it."
I consider everything from everyone at great length. I am always correct, after all. In order to be so correct, I must acquire any new information as fast as possible.
---
If I hear that _inane_ word one more time, I might have to commit bodily assault on one of the humans here. Thank you, child, I do not need the earplugs.
"Dude\! You're so based. It's so fire, bro\!"
---
"Rio, pass me the laptop\! To save the dragons, I've got to hack into the Nomekop mainframe and eliminate all traces of Aderyn before we land\!"
---
I can only imagine the people at the ends of those sticks, poking and jabbing him in all the most sensitive places to make him squeal.
What do you mean, _you'd love that?_
---
"Maybe I should get a new cardigan for myself. Just in time for spring. How about this purple-and-yellow polka dotted one?"
Gah\! My eyes\! The contrast is too great\! Yet I can't tear my eyes away. It is — it is _objectively_ offensive to the eyes.
"Gah\! My eyes\! That is the most _offensive_ cardigan I've ever seen. I didn't even know they could make them like that. You should get it."
"You think so? I think it'd be funny to stroll around in this. Change up the look a little."
"I agree\! You should totally buy it."
"Hang on, let me get someone else's opinion on it. Hold my stuff while I change?"
I see. She must remove her existing outer layer of clothes before putting on a new outer layer of clothes. Such a hassle that they even have a dedicated private room for it.
Oh my goodness. I cannot look at her. I think I might go blind. My eyes feel like they're flying into a glass sliding door over and over again. It's horrifying.
"Honestly? It's better than I thought. For some reason, it doesn't look nearly as offensive on you as it did alone. They won't run you out of the store for this or anything. I'm still going to pretend that I don't know you." Pardon me? Madam? Do you need to see an eye doctor? Perhaps acquire some glasses? Are we looking at the same shirt? Did your eyes perhaps lock themselves into place looking at her face and steadfastly ignoring every other part of the outfit for the sake of their sanity?
"Strange. Don't be a scaredy-cat, Shayla. I thought it was abominable. Come on. Excuse me? Hi." She's roped in a new poor woman. May Garuda have mercy on your eyes. "So sorry to bother you, but on a scale from one to ten, how offensive is this outfit?"
"One. No contest."
"One being least offensive."
"Yeah, still a one. I feel like I can barely see it. It's pretty hard to notice." Her eyes are locked onto Mira's face. No wonder it's difficult to notice. The sight is elicits such a visceral reaction that their eyes dedicate all of their power toward self-preservation.
Mira must not be able to see the full thing, so when she looks down at her cardigan and back up, she doesn't get the full effect.
"Huh. Thank you very much. Shayla, I think I want a third opinion. I think maybe both of you are gaslighting me or something."
"It's fine, Mira. How could we both be gaslighting you?"
"I don't think I saw either of you actually look at the cardigan. It kinda felt like you were staring directly in my eyes the whole time."
"No way."
"Let me find someone else who might have functioning eyes. Ah. Excuse me\!"
"Hello, yes? How may I help you — _good glory\!_ My _eyes,_ my _EYES\!_ Ma'am, I am so sorry, but my brain is restraining me from looking in your direction — it's the cardigan, I swear, not you personally."
I knew it\! Finally, my opinion validated. I was beginning to wonder if our superior inhuman eyesight was the only thing that let us recognise truly how ugly that cardigan was.
"Thank god\! I was about to believe my friend when she said that it looked fine. How could dull yellow polka dots work on a purple fabric?"
"Absolutely — wait. Was that from _here_?"
"You bet. Picked it up from the bunch of cardigans over there."
"Yeah, no. That is not okay, ma'am. Sorry, but — ahem. In my professional opinion, I would advise you remove that cardigan and let me take it to the incinerator."
Such a wise employee.
"I kinda wanna take it home, though. It gets really good reactions."
"Look, ma'am, if you want to take it home, I'm not going to stop you. But I hope you know what you're doing."
"Of _course_ I do. Right, Shayla? When have I ever not known what I was doing?"
"Shockingly, very few times."
"Exactly. So let's go check out. I still want to visit the market on Main Street going on this week\!"
---
It's a classic\! A man and a woman meet in a bar. She comes here looking for a drink and an escape from her reality, but instead, she finds a man who, although he seems aloof, is actually the mask in front of a troubled soul who, after a great shift in his life, is trying to get his life back together.
---
All of your problems are solved now that you've found a man\!
---
I have seen _worms_ inching faster than these two progressing their relationship.
---
Look at the development. The progression. At this rate, they might even get together before I die.
---
That sputter is reminiscent of the tractor that killed your Uncle Jordan.
---
Now, some mouth-to-mouth action — that's what we're here for. The way the human lips lock together…the way the heads move as one as hands scrabble for grip… Even an old bird such as I can tell how much passion there is in a good, long kiss\! If birds had lips, Marty would be blown away by how much love I'd make to him.
---
"Let me show you how to use a carving knife…"
I wish he would show her how to carve out a future for them together instead.
---
"Son, maybe the times are changing. And I respect that. But no matter what happens, never lose that fighting spirit. Can't fight the girls? Fine. There's still a good half of the population you can beat some sense into. Now, if they say that _fighting is bad_ and that _no one should do it_ or whatever? That's when you put your fist down and screw the rules. Let no one tell you what you can or can't do."
"I'll do my best, dad\!"
"I know you will, son. Make me proud. Nothing like a good fist to the noggin to help loosen any lips."
Wonderful parenting. _This_ I can get behind one hundred percent. I know I have a lot of negative things to say about humans, but in reality, they're so diverse that there are so many different viewpoints to learn from. There are some that are objectively wrong, some that are objectively right, and then most are in the middle. It's rather refreshing to have one's opinions validated every once in a while.

View File

@ -2,12 +2,10 @@
title: Run On title: Run On
date: 2020-04-16 date: 2020-04-16
tags: tags:
- complete nonsense - complete nonsense
- you could say that the story *ran on* badumtiss - you could say that the story *ran on* badumtiss
- these are like ao3 tags now - these are like ao3 tags now
nopreview: true nopreview: true
--- ---
<!-- more -->
I was running from a dark thing and it was all horrible when my eyes snapped open and I looked at my alarm clock, which said that it was ten in the morning, which meant that I was going to be late for school unless I teleported back in time, so I got up and rushed to put on my clothes and do everything, then I didnt even eat breakfast as I rushed to school before realising I could use my magical powers that I could as soon as I turned eleven to turn back time and avoid all this mess, so thats what I did, but only after I actually ate breakfast and took my time, then I looked deep into myself and used my powers from friendship and determination to go back three hours (my friends were the bestest ever after I saved their lives using my magical powers), and I walked calmly to school, trying not to blush at my boyfriend (who is actually the hottest werewolf ever) when he suddenly popped out of nowhere, and I clutched his hand because I loved him so much, then he said, “oh hi babe whats up?” then I said, “oh nothing,” then I giggled because he was so funny and then he laughed because I laughed then I laughed because he was laughing because I was giggling and everything was awesome, until suddenly a tree burst from the ground and we couldnt get to school because suddenly there were tree monsters everywhere and I got scared but I knew that John (the werewolf) would protect me because he was a werewolf and so he transformed into a blue wolf (the rarest and most powerful kind) and after that he used his magical powers to vaporise the tree monsters with flashes of light and they all disappeared, and then I hugged him because I was scared and I said, “I was scared, thank you,” to which he said, “oh its nothing I would always protect you, my love,” and then I giggled again because he was being so cute, so I stared into his brilliant blue eyes which I only just realised matched the colour of his wolf form and admired all his really big muscles which would save me from any tree monster, but then suddenly he tensed and I realised that he was tense so I ran behind him again and peeked out from behind his shoulder and saw that something terrible appeared (even worse than tree monsters!), it was a ghost, and that was the first time I saw my boyfriend scared, which I could feel using my psychic powers so I told him telepathically that it was going to be ok and I could handle it using my dark powers which were super effective against psychics, and I focused really hard but nothing happened, so I thought of the strong bond that I had with all my friends and begged them for their help because there was this ghost and it could destroy the world, then they sent all their power and my eyes glowed as I tapped into a part of my power that i had never seen before, but it was now unlocked because of my friends determination and courage that flowed through my veins, as a white light burst from my hands that I held outstretched in front of me when I realised that this was the dark thing I was running from in my dream this morning, which I would finally kill because of the power of my friends that I had to see at school today, and I shouted as I killed the ghost, “omae wa mo shindeiru,” and it exploded and so we celebrated with my friends and they were all super impressed as I told the story and smiled at my hot boyfriend. I was running from a dark thing and it was all horrible when my eyes snapped open and I looked at my alarm clock, which said that it was ten in the morning, which meant that I was going to be late for school unless I teleported back in time, so I got up and rushed to put on my clothes and do everything, then I didnt even eat breakfast as I rushed to school before realising I could use my magical powers that I could as soon as I turned eleven to turn back time and avoid all this mess, so thats what I did, but only after I actually ate breakfast and took my time, then I looked deep into myself and used my powers from friendship and determination to go back three hours (my friends were the bestest ever after I saved their lives using my magical powers), and I walked calmly to school, trying not to blush at my boyfriend (who is actually the hottest werewolf ever) when he suddenly popped out of nowhere, and I clutched his hand because I loved him so much, then he said, “oh hi babe whats up?” then I said, “oh nothing,” then I giggled because he was so funny and then he laughed because I laughed then I laughed because he was laughing because I was giggling and everything was awesome, until suddenly a tree burst from the ground and we couldnt get to school because suddenly there were tree monsters everywhere and I got scared but I knew that John (the werewolf) would protect me because he was a werewolf and so he transformed into a blue wolf (the rarest and most powerful kind) and after that he used his magical powers to vaporise the tree monsters with flashes of light and they all disappeared, and then I hugged him because I was scared and I said, “I was scared, thank you,” to which he said, “oh its nothing I would always protect you, my love,” and then I giggled again because he was being so cute, so I stared into his brilliant blue eyes which I only just realised matched the colour of his wolf form and admired all his really big muscles which would save me from any tree monster, but then suddenly he tensed and I realised that he was tense so I ran behind him again and peeked out from behind his shoulder and saw that something terrible appeared (even worse than tree monsters!), it was a ghost, and that was the first time I saw my boyfriend scared, which I could feel using my psychic powers so I told him telepathically that it was going to be ok and I could handle it using my dark powers which were super effective against psychics, and I focused really hard but nothing happened, so I thought of the strong bond that I had with all my friends and begged them for their help because there was this ghost and it could destroy the world, then they sent all their power and my eyes glowed as I tapped into a part of my power that i had never seen before, but it was now unlocked because of my friends determination and courage that flowed through my veins, as a white light burst from my hands that I held outstretched in front of me when I realised that this was the dark thing I was running from in my dream this morning, which I would finally kill because of the power of my friends that I had to see at school today, and I shouted as I killed the ghost, “omae wa mo shindeiru,” and it exploded and so we celebrated with my friends and they were all super impressed as I told the story and smiled at my hot boyfriend.

View File

@ -1,80 +0,0 @@
---
title: "ECE 192 Words per Minute"
date: 2024-02-29
tags:
- featured
- shorts
- university
---
**Summary:** A student is mildly frustrated by his professor's pace of speaking.
<!-- more -->
---
"Even if we use one million, or two million, or even three million pieces, the additional tooling cost will remain constant. So you can see that in order to make a good economic analysis, you have to classify the costs related to the output activities as follows…"
Lento slammed his pencil down as the professor *finally* stopped speaking. The soot streaks on his notebook smoked from his rapid scribbling, and his wrist shook from the sheer exertion of trying to take notes from a professor who read off slides that looked like someone tried to squeeze a novel onto them.
Judging by the fire alarm going off around them, he wasn't the only one who nearly combusted his notes.
"You know," Atras murmured from beside him, "online lectures sound like a really good idea right now." His notebook was closed, his pencil pristine. The signs of a man who gave up long ago. The signs of a smart man.
"I," Lento hissed, "cannot take this anymore."
"What is he even saying?" Atras said, calmer but still exasperated. "What's all this about costs and benefits and graphs?"
"Who *cares?* Why does this *matter?* Has this man *ever had to deliver a presentation before?* I *don't need this to pass my exam.*"
Atras patted his back, an understanding but exasperated expression on his face. "Calm down. It's not that bad. It's just a humanities course."
"I'm not seeing the humanity," Lento said grimly.
"It's the bird course. The easy course. The course you don't even have to take notes in. Why are you trying so hard, anyway?"
"Says the guy who isn't taking notes!"
Atras snorted. "The prof posted all of his slides online. Why *should* you take notes? I'd rather not develop carpal tunnel in the first week."
A clock *tick*ed and Lento glanced over to the clock. The professor starts talking again, the sound like a drill burrowing directly into Lento's ears as the added knowledge of *incompetence* makes the emotional damage all too clear.
"How is he still talking?" Lento's voice steadily rose in pitch. "What is there left to talk about? Why can't I go home? Why am I here? Just to *suffer??"*
"And that's it!" the professor said brightly. "You are now free to go. Tomorrow, we'll be looking at cost estimation models. There are practice problems on LEARN if you want to apply what we covered today."
A rush of cool wind blew from somewhere out the exit, even though that would make no logical sense whatsoever, but conveniently masked the students' collective sigh of relief.
Lento stood up, dumped his notebook and pencil straight into his backpack, and promptly dragged Atras out the lecture hall with him. "Out," he demanded. "We are out of here."
"For the last time?"
"Do you even need to ask?"
"I thought it was interesting," said Atras. "The professor sounded like he knew what he was talking about. He just covered things a bit fast, that's all. And kinda derailed sometimes."
"…And he went *on and on* ***and on and on*** <u>***and on and on*** <span class="text-xl">***and on and on***<span></u> to say the equivalent of a small glossary and four lines of notes, except you don't know what four lines you need so you write down all of them anyway."
"You're too bitter," Atras observed. He held out a red rectangle. "Want a KitKat?"
"…Yes." Lento snatched the candy out of his friend's hands and ripped the wrapper open. He chewed methodically on the chocolate.
"Feeling better?"
"A little," Lento admitted. "But still. I'm not going back to that class. "
"You should," Atras coaxed, holding out a Coffee Crisp. "You always learn things better when lectures can hold you accountable. Here, do you think you can talk about the course without hating on the professor for one second?"
"Who's gonna hold the professor accountable?" Lento grumbled. Atras gave him a look. "Yeah, yeah, I know. Fine. One more class. He has *one more chance."*
---
Addendum:
"If you have three horses, the magnetic flux through each horse actually approaches zero as we move farther and farther away. Combined with Gauss' law, given that we know that the flux density of each horse is, in an ideal world, equal to that of free space, this lets us cancel out the electric flux density factor on both sides here, which results in seven horses!"
The hissing sprinklers and wailing fire alarm do little to stop the madman from his lecture. Lento rests his head on his arm on his desk, his pencil having been vaporised long ago. "Surely this isn't on the exam. What kind of econ is this?"
"Be sure to remember this, because it'll be a major part of your midterm!"
Atras pats his head consolingly.

View File

@ -1,294 +0,0 @@
---
title: Glorious Pain
date: "2024-11-22"
tags:
- birdseye
- nanowrimo
- featured
---
**Summary:** Liz, Archie, Sialia, and William J. Swainson watch a human who insists that what doesn't kill you makes you stronger. And, well, who wouldn't want to be stronger?
<!-- more -->
Good morning to you, child, Sialia, Mr. Swainson. Shall we start the day?
"Why, but of course. Are you all prepared for human-watching? Have you everything you need?"
Of course. Let us travel across the skies of Winnipeg!
"Excellent. Please follow me. The Forks are rather busy this time of year. If I ever needed a quick human, the Forks were a fine place to find one."
What accessible architecture! The highs and tumbles all mesh together beautifully. A bird could hide or swoop around this area anywhere!
"Another reason why it is such a perfect location for birds. Look at those humans arguing over there. That's usually a good sign to find interesting people."
Let us listen in, then. What an angry woman, pulling her friend close to her like that. That other man might be getting a little too close to them for comfort.
"Get your hands off of him! How *dare* you insult him like that? Do you know what he's been through?"
"Woah, dude. Take a chill pill. I didn't even touch your friend there. I just called him out for being rich. Y'know, got his whole life sorted out before the age of ten by his parents and all that. You don't gotta act like I slept with your mom last night."
"Um, Sera, it's okay. Isn't this a bit of an overreaction…?"
"No! Absolutely not, Leo. If anything, I can't believe that you aren't reacting more! How can you let him say that to you? You lived in poverty since you were three. You scrimped and saved and worked as hard as you could just so you could feed both yourself and your family while going to school. *You deserve nice things.* It's okay to want for things."
"Damn, man. I didn't know you had a backstory like that. Sorry, bro."
"Yeah, well, you should apologise! Don't judge people by how they look, loser."
"Come on, Sera. I'm sure he didn't mean any harm. People are staring. Let's just go."
"Hmph. You value yourself *way* too little. This world is full of injustices. I just want to see you succeed, Leo."
I daresay that this might be the most interesting human yet, this *Sera*. A blunt and direct person, isn't she? Let us follow these two as they leave the malls.
"Seraphina!" A new girl.
"Oh, hey, Amara! You can totally call me Sera, you know that, right? What're you doing here? Oh, this is Leo, by the way. Leo, this is Amara. We've been friends since high school."
"Heya. Great to meet you!"
"Nice to meet you too, Leo. Seraphi — sorry, I mean, *Sera*, I was gonna go shopping with Phoebe today. Wanna join us?"
Out of all of the noses I've seen, Sera's nose is up there for most expressive. That wrinkling is remarkably clear, even to birds such as myself.
"Phoebe? Phoebe Sinclair?"
"…Yeah. Is something wrong with Phoebe?"
"Not at all." That sniff says otherwise. "She's perfectly fine the way she is. I just wish I understood how she got to where she is today."
"Huh. Okay. Well, maybe you'll get to talk to her at Ethan's birthday party today. You're going, right?" Birthday? Oh, we must follow this girl.
"Of course! Wouldn't miss it for anything."
"Cool, cool. Phoebe's been waiting for me at Zara for a while now, so I'm gonna dip. See you tonight?"
"Yeah, for sure. Bye!"
"Nice meeting ya."
Child, this is a once-in-a-year opportunity! Humans' birthdays are incredibly significant to them, and the particularly interesting ones make a big fuss out of it and throw a party. You're incredibly lucky to see something so special at your age.
Mr. Swainson, please don't raise his ego. Garuda knows it's flying too close to the sun already. The humble bird gets the worm, as they say.
---
One more piece of advice to you, child: You can easily tell if a house contains a lot of humans by looking at the number of cars in the driveway. Usually, those with more guests have more cars, as the cars refuse to leave without their owners. From there, you can use the information in a variety of different ways. You could track the humans entering and leaving the home based on what cars they take and how many humans each car holds. You could also link the cars to the home and build a network of humans. The possibilities are endless!
In this case, we can use the information to easily verify that this is indeed the correct house. The richer humans with the larger houses are particularly nice because they usually have at least one open window somewhere that is suitable for human-watching. Additionally, the density of humans in the house is lower, so your chances of getting caught are much lower.
For now, let us find a nice open window to eavesdrop from. Oh! Actually, we can approach the window later. A new car is pulling up to the house!
"Hey Ethan — happy birthday! And Sera! When was the last time I saw you guys?"
"Phoebe! C'mere. Oh my god, it's been way too long. Love the necklace, by the way."
"Thanks! My mom helped pick it out for me last week."
"Hmph."
"Hm? Sera?"
"Nothing. Don't mind me. Why don't you come in?"
It's going to be difficult to squeeze by them. Shall we head to the window to continue their conversation?
"…and then I told my mom, so she was like, 'Do you need a new one?' And of *course* I'm not gonna say no to a new phone, right? Sera, is something wrong? You've been kinda smug this whole time. I know that we've had our disagreements sometimes, but *surely* you're over it now?"
"Oh, but of course. How could our *little princess* here be troubled? *Everything* must end up perfectly for her. Oh, the horror? How could you possibly be bothered by something as trivial as *disagreements?* 'No,' she says, 'look at me! I'm so perfect and smart and pretty and I have so many friends!' Even though you haven't done a single *damn* thing to deserve it. Acting so high and mighty like that — it disgusts me."
"What are you on about? Did I do something to you?"
" *'Did I do something to you,'* she asks. More like what you *didn't* do. *You're* probably just here because you're Amara's friend. Honestly, I don't know what she sees in you. Have you ever been grateful for anything or worked a *single* day of hard work in your entire life?"
"Hey! Don't mock me. Look, I don't know what your problem is, but this is getting out of hand."
*"My* problem is that *you* don't realise just how good you've got it while you brag about all of the *nice things* you have to other people. Actually *good* other people, unlike you. See Amara here? She *chooses* to be kind even though she's experienced first-hand how cruel the world is. She lost the bright, innocent spark in the eyes of her childhood when her parents died, when *no one* wanted to help her, and when her closest friend betrayed her. Yet *still —* still she has ten times the heart that you do."
"Sera, *please* calm down…"
What a proud human. But strangely…not for herself. She's proud of the people around her. Quite refreshing. I'd say that I've rather had enough of the usual narcissists. And, if I may say, with rather strong, correct opinions too. Listen closely to every word she says, child. There is much you can take from her insights.
"I will *not* calm down, Amara! How can you possibly be so calm when there's someone like *her* right in front of you, spouting things off like she knows everything?"
"I'm just a normal girl, Sera. It's not that big of a deal."
"Have you seen her *house*, Amara? She practically lives in a mansion. Her whole life, she's never had to worry about food, about having a roof over her head, about if she'll be alive tomorrow. And now she *dares* enter into your lives without even a single sacrifice?"
All excellent points. Child, no matter how old you may be, you will remain a child in my eyes until you suffer true hardship. Learn that there is no free lunch in this world. Learn that if you truly want something, you need to *work* for it. If you don't work for it, you won't get it. It's as simple as that.
There is no sense believing that all of the puzzle pieces will align one day, and suddenly everything will fall into place. That's at best a fantasy that should be relegated to stories. How can you possibly be happy if you've never been truly sad? How can you recognise success if you've never failed?
…Respectfully, *William*, I must disagree. Life is nothing without suffering. If one does not suffer, they cannot understand how other people who truly *do* suffer feel. Those who experience more suffering are objectively better. Not knowing that only means that you have not experienced enough to understand the incredibly large range of emotions and experiences one can go through. I'd recommend going out and travelling more.
"Woah, woah! What's going on here? Ladies, ladies, calm down! It's a birthday party — let's not get too aggressive." Oh, go away, new boy. Don't break up the debate *now*. It was just starting to get interesting!
"Even if you're the birthday boy, Ethan, this isn't something I can back down on. Look, Phoebe. If Amara has her own reasons why she keeps you around, fine. I'll respect that. But why should you, someone who's been sheltered all their life by *mommy* and *daddy*, knowing nothing but their love, never having to worry about food or shelter or survival be here over someone like Leo?"
"I gotta say, Sera, I'm on Phoebe's side here. It's not *wrong* to be normal. In fact, I think that normal people are great! I love normal people. I feel like it'd be better if people *didn't* have to go through things just to have nice things, y'know?"
"Huh? That makes no sense. What about all of the people who *do* go through things? How is that fair? I disagree with my parents on a lot of things, but being grateful for what you have is something that we both share an opinion on."
"Why would you ever want to want to bring people down?"
"Amara?"
"I get trying to lift up people in pain, Sera. I do. But why would you ever want to push down happy people? I don't think that life is transactional like that. Phoebe and I equally don't deserve to get murdered."
"I agree. *Murder* might be a stretch. But it's not equal. Things should be equal. Why aren't they equal?"
"If you really want to have this conversation, why don't we have it in the room over there?"
"Only if everyone hears."
"Oh my god, Sera. Why are you such a drama queen?"
"Ex*cuse* me? How am *I* the drama queen? What about you? You chose to defend Phoebe by *yourself.*"
"Sera, I like you a lot, I really do — I might reconsider after this conversation though, depending on how it goes — but you gotta come back down from your outlandish opinions, girl."
"All of the people you've talked to, Ethan and me and Chelsea and Ken and the many, many more I'm sure I don't know, we're all really grateful that you're so understanding toward us. But — well, I don't want to assume, but for me personally — I don't want to be treated differently. I just want what happened to go away. I'd rather not talk about it, y'know?"
"Why not? It should be a badge of honour. You should totally share it! You'd be way cooler to other people. Dark and brooding. *So* interesting."
"…Is this how you thought the entire time?"
"Duh? I don't know why you're trying to stop me, Amara. You're all the way up there with so many more worldly experiences and perspectives, but I'm just here trying to get us lowly peasants up there so we can understand you better. It's hard to do that when you keep pushing us back down."
"Oh, Sera. Please tell me you're kidding. I didn't — there's no way you could possibly be *below* me. It's…it's not helpful. At all. All I want is to just be a normal person in a normal world. That's it. You don't need to be that person for me. Don't — don't hurt yourself doing that. It's not healthy. And it's never worth it."
"There is no such thing as normal in this world. Everyone has their perspective, their side, their story. Everyone is different."
"Oh, no. Trust me. There is *absolutely* a normal. And I strived for that for *so very long*, Sera. Way before I met you. Please trust me when I say that no one wants to experience trauma. It's *never* a good thing."
"You're telling me that what I've been through wasn't *real* trauma? When I asked my dad to shove my head underwater for fifteen seconds? When I asked George to tie me up against a board for a few hours? Drat. Maybe I should poison myself instead, that might have a stronger lasting impact…"
"You did *what??"*
"Oh, whew. You didn't know. Thank god. I thought it wasn't gonna count and I'd have to pull out all the stops to join the cool kids club."
"No, no, that's not what I meant. I — I think I might need to take a seat just to comprehend what exactly is going on. Maybe we could continue this conversation later."
"Yeah, yeah, no problem. By the looks of it, I might not be at your level, Amara, do you think I've suffered enough to beat Ethan, maybe? Maybe an Ethan and a half?"
"I…I can't. I'm sorry. I have to go."
"Oh, shit, Amara. I'm sorry. Did I trigger your latent trauma?"
"No, no, please — please leave me alone for a moment. Please."
"Ooh. Gotcha. Lemme know if you level up again!"
"Yo, Sera, what'd you do to Amara to make her run out like that?"
"She taught me that I have a lot of room to improve. Not as much as you, Phoebe, but there is still a great distance between me and her."
"Er… That's not *bad*, I think. So why was making an expression like she wanted to vomit?"
"Oh, y'know. People with checkered pasts often relapse into it, they get sad after something reminds them of it, and it's a true journey and a clear example of humans thriving through adversity that lets them overcome it. I'm really impressed by how she handled it, myself."
"Huh. There's…a lot to unpack here. Um."
All of these humans are so strange. They bear such strange expressions toward each other, as if they cannot understand each other. Bluebirds do not have this problem at all. Why don't they stare at each other and immediately comprehend what the other is thinking?
Or fight it out. That's always a clean and decisive way to determine any winners or losers. Hell, if I could, I'd fight on Sera's behalf myself. I've never met a human who so clearly understood our perspective.
When you grow up, go adventuring more. See the world. See its people, face its challenges, and suffer until you can experience the full range of bluebird emotion. All of these pussycat humans are cowards. Probably never worked a single day in their life. Never had to forage for food in the winter, or watch another human die.
To hurt is to live. How can one possibly know happiness if they are never sad? How can one possibly know pleasure if they are never in pain? These humans will never reach the heights of emotion, never achieve their true potential.
"Sera, I'm on your side!"
Ah, another sane human.
"Eh. Lucas, you don't count. You're not even at my level, let alone *them*. Glad you have the right mindset though. If you listen to me, you'll be able to understand the world more. Understand people more. And how could that possibly be a bad thing? I simply want people to broaden their perspective."
The other girl returns.
"Sera, could we talk about this later? It's Ethan's special day, and sometimes it seems like you talk about nothing but how people would be doing so much better if they just stabbed themselves sometimes."
"But they should! It'd be a learning experience."
"Sera…"
"Oh, right. Fine. Ugh, what a spoilsport. Right, guys?"
Hey. These are Sera's friends, aren't they? Why aren't they sticking up for her? Just because they share an objectively incorrect opinion doesn't mean that they can dismiss their friend like that. How rude.
---
"How was the birthday party?"
"Not great. Some sheltered rich girl was there and she was being a jerk. That kinda ruined the whole thing."
"You should be grateful that you even have the opportunity to go to such a frivolous event. When I was your age, I was already married and working, not fooling around and spending lavishly on snacks and treats. Consider yourself lucky."
"You keep telling me over and over again. I *get* it, ma. Unlike some other people."
"Oh, sweetie. I know. There's not much you can do about it if they really don't want to change. You have to be willing to look at the flaws inside you, and it seems like these people just don't want to do that. It's a shame that there are so many like them out in the world."
"I told one of them that they should broaden their perspective and be more considerate, and she almost punched me!"
"Hmph. Ungrateful rats. Their parents must have been too protective of them. Didn't want them to get their hands dirty in the real world. Probably only went to the *sanitised* plastic playgrounds. No, they were the ones *sanitising* the playgrounds."
"They gotta be."
---
Sialia, I know that *you* never wanted kids, but Mr. Swainson, I cannot believe you. I thought that as a fine, distinguished gentleman, you would have had the orthodox mentality that one must experience as many things in life as possible. This is an impossibility.
"Elizabeth, let me be frank. I have seen enough of the world, and I would rather my children not have to see the parts that they do not need to see. There are some things better left unsaid."
You are much too protective.
"There are things that birds *should not* experience. It would be incredibly traumatic and have a terrible effect on their mental health."
Mental health? What are you talking about? Birds can function perfectly fine no matter what Garuda throws at them. It's how we thrive as a species. Why, my eldest daughter flew straight into a travelling car's windshield and she values her life all the more for it. I myself tried the same — with a slower car, to minimise the risk of injury — and found myself with a greater appreciation with the world.
"Why would you do that to yourself?"
To understand her and the experience. How could you be so aghast about this?
"Liz, you're an affront to all that pain stands for. Things hurt for a reason."
If one never hurts, how can one love? Emotions are relative. A bird with the emotional range as wide as a feather will never feel true, unadulterated joy. Birds — and humans for that matter — have to hurt sometimes.
That is what pain is — a reflection of happiness. Pain *helps* us feel happy, Sialia, Mr. Swainson. It is a very good thing.
"Elizabeth. Let me ask you this. I understand that it may be difficult to change your mind —"
Absolutely.
"— but if you could put yourself in a situation where you would never hurt or feel sad again, would you?"
No! Didn't you hear a single word I said?
"Liz, I almost forgot to bring this up because of all the other crazy philosophical stuff you went on, but let me remind you that Juliette is *not okay.* I have no doubt that if you asked her, she would agree in a heartbeat to not have had her beak crushed in. She didn't and still doesn't *want* that memory, Liz. Pain is something Garuda blessed us with so that we know what to avoid."
She can absolutely have memories that she'd rather not have but still are better for her in the long run. Children never want to do work around the nest, but you would still encourage them to do that, wouldn't you?
"That's what I'm trying to say. It's *not* better for her in the long run. I can't believe I have to explain to you why making your children do chores is not at all comparable to She's deathly afraid of any moving object now. Don't you know that that's why she stopped human-watching with you? Why she avoids flying? Why she moved to Florida? She's so afraid that she never wants to experience anything like that again. She barely talks to the other birds, Liz. When was the last time you visited her?"
I… It must have been nearly three years now. I was not aware of this. Regardless, if she tries harder, she can overcome any obstacle. Give it some more time and she will surely rise up to the occasion and rise through the ashes like a phoenix to her new self. Stronger than ever before.
"Help me out here, William. She's not on my wavelength. Got any solid arguments to stop her from putting through Archie here through some sort of torture machine later on in his life? I wasn't worried before, but now I definitely am."
"How many years have you been human-watching, Elizabeth?"
Almost ten. Why?
"And in those ten years, how many humans have you seen that were hurt?"
Quite a few. Why?
"Most humans who are hurt don't express it. To my understand, instead, they actively try to hide it to reintegrate with society. There are a lot of them — both humans and bluebirds — that aren't able to fully. Maybe an equal number that aren't able to at all."
Suppose you're right. These people are harder to see in the world. But —
"Maybe we should drop this topic. Clearly we aren't getting anywhere. William, I'm sure you must want to get home by now. We've kept you for far too long. I'll stay with Liz, don't worry. At least until we reach the great mountain range. Help her keep an eye on Archie, too."
"My thanks for your companionship the way here."
No, no, the honour is all ours! Sialia and I, we've loved having you here. You've provided such a great perspective that we've learned a lot from. Perhaps in the future we could meet up and have more…insightful discussions in the future. I'd love to visit you in Montreal.

View File

@ -1,286 +0,0 @@
---
title: "Illusion of Solitude"
date: 2023-12-29
tags:
- birdseye
- nanowrimo
- featured
---
**Summary:** An old bluebird takes her grandson human-watching in Vancouver. This time, they find a young child dealing with grown-ups who just don't understand.
<!-- more -->
---
Keep to the left. Mind the seagulls. We're approaching the coast. Those bastards appear far too often. One of the only reasons why there isn't a permanent bluebird population in Vancouver.
We've almost reached our destination. I suppose we could fit _one_ more experiment here. Reach out to one last human. For this last one, how about you pick? You've seen me do it a couple of times. If you need assistance, I'll be right here.
That building? That could be anything. If I were to guess, judging by the number of residential buildings in the area, that might be a school. Good timing. School should be in session by this time in the morning.
Ah, these are younger children. Perhaps no older than two hundred times your age. An excellent choice, any of these. I don't believe we've watched any humans so young. It'll be more difficult, though. Usually you see their parents hovering around them when they're so young. Perhaps not at school, but once outside the compound, humans become fiercely protective of their young. Like no other species I have ever seen.
These particular children over here playing outside. Mind the adult. If he sees you, he'll chase you away and keep a more careful eye out. They must be in recess from learning.
Which one do you like the most? The one talking to the wall in the corner away from all of the other children? You have good taste.
"Zoe, do you want a cup of tea? Here. I made it nice and cold for you. Do you like it?"
She is truly talking to the wall with nothing in her hands. Is the wall named Zoe?
"Ruth, are you talking to nothing again? Why don't you play with the rest of the kids?"
"Mrs. Pernumble, I'm having a tea party with Zoe! And _you're_ not invited. So go away."
"Right. Zoe. Your…"
"My friend. She's waving at you. Oh — be careful, Zoe! You'll spill the tea if you wave your hand like that."
I do not see a child waving with a cup of tea.
"I…see." As a trained expert in recognising human patterns and mannerisms, I, Elizabeth von Turdidae, can attest that the woman is lying. Kindly lying, but lying nonetheless.
"Surely Zoe wouldn't mind if you spent a few recesses playing with Jeremy and Sheila. Doesn't it sound fun to play soccer? They're all laughing in the field. It sounds to me like they're having the time of their lives!"
Children are such mysterious creatures. This one might be staring daggers into the woman. "I can't leave Zoe here. She doesn't like soccer. And she gets scared without me. And I haven't finished my cup of tea!"
I would like to re-attest that there is, in fact, a lack of any tea or anything resembling tea in the immediate vicinity.
"I could keep Zoe company. She's got a lot of questions for me, right? So perhaps we could have a conversation while you play soccer."
"I don't think so, Mrs. Pernumble."
"Why not?"
"Because you haven't said a word to her and now she's very upset. It's okay, Zoe. I'll never leave you. Have another cup of tea."
I know that I'm getting along in years, but I _do not_ see a human child. Several worm children that look very tasty, yes, but no human child. Or tea. Do you see a human child?
Where is it?
Interesting. Perhaps this is a special human child. I have not known any human child that could hide themselves from other people, but humans still have plenty of surprises in them yet.
…But where's the tea?
"Oh, Ruth. Please. I'm sure the other kids would love to play with you. Can I tell you a little secret?"
"La la la I can't hear you. Can you hear a Mrs. Pernumble talking, Zoe? Yeah, me neither. Oh, thank you for the biscuit! Let me refill your tea again. You're a fast drinker!"
Heh. If there's one thing that is common between humans and bluebirds, children exasperating elders is universal across species.
Although I certainly wouldn't sigh and walk away like her. No, misbehaving children must be punished so they don't do it again.
"Thank you for the biscuit, Zoe. Have you heard from Miss Piggy recently? I heard that Miss Froggy and her had the most delicious of teas the other day. Mm. You're right. That _is_ very interesting."
I must admit, it is rather strange to watch a conversation happening with a human I cannot perceive in any way. I hope you're learning more than I am.
"Um, Ruth?"
That sigh does not belong on a child her age. How adorable — perhaps she thinks that if she's as petulant as one, others will see her as an adult.
"I'm _so_ sorry, Zoe. I know you don't like it when our tea parties get interrupted. What _is_ it, Peter?"
"Who are you talking to?"
"Zoe, of course. My best friend. She says hi, by the way. Now, get to the point. What do you want?"
Ha! Another victim of Zoe's invisibility! He looks so confused — oh, my sides.
"Mrs. Pernumble said that maybe you wanted to play with me and Alfred over there? We're playing cards."
"Oh. She — um. I… I can't. Zoe needs me to keep her company. She doesn't like it when I leave her alone."
"Who? I don't see her."
"I _told_ you, Zoe's my best friend. It's not _her_ fault that you can't see her."
That hesitant wave — the worm on top! Glorious. I might have to start observing the younger humans more. They're such a racket! Two inexperienced creatures learning about the world.
"Are you sure she's real?"
"Of _course_ she's real! Say sorry to Zoe, right now! I can't believe you'd say that. I'm sorry, Zoe. He didn't mean it. He just doesn't know better. Right?"
"Uh, I'm sorry!"
"Zoe's over _here_. Look at her properly when you say sorry."
"…Sorry."
"Hmph. She says she forgives you this time."
"If she wants, she can play with us too?"
"Nah. Zoe doesn't like cards."
"Okay then. If she doesn't want to. Bye bye."
"Bye bye."
My scientific mind is racing at the possibilities. The child couldn't see her. The human couldn't see her. I can't see her. What are the criteria for who can and cannot see Zoe?
---
"Be sure to finish the letters worksheet — I expect to see perfect 'A's from everyone! Now, children, fetch your bags — it's time to go home!"
The chatter of children after school is the same regardless of their age. It's always so relaxing to immerse oneself in the wave of conversations taking place left and right.
"Sheila, Sheila, are you still coming to my house after school?"
"I got this super cool fire truck for my birthday! Leo, you gotta bring your cars!"
"Nooo! My mom grounded me. You have to beat the boss without me, Dylan! You have to!"
"Come on, everyone. Less talking, more moving! Once you've changed into your outdoor shoes, line up against the wall outside the classroom!"
---
Well done, child. You're following your humans quite well. I barely had to help you at all.
"How was school, honey? Did you learn a lot of new things?"
"We learned about the alphabet! I can draw lots of little 'A's now. Today we learned about the big 'A'."
"Hey! It's my favourite kiddo! Ruth! Ruthie. Beat up any boys today?"
"Zoe almost. Hmph. Peter was being mean to Zoe. I feel so bad for Zoe, daddy. No one understands her and they're all so…so mean to her!"
"There's cookies and juice for you on the dining table, Ruth. Make sure to wash your hands."
"Aw, that sucks. Does Zoe want a glass of orange juice, too? Maybe it'll help her feel better?"
"Daddy! Zoe is _allergic_ to orange juice, remember? I told you _yesterday!_ She'll have her unicorn hair tea like she always does. Mommy, can I eat my cookies upstairs? Me and Zoe are having a tea party again."
"All right, but don't spill any of the crumbs! We don't want ants moving into our house, don't we?"
Oh! How unfortunate. Child, I must interject — allergies are new to you, yes? Bluebirds don't particularly have the horrid disease. If some humans — and it's impossible to tell which humans before they actually eat it — eat certain foods, like peanuts! Or fruits, or nearly anything — they could _die_. That's called an allergic reaction.
To have an allergy toward a fruit — truly a pitiable existence it must be.
"Tea party time! Zoe, here is your unicorn hair tea. Freshly stirred! Only the best for my best friend. Oh, thank you! Yes, I'm doing great. Can you help me with my homework after this? You're always so good at drawing those weird lines. Mrs. Prenumble says that they're part of letters, which are part of words.
"Zoe… Why does everyone hate you so much? They never want to talk to you. Even Mrs. Prenumble. They all pretend that you're not a _real_ person. But don't worry. _I_ know that you're real. No matter what everyone else says. You're my best friend, right? I can't leave you alone. If you want, I'll stay with you, forever and ever!
"Will you also stay with me, forever and ever?"
Human children. So adorable! Already forming pacts for life in the tender young stage of pre-adolescence.
---
Finally some change. Pardon me, but I can only listen to a child have a multi-hour tea party go on for so long before even _my_ patience wanes. Let us investigate the commotion at the door. Ooh. An older boy. A family! Human families are so small. Their babies don't die nearly as often as bluebird babies, but there are just so few of them in the world. I suppose that explains the parents' protectiveness. But if they want their children to succeed, why don't they simply have more children? That would maximise the probability of successful children reproducing in the future.
"Mom, dad, I'm home."
"Welcome home, Jacob! Dinner will be ready in just a minute. Could you call Ruth downstairs from her room?"
"Hey, kiddo! How was school? Beat up any girls today?"
"Oh my god, you can't _do_ that, dad!"
"Hmph. All these fancy schmancy new norms are stifling. Back in my day, you could hit whoever you wanted, and the other guy would just hit you back! None of this 'no hitting girls' nonsense."
I knew that humans discriminated between their sexes, but I didn't realise that they couldn't hit females. All kerfuffle and waffle, if you ask me. If someone has wronged you in any way, giving them a good knock in the old noggin is always an excellent first move. Really sets the atmosphere for a full-out fight.
"They're weaker, so it's not fair. They can't hit back, so it's up to us men to show other men who's boss."
Nonsense! Excuse _me?_ I don't know about _humans_, but female _bluebirds_ pack a pretty punch in their wings. It's true that males usually only fight males and females usually only fight females — because, let's be honest, why would a female ever need to fight a male? — but I did not realise that there was _no_ cross-sex combat in human world. Strange, too. I could have sworn that I'd seen human males fighting human females multiple times over my many years.
"Son, maybe the times are changing. And I respect that. But no matter what happens, never lose that fighting spirit. Can't fight the girls? Fine. There's still a good half of the population you can beat some sense into. Now, if they say that _fighting is bad_ and that _no one should do it_ or whatever? That's when you put your fist down and screw the rules. Let no one tell you what you can or can't do."
"I'll do my best, dad!"
"I know you will, son. Make me proud. Nothing like a good fist to the noggin to help loosen any lips."
Wonderful parenting. _This_ I can get behind one hundred percent. I know I have a lot of negative things to say about humans, but in reality, they're so diverse that there are so many different viewpoints to learn from. There are some that are objectively wrong, some that are objectively right, and then most are in the middle. It's rather refreshing to have one's opinions validated every once in a while.
And what camaraderie! Certainly bluebird children are never so close to their parents. Or their grandparents, for that matter.
"Now bring Ruth downstairs like your mom said, will you?"
"Yessir! Ruth!"
"You might have to go upstairs to bring her down. I think she said that she was having a tea party with Zoe again."
"Zoe? Ugh. How long are we gonna entertain her, dad?"
"As long as she wants."
"Hmph. Ruth! Open up! Mom says it's time for dinner!"
I wonder why she isn't responding. Drat! If only we could be invisible and incorporeal like Zoe must be, so we could position ourselves _in_ the door and see both sides of the conversation. Having to move around to the back of the house just to see the hallway is _so_ irritating.
"Ruth! If you don't say anything, I'm coming in in three…two…"
"I'm having a tea party! Go away, Jacob."
My. She sounds aggravated. What kind of dirt landed on her head while we were away?
"I'm not gonna wait here for you to finish your prissy tea party. I'm comin' in!"
This is actually quite nice. It means if we circle around to the other side of the house, we should get a nice and proper view of everything that is happening.
"HEY! I didn't say you could come in! Zoe doesn't like you, you know. She says that you're big and fat and dumb and stupid for interrupting her tea party. Get out."
"Oi. I just came to pass on a message. Why do you have to get so pissy?"
"This is _my_ room." How funny. Ruth trying to push Jacob out of her room. Certainly it isn't happening unless it's under his own volition. Valiant effort, though. I would applaud like the humans do if I had hands. "Can't you read the sign? It says NO JACOBS!"
"Do you even know how to read?"
"Shut _up!_ Zoe said that you can't be here, and that means you can't be here! Zoe needs her time to herself. She's has a very tiring day and she needs her tea and biscuits —"
"Zoe this and Zoe that. Jeez, don't you have any _real_ people to back you up?"
Oh. That one might have hit her harder than him slamming the door open. What is that expression on her face, I wonder?
"Yeah? Don't have anything to say, dontcha? I wonder why?"
"Say sorry to Zoe right now. She's my _best friend."_
"Oh my god, Ruth. How are you still so stuck on her? Zoe's not real! She's in your _mind!_ She's one of those _imaginary friends!"_
Certainly not. I find it rather unlikely that the human adults and the human children spoke to her if she wasn't real. That Mrs. Pernumble or whatever it was wanted to have a conversation with her, too.
However, judging by the blankness of Ruth's face, she might believe him.
"No."
"Yes." Rather gleeful of him. "You're _imagining_ her. Probably because no one likes you enough for you to have _real_ friends."
"That's not true. Shut _up._"
"Oh, yeah? What's her favourite colour?"
"Yellow!"
"What's her favourite food?"
"Unicorn hair tea with rainbow biscuits!"
An eyebrow raised. In his defense, I didn't think that those were real either. But it makes sense to me. What else would an invisible person eat? Oh! It just clicked for me. That must be _why_ she's invisible! All of these exotic ingredients must have an effect on the body that makes her difficult to perceive. And Ruth must be consuming enough that she can perceive her but not turn invisible herself.
My cleverness and intelligence scare me sometimes. But I digress.
"What's her last name?"
"It's! Um…"
"Where does she live?"
"I… She must have told me…" A fearful glance to her right. Is she losing the fight? Come on, how difficult could it be to prove that a human exists?
"Exactly. What does she do when she's not with you?"
"…Stop it…" Hm. Personally, I would prefer physical combat over verbal combat. Not nearly as emotionally messy. Much easier to know when the damage is done and when they've learned their lesson. Most importantly — much easier to restrain oneself. I suppose she's been thoroughly beaten. Her father will be proud — Jacob finally beat up a girl.
"When did you meet her?"
Oh?
"When grandmama went home! She's _real_, Jacob! I _know_ I met her. She was outside on the swing outside grandmama's house when the sun was setting and I was sad and we went on the swing together and we were friends ever since. Zoe's _real!"_ And here comes the crying. If she was sobbing before, she's bawling now.
Hm? Why isn't he saying anything else? Are tears so effective against physical and verbal combat? He seems shocked. How could this be surprising? Bluebirds meet new bluebirds all the time. Is this not true for humans?
"Jacob. Come over here, please." Oh, my. All of the tension in the air and I didn't even notice the mother in the doorway.
"Oh! Um. Mom, I can explain. I was just…"

View File

@ -1,96 +0,0 @@
---
title: "My Precious"
date: 2024-02-05
tags:
- shorts
- psychological
- featured
---
**Summary:** Max tries to save his dog, but it's not enough.
<!-- more -->
**A/N: we take some creative liberties re: symptoms of cancer / its rate of progression!**
The day you got your dog was the happiest day of your life. Your dog didn't yell at you whenever you delivered a pizza five minutes late. Your dog never complained when you didn't add enough sugar to her coffee. No matter how you complained over and over again how you weren't getting enough sleep, Susie was always there at the end of the day to greet you, a welcome bark and an expectant gaze ready for treats and a run. For every high and every low, your little bundle of joy was right by your side.
The day your dog became sick was the saddest day of your life.
The first signs were small: she didn't eat as much, and you noticed that she shed more fur than usual. But she was still the same playful golden retriever you knew.
Out of an abundance of caution, you decided to get her checked out at your local vet.
"There's a cancerous tumour at the base of her right lung." The vet shakes her head, her tone grave. You cast a worried glance at Susie's sleeping form on the examination table. "I'm sorry, Mr. Haltmann. You're lucky you caught it this early, but it's growing fast. My diagnosis is that it'll become terminal in a few months."
Your mouth dries. "What can I do?"
The vet taps her clipboard. "She'll need surgery. I can direct you to a place, but the cost can be upwards of five thousand dollars."
"Anything for Susie," you say, shaking your head. You're already crunching the numbers, but at the very least, you'll have to scrimp and save and start working a third job to save her. But it's worth it.
All of this is for Susie, the beloved dog who kept you company for the last four years.
---
"I suppose that that's settled, Mr. Haltmann. Welcome to Hotel Trivago. You'll be starting Monday."
"Thank you!" Your cheeks hurt from the grin you're restraining from spreading across your face, but you keep it professional long enough to shake your interviewer's hand. As you leave the building, there's a bounce in your step and you're humming that pop song you heard over the radio in your eleventh-hand car.
You trip over a bag of dog food and end up skidding to a stop before Susie's lethargic figure. "I promised you, Susie," you whisper in her ear. "I got a job. And that means that we're on our way there." You squeeze her paws. Susie lifts her head and tilts it at you, before she sets it down again, closing her eyes.
"Hang on just a little longer, please."
The hotel housekeeping work pays you $500, after which you'll be one-tenth of the way there. You haven't fallen over yet, although juggling four part-time jobs at once is still a struggle.
All of this is for Susie, your life and joy that kept you going for so long. You can't wait until the day you can play fetch with her once again.
---
It's not enough, you realise. You need more. You read online that taking care of yourself was most important, no matter what you might be going through, but you can't take your mind off of Susie. It's with a heavy heart that you make sure to feed yourself a nutritious meal every day while you know how much she's suffering.
A customer at the coffee shop you work at mentioned that tech is the place to be for veterans and newcomers alike, with plenty of jobs at many different skill levels. It'll be a time investment. Time that you might not have, but it's your best shot.
After you come home from your cashier gig at Walmart every evening, you go straight to the library and learn web development until closing time.
All of this is for Susie, your lovely little cat that needs a new leg. You can't wait to see her climbing up everywhere and gleefully shredding furniture with her claws once again.
---
"Already?" your manager says, her brow furrowed as she squints at your resignation papers. "You've only been working here for a year. You've been doing good work, too. Bradley hardly ever complains about your code."
"Sorry, Joyce. I got an offer from Google. They're paying me triple what you guys do, and I need the money." Even though you didn't get along too well with your colleagues, you feel a twinge of regret in your gut. These guys treated you well, and you learned so much. You almost feel ready for the big step.
She sighs, setting down the documents. "I understand. Software engineers," she muses. "They all come and go like the wind. Always chasing the rainbow. We're going to need you to document your work these last two weeks. Bradley'll take point for the knowledge transfer."
"I appreciate it, Joyce." Internally, you let out a sigh of relief. She took it better than you'd expected. You thought the crabby woman would have tried to hold you back. Hope blossoms in your chest for the future as you make your way up in the world.
All of this is for Susie, your estranged daughter who left you until you could fix your life. You can't wait to see her expression when she sees who you've become.
---
She doesn't move. You stare ever more intently at her still form, waiting. It's all out of your hands now. If your calculations were correct, then…
"Mr. Haltmann, sir! Mr. Haltmann! I have urgent news!" Your office door clatters open. The glass walls around you let the midday sun shine into the hallway, illuminating a young man waving a sheaf of documents.
You chuckle. "Mr. Borparner, all news is urgent to the right ears. But do go on. What is it?"
"Their board of directors agreed! They're willing to sell you NVIDIA at market valuation, sir — I can't believe it!"
You lace your fingers together, resting them on the mahogany desk before you. "Excellent. Prepare a press release right away. I want the deal finalised before the day ends."
"Yes, sir! Right away, sir!"
The door slams shuts behind Borparner. You return to the chessboard sitting on your desk in front of you. The opposing queen wobbles, then falls over, knocking over the king in the process. "I suppose that that's over, then."
All of this is for Susie Inc, your heart and soul. You can't wait to see how her stock will jump once the trade opens tomorrow morning.
---
It's midday when you return to your empty house. You should buy a new house. Move somewhere nicer. This one holds a lot of sentimental value to you, but you can afford better now. You deserve better now. It holds a lot of sentimental value to you, but you can only fiddle with the keyhole so many times before you replace it. Day after day, the wasted time adds up.
A voice from the lawn next door calls out to you. "Max! Heya, neighbour. I heard you were raising money for your dog. How's she doing?"
You stare at her blankly. "What dog?"
The key finally clicks, letting you inside. Absently, you kick a persistently heavy towel away. It's starting to smell, too. How long has it been since you last did laundry? You tell your new servants to clean it up.

View File

@ -1,60 +0,0 @@
---
title: "A Triden(t) Against the World"
date: 2024-02-29
_draft: true
tags:
- shorts
- "content warning: political fluff"
- horror
- u.s. politics
---
**Disclaimer: This was mentally painful to write and I hope equally repulsive to read.**
"Is it yet another left-wing liberal conspiracy, or has President Trump finally taken back control of the White House? His unannounced visit is a show of strength against the authoritarian measures the Biden administration has imposed upon us all."
<!-- more -->
---
"President Biden shows his patience in entertaining former President Trump upon his unauthorised entry to the White House. Reliable sources tell us that the two are discussing the change and continuity in their policies toward China."
---
Two men stared at each other from opposite sides of the Oval Office.
"Donald." The man at the desk stood, moving to the front of the desk.
"Joe," the other man said coolly. "It's been a while."
A pause.
"Darn right it has!" Joe grinned. "Come here, Donald!" he said, spreading his arms. "I can't believe it's really you!"
It took just three large strides before Donald was wrapping his arms around Joe, laughing. They held each other for nearly a minute, doing nothing but basking in the other's touch after so long.
Eventually, Joe pulled back, leaving his hands on Donald's shoulders, staring proudly into his eyes. Donald was the first to break eye contact. "I see you haven't changed the room much," he said. "Why don't you tell me what you've been up to?" He sat and patted the cushion beside him.
Joe chuckled, capitulating by plopping down by the armrest. "Two years in and you're acting like you own the place," he said, scooching over to press closer to Donald.
Donald waggled his bushy blonde eyebrows. "I *did* own the place."
Joe's face shadowed, and Donald pulled him closer when he noticed. "I missed you. The real you. You don't have to keep it up anymore, you know." Joe shook his head. "You've done it. It's over."
"Eight years," Donald said solemnly. "I promised that I would give you eight years. I'll run in 2024. It'll anger half the country just enough to let you clinch another term."
"You don't have to," Joe argued. "Kamala already said that she'd find someone else to be VP. I know how much effort you've put in for me already."
"Oh, my little robin." said Donald affectionately, patting Joe's head. "You know that's not going to be enough to convince them."
Joe made a face at the pet name, but he leaned into the touch all the same. "You know I hate it when you call me that," he groaned. A smile tugged at his lips nonetheless. "I wish we could be like this forever."
"I wish we could, too." Donald sighed forlornly. He ran his fingers through Joe's white locks. "But you know what the media's like. They're already on my case about today. By the way, are you using a new shampoo?"
"You noticed?" Joe said, pleased. "I smelled it off of this high schooler from Iowa. It reminded me of you. What do you think?"
"Keep it," Donald decided. "The chamomile smells so soothing."
They sat there, leaning against each other, simply enjoying the shared warmth of the other's presence. Finally, Joe spoke up. "Want to come up with a cover story together?"
Donald rubbed his hands together. "You're on. I'm thinking of asking Pingping to cover for us with a trade deal or two…"

View File

@ -2,17 +2,15 @@
title: "Bienvenue au Ciers!" title: "Bienvenue au Ciers!"
date: 2020-06-17 date: 2020-06-17
tags: tags:
- barin - barin
- unstagnation - unstagnation
--- ---
_“Vous êtes maintenant à la station dEscribe. Cest la dernière station de la ligne de train CiersXunil._ *“Vous êtes maintenant à la station dEscribe. Cest la dernière station de la ligne de train CiersXunil.*
_“Les portes vont ouvrir: à gauche._ *“Les portes vont ouvrir: à gauche.*
_“Veuillez vous tenir à lécart des portes.”_ *“Veuillez vous tenir à lécart des portes.”*
<!-- more -->
--- ---
@ -22,7 +20,7 @@ Bienvenue au Ciers! Veuillez donc vous assurer que vous avez lune des documen
- Autrement, si vous êtes un citoyen dune autre tribu dans le zone de voyage de Farele, vous devez avoir identification valide de votre gouvernement de votre tribu. Ceci peut inclure: - Autrement, si vous êtes un citoyen dune autre tribu dans le zone de voyage de Farele, vous devez avoir identification valide de votre gouvernement de votre tribu. Ceci peut inclure:
- La licence étudiant de Leeco - - La licence étudiant de Leeco
- La licence professeur de Leeco - La licence professeur de Leeco
- La licence Non de Leeco - La licence Non de Leeco
- Le billet intertribal de Demauge - Le billet intertribal de Demauge
@ -34,8 +32,8 @@ Bienvenue au Ciers! Veuillez donc vous assurer que vous avez lune des documen
- Autrement, si vous êtes du continent de Barin ou tout ses îles (Voir le document de voyage 6-B pour une list complète des îles), vous devez remplir le document de voyage 6-C avant vous allez aux services frontières. - Autrement, si vous êtes du continent de Barin ou tout ses îles (Voir le document de voyage 6-B pour une list complète des îles), vous devez remplir le document de voyage 6-C avant vous allez aux services frontières.
- Autrement, vous devez remplir le document de voyage 6-D avant vous allez aux services frontières. - Autrement, vous devez remplir le document de voyage 6-D avant vous allez aux services frontières.
Malheureusement, à cause de létat actuel des choses intertribal, les passeports intertribaux ne sont pas acceptées comme identification. Nous nous excusons pour tout inconvénients. Malheureusement, à cause de létat actuel des choses intertribal, les passeports intertribaux ne sont pas acceptées comme identification. Nous nous excusons pour tout inconvénients.
Merci pour votre coopération! Merci pour votre coopération!

View File

@ -4,7 +4,6 @@ date: 2020-06-25
tags: tags:
- barin - barin
- unstagnation - unstagnation
- featured
--- ---
It is — unethical and *deeply* immoral to block our people from knowledge. Is Leeco not a free tribe? Do we not accept those in pursuit of information? We cannot block our citizens from learning more about the universe to further the human race. Our tribe was founded on the principle of helping each other learn and grow by education. We cannot learn if we never challenge our beliefs, no matter how deep their roots lie — you might remember how ingrained racism was in Leeco so many decades back — and we cannot grow as a society if we resist change! If we do not rapidly adapt to the world, the world will rapidly adapt around us. And that is unacceptable. It is — unethical and *deeply* immoral to block our people from knowledge. Is Leeco not a free tribe? Do we not accept those in pursuit of information? We cannot block our citizens from learning more about the universe to further the human race. Our tribe was founded on the principle of helping each other learn and grow by education. We cannot learn if we never challenge our beliefs, no matter how deep their roots lie — you might remember how ingrained racism was in Leeco so many decades back — and we cannot grow as a society if we resist change! If we do not rapidly adapt to the world, the world will rapidly adapt around us. And that is unacceptable.

View File

@ -4,7 +4,6 @@ date: 2020-06-19
tags: tags:
- barin - barin
- unstagnation - unstagnation
- featured
--- ---
*Test 19/20 failed: Memory access violation.* *Test 19/20 failed: Memory access violation.*

View File

@ -2,17 +2,15 @@
title: "Welcome to Ciers!" title: "Welcome to Ciers!"
date: 2020-06-14 date: 2020-06-14
tags: tags:
- barin - barin
- unstagnation - unstagnation
--- ---
_You are now at: Escribe Station. This is the last stop on the CiersXunil Line._ *You are now at: Escribe Station. This is the last stop on the CiersXunil Line.*
_“The doors will be opening on the: left side._ *“The doors will be opening on the: left side.*
_“Please stand clear of the doors.”_ *“Please stand clear of the doors.”
<!-- more -->
--- ---
@ -22,7 +20,7 @@ Welcome to Ciers! Please ensure that you have at least one of the following befo
- Otherwise, if you are a citizen of another tribe in the Farele Free Travel Area, you must have valid government identification from your tribe. These include: - Otherwise, if you are a citizen of another tribe in the Farele Free Travel Area, you must have valid government identification from your tribe. These include:
- Leecan Student Licenses - - Leecan Student Licenses
- Leecan Teacher Licenses - Leecan Teacher Licenses
- Leecan Non Licenses - Leecan Non Licenses
- Demaugian Intertribal Tickets - Demaugian Intertribal Tickets
@ -38,4 +36,4 @@ Welcome to Ciers! Please ensure that you have at least one of the following befo
Unfortunately, due to the current state of intertribal affairs, Ciers will not be accepting Intertribal Passports as a valid form of identification. We apologise for any inconvenience. Unfortunately, due to the current state of intertribal affairs, Ciers will not be accepting Intertribal Passports as a valid form of identification. We apologise for any inconvenience.
Thank you for your cooperation! Thank you for your cooperation!

View File

@ -3,7 +3,6 @@ title: Wet Hair
date: 2020-06-26 date: 2020-06-26
tags: tags:
- unstagnation - unstagnation
- featured
--- ---
*Splash!* *Splash!*

View File

@ -3,7 +3,6 @@ title: A Favour
date: 2021-06-20 date: 2021-06-20
tags: tags:
- unstagnation - unstagnation
- featured
--- ---
*Ring…ring…ring…* *Ring…ring…ring…*

View File

@ -4,7 +4,6 @@ date: 2021-11-01
tags: tags:
- birds - birds
- unstagnation - unstagnation
- featured
--- ---
**Summary:** The Birds enter a debate at school over the supremacy of waffles over pancakes. Obviously, one of them is the better food, but it's up to them to prove it. **Summary:** The Birds enter a debate at school over the supremacy of waffles over pancakes. Obviously, one of them is the better food, but it's up to them to prove it.

View File

@ -4,7 +4,6 @@ date: 2021-08-19
tags: tags:
- ibia - ibia
- unstagnation - unstagnation
- featured
--- ---
"…And never come back again, boy!" "…And never come back again, boy!"

View File

@ -4,7 +4,6 @@ date: 2022-10-24
tags: tags:
- birds - birds
- unstagnation - unstagnation
- featured
--- ---
**Summary:** Bean Bird and Noodle Bird enjoy a chat together on a quiet night slaving away before they leave in the summer. Bean wishes she had a stronger drink. **Summary:** Bean Bird and Noodle Bird enjoy a chat together on a quiet night slaving away before they leave in the summer. Bean wishes she had a stronger drink.

View File

@ -1,196 +0,0 @@
---
title: "Miraidon the Dongo"
date: 2024-11-14
tags:
- birds
- unstagnation
- featured
---
![Dongo is love. Dongo is life.](/dongo-party.png)
<!-- more -->
The boy falls back against his couch, dropping his controller in his lap. The video game on his TV blares cheerful adventurous music. "The game is sooooo slow."
"Fuck," the girl says over video chat. "You're on emulator, though. 2.5x it?"
"The computer isn't quite powerful enough."
"L. Ratio. Cringe PC gamer."
The boy turns his attention back to the game, adding a new monster to his current party. "Dongo disagrees. Do you have a Dongo? Exactly."
On the other side of the world, the girl has little to say to that. "Dongo isn't _real,_ he's _not\!"_
"Dongo is life."
"It's time to snap back to reality — car doggo is a myth."
"I will write Dongo fanfic. He will be real."
She makes a face. "I'm so sorry — this sounds like the biggest innuendo…"
He nods absently. "Hm, hm, yes, sex the Dongo."
She pauses. _"What?"_
He frowns. "Absolutely not. Dongo is too precious."
Her jaw drops. "You're the one who said to sex it\! Every time I settle down to play Pokémon, I end up playing League instead. I think I've been corrupted by the impure." She shudders.
"Oh, no\! League is not fun."
"But it is," she says sadly.
"It's boring\! You click things, it's barely real time nor turn-based. It's as if tower defense and Civ did a Dongo."
She takes a moment to parse the mystery word. "Why is it an _adjective_ now?"
"Dongo disapproves." He shakes his head.
"Oh, yeah? Well, I've spoken to Dongo and he said he doesn't like you." She sticks her tongue out, folds her arms, and turns away.
"Lies\!" he cries. "You don't have Dongo. Dongo is _mine\!"_
"I have him right here," she gloats, peeking off-camera. "He's right in front of me right now. He just doesn't want to see you."
"Let's see 'em."
"But he doesn't want to see you."
"Pics or it didn't happen."
Some shuffling from her background. "Every time I pull out my camera, he hides behind the couch and mutters, 'no'. And he can talk. And I'd know because I've talked to him."
"I think you met an impostor Dongo…" he starts, concerned.
"I think _you_ met an impostor Dongo," she counters.
"…because Pokémon can't talk, duh?" He sounds befuddled.
"Not to you," she says smugly. She pauses. "I feel like such a kid…ahh…"
"Embrace it," he encourages. "Embrace the Dongo."
"…I'd like to remind you of the innuendo you set up not 40 seconds ago."
"Well, it was an…accident."
"Dongo disapproves."
"No, _your_ Dongo disapproves."
"It's not worth arguing with a Dongo flat earther, so I'll agree to disagree."
"I think you should get your head checked out because Dongo isn't real? He's from this Pokémon game."
_"What?"_ she screeches. "No — heathen — _hypocrite\!_ I am _awake_, I am _alive_, I am _correct\!"_
"Dongo disagrees."
"Dongo is _right here,_ I —" Some shuffling. She sounds defeated. "I can't win." One last stand. "If he's real, then I'm right and you're wrong. But if he's fake you're right but you're right because you heard from Dongo."
"Touch the Dongo," he eggs. A simple test. "I dare you."
"…What the _fuck_ is going on? I'm not _coherent_ enough for this?" She sounds like she's in hysterics.
"More like you're _too_ coherent for this. I'm making innuendo jokes, obviously. Can't you tell? Dong get it?"
_"AHHHHHHHHHHH\!"_ The sound of a head smashing a wall comes through the speaker.
"No. No, I refuse to accept this. Dongo is — one: real, two: not real, three: an innuendo, four: I need a psych eval, five: _you_ need a psych eval."
He frowns. "Three of those criteria contradict each other."
"…I am _not prepared_ for this multiple choice test."
"You see, if I need an eval, then Dongo must not be not real nor real — and simultaneously you don't need an eval because Dongo is therefore real and not real. This is according to Dongo over here."
Silence.
"Dongo says hi…" he adds.
A pause. "I am going to lose my mind."
"…in Dongonese."
"What the _fuck_ is _Dongonese?_ You said Pokémon can't talk\!"
"They can — what do you mean? Pikachu talks all the time."
A slow realisation. "I'm being fucking gaslit\!"
"Can't you hear them? They make all sorts of sounds in the game."
She falls over. She considers whether to go batshit crazy or lie on the ground. She decides to lie on the ground.
"They even talk to each other," he continues. "Here, lemme find a pic."
A ping. With dread in her heart, she slides down the notification.
![](/dongo-gaslight.jpg)
It's a picture of a Victorian lamp. Its flame cheerfully dances, burning the gas. "Shut the fuck up."
"Stare into it," he encourages.
Against her will, her eyes track the still image. "Oh," she realises.
"You can hear whispers."
"_Oh._ I can _see,"_ she whispers.
" 'Dongo dong dong dongo.' "
"I can _hear_ it. The voices. Of _Dongo_. They're telling me…they're telling me to go see a therapist." She pushes herself up with her elbows.
"Dongo agrees."
"_No\!"_ She is fed up. She will not let him take it back from her. "Let him speak for _himself."_
" 'Cause that's a gas light, y'know. It's not good for your brain. Has fumes and all that."
She looks back to the picture with horror in her eyes. "I feel like I'm forgetting how to communicate like a functional human being," she says.
"It's okay\! Dongo feels that way too."
She closes her eyes. "Maybe I'll wake up tomorrow and this will all have been a big, elaborate dream."
"Yep."
"_He's. Not. Real."_
"That's right. He can't hurt you."
Something in that resonates with her. "H-he can't hurt me," she says, dazed. Then more confidently, "He can't hurt me." She nods. "The voices are gone."
"Good."
She takes a deep breath. "I am about to have a psychotic break on the bathroom floor at 1:47 AM over hearing the voices of Miraidon, box legendary of hit new Pokémon game Violet, and maybe this other nerd's voice, I'm not sure."
"While you're at it, say hi to Dongo for me."
"I'll tell him you hate him."
This shakes him up. His tone changes. "Noooo\!" More confidence. She pulls the middle finger to no one in particular. But then, "That's okay. I have the real Dongo."
She refuses to be sucked into his insanity. "I'm _not_ starting this again, I'm not\!"
He sighs. It must have been a long night for him, too. "I'd agree, actually."
"Ha\! I can finally win\!"
"I've run out of circles to Dongo," he concedes.
The sense of victory makes it easier for her to assert her place in reality. "That doesn't even make sense\!"
"So? Does Dongo make sense? No."
"The message I'm taking away from this conversation is that I'm always right and you're always wrong and Schrodinger's Dongo."
"Sounds about right." A pause. "Good night\!"
"Night\!"
!["Don-dongo. Dongodon dong dongodon?"](dongo.jpg)

View File

@ -2,6 +2,7 @@ export const navItems = [
{ href: "/#about", title: "About" }, { href: "/#about", title: "About" },
{ href: "/blog", title: "Blog" }, { href: "/blog", title: "Blog" },
{ href: "/stories", title: "Stories" }, { href: "/stories", title: "Stories" },
{ href: "https://portfolio.eggworld.me", title: "Portfolio", dominant: true },
]; ];
export default navItems; export default navItems;

View File

@ -7,9 +7,7 @@ export type Language =
| "react" | "react"
| "markdown" | "markdown"
| "flutter" | "flutter"
| "android" | "android";
| "rust"
| "golang";
export interface Project { export interface Project {
name: string; name: string;
href: string; href: string;
@ -18,7 +16,6 @@ export interface Project {
longDescription?: string; longDescription?: string;
langs: Language[]; langs: Language[];
license?: "AGPL-3.0" | "GPL-3.0" | "MIT" | "LGPL-3.0"; license?: "AGPL-3.0" | "GPL-3.0" | "MIT" | "LGPL-3.0";
type: "web" | "tool" | "embedded" | "service";
} }
export const projects: Project[] = [ export const projects: Project[] = [
@ -29,9 +26,8 @@ export const projects: Project[] = [
"A comic downloader and converter to CBZ / EPUB / PDF for my Kobo.", "A comic downloader and converter to CBZ / EPUB / PDF for my Kobo.",
longDescription: "Available via CLI and a Qt GUI!", longDescription: "Available via CLI and a Qt GUI!",
langs: ["python"], langs: ["python"],
license: "AGPL-3.0", license: "LGPL-3.0",
img: "mandown.webp", img: "mandown.webp",
type: "tool",
}, },
{ {
name: "Noveldown", name: "Noveldown",
@ -39,9 +35,8 @@ export const projects: Project[] = [
langs: ["python"], langs: ["python"],
license: "LGPL-3.0", license: "LGPL-3.0",
description: description:
"A webnovel downloader and EPUB converter for my Kobo, with lots of metadata!", "A webnovel downloader and converter to EPUB for my Kobo, with lots of metadata!",
longDescription: "Heavily borrows Mandown's design.", longDescription: "Heavily borrows Mandown's design.",
type: "tool",
}, },
{ {
name: "Jeopardy", name: "Jeopardy",
@ -51,7 +46,6 @@ export const projects: Project[] = [
license: "AGPL-3.0", license: "AGPL-3.0",
description: "Kahoot-inspired Jeopardy! game, including Final Jeopardy!", description: "Kahoot-inspired Jeopardy! game, including Final Jeopardy!",
longDescription: "Created for Bayview's Computer Club.", longDescription: "Created for Bayview's Computer Club.",
type: "web",
}, },
{ {
name: "Primoprod", name: "Primoprod",
@ -62,17 +56,15 @@ export const projects: Project[] = [
description: description:
"A game simulator to increase productivity with quests and gambling.", "A game simulator to increase productivity with quests and gambling.",
longDescription: "My first project with a JS framework!", longDescription: "My first project with a JS framework!",
type: "web",
}, },
{ {
name: "PillowⓇ", name: "Eifueo",
href: "https://github.com/potatoeggy/ece198", href: "https://github.com/potatoeggy/eifueo",
description: langs: ["markdown"],
"A water quality statistics aggregator written for the STM32 microcontroller with a display and keypad.",
langs: ["rust"],
license: "GPL-3.0", license: "GPL-3.0",
type: "embedded", img: "eifueo.webp",
img: "pillow.webp", description: "A collection of rewritten notes to remember things better.",
longDescription: "THIS IS NOT A TEXTBOOK.",
}, },
{ {
name: "Napbot", name: "Napbot",
@ -80,9 +72,36 @@ export const projects: Project[] = [
langs: ["python"], langs: ["python"],
license: "AGPL-3.0", license: "AGPL-3.0",
description: description:
"A Discord music bot with synchronised lyrics, originally a sleep tracking bot to encourage sleeping.", "A Discord bot initially to track sleep hours as friendly competition but is now a local music bot with synchronised lyrics!",
img: "napbot.webp", img: "napbot.webp",
type: "service", },
{
name: "Resketch",
href: "https://github.com/anyuan-chen/resketch",
langs: ["typescript", "react"],
img: "resketch.webp",
description:
'A "reverse-Pictionary" where you compete to have an AI recognise your drawings.',
longDescription: "Written for YRHacks 2022.",
},
{
name: "Perdiem",
href: "https://github.com/anyuan-chen/perdiem",
langs: ["javascript", "react"],
license: "AGPL-3.0",
img: "perdiem.webp",
description:
"A pretty budget tracking app where I learned too much about server-side rendering.",
longDescription: "Written for StormHacks 2022.",
},
{
name: "RecipeReady",
href: "https://github.com/christopherlam888/recipe-ready-frontend",
langs: ["python", "android", "flutter"],
img: "recipeready.webp",
description:
"Android app to automagically plan meals and prepare a shopping list so you don't have to.",
longDescription: "Written for Hack the North 2021.",
}, },
{ {
name: "AutoFicFare", name: "AutoFicFare",
@ -91,38 +110,15 @@ export const projects: Project[] = [
license: "GPL-3.0", license: "GPL-3.0",
description: description:
"Automatically update fanfiction in a Calibre database to instantly update them on your Kobo.", "Automatically update fanfiction in a Calibre database to instantly update them on your Kobo.",
type: "tool",
}, },
];
const unreleasedProjects: Project[] = [
{ {
name: "Aleister", name: "Website",
href: "https://github.com/potatoeggy/aleister", href: "https://github.com/potatoeggy/public",
langs: ["rust"], description:
"This website! It's gone through three iterations before this one, and this one's the first to use a framework.",
langs: ["typescript", "vue"],
license: "AGPL-3.0", license: "AGPL-3.0",
type: "service", img: "public.webp",
},
{
name: "Aoto",
href: "https://github.com/potatoeggy/aoto",
langs: ["golang", "typescript", "react"],
license: "AGPL-3.0",
type: "web",
},
{
name: "Kobink",
href: "https://github.com/potatoeggy/kobink",
langs: ["rust"],
license: "AGPL-3.0",
type: "service",
},
{
name: "GBARR",
href: "https://github.com/potatoeggy/gbarr",
langs: ["rust"],
license: "GPL-3.0",
type: "embedded",
}, },
]; ];

View File

@ -1,3 +0,0 @@
export const SpecialTags: string[] = [
"featured",
];

View File

@ -45,10 +45,6 @@ export const tagInfo: Record<string, TagData> = {
description: description:
"A large, loving family of birds who have found in each other a kindred soul for eternal suffering.", "A large, loving family of birds who have found in each other a kindred soul for eternal suffering.",
}, },
birdseye: {
name: "Bird's-Eye View",
description: "What's the world like to a pair of human-watching bluebirds?",
},
uoft: { uoft: {
name: "University of Teyvat", name: "University of Teyvat",
description: "A <em>Genshin Impact</em> university AU.", description: "A <em>Genshin Impact</em> university AU.",
@ -62,9 +58,5 @@ export const tagInfo: Record<string, TagData> = {
name: "Projections in the Sky", name: "Projections in the Sky",
description: "Dreams or reality — what is the difference?", description: "Dreams or reality — what is the difference?",
}, },
featured: {
name: "Featured",
description: "Works that are less rambly and more actually good!",
},
}; };
export default tagInfo; export default tagInfo;

View File

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { revisions } from "@/data/siteRevisions"; import { revisions } from "@/data/siteRevisions";
useHead({ title: "Oeufs?" }); useHead({ title: "Eggworld" });
</script> </script>
<template> <template>
@ -10,7 +10,7 @@ useHead({ title: "Oeufs?" });
<footer <footer
class="flex items-center justify-between p-3 bg-gray-100 w-full text-sm dark:bg-gray-800 flex-col md:flex-row gap-2" class="flex items-center justify-between p-3 bg-gray-100 w-full text-sm dark:bg-gray-800 flex-col md:flex-row gap-2"
> >
<label class="flex items-center gap-2"> <div class="flex items-center gap-2">
<p>Revision:</p> <p>Revision:</p>
<!-- <!--
the onchange is so bad - i'd rather it be done through vue the onchange is so bad - i'd rather it be done through vue
@ -19,15 +19,16 @@ useHead({ title: "Oeufs?" });
ig r4 has to be in next.js ig r4 has to be in next.js
--> -->
<select <select
class="p-2 border rounded-lg dark:bg-[#222]" class="p-2 border rounded rounded-lg dark:bg-[#222]"
onchange="location = this.value" onchange="location = this.value"
> >
<option v-for="(r, i) in revisions" :key="i" :value="r.url"> <option v-for="(r, i) in revisions" :key="i" :value="r.url">
{{ r.title }} {{ r.title }}
</option> </option>
</select> </select>
</label> </div>
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<p> 2022 Daniel Chen</p>
<p> <p>
Licensed under the AGPL-3.0 on Licensed under the AGPL-3.0 on
<a class="underline" href="https://github.com/potatoeggy/public"> <a class="underline" href="https://github.com/potatoeggy/public">
@ -49,9 +50,7 @@ useHead({ title: "Oeufs?" });
html { html {
background: white; background: white;
color: black; color: black;
transition: transition: color 0.2s ease, background 0.2s ease;
color 0.2s ease,
background 0.2s ease;
overflow-x: hidden; overflow-x: hidden;
overflow-y: scroll; overflow-y: scroll;
scroll-behavior: smooth; scroll-behavior: smooth;
@ -73,13 +72,6 @@ html::before {
z-index: 0; z-index: 0;
} }
/* div#__nuxt {
min-height: 100vh;
}
it's better if everything is sort of long but that is not the case
*/
html.dark::before { html.dark::before {
transform: translateX(0); transform: translateX(0);
} }

View File

@ -2,40 +2,13 @@ import { defineNuxtConfig } from "nuxt/config";
import svgLoader from "vite-svg-loader"; import svgLoader from "vite-svg-loader";
// https://v3.nuxtjs.org/api/configuration/nuxt.config // https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({ export default defineNuxtConfig({
compatibilityDate: "2024-10-16",
app: {
head: {
htmlAttrs: {
lang: "en",
},
meta: [
{ name: "viewport", content: " width=device-width,initial-scale=1" },
{ name: "theme-color", content: "#ffffff" },
],
link: [
{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
{
rel: "stylesheet",
href: "https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css",
},
],
script: [
{
defer: true,
src: "/script.js",
hid: "stupidEmergencyScript",
type: "module",
},
],
},
},
modules: [ modules: [
"@nuxt/content", "@nuxt/content",
"@nuxtjs/tailwindcss", "@nuxtjs/tailwindcss",
"@nuxtjs/color-mode", "@nuxtjs/color-mode",
"@nuxtjs/sitemap", "@funken-studio/sitemap-nuxt-3",
"nuxt-full-static",
], ],
css: ["@/assets/css/main.scss"],
nitro: { nitro: {
prerender: { prerender: {
routes: ["/sitemap.xml"], routes: ["/sitemap.xml"],
@ -44,11 +17,9 @@ export default defineNuxtConfig({
typescript: { typescript: {
shim: false, shim: false,
}, },
site: { /* @ts-expect-error */
url: process.env.BASE_URL || "https://eggworld.me",
},
sitemap: { sitemap: {
strictNuxtContentPaths: true, hostname: process.env.BASE_URL || "https://eggworld.me",
}, },
tailwindcss: {}, tailwindcss: {},
colorMode: { colorMode: {
@ -56,13 +27,26 @@ export default defineNuxtConfig({
}, },
vite: { vite: {
plugins: [svgLoader()], plugins: [svgLoader()],
css: { },
preprocessorOptions: { head: {
scss: { meta: [
api: "modern", { name: "viewport", content: " width=device-width,initial-scale=1" },
}, ],
link: [
{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
{
rel: "stylesheet",
href: "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css",
}, },
}, ],
script: [
{
defer: true,
src: "/script.js",
hid: "stupidEmergencyScript",
type: "module",
},
],
}, },
content: { content: {
documentDriven: false, documentDriven: false,
@ -105,9 +89,7 @@ export default defineNuxtConfig({
}, },
}, },
experimental: { experimental: {
sharedPrerenderData: true, reactivityTransform: true,
},
features: {
noScripts: true, noScripts: true,
}, },
}); });

View File

@ -7,20 +7,22 @@
"preview": "nuxt preview" "preview": "nuxt preview"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/content": "^2.13.4", "@nuxt/content": "^2.3.0",
"@nuxtjs/color-mode": "^3.5.1", "@nuxtjs/color-mode": "^3.2.0",
"@nuxtjs/sitemap": "^6.1.2", "@funken-studio/sitemap-nuxt-3": "^4.0.4",
"@nuxtjs/tailwindcss": "^6.12.1", "@nuxtjs/tailwindcss": "^6.2.0",
"@tailwindcss/typography": "^0.5.15", "@tailwindcss/typography": "^0.5.2",
"@types/node": "^22.7.5", "nuxt": "^3.0.0",
"dayjs": "^1.11.13", "nuxt-full-static": "^0.2.1",
"nuxt": "3.13.2",
"prettier": "^3.3.3",
"reading-time": "^2.0.0-1", "reading-time": "^2.0.0-1",
"rehype-katex": "^7.0.1", "rehype-katex": "^6.0.2",
"remark-math": "^6.0.0", "remark-math": "^5.1.1",
"sass": "^1.79.5", "sitemap": "^7.1.1",
"typescript": "^5.6.3", "typescript": "^4.7.4",
"vite-svg-loader": "^5.1.0" "unist-util-visit": "^4.1.0",
"vite-svg-loader": "^4.0.0"
},
"dependencies": {
"dayjs": "^1.11.4"
} }
} }

View File

@ -1,13 +0,0 @@
<script setup lang="ts">
useTitle("404 - Not Found", "You're lost!");
</script>
<template>
<main class="prose dark:prose-invert max-w-3xl transition">
<h1 class="mb-1">404 - Not Found</h1>
<p>
You're lost! Don't worry, here's a link
<a href="/">back to the home page.</a>
</p>
</main>
</template>

View File

@ -1,19 +1,21 @@
<script setup lang="ts"> <script setup lang="ts">
import type { AnyParsedContent } from "@/shared/types"; import type { BlogParsedContent, StoryParsedContent } from "@/shared/types";
import { calcReadingTime } from "@/shared/metadata"; import { calcReadingTime } from "@/shared/metadata";
type GeneralParsedContent = BlogParsedContent | StoryParsedContent;
const route = useRoute(); const route = useRoute();
// definePageMeta({ definePageMeta({
// layout: "withtop", layout: "withtop",
// }); });
// we're not using ContentDoc because i need control // we're not using ContentDoc because i need control
const doc = await queryContent<AnyParsedContent>(route.path).findOne(); const doc = await queryContent<GeneralParsedContent>(route.path).findOne();
const type = route.path.startsWith("/stories") const type = route.path.startsWith("/stories")
? "stories" ? "stories"
: route.path.startsWith("/blog") : route.path.startsWith("/blog")
? "blog" ? "blog"
: "unknown"; : "unknown";
const descText = const descText =
type === "stories" type === "stories"
@ -27,7 +29,7 @@ const captionText =
<template> <template>
<main class="container prose dark:prose-invert w-full"> <main class="container prose dark:prose-invert w-full">
<p class="m-0 uppercase font-mono text-sm" v-if="captionText"> <p class="m-0 uppercase font-mono text-sm" v-if="captionText !== ''">
{{ captionText }} {{ captionText }}
</p> </p>
<h1 class="m-0">{{ doc.title }}</h1> <h1 class="m-0">{{ doc.title }}</h1>
@ -37,8 +39,9 @@ const captionText =
v-for="(tag, index) in doc.tags" v-for="(tag, index) in doc.tags"
:dest="`/tags/${type}/${tag}`" :dest="`/tags/${type}/${tag}`"
:key="index" :key="index"
:name="tag" >
/> {{ tag }}
</Tag>
</div> </div>
<ContentRenderer :value="doc" tag="article" class="pt-0 w-full"> <ContentRenderer :value="doc" tag="article" class="pt-0 w-full">
<template #empty> <template #empty>
@ -58,20 +61,10 @@ const captionText =
<style scoped> <style scoped>
.container { .container {
width: 80%; width: 80%;
max-width: 80ch; max-width: 72ch;
padding-top: 2rem; padding-top: 2rem;
} }
@media screen and (max-width: 600px) {
.container {
width: 90%;
}
.container h1 {
overflow-wrap: break-word;
}
}
* { * {
transition: color 0.2s ease; transition: color 0.2s ease;
} }

View File

@ -2,7 +2,7 @@
import type { BlogParsedContent } from "@/shared/types"; import type { BlogParsedContent } from "@/shared/types";
useTitle("Blog", "Ramblings and ideas"); useTitle("Blog", "Ramblings and ideas");
//definePageMeta({ layout: "withtop" }); definePageMeta({ layout: "withtop" });
// TODO: paginate stories // TODO: paginate stories
const docs = await queryContent<BlogParsedContent>("/blog") const docs = await queryContent<BlogParsedContent>("/blog")
@ -14,6 +14,7 @@ const tags = new Set(
docs docs
.map((p) => p.tags) .map((p) => p.tags)
.flat() .flat()
.filter((p) => !p.includes(" "))
.sort() .sort()
); );
</script> </script>
@ -29,13 +30,14 @@ const tags = new Set(
:dest="`/tags/blog/${tag}`" :dest="`/tags/blog/${tag}`"
v-for="(tag, index) in tags" v-for="(tag, index) in tags"
:key="index" :key="index"
:name="tag" >
/> {{ tag }}
</Tag>
</div> </div>
<PostPreviewCard <PostPreviewCard
v-for="(post, index) in docs" v-for="(post, index) in docs"
:key="index" :key="index"
:post :post="post"
type="blog" type="blog"
/> />
</main> </main>

View File

@ -2,25 +2,16 @@
import Services from "@/components/index/services.vue"; import Services from "@/components/index/services.vue";
import About from "@/components/index/about.vue"; import About from "@/components/index/about.vue";
//definePageMeta({ layout: "withtop" }); definePageMeta({ layout: "withtop" });
useTitle("Home", "Personal website!"); useTitle("Home", "Personal website!");
const welcomeStrings = ["Welcome!", "Bienvenue!", "欢迎!"];
</script> </script>
<template> <template>
<main class="flex flex-col items-center justify-around gap-8"> <main class="flex flex-col items-center justify-around gap-8">
<div class="flex flex-col items-center"> <h1>Welcome!</h1>
<HeaderLoop class="text-bitter font-bold" :strings="welcomeStrings" /> <p>What are you here to see?</p>
<p>What are you here to see?</p>
<p>
For my portfolio, please visit
<a class="underline" href="https://github.com/potatoeggy">GitHub</a>
instead.
</p>
</div>
<div <div
class="flex justify-around items-start w-full flex-wrap gap-x-8 gap-y-10" class="flex justify-around items-stretch w-full flex-wrap gap-x-8 gap-y-10"
> >
<BlogStatBox /> <BlogStatBox />
<StoryStatBox /> <StoryStatBox />

View File

@ -2,7 +2,7 @@
import type { StoryParsedContent } from "@/shared/types"; import type { StoryParsedContent } from "@/shared/types";
useTitle("Stories", "Fantasies and worlds"); useTitle("Stories", "Fantasies and worlds");
//definePageMeta({ layout: "withtop" }); definePageMeta({ layout: "withtop" });
// TODO: paginate stories // TODO: paginate stories
const docs = await queryContent<StoryParsedContent>("/stories") const docs = await queryContent<StoryParsedContent>("/stories")
@ -14,6 +14,7 @@ const tags = new Set(
docs docs
.map((p) => p.tags) .map((p) => p.tags)
.flat() .flat()
.filter((p) => !p.includes(" ")) // do not include AO3-style tags
.sort() .sort()
); );
</script> </script>
@ -29,8 +30,9 @@ const tags = new Set(
:dest="`/tags/stories/${tag}`" :dest="`/tags/stories/${tag}`"
v-for="(tag, index) in tags" v-for="(tag, index) in tags"
:key="index" :key="index"
:name="tag" >
/> {{ tag }}
</Tag>
</div> </div>
<PostPreviewCard <PostPreviewCard
v-for="(story, index) in docs" v-for="(story, index) in docs"

View File

@ -3,7 +3,7 @@ import { tagInfo, type TagData } from "@/data/tagInfo";
import type { BlogParsedContent } from "@/shared/types"; import type { BlogParsedContent } from "@/shared/types";
const route = useRoute(); const route = useRoute();
//definePageMeta({ layout: "withtop" }); definePageMeta({ layout: "withtop" });
const tag = const tag =
typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0]; typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0];
@ -16,7 +16,7 @@ const docs = await queryContent<BlogParsedContent>("/blog")
.find(); .find();
const title = details.name ?? `"${tag}"`; const title = details.name ?? `"${tag}"`;
useTitle(title + " Posts", details.description); useTitle(title, details.description);
</script> </script>
<template> <template>
@ -34,7 +34,7 @@ useTitle(title + " Posts", details.description);
<PostPreviewCard <PostPreviewCard
v-for="(post, index) in docs" v-for="(post, index) in docs"
:key="index" :key="index"
:post :post="post"
:highlighttags="[tag]" :highlighttags="[tag]"
type="blog" type="blog"
/> />

View File

@ -3,7 +3,7 @@ import { tagInfo, type TagData } from "@/data/tagInfo";
import type { StoryParsedContent } from "@/shared/types"; import type { StoryParsedContent } from "@/shared/types";
const route = useRoute(); const route = useRoute();
//definePageMeta({ layout: "withtop" }); definePageMeta({ layout: "withtop" });
const tag = const tag =
typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0]; typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0];
@ -16,7 +16,7 @@ const docs = await queryContent<StoryParsedContent>("/stories")
.find(); .find();
const title = details.name ?? `"${tag}"`; const title = details.name ?? `"${tag}"`;
useTitle(title + " Stories", details.description); useTitle(title, details.description);
</script> </script>
<template> <template>

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.172 11l-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"/></svg>

After

Width:  |  Height:  |  Size: 220 B

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32.000001">
<g transform="translate(0 -1020.3622)">
<ellipse cx="-907.35657" cy="479.90009" fill="#384e54" color="#000" overflow="visible" rx="3.5793996" ry="3.8207953" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" transform="scale(-1 1) rotate(-60.548)"/>
<ellipse cx="-891.57654" cy="507.8461" fill="#384e54" color="#000" overflow="visible" rx="3.5793996" ry="3.8207953" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" transform="rotate(-60.548)"/>
<path fill="#384e54" d="M16.091693 1021.3642c-1.105749.01-2.210341.049-3.31609.09C6.8422558 1021.6738 2 1026.3942 2 1032.3622v20h28v-20c0-5.9683-4.667345-10.4912-10.59023-10.908-1.10575-.078-2.212328-.099-3.318077-.09z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill="#76e1fe" d="M4.6078867 1025.0462c.459564.2595 1.818262 1.2013 1.980983 1.648.183401.5035.159385 1.0657-.114614 1.551-.346627.6138-1.005341.9487-1.696421.9365-.339886-.01-1.720283-.6372-2.042561-.8192-.97754-.5519-1.350795-1.7418-.833686-2.6576.517109-.9158 1.728749-1.2107 2.706299-.6587z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<rect width="3.0866659" height="3.5313663" x="14.406213" y="1035.6842" fill-opacity=".32850246" color="#000" overflow="visible" ry=".62426329" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill="#76e1fe" d="M16 1023.3622c-9 0-12 3.7153-12 9v20h24c-.04889-7.3562 0-18 0-20 0-5.2848-3-9-12-9z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill="#76e1fe" d="M27.074073 1025.0462c-.45957.2595-1.818257 1.2013-1.980979 1.648-.183401.5035-.159384 1.0657.114614 1.551.346627.6138 1.005335.9487 1.696415.9365.33988-.01 1.72029-.6372 2.04256-.8192.97754-.5519 1.35079-1.7418.83369-2.6576-.51711-.9158-1.72876-1.2107-2.7063-.6587z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<circle cx="21.175734" cy="1030.3542" r="4.6537542" fill="#fff" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<circle cx="10.339486" cy="1030.3542" r="4.8316345" fill="#fff" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<rect width="3.6673687" height="4.1063409" x="14.115863" y="1035.9174" fill-opacity=".32941176" color="#000" overflow="visible" ry=".72590536" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<rect width="3.6673687" height="4.1063409" x="14.115863" y="1035.2253" fill="#fffcfb" color="#000" overflow="visible" ry=".72590536" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill-opacity=".32941176" d="M19.999735 1036.5289c0 .838-.871228 1.2682-2.144766 1.1659-.02366 0-.04795-.6004-.254147-.5832-.503669.042-1.095902-.02-1.685964-.02-.612939 0-1.206342.1826-1.68549.017-.110233-.038-.178298.5838-.261532.5816-1.243685-.033-2.078803-.3383-2.078803-1.1618 0-1.2118 1.815635-2.1941 4.055351-2.1941 2.239704 0 4.055351.9823 4.055351 2.1941z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill="#c38c74" d="M19.977414 1035.7004c0 .5685-.433659.8554-1.138091 1.0001-.291933.06-.630371.096-1.003719.1166-.56405.032-1.207782.031-1.89122.031-.672834 0-1.307182 0-1.864904-.029-.306268-.017-.589429-.043-.843164-.084-.813833-.1318-1.324962-.417-1.324962-1.0344 0-1.1601 1.805642-2.1006 4.03303-2.1006 2.227377 0 4.03303.9405 4.03303 2.1006z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<ellipse cx="15.944382" cy="1033.8501" fill="#23201f" color="#000" overflow="visible" rx="2.0801733" ry="1.343747" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<circle cx="12.414201" cy="1030.3542" r="1.9630634" fill="#171311" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<circle cx="23.110121" cy="1030.3542" r="1.9630634" fill="#171311" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1"/>
<path fill="none" stroke="#384e54" stroke-linecap="round" stroke-width=".39730874" d="M5.0055377 1027.2727c-1.170435-1.0835-2.026973-.7721-2.044172-.7463"/>
<path fill="none" stroke="#384e54" stroke-linecap="round" stroke-width=".39730874" d="M4.3852457 1026.9152c-1.158557.036-1.346704.6303-1.33881.6523m23.5840973-.3951c1.17043-1.0835 2.02697-.7721 2.04417-.7463"/>
<path fill="none" stroke="#384e54" stroke-linecap="round" stroke-width=".39730874" d="M27.321773 1026.673c1.15856.036 1.3467.6302 1.3388.6522"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -1,57 +0,0 @@
<svg version="1.1" height="106" width="106" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="logo" transform="translate(53, 53)">
<path id="r" transform="translate(0.5, 0.5)" stroke="black" stroke-width="1" stroke-linejoin="round" d=" M -9,-15 H 4 C 12,-15 12,-7 4,-7 H -9 Z M -40,22 H 0 V 11 H -9 V 3 H 1 C 12,3 6,22 15,22 H 40 V 3 H 34 V 5 C 34,13 25,12 24,7 C 23,2 19,-2 18,-2 C 33,-10 24,-26 12,-26 H -35 V -15 H -25 V 11 H -40 Z"/>
<g id="gear" mask="url(#holes)">
<circle r="43" fill="none" stroke="black" stroke-width="9"/>
<g id="cogs">
<polygon id="cog" stroke="black" stroke-width="3" stroke-linejoin="round" points="46,3 51,0 46,-3"/>
<use xlink:href="#cog" transform="rotate(11.25)"/>
<use xlink:href="#cog" transform="rotate(22.50)"/>
<use xlink:href="#cog" transform="rotate(33.75)"/>
<use xlink:href="#cog" transform="rotate(45.00)"/>
<use xlink:href="#cog" transform="rotate(56.25)"/>
<use xlink:href="#cog" transform="rotate(67.50)"/>
<use xlink:href="#cog" transform="rotate(78.75)"/>
<use xlink:href="#cog" transform="rotate(90.00)"/>
<use xlink:href="#cog" transform="rotate(101.25)"/>
<use xlink:href="#cog" transform="rotate(112.50)"/>
<use xlink:href="#cog" transform="rotate(123.75)"/>
<use xlink:href="#cog" transform="rotate(135.00)"/>
<use xlink:href="#cog" transform="rotate(146.25)"/>
<use xlink:href="#cog" transform="rotate(157.50)"/>
<use xlink:href="#cog" transform="rotate(168.75)"/>
<use xlink:href="#cog" transform="rotate(180.00)"/>
<use xlink:href="#cog" transform="rotate(191.25)"/>
<use xlink:href="#cog" transform="rotate(202.50)"/>
<use xlink:href="#cog" transform="rotate(213.75)"/>
<use xlink:href="#cog" transform="rotate(225.00)"/>
<use xlink:href="#cog" transform="rotate(236.25)"/>
<use xlink:href="#cog" transform="rotate(247.50)"/>
<use xlink:href="#cog" transform="rotate(258.75)"/>
<use xlink:href="#cog" transform="rotate(270.00)"/>
<use xlink:href="#cog" transform="rotate(281.25)"/>
<use xlink:href="#cog" transform="rotate(292.50)"/>
<use xlink:href="#cog" transform="rotate(303.75)"/>
<use xlink:href="#cog" transform="rotate(315.00)"/>
<use xlink:href="#cog" transform="rotate(326.25)"/>
<use xlink:href="#cog" transform="rotate(337.50)"/>
<use xlink:href="#cog" transform="rotate(348.75)"/>
</g>
<g id="mounts">
<polygon id="mount" stroke="black" stroke-width="6" stroke-linejoin="round" points="-7,-42 0,-35 7,-42"/>
<use xlink:href="#mount" transform="rotate(72)"/>
<use xlink:href="#mount" transform="rotate(144)"/>
<use xlink:href="#mount" transform="rotate(216)"/>
<use xlink:href="#mount" transform="rotate(288)"/>
</g>
</g>
<mask id="holes">
<rect x="-60" y="-60" width="120" height="120" fill="white"/>
<circle id="hole" cy="-40" r="3"/>
<use xlink:href="#hole" transform="rotate(72)"/>
<use xlink:href="#hole" transform="rotate(144)"/>
<use xlink:href="#hole" transform="rotate(216)"/>
<use xlink:href="#hole" transform="rotate(288)"/>
</mask>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
<g>
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
<g>
<g>
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 C343.2,346.5,335,363.3,326.8,380.1z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- ***** BEGIN LICENSE BLOCK *****
- Part of the Jellyfin project (https://jellyfin.media)
-
- All copyright belongs to the Jellyfin contributors; a full list can
- be found in the file CONTRIBUTORS.md
-
- This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
- To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/.
- ***** END LICENSE BLOCK ***** -->
<svg version="1.1" id="icon-transparent" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512">
<defs>
<linearGradient id="linear-gradient" gradientUnits="userSpaceOnUse" x1="110.25" y1="213.3" x2="496.14" y2="436.09">
<stop offset="0" style="stop-color:#AA5CC3"/>
<stop offset="1" style="stop-color:#00A4DC"/>
</linearGradient>
</defs>
<title>icon-transparent</title>
<g id="icon-transparent">
<path id="inner-shape" d="M256,201.6c-20.4,0-86.2,119.3-76.2,139.4s142.5,19.9,152.4,0S276.5,201.6,256,201.6z" fill="url(#linear-gradient)"/>
<path id="outer-shape" d="M256,23.3c-61.6,0-259.8,359.4-229.6,420.1s429.3,60,459.2,0S317.6,23.3,256,23.3z M406.5,390.8c-19.6,39.3-281.1,39.8-300.9,0s110.1-275.3,150.4-275.3S426.1,351.4,406.5,390.8z" fill="url(#linear-gradient)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,786 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</cc:Work>
</rdf:RDF>
</metadata>
<path d="m150 1.0238 133.58 66.793-133.58 66.793-133.58-66.793z" fill="#486e3f" stroke-width="0"/>
<path d="m283.72 67.767-133.6 66.813v164.04l133.6-66.813z" fill="#966c4a" stroke-width="0"/>
<path d="m16.519 67.766 133.6 66.813v164.04l-133.6-66.813z" fill="#966c4a" stroke-width="0"/>
<path d="m16.519 67.766 8.35 4.1759v10.253l-8.35-4.1759z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 80.01h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 100.52h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 121.02h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 141.53h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 162.03h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 203.04h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m18.469 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 59.505h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 69.757h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 80.01h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 90.263h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 100.52h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 110.77h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 151.78h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 162.03h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 172.28h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 182.54h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 192.79h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m27.805 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 59.505h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 80.01h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 100.52h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 110.77h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 131.27h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 151.78h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 162.03h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 172.28h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 182.54h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 203.04h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m37.141 213.3h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 59.505h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 69.757h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 80.01h9.336v10.253h-9.336z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 100.52h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 110.77h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 131.27h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 141.53h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 162.03h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 203.04h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m46.477 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 59.505h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 69.757h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 80.01h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 90.263h9.336v10.253h-9.336z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 100.52h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 121.02h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 162.03h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 182.54h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 192.79h9.336v10.253h-9.336z" fill="#745844" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m55.813 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 59.505h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 69.757h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 80.01h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 100.52h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 110.77h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 141.53h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 151.78h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 162.03h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 172.28h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 182.54h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 203.04h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m65.149 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 59.505h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 80.01h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 100.52h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 110.77h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 151.78h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 162.03h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 172.28h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 182.54h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 192.79h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m74.485 213.3h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 59.505h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 69.757h9.336v10.253h-9.336z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 80.01h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 100.52h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 110.77h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 121.02h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 141.53h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 162.03h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 192.79h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 203.04h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m83.821 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 59.505h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 69.757h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 80.01h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 90.263h9.336v10.253h-9.336z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 100.52h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 110.77h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 121.02h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 162.03h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 172.28h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 203.04h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m93.157 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 59.505h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 69.757h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 80.01h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 100.52h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 131.27h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 141.53h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 162.03h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 192.79h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 203.04h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m102.49 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 59.505h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 80.01h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 90.263h9.336v10.253h-9.336z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 100.52h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 121.02h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 141.53h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 162.03h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 192.79h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m111.83 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 59.505h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 69.757h9.336v10.253h-9.336z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 80.01h9.336v10.253h-9.336z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 100.52h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 110.77h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 121.02h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 162.03h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 172.28h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 192.79h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 203.04h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m121.16 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 59.505h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 80.01h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 90.263h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 100.52h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 151.78h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 162.03h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 172.28h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 192.79h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m130.5 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 59.505h9.336v10.253h-9.336z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 69.757h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 80.01h9.336v10.253h-9.336z" fill="#3a5832" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 100.52h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 121.02h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 131.27h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 151.78h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 162.03h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 172.28h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 182.54h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 192.79h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 203.04h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m139.84 213.3h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 59.505h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 69.757h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 80.01h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 90.263h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 100.52h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 110.77h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 121.02h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 141.53h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 151.78h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 162.03h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 172.28h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 182.54h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 192.79h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 203.04h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m149.17 213.3h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 59.505h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 69.757h9.336v10.253h-9.336z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 80.01h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 90.263h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 100.52h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 110.77h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 121.02h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 131.27h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 141.53h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 151.78h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 162.03h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 172.28h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 182.54h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 192.79h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 203.04h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 .44729 0 1 0 0)" d="m158.51 213.3h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 209.66h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 230.16h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 250.67h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 271.17h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 291.68h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 312.18h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 353.19h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m167.84 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 209.66h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 219.91h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 230.16h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 240.41h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 250.67h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 260.92h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 301.93h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 312.18h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 322.44h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 332.69h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 342.94h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m177.18 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 209.66h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 230.16h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 250.67h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 260.92h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 281.42h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 301.93h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 312.18h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 322.44h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 332.69h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 353.19h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m186.52 363.45h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 209.66h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 219.91h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 230.16h9.336v10.253h-9.336z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 250.67h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 260.92h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 281.42h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 291.68h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 312.18h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 353.19h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m195.85 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 209.66h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 219.91h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 230.16h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 240.41h9.336v10.253h-9.336z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 250.67h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 271.17h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 312.18h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 332.69h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 342.94h9.336v10.253h-9.336z" fill="#745844" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m205.19 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 209.66h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 219.91h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 230.16h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 250.67h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 260.92h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 291.68h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 301.93h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 312.18h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 322.44h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 332.69h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 353.19h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m214.52 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 209.66h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 230.16h9.336v10.253h-9.336z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 250.67h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 260.92h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 301.93h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 312.18h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 322.44h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 332.69h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 342.94h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m223.86 363.45h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 209.66h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 219.91h9.336v10.253h-9.336z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 230.16h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 250.67h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 260.92h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 271.17h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 291.68h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 312.18h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 342.94h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 353.19h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m233.2 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 209.66h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 219.91h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 230.16h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 240.41h9.336v10.253h-9.336z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 250.67h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 260.92h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 271.17h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 312.18h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 322.44h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 353.19h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m242.53 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 209.66h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 219.91h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 230.16h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 250.67h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 281.42h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 291.68h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 312.18h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 342.94h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 353.19h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m251.87 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 209.66h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 230.16h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 240.41h9.336v10.253h-9.336z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 250.67h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 271.17h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 291.68h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 312.18h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 342.94h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m261.2 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 209.66h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 219.91h9.336v10.253h-9.336z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 230.16h9.336v10.253h-9.336z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 250.67h9.336v10.253h-9.336z" fill="#6c6c6c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 260.92h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 271.17h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 312.18h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 322.44h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 342.94h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 353.19h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m270.54 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 209.66h9.336v10.253h-9.336z" fill="#57844b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 230.16h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 240.41h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 250.67h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 301.93h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 312.18h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 322.44h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 342.94h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m279.88 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 209.66h9.336v10.253h-9.336z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 219.91h9.336v10.253h-9.336z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 230.16h9.336v10.253h-9.336z" fill="#3a5832" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 250.67h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 271.17h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 281.42h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 301.93h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 312.18h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 322.44h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 332.69h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 342.94h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 353.19h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m289.21 363.45h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 209.66h9.336v10.253h-9.336z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 219.91h9.336v10.253h-9.336z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 230.16h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 240.41h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 250.67h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 260.92h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 271.17h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 291.68h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 301.93h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 312.18h9.336v10.253h-9.336z" fill="#878787" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 322.44h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 332.69h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 342.94h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 353.19h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m298.55 363.45h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 209.66h9.336v10.253h-9.336z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 219.91h9.336v10.253h-9.336z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 230.16h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 240.41h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 250.67h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 260.92h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 271.17h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 281.42h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 291.68h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 301.93h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 312.18h9.336v10.253h-9.336z" fill="#79553a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 322.44h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 332.69h9.336v10.253h-9.336z" fill="#b9855c" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 342.94h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 353.19h9.336v10.253h-9.336z" fill="#966c4a" stroke-width="0"/>
<path transform="matrix(.89439 -.44729 0 1 0 0)" d="m307.88 363.45h9.336v10.253h-9.336z" fill="#593d29" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-82.708h9.3273v9.3273h-9.3273z" fill="#486e3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-73.381h9.3273v9.3273h-9.3273z" fill="#486e3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-64.054h9.3273v9.3273h-9.3273z" fill="#4f7944" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-54.726h9.3273v9.3273h-9.3273z" fill="#395732" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-45.399h9.3273v9.3273h-9.3273z" fill="#4f7844" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-36.072h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-26.744h9.3273v9.3273h-9.3273z" fill="#3d5d35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-17.417h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998-8.0896h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 1.2377h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 10.565h9.3273v9.3273h-9.3273z" fill="#4b7341" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 19.892h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 29.22h9.3273v9.3273h-9.3273z" fill="#5a8a4e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 38.547h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 47.874h9.3273v9.3273h-9.3273z" fill="#4f7944" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m84.998 57.202h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-82.708h9.3273v9.3273h-9.3273z" fill="#5f9152" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-73.381h9.3273v9.3273h-9.3273z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-64.054h9.3273v9.3273h-9.3273z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-54.726h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-45.399h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-36.072h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-26.744h9.3273v9.3273h-9.3273z" fill="#4c7441" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-17.417h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325-8.0896h9.3273v9.3273h-9.3273z" fill="#4b7341" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 1.2377h9.3273v9.3273h-9.3273z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 10.565h9.3273v9.3273h-9.3273z" fill="#4d7542" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 19.892h9.3273v9.3273h-9.3273z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 29.22h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 38.547h9.3273v9.3273h-9.3273z" fill="#527d46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 47.874h9.3273v9.3273h-9.3273z" fill="#4e7744" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m94.325 57.202h9.3273v9.3273h-9.3273z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-82.708h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-73.381h9.3273v9.3273h-9.3273z" fill="#4e7743" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-64.054h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-54.726h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-45.399h9.3273v9.3273h-9.3273z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-36.072h9.3273v9.3273h-9.3273z" fill="#3a5932" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-26.744h9.3273v9.3273h-9.3273z" fill="#507a45" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-17.417h9.3273v9.3273h-9.3273z" fill="#4c7442" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65-8.0896h9.3273v9.3273h-9.3273z" fill="#59874c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 1.2377h9.3273v9.3273h-9.3273z" fill="#59884d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 10.565h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 19.892h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 29.22h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 38.547h9.3273v9.3273h-9.3273z" fill="#395732" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 47.874h9.3273v9.3273h-9.3273z" fill="#5d8e51" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m103.65 57.202h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-82.708h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-73.381h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-64.054h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-54.726h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-45.399h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-36.072h9.3273v9.3273h-9.3273z" fill="#517b46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-26.744h9.3273v9.3273h-9.3273z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-17.417h9.3273v9.3273h-9.3273z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98-8.0896h9.3273v9.3273h-9.3273z" fill="#537e47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 1.2377h9.3273v9.3273h-9.3273z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 10.565h9.3273v9.3273h-9.3273z" fill="#507a45" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 19.892h9.3273v9.3273h-9.3273z" fill="#4f7944" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 29.22h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 38.547h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 47.874h9.3273v9.3273h-9.3273z" fill="#3c5b34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m112.98 57.202h9.3273v9.3273h-9.3273z" fill="#436639" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-82.708h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-73.381h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-64.054h9.3273v9.3273h-9.3273z" fill="#436639" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-54.726h9.3273v9.3273h-9.3273z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-45.399h9.3273v9.3273h-9.3273z" fill="#547f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-36.072h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-26.744h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-17.417h9.3273v9.3273h-9.3273z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31-8.0896h9.3273v9.3273h-9.3273z" fill="#547f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 1.2377h9.3273v9.3273h-9.3273z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 10.565h9.3273v9.3273h-9.3273z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 19.892h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 29.22h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 38.547h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 47.874h9.3273v9.3273h-9.3273z" fill="#57854b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m122.31 57.202h9.3273v9.3273h-9.3273z" fill="#507a45" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-82.708h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-73.381h9.3273v9.3273h-9.3273z" fill="#3e5f36" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-64.054h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-54.726h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-45.399h9.3273v9.3273h-9.3273z" fill="#558149" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-36.072h9.3273v9.3273h-9.3273z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-26.744h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-17.417h9.3273v9.3273h-9.3273z" fill="#3c5c34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63-8.0896h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 1.2377h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 10.565h9.3273v9.3273h-9.3273z" fill="#59874c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 19.892h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 29.22h9.3273v9.3273h-9.3273z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 38.547h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 47.874h9.3273v9.3273h-9.3273z" fill="#537f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m131.63 57.202h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-82.708h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-73.381h9.3273v9.3273h-9.3273z" fill="#4a7140" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-64.054h9.3273v9.3273h-9.3273z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-54.726h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-45.399h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-36.072h9.3273v9.3273h-9.3273z" fill="#486e3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-26.744h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-17.417h9.3273v9.3273h-9.3273z" fill="#507a45" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96-8.0896h9.3273v9.3273h-9.3273z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 1.2377h9.3273v9.3273h-9.3273z" fill="#537e47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 10.565h9.3273v9.3273h-9.3273z" fill="#45693c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 19.892h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 29.22h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 38.547h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 47.874h9.3273v9.3273h-9.3273z" fill="#486e3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m140.96 57.202h9.3273v9.3273h-9.3273z" fill="#486e3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-82.708h9.3273v9.3273h-9.3273z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-73.381h9.3273v9.3273h-9.3273z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-64.054h9.3273v9.3273h-9.3273z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-54.726h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-45.399h9.3273v9.3273h-9.3273z" fill="#547f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-36.072h9.3273v9.3273h-9.3273z" fill="#4b7341" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-26.744h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-17.417h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29-8.0896h9.3273v9.3273h-9.3273z" fill="#4c7441" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 1.2377h9.3273v9.3273h-9.3273z" fill="#3e5f36" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 10.565h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 19.892h9.3273v9.3273h-9.3273z" fill="#436639" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 29.22h9.3273v9.3273h-9.3273z" fill="#3b5a33" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 38.547h9.3273v9.3273h-9.3273z" fill="#5f9152" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 47.874h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m150.29 57.202h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-82.708h9.3273v9.3273h-9.3273z" fill="#4d7542" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-73.381h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-64.054h9.3273v9.3273h-9.3273z" fill="#486e3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-54.726h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-45.399h9.3273v9.3273h-9.3273z" fill="#5a8a4e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-36.072h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-26.744h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-17.417h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62-8.0896h9.3273v9.3273h-9.3273z" fill="#57854b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 1.2377h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 10.565h9.3273v9.3273h-9.3273z" fill="#5d8e51" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 19.892h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 29.22h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 38.547h9.3273v9.3273h-9.3273z" fill="#4e7744" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 47.874h9.3273v9.3273h-9.3273z" fill="#3d5d35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m159.62 57.202h9.3273v9.3273h-9.3273z" fill="#45693c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-82.708h9.3273v9.3273h-9.3273z" fill="#496f3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-73.381h9.3273v9.3273h-9.3273z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-64.054h9.3273v9.3273h-9.3273z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-54.726h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-45.399h9.3273v9.3273h-9.3273z" fill="#395731" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-36.072h9.3273v9.3273h-9.3273z" fill="#486e3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-26.744h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-17.417h9.3273v9.3273h-9.3273z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94-8.0896h9.3273v9.3273h-9.3273z" fill="#537e47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 1.2377h9.3273v9.3273h-9.3273z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 10.565h9.3273v9.3273h-9.3273z" fill="#3b5a33" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 19.892h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 29.22h9.3273v9.3273h-9.3273z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 38.547h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 47.874h9.3273v9.3273h-9.3273z" fill="#486e3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m168.94 57.202h9.3273v9.3273h-9.3273z" fill="#5d8e50" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-82.708h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-73.381h9.3273v9.3273h-9.3273z" fill="#517b46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-64.054h9.3273v9.3273h-9.3273z" fill="#527d46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-54.726h9.3273v9.3273h-9.3273z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-45.399h9.3273v9.3273h-9.3273z" fill="#3e5f36" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-36.072h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-26.744h9.3273v9.3273h-9.3273z" fill="#58864c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-17.417h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27-8.0896h9.3273v9.3273h-9.3273z" fill="#3f6037" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 1.2377h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 10.565h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 19.892h9.3273v9.3273h-9.3273z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 29.22h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 38.547h9.3273v9.3273h-9.3273z" fill="#527d46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 47.874h9.3273v9.3273h-9.3273z" fill="#486e3f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m178.27 57.202h9.3273v9.3273h-9.3273z" fill="#3c5c34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-82.708h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-73.381h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-64.054h9.3273v9.3273h-9.3273z" fill="#548049" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-54.726h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-45.399h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-36.072h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-26.744h9.3273v9.3273h-9.3273z" fill="#547f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-17.417h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6-8.0896h9.3273v9.3273h-9.3273z" fill="#476c3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 1.2377h9.3273v9.3273h-9.3273z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 10.565h9.3273v9.3273h-9.3273z" fill="#406137" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 19.892h9.3273v9.3273h-9.3273z" fill="#3c5b34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 29.22h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 38.547h9.3273v9.3273h-9.3273z" fill="#4b7341" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 47.874h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m187.6 57.202h9.3273v9.3273h-9.3273z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-82.708h9.3273v9.3273h-9.3273z" fill="#436639" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-73.381h9.3273v9.3273h-9.3273z" fill="#5f9152" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-64.054h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-54.726h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-45.399h9.3273v9.3273h-9.3273z" fill="#537f48" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-36.072h9.3273v9.3273h-9.3273z" fill="#3a5932" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-26.744h9.3273v9.3273h-9.3273z" fill="#476b3d" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-17.417h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93-8.0896h9.3273v9.3273h-9.3273z" fill="#416338" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 1.2377h9.3273v9.3273h-9.3273z" fill="#45693c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 10.565h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 19.892h9.3273v9.3273h-9.3273z" fill="#57854b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 29.22h9.3273v9.3273h-9.3273z" fill="#4d7643" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 38.547h9.3273v9.3273h-9.3273z" fill="#4e7743" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 47.874h9.3273v9.3273h-9.3273z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m196.93 57.202h9.3273v9.3273h-9.3273z" fill="#406237" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-82.708h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-73.381h9.3273v9.3273h-9.3273z" fill="#44683b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-64.054h9.3273v9.3273h-9.3273z" fill="#3a5832" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-54.726h9.3273v9.3273h-9.3273z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-45.399h9.3273v9.3273h-9.3273z" fill="#3d5d35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-36.072h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-26.744h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-17.417h9.3273v9.3273h-9.3273z" fill="#4e7743" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25-8.0896h9.3273v9.3273h-9.3273z" fill="#476d3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 1.2377h9.3273v9.3273h-9.3273z" fill="#57854b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 10.565h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 19.892h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 29.22h9.3273v9.3273h-9.3273z" fill="#507a45" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 38.547h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 47.874h9.3273v9.3273h-9.3273z" fill="#4c7442" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m206.25 57.202h9.3273v9.3273h-9.3273z" fill="#466b3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-82.708h9.3273v9.3273h-9.3273z" fill="#36532f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-73.381h9.3273v9.3273h-9.3273z" fill="#426439" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-64.054h9.3273v9.3273h-9.3273z" fill="#3e5f36" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-54.726h9.3273v9.3273h-9.3273z" fill="#517c46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-45.399h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-36.072h9.3273v9.3273h-9.3273z" fill="#45693c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-26.744h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-17.417h9.3273v9.3273h-9.3273z" fill="#3e5e35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58-8.0896h9.3273v9.3273h-9.3273z" fill="#4d7542" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 1.2377h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 10.565h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 19.892h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 29.22h9.3273v9.3273h-9.3273z" fill="#3b5a33" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 38.547h9.3273v9.3273h-9.3273z" fill="#527d46" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 47.874h9.3273v9.3273h-9.3273z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m215.58 57.202h9.3273v9.3273h-9.3273z" fill="#426539" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-82.708h9.3273v9.3273h-9.3273z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-73.381h9.3273v9.3273h-9.3273z" fill="#44673a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-64.054h9.3273v9.3273h-9.3273z" fill="#59874c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-54.726h9.3273v9.3273h-9.3273z" fill="#3d5d34" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-45.399h9.3273v9.3273h-9.3273z" fill="#45693b" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-36.072h9.3273v9.3273h-9.3273z" fill="#486e3e" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-26.744h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-17.417h9.3273v9.3273h-9.3273z" fill="#527d47" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91-8.0896h9.3273v9.3273h-9.3273z" fill="#3d5d35" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 1.2377h9.3273v9.3273h-9.3273z" fill="#3f6036" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 10.565h9.3273v9.3273h-9.3273z" fill="#466a3c" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 19.892h9.3273v9.3273h-9.3273z" fill="#43663a" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 29.22h9.3273v9.3273h-9.3273z" fill="#49703f" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 38.547h9.3273v9.3273h-9.3273z" fill="#558149" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 47.874h9.3273v9.3273h-9.3273z" fill="#3b5a33" stroke-width="0"/>
<path transform="matrix(.89442 .44722 -.89442 .44722 0 0)" d="m224.91 57.202h9.3273v9.3273h-9.3273z" fill="#4d7542" stroke-width="0"/>
<path d="m24.869 92.448v10.252l8.3496 4.1758v-10.252zm8.3496 14.428v10.254l16.699 8.3516v-10.254l-8.3496-4.1758zm16.699 18.605v10.252l8.3516 4.1758v-10.252zm8.3516 4.1758 25.049 12.527v-20.506l-8.3496-4.1758v10.252l-8.3496-4.1758v-20.504l-8.3496-4.1758v20.504zm25.049 12.527v10.252l-16.699-8.3516v10.254l25.049 12.527v-10.254l8.3516 4.1758 8.3496 4.1758v-10.252l-8.3496-4.1758v-10.252l-8.3516-4.1758v10.252zm25.051 12.527 8.3496 4.1758v-10.252l-8.3496-4.1758zm8.3496-6.0762 8.3496 4.1758v-10.254l-8.3496-4.1758zm8.3496 4.1758v10.252l8.3496 4.1758v10.254l8.3516 4.1758v-20.506l-8.3516-4.1758zm16.701 8.3516 8.3496 4.1758v-10.252l-8.3496-4.1777zm-116.9-58.463-8.3496-4.1758v10.252l8.3496 4.1758z" fill="#593d29" stroke-width="0"/>
<path d="m283.72 88.272-8.3516 4.1758v10.254l8.3516-4.1758zm-8.3516 14.43-16.699 8.3516v10.252l8.3496-4.1758v10.252l8.3496-4.1758v-10.252zm-16.699 8.3516v-10.254l-8.3496 4.1758v10.254zm-8.3496 4.1758-8.3496 4.1758v10.252l8.3496-4.1758zm-8.3496 14.428-8.3516 4.1758v-10.252l-8.3496 4.1758v10.252l-8.3496 4.1758v10.254l-16.699 8.3516v10.252l25.049-12.527v-10.252l8.3496-4.1758 8.3516-4.1758zm0 10.254v10.252l8.3496-4.1758v-10.252zm-25.051 2.2734v-20.504l-8.3496 4.1758v10.252l-8.3496 4.1758v-20.506l-8.3516 4.1758v30.76l8.3516-4.1777 8.3496-4.1758zm-25.051 12.529-8.3496 4.1758v10.252l8.3496-4.1758zm-8.3496 4.1758v-10.254l-16.699 8.3516v10.254l8.3496-4.1758zm-16.699-1.9023v-10.252l-8.3496 4.1758v10.252zm-8.3496 4.1758-8.3516 4.1758v10.254l8.3516-4.1758z" fill="#593d29" stroke-width="0"/>
<rect transform="matrix(.89439 .44729 0 1 0 0)" x="17.822" y="59.594" width="149.89" height="164.12" rx=".4735" ry=".53571" opacity=".182" style="paint-order:fill markers stroke"/>
<rect transform="matrix(-.89439 .44729 0 1 0 0)" x="-317.73" y="209.65" width="149.89" height="164.12" rx=".4735" ry=".53571" opacity=".392" style="paint-order:fill markers stroke"/>
</svg>

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

1
public/nav/portfolio.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M20.005 2C21.107 2 22 2.898 22 3.99v16.02c0 1.099-.893 1.99-1.995 1.99H4v-4H2v-2h2v-3H2v-2h2V8H2V6h2V2h16.005zM8 4H6v16h2V4zm12 0H10v16h10V4z"/></svg>

After

Width:  |  Height:  |  Size: 279 B

View File

@ -14,10 +14,8 @@ function toggleDarkMode() {
} }
} }
const darkToggle = document.getElementById("dark-toggle"); const darkToggle = document.getElementById("dark-toggle");
if (darkToggle) { darkToggle.checked = html.className === "dark";
darkToggle.checked = html.className === "dark"; darkToggle.onclick = toggleDarkMode;
darkToggle.onclick = toggleDarkMode;
}
// github commit fetcher // github commit fetcher
// pulled from CommitStatBox.vue // pulled from CommitStatBox.vue
const FEED_URL = "https://api.github.com/users/potatoeggy/events"; const FEED_URL = "https://api.github.com/users/potatoeggy/events";
@ -26,10 +24,6 @@ const latestEvent = results.find((e) => e.type === "PushEvent");
const latestCommit = latestEvent.payload.commits[0]; const latestCommit = latestEvent.payload.commits[0];
const commitImg = document.getElementById("github-commit-img"); const commitImg = document.getElementById("github-commit-img");
const commitAnchor = document.getElementById("github-commit-a"); const commitAnchor = document.getElementById("github-commit-a");
if (commitImg) { commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`; commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
}
if (commitAnchor) {
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
}
export {}; export {};

View File

@ -20,14 +20,9 @@ function toggleDarkMode() {
} }
} }
const darkToggle = document.getElementById( const darkToggle = document.getElementById("dark-toggle") as HTMLInputElement;
"dark-toggle" darkToggle.checked = html.className === "dark";
) as HTMLInputElement | null; darkToggle.onclick = toggleDarkMode;
if (darkToggle) {
darkToggle.checked = html.className === "dark";
darkToggle.onclick = toggleDarkMode;
}
// github commit fetcher // github commit fetcher
// pulled from CommitStatBox.vue // pulled from CommitStatBox.vue
@ -40,18 +35,13 @@ const latestCommit = latestEvent.payload.commits[0];
const commitImg = document.getElementById( const commitImg = document.getElementById(
"github-commit-img" "github-commit-img"
) as HTMLImageElement | null; ) as HTMLImageElement;
const commitAnchor = document.getElementById( const commitAnchor = document.getElementById(
"github-commit-a" "github-commit-a"
) as HTMLAnchorElement; ) as HTMLAnchorElement;
if (commitImg) { commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`; commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
}
if (commitAnchor) {
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
}
// to make this an esm module for top-level await // to make this an esm module for top-level await
export {}; export {};

View File

@ -0,0 +1,13 @@
import { serverQueryContent } from "#content/server";
import { SitemapStream, streamToPromise } from "sitemap";
export default defineEventHandler(async (event) => {
// Fetch all documents
const docs = await serverQueryContent(event).find();
const sitemap = new SitemapStream({ hostname: "https://eggworld.me" });
for (const doc of docs) {
sitemap.write({ url: doc._path, changefreq: "monthly" });
}
sitemap.end();
return streamToPromise(sitemap);
});

View File

@ -1,4 +1,4 @@
import type { AnyParsedContent } from "./types"; import type { BlogParsedContent, StoryParsedContent } from "./types";
import readingTime from "reading-time"; import readingTime from "reading-time";
import dayjs from "dayjs"; import dayjs from "dayjs";
import utc from "dayjs/plugin/utc.js"; import utc from "dayjs/plugin/utc.js";
@ -28,17 +28,17 @@ function search(obj: Record<string, any>, results: string[] = []) {
return results; return results;
} }
export function calcReadingTime(doc: AnyParsedContent) { export function calcReadingTime(doc: BlogParsedContent | StoryParsedContent) {
let body: string[] = search(doc.body); let body: string[] = search(doc.body);
return readingTime(body.join(" ")); return readingTime(body.join(" "));
} }
export function getPrettyDate(doc: AnyParsedContent) { export function getPrettyDate(doc: BlogParsedContent | StoryParsedContent) {
const date = dayjs(doc.date).utc(); const date = dayjs(doc.date).utc();
return date.format("DD MMM YYYY"); return date.format("DD MMM YYYY");
} }
export function getUtcDate(doc: AnyParsedContent) { export function getUtcDate(doc: BlogParsedContent | StoryParsedContent) {
const date = dayjs(doc.date).utc(); const date = dayjs(doc.date).utc();
return date.format("YYYY-MM-DD"); return date.format("YYYY-MM-DD");
} }

Some files were not shown because too many files have changed in this diff Show More