Repository: sveltejs/kit
Pull request #6891 (2022-09-19 15:50:42)

Decode HTML entities in `href` attributes when crawling
This is an alternative to #6871. `entities` is quite a large dependency and has a lot of functionality we don't need, so I figured we could probably just do it ourselves. 

### Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
- [x] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it solves.
- [x] Ideally, include a test that fails without this PR but passes with it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running `pnpm changeset` and following the prompts. All changesets should be `patch` until SvelteKit 1.0


changeset-bot[bot]: ###  🦋  Changeset detected

Latest commit: 7f88fc8b0280b1fc6af53c5994791c4e64c7e695

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 1 package</summary>

  | Name          | Type  |
| ------------- | ----- |
| @sveltejs/kit | Patch |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/master/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/sveltejs/kit/new/gh-6870?filename=.changeset/tender-bulldogs-sing.md&value=---%0A%22%40sveltejs%2Fkit%22%3A%20patch%0A---%0A%0ADecode%20HTML%20entities%20in%20%60href%60%20attributes%20when%20crawling%0A)



Patch:
diff --git a/.changeset/healthy-rivers-share.md b/.changeset/healthy-rivers-share.md
new file mode 100644
index 000000000..8aac9d659
--- /dev/null
+++ b/.changeset/healthy-rivers-share.md
@@ -0,0 +1,5 @@
+---
+"@sveltejs/adapter-cloudflare": patch
+---
+
+[fix] return 404 instead of 200 for missing assets
diff --git a/.changeset/lazy-mice-remain.md b/.changeset/lazy-mice-remain.md
new file mode 100644
index 000000000..519d0d7fd
--- /dev/null
+++ b/.changeset/lazy-mice-remain.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+[feat] allow +server.js files next to +page files
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 1dfbec7e7..51192c0df 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -210,6 +210,7 @@
     "cyan-knives-mix",
     "cyan-numbers-change",
     "cyan-parents-enjoy",
+    "cyan-pianos-bake",
     "cyan-radios-attend",
     "cyan-roses-act",
     "cyan-schools-kiss",
@@ -271,6 +272,7 @@
     "empty-worms-appear",
     "fair-pets-bake",
     "fair-rivers-repair",
+    "fair-tables-peel",
     "famous-birds-boil",
     "famous-birds-cheer",
     "famous-boxes-tap",
@@ -443,6 +445,7 @@
     "healthy-penguins-fail",
     "healthy-pigs-fly",
     "healthy-pumpkins-bathe",
+    "healthy-rivers-share",
     "healthy-vans-build",
     "healthy-wasps-poke",
     "heavy-donuts-grab",
@@ -536,6 +539,7 @@
     "lazy-ants-watch",
     "lazy-berries-decide",
     "lazy-carpets-join",
+    "lazy-mice-remain",
     "lazy-mice-smile",
     "lazy-owls-run",
     "lazy-spies-wash",
diff --git a/.changeset/spotty-trainers-switch.md b/.changeset/spotty-trainers-switch.md
new file mode 100644
index 000000000..2cd773e1d
--- /dev/null
+++ b/.changeset/spotty-trainers-switch.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+Decode HTML entities in `href` attributes when crawling
diff --git a/documentation/docs/03-routing.md b/documentation/docs/03-routing.md
index ac5598dd7..3ca29c382 100644
--- a/documentation/docs/03-routing.md
+++ b/documentation/docs/03-routing.md
@@ -267,6 +267,57 @@ The first argument to `Response` can be a [`ReadableStream`](https://developer.m
 
 You can use the `error`, `redirect` and `json` methods from `@sveltejs/kit` for convenience (but you don't have to). Note that `throw error(..)` only returns a plain text error response.
 
+#### Receiving data
+
+By exporting `POST`/`PUT`/`PATCH`/`DELETE` handlers, `+server.js` files can be used to create a complete API:
+
+```svelte
+/// file: src/routes/add/+page.svelte
+<script>
+	let a = 0;
+	let b = 0;
+	let total = 0;
+
+	async function add() {
+		const response = await fetch('/api/add', {
+			method: 'POST',
+			body: JSON.stringify({ a, b }),
+			headers: {
+				'content-type': 'application/json'
+			}
+		});
+
+		total = await response.json();
+	}
+</script>
+
+<input type="number" bind:value={a}> +
+<input type="number" bind:value={b}> =
+{total}
+
+<button on:click={add}>Calculate</button>
+```
+
+```js
+/// file: src/routes/api/add/+server.js
+import { json } from '@sveltejs/kit';
+
+/** @type {import('./$types').RequestHandler} */
+export async function POST({ request }) {
+	const { a, b } = await request.json();
+	return json(a + b);
+}
+```
+
+> In general, [form actions](/docs/form-actions) are a better way to submit data from the browser to the server.
+
+#### Content negotiation
+
+`+server.js` files can be placed in the same directory as `+page` files, allowing the same route to be either a page or an API endpoint. To determine which, SvelteKit applies the following rules:
+
+- `PUT`/`PATCH`/`DELETE` requests are always handled by `+server.js` since they do not apply to pages
+- `GET`/`POST` requests are treated as page requests if the `accept` header prioritises `text/html` (in other words, it's a browser page request), else they are handled by `+server.js`
+
 ### $types
 
 Throughout the examples above, we've been importing types from a `$types.d.ts` file. This is a file SvelteKit creates for you in a hidden directory if you're using TypeScript (or JavaScript with JSDoc type annotations) to give you type safety when working with your root files.
diff --git a/documentation/docs/06-form-actions.md b/documentation/docs/06-form-actions.md
index fcf1300a8..d5fe40ad9 100644
--- a/documentation/docs/06-form-actions.md
+++ b/documentation/docs/06-form-actions.md
@@ -351,3 +351,7 @@ We can also implement progressive enhancement ourselves, without `use:enhance`,
 	<!-- content -->
 </form>
 ```
+
+### Alternatives
+
+Form actions are the preferred way to send data to the server, since they can be progressively enhanced, but you can also use [`+server.js`](/docs/routing#server) files to expose (for example) a JSON API.
\ No newline at end of file
diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md
index 1ab5cf148..8343aa61a 100644
--- a/packages/adapter-auto/CHANGELOG.md
+++ b/packages/adapter-auto/CHANGELOG.md
@@ -1,5 +1,12 @@
 # @sveltejs/adapter-auto
 
+## 1.0.0-next.76
+
+### Patch Changes
+
+- Updated dependencies [[`ae2e4bf2`](https://github.com/sveltejs/kit/commit/ae2e4bf2c5fe0aeba4cba21d51362837f66d1949)]:
+  - @sveltejs/adapter-cloudflare@1.0.0-next.35
+
 ## 1.0.0-next.75
 
 ### Patch Changes
diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json
index 2df4e1dcd..10e404e4a 100644
--- a/packages/adapter-auto/package.json
+++ b/packages/adapter-auto/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@sveltejs/adapter-auto",
-	"version": "1.0.0-next.75",
+	"version": "1.0.0-next.76",
 	"repository": {
 		"type": "git",
 		"url": "https://github.com/sveltejs/kit",
diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md
index d7b602f66..456216ec9 100644
--- a/packages/adapter-cloudflare/CHANGELOG.md
+++ b/packages/adapter-cloudflare/CHANGELOG.md
@@ -1,5 +1,11 @@
 # @sveltejs/adapter-cloudflare
 
+## 1.0.0-next.35
+
+### Patch Changes
+
+- [fix] return 404 instead of 200 for missing assets ([#6879](https://github.com/sveltejs/kit/pull/6879))
+
 ## 1.0.0-next.34
 
 ### Patch Changes
diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json
index ef57ca5c6..a27f5eaac 100644
--- a/packages/adapter-cloudflare/package.json
+++ b/packages/adapter-cloudflare/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@sveltejs/adapter-cloudflare",
-	"version": "1.0.0-next.34",
+	"version": "1.0.0-next.35",
 	"repository": {
 		"type": "git",
 		"url": "https://github.com/sveltejs/kit",
diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js
index a31267aef..d3223615f 100644
--- a/packages/adapter-cloudflare/src/worker.js
+++ b/packages/adapter-cloudflare/src/worker.js
@@ -20,6 +20,7 @@ const worker = {
 		// static assets
 		if (pathname.startsWith(prefix)) {
 			res = await env.ASSETS.fetch(req);
+			if (!res.ok) return res;
 
 			const cache_control = pathname.startsWith(prefix + 'immutable/')
 				? 'public, immutable, max-age=31536000'
@@ -65,7 +66,7 @@ const worker = {
 
 		// Writes to Cache only if allowed & specified
 		pragma = res.headers.get('cache-control');
-		return pragma ? Cache.save(req, res, context) : res;
+		return pragma && res.ok ? Cache.save(req, res, context) : res;
 	}
 };
 
diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md
index 7b8e26355..7b467086e 100644
--- a/packages/kit/CHANGELOG.md
+++ b/packages/kit/CHANGELOG.md
@@ -1,5 +1,17 @@
 # @sveltejs/kit
 
+## 1.0.0-next.487
+
+### Patch Changes
+
+- [feat] allow +server.js files next to +page files ([#6773](https://github.com/sveltejs/kit/pull/6773))
+
+## 1.0.0-next.486
+
+### Patch Changes
+
+- [fix] handle jsdoc without tags while generating proxy types ([#6884](https://github.com/sveltejs/kit/pull/6884))
+
 ## 1.0.0-next.485
 
 ### Patch Changes
diff --git a/packages/kit/package.json b/packages/kit/package.json
index 8fdaa7aa4..b25610318 100644
--- a/packages/kit/package.json
+++ b/packages/kit/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@sveltejs/kit",
-	"version": "1.0.0-next.485",
+	"version": "1.0.0-next.487",
 	"repository": {
 		"type": "git",
 		"url": "https://github.com/sveltejs/kit",
diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js
index b79fb68d7..f8dcc36d1 100644
--- a/packages/kit/src/core/adapt/builder.js
+++ b/packages/kit/src/core/adapt/builder.js
@@ -46,7 +46,6 @@ export function create_builder({ config, build_data, routes, prerendered, log })
 
 				return {
 					id: route.id,
-					type: route.page ? 'page' : 'endpoint', // TODO change this if support pages+endpoints
 					segments: route.id.split('/').map((segment) => ({
 						dynamic: segment.includes('['),
 						rest: segment.includes('[...'),
diff --git a/packages/kit/src/core/prerender/crawl.js b/packages/kit/src/core/prerender/crawl.js
index b74e558d6..70c264658 100644
--- a/packages/kit/src/core/prerender/crawl.js
+++ b/packages/kit/src/core/prerender/crawl.js
@@ -1,3 +1,5 @@
+import { decode } from './entities.js';
+
 const DOCTYPE = 'DOCTYPE';
 const CDATA_OPEN = '[CDATA[';
 const CDATA_CLOSE = ']]>';
@@ -147,6 +149,8 @@ export function crawl(html) {
 								i -= 1;
 							}
 
+							value = decode(value);
+
 							if (name === 'href') {
 								href = value;
 							} else if (name === 'rel') {
diff --git a/packages/kit/src/core/prerender/entities.js b/packages/kit/src/core/prerender/entities.js
new file mode 100644
index 000000000..91888a95b
--- /dev/null
+++ b/packages/kit/src/core/prerender/entities.js
@@ -0,0 +1,2252 @@
+/**
+ * A list of all named HTML entities, from https://html.spec.whatwg.org/multipage/named-characters.html
+ * @type {Record<string, string>}
+ */
+const entities = {
+	AElig: 'Æ',
+	'AElig;': 'Æ',
+	AMP: '&',
+	'AMP;': '&',
+	Aacute: 'Á',
+	'Aacute;': 'Á',
+	'Abreve;': 'Ă',
+	Acirc: 'Â',
+	'Acirc;': 'Â',
+	'Acy;': 'А',
+	'Afr;': '𝔄',
+	Agrave: 'À',
+	'Agrave;': 'À',
+	'Alpha;': 'Α',
+	'Amacr;': 'Ā',
+	'And;': '⩓',
+	'Aogon;': 'Ą',
+	'Aopf;': '𝔸',
+	'ApplyFunction;': '⁡',
+	Aring: 'Å',
+	'Aring;': 'Å',
+	'Ascr;': '𝒜',
+	'Assign;': '≔',
+	Atilde: 'Ã',
+	'Atilde;': 'Ã',
+	Auml: 'Ä',
+	'Auml;': 'Ä',
+	'Backslash;': '∖',
+	'Barv;': '⫧',
+	'Barwed;': '⌆',
+	'Bcy;': 'Б',
+	'Because;': '∵',
+	'Bernoullis;': 'ℬ',
+	'Beta;': 'Β',
+	'Bfr;': '𝔅',
+	'Bopf;': '𝔹',
+	'Breve;': '˘',
+	'Bscr;': 'ℬ',
+	'Bumpeq;': '≎',
+	'CHcy;': 'Ч',
+	COPY: '©',
+	'COPY;': '©',
+	'Cacute;': 'Ć',
+	'Cap;': '⋒',
+	'CapitalDifferentialD;': 'ⅅ',
+	'Cayleys;': 'ℭ',
+	'Ccaron;': 'Č',
+	Ccedil: 'Ç',
+	'Ccedil;': 'Ç',
+	'Ccirc;': 'Ĉ',
+	'Cconint;': '∰',
+	'Cdot;': 'Ċ',
+	'Cedilla;': '¸',
+	'CenterDot;': '·',
+	'Cfr;': 'ℭ',
+	'Chi;': 'Χ',
+	'CircleDot;': '⊙',
+	'CircleMinus;': '⊖',
+	'CirclePlus;': '⊕',
+	'CircleTimes;': '⊗',
+	'ClockwiseContourIntegral;': '∲',
+	'CloseCurlyDoubleQuote;': '”',
+	'CloseCurlyQuote;': '’',
+	'Colon;': '∷',
+	'Colone;': '⩴',
+	'Congruent;': '≡',
+	'Conint;': '∯',
+	'ContourIntegral;': '∮',
+	'Copf;': 'ℂ',
+	'Coproduct;': '∐',
+	'CounterClockwiseContourIntegral;': '∳',
+	'Cross;': '⨯',
+	'Cscr;': '𝒞',
+	'Cup;': '⋓',
+	'CupCap;': '≍',
+	'DD;': 'ⅅ',
+	'DDotrahd;': '⤑',
+	'DJcy;': 'Ђ',
+	'DScy;': 'Ѕ',
+	'DZcy;': 'Џ',
+	'Dagger;': '‡',
+	'Darr;': '↡',
+	'Dashv;': '⫤',
+	'Dcaron;': 'Ď',
+	'Dcy;': 'Д',
+	'Del;': '∇',
+	'Delta;': 'Δ',
+	'Dfr;': '𝔇',
+	'DiacriticalAcute;': '´',
+	'DiacriticalDot;': '˙',
+	'DiacriticalDoubleAcute;': '˝',
+	'DiacriticalGrave;': '`',
+	'DiacriticalTilde;': '˜',
+	'Diamond;': '⋄',
+	'DifferentialD;': 'ⅆ',
+	'Dopf;': '𝔻',
+	'Dot;': '¨',
+	'DotDot;': '⃜',
+	'DotEqual;': '≐',
+	'DoubleContourIntegral;': '∯',
+	'DoubleDot;': '¨',
+	'DoubleDownArrow;': '⇓',
+	'DoubleLeftArrow;': '⇐',
+	'DoubleLeftRightArrow;': '⇔',
+	'DoubleLeftTee;': '⫤',
+	'DoubleLongLeftArrow;': '⟸',
+	'DoubleLongLeftRightArrow;': '⟺',
+	'DoubleLongRightArrow;': '⟹',
+	'DoubleRightArrow;': '⇒',
+	'DoubleRightTee;': '⊨',
+	'DoubleUpArrow;': '⇑',
+	'DoubleUpDownArrow;': '⇕',
+	'DoubleVerticalBar;': '∥',
+	'DownArrow;': '↓',
+	'DownArrowBar;': '⤓',
+	'DownArrowUpArrow;': '⇵',
+	'DownBreve;': '̑',
+	'DownLeftRightVector;': '⥐',
+	'DownLeftTeeVector;': '⥞',
+	'DownLeftVector;': '↽',
+	'DownLeftVectorBar;': '⥖',
+	'DownRightTeeVector;': '⥟',
+	'DownRightVector;': '⇁',
+	'DownRightVectorBar;': '⥗',
+	'DownTee;': '⊤',
+	'DownTeeArrow;': '↧',
+	'Downarrow;': '⇓',
+	'Dscr;': '𝒟',
+	'Dstrok;': 'Đ',
+	'ENG;': 'Ŋ',
+	ETH: 'Ð',
+	'ETH;': 'Ð',
+	Eacute: 'É',
+	'Eacute;': 'É',
+	'Ecaron;': 'Ě',
+	Ecirc: 'Ê',
+	'Ecirc;': 'Ê',
+	'Ecy;': 'Э',
+	'Edot;': 'Ė',
+	'Efr;': '𝔈',
+	Egrave: 'È',
+	'Egrave;': 'È',
+	'Element;': '∈',
+	'Emacr;': 'Ē',
+	'EmptySmallSquare;': '◻',
+	'EmptyVerySmallSquare;': '▫',
+	'Eogon;': 'Ę',
+	'Eopf;': '𝔼',
+	'Epsilon;': 'Ε',
+	'Equal;': '⩵',
+	'EqualTilde;': '≂',
+	'Equilibrium;': '⇌',
+	'Escr;': 'ℰ',
+	'Esim;': '⩳',
+	'Eta;': 'Η',
+	Euml: 'Ë',
+	'Euml;': 'Ë',
+	'Exists;': '∃',
+	'ExponentialE;': 'ⅇ',
+	'Fcy;': 'Ф',
+	'Ffr;': '𝔉',
+	'FilledSmallSquare;': '◼',
+	'FilledVerySmallSquare;': '▪',
+	'Fopf;': '𝔽',
+	'ForAll;': '∀',
+	'Fouriertrf;': 'ℱ',
+	'Fscr;': 'ℱ',
+	'GJcy;': 'Ѓ',
+	GT: '>',
+	'GT;': '>',
+	'Gamma;': 'Γ',
+	'Gammad;': 'Ϝ',
+	'Gbreve;': 'Ğ',
+	'Gcedil;': 'Ģ',
+	'Gcirc;': 'Ĝ',
+	'Gcy;': 'Г',
+	'Gdot;': 'Ġ',
+	'Gfr;': '𝔊',
+	'Gg;': '⋙',
+	'Gopf;': '𝔾',
+	'GreaterEqual;': '≥',
+	'GreaterEqualLess;': '⋛',
+	'GreaterFullEqual;': '≧',
+	'GreaterGreater;': '⪢',
+	'GreaterLess;': '≷',
+	'GreaterSlantEqual;': '⩾',
+	'GreaterTilde;': '≳',
+	'Gscr;': '𝒢',
+	'Gt;': '≫',
+	'HARDcy;': 'Ъ',
+	'Hacek;': 'ˇ',
+	'Hat;': '^',
+	'Hcirc;': 'Ĥ',
+	'Hfr;': 'ℌ',
+	'HilbertSpace;': 'ℋ',
+	'Hopf;': 'ℍ',
+	'HorizontalLine;': '─',
+	'Hscr;': 'ℋ',
+	'Hstrok;': 'Ħ',
+	'HumpDownHump;': '≎',
+	'HumpEqual;': '≏',
+	'IEcy;': 'Е',
+	'IJlig;': 'Ĳ',
+	'IOcy;': 'Ё',
+	Iacute: 'Í',
+	'Iacute;': 'Í',
+	Icirc: 'Î',
+	'Icirc;': 'Î',
+	'Icy;': 'И',
+	'Idot;': 'İ',
+	'Ifr;': 'ℑ',
+	Igrave: 'Ì',
+	'Igrave;': 'Ì',
+	'Im;': 'ℑ',
+	'Imacr;': 'Ī',
+	'ImaginaryI;': 'ⅈ',
+	'Implies;': '⇒',
+	'Int;': '∬',
+	'Integral;': '∫',
+	'Intersection;': '⋂',
+	'InvisibleComma;': '⁣',
+	'InvisibleTimes;': '⁢',
+	'Iogon;': 'Į',
+	'Iopf;': '𝕀',
+	'Iota;': 'Ι',
+	'Iscr;': 'ℐ',
+	'Itilde;': 'Ĩ',
+	'Iukcy;': 'І',
+	Iuml: 'Ï',
+	'Iuml;': 'Ï',
+	'Jcirc;': 'Ĵ',
+	'Jcy;': 'Й',
+	'Jfr;': '𝔍',
+	'Jopf;': '𝕁',
+	'Jscr;': '𝒥',
+	'Jsercy;': 'Ј',
+	'Jukcy;': 'Є',
+	'KHcy;': 'Х',
+	'KJcy;': 'Ќ',
+	'Kappa;': 'Κ',
+	'Kcedil;': 'Ķ',
+	'Kcy;': 'К',
+	'Kfr;': '𝔎',
+	'Kopf;': '𝕂',
+	'Kscr;': '𝒦',
+	'LJcy;': 'Љ',
+	LT: '<',
+	'LT;': '<',
+	'Lacute;': 'Ĺ',
+	'Lambda;': 'Λ',
+	'Lang;': '⟪',
+	'Laplacetrf;': 'ℒ',
+	'Larr;': '↞',
+	'Lcaron;': 'Ľ',
+	'Lcedil;': 'Ļ',
+	'Lcy;': 'Л',
+	'LeftAngleBracket;': '⟨',
+	'LeftArrow;': '←',
+	'LeftArrowBar;': '⇤',
+	'LeftArrowRightArrow;': '⇆',
+	'LeftCeiling;': '⌈',
+	'LeftDoubleBracket;': '⟦',
+	'LeftDownTeeVector;': '⥡',
+	'LeftDownVector;': '⇃',
+	'LeftDownVectorBar;': '⥙',
+	'LeftFloor;': '⌊',
+	'LeftRightArrow;': '↔',
+	'LeftRightVector;': '⥎',
+	'LeftTee;': '⊣',
+	'LeftTeeArrow;': '↤',
+	'LeftTeeVector;': '⥚',
+	'LeftTriangle;': '⊲',
+	'LeftTriangleBar;': '⧏',
+	'LeftTriangleEqual;': '⊴',
+	'LeftUpDownVector;': '⥑',
+	'LeftUpTeeVector;': '⥠',
+	'LeftUpVector;': '↿',
+	'LeftUpVectorBar;': '⥘',
+	'LeftVector;': '↼',
+	'LeftVectorBar;': '⥒',
+	'Leftarrow;': '⇐',
+	'Leftrightarrow;': '⇔',
+	'LessEqualGreater;': '⋚',
+	'LessFullEqual;': '≦',
+	'LessGreater;': '≶',
+	'LessLess;': '⪡',
+	'LessSlantEqual;': '⩽',
+	'LessTilde;': '≲',
+	'Lfr;': '𝔏',
+	'Ll;': '⋘',
+	'Lleftarrow;': '⇚',
+	'Lmidot;': 'Ŀ',
+	'LongLeftArrow;': '⟵',
+	'LongLeftRightArrow;': '⟷',
+	'LongRightArrow;': '⟶',
+	'Longleftarrow;': '⟸',
+	'Longleftrightarrow;': '⟺',
+	'Longrightarrow;': '⟹',
+	'Lopf;': '𝕃',
+	'LowerLeftArrow;': '↙',
+	'LowerRightArrow;': '↘',
+	'Lscr;': 'ℒ',
+	'Lsh;': '↰',
+	'Lstrok;': 'Ł',
+	'Lt;': '≪',
+	'Map;': '⤅',
+	'Mcy;': 'М',
+	'MediumSpace;': ' ',
+	'Mellintrf;': 'ℳ',
+	'Mfr;': '𝔐',
+	'MinusPlus;': '∓',
+	'Mopf;': '𝕄',
+	'Mscr;': 'ℳ',
+	'Mu;': 'Μ',
+	'NJcy;': 'Њ',
+	'Nacute;': 'Ń',
+	'Ncaron;': 'Ň',
+	'Ncedil;': 'Ņ',
+	'Ncy;': 'Н',
+	'NegativeMediumSpace;': '​',
+	'NegativeThickSpace;': '​',
+	'NegativeThinSpace;': '​',
+	'NegativeVeryThinSpace;': '​',
+	'NestedGreaterGreater;': '≫',
+	'NestedLessLess;': '≪',
+	'NewLine;': '\n',
+	'Nfr;': '𝔑',
+	'NoBreak;': '⁠',
+	'NonBreakingSpace;': ' ',
+	'Nopf;': 'ℕ',
+	'Not;': '⫬',
+	'NotCongruent;': '≢',
+	'NotCupCap;': '≭',
+	'NotDoubleVerticalBar;': '∦',
+	'NotElement;': '∉',
+	'NotEqual;': '≠',
+	'NotEqualTilde;': '≂̸',
+	'NotExists;': '∄',
+	'NotGreater;': '≯',
+	'NotGreaterEqual;': '≱',
+	'NotGreaterFullEqual;': '≧̸',
+	'NotGreaterGreater;': '≫̸',
+	'NotGreaterLess;': '≹',
+	'NotGreaterSlantEqual;': '⩾̸',
+	'NotGreaterTilde;': '≵',
+	'NotHumpDownHump;': '≎̸',
+	'NotHumpEqual;': '≏̸',
+	'NotLeftTriangle;': '⋪',
+	'NotLeftTriangleBar;': '⧏̸',
+	'NotLeftTriangleEqual;': '⋬',
+	'NotLess;': '≮',
+	'NotLessEqual;': '≰',
+	'NotLessGreater;': '≸',
+	'NotLessLess;': '≪̸',
+	'NotLessSlantEqual;': '⩽̸',
+	'NotLessTilde;': '≴',
+	'NotNestedGreaterGreater;': '⪢̸',
+	'NotNestedLessLess;': '⪡̸',
+	'NotPrecedes;': '⊀',
+	'NotPrecedesEqual;': '⪯̸',
+	'NotPrecedesSlantEqual;': '⋠',
+	'NotReverseElement;': '∌',
+	'NotRightTriangle;': '⋫',
+	'NotRightTriangleBar;': '⧐̸',
+	'NotRightTriangleEqual;': '⋭',
+	'NotSquareSubset;': '⊏̸',
+	'NotSquareSubsetEqual;': '⋢',
+	'NotSquareSuperset;': '⊐̸',
+	'NotSquareSupersetEqual;': '⋣',
+	'NotSubset;': '⊂⃒',
+	'NotSubsetEqual;': '⊈',
+	'NotSucceeds;': '⊁',
+	'NotSucceedsEqual;': '⪰̸',
+	'NotSucceedsSlantEqual;': '⋡',
+	'NotSucceedsTilde;': '≿̸',
+	'NotSuperset;': '⊃⃒',
+	'NotSupersetEqual;': '⊉',
+	'NotTilde;': '≁',
+	'NotTildeEqual;': '≄',
+	'NotTildeFullEqual;': '≇',
+	'NotTildeTilde;': '≉',
+	'NotVerticalBar;': '∤',
+	'Nscr;': '𝒩',
+	Ntilde: 'Ñ',
+	'Ntilde;': 'Ñ',
+	'Nu;': 'Ν',
+	'OElig;': 'Œ',
+	Oacute: 'Ó',
+	'Oacute;': 'Ó',
+	Ocirc: 'Ô',
+	'Ocirc;': 'Ô',
+	'Ocy;': 'О',
+	'Odblac;': 'Ő',
+	'Ofr;': '𝔒',
+	Ograve: 'Ò',
+	'Ograve;': 'Ò',
+	'Omacr;': 'Ō',
+	'Omega;': 'Ω',
+	'Omicron;': 'Ο',
+	'Oopf;': '𝕆',
+	'OpenCurlyDoubleQuote;': '“',
+	'OpenCurlyQuote;': '‘',
+	'Or;': '⩔',
+	'Oscr;': '𝒪',
+	Oslash: 'Ø',
+	'Oslash;': 'Ø',
+	Otilde: 'Õ',
+	'Otilde;': 'Õ',
+	'Otimes;': '⨷',
+	Ouml: 'Ö',
+	'Ouml;': 'Ö',
+	'OverBar;': '‾',
+	'OverBrace;': '⏞',
+	'OverBracket;': '⎴',
+	'OverParenthesis;': '⏜',
+	'PartialD;': '∂',
+	'Pcy;': 'П',
+	'Pfr;': '𝔓',
+	'Phi;': 'Φ',
+	'Pi;': 'Π',
+	'PlusMinus;': '±',
+	'Poincareplane;': 'ℌ',
+	'Popf;': 'ℙ',
+	'Pr;': '⪻',
+	'Precedes;': '≺',
+	'PrecedesEqual;': '⪯',
+	'PrecedesSlantEqual;': '≼',
+	'PrecedesTilde;': '≾',
+	'Prime;': '″',
+	'Product;': '∏',
+	'Proportion;': '∷',
+	'Proportional;': '∝',
+	'Pscr;': '𝒫',
+	'Psi;': 'Ψ',
+	QUOT: '"',
+	'QUOT;': '"',
+	'Qfr;': '𝔔',
+	'Qopf;': 'ℚ',
+	'Qscr;': '𝒬',
+	'RBarr;': '⤐',
+	REG: '®',
+	'REG;': '®',
+	'Racute;': 'Ŕ',
+	'Rang;': '⟫',
+	'Rarr;': '↠',
+	'Rarrtl;': '⤖',
+	'Rcaron;': 'Ř',
+	'Rcedil;': 'Ŗ',
+	'Rcy;': 'Р',
+	'Re;': 'ℜ',
+	'ReverseElement;': '∋',
+	'ReverseEquilibrium;': '⇋',
+	'ReverseUpEquilibrium;': '⥯',
+	'Rfr;': 'ℜ',
+	'Rho;': 'Ρ',
+	'RightAngleBracket;': '⟩',
+	'RightArrow;': '→',
+	'RightArrowBar;': '⇥',
+	'RightArrowLeftArrow;': '⇄',
+	'RightCeiling;': '⌉',
+	'RightDoubleBracket;': '⟧',
+	'RightDownTeeVector;': '⥝',
+	'RightDownVector;': '⇂',
+	'RightDownVectorBar;': '⥕',
+	'RightFloor;': '⌋',
+	'RightTee;': '⊢',
+	'RightTeeArrow;': '↦',
+	'RightTeeVector;': '⥛',
+	'RightTriangle;': '⊳',
+	'RightTriangleBar;': '⧐',
+	'RightTriangleEqual;': '⊵',
+	'RightUpDownVector;': '⥏',
+	'RightUpTeeVector;': '⥜',
+	'RightUpVector;': '↾',
+	'RightUpVectorBar;': '⥔',
+	'RightVector;': '⇀',
+	'RightVectorBar;': '⥓',
+	'Rightarrow;': '⇒',
+	'Ropf;': 'ℝ',
+	'RoundImplies;': '⥰',
+	'Rrightarrow;': '⇛',
+	'Rscr;': 'ℛ',
+	'Rsh;': '↱',
+	'RuleDelayed;': '⧴',
+	'SHCHcy;': 'Щ',
+	'SHcy;': 'Ш',
+	'SOFTcy;': 'Ь',
+	'Sacute;': 'Ś',
+	'Sc;': '⪼',
+	'Scaron;': 'Š',
+	'Scedil;': 'Ş',
+	'Scirc;': 'Ŝ',
+	'Scy;': 'С',
+	'Sfr;': '𝔖',
+	'ShortDownArrow;': '↓',
+	'ShortLeftArrow;': '←',
+	'ShortRightArrow;': '→',
+	'ShortUpArrow;': '↑',
+	'Sigma;': 'Σ',
+	'SmallCircle;': '∘',
+	'Sopf;': '𝕊',
+	'Sqrt;': '√',
+	'Square;': '□',
+	'SquareIntersection;': '⊓',
+	'SquareSubset;': '⊏',
+	'SquareSubsetEqual;': '⊑',
+	'SquareSuperset;': '⊐',
+	'SquareSupersetEqual;': '⊒',
+	'SquareUnion;': '⊔',
+	'Sscr;': '𝒮',
+	'Star;': '⋆',
+	'Sub;': '⋐',
+	'Subset;': '⋐',
+	'SubsetEqual;': '⊆',
+	'Succeeds;': '≻',
+	'SucceedsEqual;': '⪰',
+	'SucceedsSlantEqual;': '≽',
+	'SucceedsTilde;': '≿',
+	'SuchThat;': '∋',
+	'Sum;': '∑',
+	'Sup;': '⋑',
+	'Superset;': '⊃',
+	'SupersetEqual;': '⊇',
+	'Supset;': '⋑',
+	THORN: 'Þ',
+	'THORN;': 'Þ',
+	'TRADE;': '™',
+	'TSHcy;': 'Ћ',
+	'TScy;': 'Ц',
+	'Tab;': '\t',
+	'Tau;': 'Τ',
+	'Tcaron;': 'Ť',
+	'Tcedil;': 'Ţ',
+	'Tcy;': 'Т',
+	'Tfr;': '𝔗',
+	'Therefore;': '∴',
+	'Theta;': 'Θ',
+	'ThickSpace;': '  ',
+	'ThinSpace;': ' ',
+	'Tilde;': '∼',
+	'TildeEqual;': '≃',
+	'TildeFullEqual;': '≅',
+	'TildeTilde;': '≈',
+	'Topf;': '𝕋',
+	'TripleDot;': '⃛',
+	'Tscr;': '𝒯',
+	'Tstrok;': 'Ŧ',
+	Uacute: 'Ú',
+	'Uacute;': 'Ú',
+	'Uarr;': '↟',
+	'Uarrocir;': '⥉',
+	'Ubrcy;': 'Ў',
+	'Ubreve;': 'Ŭ',
+	Ucirc: 'Û',
+	'Ucirc;': 'Û',
+	'Ucy;': 'У',
+	'Udblac;': 'Ű',
+	'Ufr;': '𝔘',
+	Ugrave: 'Ù',
+	'Ugrave;': 'Ù',
+	'Umacr;': 'Ū',
+	'UnderBar;': '_',
+	'UnderBrace;': '⏟',
+	'UnderBracket;': '⎵',
+	'UnderParenthesis;': '⏝',
+	'Union;': '⋃',
+	'UnionPlus;': '⊎',
+	'Uogon;': 'Ų',
+	'Uopf;': '𝕌',
+	'UpArrow;': '↑',
+	'UpArrowBar;': '⤒',
+	'UpArrowDownArrow;': '⇅',
+	'UpDownArrow;': '↕',
+	'UpEquilibrium;': '⥮',
+	'UpTee;': '⊥',
+	'UpTeeArrow;': '↥',
+	'Uparrow;': '⇑',
+	'Updownarrow;': '⇕',
+	'UpperLeftArrow;': '↖',
+	'UpperRightArrow;': '↗',
+	'Upsi;': 'ϒ',
+	'Upsilon;': 'Υ',
+	'Uring;': 'Ů',
+	'Uscr;': '𝒰',
+	'Utilde;': 'Ũ',
+	Uuml: 'Ü',
+	'Uuml;': 'Ü',
+	'VDash;': '⊫',
+	'Vbar;': '⫫',
+	'Vcy;': 'В',
+	'Vdash;': '⊩',
+	'Vdashl;': '⫦',
+	'Vee;': '⋁',
+	'Verbar;': '‖',
+	'Vert;': '‖',
+	'VerticalBar;': '∣',
+	'VerticalLine;': '|',
+	'VerticalSeparator;': '❘',
+	'VerticalTilde;': '≀',
+	'VeryThinSpace;': ' ',
+	'Vfr;': '𝔙',
+	'Vopf;': '𝕍',
+	'Vscr;': '𝒱',
+	'Vvdash;': '⊪',
+	'Wcirc;': 'Ŵ',
+	'Wedge;': '⋀',
+	'Wfr;': '𝔚',
+	'Wopf;': '𝕎',
+	'Wscr;': '𝒲',
+	'Xfr;': '𝔛',
+	'Xi;': 'Ξ',
+	'Xopf;': '𝕏',
+	'Xscr;': '𝒳',
+	'YAcy;': 'Я',
+	'YIcy;': 'Ї',
+	'YUcy;': 'Ю',
+	Yacute: 'Ý',
+	'Yacute;': 'Ý',
+	'Ycirc;': 'Ŷ',
+	'Ycy;': 'Ы',
+	'Yfr;': '𝔜',
+	'Yopf;': '𝕐',
+	'Yscr;': '𝒴',
+	'Yuml;': 'Ÿ',
+	'ZHcy;': 'Ж',
+	'Zacute;': 'Ź',
+	'Zcaron;': 'Ž',
+	'Zcy;': 'З',
+	'Zdot;': 'Ż',
+	'ZeroWidthSpace;': '​',
+	'Zeta;': 'Ζ',
+	'Zfr;': 'ℨ',
+	'Zopf;': 'ℤ',
+	'Zscr;': '𝒵',
+	aacute: 'á',
+	'aacute;': 'á',
+	'abreve;': 'ă',
+	'ac;': '∾',
+	'acE;': '∾̳',
+	'acd;': '∿',
+	acirc: 'â',
+	'acirc;': 'â',
+	acute: '´',
+	'acute;': '´',
+	'acy;': 'а',
+	aelig: 'æ',
+	'aelig;': 'æ',
+	'af;': '⁡',
+	'afr;': '𝔞',
+	agrave: 'à',
+	'agrave;': 'à',
+	'alefsym;': 'ℵ',
+	'aleph;': 'ℵ',
+	'alpha;': 'α',
+	'amacr;': 'ā',
+	'amalg;': '⨿',
+	amp: '&',
+	'amp;': '&',
+	'and;': '∧',
+	'andand;': '⩕',
+	'andd;': '⩜',
+	'andslope;': '⩘',
+	'andv;': '⩚',
+	'ang;': '∠',
+	'ange;': '⦤',
+	'angle;': '∠',
+	'angmsd;': '∡',
+	'angmsdaa;': '⦨',
+	'angmsdab;': '⦩',
+	'angmsdac;': '⦪',
+	'angmsdad;': '⦫',
+	'angmsdae;': '⦬',
+	'angmsdaf;': '⦭',
+	'angmsdag;': '⦮',
+	'angmsdah;': '⦯',
+	'angrt;': '∟',
+	'angrtvb;': '⊾',
+	'angrtvbd;': '⦝',
+	'angsph;': '∢',
+	'angst;': 'Å',
+	'angzarr;': '⍼',
+	'aogon;': 'ą',
+	'aopf;': '𝕒',
+	'ap;': '≈',
+	'apE;': '⩰',
+	'apacir;': '⩯',
+	'ape;': '≊',
+	'apid;': '≋',
+	'apos;': "'",
+	'approx;': '≈',
+	'approxeq;': '≊',
+	aring: 'å',
+	'aring;': 'å',
+	'ascr;': '𝒶',
+	'ast;': '*',
+	'asymp;': '≈',
+	'asympeq;': '≍',
+	atilde: 'ã',
+	'atilde;': 'ã',
+	auml: 'ä',
+	'auml;': 'ä',
+	'awconint;': '∳',
+	'awint;': '⨑',
+	'bNot;': '⫭',
+	'backcong;': '≌',
+	'backepsilon;': '϶',
+	'backprime;': '‵',
+	'backsim;': '∽',
+	'backsimeq;': '⋍',
+	'barvee;': '⊽',
+	'barwed;': '⌅',
+	'barwedge;': '⌅',
+	'bbrk;': '⎵',
+	'bbrktbrk;': '⎶',
+	'bcong;': '≌',
+	'bcy;': 'б',
+	'bdquo;': '„',
+	'becaus;': '∵',
+	'because;': '∵',
+	'bemptyv;': '⦰',
+	'bepsi;': '϶',
+	'bernou;': 'ℬ',
+	'beta;': 'β',
+	'beth;': 'ℶ',
+	'between;': '≬',
+	'bfr;': '𝔟',
+	'bigcap;': '⋂',
+	'bigcirc;': '◯',
+	'bigcup;': '⋃',
+	'bigodot;': '⨀',
+	'bigoplus;': '⨁',
+	'bigotimes;': '⨂',
+	'bigsqcup;': '⨆',
+	'bigstar;': '★',
+	'bigtriangledown;': '▽',
+	'bigtriangleup;': '△',
+	'biguplus;': '⨄',
+	'bigvee;': '⋁',
+	'bigwedge;': '⋀',
+	'bkarow;': '⤍',
+	'blacklozenge;': '⧫',
+	'blacksquare;': '▪',
+	'blacktriangle;': '▴',
+	'blacktriangledown;': '▾',
+	'blacktriangleleft;': '◂',
+	'blacktriangleright;': '▸',
+	'blank;': '␣',
+	'blk12;': '▒',
+	'blk14;': '░',
+	'blk34;': '▓',
+	'block;': '█',
+	'bne;': '=⃥',
+	'bnequiv;': '≡⃥',
+	'bnot;': '⌐',
+	'bopf;': '𝕓',
+	'bot;': '⊥',
+	'bottom;': '⊥',
+	'bowtie;': '⋈',
+	'boxDL;': '╗',
+	'boxDR;': '╔',
+	'boxDl;': '╖',
+	'boxDr;': '╓',
+	'boxH;': '═',
+	'boxHD;': '╦',
+	'boxHU;': '╩',
+	'boxHd;': '╤',
+	'boxHu;': '╧',
+	'boxUL;': '╝',
+	'boxUR;': '╚',
+	'boxUl;': '╜',
+	'boxUr;': '╙',
+	'boxV;': '║',
+	'boxVH;': '╬',
+	'boxVL;': '╣',
+	'boxVR;': '╠',
+	'boxVh;': '╫',
+	'boxVl;': '╢',
+	'boxVr;': '╟',
+	'boxbox;': '⧉',
+	'boxdL;': '╕',
+	'boxdR;': '╒',
+	'boxdl;': '┐',
+	'boxdr;': '┌',
+	'boxh;': '─',
+	'boxhD;': '╥',
+	'boxhU;': '╨',
+	'boxhd;': '┬',
+	'boxhu;': '┴',
+	'boxminus;': '⊟',
+	'boxplus;': '⊞',
+	'boxtimes;': '⊠',
+	'boxuL;': '╛',
+	'boxuR;': '╘',
+	'boxul;': '┘',
+	'boxur;': '└',
+	'boxv;': '│',
+	'boxvH;': '╪',
+	'boxvL;': '╡',
+	'boxvR;': '╞',
+	'boxvh;': '┼',
+	'boxvl;': '┤',
+	'boxvr;': '├',
+	'bprime;': '‵',
+	'breve;': '˘',
+	brvbar: '¦',
+	'brvbar;': '¦',
+	'bscr;': '𝒷',
+	'bsemi;': '⁏',
+	'bsim;': '∽',
+	'bsime;': '⋍',
+	'bsol;': '\\',
+	'bsolb;': '⧅',
+	'bsolhsub;': '⟈',
+	'bull;': '•',
+	'bullet;': '•',
+	'bump;': '≎',
+	'bumpE;': '⪮',
+	'bumpe;': '≏',
+	'bumpeq;': '≏',
+	'cacute;': 'ć',
+	'cap;': '∩',
+	'capand;': '⩄',
+	'capbrcup;': '⩉',
+	'capcap;': '⩋',
+	'capcup;': '⩇',
+	'capdot;': '⩀',
+	'caps;': '∩︀',
+	'caret;': '⁁',
+	'caron;': 'ˇ',
+	'ccaps;': '⩍',
+	'ccaron;': 'č',
+	ccedil: 'ç',
+	'ccedil;': 'ç',
+	'ccirc;': 'ĉ',
+	'ccups;': '⩌',
+	'ccupssm;': '⩐',
+	'cdot;': 'ċ',
+	cedil: '¸',
+	'cedil;': '¸',
+	'cemptyv;': '⦲',
+	cent: '¢',
+	'cent;': '¢',
+	'centerdot;': '·',
+	'cfr;': '𝔠',
+	'chcy;': 'ч',
+	'check;': '✓',
+	'checkmark;': '✓',
+	'chi;': 'χ',
+	'cir;': '○',
+	'cirE;': '⧃',
+	'circ;': 'ˆ',
+	'circeq;': '≗',
+	'circlearrowleft;': '↺',
+	'circlearrowright;': '↻',
+	'circledR;': '®',
+	'circledS;': 'Ⓢ',
+	'circledast;': '⊛',
+	'circledcirc;': '⊚',
+	'circleddash;': '⊝',
+	'cire;': '≗',
+	'cirfnint;': '⨐',
+	'cirmid;': '⫯',
+	'cirscir;': '⧂',
+	'clubs;': '♣',
+	'clubsuit;': '♣',
+	'colon;': ':',
+	'colone;': '≔',
+	'coloneq;': '≔',
+	'comma;': ',',
+	'commat;': '@',
+	'comp;': '∁',
+	'compfn;': '∘',
+	'complement;': '∁',
+	'complexes;': 'ℂ',
+	'cong;': '≅',
+	'congdot;': '⩭',
+	'conint;': '∮',
+	'copf;': '𝕔',
+	'coprod;': '∐',
+	copy: '©',
+	'copy;': '©',
+	'copysr;': '℗',
+	'crarr;': '↵',
+	'cross;': '✗',
+	'cscr;': '𝒸',
+	'csub;': '⫏',
+	'csube;': '⫑',
+	'csup;': '⫐',
+	'csupe;': '⫒',
+	'ctdot;': '⋯',
+	'cudarrl;': '⤸',
+	'cudarrr;': '⤵',
+	'cuepr;': '⋞',
+	'cuesc;': '⋟',
+	'cularr;': '↶',
+	'cularrp;': '⤽',
+	'cup;': '∪',
+	'cupbrcap;': '⩈',
+	'cupcap;': '⩆',
+	'cupcup;': '⩊',
+	'cupdot;': '⊍',
+	'cupor;': '⩅',
+	'cups;': '∪︀',
+	'curarr;': '↷',
+	'curarrm;': '⤼',
+	'curlyeqprec;': '⋞',
+	'curlyeqsucc;': '⋟',
+	'curlyvee;': '⋎',
+	'curlywedge;': '⋏',
+	curren: '¤',
+	'curren;': '¤',
+	'curvearrowleft;': '↶',
+	'curvearrowright;': '↷',
+	'cuvee;': '⋎',
+	'cuwed;': '⋏',
+	'cwconint;': '∲',
+	'cwint;': '∱',
+	'cylcty;': '⌭',
+	'dArr;': '⇓',
+	'dHar;': '⥥',
+	'dagger;': '†',
+	'daleth;': 'ℸ',
+	'darr;': '↓',
+	'dash;': '‐',
+	'dashv;': '⊣',
+	'dbkarow;': '⤏',
+	'dblac;': '˝',
+	'dcaron;': 'ď',
+	'dcy;': 'д',
+	'dd;': 'ⅆ',
+	'ddagger;': '‡',
+	'ddarr;': '⇊',
+	'ddotseq;': '⩷',
+	deg: '°',
+	'deg;': '°',
+	'delta;': 'δ',
+	'demptyv;': '⦱',
+	'dfisht;': '⥿',
+	'dfr;': '𝔡',
+	'dharl;': '⇃',
+	'dharr;': '⇂',
+	'diam;': '⋄',
+	'diamond;': '⋄',
+	'diamondsuit;': '♦',
+	'diams;': '♦',
+	'die;': '¨',
+	'digamma;': 'ϝ',
+	'disin;': '⋲',
+	'div;': '÷',
+	divide: '÷',
+	'divide;': '÷',
+	'divideontimes;': '⋇',
+	'divonx;': '⋇',
+	'djcy;': 'ђ',
+	'dlcorn;': '⌞',
+	'dlcrop;': '⌍',
+	'dollar;': '$',
+	'dopf;': '𝕕',
+	'dot;': '˙',
+	'doteq;': '≐',
+	'doteqdot;': '≑',
+	'dotminus;': '∸',
+	'dotplus;': '∔',
+	'dotsquare;': '⊡',
+	'doublebarwedge;': '⌆',
+	'downarrow;': '↓',
+	'downdownarrows;': '⇊',
+	'downharpoonleft;': '⇃',
+	'downharpoonright;': '⇂',
+	'drbkarow;': '⤐',
+	'drcorn;': '⌟',
+	'drcrop;': '⌌',
+	'dscr;': '𝒹',
+	'dscy;': 'ѕ',
+	'dsol;': '⧶',
+	'dstrok;': 'đ',
+	'dtdot;': '⋱',
+	'dtri;': '▿',
+	'dtrif;': '▾',
+	'duarr;': '⇵',
+	'duhar;': '⥯',
+	'dwangle;': '⦦',
+	'dzcy;': 'џ',
+	'dzigrarr;': '⟿',
+	'eDDot;': '⩷',
+	'eDot;': '≑',
+	eacute: 'é',
+	'eacute;': 'é',
+	'easter;': '⩮',
+	'ecaron;': 'ě',
+	'ecir;': '≖',
+	ecirc: 'ê',
+	'ecirc;': 'ê',
+	'ecolon;': '≕',
+	'ecy;': 'э',
+	'edot;': 'ė',
+	'ee;': 'ⅇ',
+	'efDot;': '≒',
+	'efr;': '𝔢',
+	'eg;': '⪚',
+	egrave: 'è',
+	'egrave;': 'è',
+	'egs;': '⪖',
+	'egsdot;': '⪘',
+	'el;': '⪙',
+	'elinters;': '⏧',
+	'ell;': 'ℓ',
+	'els;': '⪕',
+	'elsdot;': '⪗',
+	'emacr;': 'ē',
+	'empty;': '∅',
+	'emptyset;': '∅',
+	'emptyv;': '∅',
+	'emsp13;': ' ',
+	'emsp14;': ' ',
+	'emsp;': ' ',
+	'eng;': 'ŋ',
+	'ensp;': ' ',
+	'eogon;': 'ę',
+	'eopf;': '𝕖',
+	'epar;': '⋕',
+	'eparsl;': '⧣',
+	'eplus;': '⩱',
+	'epsi;': 'ε',
+	'epsilon;': 'ε',
+	'epsiv;': 'ϵ',
+	'eqcirc;': '≖',
+	'eqcolon;': '≕',
+	'eqsim;': '≂',
+	'eqslantgtr;': '⪖',
+	'eqslantless;': '⪕',
+	'equals;': '=',
+	'equest;': '≟',
+	'equiv;': '≡',
+	'equivDD;': '⩸',
+	'eqvparsl;': '⧥',
+	'erDot;': '≓',
+	'erarr;': '⥱',
+	'escr;': 'ℯ',
+	'esdot;': '≐',
+	'esim;': '≂',
+	'eta;': 'η',
+	eth: 'ð',
+	'eth;': 'ð',
+	euml: 'ë',
+	'euml;': 'ë',
+	'euro;': '€',
+	'excl;': '!',
+	'exist;': '∃',
+	'expectation;': 'ℰ',
+	'exponentiale;': 'ⅇ',
+	'fallingdotseq;': '≒',
+	'fcy;': 'ф',
+	'female;': '♀',
+	'ffilig;': 'ﬃ',
+	'fflig;': 'ﬀ',
+	'ffllig;': 'ﬄ',
+	'ffr;': '𝔣',
+	'filig;': 'ﬁ',
+	'fjlig;': 'fj',
+	'flat;': '♭',
+	'fllig;': 'ﬂ',
+	'fltns;': '▱',
+	'fnof;': 'ƒ',
+	'fopf;': '𝕗',
+	'forall;': '∀',
+	'fork;': '⋔',
+	'forkv;': '⫙',
+	'fpartint;': '⨍',
+	frac12: '½',
+	'frac12;': '½',
+	'frac13;': '⅓',
+	frac14: '¼',
+	'frac14;': '¼',
+	'frac15;': '⅕',
+	'frac16;': '⅙',
+	'frac18;': '⅛',
+	'frac23;': '⅔',
+	'frac25;': '⅖',
+	frac34: '¾',
+	'frac34;': '¾',
+	'frac35;': '⅗',
+	'frac38;': '⅜',
+	'frac45;': '⅘',
+	'frac56;': '⅚',
+	'frac58;': '⅝',
+	'frac78;': '⅞',
+	'frasl;': '⁄',
+	'frown;': '⌢',
+	'fscr;': '𝒻',
+	'gE;': '≧',
+	'gEl;': '⪌',
+	'gacute;': 'ǵ',
+	'gamma;': 'γ',
+	'gammad;': 'ϝ',
+	'gap;': '⪆',
+	'gbreve;': 'ğ',
+	'gcirc;': 'ĝ',
+	'gcy;': 'г',
+	'gdot;': 'ġ',
+	'ge;': '≥',
+	'gel;': '⋛',
+	'geq;': '≥',
+	'geqq;': '≧',
+	'geqslant;': '⩾',
+	'ges;': '⩾',
+	'gescc;': '⪩',
+	'gesdot;': '⪀',
+	'gesdoto;': '⪂',
+	'gesdotol;': '⪄',
+	'gesl;': '⋛︀',
+	'gesles;': '⪔',
+	'gfr;': '𝔤',
+	'gg;': '≫',
+	'ggg;': '⋙',
+	'gimel;': 'ℷ',
+	'gjcy;': 'ѓ',
+	'gl;': '≷',
+	'glE;': '⪒',
+	'gla;': '⪥',
+	'glj;': '⪤',
+	'gnE;': '≩',
+	'gnap;': '⪊',
+	'gnapprox;': '⪊',
+	'gne;': '⪈',
+	'gneq;': '⪈',
+	'gneqq;': '≩',
+	'gnsim;': '⋧',
+	'gopf;': '𝕘',
+	'grave;': '`',
+	'gscr;': 'ℊ',
+	'gsim;': '≳',
+	'gsime;': '⪎',
+	'gsiml;': '⪐',
+	gt: '>',
+	'gt;': '>',
+	'gtcc;': '⪧',
+	'gtcir;': '⩺',
+	'gtdot;': '⋗',
+	'gtlPar;': '⦕',
+	'gtquest;': '⩼',
+	'gtrapprox;': '⪆',
+	'gtrarr;': '⥸',
+	'gtrdot;': '⋗',
+	'gtreqless;': '⋛',
+	'gtreqqless;': '⪌',
+	'gtrless;': '≷',
+	'gtrsim;': '≳',
+	'gvertneqq;': '≩︀',
+	'gvnE;': '≩︀',
+	'hArr;': '⇔',
+	'hairsp;': ' ',
+	'half;': '½',
+	'hamilt;': 'ℋ',
+	'hardcy;': 'ъ',
+	'harr;': '↔',
+	'harrcir;': '⥈',
+	'harrw;': '↭',
+	'hbar;': 'ℏ',
+	'hcirc;': 'ĥ',
+	'hearts;': '♥',
+	'heartsuit;': '♥',
+	'hellip;': '…',
+	'hercon;': '⊹',
+	'hfr;': '𝔥',
+	'hksearow;': '⤥',
+	'hkswarow;': '⤦',
+	'hoarr;': '⇿',
+	'homtht;': '∻',
+	'hookleftarrow;': '↩',
+	'hookrightarrow;': '↪',
+	'hopf;': '𝕙',
+	'horbar;': '―',
+	'hscr;': '𝒽',
+	'hslash;': 'ℏ',
+	'hstrok;': 'ħ',
+	'hybull;': '⁃',
+	'hyphen;': '‐',
+	iacute: 'í',
+	'iacute;': 'í',
+	'ic;': '⁣',
+	icirc: 'î',
+	'icirc;': 'î',
+	'icy;': 'и',
+	'iecy;': 'е',
+	iexcl: '¡',
+	'iexcl;': '¡',
+	'iff;': '⇔',
+	'ifr;': '𝔦',
+	igrave: 'ì',
+	'igrave;': 'ì',
+	'ii;': 'ⅈ',
+	'iiiint;': '⨌',
+	'iiint;': '∭',
+	'iinfin;': '⧜',
+	'iiota;': '℩',
+	'ijlig;': 'ĳ',
+	'imacr;': 'ī',
+	'image;': 'ℑ',
+	'imagline;': 'ℐ',
+	'imagpart;': 'ℑ',
+	'imath;': 'ı',
+	'imof;': '⊷',
+	'imped;': 'Ƶ',
+	'in;': '∈',
+	'incare;': '℅',
+	'infin;': '∞',
+	'infintie;': '⧝',
+	'inodot;': 'ı',
+	'int;': '∫',
+	'intcal;': '⊺',
+	'integers;': 'ℤ',
+	'intercal;': '⊺',
+	'intlarhk;': '⨗',
+	'intprod;': '⨼',
+	'iocy;': 'ё',
+	'iogon;': 'į',
+	'iopf;': '𝕚',
+	'iota;': 'ι',
+	'iprod;': '⨼',
+	iquest: '¿',
+	'iquest;': '¿',
+	'iscr;': '𝒾',
+	'isin;': '∈',
+	'isinE;': '⋹',
+	'isindot;': '⋵',
+	'isins;': '⋴',
+	'isinsv;': '⋳',
+	'isinv;': '∈',
+	'it;': '⁢',
+	'itilde;': 'ĩ',
+	'iukcy;': 'і',
+	iuml: 'ï',
+	'iuml;': 'ï',
+	'jcirc;': 'ĵ',
+	'jcy;': 'й',
+	'jfr;': '𝔧',
+	'jmath;': 'ȷ',
+	'jopf;': '𝕛',
+	'jscr;': '𝒿',
+	'jsercy;': 'ј',
+	'jukcy;': 'є',
+	'kappa;': 'κ',
+	'kappav;': 'ϰ',
+	'kcedil;': 'ķ',
+	'kcy;': 'к',
+	'kfr;': '𝔨',
+	'kgreen;': 'ĸ',
+	'khcy;': 'х',
+	'kjcy;': 'ќ',
+	'kopf;': '𝕜',
+	'kscr;': '𝓀',
+	'lAarr;': '⇚',
+	'lArr;': '⇐',
+	'lAtail;': '⤛',
+	'lBarr;': '⤎',
+	'lE;': '≦',
+	'lEg;': '⪋',
+	'lHar;': '⥢',
+	'lacute;': 'ĺ',
+	'laemptyv;': '⦴',
+	'lagran;': 'ℒ',
+	'lambda;': 'λ',
+	'lang;': '⟨',
+	'langd;': '⦑',
+	'langle;': '⟨',
+	'lap;': '⪅',
+	laquo: '«',
+	'laquo;': '«',
+	'larr;': '←',
+	'larrb;': '⇤',
+	'larrbfs;': '⤟',
+	'larrfs;': '⤝',
+	'larrhk;': '↩',
+	'larrlp;': '↫',
+	'larrpl;': '⤹',
+	'larrsim;': '⥳',
+	'larrtl;': '↢',
+	'lat;': '⪫',
+	'latail;': '⤙',
+	'late;': '⪭',
+	'lates;': '⪭︀',
+	'lbarr;': '⤌',
+	'lbbrk;': '❲',
+	'lbrace;': '{',
+	'lbrack;': '[',
+	'lbrke;': '⦋',
+	'lbrksld;': '⦏',
+	'lbrkslu;': '⦍',
+	'lcaron;': 'ľ',
+	'lcedil;': 'ļ',
+	'lceil;': '⌈',
+	'lcub;': '{',
+	'lcy;': 'л',
+	'ldca;': '⤶',
+	'ldquo;': '“',
+	'ldquor;': '„',
+	'ldrdhar;': '⥧',
+	'ldrushar;': '⥋',
+	'ldsh;': '↲',
+	'le;': '≤',
+	'leftarrow;': '←',
+	'leftarrowtail;': '↢',
+	'leftharpoondown;': '↽',
+	'leftharpoonup;': '↼',
+	'leftleftarrows;': '⇇',
+	'leftrightarrow;': '↔',
+	'leftrightarrows;': '⇆',
+	'leftrightharpoons;': '⇋',
+	'leftrightsquigarrow;': '↭',
+	'leftthreetimes;': '⋋',
+	'leg;': '⋚',
+	'leq;': '≤',
+	'leqq;': '≦',
+	'leqslant;': '⩽',
+	'les;': '⩽',
+	'lescc;': '⪨',
+	'lesdot;': '⩿',
+	'lesdoto;': '⪁',
+	'lesdotor;': '⪃',
+	'lesg;': '⋚︀',
+	'lesges;': '⪓',
+	'lessapprox;': '⪅',
+	'lessdot;': '⋖',
+	'lesseqgtr;': '⋚',
+	'lesseqqgtr;': '⪋',
+	'lessgtr;': '≶',
+	'lesssim;': '≲',
+	'lfisht;': '⥼',
+	'lfloor;': '⌊',
+	'lfr;': '𝔩',
+	'lg;': '≶',
+	'lgE;': '⪑',
+	'lhard;': '↽',
+	'lharu;': '↼',
+	'lharul;': '⥪',
+	'lhblk;': '▄',
+	'ljcy;': 'љ',
+	'll;': '≪',
+	'llarr;': '⇇',
+	'llcorner;': '⌞',
+	'llhard;': '⥫',
+	'lltri;': '◺',
+	'lmidot;': 'ŀ',
+	'lmoust;': '⎰',
+	'lmoustache;': '⎰',
+	'lnE;': '≨',
+	'lnap;': '⪉',
+	'lnapprox;': '⪉',
+	'lne;': '⪇',
+	'lneq;': '⪇',
+	'lneqq;': '≨',
+	'lnsim;': '⋦',
+	'loang;': '⟬',
+	'loarr;': '⇽',
+	'lobrk;': '⟦',
+	'longleftarrow;': '⟵',
+	'longleftrightarrow;': '⟷',
+	'longmapsto;': '⟼',
+	'longrightarrow;': '⟶',
+	'looparrowleft;': '↫',
+	'looparrowright;': '↬',
+	'lopar;': '⦅',
+	'lopf;': '𝕝',
+	'loplus;': '⨭',
+	'lotimes;': '⨴',
+	'lowast;': '∗',
+	'lowbar;': '_',
+	'loz;': '◊',
+	'lozenge;': '◊',
+	'lozf;': '⧫',
+	'lpar;': '(',
+	'lparlt;': '⦓',
+	'lrarr;': '⇆',
+	'lrcorner;': '⌟',
+	'lrhar;': '⇋',
+	'lrhard;': '⥭',
+	'lrm;': '‎',
+	'lrtri;': '⊿',
+	'lsaquo;': '‹',
+	'lscr;': '𝓁',
+	'lsh;': '↰',
+	'lsim;': '≲',
+	'lsime;': '⪍',
+	'lsimg;': '⪏',
+	'lsqb;': '[',
+	'lsquo;': '‘',
+	'lsquor;': '‚',
+	'lstrok;': 'ł',
+	lt: '<',
+	'lt;': '<',
+	'ltcc;': '⪦',
+	'ltcir;': '⩹',
+	'ltdot;': '⋖',
+	'lthree;': '⋋',
+	'ltimes;': '⋉',
+	'ltlarr;': '⥶',
+	'ltquest;': '⩻',
+	'ltrPar;': '⦖',
+	'ltri;': '◃',
+	'ltrie;': '⊴',
+	'ltrif;': '◂',
+	'lurdshar;': '⥊',
+	'luruhar;': '⥦',
+	'lvertneqq;': '≨︀',
+	'lvnE;': '≨︀',
+	'mDDot;': '∺',
+	macr: '¯',
+	'macr;': '¯',
+	'male;': '♂',
+	'malt;': '✠',
+	'maltese;': '✠',
+	'map;': '↦',
+	'mapsto;': '↦',
+	'mapstodown;': '↧',
+	'mapstoleft;': '↤',
+	'mapstoup;': '↥',
+	'marker;': '▮',
+	'mcomma;': '⨩',
+	'mcy;': 'м',
+	'mdash;': '—',
+	'measuredangle;': '∡',
+	'mfr;': '𝔪',
+	'mho;': '℧',
+	micro: 'µ',
+	'micro;': 'µ',
+	'mid;': '∣',
+	'midast;': '*',
+	'midcir;': '⫰',
+	middot: '·',
+	'middot;': '·',
+	'minus;': '−',
+	'minusb;': '⊟',
+	'minusd;': '∸',
+	'minusdu;': '⨪',
+	'mlcp;': '⫛',
+	'mldr;': '…',
+	'mnplus;': '∓',
+	'models;': '⊧',
+	'mopf;': '𝕞',
+	'mp;': '∓',
+	'mscr;': '𝓂',
+	'mstpos;': '∾',
+	'mu;': 'μ',
+	'multimap;': '⊸',
+	'mumap;': '⊸',
+	'nGg;': '⋙̸',
+	'nGt;': '≫⃒',
+	'nGtv;': '≫̸',
+	'nLeftarrow;': '⇍',
+	'nLeftrightarrow;': '⇎',
+	'nLl;': '⋘̸',
+	'nLt;': '≪⃒',
+	'nLtv;': '≪̸',
+	'nRightarrow;': '⇏',
+	'nVDash;': '⊯',
+	'nVdash;': '⊮',
+	'nabla;': '∇',
+	'nacute;': 'ń',
+	'nang;': '∠⃒',
+	'nap;': '≉',
+	'napE;': '⩰̸',
+	'napid;': '≋̸',
+	'napos;': 'ŉ',
+	'napprox;': '≉',
+	'natur;': '♮',
+	'natural;': '♮',
+	'naturals;': 'ℕ',
+	nbsp: ' ',
+	'nbsp;': ' ',
+	'nbump;': '≎̸',
+	'nbumpe;': '≏̸',
+	'ncap;': '⩃',
+	'ncaron;': 'ň',
+	'ncedil;': 'ņ',
+	'ncong;': '≇',
+	'ncongdot;': '⩭̸',
+	'ncup;': '⩂',
+	'ncy;': 'н',
+	'ndash;': '–',
+	'ne;': '≠',
+	'neArr;': '⇗',
+	'nearhk;': '⤤',
+	'nearr;': '↗',
+	'nearrow;': '↗',
+	'nedot;': '≐̸',
+	'nequiv;': '≢',
+	'nesear;': '⤨',
+	'nesim;': '≂̸',
+	'nexist;': '∄',
+	'nexists;': '∄',
+	'nfr;': '𝔫',
+	'ngE;': '≧̸',
+	'nge;': '≱',
+	'ngeq;': '≱',
+	'ngeqq;': '≧̸',
+	'ngeqslant;': '⩾̸',
+	'nges;': '⩾̸',
+	'ngsim;': '≵',
+	'ngt;': '≯',
+	'ngtr;': '≯',
+	'nhArr;': '⇎',
+	'nharr;': '↮',
+	'nhpar;': '⫲',
+	'ni;': '∋',
+	'nis;': '⋼',
+	'nisd;': '⋺',
+	'niv;': '∋',
+	'njcy;': 'њ',
+	'nlArr;': '⇍',
+	'nlE;': '≦̸',
+	'nlarr;': '↚',
+	'nldr;': '‥',
+	'nle;': '≰',
+	'nleftarrow;': '↚',
+	'nleftrightarrow;': '↮',
+	'nleq;': '≰',
+	'nleqq;': '≦̸',
+	'nleqslant;': '⩽̸',
+	'nles;': '⩽̸',
+	'nless;': '≮',
+	'nlsim;': '≴',
+	'nlt;': '≮',
+	'nltri;': '⋪',
+	'nltrie;': '⋬',
+	'nmid;': '∤',
+	'nopf;': '𝕟',
+	not: '¬',
+	'not;': '¬',
+	'notin;': '∉',
+	'notinE;': '⋹̸',
+	'notindot;': '⋵̸',
+	'notinva;': '∉',
+	'notinvb;': '⋷',
+	'notinvc;': '⋶',
+	'notni;': '∌',
+	'notniva;': '∌',
+	'notnivb;': '⋾',
+	'notnivc;': '⋽',
+	'npar;': '∦',
+	'nparallel;': '∦',
+	'nparsl;': '⫽⃥',
+	'npart;': '∂̸',
+	'npolint;': '⨔',
+	'npr;': '⊀',
+	'nprcue;': '⋠',
+	'npre;': '⪯̸',
+	'nprec;': '⊀',
+	'npreceq;': '⪯̸',
+	'nrArr;': '⇏',
+	'nrarr;': '↛',
+	'nrarrc;': '⤳̸',
+	'nrarrw;': '↝̸',
+	'nrightarrow;': '↛',
+	'nrtri;': '⋫',
+	'nrtrie;': '⋭',
+	'nsc;': '⊁',
+	'nsccue;': '⋡',
+	'nsce;': '⪰̸',
+	'nscr;': '𝓃',
+	'nshortmid;': '∤',
+	'nshortparallel;': '∦',
+	'nsim;': '≁',
+	'nsime;': '≄',
+	'nsimeq;': '≄',
+	'nsmid;': '∤',
+	'nspar;': '∦',
+	'nsqsube;': '⋢',
+	'nsqsupe;': '⋣',
+	'nsub;': '⊄',
+	'nsubE;': '⫅̸',
+	'nsube;': '⊈',
+	'nsubset;': '⊂⃒',
+	'nsubseteq;': '⊈',
+	'nsubseteqq;': '⫅̸',
+	'nsucc;': '⊁',
+	'nsucceq;': '⪰̸',
+	'nsup;': '⊅',
+	'nsupE;': '⫆̸',
+	'nsupe;': '⊉',
+	'nsupset;': '⊃⃒',
+	'nsupseteq;': '⊉',
+	'nsupseteqq;': '⫆̸',
+	'ntgl;': '≹',
+	ntilde: 'ñ',
+	'ntilde;': 'ñ',
+	'ntlg;': '≸',
+	'ntriangleleft;': '⋪',
+	'ntrianglelefteq;': '⋬',
+	'ntriangleright;': '⋫',
+	'ntrianglerighteq;': '⋭',
+	'nu;': 'ν',
+	'num;': '#',
+	'numero;': '№',
+	'numsp;': ' ',
+	'nvDash;': '⊭',
+	'nvHarr;': '⤄',
+	'nvap;': '≍⃒',
+	'nvdash;': '⊬',
+	'nvge;': '≥⃒',
+	'nvgt;': '>⃒',
+	'nvinfin;': '⧞',
+	'nvlArr;': '⤂',
+	'nvle;': '≤⃒',
+	'nvlt;': '<⃒',
+	'nvltrie;': '⊴⃒',
+	'nvrArr;': '⤃',
+	'nvrtrie;': '⊵⃒',
+	'nvsim;': '∼⃒',
+	'nwArr;': '⇖',
+	'nwarhk;': '⤣',
+	'nwarr;': '↖',
+	'nwarrow;': '↖',
+	'nwnear;': '⤧',
+	'oS;': 'Ⓢ',
+	oacute: 'ó',
+	'oacute;': 'ó',
+	'oast;': '⊛',
+	'ocir;': '⊚',
+	ocirc: 'ô',
+	'ocirc;': 'ô',
+	'ocy;': 'о',
+	'odash;': '⊝',
+	'odblac;': 'ő',
+	'odiv;': '⨸',
+	'odot;': '⊙',
+	'odsold;': '⦼',
+	'oelig;': 'œ',
+	'ofcir;': '⦿',
+	'ofr;': '𝔬',
+	'ogon;': '˛',
+	ograve: 'ò',
+	'ograve;': 'ò',
+	'ogt;': '⧁',
+	'ohbar;': '⦵',
+	'ohm;': 'Ω',
+	'oint;': '∮',
+	'olarr;': '↺',
+	'olcir;': '⦾',
+	'olcross;': '⦻',
+	'oline;': '‾',
+	'olt;': '⧀',
+	'omacr;': 'ō',
+	'omega;': 'ω',
+	'omicron;': 'ο',
+	'omid;': '⦶',
+	'ominus;': '⊖',
+	'oopf;': '𝕠',
+	'opar;': '⦷',
+	'operp;': '⦹',
+	'oplus;': '⊕',
+	'or;': '∨',
+	'orarr;': '↻',
+	'ord;': '⩝',
+	'order;': 'ℴ',
+	'orderof;': 'ℴ',
+	ordf: 'ª',
+	'ordf;': 'ª',
+	ordm: 'º',
+	'ordm;': 'º',
+	'origof;': '⊶',
+	'oror;': '⩖',
+	'orslope;': '⩗',
+	'orv;': '⩛',
+	'oscr;': 'ℴ',
+	oslash: 'ø',
+	'oslash;': 'ø',
+	'osol;': '⊘',
+	otilde: 'õ',
+	'otilde;': 'õ',
+	'otimes;': '⊗',
+	'otimesas;': '⨶',
+	ouml: 'ö',
+	'ouml;': 'ö',
+	'ovbar;': '⌽',
+	'par;': '∥',
+	para: '¶',
+	'para;': '¶',
+	'parallel;': '∥',
+	'parsim;': '⫳',
+	'parsl;': '⫽',
+	'part;': '∂',
+	'pcy;': 'п',
+	'percnt;': '%',
+	'period;': '.',
+	'permil;': '‰',
+	'perp;': '⊥',
+	'pertenk;': '‱',
+	'pfr;': '𝔭',
+	'phi;': 'φ',
+	'phiv;': 'ϕ',
+	'phmmat;': 'ℳ',
+	'phone;': '☎',
+	'pi;': 'π',
+	'pitchfork;': '⋔',
+	'piv;': 'ϖ',
+	'planck;': 'ℏ',
+	'planckh;': 'ℎ',
+	'plankv;': 'ℏ',
+	'plus;': '+',
+	'plusacir;': '⨣',
+	'plusb;': '⊞',
+	'pluscir;': '⨢',
+	'plusdo;': '∔',
+	'plusdu;': '⨥',
+	'pluse;': '⩲',
+	plusmn: '±',
+	'plusmn;': '±',
+	'plussim;': '⨦',
+	'plustwo;': '⨧',
+	'pm;': '±',
+	'pointint;': '⨕',
+	'popf;': '𝕡',
+	pound: '£',
+	'pound;': '£',
+	'pr;': '≺',
+	'prE;': '⪳',
+	'prap;': '⪷',
+	'prcue;': '≼',
+	'pre;': '⪯',
+	'prec;': '≺',
+	'precapprox;': '⪷',
+	'preccurlyeq;': '≼',
+	'preceq;': '⪯',
+	'precnapprox;': '⪹',
+	'precneqq;': '⪵',
+	'precnsim;': '⋨',
+	'precsim;': '≾',
+	'prime;': '′',
+	'primes;': 'ℙ',
+	'prnE;': '⪵',
+	'prnap;': '⪹',
+	'prnsim;': '⋨',
+	'prod;': '∏',
+	'profalar;': '⌮',
+	'profline;': '⌒',
+	'profsurf;': '⌓',
+	'prop;': '∝',
+	'propto;': '∝',
+	'prsim;': '≾',
+	'prurel;': '⊰',
+	'pscr;': '𝓅',
+	'psi;': 'ψ',
+	'puncsp;': ' ',
+	'qfr;': '𝔮',
+	'qint;': '⨌',
+	'qopf;': '𝕢',
+	'qprime;': '⁗',
+	'qscr;': '𝓆',
+	'quaternions;': 'ℍ',
+	'quatint;': '⨖',
+	'quest;': '?',
+	'questeq;': '≟',
+	quot: '"',
+	'quot;': '"',
+	'rAarr;': '⇛',
+	'rArr;': '⇒',
+	'rAtail;': '⤜',
+	'rBarr;': '⤏',
+	'rHar;': '⥤',
+	'race;': '∽̱',
+	'racute;': 'ŕ',
+	'radic;': '√',
+	'raemptyv;': '⦳',
+	'rang;': '⟩',
+	'rangd;': '⦒',
+	'range;': '⦥',
+	'rangle;': '⟩',
+	raquo: '»',
+	'raquo;': '»',
+	'rarr;': '→',
+	'rarrap;': '⥵',
+	'rarrb;': '⇥',
+	'rarrbfs;': '⤠',
+	'rarrc;': '⤳',
+	'rarrfs;': '⤞',
+	'rarrhk;': '↪',
+	'rarrlp;': '↬',
+	'rarrpl;': '⥅',
+	'rarrsim;': '⥴',
+	'rarrtl;': '↣',
+	'rarrw;': '↝',
+	'ratail;': '⤚',
+	'ratio;': '∶',
+	'rationals;': 'ℚ',
+	'rbarr;': '⤍',
+	'rbbrk;': '❳',
+	'rbrace;': '}',
+	'rbrack;': ']',
+	'rbrke;': '⦌',
+	'rbrksld;': '⦎',
+	'rbrkslu;': '⦐',
+	'rcaron;': 'ř',
+	'rcedil;': 'ŗ',
+	'rceil;': '⌉',
+	'rcub;': '}',
+	'rcy;': 'р',
+	'rdca;': '⤷',
+	'rdldhar;': '⥩',
+	'rdquo;': '”',
+	'rdquor;': '”',
+	'rdsh;': '↳',
+	'real;': 'ℜ',
+	'realine;': 'ℛ',
+	'realpart;': 'ℜ',
+	'reals;': 'ℝ',
+	'rect;': '▭',
+	reg: '®',
+	'reg;': '®',
+	'rfisht;': '⥽',
+	'rfloor;': '⌋',
+	'rfr;': '𝔯',
+	'rhard;': '⇁',
+	'rharu;': '⇀',
+	'rharul;': '⥬',
+	'rho;': 'ρ',
+	'rhov;': 'ϱ',
+	'rightarrow;': '→',
+	'rightarrowtail;': '↣',
+	'rightharpoondown;': '⇁',
+	'rightharpoonup;': '⇀',
+	'rightleftarrows;': '⇄',
+	'rightleftharpoons;': '⇌',
+	'rightrightarrows;': '⇉',
+	'rightsquigarrow;': '↝',
+	'rightthreetimes;': '⋌',
+	'ring;': '˚',
+	'risingdotseq;': '≓',
+	'rlarr;': '⇄',
+	'rlhar;': '⇌',
+	'rlm;': '‏',
+	'rmoust;': '⎱',
+	'rmoustache;': '⎱',
+	'rnmid;': '⫮',
+	'roang;': '⟭',
+	'roarr;': '⇾',
+	'robrk;': '⟧',
+	'ropar;': '⦆',
+	'ropf;': '𝕣',
+	'roplus;': '⨮',
+	'rotimes;': '⨵',
+	'rpar;': ')',
+	'rpargt;': '⦔',
+	'rppolint;': '⨒',
+	'rrarr;': '⇉',
+	'rsaquo;': '›',
+	'rscr;': '𝓇',
+	'rsh;': '↱',
+	'rsqb;': ']',
+	'rsquo;': '’',
+	'rsquor;': '’',
+	'rthree;': '⋌',
+	'rtimes;': '⋊',
+	'rtri;': '▹',
+	'rtrie;': '⊵',
+	'rtrif;': '▸',
+	'rtriltri;': '⧎',
+	'ruluhar;': '⥨',
+	'rx;': '℞',
+	'sacute;': 'ś',
+	'sbquo;': '‚',
+	'sc;': '≻',
+	'scE;': '⪴',
+	'scap;': '⪸',
+	'scaron;': 'š',
+	'sccue;': '≽',
+	'sce;': '⪰',
+	'scedil;': 'ş',
+	'scirc;': 'ŝ',
+	'scnE;': '⪶',
+	'scnap;': '⪺',
+	'scnsim;': '⋩',
+	'scpolint;': '⨓',
+	'scsim;': '≿',
+	'scy;': 'с',
+	'sdot;': '⋅',
+	'sdotb;': '⊡',
+	'sdote;': '⩦',
+	'seArr;': '⇘',
+	'searhk;': '⤥',
+	'searr;': '↘',
+	'searrow;': '↘',
+	sect: '§',
+	'sect;': '§',
+	'semi;': ';',
+	'seswar;': '⤩',
+	'setminus;': '∖',
+	'setmn;': '∖',
+	'sext;': '✶',
+	'sfr;': '𝔰',
+	'sfrown;': '⌢',
+	'sharp;': '♯',
+	'shchcy;': 'щ',
+	'shcy;': 'ш',
+	'shortmid;': '∣',
+	'shortparallel;': '∥',
+	shy: '­',
+	'shy;': '­',
+	'sigma;': 'σ',
+	'sigmaf;': 'ς',
+	'sigmav;': 'ς',
+	'sim;': '∼',
+	'simdot;': '⩪',
+	'sime;': '≃',
+	'simeq;': '≃',
+	'simg;': '⪞',
+	'simgE;': '⪠',
+	'siml;': '⪝',
+	'simlE;': '⪟',
+	'simne;': '≆',
+	'simplus;': '⨤',
+	'simrarr;': '⥲',
+	'slarr;': '←',
+	'smallsetminus;': '∖',
+	'smashp;': '⨳',
+	'smeparsl;': '⧤',
+	'smid;': '∣',
+	'smile;': '⌣',
+	'smt;': '⪪',
+	'smte;': '⪬',
+	'smtes;': '⪬︀',
+	'softcy;': 'ь',
+	'sol;': '/',
+	'solb;': '⧄',
+	'solbar;': '⌿',
+	'sopf;': '𝕤',
+	'spades;': '♠',
+	'spadesuit;': '♠',
+	'spar;': '∥',
+	'sqcap;': '⊓',
+	'sqcaps;': '⊓︀',
+	'sqcup;': '⊔',
+	'sqcups;': '⊔︀',
+	'sqsub;': '⊏',
+	'sqsube;': '⊑',
+	'sqsubset;': '⊏',
+	'sqsubseteq;': '⊑',
+	'sqsup;': '⊐',
+	'sqsupe;': '⊒',
+	'sqsupset;': '⊐',
+	'sqsupseteq;': '⊒',
+	'squ;': '□',
+	'square;': '□',
+	'squarf;': '▪',
+	'squf;': '▪',
+	'srarr;': '→',
+	'sscr;': '𝓈',
+	'ssetmn;': '∖',
+	'ssmile;': '⌣',
+	'sstarf;': '⋆',
+	'star;': '☆',
+	'starf;': '★',
+	'straightepsilon;': 'ϵ',
+	'straightphi;': 'ϕ',
+	'strns;': '¯',
+	'sub;': '⊂',
+	'subE;': '⫅',
+	'subdot;': '⪽',
+	'sube;': '⊆',
+	'subedot;': '⫃',
+	'submult;': '⫁',
+	'subnE;': '⫋',
+	'subne;': '⊊',
+	'subplus;': '⪿',
+	'subrarr;': '⥹',
+	'subset;': '⊂',
+	'subseteq;': '⊆',
+	'subseteqq;': '⫅',
+	'subsetneq;': '⊊',
+	'subsetneqq;': '⫋',
+	'subsim;': '⫇',
+	'subsub;': '⫕',
+	'subsup;': '⫓',
+	'succ;': '≻',
+	'succapprox;': '⪸',
+	'succcurlyeq;': '≽',
+	'succeq;': '⪰',
+	'succnapprox;': '⪺',
+	'succneqq;': '⪶',
+	'succnsim;': '⋩',
+	'succsim;': '≿',
+	'sum;': '∑',
+	'sung;': '♪',
+	sup1: '¹',
+	'sup1;': '¹',
+	sup2: '²',
+	'sup2;': '²',
+	sup3: '³',
+	'sup3;': '³',
+	'sup;': '⊃',
+	'supE;': '⫆',
+	'supdot;': '⪾',
+	'supdsub;': '⫘',
+	'supe;': '⊇',
+	'supedot;': '⫄',
+	'suphsol;': '⟉',
+	'suphsub;': '⫗',
+	'suplarr;': '⥻',
+	'supmult;': '⫂',
+	'supnE;': '⫌',
+	'supne;': '⊋',
+	'supplus;': '⫀',
+	'supset;': '⊃',
+	'supseteq;': '⊇',
+	'supseteqq;': '⫆',
+	'supsetneq;': '⊋',
+	'supsetneqq;': '⫌',
+	'supsim;': '⫈',
+	'supsub;': '⫔',
+	'supsup;': '⫖',
+	'swArr;': '⇙',
+	'swarhk;': '⤦',
+	'swarr;': '↙',
+	'swarrow;': '↙',
+	'swnwar;': '⤪',
+	szlig: 'ß',
+	'szlig;': 'ß',
+	'target;': '⌖',
+	'tau;': 'τ',
+	'tbrk;': '⎴',
+	'tcaron;': 'ť',
+	'tcedil;': 'ţ',
+	'tcy;': 'т',
+	'tdot;': '⃛',
+	'telrec;': '⌕',
+	'tfr;': '𝔱',
+	'there4;': '∴',
+	'therefore;': '∴',
+	'theta;': 'θ',
+	'thetasym;': 'ϑ',
+	'thetav;': 'ϑ',
+	'thickapprox;': '≈',
+	'thicksim;': '∼',
+	'thinsp;': ' ',
+	'thkap;': '≈',
+	'thksim;': '∼',
+	thorn: 'þ',
+	'thorn;': 'þ',
+	'tilde;': '˜',
+	times: '×',
+	'times;': '×',
+	'timesb;': '⊠',
+	'timesbar;': '⨱',
+	'timesd;': '⨰',
+	'tint;': '∭',
+	'toea;': '⤨',
+	'top;': '⊤',
+	'topbot;': '⌶',
+	'topcir;': '⫱',
+	'topf;': '𝕥',
+	'topfork;': '⫚',
+	'tosa;': '⤩',
+	'tprime;': '‴',
+	'trade;': '™',
+	'triangle;': '▵',
+	'triangledown;': '▿',
+	'triangleleft;': '◃',
+	'trianglelefteq;': '⊴',
+	'triangleq;': '≜',
+	'triangleright;': '▹',
+	'trianglerighteq;': '⊵',
+	'tridot;': '◬',
+	'trie;': '≜',
+	'triminus;': '⨺',
+	'triplus;': '⨹',
+	'trisb;': '⧍',
+	'tritime;': '⨻',
+	'trpezium;': '⏢',
+	'tscr;': '𝓉',
+	'tscy;': 'ц',
+	'tshcy;': 'ћ',
+	'tstrok;': 'ŧ',
+	'twixt;': '≬',
+	'twoheadleftarrow;': '↞',
+	'twoheadrightarrow;': '↠',
+	'uArr;': '⇑',
+	'uHar;': '⥣',
+	uacute: 'ú',
+	'uacute;': 'ú',
+	'uarr;': '↑',
+	'ubrcy;': 'ў',
+	'ubreve;': 'ŭ',
+	ucirc: 'û',
+	'ucirc;': 'û',
+	'ucy;': 'у',
+	'udarr;': '⇅',
+	'udblac;': 'ű',
+	'udhar;': '⥮',
+	'ufisht;': '⥾',
+	'ufr;': '𝔲',
+	ugrave: 'ù',
+	'ugrave;': 'ù',
+	'uharl;': '↿',
+	'uharr;': '↾',
+	'uhblk;': '▀',
+	'ulcorn;': '⌜',
+	'ulcorner;': '⌜',
+	'ulcrop;': '⌏',
+	'ultri;': '◸',
+	'umacr;': 'ū',
+	uml: '¨',
+	'uml;': '¨',
+	'uogon;': 'ų',
+	'uopf;': '𝕦',
+	'uparrow;': '↑',
+	'updownarrow;': '↕',
+	'upharpoonleft;': '↿',
+	'upharpoonright;': '↾',
+	'uplus;': '⊎',
+	'upsi;': 'υ',
+	'upsih;': 'ϒ',
+	'upsilon;': 'υ',
+	'upuparrows;': '⇈',
+	'urcorn;': '⌝',
+	'urcorner;': '⌝',
+	'urcrop;': '⌎',
+	'uring;': 'ů',
+	'urtri;': '◹',
+	'uscr;': '𝓊',
+	'utdot;': '⋰',
+	'utilde;': 'ũ',
+	'utri;': '▵',
+	'utrif;': '▴',
+	'uuarr;': '⇈',
+	uuml: 'ü',
+	'uuml;': 'ü',
+	'uwangle;': '⦧',
+	'vArr;': '⇕',
+	'vBar;': '⫨',
+	'vBarv;': '⫩',
+	'vDash;': '⊨',
+	'vangrt;': '⦜',
+	'varepsilon;': 'ϵ',
+	'varkappa;': 'ϰ',
+	'varnothing;': '∅',
+	'varphi;': 'ϕ',
+	'varpi;': 'ϖ',
+	'varpropto;': '∝',
+	'varr;': '↕',
+	'varrho;': 'ϱ',
+	'varsigma;': 'ς',
+	'varsubsetneq;': '⊊︀',
+	'varsubsetneqq;': '⫋︀',
+	'varsupsetneq;': '⊋︀',
+	'varsupsetneqq;': '⫌︀',
+	'vartheta;': 'ϑ',
+	'vartriangleleft;': '⊲',
+	'vartriangleright;': '⊳',
+	'vcy;': 'в',
+	'vdash;': '⊢',
+	'vee;': '∨',
+	'veebar;': '⊻',
+	'veeeq;': '≚',
+	'vellip;': '⋮',
+	'verbar;': '|',
+	'vert;': '|',
+	'vfr;': '𝔳',
+	'vltri;': '⊲',
+	'vnsub;': '⊂⃒',
+	'vnsup;': '⊃⃒',
+	'vopf;': '𝕧',
+	'vprop;': '∝',
+	'vrtri;': '⊳',
+	'vscr;': '𝓋',
+	'vsubnE;': '⫋︀',
+	'vsubne;': '⊊︀',
+	'vsupnE;': '⫌︀',
+	'vsupne;': '⊋︀',
+	'vzigzag;': '⦚',
+	'wcirc;': 'ŵ',
+	'wedbar;': '⩟',
+	'wedge;': '∧',
+	'wedgeq;': '≙',
+	'weierp;': '℘',
+	'wfr;': '𝔴',
+	'wopf;': '𝕨',
+	'wp;': '℘',
+	'wr;': '≀',
+	'wreath;': '≀',
+	'wscr;': '𝓌',
+	'xcap;': '⋂',
+	'xcirc;': '◯',
+	'xcup;': '⋃',
+	'xdtri;': '▽',
+	'xfr;': '𝔵',
+	'xhArr;': '⟺',
+	'xharr;': '⟷',
+	'xi;': 'ξ',
+	'xlArr;': '⟸',
+	'xlarr;': '⟵',
+	'xmap;': '⟼',
+	'xnis;': '⋻',
+	'xodot;': '⨀',
+	'xopf;': '𝕩',
+	'xoplus;': '⨁',
+	'xotime;': '⨂',
+	'xrArr;': '⟹',
+	'xrarr;': '⟶',
+	'xscr;': '𝓍',
+	'xsqcup;': '⨆',
+	'xuplus;': '⨄',
+	'xutri;': '△',
+	'xvee;': '⋁',
+	'xwedge;': '⋀',
+	yacute: 'ý',
+	'yacute;': 'ý',
+	'yacy;': 'я',
+	'ycirc;': 'ŷ',
+	'ycy;': 'ы',
+	yen: '¥',
+	'yen;': '¥',
+	'yfr;': '𝔶',
+	'yicy;': 'ї',
+	'yopf;': '𝕪',
+	'yscr;': '𝓎',
+	'yucy;': 'ю',
+	yuml: 'ÿ',
+	'yuml;': 'ÿ',
+	'zacute;': 'ź',
+	'zcaron;': 'ž',
+	'zcy;': 'з',
+	'zdot;': 'ż',
+	'zeetrf;': 'ℨ',
+	'zeta;': 'ζ',
+	'zfr;': '𝔷',
+	'zhcy;': 'ж',
+	'zigrarr;': '⇝',
+	'zopf;': '𝕫',
+	'zscr;': '𝓏',
+	'zwj;': '‍',
+	'zwnj;': '‌'
+};
+
+const numeric = /&#(x)?([0-9a-f]+);/i;
+const named = new RegExp(
+	`&(${Object.keys(entities)
+		.sort((a, b) => b.length - a.length)
+		.join('|')})`,
+	'g'
+);
+
+/** @param {string} str */
+export function decode(str) {
+	return str
+		.replace(numeric, (_match, hex, code) => String.fromCharCode(hex ? parseInt(code, 16) : +code))
+		.replace(named, (_match, entity) => entities[entity]);
+}
diff --git a/packages/kit/src/core/prerender/entities.spec.js b/packages/kit/src/core/prerender/entities.spec.js
new file mode 100644
index 000000000..92b63827c
--- /dev/null
+++ b/packages/kit/src/core/prerender/entities.spec.js
@@ -0,0 +1,60 @@
+import { test } from 'uvu';
+import * as assert from 'uvu/assert';
+import { decode } from './entities.js';
+
+/*
+Test cases shamelessly stolen from https://github.com/fb55/entities/blob/master/src/decode.spec.ts
+Reproduced under BSD 2 license
+---
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+const tests = [
+	{ input: '&amp;amp;', output: '&amp;' },
+	{ input: '&amp;#38;', output: '&#38;' },
+	{ input: '&amp;#x26;', output: '&#x26;' },
+	{ input: '&amp;#X26;', output: '&#X26;' },
+	{ input: '&#38;#38;', output: '&#38;' },
+	{ input: '&#x26;#38;', output: '&#38;' },
+	{ input: '&#X26;#38;', output: '&#38;' },
+	{ input: '&#x3a;', output: ':' },
+	{ input: '&#x3A;', output: ':' },
+	{ input: '&#X3a;', output: ':' },
+	{ input: '&#X3A;', output: ':' },
+	{ input: '&>', output: '&>' },
+	{ input: 'id=770&#anchor', output: 'id=770&#anchor' }
+];
+
+for (const { input, output } of tests) {
+	test(input, () => {
+		assert.is(decode(input), output);
+	});
+}
+
+test('should HTML decode partial legacy entity', () => {
+	assert.is(decode('&timesbar'), '×bar');
+});
+
+test('should HTML decode legacy entities according to spec', () => {
+	assert.is(decode('?&image_uri=1&ℑ=2&image=3'), '?&image_uri=1&ℑ=2&image=3');
+});
+
+test('should back out of legacy entities', () => {
+	assert.is(decode('&ampa'), '&a');
+});
+
+test('should parse &nbsp followed by < (#852)', () => {
+	assert.is(decode('&nbsp<'), '\u00a0<');
+});
+
+test.run();
diff --git a/packages/kit/src/core/prerender/fixtures/href-with-character-reference/input.html b/packages/kit/src/core/prerender/fixtures/href-with-character-reference/input.html
new file mode 100644
index 000000000..d0f38a450
--- /dev/null
+++ b/packages/kit/src/core/prerender/fixtures/href-with-character-reference/input.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<link rel="stylesheet" href="/styles.css" />
+		<link rel="icon" href="/favicon.png" />
+	</head>
+	<body>
+		<a href="/test&amp;ampersand">/test&amp;ampersand</a>
+		<a href="/test&quot;quotation">/test&quot;quotation</a>
+		<a href="/test&#9825;decimal">/test&#9825;decimal</a>
+		<a href="/test&#x2665;hex">/test&#x2665;hex</a>
+	</body>
+</html>
diff --git a/packages/kit/src/core/prerender/fixtures/href-with-character-reference/output.json b/packages/kit/src/core/prerender/fixtures/href-with-character-reference/output.json
new file mode 100644
index 000000000..904636f65
--- /dev/null
+++ b/packages/kit/src/core/prerender/fixtures/href-with-character-reference/output.json
@@ -0,0 +1,1 @@
+["/styles.css", "/favicon.png", "/test&ampersand", "/test\"quotation", "/test♡decimal", "/test♥hex"]
diff --git a/packages/kit/src/core/sync/create_manifest_data/index.js b/packages/kit/src/core/sync/create_manifest_data/index.js
index c386bf1ed..563c391b0 100644
--- a/packages/kit/src/core/sync/create_manifest_data/index.js
+++ b/packages/kit/src/core/sync/create_manifest_data/index.js
@@ -272,11 +272,6 @@ function create_routes_and_nodes(cwd, config, fallback) {
 		route_map.forEach((route) => {
 			if (!route.leaf) return;
 
-			if (route.leaf && route.endpoint) {
-				// TODO possibly relax this https://github.com/sveltejs/kit/issues/5896
-				throw new Error(`${route.endpoint.file} cannot share a directory with other route files`);
-			}
-
 			route.page = {
 				layouts: [],
 				errors: [],
diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js
index 5e3aba084..f80ed4417 100644
--- a/packages/kit/src/runtime/server/endpoint.js
+++ b/packages/kit/src/runtime/server/endpoint.js
@@ -1,4 +1,5 @@
 import { json } from '../../exports/index.js';
+import { negotiate } from '../../utils/http.js';
 import { Redirect, ValidationError } from '../control.js';
 import { check_method_names, method_not_allowed } from './utils.js';
 
@@ -64,3 +65,19 @@ export async function render_endpoint(event, mod, state) {
 		throw error;
 	}
 }
+
+/**
+ * @param {import('types').RequestEvent} event
+ */
+export function is_endpoint_request(event) {
+	const { method } = event.request;
+
+	if (method === 'PUT' || method === 'PATCH' || method === 'DELETE') {
+		// These methods exist exclusively for endpoints
+		return true;
+	}
+
+	// GET/POST requests may be for endpoints or pages. We prefer endpoints if this isn't a text/html request
+	const accept = event.request.headers.get('accept') ?? '*/*';
+	return negotiate(accept, ['*', 'text/html']) !== 'text/html';
+}
diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js
index cff90f3c0..9070608a0 100644
--- a/packages/kit/src/runtime/server/index.js
+++ b/packages/kit/src/runtime/server/index.js
@@ -1,4 +1,4 @@
-import { render_endpoint } from './endpoint.js';
+import { is_endpoint_request, render_endpoint } from './endpoint.js';
 import { render_page } from './page/index.js';
 import { render_response } from './page/render.js';
 import { respond_with_error } from './page/respond_with_error.js';
@@ -226,10 +226,10 @@ export async function respond(request, options, state) {
 
 				if (is_data_request) {
 					response = await render_data(event, route, options, state);
+				} else if (route.endpoint && (!route.page || is_endpoint_request(event))) {
+					response = await render_endpoint(event, await route.endpoint(), state);
 				} else if (route.page) {
 					response = await render_page(event, route, route.page, options, state, resolve_opts);
-				} else if (route.endpoint) {
-					response = await render_endpoint(event, await route.endpoint(), state);
 				} else {
 					// a route will always have a page or an endpoint, but TypeScript
 					// doesn't know that
diff --git a/packages/kit/types/private.d.ts b/packages/kit/types/private.d.ts
index 24b587ddc..18a2c1091 100644
--- a/packages/kit/types/private.d.ts
+++ b/packages/kit/types/private.d.ts
@@ -195,7 +195,6 @@ export interface RequestOptions {
 
 export interface RouteDefinition {
 	id: string;
-	type: 'page' | 'endpoint';
 	pattern: RegExp;
 	segments: RouteSegment[];
 	methods: HttpMethod[];
diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md
index dc82b369c..0fbb8b088 100644
--- a/packages/package/CHANGELOG.md
+++ b/packages/package/CHANGELOG.md
@@ -1,5 +1,11 @@
 # @sveltejs/package
 
+## 1.0.0-next.4
+
+### Patch Changes
+
+- [fix] don't strip `type="application/.."` tags ([#6887](https://github.com/sveltejs/kit/pull/6887))
+
 ## 1.0.0-next.3
 
 ### Patch Changes
diff --git a/packages/package/package.json b/packages/package/package.json
index 357a0da4a..b5bf86863 100644
--- a/packages/package/package.json
+++ b/packages/package/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@sveltejs/package",
-	"version": "1.0.0-next.3",
+	"version": "1.0.0-next.4",
 	"repository": {
 		"type": "git",
 		"url": "https://github.com/sveltejs/kit",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e7bbfd58e..4f29e6486 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -295,8 +295,8 @@ importers:
       uvu: ^0.5.3
       vite: ^3.1.1
     dependencies:
-      '@types/cookie': 0.5.1
       '@sveltejs/vite-plugin-svelte': 1.0.5_svelte@3.48.0+vite@3.1.1
+      '@types/cookie': 0.5.1
       cookie: 0.5.0
       devalue: 3.1.2
       kleur: 4.1.5


Test patch:
diff --git a/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+page.svelte
new file mode 100644
index 000000000..b88ab6af7
--- /dev/null
+++ b/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+page.svelte
@@ -0,0 +1,18 @@
+<script>
+	let result;
+
+	/** @param {string} method */
+	async function request(method) {
+		result = 'loading';
+		const response = await fetch('/routing/endpoint-next-to-page', {method});
+		result = await response.text();
+	}
+</script>
+
+<p>Hi</p>
+<button on:click={() => request('GET')}>GET</button>
+<button on:click={() => request('PUT')}>PUT</button>
+<button on:click={() => request('PATCH')}>PATCH</button>
+<button on:click={() => request('POST')}>POST</button>
+<button on:click={() => request('DELETE')}>DELETE</button>
+<pre>{result}</pre>
diff --git a/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+server.js b/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+server.js
new file mode 100644
index 000000000..007c90f0d
--- /dev/null
+++ b/packages/kit/test/apps/basics/src/routes/routing/endpoint-next-to-page/+server.js
@@ -0,0 +1,24 @@
+/** @type {import('./$types').RequestHandler} */
+export function GET() {
+	return new Response('GET');
+}
+
+/** @type {import('./$types').RequestHandler} */
+export function PUT() {
+	return new Response('PUT');
+}
+
+/** @type {import('./$types').RequestHandler} */
+export function PATCH() {
+	return new Response('PATCH');
+}
+
+/** @type {import('./$types').RequestHandler} */
+export function POST() {
+	return new Response('POST');
+}
+
+/** @type {import('./$types').RequestHandler} */
+export function DELETE() {
+	return new Response('DELETE');
+}
diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js
index cf12fdc98..42dedf5b7 100644
--- a/packages/kit/test/apps/basics/test/client.test.js
+++ b/packages/kit/test/apps/basics/test/client.test.js
@@ -8,7 +8,7 @@ test.skip(({ javaScriptEnabled }) => !javaScriptEnabled);
 test.describe.configure({ mode: 'parallel' });
 
 test.describe('beforeNavigate', () => {
-	test('prevents navigation triggered by link click', async ({ clicknav, page, baseURL }) => {
+	test('prevents navigation triggered by link click', async ({ page, baseURL }) => {
 		await page.goto('/before-navigate/prevent-navigation');
 
 		await page.click('[href="/before-navigate/a"]');
@@ -807,3 +807,23 @@ test.describe('data-sveltekit attributes', () => {
 		expect(await page.evaluate(() => window.scrollY)).toBe(0);
 	});
 });
+
+test('+server.js next to +page.svelte works', async ({ page }) => {
+	await page.goto('/routing/endpoint-next-to-page');
+	expect(await page.textContent('p')).toBe('Hi');
+
+	await page.click('button:has-text("GET")');
+	await expect(page.locator('pre')).toHaveText('GET');
+
+	await page.click('button:has-text("PUT")');
+	await expect(page.locator('pre')).toHaveText('PUT');
+
+	await page.click('button:has-text("PATCH")');
+	await expect(page.locator('pre')).toHaveText('PATCH');
+
+	await page.click('button:has-text("POST")');
+	await expect(page.locator('pre')).toHaveText('POST');
+
+	await page.click('button:has-text("DELETE")');
+	await expect(page.locator('pre')).toHaveText('DELETE');
+});